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

FREE ZealMagicTree : 1.0.0 1.0.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using Oxide.Core.Plugins;
using Rust;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("ZealMagicTree", "Kira", "1.0.0")]
    [Description("Event magic tree")]
    // ReSharper disable once ClassNeverInstantiated.Global
    public class ZealMagicTree : RustPlugin
    {
        #region [References] / [Ссылки]

        [PluginReference] private Plugin ZealMStatistics, ZealKarma;

        #endregion

        #region [Vars] / [Переменные]

        private static ZealMagicTree _;

        private const int TreeTime = 10;
        private const int Stages = 4;
        private const int StageTime = TreeTime / Stages;

        private static readonly Dictionary<int, string> TreeLvl = new Dictionary<int, string>
        {
            [1] = "assets/bundled/prefabs/autospawn/resource/v3_tundra_forest/douglas_fir_d.prefab",
            [2] = "assets/bundled/prefabs/autospawn/resource/v3_tundra_forestside/douglas_fir_d_small.prefab",
            [3] = "assets/bundled/prefabs/autospawn/resource/v3_tundra_forestside/pine_d.prefab",
            [4] = "assets/bundled/prefabs/autospawn/resource/v3_tundra_forest/pine_a.prefab"
        };

        #endregion

        #region [MonoBehaviours]

        public class MagicTree : MonoBehaviour
        {
            public ulong owner;
            public int lvl;
            public int lifeTime;
            public GameObject go;
            public BaseEntity tree;
            public SphereCollider trigger;
            public Vector3 position;
            public Vector3 ddrawposition;
            public List<BasePlayer> playersInTrigger = new List<BasePlayer>();

            private void Start()
            {
                go = gameObject;
                go.layer = (int) Layer.Reserved1;
                go.transform.position = position;
                ddrawposition = new Vector3(position.x, position.y + 1.5f, position.z);
                SpawnTrigger();
                InvokeRepeating(nameof(Handler), 1f, 1f);
            }

            public void Handler()
            {
                DDrawRefresh();
                if (lvl == Stages) _.ZealKarma?.Call("GiveKarma", owner, 0.6f);
                lifeTime++;
                if (tree.IsDestroyed) Destroy(this);
                if ((StageTime * lvl) < lifeTime)
                {
                    if (lvl >= Stages) return;
                    lvl++;
                    RefreshTree();
                }
            }

            public void SpawnTrigger()
            {
                trigger = go.AddComponent<SphereCollider>();
                trigger.isTrigger = true;
                trigger.radius = 3f;
                trigger.name = $"{owner}";
                trigger.transform.position = position;
            }

            public void RefreshTree()
            {
                tree.Kill();
                tree.SendNetworkUpdate();
                tree = GameManager.server.CreateEntity(TreeLvl[lvl]);
                tree.ServerPosition = position;
                tree.Spawn();
                tree.SendNetworkUpdate();
            }

            private void OnTriggerEnter(Collider other)
            {
                var ent = other.ToBaseEntity();
                if (ent == null) return;
                if (!ent.IsValid()) return;
                if (!(ent is BasePlayer)) return;
                var player = (BasePlayer) ent;
                if (playersInTrigger.Contains(player)) return;
                playersInTrigger.Add(player);
            }

            private void OnTriggerExit(Collider other)
            {
                var ent = other.ToBaseEntity();
                if (ent == null) return;
                if (!ent.IsValid()) return;
                if (!(ent is BasePlayer)) return;
                var player = (BasePlayer) ent;
                if (!playersInTrigger.Contains(player)) return;
                playersInTrigger.Remove(player);
            }

            private void DDrawRefresh()
            {
                if (playersInTrigger.Count == 0) return;
                foreach (var player in playersInTrigger)
                {
                    player.SendConsoleCommand("ddraw.text", 1f, Color.white, ddrawposition,
                        $"<size=30>{GetStage()}</size>");
                }
            }

            private string GetStage()
            {
                var stage = $"{lvl} стадия из {Stages}";
                return lvl == Stages ? "+10 кармы/мин ▲" : stage;
            }

            private void OnDestroy()
            {
                tree.Kill();
                Destroy(trigger);
                tree.SendNetworkUpdate();
            }
        }

        #endregion
 
        #region [Hooks] / [Крюки]

        // ReSharper disable once UnusedMember.Local
        private void OnServerInitialized()
        {
            _ = this;
        }

        // ReSharper disable once UnusedMember.Local
        private void OnEntityBuilt(Planner plan, GameObject go)
        {
            var ent = go.ToBaseEntity();
            if (ent == null) return;
            if (ent.skinID != 5) return;
            SpawnTree(plan.GetOwnerPlayer().userID, ent, ent.ServerPosition);
        }

        #endregion
 
        #region [Commands] / [Команды]

        [ConsoleCommand("give.tree")]
        // ReSharper disable once UnusedMember.Local
        private void GiveTree(ConsoleSystem.Arg args)
        {
            var item = ItemManager.CreateByName("seed.hemp", 10, 5);
            args.Player().GiveItem(item);
        }

        #endregion

        #region [Helpers] / [Вспомогательный код]

        private static void SpawnTree(ulong owner, BaseEntity tree, Vector3 position)
        {
            var component = new GameObject().AddComponent<MagicTree>();
            component.owner = owner;
            component.tree = tree;
            component.position = position;
        }

        #endregion
    }
}

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