C#:
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Multi Menu", "MYSTERY", "0.0.1")]
[Description("")]
class MultiMenu : RustPlugin
{
[PluginReference] private Plugin ImageLibrary;
public static string LOGOa = "UI_a";
public static string LOGOb = "UI_b";
private static string Poi = "UI_P";
private static string Internal = "MYSTERY";
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["1"] = "Wipe calendar",
["2"] = "Report",
["3"] = "Statistics",
["Online"] = "<color=#B0F394FF>Time:</color> {0} || <color=#B0F394FF>Players online:</color> {1}",
}, this);
lang.RegisterMessages(new Dictionary<string, string>
{
["1"] = "Календарь вайпов",
["2"] = "Report",
["3"] = "Статистика",
["Online"] = "<color=#B0F394FF>Время:</color> {0} || <color=#B0F394FF>Игроков онлайн:</color> {1}",
}, this, "ru");
lang.RegisterMessages(new Dictionary<string, string>
{
["1"] = "Календар вайпів",
["2"] = "Report",
["3"] = "Статистика",
["Online"] = "<color=#B0F394FF>Час:</color> {0} || <color=#B0F394FF>Гравців онлайн:</color> {1}",
}, this, "uk");
}
private string Msg(string key, string userid = null, params object[] obj)
{
return string.Format(lang.GetMessage(key, this, userid), obj);
}
// Msg("Modal tryopen", player.UserIDString, Case.DisplayName),
private void OnServerInitialized()
{
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
PrintWarning($" {Name} v{Version} loading");
if (!ImageLibrary)
{
PrintError(" Install plugin: 'ImageLibrary'");
Core.Interface.Oxide.UnloadPlugin(Name);
PrintWarning(" Plugin loaded - ERROR");
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
return;
}
PrintWarning(" Plugin loaded - OK");
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
ImageLibrary.Call("AddImage", "https://rustplugins.top/api/RSystem/online.png", "Logoa");
ImageLibrary.Call("AddImage", "https://rustplugins.top/api/RSystem/Menu.png", "Logob");
ImageLibrary.Call("AddImage", "https://rustplugins.top/api/RSystem/active.png", "ac");
ImageLibrary.Call("AddImage", "https://rustplugins.top/api/RSystem/not.png", "noac");
BasePlayer.activePlayerList.ToList().ForEach(OnPlayerConnected);
timer.Every(Settings.TIME, () =>
{
BasePlayer.activePlayerList.ToList().ForEach(logoA);
});
}
private void Unload()
{
BasePlayer.activePlayerList.ToList().ForEach(p =>
{
CuiHelper.DestroyUi(p, LOGOa);
CuiHelper.DestroyUi(p, LOGOb);
CuiHelper.DestroyUi(p, Poi);
CuiHelper.DestroyUi(p, Internal);
});
}
private void OnPlayerConnected(BasePlayer player)
{
logoA(player);
logoB(player);
}
private void OnPlayerDisconnected(BasePlayer p)
{
CuiHelper.DestroyUi(p, LOGOa);
CuiHelper.DestroyUi(p, LOGOb);
CuiHelper.DestroyUi(p, Poi);
CuiHelper.DestroyUi(p, Internal);
}
void logoA(BasePlayer player)
{
CuiHelper.DestroyUi(player, LOGOa);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.836 0", AnchorMax = "0.9876 0.02", OffsetMax = "0 0" },
Image = { Color = "0.25 0.50 0.50 0" },
}, "Overlay", LOGOa);
container.Add(new CuiElement
{
Parent = LOGOa,
Name = LOGOa + "t",
Components =
{
new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "Logoa")},
new CuiRectTransformComponent{ AnchorMin = "0 0", AnchorMax = "1 1" },
}
});
var text = Msg("Online", player.UserIDString, covalence.Server.Time.ToShortTimeString(), BasePlayer.activePlayerList.ToList().Count);
container.Add(new CuiElement
{
Parent = LOGOa + "t",
Components =
{
new CuiTextComponent {Text = text, Align = TextAnchor.MiddleCenter, FontSize = 10},
new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1" },
new CuiOutlineComponent { Color = "0 0 0 1", Distance = "1 1" }
}
});
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
Button = { Command = "menu open", Color = "1.00 0.00 0.00 0" },
Text = { Text = "", FontSize = 50, Align = TextAnchor.MiddleCenter }
}, LOGOa);
CuiHelper.AddUi(player, container);
}
void logoB(BasePlayer player)
{
CuiElementContainer container = new CuiElementContainer();
CuiHelper.DestroyUi(player, LOGOb);
CuiHelper.DestroyUi(player, Internal);
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0.1 0.1", AnchorMax = "0.9 0.9", OffsetMax = "0 0" },
Image = { Color = "0.25 0.50 0.50 0" },
}, "Overlay", LOGOb);
container.Add(new CuiElement
{
Parent = LOGOb,
Components =
{
new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", "Logob")},
new CuiRectTransformComponent{ AnchorMin = "0 0", AnchorMax = "1 1" },
}
});
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.008 0.012", AnchorMax = "0.15 0.75", OffsetMax = "0 0" },
Image = { Color = "1.00 0.50 0.25 0" },
}, LOGOb, Poi);
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.16 0.012", AnchorMax = "0.995 0.9", OffsetMax = "0 0" },
Image = { Color = "1.00 0.50 0.25 0", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" },
}, LOGOb, Internal);
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.16 0.91", AnchorMax = "1 0.99", OffsetMax = "0 0" },
Image = { Color = "1.00 0.50 0.25 0" },
}, LOGOb, LOGOb + "w");
int playersG = 1;
int playersS = 2;
float playersR =3;
int playersP = 4;
container.Add(new CuiElement
{
Parent = LOGOb + "w",
Components =
{
new CuiTextComponent {Text = $"X{playersR}", Align = TextAnchor.MiddleRight, FontSize = 12, Color = "0.72 0.83 0.71 1.00"},
new CuiRectTransformComponent { AnchorMin = "0.06 0.1", AnchorMax = "0.145 0.9" },
new CuiOutlineComponent { Color = "0.90 0.66 0.64 0.5", Distance = "0.1 0.1" }
}
});
container.Add(new CuiElement
{
Parent = LOGOb + "w",
Components =
{
new CuiTextComponent {Text = $"{playersP}", Align = TextAnchor.MiddleRight, FontSize = 12, Color = "0.72 0.83 0.71 1.00"},
new CuiRectTransformComponent { AnchorMin = "0.21 0.1", AnchorMax = "0.295 0.9" },
new CuiOutlineComponent { Color = "0.90 0.66 0.64 0.5", Distance = "0.1 0.1" }
}
});
container.Add(new CuiElement
{
Parent = LOGOb + "w",
Components =
{
new CuiTextComponent {Text = $"{playersG}", Align = TextAnchor.MiddleRight, FontSize = 12, Color = "0.72 0.83 0.71 1.00"},
new CuiRectTransformComponent { AnchorMin = "0.36 0.1", AnchorMax = "0.43 0.9" },
new CuiOutlineComponent { Color = "0.90 0.66 0.64 0.5", Distance = "0.1 0.1" }
}
});
container.Add(new CuiElement
{
Parent = LOGOb + "w",
Components =
{
new CuiTextComponent {Text = $"{playersS}", Align = TextAnchor.MiddleRight, FontSize = 12, Color = "0.72 0.83 0.71 1.00"},
new CuiRectTransformComponent { AnchorMin = "0.51 0.1", AnchorMax = "0.587 0.9" },
new CuiOutlineComponent { Color = "0.90 0.66 0.64 0.5", Distance = "0.1 0.1" }
}
});
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0.93 0.01", AnchorMax = "0.99 0.99" },
Button = { Command = "menu close", Color = "1.00 0.00 0.00 0" },
Text = { Text = "", FontSize = 50, Align = TextAnchor.MiddleCenter }
}, LOGOb + "w");
CuiHelper.AddUi(player, container);
DrawPoints(player);
}
private void DrawPoints(BasePlayer player, MenuPoint choosed = null)
{
CuiElementContainer container = new CuiElementContainer();
float marginTop = -2;
float originalHeight = 35;
float freeHeight = 35;
float padding = 0;
foreach (var point in Settings.Points)
{
CuiHelper.DestroyUi(player, Poi + Settings.Points.IndexOf(point));
string color = point == choosed ? "1.00 0.53 0.53 0.5" : "0.86 0.77 0.67 0.5";
string color1 = point == choosed ? "0.84 0.17 0.37 0" : "1 1 1 0";
string img = point == choosed ? (string)ImageLibrary.Call("GetImage", "ac") : (string)ImageLibrary.Call("GetImage", "noac");
float elementHeight = point.DisplayName.Length > 0 ? originalHeight : freeHeight;
container.Add(new CuiElement
{
Parent = Poi,
Name = Poi + Settings.Points.IndexOf(point),
Components =
{
new CuiRawImageComponent { Png = img},
new CuiRectTransformComponent{ AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = $"0 {marginTop - elementHeight}", OffsetMax = $"150 {marginTop}" },
}
});
container.Add(new CuiElement
{
Parent = Poi + Settings.Points.IndexOf(point),
Components =
{
new CuiTextComponent {Color = color,Text = Msg(point.DisplayName,player.UserIDString), Align = TextAnchor.MiddleLeft, FontSize = 12},
new CuiRectTransformComponent { AnchorMin = "0.3 0", AnchorMax = "1 1" },
new CuiOutlineComponent { Color = "0 0 0 1", Distance = "1 1" }
}
});
container.Add(new CuiButton
{
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" },
Button = { Command = $"menu choose {Settings.Points.IndexOf(point)}", Color = color1 },
Text = { Text = "", Align = TextAnchor.MiddleLeft, Font = "robotocondensed-bold.ttf", FontSize = 20, Color = color }
}, Poi + Settings.Points.IndexOf(point));
marginTop -= elementHeight + padding;
}
CuiHelper.AddUi(player, container);
}
[ChatCommand("menu")]
private void CmdChatStore(BasePlayer player, string command, string[] args)
{
logoB(player);
}
[ConsoleCommand("menu")]
private void CmdConsoleRustMenu(ConsoleSystem.Arg args)
{
var player = args.Player();
if (player == null || !args.HasArgs(1)) return;
switch (args.Args[0].ToLower())
{
case "open":
{
logoB(player);
break;
}
case "close":
{
CuiHelper.DestroyUi(player, LOGOb);
CuiHelper.DestroyUi(player, Poi);
CuiHelper.DestroyUi(player, Internal);
break;
}
case "choose":
{
int chooseIndex = -1;
if (!int.TryParse(args.Args[1], out chooseIndex)) return;
var chooseElement = Settings.Points.ElementAtOrDefault(chooseIndex);
if (chooseElement == null) return;
CuiHelper.DestroyUi(player, Internal);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel
{
RectTransform = { AnchorMin = "0.16 0.012", AnchorMax = "0.995 0.9", OffsetMax = "0 0" },
Image = { Color = "1.00 0.50 0.25 0", Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" },
}, LOGOb, Internal);
CuiHelper.AddUi(player, container);
player.SendConsoleCommand(chooseElement.DrawMethod);
DrawPoints(player, chooseElement);
Effect effect = new Effect("assets/bundled/prefabs/fx/notice/stack.world.fx.prefab", player, 0, new Vector3(), new Vector3());
EffectNetwork.Send(effect, player.Connection);
break;
}
}
}
private class MenuPoint
{
[JsonProperty("Name Button {Lang (1.2.3.4.5.6.7.8.9.10.11)}")]
public string DisplayName;
[JsonProperty("Button")]
public string DrawMethod;
}
private class Configuration
{
public int TIME;
[JsonProperty("Button")]
public List<MenuPoint> Points = new List<MenuPoint>();
public static Configuration Generate()
{
return new Configuration
{
TIME = 5,
Points = new List<MenuPoint>
{
new MenuPoint
{
DisplayName = "1",
DrawMethod = "chat.say /wipe"
},
new MenuPoint
{
DisplayName = "2",
DrawMethod = "chat.say /report"
},
new MenuPoint
{
DisplayName = "3",
DrawMethod = "chat.say /top"
}
}
};
}
}
private static Configuration Settings;
protected override void LoadConfig()
{
base.LoadConfig();
try
{
Settings = Config.ReadObject<Configuration>();
}
catch
{
PrintWarning($"Error reading config, creating one new config!");
LoadDefaultConfig();
}
SaveConfig();
}
protected override void LoadDefaultConfig() => Settings = Configuration.Generate();
protected override void SaveConfig() => Config.WriteObject(Settings);
}
}