From 6eb915c129fc90c6f4c82ae097dd6ffad5239efc Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 25 Jan 2021 14:28:30 +0800 Subject: +scripts --- Client/Assets/Scripts/XMainClient/XHUDComponent.cs | 392 +++++++++++++++++++++ 1 file changed, 392 insertions(+) create mode 100644 Client/Assets/Scripts/XMainClient/XHUDComponent.cs (limited to 'Client/Assets/Scripts/XMainClient/XHUDComponent.cs') diff --git a/Client/Assets/Scripts/XMainClient/XHUDComponent.cs b/Client/Assets/Scripts/XMainClient/XHUDComponent.cs new file mode 100644 index 00000000..d4d0051b --- /dev/null +++ b/Client/Assets/Scripts/XMainClient/XHUDComponent.cs @@ -0,0 +1,392 @@ +using System; +using System.Collections.Generic; +using UILib; +using UnityEngine; +using XMainClient.UI; +using XUtliPoolLib; + +namespace XMainClient +{ + internal class XHUDComponent : XComponent + { + public override uint ID + { + get + { + return XHUDComponent.uuID; + } + } + + public new static readonly uint uuID = XSingleton.singleton.XHash("CombatInfoInScene"); + + private GameObject _hudObject = null; + + private List _List = new List(); + + private List _Unused = new List(); + + private Camera gameCamera = null; + + private Camera uiCamera = null; + + private XBattleDocument _BattleDoc; + + public static bool processHud = true; + + private static int currentCount = 0; + + public static int _Max_UI_UpdateCount_PreFrame = 4; + + public static void ResetCurrentCount() + { + XHUDComponent.currentCount = 0; + } + + public override void OnAttachToHost(XObject host) + { + base.OnAttachToHost(host); + this._hudObject = XSingleton.singleton.GetGameObject(); + this._hudObject.layer = LayerMask.NameToLayer("UI"); + this._hudObject.name = this._entity.EngineObject.Name + "_hud"; + this.gameCamera = XSingleton.singleton.GameCamera.UnityCamera; + this.uiCamera = XSingleton.singleton.UICamera; + XSingleton.singleton.AddChild(XSingleton.singleton.UIRoot, this._hudObject.transform); + this._BattleDoc = XDocuments.GetSpecificDocument(XBattleDocument.uuID); + } + + public override void OnDetachFromHost() + { + base.OnDetachFromHost(); + int i = this._List.Count; + while (i > 0) + { + XHudEntry ent = this._List[--i]; + this.DestroyEntityHudGameObject(ent); + } + XSingleton.singleton.ReturnGameObject(this._hudObject); + this._hudObject = null; + } + + protected override void EventSubscribe() + { + base.RegisterEvent(XEventDefine.XEvent_HUDAdd, new XComponent.XEventHandler(this.AddHud)); + base.RegisterEvent(XEventDefine.XEvent_HUDDoodad, new XComponent.XEventHandler(this.AddDoodadHUD)); + } + + private XHudEntry CreateHUD() + { + bool flag = this._Unused.Count > 0; + XHudEntry result; + if (flag) + { + XHudEntry xhudEntry = this._Unused[this._Unused.Count - 1]; + this._Unused.RemoveAt(this._Unused.Count - 1); + xhudEntry.time = Time.realtimeSinceStartup; + xhudEntry.offset = 0f; + this._List.Add(xhudEntry); + result = xhudEntry; + } + else + { + XHudEntry xhudEntry2 = new XHudEntry(); + this._List.Add(xhudEntry2); + result = xhudEntry2; + } + return result; + } + + public bool AddDoodadHUD(XEventArgs e) + { + XHUDDoodadArgs xhuddoodadArgs = e as XHUDDoodadArgs; + GameObject gameObject = XSingleton.singleton.CreateFromPrefab("UI/Billboard/HUDDoodad", Vector3.zero, Quaternion.identity, true, false); + gameObject.layer = LayerMask.NameToLayer("UI"); + XSingleton.singleton.AddChild(this._hudObject, gameObject); + XHudEntry xhudEntry = this.CreateHUD(); + xhudEntry.time = Time.realtimeSinceStartup; + xhudEntry.stay = 0.1f; + xhudEntry.offset = 0f; + xhudEntry.val = 0f; + xhudEntry.label = (gameObject.transform.GetComponent("XUILabel") as IXUILabel); + xhudEntry.label.SetRootAsUIPanel(true); + xhudEntry.isDigital = true; + IXUILabelSymbol ixuilabelSymbol = gameObject.transform.GetComponent("XUILabelSymbol") as IXUILabelSymbol; + ItemList.RowData itemConf = XBagDocument.GetItemConf(xhuddoodadArgs.itemid); + bool flag = itemConf != null; + if (flag) + { + ItemType itemType = (ItemType)itemConf.ItemType; + if (itemType != ItemType.VIRTUAL_ITEM) + { + ItemList.RowData itemConf2 = XBagDocument.GetItemConf(xhuddoodadArgs.itemid); + string itemQualityColorStr = XSingleton.singleton.GetItemQualityColorStr((int)itemConf2.ItemQuality); + ixuilabelSymbol.InputText = string.Format("[{0}]{1}[-] x{2}", itemQualityColorStr, XSingleton.singleton.ChooseProfString(itemConf2.ItemName, 0u), xhuddoodadArgs.count); + } + else + { + string inputText = XLabelSymbolHelper.FormatCostWithIcon("+{1} {0}", xhuddoodadArgs.count, (ItemEnum)xhuddoodadArgs.itemid); + ixuilabelSymbol.InputText = inputText; + } + } + this.UIFollowTarget(); + IXHUDDescription ixhuddescription = gameObject.transform.GetComponent("HUDDescription") as IXHUDDescription; + xhudEntry.offsetCurve = ixhuddescription.GetPosCurve(); + xhudEntry.scaleCurve = ixhuddescription.GetScaleCurve(); + xhudEntry.alphaCurve = ixhuddescription.GetAlphaCurve(); + return true; + } + + public bool AddHud(XEventArgs e) + { + bool flag = !XHUDComponent.processHud || XHUDComponent.currentCount > XHUDComponent._Max_UI_UpdateCount_PreFrame; + bool result; + if (flag) + { + e.Recycle(); + result = true; + } + else + { + bool flag2 = !XHUDComponent.processHud; + if (flag2) + { + result = true; + } + else + { + bool flag3 = XHUDComponent.currentCount >= XHUDComponent._Max_UI_UpdateCount_PreFrame; + if (flag3) + { + bool flag4 = this._List.Count > 0; + if (flag4) + { + this.DeleteHUD(this._List[0]); + } + } + XHUDAddEventArgs xhudaddEventArgs = e as XHUDAddEventArgs; + bool flag5 = !this._entity.IsPlayer && (!XSingleton.singleton.bSpectator || XSingleton.singleton.Player.WatchTo == null || XSingleton.singleton.Player.WatchTo.ID != this._entity.ID); + if (flag5) + { + ulong num = 0UL; + bool flag6 = false; + bool flag7 = xhudaddEventArgs.caster == null || xhudaddEventArgs.caster.Attributes == null || xhudaddEventArgs.caster.Attributes.HostID == 0UL; + if (flag7) + { + bool flag8 = !this._BattleDoc.ShowTeamMemberDamageHUD; + if (flag8) + { + num = xhudaddEventArgs.damageResult.Caster; + } + else + { + flag6 = true; + } + } + else + { + bool showMobDamageHUD = this._BattleDoc.ShowMobDamageHUD; + if (!showMobDamageHUD) + { + return true; + } + num = xhudaddEventArgs.caster.Attributes.HostID; + } + bool flag9 = !flag6; + if (flag9) + { + bool flag10 = num > 0UL; + if (!flag10) + { + return true; + } + bool flag11 = XSingleton.singleton.Player.WatchTo != null && XSingleton.singleton.Player.WatchTo.ID == num; + bool flag12 = num != XSingleton.singleton.XPlayerData.RoleID && !flag11; + if (flag12) + { + return true; + } + } + } + GameObject hudtemplateByDamageResult = XSingleton.singleton.GetHUDTemplateByDamageResult(xhudaddEventArgs.damageResult, this._entity.IsPlayer); + XHUDComponent.currentCount++; + hudtemplateByDamageResult.layer = LayerMask.NameToLayer("UI"); + XHudEntry xhudEntry = this.CreateHUD(); + xhudEntry.time = Time.realtimeSinceStartup; + xhudEntry.stay = 0.1f; + xhudEntry.offset = 0f; + xhudEntry.val = (float)xhudaddEventArgs.damageResult.Value; + bool flag13 = !xhudEntry.init; + if (flag13) + { + xhudEntry.label = (hudtemplateByDamageResult.transform.GetComponent("XUILabel") as IXUILabel); + xhudEntry.label.SetRootAsUIPanel(true); + } + XSingleton.singleton.AddChildNoMark(this._hudObject, hudtemplateByDamageResult); + xhudEntry.isDigital = true; + string text = XSingleton.singleton.GetHUDText(xhudaddEventArgs.damageResult, xhudEntry.isDigital); + bool isMainViewEntity = this._entity.IsMainViewEntity; + if (isMainViewEntity) + { + text = ((xhudaddEventArgs.damageResult.Value >= 0.0) ? "-" : "+") + text; + } + bool flag14 = xhudaddEventArgs.damageResult.Result != ProjectResultType.PJRES_IMMORTAL && xhudaddEventArgs.damageResult.Result != ProjectResultType.PJRES_MISS; + if (flag14) + { + xhudEntry.label.SetText(text); + } + bool flag15 = this._entity.IsEnemy && xhudaddEventArgs.damageResult.Value > 0.0; + if (flag15) + { + XSingleton.singleton.ls._total_damage += (float)xhudaddEventArgs.damageResult.Value; + } + else + { + bool isPlayer = this._entity.IsPlayer; + if (isPlayer) + { + bool flag16 = xhudaddEventArgs.damageResult.Value > 0.0; + if (flag16) + { + XSingleton.singleton.ls._total_hurt += (float)xhudaddEventArgs.damageResult.Value; + } + else + { + XSingleton.singleton.ls._total_heal += (float)(-(float)xhudaddEventArgs.damageResult.Value); + } + } + } + bool flag17 = !xhudaddEventArgs.damageResult.IsCritical() && !this._entity.IsMainViewEntity; + if (flag17) + { + bool bEnable = false; + Color white = Color.white; + Color white2 = Color.white; + XSingleton.singleton.GetElementColor(xhudaddEventArgs.damageResult.ElementType, ref bEnable, ref white, ref white2); + xhudEntry.label.SetGradient(bEnable, white, white2); + xhudEntry.label.SetColor(white); + } + bool flag18 = !xhudaddEventArgs.damageResult.IsCritical() && xhudaddEventArgs.damageResult.Result != ProjectResultType.PJRES_IMMORTAL && this._entity.IsMainViewEntity; + if (flag18) + { + xhudEntry.label.SetGradient(false, Color.white, Color.white); + xhudEntry.label.SetColor(new Color32(byte.MaxValue, 32, 73, byte.MaxValue)); + } + bool flag19 = xhudaddEventArgs.damageResult.Value < 0.0; + if (flag19) + { + Color green = Color.green; + Color green2 = Color.green; + xhudEntry.label.SetGradient(true, green, green2); + xhudEntry.label.SetColor(green); + } + this.UIFollowTarget(); + bool flag20 = !xhudEntry.init; + if (flag20) + { + IXHUDDescription ixhuddescription = hudtemplateByDamageResult.transform.GetComponent("HUDDescription") as IXHUDDescription; + xhudEntry.offsetCurve = ixhuddescription.GetPosCurve(); + xhudEntry.alphaCurve = ixhuddescription.GetAlphaCurve(); + xhudEntry.scaleCurve = ixhuddescription.GetScaleCurve(); + } + result = true; + } + } + return result; + } + + private void DeleteHUD(XHudEntry ent) + { + this._List.Remove(ent); + this._Unused.Add(ent); + this.DestroyEntityHudGameObject(ent); + XHUDComponent.currentCount--; + } + + protected void HideEntityHudGameObject(XHudEntry ent) + { + ent.label.gameObject.transform.localPosition = XResourceLoaderMgr.Far_Far_Away; + XSingleton.singleton.UnSafeDestroy(ent.label.gameObject, true, false); + } + + protected void DestroyEntityHudGameObject(XHudEntry ent) + { + ent.label.gameObject.transform.localPosition = XResourceLoaderMgr.Far_Far_Away; + XSingleton.singleton.UnSafeDestroy(ent.label.gameObject, true, false); + } + + private void UIFollowTarget() + { + bool flag = this.gameCamera == null; + if (flag) + { + this.gameCamera = XSingleton.singleton.GameCamera.UnityCamera; + } + float height = this._entity.Height; + Vector3 radiusCenter = this._entity.RadiusCenter; + Vector3 vector; + vector= new Vector3(radiusCenter.x, radiusCenter.y + height, radiusCenter.z); + Vector3 vector2 = this.gameCamera.WorldToViewportPoint(vector); + if (vector2.z > 0f) + { + bool flag2 = vector2.x > 0f && vector2.x < 1f && vector2.y > 0f && vector2.y < 1f; + } + this._hudObject.transform.position = this.uiCamera.ViewportToWorldPoint(vector2); + vector2 = this._hudObject.transform.localPosition; + vector2.x = (float)Mathf.FloorToInt(vector2.x); + vector2.y = (float)Mathf.FloorToInt(vector2.y); + bool flag3 = vector2.y > (float)(XSingleton.singleton.Base_UI_Height / 2) * 0.5f; + if (flag3) + { + vector2.y = (float)(XSingleton.singleton.Base_UI_Height / 2) * 0.5f; + } + vector2.z = 0f; + this._hudObject.transform.localPosition = vector2; + } + + private void UpdateHUDs() + { + float realtimeSinceStartup = Time.realtimeSinceStartup; + int i = this._List.Count; + while (i > 0) + { + XHudEntry xhudEntry = this._List[--i]; + float time = xhudEntry.offsetCurve[xhudEntry.offsetCurve.length - 1].time; + float time2 = xhudEntry.scaleCurve[xhudEntry.scaleCurve.length - 1].time; + float time3 = xhudEntry.alphaCurve[xhudEntry.alphaCurve.length - 1].time; + float num = Mathf.Max(Mathf.Max(time2, time), time3); + float num2 = realtimeSinceStartup - xhudEntry.movementStart; + xhudEntry.offset = xhudEntry.offsetCurve.Evaluate(num2); + float num3 = xhudEntry.scaleCurve.Evaluate(realtimeSinceStartup - xhudEntry.time); + bool flag = num3 < 0.001f; + if (flag) + { + num3 = 0.001f; + } + xhudEntry.label.gameObject.transform.localScale = Vector3.one * num3; + float num4 = xhudEntry.alphaCurve.Evaluate(realtimeSinceStartup - xhudEntry.time); + Color color = xhudEntry.label.GetColor(); + Color color2; + color2= new Color(color.r, color.g, color.b, num4); + xhudEntry.label.SetColor(color2); + bool flag2 = num2 > num; + if (flag2) + { + this.DeleteHUD(xhudEntry); + } + } + float num5 = -200f; + int j = this._List.Count; + while (j > 0) + { + XHudEntry xhudEntry2 = this._List[--j]; + num5 = Mathf.Max(num5, xhudEntry2.offset); + xhudEntry2.label.gameObject.transform.localPosition = new Vector3(0f, num5, 0f); + num5 += Mathf.Round(xhudEntry2.label.gameObject.transform.localScale.y * 20f); + } + } + + public override void PostUpdate(float fDeltaT) + { + this.UpdateHUDs(); + } + } +} -- cgit v1.1-26-g67d0