C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using Newtonsoft.Json;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("MicroPanel", "Server-rust.ru", "1.2.0")]
[Description("Server-rust.ru")]
public class MicroPanel : RustPlugin
{
private void OnServerInitialized()
{
foreach (var baseEntity in BaseEntity.saveList)
{
if (baseEntity is BaseHelicopter)
IsHeli = true;
if (baseEntity is BradleyAPC)
isTank = true;
if (baseEntity is CargoPlane)
IsAir = true;
if (baseEntity is CargoShip)
IsCargo = true;
}
AddImage("https://i.ibb.co/cXNqzNd/1.png", "heli");
AddImage("https://i.ibb.co/pLg31pD/2.png", "bradley");
AddImage("https://i.ibb.co/02pf3wR/3.png", "air");
AddImage("https://i.ibb.co/pLg31pD/4.png", "cargp");
AddImage(cfg.icon, "lyble");
foreach (var basePlayer in BasePlayer.activePlayerList)
OnPlayerConnected(basePlayer);
}
private void OnUserDisconnected(IPlayer player)
{
foreach (var basePlayer in BasePlayer.activePlayerList)
OnlinePlayer(basePlayer);
}
private void OnPlayerConnected(BasePlayer player)
{
timer.Once(1f, () => StartUi(player));
foreach (var basePlayer in BasePlayer.activePlayerList)
OnlinePlayer(basePlayer);
}
private void Unload()
{
foreach (var basePlayer in BasePlayer.activePlayerList)
CuiHelper.DestroyUi(basePlayer, Layer);
}
#region Cfg
private static ConfigData cfg { get; set; }
private class ConfigData
{
[JsonProperty("Лейбел")] public string ServerName = "<b>RUST_102RU</b>";
[JsonProperty("Ссылка на картинку иконки")] public string icon = "https://imgur.com/07zYtds.png";
[JsonProperty("Включен ивент цвет")] public string coloron = "0.00 1.00 0.98 1.00";
[JsonProperty("Выключен ивент цвет")] public string coloroff = "0.45 0.45 0.45 0.86";
[JsonProperty("Кнопки")] public List<Buttons> buttonList = new List<Buttons>();
public static ConfigData GetNewConf()
{
var newConfig = new ConfigData
{
buttonList = new List<Buttons>()
{
new Buttons()
{
Commnad = "chat.say /store",
Name = "МАГАЗИН",
}
}
};
return newConfig;
}
}
internal class Buttons
{
public string Commnad;
public string Name;
}
protected override void LoadDefaultConfig()
{
cfg = ConfigData.GetNewConf();
}
protected override void SaveConfig()
{
Config.WriteObject(cfg);
}
protected override void LoadConfig()
{
base.LoadConfig(); try { cfg = Config.ReadObject<ConfigData>(); }catch { LoadDefaultConfig(); } NextTick(SaveConfig);
}
#endregion
private string Layer = "MicroPanelByLAGZYA";
private readonly List<ulong> listPlayer = new List<ulong>();
private CuiButton _menuButtons = new CuiButton()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.75069132 0.7090913"},
Button = {Color = "0.88 0.01 0.58 1.00", Command = "Ui_MicroPanel menu", Sprite = "assets/icons/gear.png"},
Text = {Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", Color = "0.86 0.86 0.86 1", FontSize = 10}
};
private CuiButton _menuButton = new CuiButton()
{
RectTransform = {AnchorMin = "0.04962963 0.04962971", AnchorMax = "0.18 0.377037"},
Button = {Color = "0.88 0.01 0.58 1.00", Command = "Ui_MicroPanel menu", Sprite = "assets/icons/circle_open.png"},
Text = {Text = "", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", Color = "1 1 1 1", FontSize = 10}
};
private CuiPanel _mainPanel = new CuiPanel()
{
RectTransform = {AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = "0 -90", OffsetMax = "225 0"},
Image = {Color = "0 0 0 0"}
};
object OnPlayerSleep(BasePlayer player)
{
OnPlayerSleepEnded(null);
return null;
}
void OnPlayerSleepEnded(BasePlayer player)
{
timer.Once(0.1f, (() =>
{
foreach (var basePlayer in BasePlayer.activePlayerList)
OnlinePlayer(basePlayer);
}));
}
void OnEntitySpawned(BaseNetworkable entity)
{
if (entity is BaseHelicopter)
{
IsHeli = true;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "heli");
}
if (entity is BradleyAPC)
{
isTank = true;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "bradley");
}
if (entity is CargoPlane)
{
IsAir = true;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "air");
}
if (entity is CargoShip)
{
IsCargo = true;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "cargo");
}
}
void OnEntityKill(BaseNetworkable entity)
{
if (entity is CargoPlane)
{
IsAir = true;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "air");
}
if (entity is CargoShip)
{
IsCargo = false;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "cargo");
}
if (entity is BaseHelicopter)
{
IsHeli = false;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "heli");
}
if (entity is BradleyAPC)
{
isTank = false;
foreach (var basePlayer in BasePlayer.activePlayerList)
EventInit(basePlayer, "bradley");
}
}
private void OnlinePlayer(BasePlayer player)
{
CuiHelper.DestroyUi(player, Layer + "Online");
CuiHelper.DestroyUi(player, Layer + "Sleep");
var cont = new CuiElementContainer();
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "0 0", AnchorMax = "1 1"},
Button = { Command = "", Color = "0.15 0.86 0.1 0"},
Text = {Text = $"{BasePlayer.activePlayerList.Count}/{ConVar.Server.maxplayers}", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 10}
}, Layer + "Onlinefon", Layer + "Online");
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "0 0", AnchorMax = "1 1"},
Button = { Command = "", Color = "0.25 0.86 0.86 0"},
Text = {Text = $"{BasePlayer.sleepingPlayerList.Count}", Align = TextAnchor.MiddleCenter, Font = "robotocondensed-regular.ttf", FontSize = 10}
}, Layer + "SleepFon", Layer + "Sleep");
CuiHelper.AddUi(player, cont);
}
private bool IsAir, IsHeli, isTank, IsCargo;
private void EventInit(BasePlayer player, string type)
{
var cont = new CuiElementContainer();
switch (type)
{
case "air":
CuiHelper.DestroyUi(player, Layer + "Air");
if(IsAir)
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "0.8165272 0.5999999", AnchorMax = "0.9688864 0.977778"},
Button =
{
Command = "", Color = cfg.coloron, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Air");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloron, Png = GetImage("air")},
}, Layer + "Air");
}
else
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "0.8165272 0.5999999", AnchorMax = "0.9688864 0.977778"},
Button =
{
Command = "", Color = cfg.coloroff, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Air");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloroff, Png = GetImage("air")},
}, Layer + "Air");
}
CuiHelper.AddUi(player, cont);
break;
case "heli":
CuiHelper.DestroyUi(player, Layer + "Heli");
if(IsHeli)
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "0.9943045 0.5999999", AnchorMax = "1.146664 0.977778"},
Button =
{
Command = "", Color = cfg.coloron, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Heli");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloron, Png = GetImage("heli")},
}, Layer + "Heli");
}
else
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "0.9943045 0.5999999", AnchorMax = "1.146664 0.977778"},
Button =
{
Command = "", Color = cfg.coloroff, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Heli");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloroff, Png = GetImage("heli")},
},Layer + "Heli");
}
CuiHelper.AddUi(player, cont);
break;
case "bradley":
CuiHelper.DestroyUi(player, Layer + "Bradley");
if(isTank)
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "1.175045 0.5999999", AnchorMax = "1.327404 0.977778"},
Button =
{
Command = "", Color = cfg.coloron, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Bradley");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloron, Png = GetImage("bradley")},
},Layer + "Bradley");
}
else
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "1.175045 0.5999999", AnchorMax = "1.327404 0.977778"},
Button =
{
Command = "", Color = cfg.coloroff, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Bradley");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloroff, Png = GetImage("bradley")},
},Layer + "Bradley");
}
CuiHelper.AddUi(player, cont);
break;
case "cargo":
CuiHelper.DestroyUi(player, Layer + "Cargo");
if(IsCargo)
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "1.355785 0.5999999", AnchorMax = "1.508144 0.977778"},
Button =
{
Command = "", Color = cfg.coloron, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Cargo");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloron, Png = GetImage("cargo")},
},Layer + "Cargo");
}
else
{
cont.Add(new CuiButton()
{
RectTransform = {AnchorMin = "1.355785 0.5999999", AnchorMax = "1.508144 0.977778"},
Button =
{
Command = "", Color = cfg.coloroff, Sprite = "assets/icons/circle_open.png"
},
Text = {Text = $"",}
}, Layer, Layer + "Cargo");
cont.Add(new CuiPanel()
{
RectTransform = {AnchorMin = "0.2241479 0.2363638", AnchorMax = "0.7069132 0.7090913"},
Image = {Color = cfg.coloroff, Png = GetImage("cargo")},
},Layer + "Cargo");
}
CuiHelper.AddUi(player, cont);
break;
}
}
private void StartUi(BasePlayer player)
{
var cont = new CuiElementContainer();
cont.Add(_mainPanel, "Overlay", Layer);
cont.Add(new CuiElement()
{
Parent = Layer,
Components =
{
new CuiTextComponent(){Text = cfg.ServerName, Align = TextAnchor.UpperLeft, Font = "robotocondensed-regular.ttf"},
new CuiRectTransformComponent(){AnchorMin = "0.2476391 0.6740742", AnchorMax = "0.7851852 0.8740749"}
}
});
cont.Add(new CuiElement()
{
Parent = Layer,
Name = Layer + "Onlinefon",
Components =
{
new CuiImageComponent(){Color = "0.34 0.34 0.34 0.25"},
new CuiRectTransformComponent(){AnchorMin = "0.2518518 0.5481482", AnchorMax = "0.4533333 0.6592584"}
}
});
cont.Add(new CuiElement()
{
Parent = Layer,
Name = Layer + "SleepFon",
Components =
{
new CuiImageComponent(){Color = "0.34 0.34 0.34 0.25"},
new CuiRectTransformComponent(){AnchorMin = "0.474075 0.5481482", AnchorMax = "0.6755549 0.6592584"}
}
});
cont.Add(new CuiElement()
{
Parent = Layer + "Onlinefon",
Components =
{
new CuiImageComponent(){Color = "0.00 1.00 0.98 1.00", Sprite = "assets/icons/circle_closed_toedge.png"},
new CuiRectTransformComponent(){AnchorMin = "0.1 0.35", AnchorMax = "0.15 0.65"}
}
});
cont.Add(new CuiElement()
{
Parent = Layer + "SleepFon",
Components =
{
new CuiImageComponent(){Color = "0.34 0.34 0.34 1", Sprite = "assets/icons/circle_closed_toedge.png"},
new CuiRectTransformComponent(){AnchorMin = "0.1 0.35", AnchorMax = "0.15 0.65"}
}
});
cont.Add(_menuButton, Layer, Layer + "Button");
cont.Add(_menuButtons, Layer + "Button");
cont.Add(new CuiElement()
{
Parent = Layer,
Components =
{
new CuiRawImageComponent(){Png = GetImage("lyble")},
new CuiRectTransformComponent(){AnchorMin = "0.002962894 0.4666666", AnchorMax = "0.237037 0.9925921"}
}
});
CuiHelper.AddUi(player, cont);
OnlinePlayer(player);
EventInit(player, "air");
EventInit(player, "heli");
EventInit(player, "cargo");
EventInit(player, "bradley");
}
[ConsoleCommand("Ui_MicroPanel")]
private void CommandUi(ConsoleSystem.Arg arg)
{
if(arg?.Player() == null) return;
if (arg.Args[0] == "menu")
{
if (!listPlayer.Contains(arg.Player().userID))
{
listPlayer.Add(arg.Player().userID);
MenuUpdate(arg.Player(), "menu");
}
else
{
listPlayer.Remove(arg.Player().userID);
CuiHelper.DestroyUi(arg.Player(), Layer + "Mouse");
foreach (var buttonse in cfg.buttonList)
CuiHelper.DestroyUi(arg.Player(), Layer + "Mouse" + buttonse.Name);
}
}
}
private void MenuUpdate(BasePlayer player, string type)
{
var cont = new CuiElementContainer();
float i = 0;
switch (type)
{
case "menu":
cont.Add(new CuiPanel()
{
CursorEnabled = true,
RectTransform = {AnchorMin = "0 0", AnchorMax = "1 1"},
Image = {Color = "0 0 0 0"}
}, Layer + "Button", Layer + "Mouse");
foreach (var check in cfg.buttonList)
{
cont.Add(new CuiElement
{
Parent = Layer,
Name = Layer + "Mouse" + check.Name,
Components =
{
new CuiImageComponent
{
Color = "1 0.32 0.32 1", Sprite = "assets/icons/circle_closed_toedge.png"
},
new CuiRectTransformComponent
{
AnchorMin = $"0.1155556 {-0.1555557- i}", AnchorMax = $"0.1274074 {-0.1259255 - i}"
}
}
});
cont.Add(new CuiElement
{
Parent = Layer + "Mouse" + check.Name,
Components =
{
new CuiTextComponent(){Text = check.Name, Align = TextAnchor.MiddleLeft, Font = "robotocondensed-regular.ttf"},
new CuiRectTransformComponent
{
AnchorMin = $"2.299999 -3.499928", AnchorMax = $"52.99999 3.499928"
}
}
});
cont.Add(
new CuiButton
{
RectTransform = {AnchorMin = "0 -3.499928", AnchorMax = $"52.99999 3.499928"},
Button = {Command = check.Commnad, Color = "0 0 0 0"},
Text = {Text = ""}
},
Layer + "Mouse" + check.Name);
i += 0.3240007f;
}
CuiHelper.AddUi(player, cont);
break;
}
}
#region [Help]
private string GetImage(string shortname, ulong skin = 0) =>
(string) ImageLibrary.Call("GetImage", shortname, skin);
private bool AddImage(string url, string shortname, ulong skin = 0) =>
(bool) ImageLibrary.Call("AddImage", url, shortname, skin);
[PluginReference] private Plugin ImageLibrary;
private static string HexToRustFormat(string hex)
{
if (string.IsNullOrEmpty(hex)) hex = "#FFFFFFFF";
var str = hex.Trim('#');
if (str.Length == 6) str += "FF";
if (str.Length != 8)
{
throw new Exception(hex);
}
var r = byte.Parse(str.Substring(0, 2), NumberStyles.HexNumber);
var g = byte.Parse(str.Substring(2, 2), NumberStyles.HexNumber);
var b = byte.Parse(str.Substring(4, 2), NumberStyles.HexNumber);
var a = byte.Parse(str.Substring(6, 2), NumberStyles.HexNumber);
Color color = new Color32(r, g, b, a);
return $"{color.r:F2} {color.g:F2} {color.b:F2} {color.a:F2}";
}
#endregion
}
}