1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.RemoteQuery.GY_Query_GMTDelPlayerItem
#
# @todo:GM¹¤¾ß¿Û³ýÍæ¼ÒÎïÆ·
# @author hxp
# @date 2021-03-18
# @version 1.0
#
# ÏêϸÃèÊö: GM¹¤¾ß¿Û³ýÍæ¼ÒÎïÆ·
#
#-------------------------------------------------------------------------------
#"""Version = 2021-03-18 19:00"""
#-------------------------------------------------------------------------------
 
import GMCommon
import ItemCommon
import ShareDefine
import GameWorld
import ChConfig
 
## ÇëÇóÂß¼­
#  @param query_Type ÇëÇóÀàÐÍ
#  @param query_ID ÇëÇóµÄÍæ¼ÒID
#  @param packCMDList ·¢°üÃüÁî [ ]
#  @param tick µ±Ç°Ê±¼ä
#  @return resultDisc
#  @remarks º¯ÊýÏêϸ˵Ã÷.
def DoLogic(query_Type, query_ID, packCMDList, tick):
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(query_ID)
    
    if not curPlayer or curPlayer.IsEmpty():
        return ''
    orderId, gmCmdDict = packCMDList
    GameWorld.Log("GY_Query_GMTDelPlayerItem: %s" % gmCmdDict, query_ID)
    itemID = GameWorld.ToIntDef(gmCmdDict.get("itemID", 0))
    delItemCount = GameWorld.ToIntDef(gmCmdDict.get("delItemCount", 0))
    
    Result = GMCommon.Def_Success
    retMsg = {"itemID":itemID, "delItemCount":delItemCount, "accID":curPlayer.GetAccID()}
    
    # É¾³ýÎïÆ·
    _DoGMDelItem(curPlayer, gmCmdDict, itemID, delItemCount, retMsg)
    
    # ²éѯʣÓàÎïÆ·Ã÷ϸ
    findItemDict = {}
    for packIndex in xrange(ShareDefine.rptMax):
        itemPack = curPlayer.GetItemManager().GetPack(packIndex)
        if not itemPack:
            continue
        itemList = []
        for index in xrange(itemPack.GetCount()):
            curItem = itemPack.GetAt(index)
            if not curItem or curItem.IsEmpty():
                continue
            if curItem.GetItemTypeID() != itemID:
                continue
            itemList.append(_GetItemInfo(curItem))
        if itemList:
            findItemDict[str(packIndex)] = itemList
    retMsg["findItemDict"] = findItemDict
    
    resultMsg = str([orderId, retMsg, 'GMT_DelPlayerItem', Result])
    GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'GMToolResult', resultMsg, len(resultMsg))
    return ''
    
def _DoGMDelItem(curPlayer, gmCmdDict, itemID, delItemCount, retMsg):
    
    delRemark = gmCmdDict.get("delRemark", "")
    delGUIDInfo = gmCmdDict.get("delGUIDInfo", "")
    delGUIDInfo = eval(delGUIDInfo) if (delGUIDInfo.startswith("{") and delGUIDInfo.endswith("}")) else {}
    if not delGUIDInfo:
        return
    GameWorld.DebugLog("delGUIDInfo: %s" % delGUIDInfo)
    succDelItemDict = {}
    succDelCount = 0
    for delGUID, delItemInfo in delGUIDInfo.items():
        packIndex, delIndex = delItemInfo
        GameWorld.DebugLog("delGUID=%s,packIndex=%s,delIndex=%s" % (delGUID, packIndex, delIndex))
        itemPack = curPlayer.GetItemManager().GetPack(int(packIndex))
        if not itemPack:
            continue
        if delIndex >= itemPack.GetCount():
            continue
        curItem = itemPack.GetAt(delIndex)
        if not curItem or curItem.IsEmpty():
            continue
        if curItem.GetItemTypeID() != itemID:
            continue
        if curItem.GetGUID() != delGUID:
            continue
        
        remainDelCount = delItemCount - succDelCount # »¹ÐèҪɾ³ýµÄ¸öÊý
        if remainDelCount <= 0:
            break
        curCount = curItem.GetCount()
        delCnt = min(remainDelCount, curCount)
        itemInfo = _GetItemInfo(curItem)
        GameWorld.DebugLog("        delCnt=%s" % delCnt)
        
        infoDict = {ChConfig.Def_Cost_Reason_SonKey:delRemark}
        ItemCommon.DelItem(curPlayer, curItem, delCnt, False, "GM", infoDict, isForceDR=True)
        
        itemInfo["Count"] = "-%s" % delCnt
        succDelCount += delCnt
        
        if str(packIndex) not in succDelItemDict:
            succDelItemDict[str(packIndex)] = []
        itemList = succDelItemDict[str(packIndex)]
        itemList.append(itemInfo)
        
    retMsg["succDelItemDict"] = succDelItemDict
    retMsg["succDelCount"] = succDelCount
    return
 
def _GetItemInfo(curItem):
    curItemInfo = {"ItemGUID":curItem.GetGUID(),
                   "ItemTypeID":curItem.GetItemTypeID(),
                   "ItemName":curItem.GetName().decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding()),
                   "Count":curItem.GetCount(),
                   "UserData":curItem.GetUserData(),
                   "IsBind":curItem.GetIsBind(),
                   "IsSuite":1 if curItem.GetSuiteID() else 0,
                   "RemainHour":curItem.GetRemainHour(),
                   "GearScore":curItem.GetGearScore(),
                   "CreateTime":curItem.GetCreateTime(),
                   "ItemPlaceIndex":curItem.GetItemPlaceIndex()
                   }
    return curItemInfo