using System.Collections.Generic; using System.IO; using System.Linq; using Newtonsoft.Json; using Oxide.Core; using Oxide.Core.Configuration; using ProtoBuf; using UnityEngine; namespace Oxide.Plugins { [Info("MTeleport", "M&B-Studios", "1.0.0")] class MTeleport : RustPlugin { string currentStatus; #region References DynamicConfigFile data; List optionActive = new List(); private void RegisterPluginMessages() { var messages = new Dictionary { { "AlreadyEnabled", "You already have teleport enabled!" }, { "TeleportEnabled", "You have activated a map teleport using a marker. To disable it, type /mt" }, { "AlreadyDisabled", "Teleport disabled!" }, { "TeleportDisabled", "You disabled map teleport using a marker. To enable it, type /mt" } }; lang.RegisterMessages(messages, this); } private const string WuschSoundEffect = "assets/bundled/prefabs/fx/hit_notify.prefab"; void ActivateFunction(BasePlayer player) { if (optionActive.Contains(player.userID.ToString())) { SendReply(player, lang.GetMessage("AlreadyEnabled", this, player.UserIDString)); return; } if (!optionActive.Contains(player.userID.ToString())) optionActive.Add(player.userID.ToString()); string listAsString = string.Join(",", optionActive.ToArray()); data["optionList"] = listAsString; data.Save(); SendReply(player, lang.GetMessage("TeleportEnabled", this, player.UserIDString)); } void DisactivateFunction(BasePlayer player) { if (!optionActive.Contains(player.userID.ToString())) { SendReply(player, lang.GetMessage("AlreadyDisabled", this, player.UserIDString)); return; } if (optionActive.Contains(player.userID.ToString())) { optionActive.Remove(player.userID.ToString()); } string listAsString = string.Join(",", optionActive.ToArray()); data["optionList"] = listAsString; data.Save(); SendReply(player, lang.GetMessage("TeleportDisabled", this, player.UserIDString)); } #endregion #region Helpers float GetCorrectPos(Vector3 pos) { float y = TerrainMeta.HeightMap.GetHeight(pos); RaycastHit hit; if ( Physics.Raycast( new Vector3(pos.x, pos.y + 200f, pos.z), Vector3.down, out hit, Mathf.Infinity, LayerMask.GetMask( new[] { "Terrain", "World", "Default", "Construction", "Deployed" } ) ) && !hit.collider.name.Contains("rock_cliff") ) { return Mathf.Max(hit.point.y, y); } else { return y; } } void Init() { RegisterPluginMessages(); permission.RegisterPermission("mteleport.use", this); data = Interface.Oxide.DataFileSystem.GetDatafile("MTeleport"); string stringOptions = (string)data["optionList"]; cmd.AddChatCommand("mt", this, "cmdChat"); if (stringOptions == null || stringOptions == "") return; optionActive = new List(stringOptions.Split(',')); if (optionActive == null) optionActive = new List(); } #endregion #region Hooks void OnMapMarkerAdded(BasePlayer player, MapNote note) { if ( optionActive == null || player == null || note == null || !optionActive.Contains(player.userID.ToString()) || !player.IPlayer.HasPermission("mteleport.use") ) return; Vector3 pos = note.worldPosition; pos.y = GetCorrectPos(pos); Effect.server.Run(WuschSoundEffect, player.transform.position); player.Teleport(pos); } void ToggleFunction(BasePlayer player) { if (optionActive.Contains(player.userID.ToString())) { DisactivateFunction(player); } else { ActivateFunction(player); } } #endregion #region Methods void cmdChat(BasePlayer player, string command, string[] args) { if (!player.IPlayer.HasPermission("mteleport.use")) return; if (args == null || args?.Length == 0) { ToggleFunction(player); } else { switch (args[0].ToLower()) { case "off": DisactivateFunction(player); break; case "on": ActivateFunction(player); break; } } } #endregion } }