C#:
using UnityEngine;
using System.Collections.Generic;
using System.Globalization;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
namespace Oxide.Plugins {
[Info("Relocated", "Death", "1.0.1")]
[Description("Display a GUI screen with information to new server location. Useful when changing server IPs.")]
class Relocated : RustPlugin {
#region Hooks
void Init() {
LoadConfigVariables();
}
void Unload() {
foreach (var player in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(player, "main");
}
}
void OnPlayerSleepEnded(BasePlayer player) {
CuiElementContainer container = UI.Container("main", UI.Color(configData.Design.BodyPanel_Color, configData.Design.BodyPanel_Opacity), new UI4(0, 0, 1, 1), true);
UI.Label(ref container, "main", $"<color={configData.Design.ImportantText_Color}>{configData.Info.HeaderText.Replace(" {
0
}
", configData.Info.ServerName)}</color>", 25, new UI4(0.2f, 0.7f, 0.8f, 1), TextAnchor.MiddleCenter);
UI.Label(ref container, "main", configData.Info.SubHeaderText.Replace("{0}", $"<color={configData.Design.ImportantText_Color}</color>{player.displayName}</color>").Replace("{1}", Interface.Oxide.Config.Options.Modded ? "modded" : "community"), 16, new UI4(0.2f, 0.6f, 0.8f, 0.7f), TextAnchor.MiddleCenter);
UI.Label(ref container, "main", configData.Info.ConnectInfo.Replace("{0}", $"<color={configData.Design.ImportantText_Color}>connect {configData.Info.NewServerIP}</color>").Replace("{1}", $"<color={configData.Design.ImportantText_Color}>{configData.Info.ServerName}</color>").Replace("{2}", Interface.Oxide.Config.Options.Modded ? "modded" : "community"), 16, new UI4(0.2f, 0.3f, 0.8f, 0.4f), TextAnchor.MiddleCenter);
UI.Button(ref container, "main", UI.Color(configData.Design.Button_Color, configData.Design.Button_Opacity), "Print To Console", 10, new UI4(0.38f, 0.17f, 0.48f, 0.2f), $"r_print");
UI.Button(ref container, "main", UI.Color(configData.Design.Button_Color, configData.Design.Button_Opacity), "Exit", 10, new UI4(0.52f, 0.17f, 0.62f, 0.2f), "r_exit");
CuiHelper.AddUi(player, container);
}
#endregion
#region Functions
#region CallBacks
[ConsoleCommand("r_exit")]
void Exit(ConsoleSystem.Arg arg) {
if (arg == null || arg.Player() == null) {
return;
}
if (configData.Info.KickOnExit) {
arg.Player().Kick(configData.Info.KickReason.Replace("{0}", configData.Info.NewServerIP));
}
else {
CuiHelper.DestroyUi(arg.Player(), "main");
}
}
[ConsoleCommand("r_print")]
void Print(ConsoleSystem.Arg arg) {
if (arg == null || arg.Player() == null) {
return;
}
arg.Player().SendConsoleCommand($"echo connect {configData.Info.NewServerIP}");
}
#endregion
#region Config
private ConfigData configData;
class ConfigData {
public Info Info = new Info();
public Design Design = new Design();
}
class Info {
public string ServerName = ConVar.Server.hostname;
public string NewServerIP = "123.456.789:1234";
public string HeaderText = "{0} has moved!";
public string SubHeaderText = "Greetings {0}! Our server has moved locations and is under a new IP address. Because of this, you'll have to search for our server under the {1} tab or connect with the information below.";
public string ConnectInfo = "Connect to our new server by pressing F1 and typing {0} or searching {1} under the {2} tab!";
public string PrintInfo = "connect {0}";
public bool KickOnExit = true;
public string KickReason = "Our server has moved to {0}!";
}
class Design {
public string ImportantText_Color = "#188FF3";
public string BodyText_Color = "#fffffff";
public string BodyPanel_Color = "000000";
public float BodyPanel_Opacity = 0.9f;
public string Button_Color = "008000";
public float Button_Opacity = 0.9f;
}
private void LoadConfigVariables() {
configData = Config.ReadObject<ConfigData>();
SaveConfig(configData);
}
protected override void LoadDefaultConfig() {
var config = new ConfigData();
SaveConfig(config);
}
void SaveConfig(ConfigData config) {
Config.WriteObject(config, true);
}
#endregion
#region GUI - Framework
public static class UI {
static public CuiElementContainer Container(string panel, string color, UI4 dimensions, bool useCursor = false, string parent = "Overlay") {
CuiElementContainer container = new CuiElementContainer() {
{
new CuiPanel {
Image = {
Color = color
}
, RectTransform = {
AnchorMin = dimensions.GetMin(), AnchorMax = dimensions.GetMax()
}
, CursorEnabled = useCursor
}
, new CuiElement().Parent = parent, panel
}
}
;
return container;
}
static public void Label(ref CuiElementContainer container, string panel, string text, int size, UI4 dimensions, TextAnchor align = TextAnchor.MiddleCenter) {
container.Add(new CuiLabel {
Text = {
FontSize = size, Align = align, Text = text
}
, RectTransform = {
AnchorMin = dimensions.GetMin(), AnchorMax = dimensions.GetMax()
}
}
, panel);
}
static public void Button(ref CuiElementContainer container, string panel, string color, string text, int size, UI4 dimensions, string command, TextAnchor align = TextAnchor.MiddleCenter) {
container.Add(new CuiButton {
Button = {
Color = color, Command = command, FadeIn = 0f
}
, RectTransform = {
AnchorMin = dimensions.GetMin(), AnchorMax = dimensions.GetMax()
}
, Text = {
Text = text, FontSize = size, Align = align
}
}
, panel);
}
public static string Color(string hexColor, float alpha) {
if (hexColor.StartsWith("#")) hexColor = hexColor.Substring(1);
int red = int.Parse(hexColor.Substring(0, 2), NumberStyles.AllowHexSpecifier);
int green = int.Parse(hexColor.Substring(2, 2), NumberStyles.AllowHexSpecifier);
int blue = int.Parse(hexColor.Substring(4, 2), NumberStyles.AllowHexSpecifier);
return $"{(double)red / 255} {(double)green / 255} {(double)blue / 255} {alpha}";
}
}
public class UI4 {
public float xMin, yMin, xMax, yMax;
public UI4(float xMin, float yMin, float xMax, float yMax) {
this.xMin = xMin;
this.yMin = yMin;
this.xMax = xMax;
this.yMax = yMax;
}
public string GetMin() => $"{xMin} {yMin}";
public string GetMax() => $"{xMax} {yMax}";
}
#endregion
#endregion
}
}