From 9607567bac1c2c0bbff492c34545cc7a93d35ddf Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 15 十月 2019 18:15:19 +0800
Subject: [PATCH] 8262 【主干】【后端】仙盟宴会及传功优化(去除答对提示参数:仙盟贡献度)
---
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py | 257 +++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 199 insertions(+), 58 deletions(-)
diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
index 6ca7fd6..c1a2563 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -52,7 +52,8 @@
AuctionRecordResult_BidOK, # 竞价成功
AuctionRecordResult_BidFail, # 竞价失败
AuctionRecordResult_MoveToWorld, # 仙盟拍品转移到全服拍品
-) = range(6)
+AuctionRecordResult_Unsell, # 下架
+) = range(7)
# 当前拍品归类 0-全服拍品 1-仙盟私有拍品
AuctionType_World = 0
@@ -247,6 +248,7 @@
if dbData.AuctionType == AuctionType_World:
pyAuctionItemMgr.worldAuctionItemList.append(dbData)
+ __OnCalcWorldAuctionItemCount(dbData, 1)
if familyID:
familyItemList = pyAuctionItemMgr.familyAuctionItemDict.get(familyID, [])
@@ -406,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"
@@ -434,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
@@ -485,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))
@@ -505,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:
@@ -556,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):
@@ -715,6 +818,7 @@
auctionItemMgr.allAuctionItemByEndTimeList.append(auctionItem)
auctionItemMgr.worldAuctionItemList.append(auctionItem)
+ __OnCalcWorldAuctionItemCount(auctionItem, 1)
notifyWorldAddItemList.append([itemGUID, itemID, playerID])
AddAuctionRecord(auctionItem, AuctionRecordResult_MoveToWorld)
@@ -813,7 +917,7 @@
# 仙盟拍品收益邮件
detail = {"ItemGUID":itemGUID, "ItemID":itemID, "Count":itemCount, "BidderPrice":bidderPrice, "FamilyPlayerIDList":familyPlayerIDList}
paramList = [itemID, itemID, bidderPrice, taxRate, giveGoldAverage, personMaxRate]
- PlayerCompensation.SendMailByKey("PaimaiMail8", familyPlayerIDList, [], paramList, gold=giveGoldAverage,
+ 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))
@@ -826,7 +930,7 @@
# 个人拍卖收益邮件
detail = {"ItemGUID":itemGUID, "ItemID":itemID, "Count":itemCount, "BidderPrice":bidderPrice}
paramList = [itemID, itemID, bidderPrice, taxRate, givePlayerGold]
- PlayerCompensation.SendMailByKey("PaimaiMail7", [playerID], [], paramList, gold=givePlayerGold,
+ PlayerCompensation.SendMailByKey("PaimaiMail7", [playerID], [], paramList, goldPaper=givePlayerGold,
detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionGain)
else:
@@ -847,13 +951,17 @@
elif playerID:
endType = "Return"
- # 流拍返还物品邮件
+ # 返还物品邮件
paramList = []
detail = {"ItemGUID":itemGUID}
addItemList = [{"ItemID":itemID, "Count":itemCount, "IsAuctionItem":True, "UserData":auctionItem.UserData}]
- PlayerCompensation.SendMailByKey("PaimaiMail4", [playerID], addItemList, paramList, detail=detail)
-
- AddAuctionRecord(auctionItem, AuctionRecordResult_SellFail)
+ # 下架
+ 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))
@@ -871,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:
@@ -972,6 +1081,12 @@
return
+ # 下架拍品
+ elif queryType == "UnsellAuctionItem":
+ itemGUID = queryData[0]
+ __DoUnsellAuctionItem(curPlayer, itemGUID)
+ return
+
elif queryType == "ClearAuctionItem":
__DoGMClearAuctionItem(curPlayer)
return
@@ -1074,6 +1189,7 @@
auctionItemMgr.familyAuctionItemDict[familyID] = familyItemList
else:
auctionItemMgr.worldAuctionItemList.append(auctionItem)
+ __OnCalcWorldAuctionItemCount(auctionItem, 1)
# 添加进我的拍卖
if playerID:
@@ -1132,6 +1248,31 @@
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):
@@ -1221,12 +1362,12 @@
if isBuyout:
# 竞拍失败,仅通知
paramList = [itemID, itemID, lastBidderPrice]
- PlayerCompensation.SendMailByKey("PaimaiMail2", [lastBidderID], [], paramList, gold=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, gold=lastBidderPrice,
+ PlayerCompensation.SendMailByKey("PaimaiMail1", [lastBidderID], [], paramList, goldPaper=lastBidderPrice,
detail=detail, moneySource=ChConfig.Def_GiveMoney_AuctionBidReturn)
AddAuctionRecord(auctionItem, AuctionRecordResult_BidFail)
--
Gitblit v1.8.0