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