PDA

View Full Version : [TLBB] Lua in TLBB



Sói Đẹp Trai
17-12-14, 05:00 PM
Về Lua in TLBB thì mình không khẳng định mình biết hết tất cả nhưng mình sẽ tổng hợp lại từng cái một bên dưới đây theo từng mục lớn, ai có ý kiến gì cứ đóng góp bên dưới. Và mình tổng hợp ở đây chỉ là cấu trúc cơ bản chưa đụng chạm gì đến các câu lệnh can thiệp đến cơ sở dữ liệu của game như add tiền, set phái,... Và các bạn nên chú ý là không biết code thì các bạn test game gần như không được hoặc rất ít thành công.

Trước tiên các bạn cần phải tham khảo topic về Lua Basic vì ở đây mình sẽ không giải thích lại các cấu trúc lệnh trong Lua basic nữa mà sẽ dùng thẳng nó luôn.

Ngoài ra trước tiên các bạn nên tham khảo topic sau http://www.clbgamesvn.com/diendan/showthread.php?t=120922 từ cái phần Script và đường dẫn trở về sau, tuy thô sơ nhưng ít nhiều nó cũng khái quát được các khái niệm cơ bản về Script.

1. Script cho NPC đơn giản (Ví dụ nhận đồ, tiền,...)

Nôm na là chức năng của NPC nào đó, như cái hình sau:

https://lh3.googleusercontent.com/-15U0SUUe4nU/VJFLyjPPW7I/AAAAAAAARrU/Xwe0I2b1muA/s1600/www.Aloxovn.com-2014_12_06_12_16_41.JPG

Và đây là code của nó


--Huyªt chiªn Âm Quý Phái
--ThÕch Thanh Tuy«n
--Author: Hoàng Steven

--************************--
x910211_g_ScriptId=910211
--************************--

--*****************************--
--* On Default Event *--
--*****************************--
function x910211_OnDefaultEvent(sceneId,selfId,targetId)

--************************--
BeginEvent(sceneId)
AddText(sceneId,"Kiªp nÕn này là do Âm Quý Phái gây ra, h÷ phäi trä giá cho t¤t cä...")
AddNumText(sceneId,x910211_g_ScriptId,"Ðßa ta ra khöi ðây",9,0) --R¶i phø bän
AddNumText(sceneId,x910211_g_ScriptId,"Làm phi«n cô nß½ng...",-1,1) --Bö qua
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)
--************************--

end
--*****************************--
--* On Event Request *--
--*****************************--
function x910211_OnEventRequest(sceneId,selfId,targetId,eve ntId)
local key=GetNumText()

--************************--
if key==1 then
BeginUICommand(sceneId)
EndUICommand(sceneId)
DispatchUICommand(sceneId,selfId,1000)
end
--************************--
if key==0 then
local Scene=LuaFnGetCopySceneData_Param(sceneId,3)
local x=LuaFnGetCopySceneData_Param(sceneId,4)
local y=LuaFnGetCopySceneData_Param(sceneId,5)
CallScriptFunction((400900),"TransferFunc",sceneId,selfId,Scene,x,y)
end
--************************--

end


Ở cái code này mình sẽ giải thích chi tiết từng câu lệnh và hàm một.

Về cấu trúc của Lua basic thì các bạn đọc lại bài viết về Lua basic còn trong này thì có một vài cái hàm con mới xuất hiện như bạn thấy, và trong hầu hết các script NPC đơn giản đều mặc định cái hàm này gọi đến đầu tiên, đó là hàm.



function xIDScr_OnDefaultEvent(sceneId,selfId,targetId)
end


Các tham biến của nó trong trường hợp là NPC:
xIDScr là ID của Script còn vì sao lại phải thế thì mình đã thí nghiệm và thấy nó là do người ta định nghĩa sẵn từ lúc thiết kế các cái hàm đặc trưng của game, nếu bỏ cái đó đi hoặc ID Script không khớp với ID chủ thì Script sẽ báo lỗi hoặc không báo lỗi nhưng không chạy.
sceneId: ID cảnh tượng đang thao tác
selfId: ID người chơi
targetId: ID của NPC
3 cái tham biến này thay đổi tùy theo thể loại nhưng NPC nó là như thế này, cần phải phân biệt rõ về sau ta còn script Boss thì nó sẽ có ý nghĩa khác.

Tiếp theo là hàm mặc định chạy thứ hai đó là


xScrID_OnEventRequest(sceneId,selfId,targetId,even tId)
end


Hàm này nó sẽ mặc định thực hiện một chuỗi các câu lệnh khi người dùng thao tác trực tiếp trên NPC, cái từ request là đủ giải nghĩa được rồi đó.

Các tham biến trong hàm này:
sceneId, targetId,selfId giống bên trên.
eventId: ID của cái event (sự kiện) mà hàm này bắt, cái này khá quan trọng vì theo như mình nói lúc đầu là cấu trúc hệ thống lua hoàn toàn tuân theo cấu trúc của LT HĐT, lý do đơn giản giải thích cho việc các file Lua hoàn toàn gọi tới lẫn nhau được, về phần script event mình sẽ nói rõ.

Giải thích chi tiết các câu lệnh sử dụng trong script. Xét đoạn lệnh sau:


BeginEvent(sceneId)
AddText(sceneId,"Kiªp nÕn này là do Âm Quý Phái gây ra, h÷ phäi trä giá cho t¤t cä...")
AddNumText(sceneId,x910211_g_ScriptId,"Ðßa ta ra khöi ðây",9,0) --R¶i phø bän
AddNumText(sceneId,x910211_g_ScriptId,"Làm phi«n cô nß½ng...",-1,1) --Bö qua
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

Đây là cấu trúc của cái bảng biểu nó hiện lên khi ta Click vào con NPC để ta thao tác, để hình dung rõ các bạn xem cái hình. Cấu trúc



BeginEvent(sceneId)
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

này chính là để call lên cái khung thao tác trên NPC như trong cái hình kia, hay chi tiết nó là bắt đầu một chuỗi sự kiện nào đó với mục tiêu hiển thị là selfId và mục tiêu thao tác là targetId hay nôm na cái targetId chính là để hiện lên cái tên của NPC trên đầu cái bảng đó, chú ý kỹ cái phần này nhé, script event nó khá ảo theo một số bạn nói chính vì vài chỗ như thế này, đến phần đó mình sẽ nói rõ.

Và bên trong nó có vài cái lệnh như AddText(sceneId,Text) thì nó chỉ là gắn đối tượng là chuỗi Text lên cái khung đó thôi. Nên nhớ là không có cái sceneId là không ra cái gì đâu nhé. Đối tượng này phải được gắn vào đối tượng đang xét trong cảnh xác định.
Lệnh AddNumText(sceneId,ScrID,Text,Icon_Numbering,Event _Number) để truyền một sự kiện khi người dùng click vào đó sau chuỗi event này trong đó quan trọng nhất là cái Icon_Numbering gọi là ID hình ảnh thao tác như các bạn thấy ở đầu mỗi dòng và Event_Number chính là cái tham số truyền xuống để nó phân biệt được người dùng chọn sự kiện nào trong chuỗi sự kiện ban đầu. Mà như ở đâu đó mình nói nó gọi là số đại diện.

Xét lệnh GetNumText(), lệnh này chính là để check cái Event_Number đã được chọn để thao tác.

Lưu ý là hàm EventRequest sẽ chạy liên tục khi nào cái Event_Number còn được truyền xuống, nghĩa là giả sử trong hàm này còn chuỗi BeginEvent..EndEvent và khiến nó bắt Event_Number mới thì nó vẫn sẽ thao tác khi có cái Event_Number nào mới truyền xuống. Một đoạn script ví dụ cho cái này:



function x900093_OnEventRequest(sceneId,selfId,targetId,eve ntId)
local key = GetNumText()

--*****************--
if key == 0 then

BeginEvent(sceneId)
AddText(sceneId," L®nh bài Uy danh giang h° g°m #G4#W loÕi #GS½#W, #Gаng kim#W, #GBÕch kim#W, #GHoàng kim#W tß½ng Ñng #G20#W, #G60#W, #G120#W, #G200#W ði¬m #GUy danh giang h°#W. Các hÕ có t¤m l®nh bài nào?")
EndEvent(sceneId)
AddRadioItemBonus(sceneId,x900093_g_UD_1,1)
AddRadioItemBonus(sceneId,x900093_g_UD_2,1)
AddRadioItemBonus(sceneId,x900093_g_UD_3,1)
AddRadioItemBonus(sceneId,x900093_g_UD_4,1)
DispatchMissionContinueInfo(sceneId,selfId,targetI d,x900093_g_ScriptId,0)

end
--*****************--
if key == 1 then

local UD=GetMissionData(sceneId,selfId,UY_DANH_GIANG_HO)
if UD==-1 then
SetMissionData(sceneId,selfId,UY_DANH_GIANG_HO,0)
end
UD=GetMissionData(sceneId,selfId,UY_DANH_GIANG_HO)
BeginEvent(sceneId)
AddText(sceneId,"Uy danh giang h° hi®n tÕi cüa các hÕ là:#G"..UD.."#W ði¬m!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
BeginUICommand(sceneId)
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,XIULIAN_GONGLI))
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,XIULIAN_LILIANG))
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,XIULIAN_LINGQI))
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,XIULIAN_TILI))
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,XIULIAN_DINGLI))
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,XIULIAN_SHENFA))
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,UY_DANH_GIANG_HO))
EndUICommand(sceneId)
DispatchUICommand(sceneId,selfId,20000001)

end
--*****************--
if key == 2 then

BeginEvent(sceneId)
local UD=GetMissionData(sceneId,selfId,UY_DANH_GIANG_HO)
AddText(sceneId,"G°m t¤t cä #G10#W danh hi®u tß½ng Ñng #G10#W mÑc ði¬m #GUy danh giang h°#W.")
AddText(sceneId,"Uy danh giang h° hi®n tÕi cüa các hÕ là:#G"..UD.."#W ði¬m.")
if UD<500 then
AddText(sceneId,"Uy danh giang h° cüa các hÕ vçn chßa ðü ð¬ ðÕt ðßþc các danh hi®u cao quý!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
return
end
if UD>=97500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#YVô Song Vß½ng Giä")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #YVô Song Vß½ng Giä#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9387,0)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9397,0)
return
elseif UD>=65500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#cFF0000Chí Tôn Truy«n Thuyªt")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #c00FF00Chí Tôn Truy«n Thuyªt#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9388,0)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9398,0)
return
elseif UD>=32500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#cFF0000Ti«m Long Ngâm Uyên")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #c00FF00Ti«m Long Ngâm Uyên#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9389,0)
return
elseif UD>=15500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#cff8080S° Phßþng Linh Vû")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #ccff8080S° Phßþng Linh Vû#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9390,0)
return
elseif UD>=9500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#cff8080H²n Thiên Ch¤n Nguyên")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #cff8080H²n Thiên Ch¤n Nguyên#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9391,0)
return
elseif UD>=3500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#BNgñ Không Phùng Hß")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #BNgñ Không Phùng Hß#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9392,0)
return
elseif UD>=1500 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#BKinh Thª еc Vû")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #BKinh Thª еc Vû#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9393,0)
return
elseif UD>=1000 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#GLång Tuy®t Vø Änh")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #GLång Tuy®t Vø Änh#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9394,0)
return
elseif UD>=700 then
LuaFnAwardSpouseTitle(sceneId,selfId,"#GXu¤t Tr¥n Kinh H°ng")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là #GXu¤t Tr¥n Kinh H°ng#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9395,0)
return
else
LuaFnAwardSpouseTitle(sceneId,selfId,"#WSiêu Phàm Hy Ký")
DispatchAllTitle(sceneId,selfId)
AddText(sceneId,"Danh hi®u hi®n tÕi cüa các hÕ là Siêu Phàm Hy Ký!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,9396,0)
return
end

end
--*****************--
if key == 3 then

BeginEvent(sceneId)
AddText(sceneId,"Chï c¥n các hÕ kiªm ðßþc mµt trong các l®nh bài uy danh giang h°, ðem ðªn ch² ta là có ði¬m uy danh giang h°.")
AddText(sceneId,"L®nh bài #GUy danh giang h°#W có th¬ ðÕt ðßþc khi tham gia nhi®m vø anh hùng tÕi #GPhùng Ng÷c Lâm (275,266)#W. Các hÕ hãy ðªn ch² cô ¤y höi xem sao.")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)

end

end


Hãy kiểm chứng bằng một script đơn giản trong game nhé.

Ngoài ra ta còn có thể tự xây hàm con để gọi đến khi cần thiết nhưng phải đảm bảo cấu trúc của nó định nghĩa ban đầu nghĩa.


function xScrID_ScriptName(Danh sách tham biến)
end


Và lời gọi hàm thì giống như Lua Basic.

Đây là cấu trúc chung của hầu hết các NPC. Ngoài hệ thống này ra nó còn cái phần sự kiện Click vào item và bắt sự kiện thao tác, cái này các bạn tham khảo script sau và tìm ra xem nó bắt kiểu gì và cái hàm con nào là check cái sự kiện này. Bạn làm được những điều trên thì bạn đã make được một NPC đơn giản rồi đó.



--NPC Phùng Ng÷c Lâm
--Script by Hoàng Steven
--************************

x900095_g_ScriptId = 900095
x900095_g_VIP_1 = 30008202
x900095_g_VIP_2 = 30008203
x900095_g_Impact = 9385

--*****************************--
--* On Default Event *--
--*****************************--
function x900095_OnDefaultEvent(sceneId,selfId,targetId)

BeginEvent(sceneId)
AddText(sceneId,"Xin chào "..LuaFnGetName(sceneId,selfId)..". Ta là #GPhùng Ng÷c Lâm#W, ð£c sÑ #GThiên Long Kiªm Hi®p#W.")
AddText(sceneId,"Các hÕ tìm ta có vi®c gì?")
AddNumText(sceneId,x900095_g_ScriptId,"Mi­n phí tr¸ li®u",6,5)
AddNumText(sceneId,x900095_g_ScriptId,"VIP-Member",3,3)
AddNumText(sceneId,x900095_g_ScriptId,"Nh§n BUFF #GKiªm Hi®p Tình Duyên#W",3,4)
AddNumText(sceneId,x900095_g_ScriptId,"V« Thiên Long Kiªm Hi®p",11,0)
AddNumText(sceneId,x900095_g_ScriptId,"V« VIP-Member",11,1)
AddNumText(sceneId,x900095_g_ScriptId,"V« BUFF #GKiªm Hi®p Tình Duyên#W",11,2)
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

end
--*****************************--
--* On Event Request *--
--*****************************--
function x900095_OnEventRequest(sceneId,selfId,targetId,eve ntId)
local key = GetNumText()

--*****************--
if key == 0 then

BeginEvent(sceneId)
AddText(sceneId,"Thª gi¾i #GThiên Long Kiªm Hi®p#W v¾i nhi«u hoÕt ðµng thú v¸ nhân d¸p l­ giáng sinh. Các hÕ mu¯n tìm hi¬u chi tiªt hãy dÕo ch½i mµt vòng quanh các thành th¸ l¾n.")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)

end
--*****************--
if key == 1 then

BeginEvent(sceneId)
AddText(sceneId,"#GThiên Long Kiªm Hi®p#W dành t£ng các v¸ b¢ng hæu ph¥n quà #GÐi¬m t£ng#W tß½ng Ñng v¾i thë #GVIP-Member#W.")
AddText(sceneId,"#GThë bÕch kim#W nh§n ðßþc #G1000 ði¬m t£ng#W.")
AddText(sceneId,"#GThë hoàng kim#W nh§n ðßþc #G2000 ði¬m t£ng#W.")
AddText(sceneId,"#GThë bÕch kim#W nh§n m²i tu¥n tÕi #GHoàng Steven (282,228)#W v¾i ði¬m #GUy danh giang h°#W t× #G500 - 700#W và #GThë bÕch kim#W v¾i ði¬m #GUy danh giang h°#W t× #G700 - 1000#W.")
AddText(sceneId,"Ngoài ta còn nhi«u chÑc nång liên quan ðªn ði¬m #GUy danh giang h°#W. Chi tiªt các hÕ hãy ði höi anh ta xem sao.")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)

end
--*****************--
if key == 2 then

BeginEvent(sceneId)
AddText(sceneId,"Nh§n BUFF hi®u Ñng #GKiªm Hi®p Tình Duyên#W m²i ngày. Hi®u Ñng này giúp các hÕ gia tång t¤t cä thuµc tính lên #G100 ði¬m#W trong vòng #G4 gi¶#W.")
AddText(sceneId,"Hi®u Ñng này ð°ng th¶i tác døng cùng các loÕi ðan dßþc khác.")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)

end
--*****************--
if key == 3 then

BeginEvent(sceneId)
AddText(sceneId,"Các hÕ có thë gì?")
AddRadioItemBonus(sceneId,x900095_g_VIP_1,1)
AddRadioItemBonus(sceneId,x900095_g_VIP_2,1)
EndEvent(sceneId)
DispatchMissionContinueInfo(sceneId,selfId,targetI d,x900095_g_ScriptId,0)

end
--*****************--
if key == 4 then

