ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -25,18 +25,14 @@
import traceback
import random
import ReadChConfig
import ChItem
import PlayerSuccess
import PlayerFamily
import PlayerActivity
import ChPyNetSendPack
import NetPackCommon
import PlayerXiangong
import IpyGameDataPY
import DataRecordPack
import PlayerGubao
import PyGameData
import ChEquip
import PlayerHero
import PlayerMail
import math
import time
@@ -183,24 +179,6 @@
            return item
        
    return None
## 检查是否可以换马匹
#  @param curPlayer 当前玩家
#  @return None or True
#  @remarks 函数详细说明.
def CheckCanEquipHorse(curPlayer):
    if curPlayer.GetPlayerVehicle() == IPY_GameWorld.pvHorse :
        #DJ_Res_Horses_AlreadyEquip  对不起,您处于骑马状态中,操作无效
        PlayerControl.NotifyCode(curPlayer, "DJ_Res_Horses_AlreadyEquip")
        return
    horsePack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptHorse)
    if not GetPackIsEmpty(horsePack):
        #Horses_Bag_NoRoom 对不起,您的马匹背包中有物品,操作无效!
        PlayerControl.NotifyCode(curPlayer, "Horses_Bag_NoRoom")
        return
    return True
#===============================================================================
# #将物品放入增值栏的一个空位置中,如果失败,替换第一个位置
@@ -505,6 +483,12 @@
    
    itemType = curItem.GetType()
    itemID = curItem.GetItemTypeID()
    if itemType in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 4) \
        or itemID in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 5):
        #GameWorld.DebugLog("不需要记录的物品类型或ID! itemType=%s,itemID=%s" % (itemType, itemID))
        return False
    itemTypeMinColorDict = IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 1)
    if itemType in itemTypeMinColorDict:
        minColor = itemTypeMinColorDict[itemType]
@@ -518,11 +502,6 @@
        or itemID in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 3):
        #GameWorld.DebugLog("需要记录的物品类型或ID! itemType=%s,itemID=%s" % (itemType, itemID))
        return True
    if itemType in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 4) \
        or itemID in IpyGameDataPY.GetFuncEvalCfg("ItemRecordRule", 5):
        #GameWorld.DebugLog("不需要记录的物品类型或ID! itemType=%s,itemID=%s" % (itemType, itemID))
        return False
    
    #if itemType == ChConfig.Def_ItemType_Rune:
    #    return IsRuneItemNeedRecord(curItem, curItem.GetUserAttr(ShareDefine.Def_IudetRuneLV))
@@ -876,41 +855,6 @@
            return True
        if itemID not in ChConfig.Def_TransformItemIDList:
            return False
        if itemID == ChConfig.Def_ItemID_SilverMoney:
            PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, itemCount)
        elif itemID == ChConfig.Def_ItemID_SP:
            PlayerControl.PlayerAddZhenQi(curPlayer, itemCount)
        elif itemID == ChConfig.Def_ItemID_GoldPaper:
            PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, itemCount, moneyEventName, addDict)
        elif itemID == ChConfig.Def_ItemID_RealmPoint:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, itemCount)
        elif itemID == ChConfig.Def_ItemID_BossReborn:
            msgStr = str(itemCount)
            GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'AddBossRebornPoint', msgStr, len(msgStr))
        elif itemID == ChConfig.Def_ItemID_Ysog:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Ysog, itemCount)
        elif itemID == ChConfig.Def_ItemID_SoulDust:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SoulDust, itemCount)
        elif itemID == ChConfig.Def_ItemID_SoulSplinters:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SoulSplinters, itemCount)
        elif itemID == ChConfig.Def_ItemID_SoulCore:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SoulCore, itemCount)
        elif itemID == ChConfig.Def_ItemID_Honor:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_Honor, itemCount)
        elif itemID == ChConfig.Def_ItemID_GoldMoney:
            PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, itemCount, moneyEventName, addDict)
        elif itemID == ChConfig.Def_ItemID_FuncSysPrivilege:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FuncSysPrivilege, itemCount)
        elif itemID == ChConfig.Def_ItemID_BTGMPoint:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_BTGMPoint, itemCount)
        elif itemID == ChConfig.Def_ItemID_GuShenMoney:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_GuShenMoney, itemCount)
        elif itemID == ChConfig.Def_ItemID_GongdePoint:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_GongdePoint, itemCount)
        elif itemID == ChConfig.Def_ItemID_FamilyFlagWarPoint:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyFlagWarPoint, itemCount)
        elif itemID == ChConfig.Def_ItemID_SuccessScore:
            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_SuccessSocre, itemCount, moneyEventName, addDict)
        return True
    
    def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
