| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- 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<MultiplayerPlayerStatus>
- {
- 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> MPPStatus = new List<MPPStatus>();
- 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<GameObject>(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<Renderer>();
- 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<GameObject>(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<GameObject>(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<NetworkView>().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<PlayerAppearance>();
- var img = container.transform.GetChild(i + 1);
- img.transform.localPosition = new Vector3(0, 2 * i, 0);
- img.GetComponentInChildren<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
- {
- mainTexture = !player.e.activeSelf ? TexFrameTeleport : app.reviveObj.activeSelf ? TexFrameDead : TexFrame
- };
- img.GetChild(0).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
- {
- mainTexture = app.arm1Obj.GetComponent<Renderer>().material.mainTexture
- };
- img.GetChild(1).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
- {
- mainTexture = app.bodyObj.GetComponent<Renderer>().material.mainTexture
- };
- img.GetChild(2).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
- {
- mainTexture = app.headObj.GetComponent<Renderer>().material.mainTexture
- };
- img.GetChild(3).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
- {
- mainTexture = app.helmObj.GetComponent<Renderer>().material.mainTexture
- };
- img.GetChild(4).GetComponent<Renderer>().material = new Material(Shader.Find("Unlit/Transparent"))
- {
- mainTexture = app.arm2Obj.GetComponent<Renderer>().material.mainTexture
- };
- img.GetChild(5).GetComponent<Renderer>().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;
- }
- }
- }
|