From 8709eea88b2eaf09582f06290167b9a997c8fc3e Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期三, 05 十二月 2018 15:24:21 +0800 Subject: [PATCH] 4879 【后端】【1.3.100】宗门试练新增扫荡 --- ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py | 214 +++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 164 insertions(+), 50 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py index 854b607..8e2ef84 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerFBHelpBattle.py @@ -263,6 +263,10 @@ elif cmd == "Call": result = __DoFBHelpBattleCall(curPlayer.GetPlayerID(), curPlayer.GetName(), msgList) + # 扫荡召唤 + elif cmd == "SweepCall": + result = __DoFBHelpBattleSweepCall(curPlayer, msgList) + if result == None: return @@ -466,6 +470,162 @@ helpPlayerDict["Relation"] = relation return helpPlayerDict +def __DoFBHelpBattleSweepCall(curPlayer, msgList): + ''' 扫荡助战列表刷新且直接召唤 + 随机选择免费的玩家、过滤仙缘币已达上限或溢出的玩家 + ''' + mapID, funcLineID = msgList[1:] + + helpBattlePlayerDict = {} # 同步给地图服务器的待选助战玩家列表信息 + + fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID) + fbHelpIpyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID) + if not fbFuncIpyData or not fbHelpIpyData: + return [helpBattlePlayerDict] + + fightPowerMin = fbHelpIpyData.GetFightPowerMin() + fightPowerMax = fbHelpIpyData.GetFightPowerMax() + limitLV = fbHelpIpyData.GetLVLimit() + dayFreeHelpCountInfo = fbHelpIpyData.GetDayFreeHelpCount() # 每日免费助战次数,[每日免费助战次数, 是否所有层通用] + dayFreeHelpCount = 0 # 0为无限制次数 + helpCountLineID = funcLineID # 助战次数所属lineID,当所有层通用时,默认为0 + if dayFreeHelpCountInfo and len(dayFreeHelpCountInfo) == 2: + dayFreeHelpCount, isAllLineCount = dayFreeHelpCountInfo + if isAllLineCount: + helpCountLineID = 0 + helpCountKey = (mapID, helpCountLineID) + + playerID = curPlayer.GetPlayerID() + tagPlayerID = playerID + tagPlayerName = curPlayer.GetName() + GameWorld.Log("扫荡刷新助战列表: mapID=%s,funcLineID=%s,helpCountLineID=%s" % (mapID, funcLineID, helpCountLineID), playerID) + + curTime = int(time.time()) + maxHelpPlayerCount = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 2) # 最大助战人数 + checkInValidHours = IpyGameDataPY.GetFuncCfg("HelpBattleCheckIn", 1) # 登记有效时长,小时 + checkInValidSeconds = checkInValidHours * 3600 + + xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限 + baseHelpPoint = fbFuncIpyData.GetHelpPoint() # 助战 - 基础仙缘币 + relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} + + isSweep = True + checkInPlayerIDList = PyGameData.g_fbHelpBattleCheckInPlayerDict.keys() + random.shuffle(checkInPlayerIDList) # 刷新纯随机 + GameWorld.Log(" 登记助战人数=%s" % (len(checkInPlayerIDList)), playerID) + for checkInPlayerID in checkInPlayerIDList: + if checkInPlayerID == playerID: + GameWorld.DebugLog(" 自己不处理, checkInPlayerID=%s" % checkInPlayerID) + continue + if checkInPlayerID in helpBattlePlayerDict: + GameWorld.DebugLog(" 已经在助战里的不处理, checkInPlayerID=%s" % checkInPlayerID) + continue + if len(helpBattlePlayerDict) >= maxHelpPlayerCount: + GameWorld.DebugLog(" 超过最大个数了不处理, checkInPlayerID=%s" % checkInPlayerID) + break + helpBattlePlayer = PyGameData.g_fbHelpBattleCheckInPlayerDict[checkInPlayerID] + checkInPlayerLV = helpBattlePlayer.playerLV + checkInPlayerFightPower = helpBattlePlayer.fightPower + checkInTime = helpBattlePlayer.checkInTime + if checkInPlayerLV < limitLV: + GameWorld.DebugLog(" 等级不足, checkInPlayerID=%s,checkInPlayerLV=%s < limitLV=%s" % (checkInPlayerID, checkInPlayerLV, limitLV)) + continue + if fightPowerMin and checkInPlayerFightPower < fightPowerMin: + GameWorld.DebugLog(" 战力不足, checkInPlayerID=%s,checkInPlayerFightPower=%s < fightPowerMin=%s" % (checkInPlayerID, checkInPlayerFightPower, fightPowerMin)) + continue + if fightPowerMax and checkInPlayerFightPower > fightPowerMax: + GameWorld.DebugLog(" 战力超出, checkInPlayerID=%s,checkInPlayerFightPower=%s > fightPowerMax=%s" % (checkInPlayerID, checkInPlayerFightPower, fightPowerMax)) + continue + passTime = curTime - checkInTime + if passTime > checkInValidSeconds: + GameWorld.DebugLog(" 登记超时, checkInPlayerID=%s,checkInTime=%s,passTime=%s > checkInValidSeconds=%s" % (checkInPlayerID, checkInTime, passTime, checkInValidSeconds)) + continue + needGoldCall = False + todayHelpCount = helpBattlePlayer.todayHelpCountDict.get(helpCountKey, 0) + if dayFreeHelpCount: + needGoldCall = todayHelpCount >= dayFreeHelpCount + if needGoldCall: + GameWorld.DebugLog(" 不是免费, checkInPlayerID=%s,todayHelpCount=%s > dayFreeHelpCount=%s" % (checkInPlayerID, todayHelpCount, dayFreeHelpCount)) + continue + + relation = __GetHelpBattleRelation(curPlayer, helpBattlePlayer) + if not __DoCallHelpPlayer(tagPlayerID, tagPlayerName, helpBattlePlayer, relation, mapID, funcLineID, helpCountKey, isSweep, + curTime, xianyuanCoinUpper, relationCoinAddDict, baseHelpPoint): + continue + + helpBattlePlayerDict[checkInPlayerID] = __GetNotifyMapServerHelpPlayerInfoDict(helpBattlePlayer, needGoldCall, helpBattlePlayer.job, relation) + + # 不足的机器人NPC补足 + openJobList = IpyGameDataPY.GetFuncEvalCfg("OpenJob", 1) # 开放的职业 + lackCount = maxHelpPlayerCount - len(helpBattlePlayerDict) + robotID = 0 # 机器人NPC定义ID从1开始 + while lackCount > 0 and robotID < MaxRobotID: + robotID += 1 + if robotID in helpBattlePlayerDict: + continue + lackCount -= 1 + randJob = random.choice(openJobList) + helpBattlePlayerDict[robotID] = __GetNotifyMapServerHelpPlayerInfoDict(None, False, randJob) + + GameWorld.Log(" helpBattlePlayerDict=%s" % (helpBattlePlayerDict), playerID) + return [helpBattlePlayerDict] + +def __DoCallHelpPlayer(callPlayerID, callPlayerName, helpBattlePlayer, relation, mapID, funcLineID, helpCountKey, isSweep, curTime, + xianyuanCoinUpper, relationCoinAddDict, baseHelpPoint): + + calledPlayerID = helpBattlePlayer.playerID + addCoinRate = 10000 # 基础倍率 + playerXianyuanCoinUpper = xianyuanCoinUpper + relationAddList = relationCoinAddDict.get(str(relation), []) + relationAdd = relationAddList[1] if len(relationAddList) == 2 else 0 + + todayXianyuanCoin = helpBattlePlayer.todayXianyuanCoin # 今日已获得仙缘币 + vipLV = helpBattlePlayer.vipLV + if vipLV: + xianyuanCoinUpperAdd = PlayerControl.GetPrivilegeValue(vipLV, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd) + xianyuanCoinAddPer = PlayerControl.GetPrivilegeValue(vipLV, ChConfig.VIPPrivilege_XianyuanCoinAddPer) + + playerXianyuanCoinUpper += xianyuanCoinUpperAdd + addCoinRate += xianyuanCoinAddPer + + # 仙缘币公式=(通关仙缘币或助战仙缘币+社交关系加成)*VIP倍数 + coinAdd = int((baseHelpPoint + relationAdd) * addCoinRate / 10000.0) + canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0) + + # 扫荡不可溢出 + if isSweep and coinAdd > canAddMax: + GameWorld.DebugLog(" 今日仙缘币已达上限, calledPlayerID=%s,coinAdd=%s > canAddMax=%s" % (calledPlayerID, coinAdd, canAddMax)) + return + coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币 + + todayMapHelpCount = helpBattlePlayer.todayHelpCountDict.get(helpCountKey, 0) + 1 + helpBattlePlayer.todayHelpCountDict[helpCountKey] = todayMapHelpCount + GameWorld.DebugLog(" 助战增加仙缘币: todayXianyuanCoin=%s,coinUpper=%s,canAddMax=%s,coinAdd=%s,coinAddReal=%s,todayMapHelpCount=%s" + % (todayXianyuanCoin, playerXianyuanCoinUpper, canAddMax, coinAdd, coinAddReal, todayMapHelpCount), calledPlayerID) + + # GameServer 直接先加 + helpBattlePlayer.todayXianyuanCoin += coinAddReal + + helpRecord = FBHelpBattleRecord() + helpRecord.callPlayerID = callPlayerID # 召唤他的玩家ID + helpRecord.callPlayerName = callPlayerName + helpRecord.mapID = mapID + helpRecord.funcLineID = funcLineID + helpRecord.xianyuanCoinAdd = coinAddReal + helpRecord.relation = relation + helpRecord.vipLV = vipLV + helpRecord.recordTime = curTime + + calledPlayer = GameWorld.GetPlayerManager().FindPlayerByID(calledPlayerID) + # 非脱机在线直接通知地图 + if calledPlayer and not PlayerControl.GetIsTJG(calledPlayer): + SendMapServer_FBHelpBattleRecord(calledPlayer, [helpRecord]) + else: + unNotifyRecordList = PyGameData.g_fbHelpBattleRecord.get(calledPlayerID, []) + unNotifyRecordList.append(helpRecord) + PyGameData.g_fbHelpBattleRecord[calledPlayerID] = unNotifyRecordList + return True + def __DoFBHelpBattleCall(callPlayerID, callPlayerName, msgList): ''' 助战召唤,不管最终过关与否,被召唤方都直接算助战成功,这里处理被召唤的,主动方在地图直接处理 ''' @@ -485,63 +645,17 @@ helpCountKey = (mapID, helpCountLineID) curTime = int(time.time()) - tagPlayerID = callPlayerID - tagPlayerName = callPlayerName - playerMgr = GameWorld.GetPlayerManager() xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限 baseHelpPoint = fbFuncIpyData.GetHelpPoint() # 助战 - 基础仙缘币 relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} - GameWorld.DebugLog("召唤助战: mapID=%s, funcLineID=%s, helpCountKey=%s, calledPlayerDict=%s" % (mapID, funcLineID, helpCountKey, calledPlayerDict), tagPlayerID) - + GameWorld.DebugLog("召唤助战: mapID=%s, funcLineID=%s, helpCountKey=%s, calledPlayerDict=%s" % (mapID, funcLineID, helpCountKey, calledPlayerDict), callPlayerID) + isSweep = False for calledPlayerID, relation in calledPlayerDict.items(): if calledPlayerID not in PyGameData.g_fbHelpBattleCheckInPlayerDict: continue - addCoinRate = 10000 # 基础倍率 - playerXianyuanCoinUpper = xianyuanCoinUpper - relationAddList = relationCoinAddDict.get(str(relation), []) - 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: - xianyuanCoinUpperAdd = PlayerControl.GetPrivilegeValue(vipLV, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd) - xianyuanCoinAddPer = PlayerControl.GetPrivilegeValue(vipLV, ChConfig.VIPPrivilege_XianyuanCoinAddPer) - - playerXianyuanCoinUpper += xianyuanCoinUpperAdd - addCoinRate += xianyuanCoinAddPer - - # 仙缘币公式=(通关仙缘币或助战仙缘币+社交关系加成)*VIP倍数 - coinAdd = int((baseHelpPoint + relationAdd) * addCoinRate / 10000.0) - canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0) - coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币 - GameWorld.DebugLog(" 助战增加仙缘币: todayXianyuanCoin=%s,coinUpper=%s,canAddMax=%s,coinAdd=%s,coinAddReal=%s, todayMapHelpCount=%s" - % (todayXianyuanCoin, playerXianyuanCoinUpper, canAddMax, coinAdd, coinAddReal, todayMapHelpCount), calledPlayerID) - - # GameServer 直接先加 - helpBattlePlayer.todayXianyuanCoin += coinAddReal - - helpRecord = FBHelpBattleRecord() - helpRecord.callPlayerID = tagPlayerID # 召唤他的玩家ID - helpRecord.callPlayerName = tagPlayerName - helpRecord.mapID = mapID - helpRecord.funcLineID = funcLineID - helpRecord.xianyuanCoinAdd = coinAddReal - helpRecord.relation = relation - helpRecord.vipLV = vipLV - helpRecord.recordTime = curTime - - calledPlayer = playerMgr.FindPlayerByID(calledPlayerID) - # 非脱机在线直接通知地图 - if calledPlayer and not PlayerControl.GetIsTJG(calledPlayer): - SendMapServer_FBHelpBattleRecord(calledPlayer, [helpRecord]) - else: - unNotifyRecordList = PyGameData.g_fbHelpBattleRecord.get(calledPlayerID, []) - unNotifyRecordList.append(helpRecord) - PyGameData.g_fbHelpBattleRecord[calledPlayerID] = unNotifyRecordList - + __DoCallHelpPlayer(callPlayerID, callPlayerName, helpBattlePlayer, relation, mapID, funcLineID, helpCountKey, isSweep, + curTime, xianyuanCoinUpper, relationCoinAddDict, baseHelpPoint) return def SendMapServer_FBHelpBattleRecord(curPlayer, syncHelpRecordList, isLogin=False): -- Gitblit v1.8.0