"You do not possess the required permissions."

I granted the admin group (also member of it) the permissions "GUIAnnouncements.announce" but if I try /guia test or /announce test I get "You do not possess the required permissions".

If I try it from the console (directly on the server) I get "[GUIAnnouncements] Error".

Any idea how to deal with this?

Can you paste the logs from console for the error using the insert/edit code sample tool, please include a bit of information before and after the error and your command too.

If you could also show what permissions are assigned to the admin group that will be useful.

Sure! Thank you already for taking your time.


I tried it like this, but also like following screenshot with the same result:

I don't see any messages or error messages regarding this.
Only thing regarding GUIAnouncements is, when I load the plugin:

Loaded plugin GUIAnnouncements v2.0.5 by JoeSheep [270ms]
[Lone.DesignUpdateChecker] GUIAnnouncements.cs was just loaded in, checking for updates...
[Lone.DesignUpdateChecker]  is up to date.​

When I enter announce test from console:
[UniversalLink] UniversalLink: Now updating verification and nitro status for 1 / 1
announce test
[GUIAnnouncements] Error
[UniversalLink] UniversalLink: Now updating verification and nitro status for 1 / 1

 

Make sure you've set the permissions as you want, then can you run the command oxide.show group admin in your console and paste the output here please?

What plugin are you using for permission management there in your screenshots?

Sure - it used the Carbon equivalent to Oxide

c.show group admin
Group admin has 1 users:
  765611XXXXXXX (Chiyo)
and has 85 permissions:
  vanish.allow, radiostationmanager.allow, inventoryviewer.allowed, inventoryviewer.unlock, carradio.attachallcarradio, carradio.detachallcarradio, adminutilities.nocliptoggle, nodecay.admin, adminutilities.saveinventory, nodecay.use, stacksizecontroller.listcategories, stackmodifier.admin, biplane.bomber.use, biplane.stormtrooper.use, biplane.items, jetpack.give, jetpack.giveself, autocode.admin, skinbox.admin, betterchat.admin, rustlax.admin, adminmenu.use, adminmenu.permissions, adminmenu.groups, adminmenu.give, adminmenu.convars, adminmenu.players, adminmenu.players.blueprints, adminmenu.players.heal, adminmenu.players.hurt, adminmenu.players.kickban, adminmenu.players.kill, adminmenu.players.strip, adminmenu.players.mute, adminmenu.players.teleport, backpacks.admin, monumentfinder.find, monumentaddons.admin, alphaloot.admin, copypaste.copy, raidablebases.canbypass, raidablebases.mapteleport, raidablebases.config, raidablebases.allow, adminradar.allowed, rustyadmintools.use, updatechecker.setup, vanish.unlock, vanish.damage, treeplanter.use, autofarm.allow, skinbox.use, backpackbutton.use, gridpower.admin, carbon.cadmin, carbon.cmod, payback.admin, adminhammer.allow, telekinesis.admin, teaminfo.use, privatemessages.allow, quarrylevels.use, deathnotes.cansee, hitdamage.use, customvendingsetup.use, autobaseupgrade.use, autobaseupgrade.vip, autobaseupgrade.repair, autobaseupgrade.upgrade, buildingskins.admin, buildingskins.build, buildingskins.all, buildingskins.use, bgrade.all, blueprintshare.share, blueprintshare.use, personalmarketplace.admin, uplifted.admaccess, quarrylevels.admin, dynamicwirecolors.use, guiannouncements.announce, notify.see, notify.notify, notify.player and notify.allplayer​
It's running via /cp (Carbon Panel) what you saw in the screenshots.
If you need any further information, just let me know.

It looks to me like you've set the permissions correctly. I've never ever used Carbon API, so this plugin hasn't been tested with it.

I know the plugin permissions work fine when running Umod/Oxide. I can't guarantee anything for Carbon API since I've not worked with that. The error you get in console isn't even something that my plugin would print to console.

Sorry but I don't think I can help you here.

I am using Carbon and I am having this issue. Was there a resolution to this or is it just a carbon thing? If it is a carbon thing, are any plans to make it compatible? 

I can confirm this Issue with carbon.
It seems as if carbon does not realize which hooks this plugin uses and therefore does not activate them, or something like that.
Maybe the dev of this plugin should do a conversation with a dev of carbon on the codefling webpage.

I'm also having problems also on carbon, but if the developer dont want to fix it no problem its a free plugin cant be unhappy :)

I will check for a other plugin

i fixed mine to work with carbon here is the code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Globalization;
using System.Collections;

using UnityEngine;

using Oxide.Core;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;

namespace Oxide.Plugins
{
    [Info("GUIAnnouncements", "JoeSheep", "2.0.6", ResourceId = 1222)]
    [Description("Creates announcements with custom messages across the top of player's screens.")]

    class GUIAnnouncements : RustPlugin
    {
        #region Configuration

        #region Permissions
        const string PermAnnounce = "GUIAnnouncements.announce";
        const string PermAnnounceToggle = "GUIAnnouncements.toggle";
        const string PermAnnounceGetNextRestart = "GUIAnnouncements.getnextrestart";
        const string PermAnnounceJoinLeave = "GUIAnnouncements.announcejoinleave";
        #endregion

        #region Global Declerations
        private Dictionary<ulong, string> Exclusions = new Dictionary<ulong, string>();
        private HashSet<ulong> JustJoined = new HashSet<ulong>();
        private HashSet<ulong> GlobalTimerPlayerList = new HashSet<ulong>();
        private Dictionary<BasePlayer, Timer> PrivateTimers = new Dictionary<BasePlayer, Timer>();
        private Dictionary<BasePlayer, Timer> NewPlayerPrivateTimers = new Dictionary<BasePlayer, Timer>();
        private Dictionary<BasePlayer, Timer> PlayerRespawnedTimers = new Dictionary<BasePlayer, Timer>();
        private Timer PlayerTimer;
        private Timer GlobalTimer;
        private Timer NewPlayerTimer;
        private Timer PlayerRespawnedTimer;
        private Timer RealTimeTimer;
        private bool RealTimeTimerStarted = false;
        private Timer SixtySecondsTimer;
        private Timer AutomaticAnnouncementsTimer;
        private Timer GetNextRestartTimer;
        private string HeliLastHitPlayer = String.Empty;
        private string CH47LastHitPlayer = String.Empty;
        private string APCLastHitPlayer = String.Empty;
        private HashSet<ulong> HeliNetIDs = new HashSet<ulong>();
        private HashSet<ulong> CH47NetIDs = new HashSet<ulong>();
        private HashSet<ulong> KilledCH47NetIDs = new HashSet<ulong>();
        private bool ConfigUpdated;
        private static readonly int WorldSize = ConVar.Server.worldsize;
        private List<DateTime> RestartTimes = new List<DateTime>();
        private Dictionary<DateTime, TimeSpan> CalcNextRestartDict = new Dictionary<DateTime, TimeSpan>();
        private DateTime NextRestart;
        List<TimeSpan> RestartAnnouncementsTimeSpans = new List<TimeSpan>();
        private int LastHour;
        private int LastMinute;
        private bool RestartCountdown;
        private bool RestartJustScheduled = false;
        private bool RestartScheduled = false;
        private string RestartReason = String.Empty;
        private List<string> RestartAnnouncementsWhenStrings;
        private DateTime ScheduledRestart;
        private TimeSpan AutomaticTimedAnnouncementsRepeatTimeSpan;
        private bool RestartSuspended = false;
        private bool DontCheckNextRestart = false;
        private bool MutingBans = false;
        private bool AnnouncingGameTime = false;
        private string LastGameTime;
        private int GameTimeCurrentCount = 0;
        private bool AnnouncingRealTime = false;
        private string LastRealTime;
        private int RealTimeCurrentCount = 0;
        private List<string> GameTimes = new List<string>();
        private List<string> RealTimes = new List<string>();
        private IEnumerator<List<string>> ATALEnum;
        private List<List<string>> AutomaticTimedAnnouncementsStringList = new List<List<string>>();