if GetMissionData(sceneId,selfId,RECIEVE_LAST_DAY_TIM E)==GetDayTime() then
BeginEvent(sceneId)
AddText(sceneId,"Hôm nay các hÕ ðã nh§n hi®u Ñng này r°i, xin ngày mai hãy quay lÕi!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
return
end
if LuaFnHaveImpactOfSpecificDataIndex(sceneId,selfId, x900095_g_Impact)>0 then
BeginEvent(sceneId)
AddText(sceneId,"Trên ng߶i các hÕ ðã có hi®u quä này!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
return
end
SetMissionData(sceneId,selfId,RECIEVE_LAST_DAY_TIM E,GetDayTime())
BeginEvent(sceneId)
AddText(sceneId,"Các hÕ nh§n ðßþc hi®u Ñng gia tång kinh nghi®m cüa #GKiªm Hi®p Tình Duyên#W. Chúc các hÕ luy®n c¤p hi®u quä!")
AddText(sceneId,"Chú ý hi®u Ñng này chï kéo dài trong vòng #G1 gi¶#W. Vì v§y sau #G1 gi¶#W các hÕ hãy quay v« ch² ta nh§n tiªp!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,x900095_g_Impact,0)

end
--*****************--
if key==5 then

CallScriptFunction(000064,"Restore_hpmp",sceneId,selfId,targetId)
RestoreStrikePoint(sceneId,selfId)
RestoreRage(sceneId,selfId)
BeginEvent(sceneId)
AddText(sceneId,"Tr¸ li®u thành công!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)

end

end
--*****************************--
--* On Mission Submit *--
--*****************************--
function x900095_OnMissionSubmit(sceneId,selfId,targetId,mi ssionScriptId,selectRadioId)

--*****************--
if LuaFnGetAvailableItemCount(sceneId,selfId,selectRa dioId)<1 then

BeginEvent(sceneId)
AddText(sceneId,"Ðâu, ðâu, các hÕ làm gì có "..GetItemName(sceneId,selectRadioId).."?")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
return

end
--*****************--
LuaFnDelAvailableItem(sceneId,selfId,selectRadioId ,1)
--*****************--
if selectRadioId==x900095_g_VIP_1 then
ZengDian(sceneId,selfId,targetId,1,1000)
BeginEvent(sceneId)
AddText(sceneId,"Các hÕ nh§n ðßþc #G1000 ði¬m t£ng#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
else
ZengDian(sceneId,selfId,targetId,1,2000)
BeginEvent(sceneId)
AddText(sceneId,"Các hÕ nh§n ðßþc #G2000 ði¬m t£ng#W!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)
end
--*****************--

end




2. Script item

Như các bạn đã biết hoặc chưa biết, mấy cái item trong CommonItem.txt ví dụ như Giang hồ chỉ nam, phiếu KNB,... đều có script riêng điều khiển nó. Ngoài ra còn có phần thú cưỡi nữa. Ở đây mình sẽ tách thành 2 phần cho dễ.
Về thú cưỡi:
Ví dụ đoạn code sau


--Thú cßÞi
--Author: Hoàng Steven

--*********************--
x910015_g_scriptId=910015
--*********************--

--*********************--
x910015_g_Rider={} --Impact cüa thú cßÞi (StandardImpact.txt)
--*********************--
--*****Thú cßÞi bình th߶ng*****--
x910015_g_Rider[10141000]={Impact=4912,RecipeId=446} --Løc Hành Ðiêu (VC)
x910015_g_Mount_Pos=108 --V¸ trí ô thú cßÞi trên ng߶i nhân v§t
--*********************--

--**********************************--
--* On Default Event *--
--**********************************--
function x910015_OnDefaultEvent(sceneId,selfId,bagIndex)

end
--**********************************--
--* Is Skill Like Script *--
--**********************************--
function x910015_IsSkillLikeScript(sceneId,selfId)

--*********************--
return 1
--*********************--

end
--**********************************--
--* Cancel Impacts *--
--**********************************--
function x910015_CancelImpacts(sceneId,selfId)

--*********************--
local nIndex=LuaFnGetItemTableIndexByIndex(sceneId,selfI d,x910015_g_Mount_Pos) --Index thú cßÞi ðang trang b¸ trên ng߶i
--*********************--
if not x910015_g_Rider[nIndex] then
return 0
end
--*********************--
if LuaFnCancelSpecificImpact(sceneId,selfId,x910015_g _Rider[nIndex].Impact)>0 then --Hüy bö trÕng thái cßÞi hi®n tÕi
return 1
else
return 0
end
--*********************--

end
--**********************************--
--* On Condition Check *--
--**********************************--
function x910015_OnConditionCheck(sceneId,selfId)

--*********************--
local nIndex=LuaFnGetItemTableIndexByIndex(sceneId,selfI d,x910015_g_Mount_Pos) --Index thú cßÞi ðang trang b¸ trên ng߶i
--*********************--
if LuaFnIsPrescrLearned(sceneId,selfId,x910015_g_Ride r[nIndex].RecipeId)<1 then --Chßa có kÜ thu§t
x910015_ShowTips(sceneId,selfId,"Các hÕ chßa h÷c kÛ nång ði«u khi¬n thú cßÞi này!") --Thông báo chßa trang b¸ thú cßÞi
return 0
end
--*********************--
if LuaFnGetItemTableIndexByIndex(sceneId,selfId,x9100 15_g_Mount_Pos)~=0 then --Có trang b¸ thú cßÞi
return 1
end
--*********************--
x910015_ShowTips(sceneId,selfId,"Các hÕ c¥n trang b¸ thú cßÞi!") --Thông báo chßa trang b¸ thú cßÞi
--*********************--
return 0
--*********************--

end
--**********************************--
--* On Deplete *--
--**********************************--
function x910015_OnDeplete(sceneId,selfId)

--*********************--
return 1
--*********************--

end
--**********************************--
--* On Activate Once *--
--**********************************--
function x910015_OnActivateOnce(sceneId,selfId)

--*********************--
local nIndex=LuaFnGetItemTableIndexByIndex(sceneId,selfI d,x910015_g_Mount_Pos) --Index thú cßÞi ðang trang b¸ trên ng߶i
--*********************--
if not x910015_g_Rider[nIndex] then --Chßa c§p nh§t thú cßÞi
x910015_ShowTips(sceneId,selfId,"Thú cßÞi này hi®n chßa ðßþc c§p nh¤t!")
return 0
end
--*********************--
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,x910015_g_Rider[nIndex].Impact,0)
--*********************--
x910015_ShowTips(sceneId,selfId,"Tri®u h°i thú cßÞi thành công!")
--*********************--
return 1
--*********************--

end
--**********************************--
--* On Activate Each Tick *--
--**********************************--
function x910015_OnActivateEachTick(sceneId,selfId)

--*********************--
return 1
--*********************--

end
--**********************************--
--* Show Tips *--
--**********************************--
function x910015_ShowTips(sceneId,selfId,Tip)

--*********************--
BeginEvent(sceneId)
AddText(sceneId,Tip)
EndEvent(sceneId)
DispatchMissionTips(sceneId,selfId)
--*********************--

end

Trong đó có một vài cái hàm khá đặc trưng, và như định nghĩa giống script của NPC thì những hàm này đặc trưng riêng cho thú cưỡi nói chung.
Hàm DefaultEvent mình không dùng đến ở đây. Hàm IsSkillLikeScript nghĩa là nếu cái script này sử dụng một skill nào đó khai báo trong skilltemplate thì hàm trả giá trị 1. Hàm CancelImpact là hủy bỏ hiệu ứng thú cưỡi trên người. Cụ thể thì bạn phải xem cấu trúc file stdimpact mới hiểu rõ được. Mỗi khi cưỡi thú thực chất là send cho 1 cái impact quy định trong file này. Hàm ConditionalCheck là hàm kiểm tra điều kiện, đọc code bạn sẽ hiểu. Hàm Deplete mình chưa tìm hiểu. Hàm ActivateOnce nghĩa là khi thao tác click chuột phải, thực hiện xong động tác gọi thú cưỡi thì nó sẽ làm gì. Hàm ActivateEachTick chưa tìm hiểu. Còn cái hàm ShowTips là do mình tự thêm vào.
Trong các hàm trên có vài câu lệnh mới

LuaFnGetItemTableIndexByIndex(sceneId,selfId,x9100 15_g_Mount_Pos)

Lệnh này có tác dụng check ID của Item theo vị trí trên túi đồ/ người nhân vật. Ở đây mình check ô thú cưỡi là vị trí 108.

LuaFnCancelSpecificImpact(sceneId,selfId,x910015_g _Rider[nIndex].Impact)>0
Lệnh này có tác dụng hủy cái impact đc khai báo trong mảng x910015_g_Rider ở vị trí thứ nIndex và bản ghi Impact. Lưu ý impact tồn tại thì hàm trả ra giá trị >0 và ngược lại.


LuaFnIsPrescrLearned(sceneId,selfId,x910015_g_Ride r[nIndex].RecipeId)
Lệnh này kiểm tra xem cái kỵ thuật ID x910015_g_Rider[nIndex].RecipeId nhân vật đã học được chưa. Nếu chưa hàm trả ra giá trị = 0 và ngược lại. Khai báo nó trong file ItemCompound.txt

LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,x910015_g_Rider[nIndex].Impact,0)
Lệnh này dùng rất nhiều và thường dùng để fake skill. Mình sẽ giải thích chi tiết lệnh này. Các tham biến sceneId,ID_nguồn,ID_địch,ID_Nạn_nhân rất quan trọng. Khi một impact đc send ra có thể sẽ là impact sát thương mà trong pk thì nếu ID_địch là người chơi khác thì người chơi đó tự động tăng sát khí.
Ngoài ra cấu trúc ghi lên thanh nhắc nhở trên đầu như khi bạn ép ngọc có dòng thông báo góc 12 giờ là Khảm nạm thành công đó là

BeginEvent(sceneId)
AddText(sceneId,Tip)
EndEvent(sceneId)
DispatchMissionTips(sceneId,selfId)

Script Item
Cái này giống thú cưỡi. Ví dụ code item Tiềm Năng Chân Đan


--Ti«m nång chân ðan
--Author: Hoàng Steven

--********************--
x900071_g_scriptId = 900071
--********************--
x900071_g_QingQinCao=30060001
--********************--

--**********************************--
--* On Default Event *--
--**********************************--
function x900071_OnDefaultEvent(sceneId,selfId,bagIndex)

--********************--
--********************--

end
--**********************************--
--* Is Skill Like Script *--
--**********************************--
function x900071_IsSkillLikeScript(sceneId,selfId)

--********************--
return 1
--********************--


end
--**********************************--
--* Cancel Impacts *--
--**********************************--
function x900071_CancelImpacts(sceneId,selfId)

--********************--
return 0
--********************--

end
--**********************************--
--* On Condition Check *--
--**********************************--
function x900071_OnConditionCheck(sceneId,selfId)

--********************--
if LuaFnVerifyUsedItem(sceneId,selfId)~=1 then
return 0
end
--********************--
if LuaFnDelAvailableItem(sceneId,selfId,x900071_g_Qin gQinCao,1)<1 then
BeginEvent(sceneId)
AddText(sceneId,"Các hÕ không có Tînh Tâm Thäo ð¬ trung hòa Ti«m Nång Chân Ðan!")
EndEvent(sceneId)
DispatchMissionTips(sceneId,selfId)
return 0
end
--********************--
return 1
--********************--

end
--**********************************--
--* On Deplete *--
--**********************************--
function x900071_OnDeplete(sceneId,selfId)

--********************--
if LuaFnDepletingUsedItem(sceneId,selfId)>0 then
return 1
end
--********************--
return 0
--********************--

end
--**********************************--
--* On Activate Once *--
--**********************************--
function x900071_OnActivateOnce(sceneId,selfId)

--********************--
local RemainPoint=GetPlayerRemainPoints(sceneId,selfId)
RemainPoint=RemainPoint+35
SetPlayerRemainPoints(sceneId,selfId,RemainPoint)
--********************--
BeginEvent(sceneId)
AddText(sceneId,"Các hÕ ðã gia tång 35 ði¬m Ti«m Nång!")
EndEvent(sceneId)
DispatchMissionTips(sceneId,selfId)
--********************--
return 1
--********************--

end
--**********************************--
--* On Default Event *--
--**********************************--
function x900071_OnActivateEachTick(sceneId,selfId)

--********************--
return 1
--********************--

end

Cấu trúc hàm giống hệt con thú cưỡi. Ngoài ra còn trường hợp khác, bạn chỉ cần hàm DefaultEvent cũng tạo được Script cho Item. Bạn có thể dùng 1 trong 2 cách nhưng mình khuyên dùng cách giống con thú cưỡi. Có vài câu lệnh lạ mình sẽ giải thích.


LuaFnVerifyUsedItem(sceneId,selfId)
Lệnh này chỉ đơn giản kiểm tra item này có dùng được không, nếu không thì giá trị trả về sẽ là khác 1


LuaFnDepletingUsedItem(sceneId,selfId)

Lệnh này check xem item này sau khi dùng có tự mất đi không (1/0~Có/không). Hoặc bạn có thể tham khảo CommonItem có cái cột quy định việc này cho những item không có script điều khiển.

LuaFnDelAvailableItem(sceneId,selfId,x900071_g_Qin gQinCao,1)
Chỉ đơn giản là xóa item ID x900071_g_QingQinCao số lượng 1, bạn cũng có thể thay đổi số lượng và ID sao cho phù hợp.

GetPlayerRemainPoints(sceneId,selfId)
SetPlayerRemainPoints(sceneId,selfId,RemainPoint)
Lệnh bên trên là lấy số điểm tiềm năng hiện tại của người chơi
Hàm bên dưới là set giá trị điểm tiềm năng mới. RemainPoint là một biến mang giá trị số nhé.
Như đã nói có một cái code khác mình chỉ cần hàm DefaultEvent cũng làm đc script một item. Ví dụ code phiếu điểm tặng.


--Phiªu Ði¬m t£ng 100

--******************--
x900083_g_scriptId = 900083
x900083_g_DT100 = 30008204
--**************************--

--**********************************--
--* On Default Event *--
--**********************************--
function x900083_OnDefaultEvent(sceneId,selfId,targetId)

--******************--
LuaFnDelAvailableItem(sceneId,selfId,x900083_g_DT1 00,1)
--******************--
x900083_NotifyFailTips(sceneId,selfId,"Các hÕ nh§n ðßþc 100 ði¬m t£ng")
--******************--
ZengDian(sceneId,selfId,targetId,1,100)
--******************--

end
--**********************************--
--* Notify Fail Tips *--
--**********************************--
function x900083_NotifyFailTips(sceneId,selfId,Tip)
BeginEvent(sceneId)
AddText(sceneId,Tip)
EndEvent(sceneId)
DispatchMissionTips(sceneId,selfId)
end
Như bạn thấy không có mấy cái hàm rắc rối như code trên, tuy nhiên đảm bảo cấu trúc thì nên dùng cái cách giống con thú cưỡi. Vài câu lệnh giải thích:

LuaFnDelAvailableItem(sceneId,selfId,x900083_g_DT1 00,1)
Xóa item ID x900083_g_DT100 số lượng 1.


ZengDian(sceneId,selfId,targetId,1,100)
Đây là hàm add Điểm tặng cho nhân vật. Như trên là Add điểm tặng 1 lần là 100 điểm. Nếu bạn viết là ZengDian(sceneId,selfId,targetId,3,100) thì số điểm tặng nhận đc sẽ là 3 lần và bằng 300 điểm.

Sói Đẹp Trai
11-01-15, 03:45 AM
Do bài trên quá dài mình sẽ viết tiếp xuống dưới này
3. Script Quái/Boss/NPC trong chiến đấu (gọi chung là Monster)

Các bạn thấy mấy con Boss khi chiến đấu nó phát ra mấy cái skill hay talk một câu nào đó hay bla bla, đó chính là do script điều khiển nó. Ví dụ bằng đoạn code con NPC mình code, nó vừa là NPC vừa có khả năng đánh lộn với Quái khác.

--T× Hàng T¸nh Trai
--Sß Phi Huy«n
--Author: Hoàng Steven

--******************--
x910200_g_ScriptId=910200
--******************--
x910200_g_NPC_Name="Sß Phi Huy«n" --Tên cüa NPC
--******************--
x910200_g_Skill_Index_1=1348 --KÛ nång Kiªm Änh Ph§t Quang
x910200_g_Skill_1_CD=10000 --Th¶i gian lãnh khß¾c Kiªm Änh Ph§t Quang
x910200_g_Skill_Index_2=1349 --KÛ nång T× Hàng Ph± е
x910200_g_Skill_2_CD=5000 --Th¶i gian lãnh khß¾c kÛ nång T× Hàng Ph± е
x910200_g_Skill_Index_3=1350 --KÛ nång VÕn Ph§t Quy Nguyên
x910200_g_Skill_3_CD=10000 --Th¶i gian lãnh khß¾c kÛ nång VÕn Ph§t Quy Nguyên
x910200_g_Skill_Index_4=1351 --KÛ nång Sß½ng Bång Kiªm Pháp
x910200_g_Skill_4_CD=15000 --Th¶i gian lãnh khß¾c kÛ nång Sß½ng Bång Kiªm Pháp
--******************--
x910200_g_Skill_1_Timer=1 --Th¶i gian kÛ nång Kiªm Änh Ph§t Quang
x910200_g_Skill_2_Timer=2 --Th¶i gian kÛ nång T× Hàng Ph± е
x910200_g_Skill_3_Timer=3 --Th¶i gian kÛ nång VÕn Ph§t Quy Nguyên
x910200_g_Skill_4_Timer=4 --Th¶i gian kÛ nång Sß½ng Bång Kiªm Pháp
--******************--
x910200_g_Armor_Buff=12736 --Buff Mµng Ði®p
--******************--
x910200_g_Combat_Flag=5 --TrÕng thái chiªn ð¤u
--******************--

--**********************************--
--* On Default Event *--
--**********************************--
function x910200_OnDefaultEvent(sceneId,selfId,targetId)

BeginEvent(sceneId)
AddText(sceneId,"Ta thay m£t #GT× Hàng T¸nh Trai#W ðÑng lên cùng các nhân sÛ võ lâm #GTrung Nguyên#W ðánh ðu±i #GÂm Quý Phái#W, thanh tr× kiªp nÕn này cho bá tính!")
EndEvent(sceneId)
DispatchEventList(sceneId,selfId,targetId)

end
--**********************************--
--* On Init *--
--**********************************--
function x910200_OnInit(sceneId,selfId)

--******************--
x910200_ResetMyAI(sceneId,selfId) --Set lÕi các thuµc tính cho NPC
--******************--

end
--**********************************--
--* On Heart Beat *--
--**********************************--
function x910200_OnHeartBeat(sceneId,selfId,nTick) --Hàm này s¨ check liên tøc m²i mili giây khi nào NPC còn s¯ng

--******************--
if LuaFnIsCharacterLiving(sceneId,selfId)~=1 then --Nªu NPC ðã chªt thì ng×ng hoÕt ðµng cüa Script
return
end
--******************--
if MonsterAI_GetIntParamByIndex(sceneId,selfId,x91020 0_g_Combat_Flag)==0 then --Hªt trÕng thái chiªn ð¤u
return
end
--******************--
x910200_UseMySkill(sceneId,selfId,nTick) --SØ døng kÛ nång
--******************--

end
--**********************************--
--* On Enter Combat *--
--**********************************--
function x910200_OnEnterCombat(sceneId,selfId,enmeyId)

--******************--
x910200_ResetMyAI(sceneId,selfId) --Set lÕi các thuµc tính cho NPC
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Combat_Flag,1) --C§p nh§t trÕng thái chiªn ð¤u
--******************--

end
--**********************************--
--* On Leave Combat *--
--**********************************--
function x910200_OnLeaveCombat(sceneId,selfId)

--******************--
x910200_ResetMyAI(sceneId,selfId) --Set lÕi các thuµc tính cho NPC
--******************--

end
--**********************************--
--* On Kill Character *--
--**********************************--
function x910200_OnKillCharacter(sceneId,selfId,targetId)

--******************--
--******************--

end
--**********************************--
--* On Die *--
--**********************************--
function x910200_OnDie(sceneId,selfId,killerId)

--******************--
LuaFnSetCopySceneData_Param(sceneId,8,7) --C§p nh§t thao tác trên phø bän
--******************--

end
--**********************************--
--* Reset My AI *--
--**********************************--
function x910200_ResetMyAI(sceneId,selfId)

--******************--
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_1_Timer,x910200_g_Skill_1_CD) --Th¶i gian kÛ nång 1
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_2_Timer,x910200_g_Skill_2_CD) --Th¶i gian kÛ nång 2
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_3_Timer,x910200_g_Skill_3_CD) --Th¶i gian kÛ nång 3
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_4_Timer,x910200_g_Skill_4_CD) --Th¶i gian kÛ nång 4
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Combat_Flag,0) --Set lÕi trÕng thái chiªn ð¤u
--******************--
LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfI d,selfId,x910200_g_Armor_Buff,0) --Buff Mµng Ði®p
--******************--

