using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using vnxbqy.UI; public class JiaDemonJarDungeonStage : 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; ulong myHurtSum = 0; int myRank = -1; bool isReconnected = false; DemonJarConfig demonJarConfig; float lastHurtTimeRecorder = 0f; List jiaPlayerDatas = new List(); DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel(); } } GA_NpcClientFightBoss boss; List playerInfos = new List(); List jiaPlayers = new List(); public override void Initialize() { base.Initialize(); dungeonModel.onDungeonResultEvent += OnDungeonResultEvent; BossShowModel.Instance.bossShowCompletedEvent += OnBossShowComplete; DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforeInitailesPlayerInfo; DTC0403_tagPlayerLoginLoadOK.mapInitOkEvent += OnMapInitOk; AttackHandler.OnAttackTarget += OnPlayerAttack; if (PlayerDatas.Instance.hero != null) { PlayerDatas.Instance.hero.Pos = new Vector3(13f, 0f, 10f); CameraController.Instance.Apply(); } } public override void UnInitialize() { if (boss != null) { boss.ActorInfo.serverDie = true; GAMgr.Instance.ServerDie(boss.ServerInstID); GAMgr.Instance.Release(boss); boss = null; } dungeonModel.onDungeonResultEvent -= OnDungeonResultEvent; 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) { AddJiaPlayerHurt(); } 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 = DemonJarConfig.GetKeys(); foreach (var key in keys) { this.demonJarConfig = DemonJarConfig.Get(key); if (demonJarConfig.LineID == ClientDungeonStageUtility.dungeonInfo.lineId) { bossNpcId = demonJarConfig.NPCID; totalTime = demonJarConfig.Time; surplusTime = demonJarConfig.Time; break; } } fighting = true; CreateBoss(); UpdateDungeonHelpInfo(); StartCoroutine(Co_CreateJiaPlayers(Random.Range(4, 6))); } private void ProcessBossDead() { fighting = false; var send = new CB101_tagCMClientEndFB(); send.MapID = DemonJarModel.DATA_MAPID; send.LineID = (ushort)this.demonJarConfig.LineID; send.Data1 = myRank == -1 ? (uint)(jiaPlayerDatas.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 AddJiaPlayer(int _id, string _name) { jiaPlayerDatas.Add(new JiaPlayer(_id, _name)); } public void AddHeroHurt(ulong _hurt) { lastHurtTimeRecorder = Time.time; myHurtSum += _hurt; for (int i = 0; i < jiaPlayerDatas.Count; i++) { var jiaPlayer = jiaPlayerDatas[i]; jiaPlayer.hurt += (ulong)(Random.Range(0.7f, 0.95f) * _hurt); } UpdateDungeonHelpInfo(); } private void AddJiaPlayerHurt() { lastHurtTimeRecorder = Time.time; for (int i = 0; i < jiaPlayerDatas.Count; i++) { var jiaPlayer = jiaPlayerDatas[i]; jiaPlayer.hurt += (ulong)(jiaPlayer.hurt / (totalTime - surplusTime)); } UpdateDungeonHelpInfo(); } private void UpdateDungeonHelpInfo() { var mission = new DungeonMissionData(); var tempHurts = new List(); for (int i = 0; i < jiaPlayerDatas.Count; i++) { var jiaPlayer = jiaPlayerDatas[i]; tempHurts.Add( new DungeonHurt() { playerName = jiaPlayer.name, hurt = (int)(jiaPlayer.hurt % Constants.ExpPointValue), hurtEx = (int)(jiaPlayer.hurt / Constants.ExpPointValue), } ); } tempHurts.Add( new DungeonHurt() { playerName = PlayerDatas.Instance.baseData.PlayerName, hurt = (int)(myHurtSum % Constants.ExpPointValue), hurtEx = (int)(myHurtSum / Constants.ExpPointValue), } ); 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 = ClientDungeonStageUtility.dungeonInfo.lineId; mission.hurtInfo = hurts; mission.remainHPPer = (int)(surplusTime / totalTime * 1000000f); mission.hpReduceSpeed = (int)(10000 / totalTime); dungeonModel.UpdateJiaDungeonMission(DemonJarModel.DATA_MAPID, mission); } private void CreateBoss() { boss = GAMgr.Instance.ReqClntFightNpc((uint)bossNpcId, E_ActorGroup.Enemy); boss.Pos = boss.BornPos = SCENE_CENTER; boss.LockTargetSID = PlayerDatas.Instance.baseData.PlayerID; } IEnumerator Co_CreateJiaPlayers(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 exitJiaPlayer = false; for (int i = 0; i < jiaPlayerDatas.Count; i++) { var jiaPlayer = jiaPlayerDatas[i]; if (jiaPlayer.name == playerName) { exitJiaPlayer = true; break; } } if (!exitJiaPlayer) { 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; equipInfos[i] = equipInfo; } var playerInfo = new GA_PlayerClient.PlayerInfo() { hp = (ulong)(PlayerDatas.Instance.baseData.HP * Random.Range(0.5f, 0.9f)), maxHp = (ulong)(PlayerDatas.Instance.baseData.HP * Random.Range(0.9f, 1f)), level = PlayerDatas.Instance.baseData.LV, job = playerJob, face = AvatarHelper.GetAvatarDefaultID(playerJob), facePic = AvatarHelper.GetAvatarFrameDefaultID(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); AddJiaPlayer(_count, playerName); _count--; yield return new WaitForSeconds(Random.Range(2, 5)); } } yield return null; } private void OnPlayerAttack(uint _attackerId, uint _victimId, byte _type, ulong _damage) { if (boss == null) { return; } if (_victimId == boss.ServerInstID) { TargetBriefInfo.OnRefreshBossLifeBar(_victimId, boss.NpcConfig.NPCID, (ulong)Random.Range(0, 1000), 1000); } } IEnumerator Co_FightBegin() { yield return WaitingForSecondConst.WaitMS500; if (!BossShowModel.Instance.BossShowing) { OnBossShowComplete(); } } private void OnDungeonResultEvent() { dungeonModel.UpdateCoolDown(DungeonCoolDownType.LeaveMap, 10 * 1000); } private int HurtCompare(DungeonHurt a, DungeonHurt b) { return a.hurt > b.hurt ? -1 : 1; } class JiaPlayer { public int id; public string name; public ulong hurt; public JiaPlayer(int _id, string _name) { id = _id; name = _name; } public static int HurtCompare(JiaPlayer _lhs, JiaPlayer _rhs) { return _lhs.hurt > _rhs.hurt ? -1 : 1; } } }