From 6544af7b584112da8dc482cb29dacfb89d750ba6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 22 七月 2019 19:05:09 +0800
Subject: [PATCH] 8154 【后端】【主干】【300】拍卖行优化(可根据开服天或指定日期上架系统拍品)

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py                                      |   13 ++
 ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py                                  |   44 +++++++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py                |    2 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py        |   14 +-
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py               |    3 
 ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py                                       |    2 
 ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py                                    |    1 
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py |    6 +
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py |   42 +++++++
 PySysDB/PySysDBG.h                                                                               |   16 ++
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py                    |  163 ++++++++++++++++++++++++++
 11 files changed, 296 insertions(+), 10 deletions(-)

diff --git a/PySysDB/PySysDBG.h b/PySysDB/PySysDBG.h
index a28162f..b367f51 100644
--- a/PySysDB/PySysDBG.h
+++ b/PySysDB/PySysDBG.h
@@ -54,6 +54,22 @@
 	BYTE		Sortpriority;	//排序优先级归组
 };
 
+//拍卖行系统拍品表
+
+struct tagAuctionSystemItem
+{
+	DWORD		_CfgID;
+	char		StartDate;	//开启日期
+	char		EndDate;	//结束日期
+	char		StartTime;	//开启时间
+	char		EndTime;	//结束时间
+	BYTE		AuctionCount;	//上架次数
+	list		RandMinuteRange;	//上架随机间隔分钟下限|上限
+	list		ItemCountWeightList;	//上架随机件数权重列表, [[权重, 件数], ...]
+	list		AuctionItemWeightList;	//上架物品随机权重, [[权重, 物品ID],[权重, [阶,颜色,部位集合,是否套装,星级]] ...]
+	list		RandMailKeyList;	//上架随机邮件列表,有配置时上架的时候在线玩家会收到一封上架邮件提醒
+};
+
 //日常活动表
 
 struct tagDailyAction
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
index a0864ca..b680926 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ChConfig.py
@@ -650,6 +650,8 @@
 
 Def_PlayerKey_ViewCrossPKBillboardTick = "ViewCrossPKBillboardTick_%s_%s"  #查询PK排行榜tick,参数(zoneID, seasonID)
 
+#主城地图、缥缈宗
+Def_FBMapID_MainCity = 10010
 #渡劫副本
 Def_FBMapID_DuJie = 31110
 #仙盟联赛
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
index 674e250..d9006e9 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorld.py
@@ -917,6 +917,19 @@
     
     return defValue
 
+## 从列表中产生物品,[[权重, object], ....]
+#  @param weightList 待选列表
+def GetResultByWeightList(weightList):
+    randList = []
+    weight = 0
+    for info in weightList:
+        weight += info[0]
+        randList.append([weight, info[1] if len(info) == 2 else info[1:]])
+    if not randList:
+        return
+    rate = random.randint(1, randList[-1][0])
+    return GetResultByRiseList(randList, rate)
+
 ## 根据字典key获取value值
 #  @return 
 def GetDictValueByKey(attrDict, findKey, defaultValue=None):
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
index 8aa568d..8f155b3 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -21,6 +21,7 @@
 import PyGameDataStruct
 import PlayerCompensation
 import ChPyNetSendPack
+import PlayerDBGSEvent
 import IpyGameDataPY
 import NetPackCommon
 import PlayerBourse
@@ -28,6 +29,8 @@
 import ShareDefine
 import ChConfig
 
+import random
+import datetime
 import operator
 import time
 import math
@@ -326,6 +329,145 @@
             return True
     return False
 
