C#:
using System.Text;
namespace Oxide.Plugins;
[Info("PulseRustUI", "Sergioklv", "1.0.1")]
public class PulseRustUI : RustPlugin {
private const string UIName = "PulseRustUI";
private const string TextElement = "PulseRustUI_Text";
private static string? _baseUITemplate;
private static string? _updateTemplate;
private static readonly StringBuilder _sb = new(256);
private void OnServerInitialized() {
BuildTemplates();
foreach (var player in BasePlayer.activePlayerList) CreateUI(player);
}
private void Unload() {
foreach (var player in BasePlayer.activePlayerList) DestroyUI(player);
}
private void OnPlayerConnected(BasePlayer player) {
if (player is null) return;
CreateUI(player);
UpdateOtherPlayers(player);
}
private void OnPlayerDisconnected(BasePlayer player) {
if (player is null) return;
UpdateAllPlayers();
}
private static void BuildTemplates2() {
_baseUITemplate = "[{\"name\":\"PulseRustUI\",\"parent\":\"Hud\",\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0 1\",\"anchormax\":\"0 1\",\"offsetmin\":\"14.021 -46.72\",\"offsetmax\":\"121.622 -11.92\"},{\"type\":\"UnityEngine.UI.RawImage\",\"url\":\"https://pulserust292.ru/AntiCheat/PulseWinter.png\"}]},{\"name\":\"PulseRustUI_Text\",\"parent\":\"PulseRustUI\",\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0 0\",\"offsetmin\":\"15.515 2.438\",\"offsetmax\":\"40.685 16.162\"},{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{COUNT}\",\"font\":\"RobotoCondensed-Regular.ttf\",\"fontSize\":12,\"align\":\"MiddleCenter\",\"verticalOverflow\":\"Overflow\"}]}]";
_updateTemplate = "[{\"name\":\"PulseRustUI_Text\",\"parent\":\"PulseRustUI\",\"update\":true,\"components\":[{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0 0\",\"offsetmin\":\"15.515 2.438\",\"offsetmax\":\"40.685 14.5\"},{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{COUNT}\",\"font\":\"RobotoCondensed-Regular.ttf\",\"fontSize\":12,\"align\":\"MiddleCenter\",\"verticalOverflow\":\"Overflow\"}]}]";
}
private static void BuildTemplates() {
_baseUITemplate = "[{" + "\"name\":\"PulseRustUI\"," + "\"parent\":\"Hud\"," + "\"components\":[" + "{\"type\":\"RectTransform\",\"anchormin\":\"0 1\",\"anchormax\":\"0 1\",\"offsetmin\":\"14.021 -46.72\",\"offsetmax\":\"121.622 -11.92\"}," + "{\"type\":\"UnityEngine.UI.RawImage\",\"url\":\"https://pulserust292.ru/AntiCheat/PulseWinter.png\"}" + "]" + "}," + "{" + "\"name\":\"PulseRustUI_Button\"," + "\"parent\":\"PulseRustUI\"," + "\"components\":[" + "{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"0 0\"}," + "{\"type\":\"UnityEngine.UI.Button\",\"command\":\"chat.say /info\",\"color\":\"0 0 0 0\"}" + "]" + "}," + "{" + "\"name\":\"PulseRustUI_Text\"," + "\"parent\":\"PulseRustUI\"," + "\"components\":[" + "{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0 0\",\"offsetmin\":\"15.515 -3.562\",\"offsetmax\":\"40.685 10.162\"}," + "{\"type\":\"UnityEngine.UI.Text\",\"text\":\"<color=#00F0F0>{COUNT}</color>\",\"font\":\"RobotoCondensed-Regular.ttf\",\"fontSize\":12,\"align\":\"MiddleCenter\",\"verticalOverflow\":\"Overflow\"}" + "]" + "}]";
_updateTemplate = "[{" + "\"name\":\"PulseRustUI_Text\"," + "\"parent\":\"PulseRustUI\"," + "\"update\":true," + "\"components\":[" + "{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"0 0\",\"offsetmin\":\"15.515 -3.562\",\"offsetmax\":\"40.685 8.5\"}," + "{\"type\":\"UnityEngine.UI.Text\",\"text\":\"<color=#00F0F0>{COUNT}</color>\",\"font\":\"RobotoCondensed-Regular.ttf\",\"fontSize\":12,\"align\":\"MiddleCenter\",\"verticalOverflow\":\"Overflow\"}" + "]" + "}]";
}
private static void CreateUI(BasePlayer? player) {
if (player?.net?.connection == null) return;
DestroyUI(player);
AddUI(player, GetBaseUIJson());
}
private static void UpdateOtherPlayers(BasePlayer excludePlayer) {
var json = GetUpdateJson();
foreach (var player in BasePlayer.activePlayerList) {
if (player?.net?.connection == null || player == excludePlayer) continue;
AddUI(player, json);
}
}
private static void UpdateAllPlayers() {
var json = GetUpdateJson();
foreach (var player in BasePlayer.activePlayerList) {
if (player?.net?.connection == null) continue;
AddUI(player, json);
}
}
private static string GetBaseUIJson() {
_sb.Clear();
_sb.Append(_baseUITemplate);
_sb.Replace("{COUNT}", (BasePlayer.activePlayerList.Count).ToString());
return _sb.ToString();
}
private static string GetUpdateJson() {
_sb.Clear();
_sb.Append(_updateTemplate);
_sb.Replace("{COUNT}", (BasePlayer.activePlayerList.Count).ToString());
return _sb.ToString();
}
private static void AddUI(BasePlayer player, string json) => CommunityEntity.ServerInstance.ClientRPC(RpcTarget.Player("AddUI", player), json);
private static void DestroyUI(BasePlayer player) => CommunityEntity.ServerInstance.ClientRPC(RpcTarget.Player("DestroyUI", player), UIName);
}