From 330c5a30027fd33e2f77643f4c3c2f77b4d91a0f Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 10 五月 2024 16:42:13 +0800 Subject: [PATCH] 10019 【砍树】回合战斗(回合战斗NPC相关属性统一调整到NPC扩展表;去除副本回合制表,新增冒险关卡表;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 124 ++++++++++++++++------------------------ 1 files changed, 50 insertions(+), 74 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 828d3f5..b20f460 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py @@ -33,11 +33,9 @@ import SkillShell import BuffSkill import FBCommon -import ItemControler import PassiveBuffEffMng import FBLogic import ShareDefine -import PlayerTask # 回合战斗流程状态 ( @@ -72,7 +70,8 @@ # tagHead Head; # DWORD MapID; // 自定义地图ID,可用于绑定战斗场景功能(如野外关卡,爬塔功能,竞技场等) # WORD FuncLineID; -# DWORD PlayerID; // 战斗目标玩家ID,可为0,某些功能可能有用,如竞技场 +# BYTE TagType; // 战斗目标类型,0-NPC,1-玩家,2-队伍 +# DWORD TagID; // 战斗目标类型对应的ID # BYTE ValueCount; # DWORD ValueList[ValueCount]; // 附加值列表,可选,具体含义由MapID决定 #}; @@ -80,12 +79,13 @@ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mapID = clientData.MapID funcLineID = clientData.FuncLineID - tagPlayerID = clientData.PlayerID + tagType = clientData.TagType + tagID = clientData.TagID valueList = clientData.ValueList playerID = curPlayer.GetPlayerID() - if tagPlayerID: - if playerID == tagPlayerID: + if tagType == ChConfig.TurnBattle_TagType_Player: + if tagID == playerID: GameWorld.DebugLog("不能打自己!", playerID) return @@ -95,15 +95,16 @@ if FBCommon.CheckCanEnterFBComm(curPlayer, mapID, funcLineID, fbIpyData, fbLineIpyData) != ShareDefine.EntFBAskRet_OK: return - if not FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagPlayerID, valueList): + reqRet = FBLogic.OnTurnFightRequest(curPlayer, mapID, funcLineID, tagType, tagID, valueList) + if not reqRet: return # 需要发送到GameServer验证 if mapID in ChConfig.Def_TFMapID_SendToGameServer: - SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagPlayerID, valueList]) + SendToGameServer_TurnFight(curPlayer, "TurnFightRequest", [mapID, funcLineID, tagType, tagID, valueList]) return - DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) + DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) return def SendToGameServer_TurnFight(curPlayer, msgType, dataMsg=""): @@ -121,105 +122,79 @@ return if msgType == "TurnFightRequest": - mapID, funcLineID, tagPlayerID, valueList = dataMsg - DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) + mapID, funcLineID, tagType, tagID, valueList = dataMsg + DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) elif msgType == "TurnFightOver": - mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList = dataMsg - FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList, ret) + mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList = dataMsg + FBLogic.OnTurnFightOver_GameServerRet(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList, ret) return -def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): +def DoTurnFightProcess(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): ## 执行回合制战斗的完整流程 if curPlayer.GetSightLevel() != curPlayer.GetID(): PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID()) - SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Start) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Start) - if tagPlayerID: - PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagPlayerID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) + if tagType == ChConfig.TurnBattle_TagType_Player: + PlayerViewCacheTube.GetPlayerPropDataCall(curPlayer, tagID, DoTrunFightVSPlayer, [mapID, funcLineID, valueList], True) return - DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) + DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) - SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) return def DoTrunFightVSPlayer(curPlayer, tagPlayerID, callData, PropDict): + tagType = ChConfig.TurnBattle_TagType_Player + tagID = tagPlayerID mapID, funcLineID, valueList = callData if PropDict and curPlayer.GetPlayerID() != tagPlayerID: tick = GameWorld.GetGameWorld().GetTick() - DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick) - SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Over) + DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Over) return -def DoTrunFight(curPlayer, mapID, funcLineID, tagPlayerID, valueList, tick): +def DoTrunFight(curPlayer, mapID, funcLineID, tagType, tagID, valueList, tick): + if not tagID: + return playerID = curPlayer.GetPlayerID() factionInfoA = GetPlayerFactionInfoByCache(playerID) - ipyData = None - if tagPlayerID: - factionInfoB = GetPlayerFactionInfoByCache(tagPlayerID) - else: - ipyData = IpyGameDataPY.GetIpyGameData("FBTurn", mapID, funcLineID) - if not ipyData: - return - npcID = ipyData.GetNPCID() - if not npcID: - return - petNPCIDList = ipyData.GetPetNPCIDList() + if tagType == ChConfig.TurnBattle_TagType_Player: + factionInfoB = GetPlayerFactionInfoByCache(tagID) + elif tagType == ChConfig.TurnBattle_TagType_NPC: + npcID = tagID + npcDataEx = NPCCommon.GetNPCDataEx(npcID) + petNPCIDList = npcDataEx.GetPetNPCIDList() petCacheInfo = [] # 从配表中读取组合,技能默认取NPC表配置的 for state, petNPCID in enumerate(petNPCIDList, 1): petCacheInfo.append({"npcID":petNPCID, "state":state, "quality":0}) skillIDExList = [] # NPC为附加技能,因为NPC表本身可能有配置技能 - skillIDExList.extend(ipyData.GetElfSkillIDList()) - skillIDExList.extend(ipyData.GetSTSkillIDList()) + skillIDExList.extend(npcDataEx.GetElfSkillIDList()) + skillIDExList.extend(npcDataEx.GetSTSkillIDList()) factionInfoB = {"npcID":npcID, "pet":petCacheInfo, "skillIDExList":skillIDExList} + else: + return - fightRet = ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, curPlayer) + fightRet = ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, curPlayer) if not fightRet: return isWin, turnNum, turnMax, factionTotalHurtDict, playbackID = fightRet - # 结算奖励, awardWay-发放方式(0-不发放, 1-TurnAttack模块统一发放, 2-功能自己决定发放逻辑) - needSendGameServer, awardItemList, awardWay = False, [], 1 - overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagPlayerID, valueList, fightRet) + needSendGameServer, awardItemList = False, [] + overRet = FBLogic.OnTurnFightOver(curPlayer, mapID, funcLineID, tagType, tagID, valueList, fightRet) if overRet != None: - needSendGameServer, awardItemList, awardWay = overRet - - isFirstPass = None - if isWin and ipyData: - passLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FBPassLineID % mapID) - if funcLineID == passLineID + 1: - isFirstPass = True - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FBPassLineID % mapID, funcLineID) - FBCommon.Sync_FBPlayerFBInfoData(curPlayer, mapID) - else: - isFirstPass = False - - if awardWay == 1 and not awardItemList: - # 山寨测试先默认都是首次奖励,正式后需删除 - awardItemList = ipyData.GetAwardItemListFirst() if isFirstPass else ipyData.GetAwardItemList() - - if awardItemList == None: - awardItemList = [] - - GameWorld.DebugLog("奖励物品: %s, isFirstPass=%s" % (awardItemList, isFirstPass)) - if awardWay == 1 and awardItemList: - ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["TurnFight", False, {"mapID":mapID, "funcLineID":funcLineID}]) + needSendGameServer, awardItemList = overRet if needSendGameServer or mapID in ChConfig.Def_TFMapID_SendToGameServer: - SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagPlayerID, valueList, fightRet, awardItemList]) + SendToGameServer_TurnFight(curPlayer, "TurnFightOver", [mapID, funcLineID, tagType, tagID, valueList, fightRet, awardItemList]) overMsg = {"isWin":isWin, "itemInfo":FBCommon.GetJsonItemList(awardItemList), "totalHurt":factionTotalHurtDict.get(1, 0)} playbackID and overMsg.update({"playbackID":playbackID}) - SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, FightState_Award, turnNum, turnMax, overMsg) - - # 其他... - PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_FBChallenge, 1, [mapID]) - if isWin: - PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_FBPass) + SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, FightState_Award, turnNum, turnMax, overMsg) return def GetPlayerFactionInfoByCache(playerID): @@ -236,7 +211,7 @@ skillIDList.append(skillID) return {"playerID":playerID, "pet":PlusDict.get("Pet"), "skillIDList":skillIDList} -def ProcessAutoTurnFight(mapID, funcLineID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): +def ProcessAutoTurnFight(mapID, funcLineID, tagType, tagID, factionInfoA, factionInfoB, tick, syncPlayer=None, isSavePlayback=False): ''' 处理自动回合战斗过程,仅做战斗流程处理,不做及其他功能逻辑 @param mapID: 可视为功能ID @param funcLineID: 对功能ID的扩展 @@ -308,12 +283,12 @@ for factionObjList in atkFactionList: fightObjList.append(factionObjList[i]) - SyncTurnFightState(syncPlayer, mapID, funcLineID, playerIDB, FightState_PrepareOK, msg=[factionSyncInfoA, factionSyncInfoB]) + SyncTurnFightState(syncPlayer, 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, playerIDB, FightState_Fighting, turnNum, turnMax) + SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_Fighting, turnNum, turnMax) # 回合开始: 做一些每回合重置逻辑或者某些根据回合触发的效果等 for gameObj in fightObjList: @@ -388,7 +363,7 @@ 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, playerIDB, FightState_FightEnd, turnNum, turnMax) + SyncTurnFightState(syncPlayer, mapID, funcLineID, tagType, tagID, FightState_FightEnd, turnNum, turnMax) for gameObj in fightObjList: TurnFightObjOverReset(gameObj, tick) @@ -1186,14 +1161,15 @@ GameWorld.DebugLog(" 攻击失败: curID=%s,tagID=%s,atkOK=%s" % (playerID, tagObjID, atkOK)) return useSkillResult -def SyncTurnFightState(curPlayer, mapID, funcLineID, tagPlayerID, state, turnNum=0, turnMax=0, msg=""): +def SyncTurnFightState(curPlayer, mapID, funcLineID, tagType, tagID, state, turnNum=0, turnMax=0, msg=""): if not curPlayer: return clientPack = ChPyNetSendPack.tagMCTurnFightState() clientPack.Clear() clientPack.MapID = mapID clientPack.FuncLineID = funcLineID - clientPack.PlayerID = tagPlayerID + clientPack.TagType = tagType + clientPack.TagID = tagID clientPack.State = state clientPack.TurnNum = turnNum clientPack.TurnMax = turnMax -- Gitblit v1.8.0