From c35e176a3b05f745600c6e60f168313d2b9e7b30 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 17 九月 2025 12:00:19 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(司马懿技能;增加按层级结算持续buff效果5003;增加非按攻击力计算伤害支持;技能伤害增加可限制最大攻击力百分比上限配置;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py | 465 ++++++---------------------------------------------------- 1 files changed, 48 insertions(+), 417 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py index 65509d3..caf58b5 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py @@ -18,52 +18,31 @@ import SkillShell import BuffSkill import PlayerControl -import EventShell -import PlayerRequest -import ChEquip import SkillCommon import FBLogic -import AttackCommon import ChItem import PlayerGMOper -import GameLogInfo -import PlayerMissionCollect -import ItemCommon import OperControlManager import ShareDefine -import PlayerAutoCheckOnline -import PlayerGameWallow import ReadChConfig import PlayerDienstgrad -import PlayerVip import IpyGameDataPY -import PlayerFB import GameObj import GameMap import math import time import PetControl -import ItemControler -import PlayerGuaji -import PlayerTJG import AICommon import PlayerSuccess -import CrossPlayerData import PassiveBuffEffMng import FunctionNPCCommon import FormulaControl -import PlayerGoldGift -import PlayerActLianqi -import PlayerActFamilyGCZ import PlayerFlashSale import PlayerChatBox import PlayerFace -import PlayerWing -import ChEquip -import PlayerYinji -import PlayerActivity import PlayerBackup -import MirrorAttack +import PlayerOnline +import PlayerGoldRush #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -549,7 +528,7 @@ if prepareState == IPY_GameWorld.pstDig: #挖宝状态 - EventShell.EventResponse_OnDig(curPlayer) + pass elif prepareState == IPY_GameWorld.pstSkill: SkillShell.SkillPrepareEnd(curPlayer, tick) @@ -565,11 +544,10 @@ elif prepareState == IPY_GameWorld.pstTownPortal: #战斗中回城成功 - ChItem.UseTownPortal(curPlayer) + pass elif prepareState == IPY_GameWorld.pstMissionCollecting: - #任务采集 - PlayerMissionCollect.EndMissionCollect(curPlayer, tick) + pass elif prepareState == ShareDefine.Def_PstTrans: @@ -580,7 +558,7 @@ if not TransCostAfterPrepare(curPlayer): return - PlayerControl.PlayerResetWorldPos(curPlayer, mapID, posX, posY, False) + PlayerControl.PlayerResetWorldPos(curPlayer, mapID, posX, posY) #PlayerControl.NotifyCode(curPlayer, "Map_Deliver_Succeed", [mapID]) #重置玩家状态 @@ -676,25 +654,6 @@ FBLogic.OnCollectOK(curPlayer, curNPC.GetNPCID(), tick) return - -#--------------------------------------------------------------------- -##刷新时效道具 -# @param curPlayer 玩家实例 -# @param tick 时间戳 -# @return 返回值, 是否重刷玩家属性 -# @remarks 刷新以单位时间(分钟)消耗耐久的物品 -def ProcessRefreshTimeItem(curPlayer, tick): - reFlash = False - - #2分钟遍历一次,时效道具时间到不消失, - if tick - curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_EquipTime) \ - < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_TimeItem]: - return reFlash - #耐久减少值/分钟 - reFlash = ProcessTimeEquip(curPlayer, tick) - - return reFlash - #--------------------------------------------------------------------- ##刷新玩家Buff @@ -812,7 +771,7 @@ curPlayer.SetDict(ChConfig.Def_PlayerKey_SitForZhenQi, tick) vipLV = curPlayer.GetVIPLv() - vipRate = ShareDefine.Def_MaxRateValue#PlayerVip.GetVIPMuseSitRate(vipLV) + vipRate = ShareDefine.Def_MaxRateValue #取得人物当前经验 curTotalExp = PlayerControl.GetPlayerTotalExp(curPlayer) # 超过20亿支持,功能待定 @@ -828,7 +787,7 @@ isSysHint=False) if vipLV == 0: - canVipRate = ShareDefine.Def_MaxRateValue#PlayerVip.GetVIPMuseSitRate(ShareDefine.Def_VIPType_Platina) + canVipRate = ShareDefine.Def_MaxRateValue canVipExpValue = int(addExpValue * canVipRate / float(ShareDefine.Def_MaxRateValue)) #GeRen_chenxin_684833:获得经验%s点,成为VIP经验%s PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_684833", [addExpValue, canVipExpValue]) @@ -882,68 +841,6 @@ # curPlayer.SetXP(nextXPValue) #=========================================================================== - -#--------------------------------------------------------------------- -##玩家自动回复生命和魔法 -# @param curPlayer 玩家实例 -# @param tick 时间戳 -# @return None -# @remarks 玩家自动回复生命和魔法 -def ProcessHPMPState(curPlayer, tick): - -# #仅打坐状态回复 -# if curPlayer.GetPlayerAction() != IPY_GameWorld.paSit: -# return - - if not curPlayer.IsAlive(): - #死亡状态不处理 - return - - #检测是否到CD时间, 暂定5秒回一次 - if tick - curPlayer.GetRestoreTime() < ChConfig.Def_HPRestoreInterval: - return - #设置当前回复开始时间 - curPlayer.SetRestoreTime(tick) - - #没有恢复能力 - if curPlayer.GetHPRestorePer() == 0: - return - - #满血不处理 - if GameObj.GetHP(curPlayer) == GameObj.GetMaxHP(curPlayer): - return - - #战斗中返回 - #if curPlayer.IsBattleState(): - # return False - -# #战斗对峙返回 -# if curPlayer.GetIsConfronting(): -# return False - - #---回复玩家血量--- - playerHP = GameObj.GetHP(curPlayer) - #playerMP = curPlayer.GetMP() - playerMaxHP = GameObj.GetMaxHP(curPlayer) - #playerMaxMP = curPlayer.GetMaxMP() - - # 目前回复频率暂定5秒回复一次,回复数值是1秒的值,所以此处乘5 - addHPValue = curPlayer.GetHPRestorePer() * 5 - - #addMPValue = GameWorld.GetFloatUpper(playerMaxMP * mpPer + mpValue) - - #GameWorld.Log('addHPValue = %s, addMPValue = %s'%(addHPValue, addMPValue)) - - #当前不是满血, 就回血 - if playerHP != playerMaxHP: - SkillCommon.SkillAddHP(curPlayer, 0, addHPValue) - #GameObj.SetHP(curPlayer, min(playerHP + addHPValue, playerMaxHP)) - - #当前不是满魔, 就回魔 - #if playerMP != playerMaxMP: - # curPlayer.SetMP(min(playerMP + addMPValue, playerMaxMP)) - return - #--------------------------------------------------------------------- ##刷新组队状态 # @param curPlayer 玩家实例 @@ -970,11 +867,8 @@ # @remarks 刷新玩家在线时间 def ProcessPlayer_OnlineTime(curPlayer, tick): if not CommonCheckTick(curPlayer, tick, ChConfig.TYPE_Player_Tick_PlayerOnlineTime): - return + return - #处理防沉迷在线时间, - PlayerGameWallow.DoLogic_WallowOnlineTime(curPlayer, tick) - return @@ -1060,7 +954,6 @@ # @return 返回值, 无意义 # @remarks C++封包触发, 全局定时器, 处理玩家状态 def __Func_ProcessState(tick): - timeClock = time.clock() #2009-07-01断言tick >=0 ,服务器tick为DWord,超过24天未重启硬件,将导致逻辑不可预知 if tick < 0 : GameWorld.Log('###服务器运行时间超过24天 tick = %s' % (tick)) @@ -1074,87 +967,10 @@ if curPlayer.GetID() == 0: continue - ProcessPlayerState(curPlayer, tick) - - #记录玩家逻辑处理总耗时 - GameLogInfo.LogInfo_PlayerLogicTime(timeClock) + ProcessPlayerState(curPlayer, tick) + return -#--------------------------------------------------------------------- -##处理耐久计算方式为:现实时间刷新方式的物品 -# @param curPlayer 玩家实例 -# @return 布尔值 -# @remarks 处理耐久计算方式为:现实时间刷新方式的物品 -def ProcessTimeEquip(curPlayer, tick): - itemManager = curPlayer.GetItemManager() - hasItemClear = False - - classLV = 0 # 只处理非境界装备的时效物品 - curPack = itemManager.GetPack(IPY_GameWorld.rptEquip) - for equipPlace in ChConfig.EquipPlace_LingQi: - ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace) - if not ipyData: - continue - index = ipyData.GetGridIndex() - curItem = curPack.GetAt(index) - - #异常物品 - if not ItemCommon.CheckItemCanUse(curItem): - continue - - if curItem.GetEndureReduceType() not in [ChConfig.Def_EquipReduceType_RTimeItem, - ChConfig.Def_EquipReduceType_Time]: - continue - - #处理现实时间物品逻辑 - if __DoLogic_ProcessTimeEquip(curPlayer, curItem, index): - hasItemClear = True - - if hasItemClear: - #装备重刷属性 - ChEquip.RefreshPlayerLingQiEquipAttr(curPlayer) - - # 进行更新时效道具刷新时间 - curPlayer.SetDict(ChConfig.Def_PlayerKey_EquipTime, tick) - return hasItemClear - -#--------------------------------------------------------------------- -## 装备有效时间到了需要脱下,有效时间物品改成不消失,但是无使用效果 可出售和续费 -def __DoLogic_ProcessTimeEquip(curPlayer, curItem, equipIndex): - #验证物品是否过期 - curItemExpireTime = curItem.GetUserAttr(ShareDefine.Def_IudetExpireTime) - if not curItemExpireTime: - curItemExpireTime = curItem.GetExpireTime() - curItemPastTime = time.time() - curItem.GetUserAttr(ShareDefine.Def_IudetCreateTime) - if curItemExpireTime - curItemPastTime > 0: - return - - spaceIndex = ItemControler.GetItemPackSpaceIndex(curPlayer, IPY_GameWorld.rptItem) - if spaceIndex == -1: - # 没有空位,玩家主动取下,计算属性时无效化 - # 过期属性时效需刷属性 - return True - - result = ItemControler.PlayerItemControler(curPlayer).UnEquipItem(equipIndex, spaceIndex) - if not result: - # 过期属性时效需刷属性 - return True - equipID = result[0] - equipPlace = result[1] - if equipPlace in [ShareDefine.retGuard1, ShareDefine.retGuard2]: - PlayerControl.NotifyCode(curPlayer, 'Guardian_Timeout', [equipID, spaceIndex]) - elif equipPlace == ShareDefine.retWing: - PlayerControl.NotifyCode(curPlayer, 'WingTiyan_Timeout') - - tryItemDict = IpyGameDataPY.GetFuncEvalCfg('FirstGoldTryItem', 1, {}) - tryItemID = tryItemDict.get(curPlayer.GetJob(), 0) - if tryItemID and ItemControler.GetAppointItemRealID(tryItemID) == equipID: - #首充试用武器过期并且还没首充的提示() - if not curPlayer.GetChangeCoinPointTotal(): - PlayerControl.NotifyCode(curPlayer, 'FirstGoldWPOver') - PlayerGoldGift.FirstGoldTryItemOutTime(curPlayer) - - return True #--------------------------------------------------------------------- ##全局定时器调用, 刷新玩家状态 # @param curPlayer 玩家实例 @@ -1175,133 +991,80 @@ #定时备档 PlayerBackup.CheckPlayerBackup(curPlayer) - #玩家镜像战斗AI - MirrorAttack.ProcessPlayerMirrorAI(curPlayer, tick) - #被GM封状态响应 ProcessGMOperLogic(curPlayer, tick) #刷新玩家战斗状态 - ProcessPlayerBattle(curPlayer, tick) + #ProcessPlayerBattle(curPlayer, tick) #战斗状态判断 - CheckBattleState(curPlayer, tick) + #CheckBattleState(curPlayer, tick) #切换玩家呆滞状态 - ProcessPlayerNeedProcess(curPlayer , tick) + #ProcessPlayerNeedProcess(curPlayer , tick) #放在刷buff前 - ProcessPassiveSkill(curPlayer, tick) + #ProcessPassiveSkill(curPlayer, tick) - #---影响属性刷新--------------------------------------------- - #是否刷新列表 - reFlashList = [] - - #刷新玩家Buff - reFlashBuff = ProcessRefreshBuffState(curPlayer, tick) - - #刷新玩家场景buff效果 - ProcessPlayerBuffEffect(curPlayer, tick) - - #时效道具刷新 - reFlash = ProcessRefreshTimeItem(curPlayer, tick) - reFlashList.append(reFlash) -# GameWorld.Log('刷新以单位时间(分钟)消耗耐久的物品 %s'%(time.clock() - curTime)) -# curTime = time.clock() - + ProcessPlayerSecond(curPlayer, tick) ProcessPlayerMinute(curPlayer, tick) - #vip体验 - reFlash = PlayerVip.CheckVIPExperience(curPlayer, tick) - reFlashList.append(reFlash) - - #===影响人物行为刷新, 支持控制类BUFF可刷属性====================================== - # 控制类有属性刷新交给属性处理 - attrBuffResult, actBuffResult = ProcessRefreshActionBuffState(curPlayer, tick) - - playerControl = PlayerControl.PlayerControl(curPlayer) - if actBuffResult: - playerControl.RefreshPlayerActionState() - - #===行为刷新结束============================================================== - - #重刷属性 - # 1. 循环内需要刷属性 - # 2. buff消失刷属性 - # 3. 玩家其他行为触发缓存刷属性 - # 4. 玩家因buff缓存刷属性 - if True in reFlashList : - #Buff影响到属性刷新 - playerControl.RefreshPlayerAttrState() - - - #此处才是真正的刷新人物属性值,需刷属性逻辑应在此行前调用 - if not playerControl.RefreshPlayerAttrStateEx(): - if reFlashBuff or attrBuffResult: - playerControl.RefreshPlayerAttrByBuff() - - # 只刷BUFF情况 - playerControl.RefreshPlayerAttrByBuffEx() - + PlayerOnline.GetOnlinePlayer(curPlayer).DoRefreshRoleAttr() #---到这边应该属性刷新结束,下面的逻辑有的需要用到属性值-------------------- #当前玩家的状态 - curPlayerAction = curPlayer.GetPlayerAction() + #curPlayerAction = curPlayer.GetPlayerAction() # curTime = time.clock() #刷新玩家的准备进度条 - if curPlayerAction == IPY_GameWorld.paPreparing : - ProcessPlayerPrepareState(curPlayer, tick) + #if curPlayerAction == IPY_GameWorld.paPreparing : + # ProcessPlayerPrepareState(curPlayer, tick) - #刷新玩家请求 - PlayerRequest.ProcessPlayerRequest(curPlayer, tick) - - #回血回魔状态处理 - ProcessHPMPState(curPlayer, tick) - - PlayerYinji.ProcessPlayerYinji(curPlayer, tick) + #PlayerYinji.ProcessPlayerYinji(curPlayer, tick) #刷新组队状态 #ProcessTeamState(curPlayer, tick) #玩家在线时间刷新 - ProcessPlayer_OnlineTime(curPlayer, tick) + #ProcessPlayer_OnlineTime(curPlayer, tick) #反外挂验证 - PlayerAutoCheckOnline.HackDefense(curPlayer, tick) + #PlayerAutoCheckOnline.HackDefense(curPlayer, tick) #副本相关时间处理 - PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick) - - #脱机计算 - #PlayerTJG.ProcessPlayerTJG(curPlayer, tick) - #挂机收益 - PlayerGuaji.ProcessGuaji(curPlayer) - - #PK/boss状态 - ProcessPKBossState(curPlayer, tick) + #PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick) #恶意攻击时间处理 - AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick) + #AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick) + + #活跃放置 + #PlayerActivity.ProcessActivityPlace(curPlayer) + #自定义场景 + #FBLogic.OnCustomSceneProcess(curPlayer, tick) + #炼器 + #PlayerActLianqi.OnProcess(curPlayer) + #仙盟攻城战 + #PlayerActFamilyGCZ.OnProcess(curPlayer) + #跨服数据同步,放最后 + #CrossPlayerData.ProcessCrossPlayer(curPlayer, tick) + return + +def ProcessPlayerSecond(curPlayer, tick): + #玩家每秒处理,玩家Process可能每秒多次,所以增加一个每秒处理的,减少执行次数 + lastTick = curPlayer.GetDictByKey("ProcessPlayerSecond") + if tick - lastTick < 1000: + return + curPlayer.SetDict("ProcessPlayerSecond", tick) + #成就 PlayerSuccess.FinishDelayAddSuccessProgress(curPlayer, tick, False) #限时抢购 PlayerFlashSale.ProcessFlashSaleMail(curPlayer, tick) - #地图经验 - #ProcessAreaExp(curPlayer, tick) #神秘商店刷新 FunctionNPCCommon.CheckMysticalShopRefresh(curPlayer, tick) - #活跃放置 - PlayerActivity.ProcessActivityPlace(curPlayer) - #自定义场景 - FBLogic.OnCustomSceneProcess(curPlayer, tick) - #炼器 - PlayerActLianqi.OnProcess(curPlayer) - #仙盟攻城战 - PlayerActFamilyGCZ.OnProcess(curPlayer) - #跨服数据同步,放最后 - CrossPlayerData.ProcessCrossPlayer(curPlayer, tick) + #淘金 + PlayerGoldRush.OnProcess(curPlayer) return def ProcessPlayerMinute(curPlayer, tick): @@ -1375,45 +1138,7 @@ # return #=============================================================================== return -#--------------------------------------------------------------------- -##GM开关活动, 地图服务器给经验 -# @param curPlayer 玩家实例 -# @param tick 时间戳 -# @return 返回值无意义 -# @remarks GM开关活动, 地图服务器给经验 -def ProcessMapGiveExp(curPlayer, tick): - gameWorld = GameWorld.GetGameWorld() - #经验倍率 - exp_Multiple = 0 - if gameWorld.IsEventActive(ChConfig.Def_GY_GM_GameID_MapGiveExp_Ten): - exp_Multiple = 10 - elif gameWorld.IsEventActive(ChConfig.Def_GY_GM_GameID_MapGiveExp_Fifty): - exp_Multiple = 50 - else: - #无活动 - return - - mapExpTick = curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_GiveMapExp) - - if mapExpTick == 0: - #第一次设定当前时间 - curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_GiveMapExp, tick) - return - - if tick - mapExpTick < ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_GiveMapExp]: - #没有到刷新间隔 - return - - curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_GiveMapExp, tick) - - reExp = 0 - - playerControl = PlayerControl.PlayerControl(curPlayer) - #玩家经验增加 参考经验 * 经验倍率 - playerControl.AddExp(reExp * exp_Multiple) - - return -#--------------------------------------------------------------------- + ##清空玩家连续击杀数量 # @param curPlayer 玩家实例 # @param tick 时间戳 @@ -1473,66 +1198,6 @@ PlayerGMOper.DoGMOperLogic(curPlayer, tick) return - -#=============================================================================== -# 警告:1.此功能应该会导致更加频繁处理战斗逻辑附带的刷新属性等逻辑 -# 需三思考虑,暂时关闭。 -# -# ## 计时器入口,战斗逻辑 -# # @param None -# # @return None -# def PlayerProcessFight(timerType, tick): -# if not GameWorld.GetGameWorld().GetInitOK() : -# return -# -# #GameWorld.DebugLog("---!!PlayerProcessFight %s"%([timerType, tick])) -# -# for i in xrange(GameWorld.GetGameWorld().GetGameWorldCount()): -# #设置当前的世界 -# GameWorld.GetGameWorld().SetCurGameWorldIndex(i) -# -# playerManager = GameWorld.GetPlayerManager() -# playerCount = playerManager.GetActivePlayerCount() -# for i in range(0, playerCount): -# curPlayer = playerManager.GetActivePlayerByIndex(i) -# if curPlayer.IsEmpty(): -# continue -# -# if not curPlayer.GetInitOK(): -# #GameWorld.Log("玩家还未初始化成功, 不处理") -# continue -# -# if curPlayer.IsMoving(): -# continue -# -# ProcessFight(curPlayer, tick) -# -# GameWorld.GetGameWorld().SetCurGameWorldIndex(-1) -# -# return -#=============================================================================== - -def ProcessPKBossState(curPlayer, tick): - ## 处理PK及boss状态 - validTime = IpyGameDataPY.GetFuncCfg("PKConfig", 4) * 1000 - - pkStateTick = curPlayer.GetDictByKey(ChConfig.Def_PDict_PKStateTick) - if pkStateTick and (tick - pkStateTick) >= validTime: - curPlayer.SetDict(ChConfig.Def_PDict_PKStateTick, 0) - PlayerControl.SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_PKState, 0) - #GameWorld.DebugLog("退出PK状态!", curPlayer.GetPlayerID()) - curPlayer.SetDict("StartProDTick", tick) # 开始恢复时间点 - - bossStateTick = curPlayer.GetDictByKey(ChConfig.Def_PDict_BossStateTick) - if bossStateTick and (tick - bossStateTick) >= validTime: - curPlayer.SetDict(ChConfig.Def_PDict_BossStateTick, 0) - PlayerControl.SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_BossState, 0) - #GameWorld.DebugLog("退出Boss状态!", curPlayer.GetPlayerID()) - - # 脱离PK战斗 X秒后按比例恢复 - ProcessProDef(curPlayer, tick) - return - def Sync_PKBossState(curPlayer): psState = 1 if curPlayer.GetDictByKey(ChConfig.Def_PDict_PKStateTick) else 0 PlayerControl.SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_PKState, psState) @@ -1540,40 +1205,6 @@ bossState = 1 if curPlayer.GetDictByKey(ChConfig.Def_PDict_BossStateTick) else 0 PlayerControl.SendPropertyRefresh(curPlayer, ShareDefine.CDBPlayerRefresh_BossState, bossState) return - -# 脱离PK战斗 X秒后按比例恢复 -def ProcessProDef(curPlayer, tick): - if PlayerControl.GetProDefHPPer(curPlayer) == 0: - # 没转化值 - return - - # 脱离PK战斗 X秒后按比例恢复 - if IsInPKState(curPlayer): - return - - if tick - curPlayer.GetDictByKey("StartProDTick") < IpyGameDataPY.GetFuncCfg("MagicExterior", 2) * 1000: - return - - if curPlayer.GetPlayerAction() == IPY_GameWorld.paDie: - return - - # 每秒恢复 - if tick - curPlayer.GetDictByKey("restoreProDTick") < 1000: - return - - curProDef = PlayerControl.GetProDef(curPlayer) - maxProDef = PlayerControl.GetMaxProDef(curPlayer) - - if curProDef == maxProDef: - return - - #非PK状态恢复护盾 - PlayerControl.SetProDef(curPlayer, min(curProDef + \ - IpyGameDataPY.GetFuncCfg("MagicExterior", 3)*maxProDef/ChConfig.Def_MaxRateValue, maxProDef)) - curPlayer.SetDict("restoreProDTick", tick) - - return - def IsInPKState(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PDict_PKStateTick) > 0 def SetPKStateTick(curPlayer, tick): -- Gitblit v1.8.0