From 9a5d8288ba607bdcd67cb93e03c7f09ece8b1569 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 13 三月 2026 14:29:24 +0800
Subject: [PATCH] 556 【付费功能】时装商店-服务端(优化时装转化碎片时A801通知,封包修改货币增加IsBind,同物品标记逻辑,时装转化标记=40;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py |  180 +++++++++++++++--------------------------------------------
 1 files changed, 47 insertions(+), 133 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index 79539df..15d3233 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -28,12 +28,11 @@
 import PlayerActivity
 import ChPyNetSendPack
 import NetPackCommon
-import PlayerXiangong
 import IpyGameDataPY
 import PlayerGubao
 import PyGameData
 import PlayerHero
-import ObjPool
+import PlayerMail
 
 import math
 import time
@@ -484,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]
@@ -497,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))
@@ -855,39 +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)
         return True
     
     def __CrossServerPutInItem(self, packIndex, tagItem, event=["", False, {}]):
@@ -957,14 +924,6 @@
             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)
@@ -1001,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:#没有设置过才设置
@@ -1011,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
         
@@ -1264,7 +1227,7 @@
         itemCount = GetItemCountByID(curPlayer, itemID)
         if not itemCount and not force:
             continue
-        countInfo = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCAutoItemCount)
+        countInfo = ChPyNetSendPack.tagMCAutoItemCount()
         countInfo.Clear()
         countInfo.ItemID = itemID
         countInfo.ItemCount = itemCount
@@ -1273,7 +1236,7 @@
     if not itemCountList:
         return
     
-    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagMCAutoItemCountRefresh)
+    clientPack = ChPyNetSendPack.tagMCAutoItemCountRefresh()
     clientPack.Clear()
     clientPack.ItemCountList = itemCountList
     clientPack.Count = len(clientPack.ItemCountList)
@@ -1703,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):
@@ -2005,11 +1903,11 @@
         return False
     
     if isAuctionItem:
-        ipyData = None #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)
@@ -2111,14 +2009,20 @@
     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):
@@ -2371,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:
@@ -2386,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):
@@ -2399,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:
@@ -2478,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}])
         

--
Gitblit v1.8.0