From e671cc640668d05194dc7a6bc13427a4f70ed1c6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 23 七月 2019 21:12:58 +0800
Subject: [PATCH] 8154 【后端】【主干】【300】拍卖行优化(系统中间商自动回购并上架一件新装备支持)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                |    2 
 ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py                                     |    1 
 ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/JobPlayerCount.py                     |   74 ++++++++++++++
 ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py                                |   32 ++++++
 ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py                                  |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py |    2 
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py                    |  181 ++++++++++++++++++++++++++++++++++-
 7 files changed, 284 insertions(+), 9 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/JobPlayerCount.py b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/JobPlayerCount.py
new file mode 100644
index 0000000..2b062d8
--- /dev/null
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/JobPlayerCount.py
@@ -0,0 +1,74 @@
+#!/usr/bin/python
+# -*- coding: GBK -*-
+#-------------------------------------------------------------------------------
+#
+##@package GM.Commands.JobPlayerCount
+#
+# @todo:职业人数信息
+# @author hxp
+# @date 2019-07-23
+# @version 1.0
+#
+# 详细描述: 职业人数信息
+#
+#-------------------------------------------------------------------------------
+#"""Version = 2019-07-23 21:00"""
+#-------------------------------------------------------------------------------
+
+import GameWorld
+import PyGameData
+import IpyGameDataPY
+import time
+
+
+## 执行逻辑
+#  @param curPlayer 当前玩家
+#  @param gmList []
+#  @return None
+def OnExec(curPlayer, gmList):
+    
+    if not gmList:
+        GameWorld.DebugAnswer(curPlayer, "重置人数: JobPlayerCount 0")
+        GameWorld.DebugAnswer(curPlayer, "设置24小时职业对应人数: ")
+        GameWorld.DebugAnswer(curPlayer, "JobPlayerCount 职业1 人数 职业2 人数")
+        __PrintJobPlayerCount(curPlayer)
+        return
+    
+    if len(gmList) == 1 and gmList[0] == 0:
+        PyGameData.g_onedayJobPlayerLoginoffTimeDict = {}
+        GameWorld.DebugAnswer(curPlayer, "重置职业人数成功! ")
+        __PrintJobPlayerCount(curPlayer)
+        return
+    
+    if len(gmList) % 2 == 0:
+        while gmList:
+            job = gmList[0]
+            count = gmList[1]
+            gmList = gmList[2:]
+            if job not in PyGameData.g_onedayJobPlayerLoginoffTimeDict:
+                PyGameData.g_onedayJobPlayerLoginoffTimeDict[job] = {}
+            jobPlayerDict = PyGameData.g_onedayJobPlayerLoginoffTimeDict[job]
+            curCount = len(jobPlayerDict)
+            if curCount > count:
+                playerIDList = jobPlayerDict.keys()
+                for popPlayerID in playerIDList[:curCount - count]:
+                    jobPlayerDict.pop(popPlayerID)
+            elif curCount < count:
+                for i in range(count - curCount):
+                    jobPlayerDict[100 + curCount + 1 + i] = int(time.time())
+            else:
+                pass
+        GameWorld.DebugAnswer(curPlayer, "设置职业人数成功! ")
+        __PrintJobPlayerCount(curPlayer)
+                    
+    return
+
+def __PrintJobPlayerCount(curPlayer):
+    openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1)
+    GameWorld.DebugAnswer(curPlayer, "当前: ")
+    for job in openJobList:
+        GameWorld.DebugAnswer(curPlayer, "职业%s  人数: %s" % (job, len(PyGameData.g_onedayJobPlayerLoginoffTimeDict.get(job, {}))))
+    return
+
+
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
index 8f155b3..17d1fa8 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -27,6 +27,7 @@
 import PlayerBourse
 import PlayerFamily
 import ShareDefine
+import PyGameData
 import ChConfig
 
 import random
@@ -221,6 +222,16 @@
     return
 
 ##-------------------------------------------------------------------------------------------------
+def OnGameServerInitOK():
+    ## 服务器启动成功
+    
+    allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList
+    # 由于服务器未启动成功时取不到正确的开服天,所以启动成功后刷新一下拍品系统回购时间
+    for auctionItem in allAuctionItemByEndTimeList:
+        __SetAuctionItemSysBuyTime(auctionItem)
+        
+    __SortAuctionitem()
+    return
 
 def OnLoadAuctionItemDataEx(dbData):
     ## 加载拍卖物品表时附加处理
@@ -270,9 +281,65 @@
     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 == 1:
+        #GameWorld.DebugLog("该拍品为套装拍品,不设置系统一口价时间! itemID=%s" % (itemID))
+        return
+    
+    if auctionItem.BidderID:
+        #GameWorld.DebugLog("该拍品已经有人竞价,不设置系统一口价时间! itemID=%s,bidderID=%s" % (itemID, auctionItem.BidderID))
+        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值
@@ -470,6 +537,9 @@
 
 def OnAuctionItemTimeProcess(curTime, tick):
     ## 拍卖行拍品定时处理,每秒触发一次
