#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package GameWorldLogic.FBProcess.GameLogic_FamilyWar # # @todo:ÏÉÃËÁªÈü # @author hxp # @date 2018-01-12 # @version 1.1 # # @change: "2018-07-23 16:00" hxp ²É¼¯Ë®¾§Ö§³Ö°´Ë®¾§IDÅäÖòɼ¯»ý·Ö£»Ôö¼ÓÎÞÖ÷buff£»Ì켫ÁªÈü»ý·Ö¶îÍâ½±Àøµ÷ÕûΪ»ñʤ·½»ý·ÖµÚÒ»Ãû²ÅÓУ» # # ÏêϸÃèÊö: ÏÉÃËÁªÈü # #------------------------------------------------------------------------------- #"""Version = 2018-07-23 16:00""" #------------------------------------------------------------------------------- import ChConfig import NPCCommon import GameWorld import PyGameData import ShareDefine import IPY_GameWorld import PlayerControl import ItemControler import ChPyNetSendPack import GameWorldProcess import PlayerDienstgrad import PlayerWeekParty import IpyGameDataPY import PlayerFamily import NetPackCommon import SkillCommon import EventReport import PlayerGubao import ItemCommon import BuffSkill import AICommon import FBCommon import GameMap import GameObj import random import copy import math FamilyWarRound_First = 1 # Ê×ÂÖ FamilyWarRound_Second = 2 # ´ÎÂÖ FamilyWar_MaxGroupID = 5 # ÁªÈü·Ö×éÊý #µ±Ç°¸±±¾µØÍ¼µÄ״̬ ( FB_Step_Open, # µØÍ¼¿ªÆô FB_Step_Prepare, # µØÍ¼×¼±¸ FB_Step_Fighting, # Õ½¶·ÖÐ FB_Step_LeaveTime, # ×ÔÓÉʱ¼ä FB_Step_Over, # ¸±±¾¹Ø±Õ ) = range(5) ( Time_Prepare, # ¸±±¾×¼±¸Ê±¼ä 0 Time_Fight, # ¸±±¾Õ½¶·Ê±¼ä 1 Time_Leave, # ¸±±¾À뿪ʱ¼ä 2 ) = range(3) # GameFBData »º´æ GameFBData_FamilyWarGlobal = "FamilyWarGlobal" # {key:value, ...} GameFBData_FamilyWarFamily = "FamilyWarFamily" # {playerID:FamilyWarFamily, ...} GameFBData_FamilyWarPlayer = "FamilyWarPlayer" # {playerID:FamilyWarPlayer, ...} # GameFBData_FamilyWarGlobal key Global_HelpInfo = "HelpInfo" # ¼Ç¼³£¹æ°ïÖúÐÅÏ¢£¬±ä¸üʱͬ²½ Global_HelpBuff = "HelpBuff" # ¼ÇÂ¼Ëæ»úbuff״̬ÐÅÏ¢£¬±ä¸üʱͬ²½ Global_HelpCrystal = "HelpCrystal" # ¼Ç¼ˮ¾§Õ¼ÁìÃ÷ϸÐÅÏ¢£¬±ä¸üʱͬ²½ Global_HelpCrystalAtk = "HelpCrystalAtk" # ¼Ç¼ˮ¾§¹¥»÷Ã÷ϸÐÅÏ¢£¬±ä¸üʱͬ²½ Global_BillboardBuff = "BillboardBuff" # ¼Ç¼ÅÅÐаñbuffÐÅÏ¢£¬±ä¸üʱͬ²½ # ¸±±¾Ïà¹Ø×Öµäkey GameFBDict_IsFinalMatch = "IsFinalMatch" # ÊÇ·ñ×îÖÕ¾öÈü³¡´Î GameFBDict_RoundNum = "RoundNum" # ÂÖ´Î GameFBDict_GroupID = "GroupID" # ÁªÈü×é¼¶±ð GameFBDict_WinnerFamilyID = "WinnerFamilyID" # »ñʤµÄÏÉÃËID GameFBDict_GetFlagFamilyID = "FlagFamily_%s" # »ñµÃÕ½ÆìµÄÕ½ÃËid£¬²ÎÊýΪսÆìNPCID GameFBDict_FamilyResPointTick = "FamResPointTick_%s" # »ñµÃÕ½ÆìÕ½ÃËˢлý·Öʱ¼ä£¬²ÎÊýΪսÆìNPCID GameFBDict_HelpInfoTick = "HelpInfoTick" # ¸±±¾°ïÖúÐÅϢͬ²½tick GameFBDict_RandBuffCollectTick = "RBuffCollectTick" # Ëæ»úbuff±»²Étick GameFBDict_RandBuffRefreshTick = "RBuffRefreshTick" # Ëæ»úbuffË¢ÐÂtick GameFBDict_RandBuffObjID = "RBuffObjID_%s" # Ëæ»úbuffµÄObjID, ²ÎÊýÎª×ø±ê±àºÅË÷Òý 0~n ## ²ÎÈüµÄÏÉÃËÀà class FamilyWarFamily(): def __init__(self, familyID): self.familyID = familyID self.faction = 0 self.rank = 0 # ÏÉÃËÁбíÃû´Î self.winCount = 0 # Á¬Ê¤´ÎÊý self.resPoint = 0.0 # µ±Ç°×ÊÔ´µãÊý, ³É³¤°Ù·Ö±È¼ÆËãºó²»È¡Õû£¬¿ÉÄÜÊÇСÊý self.memCount = 0 # ÏÉÃËÔÚÕ½³¡ÖеÄÈËÊý self.randBuffAttrLV = 0 # Ëæ»úbuff¼ÓÊôÐԵȼ¶ self.randBuffResPoint = 0 # Ëæ»úbuffÔö¼ÓµÄ¹Ì¶¨×ÊÔ´µãÊý self.randBuffResPointPerDict = {} # Ëæ»úbuffÔö¼ÓµÄ×ÊÔ´µã³É³¤ÐÅÏ¢ {addBuffTick:[lastTime, addPer], ...} return def GetBuffResPointPer(self, tick): totalPer = 0 for addBuffTick, buffInfo in self.randBuffResPointPerDict.items(): lastTime, addPer = buffInfo if tick - addBuffTick >= lastTime: self.randBuffResPointPerDict.pop(addBuffTick) else: totalPer += addPer return totalPer def GetResPoint(self): return self.resPoint def AddResPoint(self, addResPoint): basePoint = 500 befDivValue = int(self.resPoint / basePoint) self.resPoint += addResPoint aftDivValue = int(self.resPoint / basePoint) if befDivValue != aftDivValue: notifyPoint = basePoint * aftDivValue # ¼º·½×ÊÔ´µãÒÑ´ï%s0µã # µÐ·½×ÊÔ´µãÒÑ´ï%s0µã PlayerControl.FBFactionNotify(self.faction, "FamilyMatchOwnResources", [notifyPoint], "FamilyMatchEnimeyResources", [notifyPoint]) return self.resPoint def AddFamilyWarFamily(familyID): familyWarFamilyDict = FBCommon.GetGameFBData(GameFBData_FamilyWarFamily) if familyID in familyWarFamilyDict: return familyWarFamilyDict[familyID] warFamily = FamilyWarFamily(familyID) warFamily.faction = GetFamilyFaction(familyID) familyWarFamilyDict[familyID] = warFamily return warFamily def GetFamilyWarFamily(familyID): familyWarFamilyDict = FBCommon.GetGameFBData(GameFBData_FamilyWarFamily) if familyID in familyWarFamilyDict: return familyWarFamilyDict[familyID] return AddFamilyWarFamily(familyID) def GetWarFamilyName(familyID): familyVsMgr = GameWorld.GetGameFB().GetFamilyVS() if familyVsMgr.GetFamilyID() == familyID: return familyVsMgr.GetFamilyName() return familyVsMgr.GetVSFamilyName() ## ²ÎÈüµÄÏÉÃËÍæ¼ÒÀà class FamilyWarPlayer(): def __init__(self, familyID, faction, playerID, name, tick): self.familyID = familyID self.faction = faction self.playerID = playerID self.name = name self.score = 0 # »ý·Ö self.killPlayerCount = 0 # »÷ɱÊý self.collResourceCount = 0 # Õ¼Áì×ÊÔ´µãÊý self.collRandBuffCount = 0 # ÇÀ¶ábuffÊý self.fightTime = 0 # Õ½¶·Ê±³¤ self.joinTick = tick # ¼ÓÈëÕ½³¡Ê±µÄtick self.calcFightTimeTick = 0 # ¼ÆËãÕ½¶·Ê±³¤tick self.collectTypeIndex = 0 # ²É¼¯NPCÀàÐÍÅäÖÃindex self.collectLostHPTick = 0 # ²É¼¯NPCµôѪtick self.restoreHPTick = 0 # ÓªµØ»ØÑªtick return def AddFamilyWarPlayer(familyID, faction, playerID, name, tick): familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer) if playerID in familyWarPlayerDict: return familyWarPlayerDict[playerID] warPlayer = FamilyWarPlayer(familyID, faction, playerID, name, tick) familyWarPlayerDict[playerID] = warPlayer return warPlayer def GetFamilyWarPlayer(playerID): familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer) if playerID in familyWarPlayerDict: return familyWarPlayerDict[playerID] # Ò»°ã²»¿ÉÄܳöÏÖ²»´æÔÚµÄÇé¿ö£¬ÒÔÏ´úÂëÖ÷ҪΪÁ˱àÂëʱ°´ . ÄÜÌáʾÏÔʾÀàÖжÔÏó tick = GameWorld.GetGameWorld().GetTick() curPlayer = GameWorld.GetMapCopyPlayerManager().FindPlayerByID(playerID) familyID = 0 if not curPlayer else curPlayer.GetFamilyID() name = "" if not curPlayer else curPlayer.GetPlayerName() faction = GetFamilyFaction(familyID) return AddFamilyWarPlayer(familyID, faction, playerID, name, tick) def GetFamilyWarBillboardPack(gameFB, sortWarPlayer, tick, winFaction=0): warBillboard = ChPyNetSendPack.tagMCFamilyWarBillboard() warBillboard.Clear() warBillboard.GroupID = gameFB.GetGameFBDictByKey(GameFBDict_GroupID) warBillboard.WinFaction = winFaction warBillboard.TotalFightTime = 0 if not winFaction else (tick - gameFB.GetFBStepTick()) / 1000 warBillboard.FBBillboardPlayer = [] for warPlayer in sortWarPlayer: wPlayer = ChPyNetSendPack.tagMCFamilyWarPlayer() wPlayer.Clear() wPlayer.PlayerID = warPlayer.playerID wPlayer.PlayerName = warPlayer.name wPlayer.PlayerNameLen = len(wPlayer.PlayerName) wPlayer.Faction = warPlayer.faction wPlayer.CrystalCount = warPlayer.collResourceCount wPlayer.RandBuffCount = warPlayer.collRandBuffCount wPlayer.KillPlayerCount = warPlayer.killPlayerCount wPlayer.FightTime = 0 if not winFaction else warPlayer.fightTime / 1000 wPlayer.Point = warPlayer.score warBillboard.FBBillboardPlayer.append(wPlayer) warBillboard.BillboardCount = len(warBillboard.FBBillboardPlayer) return warBillboard def SortFamilyWarPlayer(): familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer) sortWarPlayerList = familyWarPlayerDict.values() sortWarPlayerList.sort(cmp=CmpWarPlayer) return sortWarPlayerList def CmpWarPlayer(warPlayerA, warPlayerB): ## ÅÅÐò¹æÔò£¬»ý·Ö > ʤÀûµÄ £¾ »÷ɱÊý¶àµÄ £¾ Õ¼Áì×ÊÔ´µã¶àµÄ£¾ ÇÀ¶áBUFF¶àµÄ £¾ Õ½¶·Ê±³¤³¤µÄ £¾ ¼ÓÈëÕ½³¡tick # »ý·Ö scoreA = warPlayerA.score scoreB = warPlayerB.score cmpRet = cmp(scoreB, scoreA) # µ¹Ðò #GameWorld.DebugLog(" »ý·Ö±È½Ï: scoreB=%s,scoreA=%s,cmpRet=%s" % (scoreB, scoreA, cmpRet)) if cmpRet != 0: return cmpRet # »ñʤµÄ winnerFamilyID = GameWorld.GetGameFB().GetGameFBDictByKey(GameFBDict_WinnerFamilyID) isWinA = warPlayerA.familyID == winnerFamilyID isWinB = warPlayerB.familyID == winnerFamilyID cmpRet = cmp(isWinB, isWinA) # µ¹Ðò #GameWorld.DebugLog(" »ñʤ±È½Ï: winnerFamilyID=%s,isWinB=%s,isWinA=%s,cmpRet=%s" % (winnerFamilyID, isWinB, isWinA, cmpRet)) if cmpRet != 0: return cmpRet # »÷É±Íæ¼Ò killPlayerCountA = warPlayerA.killPlayerCount killPlayerCountB = warPlayerB.killPlayerCount cmpRet = cmp(killPlayerCountB, killPlayerCountA) # µ¹Ðò #GameWorld.DebugLog(" »÷É±Íæ¼Ò: killPlayerCountB=%s,killPlayerCountA=%s,cmpRet=%s" % (killPlayerCountB, killPlayerCountA, cmpRet)) if cmpRet != 0: return cmpRet # Õ¼Áì×ÊÔ´ collResourceCountA = warPlayerA.collResourceCount collResourceCountB = warPlayerB.collResourceCount cmpRet = cmp(collResourceCountB, collResourceCountA) # µ¹Ðò #GameWorld.DebugLog(" Õ¼Áì×ÊÔ´: collResourceCountB=%s,collResourceCountA=%s,cmpRet=%s" % (collResourceCountB, collResourceCountA, cmpRet)) if cmpRet != 0: return cmpRet # ÇÀ¶ábuff collRandBuffCountA = warPlayerA.collRandBuffCount collRandBuffCountB = warPlayerB.collRandBuffCount cmpRet = cmp(collRandBuffCountB, collRandBuffCountA) # µ¹Ðò #GameWorld.DebugLog(" ÇÀ¶ábuff: collRandBuffCountB=%s,collRandBuffCountA=%s,cmpRet=%s" % (collRandBuffCountB, collRandBuffCountA, cmpRet)) if cmpRet != 0: return cmpRet # Õ½¶·Ê±³¤ fightTimeA = warPlayerA.fightTime fightTimeB = warPlayerB.fightTime cmpRet = cmp(fightTimeB, fightTimeA) # µ¹Ðò #GameWorld.DebugLog(" Õ½¶·Ê±³¤: fightTimeB=%s,fightTimeA=%s,cmpRet=%s" % (fightTimeB, fightTimeA, cmpRet)) if cmpRet != 0: return cmpRet # ¼ÓÈëÕ½³¡tick ÕýÐò joinTickA = warPlayerA.joinTick joinTickB = warPlayerB.joinTick cmpRet = cmp(joinTickA, joinTickB) # µ¹Ðò #GameWorld.DebugLog(" ¼ÓÈëÕ½³¡tick: joinTickA=%s,joinTickB=%s,cmpRet=%s" % (joinTickA, joinTickB, cmpRet)) return cmpRet ## ----------------------------------------------------------------------------------------------- def GetFWarStepTime(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchPlayTime") # ½×¶Îʱ¼ä ## ÓªµØ def GetFactionArea(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSpawnPoint", 1) # ÓªµØ·¶Î§ def GetBarrierPointList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSpawnPoint", 2) # ×¼±¸Çø¼äÓªµØÕϰ­µã ## Ë®¾§ def GetResourceRebornPosList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint", 1) # Ë®¾§¸´»îµãÁбí def GetResourceNPCIDList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint", 2) # Ë®¾§NPCID˳ÐòÁбí def GetResourceRebornRank(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint", 3) # ¸´»î¶ÔÓ¦Õ¼ÁìË®¾§±àºÅÓÅÏȼ¶ def GetResourceWinPoint(): return IpyGameDataPY.GetFuncCfg("FamilyMatchResourcePoint", 5) # »ñʤ×ÊÔ´ÉÏÏÞ def GetResourcePointMultiple(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchResourcePoint1", 1) # ÌØÊâË®¾§×ÊÔ´µã³É³¤±¶Öµ def GetResourcePointPerSecond(): return IpyGameDataPY.GetFuncCfg("FamilyMatchResourcePoint1", 2) # Õ¼ÁìË®¾§»ñµÃ×ÊÔ´µã/Ãë ## ²É¼¯ def GetCollectTimeList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchCollect", 1) def GetCollectLostHPPerList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchCollect", 2) ## Ëæ»úbuff def GetRandBuffPosList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRandomBuff", 1) # Ëæ»úbuffË¢ÐÂ×ø±êÁбí def GetRandBuffCount(): return IpyGameDataPY.GetFuncCfg("FamilyMatchRandomBuff", 2) # ÿ´ÎË¢ÐÂËæ»úbuffÊý def GetRandBuffNPCIDList(): return IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRandomBuff", 3) # Ëæ»úbuffNPCIDÁбí def GetRandBuffRefreshTime(): return IpyGameDataPY.GetFuncCfg("FamilyMatchRandomBuff", 4) # Ëæ»úbuffˢмä¸ôÃë ## ¸öÈË»ý·Ö def GetScorePerMinute(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 1) # ÔÚÕ½³¡ÄÚ¶ºÁôÿ·ÖÖÓ»ñµÃ»ý·Ö def GetScoreKillPlayer(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 2) # ÿ´Î»÷ɱµÐ·½Íæ¼Ò»ñµÃ»ý·Ö def GetScoreCollectRescource(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 3) # ³É¹¦Õ¼ÁìÒ»¸öË®¾§»ñµÃ»ý·Ö def GetScoreCollectRandBuff(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 4) # ³É¹¦²É¼¯Ò»¸öBUFF»ñµÃ»ý·Ö def GetScoreWinerAddPer(): return IpyGameDataPY.GetFuncCfg("FamilyMatchPersonalScore", 5) # ʤÀû·½½áËãʱ£¬»ý·ÖµÄ¶îÍâ°Ù·Ö±È¼Ó³É£¨N%£© def OnFBPlayerOnDay(curPlayer): dailyRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward) if dailyRewardState: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyWarDailyReward, 0) championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID) if curPlayer.GetFamilyID() == championFamilyID: Sync_ChampionFamilyDailyRewardState(curPlayer) return def OnFBPlayerOnLogin(curPlayer): dailyRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward) if dailyRewardState: championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID) if curPlayer.GetFamilyID() == championFamilyID: Sync_ChampionFamilyDailyRewardState(curPlayer) return def OnChampionFamilyIDChange(): playerManager = GameWorld.GetPlayerManager() for index in range(0, playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if curPlayer.GetID() == 0: continue DoCheckChampionFamilyTitle(curPlayer) return def DoCheckChampionFamilyTitle(curPlayer): ## ¼ì²éÍõÕßÏÉÃ˳ƺÅ: 1-ÍõÕßÏÉÃ˱ä¸üʱ£»2-Íæ¼Ò¼ÓÈëÏÉÃËʱ£»3-Íæ¼ÒÍ˳öÏÉÃËʱ£»3-Íæ¼Òְλ±ä¸üʱ titleIDList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchDayReward", 2) if not titleIDList: return leaderTitleID, memberTitleID = titleIDList delDienstgradIDList = [] addDienstgradIDList = [] familyID = curPlayer.GetFamilyID() championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID) if not championFamilyID or familyID != championFamilyID: delDienstgradIDList = [leaderTitleID, memberTitleID] elif curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader: addDienstgradIDList = [leaderTitleID] delDienstgradIDList = [memberTitleID] else: addDienstgradIDList = [memberTitleID] delDienstgradIDList = [leaderTitleID] PlayerDienstgrad.PlayerDelAddDienstgrad(curPlayer, delDienstgradIDList, addDienstgradIDList) return ##¿ªÆô¸±±¾ # @param tick ʱ¼ä´Á # @return ·µ»ØÖµÎÞÒâÒå # @remarks ¿ªÆô¸±±¾ def OnOpenFB(tick): globalDict = { Global_HelpInfo:None, Global_HelpBuff:None, Global_HelpCrystal:None, Global_HelpCrystalAtk:None, Global_BillboardBuff:None, } FBCommon.SetGameFBData(GameFBData_FamilyWarGlobal, globalDict) FBCommon.SetGameFBData(GameFBData_FamilyWarFamily, {}) FBCommon.SetGameFBData(GameFBData_FamilyWarPlayer, {}) FBCommon.SetFBStep(FB_Step_Prepare, tick) gameFB = GameWorld.GetGameFB() familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() warFamilyA = AddFamilyWarFamily(familyIDA) warFamilyB = AddFamilyWarFamily(familyIDB) for vsFamily in PyGameData.VSFamilyInfo: familyIDList = vsFamily[ShareDefine.VSFamilyInfo_FamilyIDList] if familyIDA in familyIDList and familyIDB in familyIDList: isFinalMatch = vsFamily[ShareDefine.VSFamilyInfo_IsFinalMatch] roundNum = vsFamily[ShareDefine.VSFamilyInfo_RoundNum] groupID = vsFamily[ShareDefine.VSFamilyInfo_GroupID] rankA, rankB = vsFamily[ShareDefine.VSFamilyInfo_FamilyRankList] winCountA, winCountB = vsFamily[ShareDefine.VSFamilyInfo_WinCountList] gameFB.SetGameFBDict(GameFBDict_IsFinalMatch, int(isFinalMatch)) gameFB.SetGameFBDict(GameFBDict_RoundNum, roundNum) gameFB.SetGameFBDict(GameFBDict_GroupID, groupID) warFamilyA.faction = ShareDefine.CampType_Justice warFamilyA.rank = rankA warFamilyA.winCount = winCountA warFamilyB.faction = ShareDefine.CampType_Evil warFamilyB.rank = rankB warFamilyB.winCount = winCountB GameWorld.Log("OpenFBWar: isFinalMatch=%s,roundNum=%s,groupID=%s,familyIDA(%s) VS familyIDB(%s),rank=[%s,%s],winCount=[%s,%s]" % (isFinalMatch, roundNum, groupID, familyIDA, familyIDB, rankA, rankB, winCountA, winCountB)) break return ##¹Ø±Õ¸±±¾ # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks def OnCloseFB(tick): FBCommon.SetGameFBData(GameFBData_FamilyWarGlobal, None) FBCommon.SetGameFBData(GameFBData_FamilyWarFamily, None) FBCommon.SetGameFBData(GameFBData_FamilyWarPlayer, None) return ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë # @param curPlayer Íæ¼ÒʵÀý # @param mapID µØÍ¼ID # @param lineID Ïß·id # @param tick ʱ¼ä´Á # @return ²¼¶ûÖµ def OnEnterFBEvent(curPlayer, mapID, lineID, tick): if not GetFamilyFaction(curPlayer.GetFamilyID()): PlayerControl.NotifyCode(curPlayer, "NoFamilyWarLine") return False return True ## ½øÈë´«Ë͵ã # @param curPlayer # @param mapID µØÍ¼ID # @param lineId ·ÖÏßID # @param tick # @return ×ø±êÁбí(X,Y) def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick): faction = GetFamilyFaction(curPlayer.GetFamilyID()) if not faction: return return GetFactionArea()[GetFactionIndex(faction)] def GetFactionIndex(faction): return max(0, faction - 1) def GetFamilyFaction(familyID): # »ñÈ¡ÏÉÃËËùÊôÕóÓª£¬ÆäËûµØÍ¼Ò²ÐèÒªÓõ½£¬¹ÊÕâÀïÖ±½Ó±éÀú»º´æÖÐÊý¾Ý for vsFamily in PyGameData.VSFamilyInfo: familyIDList = vsFamily[ShareDefine.VSFamilyInfo_FamilyIDList] if familyID in familyIDList: if familyID == familyIDList[0]: return ShareDefine.CampType_Justice return ShareDefine.CampType_Evil return 0 ##»ñµÃÍæ¼Ò´«È븱±¾ÐèҪЯ´øµÄÐÅÏ¢ # @param curPlayer Íæ¼ÒʵÀý # @return ×Ö·û´® # @remarks def GetPlayerResetWorldPosFBMsg(curPlayer, lineId): return str(curPlayer.GetFamilyID()) ## ÊÇ·ñ¿ÉÒÔ½øÈë # @param ask ÇëÇóÐÅÏ¢ # @param tick # @return »Ø¸´ÊÇ·ñͨ¹ýÇëÇó def OnChangeMapAsk(ask, tick): familyIDMsg = ask.GetMsg() if not familyIDMsg: GameWorld.ErrLog("ÎÞ·¨»ñµÃ´«ÈëµÄ¼Ò×åID = %s" % (familyIDMsg)) return IPY_GameWorld.cmeNull familyID = int(familyIDMsg) result = GetFamilyWarGameFB(familyID) if result == None: return IPY_GameWorld.cmeCustom, "NoFamilyWarLine" gameFB, openState = result if openState != IPY_GameWorld.fbosOpen: return IPY_GameWorld.cmeCustom, "FamilyWarLineClose" #ÒѾ­¿ªÆôÁË£¬²»ÈýøÈë if gameFB.GetFBStep() >= FB_Step_LeaveTime: return IPY_GameWorld.cmeCustom, "FamilyWarLineEnd" return IPY_GameWorld.cmeAccept def GetFamilyWarGameFB(familyID): gameWorld = GameWorld.GetGameWorld() for index in range(gameWorld.GetGameWorldCount()): gameFB = gameWorld.GetGameFBByFbIndex(index) familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() if familyID in [familyIDA, familyIDB]: return gameFB, gameWorld.GetOpenStateByFbIndex(index) return ##Íæ¼Ò½øÈ븱±¾ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks Íæ¼Ò½øÈ븱±¾ def DoEnterFB(curPlayer, tick): gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() faction = GetFamilyFaction(familyID) if not faction or fbStep not in [FB_Step_Prepare, FB_Step_Fighting]: GameWorld.ErrLog("DoEnterFB PlayerLeaveFB familyID=%s,faction=%s,fbStep=%s" % (familyID, faction, fbStep), playerID) PlayerControl.PlayerLeaveFB(curPlayer) return if curPlayer.GetFaction() != faction: curPlayer.SetFaction(faction) if not FBCommon.GetHadDelTicket(curPlayer): FBCommon.SetHadDelTicket(curPlayer) FBCommon.AddEnterFBCount(curPlayer, ChConfig.Def_FBMapID_FamilyWar) PlayerWeekParty.AddWeekPartyActionCnt(curPlayer, ChConfig.Def_WPAct_FamilyWar, 1) PlayerGubao.AddGubaoItemEffValue(curPlayer, PlayerGubao.GubaoEffType_FamilyWar, 1) isFinalMatch = gameFB.GetGameFBDictByKey(GameFBDict_IsFinalMatch) roundNum = gameFB.GetGameFBDictByKey(GameFBDict_RoundNum) groupID = gameFB.GetGameFBDictByKey(GameFBDict_GroupID) warPlayer = AddFamilyWarPlayer(familyID, faction, playerID, curPlayer.GetPlayerName(), tick) if fbStep == FB_Step_Prepare: notify_tick = GetFWarStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True) FBCommon.SyncDynamicBarrierState(GetBarrierPointList(), 1, curPlayer) # ×¼±¸ÆÚ¼äÓж¯Ì¬Õϰ­µã elif fbStep == FB_Step_Fighting: notify_tick = GetFWarStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True) warPlayer.calcFightTimeTick = tick # Õ½¶·½×¶Î½øÈë¸üдËtick familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() warFamilyA = GetFamilyWarFamily(familyIDA) warFamilyB = GetFamilyWarFamily(familyIDB) curWarFamily = warFamilyA if familyID == familyIDA else warFamilyB tagWarFamily = warFamilyA if familyID != familyIDA else warFamilyB curWarFamily.memCount += 1 GameWorld.Log("DoEnterFB ÏÉÃËÕ½³¡ÈËÊý¼Ó1, isFinalMatch=%s,roundNum=%s,groupID=%s,familyID=%s,memCount=%s,faction=%s" % (isFinalMatch, roundNum, groupID, familyID, curWarFamily.memCount, faction), playerID) enterHelpDict = {"familyWar_Enter":{"WinCount":[warFamilyA.winCount, warFamilyB.winCount], "IsFinalMatch":isFinalMatch}} __NotifyWarHelp_Info(tick, curPlayer, enterHelpDict) # ¸ù¾Ýµ±Ç°ÏÉÃËÕ½³¡ÈËÊý¼Ó²ÎÓëbuff __AddFamilyWarBuff(familyID, ChConfig.Def_SkillID_FamilyWar_JoinBuff, tick, curWarFamily.memCount) # ×îÖÕ¾öÈü³¡´Î£¬¶ÔÊÖÓÐÁ¬Ê¤´ÎÊýµÄ£¬Ôö¼ÓÁ¬Ê¤buff if isFinalMatch and tagWarFamily.winCount: cWinBuffLV = min(IpyGameDataPY.GetFuncCfg("FamilyMatchEnterBuff", 1), tagWarFamily.winCount) __AddFamilyWarBuff(familyID, ChConfig.Def_SkillID_FamilyWar_CWinBuff, tick, cWinBuffLV) EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_FamilyWar, 0, ChConfig.CME_Log_Start) return def __NotifyWarHelp_Info(tick, enterPlayer=None, enterHelpDict={}): ''' ¸±±¾°ïÖúÐÅÏ¢ ʵʱͬ²½ {"familyWar_Buff":[{"PosIndex":λÖÃË÷Òý, "NPCID":buffNPCID, "Atk":1}, {"PosIndex":λÖÃË÷Òý, "NPCID":buffNPCID, "Atk":0}, ...]]} {"familyWar_Crystal":{"ÕóÓª1":[Ë®¾§NPCID, ...], "ÕóÓª2":[Ë®¾§NPCID, ...]}, "familyWar_CrystalAtk":[ÕýÔÚ±»¹¥»÷µÄË®¾§NPCIDÁбí]} ͬ²½¹æÔò£º xÃëÒ»´Î {"familyWar_HelpInfo":[{"ResPoint":1, MemCount":1, "BuffResPoint":buffÔö¼ÓµÄ×ÊÔ´µãÊý, "BuffResPointPer":buff×ÊÔ´µãÊý³É³¤Íò·ÖÂÊ, "BuffAttrLV":buffÊôÐԵȼ¶}, {"ResPoint":1, "MemCount":1, "BuffResPoint":buffÔö¼ÓµÄ×ÊÔ´µãÊý, "BuffResPointPer":buff×ÊÔ´µãÊý³É³¤Íò·ÖÂÊ, "BuffAttrLV":buffÊôÐԵȼ¶}]} ''' helpDict = {} billboardPack = None globalDict = FBCommon.GetGameFBData(GameFBData_FamilyWarGlobal) gameFB = GameWorld.GetGameFB() lastHelpTick = gameFB.GetGameFBDictByKey(GameFBDict_HelpInfoTick) # ÓÐÐÂÍæ¼Ò½øÈë »ò xÃëÇ¿ÖÆÍ¬²½Ò»´Î if enterPlayer or tick - lastHelpTick >= 10000: gameFB.SetGameFBDict(GameFBDict_HelpInfoTick, tick) familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() warFamilyA = GetFamilyWarFamily(familyIDA) warFamilyB = GetFamilyWarFamily(familyIDB) helpInfoList = [] for warFamily in [warFamilyA, warFamilyB]: helpInfoList.append({"ResPoint":warFamily.GetResPoint(), "MemCount":warFamily.memCount, "BuffResPoint":warFamily.randBuffResPoint, "BuffResPointPer":warFamily.GetBuffResPointPer(tick), "BuffAttrLV":warFamily.randBuffAttrLV}) helpInfoListHis = globalDict[Global_HelpInfo] if helpInfoList != helpInfoListHis: globalDict[Global_HelpInfo] = helpInfoList helpDict["familyWar_HelpInfo"] = helpInfoList if enterHelpDict: enterHelpDict["familyWar_HelpInfo"] = helpInfoList billboardPack = GetFamilyWarBillboardPack(gameFB, SortFamilyWarPlayer(), tick) # buffÐÅÏ¢ helpBuffList = [] for i in xrange(len(GetRandBuffPosList())): objID = gameFB.GetGameFBDictByKey(GameFBDict_RandBuffObjID % i) if not objID: continue curNPC = GameWorld.FindNPCByID(objID) if not curNPC: continue isInAtk = int(curNPC.GetPlayerHurtList().GetHurtCount() > 0) helpBuffList.append({"PosIndex":i, "NPCID":curNPC.GetNPCID(), "Atk":isInAtk}) helpBuffListHis = globalDict[Global_HelpBuff] if helpBuffList != helpBuffListHis: globalDict[Global_HelpBuff] = helpBuffList helpDict["familyWar_Buff"] = helpBuffList if enterHelpDict: enterHelpDict["familyWar_Buff"] = helpBuffList # Ë®¾§×ÊÔ´ familyIDA = gameFB.GetFamilyVS().GetFamilyID() flagAtkList = [] factionFlagList = [[], []] for npcID in GetResourceNPCIDList(): curNPC = GameWorld.FindNPCByNPCID(npcID) if not curNPC: continue familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) if familyID: factionIndex = 0 if familyID == familyIDA else 1 factionFlagList[factionIndex].append(npcID) if curNPC.GetPlayerHurtList().GetHurtCount() > 0: flagAtkList.append(npcID) # Õ¼ÁìË®¾§ helpCrystal = {ShareDefine.CampType_Justice:factionFlagList[0], ShareDefine.CampType_Evil:factionFlagList[1]} # {ÕóÓª:[Õ¼ÁìNPCID, ...], ...} crystalHis = globalDict[Global_HelpCrystal] if factionFlagList != crystalHis: globalDict[Global_HelpCrystal] = factionFlagList helpDict["familyWar_Crystal"] = helpCrystal if enterHelpDict: enterHelpDict["familyWar_Crystal"] = helpCrystal # ¹¥»÷Ë®¾§ crystalAtkHis = globalDict[Global_HelpCrystalAtk] if flagAtkList != crystalAtkHis: globalDict[Global_HelpCrystalAtk] = flagAtkList helpDict["familyWar_CrystalAtk"] = flagAtkList if enterHelpDict: enterHelpDict["familyWar_CrystalAtk"] = flagAtkList isBillPackChange = False if billboardPack: billBuff = billboardPack.GetBuffer() lastBillBuff = globalDict[Global_BillboardBuff] if billBuff != lastBillBuff: globalDict[Global_BillboardBuff] = billBuff isBillPackChange = True GameWorld.DebugLog("isBillPackChange=%s" % isBillPackChange) if enterPlayer or isBillPackChange or helpDict: enterPlayerID = 0 if not enterPlayer else enterPlayer.GetPlayerID() playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): player = playerManager.GetPlayerByIndex(index) if not player: continue playerID = player.GetPlayerID() if not playerID: continue if playerID == enterPlayerID: FBCommon.NotifyFBHelp(player, 0, enterHelpDict) NetPackCommon.SendFakePack(player, billboardPack) continue if helpDict: FBCommon.NotifyFBHelp(player, 0, helpDict) if isBillPackChange: NetPackCommon.SendFakePack(player, billboardPack) return ##Íæ¼ÒÍ˳ö¸±±¾ # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå def DoExitFB(curPlayer, tick): fbStep = GameWorld.GetGameFB().GetFBStep() if fbStep >= FB_Step_LeaveTime: if GameWorld.GetMapCopyPlayerManager().GetPlayerCount() == 1: GameWorldProcess.CloseFB(tick) FBCommon.SetFBStep(FB_Step_Over, tick) return playerID = curPlayer.GetPlayerID() warPlayer = GetFamilyWarPlayer(playerID) familyID = warPlayer.familyID # ÕâÀïÈ¡familyID·½Ê½ÌØÊâ´¦Àí£¬·ÀÖ¹Íæ¼ÒÒì³£À뿪ÏÉÃ˱»Ìß³ö¸±±¾Ê±µ¼ÖÂÔ­ÏÉÃËÈËÊý²»»á-1 warFamily = GetFamilyWarFamily(familyID) warFamily.memCount = max(0, warFamily.memCount - 1) GameWorld.Log("DoExitFB ÏÉÃËÕ½³¡ÈËÊý¼õ1, familyID=%s,memCount=%s" % (familyID, warFamily.memCount), playerID) # ÒòΪÊǽµbuffµÈ¼¶£¬ËùÒÔÐèÒªÏÈɾ³ý __AddFamilyWarBuff(familyID, ChConfig.Def_SkillID_FamilyWar_JoinBuff, tick, warFamily.memCount, True) return def OnProcess(tick): fbStep = GameWorld.GetGameFB().GetFBStep() # ¸±±¾×¼±¸ if fbStep == FB_Step_Prepare: __DoLogic_FB_Prepare(tick) # ¸±±¾½øÐÐÖÐ elif fbStep == FB_Step_Fighting: __DoLogic_FB_Fighting(tick) # ¸±±¾½áÊø elif fbStep == FB_Step_LeaveTime: __DoLogic_FB_Over(tick) return def __DoLogic_FB_Prepare(tick): remaindTick = GetFWarStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) if remaindTick > 0: return barrierPointList = GetBarrierPointList() #¹Ø±Õ¶¯Ì¬Õϰ­µã FBCommon.SyncDynamicBarrierState(barrierPointList, 0) FBCommon.SetFBStep(FB_Step_Fighting, tick) factionAreaInfo = GetFactionArea() maxDistList = [] for i, pointList in enumerate(barrierPointList): centrePosX, centrePosY = factionAreaInfo[i][:2] dist1 = GameWorld.GetDist(centrePosX, centrePosY, pointList[0], pointList[1]) dist2 = GameWorld.GetDist(centrePosX, centrePosY, pointList[2], pointList[3]) maxDistList.append(max(dist1, dist2)) fightTime = GetFWarStepTime()[Time_Fight] * 1000 playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() if not playerID: continue curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, fightTime, True) warPlayer = GetFamilyWarPlayer(playerID) warPlayer.calcFightTimeTick = tick faction = curPlayer.GetFaction() if not faction: GameWorld.Log("»¹Î´ÉèÖÃÕóÓªµÄÍæ¼ÒÔݲ»´¦Àí£¡¿ÉÄÜÊÇDoEnterÖУ¡", playerID) continue # ¼ì²é×ø±ê£¬·ÀÖ¹×÷±× factionIndex = GetFactionIndex(faction) centrePosX, centrePosY, radius = factionAreaInfo[factionIndex] curPosX, curPosY = curPlayer.GetPosX(), curPlayer.GetPosY() dist = GameWorld.GetDist(curPosX, curPosY, centrePosX, centrePosY) maxDist = maxDistList[factionIndex] # ÅжϾàÀë if dist > maxDist: posPoint = GameMap.GetEmptyPlaceInArea(centrePosX, centrePosY, radius) curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY()) GameWorld.Log("Íæ¼Ò²»ÔÚÓªµØ·¶Î§ÄÚ£¬Ç¿ÖÆÀ­»Ø£¡faction=%s,curPos=(%s,%s),centerPos=(%s,%s), dist=%s > maxDist=%s" % (faction, curPosX, curPosY, centrePosX, centrePosY, dist, maxDist), playerID) return def __DoLogic_FB_Fighting(tick): __NotifyWarHelp_Info(tick) __AddPlayerFightTimeByTime(tick) # ¸üÐÂÍæ¼ÒÕ½¶·Ê±³¤ if __AddFamilyResPointByTime(tick): return remaindTick = GetFWarStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) if remaindTick > 0: __RefreshRandBuff(tick) return __DoLogicFamilyWarOver(tick) # Ö´ÐбÈÈü½áÊøÂß¼­ return def __AddPlayerFightTimeByTime(tick): # ¸üÐÂÍæ¼ÒÕ½¶·Ê±³¤ restoreHPPerBySecond = IpyGameDataPY.GetFuncCfg("FamilyMatchSpawnPoint", 4) # ÿÃë»ØÑª°Ù·Ö±È factionSafeAreaRandPosList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSpawnPoint", 3) # ÓªµØ×ø±ê playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() if not playerID: continue warPlayer = GetFamilyWarPlayer(playerID) faction = curPlayer.GetFaction() if faction and faction <= len(factionSafeAreaRandPosList): safePosX, safePosY, safeRadius = factionSafeAreaRandPosList[faction - 1] if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), safePosX, safePosY) <= safeRadius: # ÓªµØ»ØÑª restoreSeconds = (tick - warPlayer.restoreHPTick) / 1000.0 if warPlayer.restoreHPTick else 1 # Ê״α£µ×1Ãë if restoreSeconds >= 1: maxHP = GameObj.GetMaxHP(curPlayer) if GameObj.GetHP(curPlayer) < maxHP: restoreHP = int(maxHP * restoreHPPerBySecond / 100.0 * round(restoreSeconds, 1)) #GameWorld.DebugLog("restoreHPPerBySecond=%s,restoreSeconds=%s,maxHP=%s,restoreHP=%s" # % (restoreHPPerBySecond, restoreSeconds, maxHP, restoreHP), playerID) SkillCommon.SkillAddHP(curPlayer, 0, restoreHP) warPlayer.restoreHPTick = tick else: warPlayer.restoreHPTick = 0 lastCalcTick = warPlayer.calcFightTimeTick warPlayer.calcFightTimeTick = tick if not lastCalcTick: continue addTick = tick - lastCalcTick lastFightMinute = warPlayer.fightTime / 60000 # ÒѾ­Õ½¶··ÖÖÓÊý warPlayer.fightTime += addTick updFightMinute = warPlayer.fightTime / 60000 # ¸üÐÂÕ½¶··ÖÖÓÊý addFightMinute = updFightMinute - lastFightMinute # Âú·ÖÖÓ²Å¼Ó if not addFightMinute: continue addScore = GetScorePerMinute() * addFightMinute warPlayer.score += addScore #GameWorld.DebugLog("¶¨Ê±Ôö¼ÓÍæ¼Ò»ý·Ö: fightTime=%s,addScore=%s,updScore=%s" # % (warPlayer.fightTime, addScore, warPlayer.score), playerID) return def __AddFamilyResPointByTime(tick): # ¶¨Ê±Ôö¼Ó×ÊÔ´µã # @return: ÊÇ·ñÓÐÏÉÃË»ñʤ resPointPerSecond = GetResourcePointPerSecond() pointMultipleDict = GetResourcePointMultiple() gameFB = GameWorld.GetGameFB() resourceNPCIDList = GetResourceNPCIDList() addResPointDict = {} # Ôö¼ÓµÄ×ÊÔ´µã×ÜÊý {familyID:addPoint, ...} for npcID in resourceNPCIDList: pointTick = gameFB.GetGameFBDictByKey(GameFBDict_FamilyResPointTick % npcID) familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) if not pointTick or not familyID: continue # ÿÃë¼Ó»ý·Ö, ÔÝдËÀ addTime = (tick - pointTick) / 1000 if not addTime: continue gameFB.SetGameFBDict(GameFBDict_FamilyResPointTick % npcID, tick) addPoint = resPointPerSecond * addTime if npcID in pointMultipleDict: addPoint = int(math.ceil(addPoint * pointMultipleDict[npcID])) #GameWorld.DebugLog("ÌØÊâË®¾§Ôö¼Ó×ÊÔ´µã: resPointPerSecond=%s,addTime=%s,addPoint=%s" % (resPointPerSecond, addTime, addPoint)) addResPointDict[familyID] = addResPointDict.get(familyID, 0) + addPoint familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() warFamilyA = GetFamilyWarFamily(familyIDA) warFamilyB = GetFamilyWarFamily(familyIDB) buffResPointPerA = warFamilyA.GetBuffResPointPer(tick) buffResPointPerB = warFamilyB.GetBuffResPointPer(tick) addResPointA = addResPointDict.get(familyIDA, 0) * (10000 + buffResPointPerA) / 10000.0 # ²»È¡Õû£¬Ö§³ÖСÊý addResPointB = addResPointDict.get(familyIDB, 0) * (10000 + buffResPointPerB) / 10000.0 # ²»È¡Õû£¬Ö§³ÖСÊý resPointA = warFamilyA.AddResPoint(addResPointA) resPointB = warFamilyB.AddResPoint(addResPointB) resWinPoint = GetResourceWinPoint() #if addResPointDict: # GameWorld.DebugLog("Ôö¼ÓÏÉÃË×ÊÔ´: addResPointDict=%s,buffResPointPerAB(%s, %s),addResPointAB=(%s, %s),updResPointAB=(%s, %s)" # % (addResPointDict, buffResPointPerA, buffResPointPerB, addResPointA, addResPointB, resPointA, resPointB)) #else: # GameWorld.DebugLog("ûÏÉÃËÔö¼Ó×ÊÔ´") if resPointA < resWinPoint and resPointB < resWinPoint: #GameWorld.DebugLog("ûÓÐÏÉÃ˵½´ï»ñʤ×ÊÔ´µã£¡") return GameWorld.Log("ÓÐÏÉÃË×ÊÔ´µãµ½´ïʤÀûÌõ¼þ, ±ÈÈü½áÊø!familyIDA=%s,resPointA=%s VS familyIDB=%s,resPointB=%s,resWinPoint=%s" % (familyIDA, resPointA, familyIDB, resPointB, resWinPoint)) __DoLogicFamilyWarOver(tick) # Ö´ÐбÈÈü½áÊøÂß¼­ return True def __AddFamilyResPoint(warFamily, resPointAdd, tick): # Ôö¼Ó×ÊÔ´µã£¬´ËÇé¿öÊÊÓÃÓÚ²»ÊÇÁ½¸öÏÉÃËͬʱ´¥·¢µÄ£¬¼ÓÍêºóÁ¢¼´ÅжÏÊÇ·ñ»ñʤ resPoint = warFamily.AddResPoint(resPointAdd) resWinPoint = GetResourceWinPoint() GameWorld.DebugLog("Ôö¼Ó×ÊÔ´µã: familyID=%s,resPointAdd=%s£¬updPoint=%s,resWinPoint=%s" % (warFamily.familyID, resPointAdd, resPoint, resWinPoint)) if resPoint >= resWinPoint: __DoLogicFamilyWarOver(tick) return def __RefreshRandBuff(tick): ## Ëæ»úbuff gameFB = GameWorld.GetGameFB() lastRefreshTick = gameFB.GetGameFBDictByKey(GameFBDict_RandBuffRefreshTick) if not lastRefreshTick: gameFB.SetGameFBDict(GameFBDict_RandBuffRefreshTick, tick) return if tick - lastRefreshTick < GetRandBuffRefreshTime() * 1000: return lastCollectTick = gameFB.GetGameFBDictByKey(GameFBDict_RandBuffCollectTick) if tick - lastCollectTick < 3000: # ¸Õ±»²ÉÍê3ÃëÄÚ²»ÂíÉÏË¢£¬·ÀÖ¹Ò»²ÉÍê¾ÍÂíÉϳöÀ´buff£¬Óиö»º³å return randPosList = GetRandBuffPosList() maxBuffCount = len(randPosList) emptyBuffPosIndexList = range(maxBuffCount) for i in xrange(maxBuffCount): if gameFB.GetGameFBDictByKey(GameFBDict_RandBuffObjID % i): emptyBuffPosIndexList.remove(i) if not emptyBuffPosIndexList: #GameWorld.DebugLog("³¬¹ý×î´óËæ»úbuffÊý£¬²»Ë¢Ð£¡") return lineID = GameWorld.GetGameWorld().GetLineID() randCount = min(GetRandBuffCount(), len(emptyBuffPosIndexList)) randNPCIDList = GetRandBuffNPCIDList() for i in xrange(randCount): randNPCID = random.choice(randNPCIDList) randPosIndex = random.choice(emptyBuffPosIndexList) randPosX, randPosY = randPosList[randPosIndex] # ÕÙ»½³öËæ»úbuff randBuffNPC = NPCCommon.SummonMapNpc(randNPCID, randPosX, randPosY) if not randBuffNPC: continue emptyBuffPosIndexList.remove(randPosIndex) buffObjID = randBuffNPC.GetID() gameFB.SetGameFBDict(GameFBDict_RandBuffObjID % randPosIndex, buffObjID) GameWorld.Log("Ë¢ÐÂËæ»úbuff: lineID=%s,randPosIndex=%s,randNPCID=%s,buffObjID=%s" % (lineID, randPosIndex, randNPCID, buffObjID)) # Ç¿Á¦BUFFÉú³ÉÔÚÕ½³¡ÄÚ£¬¿ì¿ìÈ¥Õù¶á PlayerControl.FBNotify("FamilyMatchBuff") gameFB.SetGameFBDict(GameFBDict_RandBuffRefreshTick, tick) return def __DoLogicFamilyWarOver(tick): ## ±ÈÈü½áÊøÂß¼­ gameFB = GameWorld.GetGameFB() familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() vsFamilyIDList = [familyIDA, familyIDB] vsFamilyIDList.sort(cmp=CmpFamilyWinner) winnerFamilyID = vsFamilyIDList[0] gameFB.SetGameFBDict(GameFBDict_WinnerFamilyID, winnerFamilyID) isFinalMatch = gameFB.GetGameFBDictByKey(GameFBDict_IsFinalMatch) roundNum = gameFB.GetGameFBDictByKey(GameFBDict_RoundNum) groupID = gameFB.GetGameFBDictByKey(GameFBDict_GroupID) lineID = GameWorld.GetGameWorld().GetLineID() winnerWarFamily = GetFamilyWarFamily(winnerFamilyID) winFaction = winnerWarFamily.faction winCount = winnerWarFamily.winCount + 1 GameWorld.Log("±ÈÈü½áÊø: isFinalMatch=%s,roundNum=%s,groupID=%s,familyIDA=%s VS familyIDB=%s,winnerFamilyID=%s,winFaction=%s,winCount=%s" % (isFinalMatch, roundNum, groupID, familyIDA, familyIDB, winnerFamilyID, winFaction, winCount), lineID) # ͬ²½GameServer ±ÈÈü½á¹û msgInfo = str([familyIDA, familyIDB, winnerFamilyID, isFinalMatch]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'FamilyWarOver', msgInfo, len(msgInfo)) # »ñʤÏÉÃËÍæ¼Ò»ý·Ö¼Ó³É winnerScoreAddPer = GetScoreWinerAddPer() familyWarPlayerDict = FBCommon.GetGameFBData(GameFBData_FamilyWarPlayer) for playerID, warPlayer in familyWarPlayerDict.items(): if warPlayer.familyID != winnerFamilyID: continue score = warPlayer.score warPlayer.score = int(score * (100 + winnerScoreAddPer) / 100.0) GameWorld.DebugLog(" »ñʤÏÉÃËÍæ¼Ò½áËã»ý·Ö¼Ó³É: familyID=%s,playerID=%s,score=%s,upScore=%s" % (warPlayer.familyID, playerID, score, warPlayer.score), lineID) rankAwardDict = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 1) awardPerList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 2) joinAwardItemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankReward", 3) if groupID <= 0: awardPer = awardPerList[0] elif groupID > len(awardPerList): awardPer = awardPerList[-1] else: awardPer = awardPerList[groupID - 1] rankAwardDictCopy = {} for rank, itemList in rankAwardDict.items(): copyItemList = [] for itemID, itemCount, isBind, isPer in itemList: if isPer: # ½±Àø¸öÊýÊÇ·ñÊܰٷֱÈÓ°Ïì, ĬÈÏÊÜÓ°Ïì copyItemList.append([itemID, max(1, int(itemCount * awardPer / 100.0)), isBind]) else: copyItemList.append([itemID, itemCount, isBind]) rankAwardDictCopy[rank] = copyItemList # ×î¸ß¼¶±ðÁªÈüµÚÒ»Ãû¶îÍâ½±Àø winnerFirstAwardEx = [] # »ñʤ·½µÚÒ»Ãû¶îÍâ½±Àø loserFirstAwardEx = [] # ʧ°Ü·½µÚÒ»Ãû¶îÍâ½±Àø firstAwardEx, firstAwardEx2= [], [] if groupID == FamilyWar_MaxGroupID: worldLv = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_WorldAverageLv) if isFinalMatch: firstAwardExDict = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSRankOneReward", 1) firstAwardExDict2 = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchSRankOneReward", 2) else: firstAwardExDict = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankOneReward", 1) firstAwardExDict2 = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchRankOneReward", 2) firstAwardEx = GameWorld.GetOrderValueByDict(firstAwardExDict, worldLv) firstAwardEx = [] if not firstAwardEx else firstAwardEx GameWorld.Log("×î¸ß¼¶±ðÁªÈüʤÕßµÚÒ»Ãû¶îÍâ½±Àø: firstAwardEx=%s,firstAwardExDict=%s,worldLv=%s" % (firstAwardEx, firstAwardExDict, worldLv), lineID) firstAwardEx2 = GameWorld.GetOrderValueByDict(firstAwardExDict2, worldLv) firstAwardEx2 = [] if not firstAwardEx2 else firstAwardEx2 GameWorld.Log("×î¸ß¼¶±ðÁªÈü°ÜÕßµÚÒ»Ãû¶îÍâ½±Àø: firstAwardEx2=%s,firstAwardExDict2=%s,worldLv=%s" % (firstAwardEx2, firstAwardExDict2, worldLv), lineID) GameWorld.Log("Ãû´Î½±ÀøÅäÖÃ: rankAwardDict=%s,awardPer=%s,rankAwardDictCopy=%s,firstAwardEx=%s,joinAwardItemList=%s" % (rankAwardDict, awardPer, rankAwardDictCopy, firstAwardEx, joinAwardItemList), lineID) # ´Ë´¦½áËã½±ÀøµÈ joinPlayerIDList = [] # ²ÎÓëµÄÍæ¼ÒIDÁбí [playerID, ...] championPlayerIDList = [] # ¹Ú¾üÍæ¼ÒIDÁбí [playerID, ...] batchPlayerIDList, batchAddItemList, batchParamList = [], [], [] leaveTime = GetFWarStepTime()[Time_Leave] * 1000 sortWarPlayerList = SortFamilyWarPlayer() billboardPack = GetFamilyWarBillboardPack(gameFB, sortWarPlayerList, tick, winFaction) copyPlayerMgr = GameWorld.GetMapCopyPlayerManager() for rank, warPlayer in enumerate(sortWarPlayerList, 1): rankItemList = GameWorld.GetOrderValueByDict(rankAwardDictCopy, rank) if firstAwardEx and not winnerFirstAwardEx and warPlayer.familyID == winnerFamilyID: winnerFirstAwardEx = firstAwardEx awardItemList = rankItemList + winnerFirstAwardEx # %s0ÔÚÏÉÃËÁªÈüÖбíÏÖÓÅÒ죬»ñµÃ¶îÍâ½±Àø PlayerControl.WorldNotify(0, "FamilyMatchRankNoOne", [warPlayer.name, winnerFirstAwardEx[0][0]]) elif firstAwardEx2 and not loserFirstAwardEx and warPlayer.familyID != winnerFamilyID: loserFirstAwardEx = firstAwardEx2 awardItemList = rankItemList + loserFirstAwardEx PlayerControl.WorldNotify(0, "FamilyMatchRankNoOneLose", [warPlayer.name, loserFirstAwardEx[0][0]]) else: awardItemList = rankItemList playerID = warPlayer.playerID GameWorld.Log(" ½±Àø:rank=%s,awardItemList=%s,playerID=%s,score=%s," % (rank, awardItemList, playerID, warPlayer.score), lineID) batchPlayerIDList.append([playerID]) batchAddItemList.append(awardItemList) batchParamList.append([rank]) joinPlayerIDList.append(playerID) if isFinalMatch and warPlayer.familyID == winnerFamilyID: championPlayerIDList.append(playerID) player = copyPlayerMgr.FindPlayerByID(playerID) if player: NetPackCommon.SendFakePack(player, billboardPack) player.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTime, True) PlayerFamily.AddFamilyActivity(player, ShareDefine.FamilyActive_War) # ÅÅÃû½±ÀøÓʼþ PlayerControl.SendMailBatch("FamilyMatchRankMail", batchPlayerIDList, batchAddItemList, batchParamList) # ²ÎÓë½±Óʼþ PlayerControl.SendMailByKey("FamilyMatchJoinMail", joinPlayerIDList, joinAwardItemList) # ³ÆºÅÓʼþ, Çø·ÖÃËÖ÷Óë³ÉÔ±£¬¸ÄΪʵʱ¸üР#if championPlayerIDList: # titleItemID = IpyGameDataPY.GetFuncCfg("FamilyMatchDayReward", 2) # PlayerControl.SendMailByKey("FamilyMatchTitleMail", championPlayerIDList, [[titleItemID, 1, 1]]) FBCommon.SetFBStep(FB_Step_LeaveTime, tick) return def CmpFamilyWinner(familyIDA, familyIDB): ## »ñʤÅÅÐò¹æÔò: ×ÊÔ´µã > Õ¼ÁìË®¾§Êý > Õ½³¡ÖÐÏÉÃËÈËÊý > ÏÉÃËÁбíÖÐÅÅÃû lineID = GameWorld.GetGameWorld().GetLineID() # ×ÊÔ´µã resPointA = GetFamilyWarFamily(familyIDA).GetResPoint() resPointB = GetFamilyWarFamily(familyIDB).GetResPoint() cmpRet = cmp(resPointB, resPointA) # µ¹Ðò GameWorld.Log(" ×ÊÔ´µãÊý: familyIDA=%s,familyIDB=%s,resPointB=%s,resPointA=%s,cmpRet=%s" % (familyIDA, familyIDB, resPointB, resPointA, cmpRet), lineID) if cmpRet != 0: return cmpRet gameFB = GameWorld.GetGameFB() # Õ¼ÁìË®¾§Êý getFlagCountA = 0 getFlagCountB = 0 resourceNPCIDList = GetResourceNPCIDList() for npcID in resourceNPCIDList: familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) if not familyID: continue if familyID == familyIDA: getFlagCountA += 1 if familyID == familyIDB: getFlagCountB += 1 cmpRet = cmp(getFlagCountB, getFlagCountA) # µ¹Ðò GameWorld.Log(" Õ¼ÁìË®¾§Êý: getFlagCountB=%s,getFlagCountA=%s,cmpRet=%s" % (getFlagCountB, getFlagCountA, cmpRet), lineID) if cmpRet != 0: return cmpRet # Õ½³¡ÖÐÏÉÃËÈËÊý familyPlayerCountA = 0 familyPlayerCountB = 0 copyPlayerMgr = GameWorld.GetMapCopyPlayerManager() for index in xrange(copyPlayerMgr.GetPlayerCount()): player = copyPlayerMgr.GetPlayerByIndex(index) if not player: continue familyID = player.GetFamilyID() if not familyID: continue if familyID == familyIDA: familyPlayerCountA += 1 if familyID == familyIDB: familyPlayerCountB += 1 cmpRet = cmp(familyPlayerCountB, familyPlayerCountA) # µ¹Ðò GameWorld.Log(" Õ½³¡ÖÐÏÉÃËÈËÊý: familyPlayerCountB=%s,familyPlayerCountA=%s,cmpRet=%s" % (familyPlayerCountB, familyPlayerCountA, cmpRet), lineID) if cmpRet != 0: return cmpRet # ÏÉÃËÁбíÖÐÅÅÃû, Ò»¶¨ÊDz»Ò»ÑùµÄ familyRankA = GetFamilyWarFamily(familyIDA).rank familyRankB = GetFamilyWarFamily(familyIDB).rank cmpRet = cmp(familyRankA, familyRankB) # ÕýÐò GameWorld.Log(" ÏÉÃËÁбíÖÐÅÅÃû: familyRankA=%s,familyRankB=%s,cmpRet=%s" % (familyRankA, familyRankB, cmpRet), lineID) return cmpRet def __DoLogic_FB_Over(tick): remaindTick = GetFWarStepTime()[Time_Leave] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick()) if remaindTick > 0: return GameWorldProcess.CloseFB(tick) FBCommon.SetFBStep(FB_Step_Over, tick) return ## ÊÇ·ñ¸±±¾¸´»î def OnPlayerReborn(): return True ## ÖØÖø±±¾¸´»îÍæ¼Ò×ø±êµã def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick): gameFB = GameWorld.GetGameFB() faction = curPlayer.GetFaction() factionIndex = GetFactionIndex(faction) posRankList = GetResourceRebornRank()[factionIndex] resNPCIDList = GetResourceNPCIDList() resRebornPosList = GetResourceRebornPosList() playerFamilyID = curPlayer.GetFamilyID() if len(resNPCIDList) != len(resRebornPosList): return for posRank in posRankList: index = posRank - 1 if index < 0 or index >= len(resNPCIDList): continue npcID = resNPCIDList[index] flagFamilyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) if playerFamilyID != flagFamilyID: #GameWorld.DebugLog("²»ÊÇÍæ¼ÒËùÊôÏÉÃËÕ¼ÁìµÄ×ÊÔ´£¡playerFamilyID=%s,flagFamilyID=%s,npcID=%s" # % (playerFamilyID, flagFamilyID, npcID)) continue randPosX, randPosY, randDist = random.choice(resRebornPosList[index]) posPoint = GameMap.GetEmptyPlaceInArea(randPosX, randPosY, randDist) curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY()) GameWorld.DebugLog("Íæ¼ÒÓÅÏȸ´»îµã: faction=%s,posNum=%s,npcID=%s" % (faction, posRank, npcID)) return # ĬÈÏÓªµØ centrePosX, centrePosY, radius = GetFactionArea()[factionIndex] posPoint = GameMap.GetEmptyPlaceInArea(centrePosX, centrePosY, radius) curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY()) GameWorld.DebugLog("Íæ¼ÒÓªµØ¸´»î: faction=%s" % (faction)) return ##´¦Àí¸±±¾ÖÐɱËÀÍæ¼ÒÂß¼­ def DoFBOnKill_Player(curPlayer, defender, tick): playerID = curPlayer.GetPlayerID() killPlayerScore = GetScoreKillPlayer() warPlayer = GetFamilyWarPlayer(playerID) warPlayer.killPlayerCount += 1 warPlayer.score += killPlayerScore GameWorld.DebugLog("»÷É±Íæ¼Ò: addScore=%s,score=%s,killPlayerCount=%s" % (killPlayerScore, warPlayer.score, warPlayer.killPlayerCount), playerID) return True #¹ØÏµÓÐ3²ã£¬ÎÞ-ÓѺÃ-µÐÈË ##ÅжÏÊÇ·ñÓѺùØÏµ£¬¸Ã²ãÅж¨ÎªÓѺÃÂß¼­ÖеÄ×îºóÅÐ¶Ï def CheckPlayersRelation_IsFriend(curPlayer, curTagPlayer): return not __CanAttackPlayer(curPlayer, curTagPlayer) ##¸±±¾ÖÐ,¹¥»÷¶ÓÓÑÂß¼­ def DoCanAttackTeamer(curPlayer, curTagPlayer): return __CanAttackPlayer(curPlayer, curTagPlayer) def __CanAttackPlayer(curPlayer, curTagPlayer): if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting: return False return curPlayer.GetFamilyID() != curTagPlayer.GetFamilyID() ## Íæ¼Ò¹¥»÷Íæ¼ÒÊÇ·ñÓгͷ£ def DoFBAttackHasPunish(atkPlayer, defPlayer): return False ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼­ÓÉÍâ²ã¾ö¶¨ def CheckCanAttackTagObjInFB(attacker, defender): if GameWorld.GetGameFB().GetFBStep() != FB_Step_Fighting: return False return True ##ÊÇ·ñ¿ÉÒÔ¶áÆì # @param curPlayer Íæ¼ÒʵÀý # @param curNPC NPCʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks def OnCanCollect(curPlayer, curNPC, tick): npcID = curNPC.GetNPCID() familyID = curPlayer.GetFamilyID() GameWorld.DebugLog("OnCanCollect npcID=%s,familyID=%s" % (npcID, familyID), curPlayer.GetPlayerID()) if not familyID: return False gameFB = GameWorld.GetGameFB() fbStep = gameFB.GetFBStep() # ·ÇÕ½¶·½×¶Î²»¿É²É¼¯ if fbStep != FB_Step_Fighting: PlayerControl.NotifyCode(curPlayer, "NotFightStepCanNotCollect") return False if npcID in GetResourceNPCIDList(): # ÒÑ»ñµÃÕ½ÆìµÄÕ½Ã˲»¿É²É¼¯ getFlagFamilyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) if getFlagFamilyID == familyID: PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_976459") return False return True ##¸±±¾ÖÐ,Õ¼ÁìNPCµÄLoadingʱ¼ä. # @param curPlayer Íæ¼ÒʵÀý # @param curNPC NPCʵÀý # @return ·µ»ØÖµ, Loadingʱ¼ä # @remarks ¸±±¾ÖÐ,Õ¼ÁìNPCµÄLoadingʱ¼ä def GetFBPrepareTime(curPlayer, curNPC): npcID = curNPC.GetNPCID() playerID = curPlayer.GetPlayerID() collectTimeList = GetCollectTimeList() cfgIndex = 1 if npcID in GetRandBuffNPCIDList() else 0 tick = GameWorld.GetGameWorld().GetTick() warPlayer = GetFamilyWarPlayer(playerID) warPlayer.collectTypeIndex = cfgIndex warPlayer.collectLostHPTick = tick prepareTime = collectTimeList[cfgIndex] * 1000 GameWorld.DebugLog("CollectPrepare npcID=%s,cfgIndex=%s,tick=%s,prepareTime=%s" % (npcID, cfgIndex, tick, prepareTime)) return prepareTime ## ÊÕ¼¯ÖÐ def OnCollecting(curPlayer, tick): playerID = curPlayer.GetPlayerID() warPlayer = GetFamilyWarPlayer(playerID) ## ÿÃëµôѪ£¬ÔÝдËÀ lostTime = (tick - warPlayer.collectLostHPTick) / 1000 # µôѪ´ÎÊý if not lostTime: return warPlayer.collectLostHPTick = tick lostHPPerList = GetCollectLostHPPerList() lostHPPer = lostHPPerList[warPlayer.collectTypeIndex] skillTypeID, buffOwner = 0, None lostValue = int(GameObj.GetMaxHP(curPlayer) * lostHPPer / 100.0) * lostTime #GameWorld.DebugLog("OnCollecting lostHPPer=%s,lostTime=%s,lostValue=%s" % (lostHPPer, lostTime, lostValue), playerID) SkillCommon.SkillLostHP(curPlayer, skillTypeID, buffOwner, lostValue, tick, skillAffect=False) return ##Íæ¼ÒÊÕ¼¯³É¹¦(Ëþ, Æì) # @param curPlayer Íæ¼ÒʵÀý # @param tick ʱ¼ä´Á # @return ÎÞÒâÒå # @remarks def OnCollectOK(curPlayer, npcID, tick): tagObj = curPlayer.GetActionObj() if not tagObj: return if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC: return curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex()) AICommon.ClearPlayerPreparing(curNPC, curPlayer) npcID = curNPC.GetNPCID() # Ë®¾§ if npcID in GetResourceNPCIDList(): __OnCollectOK_Resource(curPlayer, curNPC, tick) # Ëæ»úbuff else: __OnCollectOK_Buff(curPlayer, curNPC, tick) return def __OnCollectOK_Resource(curPlayer, curNPC, tick): objID = curNPC.GetID() npcID = curNPC.GetNPCID() playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() GameWorld.Log("²É¼¯Ë®¾§ objID=%s,npcID=%s,familyID=%s" % (objID, npcID, familyID), playerID) gameFB = GameWorld.GetGameFB() lastFlagFamilyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) nextFlagFamilyID = familyID if lastFlagFamilyID == nextFlagFamilyID: return # ¸üÐÂÕ½Æì¹éÊôÐÅÏ¢ gameFB.SetGameFBDict(GameFBDict_GetFlagFamilyID % npcID, nextFlagFamilyID) gameFB.SetGameFBDict(GameFBDict_FamilyResPointTick % npcID, tick) collRescourceScoreDict = GetScoreCollectRescource() if npcID in collRescourceScoreDict: collRescourceScore = collRescourceScoreDict[npcID] else: collRescourceScore = collRescourceScoreDict[0] warPlayer = GetFamilyWarPlayer(playerID) warPlayer.collResourceCount += 1 warPlayer.score += collRescourceScore GameWorld.DebugLog(" Íæ¼ÒÕ¼ÁìË®¾§: addScore=%s,score=%s,collResourceCount=%s" % (collRescourceScore, warPlayer.score, warPlayer.collResourceCount), playerID) # Õ¼Áì¹ã²¥¸ø¶ÔÊÖÕóÓª # ÓÐÒ»¸ö×ÊÔ´Ë®¾§±»µÐ·½Õ¼ÁìÁË£¬¿ìÈ¥ÇÀ¶á»ØÀ´ PlayerControl.FBFactionNotifyOther(curPlayer.GetFaction(), "FamilyMatchOccupied") return def __OnCollectOK_Buff(curPlayer, curNPC, tick): objID = curNPC.GetID() npcID = curNPC.GetNPCID() playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() gameFB = GameWorld.GetGameFB() # ÉèÖÃbuff±»²É¼¯ gameFB.SetGameFBDict(GameFBDict_RandBuffCollectTick, tick) for i in xrange(len(GetRandBuffPosList())): if objID == gameFB.GetGameFBDictByKey(GameFBDict_RandBuffObjID % i): gameFB.SetGameFBDict(GameFBDict_RandBuffObjID % i, 0) break collBuffScore = GetScoreCollectRandBuff() warPlayer = GetFamilyWarPlayer(playerID) warPlayer.collRandBuffCount += 1 warPlayer.score += collBuffScore GameWorld.DebugLog(" Íæ¼ÒÕ¼ÁìBuff: addScore=%s,score=%s,collRandBuffCount=%s" % (collBuffScore, warPlayer.score, warPlayer.collRandBuffCount), playerID) warFamily = GetFamilyWarFamily(familyID) # Ôö¼ÓbuffЧ¹û buffSkill = curNPC.GetSkillManager().GetSkillByIndex(0) if buffSkill: buffSkillTypeID = buffSkill.GetSkillTypeID() GameWorld.Log("²É¼¯buff objID=%s,npcID=%s,familyID=%s,buffSkillTypeID=%s" % (objID, npcID, familyID, buffSkillTypeID), curPlayer.GetPlayerID()) if buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_ResPointAdd: resPointAdd = buffSkill.GetEffect(0).GetEffectValue(0) warFamily.randBuffResPoint += resPointAdd __AddFamilyResPoint(warFamily, resPointAdd, tick) elif buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_ResPointAddPer: warFamily.randBuffResPointPerDict[tick] = [buffSkill.GetLastTime(), buffSkill.GetEffect(0).GetEffectValue(0)] elif buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_RandBuffAttr: warFamily.randBuffAttrLV += 1 __AddFamilyWarBuff(familyID, buffSkillTypeID, tick, warFamily.randBuffAttrLV) elif buffSkillTypeID == ChConfig.Def_SkillID_FamilyWar_OwnerlessBuff: familyVsMgr = gameFB.GetFamilyVS() familyIDA = familyVsMgr.GetFamilyID() familyIDB = familyVsMgr.GetVSFamilyID() tagFamilyID = familyIDB if familyID == familyIDA else familyIDA __RandBuffOwnerless(warFamily.faction, familyID, tagFamilyID, buffSkill.GetEffect(0).GetEffectValue(0)) else: GameWorld.ErrLog("²»Ö§³Ö¸ÃËæ»úbuffЧ¹û£¡npcID=%s,buffSkillTypeID=%s" % (npcID, buffSkillTypeID)) # BUFFÒѱ»¼º·½ÏÉÃË»ñµÃ£¬Ê¿Æø´óÕÇ # BUFFÒѱ»µÐ·½ÏÉÃË»ñµÃ£¬Å¬Á¦Õù¶áÏÂÒ»¸ö£¬²»ÒªÆøÄÙ PlayerControl.FBFactionNotify(curPlayer.GetFaction(), "FamilyMatchBuffOccupied", [buffSkillTypeID], "FamilyMatchBuffOccupiedEnimy", [buffSkillTypeID]) else: GameWorld.ErrLog("Ëæ»úbuffûÅäÖòɼ¯Ð§¹û£¡npcID=%s" % npcID) NPCCommon.SetDeadEx(curNPC) return def __AddFamilyWarBuff(familyID, buffSkillTypeID, tick, skillLV=None, isDelFirst=False): ## ¸øÏÉÃ˳ÉÔ±¼Óbuff buffSkill = GameWorld.GetGameData().GetSkillBySkillID(buffSkillTypeID) if not buffSkill: return GameWorld.DebugLog("ÏÉÃ˳ÉÔ±¼ÓBuff(%s): familyID=%s,buffSkillTypeID=%s,skillLV=%s,isDelFirst=%s" % (buffSkill.GetSkillName(), familyID, buffSkillTypeID, skillLV, isDelFirst)) maxSkillLV = buffSkill.GetSkillMaxLV() if skillLV > maxSkillLV: skillLV = maxSkillLV GameWorld.DebugLog(" ³¬¹ý×î´ó¼¼Äܵȼ¶£¬È¡×î´ó¼¼Äܵȼ¶!skillLV=%s" % skillLV) playerManager = GameWorld.GetMapCopyPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() if not playerID: continue if curPlayer.GetFamilyID() != familyID: continue #Ìí¼Ó½ÏµÍ¼¶µÄbuff£¬ÐèÒªÏÈɾ³ý if isDelFirst: BuffSkill.DelBuffBySkillID(curPlayer, buffSkillTypeID, tick) SkillCommon.AddBuffBySkillType(curPlayer, buffSkillTypeID, tick, skillLV) return def __RandBuffOwnerless(faction, curFamilyID, tagFamilyID, randCount): # Ë®¾§×ÊÔ´ randResNPCIDList = [] gameFB = GameWorld.GetGameFB() for npcID in GetResourceNPCIDList(): curNPC = GameWorld.FindNPCByNPCID(npcID) if not curNPC: continue familyID = gameFB.GetGameFBDictByKey(GameFBDict_GetFlagFamilyID % npcID) if not familyID: continue if familyID == tagFamilyID: randResNPCIDList.append(npcID) GameWorld.DebugLog("²É¼¯ÎÞÖ÷buff: curFamilyID=%s,tagFamilyID=%s,randResNPCIDList=%s" % (curFamilyID, tagFamilyID, randResNPCIDList)) random.shuffle(randResNPCIDList) GameWorld.DebugLog(" ´òÂÒºó: randResNPCIDList=%s,randCount=%s" % (randResNPCIDList, randCount)) ownerLessNPCIDList = randResNPCIDList[:randCount] for npcID in ownerLessNPCIDList: gameFB.SetGameFBDict(GameFBDict_GetFlagFamilyID % npcID, 0) PlayerControl.FBFactionNotify(faction, "FamilyWarIneffctive1", [], "FamilyWarIneffctive2", []) if not ownerLessNPCIDList: PlayerControl.FBFactionNotify(faction, "FamilyWarIneffctive3", [], "FamilyWarIneffctive4", []) return ## ------------------------------------------------------------------------ def GetChampionFamilyDailyReward(curPlayer): ## ¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø playerID = curPlayer.GetPlayerID() curFamilyID = curPlayer.GetFamilyID() if not curFamilyID: GameWorld.DebugLog("¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø£¬ÎÞÏÉÃË£¬²»¿ÉÁì½±!", playerID) return championFamilyID = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_ChampionFamilyID) if curFamilyID != championFamilyID: GameWorld.DebugLog("¹Ú¾üÏÉÃËÿÈÕٺ»½±Àø, Íæ¼ÒÏÉÃË·Ç»ñʤÏÉÃË£¬²»¿ÉÁì½±!championFamilyID=%s,curFamilyID=%s" % (championFamilyID, curFamilyID), playerID) return dailyRewardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward) if dailyRewardState: # ÒÑÁìÈ¡¹ý¸Ã½±Àø PlayerControl.NotifyCode(curPlayer, 'GeRen_admin_327925') return itemList = IpyGameDataPY.GetFuncEvalCfg("FamilyMatchDayReward") if not itemList: return needSpace = len(itemList) # ±³°ü¿Õ¼ä packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace) if packSpace < needSpace: PlayerControl.NotifyCode(curPlayer, "GeRen_lhs_202580") return # ÉèÖÃÁì½±¼Ç¼Ϊ1£¬Í¨Öª¿Í»§¶Ë PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyWarDailyReward, 1) Sync_ChampionFamilyDailyRewardState(curPlayer) for itemID, itemCnt, isBind in itemList: ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]) GameWorld.DebugLog("ÁìÈ¡ÍõÕßÏÉÃËÿÈÕٺ»: itemList=%s" % itemList, playerID) return def Sync_ChampionFamilyDailyRewardState(curPlayer): clientPack = ChPyNetSendPack.tagMCChampionFamilyDailyReward() clientPack.GetState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyWarDailyReward) NetPackCommon.SendFakePack(curPlayer, clientPack) return