using UnityEngine; using System.Collections; using Snxxz.UI; public class GA_NpcFightNorm : GActorNpcFight { protected HeadUpName m_HeadUpName; protected LifeBar m_LifeBar; // 用于触发点击的组件 private NPCInteractProcessor m_NPCInteractProcessor; protected override void OnInit(GameNetPackBasic package) { base.OnInit(package); // 可选择对象创建碰撞区 if (CanBeSelected()) { m_NPCInteractProcessor = Root.AddMissingComponent(); m_NPCInteractProcessor.npcIntergactEvent += OnClick; } H0406_tagNPCAppear _h0406 = package as H0406_tagNPCAppear; if (_h0406 == null) { Debug.LogErrorFormat("Npc 执行初始化时, 传入的包错误...{0}", package.GetType()); } ActorInfo.LV = _h0406.CurLV; ActorInfo.PlayerName = NpcConfig.charName; ActorInfo.faction = NpcConfig.Country; ActorInfo.Hp = _h0406.NPCHP; ActorInfo.HpEx = (ushort)_h0406.NPCHPEx; ActorInfo.MaxHp = _h0406.MaxHP; ActorInfo.MaxHpEx = (ushort)_h0406.MaxHPEx; ActorInfo.realm = (uint)NpcConfig.Realm; // 初始化移动速度 ActorInfo.moveSpeed = 500f / _h0406.Speed; ActorInfo.serverBornPos = new Vector2(_h0406.PosX, _h0406.PosY); if (NpcConfig.NPCID == 32502001 || NpcConfig.Dig == 1)// 针对守护笼子的临时骚操作 { float _x = _h0406.PosX * .5f; float _z = _h0406.PosY * .5f; Pos = new Vector3(_x, PlayerDatas.Instance.hero.Pos.y, _z); } else { // 初始化坐标 AdjustPos(_h0406.PosX, _h0406.PosY); } // 战斗类型的怪物随机朝向 Rotation = Quaternion.Euler(0, UnityEngine.Random.Range(0, 360), 0); } protected override void OnAfterInit() { if (NpcConfig.IsBoss < 2 && SystemSetting.Instance.GetSystemSettingSwitch(SystemSwitch.HideMonster)) { ShowOrHideModel(false); } } public override void OnClick() { if (ActorInfo.serverDie || BossShowModel.Instance.BossShowing || StatusMgr.Instance.IsInvisible(ServerInstID)) { return; } GA_Hero _hero = PlayerDatas.Instance.hero; // 当前锁定的目标已经是此对象 if (_hero.LockTarget == this) { // 开启攻击至死AI _hero.Behaviour.StartKillUntilDieAI(); } else { // 设置锁定目标为此对象 _hero.LockTarget = this; _hero.SelectTarget = this; } } protected override void OnUnit() { if (m_NPCInteractProcessor) { m_NPCInteractProcessor.npcIntergactEvent -= OnClick; m_NPCInteractProcessor = null; } base.OnUnit(); } protected override void OnFixedUpdate() { base.OnFixedUpdate(); if (!ActorInfo.serverDie) { UpdateTimeDialogueBubble(); } } protected override void OnLateUpdate() { } protected override void OnUpdate() { base.OnUpdate(); } public override void RequestLifeBar() { ReleaseLifeBar(); m_LifeBar = LifeBar.RequireLifeBar(MP_Name, 0, CameraController.Instance.CameraObject); m_LifeBar.neverHide = true; m_LifeBar.Set(ActorInfo.RealHp, ActorInfo.RealMaxHp); } public override void RefreshLifeBar(uint value) { if (m_LifeBar) { m_LifeBar.Show(ActorInfo.RealHp, ActorInfo.RealMaxHp); } } public override void ReleaseLifeBar() { if (m_LifeBar != null) { m_LifeBar.target = null; m_LifeBar.neverHide = false; LifeBar.Recycle(m_LifeBar); m_LifeBar = null; } } public override void ReleaseName() { if (m_HeadUpName != null) { m_HeadUpName.target = null; HeadUpName.Recycle(m_HeadUpName); m_HeadUpName = null; } } public override void RequestName() { ReleaseName(); HeadUpName.Pattern _pattern = HeadUpName.Pattern.Monster; m_HeadUpName = HeadUpName.RequireHeadUpName(_pattern, MP_Name, 0, CameraController.Instance.CameraObject); m_HeadUpName.SetMonsterInfo(NpcConfig.NPCID, ActorInfo.LV); } public override void RequestDialogueBubble() { if (m_DialogAppear) { NPCDialogueBubble.Recyle(m_DialogAppear); } } protected override void UpdateTimeDialogueBubble() { // 瞎BB逻辑 if (Time.realtimeSinceStartup - m_LastTalkTime > 5) { if (m_DialogTiming != null) { NPCDialogueBubble.Recyle(m_DialogTiming); } m_DialogTiming = NPCDialogueBubble.TimingShow(NpcConfig.NPCID, MP_Name, CameraController.Instance.CameraObject); m_LastTalkTime = Time.realtimeSinceStartup; } } public override bool CanBeSelected() { return NpcConfig.NPCType != (int)E_NpcType.BreakableObj && NpcConfig.Country != 1 && !StatusMgr.Instance.IsInvisible(ServerInstID) && NpcConfig.NPCType != (int)E_NpcType.Ghost; } public override void OnSelect() { SelectionManager.Request(SelectionManager.E_Type.Red, this, NpcConfig.ModelRadius * 2); RequestName(); RequestLifeBar(); } public override void OnUnSelect() { SelectionManager.Release(SelectionManager.E_Type.Red); if (!ActorInfo.serverDie) { ReleaseName(); ReleaseLifeBar(); } } public override bool CanPushedBack() { return NpcConfig.weight != 0 && (IsHurt() || IsIdle()); } public override bool CanHurted() { return NpcConfig.hurtFeedback == 1 && (IsIdle() || IsRun() || IsHurt()) && !SkillMgr.DoingPrepareSkill && (SkillMgr.CurCastSkill == null || SkillMgr.CurCastSkill.SkillCompelete); } public override bool CanDieFly() { return NpcConfig.NPCType != (int)E_NpcType.BreakableObj; } public override bool CanAtked() { // 判断是否相同阵营 bool _sameFaction = NpcConfig.Country != 0 && NpcConfig.Country == PlayerDatas.Instance.baseData.faction; return !_sameFaction && NpcConfig.NPCType != (int)E_NpcType.Func && NpcConfig.NPCType != (int)E_NpcType.Collect && NpcConfig.NPCType != (int)E_NpcType.Pet && !ActorInfo.serverDie; } public override bool CanAtkedRotate() { return NpcConfig.NPCType != (int)E_NpcType.BreakableObj && NpcConfig.AIType != 201 && NpcConfig.AIType != 49 && NpcConfig.AIType != 50 && !IsRun() && !SkillMgr.DoingPrepareSkill && (SkillMgr.CurCastSkill == null || SkillMgr.CurCastSkill.SkillCompelete) && (Time.time - m_LastCantAtkedTime > NpcConfig.AtkInterval * Constants.F_GAMMA + 1f); } }