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

FREE RSleepingSnake : 1.0.1 1.0.1

Нет прав для скачивания
C#:
using System.Collections.Generic;
using Newtonsoft.Json;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("RSleepingSnake", "RustInnovate", "1.0.1")]
    [Description("Спавн змеи при сборе ресурсов в умеренных биомах")]
    // CHANGE: Убран модификатор partial в соответствии с регламентом монолитных плагинов
    public class RSleepingSnake : RustPlugin
    {
        private ConfigData configData;

        private sealed class ConfigData
        {
            [JsonProperty("Вероятность спавна змеи (0.0 - 1.0)")]
            public float SpawnChance { get; set; } = 0.05f;

            [JsonProperty("Требовать умеренный биом")]
            public bool RequireTemperateBiome { get; set; } = true;

            [JsonProperty("Префабы ресурсов, при сборе которых может появиться змея")]
            public List<string> TriggeringPrefabs { get; set; } =
                new List<string>
                {
                    "wood-collectable",
                    "sulfur-collectable",
                    "metal-collectable",
                    "stone-collectable",
                };
        }

        private void Init()
        {
            Puts($"Загрузка плагина RSleepingSnake v{Version}");
            Puts("==================================================");
            Puts("          Plugin by RustInnovate              ");
            Puts("--------------------------------------------------");
            Puts("  VK: vk.ru/rustinnovate                  ");
            Puts("  Discord: discord.gg/RFm5wruE86                         ");
            Puts("  Telegram: t.me/RobinPlay                    ");
            Puts("==================================================");
            // CHANGE: Удален избыточный вызов LoadConfig(), так как Oxide вызывает LoadConfig до вызова Init()
        }

        // CHANGE: Добавлен обязательный вызов base.LoadConfig() для инициализации свойства Config в Oxide/Carbon
        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                configData = Config.ReadObject<ConfigData>();
                if (configData == null)
                {
                    LoadDefaultConfig();
                }
                else if (configData.TriggeringPrefabs != null)
                {
                    var uniquePrefabs = new List<string>();
                    foreach (var prefab in configData.TriggeringPrefabs)
                    {
                        if (!uniquePrefabs.Contains(prefab))
                        {
                            uniquePrefabs.Add(prefab);
                        }
                    }
                    configData.TriggeringPrefabs = uniquePrefabs;
                }
            }
            catch
            {
                PrintWarning("Ошибка загрузки конфига.Создаю новый файл.");
                LoadDefaultConfig();
            }
            SaveConfig();
        }

        protected override void LoadDefaultConfig()
        {
            // CHANGE: Инициализация нового экземпляра конфигурации по умолчанию
            configData = new ConfigData();
        }

        protected override void SaveConfig()
        {
            // CHANGE: Защитная проверка Config на null и сохранение с форматированием
            if (Config != null)
            {
                Config.WriteObject(configData, true);
            }
        }

        private void OnCollectiblePickup(CollectibleEntity collectible, BasePlayer player, bool eat)
        {
            if (player == null || collectible == null || configData == null)
                return;

            string prefabName = collectible.ShortPrefabName;
            if (string.IsNullOrEmpty(prefabName))
                return;

            if (
                configData.TriggeringPrefabs == null
                || !configData.TriggeringPrefabs.Contains(prefabName)
            )
                return;

            Vector3 position = collectible.transform.position;
            if (position == Vector3.zero)
            {
                position = player.transform.position;
            }

            if (configData.RequireTemperateBiome)
            {
                int biomeType = TerrainMeta.BiomeMap?.GetBiomeMaxType(position) ?? 0;
                if (biomeType != 2)
                    return;
            }

            float randomValue = UnityEngine.Random.Range(0f, 1f);
            if (randomValue > configData.SpawnChance)
                return;

            SpawnSnake(position);
        }

        private void SpawnSnake(Vector3 position)
        {
            const string snakePrefab = "assets/rust.ai/agents/snake/snake.entity.prefab";

            BaseEntity entity = GameManager.server.CreateEntity(
                snakePrefab,
                position,
                Quaternion.identity
            );
            if (entity == null)
            {
                PrintWarning($"Не удалось создать змею по префабу: {snakePrefab}");
                return;
            }

            entity.enableSaving = false;
            entity.Spawn();
        }
    }
}

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

Другие ресурсы пользователя 15FPS

Сверху