ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerGubao.py
@@ -41,7 +41,7 @@
# 古宝领取物品特殊效果列表
GubaoEffTtemIypeList = [GubaoEffType_ActivityPlace, GubaoEffType_Arena, GubaoEffType_KillWorldBoss, GubaoEffType_KillBossHome,
                        GubaoEffType_KillCrossPenglaiBoss, GubaoEffType_KillCrossDemonLandBoss, GubaoEffType_KillSealDemonBoss,
                        GubaoEffType_KillCrossPenglaiBoss, GubaoEffType_KillCrossDemonLandBoss, GubaoEffType_KillSealDemonBoss,
                        GubaoEffType_CrossRealmPK,
                        ]
@@ -57,7 +57,46 @@
def OnPlayerLogin(curPlayer):
    Sync_GubaoInfo(curPlayer)
    Sync_GubaoItemEffInfo(curPlayer)
    Sync_GubaoPieceInfo(curPlayer)
    return
def AddGubaoPiece(curPlayer, gubaoID, addCount, useItemID):
    curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)
    updCount = min(curCount + addCount, ChConfig.Def_UpperLimit_DWord)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoPiece % gubaoID, updCount)
    Sync_GubaoPieceInfo(curPlayer, [gubaoID])
    GameWorld.Log("增加古宝碎片: gubaoID=%s,curCount=%s,addCount=%s,updCount=%s,useItemID=%s"
                  % (gubaoID, curCount, addCount, updCount, useItemID), curPlayer.GetPlayerID())
    return curCount, updCount
def DelGubaoPiece(curPlayer, gubaoID, delCount, delName):
    curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)
    if curCount < delCount:
        return False
    updCount = curCount - delCount
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_GubaoPiece % gubaoID, updCount)
    Sync_GubaoPieceInfo(curPlayer, [gubaoID])
    GameWorld.Log("扣除古宝碎片: gubaoID=%s,curCount=%s,delCount=%s,updCount=%s,delName=%s"
                  % (gubaoID, curCount, delCount, updCount, delName), curPlayer.GetPlayerID())
    return True
def ParseGubaoNeedItem(curPlayer, needItemList):
    ## 解析古宝功能所需物品,转化为古宝碎片+物品
    needPieceInfo, realNeedItemList = {}, []
    for itemID, itemCount in needItemList:
        itemData = GameWorld.GetGameData().GetItemByTypeID(itemID)
        if not itemData:
            continue
        curEff = itemData.GetEffectByIndex(0)
        effID = curEff.GetEffectID()
        if effID != ChConfig.Def_Effect_GubaoPiece:
            realNeedItemList.append([itemID, itemCount])
            continue
        gubaoID = curEff.GetEffectValue(0)
        needPieceInfo[gubaoID] = needPieceInfo.get(gubaoID, 0) + itemCount
    GameWorld.DebugLog("转化古宝功能所需物品: needItemList=%s,realNeedItemList=%s,needPieceInfo=%s"
                       % (needItemList, realNeedItemList, needPieceInfo), curPlayer.GetPlayerID())
    return needPieceInfo, realNeedItemList