end
--**********************************--
--* Use My Skill *--
--**********************************--
function x910200_UseMySkill(sceneId,selfId,nTick)

--******************--
local Time_Skill_1=MonsterAI_GetIntParamByIndex(sceneId, selfId,x910200_g_Skill_1_Timer) --L¤y th¶i gian lãnh khß¾c kÛ nång 1 cüa NPC
local Time_Skill_2=MonsterAI_GetIntParamByIndex(sceneId, selfId,x910200_g_Skill_2_Timer) --L¤y th¶i gian lãnh khß¾c kÛ nång 2 cüa NPC
local Time_Skill_3=MonsterAI_GetIntParamByIndex(sceneId, selfId,x910200_g_Skill_3_Timer) --L¤y th¶i gian lãnh khß¾c kÛ nång 3 cüa NPC
local Time_Skill_4=MonsterAI_GetIntParamByIndex(sceneId, selfId,x910200_g_Skill_4_Timer) --L¤y th¶i gian lãnh khß¾c kÛ nång 4 cüa NPC
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_1_Timer,Time_Skill_1-nTick) --C§p nh§t th¶i gian lãnh khß¾c cüa kÛ nång 1
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_2_Timer,Time_Skill_2-nTick) --C§p nh§t th¶i gian lãnh khß¾c cüa kÛ nång 2
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_3_Timer,Time_Skill_3-nTick) --C§p nh§t th¶i gian lãnh khß¾c cüa kÛ nång 3
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_4_Timer,Time_Skill_4-nTick) --C§p nh§t th¶i gian lãnh khß¾c cüa kÛ nång 4
--******************--
if Time_Skill_1<=0 then --Ðã ðªn gi¶ dùng kÛ nång
local x,y=GetWorldPos(sceneId,selfId) --L¤y t÷a ðµ cüa NPC
LuaFnUnitUseSkill(sceneId,selfId,x910200_g_Skill_I ndex_1,x,y,0,1) --NPC sØ døng kÛ nång
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_1_Timer,x910200_g_Skill_1_CD)--C§p nh§t lÕi th¶i gian lãnh khß¾c cüa kÛ nång
end
--******************--
if Time_Skill_2<=0 then --Ðã ðªn gi¶ dùng kÛ nång
local x,y=GetWorldPos(sceneId,selfId) --L¤y t÷a ðµ cüa NPC
LuaFnUnitUseSkill(sceneId,selfId,x910200_g_Skill_I ndex_2,x,y,0,1) --NPC sØ døng kÛ nång
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_2_Timer,x910200_g_Skill_2_CD)--C§p nh§t lÕi th¶i gian lãnh khß¾c cüa kÛ nång
end
--******************--
if Time_Skill_3<=0 then --Ðã ðªn gi¶ dùng kÛ nång
local x,y=GetWorldPos(sceneId,selfId) --L¤y t÷a ðµ cüa NPC
LuaFnUnitUseSkill(sceneId,selfId,x910200_g_Skill_I ndex_3,x,y,0,1) --NPC sØ døng kÛ nång
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_3_Timer,x910200_g_Skill_3_CD)--C§p nh§t lÕi th¶i gian lãnh khß¾c cüa kÛ nång
end
--******************--
if Time_Skill_4<=0 then --Ðã ðªn gi¶ dùng kÛ nång
local Victim=x910200_GetMyVictim(sceneId)
local x,y=GetWorldPos(sceneId,selfId) --L¤y t÷a ðµ cüa NPC
LuaFnUnitUseSkill(sceneId,selfId,x910200_g_Skill_I ndex_4,Victim,x,y,0,1) --NPC sØ døng kÛ nång
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 0_g_Skill_4_Timer,x910200_g_Skill_4_CD)--C§p nh§t lÕi th¶i gian lãnh khß¾c cüa kÛ nång
end
--******************--

end
--**********************************--
--* Get My Victim *--
--**********************************--
function x910200_GetMyVictim(sceneId)

--******************--
local nEnemyList={}
--******************--
local nEnemy=0
local nMonsterNum=GetMonsterCount(sceneId)
for i=0,nMonsterNum-1 do
local MonsterId=GetMonsterObjID(sceneId,i)
local x,y=GetWorldPos(sceneId,MonsterId)
if LuaFnIsCharacterLiving(sceneId,MonsterId)==1 then
nEnemy=nEnemy+1
nEnemyList[nEnemy]=MonsterId
break
end
end
--******************--
return nEnemyList[random(nEnemy)]
--******************--

end
--**********************************--
--* Global News *--
--**********************************--
function x910200_GlobalNews(sceneId,Tips)

--******************--
local nHumanCount = LuaFnGetCopyScene_HumanCount(sceneId)
for i=0,nHumanCount-1 do
local nHumanId = LuaFnGetCopyScene_HumanObjId(sceneId,i)
if LuaFnIsObjValid(sceneId,nHumanId)==1 and LuaFnIsCanDoScriptLogic(sceneId,nHumanId)==1 and LuaFnIsCharacterLiving(sceneId,nHumanId)==1 then
BeginEvent(sceneId)
AddText(sceneId,Tips)
EndEvent(sceneId)
DispatchMissionTips(sceneId,nHumanId)
end
end
--******************--

end
Cụ thể như sau: Hàm OnDefaultEvent giống code của NPC. Còn có hàm OnEventRequest nữa nhưng mình không dùng ở đây vì không cần thiết. Monster nó có thể kế thừa tất cả những gì của NPC. Ngoài ra bạn có thể không cần cái hàm OnDefaultEvent vẫn có thể thực thi nhưng lúc đó script bạn code ra nó sẽ không thực hiện chức năng gì khi nó là NPC cả. Và cái chính chúng ta nói tới là hoạt động của nó như chiến đấu thế nào, talk những gì khi chiến đấu.
Ta để ý hàm OnInit, hàm này chính là hàm thao tác khi Monster vừa đc gọi ra, ví dụ nói câu gì đó khai chiến chẳng hạn.
Hàm OnHeartBeat là một hàm quan trọng nhất, nó tồn tại cùng Monster và nó được tính thời gian, cứ mỗi 1 mili giây thì hàm này sẽ đc gọi đến. Dễ hiểu vì sao con boss nó có thời gian để thao tác hay đến một ngưỡng nào đó nó sẽ làm gì chính là cái hàm này nó theo dõi. 1 ms là rất ngắn nên bạn khó có thể biết được và tưởng nó chạy liên tục...
Hàm OnEnterCombat chính là hàm bắt sự kiện khi Monster bắt đầu vào chiến đấu. Hàm này chỉ gọi 1 lần khi Monster chuyển từ trạng thái đứng im ko làm gì sang trạng thái đánh nhau khi gặp mục tiêu.
Hàm OnLeaveCombat là một hàm thực hiện thao tác khi Monster rời combat ví dụ đánh chết hết các mục tiêu hoặc ko có mục tiêu xung quanh nó sẽ hồi đủ máu và cancel tất cả impact...
Hàm OnKillCharacter là hàm thao tác mỗi khi một nạn nhân (có thể là người chơi, pet hoặc bất kỳ monster nào khác) bị nó giết.
Hàm OnDie là hàm thao tác khi Monster này bị tiêu diệt ví dụ như add drop hay talk 1 câu lên kênh thế giới.
Ngoài ra những hàm khác là do mình thêm vào phục vụ quá trình code.
Trong script Monster cái quan trọng nhất chính là hệ thống biến cục bộ dùng cho Monster. Biến này chỉ có tác dụng cho Monster mà nó gắn liền ngoài ra ko tác dụng với Monster hay sự kiện khác.
Biến này đánh số từ 1..x trong đó x là số mình chưa tìm hiểu nhưng mình dùng max cũng chỉ x=21 chứ thật ra nó còn hơn nữa.
Để lấy giá trị biến cục bộ bất kỳ của Monster kiểu nguyên, ta dùng cấu trúc

local y=MonsterAI_GetIntParamByIndex(sceneId,selfId,x)
Với x là số thứ tự của biến và y là giá trị đc gán.
Và muốn set giá trị kiểu nguyên ta dùng cấu trúc

MonsterAI_SetIntParamByIndex(sceneId,selfId,x,gt)
Trong đó x là số thứ tự biến còn gt là giá trị cần set.
Ngoài ra còn có set giá trị kiểu chuối (string) hay logic (bool), số thực (float) bạn thay thế nó vào chữ Int, dùng tùy hoàn cảnh. Nhưng đa số dùng Int
Ngoài ra còn vài câu lệnh phục như sau


local x,y=GetWorldPos(sceneId,selfId) --Lấy tọa độ của người chơi theo không gian 2 chiều trả giá trị cho biến x,y
GetMonsterCount(sceneId) --Trả về tổng số Monster trong map
GetMonsterObjID(sceneId) --Trả về ID của monster trong MonsterAttrTable.txt, giải thích đơn giản là mỗi khi Monster đc gọi ra nó sẽ đc đánh 1 số thứ tự nào đó nhưng ko phải ID thật của nó.
LuaFnIsCharacterLiving(sceneId,MonsterId) --Kiểm tra monster với ID MonsterId có còn sống không (1~có,0~không)
LuaFnGetCopyScene_HumanCount(sceneId) --Đếm số người chơi trong map
LuaFnIsObjValid(sceneId,nHumanId),LuaFnIsCanDoScri ptLogic(sceneId,nHumanId) --Mục đích kiểm tra người chơi có thể thao tác (ko bị khóa bởi hệ thống hay lỗi nội bộ,...)


Mới đọc khá dườm dà, các bạn phải thao tác trực tiếp vài lần mới hiểu đc hoạt động của nó. Và Bonus bên dưới một cái code ko có hàm OnDefaultEvent


--Âm Quý Phái
--Liên Nhu
--Author: Hoàng Steven

--******************--
x910206_g_ScriptId=910206
--******************--
x910206_g_Boss_Name="Liên Nhu" --Tên cüa BOSS
--******************--
x910206_g_Skill_Index_1=1347 --KÛ nång Huy«n Âm Träm
x910206_g_Skill_1_CD=40000 --Th¶i gian lãnh khß¾c kÛ nång Huy«n Âm Träm
--******************--
x910206_g_Skill_1_Timer=1 --Th¶i gian kÛ nång Huy«n Âm Träm
--******************--
x910206_g_Monster_Dialogue=
{ --L¶i nói cüa Boss
[1]=x910206_g_Boss_Name.." ðã xu¤t hi®n!",
[2]="Các v¸ tÖ tÖ, có ng߶i cä gan dám khiêu chiªn Âm Quý Phái ta kìa!",
[3]="Ðã giªt chªt "..x910206_g_Boss_Name..": 1/1",
}
--******************--
x910206_g_Combat_Flag=2 --TrÕng thái chiªn ð¤u
--******************--

--**********************************--
--* On Init *--
--**********************************--
function x910206_OnInit(sceneId,selfId)

--******************--
MonsterTalk(sceneId,selfId,"",x910206_g_Monster_Dialogue[2]) --Câu nói khai chiªn cüa Boss
x910206_GlobalNews(sceneId,x910206_g_Monster_Dialo gue[1]) --Thông báo Boss ðã vào chiªn ð¤u cho toàn th¬ ng߶i ch½i
x910206_ResetMyAI(sceneId,selfId) --Set lÕi các thuµc tính cho Boss
--******************--

end
--**********************************--
--* On Heart Beat *--
--**********************************--
function x910206_OnHeartBeat(sceneId,selfId,nTick) --Hàm này s¨ check liên tøc m²i mili giây khi nào Boss còn s¯ng

--******************--
if LuaFnIsCharacterLiving(sceneId,selfId)~=1 then --Nªu Boss ðã chªt thì ng×ng hoÕt ðµng cüa Script
return
end
--******************--
if MonsterAI_GetIntParamByIndex(sceneId,selfId,x91020 6_g_Combat_Flag)==0 then --Hªt trÕng thái chiªn ð¤u
return
end
--******************--
x910206_UseMySkill(sceneId,selfId,nTick) --SØ døng kÛ nång
--******************--

end
--**********************************--
--* On Enter Combat *--
--**********************************--
function x910206_OnEnterCombat(sceneId,selfId,enmeyId)

--******************--
x910206_ResetMyAI(sceneId,selfId) --Set lÕi các thuµc tính cho Boss
--******************--
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 6_g_Combat_Flag,1) --Set lÕi trÕng thái chiªn ð¤u
--******************--

end
--**********************************--
--* On Leave Combat *--
--**********************************--
function x910206_OnLeaveCombat(sceneId,selfId)

--******************--
x910206_ResetMyAI(sceneId,selfId) --Set lÕi các thuµc tính cho Boss
--******************--

end
--**********************************--
--* On Kill Character *--
--**********************************--
function x910206_OnKillCharacter(sceneId,selfId,targetId)

--******************--
local nHumanCount = LuaFnGetCopyScene_HumanCount(sceneId)
for i=0,nHumanCount-1 do
local nHumanId = LuaFnGetCopyScene_HumanObjId(sceneId,i)
if nHumanId==targetId then
local PlayerName=GetName(sceneId,targetId)
MonsterTalk(sceneId,selfId,"","Сc tµi v¾i Âm Quý Phái thì kªt cøc s¨ b¸ phanh thây thôi, "..GetName(sceneId,targetId).."!") --Boss chª di­u ng߶i ch½i b¸ giªt
end
end
--******************--

end
--**********************************--
--* On Die *--
--**********************************--
function x910206_OnDie(sceneId,selfId,killerId)

--******************--
x910206_GlobalNews(sceneId,x910206_g_Monster_Dialo gue[3]) --Ðã ðánh bÕi Boss
--******************--
local nDied=LuaFnGetCopySceneData_Param(sceneId,15) --L¤y s¯ cao thü ðã b¸ ðánh bÕi trong tÑ ðÕi Nguyên lão cao thü
LuaFnSetCopySceneData_Param(sceneId,15,nDied+1)
if nDied+1==4 then
LuaFnSetCopySceneData_Param(sceneId,8,2) --C§p nh§t thao tác trên phø bän
end
--******************--

end
--**********************************--
--* Reset My AI *--
--**********************************--
function x910206_ResetMyAI(sceneId,selfId)

--******************--
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 6_g_Skill_1_Timer,x910206_g_Skill_1_CD) --Th¶i gian kÛ nång 1
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 6_g_Combat_Flag,0) --Set lÕi trÕng thái chiªn ð¤u
--******************--

end
--**********************************--
--* Use My Skill *--
--**********************************--
function x910206_UseMySkill(sceneId,selfId,nTick)

