C#:
using Network;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace Oxide.Plugins
{
[Info("ConnectionMessages", "Vlad-00003", "1.0.0")]
[Description("Show message on user connection")]
/*
* Author info:
* E-mail: Vlad-00003@mail.ru
* Vk: vk.com/vlad_00003
*/
class ConnectionMessages : RustPlugin
{
#region Vars
private PluginConfig _config;
private List<Connection> _connections;
#endregion
#region Configuration
private class MessageConfig
{
[JsonProperty("Заголовок")]
private string _title;
[JsonProperty("Текст")]
private string _text;
#region Default Config
public static MessageConfig DefaultConfig => new MessageConfig
{
_title = "Welcome to <color=red>Server #1</color>!",
_text = "<i>deep.exe</i>"
};
public static MessageConfig DefaultConfig2 => new MessageConfig
{
_title = "<u>Hello there!</u>",
_text = "<b>You are joining <size=15>Server #1</size></b>"
};
#endregion
public void Send(Connection connection)
{
if (!Net.sv.write.Start()) return;
Net.sv.write.PacketID(Message.Type.Message);
Net.sv.write.String(_title);
Net.sv.write.String(_text);
Net.sv.write.Send(new SendInfo(connection));
}
}
private class PluginConfig
{
[JsonProperty("Частота сообщений.0 - сообщение будет показано 1 раз")]
public float MessageRate;
[JsonProperty("Менять сообщение при каждом обновлении")]
private bool _newEveryTime;
[JsonProperty("Выбирать сообщение случайно (false - в порядке очереди)")]
private bool _randomMessage;
[JsonProperty("Список сообщений")]
private List<MessageConfig> _messages;
#region Default Config
public static PluginConfig DefaultConfig => new PluginConfig
{
MessageRate = 0,
_newEveryTime = false,
_randomMessage = false,
_messages = new List<MessageConfig>
{
MessageConfig.DefaultConfig,
MessageConfig.DefaultConfig2
}
};
#endregion
[JsonIgnore]
private Dictionary<Connection, MessageConfig> _chosenMessages;
[JsonIgnore]
private Dictionary<Connection, int> _messageOrder;
private MessageConfig GetMessage(Connection con)
{
if (_randomMessage)
return _messages[UnityEngine.Random.Range(0, _messages.Count)];
if (!_messageOrder.ContainsKey(con))
_messageOrder[con] = -1;
if (++_messageOrder[con] >= _messages.Count)
_messageOrder[con] = 0;
return _messages[_messageOrder[con]];
}
public void Init()
{
if (!_randomMessage)
_messageOrder = new Dictionary<Connection, int>();
if (!_newEveryTime)
_chosenMessages = new Dictionary<Connection, MessageConfig>();
}
public void SendMessage(Connection con, bool newConnection = true)
{
MessageConfig message;
if (newConnection || _newEveryTime)
message = GetMessage(con);
else
{
if (!_chosenMessages.TryGetValue(con, out message))
{
message = GetMessage(con);
_chosenMessages[con] = message;
}
}
message.Send(con);
}
}
#endregion
#region Config Initialization
protected override void LoadConfig()
{
base.LoadConfig();
try
{
_config = Config.ReadObject<PluginConfig>();
}
catch (Exception ex)
{
PrintError("Failed to load config file(is the config file corrupt ?)(" + ex.Message + ")");
}
//version check
if (CheckConfig())
SaveConfig();
}
private bool CheckConfig()
{
return false;
}
protected override void LoadDefaultConfig()
{
_config = PluginConfig.DefaultConfig;
}
protected override void SaveConfig()
{
Config.WriteObject(_config);
}
#endregion
#region Initialization
private void Init()
{
_config.Init();
if (_config.MessageRate <= 0)
{
Unsubscribe("OnPlayerConnected");
return;
}
_connections = new List<Connection>();
ServerMgr.Instance.InvokeRepeating(MessagesCycle, _config.MessageRate, _config.MessageRate);
}
private void MessagesCycle()
{
_connections.ForEach(x => _config.SendMessage(x, false));
}
#endregion
#region Oxide Hooks
private void OnClientAuth(Connection connection)
{
_config.SendMessage(connection);
if (_config.MessageRate <= 0)
return;
_connections.Add(connection);
}
private void OnPlayerConnected(BasePlayer player)
{
_connections.Remove(player.net.connection);
}
#endregion
}
}