using Newtonsoft.Json; using Oxide.Game.Rust.Cui; using System; using System.Collections.Generic; using UnityEngine; namespace Oxide.Plugins { [Info("Mount Computer Station", "YaMang -w-", "1.1.3")] [Description("View computer stations with commands!")] public class MountComputerStation : RustPlugin { Dictionary SetLocation = new Dictionary(); Dictionary _station = new Dictionary(); private string UsePermission = "MountComputerStation.use"; #region OxideHook private void OnServerInitialized() { permission.RegisterPermission(UsePermission, this); for (int i = 0; i < _config.commands.Count; i++) { cmd.AddChatCommand(_config.commands[i], this, nameof(ChatStation)); cmd.AddConsoleCommand(_config.commands[i], this, nameof(ConsoleStation)); } } private void Unload() { foreach (var item in _station) { item.Value.Kill(); } foreach(var baseplayer in BasePlayer.activePlayerList) { CuiHelper.DestroyUi(baseplayer, "ExitBtn"); } } #endregion #region Command private void ChatStation(BasePlayer player, string command, string[] args) => SetComputerStation(player); private void ConsoleStation(ConsoleSystem.Arg arg) { if(arg.IsRcon) { if(arg.Args.Length == 0) { arg.Reply = Lang("SyntaxError"); return; } BasePlayer findplayer = BasePlayer.FindByID(Convert.ToUInt64(arg.Args[0])) ?? null; if(findplayer == null) { arg.Reply = Lang("NotFound"); return; } SetComputerStation(findplayer); } var player = arg.Connection.player as BasePlayer ?? null; SetComputerStation(player); } #endregion #region Funtions private void SetComputerStation(BasePlayer player) { if(!permission.UserHasPermission(player.UserIDString, UsePermission)) { Messages(player, Lang("NotAccess", player.UserIDString)); return; } var station = GameManager.server.CreateEntity("assets/prefabs/deployable/computerstation/computerstation.deployed.prefab", _config.locationStation.PlayerLocation ? player.transform.position : _config.locationStation.location) as ComputerStation; if(_config.addcctvs.Count != 0) { NextFrame(() => { foreach (var item in _config.addcctvs) { if (station.controlBookmarks.Contains(item)) continue; station.controlBookmarks.Add(item); } station.SendNetworkUpdateImmediate(); }); } station.Spawn(); station._name += "__ym__"; station.MountPlayer(player); NextTick(() => { station.SendControlBookmarks(player); }); if(player.isMounted) { if (!SetLocation.ContainsKey(player)) SetLocation.Add(player, player.transform.position); ExitUI(player); _station.Add(player, station); } else station.Kill(); } [ConsoleCommand("scsdismount")] private void ScsDismount(ConsoleSystem.Arg arg) { if (arg.IsRcon) return; var player = arg.Connection.player as BasePlayer; if (player == null) return; var entity = player.GetMounted(); player.EnsureDismounted(); ScsDestory(entity, player); CuiHelper.DestroyUi(player, "ExitBtn"); } private void OnEntityDismounted(BaseMountable entity, BasePlayer player) { if (entity == null || player == null) return; if (entity._name.Contains("__ym__")) ScsDestory(entity, player); } private void ScsDestory(BaseMountable entity, BasePlayer player) { if (SetLocation.ContainsKey(player)) { timer.Once(0.01f, () => { player.Teleport(SetLocation[player]); SetLocation.Remove(player); }); } if (entity._name.Contains("__ym__")) { _station.Remove(player); entity.Kill(); CuiHelper.DestroyUi(player, "ExitBtn"); } } private void Messages(BasePlayer player, string text) { player.SendConsoleCommand("chat.add", 2, _config.SteamID, $"{_config.Prefix} {text}"); } #endregion #region Config private ConfigData _config; private class ConfigData { [JsonProperty(PropertyName = "Prefix")] public string Prefix { get; set; } [JsonProperty(PropertyName = "SteamID")] public string SteamID { get; set; } [JsonProperty(PropertyName = "Commands")] public List commands { get; set; } [JsonProperty(PropertyName = "Location Station")] public LocationStation locationStation { get; set; } [JsonProperty(PropertyName = "Auto Add Station CCTVs")] public List addcctvs { get; set; } [JsonProperty(PropertyName = "UI Settings")] public UISettings uiSettings { get; set; } public Oxide.Core.VersionNumber Version { get; set; } } public class UISettings { public string oMin { get; set; } public string oMax { get; set; } public string Color { get; set; } } public class LocationStation { [JsonProperty(PropertyName = "Summoned from player position (If false, use location)")] public bool PlayerLocation; public Vector3 location; } protected override void LoadConfig() { base.LoadConfig(); _config = Config.ReadObject(); if (_config.Version < Version) UpdateConfigValues(); Config.WriteObject(_config, true); } protected override void LoadDefaultConfig() => _config = GetBaseConfig(); private ConfigData GetBaseConfig() { return new ConfigData { Prefix = "[ Mount Computer Station ] - \n", commands = new List { "scs" }, locationStation = new LocationStation { PlayerLocation = true, location = new Vector3(0f, 100f, 0f) }, uiSettings = new UISettings { oMin = "381.104 239.333", oMax = "542.896 296.667", Color = "0.176 0.72 0.72 1" }, addcctvs = new List { }, Version = Version }; } protected override void SaveConfig() => Config.WriteObject(_config, true); private void UpdateConfigValues() { PrintWarning("Config update detected! Updating config values..."); _config.Version = Version; PrintWarning("Config update completed!"); } #endregion #region Lang protected override void LoadDefaultMessages() { lang.RegisterMessages(new Dictionary { { "NotAccess", "You cannot use this command." }, { "SyntaxError", "Please enter your SteamID" }, { "NotFound", "Player Not Found" }, { "Exit", "[ Exit ]" } }, this); lang.RegisterMessages(new Dictionary { { "NotAccess", "당신은 이 명령어를 사용할수 없습니다." }, { "SyntaxError", "고유번호를 입력해주세요." }, { "NotFound", "플레이어를 찾을 수 없습니다." }, { "Exit", "[ 닫기 ]" } }, this, "ko"); } private string Lang(string key, params object[] args) { return string.Format(lang.GetMessage(key, this), args); } #endregion #region UI private void ExitUI(BasePlayer player) { var container = new CuiElementContainer(); container.Add(new CuiButton { Button = { Color = _config.uiSettings.Color, Command = "scsdismount" }, Text = { Text = Lang("Exit"), Font = "robotocondensed-regular.ttf", FontSize = 20, Align = TextAnchor.MiddleCenter, Color = "0 0 0 1" }, RectTransform = { AnchorMin = "0.5 0.5", AnchorMax = "0.5 0.5", OffsetMin = _config.uiSettings.oMin, OffsetMax = _config.uiSettings.oMax } }, "Overlay", "ExitBtn"); CuiHelper.DestroyUi(player, "ExitBtn"); CuiHelper.AddUi(player, container); } #endregion } }