        string BannerTintGrey = "0.1 0.1 0.1 0.7";
        string BannerTintRed = "0.5 0.1 0.1 0.7";
        string BannerTintOrange = "0.95294 0.37255 0.06275 0.7";
        string BannerTintYellow = "1 0.92 0.016 0.7";
        string BannerTintGreen = "0.1 0.4 0.1 0.5";
        string BannerTintCyan = "0 1 1 0.7";
        string BannerTintBlue = "0.09020 0.07843 0.71765 0.7";
        string BannerTintPurple = "0.53333 0.07843 0.77647 0.7";
        string TextRed = "0.5 0.2 0.2";
        string TextOrange = "0.8 0.5 0.1";
        string TextYellow = "1 0.92 0.016";
        string TextGreen = "0 1 0";
        string TextCyan = "0 1 1";
        string TextBlue = "0.09020 0.07843 0.71765";
        string TextPurple = "0.53333 0.07843 0.77647";
        string TextWhite = "1 1 1";
        string BannerAnchorMaxX = "1.026 ";
        string BannerAnchorMaxYDefault = "0.9743";
        string BannerAnchorMaxY = "0.9743";
        string BannerAnchorMinX = "-0.027 ";
        string BannerAnchorMinYDefault = "0.915";
        string BannerAnchorMinY = "0.915";
        string TextAnchorMaxX = "0.868 ";
        string TextAnchorMaxYDefault = "0.9743";
        string TextAnchorMaxY = "0.9743";
        string TextAnchorMinX = "0.131 ";
        string TextAnchorMinYDefault = "0.915";
        string TextAnchorMinY = "0.915";
        string TABannerAnchorMaxY = "0.9743";
        string TABannerAnchorMinY = "0.915";
        string TATextAnchorMaxY = "0.9743";
        string TATextAnchorMinY = "0.915";

        #endregion
        //============================================================================================================
        #region Config Option Declerations

        //Color List
        public string BannerColorList { get; private set; } = "Grey, Red, Orange, Yellow, Green, Cyan, Blue, Purple";
        public string TextColorList { get; private set; } = "White, Red, Orange, Yellow, Green, Cyan, Blue, Purple";

        //Airdrop Announcements
        public bool AirdropAnnouncementsEnabled { get; private set; } = false;
        public bool AirdropAnnouncementsLocation { get; private set; } = false;
        public string AirdropAnnouncementsText { get; private set; } = "Airdrop en route!";
        public string AirdropAnnouncementsTextWithGrid { get; private set; } = "Airdrop en route to {grid}.";
        public string AirdropAnnouncementsBannerColor { get; private set; } = "Green";
        public string AirdropAnnouncementsTextColor { get; private set; } = "Yellow";

        //Automatic Game Time Announcements
        public bool AutomaticGameTimeAnnouncementsEnabled { get; private set; } = false;
        public Dictionary<string, List<object>> AutomaticGameTimeAnnouncementsList { get; private set; } = new Dictionary<string, List<object>>
        {
            {"18:15", new List<object>{ "The in game time is 18:15 announcement 1.", "The in game time is 18:15 announcement 2.", "The in game time is 18:15 announcement 3." } },
            {"00:00", new List<object>{ "The in game time is 00:00 announcement 1.", "The in game time is 00:00 announcement 2.", "The in game time is 00:00 announcement 3." } },
            {"12:00", new List<object>{ "The in game time is 12:00 announcement 1.", "The in game time is 12:00 announcement 2.", "The in game time is 12:00 announcement 3." } },
        };
        public string AutomaticGameTimeAnnouncementsBannerColor { get; private set; } = "Grey";
        public string AutomaticGameTimeAnnouncementsTextColor { get; private set; } = "White";

        //Automatic Timed Announcements
        public bool AutomaticTimedAnnouncementsEnabled { get; private set; } = false;
        public static List<object> AutomaticTimedAnnouncementsList { get; private set; } = new List<object>
        {
            new List<object>{ "1st Automatic Timed Announcement 1", "1st Automatic Timed Announcement 2" },
            new List<object>{ "2nd Automatic Timed Announcement 1", "2nd Automatic Timed Announcement 2" },
            new List<object>{ "3rd Automatic Timed Announcement 1", "3rd Automatic Timed Announcement 2" },
        };
        public string AutomaticTimedAnnouncementsRepeat { get; private set; } = "00:30:00";
        public string AutomaticTimedAnnouncementsBannerColor { get; private set; } = "Grey";
        public string AutomaticTimedAnnouncementsTextColor { get; private set; } = "White";

        //Automatic Realtime Announcements
        public bool AutomaticRealtimeAnnouncementsEnabled { get; private set; } = false;
        public Dictionary<string, List<object>> AutomaticRealTimeAnnouncementsList { get; private set; } = new Dictionary<string, List<object>>
        {
            {"18:15", new List<object>{ "The local time is 18:15 announcement 1.", "The local time is 18:15 announcement 2.", "The local time is 18:15 announcement 3." } },
            {"00:00", new List<object>{ "The local time is 00:00 announcement 1.", "The local time is 00:00 announcement 2.", "The local time is 00:00 announcement 3." } },
            {"12:00", new List<object>{ "The local time is 12:00 announcement 1.", "The local time is 12:00 announcement 2.", "The local time is 12:00 announcement 3." } },
        };
        public string AutomaticRealTimeAnnouncementsBannerColor { get; private set; } = "Grey";
        public string AutomaticRealTimeAnnouncementsTextColor { get; private set; } = "White";

        //Christmas Stocking Refill Announcement
        public bool StockingRefillAnnouncementsEnabled { get; private set; } = false;
        public string StockingRefillAnnouncementText { get; private set; } = "Santa has refilled your stockings. Go check what you've got!";
        public string StockingRefillAnnouncementBannerColor { get; private set; } = "Green";
        public string StockingRefillAnnouncementTextColor { get; private set; } = "Red";

        //General Settings
        public float AnnouncementDuration { get; private set; } = 10f;
        public int FontSize { get; private set; } = 18;
        public float FadeOutTime { get; private set; } = 0.5f;
        public float FadeInTime { get; private set; } = 0.5f;
        public static float AdjustVPosition { get; private set; } = 0.0f;

        //Global Join/Leave Announcements
        public bool GlobalLeaveAnnouncementsEnabled { get; private set; } = false;
        public bool GlobalJoinAnnouncementsEnabled { get; private set; } = false;
        public bool GlobalJoinLeavePermissionOnly { get; private set; } = true;
        public string GlobalLeaveText { get; private set; } = "{rank} {playername} has left.";
        public string GlobalJoinText { get; private set; } = "{rank} {playername} has joined.";
        public string GlobalLeaveAnnouncementBannerColor { get; private set; } = "Grey";
        public string GlobalLeaveAnnouncementTextColor { get; private set; } = "White";
        public string GlobalJoinAnnouncementBannerColor { get; private set; } = "Grey";
        public string GlobalJoinAnnouncementTextColor { get; private set; } = "White";

        //Helicopter Announcements
        public bool HelicopterSpawnAnnouncementEnabled { get; private set; } = false;
        public bool HelicopterDespawnAnnouncementEnabled { get; private set; } = false;
        public bool HelicopterDestroyedAnnouncementEnabled { get; private set; } = false;
        public bool HelicopterDestroyedAnnouncementWithDestroyer { get; private set; } = false;
        public string HelicopterSpawnAnnouncementText { get; private set; } = "Patrol Helicopter Inbound!";
        public string HelicopterDespawnAnnouncementText { get; private set; } = "The patrol helicopter has left.";
        public string HelicopterDestroyedAnnouncementText { get; private set; } = "The patrol helicopter has been taken down!";
        public string HelicopterDestroyedAnnouncementWithDestroyerText { get; private set; } = "{playername} got the last shot on the helicopter taking it down!";
        public string HelicopterSpawnAnnouncementBannerColor { get; private set; } = "Red";
        public string HelicopterSpawnAnnouncementTextColor { get; private set; } = "Orange";
        public string HelicopterDestroyedAnnouncementBannerColor { get; private set; } = "Red";
        public string HelicopterDestroyedAnnouncementTextColor { get; private set; } = "White";
        public string HelicopterDespawnAnnouncementBannerColor { get; private set; } = "Red";
        public string HelicopterDespawnAnnouncementTextColor { get; private set; } = "White";

