From f198885f31c9c7eb19eb28adce562e39e64d581c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 18 七月 2025 16:23:11 +0800 Subject: [PATCH] 121 【武将】武将系统-服务端(属性计算、战斗力计算;新角色初始给默认装备、默认阵容武将;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py | 348 +++------------------------------------------------------ 1 files changed, 21 insertions(+), 327 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 582a8cf..5cc7d0c 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py @@ -18,7 +18,6 @@ import SkillShell import BuffSkill import PlayerControl -import PlayerRequest import ChEquip import SkillCommon import FBLogic @@ -58,6 +57,7 @@ import PlayerActivity import PlayerBackup import MirrorAttack +import PlayerOnline #--------------------------------------------------------------------- #--------------------------------------------------------------------- @@ -671,25 +671,6 @@ 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 # @param curPlayer 玩家实例 # @param tick 时间戳 @@ -875,68 +856,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 玩家实例 @@ -1071,81 +990,6 @@ 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 玩家实例 # @param tick 时间戳 @@ -1166,112 +1010,56 @@ PlayerBackup.CheckPlayerBackup(curPlayer) #玩家镜像战斗AI - MirrorAttack.ProcessPlayerMirrorAI(curPlayer, tick) + #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) - - #---影响属性刷新--------------------------------------------- - #是否刷新列表 - 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() + #ProcessPassiveSkill(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) + #PlayerFB.DoPlayerFBTimeProcess(curPlayer, tick) #挂机收益 - PlayerGuaji.ProcessGuaji(curPlayer) - - #PK/boss状态 - ProcessPKBossState(curPlayer, tick) + #PlayerGuaji.ProcessGuaji(curPlayer) #恶意攻击时间处理 - AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick) + #AttackCommon.ProcessMaliciousAttackPlayer(curPlayer, tick) #成就 PlayerSuccess.FinishDelayAddSuccessProgress(curPlayer, tick, False) #限时抢购 @@ -1281,15 +1069,15 @@ #神秘商店刷新 FunctionNPCCommon.CheckMysticalShopRefresh(curPlayer, tick) #活跃放置 - PlayerActivity.ProcessActivityPlace(curPlayer) + #PlayerActivity.ProcessActivityPlace(curPlayer) #自定义场景 - FBLogic.OnCustomSceneProcess(curPlayer, tick) + #FBLogic.OnCustomSceneProcess(curPlayer, tick) #炼器 - PlayerActLianqi.OnProcess(curPlayer) + #PlayerActLianqi.OnProcess(curPlayer) #仙盟攻城战 - PlayerActFamilyGCZ.OnProcess(curPlayer) + #PlayerActFamilyGCZ.OnProcess(curPlayer) #跨服数据同步,放最后 - CrossPlayerData.ProcessCrossPlayer(curPlayer, tick) + #CrossPlayerData.ProcessCrossPlayer(curPlayer, tick) return def ProcessPlayerMinute(curPlayer, tick): @@ -1423,66 +1211,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) @@ -1490,40 +1218,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