--******************--
local Time_Skill_1=MonsterAI_GetIntParamByIndex(sceneId, selfId,x910206_g_Skill_1_Timer) --L¤y th¶i gian lãnh khß¾c kÛ nång 1 cüa Boss
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 6_g_Skill_1_Timer,Time_Skill_1-nTick) --C§p nh§t th¶i gian lãnh khß¾c cüa kÛ nång 1
--******************--
if Time_Skill_1<=0 then --Ðã ðªn gi¶ dùng kÛ nång
local x,y=GetWorldPos(sceneId,selfId) --L¤y t÷a ðµ cüa Boss
LuaFnUnitUseSkill(sceneId,selfId,x910206_g_Skill_I ndex_1,x,y,0,1) --Boss sØ døng kÛ nång
MonsterAI_SetIntParamByIndex(sceneId,selfId,x91020 6_g_Skill_1_Timer,x910206_g_Skill_1_CD)--C§p nh§t lÕi th¶i gian lãnh khß¾c cüa kÛ nång
end
--******************--

end
--**********************************--
--* Global News *--
--**********************************--
function x910206_GlobalNews(sceneId,Tips)

--******************--
local nHumanCount = LuaFnGetCopyScene_HumanCount(sceneId)
for i=0,nHumanCount-1 do
local nHumanId = LuaFnGetCopyScene_HumanObjId(sceneId,i)
if LuaFnIsObjValid(sceneId,nHumanId)==1 and LuaFnIsCanDoScriptLogic(sceneId,nHumanId)==1 and LuaFnIsCharacterLiving(sceneId,nHumanId)==1 then
BeginEvent(sceneId)
AddText(sceneId,Tips)
EndEvent(sceneId)
DispatchMissionTips(sceneId,nHumanId)
end
end
--******************--

end


OK vậy là xong. Ở phần này cái quan trọng bạn cần nắm đc hàm về NPC, ngoài làm NPC thì nó còn có thể chiến đấu. Và code đầy đủ của NPC là phải bao gồm những phần như Script mình post trên này. Như bài HD trước là NPC đơn giản ko có chức năng chiến đấu.


4. Script điều khiển event

Phần này chính là cái quan trọng nhất đây. Nói là script điều khiển thôi vì 1 event nó có thể gồm tất cả những thứ mà mình đã hướng dấn các bạn làm trong suốt topic này. Cái phần này sẽ dễ hiểu khi bạn hiểu cái script Monster
Ví dụ script event Sát tinh:


--Phø bän Th§p Nh¸ Sát Tinh
--Author: Hoàng Steven

--******************--
x910112_g_ScriptId=910112
--******************--
x910112_g_CopySceneType=FUBEN_SHENGSILEITAI --Các tham s¯ cüa phø bän. Tham khäo "ScriptGlobal.lua"
--******************--
x910112_g_TickTime=1 --Th¶i gian hi®n tÕi cüa phø bän
x910112_g_NoUserTime=5000 --Th¶i gian lßu lÕi phø bän khi không còn ai trong phø bän (нn v¸ Mili Giây)
x910112_g_Fuben_X=14 --Pos X ði¬m h°i sinh phø bän
x910112_g_Fuben_Y=34 --Pos Y ði¬m h°i sinh phø bän
x910112_g_Time_Leave=15000 --Th¶i gian r¶i phø bän khi hoàn thành nhi®m vø
x910112_g_FuBenTime=3600000 --Th¶i gian phø bän (нn v¸ Mili Giây)
x910112_g_Limit_Member=1 --S¯ lßþng thành viên t¯i thi¬u trong ðµi ngû
x910112_g_Day_Time=2 --S¯ lßþt tham gia trong ngày
x910112_g_Fuben_Map="shengsileitai_monster.ini" --Load file Monster
x910112_g_Fuben_Scene="shengsileitai.nav" --Load file Scene
x910112_g_Fuben_Area="shengsileitai_area.ini" --Load file Area
--******************--
x910112_g_Need_Level=80 --Level t¯i thi¬u tham gia phø bän
--******************--
x910112_g_NPC_Boss_List= --Danh sách các NPC Boss
{
[1] = { Index=13554, Name="Công Tôn Thánh", Title="#gf00ff0Thiên Nhàn Tinh" },
[2] = { Index=13557, Name="Hô Diên Trác", Title="#gf00ff0Thiên Uy Tinh" },
[3] = { Index=13560, Name="Hoa Dung", Title="#gf00ff0Thiên Anh Tinh" },
[4] = { Index=13558, Name="Lâm Sung", Title="#gf00ff0Thiên Hùng Tinh" },
[5] = { Index=13556, Name="L² Chí Sinh", Title="#gf00ff0Thiên Cô Tinh" },
[6] = { Index=13553, Name="Lß Quân D§t", Title="#gf00ff0Thiên Cß½ng Tinh" },
[7] = { Index=13551, Name="Lý Khôi", Title="#gf00ff0Thiên Sát Tinh" },
[8] = { Index=13552, Name="Ngô Vînh", Title="#gf00ff0Thiên C½ Tinh" },
[9] = { Index=13555, Name="Quan Th¸nh", Title="#gf00ff0Thiên Dûng Tinh" },
[10] = { Index=13559, Name="T¥n Minh", Title="#gf00ff0Thiên Mãnh Tinh" },
[11] = { Index=13550, Name="T¯ng Khß½ng", Title="#gf00ff0Thiên Khôi Tinh" },
[12] = { Index=13561, Name="Võ Tøng", Title="#gf00ff0Thiên Thß½ng Tinh" },
}
--******************--
x910112_g_Boss_List= --Danh sách các Boss
{
[1] = { Index=13713, Name="Công Tôn Thánh", Title="#gf00ff0Thiên Nhàn Tinh", AIScript=0, ScriptID=910102 },
[2] = { Index=13497, Name="Hô Diên Trác", Title="#gf00ff0Thiên Uy Tinh", AIScript=0, ScriptID=910108 },
[3] = { Index=13524, Name="Hoa Dung", Title="#gf00ff0Thiên Anh Tinh", AIScript=0, ScriptID=910101 },
[4] = { Index=13506, Name="Lâm Sung", Title="#gf00ff0Thiên Hùng Tinh", AIScript=0, ScriptID=910109 },
[5] = { Index=13488, Name="L² Chí Sinh", Title="#gf00ff0Thiên Cô Tinh", AIScript=0, ScriptID=910104 },
[6] = { Index=13461, Name="Lß Quân D§t", Title="#gf00ff0Thiên Cß½ng Tinh", AIScript=0, ScriptID=910105 },
[7] = { Index=13443, Name="Lý Khôi", Title="#gf00ff0Thiên Sát Tinh", AIScript=0, ScriptID=910103 },
[8] = { Index=13452, Name="Ngô Vînh", Title="#gf00ff0Thiên C½ Tinh", AIScript=0, ScriptID=910100 },
[9] = { Index=13479, Name="Quan Th¸nh", Title="#gf00ff0Thiên Dûng Tinh", AIScript=0, ScriptID=910106 },
[10] = { Index=13515, Name="T¥n Minh", Title="#gf00ff0Thiên Mãnh Tinh", AIScript=0, ScriptID=910110 },
[11] = { Index=13434, Name="T¯ng Khß½ng", Title="#gf00ff0Thiên Khôi Tinh", AIScript=0, ScriptID=910107 },
[12] = { Index=13533, Name="Võ Tøng", Title="#gf00ff0Thiên Thß½ng Tinh", AIScript=0, ScriptID=910111 },
}
--******************--
x910112_g_NPC_Boss_Pos= --T÷a ðµ trong phø bän cüa 5 NPC Boss
{
[1] = { Pos_X=45.0, Pos_Y=26.0 },
[2] = { Pos_X=45.0, Pos_Y=29.5 },
[3] = { Pos_X=45.0, Pos_Y=33.0 },
[4] = { Pos_X=45.0, Pos_Y=36.5 },
[5] = { Pos_X=45.0, Pos_Y=40.0 },
}
--******************--
x910112_g_Number_Per_Choose=5 --S¯ lßþng Boss ðßþc ch÷n vào chiªn ð¤u
--******************--
x910112_g_Script_NPC_Talk=910114 --Script cüa NPC Boss
--******************--
x910112_g_Card_Index=30010098 --ID Sát Tinh D¸ Dung Ðan
--******************--
x910112_g_Boss_1=8 --Boss s¯ 1
x910112_g_Boss_2=9 --Boss s¯ 2
x910112_g_Boss_3=10 --Boss s¯ 3
x910112_g_Boss_4=11 --Boss s¯ 4
x910112_g_Boss_5=12 --Boss s¯ 5
x910112_g_Next_Step=13 --Thao tác chuy¬n ð±i khi Boss chªt
x910112_g_Fuben_Level=14 --C¤p ðµ Boss trong phø bän
x910112_g_Fuben_Timer=15 --Biªn c§p nh§t giá tr¸ th¶i gian cüa phø bän
x910112_g_Next_Time_Call=16 --Th¶i gian ra Boss còn lÕi
x910112_g_Fuben_On_Time=17 --Th¶i gian phø bän (Tính t× lúc b¡t ð¥u vào+th¶i gian lúc vào cänh)
x910112_g_Info_Step=18 --L¥n thông báo
x910112_g_Boss_Step=19 --L¥n thông báo boss tiªn vào chiªn ð¤u
x910112_g_Mission_Completed=20 --Nhi®m vø ðã hoàn thành
x910112_g_Exit_Time_Fuben=21 --Th¶i gian kªt thúc phø bän khi th¡ng
x910112_g_Is_On_Combat=22 --Boss ðang trong trÕng thái chiªn ð¤u
--******************--
x910112_g_Monk={ Index=13547, Name="Khô Vinh ÐÕi Sß", Title="#GTh§p nh¸ Sát Tinh", Pos_X=11, Pos_Y=34, ScriptID=910114 }--Khô Vinh ÐÕi Sß
--******************--
x910112_g_First_Battle_Time=60000 --Th¶i gian chu¦n b¸ chiªn ð¤u l¥n ð¥u tiên (нn v¸ Mili Giây)
x910112_g_Creat_Boss_Timer=300000 --Th¶i gian cách nhau m²i l¥n ra Boss (нn v¸ Mili Giây)
--******************--
x910112_g_Fight_Pos_X=31 --T÷a ðµ X cüa Boss khi chiªn ð¤u
x910112_g_Fight_Pos_Y=33 --T÷a ðµ Y cüa Boss khi chiªn ð¤u
--******************--
x910112_g_Impact=18 --Impact NPC Boss b¸ thay thª b·i Boss
--******************--
x910112_g_Notice=
{
[1]="Phø bän hi®n tÕi s¨ ðóng sau 1 gi¶ næa!", --Thông báo khi m¾i vào phø bän
[2]="Phø bän hi®n tÕi s¨ ðóng sau 30 phút næa!", --Thông báo khi còn 30 phút
[3]="Phø bän hi®n tÕi s¨ ðóng sau 15 phút næa!", --Thông báo khi còn 15 phút
[4]="Phø bän hi®n tÕi s¨ ðóng sau 5 phút næa!", --Thông báo khi còn 5 phút
[5]="Phø bän hi®n tÕi s¨ ðóng sau 1 phút næa!", --Thông báo khi còn 1 phút
[6]="Phø bän hi®n tÕi s¨ ðóng sau 30 giây næa!", --Thông báo khi còn 30 giây
[7]="Phø bän hi®n tÕi s¨ ðóng sau 15 giây næa!", --Thông báo khi còn 15 giây
[8]="Phø bän hi®n tÕi s¨ ðóng sau 5 giây næa!", --Thông báo khi còn 5 giây
[9]="Nhi®m vø th¤t bÕi. Các hÕ s¨ tñ r¶i khöi ðây!", --Thông báo khi hªt phø bän
[10]="Sát Tinh tiªp theo s¨ tiªn vào sau 1 phút!", --Thông báo sát tinh tiªp theo tiªn vào sau 1 phút
[11]="Sát Tinh tiªp theo s¨ tiªn vào sau 30 giây!", --Thông báo sát tinh tiªp theo tiªn vào sau 30 giây
[12]="Sát Tinh tiªp theo s¨ tiªn vào sau 15 giây!", --Thông báo sát tinh tiªp theo tiªn vào sau 15 giây
[13]="Sát Tinh tiªp theo s¨ tiªn vào sau 5 giây!", --Thông báo sát tinh tiªp theo tiªn vào sau 5 giây
[14]="Nhi®m vø hoàn thành. Các hÕ s¨ r¶i khöi ðây sau 15 giây!", --Thông báo hoàn thành nhi®m vø
}
--******************--
x910112_g_Back_Scene_Index=2 --ID cänh quay tr· lÕi
x910112_g_Back_Pos_X=254 --Pos X cänh quay tr· lÕi
x910112_g_Back_Pos_Y=175 --Pos Y cänh quay tr· lÕi
--******************--
x910112_g_Information= --Thông tin các ðoÕn hµi thoÕi
{
[1]="Mu¯n khiêu chiªn #GTh§p nh¸ Sát Tinh#W, các hÕ phäi ðÕt c¤p #G"..x910112_g_Need_Level.." tr· lên#W, m²i ngày có t¯i ða #G"..x910112_g_Day_Time.." lßþt#W. Nªu ðã tham gia quá #G"..x910112_g_Day_Time.." lßþt#W r°i, có th¬ dùng #GSát Tinh D¸ Dung Ðan#W có bán trong ti®m #GNguyên bäo#W ð±i l¤y mµt c½ hµi næa.",
[2]="Công Tôn Thánh",
[3]="Hô Diên Trác",
[4]="Hoa Dung",
[5]="Lâm Sung",
[6]="L² Chí Sinh",
[7]="Lß Quân D§t",
[8]="Lý Khôi",
[9]="Ngô Vînh",
[10]="Quan Th¸nh",
[11]="T¥n Minh",
[12]="T¯ng Khß½ng",
[13]="Võ Tøng",
[14]="#GCông Tôn Thánh#W ngoÕi hi®u #GThiên Nhàn Tinh#W.#r#GУc ði¬m:#W SØ døng bùa chú gây hÕi cho ð¯i thü.#r#GKÛ nång:#W #YPhân Thân Phù#W, #YPhong Huy®t Phù#W, #Yиnh Thân Phù#W, #YHôn Thøy Phù#W.",
[15]="#GHô Diên Trác#W ngoÕi hi®u #GThiên Uy Tinh#W.#r#GУc ði¬m:#W KÛ nång qu¥n th¬ #GHuy«n Công#W lên các ð¯i thü, sþ #Gеc Công#W.#r#GKÛ nång:#W #YPhá Huy«n#W, #YLôi Ðình VÕn Quân#W.",
[16]="#GHoa Dung#W ngoÕi hi®u #GThiên Anh Tinh#W.#r#GУc ði¬m:#W SØ døng cÕm bçy t¤n công ð¯i thü.#r#GKÛ nång:#W #Yиa Sát Tr§n#W, #YNhân Vong Tr§n#W, #YThiên Cang Tr§n#W, #YC߶ng Hóa Tr§n#W.",
[17]="#GLâm Sung#W ngoÕi hi®u #GThiên Hùng Tinh#W.#r#GУc ði¬m:#W KÛ nång qu¥n th¬ #GBång Công#W lên các ð¯i thü, sþ #GHöa Công#W.#r#GKÛ nång:#W #YPhá Bång#W, #YHàn Bång Chân Khí#W.",
[18]="#GL² Chí Sinh#W ngoÕi hi®u #GThiên Cô Tinh#W.#r#GУc ði¬m:#W Có th¬ mi­n d¸ch m÷i sát thß½ng trong th¶i gian ng¡n, qu¥n th¬ công kích #GNgoÕi Công#W.#r#GKÛ nång:#W #YCô Phß½ng Tñ Thß·ng#W, #YCu°ng Phong San#W.",
[19]="#GLß Quân D§t#W ngoÕi hi®u #GThiên Cß½ng Tinh#W.#r#GУc ði¬m:#W Có th¬ giäm sát thß½ng lên bän thân, phän ðòn sát thß½ng nhßng s¨ suy yªu sau ðó.#r#GKÛ nång:#W #YThiên Cang Hoàng Khí#W, #YThiên Cang Bá Khí#W, #YThiên Nhân Ngû Suy#W.",
[20]="#GLý Khôi#W ngoÕi hi®u #GThiên Sát Tinh#W.#r#GУc ði¬m:#W Phóng thích sát khí #GÔn D¸ch#W, qu¥n th¬ công kích #GNgoÕi Công#W.#r#GKÛ nång:#W #YSát Khí Ôn D¸ch#W, #YSinh Môn#W.",
[21]="#GNgô Vînh#W ngoÕi hi®u #GThiên C½ Tinh#W.#r#GУc ði¬m:#W G÷i #Gphøc binh#W h² trþ, mi­n d¸ch vô ð¸ch v¾i phøc binh màu tß½ng Ñng, m¤t máu và hªt mi­n d¸ch sau khi phøc binh ðúng loÕi chªt.#r#GKÛ nång:#W #YTri®u t§p Phøc Binh#W.",
[22]="#GQuan Th¸nh#W ngoÕi hi®u #GThiên Dûng Tinh#W.#r#GУc ði¬m:#W KÛ nång qu¥n th¬ #GHuy«n Công#W gây thß½ng t±n l¾n.#r#GKÛ nång:#W #YDi®t Thª Ðao Tr§n#W.",
[23]="#GT¥n Minh#W ngoÕi hi®u #GThiên Mãnh Tinh#W.#r#GУc ði¬m:#W KÛ nång qu¥n th¬ #Gеc Công#W lên các ð¯i thü, sþ #GHuy«n Công#W.#r#GKÛ nång:#W #YPhá еc#W, #YHü C¯t Xuyên Tâm#W.",
[24]="#GT¯ng Khß½ng#W ngoÕi hi®u #GThiên Khôi Tinh#W.#r#GУc ði¬m:#W KÛ nång qu¥n th¬ bá ðÕo nh¤t trong #G12 sát tinh#W, có th¬ khiªn ð¯i phß½ng tØ nÕn ngay trong mµt chiªu.#r#GKÛ nång:#W #YYêu Tinh Tø Nghîa#W, #YThiên Hàng Ngh¸ch Chuy¬n#W, #YSát Khí Bµc Phát#W.",
[25]="#Võ Tøng#W ngoÕi hi®u #GThiên Thß½ng Tinh#W.#r#GУc ði¬m:#W KÛ nång qu¥n th¬ #GHöa Công#W lên các ð¯i thü, sþ #GBång Công#W.#r#GKÛ nång:#W #YPhá Höa#W, #YHöa Thiêu ÐÕi Danh Phü#W.",
[26]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[27]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[28]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[29]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[30]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[31]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[32]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[33]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[34]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[35]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[36]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[37]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[38]="#GV§t ph¦m r½i ra:#W #YCông Lñc Ðan#W, #YLinh H°n Toái Phiªn#W, #YNgñ Dao Bàn#W, #YLßu Ly Di­m#W, #YThiên Niên Tiên Thäo#W.",
[39]="#GSát Tinh D¸ Dung Ðan#W, mµt viên ng÷c quý hiªm, tß½ng truy«n có th¬ dùng ð¬ #GTái chiªn Th§p nh¸ Sát Tinh#W. Không biªt vì sao ðÕi nhân #GTôn Tiªn Bäo#W lÕi có nó, các hÕ có th¬ tìm mua nó · #GTi®m Nguyên Bäo#W.",
}
--******************--
x910112_g_Introduce="Không biªt t× ðâu ra có #G12 tên#W tñ xßng #GTh§p nh¸ Sát Tinh#W hoành hành ngang ngßþc, uy hiªp bá tính. Thiên hÕ anh hùng, phàm là ng߶i hành hi®p trßþng nghîa, các hÕ không th¬ bö qua cho chúng!"
--******************--

