Иконка ресурса

FREE BetterTeams : 1.3.3 1.3.3

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using Network;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using ProtoBuf;
using UnityEngine;
using UnityEngine.UI;
namespace Oxide.Plugins {
    [Info("BetterTeams", "ahigao", "1.3.3")]
    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 List<BasePlayer> Spectators = new List<BasePlayer>();
        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, Clans;
        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);
                target.children.Remove(_translator);
                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();
            if (SaveRestore.WipeId != _data.WipeID) {
                _data.WipeID = SaveRestore.WipeId;
                _data.TeamFix.Clear();
                _data.Teams.Clear();
                SaveData();
            }
            LoadTeamFix();
            foreach (var check in _config.Skins) {
                if (check.Value.Contains(0) || check.Value.Count < 2) continue;
                check.Value.Add(0);
                check.Value[check.Value.Count - 1] = check.Value[0];
                check.Value[0] = 0;
            }
            foreach (var check in BasePlayer.activePlayerList) OnPlayerConnected(check);
        }
        private void Unload() {
            foreach (var check in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(check, Layer + ".TeamHud");
                CuiHelper.DestroyUi(check, Layer + ".bg");
            }
            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 (_config.Options.AutoTeamLeaderSwtich) {
                if (!OnlineTeams.ContainsKey(teamid) || GetOnlineTeam(teamid).Count == 0) player.Team.SetTeamLeader(player.userID);
                var teamData = GetTeamData(teamid);
                if (teamData != null && teamData.TeamLeader == player.userID && player.Team.teamLeader != player.userID) player.Team.SetTeamLeader(player.userID);
            }
            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);
                    if (_config.Options.AutoTeamLeaderSwtich) {
                        var teamData = GetTeamData(teamid);
                        if (teamData != null && player.Team.teamLeader == player.userID) player.Team.SetTeamLeader(team.FirstOrDefault().userID);
                    }
                }
                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 || !authList.Contains(player.userID)) continue;
                return true;
            }
            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 == memberID);
                tc.authorizedPlayers.Add(memberID);
            }
            tc.UpdateMaxAuthCapacity();
            tc.SendNetworkUpdate();
        }
        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();
        }
        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);
            }
            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 == memberID);
                autoTurret.authorizedPlayers.Add(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);
        }
