From 8f7a29d699d30c14695a1a47a6fb70f45f9f4177 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 17 十月 2024 16:50:18 +0800 Subject: [PATCH] 10263 【越南】【英文】后端支持NPC仿真实玩家战斗和快速战斗 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py | 113 +++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 79 insertions(+), 34 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py index 0e70ffb..64e1b04 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py @@ -24,6 +24,7 @@ import PlayerTrade import PlayerTeam import SkillCommon +import MirrorAttack import GameMap import FBLogic import GameWorldProcess @@ -1214,6 +1215,37 @@ return #--------------------------------------------------------------------- +def OnDelayDeleteMirror(curPlayer, tick): + addTick = curPlayer.GetDictByKey("DelayDeleteMirror") + if not addTick: + return + if tick - addTick < 10000: # 10s后回收 + return + DeleteMirror(curPlayer, False) + return True + +def DeleteMirror(curPlayer, isDelay=False): + ''' 回收镜像玩家 + ''' + if not curPlayer.GetRealPlayerID(): + return + playerID = curPlayer.GetPlayerID() + if isDelay: + #由于系统场次快速战斗原因,如果立马回收可能导致某个功能出现问题 + #如被动技能效果,执行顺序的原因,如击杀后 -> 结算 -> 回收玩家 -> 触发被动技能,导致异常 + GameWorld.DebugLog("镜像玩家设置延迟回收!", playerID) + SetPlayerSightLevel(curPlayer, playerID) + tick = GameWorld.GetGameWorld().GetTick() + curPlayer.SetDict("DelayDeleteMirror", tick) + return + GameWorld.DebugLog("镜像玩家回收!", playerID) + #杀死所有召唤的灵 + KillPlayerSummonNPC(curPlayer) + #召唤回出战的宠物 + PetControl.ReCallFightPet(curPlayer) + curPlayer.DeleteMirror() + return + ##杀死玩家所有的召唤兽死亡 # @param curPlayer 玩家实例 # @return 返回值无意义 @@ -1324,6 +1356,8 @@ UpdateOnLineTime(curPlayer, tick) PassiveBuffEffMng.OnPlayerLeaveMap(curPlayer) + + MirrorAttack.OnPlayerLeaveMap(curPlayer) #离开地图清空恶意攻击自己玩家信息 if curPlayer.GetPlayerID() in PyGameData.g_maliciousAttackDict: @@ -4611,7 +4645,9 @@ # @return 返回值无意义 # @remarks 刷新玩家所有状态 def RefreshAllState(self, isSyncBuff=False, billboardFunc=None, isForce=False): - GameWorld.DebugLog("Start RefreshAllState!!!") + curPlayer = self.__Player + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("Start RefreshAllState!!!", playerID) self.RefreshPlayerActionState() self.RefreshPlayerAttrState(billboardFunc, isForce) @@ -4623,8 +4659,9 @@ # @return 返回值无意义 # @remarks 刷新玩家所有状态 def ReCalcAllState(self): - GameWorld.DebugLog("Start ReCalcAllState!!!") curPlayer = self.__Player + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("Start ReCalcAllState!!!", playerID) for funcIndex in ChConfig.CalcAttrFuncList: ClearCalcAttrListValue(curPlayer, funcIndex) @@ -4659,7 +4696,7 @@ PlayerFace.CalcFaceAttr(curPlayer) PlayerFace.CalcFacePicAttr(curPlayer) self.RefreshAllState(isForce=True) - GameWorld.DebugLog("End ReCalcAllState!!!") + GameWorld.DebugLog("End ReCalcAllState!!!", playerID) return @@ -4679,14 +4716,15 @@ if curPlayer.GetDictByKey(ChConfig.Def_Player_RefreshAttrByBuff) != 1: return - GameWorld.DebugLog("Start RefreshPlayerAttrByBuffEx!!!") + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("Start RefreshPlayerAttrByBuffEx!!!", playerID) beforeMaxHP = GameObj.GetMaxHP(curPlayer) beforeMoveSpeedValue = GetSpeedValue(curPlayer) #构建玩家刷新通知客户端字典, 缓存[索引, 数值] playerStateDict = {} for index in xrange(1, ChConfig.Def_Calc_AllAttrType_MAX): playerStateDict.update({index:EffGetSet.GetValueByEffIndex(curPlayer, index)}) - #GameWorld.DebugLog("刷属性前=%s" % playerStateDict) + #GameWorld.DebugLog("刷属性前=%s" % playerStateDict, playerID) #self.PrintAttr(curPlayer, "刷之前") #---------------------------开始计算------------------------------------- curPlayer.BeginRefreshState() @@ -4700,7 +4738,7 @@ self.__DoRefreshAttrAfterLogic(beforeMaxHP, beforeMoveSpeedValue, playerStateDict) curPlayer.SetDict(ChConfig.Def_Player_RefreshAttrByBuff, 0) - GameWorld.DebugLog("End RefreshPlayerAttrByBuffEx!!!") + GameWorld.DebugLog("End RefreshPlayerAttrByBuffEx!!!", playerID) return @@ -4772,7 +4810,8 @@ PlayerGubao.CalcGubaoAttr(curPlayer) # 古宝定位为对贯通所有游戏功能系统的属性玩法,所以每次都重新刷新 - GameWorld.DebugLog("Start RefreshPlayerAttrStateEx!!!") + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("Start RefreshPlayerAttrStateEx!!!", playerID) #beforeAtkInterval = curPlayer.GetAtkInterval() beforeMaxHP = GameObj.GetMaxHP(curPlayer) @@ -4784,7 +4823,7 @@ playerStateDict = {} for index in xrange(1, ChConfig.Def_Calc_AllAttrType_MAX): playerStateDict.update({index:EffGetSet.GetValueByEffIndex(curPlayer, index)}) - #GameWorld.DebugLog("刷属性前=%s" % playerStateDict) + #GameWorld.DebugLog("刷属性前=%s" % playerStateDict, playerID) #self.PrintAttr(curPlayer, "刷之前") #---------------------------开始计算------------------------------------- curPlayer.BeginRefreshState() @@ -4811,7 +4850,7 @@ attrInfo, insidePerAttrDict = GetCalcAttrListValue(curPlayer, funcIndex)[:2] if attrInfo == notAttrList and not insidePerAttrDict: continue - GameWorld.DebugLog("功能点属性: %s(%s), %s, 内层百分比附加: %s" % (funcIndex, ChConfig.FuncIndexName.get(funcIndex, ""), attrInfo, insidePerAttrDict)) + GameWorld.DebugLog("功能点属性: %s(%s), %s, 内层百分比附加: %s" % (funcIndex, ChConfig.FuncIndexName.get(funcIndex, ""), attrInfo, insidePerAttrDict), playerID) funcAttrInfoList[funcIndex] = attrInfo funcInsidePerAttrList[funcIndex] = insidePerAttrDict # 不同功能点间的数值累加,需使用支持衰减递增的计算方式 @@ -4821,7 +4860,7 @@ # 2.2 将基础属性累加到玩家身上 if baseAttrDict or baseAttrNolineDict: # 因为基础属性会影响战斗属性计算,所以先统计增加基础属性 - GameWorld.DebugLog("功能附加点: baseAttrDict=%s,baseAttrNolineDict=%s" % (baseAttrDict, baseAttrNolineDict)) + GameWorld.DebugLog("功能附加点: baseAttrDict=%s,baseAttrNolineDict=%s" % (baseAttrDict, baseAttrNolineDict), playerID) CalcLineEffect.ChangePlayerAttrInLineEffectList(curPlayer, baseAttrDict) CalcNoLineEffect.ChangePlayerAttrInNoLineEffectList(curPlayer, baseAttrNolineDict) @@ -4834,11 +4873,11 @@ funcAttrInfoList[ChConfig.Def_CalcAttrFunc_LingGenQuailty] = lingGenQualityAttrList funcInsidePerAttrList[ChConfig.Def_CalcAttrFunc_LingGenQuailty] = lingGenQualityInsidePerAttrDict GameWorld.DebugLog("功能点属性: %s(%s), %s, 内层百分比附加: %s" - % (ChConfig.Def_CalcAttrFunc_RoleBase, ChConfig.FuncIndexName.get(ChConfig.Def_CalcAttrFunc_RoleBase, ""), roleBaseAttrInfo, roleInsidePerAttrDict)) + % (ChConfig.Def_CalcAttrFunc_RoleBase, ChConfig.FuncIndexName.get(ChConfig.Def_CalcAttrFunc_RoleBase, ""), roleBaseAttrInfo, roleInsidePerAttrDict), playerID) GameWorld.DebugLog("功能点属性: %s(%s), %s, 内层百分比附加: %s" - % (ChConfig.Def_CalcAttrFunc_LingGenQuailty, ChConfig.FuncIndexName.get(ChConfig.Def_CalcAttrFunc_LingGenQuailty, ""), lingGenQualityAttrList, lingGenQualityInsidePerAttrDict)) + % (ChConfig.Def_CalcAttrFunc_LingGenQuailty, ChConfig.FuncIndexName.get(ChConfig.Def_CalcAttrFunc_LingGenQuailty, ""), lingGenQualityAttrList, lingGenQualityInsidePerAttrDict), playerID) - #self.PrintAttr(curPlayer, "基础后") + #self.PrintAttr(curPlayer, "基础后", playerID) # 3.计算战斗属性 # 3.1 战斗属性层级交叉影响基值数值汇总 @@ -4847,7 +4886,7 @@ funcAttrInfoList[ChConfig.Def_CalcAttrFunc_LingGen], funcAttrInfoList[ChConfig.Def_CalcAttrFunc_LingGenQuailty], ]) - #GameWorld.DebugLog("基础层级: %s" % baseAttrList) + #GameWorld.DebugLog("基础层级: %s" % baseAttrList, playerID) # 功能点交叉影响非线性层对应属性基值列表 funcAttrPerInfo = {ChConfig.TYPE_Calc_BaseAtkAddPer:baseAttrList, @@ -4881,7 +4920,7 @@ if not battleNoLineAttrDict: continue addAttrDict = {} - #GameWorld.DebugLog("交叉功能点: i=%s,%s" % (i,battleNoLineAttrDict)) + #GameWorld.DebugLog("交叉功能点: i=%s,%s" % (i,battleNoLineAttrDict), playerID) for noLineAttrType, addAttrPer in battleNoLineAttrDict.items(): if noLineAttrType not in funcAttrPerInfo or noLineAttrType not in ChConfig.FuncNoLinearAttrDict: continue @@ -4896,14 +4935,14 @@ baseValue = useAttrDict[attrType] # 只是用到目标功能的基值 addValue = int(baseValue * attrRate) addAttrDict[attrType] = addAttrDict.get(attrType, 0) + addValue - #GameWorld.DebugLog(" attrID=%s,per=%s,rate=%s,baseValue=%s,attrType=%s,addValue=%s" % (noLineAttrType, addAttrPer, attrRate, baseValue, attrType, addValue)) + #GameWorld.DebugLog(" attrID=%s,per=%s,rate=%s,baseValue=%s,attrType=%s,addValue=%s" % (noLineAttrType, addAttrPer, attrRate, baseValue, attrType, addValue), playerID) if addAttrDict: # 增加的数值统计到百分比属性所属功能点 # 如符文有个武器攻击百分比增加属性,增加的数值属于符文功能,不属于武器功能点的,只是基值使用了武器攻击 funcCrossAttrPerInfoDict[i] = addAttrDict # 先都统计完后再累加到对应功能属性里,不然可能会导致功能基值变更 - GameWorld.DebugLog("交叉影响属性: %s" % funcCrossAttrPerInfoDict) + GameWorld.DebugLog("交叉影响属性: %s" % funcCrossAttrPerInfoDict, playerID) # 3.3 统计所有功能固定属性影响累加 allFixAttrDict = {} # 固定属性层级总属性基值 @@ -4927,8 +4966,8 @@ addValueExDict[fixAttrType] = addValueEx fixAttrPerAddExDict[funcIndex] = addValueExDict - GameWorld.DebugLog("固定属性总和: %s" % allFixAttrDict) - GameWorld.DebugLog("固定百分比附加属性: %s" % fixAttrPerAddExDict) + GameWorld.DebugLog("固定属性总和: %s" % allFixAttrDict, playerID) + GameWorld.DebugLog("固定百分比附加属性: %s" % fixAttrPerAddExDict, playerID) # 4. 计算属性及战力, 需在计算buff层之前计算 curLV = curPlayer.GetLV() @@ -4981,14 +5020,14 @@ elif mfpType == ShareDefine.Def_MFPType_Wash: OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Wash, mfpTotal) - #GameWorld.DebugLog("整体层级线性属性: %s" % allAttrList) + #GameWorld.DebugLog("整体层级线性属性: %s" % allAttrList, playerID) # 5.被动技能附加属性,不算战力 passiveSkillAttrList = [{} for _ in range(4)] SkillShell.CalcPassiveAttr_Effect(curPlayer, passiveSkillAttrList) # 属性类技能与buff同层 for funcIndex in ChConfig.CalcAttrFuncSkillList: passiveSkillAttrList = AddAttrListValue([passiveSkillAttrList, funcAttrInfoList[funcIndex]]) - GameWorld.DebugLog("无战力被动属性: %s" % passiveSkillAttrList) + GameWorld.DebugLog("无战力被动属性: %s" % passiveSkillAttrList, playerID) skillFixAttrExDict = {} skillFixAddPerDict = passiveSkillAttrList[ChConfig.CalcAttr_BattleNoline] @@ -5040,14 +5079,14 @@ while billFuncCnt > 0 and PyGameData.g_refreshAttrBillboardFunc: billFuncCnt -= 1 billboardFunc = PyGameData.g_refreshAttrBillboardFunc.pop(0) - GameWorld.DebugLog("回调排行榜: %s" % billboardFunc) + GameWorld.DebugLog("回调排行榜: %s" % billboardFunc, playerID) billboardFunc(curPlayer, isForceUpdate=True) # 暂停刷新属性标志,必须被调用 curPlayer.SetDict(ChConfig.Def_Player_RefreshAttr, 0) curPlayer.SetDict(ChConfig.Def_Player_RefreshAttrByBuff, 0) curPlayer.SetDict(ChConfig.Def_Player_HadRefreshAttr, 1) - GameWorld.DebugLog("End RefreshPlayerAttrStateEx!!!") + GameWorld.DebugLog("End RefreshPlayerAttrStateEx!!!", playerID) return True @@ -5082,6 +5121,7 @@ def __RefreshBuffAttr(self): ## 刷新buff层属性,该层属性只会改变玩家最终属性,不会影响战力等 curPlayer = self.__Player + playerID = curPlayer.GetPlayerID() allAttrListBuffs = [{} for _ in range(4)] # 6.计算buff属性, buff层级的不算如战斗力 # 算战斗力总值时该层影响的数值不统计,但刷属性时需计算 @@ -5105,7 +5145,7 @@ # 刷新攻击速度 self.__SetAtkInterval() - GameWorld.DebugLog("Buff层属性: %s" % allAttrListBuffs) + GameWorld.DebugLog("Buff层属性: %s" % allAttrListBuffs, playerID) return def __DoRefreshGMAttr(self): @@ -5349,8 +5389,9 @@ def SendModuleFightPowerPack(self, curPlayer, mfpDict): mfpDataList = [] totalFightPower = 0 - GameWorld.DebugLog("战力功能点: %s" % ChConfig.MFPTypeAttrFuncIndexDict) - GameWorld.DebugLog("模块战力: %s" % mfpDict) + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("战力功能点: %s" % ChConfig.MFPTypeAttrFuncIndexDict, playerID) + GameWorld.DebugLog("模块战力: %s" % mfpDict, playerID) for mfpType, fightPower in mfpDict.items(): SetMFPFightPower(curPlayer, mfpType, fightPower) mfpData = ChPyNetSendPack.tagMCModuleFightPower() @@ -5383,7 +5424,7 @@ ChConfig.Def_PDictType_FightPower) NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FightPower_HighestEx, highestFightPower / ChConfig.Def_PerPointValue, ChConfig.Def_PDictType_FightPower) - GameWorld.DebugLog("总战力: %s, 历史最高战力: %s, beforeFightPower=%s" % (totalFightPower, highestFightPower, beforeFightPower)) + GameWorld.DebugLog("总战力: %s, 历史最高战力: %s, beforeFightPower=%s" % (totalFightPower, highestFightPower, beforeFightPower), playerID) PlayerBillboard.UpdatePlayerFPTotalBillboard(curPlayer) # 记录开服活动数据,开服活动前X天理论上不会超过20E,暂不处理 OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_FightPower, min(totalFightPower, ChConfig.Def_UpperLimit_DWord)) @@ -5394,21 +5435,22 @@ def __RefreshMoveSpeed(self, allAttrListBuffs): ## 刷新移动速度 curPlayer = self.__Player + playerID = curPlayer.GetPlayerID() moveSpeedFormat = IpyGameDataPY.GetFuncCfg("MoveSpeed") if PlayerTruck.GetHaveAutoTruck(curPlayer): speed = IpyGameDataPY.GetFuncCfg("MoveSpeed", 3) - GameWorld.DebugLog("运镖固定速度值: speed=%s" % speed) + GameWorld.DebugLog("运镖固定速度值: speed=%s" % speed, playerID) else: speed = GetSpeedNotBuff(curPlayer) - GameWorld.DebugLog("功能移动速度值: speed=%s" % speed) + GameWorld.DebugLog("功能移动速度值: speed=%s" % speed, playerID) # 骑乘状态加上骑乘附加速度 if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse: speedHorse = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_SpeedHorse) speed += speedHorse - GameWorld.DebugLog(" 骑乘状态附加值: %s, speed=%s" % (speedHorse, speed)) + GameWorld.DebugLog(" 骑乘状态附加值: %s, speed=%s" % (speedHorse, speed), playerID) buffBattleAttr = allAttrListBuffs[ChConfig.CalcAttr_Battle] @@ -5419,14 +5461,14 @@ if buffSpeed or buffSpeedPer: speed = int(speed * (ShareDefine.Def_MaxRateValue + buffSpeedPer) / float(ShareDefine.Def_MaxRateValue) + buffSpeed) - GameWorld.DebugLog(" buff影响后速度值: speed=%s,buffSpeedPer=%s,buffSpeed=%s" % (speed, buffSpeedPer, buffSpeed)) + GameWorld.DebugLog(" buff影响后速度值: speed=%s,buffSpeedPer=%s,buffSpeed=%s" % (speed, buffSpeedPer, buffSpeed), playerID) speed = max(speed, 0) #防小于0错误 if GetSpeedValue(curPlayer) != speed: SetSpeedValue(curPlayer, speed) moveSpeed = eval(FormulaControl.GetCompileFormula("MoveSpeed", moveSpeedFormat)) curPlayer.SetSpeed(moveSpeed) - GameWorld.DebugLog("公式计算后移动频率: moveSpeed=%s 毫秒/格" % moveSpeed) + GameWorld.DebugLog("公式计算后移动频率: moveSpeed=%s 毫秒/格" % moveSpeed, playerID) fightPet = curPlayer.GetPetMgr().GetFightPet() #无出战宠物 @@ -5454,9 +5496,10 @@ # @return 返回值无意义 # @remarks 刷新玩家所有行为BUFF状态 def RefreshPlayerActionState(self): - GameWorld.DebugLog("Start RefreshPlayerActionState!!!") - #curTime = time.clock() curPlayer = self.__Player + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("Start RefreshPlayerActionState!!!", playerID) + #curTime = time.clock() #先清除所有状态 OperControlManager.ClearObjActionState(curPlayer) @@ -5654,6 +5697,8 @@ #PlayerTJG.PlayerTJGReborn(curPlayer, tick) GameObj.ClearPyPlayerState(curPlayer) + + MirrorAttack.OnPlayerDead(curPlayer) return -- Gitblit v1.8.0