From 2bca56e5df150d46e0f218a4e1af5e3dd81a0bcb Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 16 五月 2024 16:40:44 +0800 Subject: [PATCH] 10159 [新增]异兽入侵 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 214 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 132 insertions(+), 82 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py index b837393..fce553b 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py @@ -54,6 +54,72 @@ RebornType_ShentongSkill, # 神通复活 - 由主角自己触发,灵宠触发的神通技能归为灵宠复活 ) = range(1, 1 + 3) +Def_FactionA = 1 +Def_FactionB = 2 + +class TurnFightBattle(): + + def __init__(self): + self.CleaerBat() + return + + def CleaerBat(self): + self.curPlayer = None + self.mapID = 0 + self.funcLineID = 0 + self.tagType = 0 + self.tagID = 0 + self.valueList = [] + + self.factionObjListDict = {} # 阵营所有战斗实例,包含主体、灵宠 {阵营:[obj, ...], ...} + self.factionMainObjListDict = {} # 阵营所有战斗主体, {阵营:[obj, ...], ...} + self.objTotalHurtDict = {} # 战斗实例累计输出 {objID:totalHurtValue, ...} + self.factionTotalHurtDict = {} # 阵营累计输出 {faction:totalHurtValue, ...} + self.fbData = {} # 战斗关联副本自定义相关数据 {key:value, ...} + return + + def SetBattle(self, curPlayer, mapID, funcLineID, tagType, tagID, valueList): + self.curPlayer = curPlayer + self.mapID = mapID + self.funcLineID = funcLineID + self.tagType = tagType + self.tagID = tagID + self.valueList = valueList + return + + def SetFactionObj(self, faction, objList, mainObjList): + self.factionObjListDict[faction] = objList + self.factionMainObjListDict[faction] = mainObjList + return + + def GetTagMainObj(self): + ## 获取对方战斗主体 + if Def_FactionB not in self.factionMainObjListDict: + return + mainObjList = self.factionMainObjListDict[Def_FactionB] + if not mainObjList: + return + return mainObjList[0] + + def AddObjHurtValue(self, curObj, hurtValue): + objID = curObj.GetID() + faction = GameObj.GetFaction(curObj) + updHurtValue = self.objTotalHurtDict.get(objID, 0) + hurtValue + self.objTotalHurtDict[objID] = updHurtValue + + factionHurtValue = self.factionTotalHurtDict.get(faction, 0) + hurtValue + self.factionTotalHurtDict[faction] = factionHurtValue + + # 玩家阵营 + if faction == Def_FactionA: + FBLogic.OnTurnFightPlayerFactionHurt(self.curPlayer, self.mapID, self.funcLineID, curObj, hurtValue, factionHurtValue) + return updHurtValue + +g_turnFightBattle = TurnFightBattle() +def GetTurnFightBattle(): + global g_turnFightBattle + return g_turnFightBattle + def GetObjName(gameObj): objName = gameObj.GetName() faction = GameObj.GetFaction(gameObj) @@ -61,7 +127,7 @@ curID = gameObj.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) if not curID and gameObj.GetGameObjType() == IPY_GameWorld.gotNPC: curID = gameObj.GetNPCID() - return "%s%s %s[%s-%s]" % ("A" if faction == 1 else "B", fightPlaceNum, objName, gameObj.GetID(), curID) + return "%s%s %s[%s-%s]" % ("A" if faction == Def_FactionA else "B", fightPlaceNum, objName, gameObj.GetID(), curID) #// B4 10 回合制战斗 #tagCMTurnFight # @@ -178,62 +244,12 @@ factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList} else: return - - fightRet = ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, curPlayer) - if not fightRet: - return - isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet - needSendGameServer, awardItemList, overInfoEx = False, [], {} - overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) - if overRet != None: - needSendGameServer, awardItemList, overInfoEx = overRet - - if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: - SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) - - overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)} - playbackID and overMsg.update({"playbackID":playbackID}) - overInfoEx and overMsg.update(overInfoEx) - SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) - return - -def GetPlayerFactionInfoByCache(playerID): - ## 根据玩家缓存数据获取对阵玩家阵营信息字典 - PropDict, PlusDict = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID, True) # 从缓存中获取,强刷一次最新属性 - skillIDList = [] - SkillInfo = PlusDict.get("SkillInfo", {}) - for _, skillLVDict in SkillInfo.items(): - for skillID, _ in skillLVDict.items(): - skillID = GameWorld.ToIntDef(skillID) - skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID) - if not skillData: - continue - skillIDList.append(skillID) - return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList, "ModelMark":PropDict.get("ModelMark", 0)} - -def ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): - ''' 处理自动回合战斗过程,仅做战斗流程处理,不做及其他功能逻辑 - @param mapID: 可视为功能ID - @param funcLineID: 对功能ID的扩展 - @param factionInfoA: A方阵营信息,playerID 和 npcID 二选一 {"playerID":主体玩家镜像ID, "npcID":主体NPCID, "pet":[{出战灵宠信息兼容玩家缓存的灵宠信息k:v, ...}, ...]} - @param factionInfoB: B方阵营信息 - @param syncPlayer: 需要通知的玩家,可能为None,注意仅做通知用,该玩家可能和AB阵营无任何关系 - @param isSavePlayback: 是否保存战斗回放 - @return: None-无结果;或 (isWin, turnNum, turnMax, factionTotalHurtDict) - isWin: 是否获胜 - turnNum: 打了几回合 - factionTotalHurtDict: 双方伤血统计 - ''' - if syncPlayer: - syncPlayer.SetCanAttack(False) # 该玩家设置为不可被攻击 - playerID = syncPlayer.GetPlayerID() - sightLevel, posX, posY = playerID, syncPlayer.GetPosX(), syncPlayer.GetPosY() - else: - playerID = 0 - sightLevel, posX, posY = 99, 192, 109 # 系统默认处理的层级及坐标 - - factionA, factionB, mainRolePlace = 1, 2, 1 + curPlayer.SetCanAttack(False) # 该玩家设置为不可被攻击 + playerID = curPlayer.GetPlayerID() + sightLevel, posX, posY = playerID, curPlayer.GetPosX(), curPlayer.GetPosY() + + factionA, factionB, mainRolePlace = Def_FactionA, Def_FactionB, 1 objRetA = __SummonFactionObjs(factionA, mainRolePlace, factionInfoA, sightLevel, posX, posY) objRetB = __SummonFactionObjs(factionB, mainRolePlace, factionInfoB, sightLevel, posX, posY) objA, petObjListA, factionSyncInfoA = objRetA if objRetA else (None, [], {}) @@ -243,6 +259,11 @@ for gameObj in fightObjList: TurnFightObjOverReset(gameObj, tick) return + + tfBattle = GetTurnFightBattle() + tfBattle.CleaerBat() + tfBattle.SetBattle(curPlayer, mapID, funcLineID, tagType, tagID, valueList) + playerIDA = objA.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0 playerIDB = objB.GetDictByKey(ChConfig.Def_NPC_Dict_MirrorPlayerID) # 可能为0,非玩家镜像时为0 @@ -255,6 +276,8 @@ factionListA = petObjListA + [objA] factionListB = petObjListB + [objB] atkFactionList = [factionListA, factionListB] + tfBattle.SetFactionObj(factionA, factionListA, [objA]) + tfBattle.SetFactionObj(factionB, factionListB, [objB]) # 设置战斗主体 objA.SetDict(ChConfig.Def_Obj_Dict_TurnEnemyID, objB.GetID()) @@ -266,8 +289,8 @@ if not gameObj: continue faction = GameObj.GetFaction(gameObj) - tagGameObj = objB if faction == 1 else objA - TurnFightObjStartInit(playerID, gameObj, tagGameObj, tick) + tagGameObj = objB if faction == Def_FactionA else objA + TurnFightObjStartInit(mapID, playerID, gameObj, tagGameObj, tick) #一个回合攻击顺序,为了后续逻辑统一,都是先确定好顺序 sortType = 2 # 攻击顺序排序方式 @@ -284,19 +307,19 @@ for factionObjList in atkFactionList: fightObjList.append(factionObjList[i]) - SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) isWin = None for turnNum in range(1, turnMax + 1): GameWorld.DebugLog("【----- 回合制战斗轮次: %s -----】" % turnNum) - SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_Fighting, turnNum, turnMax) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Fighting, turnNum, turnMax) # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等 for gameObj in fightObjList: if not gameObj: continue faction = GameObj.GetFaction(gameObj) - tagGameObj = objB if faction == 1 else objA + tagGameObj = objB if faction == Def_FactionA else objA TurnFightObjPerTurnStart(gameObj, tagGameObj, turnNum, tick) isWin = CheckIswin(objA, objB) @@ -314,7 +337,7 @@ objType = gameObj.GetGameObjType() objID = gameObj.GetID() - SyncTurnFightObjAction(syncPlayer, turnNum, objType, objID) + SyncTurnFightObjAction(curPlayer, turnNum, objType, objID) if GameObj.GetHP(gameObj) <= 0: # 复活时机在自己行动节点 @@ -325,7 +348,7 @@ objName = GetObjName(gameObj) curHP = GameObj.GetHP(gameObj) - tagGameObj = objB if faction == 1 else objA + tagGameObj = objB if faction == Def_FactionA else objA tagObjType = tagGameObj.GetGameObjType() tagObjID = tagGameObj.GetID() tagHP = GameObj.GetHP(tagGameObj) @@ -343,20 +366,19 @@ if isWin != None: break + isWin = FBLogic.OnTurnFightIsWin(curPlayer, mapID, funcLineID, tagType, tagID, valueList, isWin) GameWorld.DebugLog("--- 战斗结束处理 --- isWin=%s" % isWin) isWin = 1 if isWin else 0 # 统计总伤害 - factionTotalHurtDict = {} + factionTotalHurtDict = tfBattle.factionTotalHurtDict for gameObj in fightObjList: if not gameObj: continue faction = GameObj.GetFaction(gameObj) objName = GetObjName(gameObj) objID = gameObj.GetID() - totalHurtEx = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue - totalHurt = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx - factionTotalHurtDict[faction] = factionTotalHurtDict.get(faction, 0) + totalHurt + totalHurt = tfBattle.objTotalHurtDict.get(objID, 0) GameWorld.DebugLog("%s objID=%s,faction=%s, 总输出: %s" % (objName, objID, faction, totalHurt)) for faction, totalHurt in factionTotalHurtDict.items(): GameWorld.DebugLog("faction=%s, 阵营总输出: %s" % (faction, totalHurt)) @@ -364,19 +386,51 @@ GameWorld.DebugLog("A剩余血量: %s / %s" % (GameObj.GetHP(objA), GameObj.GetMaxHP(objA))) GameWorld.DebugLog("B剩余血量: %s / %s" % (GameObj.GetHP(objB), GameObj.GetMaxHP(objB))) - SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_FightEnd, turnNum, turnMax) - - for gameObj in fightObjList: - TurnFightObjOverReset(gameObj, tick) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_FightEnd, turnNum, turnMax) playbackID = 0 # 战斗回放ID,可根据该ID查看回放 #playbackInfo = "" # 战斗回放信息 - if isSavePlayback: - pass + #if isSavePlayback: + # pass GameWorld.DebugLog("===== 回合制战斗结束: mapID=%s,funcLineID=%s,playerIDA=%s,playerIDB=%s,isWin=%s" % (mapID, funcLineID, playerIDA, playerIDB, isWin)) - return isWin, turnNum, turnMax, factionTotalHurtDict, playbackID + + # 战斗结束后处理 + fightRet = [isWin, turnNum, turnMax, factionTotalHurtDict, playbackID] + + needSendGameServer, awardItemList, overInfoEx = False, [], {} + overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) + if overRet != None: + needSendGameServer, awardItemList, overInfoEx = overRet + + if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: + SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) + + overMsg = {"isWin":isWin, FBCommon.Over_itemInfo:FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(Def_FactionA, 0)} + playbackID and overMsg.update({"playbackID":playbackID}) + overInfoEx and overMsg.update(overInfoEx) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) + + # 都处理完毕了,回收对象,重置数据 + for gameObj in fightObjList: + TurnFightObjOverReset(gameObj, tick) + tfBattle.CleaerBat() + return + +def GetPlayerFactionInfoByCache(playerID): + ## 根据玩家缓存数据获取对阵玩家阵营信息字典 + PropDict, PlusDict = PlayerViewCacheTube.GetPlayerPropPlusDictByID(playerID, True) # 从缓存中获取,强刷一次最新属性 + skillIDList = [] + SkillInfo = PlusDict.get("SkillInfo", {}) + for _, skillLVDict in SkillInfo.items(): + for skillID, _ in skillLVDict.items(): + skillID = GameWorld.ToIntDef(skillID) + skillData = GameWorld.GetGameData().GetSkillBySkillID(skillID) + if not skillData: + continue + skillIDList.append(skillID) + return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList, "ModelMark":PropDict.get("ModelMark", 0)} def __SummonFactionObjs(faction, mainRolePlace, objInfo, sightLevel, posX, posY): '''召唤阵营战斗实例 @@ -608,15 +662,14 @@ gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightTimeline, turnNum * 100 + actionNum) return -def TurnFightObjStartInit(playerID, gameObj, tagObj, tick): +def TurnFightObjStartInit(mapID, playerID, gameObj, tagObj, tick): ## 回合制战斗实例初始化 if not gameObj: return mainRolePlace = gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightMainRolePlace) + gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightMapID, mapID) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnFightID, playerID) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnRebornCount, 0) - gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, 0) - gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnSkillSuccessPetState, 0) gameObj.SetDict(ChConfig.Def_Obj_Dict_TurnAttackOverPetState, 0) SetTimeline(gameObj, 1, 0) @@ -839,15 +892,12 @@ def AddTurnObjHurtValue(curObj, tagObj, hurtType, hurtValue, lostHP, curSkill=None): if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightTimeline): return + tfBattle = GetTurnFightBattle() curID = curObj.GetID() tagID = tagObj.GetID() skillID = curSkill.GetSkillID() if curSkill else 0 - totalHurtEx = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurtEx) * ChConfig.Def_PerPointValue - totalHurt = curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnTotalHurt) + totalHurtEx if curID != tagID: - totalHurt += hurtValue - curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurt, totalHurt % ChConfig.Def_PerPointValue) - curObj.SetDict(ChConfig.Def_Obj_Dict_TurnTotalHurtEx, totalHurt / ChConfig.Def_PerPointValue) + totalHurt = tfBattle.AddObjHurtValue(curObj, hurtValue) GameWorld.DebugLog(" 伤血: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,totalHurt=%s,lostHP=%s,tagHP=%s" % (curID, tagID, skillID, hurtType, hurtValue, totalHurt, lostHP, GameObj.GetHP(tagObj))) else: -- Gitblit v1.8.0