10263 【越南】【英文】【BT】【砍树】后端支持NPC仿真实玩家战斗和快速战斗(本服竞技场支持掉线重登后结算战斗结果)
| | |
| | | if updScore != None:
|
| | | __SyncPlayerBechallengedUpdScore(curPlayer, updScore)
|
| | |
|
| | | PlayerControl.DoOfflineUnprocessed(curPlayer, "BattleResult", __DoOfflineArenaBattleResult)
|
| | | return
|
| | |
|
| | | def OnDayEx():
|
| | |
| | | GameWorld.GetUniversalRecMgr().Delete(Def_RecType_ArenaBattleRecord)
|
| | | PyGameData.g_arenaPlayerBattleRecDict = {}
|
| | | PyGameData.g_arenaPlayerMatchDict = {}
|
| | | |
| | | # 删除未处理的
|
| | | PlayerControl.DelOfflineUnprocessed("BattleResult")
|
| | |
|
| | | # 更新新赛季信息
|
| | | if openServerDay <= customMaxServerDay and OSSeasonState == 0:
|
| | |
| | | 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]
|
| | |
| | | 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):
|
| | | ## 地图玩家同步战斗结果
|
| | |
|
| | |
| | | GameWorldOpenServerCampaign.DoOnDay()
|
| | | #清理过期补偿
|
| | | PlayerCompensation.ClearUpTimeOutCompensation()
|
| | | PlayerControl.DoOnDay()
|
| | | #PlayerGeTui.ClearFMTGeTuiLimit()
|
| | | import PlayerBourse
|
| | | PlayerBourse.OverTimeItemsDeal()
|
| | |
| | | #---------------------------------------------------------------------
|
| | | import GameWorld
|
| | | import PlayerDBOper
|
| | | import PyDataManager
|
| | | import IPY_GameServer
|
| | | import PlayerDBGSEvent
|
| | | import CrossChampionship
|
| | |
| | | import PyGameData
|
| | | import ChConfig
|
| | | import types
|
| | | import time
|
| | | #---------------------------------------------------------------------
|
| | | #系统提示参数列表
|
| | | NotifyCodeList = IPY_GameServer.IPY_NotifyCodeList()
|
| | |
| | | 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
|
| | |
| | |
|
| | | # 竞技场
|
| | | 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 '' # 需要重置间隔,每次都回复
|
| | |
|
| | | # 仙盟充值互助
|
| | |
| | | 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 = (
|
| | |
| | | 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())
|
| | |
| | | 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)
|
| | |
|
| | | # 更新积分
|
| | |
| | | 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 = (
|