#!/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:  
 | 
            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  
 | 
  
 | 
  
 |