+
+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()
+        
+        GameWorld.DebugLog("cfgID=%s,startDateStr=%s,endDateStr=%s,startTimeStr=%s,endTimeStr=%s,auctionCount=%s,randMinuteRange=%s" 
+                           % (cfgID, startDateStr, endDateStr, startTimeStr, endTimeStr, auctionCount, randMinuteRange))
+        
+        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 not addAuctionItemDatetimeList:
+            continue
+        GameWorld.DebugLog("    添加上架系统拍品时间: %s" % addAuctionItemDatetimeList)
+        addSystemAuctionItemInfo.append([cfgID, ipyData, addAuctionItemDatetimeList])
+        
+    AuctionSystemItem = IpyGameDataPY.SetConfigEx(key, [reloadSign, addSystemAuctionItemInfo])
+    GameWorld.Log("本日系统拍品信息加载完毕!reloadSign=%s" % (reloadSign))
+    GameWorld.Log("本日系统拍品上架时间信息: %s" % addSystemAuctionItemInfo)
+    GameWorld.Log("=============================================================")
+    return AuctionSystemItem[1]
+
+def OnAuctionItemMinuteProcess():
+    ## 拍卖行拍品定时处理,每整分钟触发一次
+    
+    # 这里时间需精确到分钟,不然后面的比较会匹配不到
+    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 = ""
+    sysAuctionItemList = []
+    addSystemAuctionItemInfo = __GetAuctionSystemItemInfo()
+    for cfgID, ipyData, addAuctionItemDatetimeList in addSystemAuctionItemInfo:
+        if curDateTime not in addAuctionItemDatetimeList:
+            continue
+        #cfgID = ipyData.GetCfgID()
+        addCountWeightList = ipyData.GetItemCountWeightList()
+        auctionItemWeightList = ipyData.GetAuctionItemWeightList()
+        
+        addCount = GameWorld.GetResultByWeightList(addCountWeightList)
+        addSysItemList = []
+        for _ in xrange(addCount):
+            itemInfo = GameWorld.GetResultByWeightList(auctionItemWeightList)
+            if itemInfo != None:
+                addSysItemList.append(itemInfo)
+        GameWorld.Log("增加上架系统拍品信息: cfgID=%s,addCount=%s, %s" % (cfgID, addCount, addSysItemList))
+        sysAuctionItemList += addSysItemList
+        
+        randMailKeyList = ipyData.GetRandMailKeyList()
+        if randMailKeyList:
+            randMailKey = random.choice(randMailKeyList)
+            
+    # 随机邮件通知 
+    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)
+        
+    if sysAuctionItemList:
+        DoAddSystemAuctionItem(sysAuctionItemList)        
+    return
+
 def OnAuctionItemTimeProcess(curTime, tick):
     ## 拍卖行拍品定时处理,每秒触发一次
     allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList
@@ -492,6 +634,9 @@
                 PlayerCompensation.SendMailByKey("PaimaiMail7", [playerID], [], paramList, gold=givePlayerGold, 
                                                  detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionGain)
                 
+            else:
+                GameWorld.Log("系统拍品成交: itemGUID=%s,itemID=%s" % (itemGUID, itemID))
+                
             AddAuctionRecord(auctionItem, AuctionRecordResult_SellOK)
             
             #策划需求屏蔽掉成交广播
@@ -504,7 +649,7 @@
                 endType = "Recycle"
                 AddAuctionRecord(auctionItem, AuctionRecordResult_Recycle)
             # 个人拍品流拍,物品返还
-            else:
+            elif playerID:
                 endType = "Return"
                 
                 # 流拍返还物品邮件
@@ -514,6 +659,9 @@
                 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)
@@ -661,8 +809,9 @@
     notifyAddItemList = [] # 新增拍品通知 [[itemGUID, itemID, playerID], ...]
     notifyFamilyAddItemDict = {} # 新增仙盟拍品通知 {familyID:[auctionItem, ...], ...}
     for playerID, familyID, familyPlayerIDList, itemData in addAuctionItemList:
-        if not playerID and not familyID:
-            continue
+        #系统拍品玩家ID、仙盟ID都为0,可上架,这里不再限制
+        #if not playerID and not familyID:
+        #    continue
         
         auctionItem = __DoAddAuctionItem(curPlayer, playerID, familyID, familyPlayerIDList, itemData)
         if not auctionItem:
