| #!/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 NPCCommon  | 
|   | 
| import random  | 
| 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_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 = 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)  | 
|       | 
|     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):  | 
|     ## Íæ¼ÒÉϼÜÅÄÆ·  | 
|     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 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  | 
|   | 
|   |