#!/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  
 | 
import ShareDefine  
 | 
import PlayerActivity  
 | 
  
 | 
import time  
 | 
  
 | 
#// 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 not ItemControler.GetIsAuctionItem(curItem):  
 | 
        GameWorld.Log("·ÇÅÄÆ·£¬°ó¶¨ÎÞ·¨ÉϼÜ!", playerID)  
 | 
        return  
 | 
    itemGUID = curItem.GetGUID()  
 | 
    itemID = curItem.GetItemTypeID()  
 | 
    ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)  
 | 
    if not ipyData:  
 | 
        return  
 | 
    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])  
 | 
    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])  
 | 
      
 | 
    PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_AuctionItem, 1)  
 | 
    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 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]])  
 | 
    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, 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 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 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  
 | 
  
 | 
  
 |