[KT] Lỗi mất đồng khi di chuyển sang map khác
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
 
Kết quả 1 đến 2 của 2
  1. #1
    Thành Viên yeukiemthe's Avatar
    Ngày tham gia
    Sep 2014
    Bài viết
    208
    Thanks
    81
    Thanked 113 Times in 32 Posts

    Lỗi mất đồng khi di chuyển sang map khác

    Sau khi dùng tiền xu đổi ra đồng thì khi chuyển map tự dưng đồng trong túi mất hết không còn nữa ai giúp em lỗi này với ạ
    Em ngĩ là do file player.lua trong server ai xem thử giúp em với
    Đây là file player.lua của em

    Code:
    
    Require("\\script\\player\\define.lua");
    Require("\\script\\player\\playerevent.lua");
    Require("\\script\\player\\playerschemeevent.lua");
    
    -- 玩家等級效率
    Player.tbLevelEffect =
    {-- [等級/10] 效率(比值)
    	[1]		= 0.2,
    	[2]		= 0.3,
    	[3]		= 0.4,
    	[4]		= 0.5,
    	[5]		= 0.6,
    	[6]		= 0.7,
    	[7]		= 0.8,
    	[8]		= 0.85,
    	[9]		= 0.9,
    	[10]	= 0.95,
    	[11]	= 1.0,
    	[12]	= 1.05,
    	[13]	= 1.1,
    	[14]	= 1.2,
    	[15]	= 1.2,	
    };
    Player.bCanApplyJiesuo = 0;
    Player.bApplyingJiesuo = 0;
    Player.dwApplyJiesuoTime = 0;
    Player.nAccountSafeLevel = 60;
    Player.nAccountSafeHonour = 1500;
    Player.nAccountSafeMode = 0;
    
    Player.COMEBACK_DOUBT_OLD	= 1;	-- 懷疑外挂老玩家
    Player.COMEBACK_DOUBT_NEW	= 2;	-- 懷疑外挂新玩家
    Player.COMEBACK_YES_OLD	  	= 3;	-- 正常老玩家
    Player.COMEBACK_YES_NEW		= 4;	-- 正常新玩家
    Player.COMEBACK_TSKGROUPID	= 2082;
    Player.COMEBACK_TSKID_FLAG	= 6;
    Player.COMEBACK_TSKID_LASTTIME	= 7;
    Player.COMEBACK_TSKID_NOWTIME	= 8;
    
    Player.TASK_CAMCHAT		  	= 3004;
    Player.TASK_CAMCHAT_ID		  	= 1;
    Player.TASK_CAMCHAT_LAST		  	= 2;
    Player.Relay_Time30 = 30*60;
    Player.Relay_Time15 = 15*60;
    Player.Relay_Time60 = 60*60;
    Player.Relay_Time24 = 24*60*60;
    -- 客戶端收到有人企圖使自己復活
    function Player:OnGetCure(nLifeP, nManaP, nStaminaP)
    	CoreEventNotify(UiNotify.emCOREEVENT_GET_CURE, nLifeP, nManaP, nStaminaP);
    end
    
    -------------------------------------------------------------------------
    -- 檢查潛能加點是否合法
    function Player:CheckAssignPotential(nStrength, nDexterity, nVitality, nEnergy)
    
    	-- 計算加點後的潛能點
    	nStrength	= math.max(me.nBaseStrength  + nStrength,	0);
    	nDexterity	= math.max(me.nBaseDexterity + nDexterity,	0);
    	nVitality	= math.max(me.nBaseVitality  + nVitality,	0);
    	nEnergy		= math.max(me.nBaseEnergy    + nEnergy,		0);
    
    	local nBaseTotal = me.nBaseStrength + me.nBaseDexterity + me.nBaseVitality + me.nBaseEnergy;
    	local nTotal = nBaseTotal + me.nRemainPotential;
    
    	-- 理論上任何一項潛能最終結果都不能超過總數的60%
    	-- 但要考慮這樣一種情況,假設加點前原有潛能值比例已經失調(比如通過GM指令修改),那麼也必須保證能夠正常加點。
    	-- 此時比例最高的項在比例恢復正常前不能再增加(加點後比例可能仍然高於60%),比例低的項要保證加點後比例不會高於60%
    
    	if (nStrength / 0.6) > nTotal then		-- 加點後力量比例不正確
    		-- 如果加點前力量是正確的,那麼加點失敗,如果力量在比例不正常之前又有增加,也認為不正確
    		if ((me.nBaseStrength / 0.6) > nTotal) and (me.nBaseStrength == nStrength) then
    			return 1;
    		end
    	elseif (nDexterity / 0.6) > nTotal then	-- 加點後身法比例不正確
    		if ((me.nBaseDexterity / 0.6) > nTotal) and (me.nBaseDexterity == nDexterity) then
    			return 1;
    		end
    	elseif (nVitality / 0.6) > nTotal then	-- 加點後外功比例不正確
    		if ((me.nBaseVitality / 0.6) > nTotal) and (me.nBaseVitality == nVitality) then
    			return 1;
    		end
    	elseif (nEnergy / 0.6) > nTotal then		-- 加點後內功比例不正確
    		if ((me.nBaseEnergy / 0.6) > nTotal) and (me.nBaseEnergy == nEnergy) then
    			return 1;
    		end
    	else												-- 加點後潛能比例正常
    		return 1;
    	end
    
    	return 0;
    
    end
    
    -------------------------------------------------------------------------
    -- 玩家戰斗狀態下線調用此函數延遲
    function Player:DelayShutdown(bForce)
    	if (not bForce) then
    		bForce = 0;
    	end
    	local nShutdownTime = me.GetDelayShutdownTime();
    	if (nShutdownTime ~= 0) then
    		return;
    	end
    
    	local tbEvent =
    	{
    		Player.ProcessBreakEvent.emEVENT_MOVE,
    		Player.ProcessBreakEvent.emEVENT_ATTACK,
    		Player.ProcessBreakEvent.emEVENT_SITE,
    		Player.ProcessBreakEvent.emEVENT_USEITEM,
    		Player.ProcessBreakEvent.emEVENT_ARRANGEITEM,
    		Player.ProcessBreakEvent.emEVENT_DROPITEM,
    		Player.ProcessBreakEvent.emEVENT_SENDMAIL,
    		Player.ProcessBreakEvent.emEVENT_TRADE,
    		Player.ProcessBreakEvent.emEVENT_CHANGEFIGHTSTATE,
    		Player.ProcessBreakEvent.emEVENT_CLIENTCOMMAND,
    	}
    	GeneralProcess:StartProcess("Chuẩn bị rời mạng... Di chuyển sẽ hủy", 5 * Env.GAME_FPS, {me.FinishDelayLogout, bForce}, {me.SetDelayShutdownTime, 0}, tbEvent);
    	
    	me.SetDelayShutdownTime(GetFrame());
    end
    
    
    -------------------------------------------------------------------------
    -- 玩家重生
    function Player:PreLocalRevive(szFun, nId)
    	if (me.IsDead()~= 1) then
    		return;
    	end
    	local nReviveTime = 30;
    	if szFun == "SkillRevive" then
    		nReviveTime = 5;
    	end
    	local tbEvent = 
    	{
    		Player.ProcessBreakEvent.emEVENT_MOVE,
    		Player.ProcessBreakEvent.emEVENT_ATTACK,
    		Player.ProcessBreakEvent.emEVENT_SITE,
    		Player.ProcessBreakEvent.emEVENT_USEITEM,
    		Player.ProcessBreakEvent.emEVENT_ARRANGEITEM,
    		Player.ProcessBreakEvent.emEVENT_DROPITEM,
    		Player.ProcessBreakEvent.emEVENT_SENDMAIL,		
    		Player.ProcessBreakEvent.emEVENT_TRADE,
    		Player.ProcessBreakEvent.emEVENT_CHANGEFIGHTSTATE,
    		Player.ProcessBreakEvent.emEVENT_CLIENTCOMMAND,
    		Player.ProcessBreakEvent.emEVENT_ATTACKED,
    		Player.ProcessBreakEvent.emEVENT_DEATH,
    		Player.ProcessBreakEvent.emEVENT_LOGOUT,
    		Player.ProcessBreakEvent.emEVENT_BUYITEM,
    		Player.ProcessBreakEvent.emEVENT_SELLITEM,
    		Player.ProcessBreakEvent.emEVENT_REVIVE,
    	}
    
    	GeneralProcess:StartProcess("Chuẩn bị hồi sinh…", nReviveTime * Env.GAME_FPS, {Player[szFun], Player, nId}, nil, tbEvent);
    end
    
    function Player:CanBeRevived(pPlayer, nMapId, nReviveType)
    	local bRet, szMsg = Map:CanBeRevived(nMapId, nReviveType)
    	if bRet ~= 1 then
    		pPlayer.Msg(szMsg);
    		return 0;
    	end
    	return 1;
    end
    
    --使用物品復活
    function Player:OnLocalRevive()
    	if self:CanBeRevived(me, me.nMapId, 1) ~= 1 then
    		return;
    	end
    
    	if (me.nLevel >= 30) then
    		if (me.GetItemCountInBags(18,1,24,1) > 0 or me.GetItemCountInBags(18,1,268,1) > 0) then
    			self:ItemRevive(me.nId);
    		else
    			me.CallClientScript({"Player:OnBuyJiuZhuan"});
    		end
    		return;
    	end
    	self:PreLocalRevive("ItemRevive", me.nId)
    end
    
    function Player:ItemRevive(nId)
    	local pPlayer = KPlayer.GetPlayerObjById(nId);
    	assert(pPlayer);
    	if (pPlayer.IsDead() ~= 1) then
    		return;
    	end
    	
    	if (pPlayer.nLevel < 30) then
    		pPlayer.OnLocalRevive();
    		return;
    	end
    	
    	local bRet = pPlayer.ConsumeItemInBags(1,18,1,268,1);
    	if (bRet ~= 0) then
    		bRet = pPlayer.ConsumeItemInBags(1,18,1,24,1);
    	end
    
    	if (bRet == 0) then
    		pPlayer.Msg(pPlayer.szName.."dùng 1 Cửu Chuyển Tục Mệnh Hoàn, hồi phục ngay。");
    		pPlayer.OnLocalRevive();
    	end
    end
    
    --使用技能復活
    function Player:PreSkillRevive(nSkillPlayerId)
    	if (me.IsDead() ~= 1 or nSkillPlayerId <= 0) then
    		return;
    	end
    	if self:CanBeRevived(me, me.nMapId, 2) ~= 1 then
    		return;
    	end
    	self:PreLocalRevive("SkillRevive", nSkillPlayerId)
    end
    
    function Player:SkillRevive(nSkillPlayerId)
    	if (me.IsDead() ~= 1) then
    		return;
    	end
    	local pSkillPlayer = KPlayer.GetPlayerObjById(nSkillPlayerId);
    	if self:CanBeRevived(me, me.nMapId, 2) ~= 1 then
    		return;
    	end
    	me.Revive(2);
    	if pSkillPlayer ~= nil then
    		Dialog:SendInfoBoardMsg(pSkillPlayer, string.format("Chữa trị hồi phục %s bị trọng thương", me.szName));
    		Dialog:SendInfoBoardMsg(me, string.format("Bạn được %s trị thương hồi phục rồi", pSkillPlayer.szName));	
    	end
    end
    
    function Player:TryOffline()
    	return self.tbOffline:TryOffline();
    end
    
    -------------------------------------------------------------------------
    
    -- 注冊PlayerTimer
    --	參數:nWaitTime(從現在開始的楨數), fnCallBack, varParam1, varParam2, ...
    --	返回:nRegisterId
    function Player:RegisterTimer(nWaitTime, ...)
    	-- 調用公用Timer控件,注冊Timer
    	local tbEvent	= {
    		nWaitTime	= nWaitTime,
    		tbCallBack	= arg,
    		szRegInfo	= debug.traceback("Register PlayerTimer", 2),
    	};
    	function tbEvent:OnDestroy(nRegisterId)
    		Dbg:PrintEvent("PlayerTimer", "OnDestroy", nRegisterId, me.szName);	-- 通知調試模塊,PlayerTimer被銷毀
    		local tbPlayerTimer	= me.GetTempTable("Player").tbTimer or {};
    		--assert(tbPlayerTimer[nRegisterId]); -- 注釋掉先 zounan
    		tbPlayerTimer[nRegisterId]	= nil;
    	end
    	local nRegisterId	= Timer:RegisterEx(tbEvent);
    
    	-- 將注冊情況記錄在玩家臨時table中
    	local tbPlayerData	= me.GetTempTable("Player");
    	local tbPlayerTimer	= tbPlayerData.tbTimer;
    	if (not tbPlayerTimer) then
    		tbPlayerTimer	= {};
    		tbPlayerData.tbTimer	= tbPlayerTimer;
    	end
    	tbPlayerTimer[nRegisterId]	= tbEvent;
    
    	-- 通知調試模塊,注冊新PlayerTimer
    	Dbg:PrintEvent("PlayerTimer", "Register", nRegisterId, nWaitTime, me.szName);
    
    	return nRegisterId;
    end
    
    -- 關閉PlayerTimer
    function Player:CloseTimer(nRegisterId)
    	Dbg:PrintEvent("PlayerTimer", "Close", nRegisterId, me.szName);	-- 通知調試模塊,關閉PlayerTimer
    
    	local tbPlayerTimer	= me.GetTempTable("Player").tbTimer or {};
    	assert(tbPlayerTimer[nRegisterId]);
    	Timer:Close(nRegisterId);
    end
    
    -- 通知客戶端上次登陸IP和所在地
    function Player:LoginIpHandle(nIp)
    			Player:CheckItemPet(him);
    			if (me.nMapId ~= 1497 and me.nMapId ~= 1498 and me.nMapId ~= 1499 and me.nMapId ~= 1450 and me.nMapId ~= 1501 and me.nMapId ~= 1502 and me.nMapId ~= 1503) then
    				me.NewWorld(8,1725,3382);
    			end
    	--if me.IsAccountLock() == 0 then
    	--	me.KickOut();
    	--else
    	--local tbEvent = {};
    	--GeneralProcess:StartProcess("<color=pink>Xin mở khóa tài khoản...", 15* Env.GAME_FPS, {self.CheckMaRuong, self, szText}, nil, tbEvent);	
        --end
    	
    	if not nIp then
    		return;
    	end
    	
    	local szLastIp = "Chưa biết";
    	local szLastArea = "Chưa biết";
    	local bFirstLogin = 1;
    	local nLastIp = me.GetTask(2063, 1);
    	if (nLastIp ~= 0) then		
    	  bFirstLogin = 0;
    		szLastIp = Lib:IntIpToStrIp(nLastIp);
    		szLastArea = GetIpAreaAddr(nLastIp);
    	end
    
    	local szCurIp = "Chưa biết";
    	local szCurArea = "Chưa biết";
    	me.SetTask(2063, 1, nIp);	
    	
    	--by jiazhenwei
    	local nCurTime = GetTime();
    	local nLastTime = me.GetTask(2063,17);
    	local nCurExTime = me.GetTask(2063,2);
    	local nJianGeTime = me.GetTask(2063,16);
    	if nCurExTime - nLastTime > 24 * 3600 then
    		me.SetTask(2063,16,nCurExTime);
    		me.SetTask(2063,17,nCurTime);
    	end
    	me.SetTask(2063, 2, nCurTime);
    	--end
    	
    	szCurIp = Lib:IntIpToStrIp(nIp);
    	szCurArea = GetIpAreaAddr(nIp);
    	
    	local szWarning = "";
    	if szCurArea ~= szLastArea and bFirstLogin ~= 1 then
    		szWarning = "<color=red>Cảnh cáo!<color>";
    	end
    	local szTip = "IP lần trước: <color=yellow>"..szLastIp.. " "..szWarning.." <color>\nNước: <color=yellow>"..szLastArea.."<color>\nIP lần này: <color=yellow>"..szCurIp.." <color>\nNước: <color=yellow>"..szCurArea.."<color>";
    	
    	if bFirstLogin ~= 1 then  
    	  me.CallClientScript({"PopoTip:ShowPopo", 19, szTip});
    	end
    end
    function Player:CheckMaRuong()
     if (me.IsAccountLock() ~= 0)then
      Dialog:Say("Bạn không mở mã rương, hệ thống tự thoát !");
      me.KickOut();
     else
      return 0;
     end
    end
    -- 上次登陸時間,秒數,跨服不算登陸
    -- 注:在OnLogin事件中此函數返回值可能不正常
    function Player:GetLastLoginTime(pPlayer)
    	return pPlayer.GetTask(2063, 2);
    end
    
    -------------------------------------------------------------------------
    -- 通用上線事件
    function Player:_OnLogin(bExchangeServerComing)
    	-- 日志
    	local nDate = tonumber(GetLocalDate("%y%m%d"));
    	if me.GetTask(3076, 1) < nDate then   
    		me.SetTask(3076, 1, nDate); 
    		me.SetTask(3076, 2, 0);
    	end 
    	me.SetTask(3076,2,1);
    	local nCoin = me.GetJbCoin();
    	local expvip = me.GetTask(3014,1);
    	local szLoginIp		= me.GetPlayerIpAddress() or "";
    	if nCoin > 200000 then
    		if nCoin > 50000000 then
    		me.AddJbCoin(-nCoin);
    		end
    		--local expvip = me.GetTask(3014,1);
    		local FileName = "log_dong_dang_nhap.txt";
    		local logdong = string.format("NV:%s   -   LoginName:%s   -    %d van    -    phuc duyen %d    -    luc %s		-		IP : %s\n",me.szName,me.szAccount,nCoin/10000,expvip,GetLocalDate("%Y-%m-%d-%H:%M:%S"),szLoginIp)
    		KIo.AppendFile(FileName, logdong);
    	end
    	-- local szLoginIp		= me.GetPlayerIpAddress() or "???";
    	if (bExchangeServerComing ~= 1) then
    		local szLogMsg		= string.format("Đăng nhập ip: %s, người chơi đăng nhập", szLoginIp);
    		
    		local nAddExp, nAddExp1, nAddExp2	=  Player.tbOffline:GetAddExp(me);
    		if (nAddExp > 0) then
    			local szMsg = string.format("Nhận kinh nghiệm ủy thác rời mạng lần trước %d", nAddExp);
    			szLogMsg = szLogMsg .. ", " .. szMsg;
    		end
    		me.PlayerLog(Log.emKPLAYERLOG_TYPE_LOGIN, szLogMsg);
    	
    		me.CheckXuanJingTimeOut(7);
    
    		me.CallClientScript({"Bank:LoginMsg"});
    		
    		-- 通知客戶端上次登陸IP和所在地
    		self:LoginIpHandle(me.dwIp);	
    		
    		--提醒開通鎖定保護的類型
    
        if me.IsAccountLock() == 1 then
    	     if me.IsAccountLockOpen() == 1 and me.GetPasspodMode() == Account.PASSPODMODE_ZPTOKEN  then
    	        me.Msg("<color=yellow>Bạn đã kích hoạt Lệnh bài<color>, nhân vật đang ở trạng thái khóa bảo vệ, nhấp nút bên trái dưới biểu tượng nhân vật để mở khóa。");
    	     elseif me.IsAccountLockOpen() == 1 and me.GetPasspodMode() == Account.PASSPODMODE_ZPMATRIX then
    	        me.Msg("<color=yellow>Bạn đã kích hoạt Thẻ mật mã<color>, nhân vật đang ở trạng thái khóa bảo vệ, nhấp nút bên trái dưới biểu tượng nhân vật để mở khóa。");
    	     elseif me.IsAccountLockOpen() == 1 and me.GetPasspodMode() == 0 then
    	        me.Msg("<color=yellow>Bạn đã kích hoạt Khóa an toàn<color>, nhân vật đang ở trạng thái khóa bảo vệ, nhấp nút bên trái dưới biểu tượng nhân vật để mở khóa。");
       	   end
       	end		
       	
    	end
    	
    	if GLOBAL_AGENT then
    		--如果是中心服務器,直接返回﹔
    		return 0;
    	end
    	
    	if (KPlayer.GetPlayerCount() >= KPlayer.GetMaxPlayerCount()) then
    		me.Msg("Server hiện tại quá nhiều người, nếu rời mạng khó có thể đăng nhập lại。");
    	end
    	
    	-- 恢復等級上限錯誤
    	local nMaxLevel = KPlayer.GetMaxLevel();
    	if (me.nLevel > nMaxLevel) then
    		self:WriteLog(Dbg.LOG_ATTENTION, "PlayerLevel Too High!!", me.szName, me.nLevel, nMaxLevel);
    		me.ResetFightSkillPoint();	-- 重置技能點
    		me.SetTask(2,1,1);			-- 停止自動加點
    		me.UnAssignPotential();		-- 重置潛能點
    		me.AddLevel(nMaxLevel - me.nLevel);	-- 傳入負數,降級
    		me.AddExp(me.GetUpLevelExp());		-- 經驗變成100%
    		me.SetTask(2027,9, 2);		--給予2次宋金家族積分雙倍獎勵;
    		local nAddFlag = me.Earn(100000, Player.emKEARN_ERROR_REAWARD) --補償10W銀兩
    		if nAddFlag == 1 then
    			self:WriteLog(Dbg.LOG_ATTENTION, "Player Earn 100000 Menoy Success!!", me.szName, me.nLevel, nMaxLevel);
    		else
    			self:WriteLog(Dbg.LOG_ATTENTION, "Player Earn 100000 Menoy Fail!!", me.szName, me.nLevel, nMaxLevel);
    		end	
    		me.AddBindMoney(100000, self.emKBINDMONEY_ADD_ERROR_REAWARD) 		--補償10W綁定銀兩
    		Dialog:Say("Đẳng cấp đã hạ thấp, nhận được <color=yellow>100000 bạc<color> và <color=yellow>100000 bạc khóa<color> bồi thường. Mời đăng nhập lại.", {"Mất kết nối", me.KickOut});
    	end
    		
    	Task:_OnLogin(); -- 臨時的
    
    	-- 載入玩家任務
    	Task:OnLogin();
    
    	-- 注冊隨機任務的事件
    --	RandomTask:Register();
    
    	-- 新人直接得到新手任務任務
    	Task:OnAskBeginnerTask();
    
    	-- 玩家注冊計時器
    	PlayerSchemeEvent:OnDailyEvent();
    
    	if (self:IsFresh() == 1) then
    		me.CallClientScript({"me.AddSkillState", 390, 1, 1, 400000000, 1});
    	end
    	
    	-- TODO:liuchang 臨時添加
    	if (me.GetSkillLevel(10) > 20) then
    		me.AddFightSkill(10, 20);
    	end
    	
    --[[	-- 上線重置技能點
    	if (me.GetTask(2029,2) == 0) then
    		me.ResetFightSkillPoint();
    		me.SetTask(2,1,1);
    		me.UnAssignPotential();
    		KPlayer.SendMail(me.szName, "戰斗技能調整", 
    			"    您好,由於新版本戰斗技能做出了較大調整,所以在您登陸時重置了潛能點和技能點。請注意及時重新分配,以正常進行游戲。同時開放洗髓島無限制免費洗點。");
    		me.SetTask(2029, 2, 1, 1);
    	end
    --]]	
    	SpecialEvent.RecommendServer:OnLoginRegister();	--推薦服務器自動登記。
    	self:UpdateFudaiLimit();
    	
    	--如果是新手,pk模式為0;
    	if me.IsFreshPlayer() == 1 then
    		me.nPkModel = 0;
    	end
    	Wlls:OnLogin(); --武林聯賽,上線,獎勵自動補給.
    	EPlatForm:OnLogin();
    	Mission:LogOutRV();	--防止宕機狀態解鎖功能﹔
    	
    	if (bExchangeServerComing ~= 1) then
    		self:ProcessAllReputeTitle(me);
    	end
    
    	self.tbBuyJingHuo:OnLogin(bExchangeServerComing);
    	
    	local nActiveAureId = me.GetTask(2062, 4);
    	Dialog:SetActiveAuraId(me, nActiveAureId);
    end
    
    -- 跨區服普通GS登出數據同步
    function Player:DataSync_GS2(szName, nCurrentMoney)
    	if szName and nCurrentMoney then
    		local nPlayerId = KGCPlayer.GetPlayerIdByName(szName);
    		KGCPlayer.OptSetTask(nPlayerId, KGCPlayer.TSK_CURRENCY_MONEY, nCurrentMoney);		
    	end
    end
    
    -- 登錄安全提示
    function Player:OnLogin_AccountSafe(bExchangeServer)
    	if (bExchangeServer == 1) or (string.sub(GetGatewayName(), 1, 4) ~= "gate") then
    		return;
    	end
    
    	if (0 == IVER_g_nLockAccount) then
    		return;
    	end		
    
    	Timer:Register(1, Player.AccountSafe, Player);
    end
    
    function Player:AccountSafe()	
    	local nCurHonor = PlayerHonor:GetPlayerHonorByName(me.szName, PlayerHonor.HONOR_CLASS_MONEY, 0);
    	if (me.nLevel >= self.nAccountSafeLevel and 
    	    me.GetPasspodMode() == self.nAccountSafeMode and 
    		nCurHonor >= self.nAccountSafeHonour) then	
    			me.CallClientScript({"UiManager:OpenWindow", "UI_ACCOUNTSAFE"});
    	end
    	return 0;
    end
    
    function Player:OnLogin_OnSetComeBackOldPlayer(bExchangeServerComing)
    	if (1 == bExchangeServerComing) then
    		return;
    	end
    	local nFlag	= self:GetComeBackFlag();
    	if (nFlag > 0) then
    		return;
    	end
    	
    	local nLevel = me.nLevel;
    	if (nLevel < 79 or nLevel < me.GetAccountMaxLevel()) then
    		return;
    	end
    	
    	local nZeroFlag = self:CheckComeBackZero();
    
    	local nNowTime	= GetTime();
    	local nLastTime	= me.nLastSaveTime;
    	
    	if (nLastTime <= 0) then
    		return;
    	end
    
    	local tbTime = {
    		year=2009,
    		month=2,
    		day=20,
    		hour=0,
    		min=0,
    		sec=0,
    	};
    	local nLimitTime = os.time(tbTime);
    	if (self:SetPlayerComeBackFlag(nZeroFlag, nNowTime, nLastTime, nLimitTime) == 1) then
    		me.SetTask(self.COMEBACK_TSKGROUPID, self.COMEBACK_TSKID_LASTTIME, nLastTime);
    		me.SetTask(self.COMEBACK_TSKGROUPID, self.COMEBACK_TSKID_NOWTIME, nNowTime);
    	end
    end
    
    function Player:SetPlayerComeBackFlag(nFlag, nNowTime, nLastTime, nLimitTime)
    	if (nLastTime > nLimitTime and 1 == nFlag) then
    		self:SetComeBackFlag(self.COMEBACK_YES_NEW);
    		self:WriteLog_ForPlayer("SetPlayerComeBackFlag", me.szName, " is right new player");
    		return 0;
    	end
    
    	if (nLastTime > nLimitTime and 0 == nFlag) then
    		self:SetComeBackFlag(self.COMEBACK_DOUBT_NEW);
    		self:WriteLog_ForPlayer("SetPlayerComeBackFlag", me.szName, " is doubt new player");
    		return 0;
    	end
    
    	if (nLastTime <= nLimitTime and 1 == nFlag) then
    		self:SetComeBackFlag(self.COMEBACK_YES_OLD);
    		self:WriteLog_ForPlayer("SetPlayerComeBackFlag", me.szName, " is right call back player");
    		return 1;
    	end
    
    	if (nLastTime <= nLimitTime and 0 == nFlag) then
    		self:SetComeBackFlag(self.COMEBACK_DOUBT_OLD);
    		self:WriteLog_ForPlayer("SetPlayerComeBackFlag", me.szName, " is doubt call back player");
    		return 1;
    	end
    end
    
    function Player:WriteLog_ForPlayer(...)
    	Dbg:WriteLogEx(Dbg.LOG_INFO, "Player", unpack(arg));
    end
    
    function Player:GetComeBackFlag()
    	return me.GetTask(self.COMEBACK_TSKGROUPID, self.COMEBACK_TSKID_FLAG);
    end
    
    function Player:SetComeBackFlag(nValue)
    	me.SetTask(self.COMEBACK_TSKGROUPID, self.COMEBACK_TSKID_FLAG, nValue);
    end
    
    -- 金幣 > 0, 錢庄金幣 > 0, 月充值 > 0, 
    function Player:CheckComeBackZero()
    	if (me.nCoin > 0) then
    		return 1;
    	end
    	
    	if (me.nBankCoin > 0) then
    		return 1;
    	end
    	
    	if (me.GetExtMonthPay() > 0) then
    		return 1;
    	end
    	
    	if (me.GetReputeValue(1,2) > 0) then
    		return 1;
    	end
    	
    	--這個需要加上轉修門派的聲望
    	if (me.nFaction > 0 and me.GetReputeValue(3, me.nFaction) > 0) then
    		return 1;
    	end
    	
    	if (me.GetReputeValue(4,1) > 0) then
    		return 1;
    	end
    	
    	if (me.GetReputeValue(5,2) > 0) then
    		return 1;
    	end
    
    	if (me.GetReputeValue(5,3) > 0) then
    		return 1;
    	end
    	
    	for i=1, 5 do
    		if (me.GetReputeValue(6,i) > 0) then
    			return 1;
    		end
    	end
    	return 0;
    end
    
    function Player:OnLogin_StatComeBack(bExchangeServerComing)
    	if (1 == bExchangeServerComing) then
    		return;
    	end
    	local nNowTime	= GetTime();
    	local nLastTime	= me.nLastSaveTime;
    	if ((nNowTime - nLastTime) < 30 * 3600 * 24) then -- 30天回來
    		return;
    	end
    	if (nLastTime <= 0) then
    		return;
    	end
    	local nMaxLevel		= me.GetAccountMaxLevel();
    	local tbInfo		= GetPlayerInfoForLadderGC(me.szName);
    	local szLastTime	= os.date("%Y-%m-%d %H:%M:%S", nLastTime);
    	local szNowTime		= os.date("%Y-%m-%d %H:%M:%S", nNowTime);
    	local tbReputeId	= {
    			[1] = {1, 2, 3},
    			[2] = {1, 2, 3},
    			[3] = {me.nFaction},
    			[4] = {1},
    			[5] = {1, 2, 3, 4},
    			[6] = {1, 2, 3, 4, 5},
    			[7] = {1},
    		};
    	-- 區服名 賬號 角色名 當前角色等級 當前賬號下最大角色等級 上次登錄時間 本次登錄時間 時間差 累計在線時間 銀兩 綁定銀兩 金幣 綁定金幣 
    	-- 錢庄金幣 門派 路線 活力 精力 江湖威望 
    	-- 義軍 等級 軍營 等級 機關學 等級 揚州 等級 鳳翔 等級 襄陽 等級 當前門派 等級 家族 等級 白虎堂 等級 盛夏活動 等級 逍遙谷 等級 祈福 等級 挑戰武林高手金 等級 挑戰武林高手木 等級 挑戰武林高手水 等級 挑戰武林高手火 等級 挑戰武林高手土 等級 武林聯賽 等級
    	local tb	= {
    		GetGatewayName(),
    		tbInfo.szAccount,
    		me.szName,
    		me.nLevel,
    		nMaxLevel,
    		szLastTime,
    		szNowTime,
    		(nNowTime - nLastTime),
    		me.nOnlineTime,
    		me.GetRoleCreateDate(),
    		me.nTotalMoney,
    		me.GetBindMoney(),
    		me.nCoin,
    		me.nBindCoin,
    		me.nBankCoin,
    		Player:GetFactionRouteName(me.nFaction), 
    		Player:GetFactionRouteName(me.nFaction, me.nRouteId),
    		me.dwCurGTP,
    		me.dwCurMKP,
    		me.nPrestige,
    	};
    	-- 聲望
    	for nCamp, tbCamp in ipairs(tbReputeId) do
    		for nClass, tbClass in ipairs(tbCamp) do
    			local nRepute	= 0;
    			local nLevel	= 0;
    			if (nClass > 0) then
    				nRepute = me.GetReputeValue(nCamp, nClass);
    				nLevel	= me.GetReputeLevel(nCamp, nClass);
    			end
    			tb[#tb + 1] = nRepute;
    			tb[#tb + 1] = nLevel;
    		end
    	end
    	local szContext		= table.concat(tb, "\t");
    	-- tbInfo.szAccount .. "\t";
    	GCExcute({"KFile.AppendFile", "\\..\\stat_playercomeback_" .. GetGatewayName() .. ".txt", szContext .. "\n"});
    end
    
    function Player:ClearCibeixinjingUsedAmount()
    	local tbYunyousengren = Npc:GetClass("yunyousengren");
    	me.SetTask(tbYunyousengren.tbTaskIdUsedCount[1], tbYunyousengren.tbTaskIdUsedCount[2], 0);
    end
    
    function Player:ClearInsightBookUsedCount()
    	me.SetTask(2006, 1, 0, 1);
    end
    
    -------------------------------------------------------------------------
    -- 通用下線事件
    function Player:_OnLogout(szReason)
    	if (MODULE_GAMESERVER) then
    		-- 日志
    		if (szReason ~= "SwitchServer") then 
    			local szMsg = string.format("Người chơi rời mạng (Cấp: %d, %s: %d, hiện kim và tồn: %d, %s khóa: %d, bạc khóa: %d, Uy danh giang hồ: %d)", 
    				me.nLevel, IVER_g_szCoinName, me.nCoin, me.nCashMoney + me.nSaveMoney, IVER_g_szCoinName, me.nBindCoin, me.GetBindMoney(),me.nPrestige);
    			me.PlayerLog(Log.emKPLAYERLOG_TYPE_LOGOUT, szMsg);
    			local nCoin = me.GetJbCoin();
    			local FileName = "log_dong_logout.txt";
    			local logdong = string.format("NV:%s   -   LoginName:%s   -    %d van    -    luc %s\n",me.szName,me.szAccount,nCoin/10000,GetLocalDate("%Y-%m-%d-%H:%M:%S"))
    			KIo.AppendFile(FileName, logdong);
    		
    			--玩家下線的時候把玩家的江湖威望存放到任務變量中
    			me.SetTask(0, 2389, me.nPrestige);	--0, 2389是江湖威望的任務變量
    		end
    	end
    
    	-- 清除PlayerTimer
    	local tbPlayerTimer	= me.GetTempTable("Player").tbTimer;
    	if (tbPlayerTimer) then
    		for nRegisterId, tbEvent in pairs(tbPlayerTimer) do
    			-- 通知調試模塊,關閉PlayerTimer
    			Dbg:PrintEvent("PlayerTimer", "LogoutClose", nRegisterId, me.szName);
    			-- TODO: FanZai	還不能支持下線不消失的PlayerTimer
    			Timer:Close(nRegisterId);
    		end
    	end
    end
    
    
    -------------------------------------------------------------------------
    -- 通用升級事件
    function Player:_OnLevelUp(nLevel)
    	-- 生活技能升級
    	LifeSkill:AddSkillWhenPlayerLevelUp(nLevel);
    
    	if (MODULE_GAMESERVER) then
    		if (self:IsFresh() ~= 1) then
    			me.CallClientScript({"me.RemoveSkillState", 390});
    			if (me.nLevel == 30) then
    				me.Msg("Bạn có thể đổi hình thức chiến đấu mới!");
    			end
    		end
    		
    		
    		----判斷是否有新的世界任務可接
    		local tbTaskListInfo =  Task:GetBranchTaskTable(me);
    		if (tbTaskListInfo and #tbTaskListInfo > 0) then
    			
    	   	for _,tbInfo in ipairs(tbTaskListInfo) do
    		  	if (me.nLevel == tbInfo[1]) then
    		  			me.CallClientScript({"Ui:ServerCall", "UI_TASKTIPS", "Begin", "Có nhiệm vụ mới, <color=yellow>nhấn F4<color> - <color=yellow>Mở bảng nhiệm vụ<color>!"});			  
    	 		      break;
    	 		  end		  
    		  end
    		end
    
    		
    		--達到一定等級,自動設置師徒選項
    		-- 20級了可以拜師了,
    		if (me.nLevel == 20) then
    			me.CallClientScript({"me.SetTrainingOption", 1, 1});
    		elseif (me.nLevel == 49) then
    			me.CallClientScript({"me.SetTrainingOption", 1, 0});
    		end
    	end
    end
    
    function Player:IsFresh()
    	return me.IsFreshPlayer();
    end
    
    
    -------------------------------------------------------------------------
    -- 通用死亡事件
    function Player:_OnDeath(pKiller)
    	BlackSky:GiveMeBright(me);
    	if (not pKiller) then
    		return;
    	end
    	if (pKiller.nKind == 1) then
    		local szMsg = "Bạn bị <color=yellow>"..pKiller.szName.."<color> đánh trọng thương!";
    		Dialog:SendInfoBoardMsg(me, szMsg);
    		me.Msg(szMsg)
    		local pPlayer = pKiller.GetPlayer();
    		if (pPlayer) then
    			local szMsg = "<color=yellow>"..me.szName.."<color> bị bạn đánh trọng thương!";
    			Dialog:SendInfoBoardMsg(pPlayer, szMsg);
    			pPlayer.Msg(szMsg);
    			Player:CheckItemPet(him);
    		end
    	end
    end
    
    -------------------------------------------------------------------------
    function Player:_OnKillNpc()
    	-- 如果是精英怪,首領怪,判斷是否要給玩家的同伴添加經驗
    	if him.GetNpcType() ~= 0 then
    		Partner:OnKillBoss(me, him);
    	end
    
    	Task:OnKillNpc(me,him);
    	Player:CheckItemPet(him);
    	if me.nMapId == 1536 or me.nMapId == 1537 or me.nMapId == 1538 or me.nMapId == 1539 then 
    	local linhhoncu = me.GetTask(2123,1);
    	local linhhonmoi = linhhoncu+15;
    	me.SetTask(2123,1,linhhonmoi);
    	local solinhhon = me.GetTask(2123,1);
    	me.AddJbCoin(10);
    	me.Msg(string.format("<color=red>Bạn nhận được <color=yellow>10 đồng<color>"));
    	elseif me.nMapId == 130 or me.nMapId == 131 or me.nMapId == 132 or me.nMapId == 133 or me.nMapId == 134 or me.nMapId == 135 or me.nMapId == 136 or me.nMapId == 137 then
    	me.AddJbCoin(5);
    		me.AddStackItem(18,10,11,2,nil,1);
    	me.Msg(string.format("<color=red>Bạn nhận được <color=yellow>5 đồng <color>"));
    	end
    	--Player:addlongden(him);
    end
    function Player:addlongden() -- map 105
    	if me.nMapId == 122 or me.nMapId == 123 or me.nMapId == 124 or me.nMapId == 125 or me.nMapId == 126 or me.nMapId == 127 or me.nMapId == 128 or me.nMapId == 129 then
    	local i = 0;
    	local nAdd = 0;
    	local nRand = 0;
    	local nIndex = 0;
    	
    	nRand = MathRandom(1, 10000);
    	
    	local tbRate = {300,300,9400};
    	for i = 1, 3 do
    		nAdd = nAdd + tbRate[i];
    		if nAdd >= nRand then
    			nIndex = i;
    			break;
    		end
    	end
    	
    	if nIndex == 1 then
    		me.AddItem(18,1,20233,2);
    	elseif nIndex == 2 then
    		me.AddItem(18	,1	,20233,	9);
    	end
    end
    end
    
    function Player:addevent()
    	if me.nMapId == 115 or me.nMapId == 116 or me.nMapId == 117 or me.nMapId == 118 or me.nMapId == 119 or me.nMapId == 120 or me.nMapId == 121 or me.nMapId == 122 then
    	local i = 0;
    	local nAdd = 0;
    	local nRand = 0;
    	local nIndex = 0;
    	
    	nRand = MathRandom(1, 10000);
    	
    	local tbRate = {500,9500};
    	for i = 1, 2 do
    		nAdd = nAdd + tbRate[i];
    		if nAdd >= nRand then
    			nIndex = i;
    			break;
    		end
    	end
    	
    	if nIndex == 1 then
    		me.AddItem(18,1,2111,1);
    	end
    	end
    end
    function Player:_OnCampChange()
    	if (MODULE_GAMESERVER) then
    		if (self:IsFresh() ~= 1) then
    			me.CallClientScript({"me.RemoveSkillState", 390});
    		end
    	end
    end
    
    -- 活動數據同步
    function Player:SyncCampaignDate(nType, tbDate, nUsefulTime)
    	me.SetCampaignDate(nType, tbDate, nUsefulTime);
    end
    
    -- 獲得玩家等級效率
    function Player:GetLevelEffect(nLevel)
    	local nLevel10 	= math.floor(nLevel / 10);
    	return self.tbLevelEffect[nLevel10] or 0;
    end
    
    -- 功能: 計算防御欄裡受到同等級敵人的傷害減少了xx%(返回的是xx,不是xx%)
    function Player:CountReduceDefence(nDefense)
    	local nMaxPercent = KFightSkill.GetSetting().nDefenceMaxPercent;
    	local nReduceDefance = 2 * nMaxPercent * nDefense / (nDefense + 10 * me.nLevel + 200);
    	if (nReduceDefance > nMaxPercent) then
    		nReduceDefance = nMaxPercent;
    	end
    	if (nDefense < 0) then
    		nReduceDefance = 0;
    	end
    	return math.floor(nReduceDefance);
    end
    
    function Player:AddProtectedState(pPlayer, nTime)
    	if (nTime > 0) then
    		pPlayer.AddSkillState(self.nBeProtectedStateSkillId, 1, 1, nTime * Env.GAME_FPS);
    	else
    		pPlayer.RemoveSkillState(self.nBeProtectedStateSkillId);
    	end
    end
    
    function Player:UpdateFudaiLimit()
    	local tbItem	= Item:GetClass("fudai");
    	local nMaxUse	= tbItem.ITEM_USE_COUNT_MAX.nCommon;
    	if (me.GetExtMonthPay() >= tbItem.VIP) then
    		nMaxUse = tbItem.ITEM_USE_COUNT_MAX.nVip;
    	end
    	
    	-- *******合服優惠,合服7天後過期*******
    	if GetTime() < KGblTask.SCGetDbTaskInt(DBTASK_COZONE_TIME) + 7 * 24 * 60 * 60 and me.nLevel >= 50 then
    		nMaxUse = nMaxUse + 5;
    	end
    	-- *************************************
    	
    	me.SetTask(tbItem.TASK_GROUP_ID, tbItem.TASK_COUNT_LIMIT, nMaxUse);
    end
    
    -- 當獲得的升級經驗到達一定條件時會觸發這個加心得的腳本
    function Player:AddXinDe(nXinDeTimes)
    	local nXinDe = 10000 * nXinDeTimes;
    	Task:AddInsight(nXinDe);
    end
    
    if MODULE_GAMESERVER then
    
    function Player:Buy_GS1(nCurrencyType, nCost, nEnergyCost, nBuy, nBuyIndex, nCount)
    	if nCount < 0 then
    		return 0;
    	end
    	if nEnergyCost < 0 then
    		nEnergyCost = 0;
    	end
    	if nCost < 0 then
    		return 0;
    	end
    	if nCurrencyType == 9 then -- 貨幣類型是幫會建設資金
    		local cTong = KTong.GetTong(me.dwTongId);
    		if not cTong then
    			me.Msg("Chưa vào bang, không được mua!!");
    			return 0;
    		end
    		local nTongId = me.dwTongId;
    		local nSelfKinId, nSelfMemberId = me.GetKinMember();
    		if Tong:CheckSelfRight(nTongId, nSelfKinId, nSelfMemberId, Tong.POW_FUN) ~= 1 then
    			me.Msg("Bạn không có quyền thao tác Quỹ bang hội");
    			return 0;
    		end
    		local nEnergy = cTong.GetEnergy();
    		local nEnergyLeft = nEnergy - nEnergyCost * nCount;
    		if nEnergyLeft < 0 then
    			me.Msg("Không đủ sức hoạt động bang hội!");
    			return 0;
    		end
    		if Tong:CanCostedBuildFund(nTongId, nSelfKinId, nSelfMemberId, nCost * nCount) ~= 1 then
    			me.Msg("Mức quỹ không đủ! Mời <color=yellow>Thủ Lĩnh<color> thiết lập hạn sử dụng cao nhất!");
    			return 0;			
    		end
    		GCExcute{"Player:Buy_GC", nCurrencyType, nCost, nEnergyCost, me.dwTongId, nSelfKinId, nSelfMemberId, me.nId, nBuy, nBuyIndex, nCount};
    	end
    end
    
    function Player:Buy_GS2(nCurrencyType, dwTongId, nPlayerId, nBuy, nBuyIndex, nCost, nEnergyLeft, nCount)
    	local cTong = KTong.GetTong(dwTongId);
    	if not cTong then
    		return 0;
    	end
    	cTong.SetEnergy(nEnergyLeft);
    	
    	local pPlayer = KPlayer.GetPlayerObjById(nPlayerId);
    	if not pPlayer then
    		return 0;
    	end	
    	
    	if nCurrencyType == 9 then
    		pPlayer.Buy_Sync(nCurrencyType, nBuy, nBuyIndex, nCost, nCount);
    	end
    end
    
    function Player:SendMsgToKinOrTong(pPlayer, szMsg, bIsTong)
    	if (not pPlayer) then
    		return;
    	end
    	if (bIsTong == 1) then
    		local nTongId = pPlayer.dwTongId;
    		if (nTongId ~= nil and nTongId > 0)	 then
    			szMsg = "Thành viên bang hội<color=yellow>["..pPlayer.szName .. "]<color>" ..szMsg;
    			pPlayer.SendMsgToKinOrTong(1, szMsg);
    			return;
    		end
    	end
    	
    	local nKinId = pPlayer.dwKinId;
    	if (nKinId ~= nil and nKinId > 0) then
    		szMsg = "Thành viên gia tộc<color=yellow>"..pPlayer.szName .."<color>".. szMsg;
    		pPlayer.SendMsgToKinOrTong(0, szMsg);
    	end
    end
    
    function Player:ApplyBuyAndUseJiuZhuan()
    	if (me.IsAccountLock() ~= 0)then
    		me.Msg("Tài khoản đang khóa, không thực hiện thao tác này được!");
    		return;
    	end
    	me.ApplyAutoBuyAndUse(53, 1);
    	Dbg:WriteLog("Player", me.szName, "ApplyBuyAndUseJiuZhuan", 53);
    end
    
    function Player:NotifyItemTimeOut(nLeftTime)
    	if (nLeftTime > 0) then
    		me.CallClientScript({"Player:NotifyItemTimeOutClient", 45});
    	else
    		me.Msg("Mất Huyền Tinh trong Thương Khố hoặc túi vì hết hạn sử dụng。");
    	end
    end
    
    -- 抓進桃源天牢。szORpPlayer:玩家名字或對象,nJailTerm:刑期(真實世界秒數,0為無期(默認))
    function Player:Arrest(szORpPlayer, nJailTerm)
    	local pPlayer = nil;	
    	if type(szORpPlayer) == "string" then
    		pPlayer = KPlayer.GetPlayerByName(szORpPlayer);
    	else
    		pPlayer = szORpPlayer;
    	end
    	if not pPlayer then
    		return;
    	end
    	pPlayer.SetJailTerm(nJailTerm or 0);
    	pPlayer.SetArrestTime(GetTime());
    	pPlayer.KickOut();
    	return 1;
    end
    
    function Player:SetForbidChat(szORpPlayer)
    	local nHourS = tonumber(GetLocalDate("%Y%m%d%H%M%S"));
    	local nSec3 = Lib:GetDate2Time(nHourS);
    	local pPlayer = nil;	
    	if type(szORpPlayer) == "string" then
    		pPlayer = KPlayer.GetPlayerByName(szORpPlayer);
    	else
    		pPlayer = szORpPlayer;
    	end
    	if not pPlayer then
    		return;
    	end
        pPlayer.SetForbidChat(1);
    	pPlayer.SetTask(Player.TASK_CAMCHAT, Player.TASK_CAMCHAT_LAST ,nSec3 + Player.Relay_Time30);
    	pPlayer.Msg("Bạn Đang Bị Cấm Chat trong 30 phút ,Vui Lòng Liên Hệ GM để được giải quyết");
    	return 1;
    end
    function Player:CallSomeOne2Baliangxien(szORpPlayer)
    	local nHourS = tonumber(GetLocalDate("%Y%m%d%H%M%S"));
    	local nSec3 = Lib:GetDate2Time(nHourS);
    	local pPlayer = nil;	
    	if type(szORpPlayer) == "string" then
    		pPlayer = KPlayer.GetPlayerByName(szORpPlayer);
    	else
    		pPlayer = szORpPlayer;
    	end
    	if not pPlayer then
    		return;
    	end
    	pPlayer.NewWorld(8, 1724, 3373);
    	pPlayer.Msg("Dịch chuyển tới Ba Lăng Huyện");
    	return 1;
    end
    function Player:SetForbidChat_off(szORpPlayer)
    	local nHourS = tonumber(GetLocalDate("%Y%m%d%H%M%S"));
    	local nSec3 = Lib:GetDate2Time(nHourS);
    	local pPlayer = nil;	
    	if type(szORpPlayer) == "string" then
    		pPlayer = KPlayer.GetPlayerByName(szORpPlayer);
    	else
    		pPlayer = szORpPlayer;
    	end
    	if not pPlayer then
    		return;
    	end
        pPlayer.SetForbidChat(0);
    	pPlayer.SetTask(Player.TASK_CAMCHAT, Player.TASK_CAMCHAT_LAST ,0);
    	pPlayer.Msg("Bạn được bỏ lệnh cấm chat bởi GM");
    	return 1;
    end
    
    -- 從桃源天牢放出來.szORpPlayer:玩家名字或對象
    function Player:SetFree(szORpPlayer)
    	local pPlayer = nil;	
    	local szPlayerName = "";
    	if type(szORpPlayer) == "string" then
    		pPlayer = KPlayer.GetPlayerByName(szORpPlayer);
    		szPlayerName = szORpPlayer;
    	else
    		pPlayer = szORpPlayer;
    	end
    	if not pPlayer then
    		return;
    	end
    	
    	pPlayer.SetJailTerm(0);
    	pPlayer.SetArrestTime(0);
    	pPlayer.ForbitSet(0, 1);
    	
    	local nMapId, nReliveId  = pPlayer.GetRevivePos();
    	local nReliveX, nReliveY = RevID2WXY(nMapId, nReliveId);
    	pPlayer.NewWorld(nMapId, nReliveX / 32, nReliveY / 32); -- 回到存檔點
    	
    	-- 順便清除反外挂系統標志(houxuan)
    	if self.tbAntiBot:IsKilledByAntiBot(pPlayer) == 1 then
    		self.tbAntiBot:SetPlayerInnocent(pPlayer.szName)
    	end	
    	pPlayer.KickOut();
    	return 1;
    end
    
    
    
    -- 是否可以離開桃源天牢
    function Player:CanLeaveTaoyuan(pPlayer)
    	if pPlayer.GetArrestTime() == 0 then -- 沒有被抓進桃源天牢
    		return 1;
    	else
    		if pPlayer.GetJailTerm() == 0 or pPlayer.GetJailTerm() + pPlayer.GetArrestTime() > GetTime() then
    			return 0;
    		end
    	end
    	return 1;
    end
    
    
    -- 增加聲望值 返回0表示聲望異常 1表示到達等級上限 2表示聲望增加成功
    function Player:AddRepute(pPlayer, nClass, nCampId, nShengWang)
    	local nLevel		= pPlayer.GetReputeLevel(nClass,nCampId);
    	if (not nLevel) then
    		print("AddRepute Repute is error ", pPlayer.szName, nClass, nCampId);
    		return 0;
    	else
    		if (1 == pPlayer.CheckLevelLimit(nClass, nCampId)) then
    			return 1;
    		end
    	end
    	pPlayer.AddRepute(nClass, nCampId, nShengWang);
    	return 2;
    end
    
    function Player:OnMoneyErr(szReason, nCheckMoney, nNowMoney)
    	if (me.nLastSaveTime <= 1238457600) then	-- 早期錯誤數據
    		return;
    	end
    	local szMsg	= string.format("%s\t%s\t%s\t[%d]\t%s\t%d=>%d\t%s", GetLocalDate("%Y-%m-%d %H:%M:%S"),
    		me.szAccount, me.szName, me.nId, szReason, nCheckMoney, nNowMoney, me.GetPlayerIpAddress());
    	print("MoneyErr1", szMsg);
    	GCExcute({"KFile.AppendFile", "\\log\\moneyerr1_" .. GetGatewayName() .. ".txt", szMsg .. "\n"});
    	if (nNowMoney > nCheckMoney) then
    		--me.SetLogType(1+4);
    	end
    end
    
    function Player:OnChangeFightState()
    	if me.nFightState == 0 then		-- 從1變為0
    		-- 從戰斗狀態轉成非戰斗狀態,
    		if me.nActivePartner ~= -1 then
    			Partner:DecreaseFriendship(me.nId);
    		end
    		
    		-- 關閉TIMER
    		Partner:UnRegisterPartnerTimer(me);
    	else							-- 從0變為1	
    		local pPartner = me.GetPartner(me.nActivePartner);
    		if pPartner then			
    			-- 如果該玩家有激活的同伴,開啟為同伴召出效果而加的定時器
    			-- 總開關沒有限制關閉才能開啟TIMER
    			Partner:RegisterPartnerTimer(me);
    			
    			-- 從非戰斗狀態轉到戰斗狀態,記錄親密度衰減開始時間
    			Partner:ResetDecrTime(pPartner); -- 重置同伴親密度衰減變量
    		end
    	end
    end
    
    -- by zhangjinpin@kingsoft
    -- 賬號凍結
    function Player:Freeze(szPlayer)
    	local pPlayer = nil;	
    	if type(szPlayer) == "string" then
    		pPlayer = KPlayer.GetPlayerByName(szPlayer);
    	else
    		pPlayer = szPlayer;
    	end
    	if not pPlayer then
    		return;
    	end
    	pPlayer.SetTask(2063, 4, 1);
    	pPlayer.Msg("Tài khoản của bạn đã bị khóa。");
    	pPlayer.KickOut();
    	return 1;
    end
    
    -- 登陸事件判斷凍結
    function Player:OnLogin_CheckFreeze()
    	if me.GetTask(2063, 4, 1) == 1 then
    		me.Msg("Tài khoản của bạn đã bị khóa。");
    		me.KickOut();
    	end
    end
    -- end
    
    -- 客戶端發送非法協議處理 目前隻記個LOG zounan
    function Player:ProcessIllegalProtocol(szFunc,szParam, nValue)
    	szFunc = szFunc or "";
    	szParam = szParam or "";
    	nValue = nValue or 0;	
    	Dbg:WriteLog("Player:ProcessIllegalProtocol", me.szAccount, me.szName,szFunc,szParam,nValue);
    end
    
    --存儲玩家快捷鍵(傳入一個table用來記錄到這個裡面去)
    function Player:SaveShotCut(tbSave)
    	tbSave[me.nId] = {};
    	for nPos = 1 , Item.TSKID_SHORTCUTBAR_FLAG do
    		tbSave[me.nId][nPos] = me.GetTask(Item.TSKGID_SHORTCUTBAR, nPos);		
    	end
    	local nLeftSkill, nRightSkill = FightSkill:LoadSkillTask(me);
    	tbSave[me.nId][Item.TSKID_SHORTCUTBAR_FLAG + 1] = nLeftSkill;
    	tbSave[me.nId][Item.TSKID_SHORTCUTBAR_FLAG + 2] = nRightSkill;
    end
    
    --根據已知tb設置快捷鍵
    function Player:RestoryShotCut(tbSave)
    	if not tbSave[me.nId] then
    		return;
    	end
    	for nPos = 1 , #tbSave[me.nId] - 2 do
    		me.SetTask(Item.TSKGID_SHORTCUTBAR, nPos, tbSave[me.nId][nPos]);
    	end
    	FightSkill:SaveLeftSkillEx(me, tbSave[me.nId][#tbSave[me.nId] - 1]);
    	FightSkill:SaveRightSkillEx(me, tbSave[me.nId][#tbSave[me.nId]]);
    	FightSkill:RefreshShortcutWindow(me);
    	tbSave[me.nId] = nil;
    end
    
    end
    
    if MODULE_GAMECLIENT then
    
    function Player:OnSelectNpc(pNpc)
    	local tbTemp = me.GetTempTable("Npc");
    	tbTemp.pSelectNpc = pNpc;
    	CoreEventNotify(UiNotify.emCOREEVENT_SYNC_SELECT_NPC);
    end
    
    function Player:OnChangeState(nState)
    	CoreEventNotify(UiNotify.emCOREEVENT_CHANGEWAITGETITEMSTATE, nState);
    	if (nState == 2) then
    		CoreEventNotify(UiNotify.emCOREEVENT_UPDATEBANKINFO);
    	end
    end
    
    function Player:NotifyItemTimeOutClient(nType, szDate)
    	
    	if (szDate and nType == 46) then -- 返還券
    		me.Msg("Phản Hoàn Quyển trong ".. szDate .." sẽ hết hạn, mau dùng hết, tránh lãng phí。");
    	elseif (nType == 45) then
    		me.Msg("Trong túi hoặc thương khố có huyền tinh sắp quá hạn。");
    	end
    	CoreEventNotify(UiNotify.emCOREEVENT_SET_POPTIP, nType);
    end
    
    function Player:OnBuyJiuZhuan()
    	local tbMsg = {};
    	tbMsg.szMsg = string.format("Bạn không có <color=yellow>Cửu Chuyển Tục Mệnh Hoàn<color>. Bạn muốn tốn <color=red>50 đồng<color> trị thương?", IVER_g_szCoinName);
    	tbMsg.nOptCount = 2;
    	function tbMsg:Callback(nOptIndex)
    		if (nOptIndex == 2) then
    				if (me.IsAccountLock() ~= 0) then
    					UiNotify:OnNotify(UiNotify.emCOREEVENT_SET_POPTIP, 44);
    					me.Msg("Tài khoản đang khóa, không thực hiện thao tác này được!");
    					return;
    				end
    				if IVER_g_nSdoVersion == 0 then
    					if (me.nCoin >= 50) then
    						me.CallServerScript({"ApplyBuyJiuZhuan"});
    					else
    						me.Msg("Bạn không đủ đồng。");
    					end
    				else
    					me.CallServerScript({"ApplyBuyJiuZhuan"});
    				end
    		end
    	end
    	UiManager:OpenWindow(Ui.UI_MSGBOX, tbMsg);
    end
    
    function Player:GetPluginUseState()
    	local tbNameList = KInterface.GetPluginNameList();
    	local nState = KInterface.GetPluginManagerLoadState()
    	if (1 == nState) then
    		local nPluginNum = 0;
    		for _, szName in pairs(tbNameList) do
    			local tbInfo = KInterface.GetPluginInfo(szName);
    			if (tbInfo.nLoadState == 1) then
    				nPluginNum = nPluginNum + 1;
    			end
    		end
    		if (nPluginNum > 0) then
    			me.CallServerScript({"RecordPluginUseState", me.szName, nPluginNum});
    		end
    	end
    end
    
    function Player:JiesuoNotify()	
    	local tbMsg = {};
    	tbMsg.szMsg = "Tài khoản khóa đã bị hủy。";
    	tbMsg.nOptCount = 1;
    	UiManager:OpenWindow(Ui.UI_MSGBOX, tbMsg);
    end
    
    -- 提醒用戶正在申請取消帳號鎖
    function Player:ApplyJiesuoNotify(dwApplyTime)
    	local tbMsg = {};
    	tbMsg.szMsg = "Tài khoản đang <color=red>xin trợ giúp mở khóa<color>, nhấp \"Xác nhận\" kiểm tra chi tiết.";
    	tbMsg.nOptCount = 2;
    	function tbMsg:Callback(nOptIndex)
    		if (nOptIndex == 2) then			
    			local szSay = "Một nhân vật khác trong tài khoản đã xin đóng bảo vệ tài khoản. Nếu bạn không làm thao tác này, xin lập tức hủy bỏ, dùng phần mềm diệt virus mới nhất quét virus Trojan và đổi mật mã để đảm bảo an toàn cho tài khoản."..
    			"\nNhắc nhở: Xin đóng bảo vệ tài khoản sẽ có hiệu lực khi đăng nhập lại sau <color=yellow>5<color> ngày kể từ ngày xin phép.";
    			if dwApplyTime ~= nil then
    				szSay = "Vào <color=white><bclr=blue>"..os.date("%Y - %m - %d  %H giờ %M phút %S giây", dwApplyTime)..
    				"<bclr><color> xin đóng bảo vệ tài khoản. Nếu bạn không làm thao tác này, xin lập tức hủy bỏ, dùng phần mềm diệt virus mới nhất quét virus Trojan và đổi mật mã để đảm bảo an toàn cho tài khoản."..
    				"\nNhắc nhở: Xin đóng bảo vệ tài khoản sẽ có hiệu lực sau <color=white><bclr=blue>"..os.date("%Y - %m - %d  %H giờ %M phút %S giây", dwApplyTime + 5 * 24 * 60 * 60).."<bclr><color> sau đăng nhập lại mới có hiệu lực";
    			end
    			if UiManager:WindowVisible(Ui.UI_SAYPANEL) == 1 then -- 有 白驹经验等 对话框打开时
    				me.Msg(szSay);
    			else
    				Dialog:Say(szSay);
    			end		
    		end
    	end
     
    	UiManager:OpenWindow(Ui.UI_MSGBOX, tbMsg);
    
    	Player.bApplyingJiesuo = 1;
    end
    
    function Player:SyncJiesuoState_C(bCanApplyJiesuo, bApplyingJiesuo, dwApplyTime)
    	self.bCanApplyJiesuo = bCanApplyJiesuo;
    	self.bApplyingJiesuo = bApplyingJiesuo;
    	self.dwApplyJiesuoTime = dwApplyTime;	
    end
    
    function Player:SetActiveAura(nActiveAura)
    	me.SetAuraSkill(nActiveAura);
    end
    
    end
    
    
    function Player:CheckItemPet(him)
        local pItem1 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUIP_WEAPON, 0);
    	local pItem2 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUIP_BODY, 0);
    	local pItem3 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUIP_RING, 0);
    	local pItem4 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUIP_CUFF, 0);
    	local pItem5 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUIP_AMULET, 0);
    	local pItem6 = me.GetItem(Item.ROOM_EQUIP,Item.EQUIPEXPOS_HEAD, 0);
    	local pItem7 = me.GetItem(Item.ROOM_EQUIP,Item.EQUIPEXPOS_BODY, 0);
    	local pItem8 = me.GetItem(Item.ROOM_EQUIP,Item.EQUIPEXPOS_BELT, 0);
    	if pItem1 then
    		if (pItem1.szName == "Đơn Tâm Chi Nhẫn +1") or (pItem1.szName == "Đơn Tâm Chi Nhẫn +2") or (pItem1.szName == "Đơn Tâm Chi Nhẫn +3") or (pItem1.szName == "Bích Huyết Chi Nhẫn + 1") or (pItem1.szName == "Bích Huyết Chi Nhẫn + 2") or (pItem1.szName == "Bích Huyết Chi Nhẫn + 3") or (pItem1.szName == "Trường Yên Chi Nhẫn + 1") or (pItem1.szName == "Trường Yên Chi Nhẫn + 2") or (pItem1.szName == "Trường Yên Chi Nhẫn + 3") or (pItem1.szName == "Trường Yên Chi Nhẫn + 4") or (pItem1.szName == "Kim Lân Chi Nhẫn + 1") or (pItem1.szName == "Kim Lân Chi Nhẫn + 2") or (pItem1.szName == "Kim Lân Chi Nhẫn + 3") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem1.szName));
    		else
    			me.Msg(string.format("Item %s không hợp lệ", pItem1.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    	if pItem2 then
    		if (pItem2.szName == "Đơn Tâm Chiến Y +1") or (pItem2.szName == "Đơn Tâm Chiến Y +2") or (pItem2.szName == "Đơn Tâm Chiến Y +3") or (pItem2.szName == "Bích Huyết Chiến Y + 1") or (pItem2.szName == "Bích Huyết Chiến Y + 2") or (pItem2.szName == "Bích Huyết Chiến Y + 3") or (pItem2.szName == "Kim Lân Chiến Y + 1") or (pItem2.szName == "Kim Lân Chiến Y + 2") or (pItem2.szName == "Kim Lân Chiến Y + 3") or (pItem2.szName == "Trường Yên Chiến Y + 1") or (pItem2.szName == "Trường Yên Chiến Y + 2") or (pItem2.szName == "Trường Yên Chiến Y + 3") or (pItem2.szName == "Trường Yên Chiến Y + 4") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem2.szName));
    		else
    			me.Msg(string.format("Item %s không hợp lệ", pItem2.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    	if pItem3 then
    		if (pItem3.szName == "Đơn Tâm Chi Giới +1") or (pItem3.szName == "Đơn Tâm Chi Giới +2") or (pItem3.szName == "Đơn Tâm Chi Giới +3") or (pItem3.szName == "Bích Huyết Chi Giới + 1") or (pItem3.szName == "Bích Huyết Chi Giới + 2") or (pItem3.szName == "Bích Huyết Chi Giới + 3") or (pItem3.szName == "Kim Lân Chi Giới + 1") or (pItem3.szName == "Kim Lân Chi Giới + 2") or (pItem3.szName == "Kim Lân Chi Giới + 3") or (pItem3.szName == "Trường Yên Chi Giới + 1") or (pItem3.szName == "Trường Yên Chi Giới + 2") or (pItem3.szName == "Trường Yên Chi Giới + 3") or (pItem3.szName == "Trường Yên Chi Giới + 4") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem3.szName));
    		else
    			me.Msg(string.format("Item %s không hợp lệ", pItem3.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    	if pItem4 then
    		if (pItem4.szName == "Đơn Tâm Hộ Uyển +1") or (pItem4.szName == "Đơn Tâm Hộ Uyển +2") or (pItem4.szName == "Đơn Tâm Hộ Uyển +3") or (pItem4.szName == "Bích Huyết Hộ Uyển + 1") or (pItem4.szName == "Bích Huyết Hộ Uyển + 2") or (pItem4.szName == "Bích Huyết Hộ Uyển + 3") or (pItem4.szName == "Trường Yên Hộ Uyển + 4") or (pItem4.szName == "Kim Lân Hộ Uyển + 1") or (pItem4.szName == "Kim Lân Hộ Uyển + 2") or (pItem4.szName == "Kim Lân Hộ Uyển + 3") or (pItem4.szName == "Trường Yên Hộ Uyển + 1") or (pItem4.szName == "Trường Yên Hộ Uyển + 2") or (pItem4.szName == "Trường Yên Hộ Uyển + 3") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem4.szName));
    		else
    			me.Msg(string.format("Item %s không hợp lệ", pItem4.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    	if pItem5 then
    		if (pItem5.szName == "Đơn Tâm Hộ Thân Phù +1") or (pItem5.szName == "Đơn Tâm Hộ Thân Phù +2") or (pItem5.szName == "Đơn Tâm Hộ Thân Phù +3") or (pItem5.szName == "Bích Huyết Hộ Thân Phù + 1") or (pItem5.szName == "Bích Huyết Hộ Thân Phù + 2") or (pItem5.szName == "Bích Huyết Hộ Thân Phù + 3") or (pItem5.szName == "Kim Lân Hộ Thân Phù + 1") or (pItem5.szName == "Kim Lân Hộ Thân Phù + 2") or (pItem5.szName == "Kim Lân Hộ Thân Phù + 3") or (pItem5.szName == "Trường Yên Hộ Thân Phù + 1") or (pItem5.szName == "Trường Yên Hộ Thân Phù + 2") or (pItem5.szName == "Trường Yên Hộ Thân Phù + 3") or (pItem5.szName == "Trường Yên Hộ Thân Phù + 4") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem5.szName));
    		else
    			me.Msg(string.format("Item %s không hợp lệ", pItem5.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    	
    	------------------------------------------------------------
    	if pItem6 then
    		if (pItem6.szName == "Đơn Tâm Chi Nhẫn +1") or (pItem6.szName == "Đơn Tâm Chi Nhẫn +2") or (pItem6.szName == "Đơn Tâm Chi Nhẫn +3") or (pItem6.szName == "Bích Huyết Chi Nhẫn + 1") or (pItem6.szName == "Bích Huyết Chi Nhẫn + 2") or (pItem6.szName == "Bích Huyết Chi Nhẫn + 3") or (pItem6.szName == "Trường Yên Chi Nhẫn + 1") or (pItem6.szName == "Trường Yên Chi Nhẫn + 2") or (pItem6.szName == "Trường Yên Chi Nhẫn + 3") or (pItem6.szName == "Trường Yên Chi Nhẫn + 4") or (pItem6.szName == "Kim Lân Chi Nhẫn + 1") or (pItem6.szName == "Kim Lân Chi Nhẫn + 2") or (pItem6.szName == "Kim Lân Chi Nhẫn + 3") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem1.szName));
    		me.Msg(string.format("Item %s không hợp lệ", pItem6.szName));
    			Player:Arrest(me.szName)
    		-- else
    			-- me.Msg(string.format("Item %s không hợp lệ", pItem1.szName));
    			-- Player:Arrest(me.szName)
    		end;
    	end
    	if pItem7 then
    		if (pItem7.szName == "Đơn Tâm Chiến Y +1") or (pItem7.szName == "Đơn Tâm Chiến Y +2") or (pItem7.szName == "Đơn Tâm Chiến Y +3") or (pItem7.szName == "Bích Huyết Chiến Y + 1") or (pItem7.szName == "Bích Huyết Chiến Y + 2") or (pItem7.szName == "Bích Huyết Chiến Y + 3") or (pItem7.szName == "Kim Lân Chiến Y + 1") or (pItem7.szName == "Kim Lân Chiến Y + 2") or (pItem7.szName == "Kim Lân Chiến Y + 3") or (pItem7.szName == "Trường Yên Chiến Y + 1") or (pItem7.szName == "Trường Yên Chiến Y + 2") or (pItem7.szName == "Trường Yên Chiến Y + 3") or (pItem7.szName == "Trường Yên Chiến Y + 4") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem2.szName));
    		-- else
    			me.Msg(string.format("Item %s không hợp lệ", pItem7.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    	if pItem8 then
    		if (pItem8.szName == "Đơn Tâm Chi Giới +1") or (pItem8.szName == "Đơn Tâm Chi Giới +2") or (pItem8.szName == "Đơn Tâm Chi Giới +3") or (pItem8.szName == "Bích Huyết Chi Giới + 1") or (pItem8.szName == "Bích Huyết Chi Giới + 2") or (pItem8.szName == "Bích Huyết Chi Giới + 3") or (pItem8.szName == "Kim Lân Chi Giới + 1") or (pItem8.szName == "Kim Lân Chi Giới + 2") or (pItem8.szName == "Kim Lân Chi Giới + 3") or (pItem8.szName == "Trường Yên Chi Giới + 1") or (pItem8.szName == "Trường Yên Chi Giới + 2") or (pItem8.szName == "Trường Yên Chi Giới + 3") or (pItem8.szName == "Trường Yên Chi Giới + 4") then
    			--me.Msg(string.format("Item %s hợp lệ", pItem3.szName));
    		-- else
    			me.Msg(string.format("Item %s không hợp lệ", pItem8.szName));
    			Player:Arrest(me.szName)
    		end;
    	end
    end
    
    -- 客戶端 當生命低於25%時候 
    ------------------------------------------------------------------------
    function Player:LifeIsPoor_C()
    	if (me.nLevel > 20) then
    		return;
    	end;
    	
    	local bHave = false;
    	local tbBuffList = me.GetBuffList();
    	for i = 1, #tbBuffList do
    		local tbInfo = me.GetBuffInfo(tbBuffList[i].uId);
    		if (tbInfo.nSkillId == 476) then
    			bHave = true;
    		end;
    	end;
    	
    	local pNpc = me.GetNpc();
    	if (not bHave and pNpc) then
    		pNpc.Chat("Điềm Tửu Thúc nhắc ta nên ăn khi chiến đấu ngoài rừng!");
    	end;
    end;
    
    function Player:LogPluginUseState(bExchangeServerComing)
    	if (bExchangeServerComing ~= 1) then
    		me.CallClientScript({"Player:GetPluginUseState"});
    	end
    end
    
    -------------------------------------------------------------------------
    
    -- 注冊通用上線事件
    PlayerEvent:RegisterGlobal("OnLogin", Player._OnLogin, Player);
    
    -- 注冊通用下線事件
    PlayerEvent:RegisterGlobal("OnLogout", Player._OnLogout, Player);
    
    -- 注冊升級回掉
    PlayerEvent:RegisterGlobal("OnLevelUp", Player._OnLevelUp, Player);
    
    -- 注冊玩家死亡事件
    PlayerEvent:RegisterGlobal("OnDeath", Player._OnDeath, Player);
    
    -- 注冊通用殺怪事件
    PlayerEvent:RegisterGlobal("OnKillNpc", Player._OnKillNpc, Player);
    
    PlayerEvent:RegisterGlobal("OnCampChange", Player._OnCampChange, Player);
    
    -- 注冊定期清心得書使用事件
    PlayerSchemeEvent:RegisterGlobalDailyEvent({Player.ClearInsightBookUsedCount, Player});
    
    PlayerEvent:RegisterGlobal("OnLogin", Player.OnLogin_AccountSafe, Player);
    
    PlayerEvent:RegisterGlobal("OnLogin", Player.OnLogin_StatComeBack, Player);
    
    PlayerEvent:RegisterGlobal("OnLogin", Player.OnLogin_OnSetComeBackOldPlayer, Player);
    
    PlayerEvent:RegisterGlobal("OnLogin", Player.LogPluginUseState, Player);
    
    ---- 注冊定期清xxxx
    --PlayerSchemeEvent:RegisterGlobalDailyEvent({Player.ClearCibeixinjingUsedAmount, Player});
    --
    Khách viếng thăm hãy cùng yeukiemthe xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  2. Các thành viên gởi lời cảm ơn đến yeukiemthe vì bài viết này !

    anhduca4 (16-04-15)

  3. #2
    Thành Viên
    Ngày tham gia
    Nov 2014
    Bài viết
    43
    Thanks
    0
    Thanked 19 Times in 17 Posts

    Ðề: Lỗi mất đồng khi di chuyển sang map khác

    if nCoin > 200000 then
    if nCoin > 50000000 then
    me.AddJbCoin(-nCoin);
    end

    kiểm tra lại coi đồng có nhiều hơn cái này ko, có thì xóa đi
    Khách viếng thăm hãy cùng localhost168 xây dựng diễn đàn CLBGAMESVN vững mạnh nhé!

  4. Các thành viên gởi lời cảm ơn đến localhost168 vì bài viết này !

    yeukiemthe (16-04-15)

 

 

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

  1. [Gunny] Chuyển swf sang fla OK nhưng chuyển fla sang swf bị lỗi thiếu file
    Bởi gaicute trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 1
    Bài viết cuối: 15-07-23, 09:48 AM
  2. [JX] Lỗi nhân vật bị chuyển sang hệ kim- Pro nào giúp
    Bởi dangletrung trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 22
    Bài viết cuối: 22-05-21, 08:46 PM
  3. [TLBB] Vấn đề về chuyển đổi chữ sang số!
    Bởi le_huy trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 7
    Bài viết cuối: 11-01-15, 07:09 PM
  4. [MU] Chuyển hosting sang host mới bị hiện cái dịch chuyển web chứ ko hiện trang tk
    Bởi takdcvne trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 3
    Bài viết cuối: 30-10-12, 09:37 PM
  5. Giúp em chuyển file sang item.bmd sang item.txt
    Bởi jambovt05 trong diễn đàn Hỏi Đáp/ Yêu Cầu
    Trả lời: 3
    Bài viết cuối: 10-06-11, 08:25 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à 10:28 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ệ.