#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;
                ShowHudParentUI(player);
                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 void OnTeamCreated(BasePlayer player, RelationshipManager.PlayerTeam team) {
            NextTick(() => {
                if (player == null || player.Team == null || team == null) return;
                if (!_data.TeamFix.TryAdd(team.teamID, new TeamFixData {
                    TeamLeader = player.userID, Members = new List<ulong> {
                        player.userID
                    }
                }
                )) {
                    var teamFixData = _data.TeamFix[team.teamID];
                    teamFixData.Members.Clear();
                    teamFixData.Members.Add(player.userID);
                    teamFixData.TeamLeader = player.userID;
                    SaveData();
                }
                OnlineTeams.Add(player.Team.teamID, new List<BasePlayer> {
                    player
                }
                );
                var teamData = GetTeamData(team.teamID);
                teamData.TeamLeader = player.userID;
                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);
            }
            );
        }
        private void OnTeamMemberPromote(RelationshipManager.PlayerTeam team, ulong userId) {
            NextTick(() => {
                if (team == null) return;
                if (_data.TeamFix.TryGetValue(team.teamID, out var teamFixData)) {
                    teamFixData.TeamLeader = userId;
                    SaveData();
                }
                var teamData = GetTeamData(team.teamID);
                if (teamData != null) teamData.TeamLeader = userId;
                if (!_config.Options.EnableTeamHud) return;
                foreach (var check in GetOnlineTeam(team.teamID)) ShowHudParentUI(check);
            }
            );
        }
        private void OnTeamAcceptInvite(RelationshipManager.PlayerTeam team, BasePlayer player) {
            NextTick(() => {
                if (player == null || team == null) return;
                if (_data.TeamFix.TryGetValue(team.teamID, out var teamFixData)) {
                    teamFixData.Members.Add(player.userID);
                    SaveData();
                }
                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 (_config.Options.AutoAuthorization.EnableCodelocks && aaSettings.EnableCodelocks) AuthorizeTo(player.userID, check, "cl", true);
                    if (_config.Options.AutoAuthorization.EnableTC && aaSettings.EnableTC) AuthorizeTo(player.userID, check, "tc", true);
                    if (_config.Options.AutoAuthorization.EnableAutoTurrets && aaSettings.EnableAutoTurrets) AuthorizeTo(player.userID, check, "at", true);
                    if (_config.Options.AutoAuthorization.EnableSS && aaSettings.EnableSS) AuthorizeTo(player.userID, check, "ss", true);
                }
                if (!_config.Options.EnableTeamHud) return;
                foreach (var check in onlineTeam) ShowHudParentUI(check);
            }
            );
        }
        private void OnTeamLeave(RelationshipManager.PlayerTeam team, BasePlayer player) {
            if (team == null || player == null) return;
            if (_data.TeamFix.TryGetValue(team.teamID, out var teamFixData)) {
                teamFixData.Members.Remove(player.userID);
                SaveData();
            }
            var onlineTeam = GetOnlineTeam(team.teamID);
            if (onlineTeam.Contains(player)) onlineTeam.Remove(player);
            CuiHelper.DestroyUi(player, Layer + ".TeamHud");
            GetTeamData(team.teamID).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;
            if (_data.TeamFix.TryGetValue(team.teamID, out var teamFixData)) {
                teamFixData.Members.Remove(target);
                SaveData();
            }
            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;
            _data.TeamFix.Remove(team.teamID);
            SaveData();
            foreach (var check in team.members) AuthorizeTo(team, check, "all", false);
            var onlineTeam = GetOnlineTeam(team.teamID);
            if (onlineTeam != null) foreach (var check in onlineTeam) 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
#endregion
#region Spectating
        private void StartSpectating(BasePlayer player) {
            if (player == null || !player.IsConnected || Spectators.Contains(player) || player.IsSpectating()) return;
            if (player.IsWounded()) player.StopWounded();
            foreach (var check in player.GetSubscribers()) if (check != player.net.connection) player.DestroyOnClient(check);
            player.Teleport(Vector3.zero);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, true);
            player.gameObject.SetLayerRecursive(10);
            Spectators.Add(player);
            ChangeSpectatingTarget(player, true);
        }
        public void ChangeSpectatingTarget(BasePlayer player, bool next) {
            if (player == null || !player.IsConnected || !Spectators.Contains(player) || !player.IsSpectating()) return;
            var target = GetSpectatingTarget(player, next);
            if (target == null) {
                StopSpectating(player);
                return;
            }
            player.SendEntitySnapshot(target);
            player.gameObject.Identity();
            player.SetParent(target);
            //ShowUISpectator(player, target.displayName);
        }
        private void StopSpectating(BasePlayer player) {
            if (player == null || !Spectators.Contains(player) || !player.IsSpectating()) return;
            player.SetParent(null);
            player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, false);
            player.gameObject.SetLayerRecursive(17);
            player.SendNetworkUpdateImmediate();
            Spectators.Remove(player);
            CuiHelper.DestroyUi(player, Layer + ".Spec");
        }
        private BasePlayer GetSpectatingTarget(BasePlayer player, bool next) {
            var currentTarget = player.GetParentEntity() != null ? player.GetParentEntity() as BasePlayer : null;
            var availableList = GetOnlineTeam(player.userID).Where(x => x.IsConnected && x.IsAlive() && !x.IsSpectating()).ToList();
            if (availableList.Count == 0 || (availableList.Count == 1 && currentTarget == availableList[0])) return null;
            if (availableList.Count == 1 || currentTarget == null) return availableList[0];
            var currentTargetIndex = availableList.IndexOf(currentTarget);
            if (next) return currentTargetIndex + 1 <= availableList.Count - 1 ? availableList[currentTargetIndex + 1] : availableList[0];
            return currentTargetIndex - 1 >= 0 ? availableList[currentTargetIndex - 1] : availableList[availableList.Count - 1];
        }
