C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Facepunch;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust;
using Oxide.Game.Rust.Cui;
using ProtoBuf;
using UnityEngine;
///Скачано с дискорд сервера Rust Edit [PRO+]
///discord.gg/9vyTXsJyKR
namespace Oxide.Plugins {
[Info("Automatic Authorization", "discord.gg/9vyTXsJyKR", "1.3.0", ResourceId = 2063)]
public class AutomaticAuthorization : RustPlugin {
#region Fields
[PluginReference]
private readonly Plugin Clans, Friends;
private const string PERMISSION_USE = "automaticauthorization.use";
private static object True = true;
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.teamsShareS.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.clansShareS.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();
True = null;
}
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.teamsShare.enabled && SameTeam(ownerID, player.userID)) {
if (baseLock is KeyLock && CanUnlockEntity(parentEntity, shareData.teamsShare.keyLock)) {
return True;
}
var codeLock = baseLock as CodeLock;
if (codeLock != null && CanUnlockEntity(parentEntity, shareData.teamsShare.codeLock)) {
SendUnlockedEffect(codeLock);
return True;
}
}
if (shareData.friendsShare.enabled && HasFriend(ownerID, player.userID)) {
if (baseLock is KeyLock && CanUnlockEntity(parentEntity, shareData.friendsShare.keyLock)) {
return True;
}
var codeLock = baseLock as CodeLock;
if (codeLock != null && CanUnlockEntity(parentEntity, shareData.friendsShare.codeLock)) {
SendUnlockedEffect(codeLock);
return True;
}
}
if (shareData.clansShare.enabled && SameClan(ownerID, player.userID)) {
if (baseLock is KeyLock && CanUnlockEntity(parentEntity, shareData.clansShare.keyLock)) {
return True;
}
var codeLock = baseLock as CodeLock;
if (codeLock != null && CanUnlockEntity(parentEntity, shareData.clansShare.codeLock)) {
SendUnlockedEffect(codeLock);
return True;
}
}
return null;
}
#endregion Oxide Hooks
#region Helpers
private static bool CanUnlockEntity(BaseEntity parentEntity, StoredData.LockShareEntry lockShareEntry) {
if (!lockShareEntry.enabled) return false;
return parentEntity is Door ? lockShareEntry.door : parentEntity is BoxStorage ? lockShareEntry.box : lockShareEntry.other;
}
private static void SendUnlockedEffect(CodeLock codeLock) {
if (codeLock.effectUnlocked.isValid) {
Effect.server.Run(codeLock.effectUnlocked.resourcePath, codeLock.transform.position);
}
}
private static void CheckShareData(StoredData.ShareEntry shareEntry, ConfigData.ShareSettings shareSettings) {
if (!shareSettings.enabled) shareEntry.enabled = false;
if (!shareSettings.shareCupboard) shareEntry.cupboard = false;
if (!shareSettings.shareTurret) shareEntry.turret = false;
if (!shareSettings.keyLockS.enabled) shareEntry.keyLock.enabled = false;
if (!shareSettings.keyLockS.shareDoor) shareEntry.keyLock.door = false;
if (!shareSettings.keyLockS.shareBox) shareEntry.keyLock.box = false;
if (!shareSettings.keyLockS.shareOtherEntity) shareEntry.keyLock.other = false;
if (!shareSettings.codeLockS.enabled) shareEntry.codeLock.enabled = false;
if (!shareSettings.codeLockS.shareDoor) shareEntry.codeLock.door = false;
if (!shareSettings.codeLockS.shareBox) shareEntry.codeLock.box = false;
if (!shareSettings.codeLockS.shareOtherEntity) shareEntry.codeLock.other = false;
}
#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();
}
if (justCreated && configData.chatS.sendMessage && authList.Count > 1) {
var player = BasePlayer.FindByID(playerID);
if (player != null) {
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();
}
if (justCreated && configData.chatS.sendMessage && authList.Count > 1) {
var player = BasePlayer.FindByID(playerID);
if (player != null) {
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(userid => new PlayerNameID {
userid = userid, username = RustCore.FindPlayerById(userid)?.displayName ?? string.Empty
}
).ToList();
}
private HashSet<ulong> GetAuthList(ulong playerID, AutoAuthType autoAuthType) {
var sharePlayers = new HashSet<ulong> {
playerID
}
;
var shareData = GetShareData(playerID, true);
if (shareData.teamsShare.enabled && (autoAuthType == AutoAuthType.Turret ? shareData.teamsShare.turret : shareData.teamsShare.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.clansShare.enabled && (autoAuthType == AutoAuthType.Turret ? shareData.clansShare.turret : shareData.clansShare.cupboard)) {
var clanMembers = GetClanMembers(playerID);
if (clanMembers != null) {
foreach (var member in clanMembers) {
sharePlayers.Add(member);
}
}
}
return sharePlayers;
}
private IEnumerable<ShareType> GetAvailableTypes() {
if (IsShareTypeEnabled(ShareType.Teams)) yield return ShareType.Teams;
if (IsShareTypeEnabled(ShareType.Friends)) yield return ShareType.Friends;
if (IsShareTypeEnabled(ShareType.Clans)) yield return ShareType.Clans;
}
private bool IsShareTypeEnabled(ShareType shareType) {
var shareSettings = configData.GetShareSettings(shareType);
if (!shareSettings.enabled) return false;
switch (shareType) {
case ShareType.Teams : return RelationshipManager.TeamsEnabled();
case ShareType.Friends : return Friends != null;
case ShareType.Clans : return Clans != null;
}
return false;
}
#region Data
private StoredData.ShareData defaultData;
private StoredData.ShareData DefaultData => defaultData ?? (defaultData = CreateDefaultData());
private StoredData.ShareData GetShareData(ulong playerID, bool readOnly = false) {
StoredData.ShareData shareData;
if (!storedData.playerShareData.TryGetValue(playerID, out shareData)) {
if (readOnly) {
return DefaultData;
}
shareData = CreateDefaultData();
storedData.playerShareData.Add(playerID, shareData);
}
return shareData;
}
private StoredData.ShareData CreateDefaultData() {
return new StoredData.ShareData {
teamsShare = CreateShareEntry(ShareType.Teams), friendsShare = CreateShareEntry(ShareType.Friends), clansShare = CreateShareEntry(ShareType.Clans),
}
;
}
private void UpdateData() {
foreach (var shareData in storedData.playerShareData.Values) {
CheckShareData(shareData, ShareType.Teams);
CheckShareData(shareData, ShareType.Friends);
CheckShareData(shareData, ShareType.Clans);
}
SaveData();
}
private StoredData.ShareEntry CreateShareEntry(ShareType shareType) {
var defaultSettings = configData.GetDefaultShareSettings(shareType);
var shareEntry = new StoredData.ShareEntry {
enabled = defaultSettings.enabled, turret = defaultSettings.shareTurret, cupboard = defaultSettings.shareCupboard, keyLock = new StoredData.LockShareEntry {
enabled = defaultSettings.keyLockS.enabled, door = defaultSettings.keyLockS.shareDoor, box = defaultSettings.keyLockS.shareBox, other = defaultSettings.keyLockS.shareOtherEntity,
}
, codeLock = new StoredData.LockShareEntry {
enabled = defaultSettings.codeLockS.enabled, door = defaultSettings.codeLockS.shareDoor, box = defaultSettings.codeLockS.shareBox, other = defaultSettings.codeLockS.shareOtherEntity,
}
}
;
CheckShareData(shareEntry, configData.GetShareSettings(shareType));
return shareEntry;
}
private void CheckShareData(StoredData.ShareData shareData, ShareType shareType) {
var shareSettings = configData.GetShareSettings(shareType);
var shareEntry = shareData.GetShareEntry(shareType);
CheckShareData(shareEntry, shareSettings);
}
#endregion Data
#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.ServerInstance.FindPlayersTeam(playerID);
return playerTeam?.members;
}
private static bool SameTeam(ulong playerID, ulong friendID) {
if (!RelationshipManager.TeamsEnabled()) return false;
var playerTeam = RelationshipManager.ServerInstance.FindPlayersTeam(playerID);
if (playerTeam == null) return false;
var friendTeam = RelationshipManager.ServerInstance.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(Convert.ToUInt64(playerID), AutoAuthType.All);
UpdateAuthList(Convert.ToUInt64(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(Convert.ToUInt64(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) as List<string>;
if (members != null) return members.Select(x => Convert.ToUInt64(x));
//Clans
var clanName = Clans.Call("GetClanOf", playerID) as string;
return clanName != null ? GetClanMembers(clanName) : null;
}
private IEnumerable<ulong> GetClanMembers(string clanName) {
if (Clans == null) return null;
var clan = Clans.Call("GetClan", clanName) as JObject;
var members = clan?.GetValue("members") as JArray;
return members?.Select(Convert.ToUInt64);
}
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 = "-390 -200", OffsetMax = "390 260"
}
, CursorEnabled = true
}
, "Hud", UINAME_MAIN);
var titlePanel = container.Add(new CuiPanel {
Image = {
Color = "0.31 0.88 0.71 1"
}
, RectTransform = {
AnchorMin = "0 0.912", AnchorMax = "0.998 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.915 0", AnchorMax = "1 0.99"
}
}
, titlePanel);
container.Add(new CuiPanel {
Image = {
Color = "0.1 0.1 0.1 0.4"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 0.908"
}
,
}
, 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 shareType = 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 (shareType == ShareType.None || shareType == ShareType.Teams) {
var anchors = GetMenuSubAnchors(i, total);
CuiHelper.DestroyUi(player, UINAME_MENU + ShareType.Teams);
CreateMenuSubUI(ref container, shareData, player.UserIDString, ShareType.Teams, $"{anchors[0]} 0.03", $"{anchors[1]} 0.97");
}
i++;
}
#endregion Teams UI
#region Friends UI
if (availableTypes.Contains(ShareType.Friends)) {
if (shareType == ShareType.None || shareType == ShareType.Friends) {
var anchors = GetMenuSubAnchors(i, total);
CuiHelper.DestroyUi(player, UINAME_MENU + ShareType.Friends);
CreateMenuSubUI(ref container, shareData, player.UserIDString, ShareType.Friends, $"{anchors[0]} 0.03", $"{anchors[1]} 0.97");
}
i++;
}
#endregion Friends UI
#region Clans UI
if (availableTypes.Contains(ShareType.Clans)) {
if (shareType == ShareType.None || shareType == ShareType.Clans) {
var anchors = GetMenuSubAnchors(i, total);
CuiHelper.DestroyUi(player, UINAME_MENU + ShareType.Clans);
CreateMenuSubUI(ref container, shareData, player.UserIDString, ShareType.Clans, $"{anchors[0]} 0.03", $"{anchors[1]} 0.97");
}
}
#endregion Clans UI
CuiHelper.AddUi(player, container);
}
private void CreateMenuSubUI(ref CuiElementContainer container, StoredData.ShareData shareData, string playerID, ShareType shareType, string anchorMin, string anchorMax) {
var panelName = container.Add(new CuiPanel {
Image = {
Color = "0.1 0.1 0.1 0.5"
}
, RectTransform = {
AnchorMin = anchorMin, AnchorMax = anchorMax
}
,
}
, UINAME_MENU, UINAME_MENU + shareType);
var titlePanel = container.Add(new CuiPanel {
Image = {
Color = "0.1 0.1 0.1 0.5"
}
, RectTransform = {
AnchorMin = "0 0.9", AnchorMax = "1 1"
}
,
}
, panelName);
container.Add(new CuiLabel {
Text = {
Color = "1 0.5 0 1", FontSize = 18, Align = TextAnchor.MiddleCenter, Text = Lang("UI_SubTitle", playerID, Lang("UI_" + shareType, playerID))
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 1"
}
}
, titlePanel);
var contentPanel = container.Add(new CuiPanel {
Image = {
Color = "0.1 0.1 0.1 0.55"
}
, RectTransform = {
AnchorMin = "0 0", AnchorMax = "1 0.895"
}
,
}
, panelName);
int i = 0;
const float entrySize = 0.08f;
const float spacingY = 0.012f;
var shareEntry = shareData.GetShareEntry(shareType);
var commandPrefix = $"AutoAuthUI {shareType} ";
var enabledMsg = Lang("Enabled", playerID);
var disabledMsg = Lang("Disabled", playerID);
var anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix, Lang("UI_SubShare", playerID, Lang("UI_" + shareType, playerID)), shareEntry.enabled ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "Cupboard", Lang("UI_SubCupboard", playerID), shareEntry.cupboard ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "Turret", Lang("UI_SubTurret", playerID), shareEntry.turret ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "KeyLock", Lang("UI_SubKeyLock", playerID), shareEntry.keyLock.enabled ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "KeyLock Door", Lang("UI_SubKeyLockDoor", playerID), shareEntry.keyLock.door ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "KeyLock Box", Lang("UI_SubKeyLockBox", playerID), shareEntry.keyLock.box ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "KeyLock Other", Lang("UI_SubKeyLockOther", playerID), shareEntry.keyLock.other ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "CodeLock", Lang("UI_SubCodeLock", playerID), shareEntry.codeLock.enabled ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "CodeLock Door", Lang("UI_SubCodeLockDoor", playerID), shareEntry.codeLock.door ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "CodeLock Box", Lang("UI_SubCodeLockBox", playerID), shareEntry.codeLock.box ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
anchors = GetEntryAnchors(i++, entrySize, spacingY);
CreateEntrySubUI(ref container, contentPanel, commandPrefix + "CodeLock Other", Lang("UI_SubCodeLockOther", playerID), shareEntry.codeLock.other ? enabledMsg : disabledMsg, $"0 {anchors[0]}", $"0.995 {anchors[1]}");
}
private static void CreateEntrySubUI(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 = 12, Align = TextAnchor.MiddleLeft, Text = leftText
}
, RectTransform = {
AnchorMin = "0.04 0", AnchorMax = "0.68 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 = 12
}
, RectTransform = {
AnchorMin = "0.7 0.2", AnchorMax = "0.985 0.8"
}
,
}
, panelName);
}
private static float[] GetEntryAnchors(int i, float entrySize, float spacingY) {
return new[] {
1f - (i + 1) * entrySize - i * spacingY, 1f - i * (entrySize + spacingY)
}
;
}
private static float[] GetMenuSubAnchors(int i, int total) {
switch (total) {
case 1 : return new[] {
0.32f, 0.68f
}
;
case 2 : return i == 0 ? new[] {
0.15f, 0.48f
}
: new[] {
0.52f, 0.85f
}
;
case 3 : switch (i) {
case 0 : return new[] {
0.01f, 0.33f
}
;
case 1 : return new[] {
0.34f, 0.66f
}
;
default : return new[] {
0.67f, 0.99f
}
;
}
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);
if (args == null || args.Length == 0) {
var availableTypes = GetAvailableTypes();
if (!availableTypes.Any()) {
Print(player, Lang("UnableAutoAuth", player.UserIDString));
return;
}
var stringBuilder = Pool.Get<StringBuilder>();
stringBuilder.AppendLine();
HandleStatusCommand(stringBuilder, player, shareData, availableTypes);
Print(player, stringBuilder.ToString());
stringBuilder.Clear();
Pool.Free(ref stringBuilder);
return;
}
switch (args[0].ToLower()) {
case "ui" : CreateMainUI(player);
return;
case "t" : case "at" : case "team" : case "autoteam" : HandleShareCommand(player, shareData, ShareType.Teams, args);
return;
case "f" : case "af" : case "friend" : case "autofriend" : HandleShareCommand(player, shareData, ShareType.Friends, args);
return;
case "c" : case "ac" : case "clan" : case "autoclan" : HandleShareCommand(player, shareData, ShareType.Clans, args);
return;
case "h" : case "help" : var availableTypes = GetAvailableTypes();
if (!availableTypes.Any()) {
Print(player, Lang("UnableAutoAuth", player.UserIDString));
return;
}
var stringBuilder = Pool.Get<StringBuilder>();
stringBuilder.AppendLine();
HandleHelpCommand(stringBuilder, player, availableTypes);
stringBuilder.AppendLine(Lang("UISyntax", player.UserIDString, configData.chatS.uiCommand, configData.chatS.chatCommand));
Print(player, stringBuilder.ToString());
stringBuilder.Clear();
Pool.Free(ref stringBuilder);
return;
default : Print(player, Lang("SyntaxError", player.UserIDString, configData.chatS.chatCommand));
return;
}
}
private void HandleStatusCommand(StringBuilder stringBuilder, BasePlayer player, StoredData.ShareData shareData, IEnumerable<ShareType> availableTypes) {
var enabledMsg = Lang("Enabled", player.UserIDString);
var disabledMsg = Lang("Disabled", player.UserIDString);
foreach (var shareType in availableTypes) {
var shareEntry = shareData.GetShareEntry(shareType);
var shareTypeName = Lang(shareType.ToString(), player.UserIDString);
stringBuilder.AppendLine(Lang("ShareStatus", player.UserIDString, shareTypeName));
stringBuilder.AppendLine(Lang("Share", player.UserIDString, shareTypeName, shareEntry.enabled ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareCupboard", player.UserIDString, shareTypeName, shareEntry.cupboard ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareTurret", player.UserIDString, shareTypeName, shareEntry.turret ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareKeyLock", player.UserIDString, shareTypeName, shareEntry.keyLock.enabled ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareKeyLockDoor", player.UserIDString, shareTypeName, shareEntry.keyLock.door ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareKeyLockBox", player.UserIDString, shareTypeName, shareEntry.keyLock.box ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareKeyLockOther", player.UserIDString, shareTypeName, shareEntry.keyLock.other ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareCodeLock", player.UserIDString, shareTypeName, shareEntry.codeLock.enabled ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareCodeLockDoor", player.UserIDString, shareTypeName, shareEntry.codeLock.door ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareCodeLockBox", player.UserIDString, shareTypeName, shareEntry.codeLock.box ? enabledMsg : disabledMsg));
stringBuilder.AppendLine(Lang("ShareCodeLockOther", player.UserIDString, shareTypeName, shareEntry.codeLock.other ? enabledMsg : disabledMsg));
}
}
private void HandleHelpCommand(StringBuilder stringBuilder, BasePlayer player, IEnumerable<ShareType> availableTypes) {
foreach (var shareType in availableTypes) {
HandleHelpCommand(stringBuilder, player, shareType);
}
}
private void HandleHelpCommand(StringBuilder stringBuilder, BasePlayer player, ShareType shareType) {
var syntaxName = Lang(shareType + "CmdSyntax", player.UserIDString);
var membersName = Lang(shareType + "Members", player.UserIDString);
stringBuilder.AppendLine(Lang("Syntax", player.UserIDString, configData.chatS.chatCommand, syntaxName, membersName));
stringBuilder.AppendLine(Lang("Syntax1", player.UserIDString, configData.chatS.chatCommand, syntaxName, membersName));
stringBuilder.AppendLine(Lang("Syntax2", player.UserIDString, configData.chatS.chatCommand, syntaxName, membersName));
stringBuilder.AppendLine(Lang("Syntax3", player.UserIDString, configData.chatS.chatCommand, syntaxName, membersName));
stringBuilder.AppendLine(Lang("Syntax4", player.UserIDString, configData.chatS.chatCommand, syntaxName, membersName));
}
private bool HandleShareCommand(BasePlayer player, StoredData.ShareData shareData, ShareType shareType, string[] args, bool sendMsg = true) {
if (!IsShareTypeEnabled(shareType)) {
if (sendMsg) Print(player, Lang("AllDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
var shareEntry = shareData.GetShareEntry(shareType);
if (args.Length <= 1) {
shareEntry.enabled = !shareEntry.enabled;
if (sendMsg) Print(player, Lang("All", player.UserIDString, Lang(shareType.ToString(), player.UserIDString), shareEntry.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString)));
UpdateAuthList(player.userID, AutoAuthType.All);
return true;
}
var shareSettings = configData.GetShareSettings(shareType);
switch (args[1].ToLower()) {
case "c" : case "cupboard" : if (!shareSettings.shareCupboard) {
if (sendMsg) Print(player, Lang("CupboardDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
shareEntry.cupboard = !shareEntry.cupboard;
if (sendMsg) Print(player, Lang("Cupboard", player.UserIDString, Lang(shareType.ToString(), player.UserIDString), shareEntry.cupboard ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString)));
UpdateAuthList(player.userID, AutoAuthType.Cupboard);
return true;
case "t" : case "turret" : if (!shareSettings.shareTurret) {
if (sendMsg) Print(player, Lang("TurretDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
shareEntry.turret = !shareEntry.turret;
if (sendMsg) Print(player, Lang("Turret", player.UserIDString, Lang(shareType.ToString(), player.UserIDString), shareEntry.turret ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString)));
UpdateAuthList(player.userID, AutoAuthType.Turret);
return true;
case "kl" : case "keylock" : if (!shareSettings.keyLockS.enabled) {
if (sendMsg) Print(player, Lang("KeyLockDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
if (args.Length <= 2) {
shareEntry.keyLock.enabled = !shareEntry.keyLock.enabled;
if (sendMsg) Print(player, Lang("KeyLock", player.UserIDString, Lang(shareType.ToString(), player.UserIDString), shareEntry.keyLock.enabled ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString)));
return true;
}
switch (args[2].ToLower()) {
case "d" : case "door" : if (!shareSettings.keyLockS.shareDoor) {
if (sendMsg) Print(player, Lang("KeyLockDoorDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
shareEntry.keyLock.door = !shareEntry.keyLock.door;
if (sendMsg) Print(player, Lang("KeyLockDoor", player.UserIDString, Lang(shareType.ToString(), player.UserIDString), shareEntry.keyLock.door ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString)));
return true;
case "b" : case "box" : if (!shareSettings.keyLockS.shareBox) {
if (sendMsg) Print(player, Lang("KeyLockBoxDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
shareEntry.keyLock.box = !shareEntry.keyLock.box;
if (sendMsg) Print(player, Lang("KeyLockBox", player.UserIDString, Lang(shareType.ToString(), player.UserIDString), shareEntry.keyLock.box ? Lang("Enabled", player.UserIDString) : Lang("Disabled", player.UserIDString)));
return true;
case "o" : case "other" : if (!shareSettings.keyLockS.shareOtherEntity) {
if (sendMsg) Print(player, Lang("KeyLockOtherDisabled", player.UserIDString, Lang(shareType.ToString(), player.UserIDString)));
return false;
}
shareEntry.keyLock.other = !shareEntry.keyLock.other;
// ... [Code preview truncated due to length. Full source in attached file] ...