From ff9ab73ec4075661736f8d134dd726ea1c984f77 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 11 四月 2025 16:56:34 +0800 Subject: [PATCH] 10367 【越南】【英语】【BT】【砍树】仙盟攻城战-服务端(增加圣泉抽奖;积分总榜增加轮次积分明细记录;优化活动相关榜单排序规则,支持战斗阶段每分钟统计最新积分情况;优化轮次结算汇总信息;轮次支持升降级;) --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py | 185 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 181 insertions(+), 4 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py index 992828b..6e24988 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerControl.py @@ -28,12 +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() @@ -53,8 +59,17 @@ return def CrossNotifyCode(serverGroupID, playerID, msgMark, msgParamList=[]): + NotifyCodeCross(serverGroupID, playerID, msgMark, msgParamList) + return + +def NotifyCodeCross(serverGroupID, playerID, msgMark, msgParamList=[]): crossNotifyList = [{"Type":ShareDefine.CrossNotify_Player, "Params":[playerID, msgMark, msgParamList]}] CrossNotify([serverGroupID], crossNotifyList) + return + +def WorldNotifyCross(serverGroupIDList, country, msgMark, msgParamList=[]): + crossNotifyList = [GetCrossWorldNotifyInfo(country, msgMark, msgParamList)] + CrossNotify(serverGroupIDList, crossNotifyList) return def GetCrossWorldNotifyInfo(country, msgMark, msgParamList=[]): @@ -94,6 +109,13 @@ if notifyType == ShareDefine.CrossNotify_World: country, msgMark, msgParamList = params + openServerDayLimit = IpyGameDataPY.GetFuncCfg("CrossRealmCfg", 1) + if msgMark.startswith("CrossBattlefield"): + openServerDayLimit = IpyGameDataPY.GetFuncCfg("CrossRealmCfg", 2) + openServerDay = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ServerDay) + 1 + if openServerDay < openServerDayLimit: + GameWorld.DebugLog("开服天不足,不处理该跨服广播! openServerDay=%s < %s" % (openServerDay, openServerDayLimit)) + continue WorldNotify(country, msgMark, msgParamList) elif notifyType == ShareDefine.CrossNotify_CrossAct: country, msgMark, msgParamList = params @@ -187,7 +209,10 @@ return NotifyCodeList - +#------------------------------------------------------------------------------ +def GetDBPlayerAccIDByID(playerID): + ## 获取玩家表账号ID - 根据玩家ID, 可用于判断是否本服玩家 + return PyGameData.g_dbPlayerIDMap.get(playerID, "") #waring:以下使用的扩展属性字段记录的属性类型必须和MapServer一致 #------------------------------------------------------------------------------ @@ -205,6 +230,11 @@ def GetPrestige(curPlayer): return 0 +##总战斗力 +def GetFightPower(curPlayer): return curPlayer.GetFightPowerEx() * ChConfig.Def_PerPointValue + curPlayer.GetFightPower() +def SetFightPower(curPlayer, value): + curPlayer.SetFightPower(value % ChConfig.Def_PerPointValue, value / ChConfig.Def_PerPointValue) + return #------------------------------------------------------------------------------ ## 协助目标玩家ID @@ -216,11 +246,12 @@ ## 副本功能线路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 curPlayer.GetExAttr9() -def SetVIPExpireTime(curPlayer, expireTime): return curPlayer.SetExAttr9(expireTime) +def GetVIPExpireTime(curPlayer): return 0 +def SetVIPExpireTime(curPlayer, expireTime): return def GetValidVIPLV(curPlayer): # @return: 返回当前有效的VIP等级 # vipTime = GetVIPExpireTime(curPlayer) @@ -250,6 +281,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() @@ -285,6 +319,18 @@ #------------------------------------------------------------------------------ +def MapServer_QueryPlayer_DoLogic(tagPlayer, callName, cmdInfo, srcPlayerID=0, queryType=0): + ## 通知目标玩家地图执行 DoLogic + tagPlayerID = tagPlayer.GetPlayerID() + tagMapID = tagPlayer.GetRealMapID() + if tagMapID: + cmdStr = str(cmdInfo) + GameWorld.Log("MapServer_QueryPlayer_DoLogic: %s, cmdInfo=%s,tagPlayerID=%s,tagMapID=%s" + % (callName, cmdInfo, tagPlayerID, tagMapID), srcPlayerID) + #MapServer_QueryPlayer(int srcPlayerID, int queryType, int queryID, int mapID, char *callName, char *cmd,WORD cmdLen, int RouteServerIndex) + GameWorld.GetPlayerManager().MapServer_QueryPlayer(srcPlayerID, 0, tagPlayerID, tagMapID, callName, + cmdStr, len(cmdStr), tagPlayer.GetRouteServerIndex()) + return ## 增加成就完成进度 # @param curPlayer @@ -334,6 +380,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: 成就类型 @@ -355,3 +407,128 @@ return ipyData.GetLimitLV() +# 因为MapServer玩家属性变更通知GameServer与功能开启通知触发时机有先后顺序,可能导致判断功能开启不准确,所以暂时记录该信息,临时用 +g_playerOpenFuncInfo = {} # 玩家触发功能开启功能ID信息,{playerID:[funcID, ...], ...} +## 功能是否可用,该函数并不能确保百分百正确,只能大致判断,仅判断部分条件,如包含未判断的条件则不能确保百分百正确 +def GetFuncCanUse(curPlayer, funcID): + playerID = curPlayer.GetPlayerID() + if playerID in g_playerOpenFuncInfo: + if funcID in g_playerOpenFuncInfo[playerID]: + return True + + ipyData = IpyGameDataPY.GetIpyGameData("FuncOpenLV", funcID) + if not ipyData: + return False + + if ipyData.GetLimitLV() and ipyData.GetLimitLV() > curPlayer.GetLV(): + return False + + if ipyData.GetLimiRealmLV() and ipyData.GetLimiRealmLV() > curPlayer.GetOfficialRank(): + return False + + if ipyData.GetLimitVIPLV() and ipyData.GetLimitVIPLV() > curPlayer.GetVIPLv(): + return False + + return True + +def DoFuncOpenLogic(curPlayer, funcIDList): + global g_playerOpenFuncInfo + if GameWorld.IsCrossServer(): + return + 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: + if playerID not in g_playerOpenFuncInfo: + g_playerOpenFuncInfo[playerID] = [] + openFuncIDList = g_playerOpenFuncInfo[playerID] + if funcID not in openFuncIDList: + openFuncIDList.append(funcID) + GameWorld.DebugLog("触发功能开启逻辑! funcID=%s" % funcID, playerID) + 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