@@ -923,6 +867,18 @@
        itemData = [tagItem.GetItemTypeID(), tagItem.GetCount(), tagItem.GetIsBind(), tagItem.GetUserData()]
        itemMsg = {"PlayerID":curPlayer.GetPlayerID(), "ItemData":itemData, "PackIndex":packIndex, "Event":event}
        GameWorld.SendMsgToClientServer(ShareDefine.CrossServerMsg_PutInItem, itemMsg, [serverGroupID])
        return
    def __autoUseByEffectID(self, curPlayer, tagItem, itemEff, itemID, itemCount):
        effectID = itemEff.GetEffectID()
        # 物品碎片
        if effectID == ChConfig.Def_Effect_ItemCount:
            SetItemCountByID(curPlayer, itemID, GetItemCountByID(curPlayer, itemID) + itemCount)
        # 活跃度
        elif effectID == ChConfig.Def_Effect_AddActivity:
            PlayerActivity.DoAddActivity(curPlayer, itemCount)
        return
    
    ## 放入物品 
@@ -963,26 +919,11 @@
        #    tagItem.Clear()
        #    return True
        itemEff = tagItem.GetEffectByIndex(0)
        #物品碎片
        if itemEff.GetEffectID() == ChConfig.Def_Effect_ItemCount:
            SetItemCountByID(curPlayer, itemID, GetItemCountByID(curPlayer, itemID) + tagItemCount)
        if itemEff.GetEffectID() in ChConfig.AutoUseItemEffectIDList:
            self.__autoUseByEffectID(curPlayer, tagItem, itemEff, itemID, tagItemCount)
            tagItem.Clear()
            return True
        #古宝碎片
        if itemEff.GetEffectID() == ChConfig.Def_Effect_GubaoPiece:
            gubaoID = itemEff.GetEffectValue(0)
            if gubaoID:
                PlayerGubao.AddGubaoPiece(curPlayer, gubaoID, tagItemCount, itemID)
                tagItem.Clear()
                return True
        #气运
        if itemEff.GetEffectID() == ChConfig.Def_Effect_TiandaoQiyun:
            isAutoUse = itemEff.GetEffectValue(1)
            if isAutoUse:
                addQiyun = itemEff.GetEffectValue(0) * tagItemCount
                PlayerXiangong.AddTiandaoQiyun(curPlayer, addQiyun, {"ItemID":itemID, "ItemCount":tagItemCount, "isAutoUse":1})
                tagItem.Clear()
                return True
        #增加副本次数
        if itemEff.GetEffectID() == ChConfig.Def_Effect_AddFBCnt:
            isAutoUse = itemEff.GetEffectValue(1)
@@ -1019,7 +960,11 @@
            return self.PutItemInVPack(packIndex, tagItem, event)
        
        eventName, isForceEvent, addDict = event
        if PlayerHero.AutoChangeToSkinPoint(curPlayer, tagItem, eventName):
            tagItem.Clear()
            return True
        #记录创建物品时的登录天
        if tagItem.GetItemTypeID() in ReadChConfig.GetEvalChConfig('OpenBoxByLoginDayCfg'):
            if tagItem.GetUserAttr(ShareDefine.Def_IudetCreateItemLoginDay) == 0:#没有设置过才设置
@@ -1029,7 +974,7 @@
        #itemFactory = GameWorld.GetItemFactory()
        #isBind = tagItem.GetIsBind()
        # 目前暂只记录放入背包的
        if not isNeedRecord and packIndex in [IPY_GameWorld.rptItem, ShareDefine.rptTreasure, ShareDefine.rptRune, ShareDefine.rptGatherSoul, ShareDefine.rptDogzItem]:
        if not isNeedRecord and packIndex in ShareDefine.NeedRecordRPType:
            isNeedRecord = ItemNeedRecord(tagItem) or isForceEvent
        putResult = False
        
@@ -1721,74 +1666,9 @@
    return
def ResetHeroPack(curPlayer, curPack, beingIndex, endIndex):
    itemList = []
    for i in range(beingIndex, endIndex + 1):
        curRoleItem = curPack.GetAt(i)
        if curRoleItem.IsEmpty():
            continue
        curItem = curRoleItem.GetItem()
        itemList.append(curItem)
    itemList.sort(__CmpHeroPack)
    curPack.WipePack(beingIndex, endIndex)
    putPlace = beingIndex
    for item in itemList:
        curPack.GetAt(putPlace).AssignItem(item, False)
        putPlace += 1
    ## 前端自行排序
    return
