[TLBB] Lua in TLBB
Hello & Welcome to our community. Is this your first visit? Đăng Ký
Follow us on
Follow us on Facebook Follow us on Twitter Linked In Flickr Watch us on YouTube My Space Blogger
 
Trang 1 của 3 1 2 3 CuốiCuối
Kết quả 1 đến 10 của 27

Chủ đề: Lua in TLBB

  1. #1
    Super Moderator Sói Đẹp Trai's Avatar
    Ngày tham gia
    Apr 2011
    Đang ở
    地獄
    Bài viết
    3,991
    Thanks
    369
    Thanked 4,049 Times in 1,402 Posts

    Lua in TLBB

    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/sh...d.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:



    Và đây là code của nó
    Code:
    --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,eventId)
    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.

    Code:
    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à
    Code:
    xScrID_OnEventRequest(sceneId,selfId,targetId,eventId)
    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:

    Code:
    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

    Code:
    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:

    Code:
    function x900093_OnEventRequest(sceneId,selfId,targetId,eventId)
    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,targetId,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,selfId,XIULIAN_GONGLI))
    			UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,XIULIAN_LILIANG))
    			UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,XIULIAN_LINGQI))
    			UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,XIULIAN_TILI))
    			UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,XIULIAN_DINGLI))
    			UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,XIULIAN_SHENFA))
    			UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,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,selfId,selfId,9387,0)
    				LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfId,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,selfId,selfId,9388,0)
    				LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfId,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,selfId,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,selfId,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,selfId,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,selfId,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,selfId,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,selfId,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,selfId,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,selfId,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.

    Code:
    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 đó.

    Code:
    --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,eventId)
    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,targetId,x900095_g_ScriptId,0)
    	
    	end
    	--*****************--
    	if key == 4 then
    		
    		if GetMissionData(sceneId,selfId,RECIEVE_LAST_DAY_TIME)==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_TIME,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,selfId,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,missionScriptId,selectRadioId)
    
    	--*****************--
    	if LuaFnGetAvailableItemCount(sceneId,selfId,selectRadioId)<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
    Code:
    
    --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,selfId,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,selfId,x910015_g_Mount_Pos)		--Index thú cßÞi ðang trang b¸ trên ng߶i
    	--*********************--
    	if LuaFnIsPrescrLearned(sceneId,selfId,x910015_g_Rider[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,x910015_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,selfId,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,selfId,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
    Code:
    LuaFnGetItemTableIndexByIndex(sceneId,selfId,x910015_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.
    Code:
    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.
    Code:
    LuaFnIsPrescrLearned(sceneId,selfId,x910015_g_Rider[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
    Code:
    LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfId,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à
    Code:
    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
    Code:
    
    --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_QingQinCao,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.
    Code:
    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
    Code:
    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.
    Code:
    LuaFnDelAvailableItem(sceneId,selfId,x900071_g_QingQinCao,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.
    Code:
    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.
    Code:
    
    --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_DT100,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:
    Code:
    LuaFnDelAvailableItem(sceneId,selfId,x900083_g_DT100,1)
    Xóa item ID x900083_g_DT100 số lượng 1.
    Code:
    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ần100 đ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
    .
    Lần sửa cuối bởi Sói Đẹp Trai, ngày 11-01-15 lúc 03:20 AM. Lý do: Updating...
    Khách viếng thăm hãy cùng Sói Đẹp Trai xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  2. The Following 4 Users Say Thank You to Sói Đẹp Trai For This Useful Post:

    dinhdtd (08-05-22), shinno (19-12-14), skythienlong (17-12-14), vuhuy99v (27-12-15)

  3. #2
    Super Moderator Sói Đẹp Trai's Avatar
    Ngày tham gia
    Apr 2011
    Đang ở
    地獄
    Bài viết
    3,991
    Thanks
    369
    Thanked 4,049 Times in 1,402 Posts

    Ðề: Lua in TLBB

    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.
    Code:
    --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,x910200_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,x910200_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,x910200_g_Skill_1_Timer,x910200_g_Skill_1_CD)	--Th¶i gian kÛ nång 1
    	MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_g_Skill_2_Timer,x910200_g_Skill_2_CD)	--Th¶i gian kÛ nång 2
    	MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_g_Skill_3_Timer,x910200_g_Skill_3_CD)	--Th¶i gian kÛ nång 3
    	MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_g_Skill_4_Timer,x910200_g_Skill_4_CD)	--Th¶i gian kÛ nång 4
    	MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_g_Combat_Flag,0)						--Set lÕi trÕng thái chiªn ð¤u
    	--******************--
    	LuaFnSendSpecificImpactToUnit(sceneId,selfId,selfId,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,x910200_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,x910200_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,x910200_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,x910200_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_Index_1,x,y,0,1)						--NPC sØ døng kÛ nång
    		MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_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_Index_2,x,y,0,1)						--NPC sØ døng kÛ nång
    		MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_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_Index_3,x,y,0,1)						--NPC sØ døng kÛ nång
    		MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_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_Index_4,Victim,x,y,0,1)				--NPC sØ døng kÛ nång
    		MonsterAI_SetIntParamByIndex(sceneId,selfId,x910200_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
    Code:
    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
    Code:
    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
    Code:
    
    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),LuaFnIsCanDoScriptLogic(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
    Code:
    
    --Â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_Dialogue[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,x910206_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,x910206_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_Dialogue[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,x910206_g_Skill_1_Timer,x910206_g_Skill_1_CD)	--Th¶i gian kÛ nång 1
    	MonsterAI_SetIntParamByIndex(sceneId,selfId,x910206_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,x910206_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_Index_1,x,y,0,1)						--Boss sØ døng kÛ nång
    		MonsterAI_SetIntParamByIndex(sceneId,selfId,x910206_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:
    Code:
    
    --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_Information[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_DAYTIME)				--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_DAYTIME)				--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_DAYTIME)			--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_Scene)								--Load file scene
    	LuaFnSetCopySceneData_TeamLeader(sceneId,leaderguid)								--ID ðµi trß·ng
    	LuaFnSetCopySceneData_NoUserCloseTime(sceneId,x910112_g_NoUserTime)					--Th¶i gian lßu phø bän khi không còn ai
    	LuaFnSetCopySceneData_Timer(sceneId,x910112_g_TickTime)								--Th¶i gian phø bän
    	LuaFnSetCopySceneData_Param(sceneId,0,x910112_g_CopySceneType)						--Set thông s¯ phø bän (ScriptGlobal.lua)
    	LuaFnSetCopySceneData_Param(sceneId,1,x910112_g_ScriptId)							--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(sceneId,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_Area)								--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(destsceneId) 
    	leaderObjId=LuaFnGuid2ObjId(sceneId,leaderguid);
    	--******************--
    	local nearteammembercount=GetNearTeamCount(sceneId,leaderObjId) 
    	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_Fuben_Timer,x910112_g_FuBenTime)		--C§p nh§t th¶i gian b¡t ð¥u phø bän
    		LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fuben_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,x910112_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,x910112_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_Fuben_On_Time)	--L¤y tích t¡c mµt cüa phø bän
    		LuaFnSetCopySceneData_Param(sceneId,x910112_g_Fuben_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_Fuben_Timer,nTime-nTick)				--C§p nh§t th¶i gian phø bän (нn v¸ Mili giây)
    		local Next_Time=LuaFnGetCopySceneData_Param(sceneId,x910112_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_DAYTIME)												--L¤y s¯ lßþt tham gia phø bän trong ngày
    	SetMissionData(sceneId,selfId,SHENGSI_DAYTIME,nTime+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_Mission_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_List[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,x910112_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,x910112_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_Monk.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_Monk.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_Fuben_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_Mission_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_Boss_1)		--Boss s¯ 1
    	nBossList[2]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Boss_2)		--Boss s¯ 2
    	nBossList[3]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Boss_3)		--Boss s¯ 3
    	nBossList[4]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Boss_4)		--Boss s¯ 4
    	nBossList[5]=LuaFnGetCopySceneData_Param(sceneId,x910112_g_Boss_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,MonsterId,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,Boss_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_On_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 MakeCopySceneOnCopySceneReady 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
    Code:
    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
    Code:
    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.

    Code:
    
    --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_ScriptId)
    	--************************--
    	
    end
    --*****************************--
    --*     On Event Request      *--
    --*****************************--
    function x910113_OnEventRequest(sceneId,selfId,targetId,eventId)
    
    	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,"OnEnu merate",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 đó.
    Lần sửa cuối bởi Sói Đẹp Trai, ngày 11-01-15 lúc 04:10 AM.
    Khách viếng thăm hãy cùng Sói Đẹp Trai xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  4. The Following 2 Users Say Thank You to Sói Đẹp Trai For This Useful Post:

    caovanthanh22 (05-12-15), vuhuy99v (27-12-15)

  5. #3
    Super Moderator Sói Đẹp Trai's Avatar
    Ngày tham gia
    Apr 2011
    Đang ở
    地獄
    Bài viết
    3,991
    Thanks
    369
    Thanked 4,049 Times in 1,402 Posts

    Ðề: Lua in TLBB

    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:
    Code:
    
    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
    Code:
    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
    Code:
    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
    Code:
    StartOneActivity(sceneId,Thời_gian,Số_thứ_tự)
    Và kết thúc thì bạn dùng cấu trúc
    Code:
    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:
    Code:
    GetActivityParam(sceneId,Số_thứ_tự_Activity,Số_thứ_tự_biến)
    Và set giá trị ta dùng cấu trúc:
    Code:
    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.
    Khách viếng thăm hãy cùng Sói Đẹp Trai xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  6. Các thành viên gởi lời cảm ơn đến Sói Đẹp Trai vì bài viết này !

    vuhuy99v (27-12-15)

  7. #4
    Super Moderator Sói Đẹp Trai's Avatar
    Ngày tham gia
    Apr 2011
    Đang ở
    地獄
    Bài viết
    3,991
    Thanks
    369
    Thanked 4,049 Times in 1,402 Posts

    Ðề: Lua in TLBB

    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
    Code:
    
    BeginUICommand(sceneId)
    	UICommand_AddInt(sceneId,GetMissionData(sceneId,selfId,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:
    Code:
    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
    Code:
    
    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
    Code:
    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
    Code:
    
    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


    --- 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!
    Lần sửa cuối bởi Sói Đẹp Trai, ngày 11-01-15 lúc 05:34 AM.
    Khách viếng thăm hãy cùng Sói Đẹp Trai xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  8. The Following 2 Users Say Thank You to Sói Đẹp Trai For This Useful Post:

    dinhdtd (09-02-21), vuhuy99v (27-12-15)

  9. #5
    Super Moderator Sói Đẹp Trai's Avatar
    Ngày tham gia
    Apr 2011
    Đang ở
    地獄
    Bài viết
    3,991
    Thanks
    369
    Thanked 4,049 Times in 1,402 Posts

    Ðề: Lua in TLBB

    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






















    Trang bị pet


    NPC thao tác trang bị pet










    Khách viếng thăm hãy cùng Sói Đẹp Trai xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  10. #6
    Thành Viên
    Ngày tham gia
    Oct 2014
    Bài viết
    32
    Thanks
    63
    Thanked 2 Times in 2 Posts

    Ðề: Lua in TLBB

    cái phần truyền biến từ client về sever , ko truyền đc xâu về ...
    Khách viếng thăm hãy cùng le_huy xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  11. #7
    Super Moderator Sói Đẹp Trai's Avatar
    Ngày tham gia
    Apr 2011
    Đang ở
    地獄
    Bài viết
    3,991
    Thanks
    369
    Thanked 4,049 Times in 1,402 Posts

    Ðề: Lua in TLBB

    Có truyền đc nhé bạn. Chỉ có điều độ dài bn thì mình ko nhớ thôi
    Khách viếng thăm hãy cùng Sói Đẹp Trai xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  12. #8
    Thành Viên songtu's Avatar
    Ngày tham gia
    Feb 2014
    Đang ở
    Còn lâu mới nói
    Bài viết
    623
    Thanks
    83
    Thanked 241 Times in 181 Posts

    Ðề: Lua in TLBB

    Trích dẫn Gửi bởi Sói Đẹp Trai Xem bài viết
    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!!
    Khách viếng thăm hãy cùng songtu xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  13. #9
    Thành Viên songtu's Avatar
    Ngày tham gia
    Feb 2014
    Đang ở
    Còn lâu mới nói
    Bài viết
    623
    Thanks
    83
    Thanked 241 Times in 181 Posts

    Ðề: Lua in TLBB

    à 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ể?
    Khách viếng thăm hãy cùng songtu xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  14. #10
    Because I'm Stupid makute7413's Avatar
    Ngày tham gia
    Jan 2014
    Đang ở
    LA
    Bài viết
    1,232
    Thanks
    285
    Thanked 1,094 Times in 474 Posts

    Ðề: Lua in TLBB

    Trích dẫn Gửi bởi songtu Xem bài viết
    à 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.
    Khách viếng thăm hãy cùng makute7413 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

 

 
Trang 1 của 3 1 2 3 CuốiCuối

Các Chủ đề tương tự

  1. [TLBB] Ai share cho mình 1 sever tlbb hay và giống với tlbb hiện nay được hem
    Bởi toloveru trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 10
    Bài viết cuối: 15-06-12, 07:43 PM
  2. [TLBB] Hướng dẫn sưa lỗi tlbb Server TLBB UPLOAD BY HAHOANG
    Bởi manhulong trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 3
    Bài viết cuối: 09-06-12, 04:09 PM
  3. Xin hướng dẫn đưa tlbb lên online và cách tạo acc với web tlbb
    Bởi duongst1 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 5
    Bài viết cuối: 01-07-11, 10:22 PM
  4. Ai có tlbb bản full TLBB 1.0 việt hoá share dùm em ^^
    Bởi hoangtoa7 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 2
    Bài viết cuối: 11-01-11, 08:48 PM
  5. lỗi giải nén bộ SV TLBB khi cài TLBB offline
    Bởi dongthaison123 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 6
    Bài viết cuối: 06-01-11, 09:23 PM

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •  
Múi giờ GMT +7. Bây giờ là 09:31 PM.
vBulletin®, Copyright ©2000-2011, Jelsoft Enterprises Ltd.
CLBGamesVN không chịu trách nhiệm về Luật Bản Quyền của các tài liệu, bài viết v.v...được đăng tải trên diễn đàn này.
Diễn đàn phát triển dưới sự đóng góp của tất cả thành viên. BQT chỉ là những người thành lập ra sân chơi, quản lý và duy trì về mặt kỹ thuật, nội dung khi hợp lệ.