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
}
}