From 11c9a3b5846401523e4dafc17f2a074a712730da Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 11 三月 2026 18:27:10 +0800
Subject: [PATCH] 526 【挑战】PVP群英榜-后端(本服群英榜;优化机器人表支持按功能加载不同的机器人;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py | 103 ++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 85 insertions(+), 18 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 c91d54a..cc59c81 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -19,6 +19,7 @@
import BattleObj
import TurnAttack
import PyGameData
+import SkillCommon
import ShareDefine
import PlayerPreset
import PlayerControl
@@ -26,9 +27,9 @@
import FormulaControl
import PlayerPrestigeSys
import GameLogic_Dingjunge
+import OpenServerActivity
import PlayerMingge
import PlayerBeauty
-import PlayerFamily
import PlayerHorse
import PlayerGubao
import PlayerHero
@@ -38,6 +39,8 @@
import ChEquip
import time
+
+g_calcDetail = 0
class LineupHero():
## 阵容武将,注意:同一个武将在不同阵容中可能属性不一样
@@ -79,6 +82,10 @@
reloadEffHeroCard(curPlayer, self) # 更新武将阵容强制重刷生效卡牌
return
+ def OnSwitch(self):
+ self.isHeroChange = True
+ return
+
def IsHeroItemIn(self, itemIndex): return itemIndex in self.heroItemDict
def GetHeroEffectiveCard(self, heroID): return self._effectiveCardDict.get(heroID, [-1, -1, False])
@@ -87,6 +94,7 @@
self._effectiveCardDict[heroID] = [cardAddPer, itemIndex, inThis]
return
+ def GetEffectiveCardDict(self): return self._effectiveCardDict
def SetEffectiveCardDict(self, effectiveCardDict): self._effectiveCardDict = effectiveCardDict
def GetEffCardAddPer(self):
effCardAddPer = 0
@@ -358,8 +366,6 @@
effCardAddPerAft = heroPreset.GetEffCardAddPer()
- if effCardAddPerBef == effCardAddPerAft:
- continue
heroPresetID = heroPreset.heroPresetID
GameWorld.DebugLog("武将物品变化影响: itemIndex=%s,heroPresetID=%s,effCardAddPerBef=%s,effCardAddPerAft=%s"
% (itemIndex, heroPresetID, effCardAddPerBef, effCardAddPerAft), self.playerID)
@@ -614,6 +620,7 @@
for syncItem in syncItemDict.values():
syncItem.Sync_Item()
+ OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 重载生效卡
return
def getHeroCardAddPer(heroItem):
@@ -631,7 +638,7 @@
star = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroStar)
breakLV = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
- starMax = PlayerHero.GetHeroStarMax(heroItem)
+ starMax = PlayerHero.GetHeroStarMax(heroID, heroItem)
addPer = qualityIpyData.GetInitAddPer()
addPer += qualityIpyData.GetLVAddPer() * max(0, heroLV - 1)
addPer += qualityIpyData.GetBreakLVAddPer() * breakLV
@@ -745,6 +752,7 @@
countryHeroInfo = {} # 国家武将统计 {country:[heroID, ...], ...}
fetterHeroInfo = {} # 阵容羁绊武将统计信息 {fetterID:[heroID, ...], ...}
heroSelfAttrInfo = {} # 武将自身属性 {heroID:{attrID:value, ...}, ...}
+ heroSkinAttrInfo = {} # 武将时装属性 {heroID:{attrID:value, ...}, ...}
heroLVAttrInfo = {} # 武将等级属性 {heroID:{attrID:value, ...}, ...}
heroStarTalentInfo = {} # 武将星级天赋属性 {heroID:{attrID:value, ...}, ...}
heroBreakAttrInfo = {} # 武将突破潜能属性 {heroID:{attrID:value, ...}, ...}
@@ -775,9 +783,9 @@
skinID = 0
skinIDList = heroIpyData.GetSkinIDList()
if skinIndex < 0 or skinIndex >= len(skinIDList):
- skinID = skinIDList[skinIndex]
- elif skinIDList:
skinID = skinIDList[0]
+ elif skinIDList:
+ skinID = skinIDList[skinIndex]
lineupHero = presetLineup.GetLineupHero(posNum)
#if False:
@@ -803,6 +811,27 @@
for k, v in heroIpyData.GetBatAttrDict().items():
selfAttrDict[int(k)] = v
heroSelfAttrInfo[heroID] = selfAttrDict
+
+ # 时装属性
+ attrSkinID = 0
+ attrSkinIndex = heroItem.GetUserAttr(ShareDefine.Def_IudetHeroSkinAttr)
+ if attrSkinIndex < 0 or attrSkinIndex >= len(skinIDList):
+ attrSkinID = skinIDList[0]
+ elif skinIDList:
+ attrSkinID = skinIDList[attrSkinIndex]
+ heroSkinAttrDict = {}
+ skinIpyData = IpyGameDataPY.GetIpyGameDataNotLog("HeroSkinAttr", attrSkinID)
+ if skinIpyData:
+ skinStar = PlayerHero.GetHeroSkinStar(curPlayer, attrSkinID)
+ wearAttrIDList = skinIpyData.GetWearAttrIDList()
+ wearAttrValueList = skinIpyData.GetWearAttrValueList()
+ wearAttrPerStarAddList = skinIpyData.GetWearAttrPerStarAddList()
+ for i in range(min(len(wearAttrIDList), len(wearAttrValueList))):
+ attrID = wearAttrIDList[i]
+ attrValuePerStar = wearAttrPerStarAddList[i] if len(wearAttrPerStarAddList) > i else 0
+ attrValue = wearAttrValueList[i] + attrValuePerStar * skinStar
+ heroSkinAttrDict[attrID] = heroSkinAttrDict.get(attrID, 0) + attrValue
+ heroSkinAttrInfo[heroID] = heroSkinAttrDict
# 等级属性
heroLVAttrDict = {}
@@ -945,17 +974,20 @@
lvAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_LV)
equipAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_MainEquip)
fatesAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HeroFates)
+ skinAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HeroSkin)
realmAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Realm)
gubaoAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Gubao)
hjgAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HJG)
horseAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Horse)
beautyAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Beauty)
minggeAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Mingge, mgPresetID)
+ mgSkillLVDict = olPlayer.GetCalcSpecInfo(ChConfig.Def_CalcAttr_Mingge, mgPresetID)
dingjungeAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Dingjunge) if exclusiveMapID == ChConfig.Def_FBMapID_Dingjunge else {}
GameWorld.DebugLog(" 国家武将统计=%s" % countryHeroInfo, playerID)
GameWorld.DebugLog(" 羁绊武将统计=%s" % fetterHeroInfo, playerID)
GameWorld.DebugLog(" 武将自身属性=%s" % heroSelfAttrInfo, playerID)
+ GameWorld.DebugLog(" 穿戴时装属性=%s" % heroSkinAttrInfo, playerID)
GameWorld.DebugLog(" 武将等级属性=%s" % heroLVAttrInfo, playerID)
GameWorld.DebugLog(" 武将吞噬属性=%s" % heroStarTalentInfo, playerID)
GameWorld.DebugLog(" 武将突破潜能=%s" % heroBreakAttrInfo, playerID)
@@ -966,12 +998,13 @@
GameWorld.DebugLog(" 主公等级属性=%s" % lvAttrDict, playerID)
GameWorld.DebugLog(" 主公装备属性=%s" % equipAttrDict, playerID)
GameWorld.DebugLog(" 主公宿缘属性=%s" % fatesAttrDict, playerID)
+ GameWorld.DebugLog(" 主公全体时装=%s" % skinAttrDict, playerID)
GameWorld.DebugLog(" 主公官职属性=%s" % realmAttrDict, playerID)
GameWorld.DebugLog(" 主公古宝属性=%s" % gubaoAttrDict, playerID)
GameWorld.DebugLog(" 主幻境阁属性=%s" % hjgAttrDict, playerID)
GameWorld.DebugLog(" 主公坐骑属性=%s" % horseAttrDict, playerID)
GameWorld.DebugLog(" 主公红颜属性=%s" % beautyAttrDict, playerID)
- GameWorld.DebugLog(" 主公命格属性=%s,mgPresetID=%s" % (minggeAttrDict, mgPresetID), playerID)
+ GameWorld.DebugLog(" 主公命格属性=%s,技能:%s,mgPresetID=%s" % (minggeAttrDict, mgSkillLVDict, mgPresetID), playerID)
GameWorld.DebugLog(" 定军专属属性=%s" % dingjungeAttrDict, playerID)
effCardAddPer = heroPreset.GetEffCardAddPer()
effCardAddPer /= 10000.0
@@ -981,9 +1014,23 @@
OfficialLV = curPlayer.GetOfficialRank()
GameWorld.DebugLog(" PlayerLV=%s,OfficialLV=%s" % (PlayerLV, OfficialLV), playerID)
+ mgSkillFightPower = 0
+ for skillTypeID, skillLV in mgSkillLVDict.items():
+ skillID = SkillCommon.GetSkillIDBySkillTypeID(skillTypeID, skillLV)
+ skillData = IpyGameDataPY.GetIpyGameData("Skill", skillID)
+ if not skillData:
+ continue
+ paramDict = {"SkillPower":skillData.GetFightPower(), "PlayerLV":PlayerLV, "OfficialLV":OfficialLV}
+ sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict, toInt=True)
+ mgSkillFightPower += sFightPower
+ if mgSkillLVDict:
+ GameWorld.DebugLog(" 命格技能战力=%s,mgSkillLVDict=%s" % (mgSkillFightPower, mgSkillLVDict), playerID)
+
fpRatioIpyData = IpyGameDataPY.GetIpyGameData("FightPowerRatio", OfficialLV)
lineupFightPower = 0 # 阵容总战力
+ lineupFightPower += mgSkillFightPower
+
for heroID, selfAttrDict in heroSelfAttrInfo.items():
lineupHero = presetLineup.GetLineupHeroByID(heroID)
if not lineupHero:
@@ -991,6 +1038,7 @@
lineupHero.heroBatAttrDict = {}
lineupHero.fightPower = 0
+ heroSkinAttrDict = heroSkinAttrInfo.get(heroID, {})
heroLVAttrDict = heroLVAttrInfo.get(heroID, {})
starTalentAttrDict = heroStarTalentInfo.get(heroID, {})
breakAttrDict = heroBreakAttrInfo.get(heroID, {})
@@ -1011,6 +1059,9 @@
fatesValue = fatesAttrDict.get(attrID, 0)
fatesPer = fatesAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
+
+ skinValue = skinAttrDict.get(attrID, 0)
+ skinPer = skinAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
realmValue = realmAttrDict.get(attrID, 0)
realmPer = realmAttrDict.get(attrPerID, 0) / 10000.0 if attrPerID else 0
@@ -1042,6 +1093,7 @@
lineupHaloValue, lineupHaloPer = lineupHaloAttrInfo.get(attrID, 0), 0
fetterValue, fetterPer = fetterAttrDict.get(attrID, 0), 0
+ heroSkinValue, heroSkinPer = heroSkinAttrDict.get(attrID, 0), 0
heroLVValue, heroLVPer = heroLVAttrDict.get(attrID, 0), 0
starTalentValue, starTalentPer = starTalentAttrDict.get(attrID, 0), 0
breakLVValue, breakLVPer = breakAttrDict.get(attrID, 0), 0
@@ -1050,6 +1102,7 @@
heroSelfPer = selfAttrDict.get(attrPerID, 0) / 10000.0
lineupHaloPer = lineupHaloAttrInfo.get(attrPerID, 0) / 10000.0
fetterPer = fetterAttrDict.get(attrPerID, 0) / 10000.0
+ heroSkinPer = heroSkinAttrDict.get(attrPerID, 0) / 10000.0
heroLVPer = heroLVAttrDict.get(attrPerID, 0) / 10000.0
starTalentPer = starTalentAttrDict.get(attrPerID, 0) / 10000.0
breakLVPer = breakAttrDict.get(attrPerID, 0) / 10000.0
@@ -1058,20 +1111,35 @@
# 计算
attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "realmValue":realmValue, "realmPer":realmPer, "cardPer":cardPer,
"gubaoValue":gubaoValue, "gubaoPer":gubaoPer, "hjgValue":hjgValue, "hjgPer":hjgPer, "horseValue":horseValue, "horsePer":horsePer,
- "beautyValue":beautyValue, "beautyPer":beautyPer, "fatesValue":fatesValue, "fatesPer":fatesPer,
+ "beautyValue":beautyValue, "beautyPer":beautyPer, "fatesValue":fatesValue, "fatesPer":fatesPer, "skinValue":skinValue, "skinPer":skinPer,
"dingjungeValue":dingjungeValue, "dingjungePer":dingjungePer, "minggeValue":minggeValue, "minggePer":minggePer,
- "heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer, "heroLVValue":heroLVValue, "heroLVPer":heroLVPer,
+ "heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer, "heroLVValue":heroLVValue, "heroLVPer":heroLVPer,
+ "heroSkinValue":heroSkinValue, "heroSkinPer":heroSkinPer,
"lineupHaloValue":lineupHaloValue, "lineupHaloPer":lineupHaloPer, "fetterValue":fetterValue, "fetterPer":fetterPer,
"starTalentValue":starTalentValue, "starTalentPer":starTalentPer, "breakLVValue":breakLVValue, "breakLVPer":breakLVPer,
"awakeTalentValue":awakeTalentValue, "awakeTalentPer":awakeTalentPer,
}
-
+ #testDict = {'lineupHaloPer': 0.1, 'minggeValue': 43685, 'heroLVValue': 836851, 'cardPer': 72.276, 'realmValue': 9878456, 'fetterPer': 0.15, 'horseValue': 5040, 'equipValue': 18381400, 'inheritPer': 1.4, 'lvValue': 53600}
+ #testDict = {'inheritPer': 1, 'minggeValue': 905, 'equipValue': 796}
+ #for k in attrParamDict.keys():
+ # v = testDict.get(k, 0)
+ # exec("%s = %s" % (k, v))
+ # attrParamDict[k] = v
if attrID in ChConfig.BaseAttrIDList:
- attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict, toInt=False, ndigits=3)
+ attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict, toInt=False, ndigits=2)
+ #GameWorld.DebugLog(" evalValue=%s,attrValue=%s" % (eval(baseAttrFormula), attrValue))
else:
- attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict, toInt=False, ndigits=3)
- #GameWorld.DebugLog(" attrID=%s,attrValue=%s,attrParamDict=%s" % (attrID, attrValue, attrParamDict))
-
+ attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict, toInt=False, ndigits=2)
+ #GameWorld.DebugLog(" evalValue=%s,attrValue=%s" % (eval(otherAttrFormula), attrValue))
+ # 前端对比刷属性明细时需要
+ if g_calcDetail and attrValue > 0:
+ calcParamDict = {}
+ for k, v in attrParamDict.items():
+ if not v or (k == "inheritPer" and v == 1):
+ continue
+ calcParamDict[k] = v
+ GameWorld.DebugLogEx(" heroID=%s,attrID=%s,attrValue=%s,%s", heroID, attrID, attrValue, calcParamDict)
+
attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID)
attrName = attrIpyData.GetParameter() if attrIpyData else "%s" % attrID
attrRatioName = "%sRatio" % attrName
@@ -1150,9 +1218,11 @@
faction, num = ChConfig.Def_FactionA, 1 # 主线战斗玩家自己默认阵营A的第1个战斗阵容
batLineup = mainTurnFight.getBatFaction(faction).getBatlineup(num)
batObjMgr = BattleObj.GetBatObjMgr()
- for posNum, objID in batLineup.posObjIDDict.items():
+ for posNum, objID in batLineup.getPosObjIDDict().items():
batObj = batObjMgr.getBatObj(objID)
if not batObj:
+ continue
+ if batObj.GetBatObjType() != ChConfig.BatObjType_BatHero:
continue
lineupHero = presetLineup.GetLineupHero(posNum)
if lineupHero.heroBatAttrDict:
@@ -1160,7 +1230,4 @@
else:
GameWorld.DebugLog("主线阵容没有在战斗中,不需要处理", playerID)
- PlayerFamily.RefreshFamilyMember(curPlayer) # 更新公会
- # 更新排行榜
-
return
--
Gitblit v1.8.0