Đây là phiên bản đặc biệt: nhỏ gọn, đánh nhanh, dễ sử dụng, có thể thay thế bản gốc của vGE. Nếu phát triển tiếp thì nó sẽ mất tính chất đặc biệt đó. Người dùng tự phát triển tiếp nếu muốn.
Đây chỉ là 1 cách làm. Có thể làm cách khác cũng đc. Các thay đổi so với trước: 1/: Mã: func PckTestNearTarg(self,selfAi) { [B] if(IsNearFromKeepDestPosition(selfAi,4000) != 'YES'){ ClearAiTarget(selfAi); KeepDestMoveTo(selfAi); return 2; }[/B] var curTarget = GetNearAtkableEnemy(selfAi,AtkRange); if(curTarget != nil){ SetAiTarget(selfAi,curTarget); return 1; } return 0; } Hàm trả về 3 giá trị 0,1, hoặc 2; Khi gọi hàm này từ 3 files kia (Attacker, Healer và Puppet) -Nếu hàm trả về 0 hoặc 1: xử lý giống trước đây -Nếu hàm trả về 2: chuyển sang trạng thái chạy (TS_MOVE) -Khi nhân vật chạy về tới điểm gốc, nó sẽ chuyển sang trạng thái nghỉ (TS_NONE) 2/ Mã: func SCR_ATTACKER_TS_HARVEST(self) { sleep(100); // Start Log AiLog('ATTACKER_TS_HARVEST : Start!!!'); // declare variables var selfAi = GetAiActor(self); var prevTS = GetPrevTS(selfAi); [B] var KqTest = 0;[/B] //Hold Check SCR_AI_LIB_UNHOLD(selfAi, prevTS); // Near Item if('ChangeTS' == SCR_AI_LIB_NEARITEM(selfAi)){ return; } // Move HarvestDestMoveTo(selfAi); // Main Loop while(1){ SCR_AI_LIB_USEPOTION_AUTO(self,selfAi); // User Target Check if('ChangeTS' == SCR_AI_LIB_USERTARGET(selfAi)){ return; } // User Skill Check if('ChangeTS' == SCR_AI_LIB_USERSKILL(selfAi)){ return; } // FT Lite 02 [B] KqTest = PckTestNearTarg(self,selfAi); if(KqTest == 1){ ChangeTacticsAi(selfAi, 'TS_KEEP'); return; } else if(KqTest == 2){ ChangeTacticsAi(selfAi, 'TS_MOVE'); return; }[/B] // Near Item if('ChangeTS' == SCR_AI_LIB_NEARITEM(selfAi)){ return; } // Arrival Check if(IsNearFromHarvestDestPosition(selfAi, 100) == 'YES'){ ChangeTacticsAi(selfAi, 'TS_NONE'); return; } // Main Sleep sleep(100); } } 3/ -Tại trạng thái nghỉ này, nó lại chuyển sang TS_KEEP nếu chế độ AutoKeep = ON Mã: func SCR_ATTACKER_TS_NONE(self) { sleep(100); // start log AiLog('ATTACKER_TS_NONE : Start!!!'); // declare variables var selfAi = GetAiActor(self); var prevTS = GetPrevTS(selfAi); //Hold Check SCR_AI_LIB_UNHOLD(selfAi, prevTS); // Main Loop while(1){ // Do Init if(0 != Ak_INIT(self,selfAi)){ sleep(200); ChangeTacticsAi(selfAi,'TS_NONE'); return; } SCR_AI_LIB_USEPOTION_AUTO(self,selfAi); // User Target Check if('ChangeTS' == SCR_AI_LIB_USERTARGET(selfAi)){ return; } // User Skill Check if('ChangeTS' == SCR_AI_LIB_USERSKILL(selfAi)){ return; } // Saved Target Check if('TS_BATTLE_NOMINATE' == prevTS){ var savedTarget = GetTarget(selfAi, 'NOMINATE'); if(nil != savedTarget){ SetAiTarget(selfAi, savedTarget); if(nil != GetAiTarget(selfAi)){ ChangeTacticsAi(selfAi, 'TS_BATTLE_NOMINATE'); return; } } } [B] // Auto Keep Check if(0 != SCR_AI_LIB_AUTO_KEEP(selfAi)){ ChangeTacticsAi(selfAi, 'TS_KEEP'); return; }[/B] // Main Sleep sleep(100); } } . ---------- Post added at 19:40 ---------- Previous post was at 18:35 ---------- Giải thích thêm về sự hoạt động của AI ở chế độ auto mình thường dùng để AFK: -Khi mới vào game (hoặc chuyển kênh, chuyển map), GE đưa tất cả nhân vật về trạng thái nghỉ, và gọi hàm SCR_ATTACKER_TS_NONE(self) của AI. Với các nhân vật thuộc loại Healer thì SCR_HEALER_TS_NONE(self), thuộc loại Puppet thì SCR_PUPPET_TS_NONE(self). Ở đây tôi chỉ nói ví dụ với attacker thôi. -Trong hàm XXX_TS_NONE, ngay sau while(1) có gọi hàm Ak_INIT Mã: while(1){ // Do Init if(0 != Ak_INIT(self,selfAi)){ sleep(200); ChangeTacticsAi(selfAi,'TS_NONE'); return; } ... ... } -Nếu Ak_INIT trả về != 0, thì dòng ChangeTacticsAi(selfAi,'TS_NONE') làm cho các lệnh bên dưới không chạy được, mà chương trình vòng lại đầu vào của SCR_ATTACKER_TS_NONE(self). -Cho đến khi Ak_INIT trả về 0 thì các lệnh bên dưới nó mới được thực hiện. -Đây là cách gọi hàm init do tôi đưa ra. Trước đó chưa có một AI nào gọi init theo cách như vậy. -Các nhân vật sẽ nằm tại trạng thái nghỉ cho tới khi người dùng nhấn Space. Lúc đó nhân vật tự động chuyển sang trạng thái TS_KEEP. ---------- Post added at 19:52 ---------- Previous post was at 19:40 ---------- Tại trạng thái TS_KEEP AI của chúng ta kiểm tra vài thứ: Mã: func SCR_ATTACKER_TS_KEEP(self) { sleep(100); // start log AiLog('ATTACKER_TS_KEEP : Start!!!'); // declare variables var selfAi = GetAiActor(self); var prevTS = GetPrevTS(selfAi); // Hold Check SCR_AI_LIB_UNHOLD(selfAi, prevTS); // Main Loop while(1){ SCR_AI_LIB_USEPOTION_AUTO(self,selfAi); ... [B] // FT Lite 01 if(AtkTestNearItem(self,selfAi) != 0){ ChangeTacticsAi(selfAi, 'TS_HARVEST'); return; } // Near Target Check if('ChangeTS_BATTLE' == SCR_AI_LIB_NEARTARGET(self, selfAi)){ ChangeTacticsAi(selfAi, 'TS_KEEP_BATTLE'); return; }[/B] // Keep Position Check SCR_AI_LIB_KEEPPOSITION(selfAi); // Main Sleep sleep(100); } } -Kiểm tra xem có item nằm gần đó không: AtkTestNearItem(self,selfAi) .Nếu có: chuyển sang trạng thái nhặt đồ .Nếu không: -Kiểm tra xem có mục tiêu ở gần đó không: SCR_AI_LIB_NEARTARGET(self, selfAi) .Nếu có: chuyển sang trạng thái tấn công mục tiêu, .Nếu không: làm thêm vài việc, rồi lặp lại quá trình TS_KEEP. -Tương tự như vậy bạn có thể xem code để hiểu khi chuyển sang nhặt đồ, thì AI sẽ chạy tiếp như thế nào, -Tương tự như vậy bạn có thể xem code để hiểu khi chuyển sang tấn công mục tiêu, thì AI sẽ chạy tiếp như thế nào, ... Nếu cứ giải thích như thế này mãi sẽ rất dài. Hãy tự đọc code và suy xét xem AI sẽ làm những gì tiếp theo.
Cái này la do quá trình nghịch ngợm mình có và 1 số thông tin có thể chưa nắm rõ ai chưa biết có thể đọc và tự viết 1 cái cho mình. file AI.IPF là 1 file nén trong đó có 4 file là: - attacker.scp - healer.scp - puppet.scp - lib.scp File attacker.scp điều khiển hoạt động của các nhân vật biết đánh nhau(bao gồm đánh người và quái). File healer.scp điều khiển hoạt động của các nhân buff máu và buff hỗ trợ. File puppet.scp điều khiển hoạt động của các nhân có các skill summon điển hình là viki và cath. File lib.scp là file thư viện chứa các hàm dùng chung của 3 file trên. Về cơ bản nội dung của 3 file attacker.scp, healer.scp, puppet.scp là giống nhau và chúng có các hàm chức năng điều khiển trạng thái của nhân vật như sau: với xxx là tên của các file chứa các hàm. Giải thích các hàm trên Trong game nhân vật có các hoạt động sau: Đứng yên, Chạy, Đánh, Nhặt đồ, Dùng kỹ năng. - Khi các bạn log vào game nhân vật lúc đó sẽ đứng yên và lúc đó nhân vật của bạn ở trạng thái "Đứng yên" do hàm func SCR_XXX_TS_NONE(self) điều khiển. - Khi ấn chuột vào 1 điểm để cho các nhân vật chạy đến đó thì nhân vật của bạn chuyển sang trạng thái "Chạy" và do hàm func SCR_XXX_TS_MOVE(self) điều khiển. - Trạng thái nhặt đồ có 3 dạng: + Chế độ chờ đồ rơi ra để nhặt do hàm func SCR_XXX_TS_HARVEST(self) điều khiển + Khi thấy có đồ rơi ra phi vào nhặt do hàm func SCR_XXX_TS_HARVEST_PICK(self) điều khiển. + Khi nhân vật nhặt đồ vào trong túi nó ở trạng thái "Nhặt đồ" và do hàm func SCR_XXX_TS_PICK_ITEM(self) điều khiển. - Khi dùng kỹ năng thì nhân vật chuyển sang trạng thái "Dùng kỹ năng" và do hàm func SCR_XXX_TS_PICK_ITEM(self) điều khiển. - Trạng thái "Đánh" ở trạng thái này tương đối loằng ngoằng vì nó chia ra làm nhiều loại như đánh mục tiêu được chọn = chuột, đánh mục tiêu được chọn tự động = AI, chế độ chỉ đánh các con lại gần, chế độ đánh đến 1 điểm đã được chọn trước và ở chế độ "Đánh" cũng dc chia ra làm 2 chế độ nhỏ là chế độ "Chờ" và chế độ "Thịt". + Khi chọn mục tiêu = chuột để các nhân vật phi vào "Thịt" thì nhân vật do hàm func SCR_XXX_TS_BATTLE_NOMINATE(self) điều khiển. + Khi bạn ấn Ctrl + chuột trái vào 1 điểm thì các nhận vật sẽ chạy đến điểm đã chọn và trên đường đi có mục tiêu nào thì "Thịt" mục tiêu đó. Và ở trạng thái này do 2 hàm func SCR_XXX_TS_ASSAULT(self) và func SCR_XXX_TS_ASSAULT_BATTLE(self) điều khiển. Khi bạn chạy mà chưa thấy mục tiêu thì do hàm func SCR_XXX_TS_ASSAULT(self) điều khiển khi thấy mục tiêu và đánh nó thì do hàm func SCR_XXX_TS_ASSAULT_BATTLE(self) điều khiển. + Chế độ đứng yên chỉ đánh các con quái lại gần do hai hàm func SCR_XXX_TS_HOLD(self) và func SCR_XXX_TS_HOLD_BATTLE(self) điều khiển. + Còn chế độ mà các bạn ai cũng dùng là ấn phím SPACE do hai hàm func SCR_XXX_TS_KEEP(self) và func SCR_XXX_TS_KEEP_BATTLE(self) điều khiển. Do trạng thái đánh có 2 trạng thái nhỏ là "Chờ" và "Thịt" do đó cứ thấy hàm nào có chữ _BATTLE(self) là chế độ "Thịt" còn ko có _BATTLE(self) là chế độ "Chờ". Sau khi đọc cả đoạn dài ngoằng trên theo ngu ý của mình viết 1 AI đơn giản chỉ cần quan tâm đến các hàm sau: func SCR_XXX_TS_KEEP(self), func SCR_XXX_TS_KEEP_BATTLE(self), func SCR_XXX_TS_NONE(self), func SCR_XXX_TS_HARVEST(self), func SCR_XXX_TS_HARVEST_PICK(self), func SCR_XXX_TS_MOVE(self). Còn viết thế nào các bạn đọc qua các hàm có thể sử dụng dc trong file AI.ipf mà cụ thể là tìm hiểu các hàm của Lua Script 5.0. Còn các giải thuật thì tùy từng người vì mỗi người viết một kiểu và ai cũng cho giải thuật của họ là nhất nên hay hơn cả là tự viết.
Khi Pack ta dùng Window Zip lại rồi chỉnh Hex được không? Hay phải dùng WinZip hay loại compresser nào đó?
Auto này sài thích ghê. Tốc độ kill quái phải nhanh hơn 60%. Giá mà có thêm cái tự động chuyển kênh thì quá nuột . Auto chỉ sợ quá giờ với hết đạn thôi... Còn mấy thứ bác chủ thớt viết trên kia thì em chịu, ko nhét vào đầu nổi
Mò mẫm viết auto suýt cháy CPU, ko hiểu sửa nhầm đoạn nào mà nó vào là nó phang mob liền, ko off được lun :(
xin hỏi, vi lần đầu down cái GE auto về Không biết sử dụng thế nào??? là chép cái file auto về rùi bỏ đâu để nó chạy vậy mấy bạn??? Thanks
Bạn này hiền quá, sao ko xài task manager để tắt game? Không biết thì hỏi là đúng nhưng 1 câu hỏi mà quá nhiều người hỏi sẽ gây khó chịu. Chiu khó search và đọc kỹ sẽ tìm ra câu tra lời bạn nhé. Thêm 1 lời khuyên là mới chơi GE dừng nên xài auto.
Thật ra mình chơi lâu rồi, bỏ cả năm, thấy cái tool hay và có v5 nên quay lại nhưng k biết sử dụng thế nào, còn tìm thì mình đã search cái diển dàn này mấy lần mà không thấy nên mới post lên dù sao củng cảm ơn, củng có ng hướng dẩn mình rùi, Thanks
Sao anh không làm auto chỉ: Đánh chay, Ăn HP (khi HP < 60%) và Nhặt đồ (được quyền chọn nhận vật nhặt đồ), nhưng có chuyển kênh??? Anh cải tiến cái auto 30ph này lên một chút xíu nữa đi.