C#:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("ObjectInfo", "YourName", "1.0.6")]
[Description("Показывает расширенную информацию об объекте (включая коды), на который смотрит админ, по команде /b")]
class ObjectInfo : RustPlugin
{
private const string PermissionUse = "objectinfo.use";
void Init()
{
permission.RegisterPermission(PermissionUse, this);
}
[ChatCommand("b")]
void CmdGetOwner(BasePlayer player)
{
if (!permission.UserHasPermission(player.UserIDString, PermissionUse) && !player.IsAdmin)
{
PrintToChat(player, "<color=#FF0000>У вас нет прав для использования этой команды!</color>");
return;
}
// Направляем луч от глаз игрока вперед, чтобы найти объект
RaycastHit hit;
if (!Physics.Raycast(player.eyes.HeadRay(), out hit, 10f, Physics.DefaultRaycastLayers))
{
PrintToChat(player, "<color=#FFFF00>Вы должны смотреть на объект (макс. 10 метров).</color>");
return;
}
// Получаем сущность, на которую смотрит игрок
BaseEntity entity = hit.GetEntity();
if (entity == null)
{
PrintToChat(player, "<color=#FFFF00>Объект не найден.</color>");
return;
}
string ownerName = CustomFindPlayerName(entity.OwnerID);
PrintToChat(player, "=================================");
PrintToChat(player, $"<color=#00FFFF>Тип объекта:</color> {entity.ShortPrefabName}");
PrintToChat(player, $"<color=#00FFFF>Владелец (OwnerID):</color> {ownerName} ({entity.OwnerID})");
// ПРОВЕРКА НА НАЛИЧИЕ КОДОВОГО ЗАМКА
CodeLock codeLock = entity.GetSlot(BaseEntity.Slot.Lock) as CodeLock;
if (codeLock != null)
{
PrintToChat(player, "<color=#FFA500>--- Информация о замке ---</color>");
// В 266 девблоге поля code и guestCode являются открытыми (public)
// Прямое обращение исключает ошибки null-ответов рефлексии
string code = codeLock.code;
string guestCode = codeLock.guestCode;
PrintToChat(player, $"<color=#FFFF00>Основной код:</color> {(string.IsNullOrEmpty(code) ? "Не установлен" : code)}");
PrintToChat(player, $"<color=#FFFF00>Гостевой код:</color> {(string.IsNullOrEmpty(guestCode) ? "Не установлен" : guestCode)}");
// 1. Вывод авторизованных игроков (Основной код)
if (codeLock.whitelistPlayers != null && codeLock.whitelistPlayers.Count > 0)
{
PrintToChat(player, "<color=#FFFF00>Авторизованы (Основной код):</color>");
foreach (ulong userId in codeLock.whitelistPlayers)
{
string authedName = CustomFindPlayerName(userId);
PrintToChat(player, $"- {authedName} ({userId})");
}
}
else
{
PrintToChat(player, "<color=#FFFF00>По основному коду никто не авторизован.</color>");
}
// 2. Вывод авторизованных игроков (Гостевой код)
if (codeLock.guestPlayers != null && codeLock.guestPlayers.Count > 0)
{
PrintToChat(player, "<color=#FF7F50>Авторизованы как ГОСТИ (Guest):</color>");
foreach (ulong userId in codeLock.guestPlayers)
{
string guestName = CustomFindPlayerName(userId);
PrintToChat(player, $"- {guestName} ({userId})");
}
}
else
{
PrintToChat(player, "<color=#FF7F50>Как гость в замке никто не авторизован.</color>");
}
}
// Проверка: это шкаф (BuildingPrivlidge)
if (entity is BuildingPrivlidge)
{
BuildingPrivlidge buildingCupboard = entity as BuildingPrivlidge;
PrintToChat(player, "<color=#FFA500>--- Авторизованные в шкафу ---</color>");
if (buildingCupboard != null)
{
if (buildingCupboard.authorizedPlayers == null || buildingCupboard.authorizedPlayers.Count == 0)
{
PrintToChat(player, "В шкафу никто не авторизован.");
}
else
{
foreach (var authed in buildingCupboard.authorizedPlayers)
{
string authedName = CustomFindPlayerName(authed.userid);
PrintToChat(player, $"- {authedName} ({authed.userid})");
}
}
}
}
// Проверка: это спальник / кровать (Sleeping Bag)
else if (entity is SleepingBag)
{
SleepingBag sleepingBagEntity = entity as SleepingBag;
if (sleepingBagEntity != null)
{
string assignedName = CustomFindPlayerName(sleepingBagEntity.deployerUserID);
PrintToChat(player, "<color=#FFA500>--- Информация о спальнике ---</color>");
PrintToChat(player, $"<color=#FFFF00>Название спальника:</color> {sleepingBagEntity.niceName}");
PrintToChat(player, $"<color=#FFFF00>Кому принадлежит:</color> {assignedName} ({sleepingBagEntity.deployerUserID})");
}
}
PrintToChat(player, "=================================");
}
// Метод для поиска имени игрока (онлайн или в базе Oxide)
private string CustomFindPlayerName(ulong id)
{
if (id == 0) return "Неизвестно";
BasePlayer target = BasePlayer.FindByID(id);
if (target != null) return target.displayName;
var iPlayer = covalence.Players.FindPlayerById(id.ToString());
if (iPlayer != null) return iPlayer.Name;
return "Оффлайн игрок";
}
}
}