From ae1453ccda3cf3facbf667283093dc02102ee002 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 21 一月 2026 14:53:47 +0800
Subject: [PATCH] 423 【内政】命格系统-服务端(命格卦玉额外属性条数由调整为由该卦玉最终的物品等级决定;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py |  211 ++++++++++++++--------------------------------------
 1 files changed, 56 insertions(+), 155 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 29bd5fd..824ef4f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -25,17 +25,13 @@
 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 math
@@ -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,45 +855,6 @@
             return True
         if itemID not in ChConfig.Def_TransformItemIDList:
             return False
-        if itemID == ChConfig.Def_ItemID_FamilyContribution:
-            PlayerFamily.AddPlayerFamilyActiveValue(curPlayer, itemCount, True, ShareDefine.Def_AddFAVReason_UseItem, True)
-        elif itemID == ChConfig.Def_ItemID_SilverMoney:
-            PlayerControl.GiveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, itemCount)
-        elif itemID == ChConfig.Def_ItemID_FamilyActive:
-            PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_FamilyActivity, 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, {}]):
@@ -927,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
     
     ## 放入物品 
@@ -967,18 +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)
@@ -1033,7 +978,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
         
@@ -1725,74 +1670,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):
@@ -2027,11 +1907,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)
@@ -2146,11 +2026,32 @@
 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 物品实例
@@ -2193,12 +2094,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):
@@ -2328,7 +2225,11 @@
 def CheckPackSpaceEnough(curPlayer, itemList, isNotify=True):
     ## 检查玩家对应背包是否足够放入物品
     needPackSpaceDict = {}
-    for itemID, itemCnt, isAuctionItem in itemList:
+    for itemInfo in itemList:
+        if not itemInfo:
+            continue
+        itemID, itemCnt = itemInfo[:2]
+        isAuctionItem = itemInfo[2] if len(itemInfo) > 2 else 0
         curItem = GameWorld.GetGameData().GetItemByTypeID(itemID)
         if not curItem:
             return False

--
Gitblit v1.8.0