using System.Collections.Generic; using Oxide.Core.Configuration; using UnityEngine; using Oxide.Core; using System; using System.Linq; namespace Oxide.Plugins { [Info("AdminHammer", "mvrb", "1.13.0")] class AdminHammer : RustPlugin { public static AdminHammer plugin; private const string permAllow = "adminhammer.allow"; private bool logToConsole = true; private bool logAdminInfo = true; private bool showBoxContents = true; private bool showCode = true; private float toolDistance = 200f; private string toolUsed = "hammer"; private string commandToRun = "box"; private string chatCommand = "b"; private bool showSphere = false; private bool performanceMode = false; private int layerMask = LayerMask.GetMask("Construction", "Deployed", "Default"); private readonly DynamicConfigFile dataFile = Interface.Oxide.DataFileSystem.GetFile("AdminHammer"); private List Users = new List(); protected override void LoadDefaultConfig() { Config["LogToConsole"] = logToConsole = GetConfig("LogToFile", true); Config["LogAdminInfo"] = logAdminInfo = GetConfig("LogAdminInfo", true); Config["ShowBoxContents"] = showBoxContents = GetConfig("ShowBoxContents", true); Config["ShowCode"] = showCode = GetConfig("ShowCode", true); Config["ShowSphere"] = showSphere = GetConfig("ShowSphere", false); Config["ToolDistance"] = toolDistance = GetConfig("ToolDistance", 200f); Config["ToolUsed"] = toolUsed = GetConfig("ToolUsed", "hammer"); Config["CommandToRun (Leave blank for no command)"] = commandToRun = GetConfig("CommandToRun (Leave blank for no command)", "box"); Config["ChatCommand"] = chatCommand = GetConfig("ChatCommand", "b"); Config["PerformanceMode"] = performanceMode = GetConfig("PerformanceMode", false); SaveConfig(); } private void LoadDefaultMessages() { lang.RegisterMessages(new Dictionary { ["NoAuthorizedPlayers"] = "No authorized players.", ["AuthorizedPlayers"] = "Authorized players in the {0} owned by {1}:", ["NoEntityFound"] = "No entity found. Look at an entity and right-click while holding a {0}.", ["NoOwner"] = "No owner found for this entity.", ["ChatEntityOwnedBy"] = "This {0} is owned by {1}", ["DoorCode"] = "Door Code: {0}", ["ConsoleEntityOwnedBy"] = "This {0} is owned by www.steamcommunity.com/profiles/{1}", ["ToolActivated"] = "You have enabled AdminHammer.", ["ToolDeactivated"] = "You have disabled AdminHammer.", ["AdminUsedTool"] = "{0} [{1}] used AdminHammer on a {2} owned by {3} [{4}] located at {5}", ["PerformanceMode"] = "Performance mode is enabled, so you have to use the chat command /{0} instead of right-clicking" }, this); } private void Init() { plugin = this; Users = dataFile.ReadObject>(); LoadDefaultConfig(); permission.RegisterPermission(permAllow, this); cmd.AddChatCommand("ah", this, "CmdAdminHammer"); cmd.AddChatCommand("adminhammer", this, "CmdAdminHammer"); cmd.AddChatCommand(chatCommand, this, "CmdCheckEntity"); } private void OnServerInitialized() { if (performanceMode) return; bool fileChanged = false; foreach (var player in BasePlayer.activePlayerList) { if (Users.Contains(player.userID)) { if (!permission.UserHasPermission(player.UserIDString, permAllow)) { Users.Remove(player.userID); fileChanged = true; continue; } if (player.gameObject.GetComponent() == null) { player.gameObject.AddComponent(); } } } if (fileChanged) { dataFile.WriteObject(Users); } } private void Unload() { foreach (var ah in UnityEngine.Object.FindObjectsOfType().ToList()) { GameObject.Destroy(ah); } } private void OnPlayerConnected(BasePlayer player) { if (!Users.Contains(player.userID)) return; if (!permission.UserHasPermission(player.UserIDString, permAllow)) { Users.Remove(player.userID); dataFile.WriteObject(Users); return; } if (performanceMode) return; if (player.gameObject.GetComponent() == null) { player.gameObject.AddComponent(); } } private void OnPlayerDisconnected(BasePlayer player, string reason) { player.gameObject.GetComponent()?.Destroy(); } private void CmdAdminHammer(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, permAllow)) return; if (performanceMode) { player.ChatMessage(Lang("PerformanceMode", player.UserIDString, chatCommand)); return; } if (Users.Contains(player.userID)) { Users.Remove(player.userID); if (player.gameObject.GetComponent() != null) player.gameObject.GetComponent().Destroy(); player.ChatMessage(Lang("ToolDeactivated", player.UserIDString)); Interface.Oxide.CallHook("OnAdminHammerDisabled", player); } else { Users.Add(player.userID); if (player.gameObject.GetComponent() == null) player.gameObject.AddComponent(); player.ChatMessage(Lang("ToolActivated", player.UserIDString)); Interface.Oxide.CallHook("OnAdminHammerEnabled", player); } dataFile.WriteObject(Users); } private void CmdCheckEntity(BasePlayer player) { if (!permission.UserHasPermission(player.UserIDString, permAllow)) return; CheckEntity(player); } private void CheckEntity(BasePlayer player) { RaycastHit hit; var raycast = Physics.Raycast(player.eyes.HeadRay(), out hit, toolDistance, layerMask); BaseEntity entity = raycast ? hit.GetEntity() : null; if (!entity) { player.ChatMessage(Lang("NoEntityFound", player.UserIDString, toolUsed)); if (logToConsole) player.ConsoleMessage(Lang("NoEntityFound", player.UserIDString, toolUsed)); return; } bool hasSentMsg = false; if (entity is Door) { var door = entity as Door; var lockSlot = door.GetSlot(BaseEntity.Slot.Lock); if (lockSlot is CodeLock) { var codeLock = (CodeLock)lockSlot; string msg = Lang("AuthorizedPlayers", player.UserIDString, door.ShortPrefabName, GetName(entity.OwnerID.ToString())) + "\n"; int whitelisted = 0; msg += $"\nWHITELISTED PLAYERS: [{codeLock.code}] \n"; foreach (var user in codeLock.whitelistPlayers) { whitelisted++; msg += $"{whitelisted}. {GetName(user.ToString())}\n"; } int guests = 0; msg += "\nGUEST PLAYERS: "; if (!string.IsNullOrEmpty(codeLock.guestCode)) msg += $"[{codeLock.guestCode}] "; if (codeLock.guestPlayers.Count == 0) { msg += "\n- None"; } else { foreach (var user in codeLock.guestPlayers) { if (codeLock.whitelistPlayers.Contains(user)) continue; guests++; msg += $"{guests}. {GetName(user.ToString())}\n"; } } player.ChatMessage(whitelisted == 0 ? Lang("NoAuthorizedPlayers", player.UserIDString) : msg); if (logToConsole) player.ConsoleMessage(whitelisted == 0 ? Lang("NoAuthorizedPlayers", player.UserIDString) : msg); //if (showCode) player.ChatMessage(Lang("DoorCode", player.UserIDString, (door.GetSlot(BaseEntity.Slot.Lock) as CodeLock)?.code)); } else if (lockSlot is BaseLock) { player.ChatMessage(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ChatEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()))); if (logToConsole) player.ConsoleMessage(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ChatEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()))); Puts(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ConsoleEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, entity.OwnerID.ToString())); } hasSentMsg = true; } else if (entity is SleepingBag) { SleepingBag sleepingBag = entity as SleepingBag; player.ChatMessage($"This SleepingBag has been assigned to {GetName(sleepingBag.deployerUserID.ToString())} by {GetName(sleepingBag.OwnerID.ToString())}"); if (logToConsole) player.ConsoleMessage($"This SleepingBag has been assigned to {GetName(sleepingBag.deployerUserID.ToString())} by {GetName(sleepingBag.OwnerID.ToString())}"); hasSentMsg = true; } else if (entity is AutoTurret) { player.ChatMessage(GetAuthorized(entity, player)); if (logToConsole) player.ConsoleMessage(GetAuthorized(entity, player)); if (showBoxContents) { string msg = $"Items in the AutoTurret owned by {GetName(entity.OwnerID.ToString())}:\n"; foreach (var item in (entity as AutoTurret).inventory.itemList) { msg += $"{item.amount}x {item.info.displayName.english}\n"; } player.ChatMessage(msg); if (logToConsole) player.ConsoleMessage(msg); } hasSentMsg = true; } else if (entity is BuildingPrivlidge) { player.ChatMessage(GetAuthorized(entity, player)); if (logToConsole) player.ConsoleMessage(GetAuthorized(entity, player)); BuildingPrivlidge priv = entity as BuildingPrivlidge; if (priv != null) { float protectedMinutes = priv.GetProtectedMinutes(); TimeSpan t = TimeSpan.FromMinutes(protectedMinutes); string formattedTime = string.Format("{0:D2} days {1:D2} hours {2:D2} minutes {3:D2} seconds", t.Days, t.Hours, t.Minutes, t.Seconds, t.Milliseconds); player.ChatMessage($"The base is protected for {formattedTime}"); if (logToConsole) player.ConsoleMessage($"The base is protected for {formattedTime}"); } if (!string.IsNullOrEmpty(commandToRun)) player.Command("chat.say /" + commandToRun); hasSentMsg = true; } else if (entity is StorageContainer) { if (showBoxContents) { var storageContainer = entity as StorageContainer; string msg = $"Items in the {storageContainer.ShortPrefabName} owned by {GetName(storageContainer.OwnerID.ToString())}:\n"; foreach (var item in storageContainer.inventory.itemList) msg += $"{item.amount}x {item.info.displayName.english}\n"; player.ChatMessage(msg); if (logToConsole) player.ConsoleMessage(msg); } CodeLock codeLock = (CodeLock)entity.GetSlot(BaseEntity.Slot.Lock); if (codeLock != null) { string msg = Lang("AuthorizedPlayers", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString())) + "\n"; int authed = 0; string consoleMsg = ""; foreach (var user in codeLock.whitelistPlayers) { authed++; msg += $"{authed}. {GetName(user.ToString())} ({user})\n"; if (logToConsole) consoleMsg += $"{authed}. {user.ToString()} {GetName(user.ToString())} \n"; } player.ChatMessage(authed == 0 ? Lang("NoAuthorizedPlayers", player.UserIDString) : msg); if (logToConsole) player.ConsoleMessage(authed == 0 ? Lang("NoAuthorizedPlayers", player.UserIDString) : msg); player.ChatMessage("CodeLock Code: " + (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock)?.code.ToString()); if (logToConsole) player.ConsoleMessage("CodeLock Code: " + (entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock)?.code.ToString()); if (logToConsole) Puts(consoleMsg); } player.ChatMessage(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ChatEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()))); if (logToConsole) player.ConsoleMessage(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ChatEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()))); Puts(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ConsoleEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, entity.OwnerID.ToString())); if (!string.IsNullOrEmpty(commandToRun)) player.Command("chat.say /" + commandToRun); hasSentMsg = true; } if (!hasSentMsg) { player.ChatMessage(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ChatEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()))); if (logToConsole) player.ConsoleMessage(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ChatEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()))); } if (showSphere) player.SendConsoleCommand("ddraw.sphere", 2f, Color.blue, entity.CenterPoint(), 1f); if (logToConsole) Puts(entity.OwnerID == 0 ? Lang("NoOwner", player.UserIDString, entity.ShortPrefabName) : Lang("ConsoleEntityOwnedBy", player.UserIDString, entity.ShortPrefabName, entity.OwnerID.ToString())); if (logAdminInfo) Puts(Lang("AdminUsedTool", player.UserIDString, player.displayName, player.userID, entity.ShortPrefabName, GetName(entity.OwnerID.ToString()), entity.OwnerID.ToString(), entity.transform.position.ToString())); } private class AH : MonoBehaviour { public BasePlayer player; private float lastCheck; private void Awake() { player = GetComponent(); lastCheck = Time.realtimeSinceStartup; } private void FixedUpdate() { if (player == null || !player.IsConnected) { Destroy(); return; } float currentTime = Time.realtimeSinceStartup; if (!player.serverInput.WasJustPressed(BUTTON.FIRE_SECONDARY) || (player.GetActiveItem() as Item)?.info.shortname != plugin.toolUsed) return; if (currentTime - lastCheck >= 0.25f) { plugin.CheckEntity(player); lastCheck = currentTime; } } public void Destroy() { Destroy(this); } } private string GetAuthorized(BaseEntity entity, BasePlayer player) { string msg = Lang("AuthorizedPlayers", player.UserIDString, entity.ShortPrefabName, GetName(entity.OwnerID.ToString())) + "\n"; var turret = entity as AutoTurret; var priv = entity as BuildingPrivlidge; int authed = 0; foreach (var user in (turret ? turret.authorizedPlayers : priv.authorizedPlayers)) { authed++; msg += $"{authed}. {GetName(user.userid.ToString())}\n"; Puts($"{authed}. {user.userid} {GetName(user.userid.ToString())}\n"); } return authed == 0 ? Lang("NoAuthorizedPlayers", player.UserIDString) : msg; } private string GetPlayerColor(ulong id) => BasePlayer.FindByID(id) != null ? "green" : "red"; private string GetName(string id) { if (id == "0") return "[SERVERSPAWN]"; string color = GetPlayerColor(ulong.Parse(id)); return $" {covalence.Players.FindPlayerById(id)?.Name} ({id})"; } private T GetConfig(string name, T value) => Config[name] == null ? value : (T)Convert.ChangeType(Config[name], typeof(T)); private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args); } }