Compare commits

...

25 Commits

Author SHA1 Message Date
tastybento aa6bd08027
Update README.md 2023-12-03 12:32:40 -08:00
tastybento 9e51156f87 Avoid min and max y settings for ores. Fixes #91 2023-11-26 07:59:48 -08:00
tastybento 772ece5916 Merge branch 'develop' of https://github.com/BentoBoxWorld/CaveBlock.git into develop 2023-11-12 13:51:41 -08:00
tastybento 1b4c4f86a8 BentoBox 2.0.0 API 2023-11-12 13:51:32 -08:00
tastybento 4d8b1c6649
Update pom.xml 2023-07-10 21:36:26 -07:00
tastybento 77c058b7fd Update Jacoco 2023-07-10 21:32:47 -07:00
tastybento 3bf71e1b98 Add required distribution 2023-06-24 13:52:00 -07:00
tastybento 6e7b235e74 Update Github Action build script 2023-06-24 13:01:57 -07:00
BONNe c21423accf Init 1.19.0 version 2023-04-16 19:46:55 +03:00
BONNe e1121d3dce Upgrade to BentoBox API 1.23 2023-04-16 19:45:56 +03:00
BONNe 75148c5e00
Return to plugin.yml (#89)
* Create plugin.yml

* Update pom.xml

* Update CaveBlockPladdon.java
2023-04-08 19:12:51 +03:00
tastybento 4490c4a32d Update JavaDoc plugin in POM to compile with Java 17 etc. 2023-03-25 10:04:21 -07:00
tastybento 6601875109 Update pladdon annotations 2023-03-25 10:02:30 -07:00
BONNe 276b9cea40
Update build.yml 2023-01-05 21:27:42 +02:00
BONNe d3e3984bc0
Init next release 2023-01-05 21:21:50 +02:00
BONNe 9e245431ac
Merge branch 'master' into develop 2023-01-05 21:20:48 +02:00
gitlocalize-app[bot] a155eb9600
Caveblock TR locale (#87)
* Translate tr.yml via GitLocalize

* Translate tr.yml via GitLocalize

* Translate tr.yml via GitLocalize

Co-authored-by: Wolerus <yakup1907.sen@gmail.com>
Co-authored-by: Over_Brave <soncesurlar@gmail.com>
Co-authored-by: mt-gitlocalize <mt@gitlocalize.com>
2022-12-20 19:29:56 -08:00
BONNe 8ae4fac517 Merge remote-tracking branch 'origin/develop' into develop 2022-11-20 09:56:17 +02:00
BONNe 42a9cf9c7e Rework entity populator.
The new world populator on some engines are multi-threaded, however, minecraft does not allow to remove entities outside main-thread. As entity populator spawned entity and then removed when there were no spot for it, servers crashed.

The issue should be fixed now as I add custom entity bounding box calculator before it is spawned to check if there is place for entity.

Fixes #86
2022-11-20 09:56:06 +02:00
gitlocalize-app[bot] aab7f8eb7c
Translate ru.yml via GitLocalize (#85)
Co-authored-by: Marmur2020 <marmur2020@gmail.com>
2022-10-31 08:26:41 +02:00
gitlocalize-app[bot] 1c04f41257
Translate de.yml via GitLocalize (#84)
Co-authored-by: Patrick <patrick.wassmuth@gmx.de>
2022-10-31 08:26:35 +02:00
BONNe 69b6bc9111
Init 1.17.0 version 2022-05-17 22:17:19 +03:00
BONNe 0cbb775db7
Release 1.16.0 (#81)
* Fixes a 1.18 world generator bug where it generated dirt-grass layers.

Expose 3 world generator options for overworld:
- natural-surface - generates surface that is natural(-ish). Currently, it may be just grass and dirt layers.
- natural-caves - generates caves inside world.
- natural-bedrock - generates natural looking bedrock pattern.

This also fixes a bug with floor and roof config option not working properly.

Fixes https://github.com/BentoBoxWorld/Level/issues/258

* Fixes issue when ores were not generated in correct form. #77
2022-05-17 22:16:21 +03:00
BONNe 3478c0352a Fixes issue when ores were not generated in correct form. #77 2022-05-17 21:22:46 +03:00
BONNe 28f1a57838 Fixes a 1.18 world generator bug where it generated dirt-grass layers.
Expose 3 world generator options for overworld:
- natural-surface - generates surface that is natural(-ish). Currently, it may be just grass and dirt layers.
- natural-caves - generates caves inside world.
- natural-bedrock - generates natural looking bedrock pattern.

This also fixes a bug with floor and roof config option not working properly.

Fixes https://github.com/BentoBoxWorld/Level/issues/258
2022-04-25 01:07:19 +03:00
15 changed files with 916 additions and 263 deletions

View File

@ -11,21 +11,22 @@ jobs:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 16
uses: actions/setup-java@v1
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 16
distribution: 'adopt'
java-version: 17
- name: Cache SonarCloud packages
uses: actions/cache@v1
uses: actions/cache@v3
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven packages
uses: actions/cache@v1
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
@ -34,4 +35,4 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=BentoBoxWorld_CaveBlock
run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar -Dsonar.projectKey=BentoBoxWorld_CaveBlock

View File

@ -3,14 +3,54 @@
[![Discord](https://img.shields.io/discord/272499714048524288.svg?logo=discord)](https://discord.bentobox.world)
[![Build Status](https://ci.codemc.org/buildStatus/icon?job=BentoBoxWorld/CaveBlock)](https://ci.codemc.org/job/BentoBoxWorld/job/CaveBlock/)
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.
# Welcome to CaveBlock for BentoBox!
## Translation
🌌 **Embark on a Subterranean Adventure!**
CaveBlock is an enthralling GameMode addon for BentoBox, designed to take your Minecraft experience to new depths. In this unique underground world, every adventure, challenge, and mystery lies beneath the surface.
<img src=https://github.com/BentoBoxWorld/CaveBlock/assets/4407265/af407f94-1943-4e27-96e1-d3e2ed33330f width="400">
## What is CaveBlock?
CaveBlock transforms the familiar Minecraft landscape into a vast underground realm. As a player, you begin your journey in a modest cave, equipped with only essential items. Your mission is to mine, explore, and expand your subterranean domain.
### Key Features:
- **Start Small, Dream Big:** Begin in a small cave and use your mining skills to expand your territory.
- **Treasure Hunting:** Delve deeper to discover hidden treasures and rare resources.
- **Beware of the Dark:** Monsters lurk in the shadows. Prepare for encounters with creatures of the deep.
- **Build and Craft:** Utilize your resources to craft tools, build structures, and create your own underground empire.
## Getting Started with CaveBlock
CaveBlock is an addon for BentoBox, a Bukkit plugin for Minecraft. To dive into this underground adventure, you'll need to have BentoBox installed on your Minecraft server.
### Installation:
1. **Install BentoBox:** Make sure BentoBox is installed and running on your server.
2. **Download CaveBlock:** Get the CaveBlock addon from the [official download site](https://download.bentobox.world). Or download from the releases in this repo.
3. **Add to BentoBox:** Place the CaveBlock file in your BentoBox addons folder.
4. **Restart Your Server:** Once installed, restart your server to activate CaveBlock.
### Dive Into the Depths!
Are you ready to explore the unknown and carve out your own piece of the underground world? Download CaveBlock now and start your subterranean adventure!
🔍 **Stay Updated:** For the latest updates, follow our [Discord](https://discord.gg/tqQbNA5X9A).
---
*Note: CaveBlock is constantly being updated with new features and improvements. Keep an eye on our release notes for the latest enhancements.*
**Happy Mining!** 🌐🛠️👾
## Translations
Like most BentoBox projects, the CaveBlock Addon is translatable into any language. Everyone can contribute, and translate some parts of the addon into their language via [GitLocalize](https://gitlocalize.com/repo/2968).
If your language is not in the list, please contact the developers via Discord, and it will be added.
## Installation
## Full Installation Instructions
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.

24
pom.xml
View File

@ -43,14 +43,14 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>16</java.version>
<java.version>17</java.version>
<!-- More visible way how to change dependency versions -->
<spigot.version>1.18.1-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>1.19.0</bentobox.version>
<spigot.version>1.20.2-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>2.0.0-SNAPSHOT</bentobox.version>
<!-- Revision variable removes warning about dynamic version -->
<revision>${build.version}-SNAPSHOT</revision>
<!-- This allows to change between versions and snapshots. -->
<build.version>1.15.0</build.version>
<build.version>1.19.0</build.version>
<build.number>-LOCAL</build.number>
<sonar.organization>bentobox-world</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
@ -114,12 +114,6 @@
<version>${spigot.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>plugin-annotations</artifactId>
<version>1.2.3-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>world.bentobox</groupId>
<artifactId>bentobox</artifactId>
@ -189,18 +183,20 @@
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.0.1</version>
<version>3.3.0</version>
<configuration>
<show>public</show>
<failOnError>false</failOnError>
<additionalJOption>-Xdoclint:none</additionalJOption>
<!-- To compile with Java 11, this tag may be required -->
<javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>install</phase>
<goals>
<goal>jar</goal>
</goals>
@ -233,7 +229,7 @@
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.3</version>
<version>0.8.10</version>
<configuration>
<append>true</append>
<excludes>

View File

@ -34,7 +34,9 @@ public class CaveBlock extends GameModeAddon
this.saveDefaultConfig();
this.loadSettings();
this.chunkGenerator = new ChunkGeneratorWorld(this);
this.chunkNormalGenerator = new ChunkGeneratorWorld(this, World.Environment.NORMAL);
this.chunkNetherGenerator = new ChunkGeneratorWorld(this, World.Environment.NETHER);
this.chunkEndGenerator = new ChunkGeneratorWorld(this, World.Environment.THE_END);
// Player Command
this.playerCommand = new DefaultPlayerCommand(this)
@ -137,7 +139,7 @@ public class CaveBlock extends GameModeAddon
// Create the world if it does not exist
this.islandWorld = WorldCreator.name(worldName).
environment(World.Environment.NORMAL).
generator(this.chunkGenerator).
generator(this.chunkNormalGenerator).
createWorld();
// Set spawn rates
setSpawnRates(islandWorld);
@ -162,7 +164,7 @@ public class CaveBlock extends GameModeAddon
{
this.netherWorld = WorldCreator.name(worldName + NETHER).
type(WorldType.FLAT).
generator(this.chunkGenerator).
generator(this.chunkNetherGenerator).
environment(World.Environment.NETHER).
createWorld();
}
@ -187,7 +189,7 @@ public class CaveBlock extends GameModeAddon
{
this.endWorld = WorldCreator.name(worldName + THE_END).
type(WorldType.FLAT).
generator(this.chunkGenerator).
generator(this.chunkEndGenerator).
environment(World.Environment.THE_END).
createWorld();
}
@ -232,7 +234,18 @@ public class CaveBlock extends GameModeAddon
@Override
public @NonNull ChunkGenerator getDefaultWorldGenerator(String worldName, String id)
{
return this.chunkGenerator;
if (worldName.endsWith("_nether"))
{
return this.chunkNetherGenerator;
}
else if (worldName.endsWith("_the_end"))
{
return this.chunkEndGenerator;
}
else
{
return this.chunkNormalGenerator;
}
}
// ---------------------------------------------------------------------
@ -269,6 +282,16 @@ public class CaveBlock extends GameModeAddon
}
/**
* This addon uses the new chunk generation API for the sea bottom
*/
@Override
public boolean isUsesNewChunkGeneration()
{
return true;
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
@ -284,9 +307,19 @@ public class CaveBlock extends GameModeAddon
private Settings settings;
/**
* This stores CaveBlock addon WorldGenerator.
* This stores CaveBlock addon WorldGenerator for overworld.
*/
private ChunkGeneratorWorld chunkGenerator;
private ChunkGeneratorWorld chunkNormalGenerator;
/**
* This stores CaveBlock addon WorldGenerator for the nether.
*/
private ChunkGeneratorWorld chunkNetherGenerator;
/**
* This stores CaveBlock addon WorldGenerator for the end.
*/
private ChunkGeneratorWorld chunkEndGenerator;
// ---------------------------------------------------------------------

View File

@ -1,16 +1,10 @@
package world.bentobox.caveblock;
import org.bukkit.plugin.java.annotation.dependency.Dependency;
import org.bukkit.plugin.java.annotation.plugin.ApiVersion;
import org.bukkit.plugin.java.annotation.plugin.Plugin;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.addons.Pladdon;
@Plugin(name = "Pladdon", version = "1.0")
@ApiVersion(ApiVersion.Target.v1_18)
@Dependency(value = "BentoBox")
public class CaveBlockPladdon extends Pladdon {
@Override

View File

@ -1,12 +1,7 @@
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 java.util.*;
import org.bukkit.Difficulty;
import org.bukkit.GameMode;
@ -333,7 +328,7 @@ public class Settings implements WorldSettings
* @return the defaultIslandFlags object.
*/
@Override
public Map<Flag, Integer> getDefaultIslandFlags()
public Map<String, Integer> getDefaultIslandFlagNames()
{
return defaultIslandFlags;
}
@ -344,7 +339,7 @@ public class Settings implements WorldSettings
* @return the defaultIslandSettings object.
*/
@Override
public Map<Flag, Integer> getDefaultIslandSettings()
public Map<String, Integer> getDefaultIslandSettingNames()
{
return defaultIslandSettings;
}
@ -1179,7 +1174,7 @@ public class Settings implements WorldSettings
* @param defaultIslandFlags the defaultIslandFlags object new value.
*
*/
public void setDefaultIslandFlags(Map<Flag, Integer> defaultIslandFlags)
public void setDefaultIslandFlags(Map<String, Integer> defaultIslandFlags)
{
this.defaultIslandFlags = defaultIslandFlags;
}
@ -1190,7 +1185,7 @@ public class Settings implements WorldSettings
* @param defaultIslandSettings the defaultIslandSettings object new value.
*
*/
public void setDefaultIslandSettings(Map<Flag, Integer> defaultIslandSettings)
public void setDefaultIslandSettings(Map<String, Integer> defaultIslandSettings)
{
this.defaultIslandSettings = defaultIslandSettings;
}
@ -2077,6 +2072,86 @@ public class Settings implements WorldSettings
}
/**
* Is generate caves boolean.
*
* @return the boolean
*/
public boolean isGenerateCaves()
{
return generateCaves;
}
/**
* Sets generate caves.
*
* @param generateCaves the generate caves
*/
public void setGenerateCaves(boolean generateCaves)
{
this.generateCaves = generateCaves;
}
/**
* Is generate natural bedrock boolean.
*
* @return the boolean
*/
public boolean isGenerateNaturalBedrock()
{
return generateNaturalBedrock;
}
/**
* Sets generate natural bedrock.
*
* @param generateNaturalBedrock the generate natural bedrock
*/
public void setGenerateNaturalBedrock(boolean generateNaturalBedrock)
{
this.generateNaturalBedrock = generateNaturalBedrock;
}
/**
* Is generate natural surface boolean.
*
* @return the boolean
*/
public boolean isGenerateNaturalSurface()
{
return generateNaturalSurface;
}
/**
* Sets generate natural surface.
*
* @param generateNaturalSurface the generate natural surface
*/
public void setGenerateNaturalSurface(boolean generateNaturalSurface)
{
this.generateNaturalSurface = generateNaturalSurface;
}
@Override
public Map<Flag, Integer> getDefaultIslandFlags()
{
return Collections.emptyMap();
}
@Override
public Map<Flag, Integer> getDefaultIslandSettings()
{
return Collections.emptyMap();
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
@ -2196,8 +2271,8 @@ public class Settings implements WorldSettings
private int banLimit = -1;
@ConfigComment("")
@ConfigComment("This is cave.. no height... only depth. Max 256.")
@ConfigComment("Should not be less then cave height.")
@ConfigComment("This is cave.. no height... only depth. If depth is set smaller than maximal world height, then area above will be empty.")
@ConfigComment("Should not be less than cave height.")
@ConfigEntry(path = "world.world-depth", needsReset = true)
private int worldDepth = 256;
@ -2212,14 +2287,34 @@ public class Settings implements WorldSettings
private boolean newMaterialGenerator = false;
@ConfigComment("")
@ConfigComment("Make over world roof of bedrock, if false, it will be made from stone")
@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")
@ConfigComment("")
@ConfigComment("Option allows to toggle if world generator should generate natural(-ish) looking surface with dirt and grass blocks.")
@ConfigComment("Enabling this option will ignore roof setting.")
@ConfigComment("Default value is false.")
@ConfigEntry(path = "world.normal.natural-surface", needsReset = true, experimental = true)
private boolean generateNaturalSurface = false;
@ConfigComment("")
@ConfigComment("Option allows to toggle if world generator should generate natural looking caves.")
@ConfigComment("Default value is false.")
@ConfigEntry(path = "world.normal.natural-caves", needsReset = true)
private boolean generateCaves = false;
@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("")
@ConfigComment("Option allows to toggle if world generator should generate natural looking bedrock block patterns.")
@ConfigComment("Enabling this option will ignore floor setting.")
@ConfigComment("Default value is false.")
@ConfigEntry(path = "world.normal.natural-bedrock", needsReset = true)
private boolean generateNaturalBedrock = false;
@ConfigComment("Main block of which world will be generated.")
@ConfigEntry(path = "world.normal.main-block", needsReset = true)
private Material normalMainBlock = Material.STONE;
@ -2353,13 +2448,11 @@ public class Settings implements WorldSettings
@ConfigComment(" SUB-OWNER = 900")
@ConfigComment(" OWNER = 1000")
@ConfigEntry(path = "world.default-cave-flags")
@Adapter(FlagSerializer.class)
private Map<Flag, Integer> defaultIslandFlags = new HashMap<>();
private Map<String, Integer> defaultIslandFlags = new HashMap<>();
@ConfigComment("These are the default settings for new caves")
@ConfigEntry(path = "world.default-cave-settings")
@Adapter(FlagSerializer2.class)
private Map<Flag, Integer> defaultIslandSettings = new HashMap<>();
private Map<String, Integer> defaultIslandSettings = new HashMap<>();
@ConfigComment("These settings/flags are hidden from users")
@ConfigComment("Ops can toggle hiding in-game using SHIFT-LEFT-CLICK on flags in settings")

View File

@ -6,12 +6,10 @@ import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.generator.WorldInfo;
import world.bentobox.caveblock.CaveBlock;
import world.bentobox.caveblock.Settings;
import world.bentobox.caveblock.generators.populators.EntitiesPopulator;
import world.bentobox.caveblock.generators.populators.FlatBiomeProvider;
import world.bentobox.caveblock.generators.populators.MaterialPopulator;
import world.bentobox.caveblock.generators.populators.NewMaterialPopulator;
import world.bentobox.caveblock.generators.populators.*;
import java.util.ArrayList;
import java.util.List;
@ -31,6 +29,7 @@ public class ChunkGeneratorWorld extends ChunkGenerator {
private final CaveBlock addon;
private final Settings settings;
private final List<BlockPopulator> blockPopulators;
private final World.Environment environment;
private BiomeProvider biomeProvider;
private boolean isNewGenerator;
@ -40,12 +39,14 @@ public class ChunkGeneratorWorld extends ChunkGenerator {
/**
* @param addon - CaveBlock object
* @param environment - World environment
*/
public ChunkGeneratorWorld(CaveBlock addon) {
public ChunkGeneratorWorld(CaveBlock addon, World.Environment environment) {
this.addon = addon;
this.settings = addon.getSettings();
this.blockPopulators = new ArrayList<>(2);
this.environment = environment;
reload();
}
@ -53,14 +54,24 @@ public class ChunkGeneratorWorld extends ChunkGenerator {
// Section: Methods
// ---------------------------------------------------------------------
private Material getGroundCeilMaterial(World.Environment environment) {
private Material getGroundRoofMaterial(World.Environment environment) {
return switch (environment) {
case NETHER -> this.settings.isNetherRoof() ? Material.BEDROCK : this.settings.getNetherMainBlock();
case THE_END -> this.settings.isEndRoof() ? Material.BEDROCK : this.settings.getEndMainBlock();
default -> this.settings.isNormalRoof() ? Material.BEDROCK : this.settings.getNormalMainBlock();
};
}
private Material getGroundFloorMaterial(World.Environment environment) {
return switch (environment) {
case NETHER -> this.settings.isNetherFloor() ? Material.BEDROCK : this.settings.getNetherMainBlock();
case THE_END -> this.settings.isEndFloor() ? Material.BEDROCK : this.settings.getEndMainBlock();
default -> this.settings.isNormalFloor() ? Material.BEDROCK : this.settings.getNormalMainBlock();
};
}
private Material getBaseMaterial(World.Environment environment) {
return switch (environment) {
case NETHER -> this.settings.getNetherMainBlock();
@ -70,19 +81,35 @@ public class ChunkGeneratorWorld extends ChunkGenerator {
}
@Override
public void generateBedrock(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, ChunkData chunkData) {
final int minHeight = worldInfo.getMinHeight();
Material material = getGroundCeilMaterial(worldInfo.getEnvironment());
chunkData.setRegion(0, minHeight, 0, 16, minHeight + 1, 16, material);
public void generateBedrock(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, ChunkData chunkData)
{
if (!this.shouldGenerateBedrock())
{
final int minHeight = worldInfo.getMinHeight();
Material material = this.getGroundFloorMaterial(worldInfo.getEnvironment());
chunkData.setRegion(0, minHeight, 0, 16, minHeight + 1, 16, material);
}
else
{
// Apparently default surface generation does not include 0 bedrock layer.
final int minHeight = worldInfo.getMinHeight();
chunkData.setRegion(0, minHeight, 0, 16, minHeight + 1, 16, Material.BEDROCK);
}
}
@Override
public void generateSurface(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, ChunkData chunkData) {
final int worldHeight = Math.min(worldInfo.getMaxHeight(), this.settings.getWorldDepth());
Material material = getGroundCeilMaterial(worldInfo.getEnvironment());
chunkData.setRegion(0, worldHeight - 1, 0, 16, worldHeight, 16, material);
public void generateSurface(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, ChunkData chunkData)
{
if (!this.shouldGenerateSurface())
{
final int worldHeight = Math.min(worldInfo.getMaxHeight(), this.settings.getWorldDepth());
Material material = this.getGroundRoofMaterial(worldInfo.getEnvironment());
chunkData.setRegion(0, worldHeight - 1, 0, 16, worldHeight, 16, material);
}
}
@Override
public void generateNoise(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, ChunkData chunkData) {
final int minHeight = worldInfo.getMinHeight();
@ -127,18 +154,22 @@ public class ChunkGeneratorWorld extends ChunkGenerator {
}
@Override
public boolean shouldGenerateSurface() {
return true;
public boolean shouldGenerateSurface()
{
// Surface generation should happen only in overworld. Nether and end worlds does not have surface.
return this.environment.equals(World.Environment.NORMAL) && this.settings.isGenerateNaturalSurface();
}
@Override
public boolean shouldGenerateBedrock() {
return true;
// Bedrock generation should happen only in overworld. Nether and end worlds does not have nice bedrock layers.
return this.environment.equals(World.Environment.NORMAL) && this.settings.isGenerateNaturalBedrock();
}
@Override
public boolean shouldGenerateCaves() {
return this.isNewGenerator;
// Cave generation should happen only in overworld. Nether and end worlds does not have nice cave layers.
return this.environment.equals(World.Environment.NORMAL) && this.settings.isGenerateCaves();
}
/**

View File

@ -11,6 +11,8 @@ import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.LimitedRegion;
import org.bukkit.generator.WorldInfo;
import org.bukkit.util.BoundingBox;
import org.eclipse.jdt.annotation.NonNull;
import world.bentobox.bentobox.util.Pair;
import world.bentobox.caveblock.CaveBlock;
import world.bentobox.caveblock.Utils;
@ -95,7 +97,7 @@ public class EntitiesPopulator extends BlockPopulator {
* @param limitedRegion Region where population operates.
*/
@Override
public void populate(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, LimitedRegion limitedRegion) {
public void populate(WorldInfo worldInfo, @NonNull Random random, int chunkX, int chunkZ, @NonNull LimitedRegion limitedRegion) {
int minHeight = worldInfo.getMinHeight();
int height = Math.min(worldInfo.getMaxHeight(), worldHeight) - 1;
@ -168,29 +170,22 @@ public class EntitiesPopulator extends BlockPopulator {
if (!limitedRegion.isInRegion(location)) return;
if (!limitedRegion.getType(location).equals(originalMaterial)) return;
Entity entity = limitedRegion.spawnEntity(location, entityType);
if (entity instanceof LivingEntity livingEntity) {
livingEntity.setAI(hasAI);
livingEntity.setRemoveWhenFarAway(false);
}
BoundingBox bb = this.getEntityBoundingBox(entityType, location);
BoundingBox bb = entity.getBoundingBox();
for (int x = (int) Math.floor(bb.getMinX()); x < bb.getMaxX(); x++) {
for (int z = (int) Math.floor(bb.getMinZ()); z < bb.getMaxZ(); z++) {
int y = (int) Math.floor(bb.getMinY());
if (!limitedRegion.isInRegion(x, y, z)) {
entity.remove();
return;
}
for (; y <= bb.getMaxY(); y++) {
if (addon.getSettings().isDebug()) {
addon.log("DEBUG: Entity spawn: " + worldInfo.getName() + " " + x + " " + y + " " + z + " " + entity.getType());
addon.log("DEBUG: Entity spawn: " + worldInfo.getName() + " " + x + " " + y + " " + z + " " + entityType);
}
if (!limitedRegion.isInRegion(x, y, z) || !limitedRegion.getType(x, y, z).equals(originalMaterial)) {
// Cannot place entity
entity.remove();
return;
}
limitedRegion.setType(x, y, z, WATER_ENTITIES.contains(entityType) ? Material.WATER : Material.AIR);
@ -201,8 +196,86 @@ public class EntitiesPopulator extends BlockPopulator {
}
}
}
Entity entity = limitedRegion.spawnEntity(location, entityType);
if (entity instanceof LivingEntity livingEntity)
{
livingEntity.setAI(hasAI);
livingEntity.setRemoveWhenFarAway(false);
}
}
/**
* This is manual bounding box calculation base on entity type.
* @param entityType Entity type which bounding box should be created.
* @param location Location of the bounding box.
* @return Approximate bounding box of the entity type.
*/
private BoundingBox getEntityBoundingBox(EntityType entityType, Location location)
{
BoundingBox boundingBox = new BoundingBox();
// Set bounding box to 1 for all entities
boundingBox.expand(1);
// Shift to correct location.
boundingBox.shift(location);
switch (entityType)
{
// Turtles base size is 1.1
case TURTLE -> boundingBox.expand(-0.05, 0, -0.05, 0.05, 0, 0.05);
// Panda base size is 1.3 and height is 1.25
case PANDA -> boundingBox.expand(-0.15, 0, -0.15, 0.15, 0.25, 0.15);
// Sheep height is 1.3
case SHEEP -> boundingBox.expand(0, 0, 0, 0, 0.3, 0);
// Cow height is 1.4
case COW, MUSHROOM_COW -> boundingBox.expand(0, 0, 0, 0, 0.4, 0);
// Polar Bear base size is 1.3 and height is 1.4
case POLAR_BEAR -> boundingBox.expand(-0.15, 0, -0.15, 0.15, 0.4, 0.15);
// Horse base size is 1.3964
case HORSE, ZOMBIE_HORSE, SKELETON_HORSE -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 0.6, 0.2);
// Llama height is 1.875
case LLAMA -> boundingBox.expand(0, 0, 0, 0, 0.875, 0);
// Ravager base size is 1.95 and height is 2.2
case RAVAGER -> boundingBox.expand(-0.48, 0, -0.48, 0.48, 1.2, 0.48);
// Spider base size is 1.4
case SPIDER -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 0, 0.2);
// Creeper height 1.7
case CREEPER -> boundingBox.expand(0, 0, 0, 0, 0.7, 0);
// Blaze height 1.8
case BLAZE -> boundingBox.expand(0, 0, 0, 0, 0.8, 0);
// Zombie, evoker, villager, husk, witch, vindicator, illusioner, drowned, pigman, villager and pillager height is 1.95
case ZOMBIE, EVOKER, VILLAGER, HUSK, WITCH, VINDICATOR, ILLUSIONER, DROWNED, PIGLIN, PIGLIN_BRUTE, ZOMBIFIED_PIGLIN, ZOMBIE_VILLAGER, PILLAGER, WANDERING_TRADER ->
boundingBox.expand(0, 0, 0, 0, 0.95, 0);
// Skeletons height is 1.99
case SKELETON, STRAY -> boundingBox.expand(0, 0, 0, 0, 0.99, 0);
// Elder Guardians base height is 2
case ELDER_GUARDIAN -> boundingBox.expand(-0.5, 0, -0.5, 0.5, 1, 0.5);
// Slimes are up to 2.04
case SLIME -> boundingBox.expand(-0.5, 0, -0.5, 0.5, 1, 0.5);
// Wither skeletons height is 2.4
case WITHER_SKELETON -> boundingBox.expand(0, 0, 0, 0, 1.4, 0);
// Wither height is 3.5
case WITHER -> boundingBox.expand(0, 0, 0, 0, 2.5, 0);
// Enderman height is 2.9
case ENDERMAN -> boundingBox.expand(0, 0, 0, 0, 1.9, 0);
// Ghast base size is 4
case GHAST -> boundingBox.expand(-2, 0, -2, 2, 3, 2);
// Iron Golem base size is 1.4 and height is 2.7
case IRON_GOLEM -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 1.7, 0.2);
// Snowman height is 1.9
case SNOWMAN -> boundingBox.expand(0, 0, 0, 0, 0.9, 0);
// Hoglin base size is 1.4 and height is 1.3965
case HOGLIN, ZOGLIN -> boundingBox.expand(-0.2, 0, -0.2, 0.2, 0.4, 0.2);
// Warden height is 2.9
case WARDEN -> boundingBox.expand(0, 0, 0, 0, 1.9, 0);
}
return boundingBox;
}
// ---------------------------------------------------------------------
// Section: Private Classes
// ---------------------------------------------------------------------

View File

@ -1,16 +1,22 @@
package world.bentobox.caveblock.generators.populators;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.LimitedRegion;
import org.bukkit.generator.WorldInfo;
import world.bentobox.caveblock.Utils;
import world.bentobox.caveblock.generators.Ore;
import java.util.*;
/**
* @author tastybento
*/
@ -19,89 +25,102 @@ public class NewMaterialPopulator extends BlockPopulator {
private static final Map<World.Environment, List<Ore>> ORES;
static {
Map<World.Environment, List<Ore>> ores = new EnumMap<>(World.Environment.class);
// Source https://minecraft.fandom.com/wiki/Blob
List<Ore> worldOres = new ArrayList<>();
worldOres.add(new Ore(-64, 16, Material.DIAMOND_ORE, 1, 10, true));
worldOres.add(new Ore(-64, 64, Material.LAPIS_ORE, 1, 7, true));
worldOres.add(new Ore(-64, 30, Material.GOLD_ORE, 2, 9, true));
worldOres.add(new Ore(0, 16, Material.TUFF, 2, 33, false));
worldOres.add(new Ore(-64, 16, Material.REDSTONE_ORE, 8, 8, true));
worldOres.add(new Ore(0, 16, Material.GRAVEL, 8, 33, false));
worldOres.add(new Ore(0, 79, Material.GRANITE, 5, 33, false));
worldOres.add(new Ore(0, 79, Material.ANDESITE, 5, 33, false));
worldOres.add(new Ore(0, 79, Material.DIORITE, 5, 33, false));
worldOres.add(new Ore(32, 320, Material.EMERALD_ORE, 11, 1, true));
worldOres.add(new Ore(95, 136, Material.COAL_ORE, 20, 17, false));
worldOres.add(new Ore(0, 96, Material.COPPER_ORE, 20, 9, true));
worldOres.add(new Ore(-64, 320, Material.IRON_ORE, 20, 9, true));
worldOres.add(new Ore(-64, 320, Material.CAVE_AIR, 8, 33, false));
ores.put(World.Environment.NORMAL, worldOres);
List<Ore> netherOres = new ArrayList<>();
netherOres.add(new Ore(1, 22, Material.ANCIENT_DEBRIS, 1, 5, true));
netherOres.add(new Ore(-64, 30, Material.NETHER_GOLD_ORE, 2, 9, true));
netherOres.add(new Ore(0, 16, Material.GRAVEL, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.BASALT, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.BLACKSTONE, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.FIRE, 8, 33, false));
netherOres.add(new Ore(200, 320, Material.GLOWSTONE, 8, 33, false));
netherOres.add(new Ore(-64, 320, Material.CAVE_AIR, 8, 33, false));
netherOres.add(new Ore(-64, 320, Material.LAVA, 8, 33, false));
netherOres.add(new Ore(0, 16, Material.MAGMA_BLOCK, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.CRIMSON_FUNGUS, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.WARPED_FUNGUS, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.CRIMSON_NYLIUM, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.WARPED_NYLIUM, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.SHROOMLIGHT, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.CRIMSON_STEM, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.WARPED_STEM, 8, 33, false));
netherOres.add(new Ore(-64, 34, Material.SOUL_SOIL, 20, 17, false));
netherOres.add(new Ore(0, 96, Material.NETHER_QUARTZ_ORE, 20, 9, true));
netherOres.add(new Ore(-64, 320, Material.BONE_BLOCK, 20, 9, true));
ores.put(World.Environment.NETHER, netherOres);
List<Ore> endOres = new ArrayList<>();
endOres.add(new Ore(32, 320, Material.PURPUR_BLOCK, 11, 1, true));
endOres.add(new Ore(95, 136, Material.OBSIDIAN, 20, 17, false));
endOres.add(new Ore(-64, 320, Material.CAVE_AIR, 8, 33, false));
ores.put(World.Environment.THE_END, endOres);
ORES = Collections.unmodifiableMap(ores);
Map<World.Environment, List<Ore>> ores = new EnumMap<>(World.Environment.class);
// Source https://minecraft.fandom.com/wiki/Blob
List<Ore> worldOres = new ArrayList<>();
worldOres.add(new Ore(-64, 7, Material.DEEPSLATE_DIAMOND_ORE, 1, 10, true));
worldOres.add(new Ore(7, 16, Material.DIAMOND_ORE, 1, 10, true));
worldOres.add(new Ore(-64, 7, Material.DEEPSLATE_LAPIS_ORE, 1, 7, true));
worldOres.add(new Ore(7, 64, Material.LAPIS_ORE, 1, 7, true));
worldOres.add(new Ore(-64, 7, Material.DEEPSLATE_GOLD_ORE, 2, 9, true));
worldOres.add(new Ore(7, 30, Material.GOLD_ORE, 2, 9, true));
worldOres.add(new Ore(0, 16, Material.TUFF, 2, 33, false));
worldOres.add(new Ore(-64, 7, Material.DEEPSLATE_REDSTONE_ORE, 8, 8, true));
worldOres.add(new Ore(7, 16, Material.REDSTONE_ORE, 8, 8, true));
worldOres.add(new Ore(0, 16, Material.GRAVEL, 8, 33, false));
worldOres.add(new Ore(0, 79, Material.GRANITE, 5, 33, false));
worldOres.add(new Ore(0, 79, Material.ANDESITE, 5, 33, false));
worldOres.add(new Ore(0, 79, Material.DIORITE, 5, 33, false));
worldOres.add(new Ore(32, 320, Material.EMERALD_ORE, 11, 1, true));
worldOres.add(new Ore(95, 136, Material.COAL_ORE, 20, 17, false));
worldOres.add(new Ore(0, 7, Material.DEEPSLATE_COPPER_ORE, 20, 9, true));
worldOres.add(new Ore(7, 96, Material.COPPER_ORE, 20, 9, true));
worldOres.add(new Ore(-64, 7, Material.DEEPSLATE_IRON_ORE, 20, 9, true));
worldOres.add(new Ore(7, 320, Material.IRON_ORE, 20, 9, true));
worldOres.add(new Ore(-64, 320, Material.CAVE_AIR, 8, 33, false));
ores.put(World.Environment.NORMAL, worldOres);
List<Ore> netherOres = new ArrayList<>();
netherOres.add(new Ore(1, 22, Material.ANCIENT_DEBRIS, 1, 5, true));
netherOres.add(new Ore(-64, 30, Material.NETHER_GOLD_ORE, 2, 9, true));
netherOres.add(new Ore(0, 16, Material.GRAVEL, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.BASALT, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.BLACKSTONE, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.FIRE, 8, 33, false));
netherOres.add(new Ore(200, 320, Material.GLOWSTONE, 8, 33, false));
netherOres.add(new Ore(-64, 320, Material.CAVE_AIR, 8, 33, false));
netherOres.add(new Ore(-64, 320, Material.LAVA, 8, 33, false));
netherOres.add(new Ore(0, 16, Material.MAGMA_BLOCK, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.CRIMSON_FUNGUS, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.WARPED_FUNGUS, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.CRIMSON_NYLIUM, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.WARPED_NYLIUM, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.SHROOMLIGHT, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.CRIMSON_STEM, 8, 33, false));
netherOres.add(new Ore(0, 320, Material.WARPED_STEM, 8, 33, false));
netherOres.add(new Ore(-64, 34, Material.SOUL_SOIL, 20, 17, false));
netherOres.add(new Ore(0, 96, Material.NETHER_QUARTZ_ORE, 20, 9, true));
netherOres.add(new Ore(-64, 320, Material.BONE_BLOCK, 20, 9, true));
ores.put(World.Environment.NETHER, netherOres);
List<Ore> endOres = new ArrayList<>();
endOres.add(new Ore(32, 320, Material.PURPUR_BLOCK, 11, 1, true));
endOres.add(new Ore(95, 136, Material.OBSIDIAN, 20, 17, false));
endOres.add(new Ore(-64, 320, Material.CAVE_AIR, 8, 33, false));
ores.put(World.Environment.THE_END, endOres);
ORES = Collections.unmodifiableMap(ores);
}
private final int worldDepth;
/**
* @param worldDepth - Depth. If depth is set smaller than the world height,
* then the area above will be empty. Should not be less than
* cave height.
*/
public NewMaterialPopulator(int worldDepth) {
this.worldDepth = worldDepth;
this.worldDepth = worldDepth;
}
@Override
public void populate(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, LimitedRegion limitedRegion) {
final int worldHeight = Math.min(worldInfo.getMaxHeight(), this.worldDepth);
for (int y = worldInfo.getMinHeight(); y < worldHeight - 1; y++) {
for (Ore o : ORES.get(worldInfo.getEnvironment())) {
if (y > o.minY() && y < o.maxY() && random.nextInt(100) <= o.chance()) {
pasteBlob(worldInfo, random, chunkX, chunkZ, limitedRegion, y, o);
if (o.cont()) {
break;
}
}
}
}
final int worldHeight = Math.min(worldInfo.getMaxHeight(), this.worldDepth);
for (int y = worldInfo.getMinHeight() + 1; y < worldHeight - 1; y++) {
for (Ore o : ORES.get(worldInfo.getEnvironment())) {
if (y > o.minY() && y < o.maxY() && random.nextInt(100) <= o.chance()) {
pasteBlob(worldInfo, random, chunkX, chunkZ, limitedRegion, y, o);
if (o.cont()) {
break;
}
}
}
}
}
private void pasteBlob(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, LimitedRegion limitedRegion, int y, Ore o) {
int offset = random.nextInt(16);
for (int x = Math.max(0, offset - BLOB_SIZE); x < Math.min(16, offset + BLOB_SIZE); x++) {
for (int z = Math.max(0, offset - BLOB_SIZE); z < Math.min(16, offset + BLOB_SIZE); z++) {
for (int yy = Math.max(worldInfo.getMinHeight(), y - BLOB_SIZE); yy < Math.min(worldInfo.getMaxHeight(), y + BLOB_SIZE); yy++) {
Location location = Utils.getLocationFromChunkLocation(x, yy, z, chunkX, chunkZ);
if (!limitedRegion.isInRegion(location)) {
continue;
}
if (limitedRegion.getType(location).isSolid() && random.nextBoolean()) {
limitedRegion.setType(location, o.material());
}
}
}
}
private void pasteBlob(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, LimitedRegion limitedRegion,
int y, Ore o) {
int offset = random.nextInt(16);
for (int x = Math.max(0, offset - BLOB_SIZE); x < Math.min(16, offset + BLOB_SIZE); x++) {
for (int z = Math.max(0, offset - BLOB_SIZE); z < Math.min(16, offset + BLOB_SIZE); z++) {
for (int yy = Math.max(worldInfo.getMinHeight() + 1, y - BLOB_SIZE); yy < Math
.min(worldInfo.getMaxHeight() - 1, y + BLOB_SIZE); yy++) {
Location location = Utils.getLocationFromChunkLocation(x, yy, z, chunkX, chunkZ);
if (!limitedRegion.isInRegion(location)) {
continue;
}
if (limitedRegion.getType(location).isSolid() && random.nextBoolean()) {
limitedRegion.setType(location, o.material());
}
}
}
}
}
}

View File

@ -1,7 +1,7 @@
name: CaveBlock
main: world.bentobox.caveblock.CaveBlock
version: ${version}${build.number}
api-version: 1.19.0
api-version: 1.23.0
metrics: true
repository: "BentoBoxWorld/CaveBlock"
icon: "STONE_PICKAXE"

View File

@ -1,4 +1,4 @@
# CaveBlock Configuration {$version}
# CaveBlock Configuration 1.15.0-SNAPSHOT-LOCAL
caveblock:
command:
# Cave Command. What command users will run to access their cave.
@ -9,12 +9,12 @@ caveblock:
admin: cbadmin cba
# The default action for new player command call.
# Sub-command of main player command that will be run on first player command call.
# By default, it is the sub-command 'create'.
# By default it is sub-command 'create'.
# Added since 1.13.0.
new-player-action: create
# The default action for player command.
# Sub-command of main player command that will be run on each player command call.
# By default, it is the sub-command 'go'.
# By default it is sub-command 'go'.
# Added since 1.13.0.
default-action: go
world:
@ -81,9 +81,9 @@ world:
# 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 cave height.
#
# This is cave.. no height... only depth. If depth is set smaller than maximal world height, then area above will be empty.
# Should not be less than cave height.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
world-depth: 256
# This indicate how many times block should be tried to generate.
@ -95,13 +95,31 @@ world:
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
use-new-material-generator: false
normal:
#
# Make over world roof of bedrock, if false, it will be made from stone
#
# Make over world roof of bedrock, if false, it will be made from stone.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
roof: true
# Make over world floor of bedrock, if false, it will be made from stone
#
# Option allows to toggle if world generator should generate natural(-ish) looking surface with dirt and grass blocks.
# Enabling this option will ignore roof setting.
# Default value is false.
# /!\ This feature is experimental and might not work as expected or might not work at all.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
natural-surface: false
#
# Option allows to toggle if world generator should generate natural looking caves.
# Default value is false.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
natural-caves: false
# Make over world floor of bedrock, if false, it will be made from stone.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
floor: true
#
# Option allows to toggle if world generator should generate natural looking bedrock block patterns.
# Enabling this option will ignore floor setting.
# Default value is false.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
natural-bedrock: false
# Main block of which world will be generated.
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
main-block: STONE
@ -116,24 +134,24 @@ world:
# where max amount in pack are 5 per each subchunk!
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
blocks:
- 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
- MATERIAL:CLAY:10:6
- MATERIAL:DIRT:20:10
- MATERIAL:GRAVEL:40:6
- MATERIAL:GRANITE:40:10
- MATERIAL:ANDESITE:20:10
- MATERIAL:DIORITE:30:8
- ENTITY:ZOMBIE:10:1
- ENTITY:ENDERMAN:10:1
- ENTITY:SKELETON:10:1
- ENTITY:CREEPER:1:1
- ENTITY:DOLPHIN:1:1
- ENTITY:BAT:10:1
- ENTITY:CAVE_SPIDER:10:1
- 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
- MATERIAL:CLAY:10:6
- MATERIAL:DIRT:20:10
- MATERIAL:GRAVEL:40:6
- MATERIAL:GRANITE:40:10
- MATERIAL:ANDESITE:20:10
- MATERIAL:DIORITE:30:8
- ENTITY:ZOMBIE:10:1
- ENTITY:ENDERMAN:10:1
- ENTITY:SKELETON:10:1
- ENTITY:CREEPER:1:1
- ENTITY:DOLPHIN:1:1
- ENTITY:BAT:10:1
- ENTITY:CAVE_SPIDER:10: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.
@ -172,18 +190,19 @@ world:
# where max amount in pack are 5 per each subchunk!
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
blocks:
- MATERIAL:NETHER_QUARTZ_ORE:30:5
- MATERIAL:SOUL_SAND:40:10
- MATERIAL:MAGMA_BLOCK:10:3
- MATERIAL:GLOWSTONE:20:8
- MATERIAL:NETHER_BRICKS: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
- MATERIAL:NETHER_QUARTZ_ORE:30:5
- MATERIAL:SOUL_SAND:40:10
- MATERIAL:MAGMA_BLOCK:10:3
- MATERIAL:GLOWSTONE:20:8
- MATERIAL:NETHER_BRICKS: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
# This option indicates if nether portals should be linked via dimensions.
# Option will simulate vanilla portal mechanics that links portals together or creates a new portal, if there is not a portal in other dimension.
# Option will simulate vanilla portal mechanics that links portals together
# or creates a new portal, if there is not a portal in that dimension.
create-and-link-portals: false
end:
generate: true
@ -214,16 +233,17 @@ world:
# where max amount in pack are 5 per each subchunk!
# /!\ BentoBox currently does not support changing this value mid-game. If you do need to change it, do a full reset of your databases and worlds.
blocks:
- ENTITY:SHULKER:0.2:1
- MATERIAL:OBSIDIAN:1:1
- MATERIAL:CHORUS_PLANT:1:3
# This option indicates if obsidian platform in the end should be generated when player enters the end world.
- ENTITY:SHULKER:0.2:1
- MATERIAL:OBSIDIAN:1:1
- MATERIAL:CHORUS_PLANT:1:3
# This option indicates if obsidian platform in the end should be generated
# when player enters the end world.
create-obsidian-platform: false
# Mob white list - these mobs will NOT be removed when logging in or doing /cave
remove-mobs-whitelist:
- WITHER
- ENDERMAN
- ZOMBIE_VILLAGER
- ZOMBIE_VILLAGER
- WITHER
- ENDERMAN
# World flags. These are boolean settings for various flags for this world
flags:
CREEPER_DAMAGE: true
@ -232,6 +252,7 @@ world:
ISLAND_RESPAWN: true
CREEPER_GRIEFING: false
COARSE_DIRT_TILLING: true
PETS_STAY_AT_HOME: true
ENDERMAN_GRIEFING: true
CLEAN_SUPER_FLAT: false
CHEST_DAMAGE: false
@ -241,6 +262,7 @@ world:
ENDERMAN_DEATH_DROP: true
LIQUIDS_FLOWING_OUT: false
OFFLINE_REDSTONE: true
REMOVE_END_EXIT_ISLAND: true
OFFLINE_GROWTH: true
REMOVE_MOBS: true
ENDER_CHEST: false
@ -272,15 +294,15 @@ world:
END_PORTAL: 500
BREEDING: 500
HURT_VILLAGERS: 500
TURTLE_EGGS: 500
FROST_WALKER: 500
TURTLE_EGGS: 500
COLLECT_LAVA: 500
BREAK_SPAWNERS: 500
LEVER: 500
ELYTRA: 0
CAKE: 500
HURT_MONSTERS: 0
RIDING: 500
HURT_MONSTERS: 0
NAME_TAG: 500
ARMOR_STAND: 500
TRADING: 0
@ -301,17 +323,17 @@ world:
COMMAND_RANKS: 500
BEACON: 500
TRAPDOOR: 500
EXPERIENCE_BOTTLE_THROWING: 500
PRESSURE_PLATE: 0
EXPERIENCE_BOTTLE_THROWING: 500
DYE: 500
ITEM_FRAME: 500
PLACE_BLOCKS: 500
CRAFTING: 0
ENCHANTING: 0
SHEARING: 500
ENCHANTING: 0
BOAT: 500
BED: 500
SPAWN_EGGS: 500
BED: 500
MILKING: 0
DISPENSER: 500
GATE: 0
@ -322,8 +344,8 @@ world:
BREAK_BLOCKS: 500
CHORUS_FRUIT: 500
CONTAINER: 500
POTION_THROWING: 500
JUKEBOX: 500
POTION_THROWING: 500
# These are the default settings for new caves
default-cave-settings:
PVP_END: false
@ -335,33 +357,33 @@ world:
MONSTER_NATURAL_SPAWN: true
FIRE_IGNITE: true
FIRE_SPREAD: true
ANIMAL_SPAWNERS_SPAWN: true
FIRE_BURNING: true
ANIMAL_SPAWNERS_SPAWN: true
PVP_OVERWORLD: false
# These settings/flags are hidden from users
# Ops can toggle hiding in-game using SHIFT-LEFT-CLICK on flags in settings
hidden-flags: []
# Visitor banned commands - Visitors to caves cannot use these commands in this world
visitor-banned-commands:
- spawner
- spawnmob
- spawner
- spawnmob
# Falling banned commands - players cannot use these commands when falling
# if the PREVENT_TELEPORT_WHEN_FALLING world setting flag is active
falling-banned-commands:
- warp
- spawn
- warp
- spawn
cave:
# 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 coop rank members per cave
# Players can have the caveblock.coop.maxsize.<number> permission to be bigger but
# permission size cannot be less than the default below.
# permission size cannot be less than the default below.
# Added since 1.13.0.
max-coop-size: 4
# Default maximum number of trusted rank members per cave
# Players can have the caveblock.trust.maxsize.<number> permission to be bigger but
# permission size cannot be less than the default below.
# permission size cannot be less than the default below.
# Added since 1.13.0.
max-trusted-size: 4
# Default maximum number of homes a player can have. Min = 1
@ -461,10 +483,46 @@ cave:
create-missing-nether-end-caves: false
commands:
# List of commands to run when a player joins an cave or creates one.
# These commands are run by the console, unless otherwise stated using the [SUDO] prefix,
# in which case they are executed by the player.
#
# Available placeholders for the commands are the following:
# * [name]: name of the player
#
# Here are some examples of valid commands to execute:
# * '[SUDO] bbox version'
# * 'bsbadmin deaths set [player] 0'
#
# Note that player-executed commands might not work, as these commands can be run with said player being offline.
# Added since 1.8.0.
on-join: []
# List of commands to run when a player leaves a cave, resets his cave or gets kicked from it.
# These commands are run by the console, unless otherwise stated using the [SUDO] prefix,
# in which case they are executed by the player.
#
# Available placeholders for the commands are the following:
# * [name]: name of the player
#
# Here are some examples of valid commands to execute:
# * '[SUDO] bbox version'
# * 'bsbadmin deaths set [player] 0'
#
# Note that player-executed commands might not work, as these commands can be run with said player being offline.
# Added since 1.8.0.
on-leave: []
# Returns a list of commands that should be executed when the player respawns after death if Flags.ISLAND_RESPAWN is true.
# List of commands that should be executed when the player respawns after death if Flags.ISLAND_RESPAWN is true.
# These commands are run by the console, unless otherwise stated using the [SUDO] prefix,
# in which case they are executed by the player.
#
# Available placeholders for the commands are the following:
# * [name]: name of the player
#
# Here are some examples of valid commands to execute:
# * '[SUDO] bbox version'
# * 'bsbadmin deaths set [player] 0'
#
# Note that player-executed commands might not work, as these commands can be run with said player being offline.
# Added since 1.14.0.
on-respawn: []
sethome:
nether:
@ -488,9 +546,9 @@ protection:
# Geo restrict mobs.
# Mobs that exit the cave space where they were spawned will be removed.
geo-limit-settings:
- GHAST
- BAT
- BLAZE
- GHAST
- BAT
- BLAZE
# CaveBlock blocked mobs.
# List of mobs that should not spawn in the CaveBlock.
# Added since 1.13.0.
@ -498,30 +556,30 @@ protection:
# 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
- 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
do-not-edit-these-settings:
# These settings should not be edited
reset-epoch: 0

View File

@ -18,6 +18,8 @@ caveblock:
no-safe-location-found: "&cKann keinen sicheren Ort finden, an den du dich in
der Höhle teleportieren kannst."
not-owner: "&cDu bist nicht der Besitzer deiner Höhle!"
cave-limit-reached: "&c Du hast die Spitze deiner Höhle erreicht. Höher geht
nicht!"
commands:
admin:
team:
@ -81,7 +83,7 @@ caveblock:
Höhlen im Müll
setrange:
description: Stellen Sie die Reichweite der Spielerhöhle ein
range-updated: Höhlenbereich auf [Nummer] aktualisiert
range-updated: Höhlenbereich auf [number] aktualisiert
tp:
description: teleportiere zur Höhle eines Spielers
getrank:
@ -141,15 +143,15 @@ caveblock:
description: Lass einen Spieler in deiner Höhle ranken
uncoop:
you-are-no-longer-a-coop-member: "&cSie sind kein Coop-Mitglied mehr in
der Höhle von [Name]"
der Höhle von [name]"
all-members-logged-off: "& cAlle Höhlenmitglieder haben sich abgemeldet,
sodass Sie nicht länger ein Coop-Mitglied der Höhle von [Name] sind"
sodass Sie nicht länger ein Coop-Mitglied der Höhle von [name] sind "
trust:
description: Gib einem Spieler einen vertrauenswürdigen Rang in deiner Höhle
invite:
description: Lade einen Spieler ein, sich deiner Höhle anzuschließen
name-has-invited-you: "& a [Name] hat dich eingeladen, dich ihrer Höhle
anzuschließen."
name-has-invited-you: "& a [name] hat dich eingeladen, dich ihrer Höhle
anzuschließen. "
you-will-lose-your-island: "& WARNUNG! Sie werden Ihre Höhle verlieren,
wenn Sie akzeptieren!"
errors:
@ -164,16 +166,16 @@ caveblock:
reject:
you-rejected-invite: "& aSie lehnten die Einladung ab, sich einer Höhle
anzuschließen."
name-rejected-your-invite: "& c [Name] hat deine Höhleneinladung abgelehnt!"
name-rejected-your-invite: "& c [name] hat deine Höhleneinladung abgelehnt!"
cancel:
description: storniere die ausstehende Einladung, dich deiner Höhle anzuschließen
leave:
description: Verlasse deine Höhle
left-your-island: "& c [Name] & spalte deine Höhle"
left-your-island: "& c [name] & spalte deine Höhle"
kick:
description: Entferne ein Mitglied aus deiner Höhle
owner-kicked: "& cDer Besitzer hat dich aus der Höhle geworfen!"
success: "& b [Name] & wurde aus deiner Höhle geworfen."
success: "& b [name] & wurde aus deiner Höhle geworfen."
demote:
description: Herabstufen eines Spielers in Ihrer Höhle um einen Rang
promote:
@ -182,19 +184,19 @@ caveblock:
description: Übertragen Sie Ihren Höhlenbesitz auf ein Mitglied
errors:
target-is-not-member: "& cDieser Spieler ist nicht Teil Ihres Höhlenteams!"
name-is-the-owner: "& a [Name] ist jetzt der Höhlenbesitzer!"
name-is-the-owner: "& a [name] ist jetzt der Höhlenbesitzer!"
you-are-the-owner: "& aSie sind jetzt der Höhlenbesitzer!"
ban:
description: verbanne einen Spieler aus deiner Höhle
cannot-ban-more-players: "& cSie haben das Sperrlimit erreicht, können Sie
keine Spieler mehr aus Ihrer Höhle verbannen."
player-banned: "& b [Name] & c ist jetzt aus deiner Höhle verbannt."
owner-banned-you: "& b [Name] & c hat dich aus ihrer Höhle verbannt!"
player-banned: "& b [name] & c ist jetzt aus deiner Höhle verbannt."
owner-banned-you: "& b [name] & c hat dich aus ihrer Höhle verbannt!"
you-are-banned: "& bSie sind aus dieser Höhle verbannt!"
unban:
description: Entbinde einen Spieler aus deiner Höhle
player-unbanned: "& b [Name] & a ist jetzt nicht mehr in deiner Höhle verboten."
you-are-unbanned: "& b [Name] & a verbannt dich aus ihrer Höhle!"
player-unbanned: "& b [name] & a ist jetzt nicht mehr in deiner Höhle verboten."
you-are-unbanned: "& b [name] & a verbannt dich aus ihrer Höhle!"
banlist:
noone: "& aKeine Höhle ist in dieser Höhle verboten."
settings:
@ -202,7 +204,7 @@ caveblock:
expel:
description: Vertreibe einen Spieler aus deiner Höhle
not-on-island: "& cDieser Spieler ist nicht in deiner Höhle!"
player-expelled-you: "& b [Name] & c hat dich aus der Höhle vertrieben!"
player-expelled-you: "& b [name] & c hat dich aus der Höhle vertrieben!"
ranks:
owner: Zwergenkönig
sub-owner: Zwergenritter
@ -219,7 +221,7 @@ caveblock:
& Ablocks aus Höhlen
name: Enderman trauert
ENTER_EXIT_MESSAGES:
island: "[Name] Höhle"
island: "[name] Höhle"
GEO_LIMIT_MOBS:
description: |-
& aEntferne Mobs, die gehen
@ -287,8 +289,8 @@ caveblock:
hint: "& cSie können sich nicht in Ihre Höhle zurück teleportieren, während
Sie fallen."
locked: "& cDiese Höhle ist verschlossen!"
protected: "& cCave protected: [Beschreibung]"
spawn-protected: "& cSpawn protected: [Beschreibung]"
protected: "& cCave protected: [description]"
spawn-protected: "& cSpawn protected: [description]"
panel:
PROTECTION:
description: |-

View File

@ -18,6 +18,8 @@ caveblock:
no-safe-location-found: "&cНе удалось найти безопасное место для телепортации
в пещеру."
not-owner: "&cВы не владелец этой пещеры!"
cave-limit-reached: "&c Вы достигли вершины своей пещеры. Вы не можете стать
выше!"
commands:
admin:
team:

View File

@ -0,0 +1,302 @@
---
caveblock:
sign:
line0: "&cCaveBlock"
line1: Hoş geldin!
line2: "[isim]"
line3: Kazmaya başlayın! &c<3
informational:
to-nether: Şansızca nethere düştün.
to-the-end: Sona ulaştınız.
to-normal: Mağarana geri dön
general:
errors:
no-island: "&cMağaraya sahip değilsin!"
player-has-island: "&cOyuncu bir mağaraya sahip!"
player-has-no-island: "&cBu oyuncunun mağarası yok!"
already-have-island: "&cZaten bir mağaraya sahipsin!"
no-safe-location-found: "&cMağarada sizi ışınlayacak güvenli bir yer bulunamadı."
not-owner: "&cMağaranın sahibi sen değilsin!"
cave-limit-reached: "&c Mağaranızın tepesine ulaştınız. Daha yükseğe çıkamazsın!"
commands:
admin:
team:
add:
name-has-island: "&c[name] bir mağaraya sahip, tekrar kayıt olmalı ya da
silmeli!"
success: "&b[name]&a Başarıyla &b[owner]&a'nın mağarasına katıldı."
kick:
success: "&b[name] , &b[owner]&a'nın mağarasından atıldı."
setowner:
description: Mağara sahipliğini oyuncuya verir
already-owner: "&c[name] zaten bu mağaranın sahibi!"
success: "&b[name]&a artık mağaranın sahibi."
range:
description: Yönetici mağara Alanı komutu
display:
description: mağara alanı göstergeleri show/hide
hint: |-
&cKırmızı Bariyer simgeleri &fmevcut mağara korumalı menzil sınırını gösterir.
&7Gri Parçacıklar &fmaksimum mağara sınırını gösterir.
&aYeşil Parçacıklar &fmağara koruma aralığı bundan farklıysa, varsayılan korumalı aralığı gösterir.
set:
description: mağara korumalı alanı ayarlar
success: "&aMağara koruma aralığını &b[number]'a ayarla."
reset:
description: mağara korumalı aralığı dünya varsayılanına sıfırlar
success: "&aMağara koruma aralığını &b[number]'a sıfırla."
register:
description: Oyuncuyu bulunduğunuz sahipsiz mağaraya kaydedin
registered-island: "&aKayıtlı oyuncu [xyz]'de mağaraya kayıt oldu"
already-owned: "&cMağara zaten başka bir oyuncuya ait!"
no-island-here: "&cBurada mağara yok. Bir tane yapmayı onaylayın."
in-deletion: "&cBu mağara alanı şu anda siliniyor. Daha sonra tekrar deneyin."
cannot-make-island: "&c Buraya bir mağara yerleştirilemez, üzgünüm. Olası
hatalar için konsola bakın."
unregister:
description: sahibinin kaydını mağaradan sil, ancak mağara bloklarını sakla
unregistered-island: "&a[xyz]'deki mağaradan kayıtlı olmayan oyuncu."
info:
description: nerde olduğunuz veya oyuncunun mağarası hakkında bilgi al
no-island: "&cŞu anda bir mağarada değilsiniz..."
title: "========== Mağara Bilgisi ============"
islands-in-trash: "&dPlayer'ın çöp kutusunda mağaraları var."
is-spawn: Başlangıç mağarasıdır.
switchto:
description: oyuncunun mağarasını çöp kutusundaki bir numaraya değiştir
out-of-range: "&cSayı 1 ile [sayı] arasında olmalıdır. Mağara numaralarını
görmek için &l[label] çöp kutusu [player] &r&kullanın"
trash:
no-unowned-in-trash: "&cÇöp kutusunda sahipsiz mağara yok"
no-islands-in-trash: "&cPlayer'ın çöp kutusunda mağarası yok"
description: sahipsiz mağaraları veya oyuncunun mağaralarını çöp kutusunda
göster
title: "&d=========== Çöpteki Mağaralar ==========="
count: "&l&dMağara [number]:"
use-switch: "&aOyuncuyu çöp kutusunda mağaraya geçirmek için &l[label] switchto
<player> <number>&r&a kullanın"
emptytrash:
description: Oyuncu için çöp kutusunu veya sahip olunmayan tüm mağaraları
çöp kutusundan temizleyin
setrange:
description: oyuncunun mağara aralığını ayarla
range-updated: Mağara aralığı [sayı] olarak güncellendi
tp:
description: oyuncunun mağarasına ışınlanma
getrank:
description: bir oyuncunun rütbesini mağarasında almak
rank-is: "&aRank onların mağarasında [rütbe]."
setrank:
description: bir oyuncunun sıralamasını mağarasında belirle
setspawn:
description: bu dünya için bir mağara belirle
already-spawn: "&cBu mağara zaten bir oluşum!"
no-island-here: "&cBurada mağara yok."
confirmation: "&cBu mağarayı bu dünyanın doğuşu olarak ayarlamak istediğinizden
emin misiniz?"
resetflags:
description: config.yml'deki tüm mağaraları varsayılan bayrak ayarlarına sıfırlayın
delete:
description: bir oyuncunun mağarasını siler
cannot-delete-owner: "&cMağara silinmeden önce tüm mağara üyelerinin mağaradan
atılması gerekir."
deleted-island: "&e[xyz] &akoordinatlı mağara başarıyla silindi."
island:
go:
description: Mağarana ışınlan
teleport: "&aSizi mağaranıza ışınlıyorum."
help:
description: Ana mağara komutu
create:
description: Bir mağara oluştur, isteğe bağlı blueprint kullanımı (izin gerekli)
too-many-islands: "&cBu dünyada çok fazla mağara var: seninkinin yaratılması
için yeterli yer yok."
unable-create-island: "&cMağaranız oluşturulamadı, lütfen bir yönetici ile
iletişime geçin."
creating-island: "&aMağaranız oluşturuluyor, lütfen biraz bekleyin..."
pick: "&aBir mağara seçin"
info:
description: mağaranız veya oyuncunun mağarası hakkında bilgi görüntüleyin
near:
description: Çevredeki mağaraları göster
the-following-islands: "&aAşağıdaki mağaralar yakındadır:"
no-neighbors: "&cYakın komşu mağaranız yok!"
reset:
description: mağaranızı yeniden başlatın ve eskisini kaldırın
must-remove-members: "&cMağaranızı yeniden başlatmadan önce tüm üyeleri çıkarmalısınız
(/island team kick <player>)."
sethome:
must-be-on-your-island: "&cEve gitmek için mağaranızda olmalısınız!"
home-set: "&6Mağara eviniz mevcut konumunuza ayarlandı."
setname:
description: Mağaran için isim belirle
resetname:
description: mağara adını sıfırla
team:
coop:
description: Bir oyuncuyu mağaranda işçi yap
uncoop:
you-are-no-longer-a-coop-member: "&cArtık [isim] adlı kişinin mağarasının
kooperatif üyesi değilsin"
all-members-logged-off: "&cTüm mağara üyeleri oturumu kapattı, böylece artık
[ad] adlı kişinin mağarasının bir kooperatif üyesi değilsiniz"
trust:
description: mağaranızda bir oyuncuya güvenilir rütbe verin
invite:
description: bir oyuncuyu mağaranıza katılmaya davet edin
name-has-invited-you: "&a[name] sizi mağarasına davet etti."
you-will-lose-your-island: "&cUYARI! Kabul edersen mağaranı kaybedersin!"
errors:
island-is-full: "&cMağaranız dolu, başkasını davet edemezsiniz."
accept:
you-joined-island: "&aBir mağaraya katıldınız! Diğer üyeleri görmek için
/[label] takım bilgisini kullanın."
name-joined-your-island: "&a[name] Mağarana katıldı!"
confirmation: |-
&cBu daveti kabul etmek istediğinizden emin misiniz?
&c&lMevcut mağaranızı &n&c&l&nkaybedeceksiniz!
reject:
you-rejected-invite: "&aBir mağaraya katılma davetini reddettiniz."
name-rejected-your-invite: "&c[isim] mağara davetinizi reddetti!"
cancel:
description: mağaranıza katılmak için bekleyen daveti iptal edin
leave:
description: mağaranı terk et
left-your-island: "&c[name] &cMağarandan ayrıldı"
kick:
description: mağaranızdan bir üyeyi çıkarın
owner-kicked: "&cSahibi seni mağaradan attı!"
success: "&b[name] &aMağaradan atıldı."
demote:
description: Mağaranızdaki bir oyuncuyu bir rütbe aşağı indirin
promote:
description: mağaranızdaki bir oyuncuyu bir üst rütbeye terfi ettirin
setowner:
description: mağara sahipliğini bir üyeye devret
errors:
target-is-not-member: "&cBu oyuncu mağara ekibinizin bir parçası değil!"
name-is-the-owner: "&a[isim] artık mağaranın sahibi!"
you-are-the-owner: "&aArtık mağara sahibi sizsiniz!"
ban:
description: mağaranızdan bir oyuncuyu yasaklayın
cannot-ban-more-players: "&cYasak sınırına ulaştınız, mağaranızdan daha fazla
oyuncu yasaklayamazsınız."
player-banned: "&b[name]&c artık mağaranıza girmesi yasaklandı."
owner-banned-you: "&b[name]&c Mağarasından banlandın!"
you-are-banned: "&bBu mağaraya girmeniz yasaklandı!"
unban:
description: mağaranızdaki bir oyuncunun yasağını kaldırın
player-unbanned: "&b[name]&a artık mağaranızdan çıkar."
you-are-unbanned: "&b[name] sizi mağaralarından çıkardı!"
banlist:
noone: "&aKimse bu mağarada yasaklı değil."
settings:
description: mağara ayarlarını göster
expel:
description: bir oyuncuyu mağarandan kov
not-on-island: "&cOyuncu mağaranızda değil!"
player-expelled-you: "&b[name]&c seni mağaradan kovdu!"
ranks:
owner: Cüce Kral
sub-owner: Cüce Şövalye
member: Cüce
trusted: güvenilir
coop: Kümes
visitor: İnsan
banned: Orc
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
&aEndermen kaldırabilir
&mağaralardan birkaç blok ötede
name: Enderman kederli
ENTER_EXIT_MESSAGES:
island: "[isim] mağarası"
GEO_LIMIT_MOBS:
description: |-
&aGidip gelen çeteleri kaldır
&dış korumalı
&akave alanı
name: "&eÇeteleri mağaraya sınırlayın"
ISLAND_RESPAWN:
description: |-
&aOyuncular mağarada
&atekrar doğar.
name: Mağara yeniden doğuşu
LIQUIDS_FLOWING_OUT:
name: Mağaraların dışında akan sıvılar
description: |-
&aSıvıların dışarıya akıp akmayacağını değiştir
&a mağaranın koruma aralığında.
LOCK:
description: Kilidi değiştir
name: Mağarayı kilitle
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: Menzil dışında yumurtlayan doğal yaratık
description: |-
&aYaratıklar (hayvanlar ve
&amonsters) dışarıda doğal olarak ortaya çıkabilir
&aa mağarasının koruma alanı.
&cYaratıkları engellemediğini unutmayın
&cto bir mafya oluşturucu veya bir yumurtlama aracıyla yumurtlar
&cig.
OFFLINE_GROWTH:
description: |-
&aDevre dışı bırakıldığında bitkiler
&a mağaralarda büyümeyecek
&atüm üyeler çevrimdışı olduğunda.
&aGecikmeyi azaltmaya yardımcı olabilir.
name: Çevrimdışı Büyüme
OFFLINE_REDSTONE:
description: |-
&aDevre dışı bırakıldığında, redstone
&a mağaralarda çalışmayacaktır
&tüm üyelerin çevrimdışı olduğu bir yer.
&aGecikmeyi azaltmaya yardımcı olabilir.
name: Kapalı Kızıltaş
PISTON_PUSH:
description: |-
&aPistonların itmesine izin ver
&mağaranın dışındaki bloklar
name: Piston itme
REMOVE_MOBS:
description: |-
&aCanavarları kaldır
&mağaraya ışınlanma
name: Canavarları kaldır
TREES_GROWING_OUTSIDE_RANGE:
name: Menzil dışında büyüyen ağaçlar
description: |-
&aAğaçların bir alanın dışında büyüyüp büyüyemeyeceğini değiştir
&aMağaranın koruma menzili içinde olup olmadığı.
PREVENT_TELEPORT_WHEN_FALLING:
name: Düşerken ışınlanmayı engelle
description: |-
&aOyuncuların ışınlanmasını engelle
&komutları kullanarak mağaralarına geri dönün
Düşüyorlarsa.
hint: "&cDüştüğün için mağaraya ışınlanamazsın."
locked: "&cBu mağara kilitli!"
protected: "&cCave korumalı: [açıklama]"
spawn-protected: "&cSpawn korumalı: [açıklama]"
panel:
PROTECTION:
description: |-
&aKoruma ayarları
&bu mağara için
SETTING:
description: |-
&aGenel ayarlar
&bu mağara için
protection:
flags:
SKY_WALKER_FLAG:
description: |-
&5&oEtkinleştir/devre dışı bırak
&5&o üzerinde yürüme yeteneği
&5&o mağara dünyasının zirvesi
Ekstra izinler olmadan &5&o.
name: Gökyüzü Yürüteç
hint: Mağara çatısında yürümeyi sağlar.

View File

@ -0,0 +1,9 @@
name: BentoBox-CaveBlock
main: world.bentobox.caveblock.CaveBlockPladdon
version: ${project.version}${build.number}
api-version: "1.19"
authors: [tastybento, BONNe]
contributors: ["The BentoBoxWorld Community"]
website: https://bentobox.world
description: ${project.description}