using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("IQMenu", "Mercury", "0.0.4")]
[Description("Ясно клоун")]
class IQMenu : RustPlugin
{
///Фикс гуи
///Добавлена возможность отключить показ онлайна в панеле (Настроить в конфиге)
///Фикс 2 ероров
///Это было очень легко!
#region Reference
[PluginReference] Plugin ImageLibrary, IQFakeActive;
private string GetImage(string fileName, ulong skin = 0)
{
try
{
var imageId = (string)ImageLibrary.CallHook("GetImage", fileName, skin);
if (!string.IsNullOrEmpty(imageId))
return imageId;
}
catch (Exception ex) { }
return string.Empty;
}
public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);
void SyncReservedFinish()
{
if (!config.UseIQFakeActive) return;
PrintWarning("IQMenu - успешно синхронизирована с IQFakeActive");
PrintWarning("=============SYNC==================");
}
#endregion
#region Vars
public List<ulong> PlayerOpenMenu = new List<ulong>();
#endregion
#region Configuration
private static Configuration config = new Configuration();
private class Configuration
{
[JsonProperty("Настройка меню")] public List<MenuClass> MenuSettings = new List<MenuClass>();
[JsonProperty("Иконка для главного меню")] public string UrlMenu;
[JsonProperty("Название сервера для главного меню")] public string ServerName;
[JsonProperty("Название кнопки главного меню")] public string ButtonName;
[JsonProperty("Настройка броадкаста")] public List<string> BroadCastList = new List<string>();
[JsonProperty("Поддержка IQFakeActive")] public bool UseIQFakeActive;
[JsonProperty("Показывать онлайн в панеле?")] public bool UseOnlineInMenu;
internal class MenuClass
{
[JsonProperty("Иконка для кнопки")] public string URLIco;
[JsonProperty("Название для кнопки")] public string DisplayName;
[JsonProperty("Команда для кнопки")] public string Command;
}
public static Configuration GetNewConfiguration()
{
return new Configuration
{
ServerName = "<b><size=26>СУПЕР <color=#85C84F>СЕРВЕР</color> | MAX 3</size></b>",
ButtonName = "<b><size=18>МЕНЮ</size></b>",
UrlMenu = "https://i.imgur.com/chc6Jfs.png",
UseIQFakeActive = false,
UseOnlineInMenu = true,
MenuSettings = new List<MenuClass>
{
new MenuClass
{
DisplayName = "Магазин",
URLIco = "https://i.imgur.com/Us7eiTz.png",
Command = "UI_GameStoresRUST"
},
new MenuClass
{
DisplayName = "Ваша кастом кнопка",
URLIco = "https://i.imgur.com/QaueVCY.png",
Command = "chat.say /craft",
},
new MenuClass
{
DisplayName = "Еще одна кнопка",
URLIco = "https://i.imgur.com/zfM6hpw.png",
Command = "chat.say /report",
},
},
BroadCastList = new List<string>
{
"<b>Тестовое оповещение - <color=#3B85F5FF>Цвет</color></b>",
"<b>Тестовое оповещение - <color=#3B85F5FF>Цвет</color></b>",
"<b>Тестовое оповещение - <color=#3B85F5FF>Цвет</color></b>",
"<b>Тестовое оповещение - <color=#3B85F5FF>Цвет</color></b>",
"<b>Тестовое оповещение - <color=#3B85F5FF>Цвет</color></b>",
}
};
}
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
config = Config.ReadObject<Configuration>();
if (config == null) LoadDefaultConfig();
}
catch
{
PrintWarning($"Ошибка чтения #57 конфигурации 'oxide/config/{Name}', создаём новую конфигурацию!!");
LoadDefaultConfig();
}
NextTick(SaveConfig);
}
protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
protected override void SaveConfig() => Config.WriteObject(config);
#endregion
#region Interface
private void OnServerInitializedd()
{
foreach (string font in Font.GetPathsToOSFonts())
{
//Puts(font);
FONT = font;
}
}
public static string MENU_PARENT = "MENU_PARENT_LAYER";
public static string DROP_MENU_PANEL = "DROP_MENU_LAYER";
public static string BROADCAST_PARENT = "BROADCAST_PARENT_LAYER";
public static string FONT = "YuGothR.ttc";
void InterfaceMenu(BasePlayer player)
{
if (!player.IsConnected) return;
new Thread(new ThreadStart(delegate
{
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, MENU_PARENT);
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = "0 -60", OffsetMax = "300 0" },
Image = { Color = "0 0 0 0" }
}, "Hud.Menu", MENU_PARENT);
container.Add(new CuiElement
{
Parent = MENU_PARENT,
Components =
{
new CuiRawImageComponent { Png = GetImage(config.ButtonName) },
new CuiRectTransformComponent{ AnchorMin = $"0.2 0.08484989", AnchorMax = $"0.2888888 0.4727159" },
}
});
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.02 0.4787878", AnchorMax = "1 1" },
Text = { Text = config.ServerName, Font = FONT, Align = TextAnchor.MiddleLeft, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT);
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "0.2022330 0.5515152" },
Button = { Command = $"pmenu open", Color = "0 0 0 0" },
Text = { Text = config.ButtonName, Color = HexToRustFormat("#FFFFFF8B"), Align = TextAnchor.MiddleCenter, Font = FONT }
}, MENU_PARENT);
if (config.UseOnlineInMenu)
{
int Online = BasePlayer.activePlayerList.Count;
if (ConVar.Admin.ServerInfo().Joining > 0)
{
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.242223 0", AnchorMax = "0.5311111 0.5515152" },
Text = { Text = $"<b><size=14>Онлайн</size></b>\n<b><size=12>{Online}+({ConVar.Admin.ServerInfo().Joining})</size></b>", Font = FONT, Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT, "ONLINE_TEXT");
}
else
{
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.242223 0", AnchorMax = "0.5311111 0.5515152" },
Text = { Text = $"<b><size=14>Онлайн</size></b>\n<b><size=12>{Online}</size></b>", Font = FONT, Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT, "ONLINE_TEXT");
}
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.442223330 0", AnchorMax = "0.7311159 0.5515152" },
Text = { Text = $"<b><size=14>Спящих</size></b>\n<b><size=12>{BasePlayer.sleepingPlayerList.Count}</size></b>", Font = FONT, Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT, "OFLINE_TEXT");
}
CuiHelper.AddUi(player, container);
})).Start();
}
void UpdateOnlineLabel()
{
timer.Every(5f, () =>
{
int Online = BasePlayer.activePlayerList.Count;
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++)
{
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, "ONLINE_TEXT");
CuiHelper.DestroyUi(player, "OFLINE_TEXT");
CuiElementContainer container = new CuiElementContainer();
if (ConVar.Admin.ServerInfo().Joining > 0)
{
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.242223 0", AnchorMax = "0.5311111 0.5515152" },
Text = { Text = $"<b><size=14>Онлайн</size></b>\n<b><size=12>{Online}+({ConVar.Admin.ServerInfo().Joining})</size></b>", Font = FONT, Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT, "ONLINE_TEXT");
}
else
{
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.242223 0", AnchorMax = "0.5311111 0.5515152" },
Text = { Text = $"<b><size=14>Онлайн</size></b>\n<b><size=12>{Online}</size></b>", Font = FONT, Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT, "ONLINE_TEXT");
}
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0.442223330 0", AnchorMax = "0.7311159 0.5515152" },
Text = { Text = $"<b><size=14>Спящих</size></b>\n<b><size=12>{BasePlayer.sleepingPlayerList.Count}</size></b>", Font = FONT, Align = TextAnchor.UpperCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, MENU_PARENT, "OFLINE_TEXT");
CuiHelper.AddUi(player, container);
if (IsOpenMenu(player))
{
CuiHelper.DestroyUi(player, DROP_MENU_PANEL);
PlayerOpenMenu.Remove(player.userID);
}
}
});
}
void BroadCast()
{
timer.Every(120f, () =>
{
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++)
{
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, BROADCAST_PARENT);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiLabel
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "300 20" },
Text = { Text = $"{config.BroadCastList[UnityEngine.Random.Range(0, config.BroadCastList.Count)]}", Font = FONT, Align = TextAnchor.MiddleCenter, Color = HexToRustFormat("#FFFFFF8B") }
}, "Overlay", BROADCAST_PARENT);
CuiHelper.AddUi(player, container);
}
});
}
void DropListMenu(BasePlayer player)
{
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, DROP_MENU_PANEL);
container.Add(new CuiPanel
{
FadeOut = 0.1f,
RectTransform = { AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = $"0 -550", OffsetMax = "200 -60" },
Image = { FadeIn = 0.1f, Color = "0 0 0 0" }
}, MENU_PARENT, DROP_MENU_PANEL);
for (int i = 0; i < config.MenuSettings.Count; i++)
{
var cfg = config.MenuSettings[i];
container.Add(new CuiElement
{
Parent = DROP_MENU_PANEL,
Components =
{
new CuiRawImageComponent { Png = GetImage(cfg.DisplayName) },
new CuiRectTransformComponent{ AnchorMin = $"0.02 {0.95 - (i * 0.06)}", AnchorMax = $"0.14 {0.995 - (i * 0.06)}" },
}
});
container.Add(new CuiButton
{
RectTransform = { AnchorMin = $"0.18 {0.95 - (i * 0.06)}", AnchorMax = $"1 {0.99 - (i * 0.06)}" },
Button = { Command = $"{cfg.Command}", Color = "0 0 0 0" },
Text = { Text = cfg.DisplayName, Color = HexToRustFormat("#FFFFFFFF"), Align = TextAnchor.MiddleLeft , Font = FONT }
}, DROP_MENU_PANEL);
}
CuiHelper.AddUi(player, container);
}
#endregion
#region Hooks
private void OnServerInitialized()
{
OnServerInitializedd();
ImageLibrary = plugins.Find("ImageLibrary");
if (ImageLibrary == null)
{
PrintError("[ImageLibrary] not found! Plugin is disabled!");
Interface.Oxide.UnloadPlugin(Title);
return;
}
LoadImage();
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++)
{
var player = BasePlayer.activePlayerList[i];
InterfaceMenu(player);
}
if (config.BroadCastList.Count > 0)
BroadCast();
if(config.UseOnlineInMenu)
UpdateOnlineLabel();
}
void OnPlayerConnected(BasePlayer player)
{
InterfaceMenu(player);
}
void Unload()
{
for (int i = 0; i < BasePlayer.activePlayerList.Count; i++)
{
var player = BasePlayer.activePlayerList[i];
CuiHelper.DestroyUi(player, BROADCAST_PARENT);
CuiHelper.DestroyUi(player, DROP_MENU_PANEL);
CuiHelper.DestroyUi(player, MENU_PARENT);
}
}
#endregion
#region Command
[ConsoleCommand("pmenu")]
void PerMentCommand(ConsoleSystem.Arg arg)
{
var player = arg.Player();
switch (arg.Args[0])
{
case "open":
{
if (IsOpenMenu(player))
{
CuiHelper.DestroyUi(player, DROP_MENU_PANEL);
PlayerOpenMenu.Remove(player.userID);
}
else
{
DropListMenu(player);
PlayerOpenMenu.Add(player.userID);
}
break;
}
}
}
#endregion
#region Metods
void LoadImage()
{
try { AddImage(config.UrlMenu, config.ButtonName); } catch (Exception e) { }
for (int i = 0; i < config.MenuSettings.Count; i++)
try { AddImage(config.MenuSettings[i].URLIco, config.MenuSettings[i].DisplayName); } catch (Exception e) { }
}
bool IsOpenMenu(BasePlayer player)
{
if (PlayerOpenMenu.Contains(player.userID)) return true;
else return false;
}
#endregion
#region Utilites
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);
UnityEngine.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
}
}