New file |
| | |
| | | #!/usr/bin/python
|
| | | # -*- coding: GBK -*-
|
| | | #-------------------------------------------------------------------------------
|
| | | #
|
| | | ##@package GameWorldLogic.FBProcess.GameLogic_CrossFamilyFlagwar
|
| | | #
|
| | | # @todo:跨服仙盟夺旗战/逐鹿万界
|
| | | # @author hxp
|
| | | # @date 2023-04-25
|
| | | # @version 1.0
|
| | | #
|
| | | # 详细描述: 跨服仙盟夺旗战
|
| | | #
|
| | | #-------------------------------------------------------------------------------
|
| | | #"""Version = 2023-04-25 15:30"""
|
| | | #-------------------------------------------------------------------------------
|
| | |
|
| | | import ChConfig
|
| | | import FBCommon
|
| | | import GameWorld
|
| | | import ShareDefine
|
| | | import IPY_GameWorld
|
| | | import IpyGameDataPY
|
| | | import GameWorldProcess
|
| | | import DataRecordPack
|
| | | import PlayerControl
|
| | | import SkillCommon
|
| | | import BuffSkill
|
| | | import AICommon
|
| | | import GameObj
|
| | | import GameMap
|
| | |
|
| | | import operator
|
| | | import time
|
| | |
|
| | | #当前副本地图的状态
|
| | | (
|
| | | 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)
|
| | |
|
| | | FightRefreshInterval = 5000 # 战斗阶段刷新处理间隔,毫秒
|
| | |
|
| | | GameFBData_BattleMgr = "BattleMgr"
|
| | |
|
| | | ## 战场管理类
|
| | | class BattleMgr():
|
| | | |
| | | def __init__(self):
|
| | | self.zoneID = 0
|
| | | self.battlePlayerDict = {} # 参与战斗的玩家 {playerID:BattlePlayer, ...}
|
| | | self.battleFamilyDict = {} # 参与战斗的仙盟 {familyID:BattleFamily, ...}
|
| | | self.battleFamilySortList = [] # 参与战斗的仙盟积分排名列表 [BattleFamily, ...]
|
| | | |
| | | self.allotRebornPointInfo = {} # 已经分配的复活点,一个复活点可能多个仙盟共用 {index:[familyID, ...], ...}
|
| | | |
| | | self.playerFlagDict = {} # 玩家获得战旗 {playerID:flagNPC, ...}
|
| | | |
| | | self.worldHelpDict = {} # 未通知的世界变更信息
|
| | | return
|
| | | |
| | | def sortBattleFamilyScore(self):
|
| | | self.battleFamilySortList = self.battleFamilyDict.values()
|
| | | self.battleFamilySortList.sort(key=operator.attrgetter("score", "scoreSortTime"), reverse=True)
|
| | | return
|
| | | |
| | | def getBattleFamily(self, familyID):
|
| | | if familyID in self.battleFamilyDict:
|
| | | batFamily = self.battleFamilyDict[familyID]
|
| | | else: |
| | | batFamily = BattleFamily(familyID)
|
| | | self.battleFamilyDict[familyID] = batFamily
|
| | | return batFamily
|
| | | |
| | | def getBattlePlayer(self, playerID):
|
| | | if playerID in self.battlePlayerDict:
|
| | | batPlayer = self.battlePlayerDict[playerID]
|
| | | else: |
| | | batPlayer = BattlePlayer(playerID)
|
| | | self.battlePlayerDict[playerID] = batPlayer
|
| | | return batPlayer
|
| | | |
| | | def addBattleFamily(self, familyID, name):
|
| | | batFamily = self.getBattleFamily(familyID)
|
| | | batFamily.name = name
|
| | | self.__allotRebornPoint(familyID)
|
| | | return batFamily
|
| | | |
| | | def __allotRebornPoint(self, familyID):
|
| | | batFamily = self.getBattleFamily(familyID)
|
| | | for familyIDList in self.allotRebornPointInfo.values():
|
| | | if familyID in familyIDList:
|
| | | return
|
| | | allotIndex = -1
|
| | | allotAlreadyIndexs = self.allotRebornPointInfo.keys()
|
| | | rebornPointList = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwar", 2)
|
| | | if len(rebornPointList) > len(allotAlreadyIndexs):
|
| | | # 还有空余点未分配,直接分配空余点
|
| | | for index, _ in enumerate(rebornPointList):
|
| | | if index not in allotAlreadyIndexs:
|
| | | allotIndex = index
|
| | | break
|
| | | |
| | | if allotIndex == -1:
|
| | | # 没有空余点了,与其他仙盟共用,分配一个最少仙盟的复活点
|
| | | leastIDCount = 99999
|
| | | for index, familyIDList in self.allotRebornPointInfo.items():
|
| | | if len(familyIDList) < leastIDCount and index < len(rebornPointList):
|
| | | leastIDCount = len(familyIDList)
|
| | | allotIndex = index
|
| | | |
| | | rebornPoint = rebornPointList[allotIndex]
|
| | | if len(rebornPoint) != 3:
|
| | | GameWorld.ErrLog("复活点配置异常! index=%s, %s" % (allotIndex, rebornPoint))
|
| | | return
|
| | | |
| | | if allotIndex not in self.allotRebornPointInfo:
|
| | | self.allotRebornPointInfo[allotIndex] = []
|
| | | familyIDList = self.allotRebornPointInfo[allotIndex]
|
| | | familyIDList.append(familyID)
|
| | | |
| | | batFamily.rebornPoint = rebornPoint
|
| | | GameWorld.Log("分配仙盟复活点: familyID=%s,allotIndex=%s,rebornPoint=%s,allotRebornPointInfo=%s" |
| | | % (familyID, allotIndex, rebornPoint, self.allotRebornPointInfo), self.zoneID)
|
| | | return True
|
| | | |
| | | def setPlayerFlag(self, playerID, flagNPC):
|
| | | self.playerFlagDict[playerID] = flagNPC
|
| | | |
| | | npcID = flagNPC.GetNPCID()
|
| | | batPlayer = self.getBattlePlayer(playerID)
|
| | | flagOwner = self.worldHelpDict.get("flagOwner", {})
|
| | | flagOwner[npcID] = [playerID, batPlayer.name]
|
| | | self.worldHelpDict["flagOwner"] = flagOwner
|
| | | return
|
| | | |
| | | def popPlayerFlag(self, playerID):
|
| | | self.playerFlagDict.pop(playerID, None)
|
| | | |
| | | flagOwner = self.worldHelpDict.get("flagOwner", {})
|
| | | for npcID, playerInfo in flagOwner.items():
|
| | | if playerID == playerInfo[0]:
|
| | | flagOwner.pop(npcID, None)
|
| | | break
|
| | | return
|
| | | |
| | | def getWorldHelpInfo(self, isAll, familyID):
|
| | | helpInfo = {}
|
| | | if not isAll:
|
| | | helpInfo = self.worldHelpDict
|
| | | else:
|
| | | flagOwner = {}
|
| | | for playerID, flagNPC in self.playerFlagDict.items():
|
| | | npcID = flagNPC.GetNPCID()
|
| | | batPlayer = self.getBattlePlayer(playerID)
|
| | | flagOwner[npcID] = [playerID, batPlayer.name]
|
| | | helpInfo = {"flagOwner":flagOwner}
|
| | | |
| | | # 取自身仙盟及前后名次仙盟信息
|
| | | familyIndex = -1
|
| | | familyList = []
|
| | | for index, batFamily in enumerate(self.battleFamilySortList):
|
| | | if familyID == batFamily.familyID:
|
| | | familyIndex = index
|
| | | break
|
| | | # 第一名默认取前3名
|
| | | if familyIndex == 0:
|
| | | familyList = self.battleFamilySortList[:3]
|
| | | # 第一名默认取前3名
|
| | | elif familyIndex == len(self.battleFamilySortList) - 1:
|
| | | familyList = self.battleFamilySortList[-3:]
|
| | | elif familyIndex > 0:
|
| | | familyList = self.battleFamilySortList[familyIndex - 1:familyIndex + 2]
|
| | | for i, batFamily in enumerate(familyList):
|
| | | familyList[i] = [batFamily.familyID, batFamily.score, batFamily.name]
|
| | | helpInfo["familyList"] = familyList
|
| | | return {"world":helpInfo}
|
| | | |
| | | ## 战场仙盟类
|
| | | class BattleFamily():
|
| | | |
| | | def __init__(self, familyID):
|
| | | self.familyID = familyID
|
| | | self.name = ""
|
| | | self.score = 0 # 积分
|
| | | self.scoreSortTime = 0 # 积分变更排序time值,用于同积分时,先到排名靠前
|
| | | self.rebornPoint = [130, 300, 10] # 复活点坐标 [x,y,r],这里为默认值,防止没有分配到报错等
|
| | | |
| | | self.battlePlayerIDList = [] # 参与战斗的仙盟玩家ID列表 [playerID, ...]
|
| | | self.battlePlayerSortList = [] # 参与战斗的仙盟玩家积分排名列表 [BattlePlayer, ...]
|
| | | |
| | | self.homePlayerIDList = [] # 在复活点里的玩家
|
| | | |
| | | self.familyHelpDict = {} # 未通知的仙盟变更信息
|
| | | return
|
| | | |
| | | def addJoinPlayer(self, playerID):
|
| | | if playerID not in self.battlePlayerIDList:
|
| | | self.battlePlayerIDList.append(playerID)
|
| | | self.familyHelpDict["playerCount"] = len(self.battlePlayerIDList)
|
| | | return
|
| | | |
| | | def setPlayerToRebornPoint(self, curPlayer):
|
| | | if not self.rebornPoint:
|
| | | return
|
| | | randPosX, randPosY, maxDist = self.rebornPoint
|
| | | posPoint = GameMap.GetEmptyPlaceInAreaEx(randPosX, randPosY, 3, maxDist)
|
| | | curPlayer.ResetPos(posPoint.GetPosX(), posPoint.GetPosY())
|
| | | return
|
| | | |
| | | def sortBattlePlayerScore(self):
|
| | | if len(self.battlePlayerIDList) != len(self.battlePlayerSortList):
|
| | | self.battlePlayerSortList = []
|
| | | mgr = GetBattleMgr()
|
| | | for playerID in self.battlePlayerIDList:
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | self.battlePlayerSortList.append(batPlayer)
|
| | | self.battlePlayerSortList.sort(key=operator.attrgetter("score", "scoreSortTime"), reverse=True)
|
| | | return
|
| | | |
| | | def addFamilyScore(self, addValue):
|
| | | ## 增加积分
|
| | | if addValue <= 0:
|
| | | return
|
| | | self.score = max(0, self.score + addValue)
|
| | | self.familyHelpDict["score"] = self.score
|
| | | calcTime = 3471264000 #GameWorld.ChangeTimeStrToNum("2080-01-01 00:00:00")
|
| | | self.scoreSortTime = max(0, calcTime - int(time.time()))
|
| | | #GameWorld.DebugLog(" 增加仙盟积分: familyID=%s,addValue=%s,updScore=%s" % (self.familyID, addValue, self.score))
|
| | | return
|
| | | |
| | | def getFamilyHelpInfo(self, isAll):
|
| | | helpInfo = {}
|
| | | if not isAll:
|
| | | helpInfo = self.familyHelpDict
|
| | | else:
|
| | | helpInfo = {"score":self.score, "playerCount":len(self.battlePlayerIDList)}
|
| | | return {"family":helpInfo}
|
| | | |
| | | ## 战场玩家类
|
| | | class BattlePlayer():
|
| | | |
| | | def __init__(self, playerID):
|
| | | self.playerID = playerID
|
| | | self.name = ""
|
| | | self.familyID = 0
|
| | | self.familyName = ""
|
| | | self.accID = ""
|
| | | self.job = 1
|
| | | self.realmLV = 0
|
| | | self.fightPower = 0
|
| | | |
| | | self.restoreHPTick = 0 # 营地回血tick
|
| | | self.healthRebornCount = 0 # 原地健康复活次数
|
| | | self.continueKillCount = 0 # 连杀次数
|
| | | |
| | | self.score = 0 # 积分
|
| | | self.scoreSortTime = 0 # 积分变更排序time值,用于同积分时,先到排名靠前
|
| | | self.hurtTotal = 0 # 累计伤害
|
| | | |
| | | self.onlineCalcTick = 0 # 在线计算tick
|
| | | self.outsideFlagTick = 0 # 超出战旗范围计算tick
|
| | | self.outsideFlagNotifySecond = 0 # 通知超出范围秒
|
| | | |
| | | self.playerHelpDict = {} # 未通知的玩家变更信息
|
| | | return
|
| | | |
| | | def doPlayerEnter(self, curPlayer, tick): |
| | | self.familyID = curPlayer.GetFamilyID()
|
| | | self.familyName = curPlayer.GetFamilyName()
|
| | | self.job = curPlayer.GetJob()
|
| | | self.accID = curPlayer.GetAccID()
|
| | | self.name = curPlayer.GetPlayerName()
|
| | | self.realmLV = curPlayer.GetOfficialRank()
|
| | | self.fightPower = PlayerControl.GetFightPower(curPlayer)
|
| | | |
| | | self.onlineCalcTick = tick
|
| | | return
|
| | | |
| | | def addPlayerScore(self, addValue):
|
| | | if addValue <= 0:
|
| | | return
|
| | | self.score = max(0, self.score + addValue)
|
| | | calcTime = 3471264000 #GameWorld.ChangeTimeStrToNum("2080-01-01 00:00:00")
|
| | | self.scoreSortTime = max(0, calcTime - int(time.time()))
|
| | | #GameWorld.DebugLog(" 增加玩家积分: playerID=%s,addValue=%s,updScore=%s" % (self.playerID, addValue, self.score))
|
| | | self.playerHelpDict.update({"score":self.score})
|
| | | return
|
| | | |
| | | def addHealthRebornCount(self):
|
| | | self.healthRebornCount += 1
|
| | | self.playerHelpDict["healthRebornCount"] = self.healthRebornCount
|
| | | return
|
| | | |
| | | def getPlayerHelpInfo(self, isAll):
|
| | | helpInfo = {}
|
| | | if not isAll:
|
| | | helpInfo = self.playerHelpDict
|
| | | else:
|
| | | helpInfo = {"score":self.score, "healthRebornCount":self.healthRebornCount}
|
| | | return {"player":helpInfo}
|
| | | |
| | | def GetBattleMgr():
|
| | | mgr = FBCommon.GetGameFBData(GameFBData_BattleMgr)
|
| | | if not mgr:
|
| | | mgr = BattleMgr()
|
| | | FBCommon.SetGameFBData(GameFBData_BattleMgr, mgr)
|
| | | return mgr
|
| | |
|
| | | def GetBFStepTime(): return IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwar", 1) # 阶段时间
|
| | |
|
| | | def OnOpenFB(tick):
|
| | | FBCommon.SetGameFBData(GameFBData_BattleMgr, None)
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | mgr.zoneID = GameWorld.GetGameWorld().GetPropertyID()
|
| | | |
| | | FBCommon.SetFBStep(FB_Step_Prepare, tick)
|
| | | return
|
| | |
|
| | | def OnCloseFB(tick):
|
| | | GameWorld.GetGameWorld().SetPropertyID(0)
|
| | | FBCommon.SetGameFBData(GameFBData_BattleMgr, None)
|
| | | #FBCommon.ClearFBNPC()
|
| | | return
|
| | |
|
| | |
|
| | | def OnEnterFBEvent(curPlayer, mapID, lineID, tick):
|
| | | if GameWorld.IsCrossServer():
|
| | | return True
|
| | | |
| | | if not curPlayer.GetFamilyID():
|
| | | GameWorld.DebugLog("无仙盟无法进入: mapID=%s" % mapID)
|
| | | return False
|
| | | |
| | | if not GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_CrossDailyActionState % ShareDefine.CrossDailyActionID_FamilyWarFlag):
|
| | | GameWorld.DebugLog("非活动中,无法进入: CrossDailyActionID=%s" % ShareDefine.CrossDailyActionID_FamilyWarFlag)
|
| | | return False
|
| | | |
| | | return True
|
| | |
|
| | | def OnChangeMapAsk(ask, tick):
|
| | | return IPY_GameWorld.cmeAccept
|
| | |
|
| | | ##副本玩家进入点, 玩家分散在半径3格范围
|
| | | def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):
|
| | | return ipyEnterPosInfo
|
| | |
|
| | | def DoEnterFB(curPlayer, tick): |
| | | gameFB = GameWorld.GetGameFB()
|
| | | fbStep = gameFB.GetFBStep()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | familyID = curPlayer.GetFamilyID()
|
| | | familyName = curPlayer.GetFamilyName()
|
| | | mgr = GetBattleMgr()
|
| | | |
| | | if fbStep not in [FB_Step_Prepare, FB_Step_Fighting] or not familyID:
|
| | | GameWorld.Log("DoEnterFB... fbStep=%s,familyID=%s,playerID=%s PlayerLeaveFB" % (fbStep, familyID, playerID), mgr.zoneID)
|
| | | PlayerControl.PlayerLeaveFB(curPlayer)
|
| | | return
|
| | | |
| | | GameWorld.Log("DoEnterFB... fbStep=%s,familyID=%s,playerID=%s" % (fbStep, familyID, playerID), mgr.zoneID)
|
| | | |
| | | #--- 测试 ---
|
| | | # testFamilyCount = 50
|
| | | # if len(mgr.battleFamilyDict) < testFamilyCount:
|
| | | # import random
|
| | | # for i in range(testFamilyCount):
|
| | | # fakeID = i + 10
|
| | | # fakeName = "假名字%s" % fakeID
|
| | | # fakeName = fakeName.decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
|
| | | # fakeFamily = mgr.addBattleFamily(fakeID, fakeName)
|
| | | # fakeFamily.addFamilyScore(random.randint(1000, 1500))
|
| | | #-----------
|
| | | |
| | | batFamily = mgr.addBattleFamily(familyID, familyName)
|
| | | |
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batPlayer.doPlayerEnter(curPlayer, tick)
|
| | | |
| | | batFamily.addJoinPlayer(playerID)
|
| | | batFamily.setPlayerToRebornPoint(curPlayer)
|
| | | |
| | | if fbStep == FB_Step_Prepare:
|
| | | notify_tick = GetBFStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, max(notify_tick, 0), True)
|
| | | |
| | | elif fbStep == FB_Step_Fighting:
|
| | | notify_tick = GetBFStepTime()[Time_Fight] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, max(notify_tick, 0), True)
|
| | | |
| | | NotifyCrossFamilyFlagHelp(True, curPlayer)
|
| | | return
|
| | |
|
| | | def NotifyCrossFamilyFlagHelp(isAll=False, curPlayer=None, helpEx=None):
|
| | | ## 广播战场帮助信息,针对所有玩家
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | |
| | | if curPlayer:
|
| | | __notifyPlayerHelp(curPlayer, mgr, isAll, helpEx)
|
| | | else:
|
| | | playerManager = GameWorld.GetMapCopyPlayerManager()
|
| | | for index in xrange(playerManager.GetPlayerCount()):
|
| | | player = playerManager.GetPlayerByIndex(index)
|
| | | if not player:
|
| | | continue
|
| | | playerID = player.GetPlayerID()
|
| | | if playerID not in mgr.battlePlayerDict:
|
| | | #GameWorld.DebugLog("还未加入战斗,暂不处理! playerID=%s" % playerID)
|
| | | continue
|
| | | __notifyPlayerHelp(player, mgr, isAll, helpEx)
|
| | | |
| | | # 重置未通知的
|
| | | mgr.worldHelpDict = {}
|
| | | for familyID in mgr.battleFamilyDict.keys():
|
| | | batFamily = mgr.getBattleFamily(familyID)
|
| | | batFamily.familyHelpDict = {}
|
| | | |
| | | return
|
| | |
|
| | | def __notifyPlayerHelp(curPlayer, mgr, isAll, helpEx):
|
| | | if not mgr:
|
| | | mgr = GetBattleMgr()
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batFamily = mgr.getBattleFamily(batPlayer.familyID)
|
| | | |
| | | helpDict = {}
|
| | | helpDict.update(mgr.getWorldHelpInfo(isAll, batPlayer.familyID))
|
| | | helpDict.update(batFamily.getFamilyHelpInfo(isAll))
|
| | | helpDict.update(batPlayer.getPlayerHelpInfo(isAll))
|
| | | |
| | | if helpEx:
|
| | | helpDict.update(helpEx)
|
| | | |
| | | GameWorld.DebugLog("FBHelp: %s" % helpDict, playerID)
|
| | | FBCommon.Notify_FBHelp(curPlayer, helpDict)
|
| | | batPlayer.playerHelpDict = {}
|
| | | return
|
| | |
|
| | |
|
| | | ##获得副本帮助信息, 用于通知阵营比分条
|
| | | def DoFBHelp(curPlayer, tick):
|
| | | return
|
| | |
|
| | | ##玩家退出副本
|
| | | def DoExitFB(curPlayer, tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | fbStep = gameFB.GetFBStep()
|
| | | if fbStep != FB_Step_Fighting:
|
| | | return
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | GameWorld.Log("DoExitFB... playerID=%s,fbStep=%s" % (playerID, fbStep), mgr.zoneID)
|
| | | |
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batPlayer.onlineCalcTick = 0
|
| | | return
|
| | |
|
| | | ##玩家主动离开副本.
|
| | | def DoPlayerLeaveFB(curPlayer, tick):
|
| | | return
|
| | |
|
| | | ##副本总逻辑计时器
|
| | | # @param tick 时间戳
|
| | | # @return 无意义
|
| | | # @remarks 副本总逻辑计时器
|
| | | def OnProcess(tick):
|
| | | fbStep = GameWorld.GetGameFB().GetFBStep()
|
| | | |
| | | # 副本准备
|
| | | if fbStep == FB_Step_Prepare:
|
| | | __DoLogic_FB_Prepare(fbStep, tick)
|
| | | |
| | | # 副本进行中
|
| | | elif fbStep == FB_Step_Fighting:
|
| | | __DoLogic_FB_Fighting(tick)
|
| | | |
| | | # 副本结束
|
| | | elif fbStep == FB_Step_LeaveTime:
|
| | | __DoLogic_FB_Leave(tick)
|
| | | |
| | | return
|
| | |
|
| | |
|
| | | def __DoLogic_FB_Prepare(fbStep, tick):
|
| | | |
| | | remaindTick = GetBFStepTime()[Time_Prepare] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | if remaindTick > 0:
|
| | | return
|
| | | |
| | | FBCommon.SetFBStep(FB_Step_Fighting, tick)
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | fightTime = GetBFStepTime()[Time_Fight] * 1000
|
| | | playerManager = GameWorld.GetMapCopyPlayerManager()
|
| | | for index in xrange(playerManager.GetPlayerCount()):
|
| | | curPlayer = playerManager.GetPlayerByIndex(index)
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if not playerID:
|
| | | continue
|
| | | if playerID not in mgr.battlePlayerDict:
|
| | | #GameWorld.DebugLog("还未加入战斗,暂不处理! playerID=%s" % playerID)
|
| | | continue
|
| | | curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, fightTime, True)
|
| | | |
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batPlayer.onlineCalcTick = tick # 开始战斗重新统计在线收益
|
| | | |
| | | batFamily = mgr.getBattleFamily(batPlayer.familyID)
|
| | | batFamily.setPlayerToRebornPoint(curPlayer)
|
| | | |
| | | NotifyCrossFamilyFlagHelp(True)
|
| | | #PlayerControl.FBNotify("CrossBattlefieldStartFighting")
|
| | | return
|
| | |
|
| | | def __DoLogic_FB_Fighting(tick):
|
| | | |
| | | passTick = tick - GameWorld.GetGameFB().GetFBStepTick()
|
| | | remaindTick = GetBFStepTime()[Time_Fight] * 1000 - passTick
|
| | | if remaindTick > 0:
|
| | | __refreshFamilyHome(tick)
|
| | | __refreshFlagoutside(tick)
|
| | | |
| | | gameFB = GameWorld.GetGameFB()
|
| | | lastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NotifyFBHelpTick)
|
| | | if tick - lastTick >= FightRefreshInterval:
|
| | | gameFB.SetGameFBDict(ChConfig.Def_FB_NotifyFBHelpTick, tick)
|
| | | refreshCrossFamilyFlagwar(tick)
|
| | | NotifyCrossFamilyFlagHelp()
|
| | | return
|
| | | |
| | | DoOver(tick)
|
| | | return
|
| | |
|
| | | def __DoLogic_FB_Leave(tick):
|
| | | remaindTick = GetBFStepTime()[Time_Leave] * 1000 - (tick - GameWorld.GetGameFB().GetFBStepTick())
|
| | | if remaindTick > 0:
|
| | | return
|
| | | |
| | | FBCommon.DoLogic_FBKickAllPlayer()
|
| | | GameWorldProcess.CloseFB(tick)
|
| | | FBCommon.SetFBStep(FB_Step_Over, tick)
|
| | | return
|
| | |
|
| | | def __refreshFamilyHome(tick):
|
| | | # 刷新营地相关,如回血等
|
| | | |
| | | restoreHPPerBySecond = IpyGameDataPY.GetFuncCfg("CrossFamilyFlagwar", 3) # 每秒回血百分比
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | copyMapMgr = GameWorld.GetMapCopyPlayerManager()
|
| | | for familyID in mgr.battleFamilyDict.keys():
|
| | | batFamily = mgr.getBattleFamily(familyID)
|
| | | safePosX, safePosY, safeRadius = batFamily.rebornPoint
|
| | | |
| | | for playerID in batFamily.homePlayerIDList[::-1]:
|
| | | curPlayer = copyMapMgr.FindPlayerByID(playerID)
|
| | | if not curPlayer:
|
| | | continue
|
| | | |
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | |
| | | if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), safePosX, safePosY) > safeRadius:
|
| | | batFamily.homePlayerIDList.remove(playerID)
|
| | | batPlayer.restoreHPTick = 0
|
| | | continue
|
| | | |
| | | # 营地回血
|
| | | restoreSeconds = (tick - batPlayer.restoreHPTick) / 1000.0 if batPlayer.restoreHPTick else 1 # 首次保底1秒
|
| | | if restoreSeconds < 1:
|
| | | continue
|
| | | maxHP = GameObj.GetMaxHP(curPlayer)
|
| | | if GameObj.GetHP(curPlayer) < maxHP:
|
| | | restoreHP = int(maxHP * restoreHPPerBySecond / 100.0 * round(restoreSeconds, 1))
|
| | | SkillCommon.SkillAddHP(curPlayer, 0, restoreHP)
|
| | | batPlayer.restoreHPTick = tick
|
| | | |
| | | return
|
| | |
|
| | | def __refreshFlagoutside(tick):
|
| | | # 刷新战旗出界
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | |
| | | if not mgr.playerFlagDict:
|
| | | return
|
| | | |
| | | outsideR, protectSeconds = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarFlag", 4)
|
| | | |
| | | copyMapMgr = GameWorld.GetMapCopyPlayerManager()
|
| | | for playerID, flagNPC in mgr.playerFlagDict.items():
|
| | | curPlayer = copyMapMgr.FindPlayerByID(playerID)
|
| | | if not curPlayer:
|
| | | # 找不到玩家,直接归还战旗
|
| | | setFlagOwner(flagNPC, None, tick)
|
| | | continue
|
| | | |
| | | flagPosX, flagPosY = flagNPC.GetPosX(), flagNPC.GetPosY()
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), flagPosX, flagPosY) <= outsideR:
|
| | | batPlayer.outsideFlagTick = 0
|
| | | batPlayer.outsideFlagNotifySecond = 0
|
| | | else:
|
| | | if not batPlayer.outsideFlagTick:
|
| | | batPlayer.outsideFlagTick = tick
|
| | | continue
|
| | | passSeconds = (tick - batPlayer.outsideFlagTick) / 1000
|
| | | if passSeconds < protectSeconds:
|
| | | remainSecond = protectSeconds - passSeconds
|
| | | if remainSecond != batPlayer.outsideFlagNotifySecond:
|
| | | batPlayer.outsideFlagNotifySecond = remainSecond
|
| | | PlayerControl.NotifyCode(curPlayer, "CrossFamilyFlagwarOutsideflag", [flagNPC.GetNPCID(), remainSecond])
|
| | | continue
|
| | | setFlagOwner(flagNPC, None, tick)
|
| | | return
|
| | |
|
| | | def setFlagOwner(flagNPC, newOwner, tick):
|
| | | |
| | | if not flagNPC:
|
| | | return
|
| | | |
| | | ownerBuffDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarFlag", 5, {})
|
| | | |
| | | flagNPCID = flagNPC.GetNPCID()
|
| | | flagType = getFlagType(flagNPC)
|
| | | if not flagType:
|
| | | return
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | copyMapMgr = GameWorld.GetMapCopyPlayerManager()
|
| | | GameWorld.DebugLog("设置战旗归属: flagNPCID=%s,flagType=%s" % (flagNPCID, flagType), mgr.zoneID)
|
| | | |
| | | for oldPlayerID, npc in mgr.playerFlagDict.items():
|
| | | if not npc or flagNPCID != npc.GetNPCID():
|
| | | continue
|
| | | GameWorld.DebugLog(" 移除旧归属: flagNPCID=%s,oldPlayerID=%s" % (flagNPCID, oldPlayerID), mgr.zoneID)
|
| | | mgr.popPlayerFlag(oldPlayerID)
|
| | | oldOwner = copyMapMgr.FindPlayerByID(oldPlayerID)
|
| | | if oldOwner:
|
| | | PlayerControl.NotifyCode(oldOwner, "CrossFamilyFlagwarFlagDrop", [flagNPCID])
|
| | | # 删除归属buff
|
| | | for delBuffID in ownerBuffDict.values():
|
| | | BuffSkill.DelBuffBySkillID(oldOwner, delBuffID, tick)
|
| | | |
| | | if newOwner:
|
| | | newPlayerID = newOwner.GetPlayerID()
|
| | | |
| | | # 已经有战旗,判断战旗类型,高级可替换低级
|
| | | if newPlayerID in mgr.playerFlagDict:
|
| | | bodyFlagNPC = mgr.playerFlagDict[newPlayerID]
|
| | | bodyFlagType = getFlagType(bodyFlagNPC)
|
| | | bodyFlagNPCID = bodyFlagNPC.GetNPCID()
|
| | | if bodyFlagType >= flagType:
|
| | | GameWorld.DebugLog(" 新归属者已有高级战旗,保留原归属: bodyFlagNPCID=%s,bodyFlagType=%s >= flagType=%s" |
| | | % (bodyFlagNPCID, bodyFlagType, flagType), mgr.zoneID)
|
| | | setFlagOwnerNone(flagNPC)
|
| | | return
|
| | | GameWorld.DebugLog(" 新归属者已有低级战旗,先归还原低级战旗: bodyFlagNPCID=%s,bodyFlagType=%s < flagType=%s" |
| | | % (bodyFlagNPCID, bodyFlagType, flagType), mgr.zoneID)
|
| | | setFlagOwner(bodyFlagNPC, None, tick)
|
| | | |
| | | batPlayer = mgr.getBattlePlayer(newPlayerID)
|
| | | batFamily = mgr.getBattleFamily(batPlayer.familyID)
|
| | | |
| | | batPlayer.outsideFlagTick = 0
|
| | | mgr.setPlayerFlag(newPlayerID, flagNPC)
|
| | | |
| | | PlayerControl.NotifyCode(newOwner, "CrossFamilyFlagwarFlagOwn", [flagNPCID])
|
| | | |
| | | # 归属积分
|
| | | ownScoreDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarFlag", 2, {})
|
| | | ownPlayerScore, ownFamilyScore = ownScoreDict.get(flagType, [0, 0])
|
| | | batPlayer.addPlayerScore(ownPlayerScore)
|
| | | batFamily.addFamilyScore(ownFamilyScore)
|
| | | |
| | | # 归属buff
|
| | | ownerBuffID = ownerBuffDict.get(flagType, 0)
|
| | | if ownerBuffID:
|
| | | SkillCommon.AddBuffBySkillType_NoRefurbish(newOwner, ownerBuffID, tick)
|
| | | |
| | | flagNPC.SetVisible(False)
|
| | | |
| | | GameWorld.DebugLog(" 更新新归属: flagNPCID=%s,newPlayerID=%s,ownerBuffID=%s" % (flagNPCID, newPlayerID, ownerBuffID), mgr.zoneID)
|
| | | |
| | | # 没有新归属,归还战旗
|
| | | else:
|
| | | GameWorld.DebugLog(" 没有新归属,归还战旗: flagNPCID=%s" % flagNPCID, mgr.zoneID)
|
| | | setFlagOwnerNone(flagNPC)
|
| | | |
| | | return
|
| | |
|
| | | def setFlagOwnerNone(flagNPC):
|
| | | GameWorld.DebugLog(" setFlagOwnerNone: npcID=%s" % flagNPC.GetNPCID())
|
| | | flagNPC.SetVisible(True)
|
| | | return
|
| | |
|
| | | def refreshCrossFamilyFlagwar(tick):
|
| | | ## 刷新战场相关
|
| | | |
| | | olPlayerScore, olFamilyScore = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarScore", 2) # 玩家在战场时每秒固定获得 个人得分|仙盟得分
|
| | | flagTimeScoreDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarFlag", 3, {})
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | |
| | | copyMapMgr = GameWorld.GetMapCopyPlayerManager()
|
| | | for familyID in mgr.battleFamilyDict.keys():
|
| | | batFamily = mgr.getBattleFamily(familyID)
|
| | | |
| | | batFamily.battlePlayerSortList = []
|
| | | |
| | | safePosX, safePosY, safeRadius = batFamily.rebornPoint
|
| | | for playerID in batFamily.battlePlayerIDList:
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batFamily.battlePlayerSortList.append(batPlayer)
|
| | | |
| | | curPlayer = copyMapMgr.FindPlayerByID(playerID)
|
| | | if not curPlayer:
|
| | | continue
|
| | | onlineTimes = 0
|
| | | # 累计参与战斗时长
|
| | | if batPlayer.onlineCalcTick:
|
| | | onlineTimes = max(0, tick - batPlayer.onlineCalcTick) / 1000
|
| | | batPlayer.onlineCalcTick = tick
|
| | | |
| | | batPlayer.addPlayerScore(onlineTimes * olPlayerScore)
|
| | | batFamily.addFamilyScore(onlineTimes * olFamilyScore)
|
| | | |
| | | # 回营地
|
| | | if GameWorld.GetDist(curPlayer.GetPosX(), curPlayer.GetPosY(), safePosX, safePosY) <= safeRadius:
|
| | | if playerID not in batFamily.homePlayerIDList:
|
| | | batFamily.homePlayerIDList.append(playerID)
|
| | | |
| | | # 战旗定时积分
|
| | | if playerID in mgr.playerFlagDict:
|
| | | flagType = getFlagType(mgr.playerFlagDict[playerID])
|
| | | ftPlayerScore, ftFamilyScore = flagTimeScoreDict.get(flagType, [0, 0])
|
| | | |
| | | batPlayer.addPlayerScore(onlineTimes * ftPlayerScore)
|
| | | batFamily.addFamilyScore(onlineTimes * ftFamilyScore)
|
| | | |
| | | batFamily.sortBattlePlayerScore()
|
| | | |
| | | # 放最后排序,上面的逻辑可能还会加分
|
| | | mgr.sortBattleFamilyScore()
|
| | | return
|
| | |
|
| | | def getFlagType(curNPC):
|
| | | if not curNPC:
|
| | | return 0
|
| | | |
| | | npcID = curNPC.GetNPCID()
|
| | | flagTypeDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarFlag", 1, {})
|
| | | for ft, npcIDList in flagTypeDict.items():
|
| | | if npcID in npcIDList:
|
| | | return ft
|
| | | return 0
|
| | |
|
| | | ##是否可以夺旗
|
| | | def OnCanCollect(curPlayer, curNPC, tick):
|
| | | gameFB = GameWorld.GetGameFB()
|
| | | fbStep = gameFB.GetFBStep()
|
| | | |
| | | # 非战斗阶段不可采集
|
| | | if fbStep != FB_Step_Fighting:
|
| | | return False
|
| | | |
| | | playerID = curPlayer.GetPlayerID()
|
| | | mgr = GetBattleMgr()
|
| | | |
| | | if playerID in mgr.playerFlagDict:
|
| | | ownerFlagType = getFlagType(mgr.playerFlagDict[playerID])
|
| | | if ownerFlagType >= getFlagType(curNPC):
|
| | | GameWorld.Log("已经拥有更高级的战旗,无法采集! ownerFlagType=%s >= %s" % (ownerFlagType, getFlagType(curNPC)), playerID)
|
| | | return False
|
| | | |
| | | return True
|
| | |
|
| | | ## 开始采集
|
| | | def OnBeginCollect(curPlayer, curNPC):
|
| | | return
|
| | |
|
| | | ## 退出采集
|
| | | def OnExitCollect(curPlayer, curNPC):
|
| | | #if not curNPC or not hasattr(curNPC, "GetNPCID"):
|
| | | # return
|
| | | return
|
| | |
|
| | | ##玩家收集成功(塔, 旗)
|
| | | def OnCollectOK(curPlayer, npcID, tick):
|
| | | #GameWorld.DebugLog("OnCollectOK npcID=%s" % npcID, curPlayer.GetPlayerID())
|
| | | tagObj = curPlayer.GetActionObj()
|
| | | if not tagObj:
|
| | | return
|
| | | if tagObj.GetGameObjType() != IPY_GameWorld.gotNPC:
|
| | | return
|
| | | |
| | | curNPC = GameWorld.GetNPCManager().GetNPCByIndex(tagObj.GetIndex())
|
| | | #npcID = curNPC.GetNPCID()
|
| | | flagType = getFlagType(curNPC)
|
| | | AICommon.ClearPlayerPreparing(curNPC, curPlayer, "CrossFamilyFlagwarCollectOKSlow")
|
| | | |
| | | if flagType:
|
| | | setFlagOwner(curNPC, curPlayer, tick)
|
| | | |
| | | return
|
| | |
|
| | | ## PVP伤害相关
|
| | | def OnPVPDamage(curPlayer, damageValue, tagPlayer, tick):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batPlayer.hurtTotal += damageValue
|
| | | |
| | | #GameWorld.DebugLog("OnPVPDamage: damageValue=%s,hurtTotal=%s" % (damageValue, batPlayer.hurtTotal), playerID)
|
| | | return
|
| | |
|
| | | ##处理副本中杀死玩家逻辑
|
| | | def DoFBOnKill_Player(curPlayer, defender, tick):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | defPlayerID = defender.GetPlayerID()
|
| | | #GameWorld.DebugLog("DoFBOnKill_Player playerID=%s,defPlayerID=%s" % (playerID, defPlayerID))
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | |
| | | killPlayerScore, killFamilyScore = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarScore", 1) # 击杀玩家 个人得分|仙盟得分
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | batFamily = mgr.getBattleFamily(batPlayer.familyID)
|
| | | |
| | | batPlayer.addPlayerScore(killPlayerScore)
|
| | | batFamily.addFamilyScore(killFamilyScore)
|
| | | |
| | | # 获得对方战旗归属
|
| | | if defPlayerID in mgr.playerFlagDict:
|
| | | setFlagOwner(mgr.playerFlagDict[defPlayerID], curPlayer, tick)
|
| | | return True
|
| | |
|
| | | def OnCanFBReborn(curPlayer, rebornType):
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | if rebornType == ChConfig.rebornType_Health:
|
| | | mgr = GetBattleMgr()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | |
| | | healthRebornMax = IpyGameDataPY.GetFuncCfg("CrossFamilyFlagwarReborn", 1)
|
| | | if healthRebornMax and batPlayer.healthRebornCount >= healthRebornMax:
|
| | | GameWorld.Log("已达原地健康复活次数上限! playerID=%s" % playerID, mgr.zoneID)
|
| | | return False
|
| | | |
| | | return True
|
| | |
|
| | | def OnPlayerReborn():
|
| | | ## 是否副本复活
|
| | | return True
|
| | |
|
| | | ## 玩家复活后处理
|
| | | def OnPlayerRebornOver(curPlayer, rebornType):
|
| | | mgr = GetBattleMgr()
|
| | | playerID = curPlayer.GetPlayerID()
|
| | | batPlayer = mgr.getBattlePlayer(playerID)
|
| | | |
| | | if rebornType == ChConfig.rebornType_Health:
|
| | | batPlayer.addHealthRebornCount()
|
| | | else:
|
| | | # 非原地
|
| | | batFamily = mgr.getBattleFamily(curPlayer.GetFamilyID())
|
| | | batFamily.setPlayerToRebornPoint(curPlayer)
|
| | | |
| | | batPlayer.continueKillCount = 0 # 中断连杀数
|
| | | |
| | | FBCommon.Notify_FBHelp(curPlayer, batPlayer.getPlayerHelpInfo(False))
|
| | | return
|
| | |
|
| | | def DoOver(tick):
|
| | | |
| | | mgr = GetBattleMgr()
|
| | | zoneID = mgr.zoneID
|
| | | |
| | | gameFB = GameWorld.GetGameFB()
|
| | | gameWorld = GameWorld.GetGameWorld()
|
| | | copyMapID = gameWorld.GetCopyMapID()
|
| | | |
| | | fbStep = gameFB.GetFBStep()
|
| | | if fbStep > FB_Step_Fighting:
|
| | | GameWorld.ErrLog("跨服仙盟夺旗战触发重复结算,不处理! zoneID=%s,copyMapID=%s" % (mgr.zoneID, copyMapID), zoneID)
|
| | | return
|
| | | FBCommon.SetFBStep(FB_Step_LeaveTime, tick)
|
| | | |
| | | GameWorld.Log("跨服仙盟夺旗战结算! zoneID=%s,copyMapID=%s" % (mgr.zoneID, copyMapID), zoneID)
|
| | | |
| | | refreshCrossFamilyFlagwar(tick) # 结算前强刷一次
|
| | | NotifyCrossFamilyFlagHelp(True)
|
| | | |
| | | leaveTime = GetBFStepTime()[Time_Leave] * 1000
|
| | | |
| | | copyMapMgr = GameWorld.GetMapCopyPlayerManager()
|
| | | |
| | | drDict = {"mapID":GameWorld.GetMap().GetMapID(), "realMapID":gameWorld.GetRealMapID(), "copyMapID":copyMapID, "zoneID":zoneID}
|
| | | drBatFamilyList = []
|
| | | |
| | | battleFamilyList = []
|
| | | for familyRank, batFamily in enumerate(mgr.battleFamilySortList, 1):
|
| | | familyID = batFamily.familyID
|
| | | #batFamily = mgr.getBattleFamily(familyID)
|
| | | familyScore = batFamily.score
|
| | | familyName = batFamily.name
|
| | | GameWorld.Log("familyRank=%s,familyID=%s,familyScore=%s" % (familyRank, familyID, familyScore), zoneID)
|
| | | |
| | | overPlayerList = [] # 同步前端结算
|
| | | drPlayerList = [] # 流向记录
|
| | | battlePlayerList = [] # 同步GameServer结算
|
| | | |
| | | for playerRank, batPlayer in enumerate(batFamily.battlePlayerSortList, 1):
|
| | | playerID = batPlayer.playerID
|
| | | #batPlayer = mgr.getBattlePlayer(playerID)
|
| | | |
| | | score = batPlayer.score
|
| | | #job = batPlayer.job
|
| | | #realmLV = batPlayer.realmLV
|
| | | name = batPlayer.name
|
| | | |
| | | hurtTotal = batPlayer.hurtTotal
|
| | | |
| | | GameWorld.Log(" familyID=%s,playerRank=%s,playerID=%s,score=%s,hurtTotal=%s,accID=%s" |
| | | % (familyID, playerRank, playerID, score, hurtTotal, batPlayer.accID), zoneID)
|
| | | |
| | | overPlayerList.append([name, score])
|
| | | battlePlayerList.append([playerID, score, hurtTotal])
|
| | | drPlayerList.append({"playerID":playerID, "accID":batPlayer.accID, "playerRank":playerRank, "score":score, "hurtTotal":hurtTotal})
|
| | | |
| | | overDict = {"familyScore":familyScore, "familyRank":familyRank, "playerList":overPlayerList}
|
| | | for playerRank, batPlayer in enumerate(batFamily.battlePlayerSortList, 1):
|
| | | playerID = batPlayer.playerID
|
| | | player = copyMapMgr.FindPlayerByID(playerID)
|
| | | if not player:
|
| | | continue
|
| | | player.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTime, True)
|
| | | |
| | | lineID = 0
|
| | | overDict.update({"familyScore":familyScore, "familyRank":familyRank})
|
| | | FBCommon.NotifyFBOver(player, ChConfig.Def_FBMapID_CrossFamilyFlagwar, lineID, True, overDict)
|
| | | |
| | | battleFamilyList.append([familyRank, familyID, familyName, familyScore, battlePlayerList])
|
| | | drBatFamilyList.append({"familyID":familyID, "familyScore":familyScore, "familyRank":familyRank, "drPlayerList":drPlayerList})
|
| | | |
| | | # 同步GameServer 比赛结果
|
| | | msgInfo = str([zoneID, battleFamilyList])
|
| | | GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, "CrossFamilyFlagwarOver", msgInfo, len(msgInfo))
|
| | | |
| | | # 记录流向
|
| | | drDict["batFamilyList"] = drBatFamilyList
|
| | | DataRecordPack.SendEventPack("CrossFamilyFlagwarOver", drDict)
|
| | | return
|
| | |
|
| | |
|
| | |
|