using GadgetCore.API; using GadgetCore.Util; using GadgetCore.API.ConfigMenu; using System.Collections; using System.Reflection; using UnityEngine; using UnityEngine.SceneManagement; using System.Collections.Generic; using System.Linq; using System; namespace MultiplayerPlayerStatus { [Gadget("MultiplayerPlayerStatus", RequiredOnClients: false)] public class MultiplayerPlayerStatus : Gadget { public const string MOD_VERSION = "1.1"; // Set this to the version of your mod. public const string CONFIG_VERSION = "1.0"; // Increment this whenever you change your mod's config file. public const int PROTOCOL_VERSION = 0; private const string RPC_NAME = "MPPSUpdate"; public override IGadgetConfigMenu GetConfigMenu() { return null; } public override string GetModDescription() { return "A mod that displays the player status of other players in multiplayer."; } protected override void Initialize() { Logger.Log("Multiplayer Player Status v" + Info.Mod.Version); Core.logger = Logger; SceneManager.sceneLoaded += OnSceneLoaded; GadgetCoreAPI.RegisterCustomRPC(RPC_NAME, (e) => { int protocolVersion = (int)e[0]; var name = (string)e[1]; var mpps = MPPStatus.FirstOrDefault((o) => o.Name == name); if (mpps == null) { mpps = new MPPStatus(); mpps.Name = name; MPPStatus.Add(mpps); } mpps.MaxHP = BitConverter.ToDouble((byte[])e[2], 0); mpps.HP = BitConverter.ToDouble((byte[])e[3], 0); }); } internal void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (scene.buildIndex == 1) { InstanceTracker.GameScript.StartCoroutine(Run()); } } private static List MPPStatus = new List(); public static Texture2D TexFrame; public static Texture2D TexFrameTeleport; public static Texture2D TexFrameDead; public static Texture2D TexHP; public IEnumerator Run() { while (!Network.isClient && !Network.isServer) yield return new WaitForSeconds(1f); TexFrame = GadgetCoreAPI.LoadTexture2D("frame.png"); TexFrameTeleport = GadgetCoreAPI.LoadTexture2D("frame_teleport.png"); TexFrameDead = GadgetCoreAPI.LoadTexture2D("frame_dead.png"); TexHP = GadgetCoreAPI.LoadTexture2D("hp.png"); var inv = GameObject.Find("Main Camera").transform.FindChild("inventoryBar").gameObject; var container = new GameObject("mpStatus"); container.transform.SetParent(inv.transform); container.transform.localEulerAngles = new Vector3(0, 0, 0); container.transform.localScale = new Vector3(0.125f, 0.125f, 1); var re = ((float)Screen.width) / Screen.height; Core.logger.Log("UI scale racio: " + re); if (re >= 1.699) container.transform.localPosition = new Vector3(-0.8f, -0.5f, 0); else if (re >= 1.599) container.transform.localPosition = new Vector3(-0.75f, -0.5f, 0); else if (re >= 1.4) container.transform.localPosition = new Vector3(-0.7f, -0.5f, 0); else container.transform.localPosition = new Vector3(-0.6f, -0.5f, 0); var image = GameObject.Instantiate(inv.transform.FindChild("barHP").gameObject); image.transform.SetParent(container.transform); image.transform.localEulerAngles = new Vector3(0, 0, 0); image.transform.localScale = new Vector3(1, 1, 1); image.transform.localPosition = new Vector3(0, 0, 0); Renderer rendererProj = image.GetComponentInChildren(); rendererProj.material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = TexFrame }; container.SetActive(true); var layers = new GameObject[6]; for (int i = 0; i < layers.Length; i++) { var o = GameObject.Instantiate(image); o.SetActive(true); layers[i] = o; } for (int i = 0; i < layers.Length; i++) { layers[i].transform.SetParent(image.transform); layers[i].transform.localEulerAngles = new Vector3(0, 0, 0); layers[i].transform.localScale = new Vector3(1, 1, 1); layers[i].transform.localPosition = new Vector3(-(6 / 16f) + (i == 0 ? (7 / 16f) : 0), 0, 0.01f * i + 0.1f); } image.SetActive(false); while (true) { GadgetCoreAPI.CallCustomRPC(RPC_NAME, RPCMode.All, new object[] { PROTOCOL_VERSION, GadgetCoreAPI.GetPlayerName(), BitConverter.GetBytes((double)GameScript.maxhp), BitConverter.GetBytes((double)GameScript.hp) }); PlayerScript[] players = (PlayerScript[])GameObject.FindObjectsOfType(typeof(PlayerScript)); while (container.transform.childCount - 1 > players.Length) { GameObject.DestroyImmediate(container.transform.GetChild(1).gameObject); } while (container.transform.childCount - 1 < players.Length) { var o = GameObject.Instantiate(image); o.transform.SetParent(container.transform); o.transform.localEulerAngles = new Vector3(0, 0, 0); o.transform.localScale = new Vector3(1, 1, 1); o.transform.localPosition = new Vector3(0, 0, 0); o.SetActive(true); } for (int i = 0; i < players.Length; i++) { var player = players[i]; double maxHP = 1; double hp = 0; var name = GadgetNetwork.GetNameByNetworkPlayer(player.gameObject.GetComponent().owner); var mpps = MPPStatus.FirstOrDefault((o) => o.Name == name); if (mpps != null) { maxHP = mpps.MaxHP; hp = mpps.HP; } else if (string.IsNullOrEmpty(name)) { name = GadgetCoreAPI.GetPlayerName(); maxHP = GameScript.maxhp; hp = GameScript.hp; } var app = player.gameObject.transform.GetChild(0).GetComponent(); var img = container.transform.GetChild(i + 1); img.transform.localPosition = new Vector3(0, 2 * i, 0); img.GetComponentInChildren().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = !player.e.activeSelf ? TexFrameTeleport : app.reviveObj.activeSelf ? TexFrameDead : TexFrame }; img.GetChild(0).GetComponent().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = app.arm1Obj.GetComponent().material.mainTexture }; img.GetChild(1).GetComponent().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = app.bodyObj.GetComponent().material.mainTexture }; img.GetChild(2).GetComponent().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = app.headObj.GetComponent().material.mainTexture }; img.GetChild(3).GetComponent().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = app.helmObj.GetComponent().material.mainTexture }; img.GetChild(4).GetComponent().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = app.arm2Obj.GetComponent().material.mainTexture }; img.GetChild(5).GetComponent().material = new Material(Shader.Find("Unlit/Transparent")) { mainTexture = TexHP }; float hpW = (18 / 32f) * (float)(hp / maxHP); img.GetChild(5).localScale = new Vector3(hpW, 1 / 16f, 1); img.GetChild(5).localPosition = new Vector3(-(6 / 16f) - (18 / 16f) / 2 + hpW, (8 / 16f), 0.01f * 5 + 0.1f); } yield return new WaitForSeconds(1f); } yield break; } } }