From b55482bd0fa065e34c74ebdac70c5eb5cdf16ed7 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 23 五月 2025 15:59:37 +0800 Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(修复玩家活动公示期至第1轮战备期间未重登可能导致重登后玩家活动被重置的bug; 修复没有触发轮次变更重置逻辑;) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py | 112 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 98 insertions(+), 14 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py index 3c0ca30..7034a64 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py @@ -28,15 +28,18 @@ #--------------------------------------------------------------------- import GameWorld import PlayerDBOper +import PyDataManager import IPY_GameServer import PlayerDBGSEvent import CrossChampionship +import GameWorldMineArea import IpyGameDataPY import CrossRealmMsg import ShareDefine import PyGameData import ChConfig import types +import time #--------------------------------------------------------------------- #系统提示参数列表 NotifyCodeList = IPY_GameServer.IPY_NotifyCodeList() @@ -207,18 +210,6 @@ return NotifyCodeList #------------------------------------------------------------------------------ -def LoadDBPlayer(): - if GameWorld.IsCrossServer(): - return - PlayerDBOper.FindDBOper(PlayerDBOper.Table_DBPlayer, {}, {"PlayerID":1, "AccID":1, "_id":0}, LoadDBPlayerRet) - return - -def LoadDBPlayerRet(resultSetList, extendValueList): - for resultDict in resultSetList: - PyGameData.g_dbPlayerIDMap[resultDict["PlayerID"]] = resultDict["AccID"] - GameWorld.Log("启动服务器加载DBPlayer玩家账号ID对应关系! %s, %s" % (len(PyGameData.g_dbPlayerIDMap), PyGameData.g_dbPlayerIDMap)) - return - def GetDBPlayerAccIDByID(playerID): ## 获取玩家表账号ID - 根据玩家ID, 可用于判断是否本服玩家 return PyGameData.g_dbPlayerIDMap.get(playerID, "") @@ -255,7 +246,8 @@ ## 副本功能线路ID def SetFBFuncLineID(curPlayer, funcLineID): return curPlayer.SetExAttr3(funcLineID) -def GetFBFuncLineID(curPlayer): return curPlayer.GetExAttr3() +def GetFBFuncMapID(curPlayer): return curPlayer.GetExAttr3() / 1000 +def GetFBFuncLineID(curPlayer): return curPlayer.GetExAttr3() % 1000 ##VIP到期时间 def GetVIPExpireTime(curPlayer): return 0 @@ -270,7 +262,9 @@ ## 根据特权ID 和 VIP等级获得特权值 def GetPrivilegeValue(vipLV, privilegeID): - if privilegeID not in ChConfig.VIPPrivilegeList: + #if privilegeID not in ChConfig.VIPPrivilegeList: + # return 0 + if not privilegeID: return 0 vipMsg = IpyGameDataPY.GetIpyGameData('VipPrivilege', privilegeID) if not vipMsg: @@ -289,6 +283,9 @@ curPlayer.MapServer_QueryPlayerResult(0, 0, "SetLeaveFamilyTime", sysMsg, len(sysMsg)) return def GetLeaveFamilyTime(curPlayer):return curPlayer.GetExAttr12() +##玩家离开仙盟时间(主动或被踢都算) +def GetLeaveFamilyTimeEx(curPlayer):return curPlayer.GetExAttr19() +def SetLeaveFamilyTimeEx(curPlayer, value):return curPlayer.SetExAttr19(value) ## 玩家所属服务器组ID def GetPlayerServerGroupID(curPlayer): return curPlayer.GetExAttr13() @@ -385,6 +382,12 @@ curPlayer.MapServer_QueryPlayerResult(0, 0, "DelItem", result, len(result)) return +def MapServerGiveAward(curPlayer, eventName, moneyInfo={}, itemList=[], drDict={}): + ## 地图给奖励 + result = str([eventName, moneyInfo, itemList, drDict]) + curPlayer.MapServer_QueryPlayerResult(0, 0, "GiveAward", result, len(result)) + return + ## 增加仙盟活跃 # @param curPlayer # @param successType: 成就类型 @@ -437,6 +440,7 @@ playerID = curPlayer.GetPlayerID() FuncOpenLogicDict = { ShareDefine.GameFuncID_Championship:lambda curObj:CrossChampionship.DoChampionshipOpen(curObj), + ShareDefine.GameFuncID_MineArea:lambda curObj:GameWorldMineArea.DoMineAreaFuncOpen(curObj), } for funcID in funcIDList: if funcID in FuncOpenLogicDict: @@ -449,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 -- Gitblit v1.8.0