        //Chinook Announcements
        public bool CH47SpawnAnnouncementsEnabled { get; private set; } = false;
        public bool CH47DespawnAnnouncementsEnabled { get; private set; } = false;
        public bool CH47DestroyedAnnouncementsEnabled { get; private set; } = false;
        public bool CH47DestroyedAnnouncementsWithDestroyer { get; private set; } = false;
        public bool CH47CrateDroppedAnnouncementsEnabled { get; private set; } = false;
        public bool CH47CrateDroppedAnnouncementsWithLocation { get; private set; } = false;
        public string CH47SpawnAnnouncementText { get; private set; } = "Chinook inbound!";
        public string CH47DespawnAnnouncementText { get; private set; } = "The Chinook has left.";
        public string CH47DestroyedAnnouncementText { get; private set; } = "The Chinook has been taken down!";
        public string CH47DestroyedAnnouncementWithDestroyerText { get; private set; } = "{playername} got the last shot on the Chinook taking it down!";
        public string CH47CrateDroppedAnnouncementText { get; private set; } = "The Chinook has dropped a crate!";
        public string CH47CrateDroppedAnnouncementTextWithGrid { get; private set; } = "The Chinook has dropped a crate in {grid}.";
        public string CH47SpawnAnnouncementBannerColor { get; private set; } = "Red";
        public string CH47SpawnAnnouncementTextColor { get; private set; } = "Yellow";
        public string CH47DestroyedAnnouncementBannerColor { get; private set; } = "Red";
        public string CH47DestroyedAnnouncementTextColor { get; private set; } = "White";
        public string CH47DespawnAnnouncementBannerColor { get; private set; } = "Red";
        public string CH47DespawnAnnouncementTextColor { get; private set; } = "White";
        public string CH47CrateDroppedAnnouncementBannerColor { get; private set; } = "Red";
        public string CH47CrateDroppedAnnouncementTextColor { get; private set; } = "Yellow";

        //Bradley APC Announcements
        public bool APCSpawnAnnouncementsEnabled { get; private set; } = false;
        public bool APCDestroyedAnnouncementsEnabled { get; private set; } = false;
        public bool APCDestroyedAnnouncementsWithDestroyer { get; private set; } = false;
        public string APCSpawnAnnouncementText { get; private set; } = "An APC is patrolling the launch site!";
        public string APCDestroyedAnnouncementText { get; private set; } = "The APC has been destroyed.";
        public string APCDestroyedAnnouncementWithDestroyerText { get; private set; } = "{playername} got the last shot on the APC destroying it!";
        public string APCSpawnAnnouncementBannerColor { get; private set; } = "Red";
        public string APCSpawnAnnouncementTextColor { get; private set; } = "Yellow";
        public string APCDestroyedAnnouncementBannerColor { get; private set; } = "Red";
        public string APCDestroyedAnnouncementTextColor { get; private set; } = "White";

        //Cargoship Announcements
        public bool CargoshipSpawnAnnouncementsEnabled { get; private set; } = false;
        public bool CargoshipEgressAnnouncementsEnabled { get; private set; } = false;
        public string CargoshipSpawnAnnouncementText { get; private set; } = "Cargoship ahoy!";
        public string CargoshipEgressAnnouncementText { get; private set; } = "The cargoship is departing.";
        public string CargoshipSpawnAnnouncementBannerColor { get; private set; } = "Blue";
        public string CargoshipSpawnAnnouncementTextColor { get; private set; } = "Yellow";
        public string CargoshipEgressAnnouncementBannerColor { get; private set; } = "Blue";
        public string CargoshipEgressAnnouncementTextColor { get; private set; } = "White";

        //Crate Hack Announcements
        public bool CrateHackAnnouncementsEnabled { get; private set; } = false;
        public bool CrateHackSpecifyOilRig { get; private set; } = false;
        public string CrateHackAnnouncementText { get; private set; } = "An oil rig crate is being hacked!";
        public string CrateHackAnnouncementSmallOilRigText { get; private set; } = "The small oil rig crate is being hacked!";
        public string CrateHackAnnouncementLargeOilRigText { get; private set; } = "The large oil rig crate is being hacked!";
        public string CrateHackAnnouncementBannerColor { get; private set; } = "Orange";
        public string CrateHackAnnouncementTextColor { get; private set; } = "Yellow";

        //New Player Announcements
        public bool NewPlayerAnnouncementsEnabled { get; private set; } = false;
        public string NewPlayerAnnouncementsBannerColor { get; private set; } = "Grey";
        public string NewPlayerAnnouncementsTextColor { get; private set; } = "White";
        public Dictionary<int, List<object>> NewPlayerAnnouncementsList { get; private set; } = new Dictionary<int, List<object>>
        {
            {1, new List<object>{ "1st Join {rank} {playername} New player announcement 1.", "1st Join {rank} {playername} New player announcement 2.", "1st Join {rank} {playername} New player announcement 3." } },
            {2, new List<object>{ "2nd Join {rank} {playername} New player announcement 1.", "2nd Join {rank} {playername} New player announcement 2.", "2nd Join {rank} {playername} New player announcement 3." } },
            {3, new List<object>{ "3rd Join {rank} {playername} New player announcement 1.", "3rd Join {rank} {playername} New player announcement 2.", "3rd Join {rank} {playername} New player announcement 3." } },
        };

        //Player Banned Announcement
        public bool PlayerBannedAnnouncementsEnabled { get; private set; } = false;
        public string PlayerBannedAnnouncmentText { get; private set; } = "{playername} has been banned. {reason}.";
        public string PlayerBannedAnnouncementBannerColor { get; private set; } = "Grey";
        public string PlayerBannedAnnouncementTextColor { get; private set; } = "Red";

        //Respawn Announcements
        public bool RespawnAnnouncementsEnabled { get; private set; } = false;
        public string RespawnAnnouncementsBannerColor { get; private set; } = "Grey";
        public string RespawnAnnouncementsTextColor { get; private set; } = "White";
        public List<object> RespawnAnnouncementsList { get; private set; } = new List<object>
        {
                    "{playername} Respawn announcement 1.",
                    "{playername} Respawn announcement 2.",
                    "{playername} Respawn announcement 3."
        };

        //Restart Announcements
        public bool RestartAnnouncementsEnabled { get; private set; } = false;
        public string RestartAnnouncementsFormat { get; private set; } = "Restarting in {time}";
        public string RestartAnnouncementsBannerColor { get; private set; } = "Grey";
        public string RestartAnnouncementsTextColor { get; private set; } = "White";
        public List<object> RestartTimesList { get; private set; } = new List<object>
        {
            "08:00:00",
            "20:00:00"
        };
        public List<object> RestartAnnouncementsTimes { get; private set; } = new List<object>
        {
            "12:00:00",
            "11:00:00",
            "10:00:00",
            "09:00:00",
            "08:00:00",
            "07:00:00",
            "06:00:00",
            "05:00:00",
            "04:00:00",
            "03:00:00",
            "02:00:00",
            "01:00:00",
            "00:45:00",
            "00:30:00",
            "00:15:00",
            "00:05:00"
        };
        public bool RestartServer { get; private set; } = false;
        public string RestartSuspendedAnnouncement { get; private set; } = "The restart in {time} has been suspended.";
        public string RestartCancelledAnnouncement { get; private set; } = "The restart in {time} has been cancelled.";

        //Test Announcement
        public float TestAnnouncementDuration { get; private set; } = 10f;
        public int TestAnnouncementFontSize { get; private set; } = 18;
        public float TestAnnouncementFadeOutTime { get; private set; } = 0.5f;
        public float TestAnnouncementFadeInTime { get; private set; } = 0.5f;
        public static float TestAnnouncementAdjustVPosition { get; private set; } = 0.0f;
        public string TestAnnouncementBannerColor { get; private set; } = "Grey";
        public string TestAnnouncementsTextColor { get; private set; } = "White";

        //Third Party Plugin Support
        public bool DoNotOverlayLustyMap { get; private set; } = false;
        public string LustyMapPosition { get; private set; } = "Left";

        //Welcome Announcement
        public bool WelcomeAnnouncementsEnabled { get; private set; } = false;
        public string WelcomeAnnouncementText { get; private set; } = "Welcome {playername}! There are {playercount} player(s) online.";
        public string WelcomeBackAnnouncementText { get; private set; } = "Welcome back {playername}! There are {playercount} player(s) online.";
        public string WelcomeAnnouncementBannerColor { get; private set; } = "Grey";
        public string WelcomeAnnouncementTextColor { get; private set; } = "White";
        public float WelcomeAnnouncementDuration { get; private set; } = 20f;
        public float WelcomeAnnouncementDelay { get; private set; } = 0f;
        public bool WelcomeBackAnnouncement { get; private set; } = false;
        #endregion

