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/GameWorldLogic/AuctionHouse.py | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 160 insertions(+), 3 deletions(-) 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 + -- Gitblit v1.8.0