#// B2 16 古宝激活 #tagCMGubaoActivate
#
@@ -83,13 +122,24 @@
        GameWorld.DebugLog("古宝已经激活过! gubaoID=%s" % gubaoID, playerID)
        return
    
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
    if not hasEnough:
        GameWorld.DebugLog("激活古宝道具不足! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt), playerID)
        return
    ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, "Gubao")
    needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, [[needItemID, needItemCnt]])
    if realNeedItemList:
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        hasEnough, itemList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
        if not hasEnough:
            GameWorld.DebugLog("激活古宝道具不足! needItemID=%s,needItemCnt=%s" % (needItemID, needItemCnt), playerID)
            return
    for gID, needPieceCount in needPieceInfo.items():
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)
        if curCount < needPieceCount:
            GameWorld.DebugLog("激活古宝碎片不足! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)
            return
    for gID, needPieceCount in needPieceInfo.items():
        DelGubaoPiece(curPlayer, gID, needPieceCount, "Activate")
    if realNeedItemList:
        ItemCommon.ReduceItem(curPlayer, itemPack, itemList, needItemCnt, False, "Gubao")
    lv, star = 1, 1
    SetGubaoLVInfo(curPlayer, gubaoID, lv, star)
    GameWorld.Log("古宝激活成功! gubaoID=%s" % gubaoID, playerID)
@@ -126,14 +176,25 @@
    if not needItemList:
        return
    
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("古宝升星所需物品不足! star=%s,needItemList=%s,lackItemDict=%s" % (star, needItemList, lackItemDict), playerID)
        return
    needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, needItemList)
    if realNeedItemList:
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(realNeedItemList, itemPack)
        if lackItemDict:
            GameWorld.DebugLog("古宝升星所需物品不足! star=%s,realNeedItemList=%s,lackItemDict=%s" % (star, realNeedItemList, lackItemDict), playerID)
            return
    for gID, needPieceCount in needPieceInfo.items():
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)
        if curCount < needPieceCount:
            GameWorld.DebugLog("古宝升星所需古宝碎片不足! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)
            return
    #扣消耗
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
    for gID, needPieceCount in needPieceInfo.items():
        DelGubaoPiece(curPlayer, gID, needPieceCount, "StarUp")
    if realNeedItemList:
        ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
    updStar = star + 1
    SetGubaoLVInfo(curPlayer, gubaoID, lv, updStar)
    GameWorld.Log("古宝升星: gubaoID=%s,updStar=%s" % (gubaoID, updStar), playerID)
@@ -175,14 +236,25 @@
    if not needItemList:
        return
    
    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
    lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemList, itemPack)
    if lackItemDict:
        GameWorld.DebugLog("古宝升级所需物品不足! quality=%s,lv=%s,needItemList=%s,lackItemDict=%s"
                           % (quality, lv, needItemList, lackItemDict), playerID)
        return
    needPieceInfo, realNeedItemList = ParseGubaoNeedItem(curPlayer, needItemList)
    if realNeedItemList:
        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
        lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(realNeedItemList, itemPack)
        if lackItemDict:
            GameWorld.DebugLog("古宝升级所需物品不足! quality=%s,lv=%s,realNeedItemList=%s,lackItemDict=%s"
                               % (quality, lv, realNeedItemList, lackItemDict), playerID)
            return
    for gID, needPieceCount in needPieceInfo.items():
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gID)
        if curCount < needPieceCount:
            GameWorld.DebugLog("古宝升级所需古宝碎片不足! gubaoID=%s,curCount=%s < needPieceCount=%s" % (gubaoID, curCount, needPieceCount), playerID)
            return
    #扣消耗
    ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
    for gID, needPieceCount in needPieceInfo.items():
        DelGubaoPiece(curPlayer, gID, needPieceCount, "LVUp")
    if realNeedItemList:
        ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, "Gubao")
    
    updLV = lv + 1
    SetGubaoLVInfo(curPlayer, gubaoID, updLV, star)
@@ -640,3 +712,32 @@
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def Sync_GubaoPieceInfo(curPlayer, gubaoIDList=None):
    if gubaoIDList == None:
        syncIDList = []
        ipyDataMgr = IpyGameDataPY.IPY_Data()
        for index in range(ipyDataMgr.GetGubaoCount()):
            ipyData = ipyDataMgr.GetGubaoByIndex(index)
            syncIDList.append(ipyData.GetGubaoID())
    else:
        syncIDList = gubaoIDList
    pieceInfoList = []
    for gubaoID in syncIDList:
        curCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GubaoPiece % gubaoID)
        if not curCount and gubaoIDList == None:
            # 没有指定时只同步有数量的
            continue
        gubao = ChPyNetSendPack.tagMCGubaoPiece()
        gubao.GubaoID = gubaoID
        gubao.PieceCount = curCount
        pieceInfoList.append(gubao)
    if not pieceInfoList:
        return
    clientPack = ChPyNetSendPack.tagMCGubaoPieceInfo()
    clientPack.PieceInfoList = pieceInfoList
    clientPack.Count = len(clientPack.PieceInfoList)
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return