Dạo này hơi buồn nên muốn quit game. Sẵn đây chia sẻ 1 bài hướng dẫn cho forum gamevn. Không biết post ở đây có đúng không nên hi vọng Thần Long không chém. Bài viết này chủ yếu dành cho dân chơi TSTW, vì mình chơi bên TSTW,hi vọng là nếu có gì sai xót thì được sự góp ý của các bạn. Mình sẽ cố gắng viết đầy đủ nhất trong bài post này, các bạn đọc kĩ sẽ hiểu và làm được. Ngoài ra sẽ ko trả lời bất kì câu hỏi nào khác nữa. Đầu tiên là về WPE. Đây là chương trình dùng để bắt packet gửi từ máy mình đi hoặc từ máy khác đến. 1: Target program: dùng để chọn ứng dụng bạn cần bắt packet. 2: Start: Bắt đầu bắt packet. 3: Stop: Dừng quá trình bắt gói. 4: Đánh dấu để chọn filter cần thiết. 5: Enable filter. Filter ở đây khá quan trọng. Sẽ được sử dụng nhiều. Nó có tác dụng thay đổi packet gửi đi. Ví dụ như mình gửi packet là đánh thường (đấu vật) nhưng mình dùng filter để thay đổi thành bắn hỏa tiễn, thì mỗi lần mình đánh thường thì char trong game sẽ bắn hỏa tiễn. Ứng dụng thường gặp nhất của Filter là login vào tsonline bằng Legna. Rất nhiều bạn chơi ở TSTW hỏi làm sao để thay đổi VN thành TF để login được. Nguyên nhân chính là vì packet login mà legna gửi đến server ts không đúng. Cho nên mình phải nhờ sự hỗ trợ của filter để login được. Mình sẽ hướng dẫn chi tiết cách để filter packet login. Bước 1: Đầu tiên bạn mở WPE lên. Sau đó bật legna lên ( Chú ý điền ip , id, password cho đúng với server mà bạn chơi. Nếu chơi tstw thì cứ đế VN như bình thường). + Sang WPE, bạn chọn target program, sau đó tìm và chọn Legna TS Machine.exe. Tiếp tục vào View > Option , sau đó chỉ đánh dấu chọn Send, bỏ chọn SendTo,Recv,RecvFrom để dễ nhìn thấy packet send. Click OK. Rồi nhấn vào Start. Xong công việc bên WPE. + Sang Legna, bạn nhấn vào nút Truy cập, sẽ có thông báo id/matkhau ko hop le, vậy là ok. + Quay lại WPE, nhấn nút Stop, tự động WPE sẽ bật ra 2 packet, 1 packet 5 byte, 1 packet xx byte(tùy id, password mà kích thước packet này khác nhau). Bỏ đi packet 5 byte, chỉ lấy packet kia, ghi vào giấy hay notepad gì đó tùy ý để giữ lại. Đây chính là packet login mà legna gửi đến server ts. Và packet này dỏm, nên không login được. Bước 2: Giữ yên WPE, bấy giờ khởi động tsonline, chọn server , đến màn hình điền id, password thì dừng lại. + Sang WPE, bạn chọn target program, sau đó tìm và chọn alogin.exe. Rồi nhấn vào Start. + Sang TS, điền id, password(nhớ là sử dụng cùng id, password mà bạn đã dùng để đăng nhập bằng legna) và nhấn login. + Quay lại WPE, nhấn nút Stop, WPE cũng sẽ bật ra khoảng 2-4 packet, bạn chú ý sẽ thấy packet có kích thước = kích thước packet mình lấy ở bước 1, và giá trị các byte cũng giống nhau, chỉ khác ở giá trị byte số 11 và 12. Tiếp tục giữ lại packet đó = giấy hay notepad gì đó. Đây chính là packet login mà tsonline gửi đến server ts. Và packet này xịn, login được. Bước 3: filter (thay thế packet dỏm = packet xịn) + Sang WPE, double click vào chữ Filter 1, có 2 dãy số cho bạn điền, SEARCH và MODIFY. nói cho dể hiểu, search sẽ chứa cái packet dỏm, còn modify sẽ chứa packet xịn. + Bạn đến byte số 11 12 của SEARCH, điền vào 2 byte 11 12 của packet dỏm ( giá trị tìm được sẽ là FB E3) + sau đó đến byte số 11 12 của MODIFY, điền vào 2 byte 11 12 của packet dỏm ( giá trị tìm được sẽ là D9 CB ) + Filter name bạn có thể sửa lại thành login cho dễ nhớ + Nhấn Apply. (***) + Đánh dấu chọn filter login. + Enable filter. + Sau đó chọn target program, chọn Legna TS Machine.exe. Giờ thì bạn chỉ còn mỗi 1 việc là sang legna, nhấn truy cập, bạn sẽ nhận được thông báo truy cập thành công. + Bạn lưu lại filter login để sử dụng cho lần sau, những lần sử dụng sau, bạn chỉ cần làm các thao tác từ (***) là xong. . ___________Auto Merge________________ . 1 chức năng khác của WPE cũng khá hay là SEND, tác dụng của nó là gửi packet theo yêu cầu của mình đến server. Bài này mình sẽ hướng dẫn về cách dùng WPE để nhặt item. Đảm bảo tốc độ nhặt hơn hẳn extreme :). Thích hợp cho dân hành nghề ks. Bước 1: + bật WPE lên + login vào = alogin. Mục tiêu của mình là nhặt item, kiếm 1 chỗ trống, ko có ai. + sang WPE, nhấn vào Start, sang alogin, vứt 1 món đồ, rồi nhặt lại. quay về wpe, bạn sẽ thấy 1 packet 8 byte ( 59 E9 A9 AD BA AF A0 AD chẳng hạn), test nhiều lần bạn sẽ thấy các packet sẽ có giá trị byte thứ 7 khác nhau, còn các byte khác cố định. + vậy là xong phần tìm packet nhặt item. Bước 2: + Click vào SEND nằm kế bên Filters + Click vào "Create a new packet" , biểu tượng hình giấy trắng, bạn đặt tên là "nhặt item", kích thước packet là 128, sau đó điền vào 59 E9 A9 AD BA AF A0 AD 59 E9 A9 AD BA AF A1 AD 59 E9 A9 AD BA AF A2 AD 59 E9 A9 AD BA AF A3 AD 59 E9 A9 AD BA AF A4 AD 59 E9 A9 AD BA AF A5 AD 59 E9 A9 AD BA AF A6 AD 59 E9 A9 AD BA AF A7 AD 59 E9 A9 AD BA AF A8 AD 59 E9 A9 AD BA AF A9 AD 59 E9 A9 AD BA AF AA AD 59 E9 A9 AD BA AF AB AD 59 E9 A9 AD BA AF AC AD 59 E9 A9 AD BA AF AD AD 59 E9 A9 AD BA AF AE AD 59 E9 A9 AD BA AF AF AD + chú ý bạn sẽ thấy byte số 7 thay đổi từ A0 -> AF => khi mình send packet này, nó sẽ nhặt được 16 món đồ đang nằm dưới đất, muốn nhặt nhiều hơn thì bạn thêm tiếp 00->0F,10->1F .... cứ vậy là được. + Sau khi tạo xong, bạn chọn 1 packet bất kỳ đã tìm ở bước 1, nhấn chuột phải, chọn "Set SendList with this socket id" (XXXX) + Sau đó, bạn click chọn vào packet send "nhặt item",nhấn vào nút Start send packets, nó sẽ hiện ra 1 bảng mới. + Bạn chọn Continuously, Timer=100 miliseconds, Open Socket, sau đó nhấn nút Start. + Giờ thì bạn quay lại alogin, vứt thử item, bạn sẽ thấy nó tự động nhặt lại. ***: Muốn nhặt = legna thì bạn chỉ việc khởi động legna, chạy wpe để tìm 1 packet bất kỳ gì đó từ legna, rồi chọn packet đó, nhấn chuột phải, chọn "Set SendList with this socket id" rồi làm các bước từ XXXX trở xuống là ok. Nhớ là mỗi lần login legna đều phải thực hiện lại bước "Set SendList with this socket id". Vậy là xong xuôi phần WPE, chỉ cần hiểu được phần này thì bạn sẽ làm được nhiều cái mà bình thường legna ko làm được, như vứt gold, trade item ...
Thần Long có gì merge lại giúp mấy bài này cho dễ nhìn nhé, cám ơn trước. ******************* Tiếp theo là đến phần mà nhiều người ghét ( không biết ghét thật hay giả vờ ghét) farm SC :). Hiện tại thì cũng khá nhiều script share trên forum nhưng hầu như đều chạy ko ổn định và không hoàn thiện, phải chỉnh sửa lại lung tung. Mình sẽ share full script legna để farm sc , script này có thể là chưa phải là tốt nhất nhưng tốc độ chạy thì ok + ổn định, có thể treo liên tục 24/24 cũng không bị vấn đề gì. 1 điều chú ý là các bạn nên sử dụng bản Multi Legna 1.0.2.5 vì bản này có thể tạo và xóa gà, sẽ dễ dàng hơn Chú ý là xóa sạch nội dung file common.cs Script chủ pt: để sử dụng bạn phải + thêm vào id_chupt, id_mem1,...., id_farm thì giữ nguyên không đổi. + Sửa lại skill id cho chủ pt và pet . Mã: byte check = 0; uint count = 0; //My var uint id_farm = 0; // giữ nguyên không đổi uint id_chupt = 000000; // id con bom uint id_mem1 = 000000; // id ga` 1 uint id_mem2 = 000000; // id ga` 2 uint id_mem3 = 000000; // id ga` 3 uint id_mem4 = 000000; // id ga` 4 public override void MyAttack() { CharacterInfo MyChar = ts.Character; ts.SendAttack(MyChar.Row, MyChar.Col, 0, 1, 10000); } public override void MyPartnerAttack() { CharacterInfo MyWarrior = ts.CurrentPartner; ts.SendAttack(MyWarrior.Row, MyWarrior.Col, 0, 1, 10013); } public override void BattleStoped() { ts.Disconnect(); } public override void RequestPartyAcceptFrom(uint PlayerId) { if (check == 0) { //debug("PlayerId xin party: "+PlayerId.ToString()); if (PlayerId == id_mem1 || PlayerId == id_mem2 || PlayerId == id_mem3 || PlayerId == id_mem4) {ts.AcceptParty(PlayerId);check = 1;} } } public override void AcceptedParty(uint PlayerId) { //debug("PlayerId da dc party: "+PlayerId.ToString()); if (check == 1) {id_farm = PlayerId;ts.StopParty();} } public override void AcceptedPartyFrom(uint PlayerId) { //debug("PlayerId chu party: "+PlayerId.ToString()); id_farm = 0; check = 0; count = 0; } public override void PartyStop(uint PlayerId) { //debug("PlayerId stop party: "+PlayerId.ToString()); if (PlayerId == id_mem1 || PlayerId == id_mem2 || PlayerId == id_mem3 || PlayerId == id_mem4) {check = 0; } if (PlayerId == id_chupt) {count = 0;ts.RequestParty(id_farm);} } public override void doRecvQuestion() { state="BTQ"; count = 0; } public override void ResponseAnswer() { ts.Disconnect(); } public override void FinishAnswer() { count = 0; } public override void InitBot() { debug(" Mapid : " + ts.Character.mapid.ToString()); debug(" Toa do : " + ts.Character.x.ToString() + ", " + ts.Character.y.ToString()); debug(" Ghost : " + ts.Character.ghost.ToString() + " con "); check = 0; id_farm = 0; count = 0; ts.SetReconnectTime(1); } Script gà: để sử dụng bạn phải + thêm id_chupt, tenga, pass,amma + Làm filter cho packet trade item ( sẽ hướng dẫn trong bài tiếp theo). Vì script này khi gà chạy về sẽ trade cho acc bán hàng đứng sẵn ở TQ. Mã: uint mapid = 12001; uint id_chupt = xxxxxx; // chu pt int kiemtra=0; int btq=0; string tenga = "xxxxxxxxx"; string pass = "xxxxxxx"; string amma = "xxxxxxx"; byte check=0; void xuongnui() { if (ts.Character.mapid >= 10800 && ts.Character.mapid <= 10820) { debug("Tạo gà thành công"); ts.Warp(1); ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd(); } else if (ts.Character.mapid >= 10850 && ts.Character.mapid <= 10870) { ts.Walk(1222,255);ts.delay(500);ts.ClickOnNPC(2); ts.SelectChoice(1); ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd(); ts.Warp(2); ts.SelectChoice(1); ts.SendEnd(); } } void DiBanDo() { if (ts.Character.mapid==12003 ){ ts.Warp(1);} else if((ts.Character.mapid == 12002)&&(ts.Character.x==130)) {ts.Warp(3);} else if((ts.Character.mapid == 12002)&&(ts.Character.x==1170)){ts.Warp(3);} else if((ts.Character.mapid == 12002)&&(ts.Character.x==1050)){ts.Warp(2);} else if((ts.Character.mapid == 12304)&&(ts.Character.x==230)&&kiemtra==0) { ts.ClickOnNPC(4); ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SelectChoice(1); ts.SendEnd(); ts.SendEnd(); ts.SendEnd();ts.SendEnd(); ts.SendEnd();ts.delay(500);ts .ClickOnNPC(100);ts.Warp(1); } else if((ts.Character.mapid == 12304)&&(ts.Character.x==230)&&kiemtra==1) { ts.ClickOnNPC(4); ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd(); ts.SendEnd();ts.delay(1000); kiemtra=0; check=1; ts.ClickOnNPC(100); Slot oSlot = (Slot)ts.MyItems[2]; if (oSlot.itemid == 46037 && oSlot.num==3) { Stop(); } else { ts.Warp(1); } } else if((ts.Character.mapid == 12001)&&(ts.Character.x==110)&& check==0){ts.Warp(1);} else if((ts.Character.mapid == 12223)){ts.Warp(1);} else if((ts.Character.mapid == 12001)&&(ts.Character.x==170)) {ts.Warp(12);} else if((ts.Character.mapid == 12000)&&(ts.Character.x==1230)&&(check==0)){ts.Warp(22);} else if((ts.Character.mapid == 12801)&&(ts.Character.x==250)){ts.Warp(2);} else if((ts.Character.mapid == 12804)&&(ts.Character.x==210)){ts.Warp(2);} else if((ts.Character.mapid == 12805)&&(ts.Character.x==190)){ts.SetTimerOnOff(true);} else if((ts.Character.mapid == 12804)&&(ts.Character.x==2330)){ts.Warp(1);} else if((ts.Character.mapid == 12801)&&(ts.Character.x==2310)){ts.Warp(1);} else if((ts.Character.mapid == 12000)&&(ts.Character.x==830)){ts.Warp(12);} } public override void MyAttack() { CharacterInfo MyChar = ts.Character; ts.SendAttack(MyChar.Row, MyChar.Col, 0, 2, 17001); } public override void BattleStarted() { } public override void BattleStoped() { if (btq==0) { kiemtra=1; ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd(); ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd(); ts.SendEnd();ts.SendEnd(); ts.StopParty(); ts.Warp(1); } } public override void doRecvQuestion() { btq=1; } public override void ResponseAnswer() { ts.Answer(1); } public override void FinishAnswer() { if (ts.Character.mapid == mapid && check==1) {ts.delay(300);ts.SetTimerOnOff(true);} if (ts.Character.mapid == 12805) {ts.Warp(1);} if (ts.Character.mapid == 12804) {ts.Warp(1);} if (ts.Character.mapid == 12801) {ts.Warp(1);} if (ts.Character.mapid == 12001) {ts.Warp(12);} if (ts.Character.mapid == 12304) {ts.Warp(1);} if (ts.Character.mapid == 12000) {ts.Warp(12);} if (ts.Character.mapid == 12002) {ts.Warp(3);} } void checkItem() { Slot oSlot = (Slot)ts.MyItems[2]; if (oSlot.itemid ==0 && oSlot.num==0) { Stop(); } else if (oSlot.num==3) { Stop(); } else { ts.Chat("trade",808799); ts.delay(200); ts.Chat("datdo",808799); ts.delay(200); ts.Chat("giaodich",808799); ts.delay(200); ts.SetTimerOnOff(true); } } public override void Start() { ts.CreateCharName(tenga); ts.CreateChar(2, 3, 1, 0, 0, 6, 0, 0, 0, pass,amma); } public override void CreateCharacter() { debug("Xóa gà thành công",0x000ABC); debug("Đang tạo gà, đợi chút...",0x00ADEF); ts.CreateCharName(tenga); ts.CreateChar(2, 3, 1, 0, 0, 6, 0, 0, 0, pass,amma); } public override void Stop() { ts.DeleteChar(pass,amma); } public override void NpcDialogMenu(ushort DialogId) { debug("Dialog Menu ID="+DialogId.ToString()); } public override void NpcDialog(ushort DialogId) { debug("Dialog Menu ID="+DialogId.ToString()); } public override void warpFinish() { xuongnui(); DiBanDo(); if (ts.Character.mapid == mapid && check==1) {ts.delay(300);ts.SetTimerOnOff(true);} } public override void OnTimer() { if((ts.Character.mapid == 12805)&&(ts.Character.x==190)){ts.RequestParty(id_chupt); } else if (ts.Character.mapid == mapid && check==1) {checkItem();} } public override void RequestPartyAcceptFrom(uint PlayerId) { debug("PlayerId xin party: "+PlayerId.ToString()); if (PlayerId == id_chupt) {ts.AcceptParty(PlayerId); ts.SetTimerOnOff(false);} } public override void AcceptedParty(uint PlayerId) { debug("PlayerId da dc party: "+PlayerId.ToString()); if (PlayerId == id_chupt) { ts.ClickOnNPC(11); ts.SendEnd();ts.SendEnd();ts.SendEnd();ts.SendEnd(); } } public override void AcceptedPartyFrom(uint PlayerId) { debug("PlayerId chu party: "+PlayerId.ToString()); } public override void PartyStop(uint playerid) { } public override void InitBot() { kiemtra=0; btq=0; ts.SetTimerOnOff(false); if (ts.Character.mapid > 10871 && ts.Character.mapid != 12805 ) {Stop();} if (ts.Character.mapid == 12805) {ts.Warp(1);} ts.SetReconnectTime(1); xuongnui(); }
Phần này sẽ hướng dẫn bổ sung hoàn thiện cách làm filter cho packet trade item (trước khi làm cái này nên đọc thật kỹ cách làm filter ở phần 1). + Ý tưởng để thực hiện được filter này thì cũng như đã nói, thay thế packet dỏm = packet xịn. + Do trong legn@ ko có hỗ trợ sẵn hàm trade item nên ta sẽ sử dụng các hàm Chat và filter nó để trở thành hàm Trade. Bạn có thể sử dụng bất kỳ hàm nào và filter để nó trở thành hàm Trade, tùy ý của bạn. + Trong phần script gà, mình sử dụng 3 lệnh để hoàn tất 1 lần trade: ts.Chat("trade",808799); ts.Chat("datdo",808799) và ts.Chat("giaodich",808799); + Bây giờ ta sẽ đi tìm packet của 3 lệnh này Bước 1: Tìm packet dỏm. + Mở WPE, mở Legna, target program Legna, enable filter Login mà đã tạo được ở phần 1, login vào legna. Nói chung là phải login được legna thành công rồi mới làm tiếp. + Bước tiếp theo, trong WPE, click vào Start logging để bắt packet, sau đó sang Legna, trong hộp thoại Chat, đánh vào legna://ts.Chat("trade",808799); + Quay lại WPE, nhấn Stop logging, bạn sẽ nhận được 1 packet (59 E9 A6 AD AF AE F2 FA A1 AD D9 DF CC C9 C8) + tạo mới 1 filter, đặt tên là "trade", trong phần SEARCH điền vào giá trị packet vừa tìm được. + Làm tương tự cho 2 lệnh ts.Chat("datdo",808799) và ts.Chat("giaodich",808799) + Kết quả đạt được là 3 filter: trade , datdo, giaodich Bước 2: tìm packet xịn + Mở WPE, mở alogin, target program alogin. + Ví dụ acc sẽ được trade tên là BanHang. Bạn sẽ phải login acc đó = extreme, legna gì đó cho dễ. + Sử dụng 1 acc khác, login vào = alogin. + trong WPE, click vào Start logging để bắt packet + sang alogin, tiến hành trade với acc bán hàng, bạn sẽ nhận được 3 packet = packet đầu tiên là packet "trade" xịn, nó sẽ thay đổi tùy theo id acc BanHang của bạn, cho nên bạn phải tự thực hiện :). Với acc bán hàng của mình thì packet có giá trị 59 E9 AB AD B4 AC F2 FA A1 AD = packet thứ 2 là packet "datdo" xịn, nếu bạn farm sc thì nó sẽ không đổi, giá trị là 59 E9 AA AD B4 AF AD AD AD AD AE = packet thứ 3 là packet "giaodich" xịn, giá trị nó cũng không đổi,59 E9 AE AD B4 AE AC Bước 3: thay packet dỏm = packet xịn + Sử dụng các filter trade, datdo,giaodich , thêm vào phần Modify của 3 packet các giá trị packet xịn tương ứng, vậy là xong. + Giá trị của 3 filter: ---- trade SEARCH 59 E9 A6 AD AF AE F2 FA A1 AD D9 DF CC C9 C8 MODIFY xx xx xx xx xx xx xx xx xx ( << phải tự tìm) ---- datdo SEARCH 59 E9 A6 AD AF AE F2 FA A1 AD C9 CC D9 C9 C2 MODIFY 59 E9 AA AD B4 AF AD AD AD AD AE -----giaodich SEARCH 59 E9 A3 AD AF AE F2 FA A1 AD CA C4 CC C2 C9 C4 CE C5 MODIFY 59 E9 AE AD B4 AE AC Hoàn tất phần tạo packet trade. @all: share vì 1 số người bạn thân yêu cầu, nếu ko thích thì đừng vào đọc.
Continue với auto sell = legn@. Cái này thì tương đối đơn giản, vì legn@ 1.0.2.6 đã hỗ trợ sẵn method TradeItemDialog. Giải thích 1 chút về code. Giả sử có 4 acc gà aaa,bbb,ccc,xxx . + Khi 3 con aaa,bbb,ccc về trade thì acc bán hàng chỉ accept trade + Còn con xxx về trade thì sau khi accept trade, acc bán hàng sẽ bắt đầu bán cho nhà buôn tạp hóa. + Nhấn F3 để xem tổng tiền kiếm được. Mã: ulong currentgold; ulong newgold; ulong sumgold=0; public override void TradeItemDialog(uint playerid) { if (playerid==aaa || playerid==bbb || playerid==ccc) { ts.debug("===== Player " + playerid + " request to trade ===",0x000ABC); ts.AcceptTradeItem(); ts.delay(200); } else if (playerid==xxx) { ts.debug("===== Player " + playerid + " request to trade ===",0xABC000); ts.AcceptTradeItem(); ts.delay(200); ts.ClickOnNPC(7); } } public override void NpcDialogMenu(ushort DialogId) { // debug("Dialog Menu ID="+DialogId.ToString()); if ( DialogId == 4 && ts.Character.mapid==12001 ){ ts.SelectChoice(2); ts.SendEnd();ts.delay(200); for (byte i=0;i<25;i++) { ts.Sell(i,30); ts.delay(100); } ts.SendEnd(); newgold=ts.Character.gold-currentgold; sumgold+=newgold; ts.debug("++ Receive "+ newgold + " gold +++"); ts.debug("++ Current gold: " + ts.Character.gold ); currentgold=ts.Character.gold; } } public override void Start() { debug("Tong tien kiem duoc: " + sumgold,0x000AFF); } public override void InitBot() { ts.SetReconnectTime(1); currentgold=ts.Character.gold ; }
Đoạn này phải đièn bằng tay vào cái bảng trắng trắng à bác ? Tiện thể hỏi lun sao em điền ip sv 8 ko đc Vì số đầu tiên ip 2 chữ số nên em để dấu cách cho đảm bảo dấu chấm .Nó báo ko log in đc sv =.=
kiểu này lại loạn sv vì mấy vụ ks nhặt iteam làm Q và các event admin hỗ trợ game rồi mấy cái này đáng nhẽ không nên share lung tung bác huunhon ạh, tớ không nói là keo kiệt giữ cho riêng mình nhưng ai cũng dùng wpe và leg để ks nhặt đồ thì sẽ phát sinh nhiều thứ không mong muốn, cứ như cái farm sủi cảo mà nhìn thôi
tuy nhiên nếu ko share thì xài ext ks kô bao h lại tàu , farm phiến thì nếu kô share thì người sẽ giàu thiệt giàu, người thì phải mua 1 ball hơn 200k ???
nhưng anh ấy lại muốn làm người tốt cơ ,lúc chơi thì giữ khư khư,đến lúc bán hết acc rồi mới tung ra,tốt quá