hxp
2026-01-08 de44f98f2a8a2b0c12d3482162f1e30e796d7b94
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