From c35e176a3b05f745600c6e60f168313d2b9e7b30 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 17 九月 2025 12:00:19 +0800 Subject: [PATCH] 129 【战斗】战斗系统-服务端(司马懿技能;增加按层级结算持续buff效果5003;增加非按攻击力计算伤害支持;技能伤害增加可限制最大攻击力百分比上限配置;) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py | 86 +++++++++++++++++++++++++++--------------- 1 files changed, 55 insertions(+), 31 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py index bf3a1e4..2f18a62 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py @@ -65,18 +65,19 @@ self.fightPower = 0 # 阵容总战力 return - def UpdLineup(self, heroItemDict, shapeType=0, refreshForce=False, syncLineup=True): + def UpdLineup(self, heroItemDict, shapeType=0, refreshForce=False, isReload=False): '''变更阵容时更新 @param heroItemDict: 武将背包索引信息 {itemIndex:posNum, ...} @param shapeType: 阵型 @param refreshForce: 是否强制刷属性 ''' - self.lineupChange = True + if not isReload: # 非重读阵容的视为变更 + self.lineupChange = True self.shapeType = shapeType self.heroItemDict = heroItemDict GameWorld.DebugLog("更新阵容: lineupID=%s,%s" % (self.lineupID, heroItemDict), self.playerID) self.RefreshLineupAttr(refreshForce) - if syncLineup and self.olPlayer.curPlayer: + if not isReload and self.olPlayer.curPlayer: PlayerHero.Sync_Lineup(self.olPlayer.curPlayer, self.lineupID) return @@ -155,6 +156,8 @@ # 主线战斗 self.mainFight = TurnAttack.MainFight(playerID) + + self._lastBatBufferInfo = [] # 最后一场战斗临时回放 ["guid", "buffer"] return def OnClear(self): @@ -245,6 +248,11 @@ GameWorld.DebugLog("武将物品养成更新索引: %s, 影响阵容:%s" % (itemIndexList, effLineupIDList), self.playerID) return effLineupIDList + + def GetLastBatBuffer(self): return self._lastBatBufferInfo + def SetLastBatBuffer(self, guid, batBuffer): + self._lastBatBufferInfo = [guid, batBuffer] + return class OnlineMgr(): ## 准在线玩家管理 @@ -391,7 +399,7 @@ # 获取其他绑定该阵容的功能,如红颜、灵兽等 shapeType = lineShapeTypeDict.get(lineupID, 0) - lineup.UpdLineup(heroItemDict, shapeType, syncLineup=False) + lineup.UpdLineup(heroItemDict, shapeType, isReload=True) PlayerHero.Sync_Lineup(curPlayer) return @@ -467,10 +475,11 @@ elif skinIDList: skinID = skinIDList[0] + starMax = PlayerHero.GetHeroStarMax(heroItem) InitAddPer += qualityIpyData.GetInitAddPer() - LVAddPer += qualityIpyData.GetLVAddPer() * heroLV + LVAddPer += qualityIpyData.GetLVAddPer() * max(0, heroLV - 1) BreakLVAddPer += qualityIpyData.GetBreakLVAddPer() * breakLV - StarAddPer += qualityIpyData.GetStarAddPer() * star + StarAddPer += qualityIpyData.GetStarAddPer() * min(star, starMax) lineupHero = lineup.GetLineupHero(posNum) #if False: @@ -497,26 +506,11 @@ selfAttrDict[int(k)] = v heroSelfAttrInfo[heroID] = selfAttrDict - # 星级天赋 - starTalentAttrDict = {} - idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID) - lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV) - for aIndex in range(min(idCount, lvCount)): - talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex) - talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex) - stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID) - if not stIpyData: - continue - attrID = stIpyData.GetAttrID() - attrValue = stIpyData.GetAttrValue() * talentLV - starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue - heroStarTalentInfo[heroID] = starTalentAttrDict - # 突破潜能 breakAttrDict = {} - awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID) - if awakeIpyDataList: - for breakIpyData in awakeIpyDataList: + breakIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroBreak", heroID) + if breakIpyDataList: + for breakIpyData in breakIpyDataList: if breakIpyData.GetBreakLV() > breakLV: break attrIDList = breakIpyData.GetAttrIDList() @@ -531,12 +525,15 @@ heroBreakAttrInfo[heroID] = breakAttrDict # 觉醒天赋 + maxUnlockSlot = IpyGameDataPY.GetFuncCfg("HeroStarTalent", 1) # 常规天赋槽个数 awakeTalentAttrDict = {} - awakeIpyDataList = IpyGameDataPY.GetIpyGameDataList("HeroAwake", heroID) + awakeIpyDataList = IpyGameDataPY.GetIpyGameDataListNotLog("HeroAwake", heroID) if awakeIpyDataList: for awakeIpyData in awakeIpyDataList: if awakeIpyData.GetAwakeLV() > awakeLV: break + unlockTalentSlot = awakeIpyData.GetUnlockTalentSlot() + maxUnlockSlot = max(maxUnlockSlot, unlockTalentSlot) attrIDList = awakeIpyData.GetAttrIDList() attrValueList = awakeIpyData.GetAttrValueList() for aIndex in range(min(len(attrIDList), len(attrValueList))): @@ -547,6 +544,21 @@ if skillID: lineupHero.heroSkillIDList.append(skillID) heroAwakeTalentInfo[heroID] = awakeTalentAttrDict + + # 星级天赋 + starTalentAttrDict = {} + idCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentID) + lvCount = heroItem.GetUserAttrCount(ShareDefine.Def_IudetHeroTalentIDLV) + for aIndex in range(min(idCount, lvCount, maxUnlockSlot)): # 重生导致已觉醒槽位失效时属性也无效 + talentID = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentID, aIndex) + talentLV = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroTalentIDLV, aIndex) + stIpyData = IpyGameDataPY.GetIpyGameData("HeroTalent", talentID) + if not stIpyData: + continue + attrID = stIpyData.GetAttrID() + attrValue = stIpyData.GetAttrValue() * talentLV + starTalentAttrDict[attrID] = starTalentAttrDict.get(attrID, 0) + attrValue + heroStarTalentInfo[heroID] = starTalentAttrDict # 羁绊统计 for fetterID in heroIpyData.GetFetterIDList(): @@ -614,6 +626,7 @@ baseAttrFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 1) otherAttrFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 2) fightPowerFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 3) + skillFPFormula = IpyGameDataPY.GetFuncCfg("HeroAttrFormula", 4) lvAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_LV) equipAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_MainEquip) @@ -632,6 +645,12 @@ GameWorld.DebugLog(" 主公等级属性=%s" % lvAttrDict, playerID) GameWorld.DebugLog(" 主公装备属性=%s" % equipAttrDict, playerID) GameWorld.DebugLog(" 主公图鉴属性=%s" % bookAttrDict, playerID) + + PlayerLV = curPlayer.GetLV() + OfficialLV = curPlayer.GetOfficialRank() + GameWorld.DebugLog(" PlayerLV=%s,OfficialLV=%s" % (PlayerLV, OfficialLV), playerID) + + fpRatioIpyData = IpyGameDataPY.GetIpyGameData("FightPowerRatio", OfficialLV) lineupFightPower = 0 # 阵容总战力 InitAddPer, LVAddPer, BreakLVAddPer, StarAddPer = InitAddPer / 10000.0, LVAddPer / 10000.0, BreakLVAddPer / 10000.0, StarAddPer / 10000.0 @@ -698,15 +717,20 @@ attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID) attrName = attrIpyData.GetParameter() if attrIpyData else "%s" % attrID + attrRatioName = "%sRatio" % attrName + ratioValue = 0 + if attrValue and hasattr(fpRatioIpyData, "Get%s" % attrRatioName): + ratioValue = getattr(fpRatioIpyData, "Get%s" % attrRatioName)() fightPowerParamDict[attrName] = attrValue + fightPowerParamDict[attrRatioName] = ratioValue if attrValue: lineupHero.heroBatAttrDict[attrID] = attrValue logAttrDict["%s-%s" % (attrID, attrName)] = attrValue - + # 计算战力 fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict) - GameWorld.DebugLog(" fightPower=%s,heroSkillIDList=%s" % (fightPower, lineupHero.heroSkillIDList), playerID) + GameWorld.DebugLog(" heroID=%s,fightPower=%s,heroSkillIDList=%s" % (heroID, fightPower, lineupHero.heroSkillIDList), playerID) skillTypeIDDict = {} for skillID in lineupHero.heroSkillIDList: skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID) @@ -727,7 +751,9 @@ for skillData in skillTypeIDDict.values(): skillID = skillData.GetSkillID() lineupHero.heroSkillIDList.append(skillID) - skillFightPower += skillData.GetFightPower() + paramDict = {"SkillPower":skillData.GetFightPower(), "PlayerLV":PlayerLV, "OfficialLV":OfficialLV} + sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict) + skillFightPower += sFightPower GameWorld.DebugLog(" skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList), playerID) # 最终战力 @@ -757,8 +783,6 @@ GameWorld.DebugLog("主阵容变化,重新开始战斗", playerID) if mainTurnFight.mapID == ChConfig.Def_FBMapID_Main: TurnAttack.__doMainLevelWave(curPlayer, True) - elif mainTurnFight.mapID == ChConfig.Def_FBMapID_MainBoss: - TurnAttack.__doMainBossStart(curPlayer) # 否则只重新设置战斗属性 else: @@ -774,7 +798,7 @@ continue lineupHero = lineup.GetLineupHero(posNum) if lineupHero.heroBatAttrDict: - batObj.UpdInitBatAttr(lineupHero.heroBatAttrDict) + batObj.UpdInitBatAttr(lineupHero.heroBatAttrDict, lineupHero.heroSkillIDList) else: GameWorld.DebugLog("主阵容没有在战斗中,不需要处理", playerID) -- Gitblit v1.8.0