hxp
2026-03-12 902447caa0c5c7b31dd3add5cb69053915f18fca
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -22,16 +22,20 @@
import ItemControler
import PlayerSuccess
import ChPyNetSendPack
import OpenServerActivity
import PlayerActivity
import NetPackCommon
import PlayerControl
import PlayerOnline
import PlayerPreset
import PlayerBeauty
import PlayerTask
import PlayerHJG
import GameWorld
import ChConfig
import random
import math
    
def PlayerOnDay(curPlayer):
    if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HeroAwakeRebirthCnt):
@@ -190,6 +194,7 @@
        #首次获得图鉴额外逻辑 ...
        Sync_HeroInfo(curPlayer, [heroID])
        PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 首次获得
        OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 首次获得
        
    return
@@ -321,6 +326,7 @@
    PlayerActivity.AddDailyTaskValue(curPlayer, ChConfig.DailyTask_HeroLVUP, 1)
    PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_HeroLVUP)
    PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_OSAHeroLVUP, 1)
    OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 升级
    return
def GetHeroLVMax(heroItem):
@@ -410,8 +416,15 @@
        for itemID, itemCount in dismissReturnItems:
            returnCnt = max(1, int(itemCount * ratio / 100.0))
            returnItemList.append([itemID, returnCnt])
        returnItemExDict = {}
        __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict)
        for key, itemCount in returnItemExDict.items():
            itemID, isBind = key
            returnItemList.append([itemID, itemCount, isBind])
        GameWorld.DebugLog("吞噬额外总返还: %s" % returnItemList)
        ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroStarUPReturn", False, {}])
        
    OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 升星
    return
def GetHeroStarMax(heroID, heroItem=None):
@@ -667,6 +680,7 @@
    SetHeroBreakLV(curPlayer, heroItem, nextBreakLV)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 突破
    OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 突破
    return
def SetHeroBreakLV(curPlayer, heroItem, breakLV, isSync=True):
@@ -733,6 +747,7 @@
    SetHeroAwakeLV(heroItem, nextAwakeLV)
    
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 觉醒
    OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 觉醒
    return
def SetHeroAwakeLV(heroItem, awakeLV, isSync=True):
@@ -1010,6 +1025,8 @@
    heroItem.Sync_Item()
    GameWorld.DebugLog("武将洗炼结果! itemIndex=%s,heroID=%s,washIDList=%s,lockTalentIndexs=%s" 
                       % (itemIndex, heroID, washIDList, lockTalentIndexs))
    OpenServerActivity.AddOSAValue(curPlayer, ShareDefine.Def_BT_OSA_HeroTrain, washCostItemCount)
    OpenServerActivity.UpdOSA_HeroTrainBillboard(curPlayer) # 洗炼
    return
def HeroTalentWashReplace(curPlayer, itemIndex, heroItem):
@@ -1093,11 +1110,15 @@
            return
        
    GameWorld.DebugLog("切换武将皮肤! heroID=%s,skinIndex=%s,isSkinAttr=%s" % (heroID, skinIndex, isSkinAttr))
    item = heroItem.GetItem()
    if not isSkinAttr:
        heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
        item.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
    else:
        heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkinAttr, skinIndex)
        # 选属性同步修改形象
        item.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
        item.SetUserAttr(ShareDefine.Def_IudetHeroSkinAttr, skinIndex)
        PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate(heroItem) # 切换皮肤属性
    heroItem.Sync_Item()
    return True
def GMSetHeroSkin(curPlayer, heroID, skinIndex, isActive=1):
@@ -1415,6 +1436,7 @@
    ratio = IpyGameDataPY.GetFuncCfg("HeroRebirth", 5)
    dismissItemList = []
    returnItemDict = {}
    returnItemExDict = {}
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    for itemIndex in itemIndexList:
        if itemIndex < 0 or itemIndex >= curPack.GetCount():
@@ -1457,6 +1479,7 @@
        GameWorld.DebugLog("    星级返还: quality=%s,heroStar=%s,ratio=%s,%s,总%s" % (quality, heroStar, ratio, dismissReturnItems, returnItemDict))
        __calcHeroLVReturnitem(quality, heroLV, returnItemDict, ratio)
        __calcHeroBreakReturnitem(quality, breakLV, returnItemDict, ratio)
        __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict)
        dismissItemList.append([itemIndex, heroItem])
    
    if not dismissItemList:
@@ -1467,10 +1490,45 @@
        
    if returnItemDict:
        returnItemList = [[k, v] for k, v in returnItemDict.items()]
        for key, itemCount in returnItemExDict.items():
            itemID, isBind = key
            returnItemList.append([itemID, itemCount, isBind])
        GameWorld.DebugLog("遣散总返还: %s" % returnItemList)
        ItemControler.GivePlayerItemOrMail(curPlayer, returnItemList, event=["HeroDismiss", False, {}])
        
    return
def __calcHeroQualityReturnItemEx(curPlayer, qualityIpyData, returnItemExDict):
    ## 其他功能额外返还
    # 红颜特殊效果: 遣散/吞噬额外返还百分比
    beautyReturnItems = qualityIpyData.GetBeautyReturnItems()
    if beautyReturnItems:
        isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_BeautyEff)
        retPer = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_HeroItemExPer)[0]
        for itemID, itemCount in beautyReturnItems:
            if not retPer:
                break
            key = (itemID, isBind)
            retCnt = max(1, int(math.ceil(itemCount * retPer / 100.0)))
            returnItemExDict[key] = returnItemExDict.get(key, 0) + retCnt
        GameWorld.DebugLog("    红颜返还: retPer=%s,%s,总%s" % (retPer, beautyReturnItems, returnItemExDict))
    # 称号特殊效果: 遣散/吞噬额外返还百分比
    titleReturnItems = qualityIpyData.GetTitleReturnItems()
    if titleReturnItems:
        isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_TitleEff)
        retPer = PlayerHJG.GetTitleEffInfo(curPlayer, PlayerHJG.TitleEff_HeroItemExPer)[0]
        for itemID, itemCount in titleReturnItems:
            if not retPer:
                break
            key = (itemID, isBind)
            retCnt = max(1, int(math.ceil(itemCount * retPer / 100.0)))
            returnItemExDict[key] = returnItemExDict.get(key, 0) + retCnt
        GameWorld.DebugLog("    称号返还: retPer=%s,%s,总%s" % (retPer, titleReturnItems, returnItemExDict))
    return
#// B4 12 战斗阵容预设保存 #tagCSHeroPresetSave
#
#struct    tagCSHeroPresetPos