C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections.Generic;
using System.Linq;
using Network;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using ProtoBuf;
using UnityEngine;
namespace Oxide.Plugins {
[Info("BetterTeams", "ahigao", "1.0.5")]
internal class BetterTeams : RustPlugin {
#region Static
private Data _data;
private float Scale;
private Configuration _config;
private static BetterTeams _ins;
private const string Layer = "UI_BetterTeams";
private Dictionary<BasePlayer, DateTime> TipRemove = new Dictionary<BasePlayer, DateTime>();
private Dictionary<ulong, DateTime> PlayerMarkerCooldown = new Dictionary<ulong, DateTime>();
private Dictionary<ulong, VoiceTranslator> VoiceTranslators = new Dictionary<ulong, VoiceTranslator>();
private Dictionary<ulong, List<BasePlayer>> OnlineTeams = new Dictionary<ulong, List<BasePlayer>>();
private HashSet<CodeLock> CodeLocks = new HashSet<CodeLock>();
private HashSet<AutoTurret> AutoTurrets = new HashSet<AutoTurret>();
private HashSet<BuildingPrivlidge> BuildingPrivlidges = new HashSet<BuildingPrivlidge>();
private Dictionary<SamSite, List<ulong>> SamSiteAuthorization = new Dictionary<SamSite, List<ulong>>();
private Dictionary<string, string> Categories = new Dictionary<string, string> {
["Info"]
= "assets/icons/connection.png", ["Mates"] = "assets/icons/friends_servers.png", ["Skins"] = "assets/icons/inventory.png", ["Settings"] = "assets/icons/gear.png"
}
;
#region Image
[PluginReference]
private Plugin ImageLibrary;
private int ILCheck = 0;
private void LoadImages() {
if (!ImageLibrary.Call<bool>("HasImage", "https://www.dropbox.com/scl/fi/fqskxss8g0b84cv8yfrpg/SFMlnyl.png?rlkey=gvctrkqj1qxip0bnsqgfi6rxy&dl=1")) ImageLibrary.Call("AddImage", "https://www.dropbox.com/scl/fi/fqskxss8g0b84cv8yfrpg/SFMlnyl.png?rlkey=gvctrkqj1qxip0bnsqgfi6rxy&dl=1", "https://www.dropbox.com/scl/fi/fqskxss8g0b84cv8yfrpg/SFMlnyl.png?rlkey=gvctrkqj1qxip0bnsqgfi6rxy&dl=1");
}
private bool HasImageLibrary() {
if (ImageLibrary) {
LoadImages();
return true;
}
if (ILCheck == 3) {
PrintError("ImageLibrary not found! Download link -> https://umod.org/plugins/image-library");
Interface.Oxide.UnloadPlugin(Name);
return false;
}
timer.In(1, () => {
ILCheck++;
OnServerInitialized();
}
);
return false;
}
#endregion
#region Classes
private class VoiceTranslator : FacepunchBehaviour {
private BasePlayer _target;
private BasePlayer _translator;
private ulong _teamId, _steamId;
public VoiceTranslator Init(BasePlayer target) {
_target = target;
_teamId = target.Team.teamID;
_translator = (BasePlayer)GameManager.server.CreateEntity("assets/prefabs/player/player.prefab", Vector3.down * 5 + Vector3.back * 5);
_translator.enableSaving = false;
_translator.limitNetworking = true;
_translator.Spawn();
_translator.RemovePlayerRigidbody();
_translator.DisablePlayerCollider();
_translator.SetParent(target);
return this;
}
public void Translate(byte[] data, ulong victim) {
_steamId = victim;
StartTranslate();
var netWrite = Net.sv.StartWrite();
netWrite.PacketID(Message.Type.VoiceData);
netWrite.EntityID(_translator.net.ID);
netWrite.BytesWithSize(data);
netWrite.Send(new SendInfo(_target.Connection) {
priority = Priority.Immediate
}
);
}
private void StartTranslate() {
_ins.UpdateSpeakerInfo(_teamId, _steamId, true);
CancelInvoke(StopTranslate);
_translator.SendAsSnapshot(_target.Connection);
Invoke(StopTranslate, 1f);
}
private void StopTranslate() {
_ins.UpdateSpeakerInfo(_teamId, _steamId, false);
_translator.OnNetworkSubscribersLeave(new List<Connection> {
_target.Connection
}
);
}
public void Kill() {
_translator.Hurt(10000);
_translator.Kill();
Destroy(gameObject);
}
}
#endregion
#endregion
#region OxideHooks
#region BaseHooks
private void Init() => LoadData();
private void OnServerInitialized() {
if (!HasImageLibrary()) return;
_ins = this;
UpdateTeamList();
ApplyConfigVariables();
EntityCheckForAA();
Interface.CallHook("API_RegisterThirdPartyTitle", this, new Func<IPlayer, string>(BetterChat_FormattedClanTag));
if (SaveRestore.WipeId != _data.WipeID) {
_data.WipeID = SaveRestore.WipeId;
_data.Teams.Clear();
SaveData();
}
foreach (var check in BasePlayer.activePlayerList) OnPlayerConnected(check);
}
private string BetterChat_FormattedClanTag(IPlayer player) {
var playerTeam = FindTeamByUserID(ulong.Parse(player.Id));
if (playerTeam == null) return string.Empty;
var team = GetTeamData(playerTeam.teamID);
if (team == null || string.IsNullOrEmpty(team.TeamName)) return string.Empty;
return $"<color=#55aaff>[{team.TeamName}]</color>";
}
private void Unload() {
foreach (var check in BasePlayer.activePlayerList) {
CuiHelper.DestroyUi(check, Layer + ".bg");
CuiHelper.DestroyUi(check, Layer + ".TeamHud");
CuiHelper.DestroyUi(check, Layer + ".TeamCreateMenu");
}
foreach (var check in VoiceTranslators) check.Value.Kill();
SaveData();
_ins = null;
}
private void OnPlayerConnected(BasePlayer player) {
if (player == null) return;
var data = GetPlayerData(player);
if (data == null) _data.Players.Add(new PlayerSettings(player.userID, player.displayName, true, true));
else data.UpdateName(player.displayName);
if (player.Team == null) return;
var teamid = player.Team.teamID;
if (!OnlineTeams.TryAdd(teamid, new List<BasePlayer> {
player
}
)) GetOnlineTeam(teamid).Add(player);
if (_config.Options.EnableTeamHud) timer.In(1, () => {
if (!OnlineTeams.TryGetValue(teamid, out var team)) return;
foreach (var check in team) ShowHudParentUI(check);
}
);
}
private void OnPlayerDisconnected(BasePlayer player, string reason) {
if (player == null) return;
if (VoiceTranslators.TryGetValue(player.userID, out var translator)) {
translator.Kill();
VoiceTranslators.Remove(player.userID);
}
if (player.Team == null) return;
var teamid = player.Team.teamID;
if (OnlineTeams.TryGetValue(teamid, out var team)) {
if (team.Count > 1) team.Remove(player);
else OnlineTeams.Remove(player.Team.teamID);
}
if (_config.Options.EnableTeamHud) timer.In(1, () => {
if (!OnlineTeams.ContainsKey(teamid)) return;
foreach (var check in team) ShowHudParentUI(check);
}
);
}
#endregion
#region AuthorizationHooks
private object OnSamSiteTarget(SamSite samSite, PlayerHelicopter target) {
if (samSite == null || samSite.OwnerID == 0) return null;
if (!SamSiteAuthorization.TryGetValue(samSite, out var authList)) return null;
foreach (var check in target.allMountPoints) {
var player = check?.mountable?.GetMounted();
if (player == null) continue;
if (!authList.Contains(player.userID)) continue;
return false;
}
return null;
}
private void OnEntitySpawned(BuildingPrivlidge tc) {
if (tc == null || tc.OwnerID == 0) return;
BuildingPrivlidges.Add(tc);
if (!_config.Options.AutoAuthorization.EnableTC) return;
var team = FindTeamByUserID(tc.OwnerID);
if (team == null) return;
var teamData = GetTeamData(team.teamID);
foreach (var memberID in team.members) {
if (memberID == tc.OwnerID || !teamData.AuthorizationSettings.ContainsKey(memberID) || !teamData.AuthorizationSettings[memberID].EnableTC) continue;
tc.authorizedPlayers.RemoveWhere(x => x.userid == memberID);
tc.authorizedPlayers.Add(new ProtoBuf.PlayerNameID {
username = "Player", userid = memberID
}
);
}
tc.UpdateMaxAuthCapacity();
tc.SendNetworkUpdate();
}
private void OnEntitySpawned(CodeLock codeLock) {
if (codeLock == null || codeLock.OwnerID == 0) return;
CodeLocks.Add(codeLock);
if (!_config.Options.AutoAuthorization.EnableCodelocks) return;
var team = FindTeamByUserID(codeLock.OwnerID);
if (team == null) return;
var teamData = GetTeamData(team.teamID);
foreach (var memberID in team.members) {
if (memberID == codeLock.OwnerID || !teamData.AuthorizationSettings.ContainsKey(memberID) || !teamData.AuthorizationSettings[memberID].EnableCodelocks) continue;
codeLock.whitelistPlayers.RemoveAll(x => x == memberID);
codeLock.whitelistPlayers.Add(memberID);
PrintWarning("ADDED");
}
codeLock.SendNetworkUpdate();
}
private void OnEntitySpawned(AutoTurret autoTurret) {
if (autoTurret == null || autoTurret.OwnerID == 0) return;
AutoTurrets.Add(autoTurret);
if (!_config.Options.AutoAuthorization.EnableAutoTurrets) return;
var team = FindTeamByUserID(autoTurret.OwnerID);
if (team == null) return;
var isOnline = autoTurret.IsOnline();
if (isOnline) autoTurret.SetIsOnline(false);
var teamData = GetTeamData(team.teamID);
foreach (var memberID in team.members) {
if (memberID == autoTurret.OwnerID || !teamData.AuthorizationSettings.ContainsKey(memberID) || !teamData.AuthorizationSettings[memberID].EnableAutoTurrets) continue;
autoTurret.authorizedPlayers.RemoveWhere(x => x.userid == memberID);
autoTurret.authorizedPlayers.Add(new ProtoBuf.PlayerNameID {
username = "Player", userid = memberID
}
);
}
if (isOnline) autoTurret.SetIsOnline(true);
autoTurret.UpdateMaxAuthCapacity();
autoTurret.SendNetworkUpdate();
}
private void OnEntitySpawned(SamSite samSite) {
if (samSite == null || samSite.OwnerID == 0 || !SamSiteAuthorization.TryAdd(samSite, new List<ulong>())) return;
if (!_config.Options.AutoAuthorization.EnableSS) return;
var team = FindTeamByUserID(samSite.OwnerID);
if (team == null) return;
var authList = SamSiteAuthorization[samSite];
var teamData = GetTeamData(team.teamID);
authList.Clear();
foreach (var memberID in team.members) {
if (!teamData.AuthorizationSettings.ContainsKey(memberID) || !teamData.AuthorizationSettings[memberID].EnableSS) continue;
authList.Add(memberID);
}
}
private void OnEntityDeath(SamSite samSite) {
if (samSite == null) return;
SamSiteAuthorization.Remove(samSite);
}
private void OnEntityDeath(BuildingPrivlidge buildingPrivlidge) {
if (buildingPrivlidge == null || !BuildingPrivlidges.Contains(buildingPrivlidge)) return;
BuildingPrivlidges.Remove(buildingPrivlidge);
}
private void OnEntityDeath(CodeLock codeLock) {
if (codeLock == null || !CodeLocks.Contains(codeLock)) return;
CodeLocks.Remove(codeLock);
}
private void OnEntityDeath(AutoTurret autoTurret) {
if (autoTurret == null || !AutoTurrets.Contains(autoTurret)) return;
AutoTurrets.Remove(autoTurret);
}
private void OnCodeChanged(BasePlayer player, CodeLock codeLock) {
if (codeLock == null || codeLock.OwnerID == 0) return;
CodeLocks.Add(codeLock);
if (!_config.Options.AutoAuthorization.EnableCodelocks) return;
var team = FindTeamByUserID(codeLock.OwnerID);
if (team == null) return;
var teamData = GetTeamData(team.teamID);
foreach (var memberID in team.members) {
if (memberID == codeLock.OwnerID || !teamData.AuthorizationSettings.ContainsKey(memberID) || !teamData.AuthorizationSettings[memberID].EnableCodelocks) continue;
codeLock.whitelistPlayers.RemoveAll(x => x == memberID);
codeLock.whitelistPlayers.Add(memberID);
}
codeLock.SendNetworkUpdate();
}
#endregion
#region HudHooks
private void OnPlayerHealthChange(BasePlayer player, float oldValue, float newValue) {
if (player == null || !player.IsConnected || player.Team == null || player.IsWounded() || player.IsDead()) return;
UpdateHealthUI(GetOnlineTeam(player.Team.teamID), player);
}
private void OnActiveItemChange(BasePlayer player, Item oldItem, ItemId newItemId) {
NextTick(() => {
if (player == null || !player.IsConnected || player.Team == null) return;
UpdateActiveItemUI(GetOnlineTeam(player.Team.teamID), player);
}
);
}
private void OnPlayerWound(BasePlayer player, HitInfo info) {
NextTick(() => {
if (player == null || !player.IsConnected || player.Team == null) return;
UpdatePlayerState(GetOnlineTeam(player.Team.teamID), player);
}
);
}
private void OnPlayerRecover(BasePlayer player) {
NextTick(() => {
if (player == null || player.Team == null) return;
UpdatePlayerState(GetOnlineTeam(player.Team.teamID), player);
}
);
}
private void OnPlayerDeath(BasePlayer player, HitInfo info) {
NextTick(() => {
if (player == null || !player.IsConnected || player.Team == null) return;
UpdatePlayerState(GetOnlineTeam(player.Team.teamID), player);
}
);
}
private void OnPlayerRespawned(BasePlayer player) {
NextTick(() => {
if (player == null || player.Team == null) return;
UpdatePlayerState(GetOnlineTeam(player.Team.teamID), player);
}
);
}
#endregion
#region TeamVoice
private object OnPlayerVoice(BasePlayer player, Byte[] data) {
if (player == null || player.Team == null || !GetPlayerData(player).EnableTeamVoice || (_config.Permissions.TeamVoiceNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.TeamVoicePermission))) return null;
foreach (var check in GetOnlineTeam(player.Team.teamID)) {
if (check.userID == player.userID) continue;
GetTranslator(check).Translate(data, player.userID);
}
return false;
}
#endregion
#region TeamHooks
private object OnTeamCreate(BasePlayer player) {
if (player == null) return null;
ShowUITeamCreation(player);
return false;
}
private void OnTeamPromote(RelationshipManager.PlayerTeam team, BasePlayer newLeader) {
NextTick(() => {
if (newLeader == null || team == null || !_config.Options.EnableTeamHud) return;
foreach (var check in GetOnlineTeam(team.teamID)) ShowHudParentUI(check);
}
);
}
private object OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player) {
if (player == null || team == null) return null;
if (team.members.Count >= _config.TeamLimit) return false;
NextTick(() => {
if (player == null || team == null) return;
var onlineTeam = GetOnlineTeam(team.teamID);
if (!onlineTeam.Contains(player)) onlineTeam.Add(player);
var teamData = GetTeamData(team.teamID);
teamData.AuthorizationSettings.TryAdd(player.userID, new AuthorizationSettings());
AuthorizeTo(team, player.userID, "all", true);
foreach (var check in team.members) {
var aaSettings = teamData.AuthorizationSettings[check];
if (aaSettings.EnableCodelocks) AuthorizeTo(player.userID, check, "cl", true);
if (aaSettings.EnableTC) AuthorizeTo(player.userID, check, "tc", true);
if (aaSettings.EnableAutoTurrets) AuthorizeTo(player.userID, check, "at", true);
if (aaSettings.EnableSS) AuthorizeTo(player.userID, check, "ss", true);
}
if (!_config.Options.EnableTeamHud) return;
foreach (var check in onlineTeam) ShowHudParentUI(check);
}
);
return null;
}
private object OnTeamInvite(BasePlayer player, BasePlayer target) {
if (player == null || target == null || player.Team == null) return null;
if (player.Team.members.Count >= _config.TeamLimit) return false;
return null;
}
private void OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player) {
if (team == null || player == null) return;
var onlineTeam = GetOnlineTeam(team.teamID);
if (onlineTeam.Contains(player)) onlineTeam.Remove(player);
CuiHelper.DestroyUi(player, Layer + ".TeamHud");
var teamData = GetTeamData(team.teamID);
teamData.AuthorizationSettings.Remove(player.userID);
if (VoiceTranslators.TryGetValue(player.userID, out var translator)) {
translator.Kill();
VoiceTranslators.Remove(player.userID);
}
if (team.members.Count > 1) {
foreach (var check in team.members) {
if (check == player.userID) continue;
AuthorizeTo(player.userID, check, "all", false);
}
AuthorizeTo(team, player.userID, "all", false);
}
NextTick(() => {
if (!_config.Options.EnableTeamHud || !OnlineTeams.ContainsKey(team.teamID)) return;
foreach (var check in GetOnlineTeam(team.teamID)) ShowHudParentUI(check);
}
);
}
private void OnTeamKick(RelationshipManager.PlayerTeam team, BasePlayer kicker, ulong target) {
if (team == null) return;
var player = GetOnlineTeam(team.teamID).FirstOrDefault(x => x.userID == target);
if (player != null) {
CuiHelper.DestroyUi(player, Layer + ".TeamHud");
GetOnlineTeam(team.teamID).Remove(player);
if (VoiceTranslators.TryGetValue(player.userID, out var translator)) {
translator.Kill();
VoiceTranslators.Remove(player.userID);
}
}
GetTeamData(team.teamID).AuthorizationSettings.Remove(target);
if (team.members.Count > 1) {
foreach (var check in team.members) {
if (check == target) continue;
AuthorizeTo(target, check, "all", false);
}
AuthorizeTo(team, target, "all", false);
}
NextTick(() => {
if (!_config.Options.EnableTeamHud) return;
foreach (var check in GetOnlineTeam(team.teamID)) ShowHudParentUI(check);
}
);
}
private void OnTeamDisband(RelationshipManager.PlayerTeam team) {
if (team == null) return;
foreach (var check in team.members) AuthorizeTo(team, check, "all", false);
foreach (var check in GetOnlineTeam(team.teamID)) CuiHelper.DestroyUi(check, Layer + ".TeamHud");
OnlineTeams.Remove(team.teamID);
_data.Teams.Remove(GetTeamData(team.teamID));
}
#endregion
#region SkinsHooks
private void OnItemAddedToContainer(ItemContainer container, Item item) {
if (item == null || container == null || _data == null) return;
var player = container.GetOwnerPlayer();
if (player == null || player.Team == null || !player.userID.IsSteamId() || !GetPlayerData(player).EnableTeamSkins || (_config.Permissions.TeamSkinsNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.TeamSkinsPermission))) return;
var team = GetTeamData(player.Team.teamID);
if (!team.Skins.TryGetValue(item.info.itemid, out var skin) || skin == 0 || skin == item.skin) return;
item.skin = skin;
var held = item.GetHeldEntity();
if (held == null) return;
held.skinID = skin;
held.SendNetworkUpdate();
}
#endregion
#region FriendlyFire
private void OnEntityTakeDamage(BasePlayer player, HitInfo info) {
if (player == null || info == null) return;
var attacker = info.InitiatorPlayer;
if (attacker == null || !player.userID.IsSteamId() || !attacker.userID.IsSteamId() || attacker == player || player.Team == null || !player.Team.members.Contains(attacker.userID)) return;
var playerData = GetPlayerData(player);
var attackerData = GetPlayerData(attacker);
if (playerData.EnableFriendlyFire || attackerData.EnableFriendlyFire) return;
info.damageTypes?.ScaleAll(0);
}
#endregion
#endregion
#region Functions
private string GetNameWithoutTeamName(BasePlayer player) {
if (player.Team == null) return player.displayName;
var teamData = GetTeamData(player.Team.teamID);
if (!string.IsNullOrEmpty(teamData.TeamName)) return player.displayName.Replace($"[{teamData.TeamName}] ", "");
return GetNameWithoutTeamName(player.userID);
}
private string GetNameWithoutTeamName(ulong userID) {
var name = GetPlayerData(userID).Name;
var team = FindTeamByUserID(userID);
if (team == null) return name;
var teamData = GetTeamData(team.teamID);
if (string.IsNullOrEmpty(teamData.TeamName)) return name;
return name.Replace($"[{teamData.TeamName}] ", "");
}
private void AuthorizeTo(RelationshipManager.PlayerTeam team, ulong target, string type, bool auth) {
foreach (var check in team.members) {
if (check == target) continue;
AuthorizeTo(check, target, type, auth);
}
}
private void AuthorizeTo(ulong owner, ulong target, string type, bool auth) {
if (owner == target) return;
switch (type) {
case "cl" : foreach (var check in CodeLocks) {
if (check == null || check.OwnerID != owner) continue;
if (auth) {
if (check.whitelistPlayers.Contains(target)) continue;
check.whitelistPlayers.Add(target);
}
else {
if (!check.whitelistPlayers.Contains(target)) continue;
check.whitelistPlayers.Remove(target);
}
check.SendNetworkUpdate();
}
break;
case "at" : foreach (var check in AutoTurrets) {
if (check == null || check.OwnerID != owner) continue;
var isOnline = check.IsOnline();
if (isOnline) check.SetIsOnline(false);
check.authorizedPlayers.RemoveWhere(x => x.userid == target);
if (auth) check.authorizedPlayers.Add(new ProtoBuf.PlayerNameID {
userid = target, username = "Player"
}
);
if (isOnline) check.SetIsOnline(true);
check.UpdateMaxAuthCapacity();
check.SendNetworkUpdate();
}
break;
case "tc" : foreach (var check in BuildingPrivlidges) {
if (check == null || check.OwnerID != owner) continue;
check.authorizedPlayers.RemoveWhere(x => x.userid == target);
if (auth) check.authorizedPlayers.Add(new ProtoBuf.PlayerNameID {
userid = target, username = "Player"
}
);
check.UpdateMaxAuthCapacity();
check.SendNetworkUpdate();
}
break;
case "ss" : foreach (var check in SamSiteAuthorization) {
if (check.Key == null || check.Key.OwnerID != owner) continue;
if (auth) {
if (check.Value.Contains(target)) continue;
check.Value.Add(target);
}
else {
if (!check.Value.Contains(target)) continue;
check.Value.Remove(target);
}
}
break;
case "all" : AuthorizeTo(owner, target, "cl", auth);
AuthorizeTo(owner, target, "at", auth);
AuthorizeTo(owner, target, "tc", auth);
AuthorizeTo(owner, target, "ss", auth);
break;
}
}
private void ApplyConfigVariables() {
Scale = _config.HudSettings.Scale;
cmd.AddChatCommand(_config.TeamSettingsCommand, this, ChatCommandTeamUI);
permission.RegisterPermission(_config.Permissions.HudUsePermission, this);
permission.RegisterPermission(_config.Permissions.TeamMarkerPermission, this);
permission.RegisterPermission(_config.Permissions.TeamVoicePermission, this);
permission.RegisterPermission(_config.Permissions.TeamSkinsPermission, this);
if (_config.Options.EnableTeamMarker) {
cmd.AddConsoleCommand("ftmark", this, nameof(ConsoleCommandMarker));
timer.Every(1f, () => {
foreach (var check in TipRemove.ToArray()) {
if (!(DateTime.Now.Subtract(check.Value).TotalSeconds > 2)) continue;
check.Key.SendConsoleCommand("gametip.hidegametip");
TipRemove.Remove(check.Key);
}
}
);
}
if (!_config.Options.AutoAuthorization.EnableSS) Unsubscribe(nameof(OnSamSiteTarget));
if (!_config.Options.EnableTeamVoice) Unsubscribe("OnPlayerVoice");
if (!_config.Options.EnableTeamSkins) Unsubscribe("OnItemAddedToContainer");
if (!_config.Options.EnableTeamHud) {
Unsubscribe("OnPlayerHealthChange");
Unsubscribe("OnActiveItemChange");
Unsubscribe("OnPlayerWound");
Unsubscribe("OnPlayerRecover");
Unsubscribe("OnPlayerDeath");
Unsubscribe("OnPlayerRespawned");
}
else CreateSquareUpdateTimer();
}
private void PlayerPing(BasePlayer player, Vector3 targetPosition, int type, int color) {
var note = new MapNote();
note.worldPosition = targetPosition;
note.isPing = true;
note.timeRemaining = note.totalDuration = _config.Options.TeamMarkers.Duration;
note.colourIndex = color;
note.icon = type;
player.State.pings ??= new List<MapNote>();
player.State.pings.Add(note);
player.DirtyPlayerState();
player.SendPingsToClient();
player.TeamUpdate(true);
if (!PlayerMarkerCooldown.TryAdd(player.userID, DateTime.Now)) PlayerMarkerCooldown[player.userID] = DateTime.Now;
}
private void UpdateTeamList() {
var removeList = new List<TeamSettings>();
foreach (var team in RelationshipManager.ServerInstance.teams) {
var remove = team.Value == null || team.Value.members.Count == 0;
foreach (var dataTeam in _data.Teams) {
if (dataTeam.ID != team.Key || !remove) continue;
removeList.Add(dataTeam);
break;
}
}
foreach (var check in removeList) _data.Teams.Remove(check);
foreach (var team in _data.Teams) foreach (var check in _config.Skins) team.Skins.TryAdd(check.Key, 0);
}
private VoiceTranslator GetTranslator(BasePlayer player) {
if (VoiceTranslators.TryGetValue(player.userID, out var translator)) return translator;
translator = new GameObject().AddComponent<VoiceTranslator>().Init(player);
VoiceTranslators.Add(player.userID, translator);
return translator;
}
private void CreateSquareUpdateTimer() {
timer.Every(_config.HudSettings.SquareUpdateRate, () => {
foreach (var check in OnlineTeams) {
var container = new CuiElementContainer();
foreach (var player in check.Value) FillGridInfo(container, player);
foreach (var player in check.Value) {
if (_config.Permissions.HudNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.HudUsePermission)) continue;
CuiHelper.AddUi(player, container);
}
}
}
);
}
private RelationshipManager.PlayerTeam FindTeamByUserID(ulong id) {
foreach (var check in RelationshipManager.ServerInstance.teams) if (check.Value.members.Contains(id)) return check.Value;
return null;
}
private BasePlayer FindByID(ulong id) {
foreach (var check in BasePlayer.allPlayerList) if (check.userID == id) return check;
return null;
}
private PlayerSettings GetPlayerData(BasePlayer player) => GetPlayerData(player.userID);
private List<BasePlayer> GetOnlineTeam(ulong id) {
if (OnlineTeams.TryGetValue(id, out var list)) return list;
var team = RelationshipManager.ServerInstance.FindTeam(id);
if (team == null || team.members.Count == 0) {
PrintWarning("If you see this message, contact with me via discord: ahigao");
return null;
}
list = new List<BasePlayer>();
foreach (var check in team.members) {
if (BasePlayer.TryFindByID(check, out var player)) list.Add(player);
}
OnlineTeams.Add(id, list);
return list;
}
private TeamSettings GetTeamData(ulong id, string name = "") {
foreach (var check in _data.Teams) if (check.ID == id) return check;
var data = new TeamSettings(id, name, new Dictionary<ulong, AuthorizationSettings>());
var team = RelationshipManager.ServerInstance.FindTeam(id);
if (team != null) foreach (var check in team.members) data.AuthorizationSettings.Add(check, new AuthorizationSettings());
foreach (var check in _config.Skins) data.Skins.TryAdd(check.Key, 0);
_data.Teams.Add(data);
return data;
}
private PlayerSettings GetPlayerData(ulong id) {
foreach (var check in _data.Players) if (check.ID == id) return check;
var player = FindByID(id);
var settings = new PlayerSettings(id, player == null ? "Player" : player.displayName, true, true);
_data.Players.Add(settings);
return settings;
}
private void EntityCheckForAA() {
foreach (var check in BaseNetworkable.serverEntities) {
if (check is BuildingPrivlidge) {
OnEntitySpawned(check as BuildingPrivlidge);
continue;
}
if (check is CodeLock) {
OnEntitySpawned(check as CodeLock);
continue;
}
if (check is AutoTurret) {
OnEntitySpawned(check as AutoTurret);
continue;
}
if (!(check is SamSite)) continue;
OnEntitySpawned(check as SamSite);
}
}
private string PositionToGridCoord(Vector3 position) {
var a = new Vector2(TerrainMeta.NormalizeX(position.x), TerrainMeta.NormalizeZ(position.z));
var num = TerrainMeta.Size.x / 1024f;
var num2 = 7;
var vector = a * num * num2;
var num3 = Mathf.Floor(vector.x) + 1f;
var num4 = Mathf.Floor(num * num2 - vector.y);
var text = string.Empty;
var num5 = num3 / 26f;
var num6 = num3 % 26f;
if (num6 == 0f) num6 = 26f;
if (num5 > 1f) text += Convert.ToChar(64 + (int)num5).ToString();
text += Convert.ToChar(64 + (int)num6).ToString();
return text + num4;
}
private void SendGameTip(BasePlayer player, string msg) {
player.SendConsoleCommand("gametip.showgametip", msg);
if (!TipRemove.TryAdd(player, DateTime.Now)) TipRemove[player] = DateTime.Now;
}
#endregion
#region Commands
private void ChatCommandTeamUI(BasePlayer player, string command, string[] args) {
if (player.Team == null) {
SendMessage(player, "CM_NO_TEAM");
return;
}
ShowUIBG(player);
}
[ChatCommand("cff")]
private void ChatCommandcff(BasePlayer player, string command, string[] args) {
var data = GetPlayerData(player);
data.EnableFriendlyFire = !data.EnableFriendlyFire;
Player.Message(player, data.EnableFriendlyFire ? "<color=#cdc2b2>Огонь по союзникам:</color> <color=green>Включен</color>" : "<color=#cdc2b2>Огонь по союзникам:</color> <color=red>Выключен</color>", 76561198297741077);
}
[ConsoleCommand("UI_BT")]
private void ConsoleCommandUI_BT(ConsoleSystem.Arg arg) {
var player = arg?.Player();
if (player == null || !arg.HasArgs()) return;
PlayerSettings data;
AuthorizationSettings authorizationSettings;
switch (arg.GetString(0)) {
case "category" : switch (arg.GetString(1)) {
case "Skins" : ShowUISkins(player, arg.GetInt(3));
return;
case "Info" : ShowUIInfo(player);
return;
case "Settings" : ShowUISettings(player);
return;
case "Mates" : ShowUIMembers(player);
return;
}
return;
case "openskins" : ShowUIChangeSkin(player, arg.GetInt(1), arg.GetInt(2), arg.GetInt(3));
return;
case "chooseskin" : var team = GetTeamData(player.Team.teamID);
team.Skins[arg.GetInt(1)] = arg.GetULong(2);
ShowUISkins(player, arg.GetInt(3));
return;
case "chosemate" : ShowUIMembers(player, arg.GetULong(1));
return;
case "svoice" : if (_config.Permissions.TeamVoiceNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.TeamVoicePermission)) {
SendMessage(player, "CM_DONT_HAVE_PERM");
return;
}
data = GetPlayerData(player);
data.EnableTeamVoice = !data.EnableTeamVoice;
ShowUISettings(player);
return;
case "sskins" : if (_config.Permissions.TeamSkinsNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.TeamSkinsPermission)) {
SendMessage(player, "CM_DONT_HAVE_PERM");
return;
}
data = GetPlayerData(player);
data.EnableTeamSkins = !data.EnableTeamSkins;
ShowUISettings(player);
return;
case "smarker" : if (_config.Permissions.TeamMarkerNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.TeamMarkerPermission)) {
SendMessage(player, "CM_DONT_HAVE_PERM");
return;
}
data = GetPlayerData(player);
data.EnableCustomMarker = !data.EnableCustomMarker;
ShowUISettings(player);
return;
case "mtcaa" : authorizationSettings = GetTeamData(player.Team.teamID).AuthorizationSettings[arg.GetULong(1)];
authorizationSettings.EnableTC = !authorizationSettings.EnableTC;
AuthorizeTo(player.Team, arg.GetULong(1), "tc", authorizationSettings.EnableTC);
ShowUIMembers(player, arg.GetULong(1));
break;
case "mclaa" : authorizationSettings = GetTeamData(player.Team.teamID).AuthorizationSettings[arg.GetULong(1)];
authorizationSettings.EnableCodelocks = !authorizationSettings.EnableCodelocks;
AuthorizeTo(player.Team, arg.GetULong(1), "cl", authorizationSettings.EnableCodelocks);
ShowUIMembers(player, arg.GetULong(1));
break;
case "mataa" : authorizationSettings = GetTeamData(player.Team.teamID).AuthorizationSettings[arg.GetULong(1)];
authorizationSettings.EnableAutoTurrets = !authorizationSettings.EnableAutoTurrets;
AuthorizeTo(player.Team, arg.GetULong(1), "at", authorizationSettings.EnableAutoTurrets);
ShowUIMembers(player, arg.GetULong(1));
break;
case "mssaa" : authorizationSettings = GetTeamData(player.Team.teamID).AuthorizationSettings[arg.GetULong(1)];
authorizationSettings.EnableSS = !authorizationSettings.EnableSS;
AuthorizeTo(player.Team, arg.GetULong(1), "ss", authorizationSettings.EnableSS);
ShowUIMembers(player, arg.GetULong(1));
break;
case "mkick" : player.Team.RemovePlayer(arg.GetULong(1));
OnTeamKick(player.Team, player, arg.GetULong(1));
ShowUIMembers(player);
break;
}
}
private void ConsoleCommandMarker(ConsoleSystem.Arg arg) {
var player = arg?.Player();
if (player?.Team == null || !GetPlayerData(player).EnableCustomMarker) return;
if (_config.Permissions.TeamMarkerNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.TeamMarkerPermission)) {
SendMessage(player, "CM_DONT_HAVE_PERM");
return;
}
if (PlayerMarkerCooldown.ContainsKey(player.userID) && DateTime.Now.Subtract(PlayerMarkerCooldown[player.userID]).TotalSeconds < _config.Options.TeamMarkers.Cooldown) {
SendGameTip(player, GetMsg(player.UserIDString, "CM_MARKER_COOLDOWN", _config.Options.TeamMarkers.Cooldown - (int)DateTime.Now.Subtract(PlayerMarkerCooldown[player.userID]).TotalSeconds));
return;
}
Physics.Raycast(player.eyes.HeadRay(), out var info, _config.Options.TeamMarkers.MaxDistance);
if (info.point == Vector3.zero) return;
var foundEntities = Facepunch.Pool.GetList<BaseEntity>();
Vis.Entities(info.point, _config.Options.TeamMarkers.SearchRadius, foundEntities);
foreach (var check in foundEntities) {
if (!(check is BasePlayer)) continue;
var targetPlayer = check as BasePlayer;
if (targetPlayer.Team != null && targetPlayer.Team.teamID == player.Team.teamID) continue;
var position = check.transform.position;
PlayerPing(player, position.WithY(position.y + check.bounds.extents.y * 2), 6, 3);
Facepunch.Pool.Free(ref foundEntities);
return;
}
foreach (var check in foundEntities) {
if (!(check is OreResourceEntity)) continue;
var position = check.transform.position;
PlayerPing(player, position.WithY(position.y + check.bounds.extents.y * 2), 10, 4);
Facepunch.Pool.Free(ref foundEntities);
return;
}
foreach (var check in foundEntities) {
if (!(check is StorageContainer)) continue;
var position = check.transform.position;
PlayerPing(player, position.WithY(position.y + check.bounds.extents.y * 2), 11, 0);
Facepunch.Pool.Free(ref foundEntities);
return;
}
foreach (var check in foundEntities) {
if (!(check is DroppedItem)) continue;
var item = check as DroppedItem;
if (item.item?.GetHeldEntity()?.GetComponent<BaseProjectile>() == null) continue;
var position = check.transform.position;
PlayerPing(player, position.WithY(position.y + check.bounds.extents.y * 2), 9, 5);
Facepunch.Pool.Free(ref foundEntities);
return;
}
PlayerPing(player, info.point, 0, 2);
Facepunch.Pool.Free(ref foundEntities);
}
[ConsoleCommand("UI_BTC")]
private void ConsoleCommandUI_BTC(ConsoleSystem.Arg arg) {
if (!arg.HasArgs()) return;
var player = arg.Player();
switch (arg.GetString(0)) {
case "name" : ShowUITeamCreation(player, arg.GetString(1));
break;
case "create" : var team = _data.Teams.FirstOrDefault(x => x.TeamName == arg.GetString(1));
if (team != null) {
Player.Message(player, $"Team with name {arg.GetString(1)} is already exists.", 76561198297741077);
return;
}
if (arg.GetString(1).Length < 3) {
Player.Message(player, "Minimum team name length is 3.", 76561198297741077);
return;
}
Player.Message(player, "Team successfully created!", 76561198297741077);
CuiHelper.DestroyUi(player, Layer + ".TeamCreateMenu");
var playerTeam = RelationshipManager.ServerInstance.CreateTeam();
playerTeam.teamLeader = player.userID;
playerTeam.AddPlayer(player);
OnlineTeams.Add(player.Team.teamID, new List<BasePlayer> {
player
}
);
var teamData = GetTeamData(playerTeam.teamID, arg.GetString(1));
teamData.AuthorizationSettings.TryAdd(player.userID, new AuthorizationSettings());
foreach (var check in _config.Skins) teamData.Skins.TryAdd(check.Key, 0);
if (!_config.Options.EnableTeamHud) return;
ShowHudParentUI(player);
break;
}
}
#endregion
#region UI
#region TeamCreationMenu
private void ShowUITeamCreation(BasePlayer player, string name = "") {
if (player == null) return;
var container = new CuiElementContainer();
container.Add(new CuiElement {
Parent = "Overlay", DestroyUi = Layer + ".TeamCreateMenu", Name = Layer + ".TeamCreateMenu", Components = {
new CuiImageComponent {
Color = "0.20 0.18 0.17 1.00", Material = "assets/icons/greyout.mat"
}
, new CuiRectTransformComponent {
AnchorMin = "0.5 0", AnchorMax = "0.5 0", OffsetMin = "-190 460", OffsetMax = "180 610"
}
, new CuiNeedsKeyboardComponent(), new CuiNeedsCursorComponent()
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".TeamCreateMenu", Components = {
new CuiImageComponent {
Color = "0.15 0.13 0.11 1.00", Material = "assets/icons/greyout.mat"
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 0", OffsetMax = "370 100"
}
}
}
);
container.Add(new CuiElement {
Parent = Layer + ".TeamCreateMenu", Components = {
new CuiTextComponent {
Text = "ВВЕДИТЕ НАЗВАНИЕ ВАШЕЙ КОМАНДЫ", Color = "0.82 0.78 0.75 1.00", Font = "robotocondensed-bold.ttf", FontSize = 13, Align = TextAnchor.MiddleCenter
}
, new CuiRectTransformComponent {
AnchorMin = "0 0", AnchorMax = "0 0", OffsetMin = "0 100", OffsetMax = "370 150"
}
}
}
);
container.Add(new CuiElement {
Parent = Lay
// ... [Code preview truncated due to length. Full source in attached file] ...