From 4087d18ce7cbd1578a6e287962bd902386984048 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 14 七月 2025 10:55:57 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_ServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py |  304 ++++++++++++++++++++++----------------------------
 1 files changed, 132 insertions(+), 172 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 09a7580..3d0c00b 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -39,9 +39,9 @@
 import DataRecordPack
 import PlayerGubao
 import PyGameData
-import EventShell
 import PlayerVip
 import ChEquip
+import PlayerHero
 
 import math
 import time
@@ -879,11 +879,8 @@
         #itemColor = curItem.GetItemColor()
         result = self.SwitchEquip(curItem, equipPackIndex)
         if result:
-            #穿戴某阶某品质的装备成就
-            PlayerSuccess.DoEquipSuccessLogic(curPlayer, classLV)
             #换装宝石处理
             Operate_EquipStone.DoMoveEquipStone(curPlayer, equipPackIndex)
-            EventShell.EventRespons_EquipItem(curPlayer)
             dataDict = {'dotype':'EquipItem', 'desItemID':desItemID, 'desUserData':desUserData,'srcItemID':srcItemID,'srcUserData':srcUserData}
             DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
             self.__UpdEquipOrangeCount(befIsOrangeEquip, aftIsOrangeEquip)
@@ -1005,8 +1002,7 @@
         if suiteID and itemClassLV == ChEquip.GetEquipFacadeClassLV(curPlayer):
             #脱当前外观阶的套装
             ChEquip.ChangeEquipfacadeByClassLV(curPlayer, itemClassLV)
-        
-        EventShell.EventRespons_EquipItem(curPlayer)
+            
         dataDict = {'dotype':'UnEquipItem', 'equipID':equipID, 'userData':userData}
         DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
 #===============================================================================
@@ -1073,7 +1069,7 @@
     def DoTransformItem(self, curPlayer, tagItem, event=["", False, {}]):
         ## 将特殊物品转化为对应数值
         itemID = tagItem.GetItemTypeID()
-        itemCount = max(tagItem.GetUserAttr(ShareDefine.Def_IudetItemCount), tagItem.GetCount())
+        itemCount = tagItem.GetCount()
         eventName, isForceEvent, addDict = event
         if isForceEvent:
             pass
@@ -1349,6 +1345,10 @@
                 if isNeedRecord:
                     itemNoteDict = ItemCommon.GetItemNoteDict(item, curItemCount, packItemCount, GetItemCount(item))
                     ItemCommon.DR_GetItem(curPlayer, packIndex, eventName, itemNoteDict, addDict)
+                    
+                if item.GetType() == ChConfig.Def_ItemType_Hero:
+                    PlayerHero.OnGiveHeroItem(curPlayer, item)
+                    
                 break
                                                 
         #放入东西
@@ -1659,14 +1659,21 @@
     if endIndex == 0:
         endIndex = curPack.GetCount() - 1
     #检查是否能整理
-    for i in range(0, curPack.GetCount()):
-        curItem = curPack.GetAt(i)
-        if curItem.GetIsLocked():
-            #GameWorld.Log("物品有锁, 不允许重整")
-            return
+    #for i in range(0, curPack.GetCount()):
+    #    curItem = curPack.GetAt(i)
+    #    if curItem.GetIsLocked():
+    #        #GameWorld.Log("物品有锁, 不允许重整")
+    #        return
     
     # 整理方式不同区分
-    if packIndex == IPY_GameWorld.rptWarehouse:
+    if packIndex == ShareDefine.rptHero:
+        if tick - curPlayer.GetResetItemTick() <= ChConfig.Def_ItemPackResetInterval:
+            #GameWorld.DebugLog("重整背包时间间隔太短")
+            return
+        curPlayer.SetResetItemTick(tick)
+        ResetHeroPack(curPlayer, curPack, beingIndex, endIndex)
+        
+    elif packIndex == IPY_GameWorld.rptWarehouse:
         #验证间隔
         if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_WareHouseSort) < \
                 ChConfig.TYPE_Player_Tick_Time[ChConfig.TYPE_Player_Tick_WareHouseSort]:
@@ -1971,7 +1978,75 @@
  
     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 = lineupValue / 10000
