From 6fc3b68b33214994b8aa4417cbd3064d182a4f6e Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 30 十二月 2025 14:37:43 +0800
Subject: [PATCH] 415 【更新线上特殊处理】血量比例修改需要刷新装备

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py    |   80 ++++++++++++++++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py  |    8 ++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py |   37 ++++++++++++
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py        |    1 
 4 files changed, 126 insertions(+), 0 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
index 48c2757..aa4026d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3207,6 +3207,7 @@
 
 Def_PlayerKey_CrossRegisterMap = "CrossRegisterMap"  #跨服注册活动地图, dataMapID
 
+Def_Player_Dict_FixVersion = "FixVersion"    #修正内容版本号
 Def_Player_Dict_RouteServerInitOK = "RouteServerInitOK_33"     #RouteServer初始化成功(仅登陆一次)
 Def_Player_Dict_Wallow_LV = "GameWallowLV_34"    #防沉迷等级
 Def_Player_Dict_Wallow_OfflineTime = "GameWallowOfflineTime_35"    #防沉迷离线累积时间
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
index fa5bb2e..05254cb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/DataRecordPack.py
@@ -255,6 +255,14 @@
     SendEventPack("CTGOK", dataDict, curPlayer)
     return
 
+def DR_FixVersion(curPlayer, fixName, fixDict):
+    ## 修正玩家数据版本流向
+    dataDict = {'PlayerID':curPlayer.GetPlayerID(), "PlayerName":curPlayer.GetPlayerName(), 
+                'AccID':curPlayer.GetAccID()}
+    dataDict.update(fixDict)
+    SendEventPack("FixVersion_%s" % fixName, dataDict, curPlayer)
+    return
+
 ## 玩家升级
 #  @param curPlayer: 玩家实例
 #  @param playerLV: 玩家等级
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
index 7cbc28e..4f7096c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ChEquip.py
@@ -20,6 +20,10 @@
 import ShareDefine
 import IpyGameDataPY
 import PlayerOnline
+import PlayerControl
+import DataRecordPack
+import ItemControler
+import ItemCommon
 
 def RefreshRoleEquipAttr(curPlayer):
     ## 刷新主公装备属性
@@ -65,6 +69,82 @@
     PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_MainEquip, mainEquipAttrDict)
     return
 
+def FixRoleEquipHP(curPlayer, fixVersion):
+    ## 修正玩家装备生命数值: 策划调整了生命占比,同步修改了生命战力,故需修正线上玩家装备生命,防止战力下降
+    
+    playerID = curPlayer.GetPlayerID()
+    fightPowerBef = PlayerControl.GetFightPower(curPlayer)
+    GameWorld.Log("修正玩家装备生命数值! fixVersion=%s,fightPowerBef=%s" % (fixVersion, fightPowerBef), playerID)
+    
+    # 需要修正身上、掉落背包
+    for packType in [IPY_GameWorld.rptEquip, IPY_GameWorld.rptIdentify]:
+        equipPack = curPlayer.GetItemManager().GetPack(packType)
+        for index in range(equipPack.GetCount()):
+            curEquip = equipPack.GetAt(index)
+            if not curEquip or curEquip.IsEmpty():
+                continue
+            if not ItemCommon.GetIsMainEquip(curEquip):
+                #GameWorld.DebugLog("非主线装备: itemIndex=%s" % itemIndex, playerID)
+                continue
+            itemID = curEquip.GetItemTypeID()
+            
+            # 直接重新生成一件装备进行替换生命属性即可
+            tempItem = ItemControler.GetOutPutItemObj(itemID, curPlayer=curPlayer)
+            if not tempItem:
+                continue
+            tempEquipMaxHP = 0
+            baseAttrIDCnt = tempItem.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrID)
+            baseAttrValueCnt = tempItem.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrValue)
+            for i in xrange(min(baseAttrIDCnt, baseAttrValueCnt)):
+                attrID = tempItem.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrID, i)
+                attrValue = tempItem.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrValue, i)
+                if attrID == ChConfig.AttrID_MaxHP:
+                    tempEquipMaxHP = attrValue
+                    break
+            tempItem.Clear() # 不需要了,直接 Clear
+            if tempEquipMaxHP <= 0:
+                continue
+            
+            curEquipMaxHP = 0
+            baseIDList, baseValueList = [], []
+            baseAttrIDCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrID)
+            baseAttrValueCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrValue)
+            for i in xrange(min(baseAttrIDCnt, baseAttrValueCnt)):
+                attrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrID, i)
+                attrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrValue, i)
+                if attrID == ChConfig.AttrID_MaxHP:
+                    curEquipMaxHP = attrValue
+                    attrValue = tempEquipMaxHP
+                baseIDList.append(attrID)
+                baseValueList.append(attrValue)
+                
+            if curEquipMaxHP >= tempEquipMaxHP:
+                GameWorld.Log("    packType=%s,index=%s,curEquipMaxHP=%s >= %s, 不处理! " % (packType, index, curEquipMaxHP, tempEquipMaxHP), playerID)
+                continue
+            
+            userDataBef = curEquip.GetUserData()
+            singleItem = curEquip.GetItem()
+            singleItem.ClearUserAttr(ShareDefine.Def_IudetBaseAttrID)
+            singleItem.ClearUserAttr(ShareDefine.Def_IudetBaseAttrValue)
+            for i, attrID in enumerate(baseIDList):
+                singleItem.AddUserAttr(ShareDefine.Def_IudetBaseAttrID, attrID)
+                singleItem.AddUserAttr(ShareDefine.Def_IudetBaseAttrValue, baseValueList[i])
+                
+            curEquip.Sync_Item()
+            userDataAft = curEquip.GetUserData()
+            
+            GameWorld.Log("    packType=%s,index=%s,curEquipMaxHP=%s to %s,userDataBef=%s,userDataAft=%s" 
+                          % (packType, index, curEquipMaxHP, tempEquipMaxHP, userDataBef, userDataAft), playerID)
+            fixDict = {"fixVersion":fixVersion, "packType":packType, "index":index, "itemID":itemID, "userDataBef":userDataBef, "userDataAft":userDataAft}
+            DataRecordPack.DR_FixVersion(curPlayer, "EquipHP", fixDict)
+            
+    RefreshRoleEquipAttr(curPlayer)
+    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr(refreshForce=True)
+    
+    fightPowerAft = PlayerControl.GetFightPower(curPlayer)
+    DataRecordPack.DR_FixVersion(curPlayer, "EquipHP", {"fixVersion":fixVersion, "fightPowerBef":fightPowerBef, "fightPowerAft":fightPowerAft})
+    return
+
 #// A3 18 灵器突破 #tagCMLingQiEquipBreak
 #
 #struct    tagCMLingQiEquipBreak
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
index df3b473..b1eed6c 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/ChPlayer.py
@@ -133,6 +133,7 @@
 import PlayerTravel
 import TurnAttack
 import PlayerHJG
