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

FREE SimpleRangeFinder : 1.0.3 1.0.3

Нет прав для скачивания
C#:
using System;
using System.Linq;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Simple Range Finder", "NooBlet", "1.0.3")]
    [Description("Adds A Range finder to scopes and Binoculars")]
    public class SimpleRangeFinder : RustPlugin
    {              
        internal const string PERMISSION = "SimpleRangeFinder.use";
        internal const string PERMISSION2 = "SimpleRangeFinder.binocular";

        private void Loaded()
        {
            permission.RegisterPermission(PERMISSION, this);
            permission.RegisterPermission(PERMISSION2, this);
        }

        private void OnPlayerInput(BasePlayer player, InputState input)
        {
            if (player == null || input == null) return;

            bool hasPrimaryPermission = permission.UserHasPermission(player.UserIDString, PERMISSION);
            bool hasSecondaryPermission = permission.UserHasPermission(player.UserIDString, PERMISSION2);

            if (!hasPrimaryPermission && !hasSecondaryPermission) return;

            HeldEntity heldEntity = player.GetHeldEntity();
            if (heldEntity == null) return;

            if (hasPrimaryPermission && heldEntity is BaseProjectile weapon && weapon.primaryMagazine != null)
            {
                HandleRaycastLogging(input, player);
            }
            else if (hasSecondaryPermission && heldEntity is Binocular)
            {
                HandleRaycastLogging(input, player);
            }
        }

        private void HandleRaycastLogging(InputState input, BasePlayer player)
        {
            if (input.IsDown(BUTTON.FIRE_SECONDARY))
            {
                StartRaycastLogging(player);
            }
            else if (input.WasJustReleased(BUTTON.FIRE_SECONDARY))
            {
                StopRaycastLogging(player);
            }
        }

        private void StartRaycastLogging(BasePlayer player)
        {
            if (player.GetHeldEntity() is BaseProjectile weapon)
            {
                var item = weapon.GetItem();
                if (item.contents == null) { return; }
                if (item.contents.itemList.Count == 0) { return; }
                var modItems = item.contents.itemList.Where(m => m.info.shortname.Contains("scope"));
                if (!modItems.Any()) { return; }
                if (!player.HasComponent<RaycastLogger>())
                {
                    var logger = player.gameObject.AddComponent<RaycastLogger>();
                    logger.Init(player);
                }
            }
            if (permission.UserHasPermission(player.UserIDString, PERMISSION2) && player.GetHeldEntity() is Binocular binocular)
            {
                if (!player.HasComponent<RaycastLogger>())
                {
                    var logger = player.gameObject.AddComponent<RaycastLogger>();
                    logger.Init(player);
                }
            }
        }

        private void StopRaycastLogging(BasePlayer player)
        {
            var logger = player.GetComponent<RaycastLogger>();
            if (logger != null)
            {
                logger.StopLogging();
            }
        }

        public class RaycastLogger : MonoBehaviour
        {
            private BasePlayer player;
            private bool isLogging = false;
            private LayerMask layerMask = LayerMask.GetMask("Terrain", "Player (Server)", "Construction", "Tree");

            public void Init(BasePlayer player)
            {
                this.player = player;
                StartLogging();
            }

            private void StartLogging()
            {
                if (isLogging) return;
                isLogging = true;
                InvokeRepeating(nameof(LogRaycastDistance), 0f, 0.5f);
            }

            public void StopLogging()
            {
                if (!isLogging) return;
                isLogging = false;
                CancelInvoke(nameof(LogRaycastDistance));
                Destroy(this);
            }

            private void LogRaycastDistance()
            {
                Ray ray = new Ray(player.eyes.position, player.eyes.BodyForward());
                if (Physics.Raycast(ray, out RaycastHit hit, 500f, layerMask))
                {
                    float distance = (float)Math.Round(hit.distance);
                    player.ShowToast(GameTip.Styles.Blue_Short, $"Distance: {distance}m");
                }
                else
                {
                    player.ShowToast(GameTip.Styles.Blue_Short, "Outside Max Range: 500m.");
                }
            }
        }
    }
}

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