#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package AuctionHouse # # @todo:ÅÄÂôÐÐ # @author hxp # @date 2019-03-04 # @version 1.0 # # ÏêϸÃèÊö: ÅÄÂôÐÐ # #------------------------------------------------------------------------------- #"""Version = 2019-03-04 17:00""" #------------------------------------------------------------------------------- import GameWorld import PyDataManager import PlayerControl import DataRecordPack import PyGameDataStruct import PlayerCompensation import IPY_PlayerDefine import ChPyNetSendPack import PlayerDBGSEvent import IpyGameDataPY import NetPackCommon import PlayerBourse import PlayerFamily import ShareDefine import PyGameData import ChConfig import random import datetime import operator import time import math import json # ÅÄÂô¼Ç¼ÀàÐͶ¨Òå AuctionRecordTypeList = ( AuctionRecordType_MyAuction, # ÎÒµÄÅÄÆ· AuctionRecordType_FamilyAuction, # ÏÉÃËÅÄÆ· AuctionRecordType_MyBid, # ÎҵľºÅÄ ) = range(3) # ÅÄÂô¼Ç¼½á¹û¶¨Òå AuctionRecordResultList = ( AuctionRecordResult_SellFail, # Á÷ÅÄ AuctionRecordResult_SellOK, # ÅÄÂô³É½» AuctionRecordResult_Recycle, # ϵͳ»ØÊÕ AuctionRecordResult_BidOK, # ¾º¼Û³É¹¦ AuctionRecordResult_BidFail, # ¾º¼Ûʧ°Ü AuctionRecordResult_MoveToWorld, # ÏÉÃËÅÄÆ·×ªÒƵ½È«·þÅÄÆ· AuctionRecordResult_Unsell, # ÏÂ¼Ü ) = range(7) # µ±Ç°ÅÄÆ·¹éÀà 0-È«·þÅÄÆ· 1-ÏÉÃË˽ÓÐÅÄÆ· AuctionType_World = 0 AuctionType_Family = 1 ''' ¾º¼ÛÁ÷³Ì: 1. MapServer ÏÈÑéÖ¤¼Û¸ñÊÇ·ñ¹» 2. GameServer ÑéÖ¤ÊÇ·ñ¿ÉÒÔ¾º¼Û 3. MapServer ¿Û³ýÍæ¼Ò»õ±Ò 4. GameServer ½øÐоº¼Û£¬±ä¸üÏ´ξº¼Û¼Û¸ñ »ùÓÚÒÔÉÏÁ÷³Ì£¬ËùÒÔÍæ¼Ò¾º¼ÛʱÐèÏÈËø¶¨ÎïÆ·£¬·ÀÖ¹¾º¼ÛÁ÷³ÌδÍê½áʱÆäËûÍæ¼ÒÇëÇ󾺼ÛͬһÅÄÆ·ÅжϾº¼Û¼Û¸ñ´íÎó Ëø¶¨Ê±³¤Í¬ÑùÊÊÓÃÓÚÅÄÆ·¾º¼Ûʱ¼ä½áÊøÊ±µÄ±£»¤Ê±¼ä ''' BiddingQueryLockTick = 10000 #ÅÄÂôÐÐ״̬¿ª¹Ø def GetAuctionHouseState(): return PlayerBourse.GetOpenState() def OnPlayerLogin(curPlayer): Sync_PlayerAuctionItemInfo(curPlayer) Sync_FamilyAuctionItemInfo(curPlayer, curPlayer.GetFamilyID()) Sync_PlayerBiddingItemInfo(curPlayer) Sync_PlayerAttentionAuctionItemID(curPlayer, False) return def OnPlayerLeaveServer(curPlayer): playerID = curPlayer.GetPlayerID() auctionItemMgr = PyDataManager.GetAuctionItemManager() auctionItemMgr.myAttentionItemDict.pop(playerID, None) return ##--------------------------------------- ÅÄÂô¼Ç¼ ------------------------------------------------- def GetMyAuctionItemRecord(playerID): ## »ñÈ¡ÎÒµÄÅÄÆ·¼Ç¼ return PyDataManager.GetAuctionRecordManager().myAuctionItemRecordDict.get(playerID, []) def GetMyBiddingItemRecord(playerID): ## »ñÈ¡ÎҵľºÅļǼ return PyDataManager.GetAuctionRecordManager().myBidItemRecordDict.get(playerID, []) def GetFamilyAuctionItemRecord(familyID): ## »ñÈ¡ÏÉÃËÅÄÆ·¼Ç¼ return PyDataManager.GetAuctionRecordManager().familyAuctionItemRecordDict.get(familyID, []) def AddAuctionRecord(auctionItem, recordResult): ''' Ìí¼ÓÅÄÂôÐмǼ @param auctionItem: Ïà¹ØµÄÅÄÆ·ÊµÀý @param recordResult: ¼Ç¼½á¹û 0-Á÷ÅÄ 1-ÅÄÂô³É½» 2-»ØÊÕ 3-¾º¼Û³É¹¦ 4-¾º¼Ûʧ°Ü ''' if not auctionItem: return playerID, familyID, bidderID = auctionItem.PlayerID, auctionItem.FamilyID, auctionItem.BidderID recordPlayerID, recordFamilyID = 0, 0 if recordResult in [AuctionRecordResult_BidOK, AuctionRecordResult_BidFail]: recordType = AuctionRecordType_MyBid recordPlayerID = bidderID else: if familyID: recordType = AuctionRecordType_FamilyAuction recordFamilyID = familyID else: recordType = AuctionRecordType_MyAuction recordPlayerID = playerID if not recordPlayerID and not recordFamilyID: return newRecordData = PyGameDataStruct.tagDBAuctionRecord() newRecordData.ItemGUID = auctionItem.ItemGUID newRecordData.PlayerID = recordPlayerID newRecordData.FamilyID = recordFamilyID newRecordData.RecordType = recordType newRecordData.RecordResult = recordResult newRecordData.RecordTime = GameWorld.GetCurrentDataTimeStr() newRecordData.BidderPrice = auctionItem.BidderPrice newRecordData.BidderName = auctionItem.BidderName newRecordData.ItemID = auctionItem.ItemID newRecordData.Count = auctionItem.Count newRecordData.UserData = auctionItem.UserData newRecordData.UserDataLen = auctionItem.UserDataLen AddNewAuctionRecord(newRecordData) if recordFamilyID: Sync_PlayerAuctionRecordInfo(None, recordType, newRecordData, recordFamilyID) elif recordPlayerID: recordPlayer = GameWorld.GetPlayerManager().FindPlayerByID(recordPlayerID) if recordPlayer and not PlayerControl.GetIsTJG(recordPlayer): Sync_PlayerAuctionRecordInfo(recordPlayer, recordType, newRecordData) return def AddNewAuctionRecord(newRecordData): playerID = newRecordData.PlayerID familyID = newRecordData.FamilyID recordType = newRecordData.RecordType if recordType == AuctionRecordType_MyAuction: keyID = playerID recordDict = PyDataManager.GetAuctionRecordManager().myAuctionItemRecordDict elif recordType == AuctionRecordType_FamilyAuction: keyID = familyID recordDict = PyDataManager.GetAuctionRecordManager().familyAuctionItemRecordDict elif recordType == AuctionRecordType_MyBid: keyID = playerID recordDict = PyDataManager.GetAuctionRecordManager().myBidItemRecordDict else: return recordList = recordDict.get(keyID, []) maxCount = min(50, IpyGameDataPY.GetFuncCfg("AuctionHouse", 3)) if len(recordList) >= maxCount: del recordList[0] recordList.append(newRecordData) recordDict[keyID] = recordList return ##-------------------------------------- ÅÄÂô¹Ø×¢ ------------------------------------------------ def GetPlayerAuctionAttention(attentionMgr, playerID): ## »ñÈ¡Íæ¼Ò¹Ø×¢µÄÎïÆ·IDÁбí if playerID not in attentionMgr.playerAttentionDict: return [] attentionObj = attentionMgr.playerAttentionDict[playerID] attentionItemIDList = attentionObj.AttentionItemIDList return attentionItemIDList def AddPlayerAuctionAttention(attentionMgr, playerID, itemID): ## Ìí¼ÓÍæ¼Ò¹Ø×¢µÄÎïÆ·ID if playerID not in attentionMgr.playerAttentionDict: dbData = PyGameDataStruct.tagDBAuctionAttention() dbData.PlayerID = playerID __InitAuctionAttentionAttrEx(dbData) attentionMgr.playerAttentionDict[playerID] = dbData attentionObj = attentionMgr.playerAttentionDict[playerID] attentionItemIDList = attentionObj.AttentionItemIDList if len(attentionItemIDList) >= IpyGameDataPY.GetFuncCfg("AuctionHouse", 5): GameWorld.DebugLog("¹Ø×¢ÅÄÆ·Êý´ïµ½ÉÏÏÞ!", playerID) return if itemID in attentionItemIDList: return True attentionItemIDList.append(itemID) attentionObj.AttentionInfo = str(attentionItemIDList) attentionObj.AttentionLen = len(attentionObj.AttentionInfo) return True def DelPlayerAuctionAttention(attentionMgr, playerID, itemID): ## ɾ³ýÍæ¼Ò¹Ø×¢µÄÎïÆ·ID if playerID not in attentionMgr.playerAttentionDict: return attentionObj = attentionMgr.playerAttentionDict[playerID] attentionItemIDList = attentionObj.AttentionItemIDList if itemID not in attentionItemIDList: return attentionItemIDList.remove(itemID) attentionObj.AttentionInfo = str(attentionItemIDList) attentionObj.AttentionLen = len(attentionObj.AttentionInfo) return True def OnLoadAuctionAttentionDataEx(attentionData): ## ¼ÓÔØÅÄÂô¹Ø×¢±íʱ¸½¼Ó´¦Àí __InitAuctionAttentionAttrEx(attentionData) return def __InitAuctionAttentionAttrEx(attentionData): ## ³õʼ»¯ÅÄÂô¹Ø×¢ÊµÀý¸½¼ÓÊôÐÔ setattr(attentionData, "AttentionItemIDList", []) if attentionData.AttentionInfo.startswith("[") and attentionData.AttentionInfo.endswith("]"): attentionData.AttentionItemIDList = json.loads(attentionData.AttentionInfo) return ##------------------------------------------------------------------------------------------------- def OnGameServerInitOK(): ## ·þÎñÆ÷Æô¶¯³É¹¦ allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList # ÓÉÓÚ·þÎñÆ÷δÆô¶¯³É¹¦Ê±È¡²»µ½ÕýÈ·µÄ¿ª·þÌ죬ËùÒÔÆô¶¯³É¹¦ºóË¢ÐÂÒ»ÏÂÅÄÆ·ÏµÍ³»Ø¹ºÊ±¼ä for auctionItem in allAuctionItemByEndTimeList: __SetAuctionItemSysBuyTime(auctionItem) __SortAuctionitem() return def OnLoadAuctionItemDataEx(dbData): ## ¼ÓÔØÅÄÂôÎïÆ·±íʱ¸½¼Ó´¦Àí __InitAuctionItemAttrEx(dbData) playerID = dbData.PlayerID familyID = dbData.FamilyID bidderID = dbData.BidderID pyAuctionItemMgr = PyDataManager.GetAuctionItemManager() pyAuctionItemMgr.allAuctionItemByEndTimeList.append(dbData) if dbData.AuctionType == AuctionType_World: pyAuctionItemMgr.worldAuctionItemList.append(dbData) __OnCalcWorldAuctionItemCount(dbData, 1) if familyID: familyItemList = pyAuctionItemMgr.familyAuctionItemDict.get(familyID, []) familyItemList.append(dbData) pyAuctionItemMgr.familyAuctionItemDict[familyID] = familyItemList if playerID: myItemList = pyAuctionItemMgr.myAuctionItemDict.get(playerID, []) myItemList.append(dbData) pyAuctionItemMgr.myAuctionItemDict[playerID] = myItemList if str(playerID) in dbData.BidderIDInfo: if playerID == bidderID: nowBidItemList = pyAuctionItemMgr.nowBiddingAuctionItemDict.get(playerID, []) nowBidItemList.append(dbData) pyAuctionItemMgr.nowBiddingAuctionItemDict[playerID] = nowBidItemList else: hisBidItemList = pyAuctionItemMgr.hisBiddingAuctionItemDict.get(playerID, []) hisBidItemList.append(dbData) pyAuctionItemMgr.hisBiddingAuctionItemDict[playerID] = hisBidItemList return def OnLoadAuctionItemDataOK(): ## ¼ÓÔØÅÄÂôÎïÆ·±íÍê³ÉºóµÄ´¦Àí __SortAuctionitem() return def __InitAuctionItemAttrEx(auctionItem, ipyData=None): ## ³õʼ»¯ÅÄÆ·ÊµÀý¸½¼ÓÊôÐÔ if not ipyData: ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", auctionItem.ItemID) setattr(auctionItem, "Sortpriority", 99999 - (0 if not ipyData else ipyData.GetSortpriority())) # ÅÅÐòÓÅÏȼ¶¹é×é setattr(auctionItem, "BiddingQueryID", 0) # µ±Ç°ÕýÔÚ¾º¼ÛµÄÍæ¼ÒID setattr(auctionItem, "BiddingQueryTick", 0) # µ±Ç°ÕýÔÚ¾º¼ÛµÄtick setattr(auctionItem, "EndTime", 0) # ½áÊø¾º¼ÛtimeÖµ setattr(auctionItem, "SysBuyTime", 0) # ϵͳһ¿Ú¼Ûʱ¼ä __SetAuctionItemSysBuyTime(auctionItem) __SetAuctionItemEndTime(auctionItem, ipyData) return True def __SetAuctionItemSysBuyTime(auctionItem): ## ¸üÐÂϵͳһ¿Ú¼Û¸ÃÅÄÆ·Ê±¼ä if not GameWorld.GetGameWorld().GetDictByKey(ChConfig.Def_WorldKey_GameWorldInitOK): #GameWorld.DebugLog("·þÎñÆ÷δÆô¶¯ºÃ£¬È¡²»µ½ÕýÈ·µÄ¿ª·þÌ죬²»´¦ÀíÅÄÆ·ÏµÍ³»Ø¹ºÊ±¼ä!") return #itemGUID = auctionItem.ItemGUID itemID = auctionItem.ItemID itemType = auctionItem.ItemType playerID = auctionItem.PlayerID familyID = auctionItem.FamilyID if not playerID and not familyID: #GameWorld.DebugLog("¸ÃÅÄÆ·ÎªÏµÍ³ÉϼܵÄÅÄÆ·£¬²»ÉèÖÃϵͳһ¿Ú¼Ûʱ¼ä! GUID=%s,itemID=%s" % (itemGUID, itemID)) return if familyID: #GameWorld.DebugLog("¸ÃÅÄÆ·ÎªÏÉÃËÅÄÆ·£¬²»ÉèÖÃϵͳһ¿Ú¼Ûʱ¼ä! GUID=%s,itemID=%s,familyID=%s" % (itemGUID, itemID, familyID)) return # ×¢Ò⣺ ÒòΪGameServerû´«ÊÇ·ñÌ××°£¬ËùÒÔÔÝʱ°´²ß»®µÄID¹æÔòÀ´´¦Àí£¬×îºóһλ´ú±íÊÇ·ñÌ××° if itemID % 10 != 0: #GameWorld.DebugLog("¸ÃÅÄÆ·ÎªÌ××°ÅÄÆ·£¬²»ÉèÖÃϵͳһ¿Ú¼Ûʱ¼ä! itemID=%s" % (itemID)) return if auctionItem.BidderID: #GameWorld.DebugLog("¸ÃÅÄÆ·ÒѾ­ÓÐÈ˾º¼Û£¬²»ÉèÖÃϵͳһ¿Ú¼Ûʱ¼ä! itemID=%s,bidderID=%s" % (itemID, auctionItem.BidderID)) return classLV = auctionItem.ItemClassLV classSysBuyRateDict = IpyGameDataPY.GetFuncEvalCfg("AuctionItemSystem", 5) if classLV in classSysBuyRateDict: sysBuyRate = classSysBuyRateDict[classLV] if not GameWorld.CanHappen(sysBuyRate, 100): #GameWorld.DebugLog("¸ÃÅÄÆ·½×¸ÅÂʲ»»ØÊÕ£¬²»ÉèÖÃϵͳһ¿Ú¼Ûʱ¼ä! itemID=%s,classLV=%s,sysBuyRate=%s" % (itemID, classLV, sysBuyRate)) return canSysBuyItemTypeList = IpyGameDataPY.GetFuncEvalCfg("AuctionItemSystem", 2) if itemType not in canSysBuyItemTypeList: #GameWorld.DebugLog("¸ÃÅÄÆ·ÀàÐͲ»¿É±»ÏµÍ³Ò»¿Ú¼Û£¬²»ÉèÖÃϵͳһ¿Ú¼Ûʱ¼ä! itemID=%s,itemType=%s" % (itemID, itemType)) return sysBuyTimeRange = {} openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 oscDaySysBuyTimeRangeDict = IpyGameDataPY.GetFuncEvalCfg("AuctionItemSystem", 1, {}) openServerDayList = oscDaySysBuyTimeRangeDict.keys() openServerDayList.sort() for oscDay in openServerDayList: if openServerDay <= oscDay: sysBuyTimeRange = oscDaySysBuyTimeRangeDict[oscDay] break if len(sysBuyTimeRange) != 2: #GameWorld.DebugLog("¸Ã¿ª·þÌìûÓÐÅäÖÃϵͳÖмäÉ̻عºÖ§³Ö! openServerDay=%s, %s" % (openServerDay, oscDaySysBuyTimeRangeDict)) return randMinutes = random.randint(sysBuyTimeRange[0], sysBuyTimeRange[1]) addTimeStr = auctionItem.AddTime addTime = GameWorld.ChangeTimeStrToNum(addTimeStr) auctionItem.SysBuyTime = addTime + randMinutes * 60 pyAuctionItemMgr = PyDataManager.GetAuctionItemManager() pyAuctionItemMgr.sysBuyoutItemByTimeList.append(auctionItem) #GameWorld.DebugLog("¸üÐÂÅÄÆ·ÏµÍ³Ò»¿Ú¼Ûʱ¼ä: GUID=%s,itemID=%s,addTime=%s(%s),openServerDay=%s,randMinutes=%s(%s),sysBuyTime=%s" # % (itemGUID, itemID, addTime, addTimeStr, openServerDay, randMinutes, sysBuyTimeRange, auctionItem.SysBuyTime)) return def __SetAuctionItemEndTime(auctionItem, ipyData): ## ¸üÐÂÅÄÆ·½áÊø¾º¼ÛtimeÖµ if not ipyData: return addTimeStr = auctionItem.AddTime auctionType = auctionItem.AuctionType addTime = GameWorld.ChangeTimeStrToNum(addTimeStr) noticeMinutes = ipyData.GetNoticeSaleMinutes() saleMinutes = ipyData.GetFamilySaleMinutes() if auctionType == AuctionType_Family else ipyData.GetWorldSaleMinutes() auctionItem.EndTime = addTime + (noticeMinutes + saleMinutes) * 60 __AddAuctionItemEndTimeByBid(auctionItem) return def __AddAuctionItemEndTimeByBid(auctionItem): # ¸ù¾Ý×îºóÒ»´Î¾º¼Ûʱ¼ä½øÐмÓʱ if not auctionItem.BidderPrice: return bidTime = GameWorld.ChangeTimeStrToNum(auctionItem.BiddingTime) endTime = bidTime + IpyGameDataPY.GetFuncCfg("AuctionHouse", 4) if endTime <= auctionItem.EndTime: return GameWorld.DebugLog("ÅÄÆ·¼Óʱ: EndTime=%s,updEndTime=%s" % (auctionItem.EndTime, endTime)) auctionItem.EndTime = endTime return True def __GetAuctionItemDRDict(auctionItem): drDict = {"GUID":auctionItem.ItemGUID, "PlayerID":auctionItem.PlayerID, "FamilyID":auctionItem.FamilyID, "ItemID":auctionItem.ItemID, "Count":auctionItem.Count, "AuctionType":auctionItem.AuctionType, "AddTime":auctionItem.AddTime, "BiddingTime":auctionItem.BiddingTime, "BidderID":auctionItem.BidderID, "BidderPrice":auctionItem.BidderPrice, "UserData":auctionItem.UserData, "EndTime":"" if not auctionItem.EndTime else GameWorld.ChangeTimeNumToStr(auctionItem.EndTime), "FamilyPlayerIDInfo":auctionItem.FamilyPlayerIDInfo, "BidderIDInfo":auctionItem.BidderIDInfo} return drDict def GetAuctionItem(itemGUID): ## »ñÈ¡ÅÄÆ·ÊµÀý return PyDataManager.GetAuctionItemManager().allAuctionItemDict.get(itemGUID) def GetPlayerAuctionItemList(playerID): ## Íæ¼ÒÅÄÂôÖеÄÅÄÆ·Áбí return PyDataManager.GetAuctionItemManager().myAuctionItemDict.get(playerID, []) def GetFamilyAuctionItemList(familyID): ## ÏÉÃËÅÄÂôÖеÄÅÄÆ·Áбí return PyDataManager.GetAuctionItemManager().familyAuctionItemDict.get(familyID, []) def IsFamilyMemberBiddingAuctionItem(familyID, memberID): ## ÏÉÃ˳ÉÔ±ÊÇ·ñ×î¸ß¾º¼ÛÅÄÆ·ÖÐ familyAuctionItemList = GetFamilyAuctionItemList(familyID) for auctionItem in familyAuctionItemList: if auctionItem.BidderID == memberID: return True return False def __OnCalcWorldAuctionItemCount(auctionItem, changeCount): ## ÊÀ½çÅÄÆ·ÊýÁ¿±ä¸üͳ¼Æ´¦Àí if auctionItem.AuctionType != AuctionType_World: return auctionItemMgr = PyDataManager.GetAuctionItemManager() itemID = auctionItem.ItemID #GameWorld.DebugLog("ÊÀ½çÅÄÆ·ÊýÁ¿±ä¸üͳ¼Æ: itemID=%s,changeCount=%s" % (itemID, changeCount)) itemIDStr = str(itemID) classLV = auctionItem.ItemClassLV jobLimit = auctionItem.ItemJobLimit # ͳ¼ÆÓÐÖ°ÒµÏÞÖÆµÄ¾³½ç×°±¸ if jobLimit and classLV and len(itemIDStr) == 7: color = int(itemIDStr[3:4]) isSuit = int(itemIDStr[-1]) jobEquipKey = (jobLimit, classLV, color, isSuit) # Ö°Òµ,½×,ÑÕÉ«,ÊÇ·ñÌ××° befCount = auctionItemMgr.worldAuctionJobEquipCountDict.get(jobEquipKey, 0) updCount = max(befCount + changeCount, 0) auctionItemMgr.worldAuctionJobEquipCountDict[jobEquipKey] = updCount #GameWorld.DebugLog(" Ö°Òµ¾³½ç×°±¸ÊýÁ¿±ä¸ü: jobLimit=%s,classLV=%s,color=%s,isSuit=%s,befCount=%s,updCount=%s" # % (jobLimit, classLV, color, isSuit, befCount, updCount)) # ÆäËûµÄÖ±½ÓÓÃitemIDͳ¼Æ else: befCount = auctionItemMgr.worldAuctionItemCountDict.get(itemID, 0) updCount = max(befCount + changeCount, 0) auctionItemMgr.worldAuctionItemCountDict[itemID] = updCount #GameWorld.DebugLog(" ÎïÆ·IDÊýÁ¿±ä¸ü: itemID=%s,befCount=%s,updCount=%s" % (itemID, befCount, updCount)) return def __GetAuctionSystemItemInfo(): key = "AuctionSystemItem" openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 AuctionSystemItem = IpyGameDataPY.GetConfigEx(key) reloadSign = openServerDay if AuctionSystemItem and AuctionSystemItem[0] == reloadSign: GameWorld.DebugLog("ÒѾ­¼ÓÔØ¹ý±¾ÈÕϵͳÅÄÆ·´¦ÀíÐÅÏ¢£¡openServerDay=%s" % openServerDay) return AuctionSystemItem[1] # ÒòΪºóÃæµÄʱ¼äÅж϶¼ÊǾ«È·µ½·ÖµÄ£¬¶ø´¦Àí´ËÂß¼­µÄʱºò¿ÉÄܲ»ÊÇ0Ã룬ËùÒÔÕâÀïµÄdatetimeÈ¡µ±Ç°Ê±¼ä¾«È·µ½·ÖµÄ serverTime = GameWorld.GetServerTime() curDateStr = "%d-%d-%d" % (serverTime.year, serverTime.month, serverTime.day) curDateTimeStr = "%d-%d-%d %02d:%02d:00" % (serverTime.year, serverTime.month, serverTime.day, serverTime.hour, serverTime.minute) curDateTime = datetime.datetime.strptime(curDateTimeStr, ChConfig.TYPE_Time_Format) GameWorld.Log("===== ¼ÓÔØ±¾ÈÕϵͳÅÄÆ·ÐÅÏ¢: %s,openServerDay=%s =====" % (curDateTime, openServerDay)) addSystemAuctionItemInfo = [] ipyDataMgr = IpyGameDataPY.IPY_Data() for index in xrange(ipyDataMgr.GetAuctionSystemItemCount()): ipyData = ipyDataMgr.GetAuctionSystemItemByIndex(index) cfgID = ipyData.GetCfgID() startDateStr = ipyData.GetStartDate() endDateStr = ipyData.GetEndDate() startTimeStr = ipyData.GetStartTime() endTimeStr = ipyData.GetEndTime() auctionCount = ipyData.GetAuctionCount() randMinuteRange = ipyData.GetRandMinuteRange() replenishAuctionCount = ipyData.GetReplenishAuctionCount() GameWorld.DebugLog("cfgID=%s,startDateStr=%s,endDateStr=%s,startTimeStr=%s,endTimeStr=%s,auctionCount=%s,randMinuteRange=%s,replenishAuctionCount=%s" % (cfgID, startDateStr, endDateStr, startTimeStr, endTimeStr, auctionCount, randMinuteRange, replenishAuctionCount)) if not startDateStr: startDateStr = curDateStr elif startDateStr.isdigit(): startServerDay = int(startDateStr) openServerDateTime = curDateTime + datetime.timedelta(days=(startServerDay-openServerDay)) startDateStr = "%d-%d-%d" % (openServerDateTime.year, openServerDateTime.month, openServerDateTime.day) if not endDateStr: endDateStr = curDateStr elif endDateStr.isdigit(): endServerDay = int(endDateStr) endServerDateTime = curDateTime + datetime.timedelta(days=(endServerDay-openServerDay)) endDateStr = "%d-%d-%d" % (endServerDateTime.year, endServerDateTime.month, endServerDateTime.day) startDate = datetime.datetime.strptime("%s 00:00:00" % (startDateStr), ChConfig.TYPE_Time_Format) endDate = datetime.datetime.strptime("%s 23:59:00" % (endDateStr), ChConfig.TYPE_Time_Format) if serverTime < startDate or serverTime > endDate: GameWorld.DebugLog(" ²»ÔÚÉϼÜÈÕÆÚÄÚ£¬²»´¦Àí!") continue if not startTimeStr: startTimeStr = "00:00" if not endTimeStr: endTimeStr = "23:59" startDatetime = datetime.datetime.strptime("%s %s:00" % (curDateStr, startTimeStr), ChConfig.TYPE_Time_Format) endDatetime = datetime.datetime.strptime("%s %s:00" % (curDateStr, endTimeStr), ChConfig.TYPE_Time_Format) if serverTime >= endDatetime: GameWorld.DebugLog(" Òѳ¬¹ý½ñÈÕµÄÉϼÜʱ¼ä¶Î£¬²»´¦Àí!") continue if serverTime > startDatetime: startDatetime = curDateTime addAuctionItemDatetimeList = [] nextAddAuctionItemDatetime = startDatetime for _ in xrange(auctionCount): if len(randMinuteRange) == 2: nextAddMinutes = random.randint(randMinuteRange[0], randMinuteRange[1]) elif len(randMinuteRange) == 1: nextAddMinutes = randMinuteRange[0] else: continue nextAddAuctionItemDatetime += datetime.timedelta(minutes=nextAddMinutes) if nextAddAuctionItemDatetime > endDatetime: break GameWorld.DebugLog(" Ìí¼ÓÉϼÜϵͳÅÄÆ·Ê±¼ä: nextAddMinutes=%s %s" % (nextAddMinutes, nextAddAuctionItemDatetime)) addAuctionItemDatetimeList.append(nextAddAuctionItemDatetime) # ¶¯Ì¬²¹³äÅÄÆ·Ä£Ê½ if replenishAuctionCount: GameWorld.DebugLog(" Ìí¼Ó¶¯Ì¬²¹³äϵͳÅÄÆ·¼Æ»®: %s" % replenishAuctionCount) # Ö¸¶¨ÉϼÜÅÄÆ·Ä£Ê½ elif addAuctionItemDatetimeList: GameWorld.DebugLog(" Ìí¼ÓÉϼÜϵͳÅÄÆ·Ê±¼ä¼Æ»®: %s" % addAuctionItemDatetimeList) else: continue addSystemAuctionItemInfo.append([cfgID, ipyData, startDatetime, endDatetime, addAuctionItemDatetimeList]) AuctionSystemItem = IpyGameDataPY.SetConfigEx(key, [reloadSign, addSystemAuctionItemInfo]) GameWorld.Log("±¾ÈÕϵͳÅÄÆ·ÐÅÏ¢¼ÓÔØÍê±Ï!reloadSign=%s" % (reloadSign)) GameWorld.Log("±¾ÈÕϵͳÅÄÆ·ÉϼÜʱ¼äÐÅÏ¢: %s" % addSystemAuctionItemInfo) GameWorld.Log("=============================================================") return AuctionSystemItem[1] def OnAuctionItemMinuteProcess(tick): ## ÅÄÂôÐÐÅÄÆ·¶¨Ê±´¦Àí£¬Ã¿Õû·ÖÖÓ´¥·¢Ò»´Î # ÕâÀïʱ¼äÐ辫ȷµ½·ÖÖÓ£¬²»È»ºóÃæµÄ±È½Ï»áÆ¥Åä²»µ½ curDateTime = GameWorld.GetServerTime() curDateTime = datetime.datetime.strptime("%d-%d-%d %d:%d:00" % (curDateTime.year, curDateTime.month, curDateTime.day, curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format) randMailKey = "" sysAuctionItemListDict = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemListDict") # ϵͳµÈ´ýÉϼܵÄÅÄÆ·Áбí×Öµä {cfgID:[´ýÉϼÜÅÄÆ·Áбí], ...} if not sysAuctionItemListDict: sysAuctionItemListDict = {} curTime = int(time.time()) addItemTime = curTime openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) auctionItemMgr = PyDataManager.GetAuctionItemManager() curWorldLV = PlayerDBGSEvent.GetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) addSystemAuctionItemInfo = __GetAuctionSystemItemInfo() for cfgID, ipyData, startDatetime, endDatetime, addAuctionItemDatetimeList in addSystemAuctionItemInfo: #cfgID = ipyData.GetCfgID() if cfgID in sysAuctionItemListDict: #GameWorld.DebugLog(" ¶ÓÁÐÖл¹ÓÐδ´¦ÀíµÄÅÄÆ·Ê±²»´¦Àí£¬·ÀÖ¹ÖØ¸´Ìí¼Ó£¡cfgID=%s" % (cfgID)) continue worldLVRange = ipyData.GetWorldLVRange() if worldLVRange and len(worldLVRange) == 2: worldLVMin, worldLVMax = worldLVRange if curWorldLV < worldLVMin or curWorldLV > worldLVMax: #GameWorld.DebugLog(" ²»Âú×㵱ǰÊÀ½çµÈ¼¶·¶Î§Ìõ¼þ£¬²»´¦Àí¸ÃϵͳÉϼÜÅÄÆ·¼Æ»®£¡cfgID=%s,curWorldLV=%s" % (cfgID, curWorldLV)) continue if curDateTime < startDatetime or curDateTime > endDatetime: #GameWorld.DebugLog(" ²»Ôڹ涨µÄʱ¼äÄÚ£¬²»´¦Àí¸ÃϵͳÉϼÜÅÄÆ·¼Æ»®£¡cfgID=%s" % (cfgID)) continue randSecondRange = ipyData.GetAddRandSecondRange() if len(randSecondRange) != 2: #GameWorld.DebugLog(" Ëæ»úÉϼÜÃëÊý¸ñʽ´íÎ󣬲»´¦Àí¸ÃϵͳÉϼÜÅÄÆ·¼Æ»®£¡cfgID=%s" % (cfgID)) continue addItemInfoList = [] replenishAuctionCount = ipyData.GetReplenishAuctionCount() # ¶¯Ì¬Ä£Ê½ if replenishAuctionCount: replenishCDSeconds = ipyData.GetReplenishCDMinutes() * 60 lastReplenishTime = auctionItemMgr.worldAuctionReplenishTimeDict.get(cfgID, 0) if curTime - lastReplenishTime < replenishCDSeconds: continue auctionItemMgr.worldAuctionReplenishTimeDict[cfgID] = curTime replenishItemID = ipyData.GetReplenishItemID() if replenishItemID: curItemIDCount = auctionItemMgr.worldAuctionItemCountDict.get(replenishItemID, 0) if curItemIDCount >= replenishAuctionCount: continue addItemIDCount = replenishAuctionCount - curItemIDCount GameWorld.DebugLog(" ¶¯Ì¬²¹³äÅÄÆ·¶ÓÁÐ: cfgID=%s,replenishItemID=%s,addItemIDCount=%s" % (cfgID, replenishItemID, addItemIDCount)) for _ in xrange(addItemIDCount): addItemInfoList.append(replenishItemID) else: replenishEquipPlaces = ipyData.GetReplenishEquipPlaces() rpClassLV, rpColor, rpIsSuit = ipyData.GetReplenishEquipInfo() rpStar = 0 for job in openJobList: jobEquipKey = (job, rpClassLV, rpColor, rpIsSuit) curJobEquipCount = auctionItemMgr.worldAuctionJobEquipCountDict.get(jobEquipKey, 0) if curJobEquipCount >= replenishAuctionCount: continue addEquipCount = replenishAuctionCount - curJobEquipCount GameWorld.DebugLog(" ¶¯Ì¬²¹³äÅÄÆ·¶ÓÁÐ: cfgID=%s,addEquipCount=%s,job=%s" % (cfgID, addEquipCount, job)) for _ in xrange(addEquipCount): addItemInfoList.append([rpClassLV, rpColor, replenishEquipPlaces, rpIsSuit, rpStar, [job]]) random.shuffle(addItemInfoList) # ¶¯Ì¬Ä£Ê½´ýÌí¼ÓÅÄÆ·´òÂÒÏÂ˳Ðò£¬·ÀÖ¹ÅúÁ¿Ìí¼ÓͬһְҵÎïÆ· # Ö¸¶¨Ä£Ê½ elif curDateTime in addAuctionItemDatetimeList: addCountWeightList = ipyData.GetItemCountWeightList() auctionItemWeightList = ipyData.GetAuctionItemWeightList() addCount = GameWorld.GetResultByWeightList(addCountWeightList) GameWorld.DebugLog(" Ö¸¶¨²¹³äÅÄÆ·¶ÓÁÐ: cfgID=%s,addCount=%s" % (cfgID, addCount)) for _ in xrange(addCount): itemInfo = GameWorld.GetResultByWeightList(auctionItemWeightList) if itemInfo != None: addItemInfoList.append(itemInfo) randMailKeyList = ipyData.GetRandMailKeyList() if randMailKeyList: randMailKey = random.choice(randMailKeyList) sysWaitAuctionItemList = [] for itemInfo in addItemInfoList: randSeconds = random.randint(randSecondRange[0], randSecondRange[1]) addItemTime = addItemTime + randSeconds sysWaitAuctionItemList.append([addItemTime, itemInfo]) sysAuctionItemListDict[cfgID] = sysWaitAuctionItemList IpyGameDataPY.SetConfigEx("SysWaitAuctionItemListDict", sysAuctionItemListDict) #GameWorld.DebugLog("µÈ´ýϵͳÉϼܵÄÅÄÆ·Áбí: %s" % sysAuctionItemListDict) # Ëæ»úÓʼþ֪ͨ if randMailKey: playerIDList = [] addItemList = [] playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if PlayerControl.GetIsTJG(player): continue playerIDList.append(player.GetPlayerID()) PlayerCompensation.SendMailByKey(randMailKey, playerIDList, addItemList) return def __DoSysWaitAddAuctionItem(tick): SysWaitAuctionItemListDict = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemListDict") # ϵͳµÈ´ýÉϼܵÄÅÄÆ·Áбí if not SysWaitAuctionItemListDict: return curTime = int(time.time()) for cfgID, sysAuctionItemList in SysWaitAuctionItemListDict.items(): doCount = len(sysAuctionItemList) while doCount > 0 and sysAuctionItemList: doCount -= 1 addItemTime, itemInfo = sysAuctionItemList[0] if curTime < addItemTime: #GameWorld.DebugLog("δµ½ÏµÍ³µÈ´ýÉϼܵÄÅÄÆ·Ê±¼ä£¬²»´¦Àí! curTime=%s,sysAuctionItemList=%s" % (curTime, sysAuctionItemList)) break sysAuctionItemList.pop(0) GameWorld.DebugLog("ϵͳµÈ´ýÉϼܵÄÅÄÆ·Ê±¼äÒѵ½£¬¿ÉÉϼÜ! curTime=%s >= addItemTime=%s,itemInfo=%s,sysAuctionItemList=%s" % (curTime, addItemTime, itemInfo, sysAuctionItemList)) DoAddSystemAuctionItem([itemInfo]) if not sysAuctionItemList: SysWaitAuctionItemListDict.pop(cfgID) return def OnAuctionItemTimeProcess(curTime, tick): ## ÅÄÂôÐÐÅÄÆ·¶¨Ê±´¦Àí£¬Ã¿Ãë´¥·¢Ò»´Î __DoSysBuyoutItemByTime(curTime) __DoSysWaitAddAuctionItem(tick) allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList if not allAuctionItemByEndTimeList: return index = 0 endItemList = [] # ½áÊø¾º¼ÛµÄÅÄÆ·Áбí moveToWorldItemList = [] # ×ªÒÆµ½È«·þÅÄÂôµÄÏÉÃËÅÄÆ·Áбí doCount = len(allAuctionItemByEndTimeList) while doCount > 0 and allAuctionItemByEndTimeList: doCount -= 1 auctionItem = allAuctionItemByEndTimeList[index] if curTime <= auctionItem.EndTime: break if auctionItem.BiddingQueryTick and tick - auctionItem.BiddingQueryTick < BiddingQueryLockTick: index += 1 continue allAuctionItemByEndTimeList.pop(index) # ûÓÐÈ˾º¼ÛµÄÏÉÃËÅÄÆ· if not auctionItem.BidderPrice and auctionItem.FamilyID and auctionItem.AuctionType == AuctionType_Family: moveToWorldItemList.append(auctionItem) else: endItemList.append(auctionItem) __EndAuctionItem(endItemList, "ByTime") __MoveFamilyAuctionItemToWorld(moveToWorldItemList) return def __DoSysBuyoutItemByTime(curTime): ## ϵͳһ¿Ú¼ÛÅÄÆ· sysBuyoutItemByTimeList = PyDataManager.GetAuctionItemManager().sysBuyoutItemByTimeList if not sysBuyoutItemByTimeList: return sysAuctionItemList = [] color = 4 # ¹Ì¶¨³ÈÉ« isSuit = 0 # ¹Ì¶¨·ÇÌ××° star = 0 # ¹Ì¶¨0ÐÇ endItemList = [] # ½áÊø¾º¼ÛµÄÅÄÆ·Áбí doCount = len(sysBuyoutItemByTimeList) while doCount > 0 and sysBuyoutItemByTimeList: doCount -= 1 auctionItem = sysBuyoutItemByTimeList[0] if curTime <= auctionItem.SysBuyTime: break sysBuyoutItemByTimeList.pop(0) if auctionItem.BidderPrice or auctionItem.BidderID: continue classLV = auctionItem.ItemClassLV if not classLV: continue itemID = auctionItem.ItemID ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID) if not ipyData: continue buyoutPrice = ipyData.GetBuyoutPrice() if not buyoutPrice: continue buyoutPrice *= auctionItem.Count auctionItem.BidderPrice = buyoutPrice # ûÈ˾º¼ÛµÄϵͳֱ½ÓÒ»¿Ú¼Û»ØÊÕ endItemList.append(auctionItem) # Éú³Éϵͳ²¹ÉϼܵÄ×°±¸ÐÅÏ¢ randPlaceList = IpyGameDataPY.GetFuncEvalCfg("AuctionItemSystem", 4) if not randPlaceList: curPlace = itemID % 1000 / 10 # µ¹Êý2¡¢3λ´ú±í²¿Î» placeList = [curPlace] else: placeList = randPlaceList totalPlayerCount = 0 jobWeightList = [] openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) for job in openJobList: jobPlayerCount = len(PyGameData.g_onedayJobPlayerLoginoffTimeDict.get(job, {})) jobPlayerCount = max(1, jobPlayerCount) # ÈËÊýĬÈÏÖÁÉÙ1¸ö totalPlayerCount += jobPlayerCount jobWeightList.append([jobPlayerCount, job]) GameWorld.DebugLog("Ö°ÒµÈËÊý: job=%s,count=%s" % (job, jobPlayerCount)) maxJobPer = IpyGameDataPY.GetFuncCfg("AuctionItemSystem", 3) # µ¥Ö°Òµ×î´ó°Ù·Ö±È if maxJobPer and maxJobPer < 100 and totalPlayerCount: minJobPer = 100 - maxJobPer # µ¥Ö°ÒµÖÁÉÙ°Ù·Ö±È for jobWeightInfo in jobWeightList: jobPlayerCount = jobWeightInfo[0] jobPer = int(jobPlayerCount * 100.0 / totalPlayerCount) jobPer = min(max(minJobPer, jobPer), maxJobPer) jobWeightInfo[0] = jobPer GameWorld.DebugLog("Ëæ»úÉϼÜÖ°Òµ×°±¸±ÈÖØ: jobWeightList=%s" % jobWeightList) job = GameWorld.GetResultByWeightList(jobWeightList) itemJobList = [job] if job != None else openJobList sysAuctionItemList.append([classLV, color, placeList, isSuit, star, itemJobList]) if not endItemList: return __EndAuctionItem(endItemList, "SysBuyout") # ϵͳ»ØÊÕÅÄÆ·ºóÁ¢¼´°´¹æÔò²¹ÉϼÜÅÄÆ· if sysAuctionItemList: DoAddSystemAuctionItem(sysAuctionItemList) return def __MoveFamilyAuctionItemToWorld(auctionItemList): ## ÏÉÃËÅÄÆ·×ªÒƵ½È«·þ if not auctionItemList: return curTimeStr = GameWorld.GetCurrentDataTimeStr() attentionMgr = PyDataManager.GetAuctionAttentionManager() auctionItemMgr = PyDataManager.GetAuctionItemManager() notifyWorldAddItemList = [] # ÐÂÔöÈ«·þÅÄÆ·Í¨Öª [[itemGUID, itemID, playerID], ...] for auctionItem in auctionItemList: itemGUID = auctionItem.ItemGUID itemID = auctionItem.ItemID itemCount = auctionItem.Count playerID = auctionItem.PlayerID familyID = auctionItem.FamilyID ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID) auctionItem.AuctionType = AuctionType_World auctionItem.AddTime = curTimeStr __SetAuctionItemEndTime(auctionItem, ipyData) auctionItemMgr.allAuctionItemByEndTimeList.append(auctionItem) auctionItemMgr.worldAuctionItemList.append(auctionItem) __OnCalcWorldAuctionItemCount(auctionItem, 1) notifyWorldAddItemList.append([itemGUID, itemID, playerID]) AddAuctionRecord(auctionItem, AuctionRecordResult_MoveToWorld) # Ìí¼Ó½øÎҵĹØ×¢ for attentionPlayerID, attentionList in auctionItemMgr.myAttentionItemDict.items(): if itemID not in GetPlayerAuctionAttention(attentionMgr, attentionPlayerID): continue if auctionItem not in attentionList: attentionList.append(auctionItem) if ipyData.GetNeedWorldNotify(): PlayerControl.WorldNotify(0, "Paimai4", [itemID, ipyData.GetNoticeSaleMinutes()]) drDict = {"AuctionItemInfo":__GetAuctionItemDRDict(auctionItem)} DR_AuctionHouse(None, "FamilyToWorld", drDict) GameWorld.DebugLog("ÏÉÃËÅÄÆ·×ªÒƵ½È«·þ: itemID=%s,itemCount=%s,familyID=%s,itemGUID=%s" % (itemID, itemCount, familyID, itemGUID)) __SortAuctionitem() __SyncRefreshAuctionItem(auctionItemList) __NotifyAuctionPlayerAddItem(notifyWorldAddItemList) return def __SortAuctionitem(isSortWorldItem=True): ''' Ë¢ÐÂÈ«²¿ÅÄÆ·ÅÅÐò ºó¶ËÅÅÐò 1.È«·þÅÄÆ·£º ÒòΪȫ·þÅÄÆ·ÊýÁ¿±È½Ï´ó£¬²ÉÓÃÖ»²éѯָ¶¨¸öÊýÅÄÆ·£¬ËùÒÔÖ»ÄÜÓɺó¶ËÅÅÐòºóͬ²½ 2.È«²¿ÅÄÆ·¾º¼Û½áÊøÊ±¼ä£ººó¶ËÐèÒª´¦Àí¾º¼Û½áÊø ǰ¶ËÅÅÐò£º 1.¸öÈËÅÄÆ·£º¸öÊý½ÏÉÙ£¬È«²¿Í¬²½£¬ÓÉǰ¶Ë×Ô¼ºÅÅÐò 2.ÏÉÃËÅÄÆ·£º¸öÊý½ÏÉÙ£¬È«²¿Í¬²½£¬ÓÉǰ¶Ë×Ô¼ºÅÅÐò 3.¾º¼ÛÅÄÆ·£º¸öÊý½ÏÉÙ£¬È«²¿Í¬²½£¬ÓÉǰ¶Ë×Ô¼ºÕûºÏÅÅÐò£¬Çø·Ö×î¸ß¾º¼Û¡¢ÀúÊ·¾º¼Û 4.¹Ø×¢ÅÄÆ·£º¸öÊý½ÏÉÙ£¬È«²¿Í¬²½£¬ÓÉǰ¶Ë×Ô¼ºÅÅÐò ´¥·¢ÅÅÐòʱ»ú£º 1-ÉϼÜÐÂÈ«·þÅÄÆ· 2-ÏÉÃËÅÄÆ·×ªÒÆÈ«·þÅÄÆ·£¬Ï൱ÓÚÉϼÜÐÂÈ«·þÅÄÆ· 3-¾º¼ÛÅÄÆ·´¥·¢¼Óʱʱ£¬ÐèÒª¶Ô½áÊøÊ±¼äÖØÅÅ£¬¾º¼Û¼ÓʱµÄÖ»´¥·¢¼Óʱ£¬¶ÔÈ«·þÅÄÆ·µÄÅÅÐòûÓÐÓ°Ï죬¹Ê¿É²»ÖØÅÄÈ«·þÅÄÆ· ''' auctionItemMgr = PyDataManager.GetAuctionItemManager() auctionItemMgr.allAuctionItemByEndTimeList.sort(key=operator.attrgetter("EndTime")) if isSortWorldItem: auctionItemMgr.worldAuctionItemList.sort(key=operator.attrgetter("Sortpriority", "AddTime")) auctionItemMgr.worldAuctionItemQueryDict = {} # ÖØÖÃÈ«·þÅÄÆ·Ìõ¼þ²éѯ£¬Ï´ÎÓÐÍæ¼Ò²éѯʱÔÙÖØÐÂˢРauctionItemMgr.sysBuyoutItemByTimeList.sort(key=operator.attrgetter("SysBuyTime")) return def __EndAuctionItem(endItemList, endEvent, funcAutoBuyout=False, buyPlayer=None): ''' ½áÊøÅÄÆ·¾ºÅÄ @param delItemStateDict: ɾ³ýµÄÅÄÆ·¾ºÅÄ״̬ ''' if not endItemList: return 0 auctionItemMgr = PyDataManager.GetAuctionItemManager() clearAuctionItemList = [] for auctionItem in endItemList: if not auctionItem: continue itemGUID = auctionItem.ItemGUID itemID = auctionItem.ItemID itemCount = auctionItem.Count playerID = auctionItem.PlayerID familyID = auctionItem.FamilyID bidderID = auctionItem.BidderID # µ±Ç°¾º¼ÛÍæ¼ÒID bidderPrice = auctionItem.BidderPrice # µ±Ç°¾º¼Û£¬ÓÐÈ˾º¼ÛµÄ»°´ú±í¾ºÅijɹ¦ endType = "" # ÓÐÈ˾º¼Û£¬³É½» if bidderPrice: endType = "OK" # ¾ºÅijɹ¦Óʼþ£¬·¢·ÅÎïÆ· if bidderID: mailTypeKey = "PaimaiMail3" paramList = [bidderPrice] detail = {"ItemGUID":itemGUID} addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":False, "UserData":auctionItem.UserData}] if funcAutoBuyout: # ¹¦ÄÜ×Ô¶¯¹ºÂòµÄ²»¸øÎïÆ·£¬Óɹ¦Äܸù¾Ý¹¦ÄÜÐèÇó´¦Àí pass ## Èç¹ûÓÐÍæ¼ÒµÄ£¬Ö±½Ó¸øµ½±³°ü elif buyPlayer and buyPlayer.GetPlayerID() == bidderID: mailInfo = [mailTypeKey, addItemList, paramList, detail] resultMsg = str([itemGUID, itemID, itemCount, auctionItem.UserData, mailInfo]) buyPlayer.MapServer_QueryPlayerResult(0, 0, "AuctionHouseGiveItem", resultMsg, len(resultMsg)) else: PlayerCompensation.SendMailByKey(mailTypeKey, [bidderID], addItemList, paramList, detail=detail) AddAuctionRecord(auctionItem, AuctionRecordResult_BidOK) # ÅÄÂô³É¹¦ÊÕÒæ£¬¶¼ÒÔÍæ¼ÒÊÕÒæÏòÉÏÈ¡Õû if familyID and auctionItem.FamilyPlayerIDInfo: familyPlayerIDList = json.loads(auctionItem.FamilyPlayerIDInfo) if familyPlayerIDList: taxRate = IpyGameDataPY.GetFuncCfg("AuctionTaxrate", 2) # ÏÉÃËÅÄÆ·Ë°ÂÊ°Ù·Ö±È personMaxRate = IpyGameDataPY.GetFuncCfg("AuctionTaxrate", 3) # ÏÉÃËÅÄÆ·¸öÈË×î´óÊÕÒæ°Ù·Ö±È taxGold = max(1, int(bidderPrice * taxRate / 100.0)) # ×îÉÙÊÕ˰1 giveTotalGold = max(0, bidderPrice - taxGold) giveMaxGold = int(math.ceil(giveTotalGold * personMaxRate / 100.0)) memCount = len(familyPlayerIDList) giveGoldAverage = min(giveMaxGold, int(math.ceil(giveTotalGold * 1.0 / memCount))) # ÓÐÊÕÒæµÄÈËÆ½·Ö # ÏÉÃËÅÄÆ·ÊÕÒæÓʼþ detail = {"ItemGUID":itemGUID, "ItemID":itemID, "Count":itemCount, "BidderPrice":bidderPrice, "FamilyPlayerIDList":familyPlayerIDList} paramList = [itemID, itemID, bidderPrice, taxRate, giveGoldAverage, personMaxRate] PlayerCompensation.SendMailByKey("PaimaiMail8", familyPlayerIDList, [], paramList, goldPaper=giveGoldAverage, detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionGain) else: GameWorld.ErrLog("ÏÉÃËÅÄÆ·Ã»ÓÐÈË»ñµÃÊÕÒæ!familyID=%s,itemID=%s,itemGUID=%s" % (familyID, itemID, itemGUID)) elif playerID: taxRate = IpyGameDataPY.GetFuncCfg("AuctionTaxrate", 1) # È«·þÅÄÆ·Ë°ÂÊ°Ù·Ö±È taxGold = max(1, int(bidderPrice * taxRate / 100.0)) # ×îÉÙÊÕ˰1 givePlayerGold = max(0, bidderPrice - taxGold) # ¸öÈËÅÄÂôÊÕÒæÓʼþ detail = {"ItemGUID":itemGUID, "ItemID":itemID, "Count":itemCount, "BidderPrice":bidderPrice} paramList = [itemID, itemID, bidderPrice, taxRate, givePlayerGold] PlayerCompensation.SendMailByKey("PaimaiMail7", [playerID], [], paramList, goldPaper=givePlayerGold, detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionGain) else: GameWorld.Log("ϵͳÅÄÆ·³É½»: itemGUID=%s,itemID=%s" % (itemGUID, itemID)) AddAuctionRecord(auctionItem, AuctionRecordResult_SellOK) #²ß»®ÐèÇóÆÁ±Îµô³É½»¹ã²¥ #ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID) #if ipyData and ipyData.GetNeedWorldNotify(): # PlayerControl.WorldNotify(0, "Paimai6", [auctionItem.BidderName, bidderID, auctionItem.AuctionType, bidderPrice, itemID]) else: # ÏÉÃËÅÄÆ·»ØÊÕ if familyID: endType = "Recycle" AddAuctionRecord(auctionItem, AuctionRecordResult_Recycle) # ¸öÈËÅÄÆ·Á÷ÅÄ£¬ÎïÆ··µ»¹ elif playerID: endType = "Return" # ·µ»¹ÎïÆ·Óʼþ paramList = [] detail = {"ItemGUID":itemGUID} addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":True, "UserData":auctionItem.UserData}] # ÏÂ¼Ü if endEvent == "Unsell": PlayerCompensation.SendMailByKey("PaimaiMail9", [playerID], addItemList, paramList, detail=detail) AddAuctionRecord(auctionItem, AuctionRecordResult_Unsell) else: PlayerCompensation.SendMailByKey("PaimaiMail4", [playerID], addItemList, paramList, detail=detail) AddAuctionRecord(auctionItem, AuctionRecordResult_SellFail) else: endType = "SystemDelete" GameWorld.Log("ϵͳÅÄÆ·Á÷ÅÄ: itemGUID=%s,itemID=%s" % (itemGUID, itemID)) drDict = {"AuctionItemInfo":__GetAuctionItemDRDict(auctionItem), "EndType":endType, "EndEvent":endEvent} DR_AuctionHouse(None, "EndAuctionItem", drDict) GameWorld.DebugLog("½áÊø¾ºÅÄ: itemID=%s,itemCount=%s,familyID=%s,endType=%s,endEvent=%s,itemGUID=%s" % (itemID, itemCount, familyID, endType, endEvent, itemGUID), playerID) auctionItemMgr.allAuctionItemDict.pop(itemGUID, None) if auctionItem in auctionItemMgr.allAuctionItemByEndTimeList: auctionItemMgr.allAuctionItemByEndTimeList.remove(auctionItem) if auctionItem in auctionItemMgr.worldAuctionItemList: auctionItemMgr.worldAuctionItemList.remove(auctionItem) __OnCalcWorldAuctionItemCount(auctionItem, -1) for queryItemList in auctionItemMgr.worldAuctionItemQueryDict.values(): if auctionItem in queryItemList: queryItemList.remove(auctionItem) if familyID and familyID in auctionItemMgr.familyAuctionItemDict: familyItemList = auctionItemMgr.familyAuctionItemDict[familyID] if auctionItem in familyItemList: familyItemList.remove(auctionItem) if auctionItem in auctionItemMgr.sysBuyoutItemByTimeList: auctionItemMgr.sysBuyoutItemByTimeList.remove(auctionItem) for nowBiddingItemList in auctionItemMgr.nowBiddingAuctionItemDict.values(): if auctionItem in nowBiddingItemList: nowBiddingItemList.remove(auctionItem) for hisBiddingItemList in auctionItemMgr.hisBiddingAuctionItemDict.values(): if auctionItem in hisBiddingItemList: hisBiddingItemList.remove(auctionItem) if playerID and playerID in auctionItemMgr.myAuctionItemDict: playerItemList = auctionItemMgr.myAuctionItemDict[playerID] if auctionItem in playerItemList: playerItemList.remove(auctionItem) for attentionItemList in auctionItemMgr.myAttentionItemDict.values(): if auctionItem in attentionItemList: attentionItemList.remove(auctionItem) clearItem = ChPyNetSendPack.tagGCClearAuctionItem() clearItem.ItemGUID = itemGUID clearAuctionItemList.append(clearItem) if not clearAuctionItemList: return 0 clearCount = len(clearAuctionItemList) clientPack = ChPyNetSendPack.tagGCClearAuctionItemInfo() clientPack.ClearAuctionItemList = clearAuctionItemList clientPack.ClearCount = len(clientPack.ClearAuctionItemList) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, clientPack) return clearCount def MapServer_AuctionHouseLogic(curPlayer, msgList, tick): ## µØÍ¼Íæ¼ÒÅÄÂô´¦Àí playerID = 0 if not curPlayer else curPlayer.GetPlayerID() queryType, queryData = msgList result = [] GameWorld.Log("ÊÕµ½µØÍ¼ÅÄÂôÐÐÐÅÏ¢: queryType=%s,queryData=%s" % (queryType, queryData), playerID) if not GetAuctionHouseState(): if curPlayer: PlayerControl.NotifyCode(curPlayer, "AuctionHouseClose") return # ²éÑ¯Íæ¼Ò¿É·ñÉÏ¼Ü if queryType == "AddAuctionItemQuery": canSell = __CheckPlayerCanAddAuctionItem(curPlayer) if not canSell: return result = [canSell] # Ö´ÐÐÉϼÜÎïÆ· elif queryType == "AddAuctionItem": addAuctionItemList = queryData __AddAuctionItemByList(curPlayer, addAuctionItemList) return # ²éÑ¯Íæ¼Ò¿É·ñ¾º¼ÛÎïÆ· elif queryType == "BidAuctionItemQuery": itemGUID, biddingPrice = queryData itemID, errInfo = __DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, tick, True) GameWorld.DebugLog(" itemID=%s,errInfo=%s" % (itemID, errInfo), playerID) if errInfo: return if not itemID: return result = [itemID] # Ö´ÐÐÍæ¼Ò¾º¼ÛÎïÆ· elif queryType == "BidAuctionItem": itemGUID, biddingPrice = queryData itemID, errInfo = __DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, tick, False) if errInfo: GameWorld.DebugLog(" errInfo=%s" % errInfo, playerID) drDict = {"ItemGUID":itemGUID, "BiddingPrice":biddingPrice, "ErrInfo":errInfo} DR_AuctionHouse(curPlayer, "BidAuctionItemError", drDict) return # ϼÜÅÄÆ· elif queryType == "UnsellAuctionItem": itemGUID = queryData[0] __DoUnsellAuctionItem(curPlayer, itemGUID) return # ÉýÐÇ×Ô¶¯¹ºÂò elif queryType == "EquipStarAutoBuy": buyResult = __DoEquipStarAutoBuyEquip(curPlayer, queryData, tick) if buyResult == None: return result = buyResult elif queryType == "ClearAuctionItem": __DoGMClearAuctionItem(curPlayer) return elif queryType == "PrintAuctionItem": __DoGMPrintAuctionItem(curPlayer) return resultMsg = str([queryType, queryData, result]) if curPlayer: curPlayer.MapServer_QueryPlayerResult(0, 0, "AuctionHouse", resultMsg, len(resultMsg)) return def __CheckPlayerCanAddAuctionItem(curPlayer): ## ¼ì²éÍæ¼Ò¿É·ñÉϼÜÅÄÆ· playerID = curPlayer.GetPlayerID() maxSellCount = IpyGameDataPY.GetFuncCfg("AuctionHouse", 2) if maxSellCount: playerAuctionItemList = GetPlayerAuctionItemList(playerID) playerSellCount = len(playerAuctionItemList) canSell = playerSellCount < maxSellCount if not canSell: PlayerControl.NotifyCode(curPlayer, "SellCountLimit") return canSell return True def __AddAuctionItemByList(curPlayer, addAuctionItemList): ''' ÅúÁ¿Ìí¼ÓÅÄÆ· @param curPlayer: ¿ÉÄÜΪNone ''' isSortWorldItem = False notifyAddItemList = [] # ÐÂÔöÅÄÆ·Í¨Öª [[itemGUID, itemID, playerID], ...] notifyFamilyAddItemDict = {} # ÐÂÔöÏÉÃËÅÄÆ·Í¨Öª {familyID:[auctionItem, ...], ...} for playerID, familyID, familyPlayerIDList, itemData in addAuctionItemList: #ϵͳÅÄÆ·Íæ¼ÒID¡¢ÏÉÃËID¶¼Îª0£¬¿ÉÉϼܣ¬ÕâÀï²»ÔÙÏÞÖÆ #if not playerID and not familyID: # continue auctionItem = __DoAddAuctionItem(curPlayer, playerID, familyID, familyPlayerIDList, itemData) if not auctionItem: continue itemGUID = auctionItem.ItemGUID itemID = auctionItem.ItemID notifyAddItemList.append([itemGUID, itemID, playerID]) if familyID: familyAddItemList = notifyFamilyAddItemDict.get(familyID, []) familyAddItemList.append(auctionItem) notifyFamilyAddItemDict[familyID] = familyAddItemList else: isSortWorldItem = True if notifyAddItemList: __SortAuctionitem(isSortWorldItem=isSortWorldItem) # ֪ͨÐÂÔöÏÉÃËÅÄÆ· for familyID, familyAddItemList in notifyFamilyAddItemDict.items(): Sync_FamilyAuctionItemInfo(None, familyID, familyAddItemList) # ֪ͨÅÄÆ·¹Ø×¢Íæ¼Ò __NotifyAuctionPlayerAddItem(notifyAddItemList) return def __DoAddAuctionItem(curPlayer, playerID, familyID, familyPlayerIDList, itemData): ## Ìí¼ÓÅÄÆ· itemID = itemData.get("ItemID", 0) ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID) if not ipyData: return itemGUID = itemData.get("GUID", "") auctionItem = PyGameDataStruct.tagDBAuctionItem() auctionItem.ItemGUID = itemGUID auctionItem.PlayerID = playerID auctionItem.FamilyID = familyID auctionItem.ItemID = itemID auctionItem.Count = itemData.get("ItemCount", 0) auctionItem.AddTime = GameWorld.GetCurrentDataTimeStr() auctionItem.ItemType = itemData.get("ItemType", 0) auctionItem.ItemJobLimit = itemData.get("ItemJobLimit", 0) auctionItem.ItemClassLV = itemData.get("ItemClassLV", 0) auctionItem.UserData = itemData.get("UserData", "") auctionItem.UserDataLen = len(auctionItem.UserData) auctionItem.FamilyPlayerIDInfo = str(familyPlayerIDList) auctionItem.FamilyPlayerIDLen = len(auctionItem.FamilyPlayerIDInfo) auctionItem.AuctionType = AuctionType_Family if familyID else AuctionType_World GameWorld.Log("ÉϼÜÅÄÆ·: playerID=%s,familyID=%s,itemID=%s,auctionType=%s" % (playerID, familyID, itemID, auctionItem.AuctionType)) if not __InitAuctionItemAttrEx(auctionItem): return auctionItemMgr = PyDataManager.GetAuctionItemManager() auctionItemMgr.allAuctionItemDict[auctionItem.ItemGUID] = auctionItem auctionItemMgr.allAuctionItemByEndTimeList.append(auctionItem) if familyID: familyItemList = auctionItemMgr.familyAuctionItemDict.get(familyID, []) familyItemList.append(auctionItem) auctionItemMgr.familyAuctionItemDict[familyID] = familyItemList else: auctionItemMgr.worldAuctionItemList.append(auctionItem) __OnCalcWorldAuctionItemCount(auctionItem, 1) # Ìí¼Ó½øÎÒµÄÅÄÂô if playerID: myAuctionItemList = auctionItemMgr.myAuctionItemDict.get(playerID, []) myAuctionItemList.append(auctionItem) auctionItemMgr.myAuctionItemDict[playerID] = myAuctionItemList if curPlayer: Sync_PlayerAuctionItemInfo(curPlayer, auctionItem) # Ìí¼Ó½øÎҵĹØ×¢ attentionMgr = PyDataManager.GetAuctionAttentionManager() for attentionPlayerID, attentionList in auctionItemMgr.myAttentionItemDict.items(): if itemID not in GetPlayerAuctionAttention(attentionMgr, attentionPlayerID): continue if auctionItem not in attentionList: attentionList.append(auctionItem) if ipyData.GetNeedWorldNotify(): PlayerControl.WorldNotify(0, "Paimai4", [itemID, ipyData.GetNoticeSaleMinutes()]) drDict = {"AuctionItemInfo":__GetAuctionItemDRDict(auctionItem)} DR_AuctionHouse(curPlayer, "AddAuctionItem", drDict) GameWorld.DebugLog("ÉϼÜÅÄÆ·: playerID=%s,familyID=%s,%s" % (playerID, familyID, drDict), playerID) GameWorld.DebugLog("¸üÐÂÅÄÆ·Êý: %s" % len(auctionItemMgr.allAuctionItemDict)) return auctionItem def __NotifyAuctionPlayerAddItem(notifyAddItemList): ## ֪ͨ¹Ø×¢ÎïÆ·µÄÍæ¼ÒÐÂÉϼÜÎïÆ·ÁË if not notifyAddItemList: return attentionMgr = PyDataManager.GetAuctionAttentionManager() playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if PlayerControl.GetIsTJG(player): continue playerAttentionIDList = GetPlayerAuctionAttention(attentionMgr, player.GetPlayerID()) if not playerAttentionIDList: continue infoPack = None for itemGUID, itemID, playerID in notifyAddItemList: if playerID and playerID == player.GetPlayerID(): # ×Ô¼ºÉϼܵÄÎïÆ·²»Í¨Öª continue if itemID not in playerAttentionIDList: continue if not infoPack: infoPack = ChPyNetSendPack.tagGCAddAuctionItemInfo() itemInfo = ChPyNetSendPack.tagGCAddAuctionItem() itemInfo.ItemGUID = itemGUID itemInfo.ItemID = itemID infoPack.AddAuctionItemList.append(itemInfo) if infoPack: infoPack.AddCount = len(infoPack.AddAuctionItemList) NetPackCommon.SendFakePack(player, infoPack) return def __DoUnsellAuctionItem(curPlayer, itemGUID): ## ϼÜÅÄÆ· auctionItem = GetAuctionItem(itemGUID) if not auctionItem: # ÅÄÆ·²»´æÔÚ PlayerControl.NotifyCode(curPlayer, "Paimai3") return playerID = curPlayer.GetPlayerID() itemID = auctionItem.ItemID if auctionItem.FamilyID: GameWorld.ErrLog("ÏÉÃËÅÄÆ·ÎÞ·¨Ï¼ܣ¡itemGUID=%s,itemID=%s,itemFamilyID=%s" % (itemGUID, itemID, auctionItem.FamilyID), playerID) return if auctionItem.PlayerID != playerID: GameWorld.ErrLog("²»ÊÇÍæ¼Ò×Ô¼ºµÄÅÄÆ·ÎÞ·¨Ï¼ܣ¡itemGUID=%s,itemID=%s,itemPlayerID=%s" % (itemGUID, itemID, auctionItem.PlayerID), playerID) return if auctionItem.BidderPrice: # ¾º¼ÛÖеÄÅÄÆ·²»ÄÜÏÂ¼Ü PlayerControl.NotifyCode(curPlayer, "Paimai9") return __EndAuctionItem([auctionItem], "Unsell") return def __DoPlayerBidAuctionItem(curPlayer, itemGUID, biddingPrice, tick, isOnlyCheck, funcAutoBuyout=False): ''' Íæ¼Ò¾º¼ÛÎïÆ· @param curPlayer: ¾º¼ÛµÄÍæ¼Ò @param itemGUID: ÅÄÆ·GUID @param biddingPrice: ¾º¼Û @param isOnlyCheck: ÊÇ·ñ½ö¼ì²é¿É·ñ¾º¼Û @param funcAutoBuyout: ÊÇ·ñ¹¦ÄÜ×Ô¶¯¹ºÂò ''' errInfo = "" itemID = 0 auctionItem = GetAuctionItem(itemGUID) if not auctionItem: # ÅÄÆ·²»´æÔÚ PlayerControl.NotifyCode(curPlayer, "Paimai3") errInfo = "not auctionItem" return itemID, errInfo itemID = auctionItem.ItemID ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID) if not ipyData: errInfo = "not ipyData" return itemID, errInfo playerID = curPlayer.GetPlayerID() addTimeStr = auctionItem.AddTime auctionType = auctionItem.AuctionType # 0-È«·þÅÄÆ·£¬1-ÏÉÃËÅÄÆ· addTime = GameWorld.ChangeTimeStrToNum(addTimeStr) curTime = int(time.time()) passMinutes = (curTime - addTime) / 60 noticeMinutes = ipyData.GetNoticeSaleMinutes() if passMinutes < noticeMinutes: GameWorld.ErrLog("ÅÄÆ·ÉÐ먦·Å¾º¼Û! itemGUID=%s,itemID=%s,addTimeStr=%s" % (itemGUID, itemID, addTimeStr), playerID) errInfo = "in notice time" return itemID, errInfo if auctionType == AuctionType_Family: itemFamilyID = auctionItem.FamilyID playerFamilyID = curPlayer.GetFamilyID() if not playerFamilyID or playerFamilyID != itemFamilyID: GameWorld.ErrLog("¸ÃÅÄÆ·ÎªÏÉÃË˽ÓÐÅÄÆ·£¬·Ç±¾ÏÉÃËÈËÔ±²»¿É¾ºÅÄ! itemGUID=%s,itemID=%s,itemFamilyID=%s,playerFamilyID=%s" % (itemGUID, itemID, itemFamilyID, playerFamilyID), playerID) errInfo = "is family auction item" return itemID, errInfo if curTime > auctionItem.EndTime: GameWorld.ErrLog("ÅÄÆ·ÒѽáÊø¾º¼Û! itemGUID=%s,itemID=%s,addTimeStr=%s" % (itemGUID, itemID, addTimeStr), playerID) errInfo = "end bid" return itemID, errInfo nextPrice = ipyData.GetBasePrice() * auctionItem.Count if not auctionItem.BidderPrice else (auctionItem.BidderPrice + ipyData.GetBiddingAdd() * auctionItem.Count) buyoutPrice = ipyData.GetBuyoutPrice() * auctionItem.Count # ÔÊÐíûÓÐÒ»¿Ú¼ÛµÄ£¬´ú±í¿ÉÒÔÒ»Ö±¾º¼Û nextPrice = nextPrice if not buyoutPrice else min(nextPrice, buyoutPrice) # ²»³¬¹ýÒ»¿Ú¼Û if not (biddingPrice == nextPrice or (buyoutPrice and biddingPrice == buyoutPrice)): # ¾º¼Û¼Û¸ñ´íÎó PlayerControl.NotifyCode(curPlayer, "Paimai2") errInfo = "bid price error! biddingPrice=%s,nextPrice=%s,buyoutPrice=%s,itemGUID=%s,itemID=%s" % (biddingPrice, nextPrice, buyoutPrice, itemGUID, itemID) return itemID, errInfo if isOnlyCheck: queryTick = auctionItem.BiddingQueryTick if queryTick and tick - queryTick < BiddingQueryLockTick: # ÓÐÍæ¼ÒÕýÔÚ¾º¼Û£¬ÇëÉÔµÈ PlayerControl.NotifyCode(curPlayer, "Paimai1") errInfo = "other player bidding" return itemID, errInfo auctionItem.BiddingQueryID = playerID auctionItem.BiddingQueryTick = tick return itemID, errInfo if not funcAutoBuyout and auctionItem.BiddingQueryID != playerID: PlayerControl.NotifyCode(curPlayer, "Paimai2") errInfo = "bidding player error" return itemID, errInfo lastBidderID = auctionItem.BidderID lastBidderPrice = auctionItem.BidderPrice itemCount = auctionItem.Count isBuyout = buyoutPrice and biddingPrice >= buyoutPrice # ´óÓÚµÈÓÚÒ»¿Ú¼Û£¬Ö±½Ó³É½» auctionItemMgr = PyDataManager.GetAuctionItemManager() nowBiddingAuctionItemDict = auctionItemMgr.nowBiddingAuctionItemDict hisBiddingAuctionItemDict = auctionItemMgr.hisBiddingAuctionItemDict # Óʼþ·µ»¹Éϸö¾º¼ÛÕß if lastBidderID and lastBidderPrice: detail = {"ItemID":itemID, "ItemGUID":itemGUID, "Count":itemCount} if isBuyout: # ¾ºÅÄʧ°Ü£¬½ö֪ͨ paramList = [itemID, itemID, lastBidderPrice] PlayerCompensation.SendMailByKey("PaimaiMail2", [lastBidderID], [], paramList, goldPaper=lastBidderPrice, detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionBidReturn) else: # ¾ºÅÄʧ°Ü£¬¿É¼ÌÐø¾º¼ÛÓʼþ paramList = [itemID, itemID, lastBidderPrice, itemGUID] PlayerCompensation.SendMailByKey("PaimaiMail1", [lastBidderID], [], paramList, goldPaper=lastBidderPrice, detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionBidReturn) AddAuctionRecord(auctionItem, AuctionRecordResult_BidFail) isSyncBiddingItem = False nowBiddingAuctionItemList = nowBiddingAuctionItemDict.get(lastBidderID, []) if auctionItem in nowBiddingAuctionItemList: nowBiddingAuctionItemList.remove(auctionItem) nowBiddingAuctionItemDict[lastBidderID] = nowBiddingAuctionItemList isSyncBiddingItem = True hisBiddingAuctionItemList = hisBiddingAuctionItemDict.get(lastBidderID, []) if auctionItem not in hisBiddingAuctionItemList: hisBiddingAuctionItemList.append(auctionItem) hisBiddingAuctionItemDict[lastBidderID] = hisBiddingAuctionItemList isSyncBiddingItem = True if isSyncBiddingItem: lastBidder = GameWorld.GetPlayerManager().FindPlayerByID(lastBidderID) if lastBidder and not PlayerControl.GetIsTJG(lastBidder): Sync_PlayerBiddingItemInfo(lastBidder, auctionItem) # ¸üоº¼ÛÐÅÏ¢ auctionItem.BiddingQueryID = 0 auctionItem.BiddingQueryTick = 0 auctionItem.BiddingTime = GameWorld.GetCurrentDataTimeStr() auctionItem.BidderID = playerID auctionItem.BidderName = curPlayer.GetName() auctionItem.BidderPrice = biddingPrice isSyncBiddingItem = False nowBiddingAuctionItemList = nowBiddingAuctionItemDict.get(playerID, []) if auctionItem not in nowBiddingAuctionItemList: nowBiddingAuctionItemList.append(auctionItem) nowBiddingAuctionItemDict[playerID] = nowBiddingAuctionItemList isSyncBiddingItem = True hisBiddingAuctionItemList = hisBiddingAuctionItemDict.get(playerID, []) if auctionItem in hisBiddingAuctionItemList: hisBiddingAuctionItemList.remove(auctionItem) hisBiddingAuctionItemDict[playerID] = hisBiddingAuctionItemList isSyncBiddingItem = True if isSyncBiddingItem: Sync_PlayerBiddingItemInfo(curPlayer, auctionItem) # Ìí¼ÓÀúÊ·¾º¼ÛÕß if str(playerID) not in auctionItem.BidderIDInfo: auctionItem.BidderIDInfo += "%s|" % playerID auctionItem.BidderIDLen = len(auctionItem.BidderIDInfo) GameWorld.DebugLog("Íæ¼Ò¾º¼ÛÅÄÆ·: itemGUID=%s,itemID=%s,isBuyout=%s,lastBidderID=%s,lastBidderPrice=%s,bidderIDInfo=%s" % (itemGUID, itemID, isBuyout, lastBidderID, lastBidderPrice, auctionItem.BidderIDInfo), playerID) if auctionItem in auctionItemMgr.sysBuyoutItemByTimeList: auctionItemMgr.sysBuyoutItemByTimeList.remove(auctionItem) #GameWorld.DebugLog("ÅÄÆ·ÓÐÈ˾º¼ÛÁË£¬ÒƳýϵͳһ¿Ú¼ÛÅÄÆ·Áбí!") if isBuyout: __EndAuctionItem([auctionItem], "Buyout", funcAutoBuyout, buyPlayer=curPlayer) else: if __AddAuctionItemEndTimeByBid(auctionItem): __SortAuctionitem(isSortWorldItem=False) drDict = {"AuctionItemInfo":__GetAuctionItemDRDict(auctionItem)} DR_AuctionHouse(curPlayer, "BidAuctionItem", drDict) __SyncRefreshAuctionItem([auctionItem]) return itemID, errInfo def __DoEquipStarAutoBuyEquip(curPlayer, queryData, tick): ## ÉýÐÇ×Ô¶¯¹ºÂò classLV, equipPlace, curPartStar, equipPackIndex, isAutoBuyPreview, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, playerGoldPaper = queryData GameWorld.DebugLog("ÉýÐÇ×Ô¶¯¹ºÂò×°±¸: classLV=%s, equipPlace=%s, curPartStar=%s, equipPackIndex=%s" % (classLV, equipPlace, curPartStar, equipPackIndex)) GameWorld.DebugLog(" ÊÇ·ñÔ¤ÀÀ %s, curRate=%s,lackItemCostMoney=%s, playerGoldPaper=%s" % (isAutoBuyPreview, curRate, lackItemCostMoney, playerGoldPaper)) nextStar = curPartStar + 1 ipyData = IpyGameDataPY.GetIpyGameData("EquipStarUp", classLV, equipPlace, nextStar) if not ipyData: return costEquipPlaceList = ipyData.GetCostEquipPlace() costEquipColorList = ipyData.GetCostEquipColor() isJobLimit = ipyData.GetIsJobLimit() unSuitRate = ipyData.GetUnSuitRate() curTime = int(time.time()) fullRate = IpyGameDataPY.GetFuncCfg("EquipStarRate", 4) autoBuyOtherClassItemDict = {} buyEquipCostMoney = 0 autoBuyItemList = [] auctionItemMgr = PyDataManager.GetAuctionItemManager() #GameWorld.DebugLog("ÊÀ½çÅÄÆ·¸öÊý: %s" % len(auctionItemMgr.worldAuctionItemList)) for i, worldAuctionItem in enumerate(auctionItemMgr.worldAuctionItemList): itemID = worldAuctionItem.ItemID aucItemJob = worldAuctionItem.ItemJobLimit if not aucItemJob: #GameWorld.DebugLog(" %s ְҵͨÓõÄ, ²»¹ºÂò!itemID=%s" % (i, itemID)) continue if isJobLimit and aucItemJob != curPlayer.GetJob(): #GameWorld.DebugLog(" %s Ö°Òµ²»¿ÉÓÃ, ²»¹ºÂò!itemID=%s,aucItemJob=%s != %s" % (i, itemID, aucItemJob, curPlayer.GetJob())) continue itemIDStr = str(itemID) aucItemColor = int(itemIDStr[3:4]) aucItemPlace = int(itemIDStr[4:6]) aucItemIsSuit = int(itemIDStr[-1]) if aucItemColor not in costEquipColorList: #GameWorld.DebugLog(" %s ÑÕÉ«ÏÞÖÆ, ²»¹ºÂò£¡itemID=%s,aucItemColor=%s not in %s" % (i, itemID, aucItemColor, costEquipColorList)) continue if aucItemPlace not in costEquipPlaceList: #GameWorld.DebugLog(" %s ×°±¸Î»ÏÞÖÆ, ²»¹ºÂò£¡itemID=%s,aucItemPlace=%s not in %s" % (i, itemID, aucItemPlace, costEquipPlaceList)) continue if aucItemIsSuit: #Ì××°²»ÔÊÐí×Ô¶¯¹ºÂò #GameWorld.DebugLog(" %s Ì××°, ²»¹ºÂò£¡itemID=%s" % (i, itemID)) continue aucIpyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID) if not aucIpyData: continue buyoutPrice = aucIpyData.GetBuyoutPrice() if not buyoutPrice: #GameWorld.DebugLog(" %s ûÓÐÒ»¿Ú¼Û, ²»¹ºÂò£¡itemID=%s,buyoutPrice=%s" % (i, itemID, buyoutPrice)) continue if curTime > worldAuctionItem.EndTime: #GameWorld.DebugLog(" %s ÅÄÆ·ÒѽáÊø¾º¼Û, ²»¹ºÂò£¡itemID=%s" % (i, itemID)) continue noticeMinutes = aucIpyData.GetNoticeSaleMinutes() if noticeMinutes: addTimeStr = worldAuctionItem.AddTime addTime = GameWorld.ChangeTimeStrToNum(addTimeStr) passMinutes = (curTime - addTime) / 60 if passMinutes < noticeMinutes: #GameWorld.DebugLog(" %s ÅÄÆ·ÉÐ먦·Å¾º¼Û, ²»¹ºÂò£¡itemID=%s" % (i, itemID)) continue aucItemClassLV = worldAuctionItem.ItemClassLV # ±¾½×µÄÖ±½Ó´¦Àí if aucItemClassLV == classLV: autoBuyItemList.append([worldAuctionItem, buyoutPrice]) curRate += unSuitRate buyEquipCostMoney += buyoutPrice GameWorld.DebugLog(" %s ±¾½×ÓÅÏȹºÂò£¡itemID=%s,classLV=%s,curRate=%s,buyoutPrice=%s,buyEquipCostMoney=%s" % (i, itemID, classLV, curRate, buyoutPrice, buyEquipCostMoney)) if curRate >= fullRate: curRate = 100 GameWorld.DebugLog(" ×Ô¶¯¹ºÂò±¾½×¸ÅÂÊÒÑÂú×㣡curRate=%s" % (curRate)) break # ÆäËû½×µÄÐèÒª°´½×µÄÓÅÏȼ¶½øÐд¦Àí else: if aucItemClassLV not in autoBuyOtherClassItemDict: autoBuyOtherClassItemDict[aucItemClassLV] = [] classItemList = autoBuyOtherClassItemDict[aucItemClassLV] classItemList.append([worldAuctionItem, buyoutPrice]) GameWorld.DebugLog(" %s ·Ç±¾½×, Ôݲ»´¦Àí! itemID=%s,aucItemClassLV=%s" % (i, itemID, aucItemClassLV)) # δÂú¸ÅÂÊʱÔÙ¹ºÂòÆäËû½× if curRate < 100: lowClassList, highClassList = [], [] for othClassLV in autoBuyOtherClassItemDict.keys(): if othClassLV <= classLV: lowClassList.append(othClassLV) else: highClassList.append(othClassLV) lowClassList.sort(reverse=True) highClassList.sort() buyClassLVList = lowClassList + highClassList GameWorld.DebugLog("±¾½×¸ÅÂÊδÂú£¬¼ì²é¹ºÂòÆäËû½×! curRate=%s,buyClassLVList=%s" % (curRate, buyClassLVList)) diffClassChangeRatePerInfo = IpyGameDataPY.GetFuncEvalCfg("EquipStarRate", 1) unSuitRateRange = IpyGameDataPY.GetFuncEvalCfg("EquipStarRate", 2) for othClassLV in buyClassLVList: classItemList = autoBuyOtherClassItemDict[othClassLV] for worldAuctionItem, buyoutPrice in classItemList: baseRate = unSuitRate minRate, maxRate = unSuitRateRange costClassLV = worldAuctionItem.ItemClassLV itemID = worldAuctionItem.ItemID #ÍÌ¸ß½× if costClassLV > classLV: diffClassChangeRatePer = diffClassChangeRatePerInfo[0] * (costClassLV - classLV) addRate = int(math.ceil(round(baseRate * (100 + diffClassChangeRatePer) /100.0, 2))) GameWorld.DebugLog(" ÍÌ¸ß½× itemID=%s,costClassLV=%s,classLV=%s,baseRate=%s,diffClassChangeRatePer=%s,addRate=%s" % (itemID, costClassLV, classLV, baseRate, diffClassChangeRatePer, addRate)) #ÍÌµÍ½× elif costClassLV < classLV: diffClassChangeRatePer = diffClassChangeRatePerInfo[1] * (classLV - costClassLV) addRate = int(math.ceil(round(baseRate * (100 - diffClassChangeRatePer) /100.0, 2))) GameWorld.DebugLog(" ÍÌµÍ½× itemID=%s,costClassLV=%s,classLV=%s,baseRate=%s,diffClassChangeRatePer=%s,addRate=%s" % (itemID, costClassLV, classLV, baseRate, diffClassChangeRatePer, addRate)) else: addRate = baseRate addRate = max(minRate, min(addRate, maxRate)) autoBuyItemList.append([worldAuctionItem, buyoutPrice]) curRate += addRate buyEquipCostMoney += buyoutPrice GameWorld.DebugLog(" curRate=%s,buyoutPrice=%s,buyEquipCostMoney=%s" % (curRate, buyoutPrice, buyEquipCostMoney)) if curRate >= fullRate: GameWorld.DebugLog(" ×Ô¶¯¹ºÂò²¹³äÆäËû½×¸ÅÂÊÒÑÂú×㣡curRate=%s" % (curRate)) curRate = 100 break if curRate >= fullRate: break totalCostMoney = lackItemCostMoney + buyEquipCostMoney GameWorld.DebugLog(" lackItemCostMoney=%s,buyEquipCostMoney=%s,totalCostMoney=%s,curRate=%s" % (lackItemCostMoney, buyEquipCostMoney, totalCostMoney, curRate)) if isAutoBuyPreview: __SyncEquipStarAutoBuyCostInfo(curPlayer, classLV, equipPlace, curPartStar, curRate, totalCostMoney) return if curRate < 100: # ×Ô¶¯¹ºÂò±ØÐëÂú¸ÅÂÊ # ÒòΪȷÈϹºÂò²»ÊÇʵʱµÄ£¬ËùÒÔ´æÔÚÅÄÂôÐÐÔ¤ÀÀÏûºÄ×°±¸¿ÉÄܱ»ÆäËûÍæ¼ÒÂò×ßµ¼ÖÂÎÞ·¨Âú¸Ï¿£¬ËùÒÔÕâÀïÐèÒª²¹Í¬²½Ò»´Î __SyncEquipStarAutoBuyCostInfo(curPlayer, classLV, equipPlace, curPartStar, curRate, totalCostMoney) PlayerControl.NotifyCode(curPlayer, "AutoBuyEquipLackEquip") return if playerGoldPaper < totalCostMoney: # ÒòΪȷÈϹºÂò²»ÊÇʵʱµÄ£¬ËùÒÔ´æÔÚÅÄÂôÐÐÔ¤ÀÀÏûºÄµÄ¼Û¸ñÓëʵ¼Ê¹ºÂò¿ÉÄܳöÏÖÏûºÄ¼Û¸ñ²»Ò»ÖµÄÇé¿ö£¬ËùÒÔÕâÀïÐèÒª²¹Í¬²½Ò»´Î __SyncEquipStarAutoBuyCostInfo(curPlayer, classLV, equipPlace, curPartStar, curRate, totalCostMoney) PlayerControl.NotifyCode(curPlayer, "AutoBuyEquipLackMoney", [IPY_PlayerDefine.TYPE_Price_Gold_Paper]) return for worldAuctionItem, buyoutPrice in autoBuyItemList: # ÕâÀïÈÏΪһ¶¨¿ÉÒÔ¹ºÂò³É¹¦£¬²»¶Ô·µ»ØÖµ×ö´¦Àí£¬¼´Ê¹ÎÞ·¨¹ºÂòÒ²ÈÏΪ¹ºÂò³É¹¦£¬Íæ¼ÒµÄÏûºÄÕÕ³£¿Û³ý __DoPlayerBidAuctionItem(curPlayer, worldAuctionItem.ItemGUID, buyoutPrice, tick, False, funcAutoBuyout=True) return classLV, equipPlace, curPartStar, equipPackIndex, curRate, delEquipGUIDDict, delItemInfoDict, lackItemCostMoney, buyEquipCostMoney def __SyncEquipStarAutoBuyCostInfo(curPlayer, classLV, equipPlace, curPartStar, curRate, totalCostMoney): ## ֪ͨ×Ô¶¯¹ºÂòÔ¤ÀÀ½á¹û costInfo = ChPyNetSendPack.tagGCEquipStarAutoBuyCostInfo() costInfo.ClassLV = classLV costInfo.EquipPlace = equipPlace costInfo.CurStar = curPartStar costInfo.CurRate = curRate costInfo.AutoBuyCostMoney = totalCostMoney NetPackCommon.SendFakePack(curPlayer, costInfo) return def __SyncRefreshAuctionItem(auctionItemList): ''' // B5 08 ÅÄÂôÐÐË¢ÐÂÅÄÆ· #tagGCRefreshAuctionItemInfo 1-ÏÉÃËÅÄÆ·×ªÒƵ½È«·þʱ֪ͨ£» 2-ÅÄÆ·ÓÐÈ˾º¼ÛʱˢР''' refreshAuctionItemList = [] for auctionItem in auctionItemList: refreshItem = ChPyNetSendPack.tagGCRefreshAuctionItem() refreshItem.ItemGUID = auctionItem.ItemGUID refreshItem.AuctionType = auctionItem.AuctionType refreshItem.AddTime = auctionItem.AddTime refreshItem.BidderID = auctionItem.BidderID refreshItem.BidderPrice = auctionItem.BidderPrice refreshItem.BiddingTime = auctionItem.BiddingTime refreshAuctionItemList.append(refreshItem) if not refreshAuctionItemList: return clientPack = ChPyNetSendPack.tagGCRefreshAuctionItemInfo() clientPack.RefreshAuctionItemList = refreshAuctionItemList clientPack.RefreshCount = len(clientPack.RefreshAuctionItemList) playerManager = GameWorld.GetPlayerManager() for i in xrange(playerManager.GetActivePlayerCount()): player = playerManager.GetActivePlayerAt(i) if player == None: continue if PlayerControl.GetIsTJG(player): continue NetPackCommon.SendFakePack(player, clientPack) return def __DoGMClearAuctionItem(curPlayer): if curPlayer.GetGMLevel() != 90: return allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList if not allAuctionItemByEndTimeList: GameWorld.DebugAnswer(curPlayer, "µ±Ç°Ã»ÓÐÅÄÆ·!") return endItemList = [] for auctionItem in allAuctionItemByEndTimeList: endItemList.append(auctionItem) clearCount = __EndAuctionItem(endItemList, "GMClear") GameWorld.DebugAnswer(curPlayer, "Çå¿ÕÅÄÆ·Êý=%s" % clearCount) return def __DoGMPrintAuctionItem(curPlayer): if curPlayer.GetGMLevel() != 90: return auctionItemMgr = PyDataManager.GetAuctionItemManager() allAuctionItemByEndTimeList = auctionItemMgr.allAuctionItemByEndTimeList GameWorld.DebugLog("TimeList×ÜÅÄÆ·Êý: =%s" % len(allAuctionItemByEndTimeList)) for i, auctionItem in enumerate(allAuctionItemByEndTimeList): GameWorld.DebugLog(" i=%s, %s" % (i, __GetAuctionItemDRDict(auctionItem))) GameWorld.DebugLog("AllDict×ÜÅÄÆ·Êý: %s" % len(auctionItemMgr.allAuctionItemDict)) GameWorld.DebugLog("È«·þÅÄÆ·¸öÊý: %s" % len(auctionItemMgr.worldAuctionItemList)) GameWorld.DebugLog("ϵͳһ¿Ú¼ÛÅÄÆ·¸öÊý: %s" % len(auctionItemMgr.sysBuyoutItemByTimeList)) for familyID, familyItemList in auctionItemMgr.familyAuctionItemDict.items(): GameWorld.DebugLog("ÏÉÃËÅÄÆ·¸öÊý: familyID=%s, %s" % (familyID, len(familyItemList))) for playerID, myItemList in auctionItemMgr.myAuctionItemDict.items(): GameWorld.DebugLog("Íæ¼ÒÅÄÆ·¸öÊý: playerID=%s, %s" % (playerID, len(myItemList))) for playerID, nowBiddingItemList in auctionItemMgr.nowBiddingAuctionItemDict.items(): GameWorld.DebugLog("Íæ¼Ò×î¸ß¾º¼ÛÅÄÆ·¸öÊý: playerID=%s, %s" % (playerID, len(nowBiddingItemList))) for playerID, hisBiddingItemList in auctionItemMgr.hisBiddingAuctionItemDict.items(): GameWorld.DebugLog("Íæ¼ÒÀúÊ·¾º¼ÛÅÄÆ·¸öÊý: playerID=%s, %s" % (playerID, len(hisBiddingItemList))) for playerID, attentionItemList in auctionItemMgr.myAttentionItemDict.items(): GameWorld.DebugLog("Íæ¼Ò¹Ø×¢ÅÄÆ·¸öÊý: playerID=%s, %s" % (playerID, len(attentionItemList))) return #// B5 10 ÅÄÂôÐвéѯÅÄÂôÖеÄÎïÆ· #tagCGQueryAuctionItem # #struct tagCGQueryAuctionItem #{ # tagHead Head; # BYTE Job; //¹ýÂËÖ°Òµ£¬0Ϊ²»ÏÞÖÆ # BYTE ItemTypeCount; # DWORD ItemTypeList[ItemTypeCount]; //Ö¸¶¨µÄÎïÆ·ÀàÐÍ # BYTE ClassLV; //¹ýÂ˽×Êý£¬0Ϊ²»ÏÞÖÆ # BYTE SpecItemIDCount; //Ö¸¶¨ÎïÆ·ID¸öÊý # DWORD SpecItemIDList[SpecItemIDCount]; //Ö¸¶¨ÎïÆ·ID # char FromItemGUID[40]; //´ÓÄĸöÎïÆ·¿ªÊ¼²éѯ # BYTE QueryDir; //²éѯ·½Ïò£¬1-Íùºó²é£¬2-Íùǰ²é # BYTE QueryCount; //²éѯ¸öÊý£¬0Ϊȫ²¿ #}; def OnQueryAuctionItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) job = clientData.Job itemTypeList = clientData.ItemTypeList classLV = clientData.ClassLV specItemIDList = clientData.SpecItemIDList fromItemGUID = clientData.FromItemGUID queryDir = clientData.QueryDir queryCount = clientData.QueryCount __Sync_WorldAuctionItemQueryResult(curPlayer, job, itemTypeList, classLV, specItemIDList, fromItemGUID, queryDir, queryCount) return #// B5 17 ÅÄÂôÐвéѯ¶¨Î»Ä¿±êÅÄÆ· #tagCGQueryTagAuctionItem # #struct tagCGQueryTagAuctionItem #{ # tagHead Head; # char ItemGUID[40]; # DWORD ItemID; #}; def OnQueryTagAuctionItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) tagItemGUID = clientData.ItemGUID queryDir = 3 __Sync_WorldAuctionItemQueryResult(curPlayer, fromItemGUID=tagItemGUID, queryDir=queryDir, isNotify=True) return def __Sync_WorldAuctionItemQueryResult(curPlayer, job=0, itemTypeList=[], classLV=0, specItemIDList=[], fromItemGUID="", queryDir=1, queryCount=10, isNotify=False): ## ¸ù¾Ý¹ýÂËÌõ¼þͬ²½È«·þÅÄÆ·ÁÐ±í£¬Ä¿Ç°½öÈ«·þÅÄÆ·ÐèҪͨ¹ý²éѯ·þÎñÆ÷»ñµÃ£¬¸öÈËÅÄÆ·¼°ÏÉÃËÅÄÆ·ÓÉÓÚ¸öÊý½ÏÉÙÖ±½ÓÓÉÉÏÏß»ò±ä¸üʱÖ÷¶¯Í¬²½ fromAuctionItem = None if fromItemGUID: fromAuctionItem = GetAuctionItem(fromItemGUID) if not fromAuctionItem: GameWorld.DebugLog("²éѯµÄÄ¿±êÅÄÆ·²»´æÔÚ! fromItemGUID=%s" % fromItemGUID) if isNotify: PlayerControl.NotifyCode(curPlayer, "Paimai5") return # {(job, (itemType, ...), itemClassLV, (itemID, ...)):[tagDBAuctionItem, ...], ...} queryKey = (job, tuple(itemTypeList), classLV, tuple(specItemIDList)) auctionItemMgr = PyDataManager.GetAuctionItemManager() worldAuctionItemQueryDict = auctionItemMgr.worldAuctionItemQueryDict if queryKey not in worldAuctionItemQueryDict: # ÔØÈë¶ÔÓ¦²éѯÌõ¼þÅÄÆ·»º´æ auctionItemQueryList = [] for worldAuctionItem in auctionItemMgr.worldAuctionItemList: if job and worldAuctionItem.ItemJobLimit != job and worldAuctionItem.ItemJobLimit: continue if itemTypeList and worldAuctionItem.ItemType not in itemTypeList: continue if classLV and worldAuctionItem.ItemClassLV != classLV: continue if specItemIDList and worldAuctionItem.ItemID not in specItemIDList: continue auctionItemQueryList.append(worldAuctionItem) worldAuctionItemQueryDict[queryKey] = auctionItemQueryList else: auctionItemQueryList = worldAuctionItemQueryDict[queryKey] queryTotalCount = len(auctionItemQueryList) fromIndex = 0 if fromAuctionItem: if fromAuctionItem not in auctionItemQueryList: GameWorld.ErrLog("²éѯµÄÄ¿±êÅÄÆ·²»ÔÚËùÔڵĹýÂ˵ÄÌõ¼þÀï! fromItemGUID=%s" % fromItemGUID) if isNotify: PlayerControl.NotifyCode(curPlayer, "Paimai5") return fromIndex = auctionItemQueryList.index(fromAuctionItem) # Ïòǰ²é£¬ÆäËûµÄĬÈÏÏòºó²é if queryDir == 2: startIndex = max(0, fromIndex - queryCount + 1) syncItemList = auctionItemQueryList[startIndex:fromIndex + 1] queryRemainlCount = startIndex # Ïòºó²é else: syncItemList = auctionItemQueryList[fromIndex:fromIndex + queryCount] queryRemainlCount = max(0, queryTotalCount - fromIndex - queryCount) clientPack = ChPyNetSendPack.tagGCAuctionItemInfo() clientPack.Job = job clientPack.ItemTypeList = itemTypeList clientPack.ItemTypeCount = len(clientPack.ItemTypeList) clientPack.ClassLV = classLV clientPack.SpecItemIDList = specItemIDList clientPack.SpecItemIDCount = len(clientPack.SpecItemIDList) clientPack.FromItemGUID = fromItemGUID clientPack.QueryDir = queryDir clientPack.QueryCount = queryCount clientPack.QueryRemainlCount = queryRemainlCount clientPack.AuctionItemList = [] for auctionItem in syncItemList: itemInfo = ChPyNetSendPack.tagGCAuctionItem() itemInfo.ItemGUID = auctionItem.ItemGUID itemInfo.FamilyID = auctionItem.FamilyID itemInfo.ItemID = auctionItem.ItemID itemInfo.ItemCount = auctionItem.Count itemInfo.AddTime = auctionItem.AddTime itemInfo.BidderPrice = auctionItem.BidderPrice itemInfo.BiddingTime = auctionItem.BiddingTime itemInfo.UserData = auctionItem.UserData itemInfo.UserDataLen = auctionItem.UserDataLen clientPack.AuctionItemList.append(itemInfo) clientPack.AuctionItemCount = len(clientPack.AuctionItemList) NetPackCommon.SendFakePack(curPlayer, clientPack) return #// B5 12 ÅÄÂôÐвéѯÅÄÂô¼Ç¼ #tagCGQueryAuctionRecord # #struct tagCGQueryAuctionRecord #{ # tagHead Head; # BYTE RecordType; //¼Ç¼ÀàÐÍ 0-ÎÒµÄÅÄÆ·¼Ç¼ 1-ÏÉÃËÅÄÆ·¼Ç¼ 2-ÎҵľºÅļǼ #}; def OnQueryAuctionRecord(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) recordType = clientData.RecordType Sync_PlayerAuctionRecordInfo(curPlayer, recordType, None, curPlayer.GetFamilyID()) return #// B5 16 ÅÄÂôÐвéѯ¹Ø×¢ÖеÄÅÄÆ· #tagCGQueryAttentionAuctionItem # #struct tagCGQueryAttentionAuctionItem #{ # tagHead Head; #}; def OnQueryAttentionAuctionItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() auctionItemMgr = PyDataManager.GetAuctionItemManager() myAttentionItemDict = auctionItemMgr.myAttentionItemDict if playerID in myAttentionItemDict: attentionItemList = myAttentionItemDict[playerID] else: attentionItemList = [] attentionMgr = PyDataManager.GetAuctionAttentionManager() attentionItemIDList = GetPlayerAuctionAttention(attentionMgr, playerID) if attentionItemIDList: for auctionItem in auctionItemMgr.worldAuctionItemList: if auctionItem.ItemID not in attentionItemIDList: continue attentionItemList.append(auctionItem) myAttentionItemDict[playerID] = attentionItemList clientPack = ChPyNetSendPack.tagGCAttentionAuctionItemInfo() clientPack.AuctionItemList = [] for attentionItem in attentionItemList: itemObj = ChPyNetSendPack.tagGCAttentionAuctionItem() itemObj.ItemGUID = attentionItem.ItemGUID itemObj.FamilyID = attentionItem.FamilyID itemObj.ItemID = attentionItem.ItemID itemObj.ItemCount = attentionItem.Count itemObj.AddTime = attentionItem.AddTime itemObj.BidderPrice = attentionItem.BidderPrice itemObj.BiddingTime = attentionItem.BiddingTime itemObj.UserData = attentionItem.UserData itemObj.UserDataLen = attentionItem.UserDataLen clientPack.AuctionItemList.append(itemObj) clientPack.AuctionItemCount = len(clientPack.AuctionItemList) NetPackCommon.SendFakePack(curPlayer, clientPack) return #// B5 18 ÅÄÂôÐÐÐ޸ĹØ×¢ÎïÆ· #tagCGAttentionAuctionItemChange # #struct tagCGAttentionAuctionItemChange #{ # tagHead Head; # DWORD ItemID; # BYTE IsAttention; //ÊÇ·ñ¹Ø×¢£¬È¡Ïû¹Ø×¢·¢0 #}; def OnAttentionAuctionItemChange(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() itemID = clientData.ItemID isAttention = clientData.IsAttention attentionMgr = PyDataManager.GetAuctionAttentionManager() if isAttention: if not AddPlayerAuctionAttention(attentionMgr, playerID, itemID): return else: if not DelPlayerAuctionAttention(attentionMgr, playerID, itemID): return Sync_PlayerAttentionAuctionItemID(curPlayer, True) # ¹Ø×¢ÐÅÏ¢±ä¸ü£¬Çå¿Õ¹Ø×¢ÅÄÆ·ÊµÀý»º´æ auctionItemMgr = PyDataManager.GetAuctionItemManager() auctionItemMgr.myAttentionItemDict.pop(playerID, None) return def Sync_FamilyAuctionItemInfo(curPlayer, familyID, itemInfoList=[]): # // B5 05 ÅÄÂôÐÐÏÉÃËÅÄÂôÖеÄÎïÆ·ÐÅÏ¢ #tagGCFamilyAuctionItemInfo if not familyID: return if not itemInfoList: itemInfoList = GetFamilyAuctionItemList(familyID) if not itemInfoList: return itemInfoPack = ChPyNetSendPack.tagGCFamilyAuctionItemInfo() itemInfoPack.AuctionItemList = [] for auctionItem in itemInfoList: packItem = ChPyNetSendPack.tagGCFamilyAuctionItem() packItem.ItemGUID = auctionItem.ItemGUID packItem.FamilyID = auctionItem.FamilyID packItem.ItemID = auctionItem.ItemID packItem.ItemCount = auctionItem.Count packItem.AddTime = auctionItem.AddTime packItem.BidderPrice = auctionItem.BidderPrice packItem.BiddingTime = auctionItem.BiddingTime packItem.UserData = auctionItem.UserData packItem.UserDataLen = auctionItem.UserDataLen packItem.FamilyPlayerIDInfo = auctionItem.FamilyPlayerIDInfo packItem.FamilyPlayerIDLen = auctionItem.FamilyPlayerIDLen packItem.AuctionType = auctionItem.AuctionType itemInfoPack.AuctionItemList.append(packItem) itemInfoPack.AuctionItemCount = len(itemInfoPack.AuctionItemList) if curPlayer: NetPackCommon.SendFakePack(curPlayer, itemInfoPack) else: PlayerFamily.SendFamilyFakePack(familyID, itemInfoPack) return def Sync_PlayerAuctionItemInfo(curPlayer, auctionItem=None): # // B5 02 ÅÄÂôÐÐÍæ¼ÒÅÄÂôÖеÄÎïÆ·ÐÅÏ¢ #tagGCPlayerAuctionItemInfo if auctionItem: syncItemList = [auctionItem] else: syncItemList = GetPlayerAuctionItemList(curPlayer.GetPlayerID()) if not syncItemList: return itemInfoPack = ChPyNetSendPack.tagGCPlayerAuctionItemInfo() itemInfoPack.AuctionItemList = [] for auctionItem in syncItemList: packItem = ChPyNetSendPack.tagGCPlayerAuctionItem() packItem.ItemGUID = auctionItem.ItemGUID packItem.FamilyID = auctionItem.FamilyID packItem.ItemID = auctionItem.ItemID packItem.ItemCount = auctionItem.Count packItem.AddTime = auctionItem.AddTime packItem.BidderPrice = auctionItem.BidderPrice packItem.BiddingTime = auctionItem.BiddingTime packItem.UserData = auctionItem.UserData packItem.UserDataLen = auctionItem.UserDataLen itemInfoPack.AuctionItemList.append(packItem) itemInfoPack.AuctionItemCount = len(itemInfoPack.AuctionItemList) NetPackCommon.SendFakePack(curPlayer, itemInfoPack) return def Sync_PlayerAuctionRecordInfo(curPlayer, recordType, newRecordData=None, familyID=0): ## B5 03 ÅÄÂôÐÐÍæ¼ÒÅÄÂô¼Ç¼ #tagGCPlayerAuctionRecordInfo if recordType == AuctionRecordType_MyAuction and curPlayer: syncRecordList = [newRecordData] if newRecordData else GetMyAuctionItemRecord(curPlayer.GetPlayerID()) elif recordType == AuctionRecordType_FamilyAuction and familyID: syncRecordList = [newRecordData] if newRecordData else GetFamilyAuctionItemRecord(familyID) elif recordType == AuctionRecordType_MyBid and curPlayer: syncRecordList = [newRecordData] if newRecordData else GetMyBiddingItemRecord(curPlayer.GetPlayerID()) else: return clientPack = ChPyNetSendPack.tagGCPlayerAuctionRecordInfo() clientPack.AuctionRecordList = [] for recordData in syncRecordList: record = ChPyNetSendPack.tagGCPlayerAuctionRecord() record.ItemGUID = recordData.ItemGUID record.FamilyID = recordData.FamilyID record.RecordType = recordData.RecordType record.RecordResult = recordData.RecordResult record.RecordTime = recordData.RecordTime record.BidderPrice = recordData.BidderPrice record.BidderName = recordData.BidderName record.ItemID = recordData.ItemID record.ItemCount = recordData.Count record.UserData = recordData.UserData record.UserDataLen = recordData.UserDataLen clientPack.AuctionRecordList.append(record) clientPack.Count = len(clientPack.AuctionRecordList) if curPlayer: NetPackCommon.SendFakePack(curPlayer, clientPack) elif familyID and recordType == AuctionRecordType_FamilyAuction: PlayerFamily.SendFamilyFakePack(familyID, clientPack) return def Sync_PlayerBiddingItemInfo(curPlayer, auctionItem=None): #// B5 10 ÅÄÂôÐÐÍæ¼Ò¾º¼ÛÖеÄÎïÆ·ÐÅÏ¢ #tagGCBiddingItemInfo # ÉÏÏßͬ²½¡¢Íæ¼ÒÏà¹ØµÄ¾º¼ÛÅÄÆ·¾º¼Û±ä¸üʱͬ²½ if auctionItem: syncItemList = [auctionItem] else: playerID = curPlayer.GetPlayerID() auctionItemMgr = PyDataManager.GetAuctionItemManager() nowBiddingAuctionItemList = auctionItemMgr.nowBiddingAuctionItemDict.get(playerID, []) hisBiddingAuctionItemList = auctionItemMgr.hisBiddingAuctionItemDict.get(playerID, []) syncItemList = nowBiddingAuctionItemList + hisBiddingAuctionItemList if not syncItemList: return itemInfoPack = ChPyNetSendPack.tagGCBiddingItemInfo() itemInfoPack.AuctionItemList = [] for auctionItem in syncItemList: packItem = ChPyNetSendPack.tagGCBiddingItem() packItem.ItemGUID = auctionItem.ItemGUID packItem.FamilyID = auctionItem.FamilyID packItem.ItemID = auctionItem.ItemID packItem.ItemCount = auctionItem.Count packItem.AddTime = auctionItem.AddTime packItem.BidderID = auctionItem.BidderID packItem.BidderPrice = auctionItem.BidderPrice packItem.BiddingTime = auctionItem.BiddingTime packItem.UserData = auctionItem.UserData packItem.UserDataLen = auctionItem.UserDataLen itemInfoPack.AuctionItemList.append(packItem) itemInfoPack.AuctionItemCount = len(itemInfoPack.AuctionItemList) NetPackCommon.SendFakePack(curPlayer, itemInfoPack) return def Sync_PlayerAttentionAuctionItemID(curPlayer, isForce=False): # // B5 07 ÅÄÂôÐйØ×¢µÄÎïÆ·ID #tagGCAttentionAuctionItemID attentionMgr = PyDataManager.GetAuctionAttentionManager() attentionItemIDList = GetPlayerAuctionAttention(attentionMgr, curPlayer.GetPlayerID()) if not attentionItemIDList and not isForce: return clientPack = ChPyNetSendPack.tagGCAttentionAuctionItemID() clientPack.AttentionItemIDList = attentionItemIDList clientPack.AttentionCount = len(clientPack.AttentionItemIDList) NetPackCommon.SendFakePack(curPlayer, clientPack) 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 def DoAddFamilyAuctionItem(mapID, familyAuctionItemDict): ''' ÉϼÜÏÉÃËÅÄÆ·£¬ÒòΪÏÉÃËÅÄÆ·Ä¬ÈÏÉϼܣ¬ËùÒÔʹÓÃÅúÁ¿ÉÏ¼Ü @param familyAuctionItemDict: {ÏÉÃËID:[[ÏíÊÜÊÕÒæµÄ³ÉÔ±ID, ...], [[ÅÄÆ·ID,¸öÊý], [ÅÄÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...]], ...} ''' GameWorld.Log("·¢Ë͵ØÍ¼ÉϼÜÏÉÃËÅÄÆ·: mapID=%s, %s" % (mapID, familyAuctionItemDict)) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AddFamilyAuctionItem, [mapID, familyAuctionItemDict]) return def DoAddSystemAuctionItem(sysAuctionItemList): ''' ÉϼÜϵͳÅÄÆ· @param sysAuctionItemList: [ÎïÆ·ID, [½×,ÑÕÉ«,[²¿Î», ...],ÊÇ·ñÌ××°,ÐǼ¶,[¿ÉÑ¡²ÎÊýÖ°Òµ, ...]], ...] ''' mapID = ChConfig.Def_FBMapID_MainCity GameWorld.Log("·¢Ë͵ØÍ¼ÉϼÜϵͳÅÄÆ·: mapID=%s, %s" % (mapID, sysAuctionItemList)) GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AddSystemAuctionItem, [mapID, sysAuctionItemList]) return