From bd2e571ccdb5b0c7d9c1cadab3ba0996c26c9d38 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 27 九月 2019 18:49:30 +0800
Subject: [PATCH] 8280 【主干】拍卖行系统上架优化(服务器可动态根据配置动态补充拍品)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py |  203 ++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 154 insertions(+), 49 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
index fd99fd1..c1a2563 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -248,6 +248,7 @@
     
     if dbData.AuctionType == AuctionType_World:
         pyAuctionItemMgr.worldAuctionItemList.append(dbData)
+        __OnCalcWorldAuctionItemCount(dbData, 1)
         
     if familyID:
         familyItemList = pyAuctionItemMgr.familyAuctionItemDict.get(familyID, [])
@@ -407,6 +408,37 @@
             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"
@@ -435,9 +467,10 @@
         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" 
-                           % (cfgID, startDateStr, endDateStr, startTimeStr, endTimeStr, auctionCount, randMinuteRange))
+        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
@@ -486,10 +519,15 @@
             GameWorld.DebugLog("    添加上架系统拍品时间: nextAddMinutes=%s %s" % (nextAddMinutes, nextAddAuctionItemDatetime))
             addAuctionItemDatetimeList.append(nextAddAuctionItemDatetime)
             
-        if not addAuctionItemDatetimeList:
+        # 动态补充拍品模式
+        if replenishAuctionCount:
+            GameWorld.DebugLog("    添加动态补充系统拍品计划: %s" % replenishAuctionCount)
+        # 指定上架拍品模式
+        elif addAuctionItemDatetimeList:
+            GameWorld.DebugLog("    添加上架系统拍品时间计划: %s" % addAuctionItemDatetimeList)
+        else:
             continue
-        GameWorld.DebugLog("    添加上架系统拍品时间: %s" % addAuctionItemDatetimeList)
-        addSystemAuctionItemInfo.append([cfgID, ipyData, addAuctionItemDatetimeList])
+        addSystemAuctionItemInfo.append([cfgID, ipyData, startDatetime, endDatetime, addAuctionItemDatetimeList])
         
     AuctionSystemItem = IpyGameDataPY.SetConfigEx(key, [reloadSign, addSystemAuctionItemInfo])
     GameWorld.Log("本日系统拍品信息加载完毕!reloadSign=%s" % (reloadSign))
@@ -506,39 +544,98 @@
                                                                     curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format)
     
     randMailKey = ""
-    addItemTick = tick
-    sysAuctionItemList = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemList") # 系统等待上架的拍品列表
-    if not sysAuctionItemList:
-        sysAuctionItemList = []
-    addSystemAuctionItemInfo = __GetAuctionSystemItemInfo()
-    for cfgID, ipyData, addAuctionItemDatetimeList in addSystemAuctionItemInfo:
-        if curDateTime not in addAuctionItemDatetimeList:
-            continue
-        #cfgID = ipyData.GetCfgID()
-        addCountWeightList = ipyData.GetItemCountWeightList()
-        auctionItemWeightList = ipyData.GetAuctionItemWeightList()
-        randSecondRange = ipyData.GetAddRandSecondRange()
+    sysAuctionItemListDict = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemListDict") # 系统等待上架的拍品列表字典 {cfgID:[待上架拍品列表], ...}
+    if not sysAuctionItemListDict:
+        sysAuctionItemListDict = {}
         
-        addCount = GameWorld.GetResultByWeightList(addCountWeightList)
-        GameWorld.Log("增加等待上架的系统拍品信息: cfgID=%s,addCount=%s,addItemTick=%s" % (cfgID, addCount, addItemTick))
-        for _ in xrange(addCount):
-            itemInfo = GameWorld.GetResultByWeightList(auctionItemWeightList)
-            if itemInfo != None:
-                randSeconds = 0
-                if len(randSecondRange) == 2:
-                    randSeconds = random.randint(randSecondRange[0], randSecondRange[1])
-                elif len(randSecondRange) == 1:
-                    randSeconds = randSecondRange[0]
-                addItemTick = addItemTick + randSeconds * 1000
-                sysAuctionItemList.append([addItemTick, itemInfo])
-                GameWorld.Log("    增加等待上架的系统拍品: randSeconds=%s,addItemTick=%s,itemInfo=%s" % (randSeconds, addItemTick, itemInfo))
-                
-        randMailKeyList = ipyData.GetRandMailKeyList()
-        if randMailKeyList:
-            randMailKey = random.choice(randMailKeyList)
+    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
             
-    IpyGameDataPY.SetConfigEx("SysWaitAuctionItemList", sysAuctionItemList)
-    #GameWorld.DebugLog("等待系统上架的拍品列表: %s" % sysAuctionItemList)
+        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:
@@ -557,21 +654,26 @@
     return
 
 def __DoSysWaitAddAuctionItem(tick):
-    sysAuctionItemList = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemList") # 系统等待上架的拍品列表
-    if not sysAuctionItemList:
+    SysWaitAuctionItemListDict = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemListDict") # 系统等待上架的拍品列表
+    if not SysWaitAuctionItemListDict:
         return
     
-    doCount = len(sysAuctionItemList)
-    while doCount > 0 and sysAuctionItemList:
-        doCount -= 1
-        addItemTick, itemInfo = sysAuctionItemList[0]
-        if tick < addItemTick:
-            #GameWorld.DebugLog("未到系统等待上架的拍品tick,不处理! tick=%s,sysAuctionItemList=%s" % (tick, sysAuctionItemList))
-            break
-        sysAuctionItemList.pop(0)
-        GameWorld.DebugLog("系统等待上架的拍品tick已到,可上架! tick=%s >= addItemTick=%s,itemInfo=%s,sysAuctionItemList=%s" % (tick, addItemTick, itemInfo, sysAuctionItemList))
-        DoAddSystemAuctionItem([itemInfo])
-        
+    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):
@@ -716,6 +818,7 @@
         
         auctionItemMgr.allAuctionItemByEndTimeList.append(auctionItem)
         auctionItemMgr.worldAuctionItemList.append(auctionItem)
+        __OnCalcWorldAuctionItemCount(auctionItem, 1)
         notifyWorldAddItemList.append([itemGUID, itemID, playerID])
         
         AddAuctionRecord(auctionItem, AuctionRecordResult_MoveToWorld)
@@ -876,6 +979,7 @@
             
         if auctionItem in auctionItemMgr.worldAuctionItemList:
             auctionItemMgr.worldAuctionItemList.remove(auctionItem)
+            __OnCalcWorldAuctionItemCount(auctionItem, -1)
             
         for queryItemList in auctionItemMgr.worldAuctionItemQueryDict.values():
             if auctionItem in queryItemList:
@@ -1085,6 +1189,7 @@
         auctionItemMgr.familyAuctionItemDict[familyID] = familyItemList
     else:
         auctionItemMgr.worldAuctionItemList.append(auctionItem)
+        __OnCalcWorldAuctionItemCount(auctionItem, 1)
         
         # 添加进我的拍卖
         if playerID:

--
Gitblit v1.8.0