+        if lineupID != ShareDefine.Lineup_Main:
+            continue
+        posNum1 = lineupValue % 100
+        break
+        
+    for lpIndex in range(item2.GetUserAttrCount(ShareDefine.Def_IudetHeroLineup)):
+        lineupValue = item2.GetUserAttrByIndex(ShareDefine.Def_IudetHeroLineup, lpIndex)
+        lineupID = lineupValue / 10000
+        if lineupID != ShareDefine.Lineup_Main:
+            continue
+        posNum2 = lineupValue % 100
+        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):
@@ -2189,7 +2264,41 @@
         
     return
 
-def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}]):
+def CheckGiveBindMoneyTypeItem(curPlayer, checkMoneyType=None):
+    ## 检查给绑定货币的展示物品
+    bindMoneyItemInfo = IpyGameDataPY.GetFuncEvalCfg("PutInItemPack", 2, {})
+    
+    needMoneyItemDict = {}
+    for itemIDStr, moneyType in bindMoneyItemInfo.items():
+        if checkMoneyType != None and moneyType != checkMoneyType:
+            continue
+        if PlayerControl.GetMoney(curPlayer, moneyType): # 有货币时才需要
+            needMoneyItemDict[int(itemIDStr)] = moneyType
+                    
+    if not needMoneyItemDict:
+        #GameWorld.DebugLog("绑定货币显示物品已经都有了")
+        return
+    
+    curPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    for i in xrange(curPack.GetCount()):
+        curItem = curPack.GetAt(i)
+        if not curItem or curItem.IsEmpty():
+            continue
+        itemID = curItem.GetItemTypeID()
+        if itemID in needMoneyItemDict:
+            needMoneyItemDict.pop(itemID)
+            if not needMoneyItemDict:
+                break
+            
+    # 还有没给的物品补给,后端只负责给物品,不处理个数,前端对该类物品默认绑定货币对应的值来显示个数
+    for itemID, moneyType in needMoneyItemDict.items():
+        if not GivePlayerItem(curPlayer, itemID, 1, False, [IPY_GameWorld.rptItem]):
+            break
+        GameWorld.DebugLog("给绑定货币显示物品: moneyType=%s,itemID=%s" % (moneyType, itemID))
+        
+    return
+
+def GivePlayerItem(curPlayer, itemID, itemCount, isAuctionItem, packIndexList=None, event=["", False, {}], setAttrDict=None):
     '''给玩家物品
     @param isAuctionItem: 是否拍品
     '''
@@ -2224,19 +2333,11 @@
         #不可放入
         return False
     
-    #定制物品
-    if GetAppointItemRealID(itemID):
-        isOK = False
-        for _ in xrange(itemCount):
-            if GivePlayerAppointItem(curPlayer, itemID, isAuctionItem, event):
-                isOK = True # 只要有成功的就返回成功,防止异常情况失败可能导致被刷
-        return isOK
-    
     #装备
     if ItemCommon.GetIsEquip(curItemData):
         isOK = False
         for _ in xrange(itemCount):
-            outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer)
+            outPutEquip = GetOutPutItemObj(itemID, 1, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
             if not outPutEquip:
                 return isOK
             if DoLogic_PutItemInPack(curPlayer, outPutEquip, event, packIndexList):
@@ -2245,10 +2346,10 @@
     
     #常规物品
     isOK = False
-    for _ in range(itemCount/65535 + 1):
+    for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
         if itemCount <= 0:
             break
-        giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer)
+        giveItem = GetOutPutItemObj(itemID, itemCount, isAuctionItem, curPlayer=curPlayer, setAttrDict=setAttrDict)
         if not giveItem:
             return isOK
         giveCount = GetItemCount(giveItem)
@@ -2264,7 +2365,7 @@
     # @return: 给成功总数,0代表给失败了
     
     giveOKCount = 0
-    for _ in range(itemCount/65535 + 1):
+    for _ in range(itemCount/ChConfig.Def_ItemCount_Max + 1):
         if giveOKCount >= itemCount:
             break
         giveItem = GetOutPutItemObj(itemID, itemCount - giveOKCount, isAuctionItem, curPlayer=curPlayer)
@@ -2281,110 +2382,6 @@
             giveOKCount += curCount
             
     return giveOKCount
