From f6c1bc7d7fe03bcd13634f8e18ec65aa21530f34 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 1 Feb 2019 12:29:28 -0800 Subject: [PATCH 1/7] Makes chunk population more efficient Adds locale text. --- .../world/bentobox/caveblock/CaveBlock.java | 352 ++++++------- .../populators/EntitiesPopulator.java | 481 +++++++++--------- .../populators/MaterialPopulator.java | 323 ++++++------ src/main/resources/locales/en-US.yml | 224 ++++++++ 4 files changed, 822 insertions(+), 558 deletions(-) diff --git a/src/main/java/world/bentobox/caveblock/CaveBlock.java b/src/main/java/world/bentobox/caveblock/CaveBlock.java index b18dd1a..1fe9685 100644 --- a/src/main/java/world/bentobox/caveblock/CaveBlock.java +++ b/src/main/java/world/bentobox/caveblock/CaveBlock.java @@ -17,218 +17,218 @@ import world.bentobox.caveblock.generators.ChunkGeneratorWorld; public class CaveBlock extends GameModeAddon { - /** - * Executes code when loading the addon. This is called before {@link #onEnable()}. This should preferably - * be used to setup configuration and worlds. - */ - @Override - public void onLoad() - { - super.onLoad(); + /** + * Executes code when loading the addon. This is called before {@link #onEnable()}. This should preferably + * be used to setup configuration and worlds. + */ + @Override + public void onLoad() + { + super.onLoad(); - this.saveDefaultConfig(); - this.loadSettings(); - } + this.saveDefaultConfig(); + this.loadSettings(); + } - /** - * Executes code when enabling the addon. This is called after {@link #onLoad()}. - */ - @Override - public void onEnable() - { - this.playerCommand = new IslandCommand(this); - this.adminCommand = new AdminCommand(this); - } + /** + * Executes code when enabling the addon. This is called after {@link #onLoad()}. + */ + @Override + public void onEnable() + { + this.playerCommand = new IslandCommand(this); + this.adminCommand = new AdminCommand(this); + } - /** - * Executes code when reloading the addon. - */ - @Override - public void onReload() - { - super.onReload(); - this.loadSettings(); - } + /** + * Executes code when reloading the addon. + */ + @Override + public void onReload() + { + super.onReload(); + this.loadSettings(); + } - /** - * Executes code when disabling the addon. - */ - @Override - public void onDisable() - { - if (this.settings != null) - { - new Config<>(this, Settings.class).saveConfigObject(this.settings); - } - } + /** + * Executes code when disabling the addon. + */ + @Override + public void onDisable() + { + if (this.settings != null) + { + new Config<>(this, Settings.class).saveConfigObject(this.settings); + } + } - /** - * This method loads CaveBlock settings - */ - private void loadSettings() - { - this.settings = new Config<>(this, Settings.class).loadConfigObject(); + /** + * This method loads CaveBlock settings + */ + private void loadSettings() + { + this.settings = new Config<>(this, Settings.class).loadConfigObject(); - if (this.settings == null) - { - // Disable - this.logError("CaveBlock settings could not load! Addon disabled."); - this.setState(State.DISABLED); - } - } + if (this.settings == null) + { + // Disable + this.logError("CaveBlock settings could not load! Addon disabled."); + this.setState(State.DISABLED); + } + } -// --------------------------------------------------------------------- -// Section: World generators -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: World generators + // --------------------------------------------------------------------- - /** - * Make the worlds for this GameMode in this method. BentoBox will call it after onLoad() and before - * onEnable(). {@link #islandWorld} must be created and assigned, {@link #netherWorld} and {@link - * #endWorld} are optional and may be null. - */ - @Override - public void createWorlds() - { - String worldName = this.settings.getWorldName(); + /** + * Make the worlds for this GameMode in this method. BentoBox will call it after onLoad() and before + * onEnable(). {@link #islandWorld} must be created and assigned, {@link #netherWorld} and {@link + * #endWorld} are optional and may be null. + */ + @Override + public void createWorlds() + { + String worldName = this.settings.getWorldName(); - if (this.getServer().getWorld(worldName) == null) - { - this.getLogger().info("Creating CaveBlock world ..."); - } + if (this.getServer().getWorld(worldName) == null) + { + this.getLogger().info("Creating CaveBlock world ..."); + } - this.chunkGenerator = new ChunkGeneratorWorld(this); + this.chunkGenerator = new ChunkGeneratorWorld(this); - // Create the world if it does not exist - this.islandWorld = WorldCreator.name(worldName). - type(WorldType.FLAT). - environment(World.Environment.NORMAL). - generator(new ChunkGeneratorWorld(this)). - createWorld(); + // Create the world if it does not exist + this.islandWorld = WorldCreator.name(worldName). + type(WorldType.FLAT). + environment(World.Environment.NORMAL). + generator(this.chunkGenerator). + createWorld(); - // Make the nether if it does not exist - if (this.settings.isNetherGenerate()) - { - if (this.getServer().getWorld(worldName + NETHER) == null) - { - this.log("Creating CaveBlock's Nether..."); - } + // Make the nether if it does not exist + if (this.settings.isNetherGenerate()) + { + if (this.getServer().getWorld(worldName + NETHER) == null) + { + this.log("Creating CaveBlock's Nether..."); + } - if (!this.settings.isNetherIslands()) - { - this.netherWorld = WorldCreator.name(worldName + NETHER). - type(WorldType.NORMAL). - environment(World.Environment.NETHER). - createWorld(); - } - else - { - this.netherWorld = WorldCreator.name(worldName + NETHER). - type(WorldType.FLAT). - generator(new ChunkGeneratorWorld(this)). - environment(World.Environment.NETHER). - createWorld(); - } - } + if (!this.settings.isNetherIslands()) + { + this.netherWorld = WorldCreator.name(worldName + NETHER). + type(WorldType.NORMAL). + environment(World.Environment.NETHER). + createWorld(); + } + else + { + this.netherWorld = WorldCreator.name(worldName + NETHER). + type(WorldType.FLAT). + generator(this.chunkGenerator). + environment(World.Environment.NETHER). + createWorld(); + } + } - // Make the end if it does not exist - if (this.settings.isEndGenerate()) - { - if (this.getServer().getWorld(worldName + THE_END) == null) - { - this.log("Creating CaveBlock's End World..."); - } - if (!this.settings.isEndIslands()) - { - this.endWorld = WorldCreator.name(worldName + THE_END). - type(WorldType.NORMAL). - environment(World.Environment.THE_END). - createWorld(); - } - else - { - this.endWorld = WorldCreator.name(worldName + THE_END). - type(WorldType.FLAT). - generator(new ChunkGeneratorWorld(this)). - environment(World.Environment.THE_END). - createWorld(); - } - } - } + // Make the end if it does not exist + if (this.settings.isEndGenerate()) + { + if (this.getServer().getWorld(worldName + THE_END) == null) + { + this.log("Creating CaveBlock's End World..."); + } + if (!this.settings.isEndIslands()) + { + this.endWorld = WorldCreator.name(worldName + THE_END). + type(WorldType.NORMAL). + environment(World.Environment.THE_END). + createWorld(); + } + else + { + this.endWorld = WorldCreator.name(worldName + THE_END). + type(WorldType.FLAT). + generator(this.chunkGenerator). + environment(World.Environment.THE_END). + createWorld(); + } + } + } - /** - * Defines the world generator for this game mode - * - * @param worldName - name of world that this applies to - * @param id - id if any - * @return Chunk generator - * @since 1.2.0 - */ - @Override - public @NonNull ChunkGenerator getDefaultWorldGenerator(String worldName, String id) - { - return this.chunkGenerator; - } + /** + * Defines the world generator for this game mode + * + * @param worldName - name of world that this applies to + * @param id - id if any + * @return Chunk generator + * @since 1.2.0 + */ + @Override + public @NonNull ChunkGenerator getDefaultWorldGenerator(String worldName, String id) + { + return this.chunkGenerator; + } -// --------------------------------------------------------------------- -// Section: Getters -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Getters + // --------------------------------------------------------------------- - /** - * @return WorldSettings for this GameMode - */ - @Override - public WorldSettings getWorldSettings() - { - return this.settings; - } + /** + * @return WorldSettings for this GameMode + */ + @Override + public WorldSettings getWorldSettings() + { + return this.settings; + } - /** - * @return Settings for this GameMode - */ - public Settings getSettings() - { - return this.settings; - } + /** + * @return Settings for this GameMode + */ + public Settings getSettings() + { + return this.settings; + } -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- - /** - * This stores CaveBlock addon settings. - */ - private Settings settings; + /** + * This stores CaveBlock addon settings. + */ + private Settings settings; - /** - * This stores CaveBlock addon WorldGenerator. - */ - private ChunkGeneratorWorld chunkGenerator; + /** + * This stores CaveBlock addon WorldGenerator. + */ + private ChunkGeneratorWorld chunkGenerator; -// --------------------------------------------------------------------- -// Section: Constants -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Constants + // --------------------------------------------------------------------- - /** - * String for nether world. - */ - private static final String NETHER = "_nether"; + /** + * String for nether world. + */ + private static final String NETHER = "_nether"; - /** - * String for the end world. - */ - private static final String THE_END = "_the_end"; + /** + * String for the end world. + */ + private static final String THE_END = "_the_end"; } diff --git a/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java b/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java index 2a8db24..6b0c08f 100644 --- a/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java +++ b/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java @@ -1,14 +1,20 @@ package world.bentobox.caveblock.generators.populators; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.stream.Collectors; + import org.bukkit.Chunk; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.entity.EntityType; import org.bukkit.generator.BlockPopulator; -import java.util.*; -import java.util.stream.Collectors; import world.bentobox.bentobox.util.Pair; import world.bentobox.caveblock.CaveBlock; @@ -20,250 +26,267 @@ import world.bentobox.caveblock.Settings; */ public class EntitiesPopulator extends BlockPopulator { - /** - * This is default constructor - * @param addon CaveBlock addon. - */ - public EntitiesPopulator(CaveBlock addon) - { - this.addon = addon; - this.settings = addon.getSettings(); - } + + private Map chances; + + private final int generationTry; + + private int worldHeight; - /** - * This method populates chunk with entities. - * @param world World where population must be. - * @param random Randomness - * @param chunk Chunk were populator operates. - */ - @Override - public void populate(World world, Random random, Chunk chunk) - { - Map> entityChanceMap; - Material mainMaterial; - - if (world.getEnvironment().equals(World.Environment.NETHER)) - { - entityChanceMap = this.getEntityMap(this.settings.getNetherBlocks()); - mainMaterial = this.settings.getNetherMainBlock(); - } - else if (world.getEnvironment().equals(World.Environment.THE_END)) - { - entityChanceMap = this.getEntityMap(this.settings.getEndBlocks()); - mainMaterial = this.settings.getEndMainBlock(); - } - else - { - entityChanceMap = this.getEntityMap(this.settings.getNormalBlocks()); - mainMaterial = this.settings.getNormalMainBlock(); - } - - final int generationTry = this.settings.getNumberOfBlockGenerationTries(); - final int worldHeight = this.settings.getWorldDepth() - 1; - - for (Map.Entry> entry : entityChanceMap.entrySet()) - { - for (int subY = 0; subY < worldHeight; subY += 16) - { - for (int tries = 0; tries < generationTry; tries++) - { - if (random.nextInt(100) < entry.getValue().x) - { - int x = random.nextInt(15); - int z = random.nextInt(15); - int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); - - this.tryToPlaceEntity(world, chunk.getBlock(x, y, z), entry.getKey(), x, z, mainMaterial); - } - } - } - } - } + /** + * This is default constructor + * @param addon CaveBlock addon. + */ + public EntitiesPopulator(CaveBlock addon) + { + this.addon = addon; + this.settings = addon.getSettings(); + // Set up chances + chances = new HashMap<>(); + // Normal + chances.put(Environment.NORMAL, new Chances(this.getEntityMap(this.settings.getNormalBlocks()), this.settings.getNormalMainBlock())); + // Nether + chances.put(Environment.NETHER, new Chances(this.getEntityMap(this.settings.getNetherBlocks()), this.settings.getNetherMainBlock())); + // End + chances.put(Environment.THE_END, new Chances(this.getEntityMap(this.settings.getEndBlocks()), this.settings.getEndMainBlock())); + // Other settings + generationTry = this.settings.getNumberOfBlockGenerationTries(); + worldHeight = this.settings.getWorldDepth() - 1; + } - /** - * This method returns Entity frequently and pack size map. - * @param objectList List with objects that contains data. - * @return Map that contains entity, its rarity and pack size. - */ - private Map> getEntityMap(List objectList) - { - Map> entityMap = new HashMap<>(objectList.size()); + /** + * This method populates chunk with entities. + * @param world World where population must be. + * @param random Randomness + * @param chunk Chunk were populator operates. + */ + @Override + public void populate(World world, Random random, Chunk chunk) + { + for (Map.Entry> entry : chances.get(world.getEnvironment()).entityChanceMap.entrySet()) + { + for (int subY = 0; subY < worldHeight; subY += 16) + { + for (int tries = 0; tries < generationTry; tries++) + { + if (random.nextInt(100) < entry.getValue().x) + { + int x = random.nextInt(15); + int z = random.nextInt(15); + int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); - Map entityTypeMap = Arrays.stream(EntityType.values()). - collect(Collectors.toMap(Enum::name, - entityType -> entityType, - (a, b) -> b, - () -> new HashMap<>(EntityType.values().length))); - - // wrong material object. - objectList.stream(). - filter(object -> object.startsWith("ENTITY")). - map(object -> object.split(":")). - filter(splitString -> splitString.length == 4). - forEach(splitString -> { - EntityType entity = entityTypeMap.getOrDefault(splitString[1], null); - - if (entity != null) - { - entityMap.put(entity, - new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3]))); - } - }); - - return entityMap; - } + this.tryToPlaceEntity(world, chunk.getBlock(x, y, z), entry.getKey(), x, z, chances.get(world.getEnvironment()).mainMaterial); + } + } + } + } + } - /** - * This method checks if all chunks around given block is generated. - * @param world World in which block is located - * @param block Block that must be checked. - * @param x Block x-index in chunk - * @param z Block z-index in chunk - * @return true, if all chunks around given block are generated. - */ - private boolean isValidBlock(World world, Block block, int x, int z) - { - return x > 0 && x < 15 && z > 0 && z < 15 || - world.isChunkGenerated(block.getX() + 1, block.getZ()) && - world.isChunkGenerated(block.getX() - 1, block.getZ()) && - world.isChunkGenerated(block.getX(), block.getZ() - 1) && - world.isChunkGenerated(block.getX(), block.getZ() + 1); - } + /** + * This method returns Entity frequently and pack size map. + * @param objectList List with objects that contains data. + * @return Map that contains entity, its rarity and pack size. + */ + private Map> getEntityMap(List objectList) + { + Map> entityMap = new HashMap<>(objectList.size()); + + Map entityTypeMap = Arrays.stream(EntityType.values()). + collect(Collectors.toMap(Enum::name, + entityType -> entityType, + (a, b) -> b, + () -> new HashMap<>(EntityType.values().length))); + + // wrong material object. + objectList.stream(). + filter(object -> object.startsWith("ENTITY")). + map(object -> object.split(":")). + filter(splitString -> splitString.length == 4). + forEach(splitString -> { + EntityType entity = entityTypeMap.getOrDefault(splitString[1], null); + + if (entity != null) + { + entityMap.put(entity, + new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3]))); + } + }); + + return entityMap; + } - /** - * This method is not completed. It must reserve space for entities to spawn, but - * current implementation just allows to spawn 2 high mobs that can be in single - * place. - * @param world - World were mob must be spawned. - * @param block - Block that was choosed by random. - * @param entity - Entity that must be spawned. - * @param x - ChunkX coordinate. - * @param z - ChunkY coordinate. - * @param originalMaterial - replacement manterial. - */ - private void tryToPlaceEntity(World world, Block block, EntityType entity, int x, int z, Material originalMaterial) - { - if (this.isValidBlock(world, block, x, z) && block.getType().equals(originalMaterial)) - { - if (entity.isAlive()) - { - int height = 0; - int width = 0; - int length = 0; - boolean water = false; + /** + * This method checks if all chunks around given block is generated. + * @param world World in which block is located + * @param block Block that must be checked. + * @param x Block x-index in chunk + * @param z Block z-index in chunk + * @return true, if all chunks around given block are generated. + */ + private boolean isValidBlock(World world, Block block, int x, int z) + { + return x > 0 && x < 15 && z > 0 && z < 15 || + world.isChunkGenerated(block.getX() + 1, block.getZ()) && + world.isChunkGenerated(block.getX() - 1, block.getZ()) && + world.isChunkGenerated(block.getX(), block.getZ() - 1) && + world.isChunkGenerated(block.getX(), block.getZ() + 1); + } - switch (entity) - { - case SPIDER: - width = 1; - length = 1; - break; - case SLIME: - case ELDER_GUARDIAN: - case GHAST: - case MAGMA_CUBE: - case WITHER: - height = 2; - width = 2; - length = 2; - break; - case ENDERMAN: - case IRON_GOLEM: - height = 2; - break; - case WITHER_SKELETON: - case STRAY: - case HUSK: - case ZOMBIE_VILLAGER: - case EVOKER: - case VINDICATOR: - case ILLUSIONER: - case CREEPER: - case SKELETON: - case ZOMBIE: - case BLAZE: - case SNOWMAN: - case VILLAGER: - case PIG_ZOMBIE: - case WITCH: - case SHULKER: - case SHEEP: - case COW: - case MUSHROOM_COW: - height = 12; - break; - case SKELETON_HORSE: - case ZOMBIE_HORSE: - case DONKEY: - case MULE: - case HORSE: - case POLAR_BEAR: - case LLAMA: - height = 1; - width = 1; - break; - case GUARDIAN: - case SQUID: - case COD: - case SALMON: - case PUFFERFISH: - case TROPICAL_FISH: - water = true; - break; - case DROWNED: - case DOLPHIN: - water = true; - height = 1; - break; - } - Block otherBlock = world.getBlockAt(block.getX(), block.getY() + 1, block.getZ()); + /** + * This method is not completed. It must reserve space for entities to spawn, but + * current implementation just allows to spawn 2 high mobs that can be in single + * place. + * @param world - World were mob must be spawned. + * @param block - Block that was choosed by random. + * @param entity - Entity that must be spawned. + * @param x - ChunkX coordinate. + * @param z - ChunkY coordinate. + * @param originalMaterial - replacement manterial. + */ + private void tryToPlaceEntity(World world, Block block, EntityType entity, int x, int z, Material originalMaterial) + { + if (this.isValidBlock(world, block, x, z) && block.getType().equals(originalMaterial)) + { + if (entity.isAlive()) + { + int height = 0; + int width = 0; + int length = 0; + boolean water = false; - if (!otherBlock.getType().equals(originalMaterial)) - { - otherBlock = world.getBlockAt(block.getX(), block.getY() - 1, block.getZ()); - } + switch (entity) + { + case SPIDER: + width = 1; + length = 1; + break; + case SLIME: + case ELDER_GUARDIAN: + case GHAST: + case MAGMA_CUBE: + case WITHER: + height = 2; + width = 2; + length = 2; + break; + case ENDERMAN: + case IRON_GOLEM: + height = 2; + break; + case WITHER_SKELETON: + case STRAY: + case HUSK: + case ZOMBIE_VILLAGER: + case EVOKER: + case VINDICATOR: + case ILLUSIONER: + case CREEPER: + case SKELETON: + case ZOMBIE: + case BLAZE: + case SNOWMAN: + case VILLAGER: + case PIG_ZOMBIE: + case WITCH: + case SHULKER: + case SHEEP: + case COW: + case MUSHROOM_COW: + height = 12; + break; + case SKELETON_HORSE: + case ZOMBIE_HORSE: + case DONKEY: + case MULE: + case HORSE: + case POLAR_BEAR: + case LLAMA: + height = 1; + width = 1; + break; + case GUARDIAN: + case SQUID: + case COD: + case SALMON: + case PUFFERFISH: + case TROPICAL_FISH: + water = true; + break; + case DROWNED: + case DOLPHIN: + water = true; + height = 1; + break; + default: + break; + } - if (otherBlock.getType().equals(originalMaterial)) - { - block.setType(Material.CAVE_AIR); - otherBlock.setType(Material.CAVE_AIR); + Block otherBlock = world.getBlockAt(block.getX(), block.getY() + 1, block.getZ()); - if (otherBlock.getY() < block.getY()) - { - world.spawnEntity(otherBlock.getLocation(), entity); - } - else - { - world.spawnEntity(block.getLocation(), entity); - } - } - } - else - { - block.setType(Material.CAVE_AIR); - world.spawnEntity(block.getLocation(), entity); - } - } - } + if (!otherBlock.getType().equals(originalMaterial)) + { + otherBlock = world.getBlockAt(block.getX(), block.getY() - 1, block.getZ()); + } + + if (otherBlock.getType().equals(originalMaterial)) + { + block.setType(Material.CAVE_AIR); + otherBlock.setType(Material.CAVE_AIR); + + if (otherBlock.getY() < block.getY()) + { + world.spawnEntity(otherBlock.getLocation(), entity); + } + else + { + world.spawnEntity(block.getLocation(), entity); + } + } + } + else + { + block.setType(Material.CAVE_AIR); + world.spawnEntity(block.getLocation(), entity); + } + } + } -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- - /** - * CaveBlock addon. - */ - private CaveBlock addon; + /** + * CaveBlock addon. + */ + private CaveBlock addon; - /** - * CaveBlock settings. - */ - private Settings settings; + /** + * CaveBlock settings. + */ + private Settings settings; + + /** + * Chances class to store chances for environments and main material + * + */ + private class Chances { + final Map> entityChanceMap; + final Material mainMaterial; + + /** + * @param materialChanceMap + * @param mainMaterial + */ + public Chances(Map> entityChanceMap, Material mainMaterial) { + this.entityChanceMap = entityChanceMap; + this.mainMaterial = mainMaterial; + } + } } diff --git a/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java b/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java index b0b26ee..855ce75 100644 --- a/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java +++ b/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java @@ -2,16 +2,18 @@ package world.bentobox.caveblock.generators.populators; -import org.bukkit.Chunk; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.generator.BlockPopulator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.block.Block; +import org.bukkit.generator.BlockPopulator; + import world.bentobox.bentobox.util.Pair; import world.bentobox.caveblock.CaveBlock; import world.bentobox.caveblock.Settings; @@ -22,173 +24,188 @@ import world.bentobox.caveblock.Settings; */ public class MaterialPopulator extends BlockPopulator { - /** - * This is default constructor - * @param addon CaveBlock addon. - */ - public MaterialPopulator(CaveBlock addon) - { - this.addon = addon; - this.settings = addon.getSettings(); - } + private Map chances; + + private final int generationTry; + + private int worldHeight; + + /** + * This is default constructor + * @param addon CaveBlock addon. + */ + public MaterialPopulator(CaveBlock addon) + { + this.addon = addon; + this.settings = addon.getSettings(); + // Set up chances + chances = new HashMap<>(); + // Normal + chances.put(Environment.NORMAL, new Chances(this.getMaterialMap(this.settings.getNormalBlocks()), this.settings.getNormalMainBlock())); + // Nether + chances.put(Environment.NETHER, new Chances(this.getMaterialMap(this.settings.getNetherBlocks()), this.settings.getNetherMainBlock())); + // End + chances.put(Environment.THE_END, new Chances(this.getMaterialMap(this.settings.getEndBlocks()), this.settings.getEndMainBlock())); + // Other settings + generationTry = this.settings.getNumberOfBlockGenerationTries(); + worldHeight = this.settings.getWorldDepth() - 1; + + } - /** - * This method populates chunk with blocks. - * @param world World where population must be. - * @param random Randomness - * @param chunk Chunk were populator operates. - */ - @Override - public void populate(World world, Random random, Chunk chunk) - { - Map> materialChanceMap; - Material mainMaterial; + /** + * This method populates chunk with blocks. + * @param world World where population must be. + * @param random Randomness + * @param chunk Chunk were populator operates. + */ + @Override + public void populate(World world, Random random, Chunk chunk) + { + for (Map.Entry> entry : chances.get(world.getEnvironment()).materialChanceMap.entrySet()) + { + for (int subY = 0; subY < worldHeight; subY += 16) + { + for (int tries = 0; tries < generationTry; tries++) + { + if (random.nextInt(100) < entry.getValue().x) + { + int x = random.nextInt(15); + int z = random.nextInt(15); + int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); - if (world.getEnvironment().equals(World.Environment.NETHER)) - { - materialChanceMap = this.getMaterialMap(this.settings.getNetherBlocks()); - mainMaterial = this.settings.getNetherMainBlock(); - } - else if (world.getEnvironment().equals(World.Environment.THE_END)) - { - materialChanceMap = this.getMaterialMap(this.settings.getEndBlocks()); - mainMaterial = this.settings.getEndMainBlock(); - } - else - { - materialChanceMap = this.getMaterialMap(this.settings.getNormalBlocks()); - mainMaterial = this.settings.getNormalMainBlock(); - } + Block block = chunk.getBlock(x, y, z); - final int generationTry = this.settings.getNumberOfBlockGenerationTries(); - final int worldHeight = this.settings.getWorldDepth() - 1; + if (block.getType().equals(chances.get(world.getEnvironment()).mainMaterial) && + this.isValidBlock(world, block, x, z)) + { + int packSize = random.nextInt(entry.getValue().z); - for (Map.Entry> entry : materialChanceMap.entrySet()) - { - for (int subY = 0; subY < worldHeight; subY += 16) - { - for (int tries = 0; tries < generationTry; tries++) - { - if (random.nextInt(100) < entry.getValue().x) - { - int x = random.nextInt(15); - int z = random.nextInt(15); - int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); + boolean continuePlacing = true; - Block block = chunk.getBlock(x, y, z); + while (continuePlacing) + { + if (!block.getType().equals(entry.getKey())) + { + block.setType(entry.getKey()); + packSize--; + } - if (block.getType().equals(mainMaterial) && - this.isValidBlock(world, block, x, z)) - { - int packSize = random.nextInt(entry.getValue().z); + // The direction chooser + switch (random.nextInt(5)) + { + case 0: + x = Math.min(15, x + 1); + break; + case 1: + y = Math.min(worldHeight - 2, y + 1); + break; + case 2: + z = Math.min(15, z + 1); + break; + case 3: + x = Math.max(0, x - 1); + break; + case 4: + y = Math.max(1, y - 1); + break; + case 5: + z = Math.max(0, z - 1); + break; + } - boolean continuePlacing = true; + block = chunk.getBlock(x, y, z); - while (continuePlacing) - { - if (!block.getType().equals(entry.getKey())) - { - block.setType(entry.getKey()); - packSize--; - } - - // The direction chooser - switch (random.nextInt(5)) - { - case 0: - x = Math.min(15, x + 1); - break; - case 1: - y = Math.min(worldHeight - 2, y + 1); - break; - case 2: - z = Math.min(15, z + 1); - break; - case 3: - x = Math.max(0, x - 1); - break; - case 4: - y = Math.max(1, y - 1); - break; - case 5: - z = Math.max(0, z - 1); - break; - } - - block = chunk.getBlock(x, y, z); - - continuePlacing = this.isValidBlock(world, block, x, z) && - packSize > 0 && - (block.getType().equals(mainMaterial) || - block.getType().equals(entry.getKey())); - } - } - } - } - } - } - } + continuePlacing = this.isValidBlock(world, block, x, z) && + packSize > 0 && + (block.getType().equals(chances.get(world.getEnvironment()).mainMaterial) || + block.getType().equals(entry.getKey())); + } + } + } + } + } + } + } - /** - * This method checks if all chunks around given block is generated. - * @param world World in which block is located - * @param block Block that must be checked. - * @param x Block x-index in chunk - * @param z Block z-index in chunk - * @return true, if all chunks around given block are generated. - */ - private boolean isValidBlock(World world, Block block, int x, int z) - { - return x > 0 && x < 15 && z > 0 && z < 15 || - world.isChunkGenerated(block.getX() + 1, block.getZ()) && - world.isChunkGenerated(block.getX() - 1, block.getZ()) && - world.isChunkGenerated(block.getX(), block.getZ() - 1) && - world.isChunkGenerated(block.getX(), block.getZ() + 1); - } + /** + * This method checks if all chunks around given block is generated. + * @param world World in which block is located + * @param block Block that must be checked. + * @param x Block x-index in chunk + * @param z Block z-index in chunk + * @return true, if all chunks around given block are generated. + */ + private boolean isValidBlock(World world, Block block, int x, int z) + { + return x > 0 && x < 15 && z > 0 && z < 15 || + world.isChunkGenerated(block.getX() + 1, block.getZ()) && + world.isChunkGenerated(block.getX() - 1, block.getZ()) && + world.isChunkGenerated(block.getX(), block.getZ() - 1) && + world.isChunkGenerated(block.getX(), block.getZ() + 1); + } - /** - * This method returns material frequently and pack size map. - * @param objectList List with objects that contains data. - * @return Map that contains material, its rarity and pack size. - */ - private Map> getMaterialMap(List objectList) - { - Map> materialMap = new HashMap<>(objectList.size()); + /** + * This method returns material frequently and pack size map. + * @param objectList List with objects that contains data. + * @return Map that contains material, its rarity and pack size. + */ + private Map> getMaterialMap(List objectList) + { + Map> materialMap = new HashMap<>(objectList.size()); - // wrong material object. - objectList.stream(). - filter(object -> object.startsWith("MATERIAL")). - map(object -> object.split(":")). - filter(splitString -> splitString.length == 4). - forEach(splitString -> { - Material material = Material.getMaterial(splitString[1]); + // wrong material object. + objectList.stream(). + filter(object -> object.startsWith("MATERIAL")). + map(object -> object.split(":")). + filter(splitString -> splitString.length == 4). + forEach(splitString -> { + Material material = Material.getMaterial(splitString[1]); - if (material != null) - { - materialMap.put(material, - new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3]))); - } - }); + if (material != null) + { + materialMap.put(material, + new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3]))); + } + }); - return materialMap; - } + return materialMap; + } -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- - /** - * CaveBlock addon. - */ - private CaveBlock addon; + /** + * CaveBlock addon. + */ + private CaveBlock addon; - /** - * CaveBlock settings. - */ - private Settings settings; + /** + * CaveBlock settings. + */ + private Settings settings; + + + /** + * Chances class to store chances for environments and main material + * + */ + private class Chances { + final Map> materialChanceMap; + final Material mainMaterial; + + /** + * @param materialChanceMap + * @param mainMaterial + */ + public Chances(Map> materialChanceMap, Material mainMaterial) { + this.materialChanceMap = materialChanceMap; + this.mainMaterial = mainMaterial; + } + } } diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 098b998..982cf85 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -9,4 +9,228 @@ caveblock: line1: "Welcome!" line2: "[name]" line3: "Start digging! &c<3" + # Override BentoBox default command strings + # General strings + general: + errors: + no-island: "&cYou do not have a cave!" + player-has-island: "&cPlayer already has a cave!" + player-has-no-island: "&cThat player has no cave!" + already-have-island: "&cYou already have a cave!" + no-safe-location: "&cNo safe location found!" + not-owner: "&cYou are not the owner of your team!" + commands: + # Override BentoBox default island command strings + island: + info: + description: "display info about your cave or the player's cave" + go: + description: "teleport you to your cave" + teleport: "&aTeleporting you to your cave." + create: + description: "create a cave, using optional schem (requires permission)" + too-many-islands: "&cThere are too many caves in this world: there isn't enough room for yours to be created." + unable-create-island: "&cYour cave could not be generated, please contact an administrator." + creating-island: "&aCreating your cave, please wait a moment..." + reset: + description: "restart your cave from scratch" + parameters: "" + must-remove-members: "&cYou must remove all team players before you can restart (/[label] team kick )." + sethome: + must-be-on-your-island: "&cYou must be in your cave to set home!" + home-set: "&6Your home has been set to your current location." + setname: + description: "set a name for your cave" + resetname: + description: "reset your cave name" + team: + coop: + description: "make a player coop rank" + uncoop: + you-are-no-longer-a-coop-member: "&cYou are no longer a coop member of [name]'s cave" + all-members-logged-off: "&cAll team members logged off so you are no longer a coop member of [name]'s cave" + trust: + description: "give a player trusted rank" + invite: + description: "invite a player to join your team" + name-has-invited-you: "&a[name] has invited you to join their team." + to-accept-or-reject: "&aDo /[label] team accept to accept, or /[label] team reject to reject" + you-will-lose-your-island: "&cWARNING! You will lose your our cave if you accept!" + errors: + island-is-full: "&cYour team is full, you can't invite anyone else." + accept: + you-joined-island: "&aYou joined a team! Use /[label] team info to see the other members." + name-joined-your-island: "&a[name] joined your team!" + confirmation: |- + &cAre you sure you want to accept this invite? + &c&lThis will &nDESTORY &r&c&lyour current cave! + reject: + you-rejected-invite: "&aYou rejected the invitation to join a team." + name-rejected-your-invite: "&c[name] rejected your invite!" + cancel: + description: "cancel the pending invite to join your team" + leave: + description: "leave your team" + left-your-island: "&c[name] &cleft your team" + kick: + description: "remove a team member" + owner-kicked: "&cThe owner kicked you from the team!" + demote: + description: "demote a player one rank" + promote: + description: "promote a player one rank" + setowner: + description: "transfer team ownership to a member" + errors: + target-is-not-member: "&cThat player is not part of your team!" + name-is-the-owner: "&a[name] is now the cave owner!" + you-are-the-owner: "&aYou are now the cave owner!" + ban: + description: "ban a player from your cave" + cannot-ban-more-players: "&cYou reached the ban limit, you cannot ban any more players." + owner-banned-you: "&b[name]&c banned you from their cave!" + you-are-banned: "&bYou are banned from this cave!" + unban: + description: "unban a player from your cave" + you-are-unbanned: "&b[name]&a unbanned you from their cave!" + banlist: + noone: "&aNo one is banned on this cave" + settings: + description: "display cave settings" + # Admin commands + admin: + team: + add: + name-has-island: "&c[name] has a cave. Unregister or delete them first!" + setowner: + description: "transfers cave ownership to the player" + already-owner: "&cPlayer is already the owner of this cave!" + range: + description: "Admin cave range command" + display: + description: "Show/hide cave range indicators" + hint: |- + &cRed Barrier icons &fshow the current protected range limit. + &7Gray Particles &fshow the max limit. + &aGreen Particles &fshow the default protected range if the protection range differs from it. + set: + description: "Sets the cave protected range" + reset: + description: "Resets the protected range to the world default" + register: + parameters: "" + description: "register player to unowned cave you are in" + registered-island: "&aRegistered player to cave at [xyz]." + already-owned: "&ccave is already owned by another player!" + no-island-here: "&cThere is no player cave here. Confirm to make one." + in-deletion: "&cThis space is currently being regenerated. Try later." + unregister: + description: "unregister owner from a cave, but keep cave blocks as-is" + unregistered-island: "&aUnregistered player from cave at [xyz]." + info: + parameters: "" + description: "get info on where you are or on player" + no-island: "&cYou are not in a registered cave right now..." + title: "========== Cave Info ============" + owner: "Owner: [owner] ([uuid])" + last-login: "Last login: [date]" + deaths: "Deaths: [number]" + resets-left: "Resets: [number] (Max: [total])" + team-members-title: "Team members:" + team-owner-format: "&a[name] [rank]" + team-member-format: "&b[name] [rank]" + island-location: "Cave location: [xyz]" + island-coords: "Cave coordinates: [xz1] to [xz2]" + protection-range: "Protection range: [range]" + max-protection-range: "Largest historical protection range: [range]" + protection-coords: "Protection coordinates: [xz1] to [xz2]" + is-spawn: "Cave is a spawn cave" + banned-players: "Banned players:" + banned-format: "&c[name]" + unowned: "&cUnowned" + setrange: + description: "set the range of player's cave" + range-updated: "Cave range updated to [number]" + tp: + parameters: "" + description: "teleport to a player's cave" + getrank: + description: "get a player's rank in their cave" + rank-is: "&aRank is [rank] in their cave." + setrank: + description: "set a player's rank in their cave" + setspawn: + description: "set a cave as spawn for this world" + already-spawn: "&cThis cave is already a spawn!" + no-island-here: "&cThere is no registered cave here." + confirmation: "&cAre you sure you want to set this cave as the spawn for this world?" + delete: + parameters: "" + description: "deletes a player and regenerates their cave" + cannot-delete-owner: "&cAll team members must be kicked before deleting." + deleted-island: "&aCave at &e[xyz] &ahas been successfully regenerated." + + protection: + flags: + ELYTRA: + description: "Toggle use" + ENDERMAN_GRIEFING: + description: |- + &aEndermen can remove + &ablocks + ENTER_EXIT_MESSAGES: + description: "Display entry and exit messages" + island: "[name]'s protected cave" + name: "Enter/Exit messages" + now-entering: "&bNow entering [name]" + now-leaving: "&bNow leaving [name]" + GEO_LIMIT_MOBS: + description: |- + &aRemove mobs that go + &aoutside protected + &aplayer space + name: "&eLimit mobs to player cave" + ISLAND_RESPAWN: + description: |- + &aPlayers respawn + &ain their cave + name: "Cave respawn" + LOCK: + name: "Lock player cave" + OFFLINE_REDSTONE: + description: |- + &aWhen disabled, redstone + &awill not operate in caves + &awhere all members are offline. + &aMay help reduce lag. + PISTON_PUSH: + description: |- + &aAllow pistons to push + &ablocks outside a player's cave + PVP_OVERWORLD: + description: |- + &cEnable/Disable PVP + &cin protected cave. + REMOVE_MOBS: + description: |- + &aRemove monsters when + &ateleporting to a cave + PREVENT_TELEPORT_WHEN_FALLING: + description: |- + &aPrevent players from teleporting + &aif they are falling. + hint: "&cYou cannot teleport while you are falling!" + locked: "&cThis cave is locked!" + protected: "&ccave protected: [description]" + + panel: + PROTECTION: + title: "&6Protection" + description: |- + &aProtection settings + &afor this cave + SETTING: + description: |- + &aGeneral settings + &afor this cave \ No newline at end of file From 215f8efb69f431cd571e6f40ce855211afd16bf9 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 2 Feb 2019 11:47:48 -0800 Subject: [PATCH 2/7] Enables entity setting and config reloading Tweaks to config.yml to be more cave-y. Entities are set to not despawn. Probabilities of materials and entities can have decimals and be sub 1% if required. For some entities, 1% was too high a rate. Adds a debug setting in config.yml that will enable you to see where entities have been spawned. It can be removed at some point. --- .gitignore | 1 + .../world/bentobox/caveblock/CaveBlock.java | 1 + .../world/bentobox/caveblock/Settings.java | 3788 +++++++++-------- .../generators/ChunkGeneratorWorld.java | 324 +- .../populators/EntitiesPopulator.java | 232 +- .../populators/MaterialPopulator.java | 163 +- src/main/resources/config.yml | 57 +- 7 files changed, 2239 insertions(+), 2327 deletions(-) diff --git a/.gitignore b/.gitignore index a1c2a23..c836fce 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +/target/ diff --git a/src/main/java/world/bentobox/caveblock/CaveBlock.java b/src/main/java/world/bentobox/caveblock/CaveBlock.java index 1fe9685..a117452 100644 --- a/src/main/java/world/bentobox/caveblock/CaveBlock.java +++ b/src/main/java/world/bentobox/caveblock/CaveBlock.java @@ -50,6 +50,7 @@ public class CaveBlock extends GameModeAddon { super.onReload(); this.loadSettings(); + this.chunkGenerator.reload(); } diff --git a/src/main/java/world/bentobox/caveblock/Settings.java b/src/main/java/world/bentobox/caveblock/Settings.java index 06774b7..9835640 100644 --- a/src/main/java/world/bentobox/caveblock/Settings.java +++ b/src/main/java/world/bentobox/caveblock/Settings.java @@ -1,12 +1,18 @@ package world.bentobox.caveblock; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.entity.EntityType; -import java.util.*; import world.bentobox.bentobox.api.configuration.ConfigComment; import world.bentobox.bentobox.api.configuration.ConfigEntry; @@ -26,1898 +32,1894 @@ import world.bentobox.bentobox.database.objects.adapters.FlagSerializer2; @StoreAt(filename="config.yml", path="addons/CaveBlock") @ConfigComment("CaveBlock Configuration [version]") @ConfigComment("This config file is dynamic and saved when the server is shutdown.") -@ConfigComment("You cannot edit it while the server is running because changes will") -@ConfigComment("be lost! Use in-game settings GUI or edit when server is offline.") +@ConfigComment("If you edit it while the server is running use /cbadmin reload") +@ConfigComment("otherwise your settings will be lost.") public class Settings implements DataObject, WorldSettings { -// --------------------------------------------------------------------- -// Section: Getters -// --------------------------------------------------------------------- - - - /** - * @return the uniqueId - */ - @Override - public String getUniqueId() - { - return this.uniqueId; - } - - - /** - * This method returns the friendlyName object. - * @return the friendlyName object. - */ - @Override - public String getFriendlyName() - { - return friendlyName; - } - - - /** - * This method returns the worldName object. - * @return the worldName object. - */ - @Override - public String getWorldName() - { - return worldName; - } - - - /** - * This method returns the difficulty object. - * @return the difficulty object. - */ - @Override - public Difficulty getDifficulty() - { - return difficulty; - } - - - /** - * This method returns the islandDistance object. - * @return the islandDistance object. - */ - @Override - public int getIslandDistance() - { - return islandDistance; - } - - - /** - * This method returns the islandProtectionRange object. - * @return the islandProtectionRange object. - */ - @Override - public int getIslandProtectionRange() - { - return islandProtectionRange; - } - - - /** - * This method returns the islandStartX object. - * @return the islandStartX object. - */ - @Override - public int getIslandStartX() - { - return islandStartX; - } - - - /** - * This method returns the islandStartZ object. - * @return the islandStartZ object. - */ - @Override - public int getIslandStartZ() - { - return islandStartZ; - } - - - /** - * This method returns the islandXOffset object. - * @return the islandXOffset object. - */ - @Override - public int getIslandXOffset() - { - return islandXOffset; - } - - - /** - * This method returns the islandZOffset object. - * @return the islandZOffset object. - */ - @Override - public int getIslandZOffset() - { - return islandZOffset; - } - - - /** - * This method returns the islandHeight object. - * @return the islandHeight object. - */ - @Override - public int getIslandHeight() - { - return islandHeight; - } - - - /** - * This method returns the useOwnGenerator object. - * @return the useOwnGenerator object. - */ - @Override - public boolean isUseOwnGenerator() - { - return useOwnGenerator; - } - - - /** - * This method returns the seaHeight object. - * @return the seaHeight object. - */ - @Override - public int getSeaHeight() - { - return seaHeight; - } - - - /** - * 0 or -1 is unlimited. It will block island creation if the island count for the world is higher than this. - * @return the maxIslands - */ - @Override - public int getMaxIslands() - { - return maxIslands; - } - - - /** - * This method returns the defaultGameMode object. - * @return the defaultGameMode object. - */ - @Override - public GameMode getDefaultGameMode() - { - return defaultGameMode; - } - - - /** - * This method returns the defaultBiome object. - * @return the defaultBiome object. - */ - public Biome getDefaultBiome() - { - return defaultBiome; - } - - - /** - * This method returns the banLimit object. - * @return the banLimit object. - */ - @Override - public int getBanLimit() - { - return banLimit; - } - - - /** - * This method returns the netherGenerate object. - * @return the netherGenerate object. - */ - @Override - public boolean isNetherGenerate() - { - return netherGenerate; - } - - - /** - * This method returns the netherIslands object. - * @return the netherIslands object. - */ - @Override - public boolean isNetherIslands() - { - return netherIslands; - } - - - /** - * This method returns the netherTrees object. - * @return the netherTrees object. - */ - @Override - public boolean isNetherTrees() - { - return netherTrees; - } - - - /** - * This method returns the netherRoof object. - * @return the netherRoof object. - */ - public boolean isNetherRoof() - { - return netherRoof; - } - - - /** - * This method returns the netherSpawnRadius object. - * @return the netherSpawnRadius object. - */ - @Override - public int getNetherSpawnRadius() - { - return netherSpawnRadius; - } - - - /** - * This method returns the endGenerate object. - * @return the endGenerate object. - */ - @Override - public boolean isEndGenerate() - { - return endGenerate; - } - - - /** - * This method returns the endIslands object. - * @return the endIslands object. - */ - @Override - public boolean isEndIslands() - { - return endIslands; - } - - - /** - * This method returns the dragonSpawn object. - * @return the dragonSpawn object. - */ - @Override - public boolean isDragonSpawn() - { - return dragonSpawn; - } - - - /** - * This method returns the removeMobsWhitelist object. - * @return the removeMobsWhitelist object. - */ - @Override - public Set getRemoveMobsWhitelist() - { - return removeMobsWhitelist; - } - - - /** - * This method returns the worldFlags object. - * @return the worldFlags object. - */ - @Override - public Map getWorldFlags() - { - return worldFlags; - } - - - /** - * This method returns the defaultIslandFlags object. - * @return the defaultIslandFlags object. - */ - @Override - public Map getDefaultIslandFlags() - { - return defaultIslandFlags; - } - - - /** - * This method returns the defaultIslandSettings object. - * @return the defaultIslandSettings object. - */ - @Override - public Map getDefaultIslandSettings() - { - return defaultIslandSettings; - } - - - /** - * This method returns the visibleSettings object. - * @return the visibleSettings object. - */ - @Override - public List getVisibleSettings() - { - return visibleSettings; - } - - - /** - * This method returns the visitorBannedCommands object. - * @return the visitorBannedCommands object. - */ - @Override - public List getVisitorBannedCommands() - { - return visitorBannedCommands; - } - - - /** - * This method returns the maxTeamSize object. - * @return the maxTeamSize object. - */ - @Override - public int getMaxTeamSize() - { - return maxTeamSize; - } - - - /** - * This method returns the maxHomes object. - * @return the maxHomes object. - */ - @Override - public int getMaxHomes() - { - return maxHomes; - } - - - /** - * This method returns the resetLimit object. - * @return the resetLimit object. - */ - @Override - public int getResetLimit() - { - return resetLimit; - } - - - /** - * This method returns the resetConfirmation object. - * @return the resetConfirmation object. - */ - public boolean isResetConfirmation() - { - return resetConfirmation; - } - - - /** - * This method returns the leaversLoseReset object. - * @return the leaversLoseReset object. - */ - public boolean isLeaversLoseReset() - { - return leaversLoseReset; - } - - - /** - * This method returns the kickedKeepInventory object. - * @return the kickedKeepInventory object. - */ - public boolean isKickedKeepInventory() - { - return kickedKeepInventory; - } - - - /** - * This method returns the onJoinResetMoney object. - * @return the onJoinResetMoney object. - */ - @Override - public boolean isOnJoinResetMoney() - { - return onJoinResetMoney; - } - - - /** - * This method returns the onJoinResetInventory object. - * @return the onJoinResetInventory object. - */ - @Override - public boolean isOnJoinResetInventory() - { - return onJoinResetInventory; - } - - - /** - * This method returns the onJoinResetEnderChest object. - * @return the onJoinResetEnderChest object. - */ - @Override - public boolean isOnJoinResetEnderChest() - { - return onJoinResetEnderChest; - } - - - /** - * This method returns the onLeaveResetMoney object. - * @return the onLeaveResetMoney object. - */ - @Override - public boolean isOnLeaveResetMoney() - { - return onLeaveResetMoney; - } - - - /** - * This method returns the onLeaveResetInventory object. - * @return the onLeaveResetInventory object. - */ - @Override - public boolean isOnLeaveResetInventory() - { - return onLeaveResetInventory; - } - - - /** - * This method returns the onLeaveResetEnderChest object. - * @return the onLeaveResetEnderChest object. - */ - @Override - public boolean isOnLeaveResetEnderChest() - { - return onLeaveResetEnderChest; - } - - - /** - * This method returns the respawnOnIsland object. - * @return the respawnOnIsland object. - */ - public boolean isRespawnOnIsland() - { - return respawnOnIsland; - } - - - /** - * This method returns the allowSetHomeInNether object. - * @return the allowSetHomeInNether object. - */ - @Override - public boolean isAllowSetHomeInNether() - { - return allowSetHomeInNether; - } - - - /** - * This method returns the requireConfirmationToSetHomeInNether object. - * @return the requireConfirmationToSetHomeInNether object. - */ - @Override - public boolean isRequireConfirmationToSetHomeInNether() - { - return requireConfirmationToSetHomeInNether; - } - - - /** - * This method returns the allowSetHomeInTheEnd object. - * @return the allowSetHomeInTheEnd object. - */ - @Override - public boolean isAllowSetHomeInTheEnd() - { - return allowSetHomeInTheEnd; - } - - - /** - * This method returns the requireConfirmationToSetHomeInTheEnd object. - * @return the requireConfirmationToSetHomeInTheEnd object. - */ - @Override - public boolean isRequireConfirmationToSetHomeInTheEnd() - { - return requireConfirmationToSetHomeInTheEnd; - } - - - /** - * This method returns the deathsCounted object. - * @return the deathsCounted object. - */ - @Override - public boolean isDeathsCounted() - { - return deathsCounted; - } - - - /** - * This method returns the deathsMax object. - * @return the deathsMax object. - */ - @Override - public int getDeathsMax() - { - return deathsMax; - } - - - /** - * This method returns the deathsSumTeam object. - * @return the deathsSumTeam object. - */ - public boolean isDeathsSumTeam() - { - return deathsSumTeam; - } - - - /** - * This method returns the teamJoinDeathReset object. - * @return the teamJoinDeathReset object. - */ - @Override - public boolean isTeamJoinDeathReset() - { - return teamJoinDeathReset; - } - - - /** - * This method returns the geoLimitSettings object. - * @return the geoLimitSettings object. - */ - @Override - public List getGeoLimitSettings() - { - return geoLimitSettings; - } - - - /** - * This method returns the ivSettings object. - * @return the ivSettings object. - */ - @Override - public List getIvSettings() - { - return ivSettings; - } - - - /** - * This method returns the closePanelOnClickOutside object. - * @return the closePanelOnClickOutside object. - */ - public boolean isClosePanelOnClickOutside() - { - return closePanelOnClickOutside; - } - - - /** - * @return the permission prefix - */ - @Override - public String getPermissionPrefix() - { - return "caveblock"; - } - - - /** - * @return true if water is not safe in this world, e.g, should not be a home location - */ - @Override - public boolean isWaterUnsafe() - { - return false; - } - - - /** - * This method returns the resetEpoch object. - * @return the resetEpoch object. - */ - @Override - public long getResetEpoch() - { - return resetEpoch; - } - - - /** - * This method returns the worldDepth value. - * @return the value of worldDepth. - */ - public int getWorldDepth() - { - return worldDepth; - } - - - /** - * This method returns the normalRoof value. - * @return the value of normalRoof. - */ - public boolean isNormalRoof() - { - return normalRoof; - } - - - /** - * This method returns the normalFloor value. - * @return the value of normalFloor. - */ - public boolean isNormalFloor() - { - return normalFloor; - } - - - /** - * This method returns the normalMainBlock value. - * @return the value of normalMainBlock. - */ - public Material getNormalMainBlock() - { - return normalMainBlock; - } - - - /** - * This method returns the normalBlocks value. - * @return the value of normalBlocks. - */ - public List getNormalBlocks() - { - return normalBlocks; - } - - - /** - * This method returns the netherFloor value. - * @return the value of netherFloor. - */ - public boolean isNetherFloor() - { - return netherFloor; - } - - - /** - * This method returns the netherMainBlock value. - * @return the value of netherMainBlock. - */ - public Material getNetherMainBlock() - { - return netherMainBlock; - } - - - /** - * This method returns the netherBlocks value. - * @return the value of netherBlocks. - */ - public List getNetherBlocks() - { - return netherBlocks; - } - - - /** - * This method returns the endRoof value. - * @return the value of endRoof. - */ - public boolean isEndRoof() - { - return endRoof; - } - - - /** - * This method returns the endFloor value. - * @return the value of endFloor. - */ - public boolean isEndFloor() - { - return endFloor; - } - - - /** - * This method returns the endMainBlock value. - * @return the value of endMainBlock. - */ - public Material getEndMainBlock() - { - return endMainBlock; - } - - - /** - * This method returns the endBlocks value. - * @return the value of endBlocks. - */ - public List getEndBlocks() - { - return endBlocks; - } - - - /** - * This method returns the numberOfBlockGenerationTries value. - * @return the value of numberOfBlockGenerationTries. - */ - public int getNumberOfBlockGenerationTries() - { - return numberOfBlockGenerationTries; - } - - // --------------------------------------------------------------------- -// Section: Setters -// --------------------------------------------------------------------- - - - /** - * @param uniqueId - unique ID the uniqueId to set - */ - @Override - public void setUniqueId(String uniqueId) - { - this.uniqueId = uniqueId; - } - - - /** - * This method sets the friendlyName object value. - * @param friendlyName the friendlyName object new value. - * - */ - public void setFriendlyName(String friendlyName) - { - this.friendlyName = friendlyName; - } - - - /** - * This method sets the worldName object value. - * @param worldName the worldName object new value. - * - */ - public void setWorldName(String worldName) - { - this.worldName = worldName; - } - - - /** - * This method sets the difficulty object value. - * @param difficulty the difficulty object new value. - * - */ - @Override - public void setDifficulty(Difficulty difficulty) - { - this.difficulty = difficulty; - } - - - /** - * This method sets the islandDistance object value. - * @param islandDistance the islandDistance object new value. - * - */ - public void setIslandDistance(int islandDistance) - { - this.islandDistance = islandDistance; - } - - - /** - * This method sets the islandProtectionRange object value. - * @param islandProtectionRange the islandProtectionRange object new value. - * - */ - public void setIslandProtectionRange(int islandProtectionRange) - { - this.islandProtectionRange = islandProtectionRange; - } - - - /** - * This method sets the islandStartX object value. - * @param islandStartX the islandStartX object new value. - * - */ - public void setIslandStartX(int islandStartX) - { - this.islandStartX = islandStartX; - } - - - /** - * This method sets the islandStartZ object value. - * @param islandStartZ the islandStartZ object new value. - * - */ - public void setIslandStartZ(int islandStartZ) - { - this.islandStartZ = islandStartZ; - } - - - /** - * This method sets the islandXOffset object value. - * @param islandXOffset the islandXOffset object new value. - * - */ - public void setIslandXOffset(int islandXOffset) - { - this.islandXOffset = islandXOffset; - } - - - /** - * This method sets the islandZOffset object value. - * @param islandZOffset the islandZOffset object new value. - * - */ - public void setIslandZOffset(int islandZOffset) - { - this.islandZOffset = islandZOffset; - } - - - /** - * This method sets the islandHeight object value. - * @param islandHeight the islandHeight object new value. - * - */ - public void setIslandHeight(int islandHeight) - { - this.islandHeight = islandHeight; - } - - - /** - * This method sets the useOwnGenerator object value. - * @param useOwnGenerator the useOwnGenerator object new value. - * - */ - public void setUseOwnGenerator(boolean useOwnGenerator) - { - this.useOwnGenerator = useOwnGenerator; - } - - - /** - * This method sets the seaHeight object value. - * @param seaHeight the seaHeight object new value. - * - */ - public void setSeaHeight(int seaHeight) - { - this.seaHeight = seaHeight; - } - - - /** - * This method sets the maxIslands object value. - * @param maxIslands the maxIslands object new value. - * - */ - public void setMaxIslands(int maxIslands) - { - this.maxIslands = maxIslands; - } - - - /** - * This method sets the defaultGameMode object value. - * @param defaultGameMode the defaultGameMode object new value. - * - */ - public void setDefaultGameMode(GameMode defaultGameMode) - { - this.defaultGameMode = defaultGameMode; - } - - - /** - * This method sets the defaultBiome object value. - * @param defaultBiome the defaultBiome object new value. - * - */ - public void setDefaultBiome(Biome defaultBiome) - { - this.defaultBiome = defaultBiome; - } - - - /** - * This method sets the banLimit object value. - * @param banLimit the banLimit object new value. - * - */ - public void setBanLimit(int banLimit) - { - this.banLimit = banLimit; - } - - - /** - * This method sets the netherGenerate object value. - * @param netherGenerate the netherGenerate object new value. - * - */ - public void setNetherGenerate(boolean netherGenerate) - { - this.netherGenerate = netherGenerate; - } - - - /** - * This method sets the netherIslands object value. - * @param netherIslands the netherIslands object new value. - * - */ - public void setNetherIslands(boolean netherIslands) - { - this.netherIslands = netherIslands; - } - - - /** - * This method sets the netherTrees object value. - * @param netherTrees the netherTrees object new value. - * - */ - public void setNetherTrees(boolean netherTrees) - { - this.netherTrees = netherTrees; - } - - - /** - * This method sets the netherRoof object value. - * @param netherRoof the netherRoof object new value. - * - */ - public void setNetherRoof(boolean netherRoof) - { - this.netherRoof = netherRoof; - } - - - /** - * This method sets the netherSpawnRadius object value. - * @param netherSpawnRadius the netherSpawnRadius object new value. - * - */ - public void setNetherSpawnRadius(int netherSpawnRadius) - { - this.netherSpawnRadius = netherSpawnRadius; - } - - - /** - * This method sets the endGenerate object value. - * @param endGenerate the endGenerate object new value. - * - */ - public void setEndGenerate(boolean endGenerate) - { - this.endGenerate = endGenerate; - } - - - /** - * This method sets the endIslands object value. - * @param endIslands the endIslands object new value. - * - */ - public void setEndIslands(boolean endIslands) - { - this.endIslands = endIslands; - } - - - /** - * This method sets the dragonSpawn object value. - * @param dragonSpawn the dragonSpawn object new value. - * - */ - public void setDragonSpawn(boolean dragonSpawn) - { - this.dragonSpawn = dragonSpawn; - } - - - /** - * This method sets the removeMobsWhitelist object value. - * @param removeMobsWhitelist the removeMobsWhitelist object new value. - * - */ - public void setRemoveMobsWhitelist(Set removeMobsWhitelist) - { - this.removeMobsWhitelist = removeMobsWhitelist; - } - - - /** - * This method sets the worldFlags object value. - * @param worldFlags the worldFlags object new value. - * - */ - public void setWorldFlags(Map worldFlags) - { - this.worldFlags = worldFlags; - } - - - /** - * This method sets the defaultIslandFlags object value. - * @param defaultIslandFlags the defaultIslandFlags object new value. - * - */ - public void setDefaultIslandFlags(Map defaultIslandFlags) - { - this.defaultIslandFlags = defaultIslandFlags; - } - - - /** - * This method sets the defaultIslandSettings object value. - * @param defaultIslandSettings the defaultIslandSettings object new value. - * - */ - public void setDefaultIslandSettings(Map defaultIslandSettings) - { - this.defaultIslandSettings = defaultIslandSettings; - } - - - /** - * This method sets the visibleSettings object value. - * @param visibleSettings the visibleSettings object new value. - * - */ - public void setVisibleSettings(List visibleSettings) - { - this.visibleSettings = visibleSettings; - } - - - /** - * This method sets the visitorBannedCommands object value. - * @param visitorBannedCommands the visitorBannedCommands object new value. - * - */ - public void setVisitorBannedCommands(List visitorBannedCommands) - { - this.visitorBannedCommands = visitorBannedCommands; - } - - - /** - * This method sets the maxTeamSize object value. - * @param maxTeamSize the maxTeamSize object new value. - * - */ - public void setMaxTeamSize(int maxTeamSize) - { - this.maxTeamSize = maxTeamSize; - } - - - /** - * This method sets the maxHomes object value. - * @param maxHomes the maxHomes object new value. - * - */ - public void setMaxHomes(int maxHomes) - { - this.maxHomes = maxHomes; - } - - - /** - * This method sets the resetLimit object value. - * @param resetLimit the resetLimit object new value. - * - */ - public void setResetLimit(int resetLimit) - { - this.resetLimit = resetLimit; - } - - - /** - * This method sets the resetConfirmation object value. - * @param resetConfirmation the resetConfirmation object new value. - * - */ - public void setResetConfirmation(boolean resetConfirmation) - { - this.resetConfirmation = resetConfirmation; - } - - - /** - * This method sets the leaversLoseReset object value. - * @param leaversLoseReset the leaversLoseReset object new value. - * - */ - public void setLeaversLoseReset(boolean leaversLoseReset) - { - this.leaversLoseReset = leaversLoseReset; - } - - - /** - * This method sets the kickedKeepInventory object value. - * @param kickedKeepInventory the kickedKeepInventory object new value. - * - */ - public void setKickedKeepInventory(boolean kickedKeepInventory) - { - this.kickedKeepInventory = kickedKeepInventory; - } - - - /** - * This method sets the onJoinResetMoney object value. - * @param onJoinResetMoney the onJoinResetMoney object new value. - * - */ - public void setOnJoinResetMoney(boolean onJoinResetMoney) - { - this.onJoinResetMoney = onJoinResetMoney; - } - - - /** - * This method sets the onJoinResetInventory object value. - * @param onJoinResetInventory the onJoinResetInventory object new value. - * - */ - public void setOnJoinResetInventory(boolean onJoinResetInventory) - { - this.onJoinResetInventory = onJoinResetInventory; - } - - - /** - * This method sets the onJoinResetEnderChest object value. - * @param onJoinResetEnderChest the onJoinResetEnderChest object new value. - * - */ - public void setOnJoinResetEnderChest(boolean onJoinResetEnderChest) - { - this.onJoinResetEnderChest = onJoinResetEnderChest; - } - - - /** - * This method sets the onLeaveResetMoney object value. - * @param onLeaveResetMoney the onLeaveResetMoney object new value. - * - */ - public void setOnLeaveResetMoney(boolean onLeaveResetMoney) - { - this.onLeaveResetMoney = onLeaveResetMoney; - } - - - /** - * This method sets the onLeaveResetInventory object value. - * @param onLeaveResetInventory the onLeaveResetInventory object new value. - * - */ - public void setOnLeaveResetInventory(boolean onLeaveResetInventory) - { - this.onLeaveResetInventory = onLeaveResetInventory; - } - - - /** - * This method sets the onLeaveResetEnderChest object value. - * @param onLeaveResetEnderChest the onLeaveResetEnderChest object new value. - * - */ - public void setOnLeaveResetEnderChest(boolean onLeaveResetEnderChest) - { - this.onLeaveResetEnderChest = onLeaveResetEnderChest; - } - - - /** - * This method sets the respawnOnIsland object value. - * @param respawnOnIsland the respawnOnIsland object new value. - * - */ - public void setRespawnOnIsland(boolean respawnOnIsland) - { - this.respawnOnIsland = respawnOnIsland; - } - - - /** - * This method sets the allowSetHomeInNether object value. - * @param allowSetHomeInNether the allowSetHomeInNether object new value. - * - */ - public void setAllowSetHomeInNether(boolean allowSetHomeInNether) - { - this.allowSetHomeInNether = allowSetHomeInNether; - } - - - /** - * This method sets the requireConfirmationToSetHomeInNether object value. - * @param requireConfirmationToSetHomeInNether the requireConfirmationToSetHomeInNether object new value. - * - */ - public void setRequireConfirmationToSetHomeInNether(boolean requireConfirmationToSetHomeInNether) - { - this.requireConfirmationToSetHomeInNether = requireConfirmationToSetHomeInNether; - } - - - /** - * This method sets the allowSetHomeInTheEnd object value. - * @param allowSetHomeInTheEnd the allowSetHomeInTheEnd object new value. - * - */ - public void setAllowSetHomeInTheEnd(boolean allowSetHomeInTheEnd) - { - this.allowSetHomeInTheEnd = allowSetHomeInTheEnd; - } - - - /** - * This method sets the requireConfirmationToSetHomeInTheEnd object value. - * @param requireConfirmationToSetHomeInTheEnd the requireConfirmationToSetHomeInTheEnd object new value. - * - */ - public void setRequireConfirmationToSetHomeInTheEnd(boolean requireConfirmationToSetHomeInTheEnd) - { - this.requireConfirmationToSetHomeInTheEnd = requireConfirmationToSetHomeInTheEnd; - } - - - /** - * This method sets the deathsCounted object value. - * @param deathsCounted the deathsCounted object new value. - * - */ - public void setDeathsCounted(boolean deathsCounted) - { - this.deathsCounted = deathsCounted; - } - - - /** - * This method sets the deathsMax object value. - * @param deathsMax the deathsMax object new value. - * - */ - public void setDeathsMax(int deathsMax) - { - this.deathsMax = deathsMax; - } - - - /** - * This method sets the deathsSumTeam object value. - * @param deathsSumTeam the deathsSumTeam object new value. - * - */ - public void setDeathsSumTeam(boolean deathsSumTeam) - { - this.deathsSumTeam = deathsSumTeam; - } - - - /** - * This method sets the teamJoinDeathReset object value. - * @param teamJoinDeathReset the teamJoinDeathReset object new value. - * - */ - public void setTeamJoinDeathReset(boolean teamJoinDeathReset) - { - this.teamJoinDeathReset = teamJoinDeathReset; - } - - - /** - * This method sets the geoLimitSettings object value. - * @param geoLimitSettings the geoLimitSettings object new value. - * - */ - public void setGeoLimitSettings(List geoLimitSettings) - { - this.geoLimitSettings = geoLimitSettings; - } - - - /** - * This method sets the ivSettings object value. - * @param ivSettings the ivSettings object new value. - * - */ - public void setIvSettings(List ivSettings) - { - this.ivSettings = ivSettings; - } - - - /** - * This method sets the closePanelOnClickOutside object value. - * @param closePanelOnClickOutside the closePanelOnClickOutside object new value. - * - */ - public void setClosePanelOnClickOutside(boolean closePanelOnClickOutside) - { - this.closePanelOnClickOutside = closePanelOnClickOutside; - } - - - /** - * This method sets the resetEpoch object value. - * @param resetEpoch the resetEpoch object new value. - * - */ - @Override - public void setResetEpoch(long resetEpoch) - { - this.resetEpoch = resetEpoch; - } - - - /** - * This method sets the worldDepth value. - * @param worldDepth the worldDepth new value. - * - */ - public void setWorldDepth(int worldDepth) - { - this.worldDepth = worldDepth; - } - - - /** - * This method sets the normalRoof value. - * @param normalRoof the normalRoof new value. - * - */ - public void setNormalRoof(boolean normalRoof) - { - this.normalRoof = normalRoof; - } - - - /** - * This method sets the normalFloor value. - * @param normalFloor the normalFloor new value. - * - */ - public void setNormalFloor(boolean normalFloor) - { - this.normalFloor = normalFloor; - } - - - /** - * This method sets the normalMainBlock value. - * @param normalMainBlock the normalMainBlock new value. - * - */ - public void setNormalMainBlock(Material normalMainBlock) - { - this.normalMainBlock = normalMainBlock; - } - - - /** - * This method sets the normalBlocks value. - * @param normalBlocks the normalBlocks new value. - * - */ - public void setNormalBlocks(List normalBlocks) - { - this.normalBlocks = normalBlocks; - } - - - /** - * This method sets the netherFloor value. - * @param netherFloor the netherFloor new value. - * - */ - public void setNetherFloor(boolean netherFloor) - { - this.netherFloor = netherFloor; - } - - - /** - * This method sets the netherMainBlock value. - * @param netherMainBlock the netherMainBlock new value. - * - */ - public void setNetherMainBlock(Material netherMainBlock) - { - this.netherMainBlock = netherMainBlock; - } - - - /** - * This method sets the netherBlocks value. - * @param netherBlocks the netherBlocks new value. - * - */ - public void setNetherBlocks(List netherBlocks) - { - this.netherBlocks = netherBlocks; - } - - - /** - * This method sets the endRoof value. - * @param endRoof the endRoof new value. - * - */ - public void setEndRoof(boolean endRoof) - { - this.endRoof = endRoof; - } - - - /** - * This method sets the endFloor value. - * @param endFloor the endFloor new value. - * - */ - public void setEndFloor(boolean endFloor) - { - this.endFloor = endFloor; - } - - - /** - * This method sets the endMainBlock value. - * @param endMainBlock the endMainBlock new value. - * - */ - public void setEndMainBlock(Material endMainBlock) - { - this.endMainBlock = endMainBlock; - } - - - /** - * This method sets the endBlocks value. - * @param endBlocks the endBlocks new value. - * - */ - public void setEndBlocks(List endBlocks) - { - this.endBlocks = endBlocks; - } - - - /** - * This method sets the numberOfBlockGenerationTries value. - * @param numberOfBlockGenerationTries the numberOfBlockGenerationTries new value. - * - */ - public void setNumberOfBlockGenerationTries(int numberOfBlockGenerationTries) - { - this.numberOfBlockGenerationTries = numberOfBlockGenerationTries; - } - - - // --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- - - - /* WORLD */ - @ConfigComment("Friendly name for this world. Used in admin commands. Must be a single word") - @ConfigEntry(path = "world.friendly-name") - private String friendlyName = "CaveBlock"; - - @ConfigComment("Name of the world - if it does not exist then it will be generated.") - @ConfigComment("It acts like a prefix for nether and end (e.g. CaveBlock-world, CaveBlock-world_nether, CaveBlock-world_end)") - @ConfigEntry(path = "world.world-name") - private String worldName = "CaveBlock-world"; - - @ConfigComment("World difficulty setting - PEACEFUL, EASY, NORMAL, HARD") - @ConfigComment("Other plugins may override this setting") - @ConfigEntry(path = "world.difficulty") - private Difficulty difficulty = Difficulty.NORMAL; - - @ConfigComment("Radius of island in blocks. (So distance between islands is twice this)") - @ConfigComment("Will be rounded up to the nearest 16 blocks.") - @ConfigComment("It is the same for every dimension : Overworld, Nether and End.") - @ConfigComment("This value cannot be changed mid-game and the plugin will not start if it is different.") - @ConfigEntry(path = "world.distance-between-islands", needsReset = true) - private int islandDistance = 100; - - @ConfigComment("Default protection range radius in blocks. Cannot be larger than distance.") - @ConfigComment("Admins can change protection sizes for players individually using /cbadmin range set ") - @ConfigComment("or set this permission: caveblock.island.range.") - @ConfigEntry(path = "world.protection-range") - private int islandProtectionRange = 50; - - @ConfigComment("Start islands at these coordinates. This is where new islands will start in the") - @ConfigComment("world. These must be a factor of your island distance, but the plugin will auto") - @ConfigComment("calculate the closest location on the grid. Islands develop around this location") - @ConfigComment("both positively and negatively in a square grid.") - @ConfigComment("If none of this makes sense, leave it at 0,0.") - @ConfigEntry(path = "world.start-x", needsReset = true) - private int islandStartX = 0; - - @ConfigEntry(path = "world.start-z", needsReset = true) - private int islandStartZ = 0; - - @ConfigEntry(path = "world.offset-x") - private int islandXOffset; - @ConfigEntry(path = "world.offset-z") - private int islandZOffset; - - @ConfigComment("Island height - Lowest is 5.") - @ConfigComment("It is the y coordinate of the bedrock block in the schem.") - @ConfigEntry(path = "world.island-height") - private int islandHeight = 60; - - @ConfigComment("Use your own world generator for this world.") - @ConfigComment("In this case, the plugin will not generate anything.") - @ConfigEntry(path = "world.use-own-generator", experimental = true) - private boolean useOwnGenerator = true; - - @ConfigComment("Sea height (don't changes this mid-game unless you delete the world)") - @ConfigComment("Minimum is 0, which means you are playing CaveBlock!") - @ConfigComment("If sea height is less than about 10, then players will drop right through it") - @ConfigComment("if it exists. Makes for an interesting variation on caveblock.") - @ConfigEntry(path = "world.sea-height", needsReset = true) - private int seaHeight = 0; - - @ConfigComment("Maximum number of islands in the world. Set to -1 or 0 for unlimited.") - @ConfigComment("If the number of islands is greater than this number, it will stop players from creating islands.") - @ConfigEntry(path = "world.max-islands") - private int maxIslands = -1; - - @ConfigComment("The default game mode for this world. Players will be set to this mode when they create") - @ConfigComment("a new island for example. Options are SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR") - @ConfigEntry(path = "world.default-game-mode") - private GameMode defaultGameMode = GameMode.SURVIVAL; - - @ConfigComment("The default biome for the overworld") - @ConfigEntry(path = "world.default-biome") - private Biome defaultBiome = Biome.MOUNTAINS; - - @ConfigComment("The maximum number of players a player can ban at any one time in this game mode.") - @ConfigComment("The permission acidisland.ban.maxlimit.X where X is a number can also be used per player") - @ConfigComment("-1 = unlimited") - @ConfigEntry(path = "world.ban-limit") - private int banLimit = -1; - - @ConfigComment("") - @ConfigComment("This is cave... no height... only depth. Max 256.") - @ConfigComment("Should not be less then island height.") - @ConfigEntry(path = "world.world-depth", needsReset = true) - private int worldDepth = 256; - - @ConfigComment("This indicate how many times block should be tried to generate.") - @ConfigEntry(path = "world.generation-tries", needsReset = true) - private int numberOfBlockGenerationTries = 1; - - @ConfigComment("") - @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") - @ConfigEntry(path = "world.normal.roof", needsReset = true) - private boolean normalRoof = true; - - @ConfigComment("Make over world floor of bedrock, if false, it will be made from stone") - @ConfigEntry(path = "world.normal.floor", needsReset = true) - private boolean normalFloor = true; - - @ConfigComment("Main block of which world will be generated.") - @ConfigEntry(path = "world.normal.main-block", needsReset = true) - private Material normalMainBlock = Material.STONE; - - @ConfigComment("Blocks that will occasionally replace main block by random chance.") - @ConfigComment("Blocks will replace only main-block and will try to create packs that") - @ConfigComment("are set in their strings. Chance of spawning also is required.") - @ConfigComment("For materials first string must be MATERIAL, for entity: ENTITY.") - @ConfigComment("Entities spawned via generator are not protected from despawing.") - @ConfigComment("Working only with 2 high mobs currently.") - @ConfigComment("Example:") - @ConfigComment("MATERIAL:DIAMOND:100:5 - means there is 100% chace of spawing diamonds") - @ConfigComment("where max amount in pack are 5 per each subchunk!") - @ConfigEntry(path = "world.normal.blocks", needsReset = true) - private List normalBlocks = new ArrayList<>(); - - // Nether - @ConfigComment("Generate Nether - if this is false, the nether world will not be made and access to") - @ConfigComment("the nether will not occur. Other plugins may still enable portal usage.") - @ConfigComment("Note: Some default challenges will not be possible if there is no nether.") - @ConfigComment("Note that with a standard nether all players arrive at the same portal and entering a") - @ConfigComment("portal will return them back to their islands.") - @ConfigEntry(path = "world.nether.generate") - private boolean netherGenerate = true; - - @ConfigComment("Islands in Nether. Change to false for standard vanilla nether.") - @ConfigEntry(path = "world.nether.islands", needsReset = true) - private boolean netherIslands = true; - - @ConfigComment("Nether trees are made if a player grows a tree in the nether (gravel and glowstone)") - @ConfigComment("Applies to both vanilla and islands Nether") - @ConfigEntry(path = "world.nether.trees") - private boolean netherTrees = true; - - @ConfigComment("Nether spawn protection radius - this is the distance around the nether spawn") - @ConfigComment("that will be protected from player interaction (breaking blocks, pouring lava etc.)") - @ConfigComment("Minimum is 0 (not recommended), maximum is 100. Default is 25.") - @ConfigComment("Only applies to vanilla nether") - @ConfigEntry(path = "world.nether.spawn-radius") - private int netherSpawnRadius = 32; - - @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") - @ConfigEntry(path = "world.nether.roof", needsReset = true) - private boolean netherRoof = true; - - @ConfigComment("Make over world floor of bedrock, if false, it will be made from stone") - @ConfigEntry(path = "world.nether.floor", needsReset = true) - private boolean netherFloor = true; - - @ConfigComment("Main block of which world will be generated.") - @ConfigEntry(path = "world.nether.main-block", needsReset = true) - private Material netherMainBlock = Material.STONE; - - @ConfigComment("Blocks that will occasionally replace main block by random chance.") - @ConfigComment("Blocks will replace only main-block and will try to create packs that") - @ConfigComment("are set in their strings. Chance of spawning also is required.") - @ConfigComment("For materials first string must be MATERIAL, for entity: ENTITY.") - @ConfigComment("Entities spawned via generator are not protected from despawing.") - @ConfigComment("Working only with 2 high mobs currently.") - @ConfigComment("Example:") - @ConfigComment("MATERIAL:DIAMOND:100:5 - means there is 100% chace of spawing diamonds") - @ConfigComment("where max amount in pack are 5 per each subchunk!") - @ConfigEntry(path = "world.nether.blocks", needsReset = true) - private List netherBlocks = new ArrayList<>(); - - // End - @ConfigEntry(path = "world.end.generate") - private boolean endGenerate = true; - - @ConfigEntry(path = "world.end.islands", needsReset = true) - private boolean endIslands = true; - - @ConfigEntry(path = "world.end.dragon-spawn", experimental = true) - private boolean dragonSpawn = false; - - @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") - @ConfigEntry(path = "world.end.roof", needsReset = true) - private boolean endRoof = true; - - @ConfigComment("Make over world floor of bedrock, if false, it will be made from stone") - @ConfigEntry(path = "world.end.floor", needsReset = true) - private boolean endFloor = true; - - @ConfigComment("Main block of which world will be generated.") - @ConfigEntry(path = "world.end.main-block", needsReset = true) - private Material endMainBlock = Material.STONE; - - @ConfigComment("Blocks that will occasionally replace main block by random chance.") - @ConfigComment("Blocks will replace only main-block and will try to create packs that") - @ConfigComment("are set in their strings. Chance of spawning also is required.") - @ConfigComment("For materials first string must be MATERIAL, for entity: ENTITY.") - @ConfigComment("Entities spawned via generator are not protected from despawing.") - @ConfigComment("Working only with 2 high mobs currently.") - @ConfigComment("Example:") - @ConfigComment("MATERIAL:DIAMOND:100:5 - means there is 100% chace of spawing diamonds") - @ConfigComment("where max amount in pack are 5 per each subchunk!") - @ConfigEntry(path = "world.end.blocks", needsReset = true) - private List endBlocks = new ArrayList<>(); - - // Other staff. - - @ConfigComment("Mob white list - these mobs will NOT be removed when logging in or doing /cave") - @ConfigEntry(path = "world.remove-mobs-whitelist") - private Set removeMobsWhitelist = new HashSet<>(); - - @ConfigComment("World flags. These are boolean settings for various flags for this world") - @ConfigEntry(path = "world.flags") - private Map worldFlags = new HashMap<>(); - - @ConfigComment("These are the default protection settings for new islands.") - @ConfigComment("The value is the minimum island rank required allowed to do the action") - @ConfigComment("Ranks are: Visitor = 0, Member = 900, Owner = 1000") - @ConfigEntry(path = "world.default-island-flags") - @Adapter(FlagSerializer.class) - private Map defaultIslandFlags = new HashMap<>(); - - @ConfigComment("These are the default settings for new islands") - @ConfigEntry(path = "world.default-island-settings") - @Adapter(FlagSerializer2.class) - private Map defaultIslandSettings = new HashMap<>(); - - @ConfigComment("These are the settings visible to users. (Not implemented yet)") - @ConfigEntry(path = "world.visible-settings", experimental = true) - private List visibleSettings = new ArrayList<>(); - - @ConfigComment("Visitor banned commands - Visitors to islands cannot use these commands in this world") - @ConfigEntry(path = "world.visitor-banned-commands") - private List visitorBannedCommands = new ArrayList<>(); - - // --------------------------------------------- - - /* ISLAND */ - @ConfigComment("Default max team size") - @ConfigComment("Permission size cannot be less than the default below. ") - @ConfigEntry(path = "island.max-team-size") - private int maxTeamSize = 4; - - @ConfigComment("Default maximum number of homes a player can have. Min = 1") - @ConfigComment("Accessed via /cave sethome or /cave go ") - @ConfigEntry(path = "island.max-homes") - private int maxHomes = 5; - - // Reset - @ConfigComment("How many resets a player is allowed (override with /cbadmin clearresets )") - @ConfigComment("Value of -1 means unlimited, 0 means hardcore - no resets.") - @ConfigComment("Example, 2 resets means they get 2 resets or 3 islands lifetime") - @ConfigEntry(path = "island.reset.reset-limit") - private int resetLimit = -1; - - @ConfigEntry(path = "island.require-confirmation.reset") - private boolean resetConfirmation = true; - - @ConfigComment("Kicked or leaving players lose resets") - @ConfigComment("Players who leave a team will lose an island reset chance") - @ConfigComment("If a player has zero resets left and leaves a team, they cannot make a new") - @ConfigComment("island by themselves and can only join a team.") - @ConfigComment("Leave this true to avoid players exploiting free islands") - @ConfigEntry(path = "island.reset.leavers-lose-reset") - private boolean leaversLoseReset = false; - - @ConfigComment("Allow kicked players to keep their inventory.") - @ConfigComment("If false, kicked player's inventory will be thrown at the island leader if the") - @ConfigComment("kicked player is online and in the island world.") - @ConfigEntry(path = "island.reset.kicked-keep-inventory") - private boolean kickedKeepInventory = false; - - @ConfigComment("What the plugin should reset when the player joins or creates an island") - @ConfigComment("Reset Money - if this is true, will reset the player's money to the starting money") - @ConfigComment("Recommendation is that this is set to true, but if you run multi-worlds") - @ConfigComment("make sure your economy handles multi-worlds too.") - @ConfigEntry(path = "island.reset.on-join.money") - private boolean onJoinResetMoney = false; - - @ConfigComment("Reset inventory - if true, the player's inventory will be cleared.") - @ConfigComment("Note: if you have MultiInv running or a similar inventory control plugin, that") - @ConfigComment("plugin may still reset the inventory when the world changes.") - @ConfigEntry(path = "island.reset.on-join.inventory") - private boolean onJoinResetInventory = false; - - @ConfigComment("Reset Ender Chest - if true, the player's Ender Chest will be cleared.") - @ConfigEntry(path = "island.reset.on-join.ender-chest") - private boolean onJoinResetEnderChest = false; - - @ConfigComment("What the plugin should reset when the player leaves or is kicked from an island") - @ConfigComment("Reset Money - if this is true, will reset the player's money to the starting money") - @ConfigComment("Recommendation is that this is set to true, but if you run multi-worlds") - @ConfigComment("make sure your economy handles multi-worlds too.") - @ConfigEntry(path = "island.reset.on-leave.money") - private boolean onLeaveResetMoney = false; - - @ConfigComment("Reset inventory - if true, the player's inventory will be cleared.") - @ConfigComment("Note: if you have MultiInv running or a similar inventory control plugin, that") - @ConfigComment("plugin may still reset the inventory when the world changes.") - @ConfigEntry(path = "island.reset.on-leave.inventory") - private boolean onLeaveResetInventory = false; - - @ConfigComment("Reset Ender Chest - if true, the player's Ender Chest will be cleared.") - @ConfigEntry(path = "island.reset.on-leave.ender-chest") - private boolean onLeaveResetEnderChest = false; - - @ConfigComment("Have player's respawn on their island if they die") - @ConfigEntry(path = "island.respawn-on-island") - private boolean respawnOnIsland = true; - - // Sethome - @ConfigEntry(path = "island.sethome.nether.allow") - private boolean allowSetHomeInNether = true; - - @ConfigEntry(path = "island.sethome.nether.require-confirmation") - private boolean requireConfirmationToSetHomeInNether = true; - - @ConfigEntry(path = "island.sethome.the-end.allow") - private boolean allowSetHomeInTheEnd = true; - - @ConfigEntry(path = "island.sethome.the-end.require-confirmation") - private boolean requireConfirmationToSetHomeInTheEnd = true; - - // Deaths - @ConfigComment("Whether deaths are counted or not.") - @ConfigEntry(path = "island.deaths.counted") - private boolean deathsCounted = true; - - @ConfigComment("Maximum number of deaths to count. The death count can be used by add-ons.") - @ConfigEntry(path = "island.deaths.max") - private int deathsMax = 10; - - @ConfigEntry(path = "island.deaths.sum-team") - private boolean deathsSumTeam = false; - - @ConfigComment("When a player joins a team, reset their death count") - @ConfigEntry(path = "island.deaths.team-join-reset") - private boolean teamJoinDeathReset = true; - - // --------------------------------------------- - /* PROTECTION */ - - @ConfigComment("Geo restrict mobs.") - @ConfigComment("Mobs that exit the island space where they were spawned will be removed.") - @ConfigEntry(path = "protection.geo-limit-settings") - private List geoLimitSettings = new ArrayList<>(); - - // Invincible visitor settings - @ConfigComment("Invincible visitors. List of damages that will not affect visitors.") - @ConfigComment("Make list blank if visitors should receive all damages") - @ConfigEntry(path = "protection.invincible-visitors") - private List ivSettings = new ArrayList<>(); - - //---------------------------------------------------------------------------------------/ - - @ConfigComment("Whether GUIs should be closed when the player clicks outside.") - @ConfigEntry(path = "panel.close-on-click-outside") - private boolean closePanelOnClickOutside = true; - - //---------------------------------------------------------------------------------------/ - @ConfigComment("These settings should not be edited") - @ConfigEntry(path = "do-not-edit-these-settings.reset-epoch") - private long resetEpoch = 0; - - private String uniqueId = "config"; + // --------------------------------------------------------------------- + // Section: Getters + // --------------------------------------------------------------------- + + + /** + * @return the uniqueId + */ + @Override + public String getUniqueId() + { + return this.uniqueId; + } + + + /** + * This method returns the friendlyName object. + * @return the friendlyName object. + */ + @Override + public String getFriendlyName() + { + return friendlyName; + } + + + /** + * This method returns the worldName object. + * @return the worldName object. + */ + @Override + public String getWorldName() + { + return worldName; + } + + + /** + * This method returns the difficulty object. + * @return the difficulty object. + */ + @Override + public Difficulty getDifficulty() + { + return difficulty; + } + + + /** + * This method returns the islandDistance object. + * @return the islandDistance object. + */ + @Override + public int getIslandDistance() + { + return islandDistance; + } + + + /** + * This method returns the islandProtectionRange object. + * @return the islandProtectionRange object. + */ + @Override + public int getIslandProtectionRange() + { + return islandProtectionRange; + } + + + /** + * This method returns the islandStartX object. + * @return the islandStartX object. + */ + @Override + public int getIslandStartX() + { + return islandStartX; + } + + + /** + * This method returns the islandStartZ object. + * @return the islandStartZ object. + */ + @Override + public int getIslandStartZ() + { + return islandStartZ; + } + + + /** + * This method returns the islandXOffset object. + * @return the islandXOffset object. + */ + @Override + public int getIslandXOffset() + { + return islandXOffset; + } + + + /** + * This method returns the islandZOffset object. + * @return the islandZOffset object. + */ + @Override + public int getIslandZOffset() + { + return islandZOffset; + } + + + /** + * This method returns the islandHeight object. + * @return the islandHeight object. + */ + @Override + public int getIslandHeight() + { + return islandHeight; + } + + + /** + * This method returns the useOwnGenerator object. + * @return the useOwnGenerator object. + */ + @Override + public boolean isUseOwnGenerator() + { + return useOwnGenerator; + } + + + /** + * This method returns the seaHeight object. + * @return the seaHeight object. + */ + @Override + public int getSeaHeight() + { + return 0; + } + + + /** + * 0 or -1 is unlimited. It will block island creation if the island count for the world is higher than this. + * @return the maxIslands + */ + @Override + public int getMaxIslands() + { + return maxIslands; + } + + + /** + * This method returns the defaultGameMode object. + * @return the defaultGameMode object. + */ + @Override + public GameMode getDefaultGameMode() + { + return defaultGameMode; + } + + + /** + * This method returns the defaultBiome object. + * @return the defaultBiome object. + */ + public Biome getDefaultBiome() + { + return defaultBiome; + } + + + /** + * This method returns the banLimit object. + * @return the banLimit object. + */ + @Override + public int getBanLimit() + { + return banLimit; + } + + + /** + * This method returns the netherGenerate object. + * @return the netherGenerate object. + */ + @Override + public boolean isNetherGenerate() + { + return netherGenerate; + } + + + /** + * This method returns the netherIslands object. + * @return the netherIslands object. + */ + @Override + public boolean isNetherIslands() + { + return netherIslands; + } + + + /** + * This method returns the netherTrees object. + * @return the netherTrees object. + */ + @Override + public boolean isNetherTrees() + { + return netherTrees; + } + + + /** + * This method returns the netherRoof object. + * @return the netherRoof object. + */ + public boolean isNetherRoof() + { + return netherRoof; + } + + + /** + * This method returns the netherSpawnRadius object. + * @return the netherSpawnRadius object. + */ + @Override + public int getNetherSpawnRadius() + { + return netherSpawnRadius; + } + + + /** + * This method returns the endGenerate object. + * @return the endGenerate object. + */ + @Override + public boolean isEndGenerate() + { + return endGenerate; + } + + + /** + * This method returns the endIslands object. + * @return the endIslands object. + */ + @Override + public boolean isEndIslands() + { + return endIslands; + } + + + /** + * This method returns the dragonSpawn object. + * @return the dragonSpawn object. + */ + @Override + public boolean isDragonSpawn() + { + return dragonSpawn; + } + + + /** + * This method returns the removeMobsWhitelist object. + * @return the removeMobsWhitelist object. + */ + @Override + public Set getRemoveMobsWhitelist() + { + return removeMobsWhitelist; + } + + + /** + * This method returns the worldFlags object. + * @return the worldFlags object. + */ + @Override + public Map getWorldFlags() + { + return worldFlags; + } + + + /** + * This method returns the defaultIslandFlags object. + * @return the defaultIslandFlags object. + */ + @Override + public Map getDefaultIslandFlags() + { + return defaultIslandFlags; + } + + + /** + * This method returns the defaultIslandSettings object. + * @return the defaultIslandSettings object. + */ + @Override + public Map getDefaultIslandSettings() + { + return defaultIslandSettings; + } + + + /** + * This method returns the visibleSettings object. + * @return the visibleSettings object. + */ + @Override + public List getVisibleSettings() + { + return visibleSettings; + } + + + /** + * This method returns the visitorBannedCommands object. + * @return the visitorBannedCommands object. + */ + @Override + public List getVisitorBannedCommands() + { + return visitorBannedCommands; + } + + + /** + * This method returns the maxTeamSize object. + * @return the maxTeamSize object. + */ + @Override + public int getMaxTeamSize() + { + return maxTeamSize; + } + + + /** + * This method returns the maxHomes object. + * @return the maxHomes object. + */ + @Override + public int getMaxHomes() + { + return maxHomes; + } + + + /** + * This method returns the resetLimit object. + * @return the resetLimit object. + */ + @Override + public int getResetLimit() + { + return resetLimit; + } + + + /** + * This method returns the resetConfirmation object. + * @return the resetConfirmation object. + */ + public boolean isResetConfirmation() + { + return resetConfirmation; + } + + + /** + * This method returns the leaversLoseReset object. + * @return the leaversLoseReset object. + */ + public boolean isLeaversLoseReset() + { + return leaversLoseReset; + } + + + /** + * This method returns the kickedKeepInventory object. + * @return the kickedKeepInventory object. + */ + public boolean isKickedKeepInventory() + { + return kickedKeepInventory; + } + + + /** + * This method returns the onJoinResetMoney object. + * @return the onJoinResetMoney object. + */ + @Override + public boolean isOnJoinResetMoney() + { + return onJoinResetMoney; + } + + + /** + * This method returns the onJoinResetInventory object. + * @return the onJoinResetInventory object. + */ + @Override + public boolean isOnJoinResetInventory() + { + return onJoinResetInventory; + } + + + /** + * This method returns the onJoinResetEnderChest object. + * @return the onJoinResetEnderChest object. + */ + @Override + public boolean isOnJoinResetEnderChest() + { + return onJoinResetEnderChest; + } + + + /** + * This method returns the onLeaveResetMoney object. + * @return the onLeaveResetMoney object. + */ + @Override + public boolean isOnLeaveResetMoney() + { + return onLeaveResetMoney; + } + + + /** + * This method returns the onLeaveResetInventory object. + * @return the onLeaveResetInventory object. + */ + @Override + public boolean isOnLeaveResetInventory() + { + return onLeaveResetInventory; + } + + + /** + * This method returns the onLeaveResetEnderChest object. + * @return the onLeaveResetEnderChest object. + */ + @Override + public boolean isOnLeaveResetEnderChest() + { + return onLeaveResetEnderChest; + } + + + /** + * This method returns the respawnOnIsland object. + * @return the respawnOnIsland object. + */ + public boolean isRespawnOnIsland() + { + return respawnOnIsland; + } + + + /** + * This method returns the allowSetHomeInNether object. + * @return the allowSetHomeInNether object. + */ + @Override + public boolean isAllowSetHomeInNether() + { + return allowSetHomeInNether; + } + + + /** + * This method returns the requireConfirmationToSetHomeInNether object. + * @return the requireConfirmationToSetHomeInNether object. + */ + @Override + public boolean isRequireConfirmationToSetHomeInNether() + { + return requireConfirmationToSetHomeInNether; + } + + + /** + * This method returns the allowSetHomeInTheEnd object. + * @return the allowSetHomeInTheEnd object. + */ + @Override + public boolean isAllowSetHomeInTheEnd() + { + return allowSetHomeInTheEnd; + } + + + /** + * This method returns the requireConfirmationToSetHomeInTheEnd object. + * @return the requireConfirmationToSetHomeInTheEnd object. + */ + @Override + public boolean isRequireConfirmationToSetHomeInTheEnd() + { + return requireConfirmationToSetHomeInTheEnd; + } + + + /** + * This method returns the deathsCounted object. + * @return the deathsCounted object. + */ + @Override + public boolean isDeathsCounted() + { + return deathsCounted; + } + + + /** + * This method returns the deathsMax object. + * @return the deathsMax object. + */ + @Override + public int getDeathsMax() + { + return deathsMax; + } + + + /** + * This method returns the deathsSumTeam object. + * @return the deathsSumTeam object. + */ + public boolean isDeathsSumTeam() + { + return deathsSumTeam; + } + + + /** + * This method returns the teamJoinDeathReset object. + * @return the teamJoinDeathReset object. + */ + @Override + public boolean isTeamJoinDeathReset() + { + return teamJoinDeathReset; + } + + + /** + * This method returns the geoLimitSettings object. + * @return the geoLimitSettings object. + */ + @Override + public List getGeoLimitSettings() + { + return geoLimitSettings; + } + + + /** + * This method returns the ivSettings object. + * @return the ivSettings object. + */ + @Override + public List getIvSettings() + { + return ivSettings; + } + + + /** + * This method returns the closePanelOnClickOutside object. + * @return the closePanelOnClickOutside object. + */ + public boolean isClosePanelOnClickOutside() + { + return closePanelOnClickOutside; + } + + + /** + * @return the permission prefix + */ + @Override + public String getPermissionPrefix() + { + return "caveblock"; + } + + + /** + * @return true if water is not safe in this world, e.g, should not be a home location + */ + @Override + public boolean isWaterUnsafe() + { + return false; + } + + + /** + * This method returns the resetEpoch object. + * @return the resetEpoch object. + */ + @Override + public long getResetEpoch() + { + return resetEpoch; + } + + + /** + * This method returns the worldDepth value. + * @return the value of worldDepth. + */ + public int getWorldDepth() + { + return worldDepth; + } + + + /** + * This method returns the normalRoof value. + * @return the value of normalRoof. + */ + public boolean isNormalRoof() + { + return normalRoof; + } + + + /** + * This method returns the normalFloor value. + * @return the value of normalFloor. + */ + public boolean isNormalFloor() + { + return normalFloor; + } + + + /** + * This method returns the normalMainBlock value. + * @return the value of normalMainBlock. + */ + public Material getNormalMainBlock() + { + return normalMainBlock; + } + + + /** + * This method returns the normalBlocks value. + * @return the value of normalBlocks. + */ + public List getNormalBlocks() + { + return normalBlocks; + } + + + /** + * This method returns the netherFloor value. + * @return the value of netherFloor. + */ + public boolean isNetherFloor() + { + return netherFloor; + } + + + /** + * This method returns the netherMainBlock value. + * @return the value of netherMainBlock. + */ + public Material getNetherMainBlock() + { + return netherMainBlock; + } + + + /** + * This method returns the netherBlocks value. + * @return the value of netherBlocks. + */ + public List getNetherBlocks() + { + return netherBlocks; + } + + + /** + * This method returns the endRoof value. + * @return the value of endRoof. + */ + public boolean isEndRoof() + { + return endRoof; + } + + + /** + * This method returns the endFloor value. + * @return the value of endFloor. + */ + public boolean isEndFloor() + { + return endFloor; + } + + + /** + * This method returns the endMainBlock value. + * @return the value of endMainBlock. + */ + public Material getEndMainBlock() + { + return endMainBlock; + } + + + /** + * This method returns the endBlocks value. + * @return the value of endBlocks. + */ + public List getEndBlocks() + { + return endBlocks; + } + + + /** + * This method returns the numberOfBlockGenerationTries value. + * @return the value of numberOfBlockGenerationTries. + */ + public int getNumberOfBlockGenerationTries() + { + return numberOfBlockGenerationTries; + } + + // --------------------------------------------------------------------- + // Section: Setters + // --------------------------------------------------------------------- + + + /** + * @param uniqueId - unique ID the uniqueId to set + */ + @Override + public void setUniqueId(String uniqueId) + { + this.uniqueId = uniqueId; + } + + + /** + * This method sets the friendlyName object value. + * @param friendlyName the friendlyName object new value. + * + */ + public void setFriendlyName(String friendlyName) + { + this.friendlyName = friendlyName; + } + + + /** + * This method sets the worldName object value. + * @param worldName the worldName object new value. + * + */ + public void setWorldName(String worldName) + { + this.worldName = worldName; + } + + + /** + * This method sets the difficulty object value. + * @param difficulty the difficulty object new value. + * + */ + @Override + public void setDifficulty(Difficulty difficulty) + { + this.difficulty = difficulty; + } + + + /** + * This method sets the islandDistance object value. + * @param islandDistance the islandDistance object new value. + * + */ + public void setIslandDistance(int islandDistance) + { + this.islandDistance = islandDistance; + } + + + /** + * This method sets the islandProtectionRange object value. + * @param islandProtectionRange the islandProtectionRange object new value. + * + */ + public void setIslandProtectionRange(int islandProtectionRange) + { + this.islandProtectionRange = islandProtectionRange; + } + + + /** + * This method sets the islandStartX object value. + * @param islandStartX the islandStartX object new value. + * + */ + public void setIslandStartX(int islandStartX) + { + this.islandStartX = islandStartX; + } + + + /** + * This method sets the islandStartZ object value. + * @param islandStartZ the islandStartZ object new value. + * + */ + public void setIslandStartZ(int islandStartZ) + { + this.islandStartZ = islandStartZ; + } + + + /** + * This method sets the islandXOffset object value. + * @param islandXOffset the islandXOffset object new value. + * + */ + public void setIslandXOffset(int islandXOffset) + { + this.islandXOffset = islandXOffset; + } + + + /** + * This method sets the islandZOffset object value. + * @param islandZOffset the islandZOffset object new value. + * + */ + public void setIslandZOffset(int islandZOffset) + { + this.islandZOffset = islandZOffset; + } + + + /** + * This method sets the islandHeight object value. + * @param islandHeight the islandHeight object new value. + * + */ + public void setIslandHeight(int islandHeight) + { + this.islandHeight = islandHeight; + } + + + /** + * This method sets the useOwnGenerator object value. + * @param useOwnGenerator the useOwnGenerator object new value. + * + */ + public void setUseOwnGenerator(boolean useOwnGenerator) + { + this.useOwnGenerator = useOwnGenerator; + } + + /** + * This method sets the maxIslands object value. + * @param maxIslands the maxIslands object new value. + * + */ + public void setMaxIslands(int maxIslands) + { + this.maxIslands = maxIslands; + } + + + /** + * This method sets the defaultGameMode object value. + * @param defaultGameMode the defaultGameMode object new value. + * + */ + public void setDefaultGameMode(GameMode defaultGameMode) + { + this.defaultGameMode = defaultGameMode; + } + + + /** + * This method sets the defaultBiome object value. + * @param defaultBiome the defaultBiome object new value. + * + */ + public void setDefaultBiome(Biome defaultBiome) + { + this.defaultBiome = defaultBiome; + } + + + /** + * This method sets the banLimit object value. + * @param banLimit the banLimit object new value. + * + */ + public void setBanLimit(int banLimit) + { + this.banLimit = banLimit; + } + + + /** + * This method sets the netherGenerate object value. + * @param netherGenerate the netherGenerate object new value. + * + */ + public void setNetherGenerate(boolean netherGenerate) + { + this.netherGenerate = netherGenerate; + } + + + /** + * This method sets the netherIslands object value. + * @param netherIslands the netherIslands object new value. + * + */ + public void setNetherIslands(boolean netherIslands) + { + this.netherIslands = netherIslands; + } + + + /** + * This method sets the netherTrees object value. + * @param netherTrees the netherTrees object new value. + * + */ + public void setNetherTrees(boolean netherTrees) + { + this.netherTrees = netherTrees; + } + + + /** + * This method sets the netherRoof object value. + * @param netherRoof the netherRoof object new value. + * + */ + public void setNetherRoof(boolean netherRoof) + { + this.netherRoof = netherRoof; + } + + + /** + * This method sets the netherSpawnRadius object value. + * @param netherSpawnRadius the netherSpawnRadius object new value. + * + */ + public void setNetherSpawnRadius(int netherSpawnRadius) + { + this.netherSpawnRadius = netherSpawnRadius; + } + + + /** + * This method sets the endGenerate object value. + * @param endGenerate the endGenerate object new value. + * + */ + public void setEndGenerate(boolean endGenerate) + { + this.endGenerate = endGenerate; + } + + + /** + * This method sets the endIslands object value. + * @param endIslands the endIslands object new value. + * + */ + public void setEndIslands(boolean endIslands) + { + this.endIslands = endIslands; + } + + + /** + * This method sets the dragonSpawn object value. + * @param dragonSpawn the dragonSpawn object new value. + * + */ + public void setDragonSpawn(boolean dragonSpawn) + { + this.dragonSpawn = dragonSpawn; + } + + + /** + * This method sets the removeMobsWhitelist object value. + * @param removeMobsWhitelist the removeMobsWhitelist object new value. + * + */ + public void setRemoveMobsWhitelist(Set removeMobsWhitelist) + { + this.removeMobsWhitelist = removeMobsWhitelist; + } + + + /** + * This method sets the worldFlags object value. + * @param worldFlags the worldFlags object new value. + * + */ + public void setWorldFlags(Map worldFlags) + { + this.worldFlags = worldFlags; + } + + + /** + * This method sets the defaultIslandFlags object value. + * @param defaultIslandFlags the defaultIslandFlags object new value. + * + */ + public void setDefaultIslandFlags(Map defaultIslandFlags) + { + this.defaultIslandFlags = defaultIslandFlags; + } + + + /** + * This method sets the defaultIslandSettings object value. + * @param defaultIslandSettings the defaultIslandSettings object new value. + * + */ + public void setDefaultIslandSettings(Map defaultIslandSettings) + { + this.defaultIslandSettings = defaultIslandSettings; + } + + + /** + * This method sets the visibleSettings object value. + * @param visibleSettings the visibleSettings object new value. + * + */ + public void setVisibleSettings(List visibleSettings) + { + this.visibleSettings = visibleSettings; + } + + + /** + * This method sets the visitorBannedCommands object value. + * @param visitorBannedCommands the visitorBannedCommands object new value. + * + */ + public void setVisitorBannedCommands(List visitorBannedCommands) + { + this.visitorBannedCommands = visitorBannedCommands; + } + + + /** + * This method sets the maxTeamSize object value. + * @param maxTeamSize the maxTeamSize object new value. + * + */ + public void setMaxTeamSize(int maxTeamSize) + { + this.maxTeamSize = maxTeamSize; + } + + + /** + * This method sets the maxHomes object value. + * @param maxHomes the maxHomes object new value. + * + */ + public void setMaxHomes(int maxHomes) + { + this.maxHomes = maxHomes; + } + + + /** + * This method sets the resetLimit object value. + * @param resetLimit the resetLimit object new value. + * + */ + public void setResetLimit(int resetLimit) + { + this.resetLimit = resetLimit; + } + + + /** + * This method sets the resetConfirmation object value. + * @param resetConfirmation the resetConfirmation object new value. + * + */ + public void setResetConfirmation(boolean resetConfirmation) + { + this.resetConfirmation = resetConfirmation; + } + + + /** + * This method sets the leaversLoseReset object value. + * @param leaversLoseReset the leaversLoseReset object new value. + * + */ + public void setLeaversLoseReset(boolean leaversLoseReset) + { + this.leaversLoseReset = leaversLoseReset; + } + + + /** + * This method sets the kickedKeepInventory object value. + * @param kickedKeepInventory the kickedKeepInventory object new value. + * + */ + public void setKickedKeepInventory(boolean kickedKeepInventory) + { + this.kickedKeepInventory = kickedKeepInventory; + } + + + /** + * This method sets the onJoinResetMoney object value. + * @param onJoinResetMoney the onJoinResetMoney object new value. + * + */ + public void setOnJoinResetMoney(boolean onJoinResetMoney) + { + this.onJoinResetMoney = onJoinResetMoney; + } + + + /** + * This method sets the onJoinResetInventory object value. + * @param onJoinResetInventory the onJoinResetInventory object new value. + * + */ + public void setOnJoinResetInventory(boolean onJoinResetInventory) + { + this.onJoinResetInventory = onJoinResetInventory; + } + + + /** + * This method sets the onJoinResetEnderChest object value. + * @param onJoinResetEnderChest the onJoinResetEnderChest object new value. + * + */ + public void setOnJoinResetEnderChest(boolean onJoinResetEnderChest) + { + this.onJoinResetEnderChest = onJoinResetEnderChest; + } + + + /** + * This method sets the onLeaveResetMoney object value. + * @param onLeaveResetMoney the onLeaveResetMoney object new value. + * + */ + public void setOnLeaveResetMoney(boolean onLeaveResetMoney) + { + this.onLeaveResetMoney = onLeaveResetMoney; + } + + + /** + * This method sets the onLeaveResetInventory object value. + * @param onLeaveResetInventory the onLeaveResetInventory object new value. + * + */ + public void setOnLeaveResetInventory(boolean onLeaveResetInventory) + { + this.onLeaveResetInventory = onLeaveResetInventory; + } + + + /** + * This method sets the onLeaveResetEnderChest object value. + * @param onLeaveResetEnderChest the onLeaveResetEnderChest object new value. + * + */ + public void setOnLeaveResetEnderChest(boolean onLeaveResetEnderChest) + { + this.onLeaveResetEnderChest = onLeaveResetEnderChest; + } + + + /** + * This method sets the respawnOnIsland object value. + * @param respawnOnIsland the respawnOnIsland object new value. + * + */ + public void setRespawnOnIsland(boolean respawnOnIsland) + { + this.respawnOnIsland = respawnOnIsland; + } + + + /** + * This method sets the allowSetHomeInNether object value. + * @param allowSetHomeInNether the allowSetHomeInNether object new value. + * + */ + public void setAllowSetHomeInNether(boolean allowSetHomeInNether) + { + this.allowSetHomeInNether = allowSetHomeInNether; + } + + + /** + * This method sets the requireConfirmationToSetHomeInNether object value. + * @param requireConfirmationToSetHomeInNether the requireConfirmationToSetHomeInNether object new value. + * + */ + public void setRequireConfirmationToSetHomeInNether(boolean requireConfirmationToSetHomeInNether) + { + this.requireConfirmationToSetHomeInNether = requireConfirmationToSetHomeInNether; + } + + + /** + * This method sets the allowSetHomeInTheEnd object value. + * @param allowSetHomeInTheEnd the allowSetHomeInTheEnd object new value. + * + */ + public void setAllowSetHomeInTheEnd(boolean allowSetHomeInTheEnd) + { + this.allowSetHomeInTheEnd = allowSetHomeInTheEnd; + } + + + /** + * This method sets the requireConfirmationToSetHomeInTheEnd object value. + * @param requireConfirmationToSetHomeInTheEnd the requireConfirmationToSetHomeInTheEnd object new value. + * + */ + public void setRequireConfirmationToSetHomeInTheEnd(boolean requireConfirmationToSetHomeInTheEnd) + { + this.requireConfirmationToSetHomeInTheEnd = requireConfirmationToSetHomeInTheEnd; + } + + + /** + * This method sets the deathsCounted object value. + * @param deathsCounted the deathsCounted object new value. + * + */ + public void setDeathsCounted(boolean deathsCounted) + { + this.deathsCounted = deathsCounted; + } + + + /** + * This method sets the deathsMax object value. + * @param deathsMax the deathsMax object new value. + * + */ + public void setDeathsMax(int deathsMax) + { + this.deathsMax = deathsMax; + } + + + /** + * This method sets the deathsSumTeam object value. + * @param deathsSumTeam the deathsSumTeam object new value. + * + */ + public void setDeathsSumTeam(boolean deathsSumTeam) + { + this.deathsSumTeam = deathsSumTeam; + } + + + /** + * This method sets the teamJoinDeathReset object value. + * @param teamJoinDeathReset the teamJoinDeathReset object new value. + * + */ + public void setTeamJoinDeathReset(boolean teamJoinDeathReset) + { + this.teamJoinDeathReset = teamJoinDeathReset; + } + + + /** + * This method sets the geoLimitSettings object value. + * @param geoLimitSettings the geoLimitSettings object new value. + * + */ + public void setGeoLimitSettings(List geoLimitSettings) + { + this.geoLimitSettings = geoLimitSettings; + } + + + /** + * This method sets the ivSettings object value. + * @param ivSettings the ivSettings object new value. + * + */ + public void setIvSettings(List ivSettings) + { + this.ivSettings = ivSettings; + } + + + /** + * This method sets the closePanelOnClickOutside object value. + * @param closePanelOnClickOutside the closePanelOnClickOutside object new value. + * + */ + public void setClosePanelOnClickOutside(boolean closePanelOnClickOutside) + { + this.closePanelOnClickOutside = closePanelOnClickOutside; + } + + + /** + * This method sets the resetEpoch object value. + * @param resetEpoch the resetEpoch object new value. + * + */ + @Override + public void setResetEpoch(long resetEpoch) + { + this.resetEpoch = resetEpoch; + } + + + /** + * This method sets the worldDepth value. + * @param worldDepth the worldDepth new value. + * + */ + public void setWorldDepth(int worldDepth) + { + this.worldDepth = worldDepth; + } + + + /** + * This method sets the normalRoof value. + * @param normalRoof the normalRoof new value. + * + */ + public void setNormalRoof(boolean normalRoof) + { + this.normalRoof = normalRoof; + } + + + /** + * This method sets the normalFloor value. + * @param normalFloor the normalFloor new value. + * + */ + public void setNormalFloor(boolean normalFloor) + { + this.normalFloor = normalFloor; + } + + + /** + * This method sets the normalMainBlock value. + * @param normalMainBlock the normalMainBlock new value. + * + */ + public void setNormalMainBlock(Material normalMainBlock) + { + this.normalMainBlock = normalMainBlock; + } + + + /** + * This method sets the normalBlocks value. + * @param normalBlocks the normalBlocks new value. + * + */ + public void setNormalBlocks(List normalBlocks) + { + this.normalBlocks = normalBlocks; + } + + + /** + * This method sets the netherFloor value. + * @param netherFloor the netherFloor new value. + * + */ + public void setNetherFloor(boolean netherFloor) + { + this.netherFloor = netherFloor; + } + + + /** + * This method sets the netherMainBlock value. + * @param netherMainBlock the netherMainBlock new value. + * + */ + public void setNetherMainBlock(Material netherMainBlock) + { + this.netherMainBlock = netherMainBlock; + } + + + /** + * This method sets the netherBlocks value. + * @param netherBlocks the netherBlocks new value. + * + */ + public void setNetherBlocks(List netherBlocks) + { + this.netherBlocks = netherBlocks; + } + + + /** + * This method sets the endRoof value. + * @param endRoof the endRoof new value. + * + */ + public void setEndRoof(boolean endRoof) + { + this.endRoof = endRoof; + } + + + /** + * This method sets the endFloor value. + * @param endFloor the endFloor new value. + * + */ + public void setEndFloor(boolean endFloor) + { + this.endFloor = endFloor; + } + + + /** + * This method sets the endMainBlock value. + * @param endMainBlock the endMainBlock new value. + * + */ + public void setEndMainBlock(Material endMainBlock) + { + this.endMainBlock = endMainBlock; + } + + + /** + * This method sets the endBlocks value. + * @param endBlocks the endBlocks new value. + * + */ + public void setEndBlocks(List endBlocks) + { + this.endBlocks = endBlocks; + } + + + /** + * This method sets the numberOfBlockGenerationTries value. + * @param numberOfBlockGenerationTries the numberOfBlockGenerationTries new value. + * + */ + public void setNumberOfBlockGenerationTries(int numberOfBlockGenerationTries) + { + this.numberOfBlockGenerationTries = numberOfBlockGenerationTries; + } + + + /** + * @return the debug + */ + public boolean isDebug() { + return debug; + } + + + /** + * @param debug the debug to set + */ + public void setDebug(boolean debug) { + this.debug = debug; + } + + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- + + /* WORLD */ + @ConfigComment("Friendly name for this world. Used in admin commands. Must be a single word") + @ConfigEntry(path = "world.friendly-name") + private String friendlyName = "CaveBlock"; + + @ConfigComment("Name of the world - if it does not exist then it will be generated.") + @ConfigComment("It acts like a prefix for nether and end (e.g. CaveBlock-world, CaveBlock-world_nether, CaveBlock-world_end)") + @ConfigEntry(path = "world.world-name") + private String worldName = "CaveBlock-world"; + + @ConfigComment("World difficulty setting - PEACEFUL, EASY, NORMAL, HARD") + @ConfigComment("Other plugins may override this setting") + @ConfigEntry(path = "world.difficulty") + private Difficulty difficulty = Difficulty.NORMAL; + + @ConfigComment("Radius of cave in blocks. (So distance between caves is twice this)") + @ConfigComment("Will be rounded up to the nearest 16 blocks.") + @ConfigComment("It is the same for every dimension : Overworld, Nether and End.") + @ConfigComment("This value cannot be changed mid-game and the plugin will not start if it is different.") + @ConfigEntry(path = "world.distance-between-caves", needsReset = true) + private int islandDistance = 100; + + @ConfigComment("Default protection range radius in blocks. Cannot be larger than distance.") + @ConfigComment("Admins can change protection sizes for players individually using /cbadmin range set ") + @ConfigComment("or set this permission: caveblock.island.range.") + @ConfigEntry(path = "world.protection-range") + private int islandProtectionRange = 50; + + @ConfigComment("Start islands at these coordinates. This is where new islands will start in the") + @ConfigComment("world. These must be a factor of your island distance, but the plugin will auto") + @ConfigComment("calculate the closest location on the grid. Islands develop around this location") + @ConfigComment("both positively and negatively in a square grid.") + @ConfigComment("If none of this makes sense, leave it at 0,0.") + @ConfigEntry(path = "world.start-x", needsReset = true) + private int islandStartX = 0; + + @ConfigEntry(path = "world.start-z", needsReset = true) + private int islandStartZ = 0; + + @ConfigEntry(path = "world.offset-x") + private int islandXOffset; + @ConfigEntry(path = "world.offset-z") + private int islandZOffset; + + @ConfigComment("Cave height - Lowest is 5.") + @ConfigComment("It is the y coordinate of the bedrock block in the schem.") + @ConfigEntry(path = "world.cave-height") + private int islandHeight = 60; + + @ConfigComment("Use your own world generator for this world.") + @ConfigComment("In this case, the plugin will not generate anything.") + @ConfigEntry(path = "world.use-own-generator", experimental = true) + private boolean useOwnGenerator = true; + + @ConfigComment("Maximum number of islands in the world. Set to -1 or 0 for unlimited.") + @ConfigComment("If the number of islands is greater than this number, it will stop players from creating islands.") + @ConfigEntry(path = "world.max-islands") + private int maxIslands = -1; + + @ConfigComment("The default game mode for this world. Players will be set to this mode when they create") + @ConfigComment("a new island for example. Options are SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR") + @ConfigEntry(path = "world.default-game-mode") + private GameMode defaultGameMode = GameMode.SURVIVAL; + + @ConfigComment("The default biome for the overworld") + @ConfigEntry(path = "world.default-biome") + private Biome defaultBiome = Biome.MOUNTAINS; + + @ConfigComment("The maximum number of players a player can ban at any one time in this game mode.") + @ConfigComment("The permission acidisland.ban.maxlimit.X where X is a number can also be used per player") + @ConfigComment("-1 = unlimited") + @ConfigEntry(path = "world.ban-limit") + private int banLimit = -1; + + @ConfigComment("") + @ConfigComment("This is cave... no height... only depth. Max 256.") + @ConfigComment("Should not be less then island height.") + @ConfigEntry(path = "world.world-depth", needsReset = true) + private int worldDepth = 256; + + @ConfigComment("This indicate how many times block should be tried to generate.") + @ConfigEntry(path = "world.generation-tries", needsReset = true) + private int numberOfBlockGenerationTries = 1; + + @ConfigComment("") + @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") + @ConfigEntry(path = "world.normal.roof", needsReset = true) + private boolean normalRoof = true; + + @ConfigComment("Make over world floor of bedrock, if false, it will be made from stone") + @ConfigEntry(path = "world.normal.floor", needsReset = true) + private boolean normalFloor = true; + + @ConfigComment("Main block of which world will be generated.") + @ConfigEntry(path = "world.normal.main-block", needsReset = true) + private Material normalMainBlock = Material.STONE; + + @ConfigComment("Blocks that will occasionally replace main block by random chance.") + @ConfigComment("Blocks will replace only main-block and will try to create packs that") + @ConfigComment("are set in their strings. Chance of spawning also is required.") + @ConfigComment("For materials first string must be MATERIAL, for entity: ENTITY.") + @ConfigComment("Entities spawned via generator are not protected from despawing.") + @ConfigComment("Working only with 2 high mobs currently.") + @ConfigComment("Example:") + @ConfigComment("MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds") + @ConfigComment("where max amount in pack are 5 per each subchunk!") + @ConfigEntry(path = "world.normal.blocks", needsReset = true) + private List normalBlocks = new ArrayList<>(); + + // Nether + @ConfigComment("Generate Nether - if this is false, the nether world will not be made and access to") + @ConfigComment("the nether will not occur. Other plugins may still enable portal usage.") + @ConfigComment("Note: Some default challenges will not be possible if there is no nether.") + @ConfigComment("Note that with a standard nether all players arrive at the same portal and entering a") + @ConfigComment("portal will return them back to their islands.") + @ConfigEntry(path = "world.nether.generate") + private boolean netherGenerate = true; + + @ConfigComment("Islands in Nether. Change to false for standard vanilla nether.") + @ConfigEntry(path = "world.nether.islands", needsReset = true) + private boolean netherIslands = true; + + @ConfigComment("Nether trees are made if a player grows a tree in the nether (gravel and glowstone)") + @ConfigComment("Applies to both vanilla and islands Nether") + @ConfigEntry(path = "world.nether.trees") + private boolean netherTrees = true; + + @ConfigComment("Nether spawn protection radius - this is the distance around the nether spawn") + @ConfigComment("that will be protected from player interaction (breaking blocks, pouring lava etc.)") + @ConfigComment("Minimum is 0 (not recommended), maximum is 100. Default is 25.") + @ConfigComment("Only applies to vanilla nether") + @ConfigEntry(path = "world.nether.spawn-radius") + private int netherSpawnRadius = 32; + + @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") + @ConfigEntry(path = "world.nether.roof", needsReset = true) + private boolean netherRoof = true; + + @ConfigComment("Make over world floor of bedrock, if false, it will be made from stone") + @ConfigEntry(path = "world.nether.floor", needsReset = true) + private boolean netherFloor = true; + + @ConfigComment("Main block of which world will be generated.") + @ConfigEntry(path = "world.nether.main-block", needsReset = true) + private Material netherMainBlock = Material.STONE; + + @ConfigComment("Blocks that will occasionally replace main block by random chance.") + @ConfigComment("Blocks will replace only main-block and will try to create packs that") + @ConfigComment("are set in their strings. Chance of spawning also is required.") + @ConfigComment("For materials first string must be MATERIAL, for entity: ENTITY.") + @ConfigComment("Entities spawned via generator are not protected from despawing.") + @ConfigComment("Working only with 2 high mobs currently.") + @ConfigComment("Example:") + @ConfigComment("MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds") + @ConfigComment("where max amount in pack are 5 per each subchunk!") + @ConfigEntry(path = "world.nether.blocks", needsReset = true) + private List netherBlocks = new ArrayList<>(); + + // End + @ConfigEntry(path = "world.end.generate") + private boolean endGenerate = true; + + @ConfigEntry(path = "world.end.islands", needsReset = true) + private boolean endIslands = true; + + @ConfigEntry(path = "world.end.dragon-spawn", experimental = true) + private boolean dragonSpawn = false; + + @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") + @ConfigEntry(path = "world.end.roof", needsReset = true) + private boolean endRoof = true; + + @ConfigComment("Make over world floor of bedrock, if false, it will be made from stone") + @ConfigEntry(path = "world.end.floor", needsReset = true) + private boolean endFloor = true; + + @ConfigComment("Main block of which world will be generated.") + @ConfigEntry(path = "world.end.main-block", needsReset = true) + private Material endMainBlock = Material.STONE; + + @ConfigComment("Blocks that will occasionally replace main block by random chance.") + @ConfigComment("Blocks will replace only main-block and will try to create packs that") + @ConfigComment("are set in their strings. Chance of spawning also is required.") + @ConfigComment("For materials first string must be MATERIAL, for entity: ENTITY.") + @ConfigComment("Entities spawned via generator are not protected from despawing.") + @ConfigComment("Working only with 2 high mobs currently.") + @ConfigComment("Example:") + @ConfigComment("MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds") + @ConfigComment("where max amount in pack are 5 per each subchunk!") + @ConfigEntry(path = "world.end.blocks", needsReset = true) + private List endBlocks = new ArrayList<>(); + + // Other staff. + + @ConfigComment("Mob white list - these mobs will NOT be removed when logging in or doing /cave") + @ConfigEntry(path = "world.remove-mobs-whitelist") + private Set removeMobsWhitelist = new HashSet<>(); + + @ConfigComment("World flags. These are boolean settings for various flags for this world") + @ConfigEntry(path = "world.flags") + private Map worldFlags = new HashMap<>(); + + @ConfigComment("These are the default protection settings for new islands.") + @ConfigComment("The value is the minimum island rank required allowed to do the action") + @ConfigComment("Ranks are: Visitor = 0, Member = 900, Owner = 1000") + @ConfigEntry(path = "world.default-island-flags") + @Adapter(FlagSerializer.class) + private Map defaultIslandFlags = new HashMap<>(); + + @ConfigComment("These are the default settings for new islands") + @ConfigEntry(path = "world.default-island-settings") + @Adapter(FlagSerializer2.class) + private Map defaultIslandSettings = new HashMap<>(); + + @ConfigComment("These are the settings visible to users. (Not implemented yet)") + @ConfigEntry(path = "world.visible-settings", experimental = true) + private List visibleSettings = new ArrayList<>(); + + @ConfigComment("Visitor banned commands - Visitors to islands cannot use these commands in this world") + @ConfigEntry(path = "world.visitor-banned-commands") + private List visitorBannedCommands = new ArrayList<>(); + + // --------------------------------------------- + + /* ISLAND */ + @ConfigComment("Default max team size") + @ConfigComment("Permission size cannot be less than the default below. ") + @ConfigEntry(path = "island.max-team-size") + private int maxTeamSize = 4; + + @ConfigComment("Default maximum number of homes a player can have. Min = 1") + @ConfigComment("Accessed via /cave sethome or /cave go ") + @ConfigEntry(path = "island.max-homes") + private int maxHomes = 5; + + // Reset + @ConfigComment("How many resets a player is allowed (override with /cbadmin clearresets )") + @ConfigComment("Value of -1 means unlimited, 0 means hardcore - no resets.") + @ConfigComment("Example, 2 resets means they get 2 resets or 3 islands lifetime") + @ConfigEntry(path = "island.reset.reset-limit") + private int resetLimit = -1; + + @ConfigEntry(path = "island.require-confirmation.reset") + private boolean resetConfirmation = true; + + @ConfigComment("Kicked or leaving players lose resets") + @ConfigComment("Players who leave a team will lose an island reset chance") + @ConfigComment("If a player has zero resets left and leaves a team, they cannot make a new") + @ConfigComment("island by themselves and can only join a team.") + @ConfigComment("Leave this true to avoid players exploiting free islands") + @ConfigEntry(path = "island.reset.leavers-lose-reset") + private boolean leaversLoseReset = false; + + @ConfigComment("Allow kicked players to keep their inventory.") + @ConfigComment("If false, kicked player's inventory will be thrown at the island leader if the") + @ConfigComment("kicked player is online and in the island world.") + @ConfigEntry(path = "island.reset.kicked-keep-inventory") + private boolean kickedKeepInventory = false; + + @ConfigComment("What the plugin should reset when the player joins or creates an island") + @ConfigComment("Reset Money - if this is true, will reset the player's money to the starting money") + @ConfigComment("Recommendation is that this is set to true, but if you run multi-worlds") + @ConfigComment("make sure your economy handles multi-worlds too.") + @ConfigEntry(path = "island.reset.on-join.money") + private boolean onJoinResetMoney = false; + + @ConfigComment("Reset inventory - if true, the player's inventory will be cleared.") + @ConfigComment("Note: if you have MultiInv running or a similar inventory control plugin, that") + @ConfigComment("plugin may still reset the inventory when the world changes.") + @ConfigEntry(path = "island.reset.on-join.inventory") + private boolean onJoinResetInventory = false; + + @ConfigComment("Reset Ender Chest - if true, the player's Ender Chest will be cleared.") + @ConfigEntry(path = "island.reset.on-join.ender-chest") + private boolean onJoinResetEnderChest = false; + + @ConfigComment("What the plugin should reset when the player leaves or is kicked from an island") + @ConfigComment("Reset Money - if this is true, will reset the player's money to the starting money") + @ConfigComment("Recommendation is that this is set to true, but if you run multi-worlds") + @ConfigComment("make sure your economy handles multi-worlds too.") + @ConfigEntry(path = "island.reset.on-leave.money") + private boolean onLeaveResetMoney = false; + + @ConfigComment("Reset inventory - if true, the player's inventory will be cleared.") + @ConfigComment("Note: if you have MultiInv running or a similar inventory control plugin, that") + @ConfigComment("plugin may still reset the inventory when the world changes.") + @ConfigEntry(path = "island.reset.on-leave.inventory") + private boolean onLeaveResetInventory = false; + + @ConfigComment("Reset Ender Chest - if true, the player's Ender Chest will be cleared.") + @ConfigEntry(path = "island.reset.on-leave.ender-chest") + private boolean onLeaveResetEnderChest = false; + + @ConfigComment("Have player's respawn on their island if they die") + @ConfigEntry(path = "island.respawn-on-island") + private boolean respawnOnIsland = true; + + // Sethome + @ConfigEntry(path = "island.sethome.nether.allow") + private boolean allowSetHomeInNether = true; + + @ConfigEntry(path = "island.sethome.nether.require-confirmation") + private boolean requireConfirmationToSetHomeInNether = true; + + @ConfigEntry(path = "island.sethome.the-end.allow") + private boolean allowSetHomeInTheEnd = true; + + @ConfigEntry(path = "island.sethome.the-end.require-confirmation") + private boolean requireConfirmationToSetHomeInTheEnd = true; + + // Deaths + @ConfigComment("Whether deaths are counted or not.") + @ConfigEntry(path = "island.deaths.counted") + private boolean deathsCounted = true; + + @ConfigComment("Maximum number of deaths to count. The death count can be used by add-ons.") + @ConfigEntry(path = "island.deaths.max") + private int deathsMax = 10; + + @ConfigEntry(path = "island.deaths.sum-team") + private boolean deathsSumTeam = false; + + @ConfigComment("When a player joins a team, reset their death count") + @ConfigEntry(path = "island.deaths.team-join-reset") + private boolean teamJoinDeathReset = true; + + // --------------------------------------------- + /* PROTECTION */ + + @ConfigComment("Geo restrict mobs.") + @ConfigComment("Mobs that exit the island space where they were spawned will be removed.") + @ConfigEntry(path = "protection.geo-limit-settings") + private List geoLimitSettings = new ArrayList<>(); + + // Invincible visitor settings + @ConfigComment("Invincible visitors. List of damages that will not affect visitors.") + @ConfigComment("Make list blank if visitors should receive all damages") + @ConfigEntry(path = "protection.invincible-visitors") + private List ivSettings = new ArrayList<>(); + + //---------------------------------------------------------------------------------------/ + + @ConfigComment("Whether GUIs should be closed when the player clicks outside.") + @ConfigEntry(path = "panel.close-on-click-outside") + private boolean closePanelOnClickOutside = true; + + //---------------------------------------------------------------------------------------/ + @ConfigComment("These settings should not be edited") + @ConfigEntry(path = "do-not-edit-these-settings.reset-epoch") + private long resetEpoch = 0; + private boolean debug; + + private String uniqueId = "config"; } diff --git a/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java b/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java index 68999fa..c3740ac 100644 --- a/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java +++ b/src/main/java/world/bentobox/caveblock/generators/ChunkGeneratorWorld.java @@ -1,11 +1,14 @@ package world.bentobox.caveblock.generators; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + import org.bukkit.Material; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; -import java.util.*; import world.bentobox.caveblock.CaveBlock; import world.bentobox.caveblock.Settings; @@ -21,190 +24,199 @@ import world.bentobox.caveblock.generators.populators.MaterialPopulator; */ public class ChunkGeneratorWorld extends ChunkGenerator { -// --------------------------------------------------------------------- -// Section: Constructor -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Constructor + // --------------------------------------------------------------------- - /** - * @param addon - CaveBlock object - */ - public ChunkGeneratorWorld(CaveBlock addon) - { - super(); - this.addon = addon; - this.settings = addon.getSettings(); + /** + * @param addon - CaveBlock object + */ + public ChunkGeneratorWorld(CaveBlock addon) + { + super(); + this.addon = addon; + this.settings = addon.getSettings(); - this.blockPopulators = new ArrayList<>(1); - - this.blockPopulators.add(new MaterialPopulator(this.addon)); - this.blockPopulators.add(new EntitiesPopulator(this.addon)); - } + reload(); + } -// --------------------------------------------------------------------- -// Section: Methods -// --------------------------------------------------------------------- + // --------------------------------------------------------------------- + // Section: Methods + // --------------------------------------------------------------------- - /** - * This method sets if given coordinates can be set as spawn location - */ - @Override - public boolean canSpawn(World world, int x, int z) - { - return true; - } + /** + * This method sets if given coordinates can be set as spawn location + */ + @Override + public boolean canSpawn(World world, int x, int z) + { + return true; + } - /** - * This method generates given chunk. - * @param world World where chunk must be generated. - * @param random Random that allows define object randomness. - * @param chunkX Chunk X coordinate. - * @param chunkZ Chunk Z coordinate. - * @param biomeGrid BiomeGrid that contains biomes. - * @return new ChunkData for given chunk. - */ - @Override - public ChunkData generateChunkData(World world, - Random random, - int chunkX, - int chunkZ, - ChunkGenerator.BiomeGrid biomeGrid) - { - ChunkData result = this.createChunkData(world); + /** + * This method generates given chunk. + * @param world World where chunk must be generated. + * @param random Random that allows define object randomness. + * @param chunkX Chunk X coordinate. + * @param chunkZ Chunk Z coordinate. + * @param biomeGrid BiomeGrid that contains biomes. + * @return new ChunkData for given chunk. + */ + @Override + public ChunkData generateChunkData(World world, + Random random, + int chunkX, + int chunkZ, + ChunkGenerator.BiomeGrid biomeGrid) + { + ChunkData result = this.createChunkData(world); - // Populate chunk with necessary information - if (world.getEnvironment().equals(World.Environment.NETHER)) - { - this.populateNetherChunk(result); - } - else if (world.getEnvironment().equals(World.Environment.THE_END)) - { - this.populateTheEndChunk(result); - } - else - { - this.populateOverWorldChunk(result, biomeGrid); - } + // Populate chunk with necessary information + if (world.getEnvironment().equals(World.Environment.NETHER)) + { + this.populateNetherChunk(result); + } + else if (world.getEnvironment().equals(World.Environment.THE_END)) + { + this.populateTheEndChunk(result); + } + else + { + this.populateOverWorldChunk(result, biomeGrid); + } - return result; - } + return result; + } - /** - * This method populates The End world chunk data. - * @param chunkData ChunkData that must be populated. - */ - private void populateTheEndChunk(ChunkData chunkData) - { - // because everything starts at 0 and ends at 255 - final int worldHeight = this.settings.getWorldDepth(); + /** + * This method populates The End world chunk data. + * @param chunkData ChunkData that must be populated. + */ + private void populateTheEndChunk(ChunkData chunkData) + { + // because everything starts at 0 and ends at 255 + final int worldHeight = this.settings.getWorldDepth(); - // Fill all blocks - chunkData.setRegion(0, 1, 0, - 16, worldHeight - 1, 16, - this.settings.getEndMainBlock()); + // Fill all blocks + chunkData.setRegion(0, 1, 0, + 16, worldHeight - 1, 16, + this.settings.getEndMainBlock()); - // Generate ground and ceiling. - chunkData.setRegion(0, 0, 0, - 16, 1, 16, - this.settings.isEndFloor() ? Material.BEDROCK : this.settings.getEndMainBlock()); - chunkData.setRegion(0, worldHeight - 1, 0, - 16, worldHeight, 16, - this.settings.isEndRoof() ? Material.BEDROCK : this.settings.getEndMainBlock()); - } + // Generate ground and ceiling. + chunkData.setRegion(0, 0, 0, + 16, 1, 16, + this.settings.isEndFloor() ? Material.BEDROCK : this.settings.getEndMainBlock()); + chunkData.setRegion(0, worldHeight - 1, 0, + 16, worldHeight, 16, + this.settings.isEndRoof() ? Material.BEDROCK : this.settings.getEndMainBlock()); + } - /** - * This method populates nether world chunk data. - * @param chunkData ChunkData that must be populated. - */ - private void populateNetherChunk(ChunkData chunkData) - { - // because everything starts at 0 and ends at 255 - final int worldHeight = this.settings.getWorldDepth(); + /** + * This method populates nether world chunk data. + * @param chunkData ChunkData that must be populated. + */ + private void populateNetherChunk(ChunkData chunkData) + { + // because everything starts at 0 and ends at 255 + final int worldHeight = this.settings.getWorldDepth(); - // Fill all blocks - chunkData.setRegion(0, 1, 0, - 16, worldHeight - 1, 16, - this.settings.getNetherMainBlock()); + // Fill all blocks + chunkData.setRegion(0, 1, 0, + 16, worldHeight - 1, 16, + this.settings.getNetherMainBlock()); - // Generate ground and ceiling. - chunkData.setRegion(0, 0, 0, - 16, 1, 16, - this.settings.isNetherFloor() ? Material.BEDROCK : this.settings.getNetherMainBlock()); - chunkData.setRegion(0, worldHeight - 1, 0, - 16, worldHeight, 16, - this.settings.isNetherRoof() ? Material.BEDROCK : this.settings.getNetherMainBlock()); - } + // Generate ground and ceiling. + chunkData.setRegion(0, 0, 0, + 16, 1, 16, + this.settings.isNetherFloor() ? Material.BEDROCK : this.settings.getNetherMainBlock()); + chunkData.setRegion(0, worldHeight - 1, 0, + 16, worldHeight, 16, + this.settings.isNetherRoof() ? Material.BEDROCK : this.settings.getNetherMainBlock()); + } - /** - * This method populates Over world chunk data. - * @param chunkData ChunkData that must be populated. - * @param biomeGrid BiomeGrid for this chunk. - */ - private void populateOverWorldChunk(ChunkData chunkData, BiomeGrid biomeGrid) - { - // because everything starts at 0 and ends at 255 - final int worldHeight = this.settings.getWorldDepth(); + /** + * This method populates Over world chunk data. + * @param chunkData ChunkData that must be populated. + * @param biomeGrid BiomeGrid for this chunk. + */ + private void populateOverWorldChunk(ChunkData chunkData, BiomeGrid biomeGrid) + { + // because everything starts at 0 and ends at 255 + final int worldHeight = this.settings.getWorldDepth(); - // Fill all blocks - chunkData.setRegion(0, 1, 0, - 16, worldHeight - 1, 16, - this.settings.getNormalMainBlock()); + // Fill all blocks + chunkData.setRegion(0, 1, 0, + 16, worldHeight - 1, 16, + this.settings.getNormalMainBlock()); - // Generate ground and ceiling. - chunkData.setRegion(0, 0, 0, - 16, 1, 16, - this.settings.isNormalFloor() ? Material.BEDROCK : this.settings.getNormalMainBlock()); - chunkData.setRegion(0, worldHeight - 1, 0, - 16, worldHeight, 16, - this.settings.isNormalRoof() ? Material.BEDROCK : this.settings.getNormalMainBlock()); + // Generate ground and ceiling. + chunkData.setRegion(0, 0, 0, + 16, 1, 16, + this.settings.isNormalFloor() ? Material.BEDROCK : this.settings.getNormalMainBlock()); + chunkData.setRegion(0, worldHeight - 1, 0, + 16, worldHeight, 16, + this.settings.isNormalRoof() ? Material.BEDROCK : this.settings.getNormalMainBlock()); - // Set biome - for (int x = 0; x < 16; x++) - { - for (int z = 0; z < 16; z++) - { - biomeGrid.setBiome(x, z, this.settings.getDefaultBiome()); - } - } - } + // Set biome + for (int x = 0; x < 16; x++) + { + for (int z = 0; z < 16; z++) + { + biomeGrid.setBiome(x, z, this.settings.getDefaultBiome()); + } + } + } - /** - * This method set world block populators. - * @param world World where this must apply. - * @return List with block populators. - */ - @Override - public List getDefaultPopulators(final World world) - { - return this.blockPopulators; - } + /** + * This method set world block populators. + * @param world World where this must apply. + * @return List with block populators. + */ + @Override + public List getDefaultPopulators(final World world) + { + return this.blockPopulators; + } + + /** + * Called when config is reloaded + */ + public void reload() { + this.blockPopulators = new ArrayList<>(2); + + this.blockPopulators.add(new MaterialPopulator(this.addon)); + this.blockPopulators.add(new EntitiesPopulator(this.addon)); + + } + + // --------------------------------------------------------------------- + // Section: Variables + // --------------------------------------------------------------------- -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- + /** + * CaveBlock addon. + */ + private CaveBlock addon; + + /** + * Addon settings. + */ + private Settings settings; + + /** + * This list contains block populators that will be applied after chunk is generated. + */ + private List blockPopulators; - /** - * CaveBlock addon. - */ - private CaveBlock addon; - - /** - * Addon settings. - */ - private Settings settings; - - /** - * This list contains block populators that will be applied after chunk is generated. - */ - private List blockPopulators; } diff --git a/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java b/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java index 6b0c08f..ab2420e 100644 --- a/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java +++ b/src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java @@ -13,27 +13,23 @@ import org.bukkit.Material; import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.generator.BlockPopulator; +import org.bukkit.util.BoundingBox; import world.bentobox.bentobox.util.Pair; import world.bentobox.caveblock.CaveBlock; -import world.bentobox.caveblock.Settings; /** - * This class populates generated chunk with enitites by random chance. + * This class populates generated chunk with entites by random chance. */ public class EntitiesPopulator extends BlockPopulator { - private Map chances; - - private final int generationTry; - - private int worldHeight; - - /** * This is default constructor * @param addon CaveBlock addon. @@ -41,18 +37,21 @@ public class EntitiesPopulator extends BlockPopulator public EntitiesPopulator(CaveBlock addon) { this.addon = addon; - this.settings = addon.getSettings(); + loadSettings(); + } + + + public void loadSettings() { // Set up chances chances = new HashMap<>(); // Normal - chances.put(Environment.NORMAL, new Chances(this.getEntityMap(this.settings.getNormalBlocks()), this.settings.getNormalMainBlock())); + chances.put(Environment.NORMAL, new Chances(this.getEntityMap(addon.getSettings().getNormalBlocks()), addon.getSettings().getNormalMainBlock())); // Nether - chances.put(Environment.NETHER, new Chances(this.getEntityMap(this.settings.getNetherBlocks()), this.settings.getNetherMainBlock())); + chances.put(Environment.NETHER, new Chances(this.getEntityMap(addon.getSettings().getNetherBlocks()), addon.getSettings().getNetherMainBlock())); // End - chances.put(Environment.THE_END, new Chances(this.getEntityMap(this.settings.getEndBlocks()), this.settings.getEndMainBlock())); + chances.put(Environment.THE_END, new Chances(this.getEntityMap(addon.getSettings().getEndBlocks()), addon.getSettings().getEndMainBlock())); // Other settings - generationTry = this.settings.getNumberOfBlockGenerationTries(); - worldHeight = this.settings.getWorldDepth() - 1; + worldHeight = addon.getSettings().getWorldDepth() - 1; } @@ -65,20 +64,16 @@ public class EntitiesPopulator extends BlockPopulator @Override public void populate(World world, Random random, Chunk chunk) { - for (Map.Entry> entry : chances.get(world.getEnvironment()).entityChanceMap.entrySet()) + for (Map.Entry> entry : chances.get(world.getEnvironment()).entityChanceMap.entrySet()) { for (int subY = 0; subY < worldHeight; subY += 16) { - for (int tries = 0; tries < generationTry; tries++) + // Use double so chance can be < 1 + if (random.nextDouble() * 100 < entry.getValue().x) { - if (random.nextInt(100) < entry.getValue().x) - { - int x = random.nextInt(15); - int z = random.nextInt(15); - int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); - - this.tryToPlaceEntity(world, chunk.getBlock(x, y, z), entry.getKey(), x, z, chances.get(world.getEnvironment()).mainMaterial); - } + int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); + // Spawn only in middle of chunk because bounding box will grow out from here + this.tryToPlaceEntity(world, chunk.getBlock(7, y, 7), entry.getKey(), chances.get(world.getEnvironment()).mainMaterial); } } } @@ -90,9 +85,9 @@ public class EntitiesPopulator extends BlockPopulator * @param objectList List with objects that contains data. * @return Map that contains entity, its rarity and pack size. */ - private Map> getEntityMap(List objectList) + private Map> getEntityMap(List objectList) { - Map> entityMap = new HashMap<>(objectList.size()); + Map> entityMap = new HashMap<>(objectList.size()); Map entityTypeMap = Arrays.stream(EntityType.values()). collect(Collectors.toMap(Enum::name, @@ -111,147 +106,52 @@ public class EntitiesPopulator extends BlockPopulator if (entity != null) { entityMap.put(entity, - new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3]))); + new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3]))); } }); return entityMap; } - /** - * This method checks if all chunks around given block is generated. - * @param world World in which block is located - * @param block Block that must be checked. - * @param x Block x-index in chunk - * @param z Block z-index in chunk - * @return true, if all chunks around given block are generated. - */ - private boolean isValidBlock(World world, Block block, int x, int z) - { - return x > 0 && x < 15 && z > 0 && z < 15 || - world.isChunkGenerated(block.getX() + 1, block.getZ()) && - world.isChunkGenerated(block.getX() - 1, block.getZ()) && - world.isChunkGenerated(block.getX(), block.getZ() - 1) && - world.isChunkGenerated(block.getX(), block.getZ() + 1); - } - - - /** - * This method is not completed. It must reserve space for entities to spawn, but - * current implementation just allows to spawn 2 high mobs that can be in single - * place. + * Places entities if there is room for them. * @param world - World were mob must be spawned. - * @param block - Block that was choosed by random. + * @param block - Block that was chosen by random. * @param entity - Entity that must be spawned. - * @param x - ChunkX coordinate. - * @param z - ChunkY coordinate. - * @param originalMaterial - replacement manterial. + * @param originalMaterial - replacement material. */ - private void tryToPlaceEntity(World world, Block block, EntityType entity, int x, int z, Material originalMaterial) + private void tryToPlaceEntity(World world, Block block, EntityType entity, Material originalMaterial) { - if (this.isValidBlock(world, block, x, z) && block.getType().equals(originalMaterial)) - { - if (entity.isAlive()) - { - int height = 0; - int width = 0; - int length = 0; - boolean water = false; - - switch (entity) - { - case SPIDER: - width = 1; - length = 1; - break; - case SLIME: - case ELDER_GUARDIAN: - case GHAST: - case MAGMA_CUBE: - case WITHER: - height = 2; - width = 2; - length = 2; - break; - case ENDERMAN: - case IRON_GOLEM: - height = 2; - break; - case WITHER_SKELETON: - case STRAY: - case HUSK: - case ZOMBIE_VILLAGER: - case EVOKER: - case VINDICATOR: - case ILLUSIONER: - case CREEPER: - case SKELETON: - case ZOMBIE: - case BLAZE: - case SNOWMAN: - case VILLAGER: - case PIG_ZOMBIE: - case WITCH: - case SHULKER: - case SHEEP: - case COW: - case MUSHROOM_COW: - height = 12; - break; - case SKELETON_HORSE: - case ZOMBIE_HORSE: - case DONKEY: - case MULE: - case HORSE: - case POLAR_BEAR: - case LLAMA: - height = 1; - width = 1; - break; - case GUARDIAN: - case SQUID: - case COD: - case SALMON: - case PUFFERFISH: - case TROPICAL_FISH: - water = true; - break; - case DROWNED: - case DOLPHIN: - water = true; - height = 1; - break; - default: - break; - } - - Block otherBlock = world.getBlockAt(block.getX(), block.getY() + 1, block.getZ()); - - if (!otherBlock.getType().equals(originalMaterial)) - { - otherBlock = world.getBlockAt(block.getX(), block.getY() - 1, block.getZ()); - } - - if (otherBlock.getType().equals(originalMaterial)) - { - block.setType(Material.CAVE_AIR); - otherBlock.setType(Material.CAVE_AIR); - - if (otherBlock.getY() < block.getY()) - { - world.spawnEntity(otherBlock.getLocation(), entity); - } - else - { - world.spawnEntity(block.getLocation(), entity); - } - } + if (block.getType().equals(originalMaterial)) { + // Spawn entity + Entity e = world.spawnEntity(block.getLocation().add(0.5, 0, 0.5), entity); + if (e instanceof LivingEntity) { + // Do not despawn + ((LivingEntity)e).setRemoveWhenFarAway(false); } - else - { - block.setType(Material.CAVE_AIR); - world.spawnEntity(block.getLocation(), entity); + // Make space for entity based on the entity's size + BoundingBox bb = e.getBoundingBox(); + for (int x = (int) bb.getMinX(); x < bb.getMaxX(); x++) { + for (int z = (int) bb.getMinZ(); z < bb.getMaxZ(); z++) { + int y = (int) bb.getMinY(); + Block b = world.getBlockAt(x, y, z); + for (; y < bb.getMaxY(); y++) { + if (addon.getSettings().isDebug()) { + addon.log("DEBUG: Entity spawn: " + world.getName() + " " + x + " " + y + " " + z + " " + e.getType()); + } + b = world.getBlockAt(x, y, z); + if (!b.getType().equals(originalMaterial)) { + // Cannot place entity + e.remove(); + return; + } + b.setType(WATER_ENTITIES.contains(entity) ? Material.WATER : Material.CAVE_AIR); + } + // Add air block on top for all water entities (required for dolphin, okay for others) + if (WATER_ENTITIES.contains(entity) && b.getRelative(BlockFace.UP).getType().equals(originalMaterial)) { + b.getRelative(BlockFace.UP).setType(Material.CAVE_AIR); + } + } } } } @@ -267,24 +167,32 @@ public class EntitiesPopulator extends BlockPopulator */ private CaveBlock addon; - /** - * CaveBlock settings. - */ - private Settings settings; + private Map chances; + + private int worldHeight; + + private final static List WATER_ENTITIES = Arrays.asList(EntityType.GUARDIAN, + EntityType.SQUID, + EntityType.COD, + EntityType.SALMON, + EntityType.PUFFERFISH, + EntityType.TROPICAL_FISH, + EntityType.DROWNED, + EntityType.DOLPHIN); /** * Chances class to store chances for environments and main material * */ private class Chances { - final Map> entityChanceMap; + final Map> entityChanceMap; final Material mainMaterial; /** * @param materialChanceMap * @param mainMaterial */ - public Chances(Map> entityChanceMap, Material mainMaterial) { + public Chances(Map> entityChanceMap, Material mainMaterial) { this.entityChanceMap = entityChanceMap; this.mainMaterial = mainMaterial; } diff --git a/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java b/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java index 855ce75..9757455 100644 --- a/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java +++ b/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java @@ -16,7 +16,6 @@ import org.bukkit.generator.BlockPopulator; import world.bentobox.bentobox.util.Pair; import world.bentobox.caveblock.CaveBlock; -import world.bentobox.caveblock.Settings; /** @@ -24,11 +23,6 @@ import world.bentobox.caveblock.Settings; */ public class MaterialPopulator extends BlockPopulator { - private Map chances; - - private final int generationTry; - - private int worldHeight; /** * This is default constructor @@ -37,19 +31,25 @@ public class MaterialPopulator extends BlockPopulator public MaterialPopulator(CaveBlock addon) { this.addon = addon; - this.settings = addon.getSettings(); + // Load settings + loadSettings(); + } + + + /** + * Loads chances for Material Populator + */ + public void loadSettings() { // Set up chances chances = new HashMap<>(); // Normal - chances.put(Environment.NORMAL, new Chances(this.getMaterialMap(this.settings.getNormalBlocks()), this.settings.getNormalMainBlock())); + chances.put(Environment.NORMAL, new Chances(this.getMaterialMap(addon.getSettings().getNormalBlocks()), addon.getSettings().getNormalMainBlock())); // Nether - chances.put(Environment.NETHER, new Chances(this.getMaterialMap(this.settings.getNetherBlocks()), this.settings.getNetherMainBlock())); + chances.put(Environment.NETHER, new Chances(this.getMaterialMap(addon.getSettings().getNetherBlocks()), addon.getSettings().getNetherMainBlock())); // End - chances.put(Environment.THE_END, new Chances(this.getMaterialMap(this.settings.getEndBlocks()), this.settings.getEndMainBlock())); + chances.put(Environment.THE_END, new Chances(this.getMaterialMap(addon.getSettings().getEndBlocks()), addon.getSettings().getEndMainBlock())); // Other settings - generationTry = this.settings.getNumberOfBlockGenerationTries(); - worldHeight = this.settings.getWorldDepth() - 1; - + worldHeight = addon.getSettings().getWorldDepth() - 1; } @@ -62,65 +62,67 @@ public class MaterialPopulator extends BlockPopulator @Override public void populate(World world, Random random, Chunk chunk) { - for (Map.Entry> entry : chances.get(world.getEnvironment()).materialChanceMap.entrySet()) + for (Map.Entry> entry : chances.get(world.getEnvironment()).materialChanceMap.entrySet()) { - for (int subY = 0; subY < worldHeight; subY += 16) + for (int subY = 1; subY < worldHeight; subY += 16) { - for (int tries = 0; tries < generationTry; tries++) + if (random.nextDouble() * 100 < entry.getValue().x) { - if (random.nextInt(100) < entry.getValue().x) + + // Blocks must be 1 away from edge to avoid adjacent chunk loading + int x = random.nextInt(13) + 1; + int z = random.nextInt(13) + 1; + int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); + /* + * TODO: remove + if (addon.getSettings().isDebug()) { + addon.log("DEBUG: Material: " + world.getName() + " " + x + " " + y + " " + z + " " + entry.getKey()); + } + */ + Block block = chunk.getBlock(x, y, z); + + if (block.getType().equals(chances.get(world.getEnvironment()).mainMaterial)) { - int x = random.nextInt(15); - int z = random.nextInt(15); - int y = Math.min(worldHeight - 2, subY + random.nextInt(15)); + int packSize = random.nextInt(entry.getValue().z); - Block block = chunk.getBlock(x, y, z); + boolean continuePlacing = true; - if (block.getType().equals(chances.get(world.getEnvironment()).mainMaterial) && - this.isValidBlock(world, block, x, z)) + while (continuePlacing) { - int packSize = random.nextInt(entry.getValue().z); - - boolean continuePlacing = true; - - while (continuePlacing) + if (!block.getType().equals(entry.getKey())) { - if (!block.getType().equals(entry.getKey())) - { - block.setType(entry.getKey()); - packSize--; - } - - // The direction chooser - switch (random.nextInt(5)) - { - case 0: - x = Math.min(15, x + 1); - break; - case 1: - y = Math.min(worldHeight - 2, y + 1); - break; - case 2: - z = Math.min(15, z + 1); - break; - case 3: - x = Math.max(0, x - 1); - break; - case 4: - y = Math.max(1, y - 1); - break; - case 5: - z = Math.max(0, z - 1); - break; - } - - block = chunk.getBlock(x, y, z); - - continuePlacing = this.isValidBlock(world, block, x, z) && - packSize > 0 && - (block.getType().equals(chances.get(world.getEnvironment()).mainMaterial) || - block.getType().equals(entry.getKey())); + block.setType(entry.getKey()); + packSize--; } + + // The direction chooser + switch (random.nextInt(5)) + { + case 0: + x = Math.min(15, x + 1); + break; + case 1: + y = Math.min(worldHeight - 2, y + 1); + break; + case 2: + z = Math.min(15, z + 1); + break; + case 3: + x = Math.max(0, x - 1); + break; + case 4: + y = Math.max(1, y - 1); + break; + case 5: + z = Math.max(0, z - 1); + break; + } + + block = chunk.getBlock(x, y, z); + + continuePlacing = packSize > 0 && + (block.getType().equals(chances.get(world.getEnvironment()).mainMaterial) || + block.getType().equals(entry.getKey())); } } } @@ -128,33 +130,14 @@ public class MaterialPopulator extends BlockPopulator } } - - /** - * This method checks if all chunks around given block is generated. - * @param world World in which block is located - * @param block Block that must be checked. - * @param x Block x-index in chunk - * @param z Block z-index in chunk - * @return true, if all chunks around given block are generated. - */ - private boolean isValidBlock(World world, Block block, int x, int z) - { - return x > 0 && x < 15 && z > 0 && z < 15 || - world.isChunkGenerated(block.getX() + 1, block.getZ()) && - world.isChunkGenerated(block.getX() - 1, block.getZ()) && - world.isChunkGenerated(block.getX(), block.getZ() - 1) && - world.isChunkGenerated(block.getX(), block.getZ() + 1); - } - - /** * This method returns material frequently and pack size map. * @param objectList List with objects that contains data. * @return Map that contains material, its rarity and pack size. */ - private Map> getMaterialMap(List objectList) + private Map> getMaterialMap(List objectList) { - Map> materialMap = new HashMap<>(objectList.size()); + Map> materialMap = new HashMap<>(objectList.size()); // wrong material object. objectList.stream(). @@ -167,7 +150,7 @@ public class MaterialPopulator extends BlockPopulator if (material != null) { materialMap.put(material, - new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3]))); + new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3]))); } }); @@ -185,25 +168,23 @@ public class MaterialPopulator extends BlockPopulator */ private CaveBlock addon; - /** - * CaveBlock settings. - */ - private Settings settings; + private Map chances; + private int worldHeight; /** * Chances class to store chances for environments and main material * */ private class Chances { - final Map> materialChanceMap; + final Map> materialChanceMap; final Material mainMaterial; /** * @param materialChanceMap * @param mainMaterial */ - public Chances(Map> materialChanceMap, Material mainMaterial) { + public Chances(Map> materialChanceMap, Material mainMaterial) { this.materialChanceMap = materialChanceMap; this.mainMaterial = mainMaterial; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 36f6868..1597166 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -11,11 +11,11 @@ world: # World difficulty setting - PEACEFUL, EASY, NORMAL, HARD # Other plugins may override this setting difficulty: NORMAL - # Radius of island in blocks. (So distance between islands is twice this) + # Radius of cave in blocks. (So distance between caves is twice this) # Will be rounded up to the nearest 16 blocks. # It is the same for every dimension : Overworld, Nether and End. # This value cannot be changed mid-game and the plugin will not start if it is different. - distance-between-islands: 64 + distance-between-caves: 64 # Default protection range radius in blocks. Cannot be larger than distance. # Admins can change protection sizes for players individually using /cbadmin range set # or set this permission: caveblock.island.range. @@ -29,18 +29,13 @@ world: start-z: 0 offset-x: 0 offset-z: 0 - # Island height - Lowest is 5. + # Cave height - Lowest is 5. # It is the y coordinate of the bedrock block in the schem. - island-height: 60 + cave-height: 60 # Use your own world generator for this world. # In this case, the plugin will not generate anything. # /!\ This feature is experimental and might not work as expected or might not work at all. use-own-generator: true - # Sea height (don't changes this mid-game unless you delete the world) - # Minimum is 0, which means you are playing CaveBlock! - # If sea height is less than about 10, then players will drop right through it - # if it exists. Makes for an interesting variation on caveblock. - sea-height: 0 # Maximum number of islands in the world. Set to -1 or 0 for unlimited. # If the number of islands is greater than this number, it will stop players from creating islands. max-islands: 0 @@ -53,14 +48,14 @@ world: # The permission acidisland.ban.maxlimit.X where X is a number can also be used per player # -1 = unlimited ban-limit: -1 - # + # # This is cave... no height... only depth. Max 256. # Should not be less then island height. world-depth: 256 # This indicate how many times block should be tried to generate. generation-tries: 2 normal: - # + # # Make over world roof of bedrock, if false, it will be made from stone roof: true # Make over world floor of bedrock, if false, it will be made from stone @@ -74,11 +69,11 @@ world: # Entities spawned via generator are not protected from despawing. # Working only with 2 high mobs currently. # Example: - # MATERIAL:DIAMOND:100:5 - means there is 100% chace of spawing diamonds + # MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds # where max amount in pack are 5 per each subchunk! blocks: - - MATERIAL:DIAMOND_ORE:1:3 - - MATERIAL:GOLD_ORE:5:4 + - MATERIAL:DIAMOND_ORE:1:5 + - MATERIAL:GOLD_ORE:1:4 - MATERIAL:IRON_ORE:5:4 - MATERIAL:COAL_ORE:10:6 - MATERIAL:EMERALD_ORE:1:1 @@ -88,6 +83,9 @@ world: - MATERIAL:GRANITE:20:10 - MATERIAL:ANDESITE:20:10 - MATERIAL:DIORITE:30:8 + - ENTITY:ZOMBIE:1:1 + - ENTITY:DOLPHIN:0.1:1 + - ENTITY:CAVE_SPIDER:1:1 nether: # Generate Nether - if this is false, the nether world will not be made and access to # the nether will not occur. Other plugins may still enable portal usage. @@ -118,14 +116,19 @@ world: # Entities spawned via generator are not protected from despawing. # Working only with 2 high mobs currently. # Example: - # MATERIAL:DIAMOND:100:5 - means there is 100% chace of spawing diamonds + # MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds # where max amount in pack are 5 per each subchunk! blocks: - MATERIAL:QUARTZ_ORE:30:5 - MATERIAL:SOUL_SAND:40:10 - MATERIAL:MAGMA_BLOCK:10:3 - MATERIAL:GLOWSTONE:20:8 + - MATERIAL:NETHER_BRICK:10:5 - MATERIAL:LAVA:10:1 + - ENTITY:MAGMA_CUBE:0.5:1 + - ENTITY:GHAST:0.1:1 + - ENTITY:WITHER_SKELETON:0.1:1 + - MATERIAL:FIRE:10:1 end: generate: true islands: true @@ -144,14 +147,16 @@ world: # Entities spawned via generator are not protected from despawing. # Working only with 2 high mobs currently. # Example: - # MATERIAL:DIAMOND:100:5 - means there is 100% chace of spawing diamonds + # MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds # where max amount in pack are 5 per each subchunk! blocks: - - ENTITY:SHULKER:1:1 + - ENTITY:SHULKER:0.2:1 + - MATERIAL:OBSIDIAN:1:1 + - MATERIAL:CHORUS_FRUIT:1:3 # Mob white list - these mobs will NOT be removed when logging in or doing /cave remove-mobs-whitelist: - - ZOMBIE_VILLAGER - WITHER + - ZOMBIE_VILLAGER - PIG_ZOMBIE - ENDERMAN # World flags. These are boolean settings for various flags for this world @@ -193,8 +198,8 @@ world: FROST_WALKER: 500 COLLECT_LAVA: 500 LEVER: 500 - HURT_MONSTERS: 0 RIDING: 500 + HURT_MONSTERS: 0 NAME_TAG: 500 ARMOR_STAND: 500 TRADING: 0 @@ -202,8 +207,8 @@ world: ITEM_DROP: 0 NOTE_BLOCK: 0 NETHER_PORTAL: 500 - ITEM_PICKUP: 0 CROP_TRAMPLE: 500 + ITEM_PICKUP: 0 BREWING: 500 DROPPER: 500 COLLECT_WATER: 500 @@ -215,26 +220,27 @@ world: PLACE_BLOCKS: 500 ITEM_FRAME: 500 CRAFTING: 0 - SHEARING: 500 ENCHANTING: 0 - SPAWN_EGGS: 500 + SHEARING: 500 BED: 500 + SPAWN_EGGS: 500 MILKING: 0 DISPENSER: 500 GATE: 0 EXPERIENCE_PICKUP: 500 HOPPER: 500 LEASH: 500 - MOUNT_INVENTORY: 500 BREAK_BLOCKS: 500 + MOUNT_INVENTORY: 500 CHORUS_FRUIT: 500 CONTAINER: 500 + POTION_THROWING: 500 JUKEBOX: 500 # These are the default settings for new islands default-island-settings: PVP_END: false - ANIMAL_SPAWN: true PVP_NETHER: false + ANIMAL_SPAWN: true MONSTER_SPAWN: true FIRE_SPREAD: true PVP_OVERWORLD: false @@ -247,7 +253,7 @@ world: - spawnmob island: # Default max team size - # Permission size cannot be less than the default below. + # Permission size cannot be less than the default below. max-team-size: 4 # Default maximum number of homes a player can have. Min = 1 # Accessed via /cave sethome or /cave go @@ -350,4 +356,5 @@ panel: do-not-edit-these-settings: # These settings should not be edited reset-epoch: 0 +debug: false uniqueId: config From 3d49f608858859cb30bdaa97876d78b0962cd1cf Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 2 Feb 2019 15:46:22 -0800 Subject: [PATCH 3/7] Cleaned up schems Made nether schem work okay. --- src/main/resources/schems/end-island | 310 ----- src/main/resources/schems/island | 1162 ----------------- src/main/resources/schems/nether-island | 899 ------------- src/main/resources/schems/nether-island.schem | Bin 3095 -> 19567 bytes 4 files changed, 2371 deletions(-) delete mode 100644 src/main/resources/schems/end-island delete mode 100644 src/main/resources/schems/island delete mode 100644 src/main/resources/schems/nether-island diff --git a/src/main/resources/schems/end-island b/src/main/resources/schems/end-island deleted file mode 100644 index 9932c6b..0000000 --- a/src/main/resources/schems/end-island +++ /dev/null @@ -1,310 +0,0 @@ -blocks: - -3,0,0: - bd: minecraft:obsidian - -3,1,0: - bd: minecraft:end_stone - -2,-1,0: - bd: minecraft:end_stone - -2,0,-2: - bd: minecraft:end_stone_bricks - -2,0,-1: - bd: minecraft:end_stone_bricks - -2,0,0: - bd: minecraft:end_stone_bricks - -2,0,1: - bd: minecraft:end_stone_bricks - -2,0,2: - bd: minecraft:end_stone - -2,1,-2: - bd: minecraft:end_stone_bricks - -2,1,-1: - bd: minecraft:end_stone_bricks - -2,1,0: - bd: minecraft:end_stone_bricks - -2,1,1: - bd: minecraft:end_stone_bricks - -2,1,2: - bd: minecraft:end_stone - -2,2,-1: - bd: minecraft:end_stone - -2,2,0: - bd: minecraft:end_stone - -2,3,-1: - bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] - -2,4,-1: - bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] - -2,5,-1: - bd: minecraft:chorus_flower[age=0] - -1,-2,0: - bd: minecraft:end_stone - -1,-1,-1: - bd: minecraft:end_stone - -1,-1,0: - bd: minecraft:end_stone - -1,-1,1: - bd: minecraft:end_stone - -1,0,-2: - bd: minecraft:end_stone_bricks - -1,0,0: - bd: minecraft:purple_shulker_box[facing=up] - inventory: - '0': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: OBSIDIAN - '11': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: ENDERMAN_SPAWN_EGG - '15': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: ELYTRA - '22': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: END_ROD - -1,0,1: - bd: minecraft:end_stone_bricks - -1,0,2: - bd: minecraft:end_stone - -1,1,-2: - bd: minecraft:end_rod[facing=east] - -1,1,-1: - bd: minecraft:air - -1,1,0: - bd: minecraft:air - -1,1,1: - bd: minecraft:end_stone_bricks - -1,1,2: - bd: minecraft:end_stone - -1,1,3: - bd: minecraft:end_stone - -1,2,-2: - bd: minecraft:end_stone - -1,2,-1: - bd: minecraft:end_stone - -1,2,0: - bd: minecraft:end_stone - -1,2,1: - bd: minecraft:end_stone - -1,3,-3: - bd: minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=true,west=false] - -1,4,-3: - bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] - -1,5,-3: - bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] - -1,6,-4: - bd: minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=true,west=false] - -1,6,-3: - bd: minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=false,west=false] - -1,7,-4: - bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] - -1,8,-4: - bd: minecraft:chorus_flower[age=1] - 0,-2,-1: - bd: minecraft:end_stone - 0,-2,1: - bd: minecraft:end_stone - 0,-1,-2: - bd: minecraft:end_stone - 0,-1,-1: - bd: minecraft:end_stone - 0,-1,0: - bd: minecraft:end_stone - 0,-1,1: - bd: minecraft:end_stone - 0,-1,2: - bd: minecraft:end_stone - 0,0,-3: - bd: minecraft:obsidian - 0,0,-2: - bd: minecraft:end_stone_bricks - 0,0,-1: - bd: minecraft:air - 0,0,0: - bd: minecraft:air - 0,0,1: - bd: minecraft:end_stone_bricks - 0,0,2: - bd: minecraft:end_stone_bricks - 0,0,3: - bd: minecraft:obsidian - 0,1,-3: - bd: minecraft:end_stone - 0,1,-2: - bd: minecraft:end_stone_bricks - 0,1,-1: - bd: minecraft:air - 0,1,0: - bd: minecraft:air - 0,1,1: - bd: minecraft:end_stone_bricks - 0,1,2: - bd: minecraft:end_stone - 0,1,3: - bd: minecraft:end_stone_bricks - 0,2,-3: - bd: minecraft:end_stone - 0,2,-2: - bd: minecraft:end_stone - 0,2,-1: - bd: minecraft:end_stone - 0,2,0: - bd: minecraft:end_stone - 0,2,1: - bd: minecraft:end_stone - 0,3,-3: - bd: minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=true] - 0,6,-3: - bd: minecraft:chorus_flower[age=1] - 1,-2,0: - bd: minecraft:end_stone - 1,-1,-1: - bd: minecraft:end_stone - 1,-1,0: - bd: minecraft:end_stone - 1,-1,1: - bd: minecraft:end_stone - 1,0,-2: - bd: minecraft:end_stone_bricks - 1,0,-1: - bd: minecraft:air - 1,0,0: - bd: minecraft:air - 1,0,1: - bd: minecraft:purpur_stairs[facing=south,half=bottom,shape=straight,waterlogged=false] - 1,0,2: - bd: minecraft:end_stone - 1,1,-2: - bd: minecraft:end_stone_bricks - 1,1,-1: - bd: minecraft:air - 1,1,0: - bd: minecraft:air - 1,1,1: - bd: minecraft:air - 1,1,2: - bd: minecraft:purpur_stairs[facing=south,half=bottom,shape=straight,waterlogged=false] - 1,1,3: - bd: minecraft:end_stone - 1,2,-2: - bd: minecraft:end_stone - 1,2,-1: - bd: minecraft:end_stone - 1,2,0: - bd: minecraft:air - 1,2,1: - bd: minecraft:air - 1,2,2: - bd: minecraft:air - 1,3,0: - bd: minecraft:air - 1,3,1: - bd: minecraft:air - 1,3,2: - bd: minecraft:air - 2,-1,-1: - bd: minecraft:end_stone_bricks - 2,-1,0: - bd: minecraft:end_stone - 2,0,-2: - bd: minecraft:end_stone - 2,0,-1: - bd: minecraft:end_stone_bricks - 2,0,0: - bd: minecraft:end_stone - 2,0,1: - bd: minecraft:end_stone - 2,0,2: - bd: minecraft:end_stone - 2,1,-2: - bd: minecraft:end_stone_bricks - 2,1,-1: - bd: minecraft:end_stone - 2,1,0: - bd: minecraft:end_rod[facing=up] - 2,1,2: - bd: minecraft:end_stone - 2,1,3: - bd: minecraft:end_stone_bricks - 2,2,-2: - bd: minecraft:end_stone_bricks - 2,2,-1: - bd: minecraft:end_stone - 2,2,0: - bd: minecraft:end_stone - 2,2,1: - bd: minecraft:end_stone - 2,3,-2: - bd: minecraft:end_stone_bricks - 3,0,-2: - bd: minecraft:end_stone - 3,0,0: - bd: minecraft:obsidian - 3,1,-2: - bd: minecraft:end_stone - 3,1,-1: - bd: minecraft:end_stone_bricks - 3,1,1: - bd: minecraft:end_stone - 3,1,2: - bd: minecraft:end_stone_bricks - 3,2,-2: - bd: minecraft:end_stone - 3,2,-1: - bd: minecraft:end_stone - 3,3,-2: - bd: minecraft:end_stone - 3,4,-2: - bd: minecraft:end_stone - 3,5,-2: - bd: minecraft:end_stone - 3,6,-2: - bd: minecraft:end_stone - 3,7,-2: - bd: minecraft:obsidian - -1,1,-1: - bd: minecraft:air - -1,1,0: - bd: minecraft:air - 0,0,-1: - bd: minecraft:air - 0,1,-1: - bd: minecraft:air - 0,1,0: - bd: minecraft:air - 1,0,-1: - bd: minecraft:air - 1,0,0: - bd: minecraft:air - 1,1,-1: - bd: minecraft:air - 1,1,0: - bd: minecraft:air - 1,1,1: - bd: minecraft:air - 1,2,0: - bd: minecraft:air - 1,2,1: - bd: minecraft:air - 1,2,2: - bd: minecraft:air - 1,3,0: - bd: minecraft:air - 1,3,1: - bd: minecraft:air - 1,3,2: - bd: minecraft:air -attached: - 0,0,0: - bd: minecraft:sign[rotation=8,waterlogged=false] - lines: - - '[spawn_here]' - - '' - - '' - - '' -size: - xsize: 7 - ysize: 11 - zsize: 8 diff --git a/src/main/resources/schems/island b/src/main/resources/schems/island deleted file mode 100644 index 401296a..0000000 --- a/src/main/resources/schems/island +++ /dev/null @@ -1,1162 +0,0 @@ -blocks: - -3,-4,-5: - bd: minecraft:stone - -3,-4,-4: - bd: minecraft:stone - -3,-4,-3: - bd: minecraft:stone - -3,-4,-2: - bd: minecraft:stone - -3,-4,-1: - bd: minecraft:stone - -3,-4,0: - bd: minecraft:stone - -3,-4,1: - bd: minecraft:stone - -3,-3,-5: - bd: minecraft:stone - -3,-3,-4: - bd: minecraft:stone - -3,-3,-3: - bd: minecraft:stone - -3,-3,-2: - bd: minecraft:stone - -3,-3,-1: - bd: minecraft:stone - -3,-3,0: - bd: minecraft:stone - -3,-3,1: - bd: minecraft:stone - -3,-2,-5: - bd: minecraft:stone - -3,-2,-4: - bd: minecraft:stone - -3,-2,-3: - bd: minecraft:cobblestone_stairs[facing=east,half=top,shape=straight,waterlogged=false] - -3,-2,-2: - bd: minecraft:stone - -3,-2,-1: - bd: minecraft:stone - -3,-2,0: - bd: minecraft:stone - -3,-2,1: - bd: minecraft:stone - -3,-1,-5: - bd: minecraft:stone - -3,-1,-4: - bd: minecraft:grass_block[snowy=false] - -3,-1,-3: - bd: minecraft:grass_block[snowy=false] - -3,-1,-2: - bd: minecraft:grass_block[snowy=false] - -3,-1,-1: - bd: minecraft:grass_block[snowy=false] - -3,-1,0: - bd: minecraft:grass_block[snowy=false] - -3,-1,1: - bd: minecraft:stone - -3,0,-5: - bd: minecraft:air - -3,0,-4: - bd: minecraft:air - -3,0,-3: - bd: minecraft:air - -3,0,-2: - bd: minecraft:air - -3,0,-1: - bd: minecraft:air - -3,0,0: - bd: minecraft:air - -3,0,1: - bd: minecraft:air - -3,1,-5: - bd: minecraft:air - -3,1,-4: - bd: minecraft:air - -3,1,-3: - bd: minecraft:air - -3,1,-2: - bd: minecraft:air - -3,1,-1: - bd: minecraft:air - -3,1,0: - bd: minecraft:air - -3,1,1: - bd: minecraft:air - -3,2,-5: - bd: minecraft:air - -3,2,-4: - bd: minecraft:air - -3,2,-3: - bd: minecraft:air - -3,2,-2: - bd: minecraft:air - -3,2,-1: - bd: minecraft:air - -3,2,0: - bd: minecraft:air - -3,2,1: - bd: minecraft:air - -3,3,-5: - bd: minecraft:air - -3,3,-4: - bd: minecraft:air - -3,3,-3: - bd: minecraft:air - -3,3,-2: - bd: minecraft:air - -3,3,-1: - bd: minecraft:air - -3,3,0: - bd: minecraft:air - -3,3,1: - bd: minecraft:air - -3,4,-5: - bd: minecraft:air - -3,4,-4: - bd: minecraft:air - -3,4,-3: - bd: minecraft:air - -3,4,-2: - bd: minecraft:air - -3,4,-1: - bd: minecraft:air - -3,4,0: - bd: minecraft:air - -3,4,1: - bd: minecraft:air - -3,5,-5: - bd: minecraft:air - -3,5,-4: - bd: minecraft:air - -3,5,-3: - bd: minecraft:air - -3,5,-2: - bd: minecraft:air - -3,5,-1: - bd: minecraft:air - -3,5,0: - bd: minecraft:air - -3,5,1: - bd: minecraft:air - -3,6,-5: - bd: minecraft:air - -3,6,-4: - bd: minecraft:air - -3,6,-3: - bd: minecraft:air - -3,6,-2: - bd: minecraft:air - -3,6,-1: - bd: minecraft:air - -3,6,0: - bd: minecraft:air - -3,6,1: - bd: minecraft:air - -2,-4,-5: - bd: minecraft:stone - -2,-4,-4: - bd: minecraft:stone - -2,-4,-3: - bd: minecraft:stone - -2,-4,-2: - bd: minecraft:stone - -2,-4,-1: - bd: minecraft:stone - -2,-4,0: - bd: minecraft:stone - -2,-4,1: - bd: minecraft:stone - -2,-3,-5: - bd: minecraft:stone - -2,-3,-4: - bd: minecraft:stone - -2,-3,-3: - bd: minecraft:cobblestone_stairs[facing=east,half=top,shape=straight,waterlogged=false] - -2,-3,-2: - bd: minecraft:dirt - -2,-3,-1: - bd: minecraft:stone - -2,-3,0: - bd: minecraft:stone - -2,-3,1: - bd: minecraft:stone - -2,-2,-5: - bd: minecraft:stone - -2,-2,-4: - bd: minecraft:stone - -2,-2,-3: - bd: minecraft:dirt - -2,-2,-2: - bd: minecraft:dirt - -2,-2,-1: - bd: minecraft:dirt - -2,-2,0: - bd: minecraft:dirt - -2,-2,1: - bd: minecraft:stone - -2,-1,-5: - bd: minecraft:grass_block[snowy=false] - -2,-1,-4: - bd: minecraft:grass_block[snowy=false] - -2,-1,-3: - bd: minecraft:grass_block[snowy=false] - -2,-1,-2: - bd: minecraft:grass_block[snowy=false] - -2,-1,-1: - bd: minecraft:grass_block[snowy=false] - -2,-1,0: - bd: minecraft:grass_block[snowy=false] - -2,-1,1: - bd: minecraft:grass_block[snowy=false] - -2,0,-5: - bd: minecraft:air - -2,0,-4: - bd: minecraft:air - -2,0,-3: - bd: minecraft:air - -2,0,-2: - bd: minecraft:air - -2,0,-1: - bd: minecraft:air - -2,0,0: - bd: minecraft:air - -2,0,1: - bd: minecraft:air - -2,1,-5: - bd: minecraft:air - -2,1,-4: - bd: minecraft:air - -2,1,-3: - bd: minecraft:air - -2,1,-2: - bd: minecraft:air - -2,1,-1: - bd: minecraft:air - -2,1,0: - bd: minecraft:air - -2,1,1: - bd: minecraft:air - -2,2,-5: - bd: minecraft:air - -2,2,-4: - bd: minecraft:oak_leaves[distance=4,persistent=false] - -2,2,-3: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -2,2,-2: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -2,2,-1: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -2,2,0: - bd: minecraft:air - -2,2,1: - bd: minecraft:air - -2,3,-5: - bd: minecraft:air - -2,3,-4: - bd: minecraft:oak_leaves[distance=4,persistent=false] - -2,3,-3: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -2,3,-2: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -2,3,-1: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -2,3,0: - bd: minecraft:air - -2,3,1: - bd: minecraft:air - -2,4,-5: - bd: minecraft:air - -2,4,-4: - bd: minecraft:air - -2,4,-3: - bd: minecraft:air - -2,4,-2: - bd: minecraft:air - -2,4,-1: - bd: minecraft:air - -2,4,0: - bd: minecraft:air - -2,4,1: - bd: minecraft:air - -2,5,-5: - bd: minecraft:air - -2,5,-4: - bd: minecraft:air - -2,5,-3: - bd: minecraft:air - -2,5,-2: - bd: minecraft:air - -2,5,-1: - bd: minecraft:air - -2,5,0: - bd: minecraft:air - -2,5,1: - bd: minecraft:air - -2,6,-5: - bd: minecraft:air - -2,6,-4: - bd: minecraft:air - -2,6,-3: - bd: minecraft:air - -2,6,-2: - bd: minecraft:air - -2,6,-1: - bd: minecraft:air - -2,6,0: - bd: minecraft:air - -2,6,1: - bd: minecraft:air - -1,-4,-5: - bd: minecraft:stone - -1,-4,-4: - bd: minecraft:stone - -1,-4,-3: - bd: minecraft:stone - -1,-4,-2: - bd: minecraft:dirt - -1,-4,-1: - bd: minecraft:stone - -1,-4,0: - bd: minecraft:stone - -1,-4,1: - bd: minecraft:stone - -1,-3,-5: - bd: minecraft:stone - -1,-3,-4: - bd: minecraft:cobweb - -1,-3,-3: - bd: minecraft:dirt - -1,-3,-2: - bd: minecraft:dirt - -1,-3,-1: - bd: minecraft:dirt - -1,-3,0: - bd: minecraft:cobweb - -1,-3,1: - bd: minecraft:stone - -1,-2,-5: - bd: minecraft:stone - -1,-2,-4: - bd: minecraft:dirt - -1,-2,-3: - bd: minecraft:dirt - -1,-2,-2: - bd: minecraft:dirt - -1,-2,-1: - bd: minecraft:dirt - -1,-2,0: - bd: minecraft:dirt - -1,-2,1: - bd: minecraft:stone - -1,-1,-5: - bd: minecraft:grass_block[snowy=false] - -1,-1,-4: - bd: minecraft:grass_block[snowy=false] - -1,-1,-3: - bd: minecraft:grass_block[snowy=false] - -1,-1,-2: - bd: minecraft:grass_block[snowy=false] - -1,-1,-1: - bd: minecraft:grass_block[snowy=false] - -1,-1,0: - bd: minecraft:grass_block[snowy=false] - -1,-1,1: - bd: minecraft:grass_block[snowy=false] - -1,0,-5: - bd: minecraft:air - -1,0,-4: - bd: minecraft:air - -1,0,-3: - bd: minecraft:air - -1,0,-2: - bd: minecraft:air - -1,0,-1: - bd: minecraft:air - -1,0,0: - bd: minecraft:air - -1,0,1: - bd: minecraft:air - -1,1,-5: - bd: minecraft:air - -1,1,-4: - bd: minecraft:air - -1,1,-3: - bd: minecraft:air - -1,1,-2: - bd: minecraft:air - -1,1,-1: - bd: minecraft:air - -1,1,0: - bd: minecraft:air - -1,1,1: - bd: minecraft:air - -1,2,-5: - bd: minecraft:air - -1,2,-4: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -1,2,-3: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,2,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - -1,2,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,2,0: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -1,2,1: - bd: minecraft:air - -1,3,-5: - bd: minecraft:air - -1,3,-4: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -1,3,-3: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,3,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - -1,3,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,3,0: - bd: minecraft:oak_leaves[distance=3,persistent=false] - -1,3,1: - bd: minecraft:air - -1,4,-5: - bd: minecraft:air - -1,4,-4: - bd: minecraft:air - -1,4,-3: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,4,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - -1,4,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,4,0: - bd: minecraft:air - -1,4,1: - bd: minecraft:air - -1,5,-5: - bd: minecraft:air - -1,5,-4: - bd: minecraft:air - -1,5,-3: - bd: minecraft:air - -1,5,-2: - bd: minecraft:oak_leaves[distance=2,persistent=false] - -1,5,-1: - bd: minecraft:air - -1,5,0: - bd: minecraft:air - -1,5,1: - bd: minecraft:air - -1,6,-5: - bd: minecraft:air - -1,6,-4: - bd: minecraft:air - -1,6,-3: - bd: minecraft:air - -1,6,-2: - bd: minecraft:air - -1,6,-1: - bd: minecraft:air - -1,6,0: - bd: minecraft:air - -1,6,1: - bd: minecraft:air - 0,-4,-5: - bd: minecraft:stone - 0,-4,-4: - bd: minecraft:stone - 0,-4,-3: - bd: minecraft:dirt - 0,-4,-2: - bd: minecraft:sand - 0,-4,-1: - bd: minecraft:dirt - 0,-4,0: - bd: minecraft:stone - 0,-4,1: - bd: minecraft:stone - 0,-3,-5: - bd: minecraft:stone - 0,-3,-4: - bd: minecraft:dirt - 0,-3,-3: - bd: minecraft:dirt - 0,-3,-2: - bd: minecraft:sand - 0,-3,-1: - bd: minecraft:dirt - 0,-3,0: - bd: minecraft:dirt - 0,-3,1: - bd: minecraft:stone - 0,-2,-5: - bd: minecraft:dirt - 0,-2,-4: - bd: minecraft:dirt - 0,-2,-3: - bd: minecraft:dirt - 0,-2,-2: - bd: minecraft:sand - 0,-2,-1: - bd: minecraft:dirt - 0,-2,0: - bd: minecraft:dirt - 0,-2,1: - bd: minecraft:dirt - 0,-1,-5: - bd: minecraft:grass_block[snowy=false] - 0,-1,-4: - bd: minecraft:grass_block[snowy=false] - 0,-1,-3: - bd: minecraft:grass_block[snowy=false] - 0,-1,-2: - bd: minecraft:dirt - 0,-1,-1: - bd: minecraft:grass_block[snowy=false] - 0,-1,0: - bd: minecraft:grass_block[snowy=false] - 0,-1,1: - bd: minecraft:grass_block[snowy=false] - 0,0,-5: - bd: minecraft:air - 0,0,-4: - bd: minecraft:air - 0,0,-3: - bd: minecraft:air - 0,0,-2: - bd: minecraft:oak_log[axis=y] - 0,0,-1: - bd: minecraft:chest[facing=south,type=single,waterlogged=false] - inventory: - '0': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: LAVA_BUCKET - '2': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: SUGAR_CANE - '4': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: RED_MUSHROOM - '6': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: MELON_SLICE - '10': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: ICE - amount: 2 - '12': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: BONE - amount: 2 - '14': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: OAK_SAPLING - '16': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: PUMPKIN - '18': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: CACTUS - '20': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: BROWN_MUSHROOM - '22': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: COBBLESTONE - amount: 5 - '24': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: BEETROOT - '26': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: MUSHROOM_STEW - 0,0,0: - bd: minecraft:air - 0,0,1: - bd: minecraft:air - 0,1,-5: - bd: minecraft:air - 0,1,-4: - bd: minecraft:air - 0,1,-3: - bd: minecraft:air - 0,1,-2: - bd: minecraft:oak_log[axis=y] - 0,1,-1: - bd: minecraft:air - 0,1,0: - bd: minecraft:air - 0,1,1: - bd: minecraft:air - 0,2,-5: - bd: minecraft:air - 0,2,-4: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 0,2,-3: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,2,-2: - bd: minecraft:oak_log[axis=y] - 0,2,-1: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,2,0: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 0,2,1: - bd: minecraft:air - 0,3,-5: - bd: minecraft:air - 0,3,-4: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 0,3,-3: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,3,-2: - bd: minecraft:oak_log[axis=y] - 0,3,-1: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,3,0: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 0,3,1: - bd: minecraft:air - 0,4,-5: - bd: minecraft:air - 0,4,-4: - bd: minecraft:air - 0,4,-3: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,4,-2: - bd: minecraft:oak_log[axis=y] - 0,4,-1: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,4,0: - bd: minecraft:air - 0,4,1: - bd: minecraft:air - 0,5,-5: - bd: minecraft:air - 0,5,-4: - bd: minecraft:air - 0,5,-3: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 0,5,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 0,5,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 0,5,0: - bd: minecraft:air - 0,5,1: - bd: minecraft:air - 0,6,-5: - bd: minecraft:air - 0,6,-4: - bd: minecraft:air - 0,6,-3: - bd: minecraft:air - 0,6,-2: - bd: minecraft:air - 0,6,-1: - bd: minecraft:air - 0,6,0: - bd: minecraft:air - 0,6,1: - bd: minecraft:air - 1,-4,-5: - bd: minecraft:stone - 1,-4,-4: - bd: minecraft:stone - 1,-4,-3: - bd: minecraft:cobweb - 1,-4,-2: - bd: minecraft:stone - 1,-4,-1: - bd: minecraft:stone - 1,-4,0: - bd: minecraft:stone - 1,-4,1: - bd: minecraft:stone - 1,-3,-5: - bd: minecraft:stone - 1,-3,-4: - bd: minecraft:stone - 1,-3,-3: - bd: minecraft:dirt - 1,-3,-2: - bd: minecraft:dirt - 1,-3,-1: - bd: minecraft:stone - 1,-3,0: - bd: minecraft:stone - 1,-3,1: - bd: minecraft:stone - 1,-2,-5: - bd: minecraft:stone - 1,-2,-4: - bd: minecraft:dirt - 1,-2,-3: - bd: minecraft:dirt - 1,-2,-2: - bd: minecraft:dirt - 1,-2,-1: - bd: minecraft:dirt - 1,-2,0: - bd: minecraft:dirt - 1,-2,1: - bd: minecraft:stone - 1,-1,-5: - bd: minecraft:grass_block[snowy=false] - 1,-1,-4: - bd: minecraft:grass_block[snowy=false] - 1,-1,-3: - bd: minecraft:grass_block[snowy=false] - 1,-1,-2: - bd: minecraft:grass_block[snowy=false] - 1,-1,-1: - bd: minecraft:grass_block[snowy=false] - 1,-1,0: - bd: minecraft:grass_block[snowy=false] - 1,-1,1: - bd: minecraft:grass_block[snowy=false] - 1,0,-5: - bd: minecraft:air - 1,0,-4: - bd: minecraft:air - 1,0,-3: - bd: minecraft:air - 1,0,-2: - bd: minecraft:air - 1,0,-1: - bd: minecraft:air - 1,0,0: - bd: minecraft:air - 1,0,1: - bd: minecraft:air - 1,1,-5: - bd: minecraft:air - 1,1,-4: - bd: minecraft:air - 1,1,-3: - bd: minecraft:air - 1,1,-2: - bd: minecraft:air - 1,1,-1: - bd: minecraft:air - 1,1,0: - bd: minecraft:air - 1,1,1: - bd: minecraft:air - 1,2,-5: - bd: minecraft:air - 1,2,-4: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 1,2,-3: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 1,2,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 1,2,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 1,2,0: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 1,2,1: - bd: minecraft:air - 1,3,-5: - bd: minecraft:air - 1,3,-4: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 1,3,-3: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 1,3,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 1,3,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 1,3,0: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 1,3,1: - bd: minecraft:air - 1,4,-5: - bd: minecraft:air - 1,4,-4: - bd: minecraft:air - 1,4,-3: - bd: minecraft:air - 1,4,-2: - bd: minecraft:oak_leaves[distance=1,persistent=false] - 1,4,-1: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 1,4,0: - bd: minecraft:air - 1,4,1: - bd: minecraft:air - 1,5,-5: - bd: minecraft:air - 1,5,-4: - bd: minecraft:air - 1,5,-3: - bd: minecraft:air - 1,5,-2: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 1,5,-1: - bd: minecraft:air - 1,5,0: - bd: minecraft:air - 1,5,1: - bd: minecraft:air - 1,6,-5: - bd: minecraft:air - 1,6,-4: - bd: minecraft:air - 1,6,-3: - bd: minecraft:air - 1,6,-2: - bd: minecraft:air - 1,6,-1: - bd: minecraft:air - 1,6,0: - bd: minecraft:air - 1,6,1: - bd: minecraft:air - 2,-4,-5: - bd: minecraft:stone - 2,-4,-4: - bd: minecraft:stone - 2,-4,-3: - bd: minecraft:stone - 2,-4,-2: - bd: minecraft:stone - 2,-4,-1: - bd: minecraft:stone - 2,-4,0: - bd: minecraft:stone - 2,-4,1: - bd: minecraft:stone - 2,-3,-5: - bd: minecraft:stone - 2,-3,-4: - bd: minecraft:stone - 2,-3,-3: - bd: minecraft:cobblestone_slab[type=top,waterlogged=false] - 2,-3,-2: - bd: minecraft:dirt - 2,-3,-1: - bd: minecraft:stone - 2,-3,0: - bd: minecraft:stone - 2,-3,1: - bd: minecraft:stone - 2,-2,-5: - bd: minecraft:stone - 2,-2,-4: - bd: minecraft:dirt - 2,-2,-3: - bd: minecraft:dirt - 2,-2,-2: - bd: minecraft:dirt - 2,-2,-1: - bd: minecraft:dirt - 2,-2,0: - bd: minecraft:dirt - 2,-2,1: - bd: minecraft:stone - 2,-1,-5: - bd: minecraft:grass_block[snowy=false] - 2,-1,-4: - bd: minecraft:grass_block[snowy=false] - 2,-1,-3: - bd: minecraft:grass_block[snowy=false] - 2,-1,-2: - bd: minecraft:grass_block[snowy=false] - 2,-1,-1: - bd: minecraft:grass_block[snowy=false] - 2,-1,0: - bd: minecraft:grass_block[snowy=false] - 2,-1,1: - bd: minecraft:grass_block[snowy=false] - 2,0,-5: - bd: minecraft:air - 2,0,-4: - bd: minecraft:air - 2,0,-3: - bd: minecraft:air - 2,0,-2: - bd: minecraft:air - 2,0,-1: - bd: minecraft:air - 2,0,0: - bd: minecraft:air - 2,0,1: - bd: minecraft:air - 2,1,-5: - bd: minecraft:air - 2,1,-4: - bd: minecraft:air - 2,1,-3: - bd: minecraft:air - 2,1,-2: - bd: minecraft:air - 2,1,-1: - bd: minecraft:air - 2,1,0: - bd: minecraft:air - 2,1,1: - bd: minecraft:air - 2,2,-5: - bd: minecraft:air - 2,2,-4: - bd: minecraft:air - 2,2,-3: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 2,2,-2: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 2,2,-1: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 2,2,0: - bd: minecraft:oak_leaves[distance=4,persistent=false] - 2,2,1: - bd: minecraft:air - 2,3,-5: - bd: minecraft:air - 2,3,-4: - bd: minecraft:oak_leaves[distance=4,persistent=false] - 2,3,-3: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 2,3,-2: - bd: minecraft:oak_leaves[distance=2,persistent=false] - 2,3,-1: - bd: minecraft:oak_leaves[distance=3,persistent=false] - 2,3,0: - bd: minecraft:air - 2,3,1: - bd: minecraft:air - 2,4,-5: - bd: minecraft:air - 2,4,-4: - bd: minecraft:air - 2,4,-3: - bd: minecraft:air - 2,4,-2: - bd: minecraft:air - 2,4,-1: - bd: minecraft:air - 2,4,0: - bd: minecraft:air - 2,4,1: - bd: minecraft:air - 2,5,-5: - bd: minecraft:air - 2,5,-4: - bd: minecraft:air - 2,5,-3: - bd: minecraft:air - 2,5,-2: - bd: minecraft:air - 2,5,-1: - bd: minecraft:air - 2,5,0: - bd: minecraft:air - 2,5,1: - bd: minecraft:air - 2,6,-5: - bd: minecraft:air - 2,6,-4: - bd: minecraft:air - 2,6,-3: - bd: minecraft:air - 2,6,-2: - bd: minecraft:air - 2,6,-1: - bd: minecraft:air - 2,6,0: - bd: minecraft:air - 2,6,1: - bd: minecraft:air - 3,-4,-5: - bd: minecraft:stone - 3,-4,-4: - bd: minecraft:stone - 3,-4,-3: - bd: minecraft:stone - 3,-4,-2: - bd: minecraft:stone - 3,-4,-1: - bd: minecraft:stone - 3,-4,0: - bd: minecraft:stone - 3,-4,1: - bd: minecraft:stone - 3,-3,-5: - bd: minecraft:stone - 3,-3,-4: - bd: minecraft:stone - 3,-3,-3: - bd: minecraft:stone - 3,-3,-2: - bd: minecraft:stone - 3,-3,-1: - bd: minecraft:stone - 3,-3,0: - bd: minecraft:stone - 3,-3,1: - bd: minecraft:stone - 3,-2,-5: - bd: minecraft:stone - 3,-2,-4: - bd: minecraft:stone - 3,-2,-3: - bd: minecraft:stone - 3,-2,-2: - bd: minecraft:dirt - 3,-2,-1: - bd: minecraft:stone - 3,-2,0: - bd: minecraft:stone - 3,-2,1: - bd: minecraft:stone - 3,-1,-5: - bd: minecraft:stone - 3,-1,-4: - bd: minecraft:grass_block[snowy=false] - 3,-1,-3: - bd: minecraft:grass_block[snowy=false] - 3,-1,-2: - bd: minecraft:grass_block[snowy=false] - 3,-1,-1: - bd: minecraft:grass_block[snowy=false] - 3,-1,0: - bd: minecraft:grass_block[snowy=false] - 3,-1,1: - bd: minecraft:stone - 3,0,-5: - bd: minecraft:air - 3,0,-4: - bd: minecraft:air - 3,0,-3: - bd: minecraft:air - 3,0,-2: - bd: minecraft:air - 3,0,-1: - bd: minecraft:air - 3,0,0: - bd: minecraft:air - 3,0,1: - bd: minecraft:air - 3,1,-5: - bd: minecraft:air - 3,1,-4: - bd: minecraft:air - 3,1,-3: - bd: minecraft:air - 3,1,-2: - bd: minecraft:air - 3,1,-1: - bd: minecraft:air - 3,1,0: - bd: minecraft:air - 3,1,1: - bd: minecraft:air - 3,2,-5: - bd: minecraft:air - 3,2,-4: - bd: minecraft:air - 3,2,-3: - bd: minecraft:air - 3,2,-2: - bd: minecraft:air - 3,2,-1: - bd: minecraft:air - 3,2,0: - bd: minecraft:air - 3,2,1: - bd: minecraft:air - 3,3,-5: - bd: minecraft:air - 3,3,-4: - bd: minecraft:air - 3,3,-3: - bd: minecraft:air - 3,3,-2: - bd: minecraft:air - 3,3,-1: - bd: minecraft:air - 3,3,0: - bd: minecraft:air - 3,3,1: - bd: minecraft:air - 3,4,-5: - bd: minecraft:air - 3,4,-4: - bd: minecraft:air - 3,4,-3: - bd: minecraft:air - 3,4,-2: - bd: minecraft:air - 3,4,-1: - bd: minecraft:air - 3,4,0: - bd: minecraft:air - 3,4,1: - bd: minecraft:air - 3,5,-5: - bd: minecraft:air - 3,5,-4: - bd: minecraft:air - 3,5,-3: - bd: minecraft:air - 3,5,-2: - bd: minecraft:air - 3,5,-1: - bd: minecraft:air - 3,5,0: - bd: minecraft:air - 3,5,1: - bd: minecraft:air - 3,6,-5: - bd: minecraft:air - 3,6,-4: - bd: minecraft:air - 3,6,-3: - bd: minecraft:air - 3,6,-2: - bd: minecraft:air - 3,6,-1: - bd: minecraft:air - 3,6,0: - bd: minecraft:air - 3,6,1: - bd: minecraft:air -entities: - -1,0,0: - 47f04eb3-0fa6-4746-a180-6c0bfe198ff6: - type: COW - name: MooMoo - adult: true -attached: - 0,0,0: - bd: minecraft:sign[rotation=8,waterlogged=false] - lines: - - '[spawn_here]' - - '' - - '' - - '' - 0,0,1: - bd: minecraft:sign[rotation=8,waterlogged=false] - lines: - - '[start]' - - '' - - '' - - '' - 1,1,-2: - bd: minecraft:wall_torch[facing=east] -size: - xsize: 7 - ysize: 11 - zsize: 7 diff --git a/src/main/resources/schems/nether-island b/src/main/resources/schems/nether-island deleted file mode 100644 index 18d094e..0000000 --- a/src/main/resources/schems/nether-island +++ /dev/null @@ -1,899 +0,0 @@ -blocks: - -6,-14,-6: - bd: minecraft:cracked_stone_bricks - -6,-14,-5: - bd: minecraft:cracked_stone_bricks - -6,-14,-4: - bd: minecraft:cracked_stone_bricks - -6,-14,-3: - bd: minecraft:cracked_stone_bricks - -6,-14,-2: - bd: minecraft:stone_bricks - -6,-14,-1: - bd: minecraft:stone_bricks - -6,-14,0: - bd: minecraft:stone_bricks - -6,-13,-6: - bd: minecraft:stone_bricks - -6,-12,-6: - bd: minecraft:stone_bricks - -6,-12,-4: - bd: minecraft:end_portal_frame[eye=true,facing=east] - -6,-12,-3: - bd: minecraft:end_portal_frame[eye=false,facing=east] - -6,-12,-2: - bd: minecraft:end_portal_frame[eye=true,facing=east] - -6,-11,-6: - bd: minecraft:stone_bricks - -6,-10,-6: - bd: minecraft:stone_bricks - -6,-9,-6: - bd: minecraft:stone_bricks - -5,-14,-6: - bd: minecraft:stone_bricks - -5,-14,-5: - bd: minecraft:cracked_stone_bricks - -5,-14,-4: - bd: minecraft:lava[level=0] - -5,-14,-3: - bd: minecraft:lava[level=0] - -5,-14,-2: - bd: minecraft:lava[level=0] - -5,-14,-1: - bd: minecraft:cracked_stone_bricks - -5,-12,-5: - bd: minecraft:end_portal_frame[eye=true,facing=south] - -5,-12,-1: - bd: minecraft:end_portal_frame[eye=false,facing=north] - -5,-9,-6: - bd: minecraft:mossy_stone_bricks - -5,-1,-5: - bd: minecraft:netherrack - -5,-1,-4: - bd: minecraft:netherrack - -5,-1,-3: - bd: minecraft:netherrack - -5,0,-5: - bd: minecraft:nether_quartz_ore - -5,0,-4: - bd: minecraft:nether_quartz_ore - -5,0,-3: - bd: minecraft:fire[age=11,east=false,north=false,south=false,up=false,west=false] - -5,1,-5: - bd: minecraft:nether_quartz_ore - -4,-14,-6: - bd: minecraft:stone_bricks - -4,-14,-5: - bd: minecraft:cracked_stone_bricks - -4,-14,-4: - bd: minecraft:lava[level=0] - -4,-14,-3: - bd: minecraft:lava[level=0] - -4,-14,-2: - bd: minecraft:lava[level=0] - -4,-14,-1: - bd: minecraft:cracked_stone_bricks - -4,-14,0: - bd: minecraft:stone_bricks - -4,-13,-6: - bd: minecraft:stone_bricks - -4,-12,-6: - bd: minecraft:stone_bricks - -4,-12,-5: - bd: minecraft:end_portal_frame[eye=true,facing=south] - -4,-12,-1: - bd: minecraft:end_portal_frame[eye=true,facing=north] - -4,-11,-6: - bd: minecraft:stone_bricks - -4,-10,-6: - bd: minecraft:mossy_stone_bricks - -4,-1,-5: - bd: minecraft:netherrack - -4,-1,-4: - bd: minecraft:netherrack - -4,-1,-3: - bd: minecraft:netherrack - -4,0,-5: - bd: minecraft:netherrack - -4,1,-5: - bd: minecraft:fire[age=15,east=false,north=false,south=false,up=false,west=false] - -3,-14,-5: - bd: minecraft:cracked_stone_bricks - -3,-14,-4: - bd: minecraft:lava[level=0] - -3,-14,-3: - bd: minecraft:lava[level=0] - -3,-14,-2: - bd: minecraft:lava[level=0] - -3,-14,-1: - bd: minecraft:cracked_stone_bricks - -3,-12,-5: - bd: minecraft:end_portal_frame[eye=true,facing=south] - -3,-12,-1: - bd: minecraft:end_portal_frame[eye=false,facing=north] - -3,-2,-2: - bd: minecraft:soul_sand - -3,-1,-5: - bd: minecraft:netherrack - -3,-1,-4: - bd: minecraft:nether_bricks - -3,-1,-3: - bd: minecraft:nether_bricks - -3,-1,-2: - bd: minecraft:nether_bricks - -3,-1,-1: - bd: minecraft:nether_bricks - -3,-1,0: - bd: minecraft:nether_bricks - -2,-14,-5: - bd: minecraft:stone_bricks - -2,-14,-4: - bd: minecraft:cracked_stone_bricks - -2,-14,-3: - bd: minecraft:stone_bricks - -2,-14,-2: - bd: minecraft:cracked_stone_bricks - -2,-14,-1: - bd: minecraft:cracked_stone_bricks - -2,-14,0: - bd: minecraft:stone_bricks - -2,-13,-5: {} - -2,-12,-4: - bd: minecraft:end_portal_frame[eye=true,facing=west] - -2,-12,-3: - bd: minecraft:end_portal_frame[eye=false,facing=west] - -2,-12,-2: - bd: minecraft:end_portal_frame[eye=true,facing=west] - -2,-3,-2: - bd: minecraft:nether_quartz_ore - -2,-2,-4: - bd: minecraft:netherrack - -2,-2,-3: - bd: minecraft:netherrack - -2,-2,-2: - bd: minecraft:netherrack - -2,-2,-1: - bd: minecraft:netherrack - -2,-2,0: - bd: minecraft:netherrack - -2,-1,-5: - bd: minecraft:nether_bricks - -2,-1,-4: - bd: minecraft:nether_bricks - -2,-1,-3: - bd: minecraft:nether_bricks - -2,-1,-2: - bd: minecraft:nether_bricks - -2,-1,-1: - bd: minecraft:nether_bricks - -2,-1,0: - bd: minecraft:nether_bricks - -2,-1,1: - bd: minecraft:nether_bricks - -2,0,-5: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=false] - -2,1,-5: - bd: minecraft:air - -1,-14,-5: - bd: minecraft:stone_bricks - -1,-14,-4: - bd: minecraft:stone_bricks - -1,-14,-3: - bd: minecraft:stone_bricks - -1,-14,-2: - bd: minecraft:stone_bricks - -1,-14,-1: - bd: minecraft:stone_bricks - -1,-13,-4: - bd: minecraft:stone_brick_stairs[facing=west,half=bottom,shape=straight,waterlogged=false] - -1,-13,-3: - bd: minecraft:spawner - spawnedType: BLAZE - delay: 203 - maxNearbyEntities: 6 - maxSpawnDelay: 800 - minSpawnDelay: 200 - requiredPlayerRange: 8 - spawnRange: 4 - -1,-13,-2: - bd: minecraft:stone_brick_stairs[facing=west,half=bottom,shape=straight,waterlogged=false] - -1,-6,-7: - bd: minecraft:obsidian - -1,-6,-6: - bd: minecraft:obsidian - -1,-5,-2: - bd: minecraft:obsidian - -1,-4,-2: - bd: minecraft:magma_block - -1,-3,-2: - bd: minecraft:gravel - -1,-2,-4: - bd: minecraft:netherrack - -1,-2,-3: - bd: minecraft:netherrack - -1,-2,-2: - bd: minecraft:netherrack - -1,-2,-1: - bd: minecraft:netherrack - -1,-2,0: - bd: minecraft:netherrack - -1,-1,-5: - bd: minecraft:nether_bricks - -1,-1,-4: - bd: minecraft:nether_bricks - -1,-1,-3: - bd: minecraft:soul_sand - -1,-1,-2: - bd: minecraft:nether_bricks - -1,-1,-1: - bd: minecraft:nether_bricks - -1,-1,0: - bd: minecraft:nether_bricks - -1,-1,1: - bd: minecraft:nether_bricks - -1,0,-5: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=true] - -1,0,-3: - bd: minecraft:nether_wart[age=3] - 0,-14,-5: - bd: minecraft:stone_bricks - 0,-14,-4: - bd: minecraft:stone_brick_stairs[facing=west,half=bottom,shape=straight,waterlogged=false] - 0,-14,-3: - bd: minecraft:stone_brick_stairs[facing=west,half=bottom,shape=straight,waterlogged=false] - 0,-14,-2: - bd: minecraft:stone_brick_stairs[facing=west,half=bottom,shape=straight,waterlogged=false] - 0,-13,-4: {} - 0,-6,-7: - bd: minecraft:obsidian - 0,-6,-6: - bd: minecraft:obsidian - 0,-5,-8: - bd: minecraft:obsidian - 0,-5,-5: - bd: minecraft:obsidian - 0,-5,-3: - bd: minecraft:obsidian - 0,-5,-2: - bd: minecraft:bedrock - 0,-5,-1: - bd: minecraft:obsidian - 0,-4,-8: - bd: minecraft:obsidian - 0,-4,-5: - bd: minecraft:obsidian - 0,-4,-3: - bd: minecraft:magma_block - 0,-4,-2: - bd: minecraft:gravel - 0,-4,-1: - bd: minecraft:magma_block - 0,-3,-8: - bd: minecraft:obsidian - 0,-3,-5: - bd: minecraft:obsidian - 0,-3,-4: - bd: minecraft:nether_quartz_ore - 0,-3,-3: - bd: minecraft:gravel - 0,-3,-1: - bd: minecraft:gravel - 0,-3,0: - bd: minecraft:nether_quartz_ore - 0,-2,-7: - bd: minecraft:obsidian - 0,-2,-6: - bd: minecraft:obsidian - 0,-2,-5: - bd: minecraft:soul_sand - 0,-2,-4: - bd: minecraft:netherrack - 0,-2,-3: - bd: minecraft:netherrack - 0,-2,-2: - bd: minecraft:netherrack - 0,-2,-1: - bd: minecraft:netherrack - 0,-2,0: - bd: minecraft:netherrack - 0,-2,1: - bd: minecraft:soul_sand - 0,-1,-5: - bd: minecraft:nether_bricks - 0,-1,-4: - bd: minecraft:nether_bricks - 0,-1,-3: - bd: minecraft:soul_sand - 0,-1,-2: - bd: minecraft:nether_bricks - 0,-1,-1: - bd: minecraft:nether_bricks - 0,-1,0: - bd: minecraft:nether_bricks - 0,-1,1: - bd: minecraft:nether_bricks - 0,0,-5: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=true] - 0,0,-3: - bd: minecraft:nether_wart[age=3] - 0,0,-1: - bd: minecraft:chest[facing=south,type=single,waterlogged=false] - inventory: - '0': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: LAVA_BUCKET - '6': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: NETHER_BRICKS - amount: 2 - '8': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: CLOCK - '10': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: FLINT_AND_STEEL - '11': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: SKELETON_HORSE_SPAWN_EGG - '16': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: GHAST_SPAWN_EGG - amount: 3 - '18': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: NETHER_BRICK_FENCE - amount: 32 - '21': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: GOLD_INGOT - amount: 4 - '25': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: RED_NETHER_BRICKS - amount: 5 - 0,0,0: - bd: minecraft:air - 0,0,1: - bd: minecraft:air - 0,1,0: - bd: minecraft:air - 1,-14,-5: - bd: minecraft:stone_bricks - 1,-14,-4: {} - 1,-6,-7: - bd: minecraft:obsidian - 1,-6,-6: - bd: minecraft:obsidian - 1,-6,-5: - bd: minecraft:nether_bricks - 1,-6,-4: - bd: minecraft:nether_bricks - 1,-5,-4: {} - 1,-5,-2: - bd: minecraft:obsidian - 1,-4,-2: - bd: minecraft:magma_block - 1,-3,-2: - bd: minecraft:gravel - 1,-3,-1: - bd: minecraft:nether_quartz_ore - 1,-2,-4: - bd: minecraft:netherrack - 1,-2,-3: - bd: minecraft:netherrack - 1,-2,-2: - bd: minecraft:netherrack - 1,-2,-1: - bd: minecraft:netherrack - 1,-2,0: - bd: minecraft:netherrack - 1,-1,-5: - bd: minecraft:nether_bricks - 1,-1,-4: - bd: minecraft:nether_bricks - 1,-1,-3: - bd: minecraft:soul_sand - 1,-1,-2: - bd: minecraft:nether_bricks - 1,-1,-1: - bd: minecraft:nether_bricks - 1,-1,0: - bd: minecraft:nether_bricks - 1,-1,1: - bd: minecraft:nether_bricks - 1,0,-5: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=true] - 1,0,-4: {} - 1,0,-3: - bd: minecraft:nether_wart[age=3] - 2,-14,-5: - bd: minecraft:stone_bricks - 2,-7,-4: - bd: minecraft:netherrack - 2,-7,-3: - bd: minecraft:netherrack - 2,-6,-6: - bd: minecraft:nether_bricks - 2,-6,-5: - bd: minecraft:nether_bricks - 2,-6,-4: - bd: minecraft:nether_bricks - 2,-6,-3: - bd: minecraft:nether_bricks - 2,-5,-3: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=false] - 2,-3,-2: - bd: minecraft:nether_quartz_ore - 2,-2,-4: - bd: minecraft:netherrack - 2,-2,-3: - bd: minecraft:netherrack - 2,-2,-2: - bd: minecraft:netherrack - 2,-2,-1: - bd: minecraft:netherrack - 2,-2,0: - bd: minecraft:netherrack - 2,-1,-5: - bd: minecraft:nether_bricks - 2,-1,-4: - bd: minecraft:nether_bricks - 2,-1,-3: - bd: minecraft:soul_sand - 2,-1,-2: - bd: minecraft:nether_bricks - 2,-1,-1: - bd: minecraft:nether_bricks - 2,-1,0: - bd: minecraft:nether_bricks - 2,-1,1: - bd: minecraft:nether_bricks - 2,0,-5: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=true] - 2,0,-3: - bd: minecraft:nether_wart[age=3] - 2,0,-2: - bd: minecraft:nether_brick_fence[east=true,north=false,south=true,waterlogged=false,west=false] - 2,0,-1: - bd: minecraft:nether_brick_fence[east=false,north=true,south=true,waterlogged=false,west=false] - 2,0,0: - bd: minecraft:nether_brick_fence[east=true,north=true,south=false,waterlogged=false,west=false] - 2,1,-5: - bd: minecraft:air - 2,15,-5: - bd: minecraft:nether_bricks - 2,15,-4: - bd: minecraft:nether_bricks - 2,16,-5: - bd: minecraft:nether_brick_fence[east=false,north=false,south=true,waterlogged=false,west=false] - 2,16,-4: - bd: minecraft:nether_brick_fence[east=false,north=true,south=false,waterlogged=false,west=false] - 3,-14,-5: - bd: minecraft:mossy_stone_bricks - 3,-14,-4: {} - 3,-14,-2: - bd: minecraft:air - 3,-14,-1: - bd: minecraft:stone_bricks - 3,-13,-5: - bd: minecraft:mossy_stone_bricks - 3,-13,-2: - bd: minecraft:air - 3,-13,-1: - bd: minecraft:mossy_stone_bricks - 3,-12,-4: - bd: minecraft:iron_bars[east=false,north=false,south=true,waterlogged=false,west=false] - 3,-12,-3: - bd: minecraft:iron_bars[east=false,north=true,south=true,waterlogged=false,west=false] - 3,-12,-2: - bd: minecraft:iron_bars[east=false,north=true,south=true,waterlogged=false,west=false] - 3,-12,-1: - bd: minecraft:mossy_stone_bricks - 3,-11,-3: - bd: minecraft:stone_bricks - 3,-11,-2: - bd: minecraft:cracked_stone_bricks - 3,-11,-1: - bd: minecraft:cracked_stone_bricks - 3,-10,-3: - bd: minecraft:air - 3,-7,-5: - bd: minecraft:netherrack - 3,-7,-4: - bd: minecraft:netherrack - 3,-7,-3: - bd: minecraft:netherrack - 3,-7,-2: - bd: minecraft:netherrack - 3,-6,-6: - bd: minecraft:nether_bricks - 3,-6,-5: - bd: minecraft:nether_bricks - 3,-6,-4: - bd: minecraft:gravel - 3,-6,-3: - bd: minecraft:nether_bricks - 3,-6,-2: - bd: minecraft:nether_bricks - 3,-5,-3: - bd: minecraft:nether_brick_fence[east=false,north=false,south=true,waterlogged=false,west=true] - 3,-5,-2: - bd: minecraft:nether_brick_fence[east=false,north=true,south=false,waterlogged=false,west=false] - 3,-2,-2: - bd: minecraft:soul_sand - 3,-2,-1: - bd: minecraft:netherrack - 3,-1,-5: - bd: minecraft:nether_bricks - 3,-1,-4: - bd: minecraft:nether_bricks - 3,-1,-3: - bd: minecraft:nether_bricks - 3,-1,-2: - bd: minecraft:nether_bricks - 3,-1,-1: - bd: minecraft:netherrack - 3,-1,0: - bd: minecraft:nether_bricks - 3,0,-5: - bd: minecraft:nether_brick_fence[east=true,north=false,south=false,waterlogged=false,west=true] - 3,0,-2: - bd: minecraft:nether_brick_fence[east=false,north=false,south=false,waterlogged=false,west=true] - 3,0,-1: - bd: minecraft:fire[age=15,east=false,north=false,south=false,up=false,west=false] - 3,0,0: - bd: minecraft:nether_brick_fence[east=false,north=false,south=false,waterlogged=false,west=true] - 3,14,-4: - bd: minecraft:netherrack - 3,14,-3: - bd: minecraft:netherrack - 3,15,-6: - bd: minecraft:nether_bricks - 3,15,-5: - bd: minecraft:nether_bricks - 3,15,-4: - bd: minecraft:nether_bricks - 3,15,-3: - bd: minecraft:nether_bricks - 3,16,-5: - bd: minecraft:chest[facing=east,type=single,waterlogged=false] - inventory: - '0': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: IRON_HORSE_ARMOR - '8': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: SADDLE - '11': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: COCOA_BEANS - '15': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: LAVA_BUCKET - '22': - ==: org.bukkit.inventory.ItemStack - v: 1631 - type: ENDER_EYE - 4,-10,-2: {} - 4,-8,-2: - bd: minecraft:glowstone - 4,-8,-1: - bd: minecraft:glowstone - 4,-7,-6: - bd: minecraft:netherrack - 4,-7,-5: - bd: minecraft:netherrack - 4,-7,-4: - bd: minecraft:netherrack - 4,-7,-3: - bd: minecraft:netherrack - 4,-7,-2: - bd: minecraft:netherrack - 4,-7,-1: - bd: minecraft:netherrack - 4,-6,-6: - bd: minecraft:gravel - 4,-6,-5: - bd: minecraft:nether_bricks - 4,-6,-4: - bd: minecraft:gravel - 4,-1,-4: - bd: minecraft:nether_bricks - 4,0,-5: - bd: minecraft:nether_brick_fence[east=false,north=false,south=false,waterlogged=false,west=true] - 4,14,-5: - bd: minecraft:netherrack - 4,14,-4: - bd: minecraft:netherrack - 4,14,-3: - bd: minecraft:netherrack - 4,14,-2: - bd: minecraft:netherrack - 4,15,-6: - bd: minecraft:nether_bricks - 4,15,-5: - bd: minecraft:nether_bricks - 4,15,-4: - bd: minecraft:nether_bricks - 4,15,-3: - bd: minecraft:nether_bricks - 4,15,-2: - bd: minecraft:nether_bricks - 4,16,-2: {} - 5,-9,-2: - bd: minecraft:glowstone - 5,-9,-1: - bd: minecraft:glowstone - 5,-8,-2: - bd: minecraft:netherrack - 5,-8,-1: - bd: minecraft:netherrack - 5,-8,0: - bd: minecraft:glowstone - 5,-7,-6: - bd: minecraft:netherrack - 5,-7,-5: - bd: minecraft:netherrack - 5,-7,-4: - bd: minecraft:netherrack - 5,-7,-3: - bd: minecraft:netherrack - 5,-7,-2: - bd: minecraft:netherrack - 5,-7,-1: - bd: minecraft:netherrack - 5,-6,-5: - bd: minecraft:gravel - 5,-6,-3: - bd: minecraft:spawner - spawnedType: MAGMA_CUBE - delay: 273 - maxNearbyEntities: 6 - maxSpawnDelay: 800 - minSpawnDelay: 200 - requiredPlayerRange: 8 - spawnRange: 4 - 5,13,-2: - bd: minecraft:glowstone - 5,13,-1: - bd: minecraft:glowstone - 5,14,-6: - bd: minecraft:netherrack - 5,14,-5: - bd: minecraft:netherrack - 5,14,-4: - bd: minecraft:netherrack - 5,14,-3: - bd: minecraft:netherrack - 5,14,-2: - bd: minecraft:netherrack - 5,14,-1: - bd: minecraft:netherrack - 5,15,-6: - bd: minecraft:obsidian - 5,15,-5: - bd: minecraft:nether_bricks - 5,15,-4: - bd: minecraft:obsidian - 5,15,-2: {} - 6,-8,-2: - bd: minecraft:nether_quartz_ore - 6,-8,-1: - bd: minecraft:glowstone - 6,-7,-5: - bd: minecraft:netherrack - 6,-7,-4: - bd: minecraft:magma_block - 6,-7,-3: - bd: minecraft:netherrack - 6,-7,-2: - bd: minecraft:nether_quartz_ore - 6,-7,-1: - bd: minecraft:netherrack - 6,-7,0: - bd: minecraft:netherrack - 6,12,-2: - bd: minecraft:glowstone - 6,12,-1: - bd: minecraft:glowstone - 6,13,-3: - bd: minecraft:glowstone - 6,13,-2: - bd: minecraft:netherrack - 6,13,-1: - bd: minecraft:netherrack - 6,13,0: - bd: minecraft:glowstone - 6,14,-6: - bd: minecraft:netherrack - 6,14,-5: - bd: minecraft:netherrack - 6,14,-4: - bd: minecraft:netherrack - 6,14,-3: - bd: minecraft:netherrack - 6,14,-2: - bd: minecraft:netherrack - 6,14,-1: - bd: minecraft:netherrack - 6,14,1: {} - 6,15,-6: - bd: minecraft:obsidian - 6,15,-5: - bd: minecraft:obsidian - 6,15,-4: - bd: minecraft:obsidian - 6,16,-6: {} - 7,-9,-3: - bd: minecraft:netherrack - 7,-8,-3: - bd: minecraft:netherrack - 7,-7,-4: - bd: minecraft:netherrack - 7,-7,-3: - bd: minecraft:netherrack - 7,-7,-2: - bd: minecraft:netherrack - 7,-7,-1: - bd: minecraft:netherrack - 7,-7,0: - bd: minecraft:netherrack - 7,-6,0: - bd: minecraft:fire[age=13,east=false,north=false,south=false,up=false,west=false] - 7,13,-1: - bd: minecraft:glowstone - 7,14,-5: - bd: minecraft:netherrack - 7,14,-4: - bd: minecraft:netherrack - 7,14,-3: - bd: minecraft:netherrack - 7,14,-1: - bd: minecraft:netherrack - 7,14,0: - bd: minecraft:netherrack - 7,15,-1: - bd: minecraft:spawner - spawnedType: SKELETON - delay: 343 - maxNearbyEntities: 6 - maxSpawnDelay: 800 - minSpawnDelay: 200 - requiredPlayerRange: 8 - spawnRange: 4 - 7,16,-1: {} - 8,-7,-2: - bd: minecraft:netherrack - 8,-7,-1: - bd: minecraft:netherrack - 8,12,-3: - bd: minecraft:netherrack - 8,13,-3: - bd: minecraft:netherrack - 8,14,-4: - bd: minecraft:netherrack - 8,14,-3: - bd: minecraft:netherrack - 8,14,-2: - bd: minecraft:netherrack - 8,14,-1: - bd: minecraft:netherrack - 8,14,0: - bd: minecraft:netherrack - 8,15,-3: {} - 8,15,0: {} - 9,14,-2: - bd: minecraft:netherrack - 9,14,-1: - bd: minecraft:netherrack - 9,14,0: - bd: minecraft:netherrack - 9,15,-2: {} - 9,15,0: - bd: minecraft:fire[age=11,east=false,north=false,south=false,up=false,west=false] - 3,-14,-2: - bd: minecraft:air - 3,-13,-2: - bd: minecraft:air - 3,-10,-3: - bd: minecraft:air - 0,1,0: - bd: minecraft:air - 0,2,0: - bd: minecraft:air - 1,0,0: - bd: minecraft:air - 1,1,0: - bd: minecraft:air - 1,2,0: - bd: minecraft:air - 0,0,1: - bd: minecraft:air - 0,1,1: - bd: minecraft:air - 0,2,1: - bd: minecraft:air - 1,0,1: - bd: minecraft:air - 1,1,1: - bd: minecraft:air - 1,2,1: - bd: minecraft:air -entities: - -2,-13,-5: - 93d845b0-e5b6-4159-9902-7c1feb904fdd: - type: BLAZE - 0,-13,-4: - 3ea38461-a7ad-474f-927f-813bfc028a95: - type: BLAZE - 1,-14,-4: - 9411b510-6fb3-4e5c-9092-1eaeff9dde0c: - type: BLAZE - 1,-5,-4: - 40680555-83e2-4577-998f-91446c8799f3: - type: PIG_ZOMBIE - 1,0,-4: - 3c7f64cf-59c7-46fe-adbe-4d0238592318: - type: ENDERMAN - 3,-14,-4: - 7b8af36d-4408-4fb0-92c5-8ac3cfa234f4: - type: PIG_ZOMBIE - 4,-10,-2: - 11252858-a030-4e32-a1cd-87bc1c11f073: - type: BLAZE - 4,16,-2: - 0a80a57d-b79a-4f78-a5c9-e9776e703de4: - type: PIG_ZOMBIE - 5,15,-2: - fd6bf00f-21b7-4780-827a-eaffb3f2fd6c: - type: PIG_ZOMBIE - 6,14,1: - 0931d66f-6189-4eef-af73-4bdb2f131242: - type: PIG_ZOMBIE - 6,16,-6: - 0b1db2cc-dd05-49a4-b162-658ca628881b: - type: WITHER_SKELETON - 7,16,-1: - 6010d461-276f-4fe2-9d76-d32ec4b99008: - type: SKELETON - 8,15,-3: - b86e341a-b1f3-411f-a925-9339b309cd3c: - type: SKELETON - 8,15,0: - afbe8e17-b22b-43d0-b1fe-06f1886c77d1: - type: PIG_ZOMBIE - 369babf2-00fb-43ef-a22b-b43b0348db96: - type: PIG_ZOMBIE - 9,15,-2: - b823930c-2168-4a70-b6f8-e2bd577d7936: - type: PIG_ZOMBIE -attached: - -2,1,-5: - bd: minecraft:torch - 0,0,0: - bd: minecraft:sign[rotation=8,waterlogged=false] - lines: - - '[spawn_here]' - - '' - - '' - - '' - 2,1,-5: - bd: minecraft:torch -bedrock: 0,-5,-2 -size: - xsize: 16 - ysize: 31 - zsize: 10 diff --git a/src/main/resources/schems/nether-island.schem b/src/main/resources/schems/nether-island.schem index a5ce50a7bf175b3d03c223bce2ba00b371e6887d..6dcd118ea724733ba1b622b7d1108df7f6c6f345 100644 GIT binary patch literal 19567 zcmeJFcT^Mq7ygUVL6IiX1PoPBq$*uHf)oJ-0qIB)r1vIWX@W>cX(~;W4$>hYy;o@g zLhledQj(k`=vPEOzje-8cilhky1G|*&uc&X*?T5oj57fh1x&0fXn1&dXm*~GN@%D4 z5FpmpCXQw%_Uz^kmWI~GjpMpDI?XYkr;ZNDD%!)S^1lpfTm*R{jy>Zoa|<_IV3 zac#=|OULRwwkAbfHj;&1yJ@QyYMO-;feT$=hXqLa_Wsy`?AEc7Evyt^G)pLIj|WbtG6 zEAJ%uF8P8lWhei%r*jzOcX(Itk_6Bij)ImXEC%3sV%8;@?8KD_HOL0Yu`c#hvsOzh&+qSIdC5ZChH*P zw_qRn_N`|^EAq94oOP~AaYb%NXSY{zJqPZ*m_?L_g&apNGiskJc;bYPdI>%DBi@t@ z&D9A^|Yh$q~MZb`iB4nayRz@p|+WdiNu$DP@PI0`tmZF6{ch0{GTB|fR#50)LSp0^( zAJL)*QPpXk=2RRpQT?p-aq)GHUU}tYb@#pEH?iHwU5Z*UeUO{LTWPJX#cyFhp55wH z)K~Gud_23@da$>moaTO#vwe5=h)7Xi@{=eJ(+BJCcn|KFr=wJ|EA#erPK&J~MW*{5 z@+ZmiXX@@D#eIHH%yYsZTl5Vgb`vRraU@cNmOuD=Ii2?_#+|-XI!h+XZN)2$*d5^k2wYL z1+lgDq&N13dNK3RK&+N3NML?gq>x?1u2`qB*Pcwa{V~ly8+MI$9WT~C6y)ISuk}fqIDR4bnE}y9J{5fO5{Z_E2SJ@XA zSEyTHlxt?VMnvr3V0!EM_WbPJ+uYFs^wn1DVSKG+c_Q==N?~`YbpBqz?QzQ0C+1~Mnz1yRrQX) z;*)3dKa^2Z>e1>bb%fhHKCu<#5^EC_Fjtei^Mz@&EK-vYiI*VOXr*GT^rK}jQNYVB z@8M1ltGn6Eq9L-NSIC9`ZRLldCeQk<*m)Kqt?^jQZPFzDN{eWoJMvVc0ww|i`Ag#K z&vmJr@!PfEr?BQc>A7)d`N~zNi&kSdZsE?e$hWKW$eFb=ePoV$8LN0%>trJ=>g8N; z2T@WynFEW;H8IzQ*e6&_h@k_^+UMK0FY$Y z#%S5w_EE5MSHUK*l6f>Ypv)U_R347z`fT%0ABPEeGj@TS65-Z9DcY%P&+&dDPX4KB zYZqI*7z@EctEJo{VggwmEG(khIQM~J5iolLuTRCgzRfnXo78T{e0x6;|4IZ;-`1kr z0BKHgB99e_%-~37xQ3*}#>f(gI1RCirejytgt}6}Y$r;daGs0L_PW!UTPnjzy1 z+cN7_VdDpNa?CYd&6CILv1TGy<+o4lFtjIHV)+Z_tSsB(5YLl|;{BCgl_=EFSRtw1 zl(DTMp|LR%s6if$Tv_o(P<+TqvRCERFBRHGEY>7Dey#RppHe0?8#%OzNVF3g3ae{u>@inc`zp@*D!_F=_3k{I) z!w>SpQAu^}mgo3Stmu)-SJ@?RkysSAOvY-#-&Pv60iVY1KkL{#P)s6Fp@pkYf-fFx2YXw*@wV7AsU)K*^TX7z zoxDh>Q|HSjV2h2LJ6p@UQ0uf&+V3%%Wf=HF^!WN! zp6))|_?D;YCTnBEJjiPpH%C%O+^cjO>6=Mq+B%BVq4(5T(3#M){}QX}UI! zbUQUsUtSesQXWm`f)5+IEi+m!R&5MgnJIeNWi*X{`DL`BTWCW}$T%m<@C!zv>HHfc z|MMrBh&y<8+e+TxTTFII=cHBs#o3mS@bh^vt&%sZlFaFp$%**4!@!C2->`37XmA{H?g&R;QGYrvpRFD2 z#8zOgI!EU3j^yUU)s%DxnRijQs#=OxI;mYUca^ShOJ zSr}gF9A0T1n+r(xEeOXRByLUJVs%8BH)bVXO0ZZ$GG0P6&gVL3jagttS3=NG;ycVo z48nN|61SudwrUTy^4D1BqZ`GM2Kks#6I)?^vJx*Q2r41zJqMyAq0AX23Z9f-wqpEb zC0!hbDrZ0{gUqN&knn!7m0~f(QyVMGis@TeT1mtJU*xFFBhdZl)N)o*=Rrm!BuM{T ziGrx|lI+tCe>lQ6HfA(78X3R+sTI~%##cI9D?35kl?4Yk`qwe_Ks^@JZdQzWR&se( zv)|(4_y*}EaOI>b3UAa<;K9+%|L+xw9XlsR)8&>;`q>K+^ zNM>>rPlwv?Jm_no;AbKAulSb(LEUMGzihF7+5QDly@>x~0N?+QHsZq>LYz2ue2V!Z z2W9$3?`u)ZSumPgG3A7%eTyjOi#`vclqzSGf6Ar)l>dP!Pl9x$=NX7-6qdd_j^-dT z>g=OQO=7|L)Ji%#Ea)3a0UyI)EYn~>!)Ro~XwZ47SZ1W)ze1^D)K}Bv&G{irV$n@v zf%|k#>Zxb<&7-&KDLFHyfQu`L>j8m=&h6oLgUOyhEW70_Sj^W1&DZF1Xw$y=7dyWl zBSW6aIOE4RqKMWII0r@@^R*Q|uVED>8I+KAIKLcG z;sRYT75)qQAtA|m5T)$?e%irrL^NQ;!}%~=pD#`Wez&}AY$B|?JI?u*!DzC{XtFUf zloUbDiXL+TJVOovW*#OS4)>k~l_IV;5uxWkFepp9R2ns9R08x3@O3E9t$x+za79?0qc@FDW0@t0{NgeeO|nc(YH5YwSXRaGfm+ zfMkPAeWhI6&xtGGhwk#y;Oy85F z%cAgHE>9ug!}B0YDSJlwr=0fQ|H}Ws6VEG1&$ICV7aJvCnR>%87IogvB2vj@Q^?2v z2nmL};xA>D&JWz+jh5gIG?HsiNUlkd)bPbeOmat0TKIn@svR|$r@!wRM`RCr7VpF91Mg~A_|O7~KLMN~nw3)nPZ6_%9ks8` zZ|&?;*yQQyS5F}Bu{2nNH#$4nUz8+-&&-VL1HCGbS1RBu?Q3FQZl2{L@S|O@H79VQ z%G1d+b8`wh3=bQt+22{(>3w6q)z4MiiYstH#{v*!0Zh(fCcdcs8irdn>WcibxQkYO z?Zc4&j{EG6yN@1G&kDM`h{%`KtL>WAwzMg`-j!tEF zFA1)oB3!#Yx~^+2BmM#&#LtMPS0xfff{L2sivXhEx4-&HWQepB%V3^>aXbW z)|`lEjhk;x%t{YhEGX#dV0R=Z3KXI=2Kifh7+ZO~wIV89lPD2sDZw4tqXg|~#3ksL z+N_(-2gO8{PFO!R_4>AH60G@;CD! zwj%npCQ&RBgoJcRh-rQfJW;0otvpr!_J8H4AjtIy~`scY5$5aM9z64YPBkS(S-)?EG|tOac6-G=$<`e(vxB>T zTWq@5+6AxYNb?KWZCO-i*@B->Y~f(HMzn4@5CBgUaQw9FsrUn7dujJtRirxraVgob z?>+Cp%D%O6fUCwt-a)}aF3ukJGqJlRy%+Zkoxp+ht@>$KpuLfE(2>xjvg%I6Yy^p)d*2I zY8$Y!R|Lofe*@urL&SoVbG?A&!!A%DIQs=F7zhj-vhg0TsjetH_H>C-PClOcNmT0n zVrzD!C{vk(Lm#@i69@2q;knyfIVI-h^$og|@O6BsXB}}R@i0x3%>{n641In7#pbbC za?0@%SPZ)I+Q!BPEIPmDeJ~9IR{cDjRo3^0E$IWxJwWrBuk|PNL_8naKyHi9dwLx< zYNWt+_hQ>+MRMWWjSKo-9$Uxl-AXkFdyTI-*VoftbO;~J=W*7!ZmwzQCm+v!%>%mG zZFPcE;0tjqoUr4CN{^$@;XNtvt>Xk6z*uWw^XKvLHCfNMu_=@+@P)>>lp0spZkLp6 zyQ#^L6yV`>QB*hZcv}N3TBcB5DGQC?|GE3RTWMbZg8P285sXNo;_wck{yJPUeMPwk z=(wyew9A=v7^ehP$b_YEu;9KJ))oUH6RsqlcqJ;u%u5-nIQ=*Lm!j)- zP?=+6pRQmc3TVkq>3E9rT>XqMr6%3@-$Q^-@Hd)!H%;*}mM zX0m3eUg^IPvUH_!NA8LPT)LO7=f`z3BcX5HNu%*fR*IQ?8LHI%Sz$|2eDjFjjm-Cr zg_wDgF27R>R?L*nP-W=95wR5AvLnZUC|=^Z9LW%)a=q0r_$D1aH zY0>50pSBG$RJrHosP?(BbMq}J>B#Z2h&our%ZMYGJ-Q&`s&iTfQx%!L~7Bt3nv#Qh*MK0{Tp|3=1A zRQ$Z?d}`8#_wSV+Jjl$*P*v^E%32y2aD4t;h?m#1Z(s~@2kISN&QkQCqr8PsI&V_n zdnNM+nZ+5ZTKz2MoruAbE?i7ddi5aldxolEe^&mI+OXqIOCd5o&qu>!V!gK}WU3#0 zCEejma!*jIevmnlp=#5gRk{>4F%R=)ez?t5`Q%+YSF+*DBAz%mKFY{MB{`)`rp)lD z#7f^)=NJn+_rk`dR`N_1?Zjluzc<>r8wDzZTV0mN(ZsMS1-XMLMy&i89Zz~ zdToMg#2LHRZ6)-!5|LD-T|It(lC&^ICG*}PdLb%JOT=ILz^L5H%VSEr@7LBFr@VPQ&Q%8drjqu_%qNmyY@dN^}UN&f)=a2M28pgwZH@BQjlu0@&+L;VjDxWe1T$Yk94C| z1UOrg@&VkP5Acsl(s!>EDLuf-GwrEcWtlWy&_GCR3(LZpy;bYIE)!B{++NhTzV6EA z|I9L|tS|uDqqq+!zIEg#V4^e7RNY>Om&n6mzR`Ylk2I@YsJy~N zEdGcuv7)R5pr||Qt3P6UJ3^J{NKU|OY_ZR?-HQ*($gNtoy6`9%vHnrE`b;&VeJ%Le zv;Io@S&pL%u8y#nx^@_Bl6o{XG7jpE2A^+eBsDu)tLI6%4@v$2+9%zpotn5%>nVmV zCTzQlHB*z~Q`ES2yLD_o%C@A;$IlV0TstyNcySn^c=pZb6cEp5KT@8d~(sCiv2vH?mN^^8UKzoecw-%f{_JRRd zXbOCv|eQ1juTTB zh&)c!x8#;k$0^P?1LduU^8q!s2UYwb;y8T)D|dC1YeJES2W@4a6fMt|6H^(zMPR~AKil<|J ziyAtsvi8q}NBahGRMnl$HivLjyT4qrf{hw1KZ*JHL!Y`Mcx1;puKwt#ZcHj_8ui6L z0nh`5V!dFWoX2&CBaX+x+%e3H%VqsW9T3owSwHd(kcrk?P6!t1c+9-?Q=xB@0=2*wghe_ZzoPM`M~W%zkxPWi4<$dvPA#c~ zVMn;JM_zhC+Z5BsuLQj5yYx>j5jXo`zH@5c^gs0P?@~O1zWQs~`UMuLc82{{GJie9 zKOPN1o(QJ4bpLh@+K#)mz}awsZwHf11QMTFw!hp4gmw@W)jCxmCJ&{BLjy}fIfilw zy1GkiA6NQ)0e)EKH2FIc=z`hx+3N>gxc9Tv?^ zYmaE0D@vFbGtja7ef-SD>+XCoxT?}*Ui;;cb4Gr0l6)%2ZnK`_g8_v~K0fO(cC;mh zN};ZJt1~(?2(^KrQ5=&7SY5PnbuWlju909x8=riU#X_GWkq~#2CRW+l*ISjHG^~5P zrLT=~ z!ynUrFAP>yxX$L^H4x%5+J63Eeo>ten=Q~UMyjsuqrsd?zCEj^V6@zvEf+>$$ZNhi z0_^PoKR2nms*eT}DqJ?K@%+(_zZO?Is4vc+%|}&D8DJ5TQ5Y{@z35DUT^Zn~D^-{K z(O^g=--0zN7nRg_dhzN-90F|r06z(-x(^>i{R43IYs>ab|5gw4URnKP^3IU}IdEC! zqaGD5GgitwS1$cAk;DDtW^gvobKxqX%%qCl(x=Fe2CXXj#;lq=S8h>VjJ<@d5WsVT zickjepY#h-buT{}d{^NzWR2&#qDXo1`Xy}AfJi0e!X%L^d;AIw_qv`MPqgJ92l)zP z))ACv6LWnV*|cFlSG=wWbnbP0jNNqpUPM~*XG$C*3xC0Z_bNH&gKfD^6Cxd)d!~6D zoVnprq7gM^iPhJLfK-NJ=-`845Kmbn!R-XiXv?P$n}QqblD@l$j`3$@uxhGa$-Z%M z@QR6!>Ro}@;<^ViWX#l$qb=1Q7CyY!dS-(xHAMd5J%ogp>hXZF+QX zrtP)-+&$V@iYOOzuS46-0#m8b_m{YDzM_ng3>CV>t*5V7B_cSkQ*)F8Cta;4opg$K zP+XtyRbCk~B;D$T%souu?|G-TtauYP8ub2>;!W)9F&I(uzH+oU*NKQs9nE)F=b_`t zc{Fp2k5+bo@c>aBx11Sr6Tt|f7iEW9Hzc#Jd{hfjxp|K@h9O#>L_Qra{S9OET*I-x zj%~rWN1l(eM6=XV)V?U+{J|2l93{Ui*E#rWk$#x=PrhweuJJJKspq5S-Bu_r2i3;` z%a@OuN!msykIS;|WetBCaD4r!;9gd^*~4WjRbt?#7Y&Cgxa{jijEW0W)O1+#WBS`6+xoK;Wc`5yAz$0#{ ztoV;=9V$0XS;=lkw^7MAo`XYB*#4~g1fQ5hU7AClWHg>EE8pB>Av=l+fyy<)(w=%h zDiF&WOHo@r2hYG}eLZT!$ZtoVcKSUIZvt|zWhN=ayhV+=v4?+I4x=ph&vrV&r~!nQ zlu_px;HQnWr>>8Jxlo616dl*il}MM73K= z%Vh#jDzgSuJ6nJ6>2S(`qxYj`XltF7Ny_ss7S>&o3-Yuqto|coQW1}9TM5%mg`?YO zZgd_7;GDd*OWstl||u)UpbXwTR(=tRRV6XU2x6e;hxg8(L^hMx7g9@Yl>2S z-L~ecHD%!8&esJNZ}-jPcANEeaj|(?>h zq8m{`Rsu7&I=eTpzEEQPki&E2iah#WAC_|QLkPA?BgW^a=xPOMUo_EvSfZ=-W2 z^4<*d3X@OOPwiVA`h2HN`|2D!!FFtH2XYa%6)WSWkP1%eTinmQa|pc=_C7|YQ@-9b zogg6w@u5Q2DS4|@&Gd)aeXQ!{SH9i}d3?3;CV^3mOo9AAIP57BQ#api4?cMK-DE^2 zMm|+O{b71vKup_LehOeUQO|mlI?>M5@UiC9sO8Mlbi;zarp7j?O+l+|x=DRZEP;j= zpN{#At%;Sb*Wo~3u^iBz3!_=ABIJmk%RHP_T`NP=eCFvK;?v9C;15FShDm+-O6EG5 zcd}Kl4&ESGi4Jg*ryjb2ONw}lVR{vZjsWv*6Z-vnv@}DsJ}xwKN}oHI#7}Sl3frBJ zPt-JL)nS-#k>|#-iq8jTV=wMlieBXdguM@MB${#CuoH+s!mYo%D?rl$^*5Ywqan=T z=rNe><=Qf%bSrL_y#}wW_+U8Ko4;i?(>7y(QS-@VV^@N`cQF!cpe4=(at3GAYbjsuuKJos4({hGzx{fraY}k;nmn+aLUg}N<{ndG5 z0*9agLFsy$PbR3v49%zW^6e;L6H0hq9#L<1zU_%R@ocx#CJTRtIF0}Bwj81P6y^~0 zt!}`i)tIce@Ue9L%}<78z4;+#Q8%X%@2*9Xq>5!{iPuO3r9Gqxdszcrxe_Xb5^phR zl?0jTNEcg@^yUYd%`i+Oo=|Z98{=!OqLIE#9F9Q~+T_*z(h!1P52>9A;y=s6#p?84 zkM>XdvG*YCuaTY|j15UNJ-k|cbXR&bPAN2RICcNxqp`NJ<+=%B@3NaLm!`1ktBn5%x|b9$H@*|= z5r1!|{0>mePCmjN;V^=E+1_3OW-cyt+SruFLBNGa+XtnPBREh5z70-Jd2tBw9<7%A zez4a$zn?iIJah!#?Vkq%$E-P&y}dX0mUn-wtW{ltew9s?*MF4ffBzpqE!iqGIC!NeIliycu#7fB(#<@W~$AtBd!5T*QnMtQ275$TC4 zKL!80kr5MoQcz$lucr-P%T0of(`*hqr|LrtMe&xOx?Z8W9)fHC!+Y8k29bKhGkTOs zE6T_6w9jAW`M=Enf~bz)QSJU6<3DCN8Td@2_Te_LN3K2VyvBU(-KqIk)_Ogi3WI+| z`*3F-K?ZDzOKpb;$IXaQk<&=g+wO3E_W2}uv zt28O7H{rLrN>FjK&S0BVeF&w9-t^N~lVQu+|>k+r$W4KAsapKKl`&QAt zjl1@s*&xJD{bme|KI_jVc=C*X6M%wK9)=y zj@YOy?+Pn3Vk3z42@;s3Ew(Ynsae+*FJVDj%&zk0>|n*W?$ z&gTz+P@dbUdHuMqh^tJWUQA>#mB86?s;htA+OE=j;x#>aqn}Y*?iHVZ?AK7j? z-g}k%xrdCb;*+F?+T#1ii$dy)h*$hRLuhVLFBx|QgN#PQVhE)!NvZ{T>I!A580GAP zP{oQ*avFD*Layufrm?+uycd=GBr4Y^3TE(jpXbw3$Q|8?47NVUd+&4a_mi1dFg(ym zTWUKGB9zT{pmi*_ASO%$WUnedsc2kT4w2M-_?hjZ)4h+mtOGG;AT9nb;=U$9(qS77 z&4!t*$K)&5$Bf0fL4#zy6%1NK+*&{vA*qU*y@Jf-Yt+-bF&LJ)hV5ni^lL8gzV zSM*Z%UH(dZe%?5_yfdxBUZBxNqmKpMfzv%;?&1*d5eB3!RJSNpH==-z$N64UZp$zk zRV9OwhVklqlhyx2>b)sa@Lv%SIv!M@9eI9G^EfN;I5Rd`Hw=eSR+1R;KV6mirT?!K zHMg@=leOGGB?yl2X&Gj3{oCqvJ&ugTqTHSN&{k?5Vs)`~4_y;xuu1=`b zQ$KgDAF|+oQSB^+Zu11)=GG(ucGX88{wo^+7!w;NAS+8S(e*NJt`~LA?ay6|)~r8| zvw!^)R@vi3q9Fs@39S^CrPgX^(B*7*k4arv=R*2`uh?D+4j^YN|MgT0`g`uZ<6 zr$Ko&h|j%2AvGmmAn*lvpuU$?&<6YKjWCiL6OtPG@BGp~1MtAaQ`8JEq+Z$tZCHhF zh$(K2z8lyNIGj)cQ!jf+dD?u25bRcetSQZ|DJ@1lA{OU`%fP|`(j!Z#fx(9AX4v8`LdQpteqsE8qyvYj6+eZLu5X8Q7#iAm3fl?zSyvv zR8~Ve}}mR>eR~@H6Tw$FU(9ZMu5JUW#B6zcBbJ1DJY_Q=EjykaJE%Ku6SMbMjx<-q5Z_0y8H*u7 zd$heZjHCP9qxwg0CxhJHF;+s1D&dpRx_fW%fQ(ZvOvi6tf}3A@uSxka&U?OL0){ig z{r7QQ1Tmm*K7dJfg#Ek#{;+RE7v98cRA8tzH0Q$Wj{H}2>O6BNB{ghQ*~vd<-*-#`YF2O*?vbEM_u0Zelxnvwdyz+(}!Z`{=$#;**rb zu6%SGmg18%!~!^2qJ(&Z>ja2fo|4OWG{P9oZ)yt|H|%6LCjIA~-r8dT7O)U)WkXl! z9%H|G>}&LRQj^TJpoK@M&f+0L{OWllk15 zmA4VYUA)1&VflPA@v1-uj;Im=qOA^ju7CZs!CIHN*_8VIR^Mk)mk-2w@J-w0R=#0#+dyVtW}$dh3R-Vv=K zka5-JCG_`ev%99ErU6XP&@J)FWbXUU-Lk!rKg{ zeS?{{!_N)wZGEal=xvtB4zZvETy8ksJfPv&Ki-=drAKBJJ-;vH65^P{>DB;gQ2%1@ zw|hi=u!sQ|_aKbTKg+1g6G$Wpmsk|TgW`UK)9nCW!We^LMxihb9M$H;N)Ae6xc{p6 zTPRT>Tw+hG1t!}EYaWK>UCMYP=wik784K?wx}Utyhs$)RCBqYphB7QoDn(j{^+N*{ z3gQ85EGKjcU2)V>x)49ejv}8YUTA)d_xlHVy3d#KzF_&?^hGU$jG2j}GG-YEO9Urd@1=caY?sluBl_-l9pov^k{SvI%r+j9~m0lBBsR0YQpd>5JxO$G$#!h zTqc*+?1nF86U-CRaNy!(VEQhJ8we4{6JphT_YO_)#RWLJ3)7HeS@@S@Hj6|^`qjRr z<6^?QbOA#jD%ONu=T9V5%|Ynl_pNTscc$t76A1%#;&?JFQ*2)#6vV$z$B}g&><2QHGb!Y5?&}N#>~rF z0eUW_AiG3ct_b0coeaTH(m@;t+&2l=c`y2gNgAXQ53@FuJrsy

>71we66`EIqqv z*Po_F&-EBjkqkri6=mi{1oG04LTSzAseL07yLJ zHHCVz9yknhqMj`N2W^xXw*zWJ>A8&XIw%fE39nV#!8Ug%Yf)PP## zGRSg(IO?;Z6_3m0$b+cMfwc|vTy}VhG#I4FWnr+C;^jcpQRaVe@fwDIV6FZaVof2e zSVG@)DPx7e_-I0ls4PrnXCmKmDT96Dp9$nh(Ih>WYmnszan$55=iBeZr1`vqEMdeW z$Ml5TNq<=d#?s4}U>BFUm;DMr4 z^)8*R1}BFXC0=Z}ZGxY6*4#u!t@TP61wq5TOIg)-m%lY^Zf5aXSV7g>Hm9YwjBW>S z7p3ZT9qk4>ev$p?^&+jpE$i_oka;$^BZ`HZGhxL8e9bDYC1R(jD0Mh_H}&n?Pw6zJ zx2bCI@#h^p`4^f&MKh^0Gw#rj(M1A6KZ@KP_444|yThd*dsks^_;EK2eD?EM&icWRW!`E8N zlL1a6ZM}N~(*tdr?;M4z3Mllw_NG@5*9q-iR9^!mY6QK^pJfgOKF$T)5wscNf1IG} zy>5Bu?&@m#m`4>kklNf^^{9FE(0NtSM%1Y5{k7m^Ju&w|KG``PcZ+Ltmf8z|>FI?Q zxBlA}_Fj%O3qyeEg5+!WszOr*I0}CZ^6%N-_5vD{e6f7|Wz=?xw0Jr|ckSG@!udYht3h|lUXlr}@7J`!wzqBI zThl919+2U{{abtqds{m@Kh0*I4W$?~e;f*z1nY=}HuA$Bg*SFL17_+VLqayrW2MdZ zX*Ja~StaGL5KufIX>aYxu7I~2lyyefMWwiH{Ax6r5o0{3#Qfewi=52 z@ioPXw#p&l>(|Z^BG5kMXm)NlmxH6*s|V*LxU(v7uR#ugb>QvXb9^Dc>uyXiT z{lZ~$`N!UIJ#ZoUuA2iCPz8eS%PPY*#*e@$PWDh;ha)J!8g36I8q!bQSWmL<=H%@1 zdf~pUH$l?{toDF*uXXzYTjI|jugF(nJwlE@8!zlX_GQyC^zLYG?mhSKpD~h#mJ`7EClzBgi~#=#W&j%i>-5;g$y3(# z(E|tUT@?BP0Q}h4M*dHkpFWHGWHaMF3E>Fdu$!xELDM~nN}yhB*J~Qjb~U{+ZvCA; z6sl*2`Bu?b`4#I=JUan>ND#|Nj3`qM2x7cTCcOZD4!jC9ja}+L=%=hqxh!s0JRKjK z>yG;Z(ti#gtis1!jbB1g+>dp{=cMf9?(#Za-8Eh1_lffv6WAEim=ORbN5n%>Tl0$S}nb+LBby;R_W)K|SK&XNT@5 z0ULBs7zeAYWPlu?w)1h- z1SStIQe3)L8S3!iRp&ND&8A+-PSkxk@)kb}G`VE?%W^7dJQl591V1snG2(;1572(; z0dm@^SRkic!HX>wFA|syGSuALZM1vq?8QX`xZ?&zVxrUMFS~y2auhc!tD|rC1#0{K z4UHerdJ|GRi+ixNWh5RY3jtbtKq4OfMes!y`Ds6w^i=|W2IX%e*WeP0@X$hlHE)FX zi=rVA``hlYyYE=QD1QR9Is#e}p>Mhk1FhL?WLG!Lz+8v9KU^s$R#3a1&Jww-`G2fL#iJ6sxDMPtI?P?#v#Nw|Sai*A&KsKMgKi{K$4f+tHkUaY0Nd8>gm zXlh&psYF54^v1L?uNiqY*=78b!9ki6{4z>iBEI1|?*W9_Ew1)XX=;Q8Elb&op`&yq zb7`NMl%FYPW0I>LcWM>Rx*JeN?$MTXtUVCtIaCZNz4;uz@#XiCr;@6s=4IKcUe+)D zDe_gv+BByg@%_t_O^Pj)nYvu|B~InmZBH+p%Hil0^~1HDg`KkGK~~8#H~;QH7cLNW8pKmNRer3&M=bCfNu)()t^9` zGpB9s@U3@dz8iH;4!)cz?;s!gktSgGR*pwMtW6n-W~k&CRxxDd)jEW?8k8FqG|DP3 z!B~oBwpaVBHs>kFN7w?rk?IwJ%I*xZ<=6((db(=0nPrkgbgvbrP>?UO*8hP?r>i~$ z)pO1|vU6mP>m28t6bRITBK$UgLWK<4)EBHA>RmEJrXXPb)I&vpY7n5534o;L=At5m z0p1JPo3OlpN8d)E+O%q$Os4km>dEn@EB@Y%$t^-NKn;i;%o$(>Qg5v$Q>Hd!rnVHw zMJ+Tn<>M1%=(OiPV}l>20 z-Z}GNkRZlv9q97M$o{K8)ansTNFh#Nzg94U+QLqLsRz zTh`iy$M=~tq`FKzg5(zPTl3^=JX2hz@XBr z6Y3{Sw}j`yLJqSxkK;SG5pJIaGin6!63@9f6H&&$fsX{^N)}YFm8YG_E#ZNJd2NZF zn~4si-$LgG=TqNwOLn$vN31D?Cg>c!l@zM^Og$3m;zIf0?U*ed})6 zf|Cg3TMlz&%@i^9jYh*lH8BI?YSyCoN+#9x~OzqO=R%}vqAaix5{%nGx)F(LA@7V6k8xa80ECwzu^>2 zYTF5zwM`veh2QsaY?FzksuH3f2;&8xFY@TDz^7H^iL%eIjx%bZmqOL?|~dRAxT?QVuR)v`JO*mG7yN%9#?=ttV<^fq=c!LdU`N zG4wsMQESCmCEeAan+^H4yt4IBE6>pCMQYc=4p>Q-u3hOGn&-1kSz5g}?Z{5YGsZWK z_znkG8U|HGWi?Nq@-!NaG*-V~pFN-~w(}7_&Ie;?)T&!AnrkxbQk>#?Tg0b?jAjoW zWnD6GrQ~0Tu_znSY}sJ*0Dk2U-QTuf zw^-!$AA2jJ^(04RzI{HGLCKHR<(I(FqDHo43MBG+1^Io00<4gArG|9z<7weemvq)! zZ!1BUM9m@4Nd>OJneSfC)b%f7&|_B~<(6M;=W-$n*aQ6`WEZq@ zMIAPrdne%_?M#iXc2}iIW4v`$$>S}1EHi^1MKrE?S#oPA^uwLG5K?M$9P?|M2maH) zi58Ici*om^{6|lBT4))Rw$k{75e@72d)effp0YPJCmRD&n53l3 z5rxUkG^}lB+mByucz#O^m%8fbhHjx;bdKq5;h~jWi#`m*37q0i$cvbxG8JQsSeZT3 z&-34KPsbkd-pUtE&{dUzg&$#|puNVNj~q({ABKCJMsk|^cqD)5-?(tdf=rsA;V3qW zPVFfaO3W`QurO4q4!1Y3nQv?nWz*5Wod}`sjampWiE)g%y=c<>mLg?v$i^hdG>XjZ zJ0DJYSwP!>o9%1cCho8q-nD!E-Fr*I&^J*eQI!^&;k5=iVjnilMgrv| zJGHz(sHeB9mLfxlMo?Ea6V5KC*xzEMWc|GO9kIR4$QOMMN-(@GS?CpJX1QWnjEJ!N zXzIrn1rmFn-l_$Cv#Dj)g&mA-1!hcO3niu-l_%D-Z{GZ7iBkAb>I-vTKh(EpI&wBvi EKgE{Q9smFU From beccadd7d49dc4eda92025b85e500d3e979293dc Mon Sep 17 00:00:00 2001 From: BONNe Date: Sun, 3 Feb 2019 02:45:35 +0200 Subject: [PATCH 4/7] Create custom listener that process player movement. Add ability to deny players from walking over world roof. (#3) Add ability to teleport players to other worlds by falling into void. (#4) --- .../world/bentobox/caveblock/CaveBlock.java | 3 + .../world/bentobox/caveblock/Settings.java | 57 +++++++ .../listeners/CustomHeightLimitations.java | 147 ++++++++++++++++++ src/main/resources/addon.yml | 59 +++---- src/main/resources/config.yml | 23 ++- src/main/resources/locales/en-US.yml | 6 + 6 files changed, 262 insertions(+), 33 deletions(-) create mode 100644 src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java diff --git a/src/main/java/world/bentobox/caveblock/CaveBlock.java b/src/main/java/world/bentobox/caveblock/CaveBlock.java index a117452..bc1acf7 100644 --- a/src/main/java/world/bentobox/caveblock/CaveBlock.java +++ b/src/main/java/world/bentobox/caveblock/CaveBlock.java @@ -13,6 +13,7 @@ import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.caveblock.commands.AdminCommand; import world.bentobox.caveblock.commands.IslandCommand; import world.bentobox.caveblock.generators.ChunkGeneratorWorld; +import world.bentobox.caveblock.listeners.CustomHeightLimitations; public class CaveBlock extends GameModeAddon @@ -161,6 +162,8 @@ public class CaveBlock extends GameModeAddon createWorld(); } } + + this.getServer().getPluginManager().registerEvents(new CustomHeightLimitations(this), this.getPlugin()); } diff --git a/src/main/java/world/bentobox/caveblock/Settings.java b/src/main/java/world/bentobox/caveblock/Settings.java index 9835640..beb4830 100644 --- a/src/main/java/world/bentobox/caveblock/Settings.java +++ b/src/main/java/world/bentobox/caveblock/Settings.java @@ -797,6 +797,27 @@ public class Settings implements DataObject, WorldSettings return numberOfBlockGenerationTries; } + + /** + * This method returns the skyWalking object. + * @return the skyWalking object. + */ + public boolean isSkyWalking() + { + return skyWalking; + } + + + /** + * This method returns the alternativeTeleports object. + * @return the alternativeTeleports object. + */ + public boolean isAlternativeTeleports() + { + return alternativeTeleports; + } + + // --------------------------------------------------------------------- // Section: Setters // --------------------------------------------------------------------- @@ -1550,6 +1571,28 @@ public class Settings implements DataObject, WorldSettings } + /** + * This method sets the skyWalking object value. + * @param skyWalking the skyWalking object new value. + * + */ + public void setSkyWalking(boolean skyWalking) + { + this.skyWalking = skyWalking; + } + + + /** + * This method sets the alternativeTeleports object value. + * @param alternativeTeleports the alternativeTeleports object new value. + * + */ + public void setAlternativeTeleports(boolean alternativeTeleports) + { + this.alternativeTeleports = alternativeTeleports; + } + + /** * @return the debug */ @@ -1653,6 +1696,20 @@ public class Settings implements DataObject, WorldSettings @ConfigEntry(path = "world.generation-tries", needsReset = true) private int numberOfBlockGenerationTries = 1; + @ConfigComment("") + @ConfigComment("Allows to walk over the world roof.") + @ConfigEntry(path = "world.sky-walking") + private boolean skyWalking; + + @ConfigComment("") + @ConfigComment("Enables different ways how to get to other worlds.") + @ConfigComment("If players fall into void, then they will be teleported:") + @ConfigComment(" - to nether if falls into void from over world") + @ConfigComment(" - to the end if falls into void from nether") + @ConfigComment(" - to over world if falls into void from the end") + @ConfigEntry(path = "world.alternative-teleports") + private boolean alternativeTeleports; + @ConfigComment("") @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") @ConfigEntry(path = "world.normal.roof", needsReset = true) diff --git a/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java b/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java new file mode 100644 index 0000000..b3b05e4 --- /dev/null +++ b/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java @@ -0,0 +1,147 @@ +package world.bentobox.caveblock.listeners; + + +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerMoveEvent; + +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.util.Util; +import world.bentobox.bentobox.util.teleport.SafeSpotTeleport; +import world.bentobox.caveblock.CaveBlock; + + +/** + * This listener checks player movement. If enabled, players will be deny to get over world depth limit and + * if alternative teleports is enabled, then falling in void also will be processed. + */ +public class CustomHeightLimitations implements Listener +{ + /** + * Simple constructor + * @param addon + */ + public CustomHeightLimitations(CaveBlock addon) + { + this.addon = addon; + this.worldHeight = addon.getSettings().getWorldDepth() - 1; + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerMove(PlayerMoveEvent event) + { + Player player = event.getPlayer(); + final double nextY = event.getTo().getY(); + + if (this.addon.getSettings().isSkyWalking() || + player.isOp() || + player.isDead() || + player.getGameMode().equals(GameMode.CREATIVE) || + player.getGameMode().equals(GameMode.SPECTATOR) || + this.addon.getPlayers().isInTeleport(player.getUniqueId()) || + player.hasPermission("caveblock.skywalker") || + !Util.sameWorld(this.addon.getOverWorld(), player.getWorld()) || + nextY > 0 && nextY < this.worldHeight || + // Next check will allow to go down, but never up. + event.getFrom().getBlockY() <= event.getFrom().getBlockY() && + event.getFrom().getBlockX() == event.getTo().getBlockX() && + event.getFrom().getBlockZ() == event.getTo().getBlockZ()) + { + // interested only in movements that is below 0 or above height limit. + return; + } + + // Use custom teleport to different world + if (this.addon.getSettings().isAlternativeTeleports() && nextY <= 0) + { + switch (player.getWorld().getEnvironment()) + { + case NORMAL: + { + // From normal world users will get to nether. + + Location to = this.addon.getIslands().getIslandAt(event.getFrom()). + map(i -> i.getSpawnPoint(World.Environment.NETHER)). + orElse(event.getFrom().toVector().toLocation(this.addon.getNetherWorld())); + + event.setCancelled(true); + + new SafeSpotTeleport.Builder(this.addon.getPlugin()). + entity(event.getPlayer()). + location(to). + portal(). + build(); + + break; + } + case NETHER: + { + // From nether world users will get to the end. + + Location to = this.addon.getIslands().getIslandAt(event.getFrom()). + map(i -> i.getSpawnPoint(World.Environment.THE_END)). + orElse(event.getFrom().toVector().toLocation(this.addon.getEndWorld())); + + event.setCancelled(true); + + new SafeSpotTeleport.Builder(this.addon.getPlugin()). + entity(event.getPlayer()). + location(to). + portal(). + build(); + + break; + } + case THE_END: + { + // From the end users will get to over world. + + Location to = this.addon.getIslands().getIslandAt(event.getFrom()). + map(i -> i.getSpawnPoint(World.Environment.NORMAL)). + orElse(event.getFrom().toVector().toLocation(this.addon.getOverWorld())); + + event.setCancelled(true); + + new SafeSpotTeleport.Builder(this.addon.getPlugin()). + entity(event.getPlayer()). + location(to). + portal(). + build(); + break; + } + default: + break; + } + + return; + } + + // Prevent to get over world height + if (nextY >= this.worldHeight) + { + User.getInstance(player).sendMessage("caveblock.general.errors.cave-limit-reached"); + event.setCancelled(true); + } + } + + +// --------------------------------------------------------------------- +// Section: Variables +// --------------------------------------------------------------------- + + + /** + * CaveBlock addon + */ + private CaveBlock addon; + + /** + * This variable store world height. + */ + private int worldHeight; +} diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index db304b1..a006fc4 100644 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -6,25 +6,25 @@ authors: BONNe permissions: caveblock.island: - description: Allow island command usage + description: Allow cave command usage default: true caveblock.island.create: - description: Allow island creation + description: Allow cave creation default: true caveblock.island.home: - description: Allow teleporting to player island + description: Allow teleporting to player cave default: true caveblock.island.sethome: description: Let the player use the sethome command default: true caveblock.island.info: - description: Let the player check their island level + description: Let the player check their cave level default: true caveblock.island.sethome: - description: Let the player set their island teleport point + description: Let the player set their cave teleport point default: true caveblock.island.lock: - description: Allows island locking + description: Allows cave locking default: false caveblock.island.expel: description: Allows expelling of visitors @@ -39,13 +39,13 @@ permissions: description: Player can select a language default: true caveblock.island.name: - description: Player can set the name of their island + description: Player can set the name of their cave default: true caveblock.island.spawn: - description: Player can use the island spawn command if spawn exists + description: Player can use the cave spawn command if spawn exists default: true caveblock.island.reset: - description: Player can use the island reset or restart command + description: Player can use the cave reset or restart command default: true caveblock.island.team: description: Let a player use team commands @@ -57,7 +57,7 @@ permissions: description: Let a player use team coop commands default: true caveblock.settings.*: - description: Allow use of settings on island + description: Allow use of settings on cave default: true caveblock.mod.info: description: Let a moderator see info on a player @@ -66,71 +66,74 @@ permissions: description: Allows setting or reseting of a player's home position default: op caveblock.mod.clearreset: - description: Allow clearing of island reset limit + description: Allow clearing of cave reset limit default: false caveblock.mod.tp: - description: Allows teleport to an island + description: Allows teleport to an cave default: op caveblock.mod.bypasscooldowns: description: Allow moderator to bypass cooldowns default: op caveblock.mod.bypassprotect: - description: Allow moderator to bypass island protection + description: Allow moderator to bypass cave protection default: op caveblock.mod.bypassexpel: - description: Allow moderator to bypass island expulsion + description: Allow moderator to bypass cave expulsion default: op caveblock.mod.lock: - description: Locks or unlocks an island + description: Locks or unlocks an cave default: op caveblock.mod.bypasslock: - description: Bypasses an island lock + description: Bypasses an cave lock default: op caveblock.mod.team: description: Enables modification of teams via kick and add commands default: false caveblock.mod.name: - description: Enables naming of player's islands + description: Enables naming of player's caves default: false caveblock.mod.resetname: - description: Enables reset of player's island names + description: Enables reset of player's cave names default: false caveblock.admin.clearresetall: - description: Allow clearing of island reset limit of all players + description: Allow clearing of cave reset limit of all players default: op caveblock.admin.reload: description: Reload the config.yml default: op caveblock.admin.delete: - description: Let a player completely remove a player (including island) + description: Let a player completely remove a player (including cave) default: op caveblock.admin.deleteisland: - description: Let a player completely remove the island the player is on + description: Let a player completely remove the cave the player is on default: op caveblock.admin.register: - description: Let a player register the nearest island to another player. + description: Let a player register the nearest cave to another player. default: op caveblock.admin.unregister: - description: Removes a player from an island without deleting the island blocks. + description: Removes a player from an cave without deleting the cave blocks. default: op caveblock.admin.purge: - description: Let a player purge old islands. + description: Let a player purge old caves. default: op caveblock.admin.setspawn: description: Allows use of spawn tools default: op caveblock.admin.setrange: - description: Allows setting of island protection range + description: Allows setting of cave protection range default: op caveblock.admin.reserve: - description: Reserves an empty spot for a player's next island + description: Reserves an empty spot for a player's next cave default: op caveblock.admin.settingsreset: - description: Resets all the islands to default protection settings + description: Resets all the caves to default protection settings default: op caveblock.admin.noban: - description: Player cannot be banned from an island + description: Player cannot be banned from an cave default: op caveblock.admin.setlanguage: description: Resets all player languages and sets the default language default: op + caveblock.skywalker: + description: Allows player to walk over the heigh limit. + default: op \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 1597166..94466be 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,7 +1,7 @@ # CaveBlock Configuration ${version} # This config file is dynamic and saved when the server is shutdown. -# You cannot edit it while the server is running because changes will -# be lost! Use in-game settings GUI or edit when server is offline. +# If you edit it while the server is running use /cbadmin reload +# otherwise your settings will be lost. world: # Friendly name for this world. Used in admin commands. Must be a single word friendly-name: CaveBlock @@ -45,17 +45,30 @@ world: # The default biome for the overworld default-biome: MOUNTAINS # The maximum number of players a player can ban at any one time in this game mode. - # The permission acidisland.ban.maxlimit.X where X is a number can also be used per player + # The permission caveblock.ban.maxlimit.X where X is a number can also be used per player # -1 = unlimited ban-limit: -1 - # + # # This is cave... no height... only depth. Max 256. # Should not be less then island height. world-depth: 256 # This indicate how many times block should be tried to generate. generation-tries: 2 + # + # Allows to walk over the world roof. + sky-walking: false + # + # Enables different ways how to get to other worlds. + # If players fall into void, then they will be teleported: + # - to nether if falls into void from over world + # - to the end if falls into void from nether + # - to over world if falls into void from the end + alternative-teleports: true + # + # This disabled default portals from obsidian or end portal. + disable-default-portal: true normal: - # + # # Make over world roof of bedrock, if false, it will be made from stone roof: true # Make over world floor of bedrock, if false, it will be made from stone diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 982cf85..e286622 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -9,6 +9,11 @@ caveblock: line1: "Welcome!" line2: "[name]" line3: "Start digging! &c<3" + + informational: + to-nether: "So unlucky to fall into nether." + to-the-end: "You have reached the end." + to-normal: "Back to your cave." # Override BentoBox default command strings # General strings general: @@ -19,6 +24,7 @@ caveblock: already-have-island: "&cYou already have a cave!" no-safe-location: "&cNo safe location found!" not-owner: "&cYou are not the owner of your team!" + cave-limit-reached: "&cYou have reached the top of your cave. You cannot get higher!" commands: # Override BentoBox default island command strings island: From b3e7cf9fafd7fdd0f4f2baa82527c663f3d96f19 Mon Sep 17 00:00:00 2001 From: BONNe Date: Sun, 3 Feb 2019 16:08:27 +0200 Subject: [PATCH 5/7] Add ability to enable beacon even if roof is made of bedrock. (#5) - Add multiple event listeners that detects if blocks should be replaced or not. - Add new config option, that allows to enable/disable beacon enabling. --- .../world/bentobox/caveblock/CaveBlock.java | 2 + .../world/bentobox/caveblock/Settings.java | 29 ++- .../caveblock/listeners/BeaconEnabler.java | 203 ++++++++++++++++++ src/main/resources/config.yml | 9 +- 4 files changed, 238 insertions(+), 5 deletions(-) create mode 100644 src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java diff --git a/src/main/java/world/bentobox/caveblock/CaveBlock.java b/src/main/java/world/bentobox/caveblock/CaveBlock.java index bc1acf7..c170de6 100644 --- a/src/main/java/world/bentobox/caveblock/CaveBlock.java +++ b/src/main/java/world/bentobox/caveblock/CaveBlock.java @@ -13,6 +13,7 @@ import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.caveblock.commands.AdminCommand; import world.bentobox.caveblock.commands.IslandCommand; import world.bentobox.caveblock.generators.ChunkGeneratorWorld; +import world.bentobox.caveblock.listeners.BeaconEnabler; import world.bentobox.caveblock.listeners.CustomHeightLimitations; @@ -164,6 +165,7 @@ public class CaveBlock extends GameModeAddon } this.getServer().getPluginManager().registerEvents(new CustomHeightLimitations(this), this.getPlugin()); + this.getServer().getPluginManager().registerEvents(new BeaconEnabler(this), this.getPlugin()); } diff --git a/src/main/java/world/bentobox/caveblock/Settings.java b/src/main/java/world/bentobox/caveblock/Settings.java index beb4830..a1571bd 100644 --- a/src/main/java/world/bentobox/caveblock/Settings.java +++ b/src/main/java/world/bentobox/caveblock/Settings.java @@ -818,6 +818,16 @@ public class Settings implements DataObject, WorldSettings } + /** + * This method returns the beaconAllowed object. + * @return the beaconAllowed object. + */ + public boolean isBeaconAllowed() + { + return beaconAllowed; + } + + // --------------------------------------------------------------------- // Section: Setters // --------------------------------------------------------------------- @@ -1593,6 +1603,17 @@ public class Settings implements DataObject, WorldSettings } + /** + * This method sets the beaconAllowed object value. + * @param beaconAllowed the beaconAllowed object new value. + * + */ + public void setBeaconAllowed(boolean beaconAllowed) + { + this.beaconAllowed = beaconAllowed; + } + + /** * @return the debug */ @@ -1701,7 +1722,6 @@ public class Settings implements DataObject, WorldSettings @ConfigEntry(path = "world.sky-walking") private boolean skyWalking; - @ConfigComment("") @ConfigComment("Enables different ways how to get to other worlds.") @ConfigComment("If players fall into void, then they will be teleported:") @ConfigComment(" - to nether if falls into void from over world") @@ -1710,6 +1730,13 @@ public class Settings implements DataObject, WorldSettings @ConfigEntry(path = "world.alternative-teleports") private boolean alternativeTeleports; + @ConfigComment("Enables ability to use beacon, if world roof is made of Bedrock. It will replace") + @ConfigComment("bedrock with black stained glass and on beacon placing, and replace it with bedrock if") + @ConfigComment("beacon is destroyed.") + @ConfigComment("This will not do anything, if roof is not made of bedrock.") + @ConfigEntry(path = "world.allow-beacon") + private boolean beaconAllowed; + @ConfigComment("") @ConfigComment("Make over world roof of bedrock, if false, it will be made from stone") @ConfigEntry(path = "world.normal.roof", needsReset = true) diff --git a/src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java b/src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java new file mode 100644 index 0000000..61a8f4f --- /dev/null +++ b/src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java @@ -0,0 +1,203 @@ +package world.bentobox.caveblock.listeners; + + +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockDamageEvent; +import org.bukkit.event.block.BlockExplodeEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntityExplodeEvent; + +import world.bentobox.bentobox.util.Util; +import world.bentobox.caveblock.CaveBlock; +import world.bentobox.caveblock.Settings; + + +/** + * This class allows to enable beacon in CaveBlock, if cave roof is made of bedrock. + * It will replace Bedrock with black glass. + */ +public class BeaconEnabler implements Listener +{ + /** + * Constructor BeaconEnabler creates a new BeaconEnabler instance. + * + * @param addon of type CaveBlock + */ + public BeaconEnabler(CaveBlock addon) + { + this.addon = addon; + this.settings = addon.getSettings(); + } + + + /** + * Method onBlockPlacement detects if beacon is placed and replace roof bedrock with black glass. + * + * @param event of type BlockPlaceEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onBlockPlacement(BlockPlaceEvent event) + { + World world = event.getPlayer().getWorld(); + + if (!Util.sameWorld(this.addon.getOverWorld(), world) || + !this.settings.isBeaconAllowed() || + !this.isRoofEnabled(world) || + !event.getBlock().getType().equals(Material.BEACON)) + { + // This should work only if it is cave block world or world has roof from bedrock. Otherwise, + // players can dig till top themself. + return; + } + + + Block roofBlock = world.getBlockAt(event.getBlock().getX(), this.settings.getWorldDepth() - 1, event.getBlock().getZ()); + + if (roofBlock.getType().equals(Material.BEDROCK)) + { + // Replace only bedrock. + roofBlock.setType(Material.BLACK_STAINED_GLASS); + } + } + + + /** + * Method onBlockBreak detects if beacon is destroyed and replace roof black glass with bedrock. + * + * @param event of type BlockBreakEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onBlockBreak(BlockBreakEvent event) + { + World world = event.getPlayer().getWorld(); + + if (!Util.sameWorld(this.addon.getOverWorld(), world) || + !this.isRoofEnabled(world) || + !this.settings.isBeaconAllowed() || + !event.getBlock().getType().equals(Material.BEACON)) + { + // This should work only if it is cave block world or world has roof from bedrock. + return; + } + + Block roofBlock = world.getBlockAt(event.getBlock().getX(), this.settings.getWorldDepth() - 1, event.getBlock().getZ()); + + if (roofBlock.getType().equals(Material.BLACK_STAINED_GLASS)) + { + // Replace only black glass. + roofBlock.setType(Material.BEDROCK); + } + } + + + /** + * Method onBlockDamage detects if user tries to destroy black glass on roof and disable it. + * + * @param event of type BlockDamageEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onBlockDamage(BlockDamageEvent event) + { + World world = event.getPlayer().getWorld(); + + if (!Util.sameWorld(this.addon.getOverWorld(), world) || + !this.isRoofEnabled(world) || + !this.settings.isBeaconAllowed() || + event.getBlock().getY() != this.settings.getWorldDepth() - 1) + { + // This should work only if it is cave block world or world has roof from bedrock. + return; + } + + // Cancel break event if it is black glass. + event.setCancelled(event.getBlock().getType().equals(Material.BLACK_STAINED_GLASS)); + } + + + /** + * Method onBlockExplode detects if explosion tries to destroy black glass on roof and disable it. + * + * @param event of type BlockExplodeEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onBlockExplode(BlockExplodeEvent event) + { + World world = event.getBlock().getWorld(); + + if (!Util.sameWorld(this.addon.getOverWorld(), world) || + !this.isRoofEnabled(world) || + !this.settings.isBeaconAllowed() || + event.getBlock().getY() < this.settings.getWorldDepth() - 9) + { + // This should work only if it is cave block world or world has roof from bedrock. + return; + } + + final int blockY = this.settings.getWorldDepth() - 1; + + // Remove all black stained glass from explosion block list if it is on the roof. + event.blockList().removeIf(block -> + block.getY() == blockY && block.getType().equals(Material.BLACK_STAINED_GLASS)); + } + + + /** + * Method onEntityExplode detects if explosion tries to destroy black glass on roof and disable it. + * + * @param event of type EntityExplodeEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onEntityExplode(EntityExplodeEvent event) + { + World world = event.getLocation().getWorld(); + + if (!Util.sameWorld(this.addon.getOverWorld(), world) || + !this.isRoofEnabled(world) || + !this.settings.isBeaconAllowed() || + event.getLocation().getY() < this.settings.getWorldDepth() - 9) + { + // This should work only if it is cave block world or world has roof from bedrock. + return; + } + + final int blockY = this.settings.getWorldDepth() - 1; + + // Remove all black stained glass from explosion block list if it is on the roof. + event.blockList().removeIf(block -> + block.getY() == blockY && block.getType().equals(Material.BLACK_STAINED_GLASS)); + } + + + /** + * This method checks if in given world bedrock roof is enabled. + * @param world World that must be checked. + * @return true - bedrock roof is enabled, otherwise false + */ + private boolean isRoofEnabled(World world) + { + return world.getEnvironment().equals(World.Environment.NORMAL) && this.settings.isNormalRoof() || + world.getEnvironment().equals(World.Environment.NETHER) && this.settings.isNetherRoof() || + world.getEnvironment().equals(World.Environment.THE_END) && this.settings.isEndRoof(); + } + + +// --------------------------------------------------------------------- +// Section: Variables +// --------------------------------------------------------------------- + + /** + * CaveBlock addon. + */ + private CaveBlock addon; + + /** + * Addon settings. + */ + private Settings settings; +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 94466be..dd5a831 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -57,16 +57,17 @@ world: # # Allows to walk over the world roof. sky-walking: false - # # Enables different ways how to get to other worlds. # If players fall into void, then they will be teleported: # - to nether if falls into void from over world # - to the end if falls into void from nether # - to over world if falls into void from the end alternative-teleports: true - # - # This disabled default portals from obsidian or end portal. - disable-default-portal: true + # Enables ability to use beacon, if world roof is made of Bedrock. It will replace + # bedrock with black stained glass and on beacon placing, and replace it with bedrock if + # beacon is destroyed. + # This will not do anything, if roof is not made of bedrock. + allow-beacon: false normal: # # Make over world roof of bedrock, if false, it will be made from stone From f5090c91ebf4a4cb7962532a2f9c9b064eeadf58 Mon Sep 17 00:00:00 2001 From: BONNe Date: Sun, 3 Feb 2019 16:26:53 +0200 Subject: [PATCH 6/7] Disable teleports for players if target location is on top of the world. (#3) --- .../listeners/CustomHeightLimitations.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java b/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java index b3b05e4..f64a376 100644 --- a/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java +++ b/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java @@ -9,6 +9,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerTeleportEvent; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.util.Util; @@ -32,6 +33,12 @@ public class CustomHeightLimitations implements Listener this.worldHeight = addon.getSettings().getWorldDepth() - 1; } + /** + * Method onPlayerMove disables movement if user tries to get on top of the world. + * It allows movement only downwards. + * + * @param event of type PlayerMoveEvent + */ @EventHandler(priority = EventPriority.LOWEST) public void onPlayerMove(PlayerMoveEvent event) { @@ -130,6 +137,44 @@ public class CustomHeightLimitations implements Listener } + /** + * Method onPlayerTeleport disables all teleports that involves moving on top of the world. + * + * @param event of type PlayerTeleportEvent + */ + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerTeleport(PlayerTeleportEvent event) + { + Player player = event.getPlayer(); + final double nextY = event.getTo().getY(); + + if (this.addon.getSettings().isSkyWalking() || + player.isOp() || + player.isDead() || + player.getGameMode().equals(GameMode.CREATIVE) || + player.getGameMode().equals(GameMode.SPECTATOR) || + this.addon.getPlayers().isInTeleport(player.getUniqueId()) || + player.hasPermission("caveblock.skywalker") || + !Util.sameWorld(this.addon.getOverWorld(), player.getWorld()) || + nextY > 0 && nextY < this.worldHeight || + // Next check will allow to go down, but never up. + event.getFrom().getBlockY() <= event.getFrom().getBlockY() && + event.getFrom().getBlockX() == event.getTo().getBlockX() && + event.getFrom().getBlockZ() == event.getTo().getBlockZ()) + { + // interested only in movements that is below 0 or above height limit. + return; + } + + // Prevent to get over world height + if (nextY >= this.worldHeight) + { + User.getInstance(player).sendMessage("caveblock.general.errors.cave-limit-reached"); + event.setCancelled(true); + } + } + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- From 79f421bdb79ce32e9a4d4f21c2b189ba0ae4b231 Mon Sep 17 00:00:00 2001 From: BONNe Date: Sun, 3 Feb 2019 16:45:11 +0200 Subject: [PATCH 7/7] Add beetroot seeds instead of beetroot. (#9) - Restore unarchived files. --- src/main/resources/schems/end-island | 310 + src/main/resources/schems/island | 1162 +++ src/main/resources/schems/island.schem | Bin 2487 -> 2318 bytes src/main/resources/schems/nether-island | 11710 ++++++++++++++++++++++ 4 files changed, 13182 insertions(+) create mode 100644 src/main/resources/schems/end-island create mode 100644 src/main/resources/schems/island create mode 100644 src/main/resources/schems/nether-island diff --git a/src/main/resources/schems/end-island b/src/main/resources/schems/end-island new file mode 100644 index 0000000..9932c6b --- /dev/null +++ b/src/main/resources/schems/end-island @@ -0,0 +1,310 @@ +blocks: + -3,0,0: + bd: minecraft:obsidian + -3,1,0: + bd: minecraft:end_stone + -2,-1,0: + bd: minecraft:end_stone + -2,0,-2: + bd: minecraft:end_stone_bricks + -2,0,-1: + bd: minecraft:end_stone_bricks + -2,0,0: + bd: minecraft:end_stone_bricks + -2,0,1: + bd: minecraft:end_stone_bricks + -2,0,2: + bd: minecraft:end_stone + -2,1,-2: + bd: minecraft:end_stone_bricks + -2,1,-1: + bd: minecraft:end_stone_bricks + -2,1,0: + bd: minecraft:end_stone_bricks + -2,1,1: + bd: minecraft:end_stone_bricks + -2,1,2: + bd: minecraft:end_stone + -2,2,-1: + bd: minecraft:end_stone + -2,2,0: + bd: minecraft:end_stone + -2,3,-1: + bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] + -2,4,-1: + bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] + -2,5,-1: + bd: minecraft:chorus_flower[age=0] + -1,-2,0: + bd: minecraft:end_stone + -1,-1,-1: + bd: minecraft:end_stone + -1,-1,0: + bd: minecraft:end_stone + -1,-1,1: + bd: minecraft:end_stone + -1,0,-2: + bd: minecraft:end_stone_bricks + -1,0,0: + bd: minecraft:purple_shulker_box[facing=up] + inventory: + '0': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: OBSIDIAN + '11': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: ENDERMAN_SPAWN_EGG + '15': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: ELYTRA + '22': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: END_ROD + -1,0,1: + bd: minecraft:end_stone_bricks + -1,0,2: + bd: minecraft:end_stone + -1,1,-2: + bd: minecraft:end_rod[facing=east] + -1,1,-1: + bd: minecraft:air + -1,1,0: + bd: minecraft:air + -1,1,1: + bd: minecraft:end_stone_bricks + -1,1,2: + bd: minecraft:end_stone + -1,1,3: + bd: minecraft:end_stone + -1,2,-2: + bd: minecraft:end_stone + -1,2,-1: + bd: minecraft:end_stone + -1,2,0: + bd: minecraft:end_stone + -1,2,1: + bd: minecraft:end_stone + -1,3,-3: + bd: minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=true,west=false] + -1,4,-3: + bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] + -1,5,-3: + bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] + -1,6,-4: + bd: minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=true,west=false] + -1,6,-3: + bd: minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=false,west=false] + -1,7,-4: + bd: minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false] + -1,8,-4: + bd: minecraft:chorus_flower[age=1] + 0,-2,-1: + bd: minecraft:end_stone + 0,-2,1: + bd: minecraft:end_stone + 0,-1,-2: + bd: minecraft:end_stone + 0,-1,-1: + bd: minecraft:end_stone + 0,-1,0: + bd: minecraft:end_stone + 0,-1,1: + bd: minecraft:end_stone + 0,-1,2: + bd: minecraft:end_stone + 0,0,-3: + bd: minecraft:obsidian + 0,0,-2: + bd: minecraft:end_stone_bricks + 0,0,-1: + bd: minecraft:air + 0,0,0: + bd: minecraft:air + 0,0,1: + bd: minecraft:end_stone_bricks + 0,0,2: + bd: minecraft:end_stone_bricks + 0,0,3: + bd: minecraft:obsidian + 0,1,-3: + bd: minecraft:end_stone + 0,1,-2: + bd: minecraft:end_stone_bricks + 0,1,-1: + bd: minecraft:air + 0,1,0: + bd: minecraft:air + 0,1,1: + bd: minecraft:end_stone_bricks + 0,1,2: + bd: minecraft:end_stone + 0,1,3: + bd: minecraft:end_stone_bricks + 0,2,-3: + bd: minecraft:end_stone + 0,2,-2: + bd: minecraft:end_stone + 0,2,-1: + bd: minecraft:end_stone + 0,2,0: + bd: minecraft:end_stone + 0,2,1: + bd: minecraft:end_stone + 0,3,-3: + bd: minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=true] + 0,6,-3: + bd: minecraft:chorus_flower[age=1] + 1,-2,0: + bd: minecraft:end_stone + 1,-1,-1: + bd: minecraft:end_stone + 1,-1,0: + bd: minecraft:end_stone + 1,-1,1: + bd: minecraft:end_stone + 1,0,-2: + bd: minecraft:end_stone_bricks + 1,0,-1: + bd: minecraft:air + 1,0,0: + bd: minecraft:air + 1,0,1: + bd: minecraft:purpur_stairs[facing=south,half=bottom,shape=straight,waterlogged=false] + 1,0,2: + bd: minecraft:end_stone + 1,1,-2: + bd: minecraft:end_stone_bricks + 1,1,-1: + bd: minecraft:air + 1,1,0: + bd: minecraft:air + 1,1,1: + bd: minecraft:air + 1,1,2: + bd: minecraft:purpur_stairs[facing=south,half=bottom,shape=straight,waterlogged=false] + 1,1,3: + bd: minecraft:end_stone + 1,2,-2: + bd: minecraft:end_stone + 1,2,-1: + bd: minecraft:end_stone + 1,2,0: + bd: minecraft:air + 1,2,1: + bd: minecraft:air + 1,2,2: + bd: minecraft:air + 1,3,0: + bd: minecraft:air + 1,3,1: + bd: minecraft:air + 1,3,2: + bd: minecraft:air + 2,-1,-1: + bd: minecraft:end_stone_bricks + 2,-1,0: + bd: minecraft:end_stone + 2,0,-2: + bd: minecraft:end_stone + 2,0,-1: + bd: minecraft:end_stone_bricks + 2,0,0: + bd: minecraft:end_stone + 2,0,1: + bd: minecraft:end_stone + 2,0,2: + bd: minecraft:end_stone + 2,1,-2: + bd: minecraft:end_stone_bricks + 2,1,-1: + bd: minecraft:end_stone + 2,1,0: + bd: minecraft:end_rod[facing=up] + 2,1,2: + bd: minecraft:end_stone + 2,1,3: + bd: minecraft:end_stone_bricks + 2,2,-2: + bd: minecraft:end_stone_bricks + 2,2,-1: + bd: minecraft:end_stone + 2,2,0: + bd: minecraft:end_stone + 2,2,1: + bd: minecraft:end_stone + 2,3,-2: + bd: minecraft:end_stone_bricks + 3,0,-2: + bd: minecraft:end_stone + 3,0,0: + bd: minecraft:obsidian + 3,1,-2: + bd: minecraft:end_stone + 3,1,-1: + bd: minecraft:end_stone_bricks + 3,1,1: + bd: minecraft:end_stone + 3,1,2: + bd: minecraft:end_stone_bricks + 3,2,-2: + bd: minecraft:end_stone + 3,2,-1: + bd: minecraft:end_stone + 3,3,-2: + bd: minecraft:end_stone + 3,4,-2: + bd: minecraft:end_stone + 3,5,-2: + bd: minecraft:end_stone + 3,6,-2: + bd: minecraft:end_stone + 3,7,-2: + bd: minecraft:obsidian + -1,1,-1: + bd: minecraft:air + -1,1,0: + bd: minecraft:air + 0,0,-1: + bd: minecraft:air + 0,1,-1: + bd: minecraft:air + 0,1,0: + bd: minecraft:air + 1,0,-1: + bd: minecraft:air + 1,0,0: + bd: minecraft:air + 1,1,-1: + bd: minecraft:air + 1,1,0: + bd: minecraft:air + 1,1,1: + bd: minecraft:air + 1,2,0: + bd: minecraft:air + 1,2,1: + bd: minecraft:air + 1,2,2: + bd: minecraft:air + 1,3,0: + bd: minecraft:air + 1,3,1: + bd: minecraft:air + 1,3,2: + bd: minecraft:air +attached: + 0,0,0: + bd: minecraft:sign[rotation=8,waterlogged=false] + lines: + - '[spawn_here]' + - '' + - '' + - '' +size: + xsize: 7 + ysize: 11 + zsize: 8 diff --git a/src/main/resources/schems/island b/src/main/resources/schems/island new file mode 100644 index 0000000..b6e74d0 --- /dev/null +++ b/src/main/resources/schems/island @@ -0,0 +1,1162 @@ +blocks: + -3,-4,-5: + bd: minecraft:stone + -3,-4,-4: + bd: minecraft:stone + -3,-4,-3: + bd: minecraft:stone + -3,-4,-2: + bd: minecraft:stone + -3,-4,-1: + bd: minecraft:stone + -3,-4,0: + bd: minecraft:stone + -3,-4,1: + bd: minecraft:stone + -3,-3,-5: + bd: minecraft:stone + -3,-3,-4: + bd: minecraft:stone + -3,-3,-3: + bd: minecraft:stone + -3,-3,-2: + bd: minecraft:stone + -3,-3,-1: + bd: minecraft:stone + -3,-3,0: + bd: minecraft:stone + -3,-3,1: + bd: minecraft:stone + -3,-2,-5: + bd: minecraft:stone + -3,-2,-4: + bd: minecraft:stone + -3,-2,-3: + bd: minecraft:cobblestone_stairs[facing=east,half=top,shape=straight,waterlogged=false] + -3,-2,-2: + bd: minecraft:stone + -3,-2,-1: + bd: minecraft:stone + -3,-2,0: + bd: minecraft:stone + -3,-2,1: + bd: minecraft:stone + -3,-1,-5: + bd: minecraft:stone + -3,-1,-4: + bd: minecraft:grass_block[snowy=false] + -3,-1,-3: + bd: minecraft:grass_block[snowy=false] + -3,-1,-2: + bd: minecraft:grass_block[snowy=false] + -3,-1,-1: + bd: minecraft:grass_block[snowy=false] + -3,-1,0: + bd: minecraft:grass_block[snowy=false] + -3,-1,1: + bd: minecraft:stone + -3,0,-5: + bd: minecraft:air + -3,0,-4: + bd: minecraft:air + -3,0,-3: + bd: minecraft:air + -3,0,-2: + bd: minecraft:air + -3,0,-1: + bd: minecraft:air + -3,0,0: + bd: minecraft:air + -3,0,1: + bd: minecraft:air + -3,1,-5: + bd: minecraft:air + -3,1,-4: + bd: minecraft:air + -3,1,-3: + bd: minecraft:air + -3,1,-2: + bd: minecraft:air + -3,1,-1: + bd: minecraft:air + -3,1,0: + bd: minecraft:air + -3,1,1: + bd: minecraft:air + -3,2,-5: + bd: minecraft:air + -3,2,-4: + bd: minecraft:air + -3,2,-3: + bd: minecraft:air + -3,2,-2: + bd: minecraft:air + -3,2,-1: + bd: minecraft:air + -3,2,0: + bd: minecraft:air + -3,2,1: + bd: minecraft:air + -3,3,-5: + bd: minecraft:air + -3,3,-4: + bd: minecraft:air + -3,3,-3: + bd: minecraft:air + -3,3,-2: + bd: minecraft:air + -3,3,-1: + bd: minecraft:air + -3,3,0: + bd: minecraft:air + -3,3,1: + bd: minecraft:air + -3,4,-5: + bd: minecraft:air + -3,4,-4: + bd: minecraft:air + -3,4,-3: + bd: minecraft:air + -3,4,-2: + bd: minecraft:air + -3,4,-1: + bd: minecraft:air + -3,4,0: + bd: minecraft:air + -3,4,1: + bd: minecraft:air + -3,5,-5: + bd: minecraft:air + -3,5,-4: + bd: minecraft:air + -3,5,-3: + bd: minecraft:air + -3,5,-2: + bd: minecraft:air + -3,5,-1: + bd: minecraft:air + -3,5,0: + bd: minecraft:air + -3,5,1: + bd: minecraft:air + -3,6,-5: + bd: minecraft:air + -3,6,-4: + bd: minecraft:air + -3,6,-3: + bd: minecraft:air + -3,6,-2: + bd: minecraft:air + -3,6,-1: + bd: minecraft:air + -3,6,0: + bd: minecraft:air + -3,6,1: + bd: minecraft:air + -2,-4,-5: + bd: minecraft:stone + -2,-4,-4: + bd: minecraft:stone + -2,-4,-3: + bd: minecraft:stone + -2,-4,-2: + bd: minecraft:stone + -2,-4,-1: + bd: minecraft:stone + -2,-4,0: + bd: minecraft:stone + -2,-4,1: + bd: minecraft:stone + -2,-3,-5: + bd: minecraft:stone + -2,-3,-4: + bd: minecraft:stone + -2,-3,-3: + bd: minecraft:cobblestone_stairs[facing=east,half=top,shape=straight,waterlogged=false] + -2,-3,-2: + bd: minecraft:dirt + -2,-3,-1: + bd: minecraft:stone + -2,-3,0: + bd: minecraft:stone + -2,-3,1: + bd: minecraft:stone + -2,-2,-5: + bd: minecraft:stone + -2,-2,-4: + bd: minecraft:stone + -2,-2,-3: + bd: minecraft:dirt + -2,-2,-2: + bd: minecraft:dirt + -2,-2,-1: + bd: minecraft:dirt + -2,-2,0: + bd: minecraft:dirt + -2,-2,1: + bd: minecraft:stone + -2,-1,-5: + bd: minecraft:grass_block[snowy=false] + -2,-1,-4: + bd: minecraft:grass_block[snowy=false] + -2,-1,-3: + bd: minecraft:grass_block[snowy=false] + -2,-1,-2: + bd: minecraft:grass_block[snowy=false] + -2,-1,-1: + bd: minecraft:grass_block[snowy=false] + -2,-1,0: + bd: minecraft:grass_block[snowy=false] + -2,-1,1: + bd: minecraft:grass_block[snowy=false] + -2,0,-5: + bd: minecraft:air + -2,0,-4: + bd: minecraft:air + -2,0,-3: + bd: minecraft:air + -2,0,-2: + bd: minecraft:air + -2,0,-1: + bd: minecraft:air + -2,0,0: + bd: minecraft:air + -2,0,1: + bd: minecraft:air + -2,1,-5: + bd: minecraft:air + -2,1,-4: + bd: minecraft:air + -2,1,-3: + bd: minecraft:air + -2,1,-2: + bd: minecraft:air + -2,1,-1: + bd: minecraft:air + -2,1,0: + bd: minecraft:air + -2,1,1: + bd: minecraft:air + -2,2,-5: + bd: minecraft:air + -2,2,-4: + bd: minecraft:oak_leaves[distance=4,persistent=false] + -2,2,-3: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -2,2,-2: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -2,2,-1: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -2,2,0: + bd: minecraft:air + -2,2,1: + bd: minecraft:air + -2,3,-5: + bd: minecraft:air + -2,3,-4: + bd: minecraft:oak_leaves[distance=4,persistent=false] + -2,3,-3: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -2,3,-2: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -2,3,-1: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -2,3,0: + bd: minecraft:air + -2,3,1: + bd: minecraft:air + -2,4,-5: + bd: minecraft:air + -2,4,-4: + bd: minecraft:air + -2,4,-3: + bd: minecraft:air + -2,4,-2: + bd: minecraft:air + -2,4,-1: + bd: minecraft:air + -2,4,0: + bd: minecraft:air + -2,4,1: + bd: minecraft:air + -2,5,-5: + bd: minecraft:air + -2,5,-4: + bd: minecraft:air + -2,5,-3: + bd: minecraft:air + -2,5,-2: + bd: minecraft:air + -2,5,-1: + bd: minecraft:air + -2,5,0: + bd: minecraft:air + -2,5,1: + bd: minecraft:air + -2,6,-5: + bd: minecraft:air + -2,6,-4: + bd: minecraft:air + -2,6,-3: + bd: minecraft:air + -2,6,-2: + bd: minecraft:air + -2,6,-1: + bd: minecraft:air + -2,6,0: + bd: minecraft:air + -2,6,1: + bd: minecraft:air + -1,-4,-5: + bd: minecraft:stone + -1,-4,-4: + bd: minecraft:stone + -1,-4,-3: + bd: minecraft:stone + -1,-4,-2: + bd: minecraft:dirt + -1,-4,-1: + bd: minecraft:stone + -1,-4,0: + bd: minecraft:stone + -1,-4,1: + bd: minecraft:stone + -1,-3,-5: + bd: minecraft:stone + -1,-3,-4: + bd: minecraft:cobweb + -1,-3,-3: + bd: minecraft:dirt + -1,-3,-2: + bd: minecraft:dirt + -1,-3,-1: + bd: minecraft:dirt + -1,-3,0: + bd: minecraft:cobweb + -1,-3,1: + bd: minecraft:stone + -1,-2,-5: + bd: minecraft:stone + -1,-2,-4: + bd: minecraft:dirt + -1,-2,-3: + bd: minecraft:dirt + -1,-2,-2: + bd: minecraft:dirt + -1,-2,-1: + bd: minecraft:dirt + -1,-2,0: + bd: minecraft:dirt + -1,-2,1: + bd: minecraft:stone + -1,-1,-5: + bd: minecraft:grass_block[snowy=false] + -1,-1,-4: + bd: minecraft:grass_block[snowy=false] + -1,-1,-3: + bd: minecraft:grass_block[snowy=false] + -1,-1,-2: + bd: minecraft:grass_block[snowy=false] + -1,-1,-1: + bd: minecraft:grass_block[snowy=false] + -1,-1,0: + bd: minecraft:grass_block[snowy=false] + -1,-1,1: + bd: minecraft:grass_block[snowy=false] + -1,0,-5: + bd: minecraft:air + -1,0,-4: + bd: minecraft:air + -1,0,-3: + bd: minecraft:air + -1,0,-2: + bd: minecraft:air + -1,0,-1: + bd: minecraft:air + -1,0,0: + bd: minecraft:air + -1,0,1: + bd: minecraft:air + -1,1,-5: + bd: minecraft:air + -1,1,-4: + bd: minecraft:air + -1,1,-3: + bd: minecraft:air + -1,1,-2: + bd: minecraft:air + -1,1,-1: + bd: minecraft:air + -1,1,0: + bd: minecraft:air + -1,1,1: + bd: minecraft:air + -1,2,-5: + bd: minecraft:air + -1,2,-4: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -1,2,-3: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,2,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + -1,2,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,2,0: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -1,2,1: + bd: minecraft:air + -1,3,-5: + bd: minecraft:air + -1,3,-4: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -1,3,-3: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,3,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + -1,3,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,3,0: + bd: minecraft:oak_leaves[distance=3,persistent=false] + -1,3,1: + bd: minecraft:air + -1,4,-5: + bd: minecraft:air + -1,4,-4: + bd: minecraft:air + -1,4,-3: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,4,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + -1,4,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,4,0: + bd: minecraft:air + -1,4,1: + bd: minecraft:air + -1,5,-5: + bd: minecraft:air + -1,5,-4: + bd: minecraft:air + -1,5,-3: + bd: minecraft:air + -1,5,-2: + bd: minecraft:oak_leaves[distance=2,persistent=false] + -1,5,-1: + bd: minecraft:air + -1,5,0: + bd: minecraft:air + -1,5,1: + bd: minecraft:air + -1,6,-5: + bd: minecraft:air + -1,6,-4: + bd: minecraft:air + -1,6,-3: + bd: minecraft:air + -1,6,-2: + bd: minecraft:air + -1,6,-1: + bd: minecraft:air + -1,6,0: + bd: minecraft:air + -1,6,1: + bd: minecraft:air + 0,-4,-5: + bd: minecraft:stone + 0,-4,-4: + bd: minecraft:stone + 0,-4,-3: + bd: minecraft:dirt + 0,-4,-2: + bd: minecraft:sand + 0,-4,-1: + bd: minecraft:dirt + 0,-4,0: + bd: minecraft:stone + 0,-4,1: + bd: minecraft:stone + 0,-3,-5: + bd: minecraft:stone + 0,-3,-4: + bd: minecraft:dirt + 0,-3,-3: + bd: minecraft:dirt + 0,-3,-2: + bd: minecraft:sand + 0,-3,-1: + bd: minecraft:dirt + 0,-3,0: + bd: minecraft:dirt + 0,-3,1: + bd: minecraft:stone + 0,-2,-5: + bd: minecraft:dirt + 0,-2,-4: + bd: minecraft:dirt + 0,-2,-3: + bd: minecraft:dirt + 0,-2,-2: + bd: minecraft:sand + 0,-2,-1: + bd: minecraft:dirt + 0,-2,0: + bd: minecraft:dirt + 0,-2,1: + bd: minecraft:dirt + 0,-1,-5: + bd: minecraft:grass_block[snowy=false] + 0,-1,-4: + bd: minecraft:grass_block[snowy=false] + 0,-1,-3: + bd: minecraft:grass_block[snowy=false] + 0,-1,-2: + bd: minecraft:dirt + 0,-1,-1: + bd: minecraft:grass_block[snowy=false] + 0,-1,0: + bd: minecraft:grass_block[snowy=false] + 0,-1,1: + bd: minecraft:grass_block[snowy=false] + 0,0,-5: + bd: minecraft:air + 0,0,-4: + bd: minecraft:air + 0,0,-3: + bd: minecraft:air + 0,0,-2: + bd: minecraft:oak_log[axis=y] + 0,0,-1: + bd: minecraft:chest[facing=south,type=single,waterlogged=false] + inventory: + '0': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: LAVA_BUCKET + '2': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: SUGAR_CANE + '4': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: RED_MUSHROOM + '6': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: MELON_SLICE + '10': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: ICE + amount: 2 + '12': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: BONE + amount: 2 + '14': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: OAK_SAPLING + '16': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: PUMPKIN + '18': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: CACTUS + '20': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: BROWN_MUSHROOM + '22': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: COBBLESTONE + amount: 5 + '24': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: beetroot_seeds + '26': + ==: org.bukkit.inventory.ItemStack + v: 1631 + type: MUSHROOM_STEW + 0,0,0: + bd: minecraft:air + 0,0,1: + bd: minecraft:air + 0,1,-5: + bd: minecraft:air + 0,1,-4: + bd: minecraft:air + 0,1,-3: + bd: minecraft:air + 0,1,-2: + bd: minecraft:oak_log[axis=y] + 0,1,-1: + bd: minecraft:air + 0,1,0: + bd: minecraft:air + 0,1,1: + bd: minecraft:air + 0,2,-5: + bd: minecraft:air + 0,2,-4: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 0,2,-3: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,2,-2: + bd: minecraft:oak_log[axis=y] + 0,2,-1: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,2,0: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 0,2,1: + bd: minecraft:air + 0,3,-5: + bd: minecraft:air + 0,3,-4: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 0,3,-3: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,3,-2: + bd: minecraft:oak_log[axis=y] + 0,3,-1: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,3,0: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 0,3,1: + bd: minecraft:air + 0,4,-5: + bd: minecraft:air + 0,4,-4: + bd: minecraft:air + 0,4,-3: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,4,-2: + bd: minecraft:oak_log[axis=y] + 0,4,-1: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,4,0: + bd: minecraft:air + 0,4,1: + bd: minecraft:air + 0,5,-5: + bd: minecraft:air + 0,5,-4: + bd: minecraft:air + 0,5,-3: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 0,5,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 0,5,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 0,5,0: + bd: minecraft:air + 0,5,1: + bd: minecraft:air + 0,6,-5: + bd: minecraft:air + 0,6,-4: + bd: minecraft:air + 0,6,-3: + bd: minecraft:air + 0,6,-2: + bd: minecraft:air + 0,6,-1: + bd: minecraft:air + 0,6,0: + bd: minecraft:air + 0,6,1: + bd: minecraft:air + 1,-4,-5: + bd: minecraft:stone + 1,-4,-4: + bd: minecraft:stone + 1,-4,-3: + bd: minecraft:cobweb + 1,-4,-2: + bd: minecraft:stone + 1,-4,-1: + bd: minecraft:stone + 1,-4,0: + bd: minecraft:stone + 1,-4,1: + bd: minecraft:stone + 1,-3,-5: + bd: minecraft:stone + 1,-3,-4: + bd: minecraft:stone + 1,-3,-3: + bd: minecraft:dirt + 1,-3,-2: + bd: minecraft:dirt + 1,-3,-1: + bd: minecraft:stone + 1,-3,0: + bd: minecraft:stone + 1,-3,1: + bd: minecraft:stone + 1,-2,-5: + bd: minecraft:stone + 1,-2,-4: + bd: minecraft:dirt + 1,-2,-3: + bd: minecraft:dirt + 1,-2,-2: + bd: minecraft:dirt + 1,-2,-1: + bd: minecraft:dirt + 1,-2,0: + bd: minecraft:dirt + 1,-2,1: + bd: minecraft:stone + 1,-1,-5: + bd: minecraft:grass_block[snowy=false] + 1,-1,-4: + bd: minecraft:grass_block[snowy=false] + 1,-1,-3: + bd: minecraft:grass_block[snowy=false] + 1,-1,-2: + bd: minecraft:grass_block[snowy=false] + 1,-1,-1: + bd: minecraft:grass_block[snowy=false] + 1,-1,0: + bd: minecraft:grass_block[snowy=false] + 1,-1,1: + bd: minecraft:grass_block[snowy=false] + 1,0,-5: + bd: minecraft:air + 1,0,-4: + bd: minecraft:air + 1,0,-3: + bd: minecraft:air + 1,0,-2: + bd: minecraft:air + 1,0,-1: + bd: minecraft:air + 1,0,0: + bd: minecraft:air + 1,0,1: + bd: minecraft:air + 1,1,-5: + bd: minecraft:air + 1,1,-4: + bd: minecraft:air + 1,1,-3: + bd: minecraft:air + 1,1,-2: + bd: minecraft:air + 1,1,-1: + bd: minecraft:air + 1,1,0: + bd: minecraft:air + 1,1,1: + bd: minecraft:air + 1,2,-5: + bd: minecraft:air + 1,2,-4: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 1,2,-3: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 1,2,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 1,2,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 1,2,0: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 1,2,1: + bd: minecraft:air + 1,3,-5: + bd: minecraft:air + 1,3,-4: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 1,3,-3: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 1,3,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 1,3,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 1,3,0: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 1,3,1: + bd: minecraft:air + 1,4,-5: + bd: minecraft:air + 1,4,-4: + bd: minecraft:air + 1,4,-3: + bd: minecraft:air + 1,4,-2: + bd: minecraft:oak_leaves[distance=1,persistent=false] + 1,4,-1: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 1,4,0: + bd: minecraft:air + 1,4,1: + bd: minecraft:air + 1,5,-5: + bd: minecraft:air + 1,5,-4: + bd: minecraft:air + 1,5,-3: + bd: minecraft:air + 1,5,-2: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 1,5,-1: + bd: minecraft:air + 1,5,0: + bd: minecraft:air + 1,5,1: + bd: minecraft:air + 1,6,-5: + bd: minecraft:air + 1,6,-4: + bd: minecraft:air + 1,6,-3: + bd: minecraft:air + 1,6,-2: + bd: minecraft:air + 1,6,-1: + bd: minecraft:air + 1,6,0: + bd: minecraft:air + 1,6,1: + bd: minecraft:air + 2,-4,-5: + bd: minecraft:stone + 2,-4,-4: + bd: minecraft:stone + 2,-4,-3: + bd: minecraft:stone + 2,-4,-2: + bd: minecraft:stone + 2,-4,-1: + bd: minecraft:stone + 2,-4,0: + bd: minecraft:stone + 2,-4,1: + bd: minecraft:stone + 2,-3,-5: + bd: minecraft:stone + 2,-3,-4: + bd: minecraft:stone + 2,-3,-3: + bd: minecraft:cobblestone_slab[type=top,waterlogged=false] + 2,-3,-2: + bd: minecraft:dirt + 2,-3,-1: + bd: minecraft:stone + 2,-3,0: + bd: minecraft:stone + 2,-3,1: + bd: minecraft:stone + 2,-2,-5: + bd: minecraft:stone + 2,-2,-4: + bd: minecraft:dirt + 2,-2,-3: + bd: minecraft:dirt + 2,-2,-2: + bd: minecraft:dirt + 2,-2,-1: + bd: minecraft:dirt + 2,-2,0: + bd: minecraft:dirt + 2,-2,1: + bd: minecraft:stone + 2,-1,-5: + bd: minecraft:grass_block[snowy=false] + 2,-1,-4: + bd: minecraft:grass_block[snowy=false] + 2,-1,-3: + bd: minecraft:grass_block[snowy=false] + 2,-1,-2: + bd: minecraft:grass_block[snowy=false] + 2,-1,-1: + bd: minecraft:grass_block[snowy=false] + 2,-1,0: + bd: minecraft:grass_block[snowy=false] + 2,-1,1: + bd: minecraft:grass_block[snowy=false] + 2,0,-5: + bd: minecraft:air + 2,0,-4: + bd: minecraft:air + 2,0,-3: + bd: minecraft:air + 2,0,-2: + bd: minecraft:air + 2,0,-1: + bd: minecraft:air + 2,0,0: + bd: minecraft:air + 2,0,1: + bd: minecraft:air + 2,1,-5: + bd: minecraft:air + 2,1,-4: + bd: minecraft:air + 2,1,-3: + bd: minecraft:air + 2,1,-2: + bd: minecraft:air + 2,1,-1: + bd: minecraft:air + 2,1,0: + bd: minecraft:air + 2,1,1: + bd: minecraft:air + 2,2,-5: + bd: minecraft:air + 2,2,-4: + bd: minecraft:air + 2,2,-3: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 2,2,-2: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 2,2,-1: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 2,2,0: + bd: minecraft:oak_leaves[distance=4,persistent=false] + 2,2,1: + bd: minecraft:air + 2,3,-5: + bd: minecraft:air + 2,3,-4: + bd: minecraft:oak_leaves[distance=4,persistent=false] + 2,3,-3: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 2,3,-2: + bd: minecraft:oak_leaves[distance=2,persistent=false] + 2,3,-1: + bd: minecraft:oak_leaves[distance=3,persistent=false] + 2,3,0: + bd: minecraft:air + 2,3,1: + bd: minecraft:air + 2,4,-5: + bd: minecraft:air + 2,4,-4: + bd: minecraft:air + 2,4,-3: + bd: minecraft:air + 2,4,-2: + bd: minecraft:air + 2,4,-1: + bd: minecraft:air + 2,4,0: + bd: minecraft:air + 2,4,1: + bd: minecraft:air + 2,5,-5: + bd: minecraft:air + 2,5,-4: + bd: minecraft:air + 2,5,-3: + bd: minecraft:air + 2,5,-2: + bd: minecraft:air + 2,5,-1: + bd: minecraft:air + 2,5,0: + bd: minecraft:air + 2,5,1: + bd: minecraft:air + 2,6,-5: + bd: minecraft:air + 2,6,-4: + bd: minecraft:air + 2,6,-3: + bd: minecraft:air + 2,6,-2: + bd: minecraft:air + 2,6,-1: + bd: minecraft:air + 2,6,0: + bd: minecraft:air + 2,6,1: + bd: minecraft:air + 3,-4,-5: + bd: minecraft:stone + 3,-4,-4: + bd: minecraft:stone + 3,-4,-3: + bd: minecraft:stone + 3,-4,-2: + bd: minecraft:stone + 3,-4,-1: + bd: minecraft:stone + 3,-4,0: + bd: minecraft:stone + 3,-4,1: + bd: minecraft:stone + 3,-3,-5: + bd: minecraft:stone + 3,-3,-4: + bd: minecraft:stone + 3,-3,-3: + bd: minecraft:stone + 3,-3,-2: + bd: minecraft:stone + 3,-3,-1: + bd: minecraft:stone + 3,-3,0: + bd: minecraft:stone + 3,-3,1: + bd: minecraft:stone + 3,-2,-5: + bd: minecraft:stone + 3,-2,-4: + bd: minecraft:stone + 3,-2,-3: + bd: minecraft:stone + 3,-2,-2: + bd: minecraft:dirt + 3,-2,-1: + bd: minecraft:stone + 3,-2,0: + bd: minecraft:stone + 3,-2,1: + bd: minecraft:stone + 3,-1,-5: + bd: minecraft:stone + 3,-1,-4: + bd: minecraft:grass_block[snowy=false] + 3,-1,-3: + bd: minecraft:grass_block[snowy=false] + 3,-1,-2: + bd: minecraft:grass_block[snowy=false] + 3,-1,-1: + bd: minecraft:grass_block[snowy=false] + 3,-1,0: + bd: minecraft:grass_block[snowy=false] + 3,-1,1: + bd: minecraft:stone + 3,0,-5: + bd: minecraft:air + 3,0,-4: + bd: minecraft:air + 3,0,-3: + bd: minecraft:air + 3,0,-2: + bd: minecraft:air + 3,0,-1: + bd: minecraft:air + 3,0,0: + bd: minecraft:air + 3,0,1: + bd: minecraft:air + 3,1,-5: + bd: minecraft:air + 3,1,-4: + bd: minecraft:air + 3,1,-3: + bd: minecraft:air + 3,1,-2: + bd: minecraft:air + 3,1,-1: + bd: minecraft:air + 3,1,0: + bd: minecraft:air + 3,1,1: + bd: minecraft:air + 3,2,-5: + bd: minecraft:air + 3,2,-4: + bd: minecraft:air + 3,2,-3: + bd: minecraft:air + 3,2,-2: + bd: minecraft:air + 3,2,-1: + bd: minecraft:air + 3,2,0: + bd: minecraft:air + 3,2,1: + bd: minecraft:air + 3,3,-5: + bd: minecraft:air + 3,3,-4: + bd: minecraft:air + 3,3,-3: + bd: minecraft:air + 3,3,-2: + bd: minecraft:air + 3,3,-1: + bd: minecraft:air + 3,3,0: + bd: minecraft:air + 3,3,1: + bd: minecraft:air + 3,4,-5: + bd: minecraft:air + 3,4,-4: + bd: minecraft:air + 3,4,-3: + bd: minecraft:air + 3,4,-2: + bd: minecraft:air + 3,4,-1: + bd: minecraft:air + 3,4,0: + bd: minecraft:air + 3,4,1: + bd: minecraft:air + 3,5,-5: + bd: minecraft:air + 3,5,-4: + bd: minecraft:air + 3,5,-3: + bd: minecraft:air + 3,5,-2: + bd: minecraft:air + 3,5,-1: + bd: minecraft:air + 3,5,0: + bd: minecraft:air + 3,5,1: + bd: minecraft:air + 3,6,-5: + bd: minecraft:air + 3,6,-4: + bd: minecraft:air + 3,6,-3: + bd: minecraft:air + 3,6,-2: + bd: minecraft:air + 3,6,-1: + bd: minecraft:air + 3,6,0: + bd: minecraft:air + 3,6,1: + bd: minecraft:air +entities: + -1,0,0: + 47f04eb3-0fa6-4746-a180-6c0bfe198ff6: + type: COW + name: MooMoo + adult: true +attached: + 0,0,0: + bd: minecraft:sign[rotation=8,waterlogged=false] + lines: + - '[spawn_here]' + - '' + - '' + - '' + 0,0,1: + bd: minecraft:sign[rotation=8,waterlogged=false] + lines: + - '[start]' + - '' + - '' + - '' + 1,1,-2: + bd: minecraft:wall_torch[facing=east] +size: + xsize: 7 + ysize: 11 + zsize: 7 diff --git a/src/main/resources/schems/island.schem b/src/main/resources/schems/island.schem index d0732e986f10926f855b4a63970d8194892a6e4a..8d861e2ced35b66bbb44503bb8ac58ed0a118ab1 100644 GIT binary patch literal 2318 zcmZ`*c{mhW8=o=uEo9$KG-T-OBPRQvA!7^4aK{pnv6a0TG>9zOQZy>AltIXH?R^Zo zmbtP{m=PhymVJ!nQ}=#P`r|w2dCqx%=RNN^?{d!b{H)ADjQjuqfE8eiHAH-yA&cH+ z1psK*008FWRqxxru6`cP`4;|zdOY!~`$-e^?{0>MC|D^Z*qqbTOP0qPV!@E$PbD%Y zmF5bqlH)Xhkv1`+2D~VwCL2QXg2Jqw5 zZU`Yvi|900g0CV~X%%>8lBR=ly>8Up&hC5F{${t<*5w9e-PKX4nlx)yb34zD7UY6- znG0a6XUXv$J zlU zW|U#LzA>yOM8p*Rn!43V$1w2jetM2alW$tfFn_eU5`s#h!u`jAC!+PC)PhdrX1E2- zaw0cRo4IbX`08n*K%ZjbLD*+pUzwqypqxga*k4?DSWDr@*1oP*I3guUktRR@6BuD} zG467$(_zD6%3qX()^j+*ld(;+2INkGb+z*Jx#_@@pBB zc~6uvGDbR5U|qsEciFDnybIjS9zI@aT4CVwt>b?Az%xGB1#ZNZ3b)ptWEVn|gGPh^ z-5FBsP)S*a$DW?qJUyt!XtbswWBl=6QW2dWzUrqlQjhzqmL?qwi5+Cq&Iq>5A2*ig z0oD6Z)Z|a3fItq2cB|L+mXE0P;eQQwLi&o>JAuSb$K8AIxz@w@+tV{+8LFI|qptN^ zb+1g?JUj3aylAc^BTh9i7bs4Ev-Xe+65C*KmBa0&2G8kX3?9$u{?+L)FBj3?p(<)Z zRZ**FnRs2l-DrixdFgu2uK7`Wnt@l!eI5jy;mjde1lQP3UW`B;MBpf;%p+-}>Bs}R z4Rm!;ZoJEI<84$!6lVfG&MlmF^X~0?+NF}{4{0tAw9&zHc}V})lpU53B59dAH%5=E zV=3S^AriSM;`b)-=M_eEwIjpVT>#4eeA&E-!!+pcQ~n+k4%@_M~7;h`6*wMYg-$=)1dTyfHz&|G7Zz1XfkfMw&XR zczzgLZ!Qq@Kk#UV=_z~G9hB8 zzqr~Yz{Q!-!bPq&@o?d@&bc10HduXrW{X_e&-_UN?D{aQWWE76;yH7i@RjQU>^t*6mDw7LsKx2Q@L?uvAywy$JMaNH z{l}ZgjNAHsOc&Hq+fdXd6txaTtwB*M54-xq7NMxGP}Cgs&KF-?3NcTys4ty#puu-4 zo2fVJo2iIp787R{+qQs~MQ6K*mU(=khZbB=-BeKhvY@(&pt`Z3x{=^TL&1v%#fWrt zz^Qr=5>Th%cjsD-ANeXKvQ1)&0k-RP3s6gc zqQzU5#hvr+b+?L1o-c&ZPyT6+)!Zy{*QVB}XGi ze=7UUZB3RAub+)hx3jaSSVUXrg;GG*`;~>}dtUze#<5aZXSty@%0(a+Auj4}35I<$yS4V1CeGpN8I1#bb6Bo3t;=il=2@(g{ z8f+Z4y+xhZRX;jpvN8uU=mP#9LyQz-8;5}HI={|V W=1kuS4gh%EkI4?;`7!GO0R9UOj7oR_ literal 2487 zcmY+Gdo|*9S4NW#{c7rwcME+ z+gd}4RZ~o4+=YtBC6l4WQshp;0V1IiJs8Zx2^#84W;wJ2$V` z9R z?FjDorHUgs_SdvTX|)hS^Bvvp-|C$qt<%f1!j%?v)r4fpv#5Imc{gfW7Gr5%v-Qpy zZ$`U6jCO~|Z`wMy418)&9W>6j=nZ+~pS5m0+&3%Rwig?aIvKRgE zlYD0PB}m~aZ&9Cq7gBfuKN%W{Yi}KAtklv@W=)fP2=2Y@B@La-ZxylPei9 z5AQ7=ytgNNdiKu;BMhfb(*7QDc-71prVuf>+C`--V~ERHUdI^ACdB0?Z+?EzX${WD z4g2{r?+Mk^;gsw5*>yhS8}q>_U83L=?zJCYG}@l^^(rndV^fdM$fk69A_ELgu+3Kghz~a2w6PcGo ztB$#^+-k>R_Os2PeG|+)U5`xZP#WN_Qs*8DF4EgY@Z+uH#yiE=-TF| zbh@IhPxl>Z8mJC>WUg>t2ayWgmjeQJ08OFNqSGh(Sr=+cJ|;hO(Hqx_HZ2{}KqPjTTZp*2%*+Y8$t z@vslKPy*kuj@qV0#=G3^dE&EE-e5giad_AvMX6nN zY+^joJz=ecX;M?7nkfuwIC{Vk&3J+aglZ#s{nsr^F&%UhG{bg44+tP#lm>KxGdj*5 zv5?PQn)3l;%e#NQpU@uWnT2d5rVFzle*13xv?^f}*OT|E!6er*uA&IJzVI<5+j*g% zf0>bMA{dLyK$1sO=H@;GzpE`kMD@FqSzER=5NFIPI$2+t$}cX^6|WK_qZv!n zYoZ{@(7UZ3q{Md3*47ql7dN=+mt8A~5zoDt>|B(@+I{;;Ok*C*hOWiN(xPl_?boAE zS{oMnF}r@rG}%lSB0Dx6xega&ELD1rUT*zssj)yWR=dz3cK>?xhSx>rQRK7i&K`f< z<>2f2K2 zE-}S#sPHP?lrPYNR%<~yTF^`_C`$_(p*3mHiIto*!&|GsQta}mzn+i5jK6;qJ*jM= zRUM#fsCj8g^j=-~M`Ck8s%PCr%}~uNdm)FwnI?;!)h^GB!O$iPwN~>csuZ;Vr@LFV z^>@K>5hcsU?Ip@wV4|F9~S@q{v zL(fg^5EBHC2X8OWq8IL{$S1eM$#O zMZZ+WB{^NVo<$XJPZiIk zs?-qOZN$+;yBKj`=ng}UJle^S1)w_&IBTGb0cRfU&}U77PWqg;V22*(HRz(pc@DPe zvf4lwT}}hop~K;UE;_7xV4F6l6m-$%u)z*3P7dg##YzJ^G&$Em7flWm>_D)hK_>)< z0(QVT=Rp@ZhX}TPwb*jKV(LYCLC`VkBkQM;bDMqdgT_bi=HFqx;jdm|y*Y{Fy?NS{ z@>{NWMi6NmT{aTyzdXD+m$cNnF;m2NvccFo5p&rdxtd916!V=s(S;+y12bJ+b4+-3 ze)B6dvX^!fdBvcd+~4D+qj79_&Wv1ny?9y>5SedTJxBK6dM$1gM}7bSp)D^%WLufBqw0st&} x1KVea)K}8~S*$NLIY9Ye!-X$N_&ok=xa9w5xIA2C