10263 【越南】【英文】【BT】【砍树】后端支持NPC仿真实玩家战斗和快速战斗(本服竞技场支持掉线重登后结算战斗结果)
8个文件已修改
131 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py
@@ -230,6 +230,7 @@
    if updScore != None:
        __SyncPlayerBechallengedUpdScore(curPlayer, updScore)
        
    PlayerControl.DoOfflineUnprocessed(curPlayer, "BattleResult", __DoOfflineArenaBattleResult)
    return
def OnDayEx():
@@ -293,6 +294,9 @@
    GameWorld.GetUniversalRecMgr().Delete(Def_RecType_ArenaBattleRecord)
    PyGameData.g_arenaPlayerBattleRecDict = {}
    PyGameData.g_arenaPlayerMatchDict = {}
    # 删除未处理的
    PlayerControl.DelOfflineUnprocessed("BattleResult")
    
    # 更新新赛季信息
    if openServerDay <= customMaxServerDay and OSSeasonState == 0:
@@ -546,21 +550,27 @@
    GameWorld.Log("    奖励保底玩家信息: %s" % floorPlayerIDList)
    return
def MapServer_Arena(curPlayer, msgList):
    GameWorld.DebugLog("MapServer_Arena %s" % str(msgList), curPlayer.GetPlayerID())
def MapServer_Arena(playerID, msgList):
    GameWorld.DebugLog("MapServer_Arena %s" % str(msgList), playerID)
    if not msgList:
        return
    
    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
    cmd = msgList[0]
    cmdDict = msgList[1] if len(msgList) > 1 else {}
    retDict = {}
    
    # 匹配刷新
    if cmd == "MatchRefresh":
        if not curPlayer:
            return
        __DoArenaMatchRefresh(curPlayer, cmdDict["isRefresh"], cmdDict["playerLV"], cmdDict["playerScore"], cmdDict.get("gmMatchIDList"))
        
    # 对战结算
    elif cmd == "BattleResult":
        if not curPlayer:
            PlayerControl.AddOfflineUnprocessed(playerID, "BattleResult", cmdDict)
            return
        retDict = __DoArenaBattleResult(curPlayer, cmdDict)
        
    return msgList + [retDict]
@@ -819,6 +829,17 @@
    NetPackCommon.SendFakePack(curPlayer, clientPack)
    return
def __DoOfflineArenaBattleResult(curPlayer, recData, cmdName, cmdDict):
    ## 执行离线未处理的战斗结果
    recTime = recData.GetTime()
    msgList = [cmdName, cmdDict]
    retDict = __DoArenaBattleResult(curPlayer, cmdDict)
    retDict["offlineRecTime"] = recTime
    ret = msgList + [retDict]
    resultName = '%s' % ret
    curPlayer.MapServer_QueryPlayerResult(0, 0, "Arena", resultName, len(resultName))
    return
def __DoArenaBattleResult(curPlayer, cmdDict):
    ## 地图玩家同步战斗结果
    
ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
@@ -181,6 +181,7 @@
    GameWorldOpenServerCampaign.DoOnDay()
    #清理过期补偿
    PlayerCompensation.ClearUpTimeOutCompensation()
    PlayerControl.DoOnDay()
    #PlayerGeTui.ClearFMTGeTuiLimit()
    import PlayerBourse
    PlayerBourse.OverTimeItemsDeal()
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py
@@ -28,6 +28,7 @@
#---------------------------------------------------------------------
import GameWorld
import PlayerDBOper
import PyDataManager
import IPY_GameServer
import PlayerDBGSEvent
import CrossChampionship
@@ -38,6 +39,7 @@
import PyGameData
import ChConfig
import types
import time
#---------------------------------------------------------------------
#系统提示参数列表
NotifyCodeList = IPY_GameServer.IPY_NotifyCodeList()
@@ -451,4 +453,84 @@
            FuncOpenLogicDict[funcID](curPlayer)
    return
def AddOfflineUnprocessed(playerID, eventName, eventData, outtimeDays=30):
    '''添加玩家离线未处理的事件
    @param eventName: 事件名
    @param eventData: 事件数据,由功能自定定义,任意格式
    @param outtimeDays: 过期天数,0-永久, >0-指定天数, 默认30天
    '''
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recData = playerRecMgr.AddPlayerRecData(ShareDefine.Def_PlayerRecType_OfflineUnprocessed, playerID)
    recData.SetValue1(outtimeDays)
    recData.SetUserDataByKey("eventName", eventName)
    recData.SetUserDataByKey("eventData", eventData)
    GameWorld.Log("添加玩家离线未处理的事件: %s, %s, %s" % (eventName, outtimeDays, eventData), playerID)
    return