+import ChEquip
 
 import datetime
 import time
@@ -731,6 +732,7 @@
         PlayerTravel.OnPlayerLogin(curPlayer)
         OpenServerActivity.OnPlayerLogin(curPlayer)
         
+        __OnFixVersion(curPlayer) # 修正线上玩家数据用,暂时放最后
         # 上线查询一次充值订单
         # curPlayer.SendDBQueryRecharge() 不查了,由在线轮询触发即可
         
@@ -740,6 +742,41 @@
     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "PlayerRealLoginOK", msg, len(msg))
     return
 
+def __OnFixVersion(curPlayer):
+    ''' 修正线上玩家数据内容
+    每次有需要修正时,只要定义一个新的系统内容版本号  sysFixVersion , 然后玩家根据自身版本号进行逐步修正即可
+    这样只用到一个key即可,不需要每次都定义新的key
+    '''
+    
+    playerID = curPlayer.GetPlayerID()
+    sysFixVersion = 2025123012 # 系统定义的最后一次修正版本号,一般以 yyyyMMddhh 定义为版本号
+    playerVersion = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FixVersion)
+    if not playerVersion:
+        createRoleTime = curPlayer.GetCreateRoleTime() # 按创角
+        ymd = createRoleTime.split(" ")[0]
+        playerVersion = GameWorld.ToIntDef("%s00" % ymd.replace("-", ""))
+        GameWorld.DebugLog("默认数据版本为创角日期: %s, %s" % (createRoleTime, playerVersion), playerID)
+        
+    if playerVersion == sysFixVersion:
+        GameWorld.DebugLog("玩家当前数据版本号已是最新版本! playerVersion=%s" % (playerVersion), playerID)
+        return
+    GameWorld.Log("玩家当前数据版本号不等于系统版本号,开始修正! playerVersion=%s != %s" % (playerVersion, sysFixVersion), playerID)
+    
+    # 修正玩家装备生命数值: 策划调整了生命占比,同步修改了生命战力,故需修正线上玩家装备生命,防止战力下降
+    fixVersion = 2025123012
+    if playerVersion < fixVersion:
+        ChEquip.FixRoleEquipHP(curPlayer, fixVersion)
+        # 每个版本修正完需要立即更新到对应的版本号值,防止中间某个版本修正失败,导致重登后重复修正已经处理的版本
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FixVersion, fixVersion)
+        
+    # 其他
+    # 需要按修正版本时间顺序依次处理!!!需要按修正版本时间顺序依次处理!!!需要按修正版本时间顺序依次处理!!!
+    
+    
+    # 最终强制设置为最新版本号
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FixVersion, sysFixVersion)
+    return
+
 ## 玩家扩展信息同步
 #  @param curPlayer
 #  @return None

--
Gitblit v1.8.0