| using System; |
| using System; |
| using System.Collections.Generic; |
| using System.Collections.Generic; |
| using System.Globalization; |
| using System.Globalization; |
| using TMPro; |
| using TMPro; |
| using UnityEngine; |
| using UnityEngine; |
| |
| |
| public class DamageText : MonoBehaviour |
| public class DamageText : MonoBehaviour |
| { |
| { |
| public static DamageText instance |
| public static DamageText instance |
| { |
| { |
| get |
| get |
| { |
| { |
| return DamageText.m_instance; |
| return DamageText.m_instance; |
| } |
| } |
| } |
| } |
| |
| |
| private void Awake() |
| private void Awake() |
| { |
| { |
| DamageText.m_instance = this; |
| DamageText.m_instance = this; |
| ZRoutedRpc.instance.Register<ZPackage>("DamageText", new Action<long, ZPackage>(this.RPC_DamageText)); |
| ZRoutedRpc.instance.Register<ZPackage>("DamageText", new Action<long, ZPackage>(this.RPC_DamageText)); |
| } |
| } |
| |
| |
| private void LateUpdate() |
| private void LateUpdate() |
| { |
| { |
| this.UpdateWorldTexts(Time.deltaTime); |
| this.UpdateWorldTexts(Time.deltaTime); |
| } |
| } |
| |
| |
| private void UpdateWorldTexts(float dt) |
| private void UpdateWorldTexts(float dt) |
| { |
| { |
| DamageText.WorldTextInstance worldTextInstance = null; |
| DamageText.WorldTextInstance worldTextInstance = null; |
| Camera mainCamera = Utils.GetMainCamera(); |
| Camera mainCamera = Utils.GetMainCamera(); |
| foreach (DamageText.WorldTextInstance worldTextInstance2 in this.m_worldTexts) |
| foreach (DamageText.WorldTextInstance worldTextInstance2 in this.m_worldTexts) |
| { |
| { |
| worldTextInstance2.m_timer += dt; |
| worldTextInstance2.m_timer += dt; |
| if (worldTextInstance2.m_timer > this.m_textDuration && worldTextInstance == null) |
| if (worldTextInstance2.m_timer > this.m_textDuration && worldTextInstance == null) |
| { |
| { |
| worldTextInstance = worldTextInstance2; |
| worldTextInstance = worldTextInstance2; |
| } |
| } |
| DamageText.WorldTextInstance worldTextInstance3 = worldTextInstance2; |
| DamageText.WorldTextInstance worldTextInstance3 = worldTextInstance2; |
| worldTextInstance3.m_worldPos.y = worldTextInstance3.m_worldPos.y + dt; |
| worldTextInstance3.m_worldPos.y = worldTextInstance3.m_worldPos.y + dt; |
| float num = Mathf.Clamp01(worldTextInstance2.m_timer / this.m_textDuration); |
| float num = Mathf.Clamp01(worldTextInstance2.m_timer / this.m_textDuration); |
| Color color = worldTextInstance2.m_textField.color; |
| Color color = worldTextInstance2.m_textField.color; |
| color.a = 1f - Mathf.Pow(num, 3f); |
| color.a = 1f - Mathf.Pow(num, 3f); |
| worldTextInstance2.m_textField.color = color; |
| worldTextInstance2.m_textField.color = color; |
| Vector3 vector = mainCamera.WorldToScreenPointScaled(worldTextInstance2.m_worldPos); |
| Vector3 vector = mainCamera.WorldToScreenPointScaled(worldTextInstance2.m_worldPos); |
| if (vector.x < 0f || vector.x > (float)Screen.width || vector.y < 0f || vector.y > (float)Screen.height || vector.z < 0f) |
| if (vector.x < 0f || vector.x > (float)Screen.width || vector.y < 0f || vector.y > (float)Screen.height || vector.z < 0f) |
| { |
| { |
| worldTextInstance2.m_gui.SetActive(false); |
| worldTextInstance2.m_gui.SetActive(false); |
| } |
| } |
| else |
| else |
| { |
| { |
| worldTextInstance2.m_gui.SetActive(true); |
| worldTextInstance2.m_gui.SetActive(true); |
| worldTextInstance2.m_gui.transform.position = vector; |
| worldTextInstance2.m_gui.transform.position = vector; |
| } |
| } |
| } |
| } |
| if (worldTextInstance != null) |
| if (worldTextInstance != null) |
| { |
| { |
| UnityEngine.Object.Destroy(worldTextInstance.m_gui); |
| UnityEngine.Object.Destroy(worldTextInstance.m_gui); |
| this.m_worldTexts.Remove(worldTextInstance); |
| this.m_worldTexts.Remove(worldTextInstance); |
| } |
| } |
| } |
| } |
| |
| |
| private void AddInworldText(DamageText.TextType type, Vector3 pos, float distance, float dmg, bool mySelf) |
| private void AddInworldText(DamageText.TextType type, Vector3 pos, float distance, float dmg, bool mySelf) |
| { |
| { |
| . | |
| if (dmg == 0f && this.m_worldTexts.Count > 200) |
| |
| { |
| |
| return; |
| |
| } |
| DamageText.WorldTextInstance worldTextInstance = new DamageText.WorldTextInstance(); |
| DamageText.WorldTextInstance worldTextInstance = new DamageText.WorldTextInstance(); |
| worldTextInstance.m_worldPos = pos + UnityEngine.Random.insideUnitSphere * 0.5f; |
| worldTextInstance.m_worldPos = pos + UnityEngine.Random.insideUnitSphere * 0.5f; |
| worldTextInstance.m_gui = UnityEngine.Object.Instantiate<GameObject>(this.m_worldTextBase, base.transform); |
| worldTextInstance.m_gui = UnityEngine.Object.Instantiate<GameObject>(this.m_worldTextBase, base.transform); |
| worldTextInstance.m_textField = worldTextInstance.m_gui.GetComponent<TMP_Text>(); |
| worldTextInstance.m_textField = worldTextInstance.m_gui.GetComponent<TMP_Text>(); |
| this.m_worldTexts.Add(worldTextInstance); |
| this.m_worldTexts.Add(worldTextInstance); |
| Color white; |
| Color white; |
| if (type == DamageText.TextType.Heal) |
| if (type == DamageText.TextType.Heal) |
| { |
| { |
| white = new Color(0.5f, 1f, 0.5f, 0.7f); |
| white = new Color(0.5f, 1f, 0.5f, 0.7f); |
| } |
| } |
| else if (mySelf) |
| else if (mySelf) |
| { |
| { |
| if (dmg == 0f) |
| if (dmg == 0f) |
| { |
| { |
| white = new Color(0.5f, 0.5f, 0.5f, 1f); |
| white = new Color(0.5f, 0.5f, 0.5f, 1f); |
| } |
| } |
| else |
| else |
| { |
| { |
| white = new Color(1f, 0f, 0f, 1f); |
| white = new Color(1f, 0f, 0f, 1f); |
| } |
| } |
| } |
| } |
| else |
| else |
| { |
| { |
| switch (type) |
| switch (type) |
| { |
| { |
| case DamageText.TextType.Normal: |
| case DamageText.TextType.Normal: |
| white = new Color(1f, 1f, 1f, 1f); |
| white = new Color(1f, 1f, 1f, 1f); |
| . | goto IL_180; |
| goto IL_19C; |
| case DamageText.TextType.Resistant: |
| case DamageText.TextType.Resistant: |
| white = new Color(0.6f, 0.6f, 0.6f, 1f); |
| white = new Color(0.6f, 0.6f, 0.6f, 1f); |
| . | goto IL_180; |
| goto IL_19C; |
| case DamageText.TextType.Weak: |
| case DamageText.TextType.Weak: |
| white = new Color(1f, 1f, 0f, 1f); |
| white = new Color(1f, 1f, 0f, 1f); |
| . | goto IL_180; |
| goto IL_19C; |
| case DamageText.TextType.Immune: |
| case DamageText.TextType.Immune: |
| white = new Color(0.6f, 0.6f, 0.6f, 1f); |
| white = new Color(0.6f, 0.6f, 0.6f, 1f); |
| . | goto IL_180; |
| goto IL_19C; |
| case DamageText.TextType.TooHard: |
| case DamageText.TextType.TooHard: |
| white = new Color(0.8f, 0.7f, 0.7f, 1f); |
| white = new Color(0.8f, 0.7f, 0.7f, 1f); |
| . | goto IL_180; |
| goto IL_19C; |
| } |
| } |
| white = Color.white; |
| white = Color.white; |
| } |
| } |
| . | IL_180: |
| IL_19C: |
| worldTextInstance.m_textField.color = white; |
| worldTextInstance.m_textField.color = white; |
| if (distance > this.m_smallFontDistance) |
| if (distance > this.m_smallFontDistance) |
| { |
| { |
| worldTextInstance.m_textField.fontSize = (float)this.m_smallFontSize; |
| worldTextInstance.m_textField.fontSize = (float)this.m_smallFontSize; |
| } |
| } |
| else |
| else |
| { |
| { |
| worldTextInstance.m_textField.fontSize = (float)this.m_largeFontSize; |
| worldTextInstance.m_textField.fontSize = (float)this.m_largeFontSize; |
| } |
| } |
| string text; |
| string text; |
| switch (type) |
| switch (type) |
| { |
| { |
| case DamageText.TextType.Heal: |
| case DamageText.TextType.Heal: |
| text = "+" + dmg.ToString("0.#", CultureInfo.InvariantCulture); |
| text = "+" + dmg.ToString("0.#", CultureInfo.InvariantCulture); |
| break; |
| break; |
| case DamageText.TextType.TooHard: |
| case DamageText.TextType.TooHard: |
| text = Localization.instance.Localize("$msg_toohard"); |
| text = Localization.instance.Localize("$msg_toohard"); |
| break; |
| break; |
| case DamageText.TextType.Blocked: |
| case DamageText.TextType.Blocked: |
| text = Localization.instance.Localize("$msg_blocked: ") + dmg.ToString("0.#", CultureInfo.InvariantCulture); |
| text = Localization.instance.Localize("$msg_blocked: ") + dmg.ToString("0.#", CultureInfo.InvariantCulture); |
| break; |
| break; |
| default: |
| default: |
| text = dmg.ToString("0.#", CultureInfo.InvariantCulture); |
| text = dmg.ToString("0.#", CultureInfo.InvariantCulture); |
| break; |
| break; |
| } |
| } |
| worldTextInstance.m_textField.text = text; |
| worldTextInstance.m_textField.text = text; |
| worldTextInstance.m_timer = 0f; |
| worldTextInstance.m_timer = 0f; |
| } |
| } |
| |
| |
| public void ShowText(HitData.DamageModifier type, Vector3 pos, float dmg, bool player = false) |
| public void ShowText(HitData.DamageModifier type, Vector3 pos, float dmg, bool player = false) |
| { |
| { |
| DamageText.TextType textType = DamageText.TextType.Normal; |
| DamageText.TextType textType = DamageText.TextType.Normal; |
| switch (type) |
| switch (type) |
| { |
| { |
| case HitData.DamageModifier.Normal: |
| case HitData.DamageModifier.Normal: |
| textType = DamageText.TextType.Normal; |
| textType = DamageText.TextType.Normal; |
| break; |
| break; |
| case HitData.DamageModifier.Resistant: |
| case HitData.DamageModifier.Resistant: |
| textType = DamageText.TextType.Resistant; |
| textType = DamageText.TextType.Resistant; |
| break; |
| break; |
| case HitData.DamageModifier.Weak: |
| case HitData.DamageModifier.Weak: |
| textType = DamageText.TextType.Weak; |
| textType = DamageText.TextType.Weak; |
| break; |
| break; |
| case HitData.DamageModifier.Immune: |
| case HitData.DamageModifier.Immune: |
| textType = DamageText.TextType.Immune; |
| textType = DamageText.TextType.Immune; |
| break; |
| break; |
| case HitData.DamageModifier.VeryResistant: |
| case HitData.DamageModifier.VeryResistant: |
| textType = DamageText.TextType.Resistant; |
| textType = DamageText.TextType.Resistant; |
| break; |
| break; |
| case HitData.DamageModifier.VeryWeak: |
| case HitData.DamageModifier.VeryWeak: |
| textType = DamageText.TextType.Weak; |
| textType = DamageText.TextType.Weak; |
| break; |
| break; |
| } |
| } |
| this.ShowText(textType, pos, dmg, player); |
| this.ShowText(textType, pos, dmg, player); |
| } |
| } |
| |
| |
| public void ShowText(DamageText.TextType type, Vector3 pos, float dmg, bool player = false) |
| public void ShowText(DamageText.TextType type, Vector3 pos, float dmg, bool player = false) |
| { |
| { |
| ZPackage zpackage = new ZPackage(); |
| ZPackage zpackage = new ZPackage(); |
| zpackage.Write((int)type); |
| zpackage.Write((int)type); |
| zpackage.Write(pos); |
| zpackage.Write(pos); |
| zpackage.Write(dmg); |
| zpackage.Write(dmg); |
| zpackage.Write(player); |
| zpackage.Write(player); |
| ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "DamageText", new object[] { zpackage }); |
| ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "DamageText", new object[] { zpackage }); |
| } |
| } |
| |
| |
| private void RPC_DamageText(long sender, ZPackage pkg) |
| private void RPC_DamageText(long sender, ZPackage pkg) |
| { |
| { |
| Camera mainCamera = Utils.GetMainCamera(); |
| Camera mainCamera = Utils.GetMainCamera(); |
| if (!mainCamera) |
| if (!mainCamera) |
| { |
| { |
| return; |
| return; |
| } |
| } |
| if (Hud.IsUserHidden()) |
| if (Hud.IsUserHidden()) |
| { |
| { |
| return; |
| return; |
| } |
| } |
| DamageText.TextType textType = (DamageText.TextType)pkg.ReadInt(); |
| DamageText.TextType textType = (DamageText.TextType)pkg.ReadInt(); |
| Vector3 vector = pkg.ReadVector3(); |
| Vector3 vector = pkg.ReadVector3(); |
| float num = pkg.ReadSingle(); |
| float num = pkg.ReadSingle(); |
| bool flag = pkg.ReadBool(); |
| bool flag = pkg.ReadBool(); |
| float num2 = Vector3.Distance(mainCamera.transform.position, vector); |
| float num2 = Vector3.Distance(mainCamera.transform.position, vector); |
| if (num2 > this.m_maxTextDistance) |
| if (num2 > this.m_maxTextDistance) |
| { |
| { |
| return; |
| return; |
| } |
| } |
| bool flag2 = flag && sender == ZNet.GetUID(); |
| bool flag2 = flag && sender == ZNet.GetUID(); |
| this.AddInworldText(textType, vector, num2, num, flag2); |
| this.AddInworldText(textType, vector, num2, num, flag2); |
| } |
| } |
| |
| |
| private static DamageText m_instance; |
| private static DamageText m_instance; |
| |
| |
| public float m_textDuration = 1.5f; |
| public float m_textDuration = 1.5f; |
| |
| |
| public float m_maxTextDistance = 30f; |
| public float m_maxTextDistance = 30f; |
| |
| |
| public int m_largeFontSize = 16; |
| public int m_largeFontSize = 16; |
| |
| |
| public int m_smallFontSize = 8; |
| public int m_smallFontSize = 8; |
| |
| |
| public float m_smallFontDistance = 10f; |
| public float m_smallFontDistance = 10f; |
| |
| |
| public GameObject m_worldTextBase; |
| public GameObject m_worldTextBase; |
| |
| |
| private List<DamageText.WorldTextInstance> m_worldTexts = new List<DamageText.WorldTextInstance>(); |
| private List<DamageText.WorldTextInstance> m_worldTexts = new List<DamageText.WorldTextInstance>(); |
| |
| |
| public enum TextType |
| public enum TextType |
| { |
| { |
| Normal, |
| Normal, |
| Resistant, |
| Resistant, |
| Weak, |
| Weak, |
| Immune, |
| Immune, |
| Heal, |
| Heal, |
| TooHard, |
| TooHard, |
| Blocked |
| Blocked |
| } |
| } |
| |
| |
| private class WorldTextInstance |
| private class WorldTextInstance |
| { |
| { |
| public Vector3 m_worldPos; |
| public Vector3 m_worldPos; |
| |
| |
| public GameObject m_gui; |
| public GameObject m_gui; |
| |
| |
| public float m_timer; |
| public float m_timer; |
| |
| |
| public TMP_Text m_textField; |
| public TMP_Text m_textField; |
| } |
| } |
| } |
| } |
| |
| |