hxp
2019-03-27 93367a2607db214ec6dda86bd796c1291bc06a49
3167 【BUG】【2.0】拍卖,消耗了仙玉没获得拍品
2个文件已修改
33 ■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/AuctionHouse.py
@@ -53,6 +53,18 @@
AuctionType_World = 0
AuctionType_Family = 1
'''
竞价流程:
1. MapServer 先验证价格是否够
2. GameServer 验证是否可以竞价
3. MapServer 扣除玩家货币
4. GameServer  进行竞价,变更下次竞价价格
基于以上流程,所以玩家竞价时需先锁定物品,防止竞价流程未完结时其他玩家请求竞价同一拍品判断竞价价格错误
锁定时长同样适用于拍品竞价时间结束时的保护时间
'''
BiddingQueryLockTick = 10000
#拍卖行状态开关
def GetAuctionHouseState(): return PlayerBourse.GetOpenState()
@@ -278,8 +290,9 @@
        return
    bidTime = GameWorld.ChangeTimeStrToNum(auctionItem.BiddingTime)
    endTime = bidTime + IpyGameDataPY.GetFuncCfg("AuctionHouse", 4)
    if endTime < auctionItem.EndTime:
    if endTime <= auctionItem.EndTime:
        return
    GameWorld.DebugLog("拍品加时: EndTime=%s,updEndTime=%s" % (auctionItem.EndTime, endTime))
    auctionItem.EndTime = endTime
    return True
@@ -304,21 +317,25 @@
    ## 仙盟拍卖中的拍品列表
    return PyDataManager.GetAuctionItemManager().familyAuctionItemDict.get(familyID, [])
def OnAuctionItemTimeProcess(curTime):
def OnAuctionItemTimeProcess(curTime, tick):
    ## 拍卖行拍品定时处理,每秒触发一次
    allAuctionItemByEndTimeList = PyDataManager.GetAuctionItemManager().allAuctionItemByEndTimeList
    if not allAuctionItemByEndTimeList:
        return
    
    index = 0
    endItemList = [] # 结束竞价的拍品列表
    moveToWorldItemList = [] # 转移到全服拍卖的仙盟拍品列表
    doCount = len(allAuctionItemByEndTimeList)
    while doCount > 0 and allAuctionItemByEndTimeList:
        doCount -= 1
        auctionItem = allAuctionItemByEndTimeList[0]
        if curTime < auctionItem.EndTime:
        auctionItem = allAuctionItemByEndTimeList[index]
        if curTime <= auctionItem.EndTime:
            break
        allAuctionItemByEndTimeList.pop(0)
        if auctionItem.BiddingQueryTick and tick - auctionItem.BiddingQueryTick < BiddingQueryLockTick:
            index += 1
            continue
        allAuctionItemByEndTimeList.pop(index)
        
        # 没有人竞价的仙盟拍品
        if not auctionItem.BidderPrice and auctionItem.FamilyID and auctionItem.AuctionType == AuctionType_Family:
@@ -795,7 +812,7 @@
                             % (itemGUID, itemID, itemFamilyID, playerFamilyID), playerID)
            errInfo = "is family auction item"
            return itemID, errInfo
    if curTime >= auctionItem.EndTime:
    if curTime > auctionItem.EndTime:
        GameWorld.ErrLog("拍品已结束竞价! itemGUID=%s,itemID=%s,addTimeStr=%s" % (itemGUID, itemID, addTimeStr), playerID)
        errInfo = "end bid"
        return itemID, errInfo
@@ -811,7 +828,7 @@
    
    if isOnlyCheck:
        queryTick = auctionItem.BiddingQueryTick
        if queryTick and tick - queryTick < 10000:
        if queryTick and tick - queryTick < BiddingQueryLockTick:
            # 有玩家正在竞价,请稍等
            PlayerControl.NotifyCode(curPlayer, "Paimai1")
            errInfo = "other player bidding"
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -302,7 +302,7 @@
    PlayerDBOper.PyDBProccess(tick)
    
    #拍卖行
    AuctionHouse.OnAuctionItemTimeProcess(curTime)
    AuctionHouse.OnAuctionItemTimeProcess(curTime, tick)
    
    #每整分钟处理一次
    curDateTime = datetime.datetime.today()