Иконка ресурса

FREE ZoneAutoDoors : 0.0.1 0.0.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Core;
using Oxide.Core.Plugins;
using System.Collections.Generic;

// ReSharper disable once CheckNamespace
namespace Oxide.Plugins
{
    [Info("ZoneAutoDoors", "MJSU", "0.0.1")]
    [Description("Force auto doors in set zones")]
    class ZoneAutoDoors : RustPlugin
    {
        [PluginReference]
        Plugin ZoneManager;

        #region Class Fields
        private StoredData _storedData; //Plugin Data
        private PluginConfig _pluginConfig; //Plugin Config

        private const string UsePermission = "ZoneAutoDoors.use";
        #endregion

        #region Setup & Loading
        // ReSharper disable once UnusedMember.Local
        private void Loaded()
        {
            LoadLang();

            _pluginConfig = ConfigOrDefault(Config.ReadObject<PluginConfig>());
            if (_pluginConfig.Prefix == null) PrintError("Loading config file failed.Using default config");
            else Config.WriteObject(_pluginConfig, true);

            _storedData = Interface.Oxide.DataFileSystem.ReadObject<StoredData>("ZoneAutoDoors");

            permission.RegisterPermission(UsePermission, this);
        }

        ////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Register the lang messages
        /// </summary>
        /// ////////////////////////////////////////////////////////////////////////
        private void LoadLang()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["NoPermission"] = "You do not have permission to use this command",
                ["AddSyntax"] = "Invalid add syntax - /zad add ZoneId seconds",
                ["RemoveSyntax"] = "Invalid remove syntax - /zad remove ZoneId",
                ["InvalidSeconds"] = "The time you set of {0} is not valid",
                ["Added"] = "You have added zone {0} with a delay of {1} seconds",
                ["Removed"] = "You have removed zone {0}",
                ["NotAZone"] = "The zone id {0} is an an active zone"
            }, this);
        }

        ////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// load the default config for this plugin
        /// </summary>
        /// ////////////////////////////////////////////////////////////////////////
        protected override void LoadDefaultConfig()
        {
            Config.WriteObject(ConfigOrDefault(null), true);
        }

        ////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Uses the values passed in from config.If any values are null it updates them with default values
        /// </summary>
        /// <param name="config">Config that has been loaded or null</param>
        /// <returns>Config using values passed in from config default values</returns>
        /// ////////////////////////////////////////////////////////////////////////
        private PluginConfig ConfigOrDefault(PluginConfig config)
        {
            return new PluginConfig
            {
                Prefix = config?.Prefix ?? "[<color=yellow>Zone Auto Doors</color>]",
            };
        }

        // ReSharper disable once UnusedMember.Local
        private void OnServerInitialized()
        {
            if (ZoneManager == null)
            {
                PrintWarning("ZoneAutoDoors could not find ZoneManager.ZoneAutoDoors will not work");
            }
        }
        #endregion

        #region Chat Command
        [ChatCommand("zonead")]
        // ReSharper disable once UnusedMember.Local
        // ReSharper disable once UnusedParameter.Local
        private void ZoneAutoDoorsChatCommand(BasePlayer player, string command, string[] args)
        {
            if (!player.IsAdmin() && !HasPermission(player, UsePermission))
            {
                PrintToChat(player, Lang("NoPermission", player.UserIDString));
                return;
            }

            if (args.Length < 1)
            {
                SendHelpText(player);
                return;
            }

            switch (args[0].ToLower())
            {
                case "add":
                    HandleAddCommand(player, args);
                    break;

                case "remove":
                    HandleRemoveCommand(player, args);
                    break;

                case "list":
                    HandleListCommand(player);
                    break;

                default:
                    SendHelpText(player);
                    break;
            }

            Interface.Oxide.DataFileSystem.WriteObject("ZoneAutoDoors", _storedData);
        }

        /// <summary>
        /// Handles the chat command for adding auto doors to a zone
        /// </summary>
        /// <param name="player">player calling the command</param>
        /// <param name="args">args for setting up the auto doors</param>
        private void HandleAddCommand(BasePlayer player, string[] args)
        {
            if (args.Length != 3) //make sure we have the correct number of arguments
            {
                PrintToChat(player, $"{_pluginConfig.Prefix} {Lang("AddSyntax", player.UserIDString)}");
                return;
            }

            float time;
            if (!float.TryParse(args[2], out time) || time <= 0) //failed to parse time or it is <= 0
            {
                PrintToChat(player, $"{_pluginConfig.Prefix} {Lang("InvalidSeconds", player.UserIDString, args[2])}");
                return;
            }

            if(ZoneManager?.Call("CheckZoneID", args[1]) == null)
            {
                PrintToChat(player, Lang("NotAZone", args[1]));
                return;
            }

            _storedData.ZoneTimes[args[1]] = time;
            PrintToChat(player, $"{_pluginConfig.Prefix} {Lang("Added", player.UserIDString, args[1], args[2])}");
        }

        /// <summary>
        /// Handle the chat command for removing auto doors from a zone
        /// </summary>
        /// <param name="player">player calling the command</param>
        /// <param name="args">args for removing auto doors</param>
        private void HandleRemoveCommand(BasePlayer player, string[] args)
        {
            if (args.Length != 2) //make sure we have the correct number of arguments
            {
                PrintToChat(player, $"{_pluginConfig.Prefix} {Lang("RemoveSyntax", player.UserIDString)}");
                return;
            }

            if (ZoneManager?.Call("CheckZoneID", args[1]) == null)
            {
                PrintToChat(player, Lang("NotAZone", args[1]));
                return;
            }

            _storedData.ZoneTimes.Remove(args[1]);
            PrintToChat(player, $"{_pluginConfig.Prefix} {Lang("Removed", player.UserIDString, args[1])}");
        }

        /// <summary>
        /// Lists all the zones with auto doors to the player
        /// </summary>
        /// <param name="player"></param>
        private void HandleListCommand(BasePlayer player)
        {
            string message = $"{_pluginConfig.Prefix} Zones with auto doors set:\n";
            foreach(KeyValuePair<string, float> zone in _storedData.ZoneTimes)
            {
                message += $"{zone.Key} with {zone.Value} seconds\n";
            }

            PrintToChat(player, message);
        }

        // ReSharper disable once UnusedMember.Local
        private void OnDoorOpened(Door door, BasePlayer player)
        {
            if (door == null || !door.IsOpen() || door.LookupPrefab().name.Contains("shutter")) return;

            float time = -1;
            foreach (KeyValuePair<string, float> zone in _storedData.ZoneTimes)
            {
                if (ZoneManager?.Call<bool>("isPlayerInZone", zone.Key, player) ?? false)
                {
                    time = zone.Value;
                    break;
                }
            }

            if ((int)time == -1) return;

            timer.Once(time, () =>
            {
                if (!door || !door.IsOpen()) return;

                door.SetFlag(BaseEntity.Flags.Open, false);
                door.SendNetworkUpdateImmediate();
            });
        }
        #endregion

        #region Helper Methods
        //////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// @credit to Exel80 - code from EasyVote
        /// </summary>
        /// <param name="key"></param>
        /// <param name="id"></param>
        /// <param name="args"></param>
        /// <returns></returns>
        ///  //////////////////////////////////////////////////////////////////////////////////////
        private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);

        //////////////////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Checks if the user has the given permissions
        /// </summary>
        /// <param name="player">Player to be checked</param>
        /// <param name="perm">Permission to check for</param>
        /// <returns></returns>
        /// //////////////////////////////////////////////////////////////////////////////////////
        private bool HasPermission(BasePlayer player, string perm) => permission.UserHasPermission(player.UserIDString, perm);
        #endregion

        #region Classes
        class PluginConfig
        {
            public string Prefix { get; set; }
        }

        class StoredData
        {
            public Hash<string, float> ZoneTimes = new Hash<string, float>();
        }
        #endregion

        #region Help Text
        private void SendHelpText(BasePlayer player)
        {
            PrintToChat(player, $"{_pluginConfig.Prefix} Help Text:\n" +
                                "Allows admins or players with permission to set a zone from Zone Manager to have auto doors" +
                                "Any door in this zone will close after the set number of seconds" +
                                " - <color=yellow>/zonead</color> - to view this help text\n" +
                                " - <color=yellow>/zonead add zoneId seconds</color> - Will set the auto doors for the given zone id to the number of seconds" +
                                " - <color=yellow>/zonead remove zoneId - Will remove auto doors for the given zone" +
                                " - <color=yellow>/zonead list - will list the zone ids and seconds for each zone with auto doors" +
                                "Note: If you wish to update a zone the run the /zonead add command again for the given zone");
        }
        #endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху