using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Oxide.Core; using Oxide.Core.Plugins; using Oxide.Game.Rust; using Oxide.Game.Rust.Cui; using ProtoBuf; using UnityEngine; namespace Oxide.Plugins { [Info("Automatic Authorization", "k1lly0u/Arainrr", "1.2.4", ResourceId = 2063)] public class AutomaticAuthorization : RustPlugin { #region Fields [PluginReference] private readonly Plugin Clans, Friends; private const string PERMISSION_USE = "automaticauthorization.use"; private readonly Dictionary playerEntities = new Dictionary(); private enum ShareType { None, Teams, Friends, Clans, } private enum AutoAuthType { All, Turret, Cupboard, } private class EntityCache { public readonly HashSet autoTurrets = new HashSet(); public readonly HashSet buildingPrivlidges = new HashSet(); } #endregion Fields #region Oxide Hooks private void Init() { LoadData(); UpdateData(); Unsubscribe(nameof(OnEntitySpawned)); permission.RegisterPermission(PERMISSION_USE, this); cmd.AddChatCommand(configData.chatS.chatCommand, this, nameof(CmdAutoAuth)); cmd.AddChatCommand(configData.chatS.uiCommand, this, nameof(CmdAutoAuthUI)); if (!configData.teamShareS.enabled) { Unsubscribe(nameof(OnTeamLeave)); Unsubscribe(nameof(OnTeamKick)); Unsubscribe(nameof(OnTeamDisbanded)); Unsubscribe(nameof(OnTeamAcceptInvite)); } if (!configData.friendsShareS.enabled) { Unsubscribe(nameof(OnFriendAdded)); Unsubscribe(nameof(OnFriendRemoved)); } if (!configData.clanShareS.enabled) { Unsubscribe(nameof(OnClanUpdate)); Unsubscribe(nameof(OnClanDestroy)); Unsubscribe(nameof(OnClanMemberGone)); } } private void OnServerInitialized() { Subscribe(nameof(OnEntitySpawned)); foreach (var serverEntity in BaseNetworkable.serverEntities) { var autoTurret = serverEntity as AutoTurret; if (autoTurret != null) { CheckEntitySpawned(autoTurret); continue; } var buildingPrivlidge = serverEntity as BuildingPrivlidge; if (buildingPrivlidge != null) { CheckEntitySpawned(buildingPrivlidge); } } } private void OnServerSave() => timer.Once(UnityEngine.Random.Range(0f, 60f), SaveData); private void Unload() { foreach (var player in BasePlayer.activePlayerList) DestroyUI(player); SaveData(); } private void OnEntitySpawned(AutoTurret autoTurret) => CheckEntitySpawned(autoTurret, true); private void OnEntitySpawned(BuildingPrivlidge buildingPrivlidge) => CheckEntitySpawned(buildingPrivlidge, true); private void OnEntityKill(AutoTurret autoTurret) => CheckEntityKill(autoTurret); private void OnEntityKill(BuildingPrivlidge buildingPrivlidge) => CheckEntityKill(buildingPrivlidge); private object CanUseLockedEntity(BasePlayer player, BaseLock baseLock) { if (player == null || baseLock == null || !baseLock.IsLocked()) return null; var parentEntity = baseLock.GetParentEntity(); var ownerID = baseLock.OwnerID.IsSteamId() ? baseLock.OwnerID : parentEntity != null ? parentEntity.OwnerID : 0; if (!ownerID.IsSteamId() || ownerID == player.userID) return null; if (!permission.UserHasPermission(ownerID.ToString(), PERMISSION_USE)) return null; var shareData = GetShareData(ownerID, true); if (shareData.teamShare.enabled && SameTeam(ownerID, player.userID)) { if (baseLock is KeyLock && shareData.teamShare.keyLock && CanUnlockEntity(parentEntity, configData.teamShareS.keyLockS)) return true; var codeLock = baseLock as CodeLock; if (codeLock != null && shareData.teamShare.codeLock && CanUnlockEntity(parentEntity, configData.teamShareS.codeLockS)) return SendUnlockedEffect(codeLock); } if (shareData.friendsShare.enabled && HasFriend(ownerID, player.userID)) { if (baseLock is KeyLock && shareData.friendsShare.keyLock && CanUnlockEntity(parentEntity, configData.friendsShareS.keyLockS)) return true; var codeLock = baseLock as CodeLock; if (codeLock != null && shareData.friendsShare.codeLock && CanUnlockEntity(parentEntity, configData.friendsShareS.codeLockS)) return SendUnlockedEffect(codeLock); } if (shareData.clanShare.enabled && SameClan(ownerID, player.userID)) { if (baseLock is KeyLock && shareData.clanShare.keyLock && CanUnlockEntity(parentEntity, configData.clanShareS.keyLockS)) return true; var codeLock = baseLock as CodeLock; if (codeLock != null && shareData.clanShare.codeLock && CanUnlockEntity(parentEntity, configData.clanShareS.codeLockS)) return SendUnlockedEffect(codeLock); } return null; } #endregion Oxide Hooks #region Helpers private static bool CanUnlockEntity(BaseEntity parentEntity, ConfigData.LockSettings lockSettings) { if (parentEntity is Door) { return lockSettings.shareDoor; } if (parentEntity is BoxStorage) { return lockSettings.shareBox; } return lockSettings.shareOtherEntity; } private static bool SendUnlockedEffect(CodeLock codeLock) { if (codeLock.effectUnlocked.isValid) { Effect.server.Run(codeLock.effectUnlocked.resourcePath, codeLock.transform.position); } return true; } #endregion Helpers #region Methods #region Entity Spawn / Kill private void CheckEntitySpawned(AutoTurret autoTurret, bool justCreated = false) { if (autoTurret == null || !autoTurret.OwnerID.IsSteamId()) return; EntityCache entityCache; if (!playerEntities.TryGetValue(autoTurret.OwnerID, out entityCache)) { entityCache = new EntityCache(); playerEntities.Add(autoTurret.OwnerID, entityCache); } entityCache.autoTurrets.Add(autoTurret); if (justCreated && permission.UserHasPermission(autoTurret.OwnerID.ToString(), PERMISSION_USE)) AuthToTurret(new HashSet { autoTurret }, autoTurret.OwnerID, true); } private void CheckEntitySpawned(BuildingPrivlidge buildingPrivlidge, bool justCreated = false) { if (buildingPrivlidge == null || !buildingPrivlidge.OwnerID.IsSteamId()) return; EntityCache entityCache; if (!playerEntities.TryGetValue(buildingPrivlidge.OwnerID, out entityCache)) { entityCache = new EntityCache(); playerEntities.Add(buildingPrivlidge.OwnerID, entityCache); } entityCache.buildingPrivlidges.Add(buildingPrivlidge); if (justCreated && permission.UserHasPermission(buildingPrivlidge.OwnerID.ToString(), PERMISSION_USE)) AuthToCupboard(new HashSet { buildingPrivlidge }, buildingPrivlidge.OwnerID, true); } private void CheckEntityKill(AutoTurret autoTurret) { if (autoTurret == null || !autoTurret.OwnerID.IsSteamId()) return; EntityCache entityCache; if (playerEntities.TryGetValue(autoTurret.OwnerID, out entityCache)) { entityCache.autoTurrets.Remove(autoTurret); } } private void CheckEntityKill(BuildingPrivlidge buildingPrivlidge) { if (buildingPrivlidge == null || !buildingPrivlidge.OwnerID.IsSteamId()) return; EntityCache entityCache; if (playerEntities.TryGetValue(buildingPrivlidge.OwnerID, out entityCache)) { entityCache.buildingPrivlidges.Remove(buildingPrivlidge); } } #endregion Entity Spawn / Kill private void UpdateAuthList(ulong playerID, AutoAuthType autoAuthType) { if (!permission.UserHasPermission(playerID.ToString(), PERMISSION_USE)) return; EntityCache entityCache; if (!playerEntities.TryGetValue(playerID, out entityCache)) return; switch (autoAuthType) { case AutoAuthType.All: AuthToTurret(entityCache.autoTurrets, playerID); AuthToCupboard(entityCache.buildingPrivlidges, playerID); return; case AutoAuthType.Turret: AuthToTurret(entityCache.autoTurrets, playerID); return; case AutoAuthType.Cupboard: AuthToCupboard(entityCache.buildingPrivlidges, playerID); return; } } private void AuthToTurret(HashSet autoTurrets, ulong playerID, bool justCreated = false) { if (autoTurrets.Count <= 0) return; var authList = GetPlayerNameIDs(playerID, AutoAuthType.Turret); foreach (var autoTurret in autoTurrets) { if (autoTurret == null || autoTurret.IsDestroyed) continue; var isOnline = autoTurret.IsOnline(); if (isOnline) autoTurret.SetIsOnline(false); autoTurret.authorizedPlayers.Clear(); foreach (var friend in authList) { autoTurret.authorizedPlayers.Add(friend); } if (isOnline) autoTurret.SetIsOnline(true); autoTurret.SendNetworkUpdate(); } var player = BasePlayer.FindByID(playerID); if (player == null) return; if (justCreated && configData.chatS.sendMessage && authList.Count > 1) Print(player, Lang("TurretSuccess", player.UserIDString, authList.Count - 1, autoTurrets.Count)); } private void AuthToCupboard(HashSet buildingPrivlidges, ulong playerID, bool justCreated = false) { if (buildingPrivlidges.Count <= 0) return; var authList = GetPlayerNameIDs(playerID, AutoAuthType.Cupboard); foreach (var buildingPrivlidge in buildingPrivlidges) { if (buildingPrivlidge == null || buildingPrivlidge.IsDestroyed) continue; buildingPrivlidge.authorizedPlayers.Clear(); foreach (var friend in authList) { buildingPrivlidge.authorizedPlayers.Add(friend); } buildingPrivlidge.SendNetworkUpdate(); } var player = BasePlayer.FindByID(playerID); if (player == null) return; if (justCreated && configData.chatS.sendMessage && authList.Count > 1) Print(player, Lang("CupboardSuccess", player.UserIDString, authList.Count - 1, buildingPrivlidges.Count)); } private List GetPlayerNameIDs(ulong playerID, AutoAuthType autoAuthType) { var authList = GetAuthList(playerID, autoAuthType); return authList.Select(auth => new PlayerNameID { userid = auth, username = RustCore.FindPlayerById(auth)?.displayName ?? string.Empty, ShouldPool = true }).ToList(); } private IEnumerable GetAuthList(ulong playerID, AutoAuthType autoAuthType) { var shareData = GetShareData(playerID, true); var sharePlayers = new HashSet { playerID }; if (shareData.teamShare.enabled && (autoAuthType == AutoAuthType.Turret ? shareData.teamShare.turret : shareData.teamShare.cupboard)) { var teamMembers = GetTeamMembers(playerID); if (teamMembers != null) { foreach (var member in teamMembers) { sharePlayers.Add(member); } } } if (shareData.friendsShare.enabled && (autoAuthType == AutoAuthType.Turret ? shareData.friendsShare.turret : shareData.friendsShare.cupboard)) { var friends = GetFriends(playerID); if (friends != null) { foreach (var friend in friends) { sharePlayers.Add(friend); } } } if (shareData.clanShare.enabled && (autoAuthType == AutoAuthType.Turret ? shareData.clanShare.turret : shareData.clanShare.cupboard)) { var clanMembers = GetClanMembers(playerID); if (clanMembers != null) { foreach (var member in clanMembers) { sharePlayers.Add(member); } } } return sharePlayers; } private StoredData.ShareData GetShareData(ulong playerID, bool readOnly = false) { StoredData.ShareData shareData; if (!storedData.playerShareData.TryGetValue(playerID, out shareData)) { shareData = new StoredData.ShareData { friendsShare = new StoredData.ShareEntry { enabled = configData.friendsShareS.enabled, turret = configData.friendsShareS.shareTurret, cupboard = configData.friendsShareS.shareCupboard, keyLock = configData.friendsShareS.keyLockS.enabled, codeLock = configData.friendsShareS.codeLockS.enabled, }, clanShare = new StoredData.ShareEntry { enabled = configData.clanShareS.enabled, turret = configData.clanShareS.shareTurret, cupboard = configData.clanShareS.shareCupboard, keyLock = configData.clanShareS.keyLockS.enabled, codeLock = configData.clanShareS.codeLockS.enabled, }, teamShare = new StoredData.ShareEntry { enabled = configData.teamShareS.enabled, turret = configData.teamShareS.shareTurret, cupboard = configData.teamShareS.shareCupboard, keyLock = configData.teamShareS.keyLockS.enabled, codeLock = configData.teamShareS.codeLockS.enabled, } }; if (readOnly) { return shareData; } storedData.playerShareData.Add(playerID, shareData); } return shareData; } private void UpdateData() { foreach (var entry in storedData.playerShareData) { if (!configData.friendsShareS.enabled) entry.Value.friendsShare.enabled = false; if (!configData.friendsShareS.shareCupboard) entry.Value.friendsShare.cupboard = false; if (!configData.friendsShareS.shareTurret) entry.Value.friendsShare.turret = false; if (!configData.friendsShareS.keyLockS.enabled) entry.Value.friendsShare.keyLock = false; if (!configData.friendsShareS.codeLockS.enabled) entry.Value.friendsShare.codeLock = false; if (!configData.clanShareS.enabled) entry.Value.clanShare.enabled = false; if (!configData.clanShareS.shareCupboard) entry.Value.clanShare.cupboard = false; if (!configData.clanShareS.shareTurret) entry.Value.clanShare.turret = false; if (!configData.clanShareS.keyLockS.enabled) entry.Value.clanShare.keyLock = false; if (!configData.clanShareS.codeLockS.enabled) entry.Value.clanShare.codeLock = false; if (!configData.teamShareS.enabled) entry.Value.teamShare.enabled = false; if (!configData.teamShareS.shareCupboard) entry.Value.teamShare.cupboard = false; if (!configData.teamShareS.shareTurret) entry.Value.teamShare.turret = false; if (!configData.teamShareS.keyLockS.enabled) entry.Value.teamShare.keyLock = false; if (!configData.teamShareS.codeLockS.enabled) entry.Value.teamShare.codeLock = false; } SaveData(); } private IEnumerable GetAvailableTypes() { if (configData.teamShareS.enabled && RelationshipManager.TeamsEnabled()) yield return ShareType.Teams; if (configData.friendsShareS.enabled && Friends != null) yield return ShareType.Friends; if (configData.clanShareS.enabled && Clans != null) yield return ShareType.Clans; } #endregion Methods #region External Plugins #region Teams #region Hooks private void OnTeamAcceptInvite(RelationshipManager.PlayerTeam playerTeam, BasePlayer player) { NextTick(() => { if (playerTeam == null || player == null) return; if (playerTeam.members.Contains(player.userID)) { UpdateTeamAuthList(playerTeam.members); } }); } private void OnTeamLeave(RelationshipManager.PlayerTeam playerTeam, BasePlayer player) { NextTick(() => { if (playerTeam == null || player == null) return; if (!playerTeam.members.Contains(player.userID)) { var teamMembers = new List(playerTeam.members) { player.userID }; UpdateTeamAuthList(teamMembers); } }); } private void OnTeamKick(RelationshipManager.PlayerTeam playerTeam, BasePlayer leader, ulong target) { NextTick(() => { if (playerTeam == null) return; if (!playerTeam.members.Contains(target)) { var teamMembers = new List(playerTeam.members) { target }; UpdateTeamAuthList(teamMembers); } }); } private void OnTeamDisbanded(RelationshipManager.PlayerTeam playerTeam) { if (playerTeam == null) return; UpdateTeamAuthList(playerTeam.members); } #endregion Hooks private void UpdateTeamAuthList(List teamMembers) { if (teamMembers.Count <= 0) return; foreach (var member in teamMembers) { UpdateAuthList(member, AutoAuthType.All); } } private static IEnumerable GetTeamMembers(ulong playerID) { if (!RelationshipManager.TeamsEnabled()) return null; var playerTeam = RelationshipManager.Instance.FindPlayersTeam(playerID); return playerTeam?.members; } private static bool SameTeam(ulong playerID, ulong friendID) { if (!RelationshipManager.TeamsEnabled()) return false; var playerTeam = RelationshipManager.Instance.FindPlayersTeam(playerID); if (playerTeam == null) return false; var friendTeam = RelationshipManager.Instance.FindPlayersTeam(friendID); if (friendTeam == null) return false; return playerTeam == friendTeam; } #endregion Teams #region Friends #region Hooks private void OnFriendAdded(string playerID, string friendID) => UpdateFriendAuthList(playerID, friendID); private void OnFriendRemoved(string playerID, string friendID) => UpdateFriendAuthList(playerID, friendID); #endregion Hooks private void UpdateFriendAuthList(string playerID, string friendID) { UpdateAuthList(ulong.Parse(playerID), AutoAuthType.All); UpdateAuthList(ulong.Parse(friendID), AutoAuthType.All); } private IEnumerable GetFriends(ulong playerID) { if (Friends == null) return null; var friends = Friends.Call("GetFriends", playerID) as ulong[]; return friends; } private bool HasFriend(ulong playerID, ulong friendID) { if (Friends == null) return false; var hasFriend = Friends.Call("HasFriend", playerID, friendID); return hasFriend is bool && (bool)hasFriend; } #endregion Friends #region Clans #region Hooks private void OnClanDestroy(string clanName) => UpdateClanAuthList(clanName); private void OnClanUpdate(string clanName) => UpdateClanAuthList(clanName); #region Clans Reborn Hooks private void OnClanMemberGone(string playerID, List memberUserIDs) { UpdateAuthList(ulong.Parse(playerID), AutoAuthType.All); } #endregion Clans Reborn Hooks #endregion Hooks private void UpdateClanAuthList(string clanName) { var clanMembers = GetClanMembers(clanName); if (clanMembers != null) { foreach (var member in clanMembers) { UpdateAuthList(member, AutoAuthType.All); } } } private IEnumerable GetClanMembers(ulong playerID) { if (Clans == null) return null; //Clans Reborn var members = Clans.Call("GetClanMembers", playerID); if (members != null) return (members as List)?.Select(ulong.Parse); //Clans var clanName = Clans.Call("GetClanOf", playerID) as string; return clanName != null ? GetClanMembers(clanName) : null; } private IEnumerable GetClanMembers(string clanName) { var clan = Clans.Call("GetClan", clanName) as JObject; var members = clan?.GetValue("members") as JArray; return members?.Select(x => ulong.Parse(x.ToString())); } private bool SameClan(ulong playerID, ulong friendID) { if (Clans == null) return false; //Clans and Clans Reborn var isMember = Clans.Call("IsClanMember", playerID.ToString(), friendID.ToString()); if (isMember != null) return (bool)isMember; //Rust:IO Clans var playerClan = Clans.Call("GetClanOf", playerID); if (playerClan == null) return false; var friendClan = Clans.Call("GetClanOf", friendID); if (friendClan == null) return false; return (string)playerClan == (string)friendClan; } #endregion Clans #endregion External Plugins #region UI private const string UINAME_MAIN = "AutoAuthUI_Main"; private const string UINAME_MENU = "AutoAuthUI_Menu"; private void CreateMainUI(BasePlayer player) { var container = new CuiElementContainer(); container.Add(new CuiPanel { Image = { Color = "0 0 0 0.6" }, RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = "-380 -200", OffsetMax = "380 260" }, CursorEnabled = true }, "Hud", UINAME_MAIN); var titlePanel = container.Add(new CuiPanel { Image = { Color = "0.42 0.88 0.88 1" }, RectTransform = { AnchorMin = "0 0.902", AnchorMax = "1 1" }, }, UINAME_MAIN); container.Add(new CuiElement { Parent = titlePanel, Components = { new CuiTextComponent { Text = Lang("UI_Title", player.UserIDString), FontSize = 24, Align = TextAnchor.MiddleCenter, Color ="1 0 0 1" }, new CuiOutlineComponent { Distance = "0.5 0.5", Color = "1 1 1 1" }, new CuiRectTransformComponent { AnchorMin = "0.2 0", AnchorMax = "0.8 1" } } }); container.Add(new CuiButton { Button = { Color = "0.95 0.1 0.1 0.95", Close = UINAME_MAIN }, Text = { Text = "X", Align = TextAnchor.MiddleCenter, Color = "0 0 0 1", FontSize = 22 }, RectTransform = { AnchorMin = "0.885 0.05", AnchorMax = "0.995 0.95" } }, titlePanel); container.Add(new CuiPanel { Image = { Color = "0.1 0.1 0.1 0.4" }, RectTransform = { AnchorMin = "0 0", AnchorMax = "1 0.898" }, }, UINAME_MAIN, UINAME_MENU); CuiHelper.DestroyUi(player, UINAME_MAIN); CuiHelper.AddUi(player, container); var shareData = GetShareData(player.userID, true); UpdateMenuUI(player, shareData); } private void UpdateMenuUI(BasePlayer player, StoredData.ShareData shareData, ShareType type = ShareType.None) { if (player == null) return; var availableTypes = GetAvailableTypes(); var total = availableTypes.Count(); if (total <= 0) return; int i = 0; var container = new CuiElementContainer(); #region Teams UI if (availableTypes.Contains(ShareType.Teams)) { if (type == ShareType.None || type == ShareType.Teams) { var anchors = GetMenuSubAnchors(i, total); CuiHelper.DestroyUi(player, UINAME_MENU + ShareType.Teams); CreateMenuSubUI(ref container, shareData.teamShare, player.UserIDString, ShareType.Teams, $"{anchors[0]} 0.05", $"{anchors[1]} 0.95"); } i++; } #endregion Teams UI #region Friends UI if (availableTypes.Contains(ShareType.Friends)) { if (type == ShareType.None || type == ShareType.Friends) { var anchors = GetMenuSubAnchors(i, total); CuiHelper.DestroyUi(player, UINAME_MENU + ShareType.Friends); CreateMenuSubUI(ref container, shareData.friendsShare, player.UserIDString, ShareType.Friends, $"{anchors[0]} 0.05", $"{anchors[1]} 0.95"); } i++; } #endregion Friends UI #region Clans UI if (availableTypes.Contains(ShareType.Clans)) { if (type == ShareType.None || type == ShareType.Clans) { var anchors = GetMenuSubAnchors(i, total); CuiHelper.DestroyUi(player, UINAME_MENU + ShareType.Clans); CreateMenuSubUI(ref container, shareData.clanShare, player.UserIDString, ShareType.Clans, $"{anchors[0]} 0.05", $"{anchors[1]} 0.95"); } } #endregion Clans UI CuiHelper.AddUi(player, container); } private void CreateMenuSubUI(ref CuiElementContainer container, StoredData.ShareEntry shareEntry, string playerID, ShareType type, string anchorMin, string anchorMax) { var panelName = container.Add(new CuiPanel { Image = { Color = "0.1 0.1 0.1 0.6" }, RectTransform = { AnchorMin = anchorMin, AnchorMax = anchorMax }, }, UINAME_MENU, UINAME_MENU + type); var titlePanel = container.Add(new CuiPanel { Image = { Color = "0.1 0.1 0.1 0.6" }, RectTransform = { AnchorMin = "0 0.85", AnchorMax = "1 1" }, }, panelName); container.Add(new CuiLabel { Text = { Color = "0 1 1 1", FontSize = 18, Align = TextAnchor.MiddleCenter, Text = Lang($"UI_{type}Title", playerID) }, RectTransform = { AnchorMin = "0.1 0", AnchorMax = "0.795 1" } }, titlePanel); var contentPanel = container.Add(new CuiPanel { Image = { Color = "0.1 0.1 0.1 0.6" }, RectTransform = { AnchorMin = "0 0", AnchorMax = "0.995 0.845" }, }, panelName); int i = 0; var spacing = 1f / 5; var anchors = GetEntryAnchors(i++, spacing); CreateEntry(ref container, contentPanel, $"AutoAuthUI {type}", Lang($"UI_{type}Share", playerID), shareEntry.enabled ? Lang("Enabled", playerID) : Lang("Disabled", playerID), $"0 {anchors[0]}", $"0.995 {anchors[1]}"); anchors = GetEntryAnchors(i++, spacing); CreateEntry(ref container, contentPanel, $"AutoAuthUI {type} Cupboard", Lang($"UI_{type}Cupboard", playerID), shareEntry.cupboard ? Lang("Enabled", playerID) : Lang("Disabled", playerID), $"0 {anchors[0]}", $"0.995 {anchors[1]}"); anchors = GetEntryAnchors(i++, spacing); CreateEntry(ref container, contentPanel, $"AutoAuthUI {type} Turret", Lang($"UI_{type}Turret", playerID), shareEntry.turret ? Lang("Enabled", playerID) : Lang("Disabled", playerID), $"0 {anchors[0]}", $"0.995 {anchors[1]}"); anchors = GetEntryAnchors(i++, spacing); CreateEntry(ref container, contentPanel, $"AutoAuthUI {type} KeyLock", Lang($"UI_{type}KeyLock", playerID), shareEntry.keyLock ? Lang("Enabled", playerID) : Lang("Disabled", playerID), $"0 {anchors[0]}", $"0.995 {anchors[1]}"); anchors = GetEntryAnchors(i++, spacing); CreateEntry(ref container, contentPanel, $"AutoAuthUI {type} CodeLock", Lang($"UI_{type}CodeLock", playerID), shareEntry.codeLock ? Lang("Enabled", playerID) : Lang("Disabled", playerID), $"0 {anchors[0]}", $"0.995 {anchors[1]}"); } private static void CreateEntry(ref CuiElementContainer container, string parentName, string command, string leftText, string rightText, string anchorMin, string anchorMax) { var panelName = container.Add(new CuiPanel { Image = { Color = "0.1 0.1 0.1 0.6" }, RectTransform = { AnchorMin = anchorMin, AnchorMax = anchorMax }, }, parentName); container.Add(new CuiLabel { Text = { Color = "0 1 1 1", FontSize = 14, Align = TextAnchor.MiddleLeft, Text = leftText }, RectTransform = { AnchorMin = "0.1 0", AnchorMax = "0.695 1" } }, panelName); container.Add(new CuiButton { Button = { Color = "0 0 0 0.7", Command = command }, Text = { Text = rightText, Align = TextAnchor.MiddleCenter, Color = "1 1 1 1", FontSize = 14 }, RectTransform = { AnchorMin = "0.7 0.01", AnchorMax = "0.995 0.99" }, }, panelName); } private static float[] GetEntryAnchors(int i, float spacing) { return new[] { 1f - (i + 1) * spacing, 1f - i * spacing }; } private static float[] GetMenuSubAnchors(int i, int total) { switch (total) { case 1: return new[] { 0.3f, 0.7f }; case 2: return i == 0 ? new[] { 0.15f, 0.48f } : new[] { 0.52f, 0.85f }; case 3: switch (i) { case 0: return new[] { 0.02f, 0.32f }; case 1: return new[] { 0.335f, 0.665f }; default: return new[] { 0.68f, 0.98f }; } default: return null; } } private static void DestroyUI(BasePlayer player) => CuiHelper.DestroyUi(player, UINAME_MAIN); #endregion UI #region Chat Commands private void CmdAutoAuth(BasePlayer player, string command, string[] args) { if (!permission.UserHasPermission(player.UserIDString, PERMISSION_USE)) { Print(player, Lang("NotAllowed", player.UserIDString)); return; } var shareData = GetShareData(player.userID); var availableTypes = GetAvailableTypes(); if (args == null || args.Length == 0) { if (!availableTypes.Any()) { Print(player, Lang("UnableAutoAuth", player.UserIDString)); return; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(); if (availableTypes.Contains(ShareType.Teams)) { stringBuilder.AppendLine(Lang("AutoShareTeamsStatus", player.UserIDString)); stringBuilder.AppendLine(Lang("AutoShareTeams", player.UserIDString, shareData.teamShare.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareTeamsCupboard", player.UserIDString, shareData.teamShare.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareTeamsTurret", player.UserIDString, shareData.teamShare.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareTeamsKeyLock", player.UserIDString, shareData.teamShare.keyLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareTeamsCodeLock", player.UserIDString, shareData.teamShare.codeLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); } if (availableTypes.Contains(ShareType.Friends)) { stringBuilder.AppendLine(Lang("AutoShareFriendsStatus", player.UserIDString)); stringBuilder.AppendLine(Lang("AutoShareFriends", player.UserIDString, shareData.friendsShare.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareFriendsCupboard", player.UserIDString, shareData.friendsShare.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareFriendsTurret", player.UserIDString, shareData.friendsShare.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareFriendsKeyLock", player.UserIDString, shareData.friendsShare.keyLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareFriendsCodeLock", player.UserIDString, shareData.friendsShare.codeLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); } if (availableTypes.Contains(ShareType.Clans)) { stringBuilder.AppendLine(Lang("AutoShareClansStatus", player.UserIDString)); stringBuilder.AppendLine(Lang("AutoShareClans", player.UserIDString, shareData.clanShare.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareClansCupboard", player.UserIDString, shareData.clanShare.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareClansTurret", player.UserIDString, shareData.clanShare.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareClansKeyLock", player.UserIDString, shareData.clanShare.keyLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); stringBuilder.AppendLine(Lang("AutoShareClansCodeLock", player.UserIDString, shareData.clanShare.codeLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); } Print(player, stringBuilder.ToString()); return; } switch (args[0].ToLower()) { case "ui": CreateMainUI(player); return; case "at": case "autoteam": if (!availableTypes.Contains(ShareType.Teams)) { Print(player, Lang("TeamsDisabled", player.UserIDString)); return; } if (args.Length <= 1) { shareData.teamShare.enabled = !shareData.teamShare.enabled; Print(player, Lang("Teams", player.UserIDString, shareData.teamShare.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.All); return; } switch (args[1].ToLower()) { case "c": case "cupboard": if (!configData.clanShareS.shareCupboard) { Print(player, Lang("TeamsCupboardDisable", player.UserIDString)); return; } shareData.teamShare.cupboard = !shareData.teamShare.cupboard; Print(player, Lang("TeamsCupboard", player.UserIDString, shareData.teamShare.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.Cupboard); return; case "t": case "turret": if (!configData.clanShareS.shareTurret) { Print(player, Lang("TeamsTurretDisable", player.UserIDString)); return; } shareData.teamShare.turret = !shareData.teamShare.turret; Print(player, Lang("TeamsTurret", player.UserIDString, shareData.teamShare.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.Turret); return; case "kl": case "keylock": if (!configData.clanShareS.keyLockS.enabled) { Print(player, Lang("TeamsKeyLockDisable", player.UserIDString)); return; } shareData.teamShare.keyLock = !shareData.teamShare.keyLock; Print(player, Lang("TeamsKeyLock", player.UserIDString, shareData.teamShare.keyLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); return; case "cl": case "codelock": if (!configData.clanShareS.codeLockS.enabled) { Print(player, Lang("TeamsCodeLockDisable", player.UserIDString)); return; } shareData.teamShare.codeLock = !shareData.teamShare.codeLock; Print(player, Lang("TeamsCodeLock", player.UserIDString, shareData.teamShare.codeLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); return; case "h": case "help": StringBuilder stringBuilder1 = new StringBuilder(); stringBuilder1.AppendLine(); stringBuilder1.AppendLine(Lang("TeamsSyntax", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("TeamsSyntax1", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("TeamsSyntax2", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("TeamsSyntax3", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("TeamsSyntax4", player.UserIDString, configData.chatS.chatCommand)); Print(player, stringBuilder1.ToString()); return; } Print(player, Lang("SyntaxError", player.UserIDString, configData.chatS.chatCommand)); return; case "af": case "autofriends": if (!availableTypes.Contains(ShareType.Friends)) { Print(player, Lang("FriendsDisabled", player.UserIDString)); return; } if (args.Length <= 1) { shareData.friendsShare.enabled = !shareData.friendsShare.enabled; Print(player, Lang("Friends", player.UserIDString, shareData.friendsShare.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.All); return; } switch (args[1].ToLower()) { case "c": case "cupboard": if (!configData.friendsShareS.shareCupboard) { Print(player, Lang("FriendsCupboardDisabled", player.UserIDString)); return; } shareData.friendsShare.cupboard = !shareData.friendsShare.cupboard; Print(player, Lang("FriendsCupboard", player.UserIDString, shareData.friendsShare.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.Cupboard); return; case "t": case "turret": if (!configData.friendsShareS.shareTurret) { Print(player, Lang("FriendsTurretDisable", player.UserIDString)); return; } shareData.friendsShare.turret = !shareData.friendsShare.turret; Print(player, Lang("FriendsTurret", player.UserIDString, shareData.friendsShare.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.Turret); return; case "kl": case "keylock": if (!configData.friendsShareS.keyLockS.enabled) { Print(player, Lang("FriendsKeyLockDisable", player.UserIDString)); return; } shareData.friendsShare.keyLock = !shareData.friendsShare.keyLock; Print(player, Lang("FriendsKeyLock", player.UserIDString, shareData.friendsShare.keyLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); return; case "cl": case "codelock": if (!configData.friendsShareS.codeLockS.enabled) { Print(player, Lang("FriendsCodeLockDisable", player.UserIDString)); return; } shareData.friendsShare.codeLock = !shareData.friendsShare.codeLock; Print(player, Lang("FriendsCodeLock", player.UserIDString, shareData.friendsShare.codeLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); return; case "h": case "help": StringBuilder stringBuilder1 = new StringBuilder(); stringBuilder1.AppendLine(); stringBuilder1.AppendLine(Lang("FriendsSyntax", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("FriendsSyntax1", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("FriendsSyntax2", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("FriendsSyntax3", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("FriendsSyntax4", player.UserIDString, configData.chatS.chatCommand)); Print(player, stringBuilder1.ToString()); return; } Print(player, Lang("SyntaxError", player.UserIDString, configData.chatS.chatCommand)); return; case "ac": case "autoclan": if (!availableTypes.Contains(ShareType.Clans)) { Print(player, Lang("ClansDisabled", player.UserIDString)); return; } if (args.Length <= 1) { shareData.clanShare.enabled = !shareData.clanShare.enabled; Print(player, Lang("Clans", player.UserIDString, shareData.clanShare.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.All); return; } switch (args[1].ToLower()) { case "c": case "cupboard": if (!configData.clanShareS.shareCupboard) { Print(player, Lang("ClansCupboardDisable", player.UserIDString)); return; } shareData.clanShare.cupboard = !shareData.clanShare.cupboard; Print(player, Lang("ClansCupboard", player.UserIDString, shareData.clanShare.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.Cupboard); return; case "t": case "turret": if (!configData.clanShareS.shareTurret) { Print(player, Lang("ClansTurretDisable", player.UserIDString)); return; } shareData.clanShare.turret = !shareData.clanShare.turret; Print(player, Lang("ClansTurret", player.UserIDString, shareData.clanShare.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); UpdateAuthList(player.userID, AutoAuthType.Turret); return; case "kl": case "keylock": if (!configData.clanShareS.keyLockS.enabled) { Print(player, Lang("ClansKeyLockDisable", player.UserIDString)); return; } shareData.clanShare.keyLock = !shareData.clanShare.keyLock; Print(player, Lang("ClansKeyLock", player.UserIDString, shareData.clanShare.keyLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); return; case "cl": case "codelock": if (!configData.clanShareS.codeLockS.enabled) { Print(player, Lang("ClansCodeLockDisable", player.UserIDString)); return; } shareData.clanShare.codeLock = !shareData.clanShare.codeLock; Print(player, Lang("ClansCodeLock", player.UserIDString, shareData.clanShare.codeLock ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString))); return; case "h": case "help": StringBuilder stringBuilder1 = new StringBuilder(); stringBuilder1.AppendLine(); stringBuilder1.AppendLine(Lang("ClansSyntax", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("ClansSyntax1", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("ClansSyntax2", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("ClansSyntax3", player.UserIDString, configData.chatS.chatCommand)); stringBuilder1.AppendLine(Lang("ClansSyntax4", player.UserIDString, configData.chatS.chatCommand)); Print(player, stringBuilder1.ToString()); return; } Print(player, Lang("SyntaxError", player.UserIDString, configData.chatS.chatCommand)); return; case "h": case "help": if (!availableTypes.Any()) { Print(player, Lang("UnableAutoAuth", player.UserIDString)); return; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(); if (availableTypes.Contains(ShareType.Teams)) { stringBuilder.AppendLine(Lang("TeamsSyntax", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("TeamsSyntax1", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("TeamsSyntax2", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("TeamsSyntax3", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("TeamsSyntax4", player.UserIDString, configData.chatS.chatCommand)); } if (availableTypes.Contains(ShareType.Friends)) { stringBuilder.AppendLine(Lang("FriendsSyntax", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("FriendsSyntax1", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("FriendsSyntax2", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("FriendsSyntax3", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("FriendsSyntax4", player.UserIDString, configData.chatS.chatCommand)); } if (availableTypes.Contains(ShareType.Clans)) { stringBuilder.AppendLine(Lang("ClansSyntax", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("ClansSyntax1", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("ClansSyntax2", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("ClansSyntax3", player.UserIDString, configData.chatS.chatCommand)); stringBuilder.AppendLine(Lang("ClansSyntax4", player.UserIDString, configData.chatS.chatCommand)); } stringBuilder.AppendLine(Lang("UISyntax", player.UserIDString, configData.chatS.uiCommand)); Print(player, stringBuilder.ToString()); return; default: Print(player, Lang("SyntaxError", player.UserIDString, configData.chatS.chatCommand)); return; } } private void CmdAutoAuthUI(BasePlayer player, string command, string[] args) { if (!permission.UserHasPermission(player.UserIDString, PERMISSION_USE)) { Print(player, Lang("NotAllowed", player.UserIDString)); return; } CreateMainUI(player); } [ConsoleCommand("AutoAuthUI")] private void CCmdAutoAuthUI(ConsoleSystem.Arg arg) { var player = arg.Player(); if (player == null) return; if (!permission.UserHasPermission(player.UserIDString, PERMISSION_USE)) return; var shareData = GetShareData(player.userID); switch (arg.Args[0].ToLower()) { case "teams": if (!configData.teamShareS.enabled) return; if (arg.Args.Length <= 1) { shareData.teamShare.enabled = !shareData.teamShare.enabled; UpdateAuthList(player.userID, AutoAuthType.All); UpdateMenuUI(player, shareData, ShareType.Teams); return; } switch (arg.Args[1].ToLower()) { case "cupboard": shareData.teamShare.cupboard = !shareData.teamShare.cupboard; UpdateAuthList(player.userID, AutoAuthType.Cupboard); break; case "turret": shareData.teamShare.turret = !shareData.teamShare.turret; UpdateAuthList(player.userID, AutoAuthType.Turret); break; case "keylock": shareData.teamShare.keyLock = !shareData.teamShare.keyLock; break; case "codelock": shareData.teamShare.codeLock = !shareData.teamShare.codeLock; break; default: return; } UpdateMenuUI(player, shareData, ShareType.Teams); return; case "friends": if (!configData.friendsShareS.enabled) return; if (arg.Args.Length <= 1) { shareData.friendsShare.enabled = !shareData.friendsShare.enabled; UpdateAuthList(player.userID, AutoAuthType.All); UpdateMenuUI(player, shareData, ShareType.Friends); return; } switch (arg.Args[1].ToLower()) { case "cupboard": shareData.friendsShare.cupboard = !shareData.friendsShare.cupboard; UpdateAuthList(player.userID, AutoAuthType.Cupboard); break; case "turret": shareData.friendsShare.turret = !shareData.friendsShare.turret; UpdateAuthList(player.userID, AutoAuthType.Turret); break; case "keylock": shareData.friendsShare.keyLock = !shareData.friendsShare.keyLock; break; case "codelock": shareData.friendsShare.codeLock = !shareData.friendsShare.codeLock; break; default: return; } UpdateMenuUI(player, shareData, ShareType.Friends); return; case "clans": if (!configData.clanShareS.enabled) return; if (arg.Args.Length <= 1) { shareData.clanShare.enabled = !shareData.clanShare.enabled; UpdateAuthList(player.userID, AutoAuthType.All); UpdateMenuUI(player, shareData, ShareType.Clans); return; } switch (arg.Args[1].ToLower()) { case "cupboard": shareData.clanShare.cupboard = !shareData.clanShare.cupboard; UpdateAuthList(player.userID, AutoAuthType.Cupboard); break; case "turret": shareData.clanShare.turret = !shareData.clanShare.turret; UpdateAuthList(player.userID, AutoAuthType.Turret); break; case "keylock": shareData.clanShare.keyLock = !shareData.clanShare.keyLock; break; case "codelock": shareData.clanShare.codeLock = !shareData.clanShare.codeLock; break; default: return; } UpdateMenuUI(player, shareData, ShareType.Clans); return; } } #endregion Chat Commands #region ConfigurationFile private ConfigData configData; private class ConfigData { [JsonProperty(PropertyName = "Clear Share Data On Map Wipe")] public bool clearDataOnWipe = false; [JsonProperty(PropertyName = "Team Share Settings")] public ShareSettings teamShareS = new ShareSettings(); [JsonProperty(PropertyName = "Friends Share Settings")] public ShareSettings friendsShareS = new ShareSettings(); [JsonProperty(PropertyName = "Clan Share Settings")] public ShareSettings clanShareS = new ShareSettings(); [JsonProperty(PropertyName = "Chat Settings")] public ChatSettings chatS = new ChatSettings(); [JsonProperty(PropertyName = "Version")] public VersionNumber version; public class ChatSettings { [JsonProperty(PropertyName = "Send Authorization Success Message")] public bool sendMessage = true; [JsonProperty(PropertyName = "Chat Command")] public string chatCommand = "autoauth"; [JsonProperty(PropertyName = "Chat UI Command")] public string uiCommand = "autoauthui"; [JsonProperty(PropertyName = "Chat Prefix")] public string prefix = "[AutoAuth]: "; [JsonProperty(PropertyName = "Chat SteamID Icon")] public ulong steamIDIcon = 0; } public class ShareSettings { [JsonProperty(PropertyName = "Enabled")] public bool enabled = true; [JsonProperty(PropertyName = "Share Cupboard")] public bool shareCupboard = true; [JsonProperty(PropertyName = "Share Turret")] public bool shareTurret = true; [JsonProperty(PropertyName = "Key Lock Settings")] public LockSettings keyLockS = new LockSettings(); [JsonProperty(PropertyName = "Code Lock Settings")] public LockSettings codeLockS = new LockSettings(); } public class LockSettings { [JsonProperty(PropertyName = "Enabled")] public bool enabled = true; [JsonProperty(PropertyName = "Share Door")] public bool shareDoor = true; [JsonProperty(PropertyName = "Share Box")] public bool shareBox = true; [JsonProperty(PropertyName = "Share Other Locked Entities")] public bool shareOtherEntity = true; } } protected override void LoadConfig() { base.LoadConfig(); try { configData = Config.ReadObject(); if (configData == null) { LoadDefaultConfig(); } else { UpdateConfigValues(); } } catch { PrintError("The configuration file is corrupted"); LoadDefaultConfig(); } SaveConfig(); } protected override void LoadDefaultConfig() { PrintWarning("Creating a new configuration file"); configData = new ConfigData(); configData.version = Version; } protected override void SaveConfig() => Config.WriteObject(configData, true); private void UpdateConfigValues() { if (configData.version < Version) { if (configData.version <= new VersionNumber(1, 2, 0)) { if (configData.chatS.prefix == "[AutoAuth]: ") { configData.chatS.prefix = "[AutoAuth]: "; } } configData.version = Version; } } #endregion ConfigurationFile #region DataFile private StoredData storedData; private class StoredData { public readonly Dictionary playerShareData = new Dictionary(); public class ShareData { public ShareEntry teamShare = new ShareEntry(); public ShareEntry friendsShare = new ShareEntry(); public ShareEntry clanShare = new ShareEntry(); } public class ShareEntry { public bool enabled; public bool cupboard; public bool turret; public bool keyLock; public bool codeLock; } } private void LoadData() { try { storedData = Interface.Oxide.DataFileSystem.ReadObject(Name); } catch { storedData = null; } finally { if (storedData == null) { ClearData(); } } } private void ClearData() { storedData = new StoredData(); SaveData(); } private void SaveData() => Interface.Oxide.DataFileSystem.WriteObject(Name, storedData); private void OnNewSave(string filename) { if (configData.clearDataOnWipe) { ClearData(); } } #endregion DataFile #region LanguageFile private void Print(BasePlayer player, string message) { Player.Message(player, message, configData.chatS.prefix, configData.chatS.steamIDIcon); } private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args); protected override void LoadDefaultMessages() { lang.RegisterMessages(new Dictionary { ["NotAllowed"] = "You do not have permission to use this command", ["Enabled"] = "Enabled", ["Disabled"] = "Disabled", ["UnableAutoAuth"] = "Unable to automatically authorize other players", ["SyntaxError"] = "Syntax error, please type '/{0} ' to view help", ["TurretSuccess"] = "Successfully added {0} friends/clan members/team members to {1} turrets auth list", ["CupboardSuccess"] = "Successfully added {0} friends/clan members/team members to {1} cupboards auth list", ["FriendsSyntax"] = "/{0} - Enable/Disable automatic authorization for your friends", ["FriendsSyntax1"] = "/{0} - Sharing cupboard with your friends", ["FriendsSyntax2"] = "/{0} - Sharing turret with your friends", ["FriendsSyntax3"] = "/{0} - Sharing key lock with your friends", ["FriendsSyntax4"] = "/{0} - Sharing code lock with your friends", ["ClansSyntax"] = "/{0} - Enable/Disable automatic authorization for your clan members", ["ClansSyntax1"] = "/{0} - Sharing cupboard with your clan members", ["ClansSyntax2"] = "/{0} - Sharing turret with your clan members", ["ClansSyntax3"] = "/{0} - Sharing key lock with your clan members", ["ClansSyntax4"] = "/{0} - Sharing code lock with your clan members", ["TeamsSyntax"] = "/{0} - Enable/Disable automatic authorization for your team members", ["TeamsSyntax1"] = "/{0} - Sharing cupboard with your team members", ["TeamsSyntax2"] = "/{0} - Sharing turret with your team members", ["TeamsSyntax3"] = "/{0} - Sharing key lock with your team members", ["TeamsSyntax4"] = "/{0} - Sharing code lock with your team members", ["UISyntax"] = "/{0} - Open Automatic Authorization UI", ["AutoShareFriendsStatus"] = "Current friends sharing status: ", ["AutoShareFriends"] = "Automatically sharing with friends: {0}", ["AutoShareFriendsCupboard"] = "Automatically sharing cupboard with friends: {0}", ["AutoShareFriendsTurret"] = "Automatically sharing turret with friends: {0}", ["AutoShareFriendsKeyLock"] = "Automatically sharing key lock with friends: {0}", ["AutoShareFriendsCodeLock"] = "Automatically sharing code lock with friends: {0}", ["AutoShareClansStatus"] = "Current clan sharing status: ", ["AutoShareClans"] = "Automatically sharing with clan: {0}", ["AutoShareClansCupboard"] = "Automatically sharing cupboard with clan: {0}", ["AutoShareClansTurret"] = "Automatically sharing turret with clan: {0}", ["AutoShareClansKeyLock"] = "Automatically sharing key lock with clan: {0}", ["AutoShareClansCodeLock"] = "Automatically sharing code lock with clan: {0}", ["AutoShareTeamsStatus"] = "Current Team sharing status: ", ["AutoShareTeams"] = "Automatically sharing with Team: {0}", ["AutoShareTeamsCupboard"] = "Automatically sharing cupboard with Team: {0}", ["AutoShareTeamsTurret"] = "Automatically sharing turret with Team: {0}", ["AutoShareTeamsKeyLock"] = "Automatically sharing key lock with Team: {0}", ["AutoShareTeamsCodeLock"] = "Automatically sharing code lock with Team: {0}", ["Friends"] = "Friends automatic authorization {0}", ["FriendsCupboard"] = "Sharing cupboard with friends is {0}", ["FriendsTurret"] = "Sharing turret with friends is {0}", ["FriendsKeyLock"] = "Sharing key lock with friends is {0}", ["FriendsCodeLock"] = "Sharing code lock with friends is {0}", ["Clans"] = "Clan automatic authorization {0}", ["ClansCupboard"] = "Sharing cupboard with clan is {0}", ["ClansTurret"] = "Sharing turret with clan is {0}", ["ClansKeyLock"] = "Sharing key lock with clan is {0}", ["ClansCodeLock"] = "Sharing code lock with clan is {0}", ["Teams"] = "Team automatic authorization {0}", ["TeamsCupboard"] = "Sharing cupboard with team is {0}", ["TeamsTurret"] = "Sharing turret with team is {0}", ["TeamsKeyLock"] = "Sharing key lock with team is {0}", ["TeamsCodeLock"] = "Sharing code lock with team is {0}", ["FriendsDisabled"] = "Server has disabled friends sharing", ["FriendsCupboardDisabled"] = "Server has disabled sharing cupboard with friends", ["FriendsTurretDisable"] = "Server has disabled sharing turret with friends", ["FriendsKeyLockDisable"] = "Server has disabled sharing key lock with friends", ["FriendsCodeLockDisable"] = "Server has disabled sharing code lock with friends", ["ClansDisabled"] = "Server has disabled clan sharing", ["ClansCupboardDisable"] = "Server has disabled sharing cupboard with clan", ["ClansTurretDisable"] = "Server has disabled sharing turret with clan", ["ClansKeyLockDisable"] = "Server has disabled sharing key lock with clan", ["ClansCodeLockDisable"] = "Server has disabled sharing code lock with clan", ["TeamsDisabled"] = "Server has disabled team sharing", ["TeamsCupboardDisable"] = "Server has disabled sharing cupboard with team", ["TeamsTurretDisable"] = "Server has disabled sharing turret with team", ["TeamsKeyLockDisable"] = "Server has disabled sharing key lock with team", ["TeamsCodeLockDisable"] = "Server has disabled sharing code lock with team", ["UI_Title"] = "Automatic Authorization UI", ["UI_TeamsTitle"] = "Team Share Settings", ["UI_TeamsShare"] = "Team Share", ["UI_TeamsCupboard"] = "Team Cupboard Share", ["UI_TeamsTurret"] = "Team Turret Share", ["UI_TeamsKeyLock"] = "Team Key Lock Share", ["UI_TeamsCodeLock"] = "Team Code Lock Share", ["UI_FriendsTitle"] = "Friends Share Settings", ["UI_FriendsShare"] = "Friends Share", ["UI_FriendsCupboard"] = "Friends Cupboard Share", ["UI_FriendsTurret"] = "Friends Turret Share", ["UI_FriendsKeyLock"] = "Friends Key Lock Share", ["UI_FriendsCodeLock"] = "Friends Code Lock Share", ["UI_ClansTitle"] = "Clan Share Settings", ["UI_ClansShare"] = "Clan Share", ["UI_ClansCupboard"] = "Clan Cupboard Share", ["UI_ClansTurret"] = "Clan Turret Share", ["UI_ClansKeyLock"] = "Clan Key Lock Share", ["UI_ClansCodeLock"] = "Clan Code Lock Share", }, this); lang.RegisterMessages(new Dictionary { ["NotAllowed"] = "您没有权限使用该命令", ["Enabled"] = "已启用", ["Disabled"] = "已禁用", ["UnableAutoAuth"] = "服务器无法使用自动授权", ["SyntaxError"] = "语法错误, 输入 '/{0} ' 查看帮助", ["TurretSuccess"] = "自动添加了 {0} 个朋友/战队成员/队友到您的 {1} 个炮台授权列表中", ["CupboardSuccess"] = "自动添加了 {0} 个朋友/战队成员/队友到您的 {1} 个领地柜授权列表中", ["FriendsSyntax"] = "/{0} - 启用/禁用朋友自动授权", ["FriendsSyntax1"] = "/{0} - 自动与朋友共享领地柜", ["FriendsSyntax2"] = "/{0} - 自动与朋友共享炮台", ["FriendsSyntax3"] = "/{0} - 自动与朋友共享钥匙锁", ["FriendsSyntax4"] = "/{0} - 自动与朋友共享密码锁", ["ClansSyntax"] = "/{0} - 启用/禁用战队自动授权", ["ClansSyntax1"] = "/{0} - 自动与战队共享领地柜", ["ClansSyntax2"] = "/{0} - 自动与战队共享炮台", ["ClansSyntax3"] = "/{0} - 自动与战队共享钥匙锁", ["ClansSyntax4"] = "/{0} - 自动与战队共享密码锁", ["TeamsSyntax"] = "/{0} - 启用/禁用团队自动授权", ["TeamsSyntax1"] = "/{0} - 自动与团队共享领地柜", ["TeamsSyntax2"] = "/{0} - 自动与团队共享炮台", ["TeamsSyntax3"] = "/{0} - 自动与团队共享钥匙锁", ["TeamsSyntax4"] = "/{0} - 自动与团队共享密码锁", ["UISyntax"] = "/{0} - 打开自动共享UI", ["AutoShareFriendsStatus"] = "当前朋友自动授权状态: ", ["AutoShareFriends"] = "自动与朋友共享: {0}", ["AutoShareFriendsCupboard"] = "自动与朋友共享领地柜: {0}", ["AutoShareFriendsTurret"] = "自动与朋友共享炮台: {0}", ["AutoShareFriendsKeyLock"] = "自动与朋友共享钥匙锁: {0}", ["AutoShareFriendsCodeLock"] = "自动与朋友共享密码锁: {0}", ["AutoShareClansStatus"] = "当前战队自动授权状态: ", ["AutoShareClans"] = "自动与战队共享: {0}", ["AutoShareClansCupboard"] = "自动与战队共享领地柜: {0}", ["AutoShareClansTurret"] = "自动与战队共享炮台: {0}", ["AutoShareClansKeyLock"] = "自动与战队共享钥匙锁: {0}", ["AutoShareClansCodeLock"] = "自动与战队共享密码锁: {0}", ["AutoShareTeamsStatus"] = "当前团队自动授权状态: ", ["AutoShareTeams"] = "自动与团队共享: {0}", ["AutoShareTeamsCupboard"] = "自动与团队共享领地柜: {0}", ["AutoShareTeamsTurret"] = "自动与团队共享炮台: {0}", ["AutoShareTeamsKeyLock"] = "自动与团队共享钥匙锁: {0}", ["AutoShareTeamsCodeLock"] = "自动与团队共享密码锁: {0}", ["Friends"] = "朋友自动授权 {0}", ["FriendsCupboard"] = "自动与朋友共享领地柜 {0}", ["FriendsTurret"] = "自动与朋友共享炮台 {0}", ["FriendsKeyLock"] = "自动与朋友共享钥匙锁 {0}", ["FriendsCodeLock"] = "自动与朋友共享密码锁 {0}", ["Clans"] = "战队自动授权 {0}", ["ClansCupboard"] = "自动与战队共享领地柜 {0}", ["ClansTurret"] = "自动与战队共享炮台 {0}", ["ClansKeyLock"] = "自动与战队共享钥匙锁 {0}", ["ClansCodeLock"] = "自动与战队共享密码锁 {0}", ["Teams"] = "团队自动授权 {0}", ["TeamsCupboard"] = "自动与团队共享领地柜 {0}", ["TeamsTurret"] = "自动与团队共享炮台 {0}", ["TeamsKeyLock"] = "自动与团队共享钥匙锁 {0}", ["TeamsCodeLock"] = "自动与团队共享密码锁 {0}", ["FriendsDisabled"] = "服务器已禁用朋友自动授权", ["FriendsCupboardDisabled"] = "服务器已禁用自动与朋友共享领地柜", ["FriendsTurretDisable"] = "服务器已禁用自动与朋友共享炮台", ["FriendsKeyLockDisable"] = "服务器已禁用自动与朋友共享钥匙锁", ["FriendsCodeLockDisable"] = "服务器已禁用自动与朋友共享密码锁", ["ClansDisabled"] = "服务器已禁用战队自动授权", ["ClansCupboardDisable"] = "服务器已禁用自动与战队共享领地柜", ["ClansTurretDisable"] = "服务器已禁用自动与战队共享炮台", ["ClansKeyLockDisable"] = "服务器已禁用自动与战队共享钥匙锁", ["ClansCodeLockDisable"] = "服务器已禁用自动与战队共享密码锁", ["TeamsDisabled"] = "服务器已禁用团队自动授权", ["TeamsCupboardDisable"] = "服务器已禁用自动与团队共享领地柜", ["TeamsTurretDisable"] = "服务器已禁用自动与团队共享炮台", ["TeamsKeyLockDisable"] = "服务器已禁用自动与团队共享钥匙锁", ["TeamsCodeLockDisable"] = "服务器已禁用自动与团队共享密码锁", ["UI_Title"] = "自动共享UI", ["UI_TeamsTitle"] = "团队共享设置", ["UI_TeamsShare"] = "团队共享", ["UI_TeamsCupboard"] = "团队领地柜共享", ["UI_TeamsTurret"] = "团队炮台共享", ["UI_TeamsKeyLock"] = "团队钥匙锁共享", ["UI_TeamsCodeLock"] = "团队密码锁共享", ["UI_FriendsTitle"] = "朋友共享设置", ["UI_FriendsShare"] = "朋友共享", ["UI_FriendsCupboard"] = "朋友领地柜共享", ["UI_FriendsTurret"] = "朋友炮台共享", ["UI_FriendsKeyLock"] = "朋友钥匙锁共享", ["UI_FriendsCodeLock"] = "朋友密码锁共享", ["UI_ClansTitle"] = "战队共享设置", ["UI_ClansShare"] = "战队共享", ["UI_ClansCupboard"] = "战队领地柜共享", ["UI_ClansTurret"] = "战队炮台共享", ["UI_ClansKeyLock"] = "战队钥匙锁共享", ["UI_ClansCodeLock"] = "战队密码锁共享", }, this, "zh-CN"); } #endregion LanguageFile } }