def __CmpHeroPack(item1, item2):
    '''排序规则:上阵武将排前,未上阵武将排后,再各自按照以下规则排序
    武将等级>突破等级>武将星级>武将品质>武将ID
    '''
    posNum1, posNum2 = 0, 0
    for lpIndex in range(item1.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
        lineupValue = item1.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        lineupID, _, posNum = PlayerHero.GetLineupValue(lineupValue)
        if lineupID != ShareDefine.Lineup_Main:
            continue
        posNum1 = posNum
        break
    for lpIndex in range(item2.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
        lineupValue = item2.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
        lineupID, _, posNum = PlayerHero.GetLineupValue(lineupValue)
        if lineupID != ShareDefine.Lineup_Main:
            continue
        posNum2 = posNum
        break
    if (posNum1 and posNum2) or (not posNum1 and not posNum2):
        lv1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroLV)
        lv2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroLV)
        if lv1 == lv2:
            bLV1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
            bLV2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroBreakLV)
            if bLV1 == bLV2:
                star1 = item1.GetUserAttr(ShareDefine.Def_IudetHeroStar)
                star2 = item2.GetUserAttr(ShareDefine.Def_IudetHeroStar)
                if star1 == star2:
                    heroID1 = item1.GetItemTypeID()
                    heroID2 = item2.GetItemTypeID()
                    ipyData1 = IpyGameDataPY.GetIpyGameData("Hero", heroID1)
                    ipyData2 = IpyGameDataPY.GetIpyGameData("Hero", heroID2)
                    quality1 = ipyData1.GetQuality() if ipyData1 else 0
                    quality2 = ipyData2.GetQuality() if ipyData2 else 0
                    if quality1 == quality2:
                        return cmp(heroID1, heroID2)
                    return -cmp(quality1, quality2)
                return -cmp(star1, star2)
            return -cmp(bLV1, bLV2)
        return -cmp(lv1, lv2)
    elif posNum1:
        return -1
    elif posNum2:
        return 1
    else:
        return cmp(item1.GetItemTypeID(), item2.GetItemTypeID())
#===============================================================================
#Python 版重整物品
# def ResetItem(curPlayer, curPackIndex, tick):
@@ -2023,11 +1903,11 @@
        return False
    
    if isAuctionItem:
        ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
        if not ipyData:
            GameWorld.ErrLog("非拍卖物品,默认转为非拍品! itemID=%s,itemCount=%s,isAuctionItem=%s"
                             % (itemID, itemCount, isAuctionItem), curPlayer.GetPlayerID())
            isAuctionItem = 0
        #ipyData = None #IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
        #if not ipyData:
        #    GameWorld.ErrLog("非拍卖物品,默认转为非拍品! itemID=%s,itemCount=%s,isAuctionItem=%s"
        #                     % (itemID, itemCount, isAuctionItem), curPlayer.GetPlayerID())
        isAuctionItem = 0
    
    defaultPack = IPY_GameWorld.rptItem if not packIndexList else packIndexList[0]
    packIndex = ChConfig.GetItemPackType(curItemData, defaultPack)
@@ -2129,24 +2009,51 @@
    GameWorld.ErrLog('DoLogic_PutItemInPack Error 物品无法放入背包')
    return False
def GetIsBindValue(isBind=0, srcSign=0):
    ## 获取IsBind值,适用于配置或者通知前端特殊标记用,兼容是否绑定/拍品设定
    # @param isBind: 可支持原绑定/拍品逻辑,如果该项目没有该逻辑暂时默认都为0
    # @param srcSign: 标记物品特殊来源,如xx特权额外产出等
    return srcSign * 10 + isBind
## 是否拍品
def GetIsAuctionItem(curItem): return curItem.GetIsBind()
def GetIsAuctionItem(curItem): return 0#curItem.GetIsBind()
def SetIsAuctionItem(curItem, isAuctionItem, curPlayer=None):
    curItem.SetIsBind(isAuctionItem)
    if isAuctionItem:
        curItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, int(time.time()))
        return
    #curItem.SetIsBind(isAuctionItem)
    #
    #if isAuctionItem:
    #    curItem.SetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime, int(time.time()))
    #    return
    return
def GetItemCountByID(curPlayer, itemID):
    return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemCount % itemID)
def SetItemCountByID(curPlayer, itemID, itemCount, isSync=True):
    befCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ItemCount % itemID)
    itemCount = max(0, min(itemCount, ChConfig.Def_UpperLimit_DWord))
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ItemCount % itemID, itemCount)
    # 检查碎片溢出自动转化,数量增加时才检查
    if itemCount > befCount:
        #GameWorld.DebugLog("碎片数量增加,检查溢出! itemID=%s,itemCount=%s,befCount=%s" % (itemID, itemCount, befCount))
        if PlayerGubao.AutoTransGubaoPiece(curPlayer, itemID):
            PyGameData.g_transItemSign = 1
    if isSync:
        Sync_AutoItemCount(curPlayer, [itemID])
    return itemCount
