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