@@ -1394,3 +1543,11 @@
     GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AddFamilyAuctionItem, [mapID, familyAuctionItemDict])
     return
 
+def DoAddSystemAuctionItem(sysAuctionItemList):
+    ''' 上架系统拍品
+    '''
+    mapID = ChConfig.Def_FBMapID_MainCity
+    GameWorld.Log("发送地图上架系统拍品: mapID=%s, %s" % (mapID, sysAuctionItemList))
+    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_AddSystemAuctionItem, [mapID, sysAuctionItemList])
+    return
+
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
index 5dd62fb..bebae61 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -357,6 +357,8 @@
     PlayerFBHelpBattle.OnMinuteProcess()
     #红包
     PlayerFamilyRedPacket.OnRedPacketMinuteProcess()
+    #拍卖行
+    AuctionHouse.OnAuctionItemMinuteProcess()
     #每5分钟触发一次仙盟总战力更新
     if curMinute % 5 == 0:
         PlayerFamily.UpdFamilyTotalFightPower()
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
index 6a43b21..ef4336f 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/IpyGameDataPY.py
@@ -73,6 +73,19 @@
                         ("BYTE", "Sortpriority", 0),
                         ),
 
+                "AuctionSystemItem":(
+                        ("DWORD", "CfgID", 1),
+                        ("char", "StartDate", 0),
+                        ("char", "EndDate", 0),
+                        ("char", "StartTime", 0),
+                        ("char", "EndTime", 0),
+                        ("BYTE", "AuctionCount", 0),
+                        ("list", "RandMinuteRange", 0),
+                        ("list", "ItemCountWeightList", 0),
+                        ("list", "AuctionItemWeightList", 0),
+                        ("list", "RandMailKeyList", 0),
+                        ),
+
                 "DailyAction":(
                         ("DWORD", "DailyID", 1),
                         ("dict", "OpenTimeDict", 0),
@@ -622,6 +635,33 @@
     def GetBiddingAdd(self): return self.BiddingAdd # 竞价增加
     def GetNeedWorldNotify(self): return self.NeedWorldNotify # 是否需要广播
     def GetSortpriority(self): return self.Sortpriority # 排序优先级归组
+
+# 拍卖行系统拍品表
+class IPY_AuctionSystemItem():
+    
+    def __init__(self):
+        self.CfgID = 0
+        self.StartDate = ""
+        self.EndDate = ""
+        self.StartTime = ""
+        self.EndTime = ""
+        self.AuctionCount = 0
+        self.RandMinuteRange = []
+        self.ItemCountWeightList = []
+        self.AuctionItemWeightList = []
+        self.RandMailKeyList = []
+        return
+        
+    def GetCfgID(self): return self.CfgID
+    def GetStartDate(self): return self.StartDate # 开启日期
+    def GetEndDate(self): return self.EndDate # 结束日期
+    def GetStartTime(self): return self.StartTime # 开启时间
+    def GetEndTime(self): return self.EndTime # 结束时间
+    def GetAuctionCount(self): return self.AuctionCount # 上架次数
+    def GetRandMinuteRange(self): return self.RandMinuteRange # 上架随机间隔分钟下限|上限
+    def GetItemCountWeightList(self): return self.ItemCountWeightList # 上架随机件数权重列表, [[权重, 件数], ...]
+    def GetAuctionItemWeightList(self): return self.AuctionItemWeightList # 上架物品随机权重, [[权重, 物品ID],[权重, [阶,颜色,部位集合,是否套装,星级]] ...]
+    def GetRandMailKeyList(self): return self.RandMailKeyList # 上架随机邮件列表,有配置时上架的时候在线玩家会收到一封上架邮件提醒
 
 # 日常活动表
 class IPY_DailyAction():
@@ -1622,6 +1662,8 @@
         self.ipyMarketQueryLen = len(self.ipyMarketQueryCache)
         self.ipyAuctionItemCache = self.__LoadFileData("AuctionItem", IPY_AuctionItem)
         self.ipyAuctionItemLen = len(self.ipyAuctionItemCache)
+        self.ipyAuctionSystemItemCache = self.__LoadFileData("AuctionSystemItem", IPY_AuctionSystemItem)
+        self.ipyAuctionSystemItemLen = len(self.ipyAuctionSystemItemCache)
         self.ipyDailyActionCache = self.__LoadFileData("DailyAction", IPY_DailyAction)
         self.ipyDailyActionLen = len(self.ipyDailyActionCache)
         self.ipyDailyActionCustomCache = self.__LoadFileData("DailyActionCustom", IPY_DailyActionCustom)
@@ -1884,6 +1926,8 @@
     def GetMarketQueryByIndex(self, index): return self.ipyMarketQueryCache[index]
     def GetAuctionItemCount(self): return self.ipyAuctionItemLen
     def GetAuctionItemByIndex(self, index): return self.ipyAuctionItemCache[index]
+    def GetAuctionSystemItemCount(self): return self.ipyAuctionSystemItemLen
+    def GetAuctionSystemItemByIndex(self, index): return self.ipyAuctionSystemItemCache[index]
     def GetDailyActionCount(self): return self.ipyDailyActionLen
     def GetDailyActionByIndex(self, index): return self.ipyDailyActionCache[index]
     def GetDailyActionCustomCount(self): return self.ipyDailyActionCustomLen
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
index 69cc74b..c5739ce 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -169,6 +169,7 @@
 Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
 
 Def_Notify_WorldKey_AddFamilyAuctionItem = "AddFamilyAuctionItem"  # 添加仙盟拍品
+Def_Notify_WorldKey_AddSystemAuctionItem = "AddSystemAuctionItem"  # 添加系统拍品
 
 Def_Notify_WorldKey_CrossServerConnState = "CrossServerConnState"  # 跨服服务器链接状态
 Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
index ea38c91..dfe8ab3 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/ItemControler.py
@@ -2289,7 +2289,7 @@
     ''' 获取功能产出的物品实例
     @param isAuctionItem: 是否拍品,默认非拍品
     @param expireTime: 有效时间,时间单位由时效类型决定
-    @param curPlayer: 产出该物品时的玩家,非拍品时需传入该值,物品某些属性由玩家等级决定,如传奇属性
+    @param curPlayer: 产出该物品时的玩家,物品某些属性由玩家等级决定,如传奇属性
     @param isAllAttr: 是否生成该装备所有属性,GM创建物品时用,需验证相关权限
     '''
     curItem = ItemCommon.CreateSingleItem(itemID, itemCount, isAuctionItem, expireTime)
@@ -2345,11 +2345,13 @@
     if not legendAttrCountInfoList:
         return
     
-    if not curPlayer:
-        GameWorld.ErrLog("生成装备传奇属性时玩家不存在!itemID=%s" % (itemID))
-        return
-    
-    playerID, playerLV = curPlayer.GetPlayerID(), curPlayer.GetLV()
+    if curPlayer:
+        playerID, playerLV = curPlayer.GetPlayerID(), curPlayer.GetLV()
+    else:
+        playerID = 0
+        playerLV = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv)
+        GameWorld.Log("生成装备传奇属性时没有玩家等级, 取当前世界等级! itemID=%s,worldLV=%s" % (itemID, playerLV))
+        
     # 2. 定属性ID
     attrTypeIpyData = IpyGameDataPY.GetIpyGameData("EquipLegendAttrType", itemType)
     if not attrTypeIpyData:
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 9eb69c0..3260143 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerAuctionHouse.py
@@ -24,7 +24,9 @@
 import ChConfig
 import ShareDefine
 import PlayerActivity