+    
+    __DoSysBuyoutItemByTime(curTime)
+    
     allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList
     if not allAuctionItemByEndTimeList:
         return
@@ -497,6 +567,88 @@
     __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, {}))
+            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):
     ## 仙盟拍品转移到全服
@@ -569,6 +721,7 @@
     if isSortWorldItem:
         auctionItemMgr.worldAuctionItemList.sort(key=operator.attrgetter("Sortpriority", "AddTime"))
         auctionItemMgr.worldAuctionItemQueryDict = {} # 重置全服拍品条件查询,下次有玩家查询时再重新刷新
+        auctionItemMgr.sysBuyoutItemByTimeList.sort(key=operator.attrgetter("SysBuyTime"))
     return
 
 def __EndAuctionItem(endItemList, endEvent):
@@ -593,15 +746,16 @@
         bidderPrice = auctionItem.BidderPrice # 当前竞价,有人竞价的话代表竞拍成功
         endType = ""
         # 有人竞价,成交
-        if bidderID and bidderPrice:
+        if bidderPrice:
             endType = "OK"
             
             # 竞拍成功邮件,发放物品
-            paramList = [bidderPrice]
-            detail = {"ItemGUID":itemGUID}
-            addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":False, "UserData":auctionItem.UserData}]
-            PlayerCompensation.SendMailByKey("PaimaiMail3", [bidderID], addItemList, paramList, detail=detail)
-            AddAuctionRecord(auctionItem, AuctionRecordResult_BidOK)
+            if bidderID:
+                paramList = [bidderPrice]
+                detail = {"ItemGUID":itemGUID}
+                addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":False, "UserData":auctionItem.UserData}]
+                PlayerCompensation.SendMailByKey("PaimaiMail3", [bidderID], addItemList, paramList, detail=detail)
+                AddAuctionRecord(auctionItem, AuctionRecordResult_BidOK)
             
             # 拍卖成功收益,都以玩家收益向上取整
             if familyID and auctionItem.FamilyPlayerIDInfo:
@@ -686,6 +840,9 @@
             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)
@@ -1077,6 +1234,10 @@
     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")
     else:
@@ -1152,9 +1313,12 @@
     for i, auctionItem in enumerate(allAuctionItemByEndTimeList):
         GameWorld.DebugLog("    i=%s, %s" % (i, __GetAuctionItemDRDict(auctionItem)))
         
-    GameWorld.DebugLog("AllDict总拍品数: =%s" % len(auctionItemMgr.allAuctionItemDict))
+    GameWorld.DebugLog("AllDict总拍品数: %s" % len(auctionItemMgr.allAuctionItemDict))
     
-    GameWorld.DebugLog("全服拍品个数: =%s" % len(auctionItemMgr.worldAuctionItemList))
+    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)))
         
@@ -1545,6 +1709,7 @@
 
 def DoAddSystemAuctionItem(sysAuctionItemList):
     ''' 上架系统拍品
+    @param sysAuctionItemList: [物品ID, [阶,颜色,[部位, ...],是否套装,星级,[可选参数职业, ...]], ...]
     '''
     mapID = ChConfig.Def_FBMapID_MainCity
     GameWorld.Log("发送地图上架系统拍品: mapID=%s, %s" % (mapID, sysAuctionItemList))
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index bebae61..66ff9ca 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -125,6 +125,7 @@
     GameLogInfo.Set_Server_Hour()
     
     PlayerFamily.FamilyOnHour()
+    ChPlayer.CheckOnedayJobPlayerLoginoffTimeout()
     return
 
 ## 触发每日事件(参数 -> 当前时间)
@@ -1253,6 +1254,7 @@
         GameWorld.Log("服务器启动成功: ServerGroupID=%s" % serverGroupID)
     GameWorld.GetGameWorld().SetDict(ChConfig.Def_WorldKey_GameWorldInitOK, 1)
     
+    AuctionHouse.OnGameServerInitOK()
     # 注意:跨服相关信息的调用需放在最后,不然可能导致服务器未启动功能或者功能未加载成功导致跨服服务器与子服之间的数据同步可能出现异常的情况
     CrossRealmMsg.OnGameServerInitOK()
     return
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
index 12d0d56..57b01ad 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/ChPlayer.py
@@ -128,6 +128,7 @@
     #玩家队伍初始化
     PlayerTeam.OnPlayerLoginRefreshTeam(curPlayer, tick)
     PlayerCompensation.NotifyPlayerCompensation(curPlayer)
+    __UpdOnedayJobPlayerLoginoffTime(curPlayer)
     
     if not PlayerControl.GetIsTJG(curPlayer):
         # 只有通知逻辑的应该放此处减少IO,如有逻辑处理存储等不可放在此处
@@ -189,6 +190,36 @@
         #骑宠boss状态通知
         PlayerHorsePetBoss.OnLogin(curPlayer)
         GMT_CTG.OnPlayerLogin(curPlayer)
