Иконка ресурса

FREE TeleportMarker : 1.0.0 1.0.0

Нет прав для скачивания
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);
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху