From d236760ececff7046f3a68d61f865e1edb9429c1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期日, 22 九月 2019 18:34:00 +0800 Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py | 115 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 96 insertions(+), 19 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py index 17d1fa8..fd99fd1 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 @@ -218,7 +219,9 @@ 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 ##------------------------------------------------------------------------------------------------- @@ -314,6 +317,14 @@ #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)) @@ -486,7 +497,7 @@ GameWorld.Log("=============================================================") return AuctionSystemItem[1] -def OnAuctionItemMinuteProcess(): +def OnAuctionItemMinuteProcess(tick): ## 拍卖行拍品定时处理,每整分钟触发一次 # 这里时间需精确到分钟,不然后面的比较会匹配不到 @@ -495,7 +506,10 @@ curDateTime.hour, curDateTime.minute), ChConfig.TYPE_Time_Format) randMailKey = "" - sysAuctionItemList = [] + addItemTick = tick + sysAuctionItemList = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemList") # 系统等待上架的拍品列表 + if not sysAuctionItemList: + sysAuctionItemList = [] addSystemAuctionItemInfo = __GetAuctionSystemItemInfo() for cfgID, ipyData, addAuctionItemDatetimeList in addSystemAuctionItemInfo: if curDateTime not in addAuctionItemDatetimeList: @@ -503,20 +517,29 @@ #cfgID = ipyData.GetCfgID() addCountWeightList = ipyData.GetItemCountWeightList() auctionItemWeightList = ipyData.GetAuctionItemWeightList() + randSecondRange = ipyData.GetAddRandSecondRange() addCount = GameWorld.GetResultByWeightList(addCountWeightList) - addSysItemList = [] + GameWorld.Log("增加等待上架的系统拍品信息: cfgID=%s,addCount=%s,addItemTick=%s" % (cfgID, addCount, addItemTick)) 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 - + 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) + IpyGameDataPY.SetConfigEx("SysWaitAuctionItemList", sysAuctionItemList) + #GameWorld.DebugLog("等待系统上架的拍品列表: %s" % sysAuctionItemList) + # 随机邮件通知 if randMailKey: playerIDList = [] @@ -530,15 +553,33 @@ continue playerIDList.append(player.GetPlayerID()) PlayerCompensation.SendMailByKey(randMailKey, playerIDList, addItemList) + + return + +def __DoSysWaitAddAuctionItem(tick): + sysAuctionItemList = IpyGameDataPY.GetConfigEx("SysWaitAuctionItemList") # 系统等待上架的拍品列表 + if not sysAuctionItemList: + 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]) - if sysAuctionItemList: - DoAddSystemAuctionItem(sysAuctionItemList) return def OnAuctionItemTimeProcess(curTime, tick): ## 拍卖行拍品定时处理,每秒触发一次 __DoSysBuyoutItemByTime(curTime) + + __DoSysWaitAddAuctionItem(tick) allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList if not allAuctionItemByEndTimeList: @@ -621,6 +662,7 @@ openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) for job in openJobList: jobPlayerCount = len(PyGameData.g_onedayJobPlayerLoginoffTimeDict.get(job, {})) + jobPlayerCount = max(1, jobPlayerCount) # 人数默认至少1个 totalPlayerCount += jobPlayerCount jobWeightList.append([jobPlayerCount, job]) GameWorld.DebugLog("职业人数: job=%s,count=%s" % (job, jobPlayerCount)) @@ -772,7 +814,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)) @@ -785,7 +827,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: @@ -806,13 +848,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)) @@ -931,6 +977,12 @@ return + # 下架拍品 + elif queryType == "UnsellAuctionItem": + itemGUID = queryData[0] + __DoUnsellAuctionItem(curPlayer, itemGUID) + return + elif queryType == "ClearAuctionItem": __DoGMClearAuctionItem(curPlayer) return @@ -1093,6 +1145,31 @@ 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): ''' 玩家竞价物品 @param curPlayer: 竞价的玩家 @@ -1180,12 +1257,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