#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package Player.PlayerAuctionHouse
|
#
|
# @todo:Íæ¼ÒÅÄÂôÐд¦Àí
|
# @author hxp
|
# @date 2019-03-04
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: Íæ¼ÒÅÄÂôÐд¦Àí
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2019-03-04 17:00"""
|
#-------------------------------------------------------------------------------
|
import GameWorld
|
import IPY_GameWorld
|
import IpyGameDataPY
|
import DataRecordPack
|
import PlayerControl
|
import ItemControler
|
import ItemCommon
|
import ChConfig
|
|
#// B5 13 ÅÄÂôÐÐÉϼÜÅÄÆ· #tagCMSellAuctionItem
|
#
|
#struct tagCMSellAuctionItem
|
#{
|
# tagHead Head;
|
# BYTE ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
#};
|
def OnSellAuctionItem(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
itemIndex = clientData.ItemIndex
|
GameWorld.DebugLog("Íæ¼ÒÉϼÜÅÄÆ·: itemIndex=%s" % (itemIndex), playerID)
|
playerPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = playerPack.GetAt(itemIndex)
|
if curItem.IsEmpty():
|
return
|
if curItem.GetIsBind():
|
GameWorld.Log("·ÇÅÄÆ·£¬°ó¶¨ÎÞ·¨ÉϼÜ!", playerID)
|
return
|
itemGUID = curItem.GetGUID()
|
itemID = curItem.GetItemTypeID()
|
ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
|
if not ipyData:
|
return
|
|
QueryGameServer_AuctionHouse(playerID, "AddAuctionItemQuery", [itemIndex, itemGUID, itemID])
|
return
|
|
#// B5 14 ÅÄÂôÐоº¼ÛÎïÆ· #tagCMBiddingAuctionItem
|
#
|
#struct tagCMBiddingAuctionItem
|
#{
|
# tagHead Head;
|
# char ItemGUID[40];
|
# WORD BiddingPrice; //¾º¼Û¼Û¸ñ
|
#};
|
def OnBiddingAuctionItem(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
itemGUID = clientData.ItemGUID
|
biddingPrice = clientData.BiddingPrice
|
if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, biddingPrice):
|
return
|
QueryGameServer_AuctionHouse(playerID, "BidAuctionItemQuery", [itemGUID, biddingPrice])
|
return
|
|
def QueryGameServer_AuctionHouse(playerID, queryType, queryData):
|
msgInfo = str([queryType, queryData])
|
GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "AuctionHouse", msgInfo, len(msgInfo))
|
GameWorld.DebugLog("ÅÄÂôÐз¢ËÍGameServer: playerID=%s,queryType=%s,queryData=%s" % (playerID, queryType, queryData))
|
return
|
|
def QueryResult_AuctionHouse(curPlayer, resultList):
|
## ÅÄÂôÐÐGameServer·µ»Ø´¦Àí
|
if len(resultList) != 3:
|
return
|
queryType, queryData, result = resultList
|
if queryType == "AddAuctionItemQuery":
|
itemIndex, itemGUID, itemID = queryData
|
if not result or not result[0]:
|
return
|
__DoPlayerSellAuctionItem(curPlayer, itemIndex, itemGUID, itemID)
|
|
elif queryType == "BidAuctionItemQuery":
|
itemGUID, biddingPrice = queryData
|
if not result or not result[0]:
|
return
|
itemID = result[0]
|
__DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, itemID)
|
|
return
|
|
def __DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, itemID):
|
## Íæ¼Ò¾º¼ÛÅÄÆ·
|
|
# µØÍ¼Ö»´¦Àí¿Û³ý¾º¼Û¼Û¸ñ
|
infoDict = {"ItemID":itemID, "ItemGUID":itemGUID, "BiddingPrice":biddingPrice}
|
if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Money, biddingPrice, ChConfig.Def_Cost_AuctionBid, infoDict):
|
return
|
|
DR_AuctionHouse(curPlayer, "PlayerPayBid", infoDict)
|
playerID = curPlayer.GetPlayerID()
|
QueryGameServer_AuctionHouse(playerID, "BidAuctionItem", [itemGUID, biddingPrice])
|
return
|
|
def __DoPlayerSellAuctionItem(curPlayer, itemIndex, itemGUID, itemID):
|
## Íæ¼ÒÉϼÜÅÄÆ·
|
playerID = curPlayer.GetPlayerID()
|
playerPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = playerPack.GetAt(itemIndex)
|
if curItem.IsEmpty():
|
return
|
if curItem.GetIsBind():
|
GameWorld.Log("·ÇÅÄÆ·£¬ÎÞ·¨ÉϼÜ!", playerID)
|
return
|
curItemGUID = curItem.GetGUID()
|
curItemID = curItem.GetItemTypeID()
|
if itemGUID != curItemGUID or itemID != curItemID:
|
GameWorld.Log("ÇëÇóÉϼܵÄÅÄÆ·Òѱ仯£¬ÎÞ·¨ÉϼÜ!", playerID)
|
return
|
__DoAddAuctionItem(curPlayer, [[curItem]])
|
return
|
|
def DoAddFamilyAuctionItem(familyAuctionItemDict):
|
''' ÉϼÜÏÉÃËÅÄÆ·£¬ÒòΪÏÉÃËÅÄÆ·Ä¬ÈÏÉϼܣ¬ËùÒÔʹÓÃÅúÁ¿ÉϼÜ
|
@param familyAuctionItemDict: {ÏÉÃËID:[[ÏíÊÜÊÕÒæµÄ³ÉÔ±ID, ...], [[ÅÄÆ·ID,×ܸöÊý,ÅÄÆ·×éÊý], ...]], ...}
|
'''
|
isBind = False
|
auctionItemList = []
|
for familyID, auctionInfo in familyAuctionItemDict.items():
|
familyPlayerIDList, familyAuctionItemList = auctionInfo
|
for itemID, itemCount, auctionGroup in familyAuctionItemList:
|
ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
|
if not ipyData:
|
GameWorld.ErrLog("·ÇÅÄÂôÎïÆ·£¬ÎÞ·¨ÉϼÜÏÉÃËÅÄÆ·! familyID=%s,itemID=%s,itemCount=%s" % (familyID, itemID, itemCount))
|
continue
|
groupItemCount = itemCount / auctionGroup
|
for i in xrange(auctionGroup):
|
if i == auctionGroup - 1:
|
groupItemCount += itemCount % auctionGroup
|
curItem = ItemControler.GetOutPutItemObj(itemID, groupItemCount, isBind)
|
if not curItem:
|
continue
|
auctionItemList.append([curItem, familyID, familyPlayerIDList])
|
__DoAddAuctionItem(None, auctionItemList)
|
return
|
|
def __DoAddAuctionItem(curPlayer, auctionItemList):
|
''' ÉϼÜÅÄÆ·£¬Ö§³ÖÅúÁ¿ÉϼÜ
|
@param curPlayer: ·Ç¸öÈËÅÄÆ·Ê±ÎªNone
|
@param auctionItemList: [[curItem], [curItem, familyID, familyPlayerIDList], ...]
|
'''
|
playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
|
addAuctionItemList = []
|
for itemInfo in auctionItemList:
|
curItem = itemInfo[0]
|
familyID, familyPlayerIDList = 0, []
|
if not curPlayer and len(itemInfo) == 3:
|
familyID, familyPlayerIDList = itemInfo[1:]
|
|
itemID = curItem.GetItemTypeID()
|
itemData = {"GUID":curItem.GetGUID(), "ItemID":itemID, "ItemCount":curItem.GetCount(),
|
"ItemType":curItem.GetType(), "ItemJobLimit":curItem.GetJobLimit(), "ItemClassLV":ItemCommon.GetItemClassLV(curItem),
|
"UserData":curItem.GetUserData()}
|
|
#¿ÛÎïÆ·
|
if curPlayer and not familyID:
|
ItemCommon.DelItem(curPlayer, curItem, curItem.GetCount())
|
else:
|
if curItem.GetIsBind():
|
GameWorld.Log("·ÇÅÄÆ·£¬°ó¶¨ÎÞ·¨ÉϼÜ!", playerID)
|
curItem.Clear()
|
continue
|
curItem.Clear()
|
|
drDict = {"FamilyID":familyID, "FamilyPlayerIDList":familyPlayerIDList, "ItemData":itemData}
|
DR_AuctionHouse(curPlayer, "MapClearItem", drDict)
|
|
addAuctionItemList.append([playerID, familyID, familyPlayerIDList, itemData])
|
GameWorld.DebugLog("ÉϼÜÅÄÆ·: playerID=%s,familyID=%s,%s" % (playerID, familyID, drDict), playerID)
|
|
QueryGameServer_AuctionHouse(playerID, "AddAuctionItem", addAuctionItemList)
|
return
|
|
def DR_AuctionHouse(curPlayer, eventName, drDict):
|
accID = "" if not curPlayer else curPlayer.GetAccID()
|
playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
|
dataDict = {"EventName":eventName,"PlayerID":playerID, "AccID":accID}
|
dataDict.update(drDict)
|
DataRecordPack.SendEventPack("AuctionHouse", dataDict, curPlayer)
|
return
|
|
|