10263 【越南】【英文】【BT】【砍树】后端支持NPC仿真实玩家战斗和快速战斗(本服竞技场支持掉线重登后结算战斗结果)

# Conflicts:
# ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldArena.py
# ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldProcess.py
# ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerArena.py
4个文件已修改
94 ■■■■■ 已修改文件
ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py 82 ●●●●● 补丁 | 查看 | 原始文档 | 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/ShareDefine.py 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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()
@@ -449,4 +451,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/ShareDefine.py
@@ -1428,7 +1428,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/ShareDefine.py
@@ -1428,7 +1428,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 = (