From b9bef849ab19b8a3d6e889e82c687eec736cbd2a Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 10 十月 2025 20:42:29 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(徽章旗帜、旗号;捐献;公会加经验、加贡献度;搜索支持公会编号;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py | 83 +++++++++++++++++++++++++----------------
1 files changed, 50 insertions(+), 33 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 d9506f8..2f18462 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerOnline.py
@@ -23,6 +23,7 @@
import PlayerControl
import IpyGameDataPY
import FormulaControl
+import PlayerPrestigeSys
import PlayerHero
import GameWorld
import ChConfig
@@ -65,18 +66,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 +157,8 @@
# 主线战斗
self.mainFight = TurnAttack.MainFight(playerID)
+
+ self._lastBatBufferInfo = [] # 最后一场战斗临时回放 ["guid", "buffer"]
return
def OnClear(self):
@@ -245,6 +249,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 +400,7 @@
# 获取其他绑定该阵容的功能,如红颜、灵兽等
shapeType = lineShapeTypeDict.get(lineupID, 0)
- lineup.UpdLineup(heroItemDict, shapeType, syncLineup=False)
+ lineup.UpdLineup(heroItemDict, shapeType, isReload=True)
PlayerHero.Sync_Lineup(curPlayer)
return
@@ -402,6 +411,7 @@
CalcRoleBase(curPlayer)
ChEquip.CalcRoleEquipAttr(curPlayer)
PlayerHero.CalcHeroAddAttr(curPlayer)
+ PlayerPrestigeSys.CalcOfficialRankAttr(curPlayer)
return
def doRefreshLineupAttr(curPlayer, olPlayer, lineup):
@@ -467,10 +477,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 +508,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 +527,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 +546,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():
@@ -619,6 +633,7 @@
lvAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_LV)
equipAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_MainEquip)
bookAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_HeroBook)
+ realmAttrDict = olPlayer.GetCalcAttr(ChConfig.Def_CalcAttr_Realm)
GameWorld.DebugLog(" 国家武将统计=%s" % countryHeroInfo, playerID)
GameWorld.DebugLog(" 羁绊武将统计=%s" % fetterHeroInfo, playerID)
@@ -633,6 +648,7 @@
GameWorld.DebugLog(" 主公等级属性=%s" % lvAttrDict, playerID)
GameWorld.DebugLog(" 主公装备属性=%s" % equipAttrDict, playerID)
GameWorld.DebugLog(" 主公图鉴属性=%s" % bookAttrDict, playerID)
+ GameWorld.DebugLog(" 主公官职属性=%s" % realmAttrDict, playerID)
PlayerLV = curPlayer.GetLV()
OfficialLV = curPlayer.GetOfficialRank()
@@ -664,6 +680,9 @@
bookValue = bookAttrDict.get(attrID, 0)
bookPer = bookAttrDict.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
+
lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = 0, 0, 0, 0
if attrID in ChConfig.BaseAttrIDList:
lineupInitAddPer, lineupLVAddPer, lineupBreakLVAddPer, lineupStarAddPer = InitAddPer, LVAddPer, BreakLVAddPer, StarAddPer
@@ -689,7 +708,7 @@
awakeTalentPer = awakeTalentAttrDict.get(attrPerID, 0) / 10000.0
# 计算
- attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer,
+ attrParamDict = {"lvValue":lvValue, "equipValue":equipValue, "bookValue":bookValue, "bookPer":bookPer, "realmValue":realmValue, "realmPer":realmPer,
"lineupInitAddPer":lineupInitAddPer, "lineupLVAddPer":lineupLVAddPer, "lineupBreakLVAddPer":lineupBreakLVAddPer, "lineupStarAddPer":lineupStarAddPer,
"heroSelfValue":heroSelfValue, "heroSelfPer":heroSelfPer, "inheritPer":inheritPer,
"lineupHaloValue":lineupHaloValue, "lineupHaloPer":lineupHaloPer, "fetterValue":fetterValue, "fetterPer":fetterPer,
@@ -698,9 +717,9 @@
}
if attrID in ChConfig.BaseAttrIDList:
- attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict)
+ attrValue = FormulaControl.Eval("baseAttrFormula", baseAttrFormula, attrParamDict, toInt=False, ndigits=3)
else:
- attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict)
+ attrValue = FormulaControl.Eval("otherAttrFormula", otherAttrFormula, attrParamDict, toInt=False, ndigits=3)
#GameWorld.DebugLog(" attrID=%s,attrValue=%s,attrParamDict=%s" % (attrID, attrValue, attrParamDict))
attrIpyData = IpyGameDataPY.GetIpyGameData("PlayerAttr", attrID)
@@ -716,7 +735,7 @@
logAttrDict["%s-%s" % (attrID, attrName)] = attrValue
# 计算战力
- fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict)
+ fightPower = FormulaControl.Eval("fightPowerFormula", fightPowerFormula, fightPowerParamDict, toInt=True)
GameWorld.DebugLog(" heroID=%s,fightPower=%s,heroSkillIDList=%s" % (heroID, fightPower, lineupHero.heroSkillIDList), playerID)
skillTypeIDDict = {}
@@ -740,7 +759,7 @@
skillID = skillData.GetSkillID()
lineupHero.heroSkillIDList.append(skillID)
paramDict = {"SkillPower":skillData.GetFightPower(), "PlayerLV":PlayerLV, "OfficialLV":OfficialLV}
- sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict)
+ sFightPower = FormulaControl.Eval("skillFPFormula", skillFPFormula, paramDict, toInt=True)
skillFightPower += sFightPower
GameWorld.DebugLog(" skillFightPower=%s,heroSkillIDList=%s" % (skillFightPower, lineupHero.heroSkillIDList), playerID)
@@ -771,8 +790,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:
@@ -788,7 +805,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