--**********************************--
--* On Enumerate *--
--**********************************--
function x910112_OnEnumerate(sceneId,selfId,targetId)

--******************--
AddNumText(sceneId,x910112_g_ScriptId,"Khiêu chiªn Th§p Nh¸ Sát Tinh",6,1) --Khiêu chiªn
AddNumText(sceneId,x910112_g_ScriptId,"Tái chiªn Th§p Nh¸ Sát Tinh",6,2) --Tái chiªn
AddNumText(sceneId,x910112_g_ScriptId,"V« Th§p nh¸ Sát Tinh",11,0) --Tìm hi¬u
AddNumText(sceneId,x910112_g_ScriptId,"V« Sát Tinh D¸ Dung Ðan",11,22) --Tìm hi¬u Sát tinh d¸ dung ðan
--******************--

end
--**********************************--
--* On Default Event *--
--**********************************--
function x910112_OnDefaultEvent(sceneId,selfId,targetId)
local key=GetNumText()

--******************--
if key==0 then

BeginEvent(sceneId)
AddText(sceneId,x910112_g_Introduce)
for i=2,13 do
AddNumText(sceneId,x910112_g_ScriptId,x910112_g_In formation[i],11,i+8)
end
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

end
--******************--
if key==22 then

BeginEvent(sceneId)
AddText(sceneId,x910112_g_Information[39])
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

end
--******************--
if key>=10 and key<=21 then

BeginEvent(sceneId)
AddText(sceneId,x910112_g_Information[key+4])
AddText(sceneId,x910112_g_Information[key+16])
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

end
--******************--
if key==1 then

local nTime=GetMissionData(sceneId,selfId,SHENGSI_DAYTIM E) --S¯ lßþt tham gia phø bän trong ngày
if nTime>=x910112_g_Day_Time then
BeginEvent(sceneId)
AddText(sceneId,x910112_g_Information[1])
AddText(sceneId,"Ngày hôm nay các hÕ ðã tham gia #G"..nTime.." l¥n#W r°i, xin ngày mai hãy quay lÕi. Ho£c có th¬ sØ døng #GSát Tinh D¸ Dung Ðan#W có bán trong ti®m #GNguyên bäo#W ð±i l¤y mµt c½ hµi næa.")
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)
return
end
BeginEvent(sceneId)
AddText(sceneId,x910112_g_Information[1])
AddText(sceneId,"Ngày hôm nay các hÕ ðã tham gia #G"..nTime.." l¥n#W, còn lÕi #G"..(x910112_g_Day_Time-nTime).." lßþt næa. Các hÕ có xác nh§n tham gia không?")
AddNumText(sceneId,x910112_g_ScriptId,"Khiêu chiªn Th§p nh¸ Sát Tinh",10,3)
AddNumText(sceneId,x910112_g_ScriptId,"R¶i bö",-1,4)
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

end
--******************--
if key==2 then

local nTime=GetMissionData(sceneId,selfId,SHENGSI_DAYTIM E) --S¯ lßþt tham gia phø bän trong ngày
if nTime<x910112_g_Day_Time then
BeginEvent(sceneId)
AddText(sceneId,x910112_g_Information[1])
AddText(sceneId,"Ngày hôm nay các hÕ ðã tham gia #G"..nTime.." l¥n#W r°i, vçn còn #G"..(x910112_g_Day_Time-nTime).." lßþt#W næa. Các hÕ xin ð×ng lãng phí c½ hµi này.")
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)
return
end
BeginEvent(sceneId)
AddText(sceneId,x910112_g_Information[1])
AddText(sceneId,"Ngày hôm nay các hÕ ðã tham gia #G"..nTime.." l¥n#W. Ь có thêm mµt c½ hµi næa, các hÕ phäi ðßa cho ta mµt t¤m #GSát Tinh D¸ Dung Ðan#W?")
AddNumText(sceneId,x910112_g_ScriptId,"Tái chiªn Th§p nh¸ Sát Tinh",10,5)
AddNumText(sceneId,x910112_g_ScriptId,"R¶i bö",-1,4)
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)

end
--******************--
if key==4 then

BeginUICommand(sceneId)
EndUICommand(sceneId)
DispatchUICommand(sceneId,selfId,1000)

end
--******************--
if key==5 or key==3 then

if key==5 and LuaFnGetAvailableItemCount(sceneId,selfId,x910112_ g_Card_Index)<1 then
BeginEvent(sceneId)
AddText(sceneId,"Xin l²i, trên ng߶i các hÕ không có #GSát Tinh D¸ Dung Ðan#W. Viên ng÷c này có bán · thß½ng ti®m #GNguyên bäo#W. Các hÕ thØ ghé qua ðó xem sao!")
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)
return
end
local Check,nTip=x910112_CheckCanEnter(sceneId,selfId)
if Check==0 then
BeginEvent(sceneId)
AddText(sceneId,nTip)
EndEvent(senceId)
DispatchEventList(sceneId,selfId,targetId)
return
end
x910112_MakeCopyScene(sceneId,selfId) --Kh·i tÕo phø bän

end
--******************--

end
--**********************************--
--* Check Can Enter *--
--**********************************--
function x910112_CheckCanEnter(sceneId,selfId,targetId)

--******************--
if LuaFnHasTeam(sceneId,selfId)~=1 then --Ng߶i ch½i này không có ðµi ngû
return 0,"Các hÕ c¥n gia nh§p vào mµt ðµi ngû t¯i thi¬u #G"..x910112_g_Limit_Member.."#W thành viên m¾i có th¬ tham gia!"
end
--******************--
if GetTeamLeader(sceneId,selfId)~=selfId then --Ng߶i ch½i không phäi ðµi trß·ng
return 0,"Chï có ðµi trß·ng m¾i có th¬ quyªt ð¸nh có tham gia hay không. Các hÕ hãy g÷i ðµi trß·ng cüa các hÕ ðªn nói chuy®n v¾i ta!"
end
--******************--
if GetTeamSize(sceneId,selfId)<x910112_g_Limit_Member then --S¯ lßþng thành viên không ðü
return 0,"T± ðµi c¥n có t¯i thi¬u #G"..x910112_g_Limit_Member.."#W thành viên m¾i có th¬ tham gia!"
end
--******************--
local NearTeamSize = GetNearTeamCount(sceneId,selfId) --еi ngû có thành viên không · g¥n
if GetTeamSize(sceneId,selfId)~=NearTeamSize then
return 0,"Các hÕ c¥n tri®u t§p ðü ðµi ngû cüa mình ðªn ch² ta m¾i có th¬ tiªn vào phø bän!"
end
--******************--
local Humanlist={}
local nHumanNum=0
for i=0,NearTeamSize-1 do
local PlayerId=GetNearTeamMember(sceneId,selfId,i)
if GetLevel(sceneId,PlayerId)<x910112_g_Need_Level then --Có thành viên không ðü c¤p ðµ yêu c¥u
Humanlist[nHumanNum]=GetName(sceneId,PlayerId)
nHumanNum = nHumanNum+1
end
end
if nHumanNum > 0 then
local msg="Trong t± ðµi cüa các hÕ có "
for i=0,nHumanNum-2 do
msg=msg..Humanlist[i]..", "
end
msg=msg..Humanlist[nHumanNum-1].." c¤p ðµ không ðü c¤p #G"..x910112_g_Need_Level..", không ðü ði«u ki®n tham gia phø bän!"
return 0,msg
end
--******************--
nHumanNum = 0
local CurDayTime = GetDayTime()
for i=0,NearTeamSize-1 do
local PlayerId=GetNearTeamMember(sceneId,selfId,i)
local nTime=GetMissionData(sceneId,PlayerId,SHENGSI_DAYT IME) --S¯ l¥n tham gia phø bän hôm nay
if nTime>=x910112_g_Day_Time then
Humanlist[nHumanNum]=GetName(sceneId,PlayerId)
nHumanNum=nHumanNum+1
end
end
if nHumanNum > 0 then
local msg="Trong t± ðµi cüa các hÕ có "
for i=0,nHumanNum-2 do
msg=msg..Humanlist[i]..", "
end
msg=msg..Humanlist[nHumanNum-1].." ðã tham gia phø bän #G"..x910112_g_Day_Time.." l¥n#W trong ngày hôm nay!"
return 0,msg
end
--******************--
return 1
--******************--

end
--**********************************--
--* Make Copy Scene *--
--**********************************--
function x910112_MakeCopyScene(sceneId,selfId)

--******************--
local x,y=GetWorldPos(sceneId,selfId)
--******************--
leaderguid=LuaFnObjId2Guid(sceneId,selfId)
--******************--
LuaFnSetSceneLoad_Map(sceneId,x910112_g_Fuben_Scen e) --Load file scene
LuaFnSetCopySceneData_TeamLeader(sceneId,leadergui d) --ID ðµi trß·ng
LuaFnSetCopySceneData_NoUserCloseTime(sceneId,x910 112_g_NoUserTime) --Th¶i gian lßu phø bän khi không còn ai
LuaFnSetCopySceneData_Timer(sceneId,x910112_g_Tick Time) --Th¶i gian phø bän
LuaFnSetCopySceneData_Param(sceneId,0,x910112_g_Co pySceneType) --Set thông s¯ phø bän (ScriptGlobal.lua)
LuaFnSetCopySceneData_Param(sceneId,1,x910112_g_Sc riptId) --ID script phø bän
LuaFnSetCopySceneData_Param(sceneId,2,0)
LuaFnSetCopySceneData_Param(sceneId,3,sceneId) --Cänh tßþng hi®n tÕi
LuaFnSetCopySceneData_Param(sceneId,4,x) --T÷a ðµ X cüa ng߶i ch½i
LuaFnSetCopySceneData_Param(sceneId,5,y) --T÷a ðµ Y cüa ng߶i ch½i
LuaFnSetCopySceneData_Param(sceneId,6,GetTeamId(sc eneId,selfId)) --ID nhóm ng߶i ch½i
LuaFnSetCopySceneData_Param(sceneId,7,0)
--******************--
for i=8,31 do
LuaFnSetCopySceneData_Param(sceneId,i,0) --Reset lÕi các thông s¯ cho phø bän
end
--******************--
LuaFnSetSceneLoad_Area(sceneId,x910112_g_Fuben_Are a) --Load area
LuaFnSetSceneLoad_Monster(sceneId,x910112_g_Fuben_ Map) --Load file monster
--******************--
local bRetSceneID=LuaFnCreateCopyScene(sceneId)
BeginEvent(sceneId)
if bRetSceneID>0 then
AddText(sceneId,"D¸ch chuy¬n thành công!") --S¯ bän sao quá täi
else
AddText(sceneId,"S¯ lßþng bän sao ðã quá täi, ð« ngh¸ lát næa thØ lÕi!") --Có th¬ tÕo bän sao m¾i
end
EndEvent(sceneId)
DispatchMissionTips(sceneId,selfId)
--******************--

end
--**********************************--
--* Make Copy Scene Ready *--
--**********************************--
function x910112_OnCopySceneReady(sceneId,destsceneId)

--******************--
LuaFnSetCopySceneData_Param(destsceneId,3,sceneId) --Thông báo kh·i tÕo phø bän
leaderguid=LuaFnGetCopySceneData_TeamLeader(destsc eneId)
leaderObjId=LuaFnGuid2ObjId(sceneId,leaderguid);
--******************--
local nearteammembercount=GetNearTeamCount(sceneId,leade rObjId)
local mems={}
for i=0,nearteammembercount-1 do
mems[i]=GetNearTeamMember(sceneId,leaderObjId,i)
NewWorld(sceneId,mems[i],destsceneId,x910112_g_Fuben_X,x910112_g_Fuben_Y) --Ðßa t¤t cä thành viên nhóm ðªn phø bän
end
--******************--

end
--**********************************--
--* On Copy Scene Timer *--
--**********************************--
function x910112_OnCopySceneTimer(sceneId,nowTime) --Hàm này check liên tøc m²i Mili giây khi phø bän còn t°n tÕi

--******************--
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Next_Step) --L¤y thao tác trên phø bän
if nStep==0 then --L¥n ð¥u trong phø bän
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fube n_Timer,x910112_g_FuBenTime) --C§p nh§t th¶i gian b¡t ð¥u phø bän
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fube n_On_Time,nowTime) --C§p nh§t th¶i gian phø bän (нn v¸ Mili giây)
x910112_CreatMyNPC(sceneId) --Kh·i tÕo các NPC
elseif nStep==1 then --Giai ðoÕn chiªn ð¤u
local Is_Winner=LuaFnGetCopySceneData_Param(sceneId,x910 112_g_Mission_Completed) --Nhi®m vø ðã hoàn thành chßa
if Is_Winner==1 then --Hoàn thành nhi®m vø r°i
local Time_Left=LuaFnGetCopySceneData_Param(sceneId,x910 112_g_Exit_Time_Fuben) --L¤y th¶i gian lúc th¡ng cuµc
if nowTime-Time_Left>=x910112_g_Time_Leave then
x910112_KickOutAllPlayer(sceneId) --Ðßa t¤t cä ng߶i ch½i r¶i khöi phø bän
end
return
end
local Total_Boss_Left=x910112_CheckHaveBossLeft(sceneId) --Ki¬m tra còn lÕi bao nhiêu Boss ho£c NPC Boss. Nªu không còn thì th¡ng
if Total_Boss_Left==0 then
x910112_OnCompleteMission(sceneId) --Hoàn thành nhi®m vø
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Exit _Time_Fuben,nowTime) --C§p nh§t th¶i gian b¡t ð¥u tính chu¦n b¸ r¶i phø bän
return
end
local nTick=nowTime-LuaFnGetCopySceneData_Param(sceneId,x910112_g_Fube n_On_Time) --L¤y tích t¡c mµt cüa phø bän
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fube n_On_Time,nowTime) --C§p nh§t th¶i gian phø bän (нn v¸ Mili giây)
local nTime=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Fuben_Timer) --L¤y th¶i gian hi®n tÕi cüa phø bän (нn v¸ Mili giây)
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fube n_Timer,nTime-nTick) --C§p nh§t th¶i gian phø bän (нn v¸ Mili giây)
local Next_Time=LuaFnGetCopySceneData_Param(sceneId,x910 112_g_Next_Time_Call) --L¤y th¶i gian ra Boss tiªp theo (нn v¸ Mili giây)
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Next _Time_Call,Next_Time-nTick) --C§p nh§t th¶i gian ra Boss tiªp theo (нn v¸ Mili giây)
if Next_Time-nTick<=0 then --Ðã ðªn gi¶ kh·i tÕo Boss tiªp theo
x910112_CreatMyBoss(sceneId) --Kh·i tÕo Boss
end
x910112_ShowNotices(sceneId,nTime-nTick) --Ki¬m tra và thông báo nªu ðªn gi¶
x910112_BossNotices(sceneId,Next_Time-nTick) --Thông báo ra Boss
elseif nStep==2 then --Ðã hªt th¶i gian phø bän
x910112_KickOutAllPlayer(sceneId) --Ðßa t¤t cä ng߶i ch½i r¶i khöi phø bän
end
--******************--

end
--**********************************--
--* On Player Enter *--
--**********************************--
function x910112_OnPlayerEnter(sceneId,selfId)

--******************--
SetPlayerDefaultReliveInfo(sceneId,selfId,"%10",-1,"0",sceneId,x910112_g_Fuben_X,x910112_g_Fuben_Y) --Уt ði¬m h°i sinh tÕi phø bän
--******************--
local nTime=GetMissionData(sceneId,selfId,SHENGSI_DAYTIM E) --L¤y s¯ lßþt tham gia phø bän trong ngày
SetMissionData(sceneId,selfId,SHENGSI_DAYTIME,nTim e+1) --C§p nh§t lÕi s¯ lßþt tham gia phø bän trong ngày
--******************--

