PDA

View Full Version : [KT] Lỗi mất đồng khi di chuyển sang map khác



yeukiemthe
16-04-15, 08:36 AM
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





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� �令修改),那麼也必須保證能夠正常� ��點。
-- 此時比例最高的項在比例恢復正常前� �能再增加(加點後比例可能仍然高於6 0%),比例低的項要保證加點後比例不 會高於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(bExchangeSer verComing)
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.nBeProtectedStateSkillI d, 1, 1, nTime * Env.GAME_FPS);
else
pPlayer.RemoveSkillState(self.nBeProtectedStateSki llId);
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

<b><font color=red>[Chỉ có thành viên mới xem link được. <a href="register.php"> Nhấp đây để đăng ký thành viên......</a>]</font></b>
-- 賬號凍結
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_N PC);
end

function Player:OnChangeState(nState)
CoreEventNotify(UiNotify.emCOREEVENT_CHANGEWAITGET ITEMSTATE, nState);
if (nState == 2) then
CoreEventNotify(UiNotify.emCOREEVENT_UPDATEBANKINF O);
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.PARTNEREQUI P_WEAPON, 0);
local pItem2 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUI P_BODY, 0);
local pItem3 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUI P_RING, 0);
local pItem4 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUI P_CUFF, 0);
local pItem5 = me.GetItem(Item.ROOM_PARTNEREQUIP,Item.PARTNEREQUI P_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});
--

localhost168
16-04-15, 09:12 AM
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