using System; using CoreGame; using Proto; using UnityEngine; namespace CoreGame.Render { [Combat] public class StateBarProxy : ProxyBase { internal StateBarRender render; private bool m_ShowStateBar; internal float stateBarShowTime; // HP Bar internal HpBarItem hpBar; private CallbackWrapper m_ShowHpBarCallback; // Ammo Bar internal AmmoBarItem ammoBar; private CallbackWrapper m_ShowAmmoBarCallback; protected override void Initialize(GameObject go, CombatEntity ent) { var bpTrans = ent.bindPointProxy.GetBindPoint(BindPointType.StateBar); render = bpTrans.GetComponentInChildren(); m_ShowStateBar = true; if (render.hideDefault) ShowStateBar(false); hpBar = SptPool.Malloc(); hpBar.Init(render); hpBar.SetHpBar(1f, 0); m_ShowHpBarCallback = CallbackWrapper.New(OnShowHurt); ent.AddEventCallBack(ClientEvent.ShowHurt, m_ShowHpBarCallback); if (render.hasAmmo) { ammoBar = SptPool.Malloc(); ammoBar.Init(render); ammoBar.SetAmmoBar(1f); m_ShowAmmoBarCallback = CallbackWrapper.New(OnShowAmmo); ent.AddEventCallBack(ClientEvent.ShowAmmo, m_ShowAmmoBarCallback); } render.SetLayoutByFixedAffix(ent.blackboard.affixIds); render.SetPickUpProgress(0f); } public void UpdatePickUpProgress() { if (render.pickUpProgress && ent.hasWaitPickUpDropItem) { var waitPickUpDropItem = ent.waitPickUpDropItem; var dropItem = Contexts.Combat.GetEntity(waitPickUpDropItem.dropItemEid); if (dropItem.IsValid() && dropItem.hasWaitToBeAttracted) { var waitToBeAttracted = dropItem.waitToBeAttracted; var progress = waitPickUpDropItem.timeAcc / waitToBeAttracted.pickUpTime; render.SetPickUpProgress(progress); return; } } render.SetPickUpProgress(0f); } public void ShowStateBar(bool active) { if (m_ShowStateBar == active) return; m_ShowStateBar = active; render.transform.localPosition = active ? Vector3.zero : new Vector3(0f, 10000f, 0f); } protected override void OnReset() { ent.RemoveCallback(ClientEvent.ShowHurt, ref m_ShowHpBarCallback); SptPool.Free(ref hpBar); if (render.hasAmmo) { ent.RemoveCallback(ClientEvent.ShowAmmo, ref m_ShowAmmoBarCallback); SptPool.Free(ref ammoBar); } stateBarShowTime = 0f; m_ShowStateBar = false; render = null; } public void RefreshHpBar(PropertyContainer property) { var currHp = property.GetProperty_Long(PropertyDef.CurHp); var maxHp = property.TotalHp; var hpShield = property.GetProperty_Long(PropertyDef.Calc_HpShield); double hpShieldRate; double hpRate; if (hpShield + currHp > maxHp) { hpRate = (currHp * 1.0) / (hpShield + currHp); hpShieldRate = 1; } else { hpRate = (currHp * 1.0) / maxHp; hpShieldRate = (hpShield + currHp) * 1.0 / maxHp; } hpBar.SetHpBar((float)hpRate, (float)hpShieldRate); } // todo: 优化重新计算的当前生命值 private void OnShowHurt(object self, int eventId, object hurtData) { var evt = (HurtData)hurtData; if (Mathf.Abs(evt.calculateDeltaHp + evt.hpShieldDelta) > 0.001f && render.hideDefault) stateBarShowTime = BattleConst.StateBarShowTime.AsFloat; var property = ent.property; RefreshHpBar(property.container); } public void RefreshAmmoBar(PropertyContainer property) { var currAmmo = (int)property.GetProperty(PropertyDef.Ammo); var maxAmmo = (int)property.GetProperty(PropertyDef.AmmoMax); ammoBar.SetAmmoBar((float)currAmmo / maxAmmo); } private void OnShowAmmo(object self, int eventId, object data) { var temp = (AmmoBarData)data; if (temp.isRate) { ammoBar.SetAmmoBar(temp.ammoRate); ammoBar.ReloadAmmoEnd(); } else { ammoBar.SetAmmoBar(0f); ammoBar.ReloadAmmoStart(temp.reloadCdTotal, temp.reloadCdAcc); } } } }