end
--**********************************--
--* On Human Die *--
--**********************************--
function x910112_OnHumanDie(sceneId,selfId,killerId)

--******************--
--******************--

end
--**********************************--
--* On Complete Mission *--
--**********************************--
function x910112_OnCompleteMission(sceneId)

--******************--
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Miss ion_Completed,1) --C§p nh§t chßa hoàn thành nhi®m vø
--******************--
x910112_TipAllHuman(sceneId,x910112_g_Notice[14])
--******************--

end
--**********************************--
--* Check Have Boss Left *--
--**********************************--
function x910112_CheckHaveBossLeft(sceneId)

--******************--
local nMonsterNum=GetMonsterCount(sceneId)
for i=0,nMonsterNum-1 do
local MonsterId=GetMonsterObjID(sceneId,i)
if LuaFnIsCharacterLiving(sceneId,MonsterId)==1 then
for j=1,12 do
if GetName(sceneId,MonsterId)==x910112_g_Boss_List[j].Name or GetName(sceneId,MonsterId)==x910112_g_NPC_Boss_Lis t[j].Name then
return 1
end
end
end
end
--******************--
return 0
--******************--

end
--**********************************--
--* Show Notices *--
--**********************************--
function x910112_ShowNotices(sceneId,nTime)

--******************--
local nNotice="" --Thông báo
if nTime<=0 then --Hªt th¶i gian phø bän
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==9 then
return
end
nNotice=x910112_g_Notice[9]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Next _Step,2) --Ðã hªt th¶i gian phø bän
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,9) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=5000 then --Còn 5 giây
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==8 then
return
end
nNotice=x910112_g_Notice[8]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,8) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=15000 then --Còn 15 giây
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==7 then
return
end
nNotice=x910112_g_Notice[7]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,7) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=30000 then --Còn 30 giây
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==6 then
return
end
nNotice=x910112_g_Notice[6]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,6) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=60000 then --Còn 1 phút
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==5 then
return
end
nNotice=x910112_g_Notice[5]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,5) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=300000 then --Còn 5 phút
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==4 then
return
end
nNotice=x910112_g_Notice[4]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,4) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=900000 then --Còn 15 phút
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==3 then
return
end
nNotice=x910112_g_Notice[3]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,3) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=1800000 then --Còn 30 phút
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==2 then
return
end
nNotice=x910112_g_Notice[2]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,2) --C§p nh§t ðã thông báo loÕi này
elseif nTime<=3595000 then --Còn 1 gi¶
local nStep=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Info_Step) --Bß¾c thông báo l¥n trß¾c
if nStep==1 then
return
end
nNotice=x910112_g_Notice[1]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,1) --C§p nh§t ðã thông báo loÕi này
end
--******************--
if nNotice~="" then
x910112_TipAllHuman(sceneId,nNotice) --Thông báo cho toàn th¬ ng߶i ch½i
end
--******************--

end
--**********************************--
--* Boss Notices *--
--**********************************--
function x910112_BossNotices(sceneId,nTime)

local Boss_Notice=""
local nBossStep=LuaFnGetCopySceneData_Param(sceneId,x910 112_g_Boss_Step) --Bß¾c thông báo l¥n trß¾c ra Boss
if nTime<=5000 then --Còn 5 giây s¨ ra Boss m¾i
if nBossStep==13 then
return
end
Boss_Notice=x910112_g_Notice[13]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _Step,13)
elseif nTime<=15000 then --Còn 15 giây s¨ ra Boss m¾i
if nBossStep==12 then
return
end
Boss_Notice=x910112_g_Notice[12]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _Step,12)
elseif nTime<=30000 then --Còn 30 giây s¨ ra Boss m¾i
if nBossStep==11 then
return
end
Boss_Notice=x910112_g_Notice[11]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _Step,11)
elseif nTime<=55000 then --Còn 1 phút s¨ ra Boss m¾i
if nBossStep==10 then
return
end
Boss_Notice=x910112_g_Notice[10]
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _Step,10)
end
--******************--
if Boss_Notice~="" then
x910112_TipAllHuman(sceneId,Boss_Notice) --Thông báo cho toàn th¬ ng߶i ch½i
end
--******************--

end
--**********************************--
--* Kick Out All Player *--
--**********************************--
function x910112_KickOutAllPlayer(sceneId)

--******************--
local nHumanCount = LuaFnGetCopyScene_HumanCount(sceneId)
for i=0,nHumanCount-1 do
local nHumanId = LuaFnGetCopyScene_HumanObjId(sceneId,i)
if LuaFnIsObjValid(sceneId,nHumanId)==1 and LuaFnIsCanDoScriptLogic(sceneId,nHumanId)==1 and LuaFnIsCharacterLiving(sceneId,nHumanId)==1 then
CallScriptFunction((400900),"TransferFunc",sceneId,nHumanId,x910112_g_Back_Scene_Index,x9101 12_g_Back_Pos_X,x910112_g_Back_Pos_Y) --Ðßa ng߶i ch½i tr· v« thành th¸
end
end
--******************--

end
--**********************************--
--* Delete All Old Monster *--
--**********************************--
function x910112_DeleteAllOldMonster(sceneId)

--******************--
local nMonsterNum=GetMonsterCount(sceneId)
for i=0,nMonsterNum-1 do
local MonsterId=GetMonsterObjID(sceneId,i)
if LuaFnIsCharacterLiving(sceneId,MonsterId)==1 then
SetCharacterDieTime(sceneId,MonsterId,100)
end
end
--******************--

end
--**********************************--
--* Creat My NPC *--
--**********************************--
function x910112_CreatMyNPC(sceneId)

--******************--
x910112_DeleteAllOldMonster(sceneId) --Just fix a bug...
--******************--
local Monk_Index=LuaFnCreateMonster(sceneId,x910112_g_Mo nk.Index,x910112_g_Monk.Pos_X,x910112_g_Monk.Pos_Y ,3,0,x910112_g_Monk.ScriptID) ---Kh·i tÕo NPC Khô Vinh ÐÕi Sß
SetCharacterName(sceneId,Monk_Index,x910112_g_Monk .Name) --C§p nh§t tên Khô Vinh ÐÕi Sß
SetCharacterTitle(sceneId,Monk_Index,x910112_g_Mon k.Title) --C§p nh§t Title cho Khô Vinh ÐÕi Sß
--******************--
local nBossList={0,0,0,0,0} --Danh sách 5 Boss ðßþc ch÷n
for i=1,x910112_g_Number_Per_Choose do
local Ran=random(12) --Ch÷n ngçu nhiên mµt trong 12 Boss
local Found=0
for j=1,i-1 do
if Ran==nBossList[j] then --Tìm th¤y Boss ðã ðßþc ch÷n trß¾c ðó
Found=1
break
end
end
if Found==0 then --Boss này chßa ðßþc ch÷n trß¾c ðó
nBossList[i]=Ran --C§p nh§t
end
end
--******************--
local nSum=0
local nHumanCount=LuaFnGetCopyScene_HumanCount(sceneId)
for i=0,nHumanCount-1 do
local nHumanId=LuaFnGetCopyScene_HumanObjId(sceneId,i)
nSum=nSum+GetLevel(sceneId,nHumanId)
end
--******************--
local Current_Level=floor(nSum/nHumanCount) --Level cüa Boss trong phø bän
local nDec
if Current_Level>=80 and Current_Level<90 then
nDec=0
elseif Current_Level>=90 and Current_Level<100 then
nDec=1
elseif Current_Level>=100 and Current_Level<110 then
nDec=2
elseif Current_Level>=110 and Current_Level<120 then
nDec=3
else
nDec=4
end
--******************--
for i=1,5 do
local Boss_ID=x910112_g_NPC_Boss_List[nBossList[i]].Index --ID NPC Boss
local Boss_Name=x910112_g_NPC_Boss_List[nBossList[i]].Name --Tên NPC Boss
local Boss_Title=x910112_g_NPC_Boss_List[nBossList[i]].Title --Danh hi®u NPC Boss
local Pos_X=x910112_g_NPC_Boss_Pos[i].Pos_X --T÷a ðµ X cüa NPC Boss
local Pos_Y=x910112_g_NPC_Boss_Pos[i].Pos_Y --T÷a ðµ Y cüa NPC Boss
local Boss_Index=LuaFnCreateMonster(sceneId,Boss_ID,Pos_ X,Pos_Y,3,0,x910112_g_Script_NPC_Talk) --Kh·i tÕo NPC Boss
SetCharacterName(sceneId,Boss_Index,Boss_Name) --Set tên cho NPC Boss
SetCharacterTitle(sceneId,Boss_Index,Boss_Title) --Set danh hi®u cho NPC Boss
end
--******************--
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Next _Step,1) --Ðã xong công ðoÕn kh·i tÕo
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fube n_Level,nDec) --C§p nh§t c¤p ðµ
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _1,nBossList[1]) --Boss ðßþc ch÷n s¯ 1
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _2,nBossList[2]) --Boss ðßþc ch÷n s¯ 2
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _3,nBossList[3]) --Boss ðßþc ch÷n s¯ 3
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _4,nBossList[4]) --Boss ðßþc ch÷n s¯ 4
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _5,nBossList[5]) --Boss ðßþc ch÷n s¯ 5
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Next _Time_Call,x910112_g_First_Battle_Time)--C§p nh§t th¶i gian g÷i Boss tiªp theo
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Info _Step,0) --C§p nh§t chßa có thông báo nào
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Miss ion_Completed,0) --C§p nh§t chßa hoàn thành nhi®m vø
--******************--

end
--**********************************--
--* Creat My Boss *--
--**********************************--
function x910112_CreatMyBoss(sceneId)

--******************--
local nBossList={}
nBossList[1]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Bos s_1) --Boss s¯ 1
nBossList[2]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Bos s_2) --Boss s¯ 2
nBossList[3]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Bos s_3) --Boss s¯ 3
nBossList[4]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Bos s_4) --Boss s¯ 4
nBossList[5]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Bos s_5) --Boss s¯ 5
nBossList[6]=0 --Just a trap...
--******************--
local nDec=LuaFnGetCopySceneData_Param(sceneId,x910112_g _Fuben_Level) --L¤y c¤p ðµ quái trong phø bän
local Ran=6
local nCheck=0
while nBossList[Ran]==0 do
Ran=random(x910112_g_Number_Per_Choose) --Ch÷n ngçu nhiên mµt Boss trong danh sách 5 Boss ðßþc ch÷n
nCheck=nCheck+1
if nCheck>100 then --A trap destroy "Dead Lock"
for i=1,5 do
if nBossList[i]~=0 then
Ran=i
break
end
end
break
end
end
--******************--
local Boss_Name=x910112_g_Boss_List[nBossList[Ran]].Name --Tên Boss
local nMonsterNum=GetMonsterCount(sceneId)
for i=0,nMonsterNum-1 do
local MonsterId=GetMonsterObjID(sceneId,i)
if LuaFnIsCharacterLiving(sceneId,MonsterId)==1 and (GetName(sceneId,MonsterId)==Boss_Name) then
LuaFnSendSpecificImpactToUnit(sceneId,MonsterId,Mo nsterId,MonsterId,x910112_g_Impact,0)
SetCharacterDieTime(sceneId,MonsterId,100) --Xóa ði NPC Boss
break
end
end
--******************--
local Boss_ID=x910112_g_Boss_List[nBossList[Ran]].Index+nDec --ID Boss
local Boss_Title=x910112_g_Boss_List[nBossList[Ran]].Title --Danh hi®u Boss
local AI_Script=x910112_g_Boss_List[nBossList[Ran]].AIScript --AI script cüa Boss
local Pos_X=x910112_g_Fight_Pos_X --T÷a ðµ X ra Boss
local Pos_Y=x910112_g_Fight_Pos_Y --T÷a ðµ Y ra Boss
local Boss_Script=x910112_g_Boss_List[nBossList[Ran]].ScriptID --Script cüa Boss
local Boss_Index=LuaFnCreateMonster(sceneId,Boss_ID,Pos_ X,Pos_Y,27,AI_Script,Boss_Script)--Kh·i tÕo Boss
SetCharacterName(sceneId,Boss_Index,Boss_Name) --Set tên cho Boss
SetCharacterTitle(sceneId,Boss_Index,Boss_Title) --Set danh hi®u cho Boss
LuaFnSendSpecificImpactToUnit(sceneId,Boss_Index,B oss_Index,Boss_Index,x910112_g_Impact,0)
--******************--
if Ran==1 then
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _1,0) --Boss s¯ 1 ðã ðßþc g÷i
elseif Ran==2 then
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _2,0) --Boss s¯ 2 ðã ðßþc g÷i
elseif Ran==3 then
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _3,0) --Boss s¯ 3 ðã ðßþc g÷i
elseif Ran==4 then
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _4,0) --Boss s¯ 4 ðã ðßþc g÷i
elseif Ran==5 then
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _5,0) --Boss s¯ 5 ðã ðßþc g÷i
end
--******************--
local nSet --L¤y biªn giá tr¸ cüa Boss tß½ng Ñng
if Ran==1 then
nSet=x910112_g_Boss_1
elseif Ran==2 then
nSet=x910112_g_Boss_2
elseif Ran==3 then
nSet=x910112_g_Boss_3
elseif Ran==4 then
nSet=x910112_g_Boss_4
elseif Ran==5 then
nSet=x910112_g_Boss_5
end
--******************--
LuaFnSetCopySceneData_Param(sceneId,nSet,0) --Boss này ðã ra chiªn ð¤u
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Next _Time_Call,x910112_g_Creat_Boss_Timer)--C§p nh§t th¶i gian g÷i Boss tiªp theo
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Boss _Step,0) --C§p nh§t th¶i gian thông báo ra Boss tiªp theo
--******************--
local nBoss=LuaFnGetCopySceneData_Param(sceneId,x910112_ g_Is_On_Combat) --Ki¬m tra xem có bao nhiêu Boss ðang chiªn ð¤u
LuaFnSetCopySceneData_Param(sceneId,x910112_g_Is_O n_Combat,nBoss+1) --Tång s¯ Boss ðang chiªn ð¤u lên
--******************--

end
--**********************************--
--* Tip All Human *--
--**********************************--
function x910112_TipAllHuman(sceneId,nTip)

--******************--
local nHumanNum=LuaFnGetCopyScene_HumanCount(sceneId)
for i=0,nHumanNum-1 do
local PlayerId=LuaFnGetCopyScene_HumanObjId(sceneId,i)
if LuaFnIsObjValid(sceneId,PlayerId)==1 and LuaFnIsCanDoScriptLogic(sceneId,PlayerId)==1 then
BeginEvent(sceneId)
AddText(sceneId,nTip)
EndEvent(sceneId)
DispatchMissionTips(sceneId,PlayerId)
end
end
--******************--

end

Code này khá dài, tuy nhiên bạn chỉ cần lưu ý vài điểm như sau:
Hàm OnEnumerate khá quan trọng, mình dùng script khác gọi tới nó để thao tác. Cái này mình sẽ giải thích sau.
Hàm OnDefaultEvent khác với NPC là hàm này nó có vai trò tương tự hàm OnEventRequest của NPC hay item.
Hàm MakeCopyScene khá quan trọng. Hàm này dùng để creat phụ bản cũng như các biến cục bộ của nó. Tương tự như biến cục bộ của Monster thì biến cục bộ của script event cũng có chức năng tương tự và chỉ có tác dụng với event nó quản lý. Trong danh sách này thì từ 1 đến 8 là giá trị đc khởi tạo sẵn, có mục đích cả, để hiểu thì bạn xem qua scene.lua còn không thì cứ để kệ nó và bạn muốn thêm thì bạn đánh số từ 9 lên nhé.
Hàm OnCopySceneReady cũng quan trọng, khi code thường bạn chỉ cần overwrite 2 hàm MakeCopyScene và OnCopySceneReady mà ko cần sửa gì nhiều, nếu có mục đích thì bạn có thể sửa luôn.
Hàm quan trọng nhất ở đây chính là hàm OnCopySceneTimer, hàm này như hàm OnHeartBeat của Monster nghĩa là cứ mỗi ms phụ bản còn tồn tại thì nó sẽ làm điều gì đó... Ví dụ đơn giản như cái thông báo thời gian phụ bản.
Hàm OnPlayerEnter là hàm thao tác khi người chơi tiến từ map ngoài vào phụ bản. Hàm OnHumanDie là hàm thao tác mỗi khi có 1 người chơi nào đó bị giết. Bạn cần hiểu nó nhiều, về phần scene.lua mình sẽ giải thích về nó.
Ngoài ra là các hàm mình tự thiết kế phục vụ mục đích của script.
Để lấy biến cục bộ của event ta dùng cấu trúc

LuaFnGetCopySceneData_Param(sceneId,x)
Trong đó x là số thứ tự của biến cần lấy. Biến này chỉ có kiểu Int
Tương tự set giá trị cho biến cục bộ ta dùng cấu trúc

LuaFnSetCopySceneData_Param(sceneId,x,gt)
Trong đó x là số thứ tự biến cần set và gt là giá trị kiểu nguyên.
Một số câu lệnh dùng trong script mình đã giải thích rất rõ trong code rồi nên mình không overwrite lại đây nữa, các bạn chịu khó đọc code nhé.
Và cái quan trọng như mình muốn giải thích chính là cái hàm OnEnumerate. Như các bạn nhìn thấy thì nó khá cụt, không giống cấu trúc lệnh viết ra cái MsgBox mà mình giải thích trên script của NPC. Cái tinh túy của nó là thế này.



