From e7a6f9f5439ed847fa7915de178dd743e51a61b1 Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期五, 28 十二月 2018 15:11:10 +0800 Subject: [PATCH] 5424 【后端】【1.4】跨服竞技场开发(修复匹配中匹配状态结束后玩家还被视为匹配中的bug) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py | 327 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 289 insertions(+), 38 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py index e3fcff1..f9d5821 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBHelpBattle.py @@ -31,15 +31,34 @@ import NPCCommon import FBLogic import PlayerVip +import IPY_GameWorld +import PlayerActivity + +import time def DoPlayerOnDay(curPlayer): checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount) checkInCount = checkInInfo / 10 # 累计登记 todayIsCheckIn = checkInInfo % 10 # 今天是否已登记 if todayIsCheckIn: - checkInInfo = (checkInCount + 1) * 10 + 0 + checkInInfo = checkInCount * 10 + 0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo) SyncCheckInState(curPlayer, 0, False) + + # 重置每日已获得仙缘币 + ondaySetXianyuanCoin = 0 + ondayLoginSetXianyuanCoin = curPlayer.GetDictByKey(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin) + if ondayLoginSetXianyuanCoin: + # 这里做时间比较,预防玩家登录后就没有再切换地图,再次在该地图过天会导致设置值错误问题 + loginAddCoinTime = curPlayer.GetDictByKey(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime) + if GameWorld.CheckTimeIsSameServerDayEx(loginAddCoinTime): + ondaySetXianyuanCoin = ondayLoginSetXianyuanCoin + GameWorld.DebugLog("玩家过天时,登录增加仙缘币有值,仍然是同一天,仙缘币重置为登录时增加的仙缘币!ondayLoginSetXianyuanCoin=%s" % ondayLoginSetXianyuanCoin) + else: + GameWorld.DebugLog("玩家过天时,登录增加仙缘币有值,但是不是同一天了,仙缘币重置为0!") + PlayerControl.SetTodayXianyuanCoin(curPlayer, ondaySetXianyuanCoin) + GameWorld.DebugLog("玩家过天设置今日已获得仙缘币: ondaySetXianyuanCoin=%s,ondayLoginSetXianyuanCoin=%s" + % (ondaySetXianyuanCoin, ondayLoginSetXianyuanCoin)) return def DoPlayerLogin(curPlayer): @@ -69,13 +88,17 @@ __OnHelpBattleCheckInResult(curPlayer, msgList, tick) # 刷新 - if cmd == "Refresh": + elif cmd == "Refresh": __OnHelpBattleRefreshResult(curPlayer, msgList, tick) # 助战记录 - if cmd == "HelpRecord": + elif cmd == "HelpRecord": __OnHelpBattleRecord(curPlayer, msgList, tick) + # 扫荡召唤 + elif cmd == "SweepCall": + __OnHelpBattleSweepCallResult(curPlayer, msgList, tick) + return #// B1 05 助战登记 #tagCMHelpBattleCheckIn @@ -103,6 +126,7 @@ if isOK: checkInInfo = (checkInCount + 1) * 10 + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo) + PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_HelpBattleCheckIn) # 没有数据缓存的话,马上同步一次 if not haveViewCache: @@ -146,6 +170,9 @@ for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items(): objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID) if objID: + if helpPlayerID == calledPlayerID: + GameWorld.DebugLog("该助战机器人ID已经召唤过,不允许重复召唤!calledPlayerID=%s" % calledPlayerID) + return calledCount += 1 # 统计免费的未召唤的 elif not helpPlayerInfoDict.get("NeedGoldCall", 0): @@ -215,8 +242,10 @@ if not helpBattleNPC: continue objID = helpBattleNPC.GetID() + helpBattleNPC.SetIsNeedProcess(True) GameWorld.Log("召唤助战成功: calledPlayerID=%s,objID=%s,fightPower=%s" % (calledPlayerID, objID, fightPower), playerID) gameFB.SetGameFBDict(ChConfig.Def_FB_HelpBattleFBObjID % calledPlayerID, objID) + helpBattleNPC.SetDict(ChConfig.Def_NPC_Dict_AtkDelayTick, calledCount * 1000) # 按转换顺序每个延长1秒攻击,防止动作一致 calledCount += 1 # 设置助战属性 npcControl = NPCCommon.NPCControl(helpBattleNPC) @@ -227,6 +256,7 @@ callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult() callResultPack.ObjID = objID callResultPack.PlayerID = calledPlayerID + callResultPack.Job = job NetPackCommon.SendFakePack(curPlayer, callResultPack) # 召唤满后 @@ -285,8 +315,8 @@ costMoneyList = [] calledPlayerIDDict = {} # 已经召唤的玩家ID字典 {playerID:[是否付费召唤, 职业], ...} + refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount) if isClientRefresh: - refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount) freeRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 1) goldRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 2) if refreshCount >= (freeRefreshCount + goldRefreshCount): @@ -313,7 +343,8 @@ # 非客户端刷新的视为重新开始,重置刷新次数 else: - gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0) + if not refreshCount: + gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0) gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBFightPower, ipyData.GetFightPowerMin()) gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBBaseHurt, ipyData.GetRobotBaseHurt()) GameWorld.DebugLog("设置副本战力=%s,保底伤害=%s" % (ipyData.GetFightPowerMin(), ipyData.GetRobotBaseHurt())) @@ -367,9 +398,84 @@ NetPackCommon.SendFakePack(curPlayer, helpPlayerListPack) return +def SendGameServer_SweepCallHelpBattlePlayer(curPlayer, mapID, funcLineID): + ## 发送GameServer请求扫荡助战玩家 + ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID) + if not ipyData: + return + playerID = curPlayer.GetPlayerID() + msgInfo = str(["SweepCall", mapID, funcLineID]) + GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo)) + GameWorld.Log("SendGameServer_SweepCallHelpBattlePlayer %s" % (msgInfo), playerID) + return + +def __OnHelpBattleSweepCallResult(curPlayer, msgList, tick): + ## 助战扫荡结果处理 + cmd, mapID, funcLineID, helpBattlePlayerDict = msgList + playerID = curPlayer.GetPlayerID() + GameWorld.DebugLog("__OnHelpBattleSweepCallResult %s,mapID=%s,funcLineID=%s,helpBattlePlayerDict=%s" + % (cmd, mapID, funcLineID, helpBattlePlayerDict), playerID) + + fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID) + if not fbFuncIpyData: + return + + reason = 0 + addCoinRate = 10000 # 基础倍率 + baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币 + + xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限 + relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} + todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # 今日已获得仙缘币 + playerXianyuanCoinUpper = xianyuanCoinUpper + if curPlayer.GetVIPLv(): + playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd) + addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer) + + relation, relationAdd = 0, 0 + for helpPlayerInfoDict in helpBattlePlayerDict.values(): + relation = helpPlayerInfoDict.get("Relation", 0) + if not relation: + continue + relationAddList = relationCoinAddDict.get(str(relation), []) + relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0 + + coinAdd = 0 + if baseFBPoint: + coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0) + canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0) + coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币 + if canAddMax == 0 and not reason: + reason = 2 + + GameWorld.DebugLog("扫荡副本增加仙缘币: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s" + % (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal), playerID) + if coinAddReal: + addDataDict = {"MapID":mapID, "FuncLineID":funcLineID, "IsSweep":1} + PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict) + PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal) + + #扫荡结果给奖励等 + FBLogic.OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, funcLineID, helpBattlePlayerDict, coinAddReal, reason) + + # 通知自己获得仙缘币 + msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg() + msgPack.MapID = mapID + msgPack.FuncLineID = funcLineID + msgPack.Relation = relation + msgPack.RelationCoinAdd = relationAdd + msgPack.XianyuanCoinAdd = coinAddReal + msgPack.Reason = reason + #msgPack.CallPlayerID = relationPlayerID + #msgPack.CallPlayerName = relationPlayerName + msgPack.NameLen = len(msgPack.CallPlayerName) + msgPack.IsSweep = 1 + NetPackCommon.SendFakePack(curPlayer, msgPack) + return + def __OnHelpBattleRecord(curPlayer, msgList, tick): ## 助战记录同步 - cmd, helpRecordList = msgList + cmd, helpRecordList, isLogin = msgList playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("__OnHelpBattleRecord %s,helpRecordList=%s" % (cmd, helpRecordList), playerID) @@ -407,28 +513,50 @@ NetPackCommon.SendFakePack(curPlayer, recordPack) addDataDict = {"HelpList":drList} - GameWorld.DebugLog(" addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s,totalHelpCount=%s" - % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount), playerID) + GameWorld.DebugLog(" addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s,totalHelpCount=%s,isLogin=%s" + % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount, isLogin), playerID) PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addXianyuanCoinTotal, addDataDict=addDataDict, isSysHint=False) if addXianyuanCoinTotalTotay: PlayerControl.AddTodayXianyuanCoin(curPlayer, addXianyuanCoinTotalTotay) - + if isLogin: + curPlayer.SetDict(ChConfig.Def_PDict_TodayXianyuanCoinOnLogin, addXianyuanCoinTotalTotay) + curPlayer.SetDict(ChConfig.Def_PDict_LoginAddTodayXianyuanCoinTime, int(time.time())) + GameWorld.Log(" 登录时今日助战信息: addXianyuanCoinTotalTotay=%s" % (addXianyuanCoinTotalTotay), playerID) + # 更新总助战次数,更新排行榜 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleTotalCount, totalHelpCount) if totalHelpCount >= IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 4): PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FBHelpBattle, totalHelpCount) return -def DoSingleFBAddXianyuanCoin(curPlayer, mapID, lineID): - ## 挑战单人副本增加仙缘币,仅适用于召唤镜像助战挑战的副本 +def DoFBAddXianyuanCoin(curPlayer, mapID, lineID, isHelp=False): + '''真人挑战副本增加仙缘币,包含过关或助战(不含镜像助战) + @param isHelp: 是否助战的 + @return: 获得的仙缘币, 无法获得仙缘币原因(1-达到助战次数上限,2-达到每日获得仙缘币上限) + ''' playerID = curPlayer.GetPlayerID() fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID) - fbHelpIpyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, lineID) - if not fbFuncIpyData or not fbHelpIpyData: - return + if not fbFuncIpyData: + return 0, 0 + reason = 0 addCoinRate = 10000 # 基础倍率 - baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币 + if not isHelp: + baseFBPoint = fbFuncIpyData.GetFBPoint() # 过关 - 基础仙缘币 + else: + baseFBPoint = fbFuncIpyData.GetHelpPoint() # 助战 + dayHelpCountMax = fbFuncIpyData.GetDayHelpCountMax() # 真实助战每日可获得仙缘币次数 + if dayHelpCountMax: + todayHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FBRealHelpCount % mapID) + if todayHelpCount >= dayHelpCountMax: + baseFBPoint = 0 + reason = 1 + GameWorld.DebugLog("达到每日助战可获得仙缘币次数上限!无法再获得!mapID=%s" % (mapID), playerID) + else: + todayHelpCount += 1 + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FBRealHelpCount % mapID, todayHelpCount) + GameWorld.DebugLog("增加每日助战可获得仙缘币次数!mapID=%s,todayHelpCount=%s" % (mapID, todayHelpCount), playerID) + xianyuanCoinUpper = IpyGameDataPY.GetFuncCfg("HelpBattlePoint", 1) # 每日仙缘币上限 relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} todayXianyuanCoin = PlayerControl.GetTodayXianyuanCoin(curPlayer) # 今日已获得仙缘币 @@ -437,33 +565,156 @@ playerXianyuanCoinUpper += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinUpperAdd) addCoinRate += PlayerVip.GetPrivilegeValue(curPlayer, ChConfig.VIPPrivilege_XianyuanCoinAddPer) - if todayXianyuanCoin >= playerXianyuanCoinUpper: - GameWorld.DebugLog("玩家今日仙缘币已达上限!todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s" - % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID) - return + #达到上限也需要记录,所以这里暂不限制 + #if todayXianyuanCoin >= playerXianyuanCoinUpper: + # GameWorld.DebugLog("玩家今日仙缘币已达上限!todayXianyuanCoin=%s,playerXianyuanCoinUpper=%s" + # % (todayXianyuanCoin, playerXianyuanCoinUpper), playerID) + # return - relationAdd = 0 - helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {}) - for helpPlayerInfoDict in helpBattlePlayerDict.values(): - relation = helpPlayerInfoDict.get("Relation", 0) - if not relation: - continue - relationAddList = relationCoinAddDict.get(str(relation), []) - relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0 - - coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0) + relation, relationAdd, relationPlayerID, relationPlayerName = 0, 0, 0, "" + + fbType = GameWorld.GetMap().GetMapFBType() + if fbType == IPY_GameWorld.fbtSingle: + gameFB = GameWorld.GetGameFB() + helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {}) + for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items(): + objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID) + if not objID: + continue + relation = helpPlayerInfoDict.get("Relation", 0) + if not relation: + continue + relationAddList = relationCoinAddDict.get(str(relation), []) + relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0 + elif fbType == IPY_GameWorld.fbtTeam: + if playerID in PyGameData.g_teamFBMemRelationAddDict: + relation, relationAdd, relationPlayerID, relationPlayerName = PyGameData.g_teamFBMemRelationAddDict.pop(playerID) + + coinAdd = 0 + if baseFBPoint: + coinAdd = int((baseFBPoint + relationAdd) * addCoinRate / 10000.0) canAddMax = max(playerXianyuanCoinUpper - todayXianyuanCoin, 0) coinAddReal = min(coinAdd, canAddMax) # 实际加仙缘币 + if canAddMax == 0 and not reason: + reason = 2 + + if isHelp and not relationPlayerID: + relationPlayerID = 1 + #GameWorld.DebugLog("没有助战目标则设置relationPlayerID为1,标记是助战的!") + + GameWorld.DebugLog("挑战副本增加仙缘币: baseFBPoint=%s,relationAdd=%s,addCoinRate=%s,coinAdd=%s,canAddMax=%s,coinAddReal=%s,relationPlayerID=%s" + % (baseFBPoint, relationAdd, addCoinRate, coinAdd, canAddMax, coinAddReal, relationPlayerID), playerID) + if coinAddReal: + addDataDict = {"MapID":mapID, "FuncLineID":lineID} + PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict) + PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal) + + # 通知自己获得仙缘币 + msgPack = ChPyNetSendPack.tagMCAddXianyuanCoinMsg() + msgPack.MapID = mapID + msgPack.FuncLineID = lineID + msgPack.Relation = relation + msgPack.RelationCoinAdd = relationAdd + msgPack.XianyuanCoinAdd = coinAddReal + msgPack.Reason = reason + msgPack.CallPlayerID = relationPlayerID + msgPack.CallPlayerName = relationPlayerName + msgPack.NameLen = len(msgPack.CallPlayerName) + NetPackCommon.SendFakePack(curPlayer, msgPack) + return coinAddReal, reason + +def __GetTeamFBMemRelationInfo(curPlayer, isHelp, leavePlayerID): + ## 计算队员间相互加成信息,离线玩家不算 + relation = 0 + relationAdd = 0 # 社交关系加成 + relationPlayerID = 0 + relationPlayerName = "" + teamID = curPlayer.GetTeamID() + if teamID not in PyGameData.g_teamFBMemRelationDict: + return relation, relationAdd, relationPlayerID, relationPlayerName - GameWorld.DebugLog("挑战单人副本增加仙缘币: coinAdd=%s,canAddMax=%s,coinAddReal=%s" % (coinAdd, canAddMax, coinAddReal), playerID) - addDataDict = {"MapID":mapID, "FuncLineID":lineID} - PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, coinAddReal, addDataDict=addDataDict) - PlayerControl.AddTodayXianyuanCoin(curPlayer, coinAddReal) + playerManager = GameWorld.GetMapCopyPlayerManager() + friendList, memFamilyIDDict, memNameDict = PyGameData.g_teamFBMemRelationDict[teamID] + relationList = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 3, []) # 社交关系优先级 + relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # 社交关系加成 {"社交关系":[过关加成, 助战加成], ...} + playerID = curPlayer.GetPlayerID() + familyID = curPlayer.GetFamilyID() + if isHelp: + # 助战的随便取一位优先级最高的即可 + defaultRelationPlayerID = 0 + for memPlayerID, memFamilyID in memFamilyIDDict.items(): + memRelation, relationPlayerID = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID) + if not memRelation: + if not defaultRelationPlayerID and relationPlayerID: + defaultRelationPlayerID = relationPlayerID + continue + relation = memRelation + relationAddList = relationCoinAddDict.get(str(memRelation), []) + relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0 + relationPlayerName = memNameDict[relationPlayerID] + return relation, relationAdd, relationPlayerID, relationPlayerName + + relationPlayerID = defaultRelationPlayerID + relationPlayerName = memNameDict.get(relationPlayerID, "") + GameWorld.DebugLog("助战默认无关系队员: relationPlayerID=%s,relationPlayerName=%s" % (relationPlayerID, relationPlayerName), playerID) + else: + # 非助战享受所有队员加成 + for memPlayerID, memFamilyID in memFamilyIDDict.items(): + memRelation = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)[0] + if not memRelation: + continue + if memRelation == relationList[0]: + relation = memRelation + elif relation: + relation = memRelation + relationAddList = relationCoinAddDict.get(str(memRelation), []) + relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0 + + return relation, relationAdd, relationPlayerID, relationPlayerName + +def __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID): + ## 离线玩家不算社交关系 + if leavePlayerID and memPlayerID == leavePlayerID: + return 0, 0 + if playerID == memPlayerID: + return 0, 0 + memPlayer = playerManager.FindPlayerByID(memPlayerID) + if memPlayer == None or memPlayer.IsEmpty(): + return 0, 0 + for checkRelation in relationList: + if checkRelation == 1: + if [playerID, memPlayerID] in friendList: + return checkRelation, memPlayerID + if checkRelation == 2: + if playerID != memPlayerID and familyID and familyID == memFamilyID: + return checkRelation, memPlayerID + return 0, memPlayerID + +def RefershTeamFBMemRelation(tick, leavePlayerID=0): + ## 刷新组队副本队员关系 + playerManager = GameWorld.GetMapCopyPlayerManager() + for i in xrange(playerManager.GetPlayerCount()): + player = playerManager.GetPlayerByIndex(i) + if player == None or player.IsEmpty(): + continue + if leavePlayerID and player.GetPlayerID() == leavePlayerID: + PyGameData.g_teamFBMemRelationAddDict.pop(leavePlayerID, 0) + continue + relation, relationAdd, relationPlayerID, relationPlayerName = __GetTeamFBMemRelationInfo(player, FBCommon.GetIsHelpFight(player), leavePlayerID) + PyGameData.g_teamFBMemRelationAddDict[player.GetPlayerID()] = [relation, relationAdd, relationPlayerID, relationPlayerName] + + for index in xrange(playerManager.GetPlayerCount()): + player = playerManager.GetPlayerByIndex(index) + if player == None or player.IsEmpty(): + continue + if leavePlayerID and player.GetPlayerID() == leavePlayerID: + continue + FBLogic.DoFBHelp(player, tick) + return -def DoTeamFBAddXianyuanCoin(curPlayer, mapID, lineID, callPlayerID, callPlayerName, relation): - ## 挑战组队副本增加仙缘币 - return - - +def GetTeamFBMemRelationInfo(playerID): + if playerID not in PyGameData.g_teamFBMemRelationAddDict: + return 0, 0 + return PyGameData.g_teamFBMemRelationAddDict[playerID][:2] -- Gitblit v1.8.0