From e81315f997d75f900727af1c456c32277575fb24 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 10 七月 2025 17:01:18 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(主线掉落战利品、装备;主线击杀怪物获得经验、升级;主线装备穿戴、分解;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py | 116 +++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 82 insertions(+), 34 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 6520bac..0311541 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/TurnAttack.py @@ -36,6 +36,7 @@ import SkillCommon import SkillShell import AttackCommon +import FBLogic import random import time @@ -236,6 +237,9 @@ self.startTime = 0 # 开始时间戳,支持毫秒小数 self.costTime = 0 # 单场战斗总耗时,支持毫秒小数 + + #玩家武将行动后击杀目标 + self.playerKillObjIDList = [] # [objID, ...] return def setTurn(self, mapID, funcLineID, turnMax, isNeedReport=False, msgDict={}): @@ -998,8 +1002,7 @@ overLineupList = [] # 本回合已经结束行动的阵容列表 [(faction, num), ...], 所有阵容全部结束代表本回合结束 turnNum = turnFight.turnNum - unXiantaoCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCnt) - GameWorld.DebugLog("unXiantaoCnt=%s,turnNum=%s,doMax=%s,actionIndex=%s,%s" % (unXiantaoCnt, turnNum, doMax, turnFight.actionIndex, turnFight.actionSortList)) + GameWorld.DebugLog("turnNum=%s,doMax=%s,actionIndex=%s,%s" % (turnNum, doMax, turnFight.actionIndex, turnFight.actionSortList)) while doCnt < doMax and len(overLineupList) < len(turnFight.actionSortList): doCnt += 1 turnNum = turnFight.turnNum @@ -1022,6 +1025,7 @@ if turnFight.actionIndex >= len(turnFight.actionSortList): turnFight.actionIndex = 0 + playerHeroAtk = False # 玩家阵容行动标记 faction, num = turnFight.actionSortList[turnFight.actionIndex] batFaction = turnFight.getBatFaction(faction) batLineup = batFaction.getBatlineup(num) @@ -1068,8 +1072,8 @@ continue if faction == Def_FactionA: - if not PlayerControl.PayMoney(curPlayer, ShareDefine.TYPE_Price_Xiantao, fightPoint, isNotify=False): - return + playerHeroAtk = True + break turnFight.actionIndex += 1 @@ -1082,10 +1086,9 @@ if turnFight.checkOverByKilled(): break - nowUnXiantaoCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_UnXiantaoCnt) - if unXiantaoCnt != nowUnXiantaoCnt: - # 玩家有消耗战锤则停止,一段段执行 - GameWorld.DebugLog("玩家有消耗战锤则停止,nowUnXiantaoCnt=%s" % (nowUnXiantaoCnt)) + if playerHeroAtk: + # 玩家武将有行动则停止,一段段执行 + GameWorld.DebugLog("玩家武将有行动则停止!") break if turnFight.winFaction: @@ -1340,23 +1343,10 @@ GameWorld.DebugLog(" 自残: curTD=%s,tagID=%s,skillID=%s,hurtType=%s,hurtValue=%s,lostHP=%s,curHP=%s" % (curID, tagID, skillID, hurtType, hurtValue, lostHP, GameObj.GetHP(curObj))) - if lostHP and curID != tagID: - AddTurnFightXP(tagObj, __GetAddXP_Defender(tagObj, lostHP), "skillID:%s" % skillID) + if lostHP > 0 and curID != tagID: + addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 4) + AddTurnFightXP(tagObj, addXP, "skillID:%s" % skillID) return - -def __GetAddXP_Attack(attack, curSkill): - ## 攻击方增加的XP值根据主动普攻技能获得 - if not curSkill: - return 0 - if not SkillCommon.isTurnNormalAtkSkill(curSkill): - return 0 - return IpyGameDataPY.GetFuncCfg("AngerXP", 3) - -def __GetAddXP_Defender(defender, lostHP): - ## 掉血方增加的XP值根据掉血百分比获得 - if lostHP <= 0: - return 0 - return IpyGameDataPY.GetFuncCfg("AngerXP", 4) def AddTurnFightXP(gameObj, addXP, reason=""): ## 回合战斗增加XP @@ -1435,10 +1425,9 @@ for useInfo in useSkillList: useSkill = useInfo[-1] - skillID = useSkill.GetSkillID() + #skillID = useSkill.GetSkillID() atkOK, tagObj = DoNPCUseSkill(curNPC, useSkill, tick) if atkOK: - AddTurnFightXP(curNPC, __GetAddXP_Attack(curNPC, useSkill), "skillID:%s" % skillID) break curNPC.SetDict(ChConfig.Def_Obj_Dict_TurnBattleType, 0) # 无论攻击成功与否都重置战斗类型 @@ -1674,23 +1663,82 @@ return tagNPC return -def SetKilled(gameObj, killer=None): +def SetTurnObjKilled(gameObj, killer=None): if not gameObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo): #GameWorld.DebugLog("非回合战斗主体被击杀: curID=%s" % gameObj.GetID()) return - GameWorld.DebugLog(" %s 回合战斗主体被击杀: curID=%s" % (GetObjName(gameObj), gameObj.GetID())) - GameObj.SetHP(gameObj, 0) # 回合制死亡仅设置为0,实例暂时不回收 + objID = gameObj.GetID() + GameWorld.DebugLog(" %s 回合战斗主体被击杀: curID=%s" % (GetObjName(gameObj), objID)) + gameObj.SetCurAction(IPY_GameWorld.laNPCDie) + if GameObj.GetHP(gameObj) != 0: + GameObj.SetHP(gameObj, 0) # 回合制死亡仅设置为0,实例暂时不回收 gameObj.SetVisible(False) - turnFight = GetTurnFightMgr().getNPCTurnFight(gameObj.GetID()) - if turnFight: - clientPack = ChPyNetSendPack.tagMCTurnFightObjDead() - clientPack.ObjID = gameObj.GetID() - turnFight.addBatPack(clientPack) + turnFight = GetTurnFightMgr().getNPCTurnFight(objID) + if not turnFight: + return True + clientPack = ChPyNetSendPack.tagMCTurnFightObjDead() + clientPack.ObjID = objID + turnFight.addBatPack(clientPack) + + # 记录主动发起的玩家阵营击杀 + curPlayer = turnFight.curPlayer + if killer and curPlayer and killer.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID) == curPlayer.GetPlayerID(): + if objID not in turnFight.playerKillObjIDList: + turnFight.playerKillObjIDList.append(objID) + GameWorld.DebugLog("玩家单次击杀统计: %s" % turnFight.playerKillObjIDList) return True +def OnTurnfightAttackSuccess(curObj, tagObj, curSkill): + ## 回合战斗攻击成功额外处理,AttackResult之前,一般处理技能相关 + if curObj.GetGameObjType() != IPY_GameWorld.gotNPC: + return + if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo): + return + + objID = curObj.GetID() + turnFight = GetTurnFightMgr().getNPCTurnFight(objID) + if not turnFight: + return + + skillID = curSkill.GetSkillID() if curSkill else 0 + isXP = SkillCommon.isXPSkill(curSkill) + if isXP: + GameObj.SetXP(curObj, 0) + elif curSkill: + if SkillCommon.isTurnNormalAtkSkill(curSkill): + addXP = IpyGameDataPY.GetFuncCfg("AngerXP", 3) + AddTurnFightXP(curObj, addXP, "skillID:%s" % skillID) + + curPlayer = turnFight.curPlayer + # 仅主动发起玩家阵容触发 + if curPlayer and curObj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID) == curPlayer.GetPlayerID(): + FBLogic.OnPlayerLineupAttackSuccess(curPlayer, curObj, tagObj, curSkill, turnFight.mapID, turnFight.funcLineID) + + return + +def OnTurnfightAttackResult(curObj, tagObj, curSkill): + ## 回合战斗攻击结果额外处理,AttackResult 之后,一般处理击杀结算相关 + if curObj.GetGameObjType() != IPY_GameWorld.gotNPC: + return + if not curObj.GetDictByKey(ChConfig.Def_Obj_Dict_TurnFightPosInfo): + return + + objID = curObj.GetID() + turnFight = GetTurnFightMgr().getNPCTurnFight(objID) + if not turnFight: + return + + curPlayer = turnFight.curPlayer + # 仅主动发起玩家阵容触发 + if curPlayer and curObj.GetDictByKey(ChConfig.Def_Obj_Dict_LineupPlayerID) == curPlayer.GetPlayerID(): + FBLogic.OnPlayerLineupAttackResult(curPlayer, curObj, tagObj, curSkill, turnFight.mapID, turnFight.funcLineID) + + turnFight.playerKillObjIDList = [] + return + def OnTurnAllOver(guid): ## 所有回合已经全部执行完毕 GameWorld.DebugLog("所有回合结束") -- Gitblit v1.8.0