--Th§p nh¸ Sát Tinh
--Khô Vinh ÐÕi Sß
--Author: Hoàng Steven

--************************--
x910113_g_ScriptId=910113
x910113_g_Event_ScriptId=910112 --Script event
--************************--
x910113_g_Introduce="Không biªt t× ðâu ra có #G12 tên#W tñ xßng #GTh§p nh¸ Sát Tinh#W hoành hành ngang ngßþc, uy hiªp bá tính. Thiên hÕ anh hùng, phàm là ng߶i hành hi®p trßþng nghîa, các hÕ không th¬ bö qua cho chúng!"
--************************--

--*****************************--
--* On Default Event *--
--*****************************--
function x910113_OnDefaultEvent(sceneId,selfId,targetId)

--************************--
BeginEvent(sceneId)
AddText(sceneId,x910113_g_Introduce)
CallScriptFunction(x910113_g_Event_ScriptId,"OnEnumerate",sceneId,selfId,targetId)
EndEvent(senceId)
DispatchEventList(sceneId,selfId,x910113_g_ScriptI d)
--************************--

end
--*****************************--
--* On Event Request *--
--*****************************--
function x910113_OnEventRequest(sceneId,selfId,targetId,eve ntId)

if eventId==x910113_g_Event_ScriptId then
CallScriptFunction(eventId,"OnDefaultEvent",sceneId,selfId,targetId)
return
end

end


Bạn để ý hàm OnEventRequest khá đặc biệt, cái lệnh CallScriptFunction(x910113_g_Event_ScriptId,"OnEnumerate",sceneId,selfId,targetId) chính là để gọi tới script ID là x910113_g_Event_ScriptId, gọi tới hàm tên "OnEnumerate" với các tham biến như trên. Và bên dưới nó gọi đến hàm OnDefaultEvent cũng chính tại script đó. Đó là lý do vì sao khi nãy mình nói là cái MsgBox nó cụt ngủn thế đấy, bạn có thể tưởng tượng hoạt động của nó được điều khiển bởi script này trước và sau đó mới thao tác, đây gọi là tư tưởng kế thừa giống trong LTHDT.

Bạn phải thao tác với một vài script thật sự mới hiểu đc, phần này khá ảo diệu đó.

Sói Đẹp Trai
11-01-15, 04:45 AM
Phần tiếp theo cũng không kém phần quan trọng đó chính là giải thích về cấu trúc biến toàn cục với ScriptGlobal.lua và các thao tác trên cảnh bất kỳ với scene.lua và biến hệ thống Activity
1. ScriptGlobal.lua

Được hiểu là biến toàn cục có tác dụng trên toàn bộ server với một người chơi, pet, item hay một Object bất kỳ. Cũng như các biến cục bộ của script event hay monster thì biến toàn cục cũng đc đánh số từ [-999..999]. Biến này có tác dụng trên toàn sv với 1 người chơi, pet, item hay một Object bất kỳ. Ví dụ như trị số tu luyện, số lần tham gia phụ bản trong ngày,... Những thứ mà nói chung là để phục vụ cho một cái Object bất kỳ. Nó như khái niệm biến toàn cục mà các bạn hay dùng trong một chương trình nào đó trong các ngôn ngữ lập trình.
Ở đây mình sẽ giải thích qua file ScriptGlobal.lua trước tiên.
File này đơn giản là khai báo hệ thống số thứ tự các biến toàn cục, cái này tránh nhầm lẫn thôi, như bạn thấy trong code của mình mình có dùng số trực tiếp với biến cục bộ đâu mà toàn gán cho 1 biến trung gian đó, để tránh nhầm lẫn thôi.
Cách thức:


TÊN_BIẾN=Giá_trị
Bạn gán biến toàn cục thứ Giá_trị bằng biến TÊN_BIẾN. Và đây là biến toàn cục nên bạn không cần phải khai báo nó ở khóa local nữa.
Để lấy giá trị biến toàn cục ta dùng cấu trúc

GetMissionData(sceneId,Object_ID,TÊN_BIẾN_HOẶ C_THỨ_TỰ)
Object_ID có thể có nhiều loại như người chơi, pet hay item...
Set giá trị biến toàn cục ta dùng cấu trúc

SetMissionData(sceneId,Object_ID,TÊN_BIẾN_HOẶ C_THỨ_TỰ,gt)
Set giá trị biến này = gt.
Cụ thể ví dụ bạn xem script NPC mình post ở bài HD 1 trong đó có sử dụng biến toàn cục.

2. scene.lua

Khá quan trọng, để hiểu kỹ về script event bạn cần hiểu cái file này.
Cụ thể các bạn mở script của nó ra, có vài hàm mình sẽ giải thích.
Hàm OnSceneInit sẽ bắt sự kiện khi cái cảnh bất kỳ đc tạo ra ví dụ phụ bản.
Hàm OnSceneTimer chính là hàm thao tác hệ thống check mỗi mili giây, và chính hàm nay gọi đến cái hàm cùng tên trong script event đó.
Hàm OnSceneQuit không dùng bao giờ.
Hàm OnScenePlayerEnter là hàm bắt sự kiện khi người chơi xuất hiện tại cảnh nào đó, cái hàm này chính là gọi đến hàm cùng tên trong script event.
Hàm OnSceneHumanDie chính là cái hàm thao tác mỗi khi có người chơi nào đó tử nạn, hàm này cũng gọi đến hàm cùng tên trong script event.
Hàm OnSceneHumanLevelUp là hàm bắt sự kiện trong cảnh nào đó mà người chơi ấn thăng cấp.
Hàm OnSceneHumanChangeMenpai bắt sự kiện khi người chơi đổi phái (không hay dùng)
Hàm OnSceneNotify hàm nhắc nhở thông báo một cái gì đó (không dùng)
Hàm OnAcceptMissionCheck thao tác khi hoàn thành nhiệm vụ
Hàm OnScenePlayerTimer thao tác tính thời gian tào vận.
Hàm OnScenePlayerLogin thao tác khi người chơi đăng nhập vào game.
Hàm OnScenePlayerFirstLogin thao tác khi người chơi lần đầu đăng nhập vào game (lúc vừa khởi tạo nhân vật xong).
Hàm OnScenePlayerOpenRevenge được gọi tới khi người chơi tuyên chiến cùng ai đó.
Hàm OnScenePlayerCloseRevenge thao tác khi kết thúc tuyên chiến.
Hàm OnPlayerPickupItemFromDropBox thao tác mỗi khi người chơi nhặt 1 vật phẩm nào đó từ cái túi trong cảnh bất kỳ, dùng để thông báo khi nhặt đc trang bị quý.
Ngoài ra còn vài cái hàm nữa nhưng ko hay dùng, các bạn tự tìm hiểu, ở đây mình chỉ list ra danh sách các hàm chính mà bạn cần biết để hiểu rõ hơn về event script.
Có vài câu lệnh trong Lua Basic như SetTimer hay GetTimer nó như kiểu check thời gian sau một khoảng nào đó thì sẽ lặp lại Get/Set giá trị cho 1 hàm nào đó. Cái này tùy thuộc vào mục đích của bạn. Hãy tham khảo forum về Lua Basic để hiểu rõ hơn nhé
3. Biến hệ thống Activity

Cái này rộng hơn biến toàn cục, biến này có tác dụng cho mọi đối tượng. Ví dụ như tổng điểm tích lũy hoạt động của tất cả thành viên trong bang hội trong ngày hay con số may mắn hệ thống ngẫu nhiên chọn trong trò chơi rút thăm trên toàn thể sv,...
Dườm dà khó hiểu nhưng bạn hình dung chút là sẽ được.
Để bắt đầu một chuỗi hoạt động nào đó trên toàn sv, ta dùng cấu trúc

StartOneActivity(sceneId,Thời_gian,Số_thứ_t� ��)
Và kết thúc thì bạn dùng cấu trúc

EndAnActivity(sceneId,Số_thứ_tự,Thời_gian, Số_lượng_biến)
Nó cung cấp cho bạn khoảng 36 biến phục vụ cho 1 hoạt động bất kỳ.
Để lấy giá trị một biến nào đó trước tiên ta khởi tạo Activity rồi sau đó mới thao tác theo cấu trúc:

GetActivityParam(sceneId,Số_thứ_tự_Activity, Số_thứ_tự_biến)
Và set giá trị ta dùng cấu trúc:

SetActivityParam(sceneId,Số_thứ_tự_Activity, Số_thứ_tự_biến,Giá_trị)

Và khi kết thúc Activity bạn nên End nó tránh lãng phí bộ nhớ, nếu bạn không End nó thì hết thời gian nó cũng tự End thôi.

Sói Đẹp Trai
11-01-15, 05:10 AM
Một điều cuối cùng khá quan trọng chính là thao tác kết nối giữa SV với Client và ngược lại, giải thích nguyên lý hoạt động của file Lua bên Client.
1. UI_COMMAND và XScript

Đây chính là công cụ kết nối Server và Client.
Muốn truyền dữ liệu từ Server lên, ta dùng UI_COMMAND theo cấu trúc


BeginUICommand(sceneId)
UICommand_AddInt(sceneId,GetMissionData(sceneId,se lfId,y)
UICommand_AddString(sceneId,GetMissionData(sceneId ,selfId,z)
EndUICommand(sceneId)
DispatchUICommand(sceneId,selfId,x)

Truyền UI_COMMAND với số đại diện là x lên Client và truyền các biến tương ứng lên Client, y kiểu nguyên và z kiểu chuỗi. Các bạn có thể thay đổi tùy mục đích, tối đa là 15 biến truyền từ sv lên thôi nhé.
Cái x kia đặt bất kỳ kiểu nguyên miễn không trùng với UI_COMMAND khác.
Tại client ta check UI_COMMAND như sau:
Xét hàm PreLoad, ta sẽ khai báo thêm 1 dòng sử dụng chức năng UI_COMMAND cho nó như sau:

this:RegisterEvent("UI_COMMAND")
Thế là ok rồi. Giờ ta sẽ get giá trị được truyền từ Server lên như sau:
Xét hàm OnEvent, ta sẽ kiểm tra như sau


if event == "UI_COMMAND" and tonumber(arg0) == x then
local z=Get_XParam_INT(0)
local y=Get_XParam_String(1)
end

Thì biến z này chính là biến kiểu nguyên mà sv truyền lên và y là biến kiểu chuỗi. SV truyền lên các biến đánh số từ 0 nhé. Và UI_COMMAND này nhận dạng nó là số x
Ngoài ra bạn cũng có thể truyền UI_COMMAND từ file Lua khác bên Client qua bằng cấu trúc

PushEvent("UI_COMMAND",x,Danh_sách_các_tham_biến_cần_truyền)
Với x cũng là giá trị nguyên bất kỳ đúng với cái UI_COMMAND trỏ tới. Và các biến truyền sang là dạng chuỗi đánh số từ arg1 trở lên (vì arg0 là cái x kia rồi). Cái arg1 trở lên ko cần khai báo nhé nó mặc định được định nghĩa rồi. Và lấy giá trị bạn chỉ cần lấy 1 biến = cái arg1 này là xong.

Vậy là xong việc truyền dữ liệu từ SV lên, bây giờ ta quan tâm truyền dữ liệu từ Client về Sv nhé.
Đó chính là cái XScript. Cấu trúc như sau


Clear_XSCRIPT();
Set_XSCRIPT_Function_Name("Tên_hàm_thao_tác_tại_SV")
Set_XSCRIPT_ScriptID(ID_Script_thao_tác)
Set_XSCRIPT_Parameter(0,x)
Set_XSCRIPT_Parameter(1,y)
...
Set_XSCRIPT_Parameter(n,z)
Set_XSCRIPT_ParamCount(n+1)
Send_XSCRIPT()
Nó sẽ gửi các tham biến trên về cái hàm được khai báo trong Server. Các tham biến đó sẽ đứng sau sceneId và selfId.
Tùy mục đích bạn sử dụng nó như thế nào.
Một chú ý là cái hàm kia bạn phải khai báo nó trong tlbb/Server/Config/AllowableScriptFunc.txt nếu không nó sẽ diss ngay. Cái này đơn giản để chống hack thôi mà.

Chú ý cuối cùng là UI_COMMAND khi gọi từ SV lên nếu gọi nhiều cái cùng lúc thì nó chỉ thực hiện cái UI_COMMAND cuối cùng thôi nhé. Mình cũng không hiểu vì sao. Còn XScript thì bạn truyền vô tư nhiều cái 1 lúc không sao.
Và trong code hạn chế việc chuyển dữ liệu qua lại sv và client nhé nó đỡ lag SV hơn.

Với các thứ trên bạn hoàn toàn fake được vài thứ rồi đấy.

2. XML và Lua trong Interface

Nếu bạn học qua lập trình Java thì bạn sẽ hiểu vai trò của xml file. Nó để dựng khung giao diện và bắt các sự kiện khi người dùng thao tác vào đâu đó. Nói cái này để bạn hiểu mấy cái hàm trong Lua tại Client ấy để khi edit bị lỗi còn xem lại.
Ngoài ra để khai báo 1 file Lua nào bên Client ta khai báo trong file InterfaceEx.txt trong Config.axp. Bạn cũng nên biết qua về xml thì bạn sẽ rõ hoạt động của file Lua tại Interface. Thông thường khi copy file từ đâu đó vào ví dụ của FPT qua bị lỗi thì ngoài Lua file bạn cũng nên để ý cái xml này.

Trên đây là tất cả những gì sơ đẳng nhất liên quan đến Client, ngoài ra có vài hàm đặc biệt thì bạn phải hiểu xml và thực hành nhiều nhé. Để làm đc cái khung dễ nhất như cái tu luyện thì bạn cũng cần biết nhiều và đến đây bạn cũng khá pro rồi đó nhe :D

--- Chế độ gộp bài viết ---


Trong Script còn một phần là script nhiệm vụ (Mission) thì mình sẽ không hướng dẫn vì nó khá giống cơ chế hoạt động của script event (giống cơ chế thôi nhé) và các bạn nên tự tìm hiểu. Mấy cái script có sẵn như Q tại thành đại lý là thứ bạn cần đó...
OK vậy là mình đã tổng hợp hết các thứ liên quan đến code theo mình biết. Ai có ý kiến hoặc bổ sung gì hãy comment bên dưới để bài hướng dẫn này hoàn chỉnh hơn nhé!
Thân!

Sói Đẹp Trai
11-01-15, 05:39 AM
Bonus vài thứ bạn có thể làm đc theo cái guild trên, tất nhiên còn phải đọc thêm nhiều nguồn khác nữa.
Event Thiếu thất, sát tinh, tứ tuyệt, tàng kinh chuẩn FPT (Tất nhiên code thôi còn dườm dà như design skill hay impact thì nó thuộc phần khác)

Tu luyện

https://uphinhnhanh.com/images/-573789553_2015_01_09_22_51_38.jpg (https://uphinhnhanh.com/view--573789553_2015_01_09_22_51_38.jpg)

https://uphinhnhanh.com/images/-722444999_2015_01_09_22_51_57.jpg (https://uphinhnhanh.com/view--722444999_2015_01_09_22_51_57.jpg)

https://uphinhnhanh.com/images/-582525118_2015_01_09_22_52_02.jpg (https://uphinhnhanh.com/view--582525118_2015_01_09_22_52_02.jpg)

https://uphinhnhanh.com/images/-572469878_2015_01_09_22_52_06.jpg (https://uphinhnhanh.com/view--572469878_2015_01_09_22_52_06.jpg)

https://uphinhnhanh.com/images/-567970504_2015_01_09_22_52_10.jpg (https://uphinhnhanh.com/view--567970504_2015_01_09_22_52_10.jpg)

https://uphinhnhanh.com/images/-598669558_2015_01_09_22_52_16.jpg (https://uphinhnhanh.com/view--598669558_2015_01_09_22_52_16.jpg)

https://uphinhnhanh.com/images/-703412945_2015_01_09_22_52_44.jpg (https://uphinhnhanh.com/view--703412945_2015_01_09_22_52_44.jpg)

https://uphinhnhanh.com/images/-722531616_2015_01_09_22_52_49.jpg (https://uphinhnhanh.com/view--722531616_2015_01_09_22_52_49.jpg)

https://uphinhnhanh.com/images/-675971785_2015_01_09_22_52_53.jpg (https://uphinhnhanh.com/view--675971785_2015_01_09_22_52_53.jpg)

https://uphinhnhanh.com/images/-606508629_2015_01_09_22_52_57.jpg (https://uphinhnhanh.com/view--606508629_2015_01_09_22_52_57.jpg)


Trang bị pet

https://www.youtube.com/watch?v=cu7csdgQ44Q&feature=youtu.be

NPC thao tác trang bị pet
http://upanh.biz/images/2015/01/04/20150104234136.jpg
http://upanh.biz/images/2015/01/04/20150104234152.jpg
http://upanh.biz/images/2015/01/04/20150104234217.jpg
http://upanh.biz/images/2015/01/04/20150104234219.jpg
http://upanh.biz/images/2015/01/04/20150104234223.jpg
http://upanh.biz/images/2015/01/04/20150104234228.jpg
http://upanh.biz/images/2015/01/04/20150104234247.jpg
http://upanh.biz/images/2015/01/04/20150104234310.jpg
http://upanh.biz/images/2015/01/04/20150104234330.jpg
http://upanh.biz/images/2015/01/04/20150104234342.jpg

le_huy
11-01-15, 12:01 PM
cái phần truyền biến từ client về sever , ko truyền đc xâu về ...

Sói Đẹp Trai
11-01-15, 06:10 PM
Có truyền đc nhé bạn. Chỉ có điều độ dài bn thì mình ko nhớ thôi

songtu
11-01-15, 10:17 PM
Có truyền đc nhé bạn. Chỉ có điều độ dài bn thì mình ko nhớ thôi

mình cũng từng gặp như bạn đó!! truyền một xâu 8 ký tự về mà nó ko cho :)) thôi đành mã hóa để truyền về vậy!!

