|  |  |  | 
|---|
|  |  |  | import GameWorld | 
|---|
|  |  |  | import ChConfig | 
|---|
|  |  |  | import PlayerControl | 
|---|
|  |  |  | import PlayerBillboard | 
|---|
|  |  |  | import ChPyNetSendPack | 
|---|
|  |  |  | import NetPackCommon | 
|---|
|  |  |  | import PlayerViewCacheTube | 
|---|
|  |  |  | 
|---|
|  |  |  | 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 # 累计登记 | 
|---|
|  |  |  | checkInInfo = (checkInCount + 1) * 10 + 0 | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo) | 
|---|
|  |  |  | todayIsCheckIn = checkInInfo % 10 # 今天是否已登记 | 
|---|
|  |  |  | if todayIsCheckIn: | 
|---|
|  |  |  | 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): | 
|---|
|  |  |  | checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount) | 
|---|
|  |  |  | todayIsCheckIn = checkInInfo % 10 # 今天是否已登记 | 
|---|
|  |  |  | if todayIsCheckIn: | 
|---|
|  |  |  | SyncCheckInState(curPlayer, 1, True) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def SyncCheckInState(curPlayer, checkInState, isLogin): | 
|---|
|  |  |  | ## 同步登记状态 | 
|---|
|  |  |  | checkInPack = ChPyNetSendPack.tagMCHelpBattleCheckInResult() | 
|---|
|  |  |  | checkInPack.IsOK = checkInState | 
|---|
|  |  |  | checkInPack.IsLogin = int(isLogin) | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, checkInPack) | 
|---|
|  |  |  | return | 
|---|
|  |  |  |  | 
|---|
|  |  |  | def GameServer_FBHelpBattleResult(curPlayer, msgList, tick): | 
|---|
|  |  |  | 
|---|
|  |  |  | __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 | 
|---|
|  |  |  | 
|---|
|  |  |  | if isOK: | 
|---|
|  |  |  | checkInInfo = (checkInCount + 1) * 10 + 1 | 
|---|
|  |  |  | PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo) | 
|---|
|  |  |  | PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_HelpBattleCheckIn) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 没有数据缓存的话,马上同步一次 | 
|---|
|  |  |  | if not haveViewCache: | 
|---|
|  |  |  | PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, False) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | checkInPack = ChPyNetSendPack.tagMCHelpBattleCheckInResult() | 
|---|
|  |  |  | checkInPack.IsOK = isOK | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, checkInPack) | 
|---|
|  |  |  | SyncCheckInState(curPlayer, 1, False) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | GameWorld.DebugLog("FBHelpBattleResult: %s,checkInCount=%s,fightPower=%s,isOK=%s,haveViewCache=%s" | 
|---|
|  |  |  | % (cmd, checkInCount, fightPower, isOK, haveViewCache), curPlayer.GetPlayerID()) | 
|---|
|  |  |  | 
|---|
|  |  |  | 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): | 
|---|
|  |  |  | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  | 
|---|
|  |  |  | callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult() | 
|---|
|  |  |  | callResultPack.ObjID = objID | 
|---|
|  |  |  | callResultPack.PlayerID = calledPlayerID | 
|---|
|  |  |  | callResultPack.Job = job | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, callResultPack) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 召唤满后 | 
|---|
|  |  |  | 
|---|
|  |  |  | 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): | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | # 非客户端刷新的视为重新开始,重置刷新次数 | 
|---|
|  |  |  | 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())) | 
|---|
|  |  |  | 
|---|
|  |  |  | 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) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | addXianyuanCoinTotalTotay = 0 # 累计需要增加的今日仙缘币 | 
|---|
|  |  |  | drList = [] | 
|---|
|  |  |  |  | 
|---|
|  |  |  | totalHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleTotalCount) | 
|---|
|  |  |  | recordPack = ChPyNetSendPack.tagMCHelpBattleRecordList() | 
|---|
|  |  |  | recordPack.RecordList = [] | 
|---|
|  |  |  | for recordInfo in helpRecordList: | 
|---|
|  |  |  | 
|---|
|  |  |  | addXianyuanCoinTotal += xianyuanCoinAdd | 
|---|
|  |  |  | if isSameDay: | 
|---|
|  |  |  | addXianyuanCoinTotalTotay += xianyuanCoinAdd | 
|---|
|  |  |  |  | 
|---|
|  |  |  | totalHelpCount += 1 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | recordPack.RecordCount = len(recordPack.RecordList) | 
|---|
|  |  |  | NetPackCommon.SendFakePack(curPlayer, recordPack) | 
|---|
|  |  |  |  | 
|---|
|  |  |  | addDataDict = {"HelpList":drList} | 
|---|
|  |  |  | GameWorld.DebugLog("    addXianyuanCoinTotal=%s,addXianyuanCoinTotalTotay=%s" % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay), 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) # 今日已获得仙缘币 | 
|---|
|  |  |  | 
|---|
|  |  |  | 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] | 
|---|
|  |  |  |  | 
|---|