C#:
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Plugins;
using System;
using System.Collections.Generic;
namespace Oxide.Plugins
{
[Info("FSystem", "modified by setfps ", 0.2)]
[Description("Вспомогательный плагин для FSystem (Client)")]
public class FSystem : RustPlugin
{
Teams data = Interface.Oxide.DataFileSystem.ReadObject<Teams>("PlayerData"); //дата
List<char> a;
void OnPlayerInit(BasePlayer player)
{
if (player == null) return;
if (player.HasPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot))
{
timer.Once(1f, () =>
{
OnPlayerInit(player);
});
return;
}
timer.Once(30f, () =>
{
SendPlayerUpdate(player);
});
SendPlayerUpdate(player);
}
struct Team
{
public string Name;
public ulong Owner;
public List<ulong> Members;
public List<ulong> Invited;
}
void Init()
{
string b = "abcdefghijklmnopqrstuvwxyz";
a = new List<char>(b.ToCharArray());
foreach (BasePlayer player in BasePlayer.activePlayerList)
{
SendPlayerUpdate(player);
}
}
private class Teams
{
public HashSet<Team> teams = new HashSet<Team>();
public Teams()
{
}
}
bool TeamExists(string name)
{
name = name.ToLower();
foreach (Team team in data.teams)
{
if (team.Name.ToLower() == name) return true;
}
return false;
}
bool InTeam(ulong steamid)
{
foreach (Team team in data.teams)
{
if (team.Owner == steamid) return true;
if (team.Members != null && team.Members.Contains(steamid)) return true;
}
return false;
}
ulong[] GetHisTeam(ulong steamid)
{
List<ulong> players = new List<ulong>();
Team a = GetTeamEx(steamid);
if (a.Owner != steamid) players.Add(a.Owner);
foreach (ulong member in a.Members)
if (member != steamid) players.Add(member);
return players.ToArray();
}
string GetTeam(ulong steamid)
{
foreach (Team team in data.teams)
{
if (team.Owner == steamid || team.Members.Contains(steamid)) return team.Name;
}
return "";
}
Team GetTeamEx(string name)
{
name = name.ToLower();
foreach (Team team in data.teams)
{
if (team.Name.ToLower() == name) return team;
}
return new Team();
}
Team GetTeamEx(ulong steamid)
{
foreach (Team team in data.teams)
{
if (team.Owner == steamid || team.Members.Contains(steamid)) return team;
}
return new Team();
}
bool IsOwner(ulong steamid)
{
foreach (Team team in data.teams)
{
if (team.Owner == steamid) return true;
}
return false;
}
bool HasTeamate(ulong a, ulong b)
{
if (!InTeam(a) || !InTeam(b)) return false;
if (GetTeam(a) == GetTeam(b)) return true;
return false;
}
void OnPlayerDie(BasePlayer player)
{
Team team = GetTeamEx(player.userID);
SendPlayerUpdate(player);
}
void OnPlayerRespawn(BasePlayer player)
{
Team team = GetTeamEx(player.userID);
SendPlayerUpdate(player);
BasePlayer owner = BasePlayer.FindByID(team.Owner);
if (owner != null) SendPlayerUpdate(owner);
}
void OnPlayerRespawned(BasePlayer player)
{
Team team = GetTeamEx(player.userID);
SendPlayerUpdate(player);
BasePlayer owner = BasePlayer.FindByID(team.Owner);
if (owner != null) SendPlayerUpdate(owner);
}
void SendPlayerUpdate(BasePlayer player)
{
if (player == null) return;
if (!InTeam(player.userID))
{
player.SendConsoleCommand("friendList");
return;
}
string x = "friendList";
Team team = GetTeamEx(player.userID);
if (team.Name.Length < 1) return;
x += $":{team.Owner}";
if (team.Members != null)
{
foreach (ulong member in team.Members)
{
x += $":{member}";
}
}
player.SendConsoleCommand(x);
}
[ChatCommand("t")]
void дапиздецотправкавтимусообщений(BasePlayer player, string command, string[] args)
{
if (args.Length < 1)
{
SendReply(player, "\nИспользование команды:\n/t \"Сообщение\"");
return;
}
if (!InTeam(player.userID))
{
SendReply(player, "\nУ вас нет команды!");
return;
}
Team team = GetTeamEx(player.userID);
if (team.Name.Length < 1) return;
string msg = string.Join(" ", args);
if (msg.Contains("<") || msg.Contains(">") || msg.Contains("://") || msg.Contains("connect")) return;
string message = $"<size=13><color=#AB274F>[TEAM]</color> {player.displayName}: {msg}</size>";
BasePlayer owner = BasePlayer.FindByID(team.Owner);
if (owner != null) owner.SendConsoleCommand("chat.add", player.userID, message);
foreach (ulong member in team.Members)
{
BasePlayer memberPlayer = BasePlayer.FindByID(member);
if (memberPlayer != null)
memberPlayer.SendConsoleCommand("chat.add", player.userID, message);
}
}
[ChatCommand("team")]
void TeamCommand(BasePlayer player, string command, string[] args)
{
if (player == null) return;
if (args.Length < 1)
{
if (!InTeam(player.userID))
{
SendReply(player, "<color=#0080FF>RAINBOW RUST</color>\n<color=#FFFF00>Доступные команды:</color>\n/team create - <color=#00FF00>Создать команду</color>\n/team join - <color=#FF0000>Вступить в команду</color>");
return;
}
Team team = GetTeamEx(player.userID);
string online = $"\nСейчас онлайн: ";
foreach (ulong member in team.Members)
{
BasePlayer mem = BasePlayer.Find(member.ToString());
if (mem != null) online += mem.displayName + ", ";
}
BasePlayer mem2 = BasePlayer.Find(team.Owner.ToString());
if (mem2 != null) online += mem2.displayName;
if (!IsOwner(player.userID))
{
SendReply(player, $"{online}\nДоступные команды:\n<color=#AB274F>/team leave</color> - Покинуть команду\n<color=#AB274F>/t</color> - Чат команды");
return;
}
SendReply(player, $"{online}\nДоступные команды:\n<color=#AB274F>/team invite</color> - Пригласить игрока\n<color=#AB274F>/team remove</color> - Удалить команду\n<color=#AB274F>/t</color> - Чат команды");
return;
}
if (args[0] == "create")
{
if (args.Length < 2)
{
SendReply(player, "<color=#FFFF00>Использование команды:</color>\n/team create <color=#00FF80>\"Название команды\"</color>");
return;
}
if (InTeam(player.userID))
{
SendReply(player, "У вас уже есть команда!");
return;
}
if (args[1].Length < 3 || args[1].Length > 9)
{
SendReply(player, "Название команды должно быть более 2 и не более 8 символов!");
return;
}
foreach (char i in args[1].ToLower().ToCharArray())
{
if (!a.Contains(i))
{
SendReply(player, "Разрешено использовать только лат.символы!");
return;
}
}
if (TeamExists(args[1]))
{
SendReply(player, "Команда с таким названием уже есть!");
return;
}
SendReply(player, "\nВы успешно создали команду!");
data.teams.Add(new Team()
{
Name = args[1],
Owner = player.userID,
Invited = new List<ulong>() { },
Members = new List<ulong>() { }
});
Interface.Oxide.DataFileSystem.WriteObject("PlayerData", data);
}
if (args[0] == "invite")
{
if (args.Length < 2)
{
SendReply(player, "Использование команды:\n<color=#AB274F>/team invite</color> \"Никнейм / SteamID\"");
return;
}
if (!InTeam(player.userID))
{
SendReply(player, "У вас нет команды!");
return;
}
if (!IsOwner(player.userID))
{
SendReply(player, "Вы не создатель команды!");
return;
}
BasePlayer invitable = BasePlayer.Find(args[1]);
if (invitable == null)
{
SendReply(player, "Игрок не найден!");
return;
}
if (InTeam(invitable.userID))
{
SendReply(player, "Данный игрок уже находится в команде!");
return;
}
Team team = GetTeamEx(player.userID);
team.Invited.Add(invitable.userID);
data.teams.Remove(team);
data.teams.Add(team);
Interface.Oxide.DataFileSystem.WriteObject("PlayerData", data);
SendReply(player, $"\nВы успешно пригласили игрока {invitable.displayName}!");
SendReply(invitable, $"\nВас пригласили в команду {team.Name}!\nДля входа используйте: <color=#AB274F>/team join</color> {team.Name}");
}
if (args[0] == "join")
{
if (args.Length < 2)
{
SendReply(player, "Использование команды:\n<color=#AB274F>/team join</color> \"Название команды\"");
return;
}
if (InTeam(player.userID))
{
SendReply(player, "Вы уже в команде!");
return;
}
Team team = GetTeamEx(args[1]);
if (team.Name.Length < 1)
{
SendReply(player, "\nТакой команды не существует!");
return;
}
if (!team.Invited.Contains(player.userID))
{
SendReply(player, "\nВы не были приглашены в данную команду!");
return;
}
SendReply(player, $"\nВы вступили в команду {team.Name}!");
team.Invited.Remove(player.userID);
team.Members.Add(player.userID);
data.teams.Remove(team);
data.teams.Add(team);
Interface.Oxide.DataFileSystem.WriteObject("PlayerData", data);
SendPlayerUpdate(player);
BasePlayer owner = BasePlayer.FindByID(team.Owner);
if (owner != null) SendPlayerUpdate(owner);
foreach (ulong member in team.Members)
{
BasePlayer m = BasePlayer.FindByID(member);
if (m != null) SendPlayerUpdate(m);
}
}
if (args[0] == "leave")
{
if (!InTeam(player.userID))
{
SendReply(player, "\nВы не находитесь в команде!");
return;
}
if (IsOwner(player.userID))
{
SendReply(player, "\nВы являетесь создателем команды!");
return;
}
Team team = GetTeamEx(player.userID);
if (team.Name.Length < 1)
{
SendReply(player, "\nОшибка!");
return;
}
SendReply(player, $"\nВы покинули команду {team.Name}!");
team.Members.Remove(player.userID);
data.teams.Remove(team);
data.teams.Add(team);
Interface.Oxide.DataFileSystem.WriteObject("PlayerData", data);
BasePlayer owner = BasePlayer.FindByID(team.Owner);
if (owner != null) SendPlayerUpdate(owner);
foreach (ulong member in team.Members)
{
BasePlayer m = BasePlayer.FindByID(member);
if (m != null) SendPlayerUpdate(m);
}
}
if (args[0] == "remove")
{
if (!InTeam(player.userID))
{
SendReply(player, "\nВы не находитесь в команде!");
return;
}
if (!IsOwner(player.userID))
{
SendReply(player, "\nВы не являетесь создателем команды!");
return;
}
SendReply(player, "\nВы успешно удалили команду!");
Team team = GetTeamEx(player.userID);
data.teams.Remove(team);
Interface.Oxide.DataFileSystem.WriteObject("PlayerData", data);
BasePlayer owner = BasePlayer.FindByID(team.Owner);
if (owner != null) SendPlayerUpdate(owner);
foreach (ulong member in team.Members)
{
BasePlayer m = BasePlayer.FindByID(member);
if (m != null) SendPlayerUpdate(m);
}
}
}
}
}