From e8bf98a53369d63ce2ea76e135d55c43b0494734 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期一, 26 十一月 2018 00:54:52 +0800 Subject: [PATCH] 4762 【后端】增加助战排行榜;增加离线玩家助战信息处理; --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py | 142 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 133 insertions(+), 9 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py index eb7a34a..e5ca696 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py @@ -16,21 +16,23 @@ #------------------------------------------------------------------------------- import PlayerFriend -import PlayerViewCache import IpyGameDataPY +import PlayerViewCache +import IPY_GameServer +import PlayerControl +import ShareDefine import PyGameData import GameWorld +import ChConfig import random import time -import IPY_GameServer -import PlayerControl -import ChConfig -import ChPyNetSendPack -import NetPackCommon MaxRobotID = 100 # 最大机器人NPC定义ID - + +Def_RecType_CheckInPlayer = ShareDefine.Def_UniversalGameRecType_FBHelpBattleCheckInPlayer +Def_RecType_HelpRecord = ShareDefine.Def_UniversalGameRecType_FBHelpBattleRecord + ## 助战玩家简要信息 class HelpBattlePlayer(): @@ -62,7 +64,119 @@ self.vipLV = 0 # 当时的VIP等级 self.recordTime = 0 # 记录的时间 return + +def OnServerStart(): + GameWorld.Log("开服加载助战相关信息...") + universalRecMgr = GameWorld.GetUniversalRecMgr() + checkInPlayerRecList = universalRecMgr.GetTypeList(Def_RecType_CheckInPlayer) + for index in xrange(checkInPlayerRecList.Count()): + recData = checkInPlayerRecList.At(index) + playerID = recData.GetValue1() + helpBattlePlayer = HelpBattlePlayer(playerID) + helpBattlePlayer.checkInTime = recData.GetTime() + helpBattlePlayer.fightPower = recData.GetValue2() + helpBattlePlayer.familyID = recData.GetValue3() + helpBattlePlayer.checkInCount = recData.GetValue4() + value5 = recData.GetValue5() + helpBattlePlayer.playerLV = value5 / 100000 + helpBattlePlayer.vipLV = int(str(value5)[-5:-3]) + helpBattlePlayer.realmLV = int(str(value5)[-3:-1]) + helpBattlePlayer.job = value5 % 10 + helpBattlePlayer.playerName = recData.GetStrValue1() + helpBattlePlayer.todayXianyuanCoin = int(recData.GetStrValue2()) + helpCountDictStr = recData.GetStrValue3() + if helpCountDictStr.startswith("{") and helpCountDictStr.endswith("{"): + helpBattlePlayer.todayHelpCountDict = eval(helpCountDictStr) + else: + GameWorld.ErrLog("LoadCheckInPlayerError: helpCountDictStr=%s" % helpCountDictStr, playerID) + PyGameData.g_fbHelpBattleCheckInPlayerDict[playerID] = helpBattlePlayer + GameWorld.Log("加载助战登记玩家记录: %s" % len(PyGameData.g_fbHelpBattleCheckInPlayerDict)) + helpRecordRecList = universalRecMgr.GetTypeList(Def_RecType_HelpRecord) + for index in xrange(helpRecordRecList.Count()): + recData = helpRecordRecList.At(index) + playerID = recData.GetValue1() + + helpRecord = FBHelpBattleRecord() + helpRecord.callPlayerID = int(recData.GetStrValue2()) + helpRecord.callPlayerName = recData.GetStrValue1() + helpRecord.mapID = recData.GetValue2() + helpRecord.funcLineID = recData.GetValue3() + helpRecord.xianyuanCoinAdd = recData.GetValue4() + helpRecord.relation = recData.GetValue5() % 10 + helpRecord.vipLV = recData.GetValue5() / 10 + helpRecord.recordTime = recData.GetTime() + + unNotifyRecordList = PyGameData.g_fbHelpBattleRecord.get(playerID, []) + unNotifyRecordList.append(helpRecord) + PyGameData.g_fbHelpBattleRecord[playerID] = unNotifyRecordList + + GameWorld.Log("加载玩家未同步助战: %s" % len(PyGameData.g_fbHelpBattleRecord)) + for playerID, helpList in PyGameData.g_fbHelpBattleRecord.items(): + GameWorld.Log("加载玩家未同步助战记录: %s" % (len(helpList)), playerID) + return + +def OnServerClose(): + GameWorld.Log("关服保存助战相关信息...") + universalRecMgr = GameWorld.GetUniversalRecMgr() + universalRecMgr.Delete(Def_RecType_CheckInPlayer) + universalRecMgr.Delete(Def_RecType_HelpRecord) + + GameWorld.Log("保存助战登记玩家记录: %s" % len(PyGameData.g_fbHelpBattleCheckInPlayerDict)) + checkInPlayerRecList = universalRecMgr.GetTypeList(Def_RecType_CheckInPlayer) + for playerID, checkInPlayer in PyGameData.g_fbHelpBattleCheckInPlayerDict.items(): + recData = checkInPlayerRecList.AddRec() + recData.SetTime(checkInPlayer.checkInTime) + recData.SetValue1(playerID) + recData.SetValue2(checkInPlayer.fightPower) + recData.SetValue3(checkInPlayer.familyID) + recData.SetValue4(checkInPlayer.checkInCount) + recData.SetValue5(int("%d%02d%02d%d" % (checkInPlayer.playerLV, checkInPlayer.vipLV, checkInPlayer.realmLV, checkInPlayer.job))) + recData.SetStrValue1(checkInPlayer.playerName) + recData.SetStrValue2(str(checkInPlayer.todayXianyuanCoin)) + recData.SetStrValue3(str(checkInPlayer.todayHelpCountDict).replace(" ", "")) + + GameWorld.Log("保存助战未同步记录: %s" % len(PyGameData.g_fbHelpBattleRecord)) + helpRecordRecList = universalRecMgr.GetTypeList(Def_RecType_HelpRecord) + for playerID, helpList in PyGameData.g_fbHelpBattleRecord.items(): + GameWorld.Log("玩家未同步助战记录: %s" % (len(helpList)), playerID) + for helpRecord in helpList: + recData = helpRecordRecList.AddRec() + recData.SetTime(helpRecord.recordTime) + recData.SetValue1(playerID) + recData.SetValue2(helpRecord.mapID) + recData.SetValue3(helpRecord.funcLineID) + recData.SetValue4(helpRecord.xianyuanCoinAdd) + recData.SetValue5(helpRecord.vipLV*10+helpRecord.relation) + recData.SetStrValue1(helpRecord.callPlayerName) + recData.SetStrValue2(str(helpRecord.callPlayerID)) + return + +def HelpBattleOnDay(): + curTime = int(time.time()) + checkInValidHours = IpyGameDataPY.GetFuncCfg("HelpBattleCheckIn", 1) # 登记有效时长,小时 + # 这里延长30分钟清除,防止已经被召唤还没结算的导致找不到登记信息 + checkInValidSeconds = checkInValidHours * 3600 + 30 * 60 + + # 清超时登记,重置信息 + for playerID, checkInPlayer in PyGameData.g_fbHelpBattleCheckInPlayerDict.items(): + checkInTime = checkInPlayer.checkInTime + if curTime - checkInTime > checkInValidSeconds: + PyGameData.g_fbHelpBattleCheckInPlayerDict.pop(playerID) + GameWorld.Log("清除超时助战登记玩家: curTime=%s,checkInTime=%s" % (curTime, checkInTime), playerID) + continue + checkInPlayer.todayHelpCountDict = {} + checkInPlayer.todayXianyuanCoin = 0 + return + +def OnHelpPlayerLogin(curPlayer): + playerID = curPlayer.GetPlayerID() + if playerID not in PyGameData.g_fbHelpBattleRecord: + return + unNotifyRecordList = PyGameData.g_fbHelpBattleRecord.pop(playerID) + SendMapServer_FBHelpBattleRecord(curPlayer, unNotifyRecordList) + return + ## 是否在助战登记列表里 def IsInHelpBattleCheckInList(playerID): return playerID in PyGameData.g_fbHelpBattleCheckInPlayerDict @@ -298,6 +412,14 @@ if not fbFuncIpyData or not fbHelpIpyData or not calledPlayerDict: return + helpCountLineID = funcLineID # 助战次数所属lineID,当所有层通用时,默认为0 + dayFreeHelpCountInfo = fbHelpIpyData.GetDayFreeHelpCount() + if dayFreeHelpCountInfo and len(dayFreeHelpCountInfo) == 2: + isAllLineCount = dayFreeHelpCountInfo[1] + if isAllLineCount: + helpCountLineID = 0 + helpCountKey = (mapID, helpCountLineID) + curTime = int(time.time()) tagPlayerID = curPlayer.GetPlayerID() tagPlayerName = curPlayer.GetName() @@ -305,7 +427,7 @@ xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限 baseHelpPoint = fbFuncIpyData.GetHelpPoint() # 助战 - 基础仙缘币 relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} - GameWorld.DebugLog("召唤助战: mapID=%s, funcLineID=%s, calledPlayerDict=%s" % (mapID, funcLineID, calledPlayerDict), tagPlayerID) + GameWorld.DebugLog("召唤助战: mapID=%s, funcLineID=%s, helpCountKey=%s, calledPlayerDict=%s" % (mapID, funcLineID, helpCountKey, calledPlayerDict), tagPlayerID) for calledPlayerID, relation in calledPlayerDict.items(): if calledPlayerID not in PyGameData.g_fbHelpBattleCheckInPlayerDict: @@ -316,6 +438,8 @@ relationAdd = relationAddList[1] if len(relationAddList) == 2 else 0 helpBattlePlayer = PyGameData.g_fbHelpBattleCheckInPlayerDict[calledPlayerID] + todayMapHelpCount = helpBattlePlayer.todayHelpCountDict.get(helpCountKey, 0) + 1 + helpBattlePlayer.todayHelpCountDict[helpCountKey] = todayMapHelpCount todayXianyuanCoin = helpBattlePlayer.todayXianyuanCoin # 今日已获得仙缘币 vipLV = helpBattlePlayer.vipLV if vipLV: @@ -329,7 +453,7 @@ coinAdd = int((baseHelpPoint + relationAdd) * addCoinRate / 10000.0) canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0) coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币 - GameWorld.DebugLog(" 助战增加仙缘币: coinAddReal=%s" % (coinAddReal), calledPlayerID) + GameWorld.DebugLog(" 助战增加仙缘币: coinAddReal=%s, todayMapHelpCount=%s" % (coinAddReal, todayMapHelpCount), calledPlayerID) # GameServer 直接先加 helpBattlePlayer.todayXianyuanCoin += coinAddReal -- Gitblit v1.8.0