using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace vnxbqy.UI { public class HazyDemonKingModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk { Dictionary m_PlayerInfos = new Dictionary(); Dictionary> m_MapPlayerCounts = new Dictionary>(); List m_AttackHeroPlayers = new List(); public bool IsInDungeon { get; private set; } public int invincibleBuffId { get; private set; } public const int CLIENTDATAMAP = 2000; public const int DATAMAP = 22030; public const int CROSSSERVERDATAMAP = 32030; public event Action onPlayerInfoRefresh; public event Action onPlayerCountRefresh; HazyRegionModel hazyRegionModel { get { return ModelCenter.Instance.GetModel(); } } public override void Init() { var funcConfig = FuncConfigConfig.Get("HazyDemonKingInvincibleBuff"); if (funcConfig != null) { invincibleBuffId = int.Parse(funcConfig.Numerical1); } StageLoad.Instance.onStageLoadFinish += OnStageLoadFinish; GlobalTimeEvent.Instance.secondEvent += PerSecond; } public void OnBeforePlayerDataInitialize() { m_PlayerInfos.Clear(); m_MapPlayerCounts.Clear(); } public void OnPlayerLoginOk() { } public override void UnInit() { StageLoad.Instance.onStageLoadFinish -= OnStageLoadFinish; GlobalTimeEvent.Instance.secondEvent -= PerSecond; } private void OnStageLoadFinish() { var mapId = PlayerDatas.Instance.baseData.MapID; GA_Hero.OnStartBeAttacked -= OnStartBeAttacked; GA_Hero.OnStopBeAttacked -= OnStopBeAttacked; m_AttackHeroPlayers.Clear(); IsInDungeon = false; if (IsInDemonKingDungeon(mapId)) { IsInDungeon = true; RefreshAroundPlayer(); GA_Hero.OnStartBeAttacked += OnStartBeAttacked; GA_Hero.OnStopBeAttacked += OnStopBeAttacked; } } private void OnStopBeAttacked(uint sid) { if (m_AttackHeroPlayers.Contains(sid)) { m_AttackHeroPlayers.Remove(sid); } } private void OnStartBeAttacked(uint sid) { if (!m_AttackHeroPlayers.Contains(sid)) { m_AttackHeroPlayers.Add(sid); } } private void PerSecond() { if (!(StageLoad.Instance.currentStage is DungeonStage)) { return; } if (IsInDungeon) { var requireRefreshPlayer = false; var actors = GAMgr.Instance.GetGroupList(E_ActorGroup.Player); var playerCount = 0; foreach (var sid in m_PlayerInfos.Keys) { if (sid != PlayerDatas.Instance.PlayerId) { playerCount++; } } if ((actors != null && actors.Count != playerCount) || (actors == null && playerCount != 0)) { requireRefreshPlayer = true; } else if (actors != null) { foreach (var actor in actors) { if (actor == null) { continue; } var player = actor as GA_Player; if (player == null) { continue; } if (!m_PlayerInfos.ContainsKey(player.ServerInstID)) { requireRefreshPlayer = true; } } } if (requireRefreshPlayer) { RefreshAroundPlayer(); } } } public void RefreshAroundPlayer() { m_PlayerInfos.Clear(); var actors = GAMgr.Instance.GetGroupList(E_ActorGroup.Player); if (actors != null) { foreach (var actor in actors) { if (actor == null) { continue; } var player = actor as GA_Player; if (player == null) { continue; } if (!m_PlayerInfos.ContainsKey(player.ServerInstID)) { m_PlayerInfos.Add(player.ServerInstID, new HazyDemonKingPlayerInfo() { job = player.ActorInfo.Job, face = player.ActorInfo.face, facePic = player.ActorInfo.facePic, hp = player.ActorInfo.RealHp, maxHp = player.ActorInfo.RealMaxHp, playerName = UIHelper.ServerStringTrim(player.ActorInfo.PlayerName), }); } } } var playerId = PlayerDatas.Instance.PlayerId; if (!m_PlayerInfos.ContainsKey(playerId)) { var hero = PlayerDatas.Instance.hero; m_PlayerInfos.Add(playerId, new HazyDemonKingPlayerInfo() { job = PlayerDatas.Instance.baseData.Job, face = AvatarHelper.GetMyAvatarID(), facePic = AvatarHelper.GetMyAvatarFrameID(), hp = hero.ActorInfo.RealHp, maxHp = hero.ActorInfo.RealMaxHp, playerName = PlayerDatas.Instance.baseData.PlayerName, }); } if (onPlayerInfoRefresh != null) { onPlayerInfoRefresh(); } } public bool IsInDemonKingDungeon(int mapId) { if (!(StageLoad.Instance.currentStage is DungeonStage)) { return false; } if (mapId == CLIENTDATAMAP) { return true; } var configs = HazyRegionConfig.GetValues(); foreach (var config in configs) { if (config.incidentType == (int)HazyRegionIncidentType.DemonKing && config.dungeonId == mapId) { return true; } } return false; } public bool TryGetPlayerInfo(uint playerId, out HazyDemonKingPlayerInfo playerInfo) { return m_PlayerInfos.TryGetValue(playerId, out playerInfo); } public ICollection GetPlayerIds() { return m_PlayerInfos.Keys; } public int GetDungeonPlayerCount(int mapId, int lineId) { if (m_MapPlayerCounts.ContainsKey(mapId)) { return m_MapPlayerCounts[mapId].ContainsKey(lineId) ? m_MapPlayerCounts[mapId][lineId] : 0; } return 0; } public void SendSelectAtkTarget(uint serverInstId) { var actor = GAMgr.Instance.GetBySID(serverInstId); if (actor != null) { var hero = PlayerDatas.Instance.hero; if (hero != null) { hero.LockTarget = actor; hero.SelectTarget = actor; } } } public uint GetPlayerAtkTarget(uint sid) { if (ClientDungeonStageUtility.clientMapId == CLIENTDATAMAP) { return ClientHazyDemonKingStage.GetClientBossSid(); } if (sid == PlayerDatas.Instance.PlayerId) { var hero = PlayerDatas.Instance.hero; if (hero != null && hero.SelectTarget != null) { return hero.SelectTarget.ServerInstID; } } else { if (m_AttackHeroPlayers.Contains(sid)) { return PlayerDatas.Instance.PlayerId; } } return 0; } public bool IsExistBelongTo(uint playerId) { if (playerId == PlayerDatas.Instance.PlayerId && ClientDungeonStageUtility.clientMapId == CLIENTDATAMAP) { return true; } return StatusMgr.Instance.IsExistBossBelong(playerId); } public void RequestExitDungeon() { if (PlayerDatas.Instance.baseData.MapID == DATAMAP) { ModelCenter.Instance.GetModel().ExitCurrentDungeon(); } else { var pak = new CC104_tagCMExitCrossRealm(); GameNetSystem.Instance.SendToCrossServer(pak); } } public void ReceivePackage(HA007_tagGCFBLinePlayerCnt package) { var mapId = (int)package.MapID; if (IsInDemonKingDungeon(mapId)) { Dictionary dict = null; if (!m_MapPlayerCounts.TryGetValue(mapId, out dict)) { dict = new Dictionary(); m_MapPlayerCounts.Add(mapId, dict); } for (int i = 0; i < package.Count; i++) { var data = package.FBLineInfoList[i]; dict[data.FBLineID] = data.PlayerCnt; } if (onPlayerCountRefresh != null) { onPlayerCountRefresh(); } } } public void RequestEnterClientDungeon() { var config = HazyRegionConfig.Get(hazyRegionModel.processingIncidentId); ClientDungeonStageUtility.GotoNormalClientDungeon(CLIENTDATAMAP, config.dungeonId, config.lineId); } } public struct HazyDemonKingPlayerInfo { public string playerName; public int job; public int face; public int facePic; public ulong hp; public ulong maxHp; } }