songtu
11-01-15, 10:24 PM
à muốn hỏi bạn Sói thêm 1 cái, cai giang hồ chỉ nam ở trong commont item nó ko quy đinh script thì tìm script cho nó sao nhể? @-)@-)

makute7413
12-01-15, 04:44 PM
à muốn hỏi bạn Sói thêm 1 cái, cai giang hồ chỉ nam ở trong commont item nó ko quy đinh script thì tìm script cho nó sao nhể? @-)@-)

nó là WR_*.txt trong config.axp, ko có script thì phải.

Sói Đẹp Trai
14-01-15, 03:17 AM
Mình sẽ xem lại cái XScript với String. Còn ghcn thù nó chỉ là ví dụ thôi đại loại kiểu bấm đó. Có lẽ do sv mình có 1 cái script cho ghcn tự make nên để ví dụ thế.

makute7413
30-01-15, 11:56 PM
Mình sẽ xem lại cái XScript với String. Còn ghcn thù nó chỉ là ví dụ thôi đại loại kiểu bấm đó. Có lẽ do sv mình có 1 cái script cho ghcn tự make nên để ví dụ thế.

Sói có thể cho ví dụ cụ thể phần ScriptGlobal cho item ko, ý tưởng của mình là lợi dụng SetMissionData cho chức năng điêu văn?

Sói Đẹp Trai
31-01-15, 03:32 AM
Không thể đc nhé. Còn vì sao thì thím songtu biết rõ đó

songtu
29-05-15, 08:48 AM
Sói có thể cho ví dụ cụ thể phần ScriptGlobal cho item ko, ý tưởng của mình là lợi dụng SetMissionData cho chức năng điêu văn?

sever kia thím làm điêu văn thế nào thế? làm cho cái ám khí thế nào nhỉ ? Mong dc chỉ giáo!! ~o)

makute7413
29-05-15, 09:31 AM
sever kia thím làm điêu văn thế nào thế? làm cho cái ám khí thế nào nhỉ ? Mong dc chỉ giáo!! ~o)

Giống của HaiChun2006 mà, thay Impact bằng EquipSet để hạn chế số lượng Impact thôi. Mỗi thế.
Ám khí thì bạn có thể hỏi Sohu thử xem #21
Chỉ giáo thì mình không dám :)

makute7413
22-01-16, 05:08 PM
Sao mình truyền một biến 30 ký tự về client thì không được nhỉ?

Sói Đẹp Trai
22-01-16, 05:09 PM
Post cả đoạn code lên nhé. 1 là tràn số biến gửi lên, 2 là chưa rõ...

chihochoi
25-01-16, 03:38 PM
mọi người cho em hỏi cái chuổi truyền từ server lên clent tối đa bao nhiêu ký tự zay ạ

Sói Đẹp Trai
26-01-16, 12:51 AM
Đã test. Được khoảng 50 ký tự đổ về bạn nhé

ongnoixh
26-01-16, 11:44 AM
tks a sói nhé



3)0000000000 char

caovanthanh22
02-09-16, 05:39 PM
bác Sói ghi chú cái phần skill boss của script lua rất rõ ràng ^^.... dể hiểu... nhưng mình cũng ko thông dc ^^... làm đi làm lại hồi năm 2015 ^^... đã bất lực nay đọc lại làm cũng ko dc ^^... vãi ngu... ^^... ai nói lấy cần cù bù dc thông minh ^^.... vãi... trình độ độ bây giờ giá cả khá đắt đỏ.... ^^...

shinno
02-09-16, 07:18 PM
Làm cái gi không được thì ghi lên ai đi qua lại sẽ chỉ 1 it gôm lại là dc thôi

caovanthanh22
02-09-16, 07:47 PM
Code nó zầy nè ^^..... mình vài ý kiến thêm zầy nè ^^... mong các moder hướng dẫn dùm mình...
Theo cấu trúc thì y chang như Sói đã hướng dẫn rùi đó ( ko biết có sai sót nơi mô) ^^!
Nhưng về áp dụng vào thực tế ko biết có chính xát chưa ^^...
Như skill của các môn phái có cần phải chỉnh lại dạng ko môn phái, AIScript để là 0 hay -1, skill đầu môn phái có cần áp vào đây hay mình áp bên AIScript....


-- NPC Minh Giáo

x002115_g_ScriptId=002115

x002115_g_Skill_1=2012 --Thôi tâm chß·ng
x002115_g_Skill_1_ph=0
x002115_g_Skill_1_time=1
x002115_g_Skill_2=241 --buff ngoÕi công hµ th¬
x002115_g_Skill_2_ph=305000
x002115_g_Skill_2_time=2
x002115_g_Skill_3=246 --buff nµi công hµ th¬
x002115_g_Skill_3_ph=305000
x002115_g_Skill_3_time=3
x002115_g_Skill_4=2013 --buff 30 höa th¥n hÕ phàm
x002115_g_Skill_4_ph=1800000
x002115_g_Skill_4_time=4
x002115_g_Skill_5=2014 --buff quì hoa hß¾ng dß½ng
x002115_g_Skill_5_ph=605000
x002115_g_Skill_5_time=5
x002115_g_Skill_6=2015 --buff th¥n duong vô cñc
x002115_g_Skill_6_ph=180000
x002115_g_Skill_6_time=6
x002115_g_Skill_7=2016 --buff nµ phát xung quan
x002115_g_Skill_7_ph=305000
x002115_g_Skill_7_time=7
x002115_g_Skill_8=2017 --viêm long vô song
x002115_g_Skill_8_ph=30000
x002115_g_Skill_8_time=8
x002115_g_Skill_9=615 --ð¦u chuy¬n tinh vi
x002115_g_Skill_9_ph=10000
x002115_g_Skill_9_time=9
x002115_g_Skill_10=2019 --thüy yªm th¤t quân
x002115_g_Skill_10_ph=12000
x002115_g_Skill_10_time=10
x002115_g_Skill_11=2020 --höa thiêu xích bích
x002115_g_Skill_11_ph=12000
x002115_g_Skill_11_time=11
x002115_g_Skill_12=2021 --höa di¬m liên hoàng träm
x002115_g_Skill_12_ph=25000
x002115_g_Skill_12_time=12
x002115_g_Skill_13=2022 --huyªt chiªn bát thß½ng
x002115_g_Skill_13_ph=70000
x002115_g_Skill_13_time=13
x002115_g_Skill_14=2023 --thiên höa nhiên khung
x002115_g_Skill_14_ph=60000
x002115_g_Skill_14_time=14
x002115_g_Skill_15=2024 --ði¬m huy®t
x002115_g_Skill_15_ph=120000
x002115_g_Skill_15_time=15
x002115_g_Skill_16=2025 --ph¥n di¬m nhi¬u thân
x002115_g_Skill_16_ph=90000
x002115_g_Skill_16_time=16
x002115_g_Skill_17=2026 --ð¸a ngøc höa
x002115_g_Skill_17_ph=120000
x002115_g_Skill_17_time=17
x002115_g_Combat_Flag=5
--------------------------------------
x002115_g_NpcChat = {
"ai sþ ai #64",
"#70 nÕp mÕng ði",
"kèo th½m ðây #80",
"ngÑa mình à #81",
"vãi ðÕn chßa #14",
"#18#18 chuy®n gì ðây",
"sþ quá ði #9",
"#15#15",
"#86",
"#22#22",
"chém #22",
"tém #15",
"#9 ¨m thôi",
"càng quét thôi #18",
"#16 ðánh ðánh",
"^^ chiªn thôi",
}
------------------------------
x002115_g_NpcChat1 = {
"Uhm Uhm #6",
"ðúng là #97",
"#29 z¶i ½i #3",
"#21 ð½n giän là v§y #2",
"#71#71#71",
"#85",
"#38#38",
"ðßþc #31#31",
"#89",
"#7",
"#7 ðâu m¤t r°i",
"#31 rãnh ru°i",
"#6 :))",
"#29 ",
"#7 chÕy mau th§t",
}
--------------------------------
x002115_g_NpcChat2 = {
"xong 1 em #1",
"t® quá ði #21",
"#63 em nào tiªp theo ðây",
"#78 tÕm bi®t #78",
"#24 ði g§p mÕnh bà là v×a",
"#87",
"#100#100",
"#2",
"#2 yeat",
"#2 không t® #3",
"#24 woa",
"sß¾ng #3",
}
---------------------------------
x002115_g_NpcChat3 = {
"#9#9",
"#21",
"#74#74#74",
"#37",
"#73#73",
"#11",
"#20",
"#30",
"#51",
"#12",
"#13",
"vãi ðÕn",
":))",
"lên bøi",
"lên vîa",
}
nNpcChat = x002115_g_NpcChat[random( getn(x002115_g_NpcChat) )]
nNpcChat1 = x002115_g_NpcChat1[random( getn(x002115_g_NpcChat1) )]
nNpcChat2 = x002115_g_NpcChat2[random( getn(x002115_g_NpcChat2) )]
nNpcChat3 = x002115_g_NpcChat3[random( getn(x002115_g_NpcChat3) )]
--------------------------------------
--thao tác monster khi g÷i ra
--------------------------------------
function x002115_OnInit(sceneId,selfId)
x002115_ResetMyAI(sceneId,selfId)
end
--------------------------------------
--Check monster in time
--------------------------------------
function x002115_OnHeartBeat(sceneId,selfId,nTick)
if LuaFnIsCharacterLiving(sceneId,selfId)~=1 then
return
end
if MonsterAI_GetIntParamByIndex(sceneId,selfId,x00211 5_g_Combat_Flag)==0 then
return
end
x002115_UseMySkill(sceneId,selfId,nTick)
end
--------------------------------------
--b¡t ð¥u chiªn ð¤u
--------------------------------------
function x002115_OnEnterCombat(sceneId,selfId,enmeyId)
x002115_ResetMyAI(sceneId,selfId)
LuaFnNpcChat(sceneId, selfId, 0,nNpcChat)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Combat_Flag,1)
end
--------------------------------------
--trÕng thái hòa bình
--------------------------------------
function x002115_OnLeaveCombat(sceneId,selfId)
x002115_ResetMyAI(sceneId,selfId)
LuaFnNpcChat(sceneId, selfId, 0,nNpcChat1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Combat_Flag,1)
end
--------------------------------------
--giªt nÕn nhân
--------------------------------------
function x002115_OnKillCharacter(sceneId,selfId,targetId)
LuaFnNpcChat(sceneId, selfId, 0,nNpcChat2)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Combat_Flag,1)
end
--------------------------------------
--chªt
--------------------------------------
function x002115_OnDie(sceneId,selfId,killerId)
LuaFnNpcChat(sceneId, selfId, 0,nNpcChat3)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Combat_Flag,1)
end
--------------------------------------
--reset thuµc tính
--------------------------------------
function x002115_ResetMyAI(sceneId,selfId)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_1_time,x002115_g_Skill_1_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_2_time,x002115_g_Skill_2_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_3_time,x002115_g_Skill_3_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_4_time,x002115_g_Skill_4_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_5_time,x002115_g_Skill_5_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_6_time,x002115_g_Skill_6_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_7_time,x002115_g_Skill_7_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_8_time,x002115_g_Skill_8_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_9_time,x002115_g_Skill_9_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_10_time,x002115_g_Skill_10_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_11_time,x002115_g_Skill_11_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_12_time,x002115_g_Skill_12_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_13_time,x002115_g_Skill_13_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_14_time,x002115_g_Skill_14_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_15_time,x002115_g_Skill_15_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_16_time,x002115_g_Skill_16_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_17_time,x002115_g_Skill_17_ph)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Combat_Flag,0)
end
--------------------------------------
--dùng skill
--------------------------------------
function x002115_UseMySkill(sceneId,selfId,nTick)
local Skill_1=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_1_time)
local Skill_2=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_2_time)
local Skill_3=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_3_time)
local Skill_4=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_4_time)
local Skill_5=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_5_time)
local Skill_6=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_6_time)
local Skill_7=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_7_time)
local Skill_8=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_8_time)
local Skill_9=MonsterAI_GetIntParamByIndex(sceneId,selfI d,x002115_g_Skill_9_time)
local Skill_10=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_10_time)
local Skill_11=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_11_time)
local Skill_12=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_12_time)
local Skill_13=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_13_time)
local Skill_14=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_14_time)
local Skill_15=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_15_time)
local Skill_16=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_16_time)
local Skill_17=MonsterAI_GetIntParamByIndex(sceneId,self Id,x002115_g_Skill_17_time)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_1_time,Skill_1-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_2_time,Skill_2-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_3_time,Skill_3-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_4_time,Skill_4-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_5_time,Skill_5-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_6_time,Skill_6-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_7_time,Skill_7-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_8_time,Skill_8-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_9_time,Skill_9-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_10_time,Skill_10-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_11_time,Skill_11-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_12_time,Skill_12-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_13_time,Skill_13-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_14_time,Skill_14-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_15_time,Skill_15-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_16_time,Skill_16-nTick)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_17_time,Skill_17-nTick)
if Skill_1<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_1_time,x002115_g_Skill_1_ph)
end
if Skill_2<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_2 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_2_time,x002115_g_Skill_2_ph)
end
if Skill_3<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_3 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_3_time,x002115_g_Skill_3_ph)
end
if Skill_4<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_4 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_4_time,x002115_g_Skill_4_ph)
end
if Skill_5<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_5 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_5_time,x002115_g_Skill_5_ph)
end
if Skill_6<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_6 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_6_time,x002115_g_Skill_6_ph)
end
if Skill_7<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_7 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_7_time,x002115_g_Skill_7_ph)
end
if Skill_8<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_8 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_8_time,x002115_g_Skill_8_ph)
end
if Skill_9<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_9 ,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_9_time,x002115_g_Skill_9_ph)
end
if Skill_10<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 0,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_10_time,x002115_g_Skill_10_ph)
end
if Skill_11<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 1,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_11_time,x002115_g_Skill_11_ph)
end
if Skill_12<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 2,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_12_time,x002115_g_Skill_12_ph)
end
if Skill_13<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 3,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_13_time,x002115_g_Skill_13_ph)
end
if Skill_14<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 4,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_14_time,x002115_g_Skill_14_ph)
end
if Skill_15<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 5,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_15_time,x002115_g_Skill_15_ph)
end
if Skill_16<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 6,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_16_time,x002115_g_Skill_16_ph)
end
if Skill_17<=0 then
local x,y=GetWorldPos(sceneId,selfId)
LuaFnUnitUseSkill(sceneId,selfId,x002115_g_Skill_1 7,x,y,0,1)
MonsterAI_SetIntParamByIndex(sceneId,selfId,x00211 5_g_Skill_17_time,x002115_g_Skill_17_ph)
end
end

sửa lần tiếp theo 11h 27p ngày 9/3/2016

Dark.Hades
21-01-17, 12:14 AM
Tiện bài về script thì trước khi hỏi e xin share site hỗ trợ các bác viết script lua 4.0 cho TLBB phía Server(client có thể tham khảo, vì hình như client là 5.x thì phải)

https://www.lua.org/manual/4.0/manual.html

Trang này có đầy đủ hàm mà phía server có thể sử dụng để phát triển thêm. E dùng nó để code mấy cái luyện hồn và item này nọ chuẩn FPT 90% ko cần phải viết cả đống dòng liệt kê ID item.


Câu hỏi:

Bác nào biết toàn bộ hàm mà Game.exe có thể đọc được cho tới thời điểm hiện tại không?
Vì mò theo search phê quá, muốn tìm mấy hàm như kiểm tra vị trí của item trong tay nải ở pos bao nhiêu, itemID này có bao nhiêu cái trong tay nải,....

Sói Đẹp Trai
23-01-17, 05:18 PM
Tiện bài về script thì trước khi hỏi e xin share site hỗ trợ các bác viết script lua 4.0 cho TLBB phía Server(client có thể tham khảo, vì hình như client là 5.x thì phải)

https://www.lua.org/manual/4.0/manual.html

Trang này có đầy đủ hàm mà phía server có thể sử dụng để phát triển thêm. E dùng nó để code mấy cái luyện hồn và item này nọ chuẩn FPT 90% ko cần phải viết cả đống dòng liệt kê ID item.


Câu hỏi:

Bác nào biết toàn bộ hàm mà Game.exe có thể đọc được cho tới thời điểm hiện tại không?
Vì mò theo search phê quá, muốn tìm mấy hàm như kiểm tra vị trí của item trong tay nải ở pos bao nhiêu, itemID này có bao nhiêu cái trong tay nải,....
View Hex xem thím. Chịu khó mò mấy cái param đằng sau, chỉ có tên hàm thôi. Cái file Server trong linux đó

Dark.Hades
23-01-17, 05:26 PM
View Hex xem thím. Chịu khó mò mấy cái param đằng sau, chỉ có tên hàm thôi. Cái file Server trong linux đó
Phía client ấy, chứ sv e biết trò này rồi :3
Tính dùng search check từng hàm xem nó live hay ko mà khoai qá, interface từ 2011 đổ lên nhiều hàm hay mà ko xài đc

Sói Đẹp Trai
23-01-17, 11:18 PM
Thử hex cái dll xem. Bin mới nó có cái LuaPlus.dll đó. Muốn chi tiết hơn thì ném thử vào visual debug thử :)