Compare commits

...

24 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 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
13 changed files with 602 additions and 153 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.16.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

@ -282,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
// ---------------------------------------------------------------------

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;
}
@ -2143,6 +2138,20 @@ public class Settings implements WorldSettings
}
@Override
public Map<Flag, Integer> getDefaultIslandFlags()
{
return Collections.emptyMap();
}
@Override
public Map<Flag, Integer> getDefaultIslandSettings()
{
return Collections.emptyMap();
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
@ -2439,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

@ -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,95 +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, 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);
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

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