#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.FBHelpBattle # # @todo:¸±±¾Öúսϵͳ # @author hxp # @date 2018-11-24 # @version 1.0 # # ÏêϸÃèÊö: ¸±±¾Öúսϵͳ # #------------------------------------------------------------------------------- #"""Version = 2018-11-24 22:30""" #------------------------------------------------------------------------------- import GameWorld import ChConfig import PlayerControl import PlayerBillboard import ChPyNetSendPack import NetPackCommon import PlayerViewCacheTube import FBCommon import IpyGameDataPY import ShareDefine import PyGameData import random import GameMap import NPCCommon import FBLogic import PlayerVip import IPY_GameWorld import PlayerActivity def DoPlayerOnDay(curPlayer): checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount) checkInCount = checkInInfo / 10 # ÀÛ¼ÆµÇ¼Ç todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒÑµÇ¼Ç if todayIsCheckIn: checkInInfo = (checkInCount + 1) * 10 + 0 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo) SyncCheckInState(curPlayer, 0, False) # ÖØÖÃÿÈÕÒÑ»ñµÃÏÉÔµ±Ò PlayerControl.SetTodayXianyuanCoin(curPlayer, 0) 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): ## GameServer½á¹û·µ»Ø´¦Àí if not msgList: return cmd = msgList[0] # µÇ¼Ç if cmd == "CheckIn": __OnHelpBattleCheckInResult(curPlayer, msgList, tick) # ˢРif cmd == "Refresh": __OnHelpBattleRefreshResult(curPlayer, msgList, tick) # ÖúÕ½¼Ç¼ if cmd == "HelpRecord": __OnHelpBattleRecord(curPlayer, msgList, tick) return #// B1 05 ÖúÕ½µÇ¼Ç #tagCMHelpBattleCheckIn # #struct tagCMHelpBattleCheckIn #{ # tagHead Head; #}; def OnHelpBattleCheckIn(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount) checkInCount = checkInInfo / 10 # ÀÛ¼ÆµÇ¼Ç todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒÑµÇ¼Ç if todayIsCheckIn: GameWorld.DebugLog("µ±ÌìÒѵǼǣ¬²»ÐèÒªÖØ¸´µÇ¼Ç£¡", curPlayer.GetPlayerID()) return fightPower = curPlayer.GetFightPower() msgInfo = str(["CheckIn", checkInCount, fightPower]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo)) return def __OnHelpBattleCheckInResult(curPlayer, msgList, tick): ## µÇ¼Ç·µ»Ø cmd, checkInCount, fightPower, isOK, haveViewCache = msgList 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) SyncCheckInState(curPlayer, 1, False) GameWorld.DebugLog("FBHelpBattleResult: %s,checkInCount=%s,fightPower=%s,isOK=%s,haveViewCache=%s" % (cmd, checkInCount, fightPower, isOK, haveViewCache), curPlayer.GetPlayerID()) return #// B1 06 ÖúÕ½ÕÙ»½ #tagCMHelpBattleCall # #struct tagCMHelpBattleCall #{ # tagHead Head; # BYTE IsOneKeyCall; // ÊÇ·ñÒ»¼üÕÙ»½ # DWORD PlayerID; // ÕÙ»½µÄÍæ¼ÒID£¬´óÓÚ1СÓÚ100´ú±í»úÆ÷ÈË # BYTE IsGoldCall; // ÊÇ·ñÏÉÓñÕÙ»½ #}; def OnHelpBattleCall(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) isOneKeyCall = clientData.IsOneKeyCall calledPlayerID = clientData.PlayerID #isGoldCall = clientData.IsGoldCall playerID = curPlayer.GetPlayerID() gameFB = GameWorld.GetGameFB() mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID()) funcLineID = FBCommon.GetFBPropertyMark() ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID) if not ipyData: return helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {}) maxHelpPlayerCount = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 2) # ×î´óÖúÕ½ÈËÊý calledCount = 0 freePlayerIDList = [] helpNPCRobotIDList = [] 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 "Name" in helpPlayerInfoDict: freePlayerIDList.append(helpPlayerID) else: helpNPCRobotIDList.append(helpPlayerID) if calledCount >= maxHelpPlayerCount: GameWorld.Log("ÒѾ­ÕÙ»½ÂúÈËÊý£¡ÎÞ·¨ÔÙÕÙ»½£¡calledCount=%s" % calledCount, playerID) return calledPlayerDict = {} # {±»ÕÙ»½µÄÍæ¼ÒID:¹ØÏµ, ...} # ÓÅÏÈÕÙ»½Ãâ·ÑÍæ¼Ò¾µÏñ£¬²»×ã²ÅÕÐNPC£¬Ôݲ»×öÕ½Á¦ÅÅÐò if isOneKeyCall: lackCount = maxHelpPlayerCount - calledCount if freePlayerIDList: randIDList = random.sample(freePlayerIDList, min(lackCount, len(freePlayerIDList))) lackCount -= len(randIDList) for randID in randIDList: helpPlayerInfoDict = helpBattlePlayerDict[randID] calledPlayerDict[randID] = helpPlayerInfoDict.get("Relation", 0) if lackCount > 0 and helpNPCRobotIDList: for robotID in helpNPCRobotIDList[:lackCount]: calledPlayerDict[robotID] = 0 if calledCount + len(calledPlayerDict) < maxHelpPlayerCount: GameWorld.ErrLog("ÎÞ·¨Ò»¼üÕÙ»½!ÈËÊý²»×ã! calledCount=%s,calledPlayerDict=%s,maxHelpPlayerCount=%s" % (calledCount, calledPlayerDict, maxHelpPlayerCount), playerID) return else: if calledPlayerID not in helpBattlePlayerDict: GameWorld.ErrLog("²»´æÔÚ¸ÃÖúÕ½Íæ¼Ò£¬ÎÞ·¨ÕÙ»½£¡calledPlayerID=%s" % (calledPlayerID), playerID) return helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID] if helpPlayerInfoDict.get("NeedGoldCall", 0): goldCallCost = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 5) # ¸¶·ÑÕÙ»½ÏûºÄÏÉÓñ£¬ÓÅÏÈÏûºÄ°óÓñ costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, goldCallCost) if not costMoneyList: return infoDict = {"MapID":mapID, 'lineID':funcLineID, "Type":"Call"} for moneyType, moneyNum in costMoneyList: PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBHelpBattle, infoDict) calledPlayerDict[calledPlayerID] = helpPlayerInfoDict.get("Relation", 0) # Ö±½ÓÔÚµØÍ¼ÕÙ»½³öÀ´ robotNPCID = IpyGameDataPY.GetFuncCfg("HelpBattleRobot", 1) posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY() for calledPlayerID in calledPlayerDict.keys(): if calledPlayerID not in helpBattlePlayerDict: continue helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID] job = helpPlayerInfoDict.get("Job", 1) if "FightPower" in helpPlayerInfoDict: fightPower = helpPlayerInfoDict["FightPower"] npcLV = helpPlayerInfoDict["LV"] else: fightPower = ipyData.GetRobotFightPower() npcLV = ipyData.GetRobotLV() calledPlayerDict.pop(calledPlayerID) # ÕÐNPC²»Í¨ÖªGameServer jobSkillDict = ipyData.GetRobotSkillsDict() position = GameMap.GetEmptyPlaceInAreaEx(posX, posY, 2, 6) npcPosX, npcPosY = position.GetPosX(), position.GetPosY() helpBattleNPC = NPCCommon.SummonMapNpc(robotNPCID, npcPosX, npcPosY) if not helpBattleNPC: continue objID = helpBattleNPC.GetID() 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) npcControl.SetHelpBattleRobotRebornAttr(fightPower) __DoGiveHelpBattleRobotSkill(helpBattleNPC, jobSkillDict, job, npcLV) # ֪ͨǰ¶ËÕÙ»½³É¹¦ callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult() callResultPack.ObjID = objID callResultPack.PlayerID = calledPlayerID callResultPack.Job = job NetPackCommon.SendFakePack(curPlayer, callResultPack) # ÕÙ»½Âúºó if calledCount >= maxHelpPlayerCount: FBLogic.OnCallHelpBattleOK(curPlayer, tick) # ֪ͨGameServer if calledPlayerDict: msgInfo = str(["Call", mapID, funcLineID, calledPlayerDict]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo)) GameWorld.Log("GameServer_QueryPlayerResult: %s" % msgInfo, curPlayer.GetID()) return def __DoGiveHelpBattleRobotSkill(curNPC, jobSkillDict, job, npcLV): skillManager = curNPC.GetSkillManager() if job not in jobSkillDict: return skillInfoDict = jobSkillDict[job] #{Ö°Òµ:{(¼¼ÄÜID,...):ËùÐèµÈ¼¶, ¼¼ÄÜID:ËùÐèµÈ¼¶, ...}, ...} #{1:{(12000, 12001, 12002, 12003):1, 12011:7, 12012:15, 12013:30, 12014:80, 12015:140}, 2:{(12100, 12101, 12102, 12103):1, 12111:7, 12112:15, 12114:80, 12115:140}} skillIDList = [] for skillInfo, needLV in skillInfoDict.items(): if npcLV < needLV: continue if isinstance(skillInfo, int): skillIDList.append(skillInfo) else: skillIDList += list(skillInfo) GameWorld.DebugLog(" ¸øÖúÕ½»úÆ÷È˼¼ÄÜ: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList)) for skillID in skillIDList: skillManager.LearnSkillByID(skillID) return #// B1 07 ÖúսˢР#tagCMHelpBattleRefresh # #struct tagCMHelpBattleRefresh #{ # tagHead Head; #}; def OnHelpBattleRefresh(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) SendGameServer_RefreshHelpBattlePlayer(curPlayer, isClientRefresh=True) return def SendGameServer_RefreshHelpBattlePlayer(curPlayer, mapID=0, funcLineID=0, isClientRefresh=False): ## ·¢ËÍGameServerÇëÇóË¢ÐÂÖúÕ½Íæ¼ÒÁбí if not mapID: mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID()) if not funcLineID: funcLineID = FBCommon.GetFBPropertyMark() ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID) if not ipyData: return playerID = curPlayer.GetPlayerID() gameFB = GameWorld.GetGameFB() costMoneyList = [] calledPlayerIDDict = {} # ÒѾ­ÕÙ»½µÄÍæ¼ÒID×Öµä {playerID:[ÊÇ·ñ¸¶·ÑÕÙ»½, Ö°Òµ], ...} if isClientRefresh: refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount) freeRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 1) goldRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 2) if refreshCount >= (freeRefreshCount + goldRefreshCount): GameWorld.DebugLog("³¬¹ýË¢ÐÂÖúÕ½Áбí´ÎÊý£¡ÎÞ·¨Ë¢ÐÂ!refreshCount=%s" % (refreshCount), playerID) return if refreshCount >= freeRefreshCount: costGold = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 3) costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, ShareDefine.TYPE_Price_Gold_Paper_Money, costGold) if not costMoneyList: GameWorld.DebugLog("»õ±Ò²»×ã!ÎÞ·¨Ë¢ÐÂÖúÕ½£¡") return # »ñÈ¡ÒѾ­ÕÙ»½µÄÍæ¼Ò¾µÏñID helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {}) for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items(): objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID) if not objID: continue needGoldCall = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleGoldCall % helpPlayerID) job = helpPlayerInfoDict.get("Job", 1) relation = helpPlayerInfoDict.get("Relation", 0) # ¹ØÏµÐèÒÔË¢ÐÂÁбíʱµÄΪ׼£¬Èç¹ûÒѾ­ÕÙ»½ÁË£¬ÔòÒѵ±Ê±µÄΪ׼ calledPlayerIDDict[helpPlayerID] = [needGoldCall, job, relation] # ·Ç¿Í»§¶ËˢеÄÊÓÎªÖØÐ¿ªÊ¼£¬ÖØÖÃˢдÎÊý else: 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())) msgInfo = str(["Refresh", mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo)) GameWorld.Log("SendGameServer_RefreshHelpBattlePlayer %s" % (msgInfo), playerID) return def __OnHelpBattleRefreshResult(curPlayer, msgList, tick): ## ˢзµ»Ø cmd, mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict, helpBattlePlayerDict = msgList playerID = curPlayer.GetPlayerID() gameFB = GameWorld.GetGameFB() # ¿ÛÇ®£¬¼ÓˢдÎÊý infoDict = {"MapID":mapID, 'lineID':funcLineID, "Type":"Refresh"} for moneyType, moneyNum in costMoneyList: PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBHelpBattle, infoDict) refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount) if isClientRefresh: refreshCount += 1 gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, refreshCount) GameWorld.Log("FBHelpBattleResult: %s,mapID=%s,funcLineID=%s,isClientRefresh=%s,costMoneyList=%s,calledPlayerIDDict=%s,refreshCount=%s" % (cmd, mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict, refreshCount), playerID) GameWorld.Log(" helpBattlePlayerDict=%s" % (helpBattlePlayerDict), playerID) PyGameData.g_fbHelpBattlePlayerDict[playerID] = helpBattlePlayerDict # ֪ͨǰ¶Ë helpPlayerListPack = ChPyNetSendPack.tagMCHelpBattleList() helpPlayerListPack.RefreshCount = refreshCount helpPlayerListPack.HelpPlayerList = [] for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items(): helpPlayer = ChPyNetSendPack.tagMCHelpBattlePlayer() helpPlayer.ObjID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID) # »ñÈ¡ÒѾ­ÕÙ»½µÄ¶ÔÓ¦objID helpPlayer.PlayerID = helpPlayerID helpPlayer.Job = helpPlayerInfoDict.get("Job", 1) # Íæ¼Ò¾µÏñ²ÅÓÐÃû×Ö£¬ÖúÕ½NPCÃû×Öǰ¶Ë´¦Àí if "Name" in helpPlayerInfoDict: helpPlayer.Name = helpPlayerInfoDict["Name"] helpPlayer.NameLen = len(helpPlayer.Name) helpPlayer.LV = helpPlayerInfoDict["LV"] helpPlayer.RealmLV = helpPlayerInfoDict["RealmLV"] helpPlayer.FightPower = helpPlayerInfoDict["FightPower"] helpPlayer.Relation = helpPlayerInfoDict.get("Relation", 0) helpPlayer.IsNeedGold = helpPlayerInfoDict.get("NeedGoldCall", 0) helpPlayerListPack.HelpPlayerList.append(helpPlayer) helpPlayerListPack.HelpCount = len(helpPlayerListPack.HelpPlayerList) NetPackCommon.SendFakePack(curPlayer, helpPlayerListPack) return def __OnHelpBattleRecord(curPlayer, msgList, tick): ## ÖúÕ½¼Ç¼ͬ²½ cmd, helpRecordList = msgList playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("__OnHelpBattleRecord %s,helpRecordList=%s" % (cmd, helpRecordList), playerID) addXianyuanCoinTotal = 0 # ÀÛ¼ÆÐèÒªÔö¼ÓµÄÏÉÔµ±Ò addXianyuanCoinTotalTotay = 0 # ÀÛ¼ÆÐèÒªÔö¼ÓµÄ½ñÈÕÏÉÔµ±Ò drList = [] totalHelpCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleTotalCount) recordPack = ChPyNetSendPack.tagMCHelpBattleRecordList() recordPack.RecordList = [] for recordInfo in helpRecordList: callPlayerID, callPlayerName, mapID, funcLineID, xianyuanCoinAdd, relation, vipLV, recordTime = recordInfo timeStr = GameWorld.ChangeTimeNumToStr(recordTime) isSameDay = GameWorld.CheckTimeIsSameServerDayEx(recordTime) record = ChPyNetSendPack.tagMCHelpBattleRecord() record.CallPlayerID = callPlayerID record.CallPlayerName = callPlayerName record.NameLen = len(record.CallPlayerName) record.MapID = mapID record.FuncLineID = funcLineID record.XianyuanCoinAdd = xianyuanCoinAdd record.Relation = relation record.VIPLV = vipLV record.HelpTime = timeStr recordPack.RecordList.append(record) drList.append({"CallPlayerID":callPlayerID, "MapID":mapID, "FuncLineID":funcLineID, "XianyuanCoinAdd":xianyuanCoinAdd, "Relation":relation, "VIPLV":vipLV, "HelpTime":timeStr, "IsSameDay":isSameDay}) 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,totalHelpCount=%s" % (addXianyuanCoinTotal, addXianyuanCoinTotalTotay, totalHelpCount), playerID) PlayerControl.GiveMoney(curPlayer, ShareDefine.TYPE_Price_XianyuanCoin, addXianyuanCoinTotal, addDataDict=addDataDict, isSysHint=False) if addXianyuanCoinTotalTotay: PlayerControl.AddTodayXianyuanCoin(curPlayer, addXianyuanCoinTotalTotay) # ¸üÐÂ×ÜÖúÕ½´ÎÊý£¬¸üÐÂÅÅÐаñ PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleTotalCount, totalHelpCount) if totalHelpCount >= IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 4): PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_FBHelpBattle, totalHelpCount) return def DoFBAddXianyuanCoin(curPlayer, mapID, lineID, isHelp=False): '''ÕæÈËÌôÕ½¸±±¾Ôö¼ÓÏÉÔµ±Ò£¬°üº¬¹ý¹Ø»òÖúÕ½£¨²»º¬¾µÏñÖúÕ½£© @param isHelp: ÊÇ·ñÖúÕ½µÄ @return: »ñµÃµÄÏÉÔµ±Ò, ÎÞ·¨»ñµÃÏÉÔµ±ÒÔ­Òò(1-´ïµ½ÖúÕ½´ÎÊýÉÏÏÞ£¬2-´ïµ½Ã¿ÈÕ»ñµÃÏÉÔµ±ÒÉÏÏÞ) ''' playerID = curPlayer.GetPlayerID() fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID) if not fbFuncIpyData: return 0, 0 reason = 0 addCoinRate = 10000 # »ù´¡±¶ÂÊ 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 = xianyuanCoinUpper if curPlayer.GetVIPLv(): 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 relationAdd, relationPlayerID, relationPlayerName = 0, 0, "" fbType = GameWorld.GetMap().GetMapFBType() if fbType == IPY_GameWorld.fbtSingle: 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[0] if len(relationAddList) == 2 else 0 elif fbType == IPY_GameWorld.fbtTeam: relationAdd, relationPlayerID, relationPlayerName = __GetTeamFBMemRelationInfo(curPlayer, relationCoinAddDict, isHelp) 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,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.XianyuanCoinAdd = coinAddReal msgPack.CallPlayerID = relationPlayerID msgPack.CallPlayerName = relationPlayerName msgPack.NameLen = len(msgPack.CallPlayerName) msgPack.Reason = reason NetPackCommon.SendFakePack(curPlayer, msgPack) return coinAddReal, reason def __GetTeamFBMemRelationInfo(curPlayer, relationCoinAddDict, isHelp): relationAdd = 0 # Éç½»¹ØÏµ¼Ó³É relationPlayerID = 0 relationPlayerName = "" teamID = curPlayer.GetTeamID() if teamID not in PyGameData.g_teamFBMemRelationDict: return relationAdd, relationPlayerID, relationPlayerName friendList, memFamilyIDDict, memNameDict = PyGameData.g_teamFBMemRelationDict[teamID] relationList = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 3, []) # Éç½»¹ØÏµÓÅÏȼ¶ playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if isHelp: # ÖúÕ½µÄËæ±ãȡһλÓÅÏȼ¶×î¸ßµÄ¼´¿É for checkRelation in relationList: memRelation, relationPlayerID = 0, 0 if checkRelation == 1: for memPlayerID in memFamilyIDDict.keys(): if [playerID, memPlayerID] in friendList: memRelation = checkRelation relationPlayerID = memPlayerID break if checkRelation == 2: for memPlayerID, memFamilyID in memFamilyIDDict.items(): if playerID != memPlayerID and familyID and familyID == memFamilyID: memRelation = checkRelation relationPlayerID = memPlayerID break if memRelation and relationPlayerID: relationAddList = relationCoinAddDict.get(str(memRelation), []) relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0 relationPlayerName = memNameDict[relationPlayerID] return relationAdd, relationPlayerID, relationPlayerName else: # ·ÇÖúÕ½ÏíÊÜËùÓжÓÔ±¼Ó³É for memPlayerID, memFamilyID in memFamilyIDDict.items(): memRelation = 0 for checkRelation in relationList: if [playerID, memPlayerID] in friendList: memRelation = checkRelation break if playerID != memPlayerID and familyID and familyID == memFamilyID: memRelation = checkRelation break if not memRelation: continue relationAddList = relationCoinAddDict.get(str(memRelation), []) relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0 return relationAdd, relationPlayerID, relationPlayerName