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

FREE SafeSleep : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Safe Sleep", "yung", "1.0.0")]
    [Description("")]
    public class SafeSleep : RustPlugin
    {
        #region Fields
        
        [PluginReference] Plugin Spawns;
        
        private PluginData _pluginData;
        private PluginConfig _pluginConfig;

        #endregion
        
        #region Hooks
        
        
        private void Init()
        {
            LoadData();
        }

        private void OnServerInitialized()
        {
            foreach (BasePlayer player in BasePlayer.activePlayerList)
            {
                if (!_pluginData.PlayersData.ContainsKey(player.userID))
                {
                    _pluginData.PlayersData[player.userID] = new PlayerData(player);
                }
            }

            timer.Repeat(_pluginConfig.CheckInverval, 0, () => 
            {
                foreach (var player in _pluginData.PlayersData)
                { 
                    BasePlayer foundPlayer = BasePlayer.FindAwakeOrSleeping(player.Key.ToString());
                    if (foundPlayer != null && !foundPlayer.IsConnected)
                    {
                        CheckDisconnectTime(foundPlayer);
                    }
                }
            });
            
        }

        private void UnLoad()
        {
            SaveData();
        }
        
        private void OnPlayerConnected(BasePlayer player)
        {
            Dictionary<ulong, PlayerData> data = _pluginData.PlayersData;
            if (!data.ContainsKey(player.userID))
            {
                data[player.userID] = new PlayerData(player);
                NextFrame(() => SaveData());
            }

            if (data[player.userID].IsSafe)
            {
                data[player.userID].IsSafe = false;
                MoveToDisconnectLocation(player);
            }
            
        }

        private void OnPlayerDisconnected(BasePlayer player)
        {
            Dictionary<ulong, PlayerData> data = _pluginData.PlayersData;
            if (data.ContainsKey(player.userID))
            {
                data[player.userID].TimeToMove = DateTime.UtcNow.AddHours(_pluginConfig.MoveTime);
                data[player.userID].InitialPosition = player.transform.position;
            } 
            
        }
        #endregion

        #region Core Methods
        
        private void CheckDisconnectTime(BasePlayer player)
        {
            Dictionary<ulong, PlayerData> data = _pluginData.PlayersData;
            if (data.ContainsKey(player.userID))
            {
                if (data[player.userID].TimeToMove < DateTime.UtcNow && data[player.userID].IsSafe == false)
                {
                    MoveToSafezone(player);
                    data[player.userID].IsSafe = true;
                }
            }
        }

        private void MoveToSafezone(BasePlayer player)
        {
            player.Teleport((Vector3)Spawns.Call("GetRandomSpawn" , _pluginConfig.FileName));
        }

        private void MoveToDisconnectLocation(BasePlayer player)
        { 
            Dictionary<ulong, PlayerData> data = _pluginData.PlayersData;
            player.Teleport(data[player.userID].InitialPosition);

        }
        #endregion
        
        #region Data
        
        private void SaveData() => Interface.Oxide.DataFileSystem.WriteObject(Name, _pluginData);

        private void LoadData()
        {
            try
            {
                _pluginData = Interface.Oxide.DataFileSystem.ReadObject<PluginData>(Name);
            }
            catch (Exception e)
            {
                PrintError(e.ToString());
            }

            if (_pluginData == null)
            {
                _pluginData = new PluginData();
            }
        }

        private class PluginData
        {
            [JsonProperty(PropertyName = "Players Data")]
            public Dictionary<ulong, PlayerData> PlayersData = new Dictionary<ulong, PlayerData>();
        }

        private class PlayerData
        {
            [JsonProperty(PropertyName = "Player Name")]
            public string Name { get; set; }
            
            [JsonProperty(PropertyName = "Player Id")]
            public ulong Id { get; set; }
            
            [JsonProperty(PropertyName = "Time to move")]
            public DateTime TimeToMove { get; set; }
            
            [JsonProperty(PropertyName = "Disconnect Position")]
            public Vector3 InitialPosition { get; set; }
            
            [JsonProperty(PropertyName = "Is Safe?")]
            public bool IsSafe { get; set; }
            public PlayerData(BasePlayer player)
            {
                Name = player.displayName;
                Id = player.userID;
                IsSafe = false;
            }

            [JsonConstructor]
            public PlayerData()
            {

            }
        }
        
        
        #endregion
        
        #region Configuration
        private class PluginConfig
        {
            [JsonProperty(PropertyName = "Time to move a sleeping player (in hours)")]
            public int MoveTime { get; set; }
            
            [JsonProperty(PropertyName = "Check Interval (in seconds)")]
            public int CheckInverval { get; set; }
            
            [DefaultValue("SafeSpawns")]
            [JsonProperty(PropertyName = "Spawns Database config file name")]
            public string FileName { get; set; }
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                _pluginConfig = Config.ReadObject<PluginConfig>();
                if (_pluginConfig == null)
                {
                    throw new Exception();
                }

                SaveConfig();
            }
            catch
            {
                PrintError("Your configuration file contains an error. Using default configuration values.");
                LoadDefaultConfig();
            }
        }

        protected override void SaveConfig() => Config.WriteObject(_pluginConfig);

        protected override void LoadDefaultConfig()
        {
            _pluginConfig = new PluginConfig
            {
               MoveTime = 1,
               CheckInverval = 10,
               FileName = "Name"

            };
        }
        
        
        #endregion
        
    }
}

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