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

FREE BlockStructure : 1.0.4 1.0.4

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System.Collections.Generic;
using UnityEngine;
using System;
namespace Oxide.Plugins {
    [Info("BlockStructure", "Marat", "1.0.4", ResourceId = 2092)]
    [Description("Building blocks in the rocks, terrain and icebergs.Sets a limit build in height and depth in water.")]
    class BlockStructure : RustPlugin {
        void Loaded() {
            LoadConfiguration();
            LoadDefaultMessages();
            permission.RegisterPermission(permBS, this);
        }
        double HeightBlock = 20;
        double WaterBlock = -5;
        int AuthLvl = 3;
        bool ConfigChanged;
        bool usePermissions = true;
        bool BlockInHeight = true;
        bool BlockInWater = true;
        bool BlockInRock = true;
        bool BlockOnIceberg = false;
        bool BlockUnTerrain = true;
        string permBS = "blockstructure.allowed";
        protected override void LoadDefaultConfig() => PrintWarning("New configuration file created.");
        void LoadConfiguration() {
            HeightBlock = GetConfigValue("Options", "Height for block", HeightBlock);
            WaterBlock = GetConfigValue("Options", "Depth for block", WaterBlock);
            BlockInHeight = GetConfigValue("Options", "Block in Height", BlockInHeight);
            BlockInWater = GetConfigValue("Options", "Block in Water", BlockInWater);
            BlockInRock = GetConfigValue("Options", "Block In Rock", BlockInRock);
            BlockOnIceberg = GetConfigValue("Options", "Block On Iceberg", BlockOnIceberg);
            BlockUnTerrain = GetConfigValue("Options", "Block Under Terrain", BlockUnTerrain);
            usePermissions = GetConfigValue("Options", "UsePermissions", usePermissions);
            AuthLvl = GetConfigValue("Options", "Ignore Authorization Level", AuthLvl);
            if (!ConfigChanged) return;
            PrintWarning("Configuration file updated.");
            SaveConfig();
        }
        T GetConfigValue<T>(string category, string setting, T defaultValue) {
            var data = Config[category] as Dictionary<string, object>;
            object value;
            if (data == null) {
                data = new Dictionary<string, object>();
                Config[category] = data;
                ConfigChanged = true;
            }
            if (data.TryGetValue(setting, out value)) return (T)Convert.ChangeType(value, typeof(T));
            value = defaultValue;
            data[setting] = value;
            ConfigChanged = true;
            return (T)Convert.ChangeType(value, typeof(T));
        }
        void LoadDefaultMessages() {
            lang.RegisterMessages(new Dictionary<string, string> {
                ["blockWater"]
                = "<size=16><color=yellow>You can not build in water deeper {0} meters</color></size>", ["blockHeight"] = "<size=16><color=yellow>You can not build higher {0} meters</color></size>", ["block"] = "<size=16><color=red>You can not build here</color></size>", ["blockIce"] = "<size=16><color=red>You can not build on iceberg</color></size>", ["blockTerrain"] = "<size=16><color=#ffff00>You can not build under the terrain</color></size>",
            }
            , this, "en");
            lang.RegisterMessages(new Dictionary<string, string> {
                ["blockWater"]
                = "<size=16><color=#ffff00>Вы не можете строить в воде глубже {0} метров</color></size>", ["blockHeight"] = "<size=16><color=#ffff00>Вы не можете строить выше {0} метров</color></size>", ["block"] = "<size=16><color=#ff0000>Вы не можете строить здесь</color></size>", ["blockIce"] = "<size=16><color=#ffff00>Вы не можете строить на айсберге</color></size>", ["blockTerrain"] = "<size=16><color=#ffff00>Вы не можете строить под рельефом</color></size>"
            }
            , this, "ru");
        }
        void Block(BaseNetworkable block, BasePlayer player, bool Height, bool Water) {
            if (usePermissions && !IsAllowed(player.UserIDString, permBS) && player.net.connection.authLevel < AuthLvl && block && !block.IsDestroyed) {
                Vector3 Pos = block.transform.position;
                if (Height || Water) {
                    float height = TerrainMeta.HeightMap.GetHeight(Pos);
                    if (Height && Pos.y - height > HeightBlock) {
                        Reply(player, Lang("blockHeight", player.UserIDString, HeightBlock));
                        block.Kill(BaseNetworkable.DestroyMode.Gib);
                        return;
                    }
                    else if (Water && height < 0 && height < WaterBlock && Pos.y < 2.8f ) {
                        Reply(player, Lang("blockWater", player.UserIDString, WaterBlock));
                        block.Kill(BaseNetworkable.DestroyMode.Gib);
                        return;
                    }
                }
                if (BlockInRock) {
                    Pos.y += 200;
                    RaycastHit[] hits = Physics.RaycastAll(Pos, Vector3.down, 199.0f);
                    Pos.y -= 200;
                    for (int i = 0; i < hits.Length; i++) {
                        RaycastHit hit = hits[i];
                        if (hit.collider) {
                            string ColName = hit.collider.name;
                            if ((ColName.StartsWith("rock", StringComparison.CurrentCultureIgnoreCase) || ColName.StartsWith("cliff", StringComparison.CurrentCultureIgnoreCase)) && (hit.point.y < Pos.y ? BlockInRock : hit.collider.bounds.Contains(Pos))) {
                                var buildingBlock = block.GetComponent<BuildingBlock>();
                                if (buildingBlock != null) {
                                    foreach (ItemAmount item in buildingBlock.blockDefinition.grades[(int)buildingBlock.grade].costToBuild) {
                                        player.inventory.GiveItem(ItemManager.CreateByItemID(item.itemid, (int)item.amount));
                                    }
                                }
                                Reply(player, Lang("block", player.UserIDString));
                                block.Kill(BaseNetworkable.DestroyMode.Gib);
                                break;
                            }
                        }
                    }
                }
                if (BlockOnIceberg) {
                    Pos.y += 200;
                    RaycastHit[] hits = Physics.RaycastAll(Pos, Vector3.down, 202.8f);
                    Pos.y -= 200;
                    for (int i = 0; i < hits.Length; i++) {
                        RaycastHit hit = hits[i];
                        if (hit.collider) {
                            string ColName = hit.collider.name;
                            if (BlockOnIceberg && ColName == "iceberg_COL") {
                                var buildingBlock = block.GetComponent<BuildingBlock>();
                                if (buildingBlock != null) {
                                    foreach (ItemAmount item in buildingBlock.blockDefinition.grades[(int)buildingBlock.grade].costToBuild) {
                                        player.inventory.GiveItem(ItemManager.CreateByItemID(item.itemid, (int)item.amount));
                                    }
                                }
                                Reply(player, Lang("blockIce", player.UserIDString));
                                block.Kill(BaseNetworkable.DestroyMode.Gib);
                                break;
                            }
                        }
                    }
                }
                if (BlockUnTerrain) {
                    Pos.y += 200;
                    RaycastHit[] hits = Physics.RaycastAll(Pos, Vector3.down, 199.0f);
                    Pos.y -= 200;
                    bool isMining = block is MiningQuarry;
                    for (int i = 0; i < hits.Length; i++) {
                        RaycastHit hit = hits[i];
                        if (hit.collider) {
                            string ColName = hit.collider.name;
                            if (BlockUnTerrain && !isMining && ColName == "Terrain" && hit.point.y > Pos.y) {
                                var buildingBlock = block.GetComponent<BuildingBlock>();
                                if (buildingBlock != null) {
                                    foreach (ItemAmount item in buildingBlock.blockDefinition.grades[(int)buildingBlock.grade].costToBuild) {
                                        player.inventory.GiveItem(ItemManager.CreateByItemID(item.itemid, (int)item.amount));
                                    }
                                }
                                Reply(player, Lang("blockTerrain", player.UserIDString));
                                block.Kill(BaseNetworkable.DestroyMode.Gib);
                                break;
                            }
                        }
                    }
                }
            }
        }
        string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
        void Reply(BasePlayer player, string message, string args = null) => PrintToChat(player, $"{message}", args);
        void OnEntityBuilt(Planner plan, GameObject obj) => Block(obj.GetComponent<BaseNetworkable>(), plan.GetOwnerPlayer(), BlockInHeight, BlockInWater);
        bool IsAllowed(string id, string perm) => permission.UserHasPermission(id, perm);
    }
}

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