C#:
using System.Collections.Generic;
using ProtoBuf;
using UnityEngine;
namespace Oxide.Plugins;
[Info("TeleportMarker", "Bubbafett", "1.0.0")]
[Description("Teleport to map markers when they are placed.")]
public class TeleportMarker : RustPlugin
{
private readonly HashSet<string> _tpmUsers = [];
private const string PermTpm = "teleportmarker.use";
// HOOKS
private void Init()
{
permission.RegisterPermission(PermTpm, this);
cmd.AddChatCommand("tpm", this, nameof(CmdTpm));
Unsubscribe(nameof(OnMapMarkerAdded));
}
private void OnMapMarkerAdded(BasePlayer player, MapNote marker)
{
if (_tpmUsers.Contains(player.UserIDString))
{
TeleportToMarker(player, marker);
}
}
// HELPERS
private void TeleportToMarker(BasePlayer player, MapNote marker)
{
var position = marker.worldPosition + new Vector3(0, TerrainMeta.HeightMap.GetHeight(marker.worldPosition), 0);
TeleportToPos(player, position);
ServerMgr.Instance.Invoke(() => RemoveMarker(player, marker), 0.5f);
}
private static void RemoveMarker(BasePlayer player, MapNote marker)
{
player.State.pointsOfInterest.Remove(marker);
marker.Dispose();
player.DirtyPlayerState();
player.SendMarkersToClient();
}
private void TeleportToPos(BasePlayer player, Vector3 destination)
{
if (!player.IsAlive() || player.IsSpectating()) return;
try
{
player.PauseFlyHackDetection(5f);
player.PauseSpeedHackDetection(5f);
player.UpdateActiveItem(default);
player.EnsureDismounted();
player.Server_CancelGesture();
player.SetParent(null, true, true);
player.SetServerFall(true);
destination.y += 0.1f;
player.MovePosition(destination);
player.ClientRPC(RpcTarget.Player("ForcePositionTo", player), destination);
player.StartSleeping();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.ClientRPC(RpcTarget.Player("StartLoading", player));
player.SendEntityUpdate();
player.UpdateNetworkGroup();
player.SendNetworkUpdateImmediate();
}
finally
{
player.SetServerFall(false);
ServerMgr.Instance.Invoke(player.EndSleeping, 0.5f);
}
}
private bool CheckPermission(BasePlayer player, string perm)
{
return permission.UserHasPermission(player.UserIDString, perm);
}
// COMMANDS
private void CmdTpm(BasePlayer player, string command, string[] args)
{
if (!CheckPermission(player, PermTpm))
{
player.ChatMessage("No Permission");
return;
}
if (_tpmUsers.Contains(player.UserIDString))
{
player.ChatMessage("Teleport Marker disabled.");
_tpmUsers.Remove(player.UserIDString);
if (_tpmUsers.Count == 0)
{
Unsubscribe(nameof(OnMapMarkerAdded));
}
return;
}
if (_tpmUsers.Count == 0)
{
Subscribe(nameof(OnMapMarkerAdded));
}
player.ChatMessage("Teleport Marker enabled.");
_tpmUsers.Add(player.UserIDString);
}
}