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):
@@ -1105,7 +1126,7 @@
    if not heroIpyData:
        return
    skinIDList = heroIpyData.GetSkinIDList()
    if not skinIDList or len(skinIDList) >= skinIndex:
    if not skinIDList or skinIndex >= len(skinIDList):
        return
    skinID = skinIDList[skinIndex]
    __onHeroSkinActive(curPlayer, heroID, skinID, isActive)
@@ -1167,6 +1188,62 @@
    Sync_HeroInfo(curPlayer, [heroID])
    RefreshLordAttr(curPlayer) # 时装升星 - 全体属性
    return
def AutoChangeToSkinPoint(curPlayer, curItem, eventName):
    ## 获得皮肤时自动转化为皮肤碎片
    # @return: 是否成功转化
    itemID = curItem.GetItemTypeID()
    itemIDSkinIDDict = GetItemHeroSkinIDDict()
    if itemID not in itemIDSkinIDDict:
        #GameWorld.DebugLog("非武将皮肤物品不处理! itemID=%s not in %s" % (itemID, itemIDSkinIDDict))
        return
    skinID = itemIDSkinIDDict[itemID]
    if not GetHeroSkinState(curPlayer, skinID):
        #GameWorld.DebugLog("该武将皮肤未激活不处理转化: itemID=%s,skinID=%s" % (itemID, skinID))
        return
    curStar = GetHeroSkinStar(curPlayer, skinID)
    ipyData = IpyGameDataPY.GetIpyGameData("HeroSkinAttr", skinID)
    if not ipyData:
        return
    starMax = ipyData.GetStarMax()
    if starMax and curStar < starMax:
        #GameWorld.DebugLog("武将皮肤未满星暂不转化! itemID=%s,skinID=%s,curStar=%s < %s" % (itemID, skinID, curStar, starMax))
        return
    skinQuality = ipyData.GetSkinQuality()
    skinQualityPointDict = IpyGameDataPY.GetFuncEvalCfg("HeroSkin", 1, {})
    if str(skinQuality) not in skinQualityPointDict:
        return
    changePoint = skinQualityPointDict[str(skinQuality)]
    itemCount = ItemControler.GetItemCount(curItem)
    addDataDict = {"ItemID":itemID, "ItemCount":itemCount, "SkinID":skinID}
    moneyType = ShareDefine.TYPE_Price_SkinPoint
    moneyValue = changePoint * itemCount
    GameWorld.DebugLog("武将皮肤不需要再升星了自动转化为皮肤碎片! itemID=%s,skinID=%s,skinQuality=%s,moneyValue=%s,itemCount=%s"
                       % (itemID, skinID, skinQuality, moneyValue, itemCount))
    if not PlayerControl.GiveMoney(curPlayer, moneyType, moneyValue, eventName, addDataDict, notifyAward=False):
        return
    curItem.Clear()
    if eventName:
        isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_HeroSkinChange)
        ItemControler.NotifyGiveAwardInfo(curPlayer, [], eventName, moneyInfo={moneyType:[moneyValue, isBind]}, dataEx=itemID)
    return True
def GetItemHeroSkinIDDict():
    ## 获取物品ID对应皮肤ID信息
    itemIDSkinIDDict = IpyGameDataPY.GetConfigEx("itemIDSkinIDDict")
    if not itemIDSkinIDDict:
        itemIDSkinIDDict = {}
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetHeroSkinAttrCount()):
            ipyData = ipyDataMgr.GetHeroSkinAttrByIndex(index)
            skinID = ipyData.GetSkinID()
            skinItemID = ipyData.GetNeedItemID()
            itemIDSkinIDDict[skinItemID] = skinID
        IpyGameDataPY.SetConfigEx("itemIDSkinIDDict", itemIDSkinIDDict)
        GameWorld.DebugLog("加载物品ID对应武将皮肤ID: %s" % itemIDSkinIDDict)
    return itemIDSkinIDDict
#// B2 37 武将图鉴激活升级 #tagCSHeroBookUP
#
@@ -1415,6 +1492,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 +1535,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 +1546,44 @@
        
    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):
    ## 其他功能额外返还
    returnItemsEx = qualityIpyData.GetReturnItemsEx()
    if not returnItemsEx:
        return
    # 红颜特殊效果: 遣散/吞噬额外返还百分比
    isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_BeautyEff)
    retPer = PlayerBeauty.GetBeautyEffInfo(curPlayer, PlayerBeauty.EffType_HeroItemExPer)[0]
    for itemID, itemCount in returnItemsEx:
        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, returnItemsEx, returnItemExDict))
    # 称号特殊效果: 遣散/吞噬额外返还百分比
    isBind = ItemControler.GetIsBindValue(srcSign=ChConfig.ItemSrcSign_TitleEff)
    retPer = PlayerHJG.GetTitleEffInfo(curPlayer, PlayerHJG.TitleEff_HeroItemExPer)[0]
    for itemID, itemCount in returnItemsEx:
        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, returnItemsEx, returnItemExDict))
    return
#// B4 12 战斗阵容预设保存 #tagCSHeroPresetSave
#
#struct    tagCSHeroPresetPos