Tự viết AI cho vGE trong 30 phút

bác ak có định phát triển cái auto này lên V200 300 không bác ? :D
 
Đâ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.
 
hịc phát triển kiểu gì khi không có thầy dậy đây hiall
dậy từng bước thì mới thành tài được chứ
 
Đâ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.
 
may anh cho em xin Ai vi hotkey sua? roi voi huhuhu em k0 bjet lam
 
thầy giáo ơi cho Iphone cái số phone để alo cho thầy hỏi phát được không :D lẹ lẹ nhé
 
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:
func SCR_XXX_TS_KEEP(self)
func SCR_XXX_TS_KEEP_BATTLE(self)
func SCR_XXX_TS_USER_SKILL(self)
func SCR_XXX_TS_NONE(self)
func SCR_XXX_TS_BATTLE_NOMINATE(self)
func SCR_XXX_TS_ASSAULT(self)
func SCR_XXX_TS_ASSAULT_BATTLE(self)
func SCR_XXX_TS_HOLD(self)
func SCR_XXX_TS_HOLD_BATTLE(self)
func SCR_XXX_TS_HARVEST(self)
func SCR_XXX_TS_HARVEST_PICK(self)
func SCR_XXX_TS_PICK_ITEM(self)
func SCR_XXX_TS_MOVE(self)
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)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)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)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 đó?
 
Được, tôi toàn zip/unzip bằng WinXp.
Một số ziper chuyên nghiệp sau này có khi lại ko xài được.
 
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 =))
 
Chỉnh sửa cuối:
Auto ko hoạt động đc nữa roài :| . Hôm qua GE vừa update xog
 
Qua topic tự sửa file ge.exe kìa, 5 phút là AI chạy lại ngay.
 
còn làm sao để báo động khi bị report vậy mấy bạn
 
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 :(
 
Làm gì mà cháy CPU ghê vậy :|
 
Ko tắt được auto thì cháy chứ sao.
 
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
 
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 :(
Bạn này hiền quá, sao ko xài task manager để tắt game?
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
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.
 
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.
 
Back
Top