C#:
using System;
using System.Globalization;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Newtonsoft.Json;
using UnityEngine;
using System.Linq;
using System.Collections.Generic;
using Oxide.Core;
namespace Oxide.Plugins {
[Info("GrandRustPanel", "WARDEN", "1.0.4")]
public class GrandRustPanel : RustPlugin {
[PluginReference]
private Plugin ImageLibrary;
string Layer = "GRPLayer";
#region Config
private PluginConfig cfg;
public class PluginConfig {
[JsonProperty("Основные настройки")]
public Settings MainSettings = new Settings();
[JsonProperty("Сообщения")]
public MessageSettings SettingsMessages = new MessageSettings();
public class Settings {
[JsonProperty("Включить показ кнопки магазина?")]
public bool EnableStore = true;
[JsonProperty("Время обновления поля времени сервера")]
public float RefreshTimer = 10f;
}
public class MessageSettings {
[JsonProperty("Время обновления сообщений")]
public float RefreshTimer = 30f;
[JsonProperty("Размер текста для автосообщений")]
public int TextSize = 12;
[JsonProperty("Список сообщений", ObjectCreationHandling = ObjectCreationHandling.Replace)]
public List<string> Messages = new List<string> {
"<color=lime>Пример сообщения 1</color>", "<color=red>Пример сообщения 2</color>", "<color=blue>Пример сообщения 3</color>"
}
;
}
}
private void Init() {
cfg = Config.ReadObject<PluginConfig>();
Config.WriteObject(cfg);
}
protected override void LoadDefaultConfig() {
Config.WriteObject(new PluginConfig(), true);
}
#endregion
#region Hooks
private void OnServerInitialized() {
if (!plugins.Exists("ImageLibrary")) {
PrintWarning("Плагин 'ImageLibrary' не загружен, дальнейшая работа плагина невозможна!");
Interface.Oxide.UnloadPlugin("ImageLibrary");
return;
}
ImageLibrary.Call("AddImage", "https://i.imgur.com/OO5Bx07.png", "store");
ImageLibrary.Call("AddImage", "https://i.imgur.com/5I4CK1F.png", "time");
ImageLibrary.Call("AddImage", "https://i.imgur.com/OUbRw5Y.png", "players");
ImageLibrary.Call("AddImage", "https://i.imgur.com/c858A8C.png", "plane");
ImageLibrary.Call("AddImage", "https://i.imgur.com/Hj79nfP.png", "heli");
ImageLibrary.Call("AddImage", "https://i.imgur.com/ZJKbaZX.png", "ch47");
ImageLibrary.Call("AddImage", "https://i.imgur.com/5H4rcv6.png", "cargo");
ImageLibrary.Call("AddImage", "https://i.imgur.com/hjiqzkH.png", "tank");
ImageLibrary.Call("AddImage", "https://i.imgur.com/2YSxBtf.png", "plane_called");
ImageLibrary.Call("AddImage", "https://i.imgur.com/DGZVlHJ.png", "heli_called");
ImageLibrary.Call("AddImage", "https://i.imgur.com/VR8YaTR.png", "ch47_called");
ImageLibrary.Call("AddImage", "https://i.imgur.com/FOO3f9E.png", "cargo_called");
ImageLibrary.Call("AddImage", "https://i.imgur.com/vNziRyx.png", "tank_called");
InvokeHandler.Instance.InvokeRepeating(UpdateTime, cfg.MainSettings.RefreshTimer, cfg.MainSettings.RefreshTimer);
InvokeHandler.Instance.InvokeRepeating(DrawNewMessage, cfg.SettingsMessages.RefreshTimer, cfg.SettingsMessages.RefreshTimer);
foreach (var player in BasePlayer.activePlayerList) OnPlayerInit(player);
}
void Unload() {
InvokeHandler.Instance.CancelInvoke(UpdateTime);
InvokeHandler.Instance.CancelInvoke(DrawNewMessage);
foreach (var player in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(player, Layer);
CuiHelper.DestroyUi(player, "Message");
}
}
void OnEntityKill(BaseNetworkable entity) {
if (entity == null) return;
if (entity is CargoPlane || entity is BaseHelicopter || entity is CargoShip || entity is CH47Helicopter) {
var tag = entity is CargoPlane ? "plane" : entity is BradleyAPC ? "tank" : entity is BaseHelicopter ? "heli" : entity is CargoShip ? "cargo" : entity is CH47Helicopter ? "ch47" : "";
timer.Once(1f, () => {
foreach (var players in BasePlayer.activePlayerList) DrawEvents(players, tag);
}
);
}
else return;
}
private void OnPlayerInit(BasePlayer player) {
if (player.IsReceivingSnapshot) {
NextTick(() => OnPlayerInit(player));
return;
}
timer.Once(1f, () => {
foreach (var players in BasePlayer.activePlayerList) {
DrawMenu(players);
DrawMessage(players);
}
}
);
}
void OnPlayerDisconnected(BasePlayer player, string reason) {
timer.Once(1f, () => {
foreach (var players in BasePlayer.activePlayerList) DrawMenu(players);
}
);
}
void OnEntitySpawned(BaseNetworkable entity) {
if (entity == null || entity.net == null) return;
if (entity is CargoPlane) foreach (var player in BasePlayer.activePlayerList) DrawEvents(player, "plane");
if (entity is BaseHelicopter) foreach (var player in BasePlayer.activePlayerList) DrawEvents(player, "heli");
if (entity is CargoShip) foreach (var player in BasePlayer.activePlayerList) DrawEvents(player, "cargo");
if (entity is CH47Helicopter) foreach (var player in BasePlayer.activePlayerList) DrawEvents(player, "ch47");
if (entity is BradleyAPC) foreach (var player in BasePlayer.activePlayerList) DrawEvents(player, "tank");
else return;
}
#endregion
#region Custom Bools
bool HasHeli() {
foreach (var check in BaseNetworkable.serverEntities) if (check is BaseHelicopter) return true;
return false;
}
bool HasPlane() {
foreach (var check in BaseNetworkable.serverEntities) if (check is CargoPlane) return true;
return false;
}
bool HasCargo() {
foreach (var check in BaseNetworkable.serverEntities) if (check is CargoShip) return true;
return false;
}
bool HasCh47() {
foreach (var check in BaseNetworkable.serverEntities) if (check is CH47Helicopter) return true;
return false;
}
bool HasBradley() {
foreach (var check in BaseNetworkable.serverEntities) if (check is BradleyAPC) return true;
return false;
}
#endregion
#region UI
void DrawNewMessage() {
foreach (var players in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(players, "Message" + ".Message");
var container = new CuiElementContainer();
container.Add(new CuiElement {
Parent = "Message", Name = "Message" + ".Message", FadeOut = 0.1f, Components = {
new CuiTextComponent {
FadeIn = 0.1f, Text = cfg.SettingsMessages.Messages[new System.Random().Next(cfg.SettingsMessages.Messages.Count)], Align = TextAnchor.MiddleCenter, FontSize = cfg.SettingsMessages.TextSize, Font = "RobotoCondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 1", Distance = "0.5 0.5"
}
,
}
}
);
CuiHelper.AddUi(players, container);
}
}
void UpdateTime() {
foreach (var players in BasePlayer.activePlayerList) {
var time = TOD_Sky.Instance.Cycle.DateTime.ToString("HH:mm");
CuiHelper.DestroyUi(players, Layer + ".Time");
var container = new CuiElementContainer();
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Time", FadeOut = 0.1f, Components = {
new CuiTextComponent {
FadeIn = 0.1f, Text = time, Color = HexToRustFormat("#ACACACFF"), Align = TextAnchor.MiddleCenter, FontSize = 12, Font = "RobotoCondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0.1782179 0", AnchorMax = "0.3014302 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.7", Distance = "0.2 0.2"
}
,
}
}
);
CuiHelper.AddUi(players, container);
}
}
void DrawEvents(BasePlayer player, string name) {
var container = new CuiElementContainer();
if (name == "plane") {
foreach (var players in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(players, Layer + ".Plane");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Plane", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasPlane() ? (string)ImageLibrary.Call("GetImage", "plane_called") : (string)ImageLibrary.Call("GetImage", "plane")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5585056 0.02469136", AnchorMax = "0.6465144 1.012346"
}
}
}
);
}
}
if (name == "heli") {
foreach (var players in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(players, Layer + ".Heli");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Heli", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasHeli() ? (string)ImageLibrary.Call("GetImage", "heli_called") : (string)ImageLibrary.Call("GetImage", "heli")
}
, new CuiRectTransformComponent {
AnchorMin = "0.6465154 0.02469136", AnchorMax = "0.7345243 1.012346"
}
}
}
);
}
}
if (name == "ch47") {
foreach (var players in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(players, Layer + ".Ch47");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Ch47", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasCh47() ? (string)ImageLibrary.Call("GetImage", "ch47_called") : (string)ImageLibrary.Call("GetImage", "ch47")
}
, new CuiRectTransformComponent {
AnchorMin = "0.7345252 0.02469136", AnchorMax = "0.8225342 1.012346"
}
}
}
);
}
}
if (name == "cargo") {
foreach (var players in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(players, Layer + ".Cargo");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Cargo", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasCargo() ? (string)ImageLibrary.Call("GetImage", "cargo_called") : (string)ImageLibrary.Call("GetImage", "cargo")
}
, new CuiRectTransformComponent {
AnchorMin = "0.822535 0.02469136", AnchorMax = "0.910544 1.012346"
}
}
}
);
}
}
if (name == "tank") {
foreach (var players in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(players, Layer + ".Tank");
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Tank", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasBradley() ? (string)ImageLibrary.Call("GetImage", "tank_called") : (string)ImageLibrary.Call("GetImage", "tank")
}
, new CuiRectTransformComponent {
AnchorMin = "0.9127451 0.02469136", AnchorMax = "1.000754 1.012346"
}
}
}
);
}
}
CuiHelper.AddUi(player, container);
}
private void DrawMenu(BasePlayer player) {
var online = BasePlayer.activePlayerList.Count().ToString();
var time = TOD_Sky.Instance.Cycle.DateTime.ToString("HH:mm");
CuiHelper.DestroyUi(player, Layer);
var container = new CuiElementContainer();
container.Add(new CuiPanel {
Image = {
Color = HexToRustFormat("#FFFFFF00")
}
, RectTransform = {
AnchorMin = "0.001041666 0.9648147", AnchorMax = "0.001041666 0.9648147", OffsetMin = "10 -4", OffsetMax = "313 23"
}
, CursorEnabled = false,
}
, "Hud", Layer);
if (cfg.MainSettings.EnableStore) {
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Store", Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", "store")
}
, new CuiRectTransformComponent {
AnchorMin = "0.001849664 0.02469136", AnchorMax = "0.08985749 1.012346"
}
}
}
);
container.Add(new CuiButton {
Button = {
Color = "0 0 0 0", Command = "chat.say /store"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, Text = {
Text = ""
}
}
, Layer + ".Store");
}
container.Add(new CuiElement {
Parent = Layer, Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", "time")
}
, new CuiRectTransformComponent {
AnchorMin = "0.0898585 0.02469136", AnchorMax = "0.1778662 1.012346"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Time", FadeOut = 0.1f, Components = {
new CuiTextComponent {
FadeIn = 0.1f, Text = time, Color = HexToRustFormat("#ACACACFF"), Align = TextAnchor.MiddleCenter, FontSize = 12, Font = "RobotoCondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0.1782179 0", AnchorMax = "0.3014302 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.7", Distance = "0.2 0.2"
}
,
}
}
);
container.Add(new CuiElement {
Parent = Layer, Components = {
new CuiRawImageComponent {
Png = (string)ImageLibrary.Call("GetImage", "players")
}
, new CuiRectTransformComponent {
AnchorMin = "0.3032796 0.02469136", AnchorMax = "0.3912872 1.012346"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Components = {
new CuiTextComponent {
Text = online + "/" + ConVar.Server.maxplayers, Color = HexToRustFormat("#ACACACFF"), Align = TextAnchor.MiddleCenter, FontSize = 12, Font = "RobotoCondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0.3938391 0", AnchorMax = "0.5522553 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 0.7", Distance = "0.2 0.2"
}
,
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Plane", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasPlane() ? (string)ImageLibrary.Call("GetImage", "plane_called") : (string)ImageLibrary.Call("GetImage", "plane")
}
, new CuiRectTransformComponent {
AnchorMin = "0.5585056 0.02469136", AnchorMax = "0.6465144 1.012346"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Heli", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasHeli() ? (string)ImageLibrary.Call("GetImage", "heli_called") : (string)ImageLibrary.Call("GetImage", "heli")
}
, new CuiRectTransformComponent {
AnchorMin = "0.6465154 0.02469136", AnchorMax = "0.7345243 1.012346"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Ch47", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasCh47() ? (string)ImageLibrary.Call("GetImage", "ch47_called") : (string)ImageLibrary.Call("GetImage", "ch47")
}
, new CuiRectTransformComponent {
AnchorMin = "0.7345252 0.02469136", AnchorMax = "0.8225342 1.012346"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Cargo", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f , Png = HasCargo() ? (string)ImageLibrary.Call("GetImage", "cargo_called") : (string)ImageLibrary.Call("GetImage", "cargo")
}
, new CuiRectTransformComponent {
AnchorMin = "0.822535 0.02469136", AnchorMax = "0.910544 1.012346"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer, Name = Layer + ".Tank", FadeOut = 0.1f, Components = {
new CuiRawImageComponent {
FadeIn = 0.1f, Png = HasBradley() ? (string)ImageLibrary.Call("GetImage", "tank_called") : (string)ImageLibrary.Call("GetImage", "tank")
}
, new CuiRectTransformComponent {
AnchorMin = "0.9127451 0.02469136", AnchorMax = "1.000754 1.012346"
}
}
}
);
CuiHelper.AddUi(player, container);
}
void DrawMessage(BasePlayer player) {
CuiHelper.DestroyUi(player, "Message");
var container = new CuiElementContainer();
container.Add(new CuiPanel {
Image = {
Color = HexToRustFormat("#FFFFFF00")
}
, RectTransform = {
AnchorMin = "0.3453124 -0.0009259344", AnchorMax = "0.6416667 0.0287037"
}
, CursorEnabled = false,
}
, "Hud", "Message");
container.Add(new CuiElement {
Parent = "Message", Name = "Message" + ".Message", FadeOut = 0.1f, Components = {
new CuiTextComponent {
FadeIn = 0.1f, Text = cfg.SettingsMessages.Messages[new System.Random().Next(cfg.SettingsMessages.Messages.Count)], Align = TextAnchor.MiddleCenter, FontSize = cfg.SettingsMessages.TextSize, Font = "RobotoCondensed-bold.ttf"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "1 1"
}
, new CuiOutlineComponent {
Color = "0 0 0 1", Distance = "0.5 0.5"
}
,
}
}
);
CuiHelper.AddUi(player, container);
}
#endregion
#region Helpers
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);
throw new InvalidOperationException("Cannot convert a wrong format.");
}
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 string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
}
#endregion
}
}