#!/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 Operate_EquipStar
|
import ItemCommon
|
import ChConfig
|
import ShareDefine
|
import PlayerActivity
|
import EventShell
|
import NPCCommon
|
|
import random
|
import time
|
import uuid
|
|
#// B5 13 ÅÄÂôÐÐÉϼÜÅÄÆ· #tagCMSellAuctionItem
|
#
|
#struct tagCMSellAuctionItem
|
#{
|
# tagHead Head;
|
# BYTE ItemIndex; //ÎïÆ·ÔÚ±³°üÖÐË÷Òý
|
# WORD SellCount; //ÉϼܸöÊý£¬0´ú±íÈ«²¿ÉϼÜ
|
#};
|
def OnSellAuctionItem(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
itemIndex = clientData.ItemIndex
|
sellCount = clientData.SellCount if hasattr(clientData, "SellCount") else 0 # ºóÃæ¼ÓµÄ£¬½öΪ²âÊÔʱ×öϼæÈÝ
|
GameWorld.DebugLog("Íæ¼ÒÉϼÜÅÄÆ·: itemIndex=%s" % (itemIndex), playerID)
|
playerPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = playerPack.GetAt(itemIndex)
|
if curItem.IsEmpty():
|
return
|
if not ItemControler.GetIsAuctionItem(curItem):
|
GameWorld.Log("·ÇÅÄÆ·£¬°ó¶¨ÎÞ·¨ÉϼÜ!", playerID)
|
return
|
itemGUID = curItem.GetGUID()
|
itemID = curItem.GetItemTypeID()
|
ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
|
if not ipyData:
|
return
|
# 20201223 Ö÷¸ÉÈ¡ÏûÅÄÆ·ÓÐЧʱ³¤É趨
|
# auctionItemCreateTime = curItem.GetUserAttr(ShareDefine.Def_IudetAuctionItemCreateTime)
|
# if not auctionItemCreateTime:
|
# GameWorld.DebugLog("ûÓÐÅÄÆ·´´½¨Ê±¼ä£¬ÎÞ·¨ÉϼÜ!", playerID)
|
# return
|
# curTime = int(time.time())
|
# if curTime - auctionItemCreateTime > IpyGameDataPY.GetFuncCfg("AuctionItem", 1) * 3600:
|
# GameWorld.DebugLog("ÅÄÆ·ÒѹýÆÚ£¬ÎÞ·¨ÉϼÜ!auctionItemCreateTime=%s" % (GameWorld.ChangeTimeNumToStr(auctionItemCreateTime)), playerID)
|
# ItemControler.SetIsAuctionItem(curItem, False, curPlayer)
|
# return
|
|
QueryGameServer_AuctionHouse(playerID, "AddAuctionItemQuery", [itemIndex, itemGUID, itemID, sellCount])
|
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_Paper, 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, sellCount = queryData
|
if not result or not result[0]:
|
return
|
__DoPlayerSellAuctionItem(curPlayer, itemIndex, itemGUID, itemID, sellCount)
|
|
elif queryType == "BidAuctionItemQuery":
|
itemGUID, biddingPrice = queryData
|
if not result or not result[0]:
|
return
|
itemID = result[0]
|
__DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, itemID)
|
|
elif queryType == "EquipStarAutoBuy":
|
Operate_EquipStar.GameServer_EquipStarAutoBuy(curPlayer, result)
|
|
return
|
|
def __DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, itemID):
|
## Íæ¼Ò¾º¼ÛÅÄÆ·
|
|
# µØÍ¼Ö»´¦Àí¿Û³ý¾º¼Û¼Û¸ñ
|
infoDict = {"ItemID":itemID, "ItemGUID":itemGUID, "BiddingPrice":biddingPrice}
|
if not PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, biddingPrice, ChConfig.Def_Cost_AuctionBid, infoDict):
|
return
|
|
DR_AuctionHouse(curPlayer, "PlayerPayBid", infoDict)
|
playerID = curPlayer.GetPlayerID()
|
QueryGameServer_AuctionHouse(playerID, "BidAuctionItem", [itemGUID, biddingPrice])
|
|
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_AuctionItem, 1)
|
return
|
|
def __DoPlayerSellAuctionItem(curPlayer, itemIndex, itemGUID, itemID, sellCount):
|
## Íæ¼ÒÉϼÜÅÄÆ·
|
playerID = curPlayer.GetPlayerID()
|
playerPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
curItem = playerPack.GetAt(itemIndex)
|
if curItem.IsEmpty():
|
return
|
if not ItemControler.GetIsAuctionItem(curItem):
|
GameWorld.Log("·ÇÅÄÆ·£¬ÎÞ·¨ÉϼÜ!", playerID)
|
return
|
curItemGUID = curItem.GetGUID()
|
curItemID = curItem.GetItemTypeID()
|
if itemGUID != curItemGUID or itemID != curItemID:
|
GameWorld.Log("ÇëÇóÉϼܵÄÅÄÆ·Òѱ仯£¬ÎÞ·¨ÉϼÜ!", playerID)
|
return
|
__DoAddAuctionItem(curPlayer, [[curItem, sellCount]])
|
return
|
|
def DoAddFamilyAuctionItem(familyAuctionItemDict):
|
''' ÉϼÜÏÉÃËÅÄÆ·£¬ÒòΪÏÉÃËÅÄÆ·Ä¬ÈÏÉϼܣ¬ËùÒÔʹÓÃÅúÁ¿ÉϼÜ
|
@param familyAuctionItemDict: {ÏÉÃËID:[[ÏíÊÜÊÕÒæµÄ³ÉÔ±ID, ...], [[ÅÄÆ·ID,¸öÊý], [ÅÄÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...]], ...}
|
'''
|
GameWorld.Log("ÉϼÜÏÉÃËÅÄÆ·: %s" % familyAuctionItemDict)
|
isAuctionItem = True
|
auctionItemList = []
|
for familyID, auctionInfo in familyAuctionItemDict.items():
|
familyPlayerIDList, familyAuctionItemList = auctionInfo
|
for itemInfo in familyAuctionItemList:
|
if len(itemInfo) < 2:
|
continue
|
itemID, itemCount = itemInfo[:2]
|
ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
|
if not ipyData:
|
GameWorld.ErrLog("·ÇÅÄÂôÎïÆ·£¬ÎÞ·¨ÉϼÜÏÉÃËÅÄÆ·! familyID=%s,itemID=%s,itemCount=%s" % (familyID, itemID, itemCount))
|
continue
|
curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, isAuctionItem)
|
if not curItem:
|
continue
|
auctionItemList.append([curItem, familyID, familyPlayerIDList])
|
__DoAddAuctionItem(None, auctionItemList)
|
return
|
|
def __DoAddAuctionItem(curPlayer, auctionItemList):
|
''' ÉϼÜÅÄÆ·£¬Ö§³ÖÅúÁ¿ÉϼÜ
|
@param curPlayer: ·Ç¸öÈËÅÄÆ·Ê±ÎªNone
|
@param auctionItemList: [[curItem], [curItem, sellCount], [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:
|
EventShell.EventRespons_AddAuction(curPlayer)
|
if ItemCommon.CheckItemIsEquip(curItem):
|
EventShell.EventRespons_AddAuctionEquip(curPlayer, curItem.GetItemColor())
|
sellCount = itemInfo[1] if len(itemInfo) == 2 else 0
|
if sellCount <= 0:
|
sellCount = curItem.GetCount()
|
else:
|
sellCount = min(sellCount, curItem.GetCount())
|
itemData["ItemCount"] = sellCount
|
if sellCount != curItem.GetCount():
|
itemData["GUIDSrc"] = curItem.GetGUID()
|
itemData["GUID"] = str(uuid.uuid1()).upper() # ²»ÊÇÈ«²¿ÂôµôµÄ£¬Éú³ÉеÄGUID
|
ItemCommon.DelItem(curPlayer, curItem, sellCount, True, ChConfig.ItemDel_AuctionHouse)
|
else:
|
if not ItemControler.GetIsAuctionItem(curItem):
|
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)
|
if curPlayer:
|
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_AuctionItem, 1)
|
return
|
|
def DoAddSystemAuctionItem(sysAuctionItemList):
|
''' ÉϼÜϵͳÅÄÆ·
|
@param sysAuctionItemList: [ÎïÆ·ID, [½×,ÑÕÉ«,[²¿Î», ...],ÊÇ·ñÌ××°,ÐǼ¶,[¿ÉÑ¡²ÎÊýÖ°Òµ, ...]], ...]
|
'''
|
GameWorld.Log("ÉϼÜϵͳÅÄÆ·: %s" % sysAuctionItemList)
|
|
isAuctionItem = True
|
auctionItemList = []
|
for sysAuctionItemInfo in sysAuctionItemList:
|
itemCount = 1 # ϵͳÅÄÆ·£¬Ä¬ÈÏÉϼÜÒ»¸ö
|
if type(sysAuctionItemInfo) == int:
|
itemID = sysAuctionItemInfo
|
elif type(sysAuctionItemInfo) == list and len(sysAuctionItemInfo) == 2:
|
itemID, itemCount = sysAuctionItemInfo
|
elif type(sysAuctionItemInfo) == list and len(sysAuctionItemInfo) >= 5:
|
classLV, color, placeList, isSuit, star = sysAuctionItemInfo[:5]
|
if star:
|
# ÓÐÐǼ¶µÄ´ú±í·Ç¾³½ç×°±¸£¬Ôݲ»´¦Àí£¬Ö®ºóÓÐÐèÒªÀ©Õ¹
|
randEquipIDList = []
|
else:
|
itemJobList = sysAuctionItemInfo[5] if len(sysAuctionItemInfo) > 5 else []
|
randEquipIDList = NPCCommon.__GetEquipIDList(0, classLV, color, isSuit, placeList, itemJobList, findType="SystemAuctionItem")
|
if not randEquipIDList:
|
GameWorld.ErrLog("ϵͳÅÄÆ·ÕÒ²»µ½¿ÉÉϼܵÄ×°±¸! %s" % str(sysAuctionItemInfo))
|
continue
|
itemID = random.choice(randEquipIDList)
|
else:
|
GameWorld.ErrLog("ϵͳÅÄÆ·¸ñʽ´íÎó£¬ÎÞ·¨ÉϼÜ! %s" % str(sysAuctionItemInfo))
|
continue
|
ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
|
if not ipyData:
|
GameWorld.ErrLog("·ÇÅÄÂôÎïÆ·£¬ÎÞ·¨ÉϼÜϵͳÅÄÆ·! itemID=%s" % (itemID))
|
continue
|
curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, isAuctionItem)
|
if not curItem:
|
continue
|
auctionItemList.append([curItem])
|
if not auctionItemList:
|
return
|
__DoAddAuctionItem(None, auctionItemList)
|
return
|
|
#// B5 15 ÅÄÂôÐÐϼÜÅÄÆ· #tagCMUnsellAuctionItem
|
#
|
#struct tagCMUnsellAuctionItem
|
#{
|
# tagHead Head;
|
# char ItemGUID[40];
|
#};
|
def OnUnsellAuctionItem(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
playerID = curPlayer.GetPlayerID()
|
itemGUID = clientData.ItemGUID
|
|
# Ö±½Ó·¢Óʼþ£¬ÕâÀï¾Í²»ÑéÖ¤±³°üÁË
|
# #ÑéÖ¤±³°ü¿Õ¼ä
|
# if not ItemCommon.CheckPackHasSpace(curPlayer, IPY_GameWorld.rptItem):
|
# PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
|
# return
|
|
QueryGameServer_AuctionHouse(playerID, "UnsellAuctionItem", [itemGUID])
|
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
|
|
|