def DoOfflineUnprocessed(curPlayer, eventName, dofunc):
    '''执行处理玩家离线未处理的事件
    @param dofunc: 执行函数,参数[curPlayer, recData, eventName, eventData]
    '''
    if not dofunc:
        return
    playerID = curPlayer.GetPlayerID()
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recDataList = playerRecMgr.GetPlayerRecDataList(ShareDefine.Def_PlayerRecType_OfflineUnprocessed, playerID)
    delRecDataList = []
    # 需按添加顺序执行逻辑
    for recData in recDataList:
        if recData.GetUserDataByKey("eventName") != eventName:
            continue
        eventData = recData.GetUserDataByKey("eventData")
        GameWorld.Log("执行玩家上次离线前未处理事件: %s, %s" % (eventName, eventData), playerID)
        dofunc(curPlayer, recData, eventName, eventData)
        delRecDataList.append(recData)
    # 执行完后再统一删除
    for recData in delRecDataList:
        playerRecMgr.DelRecData(recData)
    return
def DelOfflineUnprocessed(eventName):
    ## 删除玩家离线未处理的事件
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_OfflineUnprocessed)
    if not recDict:
        return
    delCnt = 0
    for recDataList in recDict.values():
        for recData in recDataList[::-1]: # 倒序处理删除到期
            if recData.GetUserDataByKey("eventName") != eventName:
                continue
            playerRecMgr.DelRecData(recData)
            delCnt += 1
    GameWorld.DebugLog("删除玩家离线未处理的事件: %s, delCnt=%s" % (eventName, delCnt))
    return
def DelOuttimeOfflineUnprocessed():
    ## 删除过期玩家离线未处理的事件
    playerRecMgr = PyDataManager.GetDBPlayerRecDataManager()
    recDict = playerRecMgr.GetPlayerRecDataDict(ShareDefine.Def_PlayerRecType_OfflineUnprocessed)
    if not recDict:
        return
    curTime = int(time.time())
    for recDataList in recDict.values():
        for recData in recDataList[::-1]: # 倒序处理删除到期
            recTime = recData.GetTime()
            outtimeDays = recData.GetValue1()
            if not outtimeDays:
                continue
            diffDays = GameWorld.GetDiff_Day(curTime, recTime) + 1
            if diffDays <= outtimeDays:
                continue
            playerRecMgr.DelRecData(recData)
            GameWorld.DebugLog("删除玩家离线未处理的过期事件: %s, %s" % (outtimeDays, recData.GetUserData()), recData.GetPlayerID())
    return
def DoOnDay():
    DelOuttimeOfflineUnprocessed()
    return
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerQuery.py
@@ -1042,10 +1042,7 @@
    
    # 竞技场
    if callName == "Arena":
        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(srcPlayerID)
        if not curPlayer:
            return
        ret = GameWorldArena.MapServer_Arena(curPlayer, eval(resultName))
        ret = GameWorldArena.MapServer_Arena(srcPlayerID, eval(resultName))
        resultName = '%s' % ret if ret != None else '' # 需要重置间隔,每次都回复
        
    # 仙盟充值互助
ServerPython/CoreServerGroup/GameServer/Script/ShareDefine.py
@@ -1415,7 +1415,8 @@
                         Def_PlayerRecType_WorshipPlayer, # 被膜拜的玩家 1
                         Def_PlayerRecType_WorshipDaily, # 玩家每日膜拜记录 2
                         Def_PlayerRecType_PayCoin, # 代币记录 3
                         ) = range(1, 1 + 3)
                         Def_PlayerRecType_OfflineUnprocessed, # 离线未处理的逻辑 4
                         ) = range(1, 1 + 4)
#通用信息记录类型 - 新 从 300 开始,原通用记录类型最大到255
Def_GameRecTypeList = (
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Attack/MirrorAttack.py
@@ -259,6 +259,12 @@
        curPlayer.SetAttackTick(tick)
        ChPlayer.__Sync_ClientBuff(curPlayer)
        
    # 所属玩家
    curPlayer = playerMgr.FindPlayerByID(ownerPlayerID)
    if curPlayer:
        curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleID, 0)
        curPlayer.SetDict(ChConfig.Def_PlayerKey_MirrorBattleTime, 0)
    # 如果是真实地图战斗的,关闭副本
    if battle.isChangeMap:
        GameWorldProcess.CloseFB(GameWorld.GetGameWorld().GetTick())
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
@@ -282,10 +282,12 @@
    updScore = retDict["updScore"]
    curOrder = retDict["curOrder"]
    updOrder = retDict["updOrder"]
    offlineRecTime = retDict.get("offlineRecTime", 0)
    
    # 扣次数
    todayBattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) + 1
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, todayBattleCount)
    if not offlineRecTime or GameWorld.CheckTimeIsSameServerDayEx(offlineRecTime):
        todayBattleCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_ArenaBattleCountDay) + 1
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaBattleCountDay, todayBattleCount)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_ArenaMatchRefreshCount, 0)
        
    # 更新积分
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ShareDefine.py
@@ -1415,7 +1415,8 @@
                         Def_PlayerRecType_WorshipPlayer, # 被膜拜的玩家 1
                         Def_PlayerRecType_WorshipDaily, # 玩家每日膜拜记录 2
                         Def_PlayerRecType_PayCoin, # 代币记录 3
                         ) = range(1, 1 + 3)
                         Def_PlayerRecType_OfflineUnprocessed, # 离线未处理的逻辑 4
                         ) = range(1, 1 + 4)
#通用信息记录类型 - 新 从 300 开始,原通用记录类型最大到255
Def_GameRecTypeList = (