Merge pull request #1 from BONNe/master

Create CaveBlock
This commit is contained in:
tastybento 2019-01-31 08:03:17 -08:00 committed by GitHub
commit 514f860d3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 6220 additions and 1 deletions

View File

@ -0,0 +1,37 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: "Bug \U0001F4A5"
assignees: ''
---
## Bug Report
#### Description
A clear and concise description of what the bug is.
#### Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
#### Expected behavior
A clear and concise description of what you expected to happen.
#### Screenshots or video
If applicable, add screenshots to help explain your problem.
#### Server Information:
[Please complete the following information:]
- Database being used (YAML, JSON, MySQL, MongoDB): []
- OS: [e.g. iOS]
- Java Version: [e.g. Java 8]
- BentoBox version: [e.g. 1.7.2.21]
- Addons installed? [Do '/bentobox version' and copy/paste from the console]
- Other plugins? [Do '/plugins' and copy/paste from the console]
#### Additional context
Add any other context about the problem here.

View File

@ -0,0 +1,18 @@
---
name: Contributor request
about: Describe this issue template's purpose here.
title: ''
labels: "Need help \U0001F198"
assignees: ''
---
## Contributor Request
#### Description
Describe your request.
#### Tasks
Describe task that should be performed
#### Additional information
Any additional information?

View File

@ -0,0 +1,21 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: Feature request ✨
assignees: ''
---
## Feature Request
#### Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
#### Describe the solution you'd like
A clear and concise description of what you want to happen.
#### Describe alternatives you've considered
A clear and concise description of any alternative solutions or features you've considered.
#### Additional context
Add any other context or screenshots about the feature request here.

View File

@ -1,2 +1,39 @@
# CaveBlock
CaveBlock addon for BentoBox. An interesting variation from Skyblock, where your goal is to survive in a cube of stone!
CaveBlock is an addon for BentoBox, so to run CaveBlock, you must have BentoBox installed. It is not a Bukkit plugin and trying to use it as one will not work.
## Installation
0. Install BentoBox and run it on the server at least once to create its data folders.
1. Place this jar in the addons folder of the BentoBox plugin.
2. Restart the server.
3. The addon will create worlds and a data folder and inside the folder will be a config.yml.
4. Stop the server .
5. Edit the config.yml how you want.
6. Delete any worlds that were created by default if you made changes that would affect them.
7. Restart the server.
## Config.yml
The config.yml is similar to BSkyblock and AcidIsalnd but *not the same*. It has some additional or changed parameters, like,
instead of wrold-height it has world-depth.
It also has option to choose main block for each world, and blocks that will be occasionally replace main block, f.e. diamond ore or shulker.
It also allows to specifiy if roof and floor for each world must be generated from bedrock.
### Other Add-ons
CaveBlock is an add-on that uses the BentoBox API. Here are some other ones that you may be interested in:
* Level - provides island level calculation and a top ten - may need some adjusments, as main block will be over all island.
* Welcome Warps - provides the warp sign feature
* Challenges - challenges
* Biomes - allows to change biomes per island
* Greenhouses - allows to create green houses that provides some biome specific materials / mobs.
* invSwitcher - allows to switch inventories between gamemode worlds
You can find the projects on GitHub.
Bugs and Feature requests
=========================
File bug and feature requests here: https://github.com/BentoBoxWorld/CaveBlock/issues

226
pom.xml Normal file
View File

