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

FREE BetterTeams : 1.0.5 1.0.5

Нет прав для скачивания
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] ...

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