#endregion
#region Functions
        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" : if (!_config.Options.AutoAuthorization.EnableCodelocks) return;
                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" : if (!_config.Options.AutoAuthorization.EnableAutoTurrets) return;
                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 == target);
                    if (auth) check.authorizedPlayers.Add(target);
                    if (isOnline) check.SetIsOnline(true);
                    check.UpdateMaxAuthCapacity();
                    check.SendNetworkUpdate();
                }
                break;
                case "tc" : if (!_config.Options.AutoAuthorization.EnableTC) return;
                foreach (var check in BuildingPrivlidges) {
                    if (check == null || check.OwnerID != owner) continue;
                    check.authorizedPlayers.RemoveWhere(x => x == target);
                    if (auth) check.authorizedPlayers.Add(target);
                    check.UpdateMaxAuthCapacity();
                    check.SendNetworkUpdate();
                }
                break;
                case "ss" : if (!_config.Options.AutoAuthorization.EnableSS) return;
                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 = Facepunch.Pool.Get<ProtoBuf.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 LoadTeamFix() {
            if (!_config.Options.EnableTeamFix) return;
            if (_data.TeamFix.Count != 0) {
                foreach (var check in _data.TeamFix.ToArray()) {
                    var team = RelationshipManager.ServerInstance.FindTeam(check.Key);
                    if (team == null) {
                        team = Facepunch.Pool.Get<RelationshipManager.PlayerTeam>();
                        team.teamID = check.Key;
                        team.teamStartTime = Time.realtimeSinceStartup;
                        RelationshipManager.ServerInstance.teams.Add(team.teamID, team);
                    }
                    foreach (var member in check.Value.Members.ToArray()) {
                        if (team.members.Contains(member)) continue;
                        RelationshipManager.ServerInstance.FindPlayersTeam(member)?.RemovePlayer(member);
                        var memberPlayer = RelationshipManager.FindByID(member);
                        if (memberPlayer != null) {
                            team.AddPlayer(memberPlayer);
                            continue;
                        }
                        team.members.Add(member);
                        RelationshipManager.ServerInstance.playerToTeam.Add(member, team);
                        team.MarkDirty();
                    }
                    if (check.Value.TeamLeader != team.teamLeader) team.SetTeamLeader(check.Value.TeamLeader);
                }
                return;
            }
            foreach (var check in RelationshipManager.ServerInstance.teams.ToArray()) {
                if (check.Value?.members == null || check.Value.members.Count == 0) continue;
                var teamData = new TeamFixData();
                teamData.TeamLeader = check.Value.teamLeader;
                teamData.Members.AddRange(check.Value.members);
                _data.TeamFix.Add(check.Key, teamData);
            }
            SaveData();
        }
        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() {
            if (!_config.Options.EnableGridPosition) return;
            timer.Every(_config.HudSettings.SquareUpdateRate, () => {
                foreach (var check in OnlineTeams) {
                    var container = new CuiElementContainer();
                    foreach (var player in check.Value) FillGridInfo(container, null, player);
                    foreach (var player in check.Value) {
                        if (_config.Permissions.HudNeedPermission && !permission.UserHasPermission(player.UserIDString, _config.Permissions.HudUsePermission)) continue;
                        var data = GetPlayerData(player.userID);
                        if (data is not {
                            EnableTeamGridPoisition : true
                        }
                        ) 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) {
            foreach (var check in _data.Teams) if (check.ID == id) return check;
            var data = new TeamSettings(id, 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);
        }
        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.FreeUnmanaged(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.FreeUnmanaged(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.FreeUnmanaged(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.FreeUnmanaged(ref foundEntities);
                return;
            }
            PlayerPing(player, info.point, 0, 2);
            Facepunch.Pool.FreeUnmanaged(ref foundEntities);
        }
        [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(2));
                    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 "grid" : data = GetPlayerData(player);
                data.EnableTeamGridPoisition = !data.EnableTeamGridPoisition;
                if (!data.EnableTeamGridPoisition) foreach (var check in player.Team.members) CuiHelper.DestroyUi(player, Layer + ".TeamHud" + check + ".Grid");
                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 "m
// ... [Code preview truncated due to length. Full source in attached file] ...

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху