C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Game.Rust.Cui;
namespace Oxide.Plugins
{
[Info("Welcome Screen", "Mevent", "1.1.0")]
[Description("Showing welcoming image on player joining")]
public class WelcomeScreen : RustPlugin
{
#region Config
private static ConfigData _config = new ConfigData();
private class ConfigData
{
[JsonProperty(PropertyName = "Image URL")]
public string url = "https://i.imgur.com/RhMXzvF.jpg";
[JsonProperty(PropertyName = "Fade-in duration")]
public float fadeIn = 5f;
[JsonProperty(PropertyName = "Fade-out duration")]
public float fadeOut = 5f;
[JsonProperty(PropertyName = "Delay after joining to create image")]
public float delay = 10f;
[JsonProperty(PropertyName = "Delay after creating image to start fade out")]
public float duration = 20f;
[JsonProperty(PropertyName = "Anchor min (left bottom coordinate)")]
public string anchorMin = "0 0";
[JsonProperty(PropertyName = "Anchor min (right top coordinate)")]
public string anchorMax = "1 1";
[JsonProperty(PropertyName = "Image transparency")]
public float transparency = 1f;
[JsonProperty(PropertyName = "Show multiple times?")]
public bool MultipleTimes = true;
}
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_config = Config.ReadObject<ConfigData>();
if (_config == null) LoadDefaultConfig();
}
catch
{
for (var i = 0; i < 3; i++)
PrintError("Configuration file is corrupt! Check your config file at https://jsonlint.com/");
LoadDefaultConfig();
return;
}
ValidateConfig();
SaveConfig();
}
private static void ValidateConfig()
{
}
protected override void LoadDefaultConfig()
{
_config = new ConfigData();
}
protected override void SaveConfig()
{
Config.WriteObject(_config);
}
#endregion
#region Data
private PluginData _data;
private void SaveData()
{
Interface.Oxide.DataFileSystem.WriteObject(Name, _data);
}
private void LoadData()
{
try
{
_data = Interface.Oxide.DataFileSystem.ReadObject<PluginData>(Name);
}
catch (Exception e)
{
PrintError(e.ToString());
}
if (_data == null) _data = new PluginData();
}
private class PluginData
{
[JsonProperty(PropertyName = "Players", ObjectCreationHandling = ObjectCreationHandling.Replace)]
public List<ulong> Players = new List<ulong>();
}
#endregion
#region Hooks
private void Init()
{
if (!_config.MultipleTimes)
LoadData();
LoadUi();
}
private void OnPlayerConnected(BasePlayer player)
{
if (player == null)
return;
if (!_config.MultipleTimes)
{
if (_data.Players.Contains(player.userID))
return;
_data.Players.Add(player.userID);
}
if (_config.delay > 0)
timer.Once(_config.delay, () => CreateGUI(player));
else
CreateGUI(player);
}
private void Unload()
{
foreach (var player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, Layer);
if (!_config.MultipleTimes)
SaveData();
_config = null;
}
#endregion
#region Commands
[ChatCommand("welcomescreen")]
private void Cmd(BasePlayer player)
{
OnPlayerConnected(player);
}
#endregion
#region Interface
private const string Layer = "welcomescreen.main";
private void CreateGUI(BasePlayer player)
{
CuiHelper.DestroyUi(player, Layer);
CuiHelper.AddUi(player, _mainUi);
if (_config.duration > 0) timer.Once(_config.duration, () => CuiHelper.DestroyUi(player, Layer));
}
#endregion
#region Utils
private string _mainUi;
private void LoadUi()
{
var container = new CuiElementContainer
{
new CuiElement
{
Name = Layer,
FadeOut = _config.fadeOut,
Components =
{
new CuiRawImageComponent
{Color = $"1 1 1 {_config.transparency}", FadeIn = _config.fadeIn, Url = _config.url},
new CuiRectTransformComponent
{
AnchorMin = _config.anchorMin,
AnchorMax = _config.anchorMax
}
}
},
new CuiElement
{
Parent = Layer,
Components =
{
new CuiButtonComponent
{
Color = "0 0 0 0",
Close = Layer
},
new CuiRectTransformComponent
{
AnchorMin = "0 0",
AnchorMax = "1 1"
}
}
}
};
_mainUi = CuiHelper.ToJson(container);
}
#endregion
}
}