+import NPCCommon
 
+import random
 import time
 
 #// B5 13 拍卖行上架拍品 #tagCMSellAuctionItem
@@ -204,6 +206,46 @@
         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_AuctionItem, 1)
     return
 
+def DoAddSystemAuctionItem(sysAuctionItemList):
+    ''' 上架系统拍品
+    @param sysAuctionItemList: [物品ID, [阶,颜色,[部位, ...],是否套装,星级]]
+    '''
+    GameWorld.Log("上架系统拍品: %s" % sysAuctionItemList)
+    
+    itemCount = 1 # 系统拍品,默认上架一个
+    isAuctionItem = True
+    auctionItemList = []
+    for sysAuctionItemInfo in sysAuctionItemList:
+        if type(sysAuctionItemInfo) == int:
+            itemID = sysAuctionItemInfo
+        elif type(sysAuctionItemInfo) == list and len(sysAuctionItemInfo) >= 5:
+            classLV, color, placeList, isSuit, star = sysAuctionItemInfo[:5]
+            if star:
+                # 有星级的代表非境界装备,暂不处理,之后有需要扩展
+                randEquipIDList = []
+            else:
+                itemJobList = sysAuctionItemInfo[5] if len(sysAuctionItemInfo) > 5 else [] 
+                randEquipIDList = NPCCommon.__GetEquipIDList(0, classLV, color, isSuit, placeList, itemJobList, findType="SystemAuctionItem")
+            if not randEquipIDList:
+                GameWorld.ErrLog("系统拍品找不到可上架的装备! %s" % str(sysAuctionItemInfo))
+                continue
+            itemID = random.choice(randEquipIDList)
+        else:
+            GameWorld.ErrLog("系统拍品格式错误,无法上架! %s" % str(sysAuctionItemInfo))
+            continue
+        ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
+        if not ipyData:
+            GameWorld.ErrLog("非拍卖物品,无法上架系统拍品! itemID=%s" % (itemID))
+            continue
+        curItem = ItemControler.GetOutPutItemObj(itemID, itemCount, isAuctionItem)
+        if not curItem:
+            continue
+        auctionItemList.append([curItem])
+    if not auctionItemList:
+        return
+    __DoAddAuctionItem(None, auctionItemList)
+    return
+
 def DR_AuctionHouse(curPlayer, eventName, drDict):
     accID = "" if not curPlayer else curPlayer.GetAccID()
     playerID = 0 if not curPlayer else curPlayer.GetPlayerID()
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 0eb6eb3..3a55786 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -1289,6 +1289,12 @@
                 PlayerAuctionHouse.DoAddFamilyAuctionItem(familyAuctionItemDict)
             return
         
