using Oxide.Game.Rust.Cui; using Newtonsoft.Json; namespace Oxide.Plugins; [Info("CreativeToggle", "Bubbafett", "1.2.0")] [Description("Toggles creative mode for players.")] public class CreativeToggle : RustPlugin { #region Configuration private Configuration CreativeConfig; CuiElementContainer cachedCreativeUI = null; private sealed class Configuration { [JsonProperty(PropertyName = "ConsoleLoggingEnabled")] public bool ConsoleLoggingEnabled { get; set; } [JsonProperty(PropertyName = "ChatMessageEnabled")] public bool ChatMessageEnabled { get; set; } [JsonProperty(PropertyName = "IconEnabled")] public bool IconEnabled { get; set; } [JsonProperty(PropertyName = "IconAnchorMin")] public string IconAnchorMin { get; set; } [JsonProperty(PropertyName = "IconAnchorMax")] public string IconAnchorMax { get; set; } [JsonProperty(PropertyName = "IconImageURL")] public string IconImageURL { get; set; } [JsonProperty(PropertyName = "IconColor")] public string IconColor { get; set; } [JsonProperty(PropertyName = "Toggle Creative Permission")] public string CreativePermission { get; set; } [JsonProperty(PropertyName = "Toggle ConVars Permission")] public string ConVarPermission { get; set; } } private Configuration GetDefaultConfig() { return new Configuration { ConsoleLoggingEnabled = true, ChatMessageEnabled = true, IconEnabled = true, IconAnchorMin = "0.345 0.11", IconAnchorMax = "0.375 0.16", IconImageURL = "https://i.postimg.cc/nVvW4Smw/Creative-Mode.png", IconColor = "1 1 1 0.3", CreativePermission = "creativetoggle.use", ConVarPermission = "creativetoggle.convars" }; } protected override void LoadConfig() { base.LoadConfig(); if (!Config.Exists()) { CreativeConfig = GetDefaultConfig(); SaveConfig(); return; } CreativeConfig = Config.ReadObject(); SaveConfig(); } protected override void LoadDefaultConfig() { CreativeConfig = GetDefaultConfig(); } protected override void SaveConfig() { Config.WriteObject(CreativeConfig, true); } #endregion #region Hooks private void Init() { permission.RegisterPermission(CreativeConfig.CreativePermission, this); permission.RegisterPermission(CreativeConfig.ConVarPermission, this); } void Loaded() { if (CreativeConfig.IconEnabled) { foreach (BasePlayer player in BasePlayer.activePlayerList) { if (player.HasPlayerFlag(BasePlayer.PlayerFlags.CreativeMode)) { cachedCreativeUI = CreateCreativeUI(); CuiHelper.AddUi(player, cachedCreativeUI); } } } } void Unload() { foreach (BasePlayer player in BasePlayer.activePlayerList) { CuiHelper.DestroyUi(player, "CreativeModeUI"); } } #endregion #region Commands [ChatCommand("creative")] private void CreativeCommand(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, CreativeConfig.CreativePermission)) { player.ChatMessage("You do not have permission to use this command!"); return; } var wasCreativeMode = player.HasPlayerFlag(BasePlayer.PlayerFlags.CreativeMode); player.SetPlayerFlag(BasePlayer.PlayerFlags.CreativeMode, !wasCreativeMode); if (CreativeConfig.ChatMessageEnabled) { player.ChatMessage($"Creative mode {(wasCreativeMode ? "disabled" : "enabled")}."); } if (CreativeConfig.ConsoleLoggingEnabled) { Puts($"{player.Connection} {(wasCreativeMode ? "disabled" : "enabled")} creative mode"); } if (!wasCreativeMode & CreativeConfig.IconEnabled) { cachedCreativeUI = CreateCreativeUI(); CuiHelper.AddUi(player, cachedCreativeUI); } else { CuiHelper.DestroyUi(player, "CreativeModeUI"); } } [ChatCommand("creativefreerepair")] private void CreativeFreeRepair(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, CreativeConfig.ConVarPermission)) { player.ChatMessage("You do not have permission to use this command!"); return; } var wasFreeRepair = ConVar.Creative.freeRepair; ConVar.Creative.freeRepair = !ConVar.Creative.freeRepair; player.ChatMessage($"Creative free repair {(wasFreeRepair ? "disabled" : "enabled")}!"); } [ChatCommand("creativefreebuild")] private void CreativeFreeBuild(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, CreativeConfig.ConVarPermission)) { player.ChatMessage("You do not have permission to use this command!"); return; } var wasFreeBuild = ConVar.Creative.freeBuild; ConVar.Creative.freeBuild = !ConVar.Creative.freeBuild; player.ChatMessage($"Creative free build {(wasFreeBuild ? "disabled" : "enabled")}!"); } [ChatCommand("creativefreeplacement")] private void CreativeFreePlacement(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, CreativeConfig.ConVarPermission)) { player.ChatMessage("You do not have permission to use this command!"); return; } var wasFreePlacement = ConVar.Creative.freePlacement; ConVar.Creative.freePlacement = !ConVar.Creative.freePlacement; player.ChatMessage($"Creative free placement {(wasFreePlacement ? "disabled" : "enabled")}!"); } [ChatCommand("creativeunlimitedio")] private void CreativeUnlimitedIO(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, CreativeConfig.ConVarPermission)) { player.ChatMessage("You do not have permission to use this command!"); return; } var wasFreeUnlimitedIO = ConVar.Creative.unlimitedIo; ConVar.Creative.unlimitedIo = !ConVar.Creative.unlimitedIo; player.ChatMessage($"Creative free placement {(wasFreeUnlimitedIO ? "disabled" : "enabled")}!"); } #endregion #region GUI private CuiElementContainer CreateCreativeUI() { CuiElementContainer elements = new CuiElementContainer(); string panel = elements.Add(new CuiPanel { Image = { Color = "0 0 0 0" }, RectTransform = { AnchorMin = CreativeConfig.IconAnchorMin, AnchorMax = CreativeConfig.IconAnchorMax } }, "Hud", "CreativeModeUI", "CreativeModeUI"); elements.Add(new CuiElement { Parent = panel, Components = { new CuiRawImageComponent { Url = CreativeConfig.IconImageURL, Color = CreativeConfig.IconColor }, new CuiRectTransformComponent { AnchorMin = "0 0", AnchorMax = "1 1" } } }); return elements; } #endregion }