using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using Snxxz.UI; public class FakeDemonJarDungeonStage : DungeonStage { static Vector3 SCENE_CENTER = new Vector3(8.35f, 6.37f, 9.7f); bool fighting = false; float surplusTime = 0f; float totalTime = 0f; int bossNpcId = 0; int myHurtSum = 0; int myRank = -1; bool isReconnected = false; DemonJarConfig demonJarConfig; float lastHurtTimeRecorder = 0f; List fakePlayerDatas = new List(); DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } GA_NpcClientFightBoss boss; List playerInfos = new List(); List fakePlayers = new List(); public override void Initialize() { base.Initialize(); BossShowModel.Instance.bossShowCompletedEvent += OnBossShowComplete; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforeInitailesPlayerInfo; DTC0403_tagPlayerLoginLoadOK.mapInitOkEvent += OnMapInitOk; AttackHandler.OnAttackTarget += OnPlayerAttack; } public override void UnInitialize() { if (boss != null) { boss.ActorInfo.serverDie = true; GAMgr.Instance.ServerDie(boss.ServerInstID); GAMgr.Instance.Release(boss); boss = null; } BossShowModel.Instance.bossShowCompletedEvent -= OnBossShowComplete; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforeInitailesPlayerInfo; DTC0403_tagPlayerLoginLoadOK.mapInitOkEvent -= OnMapInitOk; AttackHandler.OnAttackTarget -= OnPlayerAttack; StopAllCoroutines(); base.UnInitialize(); } protected override void OnStageLoadFinish() { base.OnStageLoadFinish(); StartCoroutine(Co_FightBegin()); } protected override void OnUpdate() { base.OnUpdate(); if (surplusTime > 0f && fighting) { if (GameNetSystem.Instance.netState == GameNetSystem.NetState.Connected) { surplusTime -= Time.deltaTime; if (Time.time - lastHurtTimeRecorder > 2f) { AddFakePlayerHurt(); } if (boss == null || boss.ActorInfo.serverDie) { CreateBoss(); } if (surplusTime <= 0f) { ProcessBossDead(); } } } } private void OnBossShowComplete() { InitializingFight(); } private void OnBeforeInitailesPlayerInfo() { boss = null; isReconnected = true; } private void OnMapInitOk() { if (isReconnected) { if (surplusTime <= 0f) { if (fighting) { ProcessBossDead(); } else { dungeonModel.ExitCurrentDungeon(); } } else { CreateBoss(); UpdateDungeonHelpInfo(); for (int i = 0; i < playerInfos.Count; i++) { GAMgr.Instance.ReqClntPlayer(playerInfos[i], E_ActorGroup.User); } } } } private void InitializingFight() { var keys = Config.Instance.GetAllKeys(); foreach (var key in keys) { this.demonJarConfig = DemonJarConfig.Get(key); if (demonJarConfig.LineID == PlayerDatas.Instance.baseData.dungeonLineId) { bossNpcId = demonJarConfig.NPCID; totalTime = demonJarConfig.Time; surplusTime = demonJarConfig.Time; break; } } fighting = true; CreateBoss(); UpdateDungeonHelpInfo(); StartCoroutine(Co_CreateFakePlayers(Random.Range(4, 6))); } private void ProcessBossDead() { fighting = false; var send = new CB101_tagCMClientEndFB(); send.MapID = DemonJarModel.DEMONJAR_MAPID; send.LineID = (ushort)PlayerDatas.Instance.baseData.dungeonLineId; send.Data1 = myRank == -1 ? (uint)(fakePlayerDatas.Count + 1) : (uint)myRank; send.Data2 = (uint)myHurtSum; GameNetSystem.Instance.SendInfo(send); if (boss != null) { boss.ActorInfo.serverDie = true; GAMgr.Instance.ServerDie(boss.ServerInstID); boss.Die(); boss = null; } } /// /// 添加虚假玩家 /// /// /// private void AddFakePlayer(int _id, string _name) { fakePlayerDatas.Add(new FakePlayer(_id, _name)); } public void AddHeroHurt(int _hurt) { lastHurtTimeRecorder = Time.time; myHurtSum += _hurt; for (int i = 0; i < fakePlayerDatas.Count; i++) { var fakePlayer = fakePlayerDatas[i]; fakePlayer.hurt += (int)(Random.Range(0.7f, 0.95f) * _hurt); } UpdateDungeonHelpInfo(); } private void AddFakePlayerHurt() { lastHurtTimeRecorder = Time.time; for (int i = 0; i < fakePlayerDatas.Count; i++) { var fakePlayer = fakePlayerDatas[i]; fakePlayer.hurt += (int)(fakePlayer.hurt / (totalTime - surplusTime)); } UpdateDungeonHelpInfo(); } private void UpdateDungeonHelpInfo() { var mission = new DungeonMissionData(); var tempHurts = new List(); for (int i = 0; i < fakePlayerDatas.Count; i++) { var fakePlayer = fakePlayerDatas[i]; tempHurts.Add( new DungeonHurt() { playerName = fakePlayer.name, hurt = fakePlayer.hurt, } ); } tempHurts.Add( new DungeonHurt() { playerName = PlayerDatas.Instance.baseData.PlayerName, hurt = myHurtSum, } ); tempHurts.Sort(HurtCompare); var hurts = new DungeonHurt[Mathf.Min(5, tempHurts.Count)]; for (int i = 0; i < hurts.Length; i++) { var dungeonHurt = tempHurts[i]; dungeonHurt.rank = i + 1; hurts[i] = dungeonHurt; if (dungeonHurt.playerName == PlayerDatas.Instance.baseData.PlayerName) { myRank = dungeonHurt.rank; } } mission.lineID = PlayerDatas.Instance.baseData.dungeonLineId; mission.hurtInfo = hurts; mission.remainHPPer = (int)(surplusTime / totalTime * 1000000f); mission.hpReduceSpeed = (int)(10000 / totalTime); dungeonModel.UpdateFakeDungeonMission(DemonJarModel.DEMONJAR_MAPID, mission); } private void CreateBoss() { boss = GAMgr.Instance.ReqClntFightNpc((uint)bossNpcId, E_ActorGroup.Enemy); boss.Pos = SCENE_CENTER; boss.LockTargetSID = PlayerDatas.Instance.baseData.PlayerID; } IEnumerator Co_CreateFakePlayers(int _count) { yield return WaitingForSecondConst.WaitMS2000; while (_count > 0) { var index = (byte)(Random.Range(0, GeneralDefine.openJobs.Length)); var playerJob = (byte)GeneralDefine.openJobs[index]; var playerName = StringUtility.Contact(RandomNameConfig.GetFirstName(playerJob), RandomNameConfig.GetSecondName(playerJob)); int[] equips = null; switch (playerJob) { case 1: equips = demonJarConfig.Job1; break; case 2: equips = demonJarConfig.Job2; break; case 3: equips = demonJarConfig.Job3; break; } var exitFakePlayer = false; for (int i = 0; i < fakePlayerDatas.Count; i++) { var fakePlayer = fakePlayerDatas[i]; if (fakePlayer.name == playerName) { exitFakePlayer = true; break; } } if (!exitFakePlayer) { var random = Random.Range(0, 2); var equipInfos = new GA_PlayerClient.CEquipInfo[equips.Length > 3 && random == 0 ? 3 : equips.Length]; for (int i = 0; i < equipInfos.Length; i++) { var equipInfo = new GA_PlayerClient.CEquipInfo(); var itemConfig = ItemConfig.Get(equips[i]); equipInfo.id = itemConfig.ID; equipInfo.place = itemConfig.EquipPlace; equipInfo.suitLevel = 0; equipInfo.isSuit = 0; equipInfos[i] = equipInfo; } var playerInfo = new GA_PlayerClient.PlayerInfo() { hp = (uint)(PlayerDatas.Instance.baseData.HP * Random.Range(0.5f, 0.9f)), maxHp = (uint)(PlayerDatas.Instance.baseData.HP * Random.Range(0.9f, 1f)), level = PlayerDatas.Instance.baseData.LV, job = playerJob, pos = SCENE_CENTER + new Vector3(Random.Range(-2f, 2f), 0, Random.Range(-2f, 2f)), name = playerName, itemDatas = equipInfos, }; playerInfos.Add(playerInfo); GAMgr.Instance.ReqClntPlayer(playerInfo, E_ActorGroup.User); AddFakePlayer(_count, playerName); _count--; yield return new WaitForSeconds(Random.Range(2, 5)); } } yield return null; } private void OnPlayerAttack(uint _attackerId, uint _victimId, byte _type, uint _damage) { if (boss == null) { return; } if (_victimId == boss.ServerInstID) { TargetBriefInfo.OnRefreshBossLifeBar(_victimId, 0, 0, 0); } } IEnumerator Co_FightBegin() { yield return WaitingForSecondConst.WaitMS500; if (!BossShowModel.Instance.BossShowing) { OnBossShowComplete(); } } private int HurtCompare(DungeonHurt a, DungeonHurt b) { return a.hurt > b.hurt ? -1 : 1; } class FakePlayer { public int id; public string name; public int hurt; public FakePlayer(int _id, string _name) { id = _id; name = _name; } public static int HurtCompare(FakePlayer _lhs, FakePlayer _rhs) { return _lhs.hurt > _rhs.hurt ? -1 : 1; } } }