#!/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 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]) 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) 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