+    return
+
+def __UpdOnedayJobPlayerLoginoffTime(curPlayer):
+    ## 更新一天内职业对应玩家登录、离线时间
+    job = curPlayer.GetJob()
+    playerID = curPlayer.GetPlayerID()
+    if job not in PyGameData.g_onedayJobPlayerLoginoffTimeDict:
+        PyGameData.g_onedayJobPlayerLoginoffTimeDict[job] = {}
+    playerLoginoffTimeDict = PyGameData.g_onedayJobPlayerLoginoffTimeDict[job]
+    playerLoginoffTimeDict[playerID] = int(time.time())
+    #GameWorld.DebugLog("更新职业对应玩家登录离线时间: %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict)
+    return
+
+def CheckOnedayJobPlayerLoginoffTimeout():
+    ## 检查一天内职业对应玩家登录、离线时间超时玩家,每小时检查一次
+    
+    maxTime = 24 * 3600 # 暂定24小时
+    curTime = int(time.time())
+    #GameWorld.DebugLog("处理24小时内在线的角色职业玩家: curTime=%s,maxTime=%s, %s" % (curTime, maxTime, PyGameData.g_onedayJobPlayerLoginoffTimeDict))
+    
+    playerManager = GameWorld.GetPlayerManager()
+    for playerDict in PyGameData.g_onedayJobPlayerLoginoffTimeDict.values():
+        for playerID, loginoffTime in playerDict.items():
+            if playerManager.FindPlayerByID(playerID):
+                #GameWorld.DebugLog("    在线不处理, playerID=%s" % playerID)
+                continue
+            if curTime - loginoffTime > maxTime:
+                playerDict.pop(playerID)
+                #GameWorld.DebugLog("    超时玩家,移除! playerID=%s,loginoffTime=%s" % (playerID, loginoffTime))
+    #GameWorld.DebugLog("    处理完毕,剩余玩家! %s" % PyGameData.g_onedayJobPlayerLoginoffTimeDict)
     return
 
 ## 增加高手玩家上线广播
@@ -505,6 +536,7 @@
     PlayerFamily.PlayerLogoffRefreshFamily(curPlayer, tick)
     PlayerFriend.OnPlayerDisconnect(curPlayer, tick)
     
+    __UpdOnedayJobPlayerLoginoffTime(curPlayer)
     PlayerGeTui.NewGuyCallBackGeTui(curPlayer, tick)
     # 设置家族成员离线时间
     SetPlayerOfflineTime(curPlayer)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
index e45663f..0772738 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyDataManager.py
@@ -163,6 +163,7 @@
         self.worldAuctionItemList = [] # 全服拍品列表缓存 [tagDBAuctionItem, ...]
         self.worldAuctionItemQueryDict = {} # 全服拍品过滤查询缓存,添加拍品时重置 {(job, (itemType, ...), itemClassLV, (itemID, ...)):[tagDBAuctionItem, ...], ...}
         self.familyAuctionItemDict = {} # 仙盟拍品列表缓存,包含转移到全服的仙盟拍品 {familyID:[tagDBAuctionItem, ...], ...}
+        self.sysBuyoutItemByTimeList = [] # 系统一口价拍品按时间排序缓存 [tagDBAuctionItem, ...]
         
         self.nowBiddingAuctionItemDict = {} # 玩家当前是最高竞价的拍品,含所有拍品 {playerID:[tagDBAuctionItem, ...], ...}
         self.hisBiddingAuctionItemDict = {} # 玩家曾经参与过竞价的拍品,含所有拍品 {playerID:[tagDBAuctionItem, ...], ...}
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
index c5a7150..a330db4 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/PyGameData.py
@@ -68,6 +68,7 @@
 
 g_todayPlayerLVDict = {} #今日玩家等级字典 {playerID:lv,..}
 g_yesterdayPlayerLVDict = {} #昨日玩家等级字典{playerID:lv,..}
+g_onedayJobPlayerLoginoffTimeDict = {} #近24小时登录/离线的玩家职业数 {职业:{playerID:loginoffTime, ...}}
 
 g_ctgOfflinePlayerInfo = {} # {playerID:[[ctgInfo], ...], ...} # 离线玩家CTG信息缓存
 g_gmtOfflinePlayerInfo = {} # {(queryType, playerFind):[gmtInfo, ...], ...} # 离线玩家GMT信息缓存
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py
index 3260143..666237d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py
@@ -208,7 +208,7 @@
 
 def DoAddSystemAuctionItem(sysAuctionItemList):
     ''' 上架系统拍品
-    @param sysAuctionItemList: [物品ID, [阶,颜色,[部位, ...],是否套装,星级]]
+    @param sysAuctionItemList: [物品ID, [阶,颜色,[部位, ...],是否套装,星级,[可选参数职业, ...]], ...]
     '''
     GameWorld.Log("上架系统拍品: %s" % sysAuctionItemList)
     

--
Gitblit v1.8.0