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

FREE SpinningXmasTree : 1.1.0 1.1.0

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
// Requires: ParentedEntityRenderFix

using UnityEngine;
using VLB;

namespace Oxide.Plugins
{
    [Info("Spinning Xmas Tree", "Bazz3l", "1.1.0")]
    [Description("Add decorations to your tree and watch it spin with awesomeness.")]
    public class SpinningXmasTree : RustPlugin
    {
        #region Oxide Hooks

        private void OnServerInitialized()
        {
            PrintWarning("please wait for all trees to initialize.");

            timer.In(25f, () =>
            {
                SpinnerManagement.CreateAllSpinners();
                
                PrintWarning("all trees are now initialized.");
            });
        }

        private void Unload()
        {
            SpinnerManagement.RemoveAllSpinners();
        }

        private void OnEntityKill(ChristmasTree christmasTree)
        {
            SpinnerManagement.RemoveSpinner(christmasTree);
        }

        private void OnEntityBuilt(Planner plan, GameObject gameObject)
        {
            ChristmasTree christmasTree = gameObject.GetComponent<ChristmasTree>();
            if (christmasTree != null)
                NextFrame(() => SpinnerManagement.CreateSpinner(christmasTree));
        }

        private void OnItemAddedToContainer(ItemContainer container, Item item)
        {
            ChristmasTree christmasTree = container?.entityOwner as ChristmasTree;
            if (christmasTree != null)
                christmasTree.GetParentEntity()
                    ?.GetComponent<TreeSpinnerController>()
                    ?.SetActive(container);
        }

        private void OnItemRemovedFromContainer(ItemContainer container, Item item)
        {
            ChristmasTree christmasTree = container?.entityOwner as ChristmasTree;
            if (christmasTree != null)
                christmasTree.GetParentEntity()
                    ?.GetComponent<TreeSpinnerController>()
                    ?.SetActive(container);
        }

        #endregion
        
        #region Spawn Management

        private class SpinnerManagement
        {
            public static void CreateAllSpinners()
            {
                foreach (BaseNetworkable entity in BaseNetworkable.serverEntities)
                {
                    ChristmasTree christmasTree = entity as ChristmasTree;
                    if (christmasTree != null)
                        CreateSpinner(christmasTree);
                }
            }
            
            public static void RemoveAllSpinners()
            {
                foreach (BaseNetworkable entity in BaseNetworkable.serverEntities)
                {
                    ChristmasTree christmasTree = entity as ChristmasTree;
                    if (christmasTree != null)
                        RestoreEntity(christmasTree);
                }
            }
            
            public static void CreateSpinner(ChristmasTree christmasTree)
            {
                if (christmasTree == null || christmasTree.IsDestroyed)
                    return;

                if (christmasTree.HasParent())
                    return;

                DroppedItem droppedItem = CreateDroppedItem(christmasTree.transform.position);
                if (droppedItem == null) 
                    return;
                
                christmasTree.SetParent(droppedItem, true, true);
                
                droppedItem.GetOrAddComponent<TreeSpinnerController>()?.SetActive(christmasTree.inventory);
            }
            
            public static void RemoveSpinner(ChristmasTree christmasTree)
            {
                BaseEntity parent = christmasTree.GetParentEntity();
                if (parent != null && !parent.IsDestroyed)
                    parent.Kill();
            }

            public static void RestoreEntity(ChristmasTree christmasTree)
            {
                BaseEntity parent = christmasTree.GetParentEntity();
                
                christmasTree.SetParent(null, true, true);
                
                if (parent != null && !parent.IsDestroyed)
                    parent.Kill();
            }

            public static DroppedItem CreateDroppedItem(Vector3 position)
            {
                DroppedItem droppedItem = ItemManager.CreateByName("rock", 1)?.Drop(position, Vector3.zero)?.GetComponent<DroppedItem>();
                if (droppedItem == null)
                    return null;
                
                Rigidbody rigidbody = droppedItem.GetComponent<Rigidbody>();
                if (rigidbody != null)
                {
                    rigidbody.isKinematic = true;
                    rigidbody.useGravity = false;
                }

                droppedItem.syncPosition = true;
                droppedItem.enableSaving = false;
                droppedItem.allowPickup = false;
                droppedItem.OwnerID = 1717;
                droppedItem.CancelInvoke(droppedItem.IdleDestroy);

                return droppedItem;
            }
        }

        private class TreeSpinnerController : MonoBehaviour
        {
            public float spinSpeed = 10f;
            public bool shouldSpin;

            private void FixedUpdate()
            {
                if (!shouldSpin) 
                    return;
                
                transform.Rotate(0, Time.fixedDeltaTime * spinSpeed, 0);
                transform.hasChanged = true;
            }

            public void SetActive(ItemContainer container)
            {
                shouldSpin = container?.itemList != null && container.itemList.Count > 0;
            }
        }

        #endregion
    }
}

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