MultiplayerPlayerStatus.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using GadgetCore.API;
  2. using GadgetCore.Util;
  3. using GadgetCore.API.ConfigMenu;
  4. using System.Collections;
  5. using System.Reflection;
  6. using UnityEngine;
  7. using UnityEngine.SceneManagement;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System;
  11. namespace MultiplayerPlayerStatus
  12. {
  13. [Gadget("MultiplayerPlayerStatus", RequiredOnClients: false)]
  14. public class MultiplayerPlayerStatus : Gadget<MultiplayerPlayerStatus>
  15. {
  16. public const string MOD_VERSION = "1.1"; // Set this to the version of your mod.
  17. public const string CONFIG_VERSION = "1.0"; // Increment this whenever you change your mod's config file.
  18. public const int PROTOCOL_VERSION = 0;
  19. private const string RPC_NAME = "MPPSUpdate";
  20. public override IGadgetConfigMenu GetConfigMenu() { return null; }
  21. public override string GetModDescription()
  22. {
  23. return "A mod that displays the player status of other players in multiplayer.";
  24. }
  25. protected override void Initialize()
  26. {
  27. Logger.Log("Multiplayer Player Status v" + Info.Mod.Version);
  28. Core.logger = Logger;
  29. SceneManager.sceneLoaded += OnSceneLoaded;
  30. GadgetCoreAPI.RegisterCustomRPC(RPC_NAME, (e) =>
  31. {
  32. int protocolVersion = (int)e[0];
  33. var name = (string)e[1];
  34. var mpps = MPPStatus.FirstOrDefault((o) => o.Name == name);
  35. if (mpps == null)
  36. {
  37. mpps = new MPPStatus();
  38. mpps.Name = name;
  39. MPPStatus.Add(mpps);
  40. }
  41. mpps.MaxHP = BitConverter.ToDouble((byte[])e[2], 0);
  42. mpps.HP = BitConverter.ToDouble((byte[])e[3], 0);
  43. });
  44. }
  45. internal void OnSceneLoaded(Scene scene, LoadSceneMode mode)
  46. {
  47. if (scene.buildIndex == 1)
  48. {
  49. InstanceTracker.GameScript.StartCoroutine(Run());
  50. }
  51. }
  52. private static List<MPPStatus> MPPStatus = new List<MPPStatus>();
  53. public static Texture2D TexFrame;
  54. public static Texture2D TexFrameTeleport;
  55. public static Texture2D TexFrameDead;
  56. public static Texture2D TexHP;
  57. public IEnumerator Run()
  58. {
  59. while (!Network.isClient && !Network.isServer)
  60. yield return new WaitForSeconds(1f);
  61. TexFrame = GadgetCoreAPI.LoadTexture2D("frame.png");
  62. TexFrameTeleport = GadgetCoreAPI.LoadTexture2D("frame_teleport.png");
  63. TexFrameDead = GadgetCoreAPI.LoadTexture2D("frame_dead.png");
  64. TexHP = GadgetCoreAPI.LoadTexture2D("hp.png");
  65. var inv = GameObject.Find("Main Camera").transform.FindChild("inventoryBar").gameObject;
  66. var container = new GameObject("mpStatus");
  67. container.transform.SetParent(inv.transform);
  68. container.transform.localEulerAngles = new Vector3(0, 0, 0);
  69. container.transform.localScale = new Vector3(0.125f, 0.125f, 1);
  70. var re = ((float)Screen.width) / Screen.height;
  71. Core.logger.Log("UI scale racio: " + re);
  72. if (re >= 1.699)
  73. container.transform.localPosition = new Vector3(-0.8f, -0.5f, 0);
  74. else if (re >= 1.599)
  75. container.transform.localPosition = new Vector3(-0.75f, -0.5f, 0);
  76. else if (re >= 1.4)
  77. container.transform.localPosition = new Vector3(-0.7f, -0.5f, 0);
  78. else
  79. container.transform.localPosition = new Vector3(-0.6f, -0.5f, 0);
  80. var image = GameObject.Instantiate<GameObject>(inv.transform.FindChild("barHP").gameObject);
  81. image.transform.SetParent(container.transform);
  82. image.transform.localEulerAngles = new Vector3(0, 0, 0);
  83. image.transform.localScale = new Vector3(1, 1, 1);
  84. image.transform.localPosition = new Vector3(0, 0, 0);
  85. Renderer rendererProj = image.GetComponentInChildren<Renderer>();
  86. rendererProj.material = new Material(Shader.Find("Unlit/Transparent"))
  87. {
  88. mainTexture = TexFrame
  89. };
  90. container.SetActive(true);
  91. var layers = new GameObject[6];
  92. for (int i = 0; i < layers.Length; i++)
  93. {
  94. var o = GameObject.Instantiate<GameObject>(image);
  95. o.SetActive(true);
  96. layers[i] = o;
  97. }
  98. for (int i = 0; i < layers.Length; i++)
  99. {
  100. layers[i].transform.SetParent(image.transform);
  101. layers[i].transform.localEulerAngles = new Vector3(0, 0, 0);
  102. layers[i].transform.localScale = new Vector3(1, 1, 1);
  103. layers[i].transform.localPosition = new Vector3(-(6 / 16f) + (i == 0 ? (7 / 16f) : 0), 0, 0.01f * i + 0.1f);
  104. }
  105. image.SetActive(false);
  106. while (true)
  107. {
  108. GadgetCoreAPI.CallCustomRPC(RPC_NAME, RPCMode.All, new object[] {
  109. PROTOCOL_VERSION,
  110. GadgetCoreAPI.GetPlayerName(),
  111. BitConverter.GetBytes((double)GameScript.maxhp),
  112. BitConverter.GetBytes((double)GameScript.hp)
  113. });
  114. PlayerScript[] players = (PlayerScript[])GameObject.FindObjectsOfType(typeof(PlayerScript));
  115. while (container.transform.childCount - 1 > players.Length)
  116. {
  117. GameObject.DestroyImmediate(container.transform.GetChild(1).gameObject);
  118. }
  119. while (container.transform.childCount - 1 < players.Length)
  120. {
  121. var o = GameObject.Instantiate<GameObject>(image);
  122. o.transform.SetParent(container.transform);
  123. o.transform.localEulerAngles = new Vector3(0, 0, 0);
  124. o.transform.localScale = new Vector3(1, 1, 1);
  125. o.transform.localPosition = new Vector3(0, 0, 0);
  126. o.SetActive(true);
  127. }
  128. for (int i = 0; i < players.Length; i++)
  129. {
  130. var player = players[i];
  131. double maxHP = 1;
  132. double hp = 0;
  133. var name = GadgetNetwork.GetNameByNetworkPlayer(player.gameObject.GetComponent<NetworkView>().owner);
  134. var mpps = MPPStatus.FirstOrDefault((o) => o.Name == name);
  135. if (mpps != null)
  136. {
  137. maxHP = mpps.MaxHP;
  138. hp = mpps.HP;
  139. }
  140. else if (string.IsNullOrEmpty(name))
  141. {
  142. name = GadgetCoreAPI.GetPlayerName();
  143. maxHP = GameScript.maxhp;
  144. hp = GameScript.hp;
  145. }
  146. var app = player.gameObject.transform.GetChild(0).GetComponent<PlayerAppearance>();
  147. var img = container.transform.GetChild(i + 1);
  148. img.transform.localPosition = new Vector3(0, 2 * i, 0);
  149. img.GetComponentInChildren<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  150. {
  151. mainTexture = !player.e.activeSelf ? TexFrameTeleport : app.reviveObj.activeSelf ? TexFrameDead : TexFrame
  152. };
  153. img.GetChild(0).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  154. {
  155. mainTexture = app.arm1Obj.GetComponent<Renderer>().material.mainTexture
  156. };
  157. img.GetChild(1).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  158. {
  159. mainTexture = app.bodyObj.GetComponent<Renderer>().material.mainTexture
  160. };
  161. img.GetChild(2).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  162. {
  163. mainTexture = app.headObj.GetComponent<Renderer>().material.mainTexture
  164. };
  165. img.GetChild(3).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  166. {
  167. mainTexture = app.helmObj.GetComponent<Renderer>().material.mainTexture
  168. };
  169. img.GetChild(4).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  170. {
  171. mainTexture = app.arm2Obj.GetComponent<Renderer>().material.mainTexture
  172. };
  173. img.GetChild(5).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
  174. {
  175. mainTexture = TexHP
  176. };
  177. float hpW = (18 / 32f) * (float)(hp / maxHP);
  178. img.GetChild(5).localScale = new Vector3(hpW, 1 / 16f, 1);
  179. img.GetChild(5).localPosition = new Vector3(-(6 / 16f) - (18 / 16f) / 2 + hpW, (8 / 16f), 0.01f * 5 + 0.1f);
  180. }
  181. yield return new WaitForSeconds(1f);
  182. }
  183. yield break;
  184. }
  185. }
  186. }