-
-def GivePlayerAppointItem(curPlayer, appointID, isAuctionItem, event=["", False, {}]):
-    '''给玩家定制物品表物品,定制物品默认个数1
-    @param appointID 定制表ID
-    @param isAuctionItem 是否拍品
-    '''
-    itemDictData = GetAppointItemDictData(appointID, isAuctionItem)
-    if not itemDictData:
-        return False
-    
-    return GivePlayerEquip(curPlayer, itemDictData, event=event)
-
-def GetAppointItemDictData(appointID, isAuctionItem):
-    '''获取定制表物品数据,定制物品默认个数1
-    @param appointID 定制表ID
-    @param isAuctionItem 是否拍品
-    '''
-    itemID = GetAppointItemRealID(appointID)
-    if not itemID:
-        return {}
-    ipyData = IpyGameDataPY.GetIpyGameData("AppointItem", appointID)
-    if not ipyData:
-        return {}
-    itemDictData = {}
-   
-    itemDictData['legendAttrID'] = ipyData.GetLegendAttrID()
-    itemDictData['legendAttrValue'] = ipyData.GetLegendAttrValue()
-    itemDictData['ItemID'] = itemID
-    itemDictData['CancelUseLimit'] = ipyData.GetCancelUseLimit()
-    
-    itemDictData['IsAuctionItem'] = isAuctionItem
-    
-    return itemDictData
-
-def GetAppointItemRealID(itemID):
-    '''获取定制物品对应的真实物品ID'''
-    curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
-    if not curItem:
-        return 0
-    curEff = curItem.GetEffectByIndex(0)
-    curEffID = curEff.GetEffectID()
-    if curEffID != ChConfig.Def_Effect_AppointItem:
-        return 0
-    return curEff.GetEffectValue(0)
-
-## 根据物品data字典给玩家装备/翅膀
-#  @param curPlayer:玩家实例
-#  @param itemData:物品数据
-#  @param packType:背包类型
-#  @param defaultPile 默认先判断是否能进行物品堆叠
-#  @return None
-def GivePlayerEquip(curPlayer, itemData, event=["", False, {}], packType=[IPY_GameWorld.rptItem, IPY_GameWorld.rptAnyWhere],
-                    defaultPile=True):
-    equipItem = GetItemByData(itemData)
-    #将物品放入背包
-    return DoLogic_PutItemInPack(curPlayer, equipItem, event, packType, defaultPile)
-
-
-## 根据物品data字典创建物品
-#  @param itemData:物品数据
-#  @return ItemObj
-def GetItemByData(itemData):
-    if not itemData:
-        return
-    
-    itemID = int(itemData.get('ItemID', 0))
-    isAuctionItem = int(itemData.get('IsAuctionItem', 0))
-    equipItem = ItemCommon.CreateSingleItem(itemID, isAuctionItem=isAuctionItem)
-    if not equipItem:
-        return
-    
-    tmpEquipData = SingleEquipTmpData()
-    
-    #tmpEquipData.starLV = int(itemData.get('StarLV', '0'))
-    #tmpEquipData.holeCnt = int(itemData.get('HoleCount', '0'))
-    #tmpEquipData.stoneData = eval(itemData.get('StoneData', '[]'))
-    tmpEquipData.isBind = isAuctionItem
-    #tmpEquipData.isSuite = int(itemData.get('IsSuit', '0'))
-    #tmpEquipData.suiteLV = int(itemData.get('SuiteLV', '0'))
-    #if tmpEquipData.suiteLV:
-    #    tmpEquipData.isSuite = 1
-    tmpEquipData.source = int(itemData.get('Source', str(ShareDefine.Item_Source_Unkown)))
-    
-    tmpEquipData.legendAttrIDList = itemData.get('legendAttrID', [])
-    tmpEquipData.legendAttrValueList = itemData.get('legendAttrValue', [])
-    
-    # 装备附加属性
-    ChItem.EquipAddAdditionEx(equipItem, tmpEquipData)
-    
-    if "UserData" in itemData:
-        userData = itemData["UserData"]
-        ItemCommon.SetItemUserData(equipItem, userData)
-        
-    if "EquipGS" in itemData:
-        equipGS = int(itemData["EquipGS"])
-        ItemCommon.SetEquipGearScore(equipItem, equipGS)
-    
-        
-    # 取消等级限制
-    if itemData.get('CancelUseLimit', 0):
-        equipItem.SetUserAttr(ShareDefine.Def_IudetCancelUseLimit, 1)
-        
-    return equipItem
-
 
 #---------------------------------------------------------------------
 ## 执行物品放入背包逻辑
