ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerHero.py
@@ -23,13 +23,71 @@
import ChPyNetSendPack
import NetPackCommon
import PlayerControl
import PlayerOnline
import GameWorld
import ChConfig
import random
def OnPlayerLogin(curPlayer):
    Sync_HeroInfo(curPlayer)
    return
def OnPlayerFirstLogin(curPlayer):
    OnFirstLoginInitPlayer(curPlayer)
    OnFirstLoginInitHero(curPlayer)
    return
def OnFirstLoginInitPlayer(curPlayer):
    ## 初始化主公
    equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
    if not equipPack.GetCount():
        identifyPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptIdentify)
        if not identifyPack.GetCount():
            return
    defaultEquipInfo = IpyGameDataPY.GetFuncEvalCfg("NewRoleInit", 1, {})
    if not defaultEquipInfo:
        return
    GameWorld.DebugLog("初始化新手定制装备: %s" % defaultEquipInfo, curPlayer.GetPlayerID())
    for equipID, appointID in defaultEquipInfo.items():
        itemData = GameWorld.GetGameData().GetItemByTypeID(equipID)
        if not itemData:
            continue
        equipPlace = itemData.GetEquipPlace()
        equipPlaceIndex = equipPlace - 1 # 暂固定直接装备位-1
        if equipPlaceIndex < 0 or equipPlaceIndex >= equipPack.GetCount():
            continue
        destEquip = equipPack.GetAt(equipPlaceIndex)
        if not destEquip.IsEmpty():
            continue
        setAttrDict = {ShareDefine.Def_CItemKey_AppointID:appointID} if appointID else {}
        curItem = ItemControler.GetOutPutItemObj(equipID, 1, curPlayer=curPlayer, setAttrDict=setAttrDict)
        if not curItem:
            continue
        destEquip.AssignItem(curItem)
    return
def OnFirstLoginInitHero(curPlayer):
    ## 初始化默认武将阵型
    curPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptHero)
    GameWorld.DebugLog("OnFirstLoginInitHero: %s" % curPack.GetCount(), curPlayer.GetPlayerID())
    if not curPack.GetCount():
        return
    defaultHeroInfo = IpyGameDataPY.GetFuncEvalCfg("NewRoleInit", 2, {})
    if not defaultHeroInfo:
        return
    GameWorld.DebugLog("初始化新手武将: %s" % defaultHeroInfo, curPlayer.GetPlayerID())
    lineupID = ShareDefine.Lineup_Main
    shapeType = 0
    for heroID, posNum in defaultHeroInfo.items():
        lineupValue = ComLineupValue(lineupID, shapeType, posNum)
        setAttrDict = {ShareDefine.Def_IudetHeroLineup:[lineupValue]}
        ItemControler.GivePlayerItem(curPlayer, heroID, 1, False, [ShareDefine.rptHero], setAttrDict=setAttrDict)
    return
def InitHeroItem(singleItem):
@@ -201,10 +259,10 @@
        return 0
    for lpIndex in range(lineupCount)[::-1]:
        lineupValue = heroItem.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        #阵容类型*10000+阵型类型*100+位置编号
        if lineupValue / 10000 != lineupID:
        lpID, _, posNum = GetLineupValue(lineupValue)
        if lpID != lineupID:
            continue
        return lineupValue % 100
        return posNum
    return 0