@ -0,0 +1,226 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>world.bentobox</groupId>
<artifactId>caveblock</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>CaveBlock</name>
<description>CaveBlock is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like SkyBlock or AcidIsland.</description>
<url>https://github.com/BentoBoxWorld/CaveBlock</url>
<inceptionYear>2019</inceptionYear>
<scm>
<connection>scm:git:https://github.com/BentoBoxWorld/CaveBlock.git</connection>
<developerConnection>scm:git:git@github.com:BentoBoxWorld/CaveBlock.git</developerConnection>
<url>https://github.com/BentoBoxWorld/CaveBlock</url>
</scm>
<ciManagement>
<system>jenkins</system>
<url>http://ci.codemc.org/job/BentoBoxWorld/job/CaveBlock</url>
</ciManagement>
<issueManagement>
<system>GitHub</system>
<url>https://github.com/BentoBoxWorld/CaveBlock/issues</url>
</issueManagement>
<distributionManagement>
<snapshotRepository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.org/repository/maven-snapshots</url>
</snapshotRepository>
<repository>
<id>codemc-releases</id>
<url>https://repo.codemc.org/repository/maven-releases</url>
</repository>
</distributionManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<powermock.version>1.7.4</powermock.version>
</properties>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots</url>
</repository>
<repository>
<id>codemc-repo</id>
<url>https://repo.codemc.org/repository/maven-public</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.13.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>${powermock.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>world.bentobox</groupId>
<artifactId>bentobox</artifactId>
<version>1.2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<defaultGoal>clean package</defaultGoal>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources/locales</directory>
<targetPath>./locales</targetPath>
<filtering>false</filtering>
<includes>
<include>*.yml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources/schems</directory>
<targetPath>./schems</targetPath>
<filtering>false</filtering>
<includes>
<include>*.schem</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>schem</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<show>public</show>
<failOnError>false</failOnError>
<additionalJOption>-Xdoclint:none</additionalJOption>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<minimizeJar>false</minimizeJar>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.1</version>
<configuration>
<append>true</append>
</configuration>
<executions>
<execution>
<id>pre-unit-test</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>post-unit-test</id>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,234 @@
package world.bentobox.caveblock;
import org.bukkit.World;
import org.bukkit.WorldCreator;
import org.bukkit.WorldType;
import org.bukkit.generator.ChunkGenerator;
import org.eclipse.jdt.annotation.NonNull;
import world.bentobox.bentobox.api.addons.GameModeAddon;
import world.bentobox.bentobox.api.configuration.Config;
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;
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();
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 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);
}
}
/**
* 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);
}
}
// ---------------------------------------------------------------------
// 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();
if (this.getServer().getWorld(worldName) == null)
{
this.getLogger().info("Creating CaveBlock world ...");
}
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();
// 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();
}
}
// 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();
}
}
}
/**
* 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
// ---------------------------------------------------------------------
/**
* @return WorldSettings for this GameMode
*/
@Override
public WorldSettings getWorldSettings()
{
return this.settings;
}
/**
* @return Settings for this GameMode
*/
public Settings getSettings()
{
return this.settings;
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* This stores CaveBlock addon settings.
*/
private Settings settings;
/**
* This stores CaveBlock addon WorldGenerator.
*/
private ChunkGeneratorWorld chunkGenerator;
// ---------------------------------------------------------------------
// Section: Constants
// ---------------------------------------------------------------------
/**
* String for nether world.
*/
private static final String NETHER = "_nether";
/**
* String for the end world.
*/
private static final String THE_END = "_the_end";
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,77 @@
package world.bentobox.caveblock.commands;
import java.util.List;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.commands.admin.*;
import world.bentobox.bentobox.api.commands.admin.deaths.AdminDeathsCommand;
import world.bentobox.bentobox.api.commands.admin.range.AdminRangeCommand;
import world.bentobox.bentobox.api.commands.admin.resets.AdminResetsResetCommand;
import world.bentobox.bentobox.api.commands.admin.schem.AdminSchemCommand;
import world.bentobox.bentobox.api.commands.admin.team.AdminTeamAddCommand;
import world.bentobox.bentobox.api.commands.admin.team.AdminTeamDisbandCommand;
import world.bentobox.bentobox.api.commands.admin.team.AdminTeamKickCommand;
import world.bentobox.bentobox.api.commands.admin.team.AdminTeamSetownerCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.caveblock.CaveBlock;
public class AdminCommand extends CompositeCommand {
public AdminCommand(CaveBlock addon) {
super(addon, "cbadmin", "cba");
}
@Override
public void setup() {
setPermission("admin.*");
setOnlyPlayer(false);
setParametersHelp("commands.admin.help.parameters");
setDescription("commands.admin.help.description");
new AdminVersionCommand(this);
new AdminTeleportCommand(this, "tp");
new AdminTeleportCommand(this, "tpnether");
new AdminTeleportCommand(this, "tpend");
new AdminGetrankCommand(this);
new AdminSetrankCommand(this);
new AdminInfoCommand(this);
// Team commands
new AdminTeamAddCommand(this);
new AdminTeamKickCommand(this);
new AdminTeamDisbandCommand(this);
new AdminTeamSetownerCommand(this);
// Schems
new AdminSchemCommand(this);
// Register/unregister islands
new AdminRegisterCommand(this);
new AdminUnregisterCommand(this);
// Range
new AdminRangeCommand(this);
// Resets
new AdminResetsResetCommand(this);
// TODO new AdminClearresetsallCommand(this);
// Delete
new AdminDeleteCommand(this);
// Why
new AdminWhyCommand(this);
// Deaths
new AdminDeathsCommand(this);
// Reload
new AdminReloadCommand(this);
// Spawn
new AdminSetspawnCommand(this);
}
@Override
public boolean execute(User user, String label, List<String> args) {
if (!args.isEmpty()) {
user.sendMessage("general.errors.unknown-command", TextVariables.LABEL, getTopLabel());
return false;
}
// By default run the attached help command, if it exists (it should)
return showHelp(this, user);
}
}

View File

@ -0,0 +1,33 @@
package world.bentobox.caveblock.commands;
import java.util.List;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.user.User;
public class IslandAboutCommand extends CompositeCommand {
/**
* About
* @param islandCommand - parent command
*/
public IslandAboutCommand(CompositeCommand islandCommand) {
super(islandCommand, "about", "ab");
}
@Override
public void setup() {
setDescription("commands.island.about.description");
}
@Override
public boolean execute(User user, String label, List<String> args) {
user.sendRawMessage("About " + getAddon().getDescription().getName() + " " + getAddon().getDescription().getVersion() + ":");
user.sendRawMessage("Copyright (c) 2019 BONNe");
user.sendRawMessage("See https://www.eclipse.org/legal/epl-2.0/");
user.sendRawMessage("for license information.");
return true;
}
}

View File

@ -0,0 +1,68 @@
package world.bentobox.caveblock.commands;
import java.util.ArrayList;
import java.util.List;
import world.bentobox.bentobox.api.commands.CompositeCommand;
import world.bentobox.bentobox.api.commands.island.*;
import world.bentobox.bentobox.api.commands.island.team.IslandTeamCommand;
import world.bentobox.bentobox.api.localization.TextVariables;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.caveblock.CaveBlock;
public class IslandCommand extends CompositeCommand {
public IslandCommand(CaveBlock addon) {
super(addon, "cave", "cb");
}
/* (non-Javadoc)
* @see us.tastybento.bskyblock.api.commands.CompositeCommand#setup()
*/
@Override
public void setup() {
setDescription("commands.island.help.description");
setOnlyPlayer(true);
// Permission
setPermission("island");
// Set up subcommands
new IslandAboutCommand(this);
new IslandInfoCommand(this);
new IslandCreateCommand(this);
new IslandGoCommand(this);
new IslandSpawnCommand(this);
new IslandResetCommand(this);
new IslandSetnameCommand(this);
new IslandResetnameCommand(this);
new IslandSethomeCommand(this);
new IslandSettingsCommand(this);
new IslandLanguageCommand(this);
new IslandBanCommand(this);
new IslandUnbanCommand(this);
new IslandBanlistCommand(this);
// Team commands
new IslandTeamCommand(this);
}
/* (non-Javadoc)
* @see us.tastybento.bskyblock.api.commands.CommandArgument#execute(org.bukkit.command.CommandSender, java.lang.String[])
*/
@Override
public boolean execute(User user, String label, List<String> args) {
if (user == null) {
return false;
}
if (args.isEmpty()) {
// If user has an island, go
if (getPlugin().getIslands().getIsland(getWorld(), user.getUniqueId()) != null) {
return getSubCommand("go").map(goCmd -> goCmd.execute(user, goCmd.getLabel(), new ArrayList<>())).orElse(false);
}
// No islands currently
return getSubCommand("create").map(createCmd -> createCmd.execute(user, createCmd.getLabel(), new ArrayList<>())).orElse(false);
}
user.sendMessage("general.errors.unknown-command", TextVariables.LABEL, getTopLabel());
return false;
}
}

View File

@ -0,0 +1,210 @@
package world.bentobox.caveblock.generators;
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;
import world.bentobox.caveblock.generators.populators.EntitiesPopulator;
import world.bentobox.caveblock.generators.populators.MaterialPopulator;
/**
* Class ChunkGeneratorWorld ...
*
* @author BONNe
* Created on 27.01.2019
*/
public class ChunkGeneratorWorld extends ChunkGenerator
{
// ---------------------------------------------------------------------
// Section: Constructor
// ---------------------------------------------------------------------
/**
* @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));
}
// ---------------------------------------------------------------------
// 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 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);
}
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();
// 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());
}
/**
* 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());
// 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();
// 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());
// 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<BlockPopulator> getDefaultPopulators(final World world)
{
return this.blockPopulators;
}
// ---------------------------------------------------------------------
// 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<BlockPopulator> blockPopulators;
}

View File

@ -0,0 +1,269 @@
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.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;
import world.bentobox.caveblock.Settings;
/**
* This class populates generated chunk with enitites by random chance.
*/
public class EntitiesPopulator extends BlockPopulator
{
/**
* This is default constructor
* @param addon CaveBlock addon.
*/
public EntitiesPopulator(CaveBlock addon)
{
this.addon = addon;
this.settings = addon.getSettings();
}
/**
* 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<EntityType, Pair<Integer, Integer>> 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<EntityType, Pair<Integer, Integer>> entry : entityChanceMap.entrySet())
{
for (int subY = 1; 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 = subY + random.nextInt(15);
this.tryToPlaceEntity(world, chunk.getBlock(x, y, z), entry.getKey(), x, z, mainMaterial);
}
}
}
}
}
/**
* 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<EntityType, Pair<Integer, Integer>> getEntityMap(List<String> objectList)
{
Map<EntityType, Pair<Integer, Integer>> entityMap = new HashMap<>(objectList.size());
Map<String, EntityType> 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 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.
* @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;
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());
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
// ---------------------------------------------------------------------
/**
* CaveBlock addon.
*/
private CaveBlock addon;
/**
* CaveBlock settings.
*/
private Settings settings;
}

View File

@ -0,0 +1,194 @@
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 world.bentobox.bentobox.util.Pair;
import world.bentobox.caveblock.CaveBlock;
import world.bentobox.caveblock.Settings;
/**
* This class allows to fill given chunk with necessary blocks.
*/
public class MaterialPopulator extends BlockPopulator
{
/**
* This is default constructor
* @param addon CaveBlock addon.
*/
public MaterialPopulator(CaveBlock addon)
{
this.addon = addon;
this.settings = addon.getSettings();
}
/**
* 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<Material, Pair<Integer, Integer>> materialChanceMap;
Material mainMaterial;
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();
}
final int generationTry = this.settings.getNumberOfBlockGenerationTries();
final int worldHeight = this.settings.getWorldDepth() - 1;
for (Map.Entry<Material, Pair<Integer, Integer>> entry : materialChanceMap.entrySet())
{
for (int subY = 1; 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 = subY + random.nextInt(16);
Block block = chunk.getBlock(x, y, z);
if (block.getType().equals(mainMaterial) &&
this.isValidBlock(world, block, x, z))
{
int packSize = random.nextInt(entry.getValue().z);
boolean continuePlacing = true;
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 - 1, 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(0, 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()));
}
}
}
}
}
}
}
/**
* 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<Material, Pair<Integer, Integer>> getMaterialMap(List<String> objectList)
{
Map<Material, Pair<Integer, Integer>> 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]);
if (material != null)
{
materialMap.put(material,
new Pair<>(Integer.parseInt(splitString[2]), Integer.parseInt(splitString[3])));
}
});
return materialMap;
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* CaveBlock addon.
*/
private CaveBlock addon;
/**
* CaveBlock settings.
*/
private Settings settings;
}

View File

@ -0,0 +1,136 @@
name: CaveBlock
main: world.bentobox.caveblock.CaveBlock
version: ${version}
authors: BONNe
permissions:
caveblock.island:
description: Allow island command usage
default: true
caveblock.island.create:
description: Allow island creation
default: true
caveblock.island.home:
description: Allow teleporting to player island
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
default: true
caveblock.island.sethome:
description: Let the player set their island teleport point
default: true
caveblock.island.lock:
description: Allows island locking
default: false
caveblock.island.expel:
description: Allows expelling of visitors
default: true
caveblock.island.ban:
description: Allows banning of visitors
default: true
caveblock.island.settings:
description: Player can see server settings
default: true
caveblock.island.language:
description: Player can select a language
default: true
caveblock.island.name:
description: Player can set the name of their island
default: true
caveblock.island.spawn:
description: Player can use the island spawn command if spawn exists
default: true
caveblock.island.reset:
description: Player can use the island reset or restart command
default: true
caveblock.island.team:
description: Let a player use team commands
default: true
caveblock.island.team.trust:
description: Let a player use team trust commands
default: true
caveblock.island.team.coop:
description: Let a player use team coop commands
default: true
caveblock.settings.*:
description: Allow use of settings on island
default: true
caveblock.mod.info:
description: Let a moderator see info on a player
default: op
caveblock.mod.resethome:
description: Allows setting or reseting of a player's home position
default: op
caveblock.mod.clearreset:
description: Allow clearing of island reset limit
default: false
caveblock.mod.tp:
description: Allows teleport to an island
default: op
caveblock.mod.bypasscooldowns:
description: Allow moderator to bypass cooldowns
default: op
caveblock.mod.bypassprotect:
description: Allow moderator to bypass island protection
default: op
caveblock.mod.bypassexpel:
description: Allow moderator to bypass island expulsion
default: op
caveblock.mod.lock:
description: Locks or unlocks an island
default: op
caveblock.mod.bypasslock:
description: Bypasses an island 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
default: false
caveblock.mod.resetname:
description: Enables reset of player's island names
default: false
caveblock.admin.clearresetall:
description: Allow clearing of island 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)
default: op
caveblock.admin.deleteisland:
description: Let a player completely remove the island the player is on
default: op
caveblock.admin.register:
description: Let a player register the nearest island to another player.
default: op
caveblock.admin.unregister:
description: Removes a player from an island without deleting the island blocks.
default: op
caveblock.admin.purge:
description: Let a player purge old islands.
default: op
caveblock.admin.setspawn:
description: Allows use of spawn tools
default: op
caveblock.admin.setrange:
description: Allows setting of island protection range
default: op
caveblock.admin.reserve:
description: Reserves an empty spot for a player's next island
default: op
caveblock.admin.settingsreset:
description: Resets all the islands to default protection settings
default: op
caveblock.admin.noban:
description: Player cannot be banned from an island
default: op
caveblock.admin.setlanguage:
description: Resets all player languages and sets the default language
default: op

View File

@ -0,0 +1,353 @@
# 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.
world:
# Friendly name for this world. Used in admin commands. Must be a single word
friendly-name: CaveBlock
# Name of the world - if it does not exist then it will be generated.
# It acts like a prefix for nether and end (e.g. CaveBlock-world, CaveBlock-world_nether, CaveBlock-world_end)
world-name: CaveBlock-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)
# 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
# Default protection range radius in blocks. Cannot be larger than distance.
# Admins can change protection sizes for players individually using /cbadmin range set <player> <new range>
# or set this permission: caveblock.island.range.<number>
protection-range: 50
# Start islands at these coordinates. This is where new islands will start in the
# world. These must be a factor of your island distance, but the plugin will auto
# calculate the closest location on the grid. Islands develop around this location
# both positively and negatively in a square grid.
# If none of this makes sense, leave it at 0,0.
start-x: 0
start-z: 0
offset-x: 0
offset-z: 0
# Island height - Lowest is 5.
# It is the y coordinate of the bedrock block in the schem.
island-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
# The default game mode for this world. Players will be set to this mode when they create
# a new island for example. Options are SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR
default-game-mode: SURVIVAL
# 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
# -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
floor: true
# Main block of which world will be generated.
main-block: STONE
# Blocks that will occasionally replace main block by random chance.
# Blocks will replace only main-block and will try to create packs that
# are set in their strings. Chance of spawning also is required.
# For materials first string must be MATERIAL, for entity: ENTITY.
# 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
# where max amount in pack are 5 per each subchunk!
blocks:
- MATERIAL:DIAMOND_ORE:1:3
- MATERIAL:GOLD_ORE:5:4
- MATERIAL:IRON_ORE:5:4
- MATERIAL:COAL_ORE:10:6
- MATERIAL:EMERALD_ORE:1:1
- MATERIAL:CLAY:10:6
- MATERIAL:DIRT:10:10
- MATERIAL:GRAVEL:20:6
- MATERIAL:GRANITE:20:10
- MATERIAL:ANDESITE:20:10
- MATERIAL:DIORITE:30:8
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.
# Note: Some default challenges will not be possible if there is no nether.
# Note that with a standard nether all players arrive at the same portal and entering a
# portal will return them back to their islands.
generate: true
# Islands in Nether. Change to false for standard vanilla nether.
islands: true
# Nether trees are made if a player grows a tree in the nether (gravel and glowstone)
# Applies to both vanilla and islands Nether
trees: true
# Nether spawn protection radius - this is the distance around the nether spawn
# that will be protected from player interaction (breaking blocks, pouring lava etc.)
# Minimum is 0 (not recommended), maximum is 100. Default is 25.
# Only applies to vanilla nether
spawn-radius: 25
# 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
floor: true
# Main block of which world will be generated.
main-block: NETHERRACK
# Blocks that will occasionally replace main block by random chance.
# Blocks will replace only main-block and will try to create packs that
# are set in their strings. Chance of spawning also is required.
# For materials first string must be MATERIAL, for entity: ENTITY.
# 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
# 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:LAVA:10:1
end:
generate: true
islands: true
# /!\ This feature is experimental and might not work as expected or might not work at all.
dragon-spawn: false
# 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
floor: true
# Main block of which world will be generated.
main-block: END_STONE
# Blocks that will occasionally replace main block by random chance.
# Blocks will replace only main-block and will try to create packs that
# are set in their strings. Chance of spawning also is required.
# For materials first string must be MATERIAL, for entity: ENTITY.
# 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
# where max amount in pack are 5 per each subchunk!
blocks:
- ENTITY:SHULKER:1:1
# Mob white list - these mobs will NOT be removed when logging in or doing /cave
remove-mobs-whitelist:
- ZOMBIE_VILLAGER
- WITHER
- PIG_ZOMBIE
- ENDERMAN
# World flags. These are boolean settings for various flags for this world
flags:
CREEPER_DAMAGE: true
OBSIDIAN_SCOOPING: true
PISTON_PUSH: false
ISLAND_RESPAWN: true
CREEPER_GRIEFING: false
ENDERMAN_GRIEFING: true
CLEAN_SUPER_FLAT: false
CHEST_DAMAGE: false
PREVENT_TELEPORT_WHEN_FALLING: false
ENTER_EXIT_MESSAGES: true
ENDERMAN_DEATH_DROP: true
OFFLINE_REDSTONE: true
REMOVE_MOBS: true
ENDER_CHEST: false
ITEM_FRAME_DAMAGE: false
# These are the default protection settings for new islands.
# The value is the minimum island rank required allowed to do the action
# Ranks are: Visitor = 0, Member = 900, Owner = 1000
default-island-flags:
HURT_ANIMALS: 500
REDSTONE: 500
BUCKET: 500
LOCK: 0
ENDER_PEARL: 500
DOOR: 500
FURNACE: 500
ANVIL: 500
FISH_SCOOPING: 500
FIRE: 500
END_PORTAL: 500
BREEDING: 500
HURT_VILLAGERS: 500
TNT: 500
TURTLE_EGGS: 500
FROST_WALKER: 500
COLLECT_LAVA: 500
LEVER: 500
HURT_MONSTERS: 0
RIDING: 500
NAME_TAG: 500
ARMOR_STAND: 500
TRADING: 0
EGGS: 500
ITEM_DROP: 0
NOTE_BLOCK: 0
NETHER_PORTAL: 500
ITEM_PICKUP: 0
CROP_TRAMPLE: 500
BREWING: 500
DROPPER: 500
COLLECT_WATER: 500
BUTTON: 500
FIRE_EXTINGUISH: 500
BEACON: 500
TRAPDOOR: 500
PRESSURE_PLATE: 0
PLACE_BLOCKS: 500
ITEM_FRAME: 500
CRAFTING: 0
SHEARING: 500
ENCHANTING: 0
SPAWN_EGGS: 500
BED: 500
MILKING: 0
DISPENSER: 500
GATE: 0
EXPERIENCE_PICKUP: 500
HOPPER: 500
LEASH: 500
MOUNT_INVENTORY: 500
BREAK_BLOCKS: 500
CHORUS_FRUIT: 500
CONTAINER: 500
JUKEBOX: 500
# These are the default settings for new islands
default-island-settings:
PVP_END: false
ANIMAL_SPAWN: true
PVP_NETHER: false
MONSTER_SPAWN: true
FIRE_SPREAD: true
PVP_OVERWORLD: false
# These are the settings visible to users. (Not implemented yet)
# /!\ This feature is experimental and might not work as expected or might not work at all.
visible-settings: []
# Visitor banned commands - Visitors to islands cannot use these commands in this world
visitor-banned-commands:
- spawner
- spawnmob
island:
# Default max team size
# 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 <number> or /cave go <number>
max-homes: 1
reset:
# How many resets a player is allowed (override with /cbadmin clearresets <player>)
# Value of -1 means unlimited, 0 means hardcore - no resets.
# Example, 2 resets means they get 2 resets or 3 islands lifetime
reset-limit: -1
# Kicked or leaving players lose resets
# Players who leave a team will lose an island reset chance
# If a player has zero resets left and leaves a team, they cannot make a new
# island by themselves and can only join a team.
# Leave this true to avoid players exploiting free islands
leavers-lose-reset: false
# Allow kicked players to keep their inventory.
# If false, kicked player's inventory will be thrown at the island leader if the
# kicked player is online and in the island world.
kicked-keep-inventory: false
on-join:
# What the plugin should reset when the player joins or creates an island
# Reset Money - if this is true, will reset the player's money to the starting money
# Recommendation is that this is set to true, but if you run multi-worlds
# make sure your economy handles multi-worlds too.
money: false
# Reset inventory - if true, the player's inventory will be cleared.
# Note: if you have MultiInv running or a similar inventory control plugin, that
# plugin may still reset the inventory when the world changes.
inventory: false
# Reset Ender Chest - if true, the player's Ender Chest will be cleared.
ender-chest: false
on-leave:
# What the plugin should reset when the player leaves or is kicked from an island
# Reset Money - if this is true, will reset the player's money to the starting money
# Recommendation is that this is set to true, but if you run multi-worlds
# make sure your economy handles multi-worlds too.
money: false
# Reset inventory - if true, the player's inventory will be cleared.
# Note: if you have MultiInv running or a similar inventory control plugin, that
# plugin may still reset the inventory when the world changes.
inventory: false
# Reset Ender Chest - if true, the player's Ender Chest will be cleared.
ender-chest: false
require-confirmation:
reset: true
# Have player's respawn on their island if they die
respawn-on-island: false
sethome:
nether:
allow: true
require-confirmation: true
the-end:
allow: true
require-confirmation: true
deaths:
# Whether deaths are counted or not.
counted: true
# Maximum number of deaths to count. The death count can be used by add-ons.
max: 10
sum-team: false
# When a player joins a team, reset their death count
team-join-reset: true
protection:
# Geo restrict mobs.
# Mobs that exit the island space where they were spawned will be removed.
geo-limit-settings:
- GHAST
- BAT
- BLAZE
# Invincible visitors. List of damages that will not affect visitors.
# Make list blank if visitors should receive all damages
invincible-visitors:
- BLOCK_EXPLOSION
- CONTACT
- CUSTOM
- DROWNING
- ENTITY_ATTACK
- ENTITY_EXPLOSION
- FALL
- FALLING_BLOCK
- FIRE
- FIRE_TICK
- LAVA
- LIGHTNING
- MAGIC
- POISON
- PROJECTILE
- STARVATION
- SUFFOCATION
- THORNS
- WITHER
- DRAGON_BREATH
- FLY_INTO_WALL
- HOT_FLOOR
- CRAMMING
- VOID
panel:
# Whether GUIs should be closed when the player clicks outside.
close-on-click-outside: true
do-not-edit-these-settings:
# These settings should not be edited
reset-epoch: 0
uniqueId: config

View File

@ -0,0 +1,12 @@
###########################################################################################
# This is a YML file. Be careful when editing. Check your edits in a YAML checker like #
# the one at http://yaml-online-parser.appspot.com #
###########################################################################################
caveblock:
sign:
line0: "&cCaveBlock"
line1: "Welcome!"
line2: "[name]"
line3: "Start digging! &c<3"

View File

@ -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

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,899 @@
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

Binary file not shown.