@@ -2481,10 +2478,7 @@
 #  @return None
 def SetItemCount(item, cnt, playerID=0, accID=0, playerName=""):
     if not item.IsEmpty():
-        if cnt > 0 and IsPutinAutoTransformItem(item):
-            item.SetUserAttr(ShareDefine.Def_IudetItemCount, min(cnt, ChConfig.Def_UpperLimit_DWord))
-        else:
-            item.SetCount(min(cnt, 65535))
+        item.SetCount(min(cnt, ChConfig.Def_ItemCount_Max))
     else:
         try:
             1 / 0
@@ -2493,10 +2487,7 @@
             GameWorld.ErrLog(errorInfo + str(traceback.extract_stack()) + "\n" + traceback.format_exc())
             raise
         
-def GetItemCount(item):
-    if IsPutinAutoTransformItem(item):
-        return item.GetUserAttr(ShareDefine.Def_IudetItemCount)
-    return item.GetCount()
+def GetItemCount(item): return item.GetCount()
 
 def GetItemNeedPackCount(packType, itemData, itemCount, isAuctionItem=0):
     # 20201223 主干取消拍品有效时长设定
@@ -2566,48 +2557,17 @@
     #---无空位置,替换---
     return placeList[0]
 
-def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, isAllAttr=False):
+def GetOutPutItemObj(itemID, itemCount=1, isAuctionItem=False, expireTime=0, curPlayer=None, setAttrDict=None):
     ''' 获取功能产出的物品实例
     @param isAuctionItem: 是否拍品,默认非拍品
     @param expireTime: 有效时间,时间单位由时效类型决定
     @param curPlayer: 产出该物品时的玩家,物品某些属性由玩家等级决定,如传奇属性
-    @param isAllAttr: 是否生成该装备所有属性,GM创建物品时用,需验证相关权限
+    @param setAttrDict: 直接设置物品的属性 {key:value, ...} key支持  ShareDefine.Def_IudetXXX字符串 或 自定key
     '''
-    curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime)
+    curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime, curPlayer, setAttrDict)
     if not curItem:
         GameWorld.ErrLog("产出物品异常,无法创建物品 = %s" % (itemID))
         return
-    
-    # 非装备,无需设置属性
-    if not ItemCommon.CheckItemIsEquip(curItem):
-        return curItem
-    
-    # 定制物品
-    if GetAppointItemRealID(itemID):
-        curItem.Clear()
-        #GameWorld.DebugLog("清除给定制物品之前已经创建的物品ID=%s" % itemID)
-        return GetItemByData(GetAppointItemDictData(itemID, isAuctionItem))
-    
-#    # 拍品不处理其他属性
-#    if isAuctionItem:
-#        return curItem
-    
-    tmpEquipData = SingleEquipTmpData()
-    
-    # 传奇属性
-    legendAttrInfo = GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr)
-    if legendAttrInfo:
-        tmpEquipData.legendAttrIDList = legendAttrInfo[0]
-        tmpEquipData.legendAttrValueList = legendAttrInfo[1]
-        tmpEquipData.legendAttrIDListShen = legendAttrInfo[2]
-        tmpEquipData.legendAttrValueListShen = legendAttrInfo[3]
-        tmpEquipData.legendAttrIDListXian = legendAttrInfo[4]
-        tmpEquipData.legendAttrValueListXian = legendAttrInfo[5]
-        tmpEquipData.legendAttrIDListJi = legendAttrInfo[6]
-        tmpEquipData.legendAttrValueListJi = legendAttrInfo[7]
-        
-    # 其他装备属性
-    ChItem.EquipAddAdditionEx(curItem, tmpEquipData)
     return curItem
 
 def GetAddEquipLegendAttr(curItem, curPlayer, isAllAttr=False):

--
Gitblit v1.8.0