1688 lines
83 KiB
C#
1688 lines
83 KiB
C#
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<ulong, EntityCache> playerEntities = new Dictionary<ulong, EntityCache>();
|
|
|
|
private enum ShareType
|
|
{
|
|
None,
|
|
Teams,
|
|
Friends,
|
|
Clans,
|
|
}
|
|
|
|
private enum AutoAuthType
|
|
{
|
|
All,
|
|
Turret,
|
|
Cupboard,
|
|
}
|
|
|
|
private class EntityCache
|
|
{
|
|
public readonly HashSet<AutoTurret> autoTurrets = new HashSet<AutoTurret>();
|
|
public readonly HashSet<BuildingPrivlidge> buildingPrivlidges = new HashSet<BuildingPrivlidge>();
|
|
}
|
|
|
|
#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 }, 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 }, 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<AutoTurret> 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<BuildingPrivlidge> 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<PlayerNameID> 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<ulong> GetAuthList(ulong playerID, AutoAuthType autoAuthType)
|
|
{
|
|
var shareData = GetShareData(playerID, true);
|
|
var sharePlayers = new HashSet<ulong> { 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<ShareType> 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<ulong>(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<ulong>(playerTeam.members) { target };
|
|
UpdateTeamAuthList(teamMembers);
|
|
}
|
|
});
|
|
}
|
|
|
|
private void OnTeamDisbanded(RelationshipManager.PlayerTeam playerTeam)
|
|
{
|
|
if (playerTeam == null) return;
|
|
UpdateTeamAuthList(playerTeam.members);
|
|
}
|
|
|
|
#endregion Hooks
|
|
|
|
private void UpdateTeamAuthList(List<ulong> teamMembers)
|
|
{
|
|
if (teamMembers.Count <= 0) return;
|
|
foreach (var member in teamMembers)
|
|
{
|
|
UpdateAuthList(member, AutoAuthType.All);
|
|
}
|
|
}
|
|
|
|
private static IEnumerable<ulong> 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<ulong> 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<string> 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<ulong> GetClanMembers(ulong playerID)
|
|
{
|
|
if (Clans == null) return null;
|
|
//Clans Reborn
|
|
var members = Clans.Call("GetClanMembers", playerID);
|
|
if (members != null) return (members as List<string>)?.Select(ulong.Parse);
|
|
//Clans
|
|
var clanName = Clans.Call("GetClanOf", playerID) as string;
|
|
return clanName != null ? GetClanMembers(clanName) : null;
|
|
}
|
|
|
|
private IEnumerable<ulong> 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 = "<color=#00FFFF>[AutoAuth]</color>: ";
|
|
|
|
[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<ConfigData>();
|
|
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 = "<color=#00FFFF>[AutoAuth]</color>: ";
|
|
}
|
|
}
|
|
configData.version = Version;
|
|
}
|
|
}
|
|
|
|
#endregion ConfigurationFile
|
|
|
|
#region DataFile
|
|
|
|
private StoredData storedData;
|
|
|
|
private class StoredData
|
|
{
|
|
public readonly Dictionary<ulong, ShareData> playerShareData = new Dictionary<ulong, ShareData>();
|
|
|
|
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<StoredData>(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<string, string>
|
|
{
|
|
["NotAllowed"] = "You do not have permission to use this command",
|
|
["Enabled"] = "<color=#8ee700>Enabled</color>",
|
|
["Disabled"] = "<color=#ce422b>Disabled</color>",
|
|
["UnableAutoAuth"] = "Unable to automatically authorize other players",
|
|
["SyntaxError"] = "Syntax error, please type '<color=#ce422b>/{0} <help | h></color>' to view help",
|
|
["TurretSuccess"] = "Successfully added <color=#ce422b>{0}</color> friends/clan members/team members to <color=#ce422b>{1}</color> turrets auth list",
|
|
["CupboardSuccess"] = "Successfully added <color=#ce422b>{0}</color> friends/clan members/team members to <color=#ce422b>{1}</color> cupboards auth list",
|
|
|
|
["FriendsSyntax"] = "<color=#ce422b>/{0} <autofriends | af></color> - Enable/Disable automatic authorization for your friends",
|
|
["FriendsSyntax1"] = "<color=#ce422b>/{0} <autofriends | af> <cupboard | c></color> - Sharing cupboard with your friends",
|
|
["FriendsSyntax2"] = "<color=#ce422b>/{0} <autofriends | af> <turret | t></color> - Sharing turret with your friends",
|
|
["FriendsSyntax3"] = "<color=#ce422b>/{0} <autofriends | af> <keylock | kl></color> - Sharing key lock with your friends",
|
|
["FriendsSyntax4"] = "<color=#ce422b>/{0} <autofriends | af> <codelock | cl></color> - Sharing code lock with your friends",
|
|
|
|
["ClansSyntax"] = "<color=#ce422b>/{0} <autoclan | ac></color> - Enable/Disable automatic authorization for your clan members",
|
|
["ClansSyntax1"] = "<color=#ce422b>/{0} <autoclan | ac> <cupboard | c></color> - Sharing cupboard with your clan members",
|
|
["ClansSyntax2"] = "<color=#ce422b>/{0} <autoclan | ac> <turret | t></color> - Sharing turret with your clan members",
|
|
["ClansSyntax3"] = "<color=#ce422b>/{0} <autoclan | ac> <keylock | kl></color> - Sharing key lock with your clan members",
|
|
["ClansSyntax4"] = "<color=#ce422b>/{0} <autoclan | ac> <codelock | cl></color> - Sharing code lock with your clan members",
|
|
|
|
["TeamsSyntax"] = "<color=#ce422b>/{0} <autoteam | at></color> - Enable/Disable automatic authorization for your team members",
|
|
["TeamsSyntax1"] = "<color=#ce422b>/{0} <autoteam | at> <cupboard | c></color> - Sharing cupboard with your team members",
|
|
["TeamsSyntax2"] = "<color=#ce422b>/{0} <autoteam | at> <turret | t></color> - Sharing turret with your team members",
|
|
["TeamsSyntax3"] = "<color=#ce422b>/{0} <autoteam | at> <keylock | kl></color> - Sharing key lock with your team members",
|
|
["TeamsSyntax4"] = "<color=#ce422b>/{0} <autoteam | at> <codelock | cl></color> - Sharing code lock with your team members",
|
|
|
|
["UISyntax"] = "<color=#ce422b>/{0}</color> - Open Automatic Authorization UI",
|
|
|
|
["AutoShareFriendsStatus"] = "<color=#ffa500>Current friends sharing status: </color>",
|
|
["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"] = "<color=#ffa500>Current clan sharing status: </color>",
|
|
["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"] = "<color=#ffa500>Current Team sharing status: </color>",
|
|
["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<string, string>
|
|
{
|
|
["NotAllowed"] = "您没有权限使用该命令",
|
|
["Enabled"] = "<color=#8ee700>已启用</color>",
|
|
["Disabled"] = "<color=#ce422b>已禁用</color>",
|
|
["UnableAutoAuth"] = "服务器无法使用自动授权",
|
|
["SyntaxError"] = "语法错误, 输入 '<color=#ce422b>/{0} <help | h></color>' 查看帮助",
|
|
["TurretSuccess"] = "自动添加了 <color=#ce422b>{0}</color> 个朋友/战队成员/队友到您的 <color=#ce422b>{1}</color> 个炮台授权列表中",
|
|
["CupboardSuccess"] = "自动添加了 <color=#ce422b>{0}</color> 个朋友/战队成员/队友到您的 <color=#ce422b>{1}</color> 个领地柜授权列表中",
|
|
|
|
["FriendsSyntax"] = "<color=#ce422b>/{0} <autofriends | af></color> - 启用/禁用朋友自动授权",
|
|
["FriendsSyntax1"] = "<color=#ce422b>/{0} <autofriends | af> <cupboard | c></color> - 自动与朋友共享领地柜",
|
|
["FriendsSyntax2"] = "<color=#ce422b>/{0} <autofriends | af> <turret | t></color> - 自动与朋友共享炮台",
|
|
["FriendsSyntax3"] = "<color=#ce422b>/{0} <autofriends | af> <keylock | kl></color> - 自动与朋友共享钥匙锁",
|
|
["FriendsSyntax4"] = "<color=#ce422b>/{0} <autofriends | af> <codelock | cl></color> - 自动与朋友共享密码锁",
|
|
|
|
["ClansSyntax"] = "<color=#ce422b>/{0} <autoclan | ac></color> - 启用/禁用战队自动授权",
|
|
["ClansSyntax1"] = "<color=#ce422b>/{0} <autoclan | ac> <cupboard | c></color> - 自动与战队共享领地柜",
|
|
["ClansSyntax2"] = "<color=#ce422b>/{0} <autoclan | ac> <turret | t></color> - 自动与战队共享炮台",
|
|
["ClansSyntax3"] = "<color=#ce422b>/{0} <autoclan | ac> <keylock | kl></color> - 自动与战队共享钥匙锁",
|
|
["ClansSyntax4"] = "<color=#ce422b>/{0} <autoclan | ac> <codelock | cl></color> - 自动与战队共享密码锁",
|
|
|
|
["TeamsSyntax"] = "<color=#ce422b>/{0} <autoclan | ac></color> - 启用/禁用团队自动授权",
|
|
["TeamsSyntax1"] = "<color=#ce422b>/{0} <autoclan | ac> <cupboard | c></color> - 自动与团队共享领地柜",
|
|
["TeamsSyntax2"] = "<color=#ce422b>/{0} <autoclan | ac> <turret | t></color> - 自动与团队共享炮台",
|
|
["TeamsSyntax3"] = "<color=#ce422b>/{0} <autoclan | ac> <keylock | kl></color> - 自动与团队共享钥匙锁",
|
|
["TeamsSyntax4"] = "<color=#ce422b>/{0} <autoclan | ac> <codelock | cl></color> - 自动与团队共享密码锁",
|
|
|
|
["UISyntax"] = "<color=#ce422b>/{0}</color> - 打开自动共享UI",
|
|
|
|
["AutoShareFriendsStatus"] = "<color=#ffa500>当前朋友自动授权状态: </color>",
|
|
["AutoShareFriends"] = "自动与朋友共享: {0}",
|
|
["AutoShareFriendsCupboard"] = "自动与朋友共享领地柜: {0}",
|
|
["AutoShareFriendsTurret"] = "自动与朋友共享炮台: {0}",
|
|
["AutoShareFriendsKeyLock"] = "自动与朋友共享钥匙锁: {0}",
|
|
["AutoShareFriendsCodeLock"] = "自动与朋友共享密码锁: {0}",
|
|
|
|
["AutoShareClansStatus"] = "<color=#ffa500>当前战队自动授权状态: </color>",
|
|
["AutoShareClans"] = "自动与战队共享: {0}",
|
|
["AutoShareClansCupboard"] = "自动与战队共享领地柜: {0}",
|
|
["AutoShareClansTurret"] = "自动与战队共享炮台: {0}",
|
|
["AutoShareClansKeyLock"] = "自动与战队共享钥匙锁: {0}",
|
|
["AutoShareClansCodeLock"] = "自动与战队共享密码锁: {0}",
|
|
|
|
["AutoShareTeamsStatus"] = "<color=#ffa500>当前团队自动授权状态: </color>",
|
|
["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
|
|
}
|
|
} |