def CheckItemEnoughByID(curPlayer, itemID, needCount):
    itemCount = GetItemCountByID(curPlayer, itemID)
    if itemCount < needCount:
        GameWorld.DebugLog("物品碎片不足! itemID=%s,itemCount=%s < %s" % (itemID, itemCount, needCount))
        return False
    return True
def DelItemCountByID(curPlayer, itemID, delCount, isSync=True):
    itemCount = GetItemCountByID(curPlayer, itemID)
    if itemCount < delCount:
        GameWorld.DebugLog("扣除物品碎片不足! itemID=%s,itemCount=%s < %s" % (itemID, itemCount, delCount))
        return False
    SetItemCountByID(curPlayer, itemID, itemCount - delCount, isSync)
    return True
## 设置物品数量
#  @param item 物品实例
@@ -2189,12 +2096,8 @@
    if itemData.GetItemTypeID() in ChConfig.Def_TransformItemIDList or itemData.GetType() == ChConfig.Def_ItemType_AutoUseMoney:
        return True
    itemEff = itemData.GetEffectByIndex(0)
    if itemEff.GetEffectID() == ChConfig.Def_Effect_ItemCount:
    if itemEff.GetEffectID() in ChConfig.AutoUseItemEffectIDList:
        return True
    if itemEff.GetEffectID() == ChConfig.Def_Effect_GubaoPiece:
        gubaoID = itemEff.GetEffectValue(0)
        if gubaoID:
            return True
    return False
def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
@@ -2372,7 +2275,7 @@
            break
           
    if isSendMail:
        PlayerControl.SendMailByKey(mailKey, [curPlayer.GetPlayerID()], giveItemList)
        PlayerMail.SendMailByKey(mailKey, curPlayer.GetPlayerID(), giveItemList)
        GameWorld.DebugLog("GivePlayerItemOrMail背包空间不够,发送邮件: mailItemList=%s" % str(giveItemList), curPlayer.GetPlayerID())
    else:
        for itemID, itemCnt, isAuctionItem in giveItemList:
@@ -2387,6 +2290,7 @@
    '''通知玩家获得奖励信息
    @param giveItemInfo: 可以是列表 [[itemID,count,isBind], ...] 或  [[itemID,count], ...] 或  {itemID:count, ...}
    @param moneyInfo: 奖励货币信息 {moneyType:moneyValue, ...} moneyType 可以是字符串或数值
                    moneyValue 也可以传入列表 [moneyValue, isBind],其中 isBind 同物品的 isBind 标记逻辑
    '''
    notifyItemList = []
    if isinstance(giveItemInfo, dict):
@@ -2400,14 +2304,23 @@
    clientPack.ExpPoint = exp / ChConfig.Def_PerPointValue
    clientPack.Exp = exp % ChConfig.Def_PerPointValue
    if moneyInfo and isinstance(moneyInfo, dict):
        for moneyType, moneyValue in moneyInfo.items():
        for moneyType, moneyValueInfo in moneyInfo.items():
            if isinstance(moneyType, str):
                moneyType = int(moneyType)
            if not moneyType or not moneyValue:
            if not moneyType or not moneyValueInfo:
                continue
            isBind = 0
            if isinstance(moneyValueInfo, int):
                moneyValue = moneyValueInfo
            elif isinstance(moneyValueInfo, list):
                moneyValue = moneyValueInfo[0]
                isBind = moneyValueInfo[1] if len(moneyValueInfo) > 1 else 0
            else:
                continue
            money = ChPyNetSendPack.tagMCGiveAwardMoney()
            money.MoneyType = moneyType
            money.MoneyValue = moneyValue
            money.IsBind = isBind
            clientPack.MoneyList.append(money)
        clientPack.MoneyLen = len(clientPack.MoneyList)
    for itemInfo in notifyItemList:
@@ -2479,7 +2392,7 @@
            
    if notifyMailKey:
        paramList = [itemID, itemID, recycleCount]
        PlayerControl.SendMailByKey(notifyMailKey, [playerID], addItemList, paramList)
        PlayerMail.SendMailByKey(notifyMailKey, playerID, addItemList, paramList)
    elif addItemList:
        GivePlayerItemOrMail(curPlayer, addItemList, event=["RecycleItem", False, {"RecycleItemID":itemID}])