From 31c49247fe0656416cf5cfc4f5b290d40b919d15 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 26 七月 2019 21:16:50 +0800
Subject: [PATCH] 860312 白蓝装从出售改成分解

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py |  379 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 356 insertions(+), 23 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
index 302720e..c3ae103 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -21,13 +21,17 @@
 import PyGameDataStruct
 import PlayerCompensation
 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
@@ -214,10 +218,22 @@
 
 def __InitAuctionAttentionAttrEx(attentionData):
     ## 初始化拍卖关注实例附加属性
-    setattr(attentionData, "AttentionItemIDList", [] if not attentionData.AttentionInfo else json.loads(attentionData.AttentionInfo))
+    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):
     ## 加载拍卖物品表时附加处理
@@ -267,9 +283,73 @@
     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
+    
+    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值
@@ -326,8 +406,150 @@
             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):
     ## 拍卖行拍品定时处理,每秒触发一次
+    
+    __DoSysBuyoutItemByTime(curTime)
+    
     allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList
     if not allAuctionItemByEndTimeList:
         return
@@ -355,6 +577,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):
     ## 仙盟拍品转移到全服
@@ -427,6 +731,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):
@@ -451,15 +756,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:
@@ -475,8 +781,8 @@
                     
                     # 仙盟拍品收益邮件
                     detail = {"ItemGUID":itemGUID, "ItemID":itemID, "Count":itemCount, "BidderPrice":bidderPrice, "FamilyPlayerIDList":familyPlayerIDList}
-                    paramList = [itemID, itemID, auctionItem.BidderName, bidderPrice, taxRate, giveGoldAverage, personMaxRate]
-                    PlayerCompensation.SendMailByKey("PaimaiMail6", familyPlayerIDList, [], paramList, gold=giveGoldAverage, 
+                    paramList = [itemID, itemID, bidderPrice, taxRate, giveGoldAverage, personMaxRate]
+                    PlayerCompensation.SendMailByKey("PaimaiMail8", familyPlayerIDList, [], paramList, gold=giveGoldAverage, 
                                                      detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionGain)
                 else:
                     GameWorld.ErrLog("仙盟拍品没有人获得收益!familyID=%s,itemID=%s,itemGUID=%s" % (familyID, itemID, itemGUID))
@@ -488,31 +794,38 @@
                 
                 # 个人拍卖收益邮件
                 detail = {"ItemGUID":itemGUID, "ItemID":itemID, "Count":itemCount, "BidderPrice":bidderPrice}
-                paramList = [itemID, itemID, auctionItem.BidderName, bidderPrice, taxRate, givePlayerGold]
-                PlayerCompensation.SendMailByKey("PaimaiMail5", [playerID], [], paramList, gold=givePlayerGold, 
+                paramList = [itemID, itemID, bidderPrice, taxRate, givePlayerGold]
+                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)
             
-            ipyData = IpyGameDataPY.GetIpyGameData("AuctionItem", itemID)
-            if ipyData and ipyData.GetNeedWorldNotify():
-                PlayerControl.WorldNotify(0, "Paimai6", [auctionItem.BidderName, bidderID, auctionItem.AuctionType, bidderPrice, itemID])
+            #策划需求屏蔽掉成交广播
+            #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)
             # 个人拍品流拍,物品返还
-            else:
+            elif playerID:
                 endType = "Return"
                 
                 # 流拍返还物品邮件
                 paramList = []
                 detail = {"ItemGUID":itemGUID}
-                addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":False, "UserData":auctionItem.UserData}]
+                addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":True, "UserData":auctionItem.UserData}]
                 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)
@@ -537,6 +850,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)
@@ -660,8 +976,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:
@@ -710,7 +1027,9 @@
     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
     
@@ -719,12 +1038,10 @@
     auctionItemMgr.allAuctionItemByEndTimeList.append(auctionItem)
     
     if familyID:
-        auctionItem.AuctionType = AuctionType_Family
         familyItemList = auctionItemMgr.familyAuctionItemDict.get(familyID, [])
         familyItemList.append(auctionItem)
         auctionItemMgr.familyAuctionItemDict[familyID] = familyItemList
     else:
-        auctionItem.AuctionType = AuctionType_World
         auctionItemMgr.worldAuctionItemList.append(auctionItem)
         
         # 添加进我的拍卖
@@ -927,6 +1244,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:
@@ -1002,9 +1323,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)))
         
@@ -1393,3 +1717,12 @@
     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
+

--
Gitblit v1.8.0