#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package PyMongoDB.GMToolLogicProcess.Commands.GMT_DelPlayerItem
|
#
|
# @todo:GM¹¤¾ßÃüÁî - ¿Û³ýÍæ¼ÒÎïÆ·
|
# @author hxp
|
# @date 2026-02-10
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: GM¹¤¾ßÃüÁî - ¿Û³ýÍæ¼ÒÎïÆ·
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2026-02-10 20:00"""
|
#-------------------------------------------------------------------------------
|
|
import GMCommon
|
import GameWorld
|
import DataRecordPack
|
import ShareDefine
|
import ItemCommon
|
import ChConfig
|
|
## ÊÕµ½gmÃüÁîÖ´ÐÐ
|
# @param gmCmdDict:gmÃüÁî×Öµä
|
# @return None
|
def OnExec(gmCmdDict):
|
|
errorMsg = ""
|
from GMToolLogicProcess import ProjSpecialProcess
|
Result, curPlayer = ProjSpecialProcess.GMCmdPlayerValidation(gmCmdDict, False)
|
if Result != GMCommon.Def_Success:
|
return Result, errorMsg
|
if not curPlayer:
|
return Result, "Íæ¼Ò²»ÔÚÏß"
|
|
# Íæ¼ÒÔÚÏߣ¬Ö±½Ó´¦Àí
|
playerID = curPlayer.GetPlayerID()
|
Result = GMCommon.Def_Unknow
|
GMT_Name = gmCmdDict.get(GMCommon.Def_GMKey_Type, '')
|
|
itemID = GameWorld.ToIntDef(gmCmdDict.get("itemID", 0))
|
delItemCount = GameWorld.ToIntDef(gmCmdDict.get("delItemCount", 0))
|
|
resultDict = {"itemID":itemID, "delItemCount":delItemCount, "accID":curPlayer.GetAccID()}
|
|
# ɾ³ýÎïÆ·
|
_DoGMDelItem(curPlayer, gmCmdDict, itemID, delItemCount, resultDict)
|
|
# ²éѯʣÓàÎïÆ·Ã÷ϸ
|
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
|
resultDict["findItemDict"] = findItemDict
|
|
Result = GMCommon.Def_Success
|
#Á÷Ïò Ôö¼Ó½ð¶î¼Ç¼
|
DataRecordPack.DR_ToolGMOperate(playerID, curPlayer.GetPlayerName(), curPlayer.GetAccID(), GMT_Name, resultDict)
|
return Result, resultDict
|
|
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
|