ßæÙ¤ô÷ ìÑÍïòªÒö
мÜâàãÙ¥ßö
ÙÍÖâ
3- à¹ÌÑîîàãClientÓ® Ò®íúùÞ⦠àãÙ¥
4- à¹ÌÑîîàãClientÓ® Ò®íúßÈâ¦值 àãÙ¥
1 – Ë¿áÉ
à¹ÌÑîîàã(ì¤ù»ÊÛöà
RO) ë´戲×ëØüßæÙ¤ô÷îÜú¼ÔÑ£¬ãÀì¤RO Client ïïãÒ×ëàâöÇîÜ檔äÐúñ£¬ì¤AI 檔äÐúñ×ëîÜAI.lua, Util.lua 為ÐÆËàá¶ðÃðýîÜ¡£
ROèÌÊ«Ùúʦì¤ð²íÂõóí»ÐùßÌé©îÜìÑÍïòªÒö£¬å¥Ê¦ì¤ÞÅéÄܬìÑñ®û¿îÜìÑÍïòªÒö£¬å¥ãÀñ«é©ÙÍîÜ¡£
мÜâûúRO ClientãÀìéðúÖ§ÔÑîÜïïãÒ£¬êóÙþÛöß¾îÜó¹è¦îÜü¥ãÀÜôüåù¬òûú¼îÜ£¬êó×âÖåß¾îÜó¹è¦îÜü¥£¬å¥ÜôÒöäÎðÎí»ÐùßÌé©Û°ãÒòûú¼îÜ¡£
ROËÒÛ¡Ý»çèͪüåð«Í꣬ÓßмÜâÜôâÍé©ñ®ìòù¼øºòþ£¬å¥Ê¦ì¤èÌë´戲îÜû¿îÜмÜâîÜ¡£
çèͪé©ñ®Óð£¬ÓßÜô÷¼üåÞÅéÄïïãÒîÜèÌÊ«Ùú£¬å¥Ê¦ì¤ãùúÞí»ÐùßÌé©îÜìÑÍïòªÒöñ®áóïá¡¢ÜÍ強îÜͪüñ¡£
為ÖõÓßïïãÒß¾Êïýéö¬îÜÞÅéÄíºîÊßÌ£¬çèͪüå×Á×ÁáÙáÙîÜñòÊ¥ãæîÜÐüÒö為ͪüñîÜ¡£
мÜâá¶ð²ðãÞÅéÄîÜåÞåëãÀLUA£¬ßÙï×ôëÊ× (http://www.lua.org)
2- мÜâ啟ÔÑϰðã
RO ClientãÀðôClientïïãÒ£¬î¤ßæÙ¤ô÷ãæû¡à÷îÜãÁѦ£¬ì¤ú°ÔÁAI.lua, Util.lua檔äÐý£¬î¦üå啟ÔÑìÑÍïòªÒöîÜ¡£
Ó×ßæÙ¤ô÷ãæû¡à÷îÜãÁѦåýù» :
1) ÷«ßæßæÙ¤ô÷ãÁ£¬
2) ÷êÞÝØÌîÜßæÙ¤ô÷ÜÖüÀãÁ£¬
3) î¤ÊÇßäàÔ÷ÉãÊ窗×룬àÔ÷Éè¶êóßæÙ¤ô÷îÜÊÇßäýËÒã·èÌë´戲ãÁ£¬
4) è¶êóßæÙ¤ô÷îÜÊÇß䣬ÞÅéÄóïã²ãÇÛ¹¡¢ûÝïÊãÇÛ¹ãÁ£¬
5) è¶êóßæÙ¤ô÷îÜÊÇß䣬ÞÅéÄîîáêñýòæãÁ£¬
6) è¶êóßæÙ¤ô÷îÜÊÇß䣬ÞÅéÄ卡ÜÅÕÃì¹ÔÑÜ×ÙâãÁ£¬
¡¦
ß¾ØüÞÀú£îÜÍìÔÒïÇãÀ£¬Ó×ßæÙ¤ô÷î¤ë´戲ÍöÊà×ëñìãæõóúÞãÁ£¬
ú°ÔÁèÇAI.lua檔äÐý£¬RO ClientïïãÒðôAI.lua мÜâ×ëòûú¼AI ( id)ùä⦣¬ idãÀë´戲ß¾îÜßæÙ¤ô÷ò¦ïÒøºûÜ£¬idãÀRO ClientîîÓ¹ÐåìÑÍïòªÒöмÜâîÜâ¦í®£¬Ê¦ì¤÷êAI(id)îÜÒ®é»ñ®øºòþý£¬Ê¦ì¤Ü¨ûùìÑÍïòªÒö£¬Ðñõ¨îÜßæÙ¤ô÷ú¼ÔÑ£¬ãÀò¦ì¹ÔÑ¡¢Íô̪¡¢餵ãÝ¡¢ÞÅéÄÐüÒöÔõîÜùÞ⦣¬Ò®Ëïî¤RO ClientïïãÒ×룬÷êí»Ðùá¶Ï°à÷îÜîêÓ×îÜßÒüÏ×룬òûú¼ð«ÍêîÜùÞâ¦即ʦ¡£
Const.lua RO Client ïïãÒÒ®£¬×ëØüêóÊÀðúêóμßÈâ¦â¦值îÜï×Üã¬
Const.lua ôëóÑÍÅæ¨
AI.lua Utiil.lua 即ʦ¡£
Utiil.lua ôëóÑÍÅæ¨
AI.lua ö¦Ê¦ì¤Öõ£¬ÙÍîñî¤Util.lua 清Ó¤íÀÖùϰðãñ飬êóÐúú£Ó¤âíÐüÒöîÜͪߩùÞâ¦î¤×ëØü¡£
ßæÙ¤ô÷ìÑÍïòªÒöù±âÎîÜðÉËìãÀ£¬AI.lua 檔äÐûúAI.lua 檔äÐ×ëá¶ïÒëùîÜAI (id)ùÞ⦣¬ð¶ÖõîÏÕ×ËÁðÉËìñýèâÔ´ãÀàÔ÷ÉÞÀú££¬üµÏ£ü¥àã Const.lua, Util.lua å¥ãÀàÔ÷ÉîÜÞÀú££¬ÜôΦî¤ð²íÂмÜâãÁ£¬ü½ãÀâÍé©ÊÀðúï×ÜÃîÜ?
3- à¹ÌÑîîàãClientÓ® Ò®ËïùÞ⦠àãÙ¥
# id : ë´戲Ò®îÜÚªô÷£¬á¶è¶êóîÜò¦ïÒøºûÜ
1) MoveToOwner
(id)
id : ßæÙ¤ô÷îÜ id
Ïýü½值: ÙÒêó
ѦÒö : åÓßæÙ¤ô÷ì¹ÔÑÓðñ«ìÑãóܫݾÐÎ
2) Move
(id,x,y)
id : ßæÙ¤ô÷îÜ id
x : ÙÍîÜò¢ üôàÊ ñ¨øö
y : ÙÍîÜò¢ á÷òÁ ñ¨øö
Ïýü½值 : ÙÒêó
ѦÒö : åÓßæÙ¤ô÷èÙÙÍîÜò¢ì¹ÔÑ
3) Attack
(id1,id2)
id1 : Íô̪íº
id2 : ÞªÍô̪íº
Ïýü½值 : ÙÒêó
ѦÒö : åÓßæÙ¤ô÷ËÛÍô̪ id2íº
4) GetV (V_,id) end
V_... :
úéãÆÚªô÷áÕàõîÜßÈâ¦â¦值
id : áÕàõîÜÓßßÚ
Ïýü½值 : V_... ëîËàVîÜâ¦值ñ®Ïýüµ£¬舉ÖÇÕÎàã :î¤V_POSITIONãÁ£¬Ó×x, y ñ¨øöãÀ V_HPãÁ£¬ö¦ãÀ HP ¡£
ѦÒö : üòÔð id îÜáÕàõ (V_...)£¬úéãÆáÕàõîÜßÈâ¦â¦值î¤Util.lua×룬ì«ÌèïÒëùÖõ£¬
êóμáÕàõîÜßÙá¬Ò®é» : ôëóÑÍÅ¡®4- à¹ÌÑîîàãClientÓ® Ò®íúßÈâ¦值 àãÙ¥¡¯
5)
GetActors ()
Ïýü½值 : ãÀidÙúîÜó¢ù꣬Ïýüµà÷luaîÜtableúþ÷¾
ѦÒö : î¤ÊÇßäãÊàÊ×ëîÜÊÇßä¡¢NPC¡¢ØªÚª¡¢Úªù¡¡¢üòÔðÐüÒöÙúîÜid
6) GetTick
()
Ïýü½值 : 1/1000õ©îÜ£¬Ó¤êÈâ¦í®
ѦÒö : üòÔðï³ÒàîÜãÁÊ࣬îÏâ¦值ãÀò¦£¬ï³ÒàËÒã·ãÁðô0ËÒã·£¬Øß1/1000õ© ñòÊ¥1£¬ìéòÁÓðÙÍîñîÜâ¦值
7)
GetMsg (id)
id : ßæÙ¤ô÷îÜ id
Ïýü½值 : ðôà¹ÌÑîîàãClientîîôöîÜãòãÓ£¬ì¤luaîÜtableúþ÷¾Ïýüµ
ѦÒö : ÷êÞÅéÄíºîÜòÁïÈÙ¤ÖµÔõ£¬îîÐåмÜâ
8)
GetResMsg (id)
id : ßæÙ¤ô÷îÜ id
Ïýü½值 : ðôà¹ÌÑîîàãClientîîôöîÜçèå³ãòãÓ£¬ì¤luaîÜtableúþ÷¾Ïýüµ
ѦÒö : ÷êÞÅéÄíºîÜòÁïÈçèå³Ù¤ÖµÔõ£¬îîÐåмÜâ
10) SkillObject (id,level,skill,target)
id : ßæÙ¤ô÷îÜ id
Ïýü½值 : ÙÒêó
ѦÒö : id á¶øÐùßîÜÔÔà¤ãÀøÐùßtargetîÜÔÔण¬êóμleveløÐùßîÜâ¦值ãÀʦÞÅéÄîÜÙ»ðúÐüÒö(skill)
11) SkillGround (id,level,skill,x,y)
id á¶øÐùßîÜÔÔà¤ãÀøÐùßx.y
îÜñ¨øö£¬êóμlevelá¶øÐùßîÜâ¦值ãÀʦÞÅéÄîÜskill
13) IsMonster
(id)
id : ë´戲Ò®îÜÚªô÷
Ïýü½值 : id á¶øÐùßîÜÔÔà¤ãÀتڪîÜü¥Ê¦Ïýüµ1£¬å´ÜôãÀîÜü¥Ê¦Ïýüµ為0
ѦÒö : ʦ÷÷ܬتڪ
14) TraceAI (string)
string : ãÀѺÖâî¤TraceAI.txt 檔äÐîÜҮ黣¬ìéïÒé©Ùþí®檔
ѦÒö : ѺÖâúÞî¤òûú¼ñéîÜмÜ⣬ñ®為ÝÂà°ÞÅéÄ
4- à¹ÌÑîîàãClientÓ®
Ò®íúßÈâ¦值
àãÙ¥
Ò®íúßÈâ¦值£¬ïÒëùî¤Const.lua×ë
4-1 GetV ùÞâ¦ñ飬á¶ÞÅéÄîÜßÈâ¦â¦值
V_OWNER = 0 --
÷êñ«ìÑîÜøºûÜ Ïýü½
V_POSITION = 1 --
úÞî¤êÈöÇ x,
y Ïýü½
V_TYPE = 2 --
ãÀ哪ìéðúËÁô÷? (Ú±ËÒÛ¯)
V_MOTION = 3 --
úÞî¤ÔÑí Ïýü½
V_ATTACKRANGE = 4 --
Íô̪ÛôêÌ Ïýü½ (Ú±ËÒÛ¯£¬×üãÁ1ÍöÌ«)
V_TARGET = 5
--
Íô̪ûäãÀÞÅéÄÐüÒöÙÍøö Ïýü½
V_SKILLATTACKRANGE = 6
--
ÐüÒöÍô̪ÛôêÌ (Ú±ËÒÛ¯)
V_HOMUNTYPE = 7 --
ßæÙ¤ô÷ðú×¾ Ïýü½
V_HP = 8 --
ßæÙ¤ô÷ûäãÀÑáñ«ìÑîÜ HP
V_SP = 9 --
ßæÙ¤ô÷ûäãÀÑáñ«ìÑîÜ SP
V_MAXHP = 10 --
ßæÙ¤ô÷ûäãÀÑáñ«ìÑîÜõÌÓÞ HP
V_MAXSP = 11 --
ßæÙ¤ô÷ûäãÀÑáñ«ìÑîÜõÌÓÞ SP
4-2 êóμGetV (V_MOTION, id)îÜ Ïýü½值
MOTION_STAND = 0 :
óר¡îÜ ÔÑíÂ
MOTION_MOVE = 1 :
ì¹ÔÑñéîÜ ÔÑíÂ
MOTION_ATTACK =
2 :
Íô̪ñéîÜ ÔÑíÂ
MOTION_DEAD =
3 :
ÞÝØÌîÜ ÔÑíÂ
MOTION_ATTACK2 =
9
:
Íô̪ãÁîÜ ÔÑíÂ
4-3 êóμGetV (V_HOMUNTYPE, id)îÜ Ïýü½值
LIF = 1 :
Õòݳ
AMISTR = 2 :
äõ咪ÞÙʦÖÛ
FILIR = 3 :
Þ«×ìäÅ
VANILMIRTH = 4 :
÷éÒùÚ·äÅÞÙ
LIF_H = 5 :
òäûùîÜ Õòݳ
AMISTR_H = 6 :
òäûùîÜ äõ咪ÞÙʦÖÛ
FILIR_H = 7 :
òäûùîÜ Þ«×ìäÅ
VANILMIRTH_H = 8 :
òäûùîÜ ÷éÒùÚ·äÅÞÙ
4-4 ëîËàGetMsg (id), GetResMsg (id) á¶Ïýü½îÜtableϰðã
NOME_CMD = 0 --
ÙÒêóÙ¤Öµ
{Ù¤ÖµøºûÜ}
MOVE_CMD = 1 --
ì¹ÔÑ
{Ù¤ÖµøºûÜ,Xñ¨øö,Yñ¨øö}
STOP_CMD = 2 --
ïÎò
{Ù¤ÖµøºûÜ}
ATTACT_OBJET_CMD = 3 --
Íô̪
{Ù¤ÖµøºûÜ£¬ÙÍøöID}
ATTACK_AREA_CMD =
4 --
ò¢Ï¡ Íô̪
{Ù¤ÖµøºûÜ£¬Xñ¨øö£¬Yñ¨øö}
PATROL_CMD = 5 --
ïÏ查
{Ù¤ÖµøºûÜ£¬Xñ¨øö£¬Yñ¨øö}
HOLD_CMD = 6 --
ÞÝáú
{Ù¤ÖµøºûÜ}
SKILL_OBJECT_CMD = 7 --
ÞÅéÄÐüÒö
{Ù¤ÖµøºûÜ£¬àÔ÷ÉÔõÐ䣬ðú×¾£¬ÙÍøöID}
SKILL_AREA_CMD = 8 --
ÞÅéÄò¢Ï¡ÐüÒö
{Ù¤ÖµøºûÜ£¬àÔ÷ÉÔõÐ䣬ðú×¾£¬Xñ¨øö£¬Yñ¨øö}
FOLLOW_CMD = 9 --
跟âËîÊñ«ìÑ
{Ù¤ÖµøºûÜ}
5- ð«ÍêÐñÜâîÜмÜâ àãÙ¥
5-1 ìÑÍïòªÒö мÜâîÜù±âÎé©áÈ
мÜâ檔äÐãÀìéÚõÙþí®檔äУ¬éÄÑÀÞÀÜâìéÚõîÜøºòþÐïð²íÂ即ʦ£¬ñþÜôΦãÀéÄLUAåÞåëá¶ÞÐîÜ£¬Ý¾áÕ檔Ù£é©ÞÅéÄ lua 即ʦ¡£
ßæÙ¤ô÷ìÑÍïòªÒöù±âÎîÜðÉËìãÀ£¬AI.lua 檔äÐûúAI.lua檔äÐ×ëá¶ïÒëùîÜAI (id)ùÞ⦣¬ð¶ÖõîÏÕ×ËÁðÉËìñýèâÔ´ãÀàÔ÷ÉÞÀú££¬
舉ÖÇÕÎà㣬ñ®èÇãæîÜÙþí®檔ý£¬÷ê檔äÐÙ£öàËÇ為 AI.lua ý£¬ËÒ啟ÑÀÞÀÜ⣬æÔýî¤Íö檔äÐ×ëâÃìý
function AI
(myid)
end
ÞÐèÇñýý£¬÷êñýîñêóîÜAI 檔äÐúñ×ëîÜAI.lua ì¹ÔÑÓðܬîÜò¢Û°ûäãÀÌÚËÇÙ£öàý£¬÷êãæð²íÂîÜ檔äÐñ®ÜÜ𲣬æÔýî¢òûú¼RO Clientö¦üå啟ÔÑ£¬ñþãÀßæÙ¤ô÷ä§麼Ô´Üôñ®呆呆îÜó×î¤Ñá×ë¡£
5-2 êóùÚßÒ÷¾ ѦÌþ
é©ð²íÂìÑÍïòªÒöîÜÛ°Ûöêó很Òýðú£¬ÐìñéõÌÓ¤âíîÜÞÅéÄõÌÒýîÜÛ°ÛöãÀ£¬êóùÚßÒ÷¾Ñ¦Ìþ(FSM, Finite State Machine)£¬
êóμêóùÚßÒ÷¾Ñ¦ÌþùÊâúß¾îÜïÒëù£¬ßöïÁ×ëÔ´êóßÙá¬îÜË¿áÉíÀÖù£¬îÏãÀÓÞÝ»份îÜìÑÔ´ò±Ô³îÜÞÀãù¡£
ä²Ùúö¦ÑÚä²ÙúîÜñ«ð¹£¬ßæÙ¤ô÷ÕÎ舉ÖÇû¿Öõ£¬âÏà»ä²ÙúüåÑ¢Óâä²ÙúîÜßæÙ¤ô÷üå怎åÆîÜú¼ÔÑ£¬
÷êîÏÞÁÔÔà¤à»ãËîÊÑÀù»ÕÎû¿Öõ£¬
ãü找Íô̪ñ«ìÑîÜÚªô÷ý£¬ËÛÍô̪ö⣬
ñ²êÌêóتڪîÜü¥à»ñ®Íô̪.. ûäãÀàì躲 (üåáôß¿ò¢
^^;;)
Üôé©ûúñ«ìÑËå×î÷¼êÀ£¬ÜÁò¥ìéïÒîÜËå×î
ÔõÔõ
äÎðÎßÒüÏüåêó很ÒýîÜé©Ï´ÞÀú£
Ê£àâä²Ùúì«Ìè÷êé©Ï´ÞÀú£Ô´ïÚ×âû¿ÖõîÜü¥£¬Ñáä²Ùúö¦Ü¨à÷ßæÙ¤ô÷ßÌìéù»Ùýð¹û¿Öõ£¬
ä²Ùúà»ßÌßÀìéù»ñ²êÌÙÒêóتڪ¡¢ñ«ìÑå¥ó×îÊÜôÔÑãÁ£¬ßæÙ¤ô÷å¥ãÀýÌãÓîÜßÒ÷¾¡£
Ê£àâñ«ìÑðäáôÓðÍô̪ûäãÀä²ðäáôÓðÍô̪îÜü¥£¬÷êÍô̪ä²îÜÚªô÷ìãïÒ為îØìÑËÛõÚõïö⣬ö¦üåܨà÷ßæÙ¤ô÷üåõÚõïÙ»ËÁÚªô÷îÜßÒ÷¾¡£
Ó×îØìÑî¤Íô̪ÛôêÌãÁ£¬ÞÅéÄÚª×âÍô̪ûäãÀÞÅéÄÐüÒöãÁ£¬ö¦üåܨà÷ûúÙ»ËÁÚªô÷íÂîúîÜßÒ÷¾¡£
Ó×îØìÑì«á¼ØþÖõûäãÀì«Ô±Óð很êÀîÜò¢Û°ãÁ£¬ö¦é©üÞÓðñ«ìÑîÜãóÜ«£¬îÏãÁý¦ö¦üåܨà÷跟âËñ«ìÑîÜßÒ÷¾¡£
ß¾Øüá¶Ë»îÜÞÌðúßÒ÷¾×üãÁïÒëù為 : ýÌãÓ(IDLE)¡¢õÚõï(CHASE)¡¢Íô̪(ATTACK)¡¢üÞÏý(FOLLOW) îÜßÒ÷¾£¬
æÔýî¤ËÁßÒ÷¾ù»Û¡ßæÙ»ðúܨûùãÁ£¬üå̽ïÒܨà÷ÜôãÀúÞî¤îÜßÒ÷¾ì»ãÀܬîÜßÒ÷¾£¬æÔýüåò¦ïÒîÏËÁßÒ÷¾ãÁîÜÔÑí£¬ñòÊ¥ÐúðúËþ查îÜðÉËìý£¬÷êîÏËÁ畫à÷Óñ畫îÜü¥£¬åýù»á¶ãÆ :
ýÌãÓ õÚõï Íô̪ üÞÏý 1. Ê×ÜôÓðîØìÑ 2. îØìÑá¼Øþ 3. îØìÑî¤Íô̪ÛôêÌÒ® ûúñ«ìÑËå×îÐÎ 3. îØìÑî¤Íô̪ÛôêÌèâ 1.
ñ«ìÑáôÓðÍô̪ 2.
áôÓðÍô̪ 1. îØìÑá¼Øþ 2. Ê×ÜôÓðîØìÑ ûúñ«ìÑêÀ×î 4.î¤ãÊàÊÒ®îØìÑêÈöÇܨûù 4.î¢õöï³
õÌôøîÜßÒ÷¾ãÀýÌãÓßÒ÷¾£¬ñ²êÌîÜßÒüÏËÇܨãÁßæÙ¤ô÷îÜßÒ÷¾å¥üå跟îÊËÇܨîÜ£¬æÔýÐå牠àâïÒà÷îêÓ×îÜÔÑíÂö¦û¿Öõ£¬úÞî¤ì«Ìè÷êͪüñÔ´ßÌû¿Öõñ®ÖõÐúú£ñÞÝáñýý£¬ãùð·ÕÎð²íÂìéù»Ð¼Üâû¿Öõ¡£
5-3 Util.lua
Üôηñ®ä§麼åÆîÜÍïí£¬為Öõñ®øµ××îÜÍïíÂä²ÙúÔ´üåñÞÝáÍïÎýîÜ
ð²íÂßæÙ¤ô÷ìÑÍïòªÒöé©êóù±âÎîÜé©áÈAI.luaûúAI(id) ùÞâ¦即ʦ£¬Üôåýà»ñ®û¿ÐúåÆÍïÎýãÀÝïÎòÛ°øµîÜ£¬
îÏÔ³Îýñ«é©ãÀtableûäùÞâ¦îÜúþ÷¾£¬÷êîÏËÁð²íÂÓðUtil.luaý£¬íÂ為AI.luaîÜóÑÍÅ£¬
Íö檔äÐõÌß¾ØüÞÐ Const.lua ñ®óÑÍÅ ÞÐîÊ
require ¡°./AI/Const.lua¡±
êóÞÁ檔äÐé©ì¤â÷ßíÕÎñ®î¹ðí£¬é©ì¤â÷ßíÕÎÔÁö¢£¬üåêóíÀÖùϰðãîÜãÁý¦¡£ßÀßæÙ¤ô÷îÜìÑÍïòªÒö£¬êóãÁý¦ì¤çèå³Ù¤ÖµåÞîÜâÍé©£¬ì¤â÷ßíÕÎñ®î¹ðí£¬ì¤â÷ßíÕÎñ®ÔÁö¢îÜù±é©£¬÷êíÀÖùϰà÷îÜÙ£í®Ð£ñ®List£¬ñòÊ¥ÐúåÆùÞâ¦
(Util.lua óÑÍÅ)
List.new () --
ãæîÜ清Ó¤ Ïýü½
List.pushleft (list, value) --
list ñ§Ü«îÜé©áÈñòÊ¥
List.pushright (list, value) --
list éÓÜ«îÜé©áÈñòÊ¥
List.popleft (list) --
÷ê list ñ§Ü«îÜð¯ìéËÁâ¦值ÑÚΦÕÎ
List.popright (list) --
÷ê list éÓÜ«îÜð¯ìéËÁâ¦值ÑÚΦÕÎ
List.clear (list) --÷ê list 清Íö
List.size (list) --î¤ list ×ëØüîÜé©áÈËÁâ¦
ÌèßÈÞÅéÄîÜÐúðúͪߩùÞâ¦å¥ñòÊ¥î¤×ëØü
GetDistance (x1,y1,x2,y2) --
Õ×ËÁñ¨øöñýÊàîÜÍöÌ«Ëå×î(ïáâ¦â¦值)
GetDistance2 (id1, id2) --
Õ×ËÁÚªô÷ñýÊàîÜÍöÌ«Ëå×î(ïáâ¦â¦值)
GetOwnerPosition (id) --
ñ«ìÑîÜêÈöÇ
GetDistanceFromOwner (id) --
ûúñ«ìÑîÜËå×î
IsOutOfSight (id1,id2) --
id1ûú id
IsInAttackSight (id1,id2) --
î¤id1îÜÍô̪ûäãÀÞÅéÄÐüÒöÛôêÌêóid2îÜü¥£¬ãÀtrue£¬ÜôãÀîÜü¥Ïýü½為false
5-4 AI.lua
úÞî¤ð²íÂAI.lua £¬à»ñ®ìéËÁÍöîÜÙþí®檔äУ¬÷êAI.luaîÜÙ£í®ñ®ÌÚüµ£¬î¤ÑÀÞÀÜâ×ëËÒ啟AI.lua 檔äУ¬
Íö檔äÐõÌß¾ØüÞÐConst.lua
, Util.luañ®óÑÍÅ ÞÐîÊ
require ¡°./AI/Const.lua¡±
require ¡°./AI/Util.lua¡±
ÛÜßä(ûäîÊýÙßä) ÍöîÜÍöÌ«ãÀù±é©îÜé©áÈ
function AI (myid)
end
ÞÐèÇñýý
ÞÐÓðîÏÜ«éÑèÇà÷ÖõìéËÁìÑÍïòªÒö£¬Ê¦ãÀè¶êóÍöîÜAI(myid)ùÞâ¦ìÑÍïòªÒöãÁ£¬î¤ë´戲×ëßæÙ¤ô÷ñþüåó×îÊÜôÔÑ£¬îÏÜôãÀä²ÙúîÜͪüñ£¬
÷êͪüñîÜÐúðúßÒ÷¾ ñìãæïÒëù
IDLE_ST =
0 --- ýÌãÓ
FOLLOW_ST =
1 --- üÞÏý
CHASE_ST =
2 --- õÚ蹤
ATTACK_ST =
3 --- Íô̪
ü½êóâÍé©ÑÀåãúÞî¤îÜßæÙ¤ô÷ßÒ÷¾îÜܨ⦣¬ûäãÀßæÙ¤ô÷îÜid¡¢îØìÑid¡¢ÙÍîÜò¢ñ¨øöÔõÔõ£¬é©âÍé©ÑÀñ¬îÏÞÁ£¬
ßæÙ¤ô÷îÜßÒ÷¾£¬õÌôøãÀýÌãÓßÒ÷¾
------------------------------------------
-- global variable
------------------------------------------
MyState = IDLE_ST --
õÌôøîÜßÒ÷¾ãÀ ýÌãÓ
MyEnemy =
0 --
îØìÑîÜ id
MyDestX =
0 --
ÙÍîÜò¢ x
MyDestY =
0 --
ÙÍîÜò¢ y
MyPatrolX =
0 --
ïÏ查 ÙÍîÜò¢ x
MyPatrolY =
0 --
ïÏ查 ÙÍîÜò¢ y
ResCmdList =
List.new() --
çèå³ Ù¤ÖµåÞ 清Ó¤
MyID =
0 --
ßæÙ¤ô÷ id
MySkill =
0 --
ßæÙ¤ô÷îÜÐüÒö
MySkillLevel =
0 --
ßæÙ¤ô÷îÜÐüÒöÔõÐä
------------------------------------------
function AI (myid)
MyID = myid
end
ô¥×âýÌãÓßÒüÏîÜùÞâ¦ïÒëù為 OnIDLE_ST() £¬並ó¦åÓöâî¤AI(myid) ùÞâ¦×ë啟ÔÑñ®為øºòþ¡£
function OnIDLE_ST
()
local object =
GetOwnerEnemy (MyID) --
ãü找ñ«ìÑîÜîØìÑ
if
(object ~= 0) then --
êóÙÒêóñ«ìÑîÜîØìÑ?
MyState
= CHASE_ST --
ì×為êóñ«ìÑîÜîØìÑï®üµà÷õÚõïßÒ÷¾ MyEnemy
= object -- ÑÀåãä²îØìÑîÜøºûÜ
return
--
ùÞâ¦Ì¿áÖ
end
object
= GetMyEnemy (MyID) --
ãü找ä²îÜîØìÑ
if
(object ~= 0) then --
êóÙÒêóä²îÜîØìÑ?
MyState
= CHASE_ST --
ì×為êóä²îÜîØìÑï®üµà÷õÚõïßÒ÷¾
MyEnemy
= object --
ÑÀåãä²îØìÑîÜøºûÜ
return
end
local
distance = GetDistanceFromOwner(MyID) --
üòÔðåÚñ«ìÑîÜËå×î
if
( distance > 3 or distance == -1) then --
ûúñ«ìÑîÜËå×î3ÍöÌ«ì¤ß¾£¬ûäãÀî¤ñ«ìÑîÜãÊàÊì¤èâîÜü¥
MyState
= FOLLOW_ST -- ï®üµà÷üÞÏýßÒ÷¾
return;
end
end
function AI (myid)
MyID = myid
if (MyState == IDLE_ST) then
OnIDLE_ST ()
end
end
Ó×ñ«ìÑù¬Íô̪ûäãÀêóä²ËÁîØìÑãÁ£¬üåï®üµà÷õÚõïîÜßÒ÷¾£¬å´ÜôݾûúîÏÕ×ËÁðÉËìüåͪߩõóåÚñ«ìÑîÜËå×å´êÀ×îìéïÒËå×îîÜü¥üåï®üµà÷üÞÏýßÒ÷¾£¬
Ñá麼牠怎麼üåìãò±¡°ñ«ìÑù¬Íô̪Öõ¡±£¬¡°êóä²îÜîØìÑ¡±îÜðÉËì呢?
á¶êÝ¡°ñ«ìÑù¬Íô̪Öõ¡±îÜðÉËìãÀ£¬î¤ñ²êÌ×ëÚªô÷ñéîÜØªÚª£¬ÑáÓßßÚÓßîÊñ«ìÑãÁ£¬å´ÜôãÀتڪì»ãÀìéÚõèÌÊ«îÜÊÇßäÕÎÍô̪ñ«ìÑãÁé©怎麼ÝÂÜ©呢? ñþé©ËÛËþ查ÑáÊÇßäîÜÔÑíÂîÜü¥£¬ö¦üåò±Ô³îÜ
function GetOwnerEnemy
(myid) --
ãü找ñ«ìÑîÜîØìÑ
local
result = 0
local
owner = GetV (V_OWNER,myid) --
ñ«ìÑ
local
actors = GetActors () --
î¤ñ«ìÑãÊàÊ×ëîÜÚªô÷Ùú
local
enemys = {} --
ݶô¡ñ«ìÑîØìÑîÜtable
local
index = 1
local
target
for
i,v in ipairs(actors) do --
÷êñ«ìÑãÊàÊÒ®îÜá¶êóÚªô÷£¬îïÝ»ãÊóÌ
if
(v ~= owner and v ~= myid) then --
Ù»ðúÚªô÷îÜÙÍøöÚª
target
= GetV (V_TARGET,v)
if
(target == owner) then --
ÙÍøöÚªãÀñ«ìÑîÜü¥
if
(IsMonster(v) == 1) then --
Ù»ðúÚªô÷ãÀتڪîÜü¥
enemys[index]
= v --
ñ«ìÑîÜîØìÑñòÊ¥Öõ
index
= index+1
else --
哪ÞÁÚªô÷ÜôãÀتڪîÜü¥
local
motion = GetV(V_MOTION,i) --
哪ÞÁÚªô÷úÞî¤îÜÔÑíÂ
if
(motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then – å´ãÀÍô̪ÔÑíÂîÜü¥
enemys[index]
= v
-- ñ«ìÑîÜîØìÑñòÊ¥Öõ
index
= index+1
end
end
end
end
end
local
min_dis = 100 --
õÌá´îÜËå×îàâïÒ為100
local
dis
for
i,v in ipairs(enemys) do --
÷êñ«ìÑîÜîØìÑÙúîïÝ»ãÊóÌ
dis
= GetDistance2 (myid,v) --
ñ«ìÑûúÙ»ËÁîØìÑîÜËå×î
if
(dis < min_dis) then --
Ëå×îá´åÚõÌá´Ëå×îãÁ
result
= v --
àâïÒõÌðûìéËÁîØìÑ
min_dis
= dis --
àâïÒõÌá´Ëå×î
end
end
return
result --
õÌðûÌ¿Íý Ïýü½ ( 0îÜü¥øúãÆÙÒêóñ«ìÑîÜîØìÑÖõ)
end
Ì¿ÍýîÜâ¦值ÜôãÀ0ãÁ£¬øúãÆñ«ìÑïáî¤ù¬Íô̪ñé
á¶êÝ¡°êóä²îÜîØìÑ¡± îÜðÉËìãÀ怎麼÷÷Ó¨îÜ呢? Ê£åýßÌé©åÓßæÙ¤ô÷à»Íô̪تڪîÜü¥ £¬Ê£åýñ²êÌêóتڪîÜü¥à»åÓ牠÷÷Ó¨à÷êóîØìÑö¦Ê¦ì¤啦£¬Ê£åýßÌé©åÓßæÙ¤ô÷ܨà÷à»ù¬Íô̪ý£¬î¢åÓßæÙ¤ô÷êóÚãëëîÜü¥£¬åÓßæÙ¤ô÷ü¬ìãêóÙÒêóÍô̪ÓßßÚö¦Ê¦ì¤啦£¬îÏÕ×ËÁàÔ÷É̽ïÒ£¬ìéËÁãÀàÔ÷Éà»Íô£¬ûúÞªà»ÍôßæÙ¤ô÷îÜ¡£
function GetMyEnemy
(myid) --
ãü找ä²îÜîØìÑ
local
result = 0
local
type = GetV (V_HOMUNTYPE,myid) --
ä²ãÀ哪ìéðú×¾úþßæÙ¤ô÷
if
(type == LIF or type == LIF_H or type == AMSTR or type == AMSTR_H) then
result
= GetMyEnemyA (myid) --
ãü找Þªà»Íô̪úþîØìÑîÜùÞâ¦
elseif
(type == FILIR or type == FILIR_H or type == VANILMIRTH or type ==
VANILMIRTH_H) then
result
= GetMyEnemyB (myid) --
ãü找à»Íô̪úþîØìÑîÜùÞâ¦
end
return
result
end
-------------------------------------------
-- Þªà»Íô̪úþ GetMyEnemy
-------------------------------------------
function GetMyEnemyA
(myid)
local
result = 0
local
owner = GetV (V_OWNER,myid)
local
actors = GetActors ()
local
enemys = {}
local
index = 1
local
target
for
i,v in ipairs(actors) do
if
(v ~= owner and v ~= myid) then
target
= GetV (V_TARGET,v)
if
(target == myid) then
enemys[index]
= v --
÷êÍô̪ä²îÜÚªô÷àâïÒ為ä²îÜîØìÑ
index
= index+1
end
end
end
local
min_dis = 100
local
dis
for
i,v in ipairs(enemys) do
dis
= GetDistance2 (myid,v)
if
(dis < min_dis) then
result
= v
min_dis
= dis
end
end
return
result
end
-------------------------------------------
-- à»Íôúþ GetMyEnemy
-------------------------------------------
function GetMyEnemyB
(myid)
local
result = 0
local
owner = GetV (V_OWNER,myid)
local
actors = GetActors ()
local
enemys = {}
local
index = 1
local
type
for
i,v in ipairs(actors) do
if
(v ~= owner and v ~= myid) then
if
(1 == IsMonster(v)) then
enemys[index]
= v --
÷êñ²Ü«îÜØªÚªàâïÒà÷ä²îÜîØìÑ
index
= index+1
end
end
end
local
min_dis = 100
local
dis
for
i,v in ipairs(enemys) do
dis
= GetDistance2 (myid,v)
if
(dis < min_dis) then
result
= v
min_dis
= dis
end
end
return
result
end
åýß¾Øüá¶ãÆ£¬你ì«Ìèô¥×âèÇýÌãÓßÒ÷¾îÜïïãÒÖõ£¬ðôýÌãÓßÒ÷¾ï®üµÓðõÚõïßÒ÷¾¡¢üÞÏýßÒ÷¾Ô´ãÀéÄ×¾ÞÄîÜÛ°ãÒð²ñ®îÜ£¬Ðì它îÜßÒ÷¾å¥ãÀìéåÆîÜ¡£
õÌýßæÙ¤ô÷üåòÁïÈòûú¼ÞÅéÄíºÙ¤ÖµîÜÍíÒö£¬
éÄüÁà©ò¦ïÒì¹ÔÑÓð÷åïÒîÜêÈöÇ£¬ûäãÀò¦ïÒÍô̪÷åïÒîÜØªÚª£¬ûäãÀäÎËõÚï÷åïÒîÜËõåÓ牠ïÎòÜôÔÑô¥×âÔõ£¬
ÞÅéÄíºá¶ù»îÜÙ¤Öµ£¬×¾ÞÄãòãÓîÜúþ÷¾îîÐåмÜâîÜ£¬ÕÎú°ÔÁîÏãòãÓý£¬ÕÎï®üµà÷òûú¼÷åïÒÙ¤ÖµîÜßÒ÷¾ö¦Ê¦ì¤Öõ£¬ßÌé©îÏåÆíîÜü¥£¬é©êóïÈáôãòãÓñ®ú°ÔÁîÜÝ»份£¬ûúñòÊ¥ô¥×â÷åïÒÙ¤ÖµîÜßÒ÷¾£¬ÐàñòÊ¥ßÒ÷¾ô¥×âùÞâ¦即ʦ£¬ î¤AI(myid) ÓôìýîÜÝ»份ñòÊ¥ù»ØüîÜÒ®é»
MyID = myid
local
msg =
GetMsg (myid) --
ïÈâ¥Óð Ù¤Öµ
local
rmsg =
GetResMsg (myid) --
ïÈâ¥Óð çèå³Ù¤Öµ
ProcessCommand
(msg) --
Ù¤Öµ ô¥×â
-- çèå³ Ù¤ÖµåÞ î¹ðí
if
msg[1] == NONE_CMD then
if
rmsg[1] ~= NONE_CMD then
if
List.size(ResCmdList) < 10 then --
çèå³ Ù¤Öµñþâ¥10ËÁ
List.pushright
(ResCmdList,rmsg)
end
end
else
List.clear
(ResCmdList) --
ØßÓ×ãæîÜÙ¤ÖµòäÕÎãÁ£¬÷êñýîñçèå³îÜ٤ֵߢð¶
end
ñòÊ¥ô¥×âãòãÓîÜProcessCommand (msg) ûúô¥×âËÁãòãÓîÜùÞâ¦OnMOVE_CMD (msg[2],msg[3]) Ôõ£¬
ÊÀËÁÙ¤Öµòûú¼ßÒ÷¾îÜô¥×âùÞ⦣¬(舉ÖÇÕÎàãð²íÂõó OnMOVE_CMD_ST ()) £¬âÍé©Ù¤Öµòûú¼ßÒ÷¾îÜ×âë¦ãÀ£¬Ó×Ù¤Öµòûú¼èÇù´為òãÁ£¬為ÖõËþ查òûú¼Ù¤ÖµèÇù´îÜμÌõ
5-5 ÙþÛöó¹è¦Ëþ查ûúð²í TraceAI.txt
èÇà÷îÜмÜâ檔äУ¬üåè¶êóÙþÛöß¾îÜó¹è¦îÜ£¬êóÙþÛöó¹è¦îÜмÜ⣬мÜâî¤Client ïïãÒú°ÔÁãÁ£¬üåáêõóó¹è¦îÜãòãÓ£¬
ʦì¤î¤ü½ÙÒêóòûú¼ClientïïãÒßÒ÷¾ãÁ£¬ö¦Ê¦ì¤à»ñ®ð¯ìéóîÜÙþÛöËþ查£¬
î¤à¹ÌÑîîàã×ëËïöÇîÜ檔äÐúñ×룬ïÇ̪Õ×ó lua.exe檔äÐîÜü¥£¬üåõóúÞÙ¤Öµproport
âÃìýò¦Öµý >
dofile ¡®./AI/AI.lua¡¯
äÎEnterîÜü¥£¬Ê£åýêóÙþÛöß¾îÜó¹è¦îÜü¥£¬üåúéãÆú±ó¹è¦îÜãòãÓ£¬å´ÙÒêóó¹è¦îÜü¥ÜôüåúéãÆìòù¼ãòãÓ£¬
î¤îÏåÆíîÜËþ查×ëÙÒêóÙþÛöß¾îÜó¹è¦ãÁ£¬å¥üåî¤ßæÙ¤ô÷îÜßÒ÷¾ù»ËÒã·ë´戲ãÁ£¬üåêóõóúÞó¹è¦ãòãÓîÜï×üÏ£¬
îÏãÁý¦å¥ãÀßÓÔÒîÜì¹ÔÑÓðó¹è¦îÜú¼â¦ß¾ñ®áóïáý£¬ñìãæî¢ËÒã·ë´戲£¬
âÌæÔÙÒêóÙþÛöß¾îÜó¹è¦òûú¼Ð¼Üâý£¬即ÞÅßæÙ¤ô÷ʦì¤ÔÑí£¬êó×âÖåß¾îÜó¹è¦îÜü¥å¥üåðãà÷ÜôÒöçèÑ¢îÜú¼ÔÑ£¬Ó×碰ÓðîÏåÆîÜãÁý¦£¬é©÷êßæÙ¤ô÷îÜßÒ÷¾Ü¨ûùûúÊÀðúâ¦值îÜܨûù£¬ñ®ÑºÖâýé©ñ®ÝÂà°îÜù±é©àõ¡£
舉ÖÇÕÎàã£¬ßæÙ¤ô÷õÚõïÓðîØìÑãóÜ«ýÜôñ®Íô̪îÜü¥£¬ä²Ùúʦì¤ãÄö´å¥úÉî¤õÚõïîÜßÒ÷¾×룬 êó×âÖåß¾îÜó¹è¦Û¡ßæå¥ÜôìéïÒîÜ¡£
function OnCHASE_ST
()
TraceAI
("OnCHASE_ST")
if
(true == IsOutOfSight(MyID,MyEnemy)) then --
ENEMY_OUTSIGHT_IN
MyState
= IDLE_ST
MyEnemy
= 0
MyDestX,
MyDestY = 0,0
TraceAI
("CHASE_ST -> IDLE_ST : ENEMY_OUTSIGHT_IN")
return
end
if
(true == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_INATTACKSIGHT_IN
MyState
= ATTACK_ST
TraceAI
("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN")
return
end
local
x, y = GetV (V_POSITION,MyEnemy)
if
(MyDestX ~= x or MyDestY ~= y) then --
DESTCHANGED_IN
MyDestX,
MyDestY = GetV (V_POSITION,MyEnemy);
Move
(MyID,MyDestX,MyDestY)
TraceAI
("CHASE_ST -> CHASE_ST : DESTCHANGED_IN")
return
end
TraceAI (string.format(¡°OnChase_ST end MyEnemy: %d, EnemyX : %d,
EnemyY:%d, MyDestX:%d, MyDestY:%d\n¡±,MyEnemy,x,y,MyDestX,MyDestY))
end
åýß¾Øüìé寣¬ßÌé©ò±Ô³÷åïÒßÒ÷¾ô¥×âùÞâ¦îÜü¥£¬÷êßÌé©ò±Ô³îÜÒ®é»Û¯î¤TraceAI ×ëØü£¬
æÔýî¤ë´戲Óßü¥ãÊ窗×ëâÃìý /traceaiîÜü¥£¬î¤à¹ÌÑîîàã×ëàâöÇîÜ檔äÐúñêóTraceAI.txt 檔äУ¬üåѺÖâÑáÒ®é»îÜ£¬î¤ñìãæâÃìý/traceai îÜü¥£¬îÏѺÖâö¦üåïÎò£¬ßÌé©ÑºÖâÙ»ðúܨâ¦â¦值ãÁ£¬ÞÅéÄstring.format ʦì¤áóïáÙþí®ú¼îÜ
6- Ðì它
ïïãÒåÞåëôëóÑÍÅ lua (LUA) ίØÑ :
http://www.lua.org
ùÛÙþ lua ίØÑ :
http://www.redwiki.net/wiki/wiki.php/Lua
7-ܨÌÚÞÀú£
------------------------------------------------------------------------------------------------------------
1)
ì¹ÔÑÙ¤ÖµûúÍô̪ʦñ®çèå³
äÎ
ShiftËõûú
AltËõÔÒãÁ£¬Óßò¢ØüïÇ̪üÁà©éÓËõîÜü¥£¬ì¹ÔÑÙ¤Öµüåù¬çèå³îÜ£¬
äÎ
ShiftËõûú
AltËõÔÒãÁ£¬ÓßÍô̪ÓßßÚïÇ̪üÁà©éÓËõîÜü¥£¬Íô̪٤ֵüåù¬çèå³îÜ
function AI(myid)
¡¦
if
msg[1] == NONE_CMD then
if
rmsg[1] ~= NONE_CMD then
if
List.size(ResCmdList) < 10 then
List.pushright
(ResCmdList,rmsg) – çèå³Ù¤Öµ
î¹ðí
end
end
else
List.clear
(ResCmdList) -- ãæîÜÙ¤ÖµâÃìýãÁ£¬çèå³Ù¤Öµüåߢð¶
ProcessCommand
(msg) -- ô¥×âÙ¤ÖµåÞ
end
¡¦
ö¦åýÔÒß¾Øüá¶Ì¸îÜ£¬ÙÒêóÙ¤ÖµîÜü¥ôëËþ查çèå³Ù¤Öµ£¬
êóçèå³Ù¤ÖµîÜü¥£¬÷êçèå³Ù¤Öµ清Ó¤(ResCmdList)
ñòÊ¥î¤õÌýØü
function OnIDLE_ST
()
TraceAI
("OnIDLE_ST")
local
cmd = List.popleft(ResCmdList)
if
(cmd ~= nil) then
ProcessCommand
(cmd) -- ô¥×âçèå³Ù¤ÖµåÞ
return
end
¡¦
î¤ýÌãÓßÒ÷¾(IDLE_ST)ô¥×âãÁ£¬à»Ëþ查çèå³Ù¤ÖµîÜ清Ó¤£¬ÕÎô¥×âçèå³Ù¤Öµ£¬
Üôηî¤哪ðúßÒ÷¾ï®üµà÷ýÌãÓßÒ÷¾ãÁ£¬ãÀô¥×âçèå³Ù¤ÖµîÜϰðã
function OnMOVE_CMD
(x,y)
¡¦
local curX, curY = GetV (V_POSITION,MyID)
if
(math.abs(x-curX)+math.abs(y-curY) > 15) then --
ÙÍîÜò¢ì«Ìèî¤ìéïÒËå×îì¤ß¾ãÁ (ì×為î¤ÞÃÜ×Ðï×ëÜôô¥×âêÀËå×îîÜÔÔà¤)
List.pushleft
(ResCmdList,{MOVE_CMD,x,y}) --ì¹ÔÑÓðçèå³ê«ÕÎîÜÙÍîÜò¢
x
= math.floor((x+curX)/2) --
à»ì¹ÔÑÓðñéÊàêÈöÇ
y
= math.floor((y+curY)/2)
end
¡¦
end
ì¹ÔÑÙ¤ÖµîÜÙÍîÜò¢÷¼é«êÀîÜü¥£¬ÞÃÜ×ÐïãÀÜôüåô¥×âîÜ£¬
á¶ì¤àã÷êê«ÕÎÙÍîÜò¢îÜì¹ÔÑÙ¤Öµ£¬Û¯î¤çèå³Ù¤Öµ清Ó¤õÌîñØü£¬
èÙñéÊàò¢ïÇì¹ÔÑà»ñ®éôë
2)î¤Const.lua îÜÙ¤ÖµøºûÜ
NOME_CMD ó¹è¦ËÇà÷為
NONE_CMDÖõ
3) ñòÊ¥ÖõÞÅéÄíºìÑÍïòªÒö檔äÐúñ£¬êóÐñÜâîÜìÑÍïòªÒöûúÞÅéÄíºìÑÍïòªÒö£¬ü½ñòÊ¥ÖõÕ×íºï®üµîÜËõÚïâÃìýûúÓßü¥窗Ù¤ÖµåÞ£¬
ÞÅéÄíºìÑÍïòªÒö檔äÐúñ×룬ÐñÜâß¾ð«ÍêîÜìÑÍïòªÒö£¬ãÀÜôüåáôËÇ÷úîÜç¯úÂì»ð²íÂîÜ£¬
ÞÅéÄíºìÑÍïòªÒö檔äÐúñ×룬ìÑÍïòªÒöмÜâ啟ÔÑîÜù±é©ðÉËìãÀ£¬AI.lua 檔äÐûúïÒëù AI.lua 檔äÐîÜ AI (myid) ùÞ⦡£
/ßæÙ¤ô÷òªÒöûäãÀî¤Óßü¥ãÊ窗âÃìý /hoai£¬üåï®üµà÷ìÑÍïòªÒöûúÞÅéÄíºìÑÍïòªÒöîÜ£¬Ê£åýêóà¹ÌÑèÌÊ«ßÌé©ÞÅéÄí»Ðùð²íÂîÜìÑÍïòªÒöмÜâîÜü¥£¬ôëî¤à»êóîÜ
AI 檔äÐúñ×ëØü£¬î¤USER_AI
檔äÐúñ×ëÜÜð²Ð¼Üâ即ʦ¡£