#// B2 30 武将升级 #tagCSHeroLVUP
@@ -258,9 +316,7 @@
    GameWorld.DebugLog("武将升级: itemIndex=%s,heroID=%s,updHeroLV=%s" % (itemIndex, heroID, updHeroLV), playerID)
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroLV, updHeroLV)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def GetHeroLVMax(heroItem):
@@ -373,9 +429,8 @@
        __DoHeroStarTalentUp(item, addStar)
    heroItem.Sync_Item()
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    itemIndex = heroItem.GetItemPlaceIndex()
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def __DoHeroStarTalentUp(singleItem, addLV):
@@ -517,9 +572,7 @@
    GameWorld.DebugLog("武将突破: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextBreakLV), playerID)
    SetHeroBreakLV(heroItem, nextBreakLV)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def SetHeroBreakLV(heroItem, breakLV):
@@ -574,12 +627,10 @@
        GameWorld.DebugLog("材料不足,武将无法觉醒! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, "HeroAwake")
    GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextBreakLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
    GameWorld.DebugLog("武将觉醒: itemIndex=%s,heroID=%s,nextAwakeLV=%s" % (itemIndex, heroID, nextAwakeLV), playerID)
    SetHeroAwakeLV(heroItem, nextAwakeLV)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def SetHeroAwakeLV(heroItem, awakeLV):
@@ -711,9 +762,7 @@
    
    heroItem.Sync_Item()
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
#// B2 35 武将洗炼 #tagCSHeroWash
@@ -849,9 +898,7 @@
    heroItem.Sync_Item()
    GameWorld.DebugLog("武将洗炼替换! itemIndex=%s,heroID=%s,washIDList=%s" % (itemIndex, heroID, washIDList))
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
#// B2 36 武将换肤 #tagCSHeroWearSkin
@@ -884,10 +931,7 @@
            return
    heroItem.SetUserAttr(ShareDefine.Def_IudetHeroSkin, skinIndex)
    
    # 刷属性
    if GetHeroLineupPosNum(heroItem, ShareDefine.Lineup_Main):
        RefreshLordAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).OnHeroItemUpate([itemIndex])
    return
def ActiveHeroSkin(curPlayer, heroID, skinIndex, isActive=True):
@@ -962,6 +1006,9 @@
def __doHeroBookStarLVUP(curPlayer, heroID, itemIndex):
    ## 图鉴星级升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
@@ -983,6 +1030,9 @@
def __doHeroBookBreakLVUP(curPlayer, heroID, itemIndex):
    ## 图鉴突破升级
    playerID = curPlayer.GetPlayerID()
    if not GetHeroBookInitState(curPlayer, heroID):
        GameWorld.DebugLog("该武将图鉴未激活! heroID=%s" % heroID, playerID)
        return
    heroItem = GetHeroItem(curPlayer, itemIndex)
    if not heroItem:
        return
@@ -1071,8 +1121,7 @@
        item = heroItem.GetItem()
        for lpIndex in range(lineupCount)[::-1]:
            lineupValue = item.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
            #阵容类型*10000+阵型类型*100+位置编号
            if lineupValue / 10000 != lineupID:
            if GetLineupValue(lineupValue)[0] != lineupID:
                continue
            item.DelUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
            delCount += 1
@@ -1082,6 +1131,7 @@
            
    # 更新新阵型
    heroIDList = []
    heroItemDict = {}
    for posNum, itemIndex in heroPosDict.items():
        if itemIndex < 0 or itemIndex >= curPack.GetCount():
            continue
@@ -1094,34 +1144,70 @@
            continue
        heroIDList.append(itemID)
        item = heroItem.GetItem()
        lineupValue = lineupID * 10000 + shapeType * 100 + posNum
        lineupValue = ComLineupValue(lineupID, shapeType, posNum)
        item.AddUserAttr(ShareDefine.Def_IudetHeroLineup, lineupValue)
        if itemIndex not in syncItemDict:
            syncItemDict[itemIndex] = heroItem
        heroItemDict[itemIndex] = posNum
        
    # 主阵容修改时重整背包
    if lineupID == ShareDefine.Lineup_Main:
        ResetHeroPack(curPlayer)
    else:
    # 主阵容修改时重整背包,约定所有背包由前端自行排序
    #if lineupID == ShareDefine.Lineup_Main:
    #    ResetHeroPack(curPlayer)
    #else:
        for syncItem in syncItemDict.values():
            syncItem.Sync_Item()
            
    RefreshLordAttr(curPlayer)
    lineup = PlayerOnline.GetOnlinePlayer(curPlayer).GetLineup(lineupID)
    lineup.UpdLineup(heroItemDict, shapeType)
    return
def ResetHeroPack(curPlayer):
    tick = GameWorld.GetGameWorld().GetTick()
    curPlayer.SetResetItemTick(0)
    ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
    return
def ComLineupValue(lineupID, shapeType, posNum): return lineupID * 10000 + shapeType * 100 + posNum
def GetLineupValue(lineupValue):
    lineupID = lineupValue / 10000
    shapeType = lineupValue % 10000 / 100
    posNum = lineupValue % 100
    return lineupID, shapeType, posNum
#def ResetHeroPack(curPlayer):
#    tick = GameWorld.GetGameWorld().GetTick()
#    curPlayer.SetResetItemTick(0)
#    ItemControler.ResetItem(curPlayer, ShareDefine.rptHero, 0, 0, tick)
#    return
    
def RefreshLordAttr(curPlayer):
    ## 刷新主公属性
    CalcHeroItemAddAttr(curPlayer)
    CalcHeroAddAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
    return
def CalcHeroItemAddAttr(curPlayer):
    #allAttrListPet = [{} for _ in range(4)]
def CalcHeroAddAttr(curPlayer):
    ## 计算武将对主公增加的属性
    heroBookAttrDict = {}
    playerID = curPlayer.GetID()
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetHeroCount()):
        ipyData = ipyDataMgr.GetHeroByIndex(index)
        heroID = ipyData.GetHeroID()
        if not GetHeroBookInitState(curPlayer, heroID):
            # 图鉴未激活
            continue
        quality = ipyData.GetQuality()
        qualityIpyData = IpyGameDataPY.GetIpyGameData("HeroQuality", quality)
        if not qualityIpyData:
            continue
        bookInitAddPer = qualityIpyData.GetBookInitAddPer()
        bookStarAddPer = qualityIpyData.GetBookStarAddPer()
        bookBreakLVAddPer = qualityIpyData.GetBookBreakLVAddPer()
        bookStar = GetHeroBookStarLV(curPlayer, heroID)
        bookBreakLV = GetHeroBookBreakLV(curPlayer, heroID)
        for attrPerID in ChConfig.BaseAttrPerIDList:
            addPer = bookInitAddPer + bookStar * bookStarAddPer + bookBreakLV * bookBreakLVAddPer
            heroBookAttrDict[attrPerID] = heroBookAttrDict.get(attrPerID, 0) + addPer
    GameWorld.DebugLog("武将图鉴属性: %s" % heroBookAttrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_HeroBook, heroBookAttrDict)
    return
def RefreshLineupHeroAttr(curPlayer):