+        if key == ShareDefine.Def_Notify_WorldKey_AddSystemAuctionItem:
+            mapID, sysAuctionItemList = eval(msgValue)
+            if GameWorld.GetMap().GetMapID() == mapID:
+                PlayerAuctionHouse.DoAddSystemAuctionItem(sysAuctionItemList)
+            return
+        
         if key == ShareDefine.Def_Notify_WorldKey_FairyDomainLimit:
             isAdd, limitList = eval(msgValue)
             if isAdd:
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
index d09fbab..c5739ce 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -169,6 +169,7 @@
 Def_Notify_WorldKey_FamilyPartyInfo = "FamilyPartyInfo"  # 仙盟宴会数据
 
 Def_Notify_WorldKey_AddFamilyAuctionItem = "AddFamilyAuctionItem"  # 添加仙盟拍品
+Def_Notify_WorldKey_AddSystemAuctionItem = "AddSystemAuctionItem"  # 添加系统拍品
 
 Def_Notify_WorldKey_CrossServerConnState = "CrossServerConnState"  # 跨服服务器链接状态
 Def_Notify_WorldKey_CrossServerOpen = "CrossServerOpen"  # 跨服服务器是否开启中
@@ -619,7 +620,7 @@
     
     Def_BT_NewFCCostGold,                     #消费排行榜(新仙界盛典)
     Def_BT_Campaign_LingGen,                  #灵根总点(开服活动榜)
-    Def_BT_Campaign_StarLV,                   #升星等级(开服活动榜)
+    Def_BT_Campaign_StarLV,                   #升星等级(开服活动榜) 25
     
     Def_BT_Max,                               #排行榜最大类型
 ) = range(0, 25 + 2) 

--
Gitblit v1.8.0