C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("MMenu", "Mystery", "0.0.1")]
[Description("Multi Menu")]
class MMenu : RustPlugin
{
// 10 11big
[PluginReference] private Plugin ImageLibrary, MMercenaries;
protected override void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["1"] = "Wipe calendar",
["2"] = "Basket",
["3"] = "Mercenaries",
["4"] = "Wipe calendar",
["5"] = "Wipe calendar",
["6"] = "Wipe calendar",
["7"] = "Wipe calendar",
["8"] = "Wipe calendar",
["9"] = "Wipe calendar",
["10"] = "Settings",
}, this);
lang.RegisterMessages(new Dictionary<string, string>
{
["1"] = "Календарь вайпов",
["2"] = "Корзина",
["3"] = "Наёмники",
["4"] = "Календарь вайпов",
["5"] = "Календарь вайпов",
["6"] = "Календарь вайпов",
["7"] = "Календарь вайпов",
["8"] = "Календарь вайпов",
["9"] = "Календарь вайпов",
["10"] = "Настройки",
}, this, "ru");
}
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),
public static string External = "UI_15FPS_External";
public static string MenuPoints = "UI_Points";
public static string Internal = "Mystery";
private class MenuPoint
{
[JsonProperty("for lang num")]
public string Num;
public string Image;
public string Command;
}
private class Configuration
{
[JsonProperty("Список доступных разделов меню MAX 10")]
public List<MenuPoint> Points = new List<MenuPoint>();
public static Configuration Generate()
{
return new Configuration
{
Points = new List<MenuPoint>
{
new MenuPoint
{
Num = "1",
Image = "https://i.imgur.com/j2jnznj.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "2",
Image = "https://i.imgur.com/j5EgVl0.png",
Command = "chat.say /store"
},
new MenuPoint
{
Num = "3",
Image = "https://i.imgur.com/ajmCW2k.png",
Command = "chat.say /mercenaries"
},
new MenuPoint
{
Num = "4",
Image = "https://15fpsrust.top/api/FMenu/calendar.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "5",
Image = "https://15fpsrust.top/api/FMenu/calendar.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "6",
Image = "https://15fpsrust.top/api/FMenu/calendar.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "7",
Image = "https://15fpsrust.top/api/FMenu/calendar.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "8",
Image = "https://15fpsrust.top/api/FMenu/calendar.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "9",
Image = "https://15fpsrust.top/api/FMenu/calendar.png",
Command = "chat.say /calendar"
},
new MenuPoint
{
Num = "10",
Image = "https://i.imgur.com/ZMprlfn.png",
Command = "chat.say /settings"
},
}
};
}
}
private static Configuration Settings = null;
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);
private void OnServerInitialized()
{
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
PrintWarning($" {Name} v{Version} loading");
if (!ImageLibrary)
{
PrintError(" Install plugin: 'ImageLibrary'");
Core.Interface.Oxide.UnloadPlugin(Name);
return;
}
PrintWarning(" Plugin loaded - OK");
PrintWarning(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
foreach (var check in Settings.Points)
{
ImageLibrary.Call("AddImage", check.Image,check.Image);
}
BasePlayer.activePlayerList.ToList().ForEach(p =>
{
Open(p);
});
}
private void Unload()
{
BasePlayer.activePlayerList.ToList().ForEach(p =>
{
CuiHelper.DestroyUi(p, External);
CuiHelper.DestroyUi(p, Internal);
});
}
void Open(BasePlayer player)
{
CuiHelper.DestroyUi(player, External);
CuiElementContainer container = new CuiElementContainer();
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1", OffsetMax = "0 0" },
Image = { Color = "0.235 0.227 0.180 1", Sprite = "assets/content/ui/ui.background.transparent.radial.psd" }
}, "Overlay", External);
container.Add(new CuiButton
{
RectTransform = {AnchorMin = "0 0", AnchorMax = "1 1" },
Button = { Command = $"menu close", Color = "0 0 0 0" },
Text = { Text = "", Align = TextAnchor.MiddleLeft, Font = "robotocondensed-bold.ttf", FontSize = 13 }
},External);
container.Add(new CuiPanel
{
RectTransform = {AnchorMin = "0.2 0.2", AnchorMax = "0.8 0.8", OffsetMax = "0 0"},
Image = { Color = "1 0 0 0" }
}, External, "j");
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = {AnchorMin = "0 0", AnchorMax = "0.27 0.85", OffsetMax = "0 0"},
Image = {Color = "0.141 0.137 1 0"}
}, "j", MenuPoints);
container.Add(new CuiPanel
{
RectTransform = {AnchorMin = "0 0.875", AnchorMax = "0.2625 1", OffsetMax = "0 0"},
Image = { Color = "0.89 0.81 0.70 0.3" }
}, "j", "k");
string ImageAvatar = GetImage(player.UserIDString, 0);
container.Add(new CuiElement
{
Parent = "k",
Name = $"AVATAR",
Components =
{
new CuiRawImageComponent { Png = ImageAvatar },
new CuiRectTransformComponent{ AnchorMin = "0.02 0.1", AnchorMax = $"0.25 0.9"},
}
});
container.Add(new CuiElement
{
Parent = "k",
Components =
{
new CuiTextComponent {Color = "1 1 1 0.5",Text = player.displayName +$"\n<size=12>{exp(player)} EXP</size>", Align = TextAnchor.LowerLeft, FontSize = 15},
new CuiRectTransformComponent { AnchorMin = "0.27 0.12", AnchorMax = "1 1" },
}
});
CuiHelper.AddUi(player, container);
DrawMenuPoints(player);
}
float exp(BasePlayer player)
{
var ret = (float)plugins.Find("MMercenaries").Call("EXPFind", player);
if (ret == null) return 0.0f;
return ret;
}
public string GetImage(string shortname, ulong skin = 0) => (string)ImageLibrary?.Call("GetImage", shortname, skin);
void DrawMenuPoints(BasePlayer player, MenuPoint choosed = null)
{
CuiElementContainer container = new CuiElementContainer();
float marginTop = 0;
float originalHeight = 32;
float freeHeight = 20;
float padding = 5;
foreach (var point in Settings.Points)
{
CuiHelper.DestroyUi(player, MenuPoints + Settings.Points.IndexOf(point));
string color = point == choosed ? "0 0 0 1" : "1 1 1 0.5";
string color1 = point == choosed ? "0.89 0.81 0.70 0.5" : "0.89 0.81 0.70 0.3";
float elementHeight = point.Num.Length > 0 ? originalHeight : freeHeight;
container.Add(new CuiPanel
{
CursorEnabled = true,
RectTransform = { AnchorMin = "0 1", AnchorMax = "0 1", OffsetMin = $"0 {marginTop - elementHeight}", OffsetMax = $"200 {marginTop}" },
Image = { Color = color1 }
}, MenuPoints, MenuPoints + Settings.Points.IndexOf(point));
container.Add(new CuiElement
{
Parent = MenuPoints + Settings.Points.IndexOf(point),
Name = "j",
Components =
{
new CuiRawImageComponent { Png = (string) ImageLibrary.Call("GetImage", point.Image)},
new CuiRectTransformComponent{ AnchorMin = "0.01 0.05", AnchorMax = "0.15 0.95" },
}
});
container.Add(new CuiButton
{
RectTransform = {AnchorMin = "0.17 0", AnchorMax = "1 1" },
Button = { Command = $"menu choose {Settings.Points.IndexOf(point)}", Color = "0 0 0 0" },
Text = { Text = Msg(point.Num, player.UserIDString), Align = TextAnchor.MiddleLeft, Font = "robotocondensed-bold.ttf", FontSize = 15, Color = color }
},MenuPoints + Settings.Points.IndexOf(point));
marginTop -= elementHeight + padding;
}
CuiHelper.AddUi(player, container);
}
[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 "close":
{
CuiHelper.DestroyUi(player, External);
CuiHelper.DestroyUi(player, Internal);
CuiHelper.DestroyUi(player, MenuPoints);
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
{
CursorEnabled = true,
RectTransform = {AnchorMin = "0.36 0.203", AnchorMax = "0.8 0.8", OffsetMax = "0 0"},
Image = { Color = "0.50 0.50 0.50 0" }
}, "Overlay", Internal);
CuiHelper.AddUi(player, container);
player.SendConsoleCommand(chooseElement.Command);
DrawMenuPoints(player, chooseElement);
//Effect effect = new Effect("", player, 0, new Vector3(), new Vector3());
//EffectNetwork.Send(effect, player.Connection);
break;
}
}
}
[ChatCommand("menu")]
private void CmdChatWipe(BasePlayer player)
{
Open(player);
}
}
}