        //============================================================================================================
        #region LoadConfig
        private void LoadGUIAnnouncementsConfig()
        {
            string BColor; string TColor; string Category; string Setting;

            //Color List
            BannerColorList = GetConfig("A List Of Available Colors To Use (DO NOT CHANGE)", "Banner Colors", BannerColorList);
            if (BannerColorList != "Grey, Red, Orange, Yellow, Green, Cyan, Blue, Purple")
            {
                PrintWarning("Banner color list changed. Reverting changes.");
                Config["A List Of Available Colors To Use(DO NOT CHANGE)", "Banner Colors"] = "Grey, Red, Orange, Yellow, Green, Cyan, Blue, Purple";
                ConfigUpdated = true;
            }
            TextColorList = GetConfig("A List Of Available Colors To Use (DO NOT CHANGE)", "Text Colors", TextColorList);
            if (TextColorList != "White, Red, Orange, Yellow, Green, Cyan, Blue, Purple")
            {
                PrintWarning("Text color list changed. Reverting changes.");
                Config["A List Of Available Colors To Use(DO NOT CHANGE)", "Text Colors"] = "White, Red, Orange, Yellow, Green, Cyan, Blue, Purple";
                ConfigUpdated = true;
            }

            //Airdrop Announcements
            AirdropAnnouncementsEnabled = GetConfig("Public Airdrop Announcements", "Enabled", AirdropAnnouncementsEnabled);
            AirdropAnnouncementsText = GetConfig("Public Airdrop Announcements", "Text", AirdropAnnouncementsText);
            AirdropAnnouncementsTextWithGrid = GetConfig("Public Airdrop Announcements", "Text With Grid", AirdropAnnouncementsTextWithGrid);
            AirdropAnnouncementsLocation = GetConfig("Public Airdrop Announcements", "Show Location", AirdropAnnouncementsLocation);

            BColor = AirdropAnnouncementsBannerColor; Category = "Public Airdrop Announcements"; Setting = "Banner Color";
            AirdropAnnouncementsBannerColor = GetConfig(Category, Setting, AirdropAnnouncementsBannerColor);
            CheckBannerColor(AirdropAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = AirdropAnnouncementsTextColor; Category = "Public Airdrop Announcements"; Setting = "Text Color";
            AirdropAnnouncementsTextColor = GetConfig(Category, Setting, AirdropAnnouncementsTextColor);
            CheckTextColor(AirdropAnnouncementsTextColor, Category, Setting, TColor);

            //Automatic Game Time Announcements
            AutomaticGameTimeAnnouncementsEnabled = GetConfig("Public Automatic Game Time Announcements", "Enabled", AutomaticGameTimeAnnouncementsEnabled);
            AutomaticGameTimeAnnouncementsList = GetConfig("Public Automatic Game Time Announcements", "Announcement List (Show at this in game time : Announcements to show)", AutomaticGameTimeAnnouncementsList);

            BColor = AutomaticGameTimeAnnouncementsBannerColor; Category = "Public Automatic Game Time Announcements"; Setting = "Banner Color";
            AutomaticGameTimeAnnouncementsBannerColor = GetConfig(Category, Setting, AutomaticGameTimeAnnouncementsBannerColor);
            CheckBannerColor(AutomaticGameTimeAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = AutomaticGameTimeAnnouncementsTextColor; Category = "Public Automatic Game Time Announcements"; Setting = "Text Color";
            AutomaticGameTimeAnnouncementsTextColor = GetConfig(Category, Setting, AutomaticGameTimeAnnouncementsTextColor);
            CheckTextColor(AutomaticGameTimeAnnouncementsTextColor, Category, Setting, TColor);

            //Automatic Timed Announcements
            AutomaticTimedAnnouncementsEnabled = GetConfig("Public Automatic Timed Announcements", "Enabled", AutomaticTimedAnnouncementsEnabled);
            AutomaticTimedAnnouncementsList = GetConfig("Public Automatic Timed Announcements", "Announcement List", AutomaticTimedAnnouncementsList);
            AutomaticTimedAnnouncementsRepeat = GetConfig("Public Automatic Timed Announcements", "Show Every (HH:MM:SS)", AutomaticTimedAnnouncementsRepeat);
            if (!TimeSpan.TryParse(AutomaticTimedAnnouncementsRepeat, out AutomaticTimedAnnouncementsRepeatTimeSpan))
            {
                PrintWarning("Config: \"Automatic Timed Announcements - Show Every (HH:MM:SS)\" is not of the correct format HH:MM:SS, or has numbers out of range and should not be higher than 23:59:59. Resetting to default.");
                Config["Public Automatic Timed Announcements", "Show Every (HH:MM:SS)"] = "00:30:00";
                ConfigUpdated = true;
            }

            BColor = AutomaticTimedAnnouncementsBannerColor; Category = "Public Automatic Timed Announcements"; Setting = "Banner Color";
            AutomaticTimedAnnouncementsBannerColor = GetConfig(Category, Setting, AutomaticTimedAnnouncementsBannerColor);
            CheckBannerColor(AutomaticTimedAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = AutomaticTimedAnnouncementsTextColor; Category = "Public Automatic Timed Announcements"; Setting = "Text Color";
            AutomaticTimedAnnouncementsTextColor = GetConfig(Category, Setting, AutomaticTimedAnnouncementsTextColor);
            CheckTextColor(AutomaticTimedAnnouncementsTextColor, Category, Setting, TColor);

            //Automatic Realtime Announcements
            AutomaticRealtimeAnnouncementsEnabled = GetConfig("Public Automatic Real Time Announcements", "Enabled", AutomaticRealtimeAnnouncementsEnabled);
            AutomaticRealTimeAnnouncementsList = GetConfig("Public Automatic Real Time Announcements", "Announcement List (Show at this local time : Announcements to show)", AutomaticRealTimeAnnouncementsList);

            BColor = AutomaticRealTimeAnnouncementsBannerColor; Category = "Public Automatic Real Time Announcements"; Setting = "Banner Color";
            AutomaticRealTimeAnnouncementsBannerColor = GetConfig(Category, Setting, AutomaticRealTimeAnnouncementsBannerColor);
            CheckBannerColor(AutomaticRealTimeAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = AutomaticRealTimeAnnouncementsTextColor; Category = "Public Automatic Real Time Announcements"; Setting = "Text Color";
            AutomaticRealTimeAnnouncementsTextColor = GetConfig(Category, Setting, AutomaticRealTimeAnnouncementsTextColor);
            CheckTextColor(AutomaticRealTimeAnnouncementsTextColor, Category, Setting, TColor);

            //Christmas Stocking Refill Announcement
            StockingRefillAnnouncementsEnabled = GetConfig("Public Christmas Stocking Refill Announcement", "Enabled", StockingRefillAnnouncementsEnabled);
            StockingRefillAnnouncementText = GetConfig("Public Christmas Stocking Refill Announcement", "Text", StockingRefillAnnouncementText);

            BColor = StockingRefillAnnouncementBannerColor; Category = "Public Christmas Stocking Refill Announcement"; Setting = "Banner Color";
            StockingRefillAnnouncementBannerColor = GetConfig(Category, Setting, StockingRefillAnnouncementBannerColor);
            CheckBannerColor(StockingRefillAnnouncementBannerColor, Category, Setting, BColor);

            TColor = StockingRefillAnnouncementTextColor; Category = "Public Christmas Stocking Refill Announcement"; Setting = "Text Color";
            StockingRefillAnnouncementTextColor = GetConfig(Category, Setting, StockingRefillAnnouncementTextColor);
            CheckTextColor(StockingRefillAnnouncementTextColor, Category, Setting, TColor);

            //General Settings
            AnnouncementDuration = GetConfig("General Settings", "Announcement Duration", AnnouncementDuration);
            if (AnnouncementDuration == 0)
            {
                PrintWarning("Config: \"General Settings - Announcement Duration\" set to 0, resetting to 10f.");
                Config["General Settings", "Announcement Duration"] = 10f;
                ConfigUpdated = true;
            }
            FontSize = GetConfig("General Settings", "Font Size", FontSize);
            if (FontSize > 33 | FontSize == 0)
            {
                PrintWarning("Config: \"General Settings - Font Size\" greater than 28 or 0, resetting to 18.");
                Config["General Settings", "Font Size"] = 18;
                ConfigUpdated = true;
            }
            FadeInTime = GetConfig("General Settings", "Fade In Time", FadeInTime);
            if (FadeInTime > AnnouncementDuration / 2)
            {
                PrintWarning("Config: \"General Settings - Fade In Time\" is greater than half of AnnouncementShowDuration, resetting to half of AnnouncementShowDuration.");
                Config["General Settings", "Fade In Time"] = AnnouncementDuration / 2;
                ConfigUpdated = true;
            }
            FadeOutTime = GetConfig("General Settings", "Fade Out Time", FadeOutTime);
            if (FadeOutTime > AnnouncementDuration / 2)
            {
                PrintWarning("Config: \"General Settings - Fade Out Time\" is greater than half of AnnouncementShowDuration, resetting to half of AnnouncementShowDuration.");
                Config["General Settings", "Fade Out Time"] = AnnouncementDuration / 2;
                ConfigUpdated = true;
            }
            AdjustVPosition = GetConfig("General Settings", "Adjust Vertical Position", AdjustVPosition);
            if (AdjustVPosition != 0f)
            {
                BannerAnchorMaxY = (float.Parse(BannerAnchorMaxYDefault) + AdjustVPosition).ToString();
                BannerAnchorMinY = (float.Parse(BannerAnchorMinYDefault) + AdjustVPosition).ToString();
                TextAnchorMaxY = (float.Parse(TextAnchorMaxYDefault) + AdjustVPosition).ToString();
                TextAnchorMinY = (float.Parse(TextAnchorMinYDefault) + AdjustVPosition).ToString();
            }

            //Global Join/Leave Announcements
            GlobalLeaveAnnouncementsEnabled = GetConfig("Public Join/Leave Announcements", "Leave Enabled", GlobalLeaveAnnouncementsEnabled);
            GlobalLeaveText = GetConfig("Public Join/Leave Announcements", "Leave Text", GlobalLeaveText);
            GlobalJoinLeavePermissionOnly = GetConfig("Public Join/Leave Announcements", "Announce Only Players With Permission", GlobalJoinLeavePermissionOnly);

            BColor = GlobalLeaveAnnouncementBannerColor; Category = "Public Join/Leave Announcements"; Setting = "Leave Banner Color";
            GlobalLeaveAnnouncementBannerColor = GetConfig(Category, Setting, GlobalLeaveAnnouncementBannerColor);
            CheckBannerColor(GlobalLeaveAnnouncementBannerColor, Category, Setting, BColor);

            TColor = GlobalLeaveAnnouncementTextColor; Category = "Public Join/Leave Announcements"; Setting = "Leave Text Color";
            GlobalLeaveAnnouncementTextColor = GetConfig(Category, Setting, GlobalLeaveAnnouncementTextColor);
            CheckTextColor(GlobalLeaveAnnouncementTextColor, Category, Setting, TColor);

            GlobalJoinAnnouncementsEnabled = GetConfig("Public Join/Leave Announcements", "Join Enabled", GlobalJoinAnnouncementsEnabled);
            GlobalJoinText = GetConfig("Public Join/Leave Announcements", "Join Text", GlobalJoinText);

            BColor = GlobalJoinAnnouncementBannerColor; Category = "Public Join/Leave Announcements"; Setting = "Join Banner Color";
            GlobalJoinAnnouncementBannerColor = GetConfig(Category, Setting, GlobalJoinAnnouncementBannerColor);
            CheckBannerColor(GlobalJoinAnnouncementBannerColor, Category, Setting, BColor);

            TColor = GlobalJoinAnnouncementTextColor; Category = "Public Join/Leave Announcements"; Setting = "Join Text Color";
            GlobalJoinAnnouncementTextColor = GetConfig(Category, Setting, GlobalJoinAnnouncementTextColor);
            CheckTextColor(GlobalJoinAnnouncementTextColor, Category, Setting, TColor);

            //Helicopter Announcements
            HelicopterSpawnAnnouncementEnabled = GetConfig("Public Helicopter Announcements", "Spawn", HelicopterSpawnAnnouncementEnabled);
            HelicopterSpawnAnnouncementText = GetConfig("Public Helicopter Announcements", "Spawn Text", HelicopterSpawnAnnouncementText);
            HelicopterDespawnAnnouncementEnabled = GetConfig("Public Helicopter Announcements", "Despawn", HelicopterDespawnAnnouncementEnabled);
            HelicopterDespawnAnnouncementText = GetConfig("Public Helicopter Announcements", "Despawn Text", HelicopterDespawnAnnouncementText);
            HelicopterDestroyedAnnouncementEnabled = GetConfig("Public Helicopter Announcements", "Destroyed", HelicopterDestroyedAnnouncementEnabled);
            HelicopterDestroyedAnnouncementWithDestroyer = GetConfig("Public Helicopter Announcements", "Show Destroyer", HelicopterDestroyedAnnouncementWithDestroyer);
            HelicopterDestroyedAnnouncementText = GetConfig("Public Helicopter Announcements", "Destroyed Text", HelicopterDestroyedAnnouncementText);
            HelicopterDestroyedAnnouncementWithDestroyerText = GetConfig("Public Helicopter Announcements", "Destroyed Text With Destroyer", HelicopterDestroyedAnnouncementWithDestroyerText);

            BColor = HelicopterSpawnAnnouncementBannerColor; Category = "Public Helicopter Announcements"; Setting = "Spawn Banner Color";
            HelicopterSpawnAnnouncementBannerColor = GetConfig(Category, Setting, HelicopterSpawnAnnouncementBannerColor);
            CheckBannerColor(HelicopterSpawnAnnouncementBannerColor, Category, Setting, BColor);

            TColor = HelicopterSpawnAnnouncementTextColor; Category = "Public Helicopter Announcements"; Setting = "Spawn Text Color";
            HelicopterSpawnAnnouncementTextColor = GetConfig(Category, Setting, HelicopterSpawnAnnouncementTextColor);
            CheckTextColor(HelicopterSpawnAnnouncementTextColor, Category, Setting, TColor);

            BColor = HelicopterDespawnAnnouncementBannerColor; Category = "Public Helicopter Announcements"; Setting = "Despawn Banner Color";
            HelicopterDespawnAnnouncementBannerColor = GetConfig(Category, Setting, HelicopterDespawnAnnouncementBannerColor);
            CheckBannerColor(HelicopterDespawnAnnouncementBannerColor, Category, Setting, BColor);

            TColor = HelicopterDespawnAnnouncementTextColor; Category = "Public Helicopter Announcements"; Setting = "Despawn Text Color";
            HelicopterDespawnAnnouncementTextColor = GetConfig(Category, Setting, HelicopterDespawnAnnouncementTextColor);
            CheckTextColor(HelicopterDespawnAnnouncementTextColor, Category, Setting, TColor);

            BColor = HelicopterDestroyedAnnouncementBannerColor; Category = "Public Helicopter Announcements"; Setting = "Destroyed Banner Color";
            HelicopterDestroyedAnnouncementBannerColor = GetConfig(Category, Setting, HelicopterDestroyedAnnouncementBannerColor);
            CheckBannerColor(HelicopterDestroyedAnnouncementBannerColor, Category, Setting, BColor);

            TColor = HelicopterDestroyedAnnouncementTextColor; Category = "Public Helicopter Announcements"; Setting = "Destroyed Text Color";
            HelicopterDestroyedAnnouncementTextColor = GetConfig(Category, Setting, HelicopterDestroyedAnnouncementTextColor);
            CheckTextColor(HelicopterDestroyedAnnouncementTextColor, Category, Setting, TColor);

            //Chinook Announcements
            CH47SpawnAnnouncementsEnabled = GetConfig("Public Chinook Announcements", "Spawn", CH47SpawnAnnouncementsEnabled);
            CH47DespawnAnnouncementsEnabled = GetConfig("Public Chinook Announcements", "Despawn", CH47DespawnAnnouncementsEnabled);
            CH47DestroyedAnnouncementsEnabled = GetConfig("Public Chinook Announcements", "Destroyed", CH47DestroyedAnnouncementsEnabled);
            CH47DestroyedAnnouncementsWithDestroyer = GetConfig("Public Chinook Announcements", "Show Destroyer", CH47DestroyedAnnouncementsWithDestroyer);
            CH47CrateDroppedAnnouncementsEnabled = GetConfig("Public Chinook Announcements", "Announce Crate Drops", CH47CrateDroppedAnnouncementsEnabled);
            CH47CrateDroppedAnnouncementsWithLocation = GetConfig("Public Chinook Announcements", "Show Crate Drop Location", CH47CrateDroppedAnnouncementsWithLocation);
            CH47SpawnAnnouncementText = GetConfig("Public Chinook Announcements", "Spawn Text", CH47SpawnAnnouncementText);
            CH47DespawnAnnouncementText = GetConfig("Public Chinook Announcements", "Despawn Text", CH47DespawnAnnouncementText);
            CH47DestroyedAnnouncementText = GetConfig("Public Chinook Announcements", "Destroyed Text", CH47DestroyedAnnouncementText);
            CH47DestroyedAnnouncementWithDestroyerText = GetConfig("Public Chinook Announcements", "Destroyed Text With Destroyer", CH47DestroyedAnnouncementWithDestroyerText);
            CH47CrateDroppedAnnouncementText = GetConfig("Public Chinook Announcements", "Crate Dropped Text", CH47CrateDroppedAnnouncementText);
            CH47CrateDroppedAnnouncementTextWithGrid = GetConfig("Public Chinook Announcements", "Crate Dropped Text With Grid", CH47CrateDroppedAnnouncementTextWithGrid);

            BColor = CH47SpawnAnnouncementBannerColor; Category = "Public Chinook Announcements"; Setting = "Spawn Banner Color";
            CH47SpawnAnnouncementBannerColor = GetConfig(Category, Setting, CH47SpawnAnnouncementBannerColor);
            CheckBannerColor(CH47SpawnAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CH47SpawnAnnouncementTextColor; Category = "Public Chinook Announcements"; Setting = "Spawn Text Color";
            CH47SpawnAnnouncementTextColor = GetConfig(Category, Setting, CH47SpawnAnnouncementTextColor);
            CheckTextColor(CH47SpawnAnnouncementTextColor, Category, Setting, TColor);

            BColor = CH47DespawnAnnouncementBannerColor; Category = "Public Chinook Announcements"; Setting = "Despawn Banner Color";
            CH47DespawnAnnouncementBannerColor = GetConfig(Category, Setting, CH47DespawnAnnouncementBannerColor);
            CheckBannerColor(CH47DespawnAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CH47DespawnAnnouncementTextColor; Category = "Public Chinook Announcements"; Setting = "Despawn Text Color";
            CH47DespawnAnnouncementTextColor = GetConfig(Category, Setting, CH47DespawnAnnouncementTextColor);
            CheckTextColor(CH47DespawnAnnouncementTextColor, Category, Setting, TColor);

            BColor = CH47DestroyedAnnouncementBannerColor; Category = "Public Chinook Announcements"; Setting = "Destroyed Banner Color";
            CH47DestroyedAnnouncementBannerColor = GetConfig(Category, Setting, CH47DestroyedAnnouncementBannerColor);
            CheckBannerColor(CH47DestroyedAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CH47DestroyedAnnouncementTextColor; Category = "Public Chinook Announcements"; Setting = "Destroyed Text Color";
            CH47DestroyedAnnouncementTextColor = GetConfig(Category, Setting, CH47DestroyedAnnouncementTextColor);
            CheckTextColor(CH47DestroyedAnnouncementTextColor, Category, Setting, TColor);

            BColor = CH47CrateDroppedAnnouncementBannerColor; Category = "Public Chinook Announcements"; Setting = "Crate Dropped Banner Color";
            CH47CrateDroppedAnnouncementBannerColor = GetConfig(Category, Setting, CH47CrateDroppedAnnouncementBannerColor);
            CheckBannerColor(CH47CrateDroppedAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CH47CrateDroppedAnnouncementTextColor; Category = "Public Chinook Announcements"; Setting = "Crate Dropped Text Color";
            CH47CrateDroppedAnnouncementTextColor = GetConfig(Category, Setting, CH47CrateDroppedAnnouncementTextColor);
            CheckTextColor(CH47CrateDroppedAnnouncementTextColor, Category, Setting, TColor);

            //Bradley APC Announcements
            APCSpawnAnnouncementsEnabled = GetConfig("Public Bradley APC Announcements", "Spawn", APCSpawnAnnouncementsEnabled);
            APCDestroyedAnnouncementsEnabled = GetConfig("Public Bradley APC Announcements", "Destroyed", APCDestroyedAnnouncementsEnabled);
            APCDestroyedAnnouncementsWithDestroyer = GetConfig("Public Bradley APC Announcements", "Show Destroyer", APCDestroyedAnnouncementsWithDestroyer);
            APCSpawnAnnouncementText = GetConfig("Public Bradley APC Announcements", "Spawn Text", APCSpawnAnnouncementText);
            APCDestroyedAnnouncementText = GetConfig("Public Bradley APC Announcements", "Destroyed Text", APCDestroyedAnnouncementText);
            APCDestroyedAnnouncementWithDestroyerText = GetConfig("Public Bradley APC Announcements", "Destroyed With Destroyer Text", APCDestroyedAnnouncementWithDestroyerText);

            BColor = APCSpawnAnnouncementBannerColor; Category = "Public Bradley APC Announcements"; Setting = "Spawn Banner Color";
            APCSpawnAnnouncementBannerColor = GetConfig(Category, Setting, APCSpawnAnnouncementBannerColor);
            CheckBannerColor(APCSpawnAnnouncementBannerColor, Category, Setting, BColor);

            TColor = APCSpawnAnnouncementTextColor; Category = "Public Bradley APC Announcements"; Setting = "Spawn Text Color";
            APCSpawnAnnouncementTextColor = GetConfig(Category, Setting, APCSpawnAnnouncementTextColor);
            CheckTextColor(APCSpawnAnnouncementTextColor, Category, Setting, TColor);

            BColor = APCDestroyedAnnouncementBannerColor; Category = "Public Bradley APC Announcements"; Setting = "Destroyed Banner Color";
            APCDestroyedAnnouncementBannerColor = GetConfig(Category, Setting, APCDestroyedAnnouncementBannerColor);
            CheckBannerColor(APCDestroyedAnnouncementBannerColor, Category, Setting, BColor);

            TColor = APCDestroyedAnnouncementTextColor; Category = "Public Bradley APC Announcements"; Setting = "Destroyed Text Color";
            APCDestroyedAnnouncementTextColor = GetConfig(Category, Setting, APCDestroyedAnnouncementTextColor);
            CheckTextColor(APCDestroyedAnnouncementTextColor, Category, Setting, TColor);

            //Cargoship Announcements
            CargoshipSpawnAnnouncementsEnabled = GetConfig("Public Cargoship Announcements", "Spawn", CargoshipSpawnAnnouncementsEnabled);
            CargoshipEgressAnnouncementsEnabled = GetConfig("Public Cargoship Announcements", "Leave", CargoshipEgressAnnouncementsEnabled);
            CargoshipSpawnAnnouncementText = GetConfig("Public Cargoship Announcements", "Spawn Text", CargoshipSpawnAnnouncementText);
            CargoshipEgressAnnouncementText = GetConfig("Public Cargoship Announcements", "Leave Text", CargoshipEgressAnnouncementText);

            BColor = CargoshipSpawnAnnouncementBannerColor; Category = "Public Cargoship Announcements"; Setting = "Spawn Banner Color";
            CargoshipSpawnAnnouncementBannerColor = GetConfig(Category, Setting, CargoshipSpawnAnnouncementBannerColor);
            CheckBannerColor(CargoshipSpawnAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CargoshipSpawnAnnouncementTextColor; Category = "Public Cargoship Announcements"; Setting = "Spawn Text Color";
            CargoshipSpawnAnnouncementTextColor = GetConfig(Category, Setting, CargoshipSpawnAnnouncementTextColor);
            CheckTextColor(CargoshipSpawnAnnouncementTextColor, Category, Setting, TColor);

            BColor = CargoshipEgressAnnouncementBannerColor; Category = "Public Cargoship Announcements"; Setting = "Leave Banner Color";
            CargoshipEgressAnnouncementBannerColor = GetConfig(Category, Setting, CargoshipEgressAnnouncementBannerColor);
            CheckBannerColor(CargoshipEgressAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CargoshipEgressAnnouncementTextColor; Category = "Public Cargoship Announcements"; Setting = "Leave Text Color";
            CargoshipEgressAnnouncementTextColor = GetConfig(Category, Setting, CargoshipEgressAnnouncementTextColor);
            CheckTextColor(CargoshipEgressAnnouncementTextColor, Category, Setting, TColor);

            //Crate Hack Announcements
            CrateHackAnnouncementsEnabled = GetConfig("Public Oil Rig Crate Hack Announcements", "Enabled", CrateHackAnnouncementsEnabled);
            CrateHackSpecifyOilRig = GetConfig("Public Oil Rig Crate Hack Announcements", "Specify Which Oil Rig", CrateHackSpecifyOilRig);
            CrateHackAnnouncementText = GetConfig("Public Oil Rig Crate Hack Announcements", "Hack Text", CrateHackAnnouncementText);
            CrateHackAnnouncementSmallOilRigText = GetConfig("Public Oil Rig Crate Hack Announcements", "Hack Text With Small Oil Rig", CrateHackAnnouncementSmallOilRigText);
            CrateHackAnnouncementLargeOilRigText = GetConfig("Public Oil Rig Crate Hack Announcements", "Hack Text With Large Oil Rig", CrateHackAnnouncementLargeOilRigText);

            BColor = CrateHackAnnouncementBannerColor; Category = "Public Oil Rig Crate Hack Announcements"; Setting = "Banner Color";
            CrateHackAnnouncementBannerColor = GetConfig("Public Oil Rig Crate Hack Announcements", "Banner Color", CrateHackAnnouncementBannerColor);
            CheckBannerColor(CrateHackAnnouncementBannerColor, Category, Setting, BColor);

            TColor = CrateHackAnnouncementTextColor; Category = "Public Oil Rig Crate Hack Announcements"; Setting = "Text Color";
            CrateHackAnnouncementTextColor = GetConfig("Public Oil Rig Crate Hack Announcements", "Text Color", CrateHackAnnouncementTextColor);
            CheckTextColor(CrateHackAnnouncementTextColor, Category, Setting, TColor);

            //New Player Announcements
            NewPlayerAnnouncementsEnabled = GetConfig("Private New Player Announcements", "Enabled", NewPlayerAnnouncementsEnabled);
            NewPlayerAnnouncementsList = GetConfig("Private New Player Announcements", "Announcements List (Show On This Many Joins : List To Show)", NewPlayerAnnouncementsList);

            BColor = NewPlayerAnnouncementsBannerColor; Category = "Private New Player Announcements"; Setting = "Banner Color";
            NewPlayerAnnouncementsBannerColor = GetConfig(Category, Setting, NewPlayerAnnouncementsBannerColor);
            CheckBannerColor(NewPlayerAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = NewPlayerAnnouncementsTextColor; Category = "Private New Player Announcements"; Setting = "Text Color";
            NewPlayerAnnouncementsTextColor = GetConfig(Category, Setting, NewPlayerAnnouncementsTextColor);
            CheckTextColor(NewPlayerAnnouncementsTextColor, Category, Setting, TColor);

            //Player Banned Announcement
            PlayerBannedAnnouncementsEnabled = GetConfig("Public Player Banned Announcement", "Enabled", PlayerBannedAnnouncementsEnabled);
            PlayerBannedAnnouncmentText = GetConfig("Public Player Banned Announcement", "Text", PlayerBannedAnnouncmentText);

            BColor = PlayerBannedAnnouncementBannerColor; Category = "Public Player Banned Announcement"; Setting = "Banner Color";
            PlayerBannedAnnouncementBannerColor = GetConfig(Category, Setting, PlayerBannedAnnouncementBannerColor);
            CheckBannerColor(PlayerBannedAnnouncementBannerColor, Category, Setting, BColor);

            TColor = PlayerBannedAnnouncementTextColor; Category = "Public Player Banned Announcement"; Setting = "Text Color";
            PlayerBannedAnnouncementTextColor = GetConfig(Category, Setting, PlayerBannedAnnouncementTextColor);
            CheckTextColor(PlayerBannedAnnouncementTextColor, Category, Setting, TColor);

            //Respawn Announcements
            RespawnAnnouncementsEnabled = GetConfig("Private Respawn Announcements", "Enabled", RespawnAnnouncementsEnabled);
            RespawnAnnouncementsList = GetConfig("Private Respawn Announcements", "Announcements List", RespawnAnnouncementsList);

            BColor = RespawnAnnouncementsBannerColor; Category = "Private Respawn Announcements"; Setting = "Banner Color";
            RespawnAnnouncementsBannerColor = GetConfig(Category, Setting, RespawnAnnouncementsBannerColor);
            CheckBannerColor(RespawnAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = RespawnAnnouncementsTextColor; Category = "Private Respawn Announcements"; Setting = "Text Color";
            RespawnAnnouncementsTextColor = GetConfig(Category, Setting, RespawnAnnouncementsTextColor);
            CheckTextColor(RespawnAnnouncementsTextColor, Category, Setting, TColor);

            //Restart Announcements
            RestartAnnouncementsEnabled = GetConfig("Public Restart Announcements", "Enabled", RestartAnnouncementsEnabled);
            RestartTimesList = GetConfig("Public Restart Announcements", "Restart At (HH:MM:SS)", RestartTimesList);
            if (RestartTimesList.Contains("24:00:00"))
            {
                RestartTimesList[RestartTimesList.IndexOf("24:00:00")] = "00:00:00";
                PrintWarning("\"Public Restart Announcements - Restart At (HH:MM:SS): \"24:00:00\" The 24th hour does not exist, converting to 00:00:00 (the same time)");
                Config["Public Restart Announcements", "Restart Times"] = RestartTimesList;
                ConfigUpdated = true;
            }
            RestartAnnouncementsTimes = GetConfig("Public Restart Announcements", "Announce With Time Left (HH:MM:SS)", RestartAnnouncementsTimes);
            RestartServer = GetConfig("Public Restart Announcements", "Restart My Server", RestartServer);
            RestartAnnouncementsFormat = GetConfig("Public Restart Announcements", "Restart Announcement Text", RestartAnnouncementsFormat);
            RestartSuspendedAnnouncement = GetConfig("Public Restart Announcements", "Suspended Restart Text", RestartSuspendedAnnouncement);
            RestartCancelledAnnouncement = GetConfig("Public Restart Announcements", "Cancelled Scheduled Restart Text", RestartCancelledAnnouncement);

            BColor = RestartAnnouncementsBannerColor; Category = "Public Restart Announcements"; Setting = "Banner Color";
            RestartAnnouncementsBannerColor = GetConfig(Category, Setting, RestartAnnouncementsBannerColor);
            CheckBannerColor(RestartAnnouncementsBannerColor, Category, Setting, BColor);

            TColor = RestartAnnouncementsTextColor; Category = "Public Restart Announcements"; Setting = "Text Color";
            RestartAnnouncementsTextColor = GetConfig(Category, Setting, RestartAnnouncementsTextColor);
            CheckTextColor(RestartAnnouncementsTextColor, Category, Setting, TColor);

            //Test Announcement
            TestAnnouncementFontSize = GetConfig("Private Test Announcement", "Font Size", TestAnnouncementFontSize);
            TestAnnouncementDuration = GetConfig("Private Test Announcement", "Duration", TestAnnouncementDuration);
            TestAnnouncementFadeInTime = GetConfig("Private Test Announcement", "Fade In Time", TestAnnouncementFadeInTime);
            TestAnnouncementFadeOutTime = GetConfig("Private Test Announcement", "Fade Out Time", TestAnnouncementFadeOutTime);
            TestAnnouncementAdjustVPosition = GetConfig("Private Test Announcement", "Adjust Vertical Position", TestAnnouncementAdjustVPosition);
            if (TestAnnouncementAdjustVPosition != 0f)
            {
                TABannerAnchorMaxY = (float.Parse("0.9743") + TestAnnouncementAdjustVPosition).ToString();
                TABannerAnchorMinY = (float.Parse("0.915") + TestAnnouncementAdjustVPosition).ToString();
                TATextAnchorMaxY = (float.Parse("0.9743") + TestAnnouncementAdjustVPosition).ToString();
                TATextAnchorMinY = (float.Parse("0.915") + TestAnnouncementAdjustVPosition).ToString();
            }

            BColor = TestAnnouncementBannerColor; Category = "Private Test Announcement"; Setting = "Banner Color";
            TestAnnouncementBannerColor = GetConfig(Category, Setting, TestAnnouncementBannerColor);
            CheckBannerColor(TestAnnouncementBannerColor, Category, Setting, BColor);

            TColor = TestAnnouncementsTextColor; Category = "Private Test Announcement"; Setting = "Text Color";
            TestAnnouncementsTextColor = GetConfig(Category, Setting, TestAnnouncementsTextColor);
            CheckTextColor(TestAnnouncementsTextColor, Category, Setting, TColor);

            //Third Party Plugin Support
            DoNotOverlayLustyMap = GetConfig("Third Party Plugin Support", "Do Not Overlay LustyMap", DoNotOverlayLustyMap);
            LustyMapPosition = GetConfig("Third Party Plugin Support", "LustyMap Position (Left/Right)", LustyMapPosition);
            if (LustyMapPosition.ToLower() != "left" && LustyMapPosition.ToLower() != "right" || LustyMapPosition == string.Empty || LustyMapPosition == null)
            {
                PrintWarning("Config: \"Third Party Plugin Support - LustyMap Position(Left / Right)\" is not left or right, resetting to left.");
                Config["Third Party Plugin Support", "LustyMap Position (Left/Right)"] = "Left";
                ConfigUpdated = true;
            }
            if (DoNotOverlayLustyMap == true)
            {
                if (LustyMapPosition.ToLower() == "left")
                    BannerAnchorMinX = "0.131 ";
                if (LustyMapPosition.ToLower() == "right")
                    BannerAnchorMaxX = "0.868 ";
            }

            //Welcome Announcements
            WelcomeAnnouncementsEnabled = GetConfig("Private Welcome Announcements", "Enabled", WelcomeAnnouncementsEnabled);
            WelcomeBackAnnouncement = GetConfig("Private Welcome Announcements", "Show Welcome Back If Player Has Been Here Before", WelcomeBackAnnouncement);
            WelcomeAnnouncementText = GetConfig("Private Welcome Announcements", "Welcome Text", WelcomeAnnouncementText);
            WelcomeBackAnnouncementText = GetConfig("Private Welcome Announcements", "Welcome Back Text", WelcomeBackAnnouncementText);
            WelcomeAnnouncementDuration = GetConfig("Private Welcome Announcements", "Duration", WelcomeAnnouncementDuration);
            if (WelcomeAnnouncementDuration == 0)
            {
                PrintWarning("Config: \"Private Welcome Announcement - Duration\" set to 0, resetting to 20f.");
                Config["Private Welcome Announcements", "Duration"] = 20f;
                ConfigUpdated = true;
            }
            WelcomeAnnouncementDelay = GetConfig("Private Welcome Announcements", "Delay", WelcomeAnnouncementDelay);

            BColor = WelcomeAnnouncementBannerColor; Category = "Private Welcome Announcements"; Setting = "Banner Color";
            WelcomeAnnouncementBannerColor = GetConfig(Category, Setting, WelcomeAnnouncementBannerColor);
            CheckBannerColor(WelcomeAnnouncementBannerColor, Category, Setting, BColor);

            TColor = WelcomeAnnouncementTextColor; Category = "Private Welcome Announcements"; Setting = "Text Color";
            WelcomeAnnouncementTextColor = GetConfig(Category, Setting, WelcomeAnnouncementTextColor);
            CheckTextColor(WelcomeAnnouncementTextColor, Category, Setting, TColor);

            if (ConfigUpdated)
            {
                Puts("Configuration file has been updated.");
                SaveConfig();
                ConfigUpdated = false;
                LoadGUIAnnouncementsConfig();
            }
        }

        protected override void LoadDefaultConfig() => PrintWarning("A new configuration file has been created.");

        private T GetConfig<T>(string category, string setting, T defaultValue)
        {
            var data = Config[category] as Dictionary<string, object>;
            object value;
            if (data == null)
            {
                data = new Dictionary<string, object>();
                Config[category] = data;
                ConfigUpdated = true;
            }
            if (data.TryGetValue(setting, out value))
            {
                if (setting == "Announcements List (Show On This Many Joins : List To Show)" || setting == "Announcement List (Show at this in game time : Announcements to show)" || setting == "Announcement List (Show at this local time : Announcements to show)")
                {
                    var keyType = typeof(T).GetGenericArguments()[0];
                    var valueType = typeof(T).GetGenericArguments()[1];
                    var dict = (IDictionary)Activator.CreateInstance(typeof(T));
                    foreach (var key in ((IDictionary)value).Keys)
                        dict.Add(Convert.ChangeType(key, keyType), Convert.ChangeType(((IDictionary)value)[key], valueType));
                    return (T)dict;
                }
                return (T)Convert.ChangeType(value, typeof(T));
            }
            value = defaultValue;
            data[setting] = value;
            ConfigUpdated = true;
            return (T)Convert.ChangeType(value, typeof(T));
        }

        private List<string> ConvertObjectListToString(object value)
        {
            if (value is List<object>)
            {
                List<object> list = (List<object>)value;
                List<string> strings = list.Select(s => (string)s).ToList();
                return strings;
            }
            else return (List<string>)value;
        }
        #endregion
        #endregion
        //============================================================================================================
        #region PlayerData

        void SaveData() => Interface.Oxide.DataFileSystem.WriteObject("GUIAnnouncementsPlayerData", storedData);

        void LoadSavedData()
        {
            storedData = Interface.Oxide.DataFileSystem.ReadObject<StoredData>("GUIAnnouncementsPlayerData");
            if (storedData == null)
            {
                PrintWarning("GUIAnnouncement's datafile is null. Recreating data file...");
                storedData = new StoredData();
                SaveData();
                timer.Once(5, () =>
                {
                    PrintWarning("Reloading...");
                    Interface.Oxide.ReloadPlugin(Title);
                });
            }
        }

        class StoredData
        {
            public Dictionary<ulong, PlayerData> PlayerData = new Dictionary<ulong, PlayerData>();
            public StoredData() { }
        }

        class PlayerData
        {
            public string Name;
            public string UserID;
            public int TimesJoined;
            public bool Dead;
            public PlayerData() { }
        }

        void CreatePlayerData(BasePlayer player)
        {
            var Data = new PlayerData
            {
                Name = player.displayName,
                UserID = player.userID.ToString(),
                TimesJoined = 0
            };
            storedData.PlayerData.Add(player.userID, Data);
            SaveData();
        }

        StoredData storedData;
        void OnServerSave() => SaveData();

        private Dictionary<ulong, AnnouncementInfo> AnnouncementsData = new Dictionary<ulong, AnnouncementInfo>();

        class AnnouncementInfo
        {
            public string BannerTintColor;
            public string TextColor;
            public bool IsTestAnnouncement;
            public AnnouncementInfo() { }
        }

        void StoreAnnouncementData(BasePlayer player, string BannerTintColor, string TextColor, bool IsTestAnnouncement)
        {
            var Data = new AnnouncementInfo
            {
                BannerTintColor = BannerTintColor,
                TextColor = TextColor,
                IsTestAnnouncement = IsTestAnnouncement
            };
            AnnouncementsData.Add(player.userID, Data);
        }

        #endregion
        //============================================================================================================
        #region Localization

        void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
                {
                //Commands
                    {"AnnouncementsCommandPrefix", "announce"},
                    {"OperationsCommandPrefix", "guia"},
                    {"CommandSuffixAnnounceToPlayer", "toplayer"},
                    {"CommandSuffixAnnounceToGroup", "togroup"},
                    {"CommandSuffixAnnouncementTest", "test"},
                    {"CommandSuffixDestroyAnnouncement", "destroy"},
                    {"CommandSuffixMuteBans", "mutebans"},
                    {"CommandSuffixToggleAnnouncements", "toggle"},
                    {"CommandSuffixScheduleRestart", "schedulerestart"},
                    {"CommandSuffixSuspendRestart", "suspendrestart"},
                    {"CommandSuffixResumeRestart", "resumerestart"},
                    {"CommandSuffixGetNextRestart", "nextrestart"},
                    {"CommandSuffixCancelScheduledRestart", "cancelscheduledrestart"},
                    {"CommandSuffixHelp", "help"},
                //NotFound
                    {"PlayerNotFound", "Player {playername} not found, check the name and if they are online."},
                    {"GroupNotFound", "Group {group} not found, check the name."},
                //Permission
                    {"NoPermission", "You do not possess the required permissions."},
                //CommandUsage
                    {"AnnouncementsCommandPrefixUsage", "Usage: /announce <message>, /announce toplayer <player> <message>, /announce togroup <group> <message>."},
                    {"OperationsCommandPrefixUsage", "Usage: /guia test, /guia destroy, /guia toggle [player], /guia mutebans, /guia schedulerestart <time> [reason], /guia cancelscheduledrestart, /guia suspendrestart, /guia resumerestart, /guia nextrestart, /guia help."},
                    {"AnnounceToPlayerUsage", "Usage: /announce toplayer <player> <message>."},
                    {"AnnounceToGroupUsage", "Usage: /announce togroup <group> <message>."},
                    {"AnnouncementsToggleUsage", "Usage: /guia toggle [player]."},
                    {"ScheduleRestartUsage", "Usage: /guia schedulerestart <hh:mm:ss>."},
                    {"RunTestAnnouncementFromInGame", "You must run this command from in the game."},
                //RestartMessages
                    {"ServerAboutToRestart", "Your server is about to restart, there is no need to schedule a restart right now."},
                    {"RestartScheduled", "Restart scheduled in {time}{reason}."},
                    {"RestartAlreadyScheduled", "A restart has already been scheduled for {time}, please cancel that restart first with /guia cancelscheduledrestart." },
                    {"LaterThanNextRestart", "Restart not scheduled. Your time will be scheduled later than the next restart at {time}, please make sure you schedule a re