Compare commits

...

82 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
BONNe e6e3c97f80 Merge branch 'develop' into master
# Conflicts:
#	pom.xml
#	src/main/java/world/bentobox/caveblock/generators/populators/EntitiesPopulator.java
2022-01-28 12:56:18 +02:00
BONNe 7bbcd40df2 Set default biome to "DRIPSTONE_CAVES" caves in overworld.
Change default biome detection with Enums#getIfPresent and use THE_VOID as default biome if presented value does not exist.
2022-01-28 12:53:49 +02:00
BONNe 18e4694129 Add spigot-plugin-annotations dependency. 2022-01-28 12:52:08 +02:00
BONNe 7caa688aa0
Fixes incorrect error message path.
There were 2 different error message paths to the same text. 

Reported in Discord.
2022-01-28 12:28:39 +02:00
BONNe 486e95c316
Return missing error message.
Somehow the error message was lost when added more "island" to "cave" replacements. 

Reported in Discord.
2022-01-28 12:27:01 +02:00
gitlocalize-app[bot] 710243c420
Translate lv.yml via GitLocalize (#72) 2022-01-09 11:30:59 -08:00
gitlocalize-app[bot] ca625a5971
Translate es.yml via GitLocalize (#74)
Co-authored-by: zuhir <ventola.tomas@gmail.com>
2022-01-01 18:47:29 -08:00
gitlocalize-app[bot] 138c8f9cfb
Russian translation (#73)
* Translate ru.yml via GitLocalize

* Translate ru.yml via GitLocalize

Co-authored-by: DraimCiDo <danilaorlov4@gmail.com>
Co-authored-by: mt-gitlocalize <mt@gitlocalize.com>
2022-01-01 18:47:14 -08:00
tastybento 3889975319 JavaDoc fixes 2021-12-21 09:00:28 -08:00
tastybento 4702ad1b96 Overrides need NonNull annotations 2021-12-21 08:59:42 -08:00
tastybento cdc0d10914 Fix typos, grammar. 2021-12-21 08:59:22 -08:00
tastybento c5d29eb1c9 Ignore IntelliJ 2021-12-21 08:58:07 -08:00
tastybento 57e71ca20d Compile to 1.18.1 2021-12-21 08:42:53 -08:00
tastybento 6d21deaa1e Fix biome compatibility 2021-12-21 08:42:40 -08:00
tastybento 124b4e8c0c Remove use own generator option as it isn't used. 2021-12-21 08:40:04 -08:00
Huynh Tien 4a2e08c228
block populators & respect world depth setting (#71) 2021-12-20 22:14:33 -08:00
tastybento 03a5f9bc6c
New world gen (#70)
* Uses the new 1.17.1 ChunkGenerator options

* More work on the ores

* Make CaveBlock a Pladdon

* WWIP - added nether and end ores.

* Improved generation

* Support 1.18 new caves
2021-12-20 12:22:28 -08:00
Huynh Tien 7824c7bf71
Optional Generators (#67)
* old generators in new api

* add NewMaterialPopulator

* forgot to prevent physics loop

* I see... the new generator creates caves

* apply getMinHeight and getMaxHeight

* getMinHeight and getMaxHeight for populators too

* summarize

* general reformat on populators

* small typos

* comment sections

* small reformat

* warning on config

* apply new API on BlockPopulator p.1

* apply new API on BlockPopulator p.2

* apply new API on BlockPopulator p.3 (final)

* hasAI option
2021-12-13 20:00:54 -08:00
Huynh Tien 30f59d2a31
Add Vietnamese (#65) 2021-10-16 09:51:33 -07:00
gitlocalize-app[bot] cdbb629760
Polish translation (#64)
* Translate pl.yml via GitLocalize

* Translate pl.yml via GitLocalize

* Translate pl.yml via GitLocalize

Co-authored-by: Repo92 <xrepox@gmail.com>
Co-authored-by: mt-gitlocalize <mt@gitlocalize.com>
Co-authored-by: tastybento <tastybento@wasteofplastic.com>
2021-10-12 17:17:42 -07:00
tastybento b41a6e2137 Revert "Remove javadoc"
This reverts commit 1fdc07e0a8.
2021-10-11 18:32:31 -07:00
tastybento 1fdc07e0a8 Remove javadoc 2021-10-10 20:31:03 -07:00
tastybento b71288d151
1.17 world gen (#61)
* Uses the new 1.17.1 ChunkGenerator options

* More work on the ores

* Make CaveBlock a Pladdon

* WWIP - added nether and end ores.

* Improved generation
2021-10-10 17:41:10 -07:00
Katorly 665b68aa2f
Re-translate zh-CN.yml (#63) 2021-10-05 08:50:04 -07:00
tastybento 1fdf5eb26e
Release 1.14.5 (#60)
* Version 1.14.4

* Implement options for linking nether portals and crating end obsidian platform.

* Implement onRespawnCommands() option from BentoBox 1.14.

* Fixes copy-paste issue

* Init 1.14.5 version

* Fix for mobs in negative coords.

Fixes https://github.com/BentoBoxWorld/CaveBlock/issues/59

* Remove unused Sonar profile.

* Shift to Github Actions

* Add correct properties for SonarCloud

* Now with correct CaveBlock reference.

Co-authored-by: BONNe <bonne@bonne.id.lv>
2021-08-15 11:42:42 -07:00
tastybento 45955df990 Now with correct CaveBlock reference. 2021-08-15 11:40:40 -07:00
tastybento 08aef3daa4 Add correct properties for SonarCloud 2021-08-15 11:28:25 -07:00
tastybento 4af68cd933 Shift to Github Actions 2021-08-15 11:25:58 -07:00
tastybento 6b18aedf75 Remove unused Sonar profile. 2021-08-15 11:22:32 -07:00
tastybento c18ff90e5f
Merge branch 'master' into develop 2021-08-15 11:21:50 -07:00
tastybento 8bda6b8849 Fix for mobs in negative coords.
Fixes https://github.com/BentoBoxWorld/CaveBlock/issues/59
2021-08-15 11:19:28 -07:00
BONNe 4ce4f1fc70
Init 1.14.5 version 2021-03-30 18:38:01 +03:00
BONNe 8af21d7401
Release 1.14.4 with exposed options (#57)
* Version 1.14.4

* Implement options for linking nether portals and crating end obsidian platform.

* Implement onRespawnCommands() option from BentoBox 1.14.

* Fixes copy-paste issue

Co-authored-by: tastybento <tastybento@wasteofplastic.com>
2021-03-30 18:37:32 +03:00
BONNe 982725c737 Fixes copy-paste issue 2021-03-15 14:50:19 +02:00
BONNe c12310a627 Implement onRespawnCommands() option from BentoBox 1.14. 2021-03-15 14:49:16 +02:00
BONNe 9006a5f4d4 Implement options for linking nether portals and crating end obsidian platform. 2021-03-15 14:33:43 +02:00
tastybento c61a2deaac Version 1.14.4 2021-03-07 13:39:15 -08:00
tastybento cbc3832a8c Merge remote-tracking branch 'origin/master' into develop 2021-03-07 13:01:36 -08:00
tastybento d9ca6689e1 Merge branch 'develop' of https://github.com/BentoBoxWorld/CaveBlock.git
into develop

Conflicts:
	pom.xml
2021-03-07 13:01:26 -08:00
tastybento 010f94a571 Version 1.14.3 2021-03-07 13:00:35 -08:00
tastybento fd7bf1c078 Use release version 2021-03-07 12:57:17 -08:00
tastybento 71371576af
Do not check for blocks when looking for new islands. (#55)
https://github.com/BentoBoxWorld/BentoBox/issues/1694
2021-03-01 10:43:53 -08:00
tastybento c0c2970168 Fix for nether Biome in end world
https://github.com/BentoBoxWorld/CaveBlock/issues/54
2020-12-22 09:03:21 -08:00
tastybento 5e610f5fd8 Version 1.14.2 2020-12-22 09:03:04 -08:00
tastybento 6d37df1f2d Main block should be stone. 2020-11-27 16:48:44 -08:00
tastybento 4c587d7a74 Merge remote-tracking branch 'origin/develop' 2020-11-27 08:25:32 -08:00
tastybento 1c5ed92b25 Do not set mob spawn rates unless set to >0 in config.yml. 2020-11-27 07:55:25 -08:00
gitlocalize-app[bot] 3c4cabacc2
Add German translation (#51)
* Translate de.yml via GitLocalize

* Translate de.yml via GitLocalize

Co-authored-by: PhoenixmitX <phmitx@gmail.com>
Co-authored-by: mt-gitlocalize <mt@gitlocalize.com>
2020-11-04 10:12:16 +02:00
tastybento 4ecc4c5203 Add spawn limits in config.yml
Enables per-world specification of mob spawning.
2020-09-27 18:12:22 -07:00
gitlocalize-app[bot] 908c2681a4
Translate es.yml via GitLocalize (#50)
Co-authored-by: zuhir <ventola.tomas@gmail.com>
2020-08-03 08:14:44 +03:00
tastybento cb38e67e36 Improved comments for nether and end sethome 2020-07-18 08:15:30 -07:00
tastybento ad41651747 Version 1.14.1
https://github.com/BentoBoxWorld/CaveBlock/issues/49
2020-07-10 21:21:14 -07:00
tastybento aaea6fd6fe Fixes blueprint bundles.
https://github.com/BentoBoxWorld/CaveBlock/issues/49
2020-07-10 21:19:10 -07:00
BONNe c12ab7eb5a Update version 2020-07-09 21:43:37 +03:00
BONNe cf8e29b562 Add 1.15.2 backward compatibility.
Update to 1.14 api.
2020-07-09 21:40:23 +03:00
BONNe 93ee3cdd33 Prepare for 1.16.1 release.
- Added nether and the end biome sections in config.
2020-06-28 11:12:27 +03:00
BONNe dd59556dc0 Increment development version. 2020-05-01 23:33:12 +03:00
30 changed files with 4400 additions and 1842 deletions

38
.github/workflows/build.yml vendored Normal file
View File

@ -0,0 +1,38 @@
name: Build
on:
push:
branches:
- develop
- master
pull_request:
types: [opened, synchronize, reopened]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
distribution: 'adopt'
java-version: 17
- name: Cache SonarCloud packages
uses: actions/cache@v3
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven packages
uses: actions/cache@v3
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build and analyze
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

2
.gitignore vendored
View File

@ -26,3 +26,5 @@ hs_err_pid*
/.classpath
/.project
/.settings/
/.idea/
/CaveBlock.iml

View File

@ -1,22 +0,0 @@
language: java
sudo: false
addons:
sonarcloud:
organization: "bentobox-world"
jdk:
- openjdk8
- openjdk11
matrix:
allow_failures:
- jdk: openjdk11
script:
# the following command line builds the project, runs the tests with coverage and then execute the SonarCloud analysis
- mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Dsonar.projectKey=BentoBoxWorld_CaveBlock
cache:
directories:
- '$HOME/.m2/repository'
- '$HOME/.sonar/cache'

View File

@ -3,20 +3,60 @@
[![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!**
As most of BentoBox projects, CaveBlock Addon is translatable in any language. Everyone can contribute, and translate some parts of the addon in their language via [GitLocalize](https://gitlocalize.com/repo/2968).
If your language is not in the list, please contact to developers via Discord and it will be added there.
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.
## Installation
<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.
## 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.
2. Restart the server.
3. The addon will create worlds and a data folder and inside the folder will be a config.yml.
4. Stop the server .
4. Stop the server.
5. Edit the config.yml how you want.
6. Delete any worlds that were created by default if you made changes that would affect them.
7. Restart the server.
@ -24,10 +64,7 @@ If your language is not in the list, please contact to developers via Discord an
## Config.yml
The config.yml is similar to BSkyblock and AcidIsalnd but *not the same*. It has some additional or changed parameters, like,
instead of wrold-height it has world-depth.
It also has option to choose main block for each world, and blocks that will be occasionally replace main block, f.e. diamond ore or shulker.
It also allows to specifiy if roof and floor for each world must be generated from bedrock.
instead of world-height it has world-depth.
### Other Add-ons

47
pom.xml
View File

@ -43,15 +43,17 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<java.version>17</java.version>
<!-- More visible way how to change dependency versions -->
<spigot.version>1.16.1-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>1.14.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.14.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>
</properties>
<profiles>
@ -92,30 +94,6 @@
<!-- GIT_BRANCH -->
</properties>
</profile>
<profile>
<id>sonar</id>
<properties>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<sonar.organization>bentobox-world</sonar.organization>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.sonarsource.scanner.maven</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>3.6.0.1398</version>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>sonar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<repositories>
@ -192,8 +170,7 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<release>${java.version}</release>
</configuration>
</plugin>
<plugin>
@ -206,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>
@ -250,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

@ -24,7 +24,7 @@ public class CaveBlock extends GameModeAddon
/**
* Executes code when loading the addon. This is called before {@link #onEnable()}. This should preferably
* be used to setup configuration and worlds.
* be used to set up configuration and worlds.
*/
@Override
public void onLoad()
@ -34,18 +34,20 @@ 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)
{
@Override
public void setup()
{
@Override
public void setup()
{
super.setup();
new IslandAboutCommand(this);
}
};
super.setup();
new IslandAboutCommand(this);
}
};
// Admin command.
this.adminCommand = new DefaultAdminCommand(this) {};
@ -76,7 +78,6 @@ public class CaveBlock extends GameModeAddon
{
super.onReload();
this.loadSettings();
this.chunkGenerator.reload();
}
@ -122,8 +123,8 @@ public class CaveBlock extends GameModeAddon
/**
* Make the worlds for this GameMode in this method. BentoBox will call it after onLoad() and before
* onEnable(). {@link #islandWorld} must be created and assigned, {@link #netherWorld} and {@link
* #endWorld} are optional and may be null.
* onEnable(). {@code islandWorld} must be created and assigned, {@code netherWorld} and {@code
* endWorld} are optional and may be null.
*/
@Override
public void createWorlds()
@ -137,11 +138,11 @@ public class CaveBlock extends GameModeAddon
// Create the world if it does not exist
this.islandWorld = WorldCreator.name(worldName).
type(WorldType.FLAT).
environment(World.Environment.NORMAL).
generator(this.chunkGenerator).
generator(this.chunkNormalGenerator).
createWorld();
// Set spawn rates
setSpawnRates(islandWorld);
// Make the nether if it does not exist
@ -163,10 +164,11 @@ 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();
}
setSpawnRates(netherWorld);
}
// Make the end if it does not exist
@ -187,14 +189,40 @@ 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();
}
setSpawnRates(endWorld);
}
}
private void setSpawnRates(World w) {
if (w != null) {
if (getSettings().getSpawnLimitMonsters() > 0) {
w.setMonsterSpawnLimit(getSettings().getSpawnLimitMonsters());
}
if (getSettings().getSpawnLimitAmbient() > 0) {
w.setAmbientSpawnLimit(getSettings().getSpawnLimitAmbient());
}
if (getSettings().getSpawnLimitAnimals() > 0) {
w.setAnimalSpawnLimit(getSettings().getSpawnLimitAnimals());
}
if (getSettings().getSpawnLimitWaterAnimals() > 0) {
w.setWaterAnimalSpawnLimit(getSettings().getSpawnLimitWaterAnimals());
}
if (getSettings().getTicksPerAnimalSpawns() > 0) {
w.setTicksPerAnimalSpawns(getSettings().getTicksPerAnimalSpawns());
}
if (getSettings().getTicksPerMonsterSpawns() > 0) {
w.setTicksPerMonsterSpawns(getSettings().getTicksPerMonsterSpawns());
}
}
}
/**
* Defines the world generator for this game mode
*
@ -206,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;
}
}
// ---------------------------------------------------------------------
@ -243,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
// ---------------------------------------------------------------------
@ -258,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;
// ---------------------------------------------------------------------
@ -288,6 +347,4 @@ public class CaveBlock extends GameModeAddon
* String for the end world.
*/
private static final String THE_END = "_the_end";
}

View File

@ -0,0 +1,14 @@
package world.bentobox.caveblock;
import world.bentobox.bentobox.api.addons.Addon;
import world.bentobox.bentobox.api.addons.Pladdon;
public class CaveBlockPladdon extends Pladdon {
@Override
public Addon getAddon() {
return new CaveBlock();
}
}

View File

@ -1,19 +1,16 @@
package world.bentobox.caveblock;
import com.google.common.base.Enums;
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;
import org.bukkit.Material;
import org.bukkit.block.Biome;
import org.bukkit.entity.EntityType;
import org.eclipse.jdt.annotation.NonNull;
import com.google.common.base.Enums;
import world.bentobox.bentobox.api.configuration.ConfigComment;
import world.bentobox.bentobox.api.configuration.ConfigEntry;
@ -164,13 +161,13 @@ public class Settings implements WorldSettings
/**
* This method returns the useOwnGenerator object.
* @return the useOwnGenerator object.
* This is not an option in Caveblock
* @return false
*/
@Override
public boolean isUseOwnGenerator()
{
return useOwnGenerator;
return false;
}
@ -331,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;
}
@ -342,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;
}
@ -810,6 +807,15 @@ public class Settings implements WorldSettings
return numberOfBlockGenerationTries;
}
/**
* This method returns the newMaterialGenerator value.
* @return the value of newMaterialGenerator.
*/
public boolean isNewMaterialGenerator()
{
return newMaterialGenerator;
}
/**
* {@inheritDoc}
@ -824,6 +830,7 @@ public class Settings implements WorldSettings
/**
* {@inheritDoc}
*/
@Override
public String getPlayerCommandAliases()
{
return playerCommandAliases;
@ -833,6 +840,7 @@ public class Settings implements WorldSettings
/**
* {@inheritDoc}
*/
@Override
public String getAdminCommandAliases()
{
return adminCommandAliases;
@ -859,6 +867,36 @@ public class Settings implements WorldSettings
}
/**
* {@inheritDoc}
*/
@Override
public boolean isMakeNetherPortals()
{
return this.makeNetherPortals;
}
/**
* {@inheritDoc}
*/
@Override
public boolean isMakeEndPortals()
{
return this.makeEndPortals;
}
/**
* {@inheritDoc}
*/
@Override
public @NonNull List<String> getOnRespawnCommands()
{
return this.onRespawnCommands;
}
// ---------------------------------------------------------------------
// Section: Setters
// ---------------------------------------------------------------------
@ -988,16 +1026,6 @@ public class Settings implements WorldSettings
}
/**
* This method sets the useOwnGenerator object value.
* @param useOwnGenerator the useOwnGenerator object new value.
*
*/
public void setUseOwnGenerator(boolean useOwnGenerator)
{
this.useOwnGenerator = useOwnGenerator;
}
/**
* This method sets the maxIslands object value.
* @param maxIslands the maxIslands object new value.
@ -1146,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;
}
@ -1157,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;
}
@ -1185,15 +1213,15 @@ public class Settings implements WorldSettings
}
/**
* This method sets the fallingBannedCommands object value.
* @param fallingBannedCommands the fallingBannedCommands object new value.
*
*/
public void setFallingBannedCommands(List<String> fallingBannedCommands)
{
this.fallingBannedCommands = fallingBannedCommands;
}
/**
* This method sets the fallingBannedCommands object value.
* @param fallingBannedCommands the fallingBannedCommands object new value.
*
*/
public void setFallingBannedCommands(List<String> fallingBannedCommands)
{
this.fallingBannedCommands = fallingBannedCommands;
}
/**
@ -1317,36 +1345,36 @@ public class Settings implements WorldSettings
}
/**
* This method sets the createCaveOnFirstLoginEnabled object value.
* @param createIslandOnFirstLoginEnabled the createCaveOnFirstLoginEnabled object new value.
*
*/
public void setCreateIslandOnFirstLoginEnabled(boolean createIslandOnFirstLoginEnabled)
{
this.createIslandOnFirstLoginEnabled = createIslandOnFirstLoginEnabled;
}
/**
* This method sets the createCaveOnFirstLoginEnabled object value.
* @param createIslandOnFirstLoginEnabled the createCaveOnFirstLoginEnabled object new value.
*
*/
public void setCreateIslandOnFirstLoginEnabled(boolean createIslandOnFirstLoginEnabled)
{
this.createIslandOnFirstLoginEnabled = createIslandOnFirstLoginEnabled;
}
/**
* This method sets the createCaveOnFirstLoginDelay object value.
* @param createIslandOnFirstLoginDelay the createCaveOnFirstLoginDelay object new value.
*
*/
public void setCreateIslandOnFirstLoginDelay(int createIslandOnFirstLoginDelay)
{
this.createIslandOnFirstLoginDelay = createIslandOnFirstLoginDelay;
}
/**
* This method sets the createCaveOnFirstLoginDelay object value.
* @param createIslandOnFirstLoginDelay the createCaveOnFirstLoginDelay object new value.
*
*/
public void setCreateIslandOnFirstLoginDelay(int createIslandOnFirstLoginDelay)
{
this.createIslandOnFirstLoginDelay = createIslandOnFirstLoginDelay;
}
/**
* This method sets the createCaveOnFirstLoginDelay object value.
* @param createIslandOnFirstLoginAbortOnLogout the createCaveOnFirstLoginDelay object new value.
*
*/
public void setCreateIslandOnFirstLoginAbortOnLogout(boolean createIslandOnFirstLoginAbortOnLogout)
{
this.createIslandOnFirstLoginAbortOnLogout = createIslandOnFirstLoginAbortOnLogout;
}
/**
* This method sets the createCaveOnFirstLoginDelay object value.
* @param createIslandOnFirstLoginAbortOnLogout the createCaveOnFirstLoginDelay object new value.
*
*/
public void setCreateIslandOnFirstLoginAbortOnLogout(boolean createIslandOnFirstLoginAbortOnLogout)
{
this.createIslandOnFirstLoginAbortOnLogout = createIslandOnFirstLoginAbortOnLogout;
}
/**
@ -1613,6 +1641,17 @@ public class Settings implements WorldSettings
}
/**
* This method sets the newMaterialGenerator value.
* @param newMaterialGenerator the numberOfBlockGenerationTries new value.
*
*/
public void setNewMaterialGenerator(boolean newMaterialGenerator)
{
this.newMaterialGenerator = newMaterialGenerator;
}
/**
* @return the debug
*/
@ -1653,6 +1692,7 @@ public class Settings implements WorldSettings
/**
* @return the onJoinCommands
*/
@NonNull
@Override
public List<String> getOnJoinCommands() {
return onJoinCommands;
@ -1670,6 +1710,7 @@ public class Settings implements WorldSettings
/**
* @return the onLeaveCommands
*/
@NonNull
@Override
public List<String> getOnLeaveCommands() {
return onLeaveCommands;
@ -1904,11 +1945,220 @@ public class Settings implements WorldSettings
this.defaultTheEndBiome = defaultTheEndBiome;
}
/**
* @return the spawnLimitMonsters
*/
public int getSpawnLimitMonsters() {
return spawnLimitMonsters;
}
/**
* @param spawnLimitMonsters the spawnLimitMonsters to set
*/
public void setSpawnLimitMonsters(int spawnLimitMonsters) {
this.spawnLimitMonsters = spawnLimitMonsters;
}
/**
* @return the spawnLimitAnimals
*/
public int getSpawnLimitAnimals() {
return spawnLimitAnimals;
}
/**
* @param spawnLimitAnimals the spawnLimitAnimals to set
*/
public void setSpawnLimitAnimals(int spawnLimitAnimals) {
this.spawnLimitAnimals = spawnLimitAnimals;
}
/**
* @return the spawnLimitWaterAnimals
*/
public int getSpawnLimitWaterAnimals() {
return spawnLimitWaterAnimals;
}
/**
* @param spawnLimitWaterAnimals the spawnLimitWaterAnimals to set
*/
public void setSpawnLimitWaterAnimals(int spawnLimitWaterAnimals) {
this.spawnLimitWaterAnimals = spawnLimitWaterAnimals;
}
/**
* @return the spawnLimitAmbient
*/
public int getSpawnLimitAmbient() {
return spawnLimitAmbient;
}
/**
* @param spawnLimitAmbient the spawnLimitAmbient to set
*/
public void setSpawnLimitAmbient(int spawnLimitAmbient) {
this.spawnLimitAmbient = spawnLimitAmbient;
}
/**
* @return the ticksPerAnimalSpawns
*/
public int getTicksPerAnimalSpawns() {
return ticksPerAnimalSpawns;
}
/**
* @param ticksPerAnimalSpawns the ticksPerAnimalSpawns to set
*/
public void setTicksPerAnimalSpawns(int ticksPerAnimalSpawns) {
this.ticksPerAnimalSpawns = ticksPerAnimalSpawns;
}
/**
* @return the ticksPerMonsterSpawns
*/
public int getTicksPerMonsterSpawns() {
return ticksPerMonsterSpawns;
}
/**
* @param ticksPerMonsterSpawns the ticksPerMonsterSpawns to set
*/
public void setTicksPerMonsterSpawns(int ticksPerMonsterSpawns) {
this.ticksPerMonsterSpawns = ticksPerMonsterSpawns;
}
/* (non-Javadoc)
* @see world.bentobox.bentobox.api.configuration.WorldSettings#isCheckForBlocks()
*/
@Override
public boolean isCheckForBlocks() {
// Do not check for blocks when looking for new island spots
return false;
}
/**
* Sets make nether portals.
*
* @param makeNetherPortals the make nether portals
*/
public void setMakeNetherPortals(boolean makeNetherPortals)
{
this.makeNetherPortals = makeNetherPortals;
}
/**
* Sets make end portals.
*
* @param makeEndPortals the make end portals
*/
public void setMakeEndPortals(boolean makeEndPortals)
{
this.makeEndPortals = makeEndPortals;
}
/**
* Sets on respawn commands.
*
* @param onRespawnCommands the on respawn commands
*/
public void setOnRespawnCommands(List<String> onRespawnCommands)
{
this.onRespawnCommands = onRespawnCommands;
}
/**
* 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
// ---------------------------------------------------------------------
/* Commands */
@ConfigComment("Cave Command. What command users will run to access their cave.")
@ConfigComment("To define alias, just separate commands with white space.")
@ -1947,6 +2197,25 @@ public class Settings implements WorldSettings
@ConfigEntry(path = "world.difficulty")
private Difficulty difficulty = Difficulty.HARD;
@ConfigComment("Spawn limits. These override the limits set in bukkit.yml")
@ConfigComment("If set to a negative number, the server defaults will be used")
@ConfigEntry(path = "world.spawn-limits.monsters", since = "1.15.1")
private int spawnLimitMonsters = -1;
@ConfigEntry(path = "world.spawn-limits.animals", since = "1.15.1")
private int spawnLimitAnimals = -1;
@ConfigEntry(path = "world.spawn-limits.water-animals", since = "1.15.1")
private int spawnLimitWaterAnimals = -1;
@ConfigEntry(path = "world.spawn-limits.ambient", since = "1.15.1")
private int spawnLimitAmbient = -1;
@ConfigComment("Setting to 0 will disable animal spawns, but this is not recommended. Minecraft default is 400.")
@ConfigComment("A negative value uses the server default")
@ConfigEntry(path = "world.spawn-limits.ticks-per-animal-spawns", since = "1.15.1")
private int ticksPerAnimalSpawns = -1;
@ConfigComment("Setting to 0 will disable monster spawns, but this is not recommended. Minecraft default is 400.")
@ConfigComment("A negative value uses the server default")
@ConfigEntry(path = "world.spawn-limits.ticks-per-monster-spawns", since = "1.15.1")
private int ticksPerMonsterSpawns = -1;
@ConfigComment("Radius of cave in blocks. (So distance between caves is twice this)")
@ConfigComment("Will be rounded up to the nearest 16 blocks.")
@ConfigComment("It is the same for every dimension : Overworld, Nether and End.")
@ -1981,11 +2250,6 @@ public class Settings implements WorldSettings
@ConfigEntry(path = "world.cave-height")
private int islandHeight = 60;
@ConfigComment("Use your own world generator for this world.")
@ConfigComment("In this case, the plugin will not generate anything.")
@ConfigEntry(path = "world.use-own-generator", experimental = true)
private boolean useOwnGenerator = true;
@ConfigComment("Maximum number of caves in the world. Set to -1 or 0 for unlimited.")
@ConfigComment("If the number of caves is greater than this number, it will stop players from creating caves.")
@ConfigEntry(path = "world.max-caves")
@ -1998,7 +2262,7 @@ public class Settings implements WorldSettings
@ConfigComment("The default biome for the overworld")
@ConfigEntry(path = "world.default-biome")
private Biome defaultBiome = Biome.MOUNTAINS;
private Biome defaultBiome = Enums.getIfPresent(Biome.class, "DRIPSTONE_CAVES").or(Biome.THE_VOID);
@ConfigComment("The maximum number of players a player can ban at any one time in this game mode.")
@ConfigComment("The permission caveblock.ban.maxlimit.X where X is a number can also be used per player")
@ -2007,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;
@ -2016,15 +2280,41 @@ public class Settings implements WorldSettings
@ConfigEntry(path = "world.generation-tries", needsReset = true)
private int numberOfBlockGenerationTries = 1;
@ConfigComment("Should we use the new material generator ?")
@ConfigComment("This will generate ores and blocks similar to how vanilla does,")
@ConfigComment("but it will override the blocks settings of each world.")
@ConfigEntry(path = "world.use-new-material-generator", needsReset = true)
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;
@ -2056,7 +2346,7 @@ public class Settings implements WorldSettings
@ConfigComment("The default biome for the nether world (this may affect what mobs can spawn)")
@ConfigEntry(path = "world.nether.biome", since = "1.14.0")
private Biome defaultNetherBiome = Enums.getIfPresent(Biome.class, "NETHER").or(Enums.getIfPresent(Biome.class, "NETHER_WASTES").or(Biome.BADLANDS));
private Biome defaultNetherBiome = Enums.getIfPresent(Biome.class, "NETHER_WASTES").or(Biome.THE_VOID);
@ConfigComment("Nether spawn protection radius - this is the distance around the nether spawn")
@ConfigComment("that will be protected from player interaction (breaking blocks, pouring lava etc.)")
@ -2089,6 +2379,12 @@ public class Settings implements WorldSettings
@ConfigEntry(path = "world.nether.blocks", needsReset = true)
private List<String> netherBlocks = new ArrayList<>();
@ConfigComment("This option indicates if nether portals should be linked via dimensions.")
@ConfigComment("Option will simulate vanilla portal mechanics that links portals together")
@ConfigComment("or creates a new portal, if there is not a portal in that dimension.")
@ConfigEntry(path = "world.nether.create-and-link-portals")
private boolean makeNetherPortals = false;
// End
@ConfigEntry(path = "world.end.generate")
private boolean endGenerate = true;
@ -2098,7 +2394,7 @@ public class Settings implements WorldSettings
@ConfigComment("The default biome for the end world (this may affect what mobs can spawn)")
@ConfigEntry(path = "world.end.biome", since = "1.14.0")
private Biome defaultTheEndBiome = Biome.THE_END;
private Biome defaultTheEndBiome = Enums.getIfPresent(Biome.class, "THE_END").or(Biome.THE_VOID);
@ConfigEntry(path = "world.end.dragon-spawn", experimental = true)
private boolean dragonSpawn = false;
@ -2127,6 +2423,11 @@ public class Settings implements WorldSettings
@ConfigEntry(path = "world.end.blocks", needsReset = true)
private List<String> endBlocks = new ArrayList<>();
@ConfigComment("This option indicates if obsidian platform in the end should be generated")
@ConfigComment("when player enters the end world.")
@ConfigEntry(path = "world.end.create-obsidian-platform")
private boolean makeEndPortals = false;
// Other staff.
@ConfigComment("Mob white list - these mobs will NOT be removed when logging in or doing /cave")
@ -2147,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")
@ -2182,7 +2481,7 @@ public class Settings implements WorldSettings
@ConfigComment("permission size cannot be less than the default below. ")
@ConfigEntry(path = "cave.max-coop-size", since = "1.13.0")
private int maxCoopSize = 4;
@ConfigComment("Default maximum number of trusted rank members per cave")
@ConfigComment("Players can have the caveblock.trust.maxsize.<number> permission to be bigger but")
@ConfigComment("permission size cannot be less than the default below. ")
@ -2322,21 +2621,60 @@ public class Settings implements WorldSettings
private boolean pasteMissingIslands = false;
// Commands
@ConfigComment("List of commands to run when a player joins.")
@ConfigEntry(path = "cave.commands.on-join")
@ConfigComment("List of commands to run when a player joins an cave or creates one.")
@ConfigComment("These commands are run by the console, unless otherwise stated using the [SUDO] prefix,")
@ConfigComment("in which case they are executed by the player.")
@ConfigComment("")
@ConfigComment("Available placeholders for the commands are the following:")
@ConfigComment(" * [name]: name of the player")
@ConfigComment("")
@ConfigComment("Here are some examples of valid commands to execute:")
@ConfigComment(" * '[SUDO] bbox version'")
@ConfigComment(" * 'bsbadmin deaths set [player] 0'")
@ConfigComment("")
@ConfigComment("Note that player-executed commands might not work, as these commands can be run with said player being offline.")
@ConfigEntry(path = "cave.commands.on-join", since = "1.8.0")
private List<String> onJoinCommands = new ArrayList<>();
@ConfigComment("list of commands to run when a player leaves.")
@ConfigEntry(path = "cave.commands.on-leave")
@ConfigComment("List of commands to run when a player leaves a cave, resets his cave or gets kicked from it.")
@ConfigComment("These commands are run by the console, unless otherwise stated using the [SUDO] prefix,")
@ConfigComment("in which case they are executed by the player.")
@ConfigComment("")
@ConfigComment("Available placeholders for the commands are the following:")
@ConfigComment(" * [name]: name of the player")
@ConfigComment("")
@ConfigComment("Here are some examples of valid commands to execute:")
@ConfigComment(" * '[SUDO] bbox version'")
@ConfigComment(" * 'bsbadmin deaths set [player] 0'")
@ConfigComment("")
@ConfigComment("Note that player-executed commands might not work, as these commands can be run with said player being offline.")
@ConfigEntry(path = "cave.commands.on-leave", since = "1.8.0")
private List<String> onLeaveCommands = new ArrayList<>();
@ConfigComment("List of commands that should be executed when the player respawns after death if Flags.ISLAND_RESPAWN is true.")
@ConfigComment("These commands are run by the console, unless otherwise stated using the [SUDO] prefix,")
@ConfigComment("in which case they are executed by the player.")
@ConfigComment("")
@ConfigComment("Available placeholders for the commands are the following:")
@ConfigComment(" * [name]: name of the player")
@ConfigComment("")
@ConfigComment("Here are some examples of valid commands to execute:")
@ConfigComment(" * '[SUDO] bbox version'")
@ConfigComment(" * 'bsbadmin deaths set [player] 0'")
@ConfigComment("")
@ConfigComment("Note that player-executed commands might not work, as these commands can be run with said player being offline.")
@ConfigEntry(path = "cave.commands.on-respawn", since = "1.14.0")
private List<String> onRespawnCommands = new ArrayList<>();
// Sethome
@ConfigComment("Allow setting home in the nether. Only available on nether islands, not vanilla nether.")
@ConfigEntry(path = "cave.sethome.nether.allow")
private boolean allowSetHomeInNether = true;
@ConfigEntry(path = "cave.sethome.nether.require-confirmation")
private boolean requireConfirmationToSetHomeInNether = true;
@ConfigComment("Allow setting home in the end. Only available on end islands, not vanilla end.")
@ConfigEntry(path = "cave.sethome.the-end.allow")
private boolean allowSetHomeInTheEnd = true;

View File

@ -0,0 +1,20 @@
package world.bentobox.caveblock;
import org.bukkit.Location;
public class Utils {
/**
* Convert chunk location to world location
*
* @param x the x coordinate of the chunk location
* @param y the y coordinate
* @param z the z coordinate of the chunk location
* @param chunkX the x coordinate of the chunk
* @param chunkZ the z coordinate of the chunk
* @return the world location
*/
public static Location getLocationFromChunkLocation(int x, int y, int z, int chunkX, int chunkZ) {
return new Location(null, x + (chunkX * 16D), y, z + (chunkZ * 16D));
}
}

View File

@ -1,251 +1,191 @@
package world.bentobox.caveblock.generators;
import org.bukkit.Material;
import org.bukkit.World;
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.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import world.bentobox.caveblock.CaveBlock;
import world.bentobox.caveblock.Settings;
import world.bentobox.caveblock.generators.populators.EntitiesPopulator;
import world.bentobox.caveblock.generators.populators.MaterialPopulator;
/**
* Class ChunkGeneratorWorld ...
*
* @author BONNe
* Created on 27.01.2019
*/
public class ChunkGeneratorWorld extends ChunkGenerator
{
public class ChunkGeneratorWorld extends ChunkGenerator {
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
private final CaveBlock addon;
private final Settings settings;
private final List<BlockPopulator> blockPopulators;
private final World.Environment environment;
private BiomeProvider biomeProvider;
private boolean isNewGenerator;
// ---------------------------------------------------------------------
// Section: Constructor
// ---------------------------------------------------------------------
/**
* @param addon - CaveBlock object
* @param environment - World environment
*/
public ChunkGeneratorWorld(CaveBlock addon)
{
super();
public ChunkGeneratorWorld(CaveBlock addon, World.Environment environment) {
this.addon = addon;
this.settings = addon.getSettings();
this.blockPopulators = new ArrayList<>(2);
this.environment = environment;
reload();
}
// ---------------------------------------------------------------------
// Section: Methods
// ---------------------------------------------------------------------
/**
* This method sets if given coordinates can be set as spawn location
*/
@Override
public boolean canSpawn(World world, int x, int z)
{
return true;
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();
};
}
/**
* This method generates given chunk.
* @param world World where chunk must be generated.
* @param random Random that allows define object randomness.
* @param chunkX Chunk X coordinate.
* @param chunkZ Chunk Z coordinate.
* @param biomeGrid BiomeGrid that contains biomes.
* @return new ChunkData for given chunk.
*/
@Override
public ChunkData generateChunkData(World world,
Random random,
int chunkX,
int chunkZ,
ChunkGenerator.BiomeGrid biomeGrid)
{
ChunkData result = this.createChunkData(world);
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();
};
}
// Populate chunk with necessary information
if (world.getEnvironment().equals(World.Environment.NETHER))
private Material getBaseMaterial(World.Environment environment) {
return switch (environment) {
case NETHER -> this.settings.getNetherMainBlock();
case THE_END -> this.settings.getEndMainBlock();
default -> this.settings.getNormalMainBlock();
};
}
@Override
public void generateBedrock(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, ChunkData chunkData)
{
if (!this.shouldGenerateBedrock())
{
this.populateNetherChunk(world, result, biomeGrid);
}
else if (world.getEnvironment().equals(World.Environment.THE_END))
{
this.populateTheEndChunk(world, result, biomeGrid);
final int minHeight = worldInfo.getMinHeight();
Material material = this.getGroundFloorMaterial(worldInfo.getEnvironment());
chunkData.setRegion(0, minHeight, 0, 16, minHeight + 1, 16, material);
}
else
{
this.populateOverWorldChunk(world, result, biomeGrid);
}
return result;
}
/**
* This method populates The End world chunk data.
* @param world world where chunks are generated.
* @param chunkData ChunkData that must be populated.
* @param biomeGrid BiomeGrid for this chunk.
*/
private void populateTheEndChunk(World world, ChunkData chunkData, BiomeGrid biomeGrid)
{
// because everything starts at 0 and ends at 255
final int worldHeight = this.settings.getWorldDepth();
// Fill all blocks
chunkData.setRegion(0, 1, 0,
16, worldHeight - 1, 16,
this.settings.getEndMainBlock());
// Generate ground and ceiling.
chunkData.setRegion(0, 0, 0,
16, 1, 16,
this.settings.isEndFloor() ? Material.BEDROCK : this.settings.getEndMainBlock());
chunkData.setRegion(0, worldHeight - 1, 0,
16, worldHeight, 16,
this.settings.isEndRoof() ? Material.BEDROCK : this.settings.getEndMainBlock());
// Set biome
for (int x = 0; x < 16; x += 4)
{
for (int y = 0; y < world.getMaxHeight(); y += 4)
{
for (int z = 0; z < 16; z += 4)
{
biomeGrid.setBiome(x, y, z, this.settings.getDefaultNetherBiome());
}
}
// 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);
}
}
/**
* This method populates nether world chunk data.
* @param world world where chunks are generated.
* @param chunkData ChunkData that must be populated.
* @param biomeGrid BiomeGrid for this chunk.
*/
private void populateNetherChunk(World world, ChunkData chunkData, BiomeGrid biomeGrid)
{
// because everything starts at 0 and ends at 255
final int worldHeight = this.settings.getWorldDepth();
// Fill all blocks
chunkData.setRegion(0, 1, 0,
16, worldHeight - 1, 16,
this.settings.getNetherMainBlock());
// Generate ground and ceiling.
chunkData.setRegion(0, 0, 0,
16, 1, 16,
this.settings.isNetherFloor() ? Material.BEDROCK : this.settings.getNetherMainBlock());
chunkData.setRegion(0, worldHeight - 1, 0,
16, worldHeight, 16,
this.settings.isNetherRoof() ? Material.BEDROCK : this.settings.getNetherMainBlock());
// Set biome
for (int x = 0; x < 16; x += 4)
{
for (int y = 0; y < world.getMaxHeight(); y += 4)
{
for (int z = 0; z < 16; z += 4)
{
biomeGrid.setBiome(x, y, z, this.settings.getDefaultNetherBiome());
}
}
}
}
/**
* This method populates Over world chunk data.
* @param world world where chunks are generated.
* @param chunkData ChunkData that must be populated.
* @param biomeGrid BiomeGrid for this chunk.
*/
private void populateOverWorldChunk(World world, ChunkData chunkData, BiomeGrid biomeGrid)
{
// because everything starts at 0 and ends at 255
final int worldHeight = this.settings.getWorldDepth();
// Fill all blocks
chunkData.setRegion(0, 1, 0,
16, worldHeight - 1, 16,
this.settings.getNormalMainBlock());
// Generate ground and ceiling.
chunkData.setRegion(0, 0, 0,
16, 1, 16,
this.settings.isNormalFloor() ? Material.BEDROCK : this.settings.getNormalMainBlock());
chunkData.setRegion(0, worldHeight - 1, 0,
16, worldHeight, 16,
this.settings.isNormalRoof() ? Material.BEDROCK : this.settings.getNormalMainBlock());
// Set biome
for (int x = 0; x < 16; x += 4)
{
for (int y = 0; y < world.getMaxHeight(); y += 4)
{
for (int z = 0; z < 16; z += 4)
{
biomeGrid.setBiome(x, y, z, this.settings.getDefaultBiome());
}
}
}
}
/**
* This method set world block populators.
* @param world World where this must apply.
* @return List with block populators.
*/
@Override
public List<BlockPopulator> getDefaultPopulators(final World world)
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();
final int worldHeight = Math.min(worldInfo.getMaxHeight(), this.settings.getWorldDepth());
final World.Environment environment = worldInfo.getEnvironment();
if (isNewGenerator) {
switch (environment) {
case NETHER:
if (worldHeight + 1 > 34) {
chunkData.setRegion(0, minHeight + 1, 0, 16, 34, 16, Material.SOUL_SAND);
chunkData.setRegion(0, 34, 0, 16, worldHeight - 1, 16, Material.NETHERRACK);
} else {
chunkData.setRegion(0, minHeight + 1, 0, 16, worldHeight - 1, 16, Material.NETHERRACK);
}
break;
case THE_END:
chunkData.setRegion(0, minHeight + 1, 0, 16, worldHeight - 1, 16, Material.END_STONE);
break;
default:
if (worldHeight + 1 > 7) {
chunkData.setRegion(0, minHeight + 1, 0, 16, 7, 16, Material.DEEPSLATE);
chunkData.setRegion(0, 7, 0, 16, worldHeight - 1, 16, Material.STONE);
} else {
chunkData.setRegion(0, minHeight + 1, 0, 16, worldHeight - 1, 16, Material.STONE);
}
break;
}
} else {
Material material = getBaseMaterial(environment);
chunkData.setRegion(0, minHeight + 1, 0, 16, worldHeight - 1, 16, material);
}
}
@Override
public List<BlockPopulator> getDefaultPopulators(final World world) {
return this.blockPopulators;
}
@Override
public BiomeProvider getDefaultBiomeProvider(WorldInfo worldInfo) {
return biomeProvider;
}
@Override
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() {
// 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() {
// 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();
}
/**
* Called when config is reloaded
*/
public void reload() {
this.blockPopulators = new ArrayList<>(2);
this.blockPopulators.add(new MaterialPopulator(this.addon));
this.blockPopulators.add(new EntitiesPopulator(this.addon));
this.blockPopulators.clear();
this.isNewGenerator = this.settings.isNewMaterialGenerator();
if (this.isNewGenerator) {
this.blockPopulators.add(new NewMaterialPopulator(this.settings.getWorldDepth()));
this.biomeProvider = null;
} else {
this.blockPopulators.add(new MaterialPopulator(this.addon));
this.blockPopulators.add(new EntitiesPopulator(this.addon));
this.biomeProvider = new FlatBiomeProvider(this.addon);
}
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* CaveBlock addon.
*/
private CaveBlock addon;
/**
* Addon settings.
*/
private Settings settings;
/**
* This list contains block populators that will be applied after chunk is generated.
*/
private List<BlockPopulator> blockPopulators;
}

View File

@ -0,0 +1,15 @@
package world.bentobox.caveblock.generators;
import org.bukkit.Material;
/**
* @author tastybento
* @param minY minimum Y level this ore should appear
* @param material Material
* @param chance chance
* @param blob maximum size of blob to generate
* @param cont whether the generator should continue to try to make other ores at this level after making this one
*/
public record Ore (int minY, int maxY, Material material, int chance, int blob, boolean cont){
}

View File

@ -1,52 +1,82 @@
package world.bentobox.caveblock.generators.populators;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.stream.Collectors;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.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;
import java.util.*;
import java.util.stream.Collectors;
/**
* This class populates generated chunk with entites by random chance.
* This class populates generated chunk with entities by random chance.
*/
public class EntitiesPopulator extends BlockPopulator
{
public class EntitiesPopulator extends BlockPopulator {
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* Water entities
*/
private static final List<EntityType> WATER_ENTITIES = Arrays.asList(EntityType.GUARDIAN,
EntityType.SQUID,
EntityType.COD,
EntityType.SALMON,
EntityType.PUFFERFISH,
EntityType.TROPICAL_FISH,
EntityType.DROWNED,
EntityType.DOLPHIN);
/**
* CaveBlock addon.
*/
private final CaveBlock addon;
/**
* Map that contains chances for spawning per environment.
*/
private Map<Environment, Chances> chances;
/**
* World height
*/
private int worldHeight;
// ---------------------------------------------------------------------
// Section: Constructor
// ---------------------------------------------------------------------
/**
* This is default constructor
*
* @param addon CaveBlock addon.
*/
public EntitiesPopulator(CaveBlock addon)
{
public EntitiesPopulator(CaveBlock addon) {
this.addon = addon;
this.loadSettings();
}
// ---------------------------------------------------------------------
// Section: Methods
// ---------------------------------------------------------------------
/**
* This method load chances per environment.
*/
private void loadSettings() {
// Set up chances
chances = new HashMap<>();
chances = new EnumMap<>(Environment.class);
// Normal
chances.put(Environment.NORMAL, new Chances(this.getEntityMap(addon.getSettings().getNormalBlocks()), addon.getSettings().getNormalMainBlock()));
// Nether
@ -54,43 +84,49 @@ public class EntitiesPopulator extends BlockPopulator
// End
chances.put(Environment.THE_END, new Chances(this.getEntityMap(addon.getSettings().getEndBlocks()), addon.getSettings().getEndMainBlock()));
// Other settings
worldHeight = addon.getSettings().getWorldDepth() - 1;
worldHeight = addon.getSettings().getWorldDepth();
}
/**
* This method populates chunk with entities.
* @param world World where population must be.
* @param random Randomness
* @param chunk Chunk were populator operates.
*
* @param worldInfo World where population must be.
* @param random Randomness
* @param chunkX X coordinate of chunk
* @param chunkZ Z coordinate of chunk
* @param limitedRegion Region where population operates.
*/
@Override
public void populate(World world, Random random, Chunk chunk)
{
for (Map.Entry<EntityType, Pair<Double, Integer>> entry : chances.get(world.getEnvironment()).entityChanceMap.entrySet())
{
for (int subY = 0; subY < worldHeight; subY += 16)
{
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;
for (Map.Entry<EntityType, Pair<Pair<Double, Integer>, Boolean>> entry : chances.get(worldInfo.getEnvironment()).entityChanceMap.entrySet()) {
Pair<Double, Integer> value = entry.getValue().x;
boolean hasAI = entry.getValue().z;
for (int subY = minHeight; subY < height; subY += 16) {
// Use double so chance can be < 1
if (random.nextDouble() * 100 < entry.getValue().x)
{
int y = Math.min(worldHeight - 2, subY + random.nextInt(15));
if (random.nextDouble() * 100 < value.x) {
int y = Math.min(height - 2, subY + random.nextInt(15));
// Spawn only in middle of chunk because bounding box will grow out from here
this.tryToPlaceEntity(world, chunk.getBlock(7, y, 7), entry.getKey(), chances.get(world.getEnvironment()).mainMaterial);
this.tryToPlaceEntity(
worldInfo, Utils.getLocationFromChunkLocation(7, y, 7, chunkX, chunkZ), limitedRegion,
entry.getKey(), hasAI,
chances.get(worldInfo.getEnvironment()).mainMaterial
);
}
}
}
}
/**
* This method returns Entity frequently and pack size map.
*
* @param objectList List with objects that contains data.
* @return Map that contains entity, its rarity and pack size.
*/
private Map<EntityType, Pair<Double, Integer>> getEntityMap(List<String> objectList)
{
Map<EntityType, Pair<Double, Integer>> entityMap = new HashMap<>(objectList.size());
private Map<EntityType, Pair<Pair<Double, Integer>, Boolean>> getEntityMap(List<String> objectList) {
Map<EntityType, Pair<Pair<Double, Integer>, Boolean>> entityMap = new EnumMap<>(EntityType.class);
Map<String, EntityType> entityTypeMap = Arrays.stream(EntityType.values()).
collect(Collectors.toMap(Enum::name,
@ -100,63 +136,143 @@ public class EntitiesPopulator extends BlockPopulator
// wrong material object.
objectList.stream().
filter(object -> object.startsWith("ENTITY")).
map(object -> object.split(":")).
filter(splitString -> splitString.length == 4).
forEach(splitString -> {
EntityType entity = entityTypeMap.getOrDefault(splitString[1], null);
filter(object -> object.startsWith("ENTITY")).
map(object -> object.split(":")).
filter(splitString -> splitString.length >= 4).
forEach(splitString -> {
EntityType entity = entityTypeMap.getOrDefault(splitString[1], null);
boolean hasAI = splitString.length <= 4 || Boolean.parseBoolean(splitString[4]);
if (entity != null)
{
entityMap.put(entity,
new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3])));
}
});
if (entity != null) {
entityMap.put(entity,
new Pair<>(
new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3])),
hasAI
)
);
}
});
return entityMap;
}
/**
* Places entities if there is room for them.
* @param world - World were mob must be spawned.
* @param block - Block that was chosen by random.
* @param entity - Entity that must be spawned.
*
* @param worldInfo - World were mob must be spawned.
* @param location - Location that was chosen by random.
* @param limitedRegion - Region where entity must be spawned.
* @param entityType - Entity that must be spawned.
* @param hasAI - If entity has AI.
* @param originalMaterial - replacement material.
*/
private void tryToPlaceEntity(World world, Block block, EntityType entity, Material originalMaterial)
{
if (block.getType().equals(originalMaterial)) {
// Spawn entity
Entity e = world.spawnEntity(block.getLocation().add(0.5, 0, 0.5), entity);
if (e instanceof LivingEntity) {
// Do not despawn
((LivingEntity)e).setRemoveWhenFarAway(false);
}
// Make space for entity based on the entity's size
BoundingBox bb = e.getBoundingBox();
for (int x = (int) bb.getMinX(); x < bb.getMaxX(); x++) {
for (int z = (int) bb.getMinZ(); z < bb.getMaxZ(); z++) {
int y = (int) bb.getMinY();
Block b = world.getBlockAt(x, y, z);
for (; y < bb.getMaxY(); y++) {
if (addon.getSettings().isDebug()) {
addon.log("DEBUG: Entity spawn: " + world.getName() + " " + x + " " + y + " " + z + " " + e.getType());
}
b = world.getBlockAt(x, y, z);
if (!b.getType().equals(originalMaterial)) {
// Cannot place entity
e.remove();
return;
}
b.setType(WATER_ENTITIES.contains(entity) ? Material.WATER : Material.CAVE_AIR);
private void tryToPlaceEntity(WorldInfo worldInfo, Location location, LimitedRegion limitedRegion, EntityType entityType, boolean hasAI, Material originalMaterial) {
if (!limitedRegion.isInRegion(location)) return;
if (!limitedRegion.getType(location).equals(originalMaterial)) return;
BoundingBox bb = this.getEntityBoundingBox(entityType, location);
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)) {
return;
}
for (; y <= bb.getMaxY(); y++) {
if (addon.getSettings().isDebug()) {
addon.log("DEBUG: Entity spawn: " + worldInfo.getName() + " " + x + " " + y + " " + z + " " + entityType);
}
// Add air block on top for all water entities (required for dolphin, okay for others)
if (WATER_ENTITIES.contains(entity) && b.getRelative(BlockFace.UP).getType().equals(originalMaterial)) {
b.getRelative(BlockFace.UP).setType(Material.CAVE_AIR);
if (!limitedRegion.isInRegion(x, y, z) || !limitedRegion.getType(x, y, z).equals(originalMaterial)) {
// Cannot place entity
return;
}
limitedRegion.setType(x, y, z, WATER_ENTITIES.contains(entityType) ? Material.WATER : Material.AIR);
}
// Add air block on top for all water entities (required for dolphin, okay for others)
if (WATER_ENTITIES.contains(entityType) && limitedRegion.isInRegion(x, y, z) && limitedRegion.getType(x, y, z).equals(originalMaterial)) {
limitedRegion.setType(x, y, z, Material.CAVE_AIR);
}
}
}
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;
}
@ -164,63 +280,13 @@ public class EntitiesPopulator extends BlockPopulator
// Section: Private Classes
// ---------------------------------------------------------------------
/**
* Chances class to store chances for environments and main material
*
* @param entityChanceMap - contains chances for each entity, and the boolean indicates that entity should have AI.
* @param mainMaterial - material on which entity can replace.
*/
private class Chances
{
/**
* @param entityChanceMap - contains chances for each entity.
* @param mainMaterial - material on which entity can replace.
*/
Chances(Map<EntityType, Pair<Double, Integer>> entityChanceMap, Material mainMaterial)
{
this.entityChanceMap = entityChanceMap;
this.mainMaterial = mainMaterial;
}
/**
* Map that contains chances for entity to spawn.
*/
final Map<EntityType, Pair<Double, Integer>> entityChanceMap;
/**
* Main material that can be replaced.
*/
final Material mainMaterial;
private record Chances(Map<EntityType, Pair<Pair<Double, Integer>, Boolean>> entityChanceMap,
Material mainMaterial) {
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* CaveBlock addon.
*/
private CaveBlock addon;
/**
* Map that contains chances for spawning per environment.
*/
private Map<Environment, Chances> chances;
/**
* World height
*/
private int worldHeight;
/**
* Water entities
*/
private final static List<EntityType> WATER_ENTITIES = Arrays.asList(EntityType.GUARDIAN,
EntityType.SQUID,
EntityType.COD,
EntityType.SALMON,
EntityType.PUFFERFISH,
EntityType.TROPICAL_FISH,
EntityType.DROWNED,
EntityType.DOLPHIN);
}

View File

@ -0,0 +1,48 @@
package world.bentobox.caveblock.generators.populators;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.WorldInfo;
import world.bentobox.caveblock.CaveBlock;
import world.bentobox.caveblock.Settings;
import java.util.Collections;
import java.util.List;
public class FlatBiomeProvider extends BiomeProvider {
private final Settings settings;
// ---------------------------------------------------------------------
// Section: Constructor
// ---------------------------------------------------------------------
/**
* @param addon - CaveBlock object
*/
public FlatBiomeProvider(CaveBlock addon) {
this.settings = addon.getSettings();
}
// ---------------------------------------------------------------------
// Section: Methods
// ---------------------------------------------------------------------
private Biome getBiome(World.Environment environment) {
return switch (environment) {
case NETHER -> this.settings.getDefaultNetherBiome();
case THE_END -> this.settings.getDefaultTheEndBiome();
default -> this.settings.getDefaultBiome();
};
}
@Override
public Biome getBiome(WorldInfo worldInfo, int x, int y, int z) {
return getBiome(worldInfo.getEnvironment());
}
@Override
public List<Biome> getBiomes(WorldInfo worldInfo) {
return Collections.singletonList(getBiome(worldInfo.getEnvironment()));
}
}

View File

@ -1,47 +1,67 @@
package world.bentobox.caveblock.generators.populators;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World.Environment;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.LimitedRegion;
import org.bukkit.generator.WorldInfo;
import world.bentobox.bentobox.util.Pair;
import world.bentobox.caveblock.CaveBlock;
import world.bentobox.caveblock.Utils;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.block.Block;
import org.bukkit.generator.BlockPopulator;
import world.bentobox.bentobox.util.Pair;
import world.bentobox.caveblock.CaveBlock;
/**
* This class allows to fill given chunk with necessary blocks.
* This class allows filling given chunk with necessary blocks.
*/
public class MaterialPopulator extends BlockPopulator
{
public class MaterialPopulator extends BlockPopulator {
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* CaveBlock addon.
*/
private final CaveBlock addon;
/**
* Map that contains chances for spawning per environment.
*/
private Map<Environment, Chances> chances;
/**
* World height
*/
private int worldHeight;
// ---------------------------------------------------------------------
// Section: Constructor
// ---------------------------------------------------------------------
/**
* This is default constructor
*
* @param addon CaveBlock addon.
*/
public MaterialPopulator(CaveBlock addon)
{
public MaterialPopulator(CaveBlock addon) {
this.addon = addon;
// Load settings
this.loadSettings();
}
// ---------------------------------------------------------------------
// Section: Methods
// ---------------------------------------------------------------------
/**
* Loads chances for Material Populator
*/
private void loadSettings() {
// Set up chances
chances = new HashMap<>();
chances = new EnumMap<>(Environment.class);
// Normal
chances.put(Environment.NORMAL, new Chances(this.getMaterialMap(addon.getSettings().getNormalBlocks()), addon.getSettings().getNormalMainBlock()));
// Nether
@ -49,84 +69,71 @@ public class MaterialPopulator extends BlockPopulator
// End
chances.put(Environment.THE_END, new Chances(this.getMaterialMap(addon.getSettings().getEndBlocks()), addon.getSettings().getEndMainBlock()));
// Other settings
worldHeight = addon.getSettings().getWorldDepth() - 1;
worldHeight = addon.getSettings().getWorldDepth();
}
/**
* This method populates chunk with blocks.
* @param world World where population must be.
* @param random Randomness
* @param chunk Chunk were populator operates.
*
* @param worldInfo World where population must be.
* @param random Randomness
* @param chunkX X coordinate of chunk
* @param chunkZ Z coordinate of chunk
* @param limitedRegion Region were populator operates.
*/
@Override
public void populate(World world, Random random, Chunk chunk)
{
Chances chances = this.chances.get(world.getEnvironment());
public void populate(WorldInfo worldInfo, Random random, int chunkX, int chunkZ, LimitedRegion limitedRegion) {
int minHeight = worldInfo.getMinHeight();
int height = Math.min(worldInfo.getMaxHeight(), worldHeight) - 1;
Chances envChances = this.chances.get(worldInfo.getEnvironment());
for (Map.Entry<Material, Pair<Double, Integer>> entry : envChances.materialChanceMap.entrySet()) {
for (int subY = minHeight + 1; subY < height; subY += 16) {
if (random.nextDouble() * 100 >= entry.getValue().x) {
continue;
}
for (Map.Entry<Material, Pair<Double, Integer>> entry : chances.materialChanceMap.entrySet())
{
for (int subY = 1; subY < worldHeight; subY += 16)
{
if (random.nextDouble() * 100 < entry.getValue().x)
{
// Blocks must be 1 away from edge to avoid adjacent chunk loading
Location location = Utils.getLocationFromChunkLocation(
random.nextInt(13) + 1,
Math.min(height - 2, subY + random.nextInt(15)),
random.nextInt(13) + 1,
chunkX, chunkZ);
// Blocks must be 1 away from edge to avoid adjacent chunk loading
int x = random.nextInt(13) + 1;
int z = random.nextInt(13) + 1;
int y = Math.min(worldHeight - 2, subY + random.nextInt(15));
/*
* TODO: remove
if (addon.getSettings().isDebug()) {
addon.log("DEBUG: Material: " + world.getName() + " " + x + " " + y + " " + z + " " + entry.getKey());
if (!limitedRegion.isInRegion(location)) {
continue;
}
Material material = limitedRegion.getType(location);
if (!material.equals(envChances.mainMaterial)) {
continue;
}
int packSize = random.nextInt(entry.getValue().z);
boolean continuePlacing = true;
while (continuePlacing) {
if (!material.equals(entry.getKey())) {
limitedRegion.setType(location, entry.getKey());
packSize--;
}
*/
Block block = chunk.getBlock(x, y, z);
if (block.getType().equals(chances.mainMaterial))
{
int packSize = random.nextInt(entry.getValue().z);
boolean continuePlacing = true;
while (continuePlacing)
{
if (!block.getType().equals(entry.getKey()))
{
// Set type without physics is required otherwise server goes into an infinite loop
block.setType(entry.getKey(), false);
packSize--;
}
// The direction chooser
switch (random.nextInt(5))
{
case 0:
x = Math.min(15, x + 1);
break;
case 1:
y = Math.min(worldHeight - 2, y + 1);
break;
case 2:
z = Math.min(15, z + 1);
break;
case 3:
x = Math.max(0, x - 1);
break;
case 4:
y = Math.max(1, y - 1);
break;
case 5:
z = Math.max(0, z - 1);
break;
}
block = chunk.getBlock(x, y, z);
continuePlacing = packSize > 0 && (block.getType().equals(chances.mainMaterial) ||
block.getType().equals(entry.getKey()));
switch (random.nextInt(6)) {
case 0 -> location.setX(location.getX() + 1);
case 1 -> location.setY(location.getY() + 1);
case 2 -> location.setZ(location.getZ() + 1);
case 3 -> location.setX(location.getX() - 1);
case 4 -> location.setY(location.getY() - 1);
case 5 -> location.setZ(location.getZ() - 1);
default -> {
continuePlacing = false;
continue;
}
}
continuePlacing = packSize > 0 && limitedRegion.isInRegion(location) && location.getY() > minHeight;
if (continuePlacing) {
material = limitedRegion.getType(location);
continuePlacing = material.equals(envChances.mainMaterial) || material.equals(entry.getKey());
}
}
}
}
@ -134,84 +141,42 @@ public class MaterialPopulator extends BlockPopulator
/**
* This method returns material frequently and pack size map.
*
* @param objectList List with objects that contains data.
* @return Map that contains material, its rarity and pack size.
*/
private Map<Material, Pair<Double, Integer>> getMaterialMap(List<String> objectList)
{
Map<Material, Pair<Double, Integer>> materialMap = new HashMap<>(objectList.size());
private Map<Material, Pair<Double, Integer>> getMaterialMap(List<String> objectList) {
Map<Material, Pair<Double, Integer>> materialMap = new EnumMap<>(Material.class);
// wrong material object.
objectList.stream().
filter(object -> object.startsWith("MATERIAL")).
map(object -> object.split(":")).
filter(splitString -> splitString.length == 4).
forEach(splitString -> {
Material material = Material.getMaterial(splitString[1]);
// Material must be a block otherwise the chunk cannot be populated
if (material != null && material.isBlock())
{
materialMap.put(material,
new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3])));
} else {
addon.logError("Could not parse MATERIAL in config.yml: " + splitString[1] + " is not a valid block.");
}
});
filter(object -> object.startsWith("MATERIAL")).
map(object -> object.split(":")).
filter(splitString -> splitString.length == 4).
forEach(splitString -> {
Material material = Material.getMaterial(splitString[1]);
// Material must be a block otherwise the chunk cannot be populated
if (material != null && material.isBlock()) {
materialMap.put(material,
new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3])));
} else {
addon.logError("Could not parse MATERIAL in config.yml: " + splitString[1] + " is not a valid block.");
}
});
return materialMap;
}
// ---------------------------------------------------------------------
// Section: Private Classes
// ---------------------------------------------------------------------
/**
* Chances class to store chances for environments and main material
*
* @param materialChanceMap - contains chances for each material.
* @param mainMaterial - material on which material can replace.
*/
private class Chances
{
/**
* @param materialChanceMap - contains chances for each material.
* @param mainMaterial - material on which material can replace.
*/
Chances(Map<Material, Pair<Double, Integer>> materialChanceMap, Material mainMaterial)
{
this.materialChanceMap = materialChanceMap;
this.mainMaterial = mainMaterial;
}
/**
* Map that contains chances for entity to spawn.
*/
final Map<Material, Pair<Double, Integer>> materialChanceMap;
/**
* Main material that can be replaced.
*/
final Material mainMaterial;
private record Chances(Map<Material, Pair<Double, Integer>> materialChanceMap, Material mainMaterial) {
}
// ---------------------------------------------------------------------
// Section: Variables
// ---------------------------------------------------------------------
/**
* CaveBlock addon.
*/
private CaveBlock addon;
/**
* Map that contains chances for spawning per environment.
*/
private Map<Environment, Chances> chances;
/**
* World height
*/
private int worldHeight;
}

View File

@ -0,0 +1,126 @@
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;
/**
* @author tastybento
*/
public class NewMaterialPopulator extends BlockPopulator {
private static final int BLOB_SIZE = 1;
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);
}
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;
}
@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() + 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() + 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

@ -16,14 +16,14 @@ import world.bentobox.caveblock.CaveBlock;
/**
* This listener checks player movement. If enabled, players will be deny to get over world depth limit and
* This listener checks player movement. If enabled, players will be denied to get over world depth limit and
* if alternative teleports is enabled, then falling in void also will be processed.
*/
public class CustomHeightLimitations implements Listener
{
/**
* Simple constructor
* @param addon
* @param addon Addon
*/
public CustomHeightLimitations(CaveBlock addon)
{
@ -53,7 +53,7 @@ public class CustomHeightLimitations implements Listener
// Prevent to get over world height
if (nextY >= this.worldHeight)
{
User.getInstance(player).sendMessage("caveblock.cave-limit-reached");
User.getInstance(player).sendMessage("caveblock.general.errors.cave-limit-reached");
event.setCancelled(true);
}
}
@ -86,7 +86,7 @@ public class CustomHeightLimitations implements Listener
/**
* This method checks and returns if current player movement from location to to location should be
* This method checks and returns if current player movement from location to location should be
* managed by current addon.
* @param nextY NextY location for player.
* @param player Player who makes movement
@ -120,10 +120,10 @@ public class CustomHeightLimitations implements Listener
/**
* CaveBlock addon
*/
private CaveBlock addon;
private final CaveBlock addon;
/**
* This variable store world height.
*/
private int worldHeight;
private final int worldHeight;
}

View File

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

View File

@ -7,9 +7,9 @@
],
"requirePermission": false,
"blueprints": {
"NORMAL": "the cave",
"NETHER": "the nether cave",
"THE_END": "the end cave"
"NORMAL": "cave",
"NETHER": "nether-cave",
"THE_END": "end-cave"
},
"slot": 0
}

View File

@ -7,9 +7,9 @@
],
"requirePermission": false,
"blueprints": {
"NORMAL": "miner's cave",
"NETHER": "the nether cave",
"THE_END": "the end cave"
"NORMAL": "miners-cave",
"NETHER": "nether-cave",
"THE_END": "end-cave"
},
"slot": 1
}

View File

@ -1,4 +1,4 @@
# CaveBlock Configuration 1.14.0-SNAPSHOT-LOCAL
# CaveBlock Configuration 1.15.0-SNAPSHOT-LOCAL
caveblock:
command:
# Cave Command. What command users will run to access their cave.
@ -26,6 +26,25 @@ world:
# World difficulty setting - PEACEFUL, EASY, NORMAL, HARD
# Other plugins may override this setting
difficulty: HARD
spawn-limits:
# Spawn limits. These override the limits set in bukkit.yml
# If set to a negative number, the server defaults will be used
# Added since 1.15.1.
monsters: -1
# Added since 1.15.1.
animals: -1
# Added since 1.15.1.
water-animals: -1
# Added since 1.15.1.
ambient: -1
# Setting to 0 will disable animal spawns, but this is not recommended. Minecraft default is 400.
# A negative value uses the server default
# Added since 1.15.1.
ticks-per-animal-spawns: -1
# Setting to 0 will disable monster spawns, but this is not recommended. Minecraft default is 400.
# A negative value uses the server default
# Added since 1.15.1.
ticks-per-monster-spawns: -1
# Radius of cave in blocks. (So distance between caves is twice this)
# Will be rounded up to the nearest 16 blocks.
# It is the same for every dimension : Overworld, Nether and End.
@ -50,10 +69,6 @@ world:
# Cave height - Lowest is 5.
# It is the y coordinate of the bedrock block in the schem.
cave-height: 60
# Use your own world generator for this world.
# In this case, the plugin will not generate anything.
# /!\ This feature is experimental and might not work as expected or might not work at all.
use-own-generator: true
# Maximum number of caves in the world. Set to -1 or 0 for unlimited.
# If the number of caves is greater than this number, it will stop players from creating caves.
max-caves: 0
@ -61,27 +76,50 @@ world:
# a new cave for example. Options are SURVIVAL, CREATIVE, ADVENTURE, SPECTATOR
default-game-mode: SURVIVAL
# The default biome for the overworld
default-biome: MOUNTAINS
default-biome: PLAINS
# The maximum number of players a player can ban at any one time in this game mode.
# 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.
# /!\ 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.
generation-tries: 2
# Should we use the new material generator ?
# This will generate ores and blocks similar to how vanilla does,
# but it will override the blocks settings of each 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
@ -102,14 +140,18 @@ world:
- MATERIAL:COAL_ORE:10:6
- MATERIAL:EMERALD_ORE:1:1
- MATERIAL:CLAY:10:6
- MATERIAL:DIRT:10:10
- MATERIAL:GRAVEL:20:6
- MATERIAL:GRANITE:20:10
- MATERIAL:DIRT:20:10
- MATERIAL:GRAVEL:40:6
- MATERIAL:GRANITE:40:10
- MATERIAL:ANDESITE:20:10
- MATERIAL:DIORITE:30:8
- ENTITY:ZOMBIE:1:1
- ENTITY:DOLPHIN:0.1:1
- ENTITY:CAVE_SPIDER:1:1
- 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.
@ -158,6 +200,10 @@ world:
- 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 that dimension.
create-and-link-portals: false
end:
generate: true
# /!\ 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.
@ -190,11 +236,14 @@ 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:
- ZOMBIE_VILLAGER
- WITHER
- ENDERMAN
- ZOMBIE_VILLAGER
# World flags. These are boolean settings for various flags for this world
flags:
CREEPER_DAMAGE: true
@ -202,6 +251,8 @@ world:
PISTON_PUSH: false
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
@ -209,10 +260,15 @@ world:
NATURAL_SPAWNING_OUTSIDE_RANGE: true
ENTER_EXIT_MESSAGES: true
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
ITEM_FRAME_DAMAGE: false
TREES_GROWING_OUTSIDE_RANGE: false
WITHER_DAMAGE: false
# These are the default protection settings for new caves.
# The value is the minimum cave rank required allowed to do the action.
# Ranks are the following:
@ -224,47 +280,60 @@ world:
# OWNER = 1000
default-cave-flags:
HURT_ANIMALS: 500
DRAGON_EGG: 500
REDSTONE: 500
BUCKET: 500
LOCK: 0
ENDER_PEARL: 500
DOOR: 500
BREAK_HOPPERS: 500
FURNACE: 500
ANVIL: 500
MINECART: 500
FISH_SCOOPING: 500
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
RIDING: 500
HURT_MONSTERS: 0
ARMOR_STAND: 500
NAME_TAG: 500
ARMOR_STAND: 500
TRADING: 0
EGGS: 500
ITEM_DROP: 0
NOTE_BLOCK: 0
FLINT_AND_STEEL: 500
NETHER_PORTAL: 500
LECTERN: 500
CROP_TRAMPLE: 500
ITEM_PICKUP: 0
DROPPER: 500
BREWING: 500
DROPPER: 500
TNT_PRIMING: 500
COLLECT_WATER: 500
BUTTON: 500
FIRE_EXTINGUISH: 500
COMMAND_RANKS: 500
BEACON: 500
TRAPDOOR: 500
PRESSURE_PLATE: 0
PLACE_BLOCKS: 500
EXPERIENCE_BOTTLE_THROWING: 500
DYE: 500
ITEM_FRAME: 500
PLACE_BLOCKS: 500
CRAFTING: 0
SHEARING: 500
ENCHANTING: 0
BED: 500
BOAT: 500
SPAWN_EGGS: 500
BED: 500
MILKING: 0
DISPENSER: 500
GATE: 0
@ -281,9 +350,15 @@ world:
default-cave-settings:
PVP_END: false
PVP_NETHER: false
ANIMAL_SPAWN: true
MONSTER_SPAWN: true
LEAF_DECAY: true
MONSTER_SPAWNERS_SPAWN: true
TNT_DAMAGE: true
ANIMAL_NATURAL_SPAWN: true
MONSTER_NATURAL_SPAWN: true
FIRE_IGNITE: true
FIRE_SPREAD: 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
@ -407,15 +482,55 @@ cave:
# Added since 1.10.0.
create-missing-nether-end-caves: false
commands:
# List of commands to run when a player joins.
# 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.
# 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: []
# 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:
# Allow setting home in the nether. Only available on nether islands, not vanilla nether.
allow: true
require-confirmation: true
the-end:
# Allow setting home in the end. Only available on end islands, not vanilla end.
allow: true
require-confirmation: true
deaths:

View File

@ -0,0 +1,312 @@
---
caveblock:
sign:
line0: "&cCaveBlock"
line1: Herzlich willkommen!
line2: "[name]"
line3: Fang an zu graben! & c <3
informational:
to-nether: Unglücklicherweise in den Nether gefallen.
to-the-end: Du hast das Ende erreicht.
to-normal: Zurück zu deiner Höhle.
general:
errors:
no-island: "&cDu hast keine Höhle!"
player-has-island: "&cSpieler hat bereits eine Höhle!"
player-has-no-island: "&cDieser Spieler hat keine Höhle!"
already-have-island: "&cDu hast bereits eine Höhle!"
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:
add:
name-has-island: "&c[name] hat eine Höhle. Entferne ihn von seiner Höhle
oder lösche sie!"
success: "&b[name] &awurde zu &b[owner]&as Höhle hinzugefügt."
kick:
success: "&b[name] &awurde aus der Höhle von &b[owner] &ageworfen."
setowner:
description: überträgt den Höhlenbesitz auf den Spieler
already-owner: "&c[name] ist bereits der Besitzer dieser Höhle!"
success: "&b[name] &aist jetzt der Besitzer dieser Höhle."
range:
description: Admin Cave Range Befehl
display:
description: Höhlenreichweite anzeigen/ausblenden
hint: |-
&cRote Barrier-Symbole &fzeigen die aktuelle höhlengeschützte Bereichsgrenze an.
&7Graue Partikel &fzeigen das maximale Höhlenlimit an.
&aGrüne Partikel &fzeigen den standardmäßig geschützten Bereich an, wenn der Höhlenschutzbereich davon abweicht.
set:
description: Legt den höhlengeschützten Bereich fest
success: "&aSetze den Höhlenschutzbereich auf &b[number]&a."
reset:
description: Setzt den Höhlenschutzbereich auf die Standardeinstellung
zurück
success: "&aHöhlenschutzbereich auf &b[number] &azurücksetzen."
register:
description: Registrieren Sie den Spieler für die Höhle, in der Sie sich befinden
registered-island: "&aSpieler zur Höhle bei [xyz] hinzugefügt."
already-owned: "&cHöhle gehört bereits einem anderen Spieler!"
no-island-here: "&cEs gibt hier keine Höhle. Bestätige, um eine zu erstellen."
in-deletion: "&cDieser Höhlenbereich wird derzeit gelöscht. Versuche es später."
cannot-make-island: "&cEine Höhle kann hier leider nicht platziert werden.
Gucke in die Console für mögliche Fehler."
unregister:
description: Besitzer von der Höhle abmelden, aber Höhlenblöcke behalten
unregistered-island: "&aSpieler aus der Höhle bei [xyz] entfernt."
info:
description: Erhalten Sie Informationen darüber, wo Sie sich befinden oder
in der Höhle des Spielers
no-island: "&cDu bist gerade nicht in einer Höhle..."
title: "========== Höhleninfo ============"
islands-in-trash: "&dPlayer hat Höhlen im Müll."
is-spawn: Insel ist eine Spawnhöhle
switchto:
description: Wechsle die Höhle des Spielers zu ersten im Müll
out-of-range: "&cNummer muss zwischen 1 und [number] liegen. Verwenden Sie
&l[label] trash [player] &c, um Höhlennummern anzuzeigen"
trash:
no-unowned-in-trash: "&cKeine nicht besessenen Höhlen im Müll"
no-islands-in-trash: "&cPlayer hat keine Höhlen im Müll"
description: Zeigen Sie nicht besessene Höhlen oder Spielerhöhlen im Müll
title: "&d=========== Höhlen im Müll ==========="
count: "&d&lCave [number]:"
use-switch: "& aVerwenden Sie & l [label] und wechseln Sie zu <player> <number>
& r & a, um den Spieler so zu wechseln, dass er in den Papierkorb fällt"
emptytrash:
description: Löschen Sie den Müll für den Spieler oder alle nicht besessenen
Höhlen im Müll
setrange:
description: Stellen Sie die Reichweite der Spielerhöhle ein
range-updated: Höhlenbereich auf [number] aktualisiert
tp:
description: teleportiere zur Höhle eines Spielers
getrank:
description: Holen Sie sich den Rang eines Spielers in seiner Höhle
rank-is: "&aRang ist [rank] in ihrer Höhle."
setrank:
description: Setze den Rang eines Spielers auf seine Höhle
setspawn:
description: Setze eine Höhle als Brut für diese Welt
already-spawn: "&cDiese Höhle ist bereits ein Spawn!"
no-island-here: "&cEs gibt hier keine Höhle."
confirmation: "&cBist du sicher, dass du diese Höhle als Spawn für diese Welt
setzen willst?"
resetflags:
description: Setzen Sie alle Höhlen auf die Standard-Flag-Einstellungen in
config.yml zurück
delete:
description: löscht die Höhle eines Spielers
cannot-delete-owner: "&cAlle Höhlenmitglieder müssen vor dem Löschen aus der
Höhle geworfen werden."
deleted-island: "&aHöhle bei &e[xyz] &awurde erfolgreich gelöscht."
island:
go:
description: teleportiere dich zu deiner Höhle
teleport: "&aTeleportiere dich zu deiner Höhle."
help:
description: Der Haupthöhlenbefehl
create:
description: Erstellen Sie eine Höhle mit optionalem Entwurf (erfordert Erlaubnis)
too-many-islands: "&cEs gibt zu viele Höhlen auf dieser Welt: Es gibt nicht
genug Platz, um deine zu erschaffen."
unable-create-island: "&cIhre Höhle konnte nicht generiert werden. Bitte wenden
Sie sich an einen Administrator."
creating-island: "&aErstellen Sie Ihre Höhle, bitte warten Sie einen Moment..."
pick: "&aWähle eine Höhle aus"
info:
description: Zeige Informationen über deine Höhle oder die Höhle des Spielers
an
near:
description: Zeigen Sie den Namen der benachbarten Höhlen um Sie herum
the-following-islands: "&aDie folgenden Höhlen befinden sich in der Nähe:"
no-neighbors: "&cSie haben keine unmittelbaren Nachbarhöhlen!"
reset:
description: Starten Sie Ihre Höhle neu und entfernen Sie die alte
must-remove-members: "&cDu musst alle Mitglieder aus deiner Höhle entfernen,
bevor du sie neu starten erstellen (/island team kick <player>)."
sethome:
must-be-on-your-island: "&cSie müssen in Ihrer Höhle sein, um nach Hause zu
gehen!"
home-set: "&6Ihr Home wurde auf Ihren aktuellen Standort gesetzt."
setname:
description: Setze einen Namen für deine Höhle
resetname:
description: Setzen Sie Ihren Höhlennamen zurück
team:
coop:
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]"
all-members-logged-off: "& cAlle Höhlenmitglieder haben sich abgemeldet,
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. "
you-will-lose-your-island: "& WARNUNG! Sie werden Ihre Höhle verlieren,
wenn Sie akzeptieren!"
errors:
island-is-full: "& cIhre Höhle ist voll, Sie können niemanden einladen."
accept:
you-joined-island: "& aSie sind einer Höhle beigetreten! Verwenden Sie
/ [label] team info, um die anderen Mitglieder anzuzeigen."
name-joined-your-island: "& ein [Name] hat sich deiner Höhle angeschlossen!"
confirmation: |-
& Sind Sie sicher, dass Sie diese Einladung annehmen möchten?
& c & lSie werden & r & c & Ihre aktuelle Höhle verlieren!
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!"
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"
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."
demote:
description: Herabstufen eines Spielers in Ihrer Höhle um einen Rang
promote:
description: Befördere einen Spieler in deiner Höhle um einen Rang
setowner:
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!"
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!"
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!"
banlist:
noone: "& aKeine Höhle ist in dieser Höhle verboten."
settings:
description: Höhleneinstellungen anzeigen
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!"
ranks:
owner: Zwergenkönig
sub-owner: Zwergenritter
member: Zwerg
trusted: Vertrauenswürdige
coop: Coop
visitor: Mensch
banned: Ork
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
& aEndermen können entfernen
& Ablocks aus Höhlen
name: Enderman trauert
ENTER_EXIT_MESSAGES:
island: "[name] Höhle"
GEO_LIMIT_MOBS:
description: |-
& aEntferne Mobs, die gehen
& aoutside geschützt
& Acave Raum
name: "& eLimit Mobs zur Höhle"
ISLAND_RESPAWN:
description: |-
& aPlayers respawn
& ain ihrer Höhle
name: Höhlen-Respawn
LIQUIDS_FLOWING_OUT:
name: Flüssigkeiten fließen außerhalb von Höhlen
description: |-
& aStellen Sie fest, ob Flüssigkeiten nach außen fließen können
& a der Schutzreichweite der Höhle.
LOCK:
description: Schloss umschalten
name: Höhle verschließen
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: Natürliche Kreatur, die außerhalb der Reichweite laicht
description: |-
& aToggle ob Kreaturen (Tiere und
& Amonster) können natürlich draußen laichen
& aa Höhlenschutzbereich.
& cBeachten Sie, dass es Kreaturen nicht verhindert
& cto Spawn über einen Mob Spawner oder einen Spawn
& cegg.
OFFLINE_GROWTH:
description: |-
& aWenn behindert, Pflanzen
& werde nicht in Höhlen wachsen
& wenn alle Mitglieder offline sind.
& aKann helfen, Verzögerungen zu reduzieren.
name: Offline-Wachstum
OFFLINE_REDSTONE:
description: |-
& aWenn deaktiviert, Redstone
Ich werde nicht in Höhlen arbeiten
& wo alle Mitglieder offline sind.
& aKann helfen, Verzögerungen zu reduzieren.
name: Offline Redstone
PISTON_PUSH:
description: |-
& aKolben schieben lassen
& Ablocks außerhalb der Höhle
name: Kolben drücken
REMOVE_MOBS:
description: |-
& aEntferne Monster, wenn
& ateleporting zur Höhle
name: Entferne Monster
TREES_GROWING_OUTSIDE_RANGE:
name: Bäume wachsen außerhalb der Reichweite
description: |-
& aToggle, ob Bäume außerhalb eines wachsen können
& acaves Schutzbereich oder nicht.
PREVENT_TELEPORT_WHEN_FALLING:
name: Verhindern Sie Teleport beim Fallen
description: |-
& aVermeide das Teleportieren von Spielern
& mit Befehlen in ihre Höhle staunen
& aif sie fallen.
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: [description]"
spawn-protected: "& cSpawn protected: [description]"
panel:
PROTECTION:
description: |-
& aSchutzeinstellungen
& vor dieser Höhle
SETTING:
description: |-
& aAllgemeine Einstellungen
& vor dieser Höhle
protection:
flags:
SKY_WALKER_FLAG:
description: |-
& 5 & oDies ermöglicht das Aktivieren / Deaktivieren
& 5 & Fähigkeit, auf dem zu gehen
& 5 & otop der Höhlenwelt
& 5 & ohne zusätzliche Berechtigungen.
name: Sky Walker
hint: Ermöglicht das Gehen auf der Höhlendecke.

View File

@ -24,6 +24,7 @@ caveblock:
already-have-island: "&cYou already have a cave!"
no-safe-location-found: "&cCould not find a safe spot to teleport you to on the cave."
not-owner: "&cYou are not the owner of your cave!"
cave-limit-reached: "&c You have reached the top of your cave. You cannot get higher!"
commands:
# Parameters in <> are required, parameters in [] are optional
admin:
@ -289,6 +290,6 @@ caveblock:
protection:
flags:
SKY_WALKER_FLAG:
description: "&5&oThis allows to enable/disable\n&5&oability to walk on the\n&5&otop of the cave world\n&5&owithout extra permissions."
description: "&5&oEnable/disable\n&5&o the ability to walk on\n&5&o the top of the cave world\n&5&o without extra permissions."
name: "Sky Walker"
hint: "Allows to walk on cave ceiling."
hint: "Allows to walk on the cave roof."

View File

@ -0,0 +1,301 @@
---
caveblock:
sign:
line0: "&cCaveBlock"
line1: "¡Bienvenido!"
line2: "[name]"
line3: "¡Cava! &c<3"
informational:
to-nether: Tan desafortunado en caer al infierno.
to-the-end: Haz alcanzado el fin.
to-normal: Volver a tu cueva.
general:
errors:
no-island: "&c¡No tienes una cueva!"
player-has-island: "&c¡Ese jugador ya tiene una cueva!"
player-has-no-island: "&c¡Ese jugador no tiene una cueva!"
already-have-island: "&c¡Ya tienes una cueva!"
no-safe-location-found: "&cNo encontramos un lugar seguro para teletransportarte
a la cueva."
not-owner: "&c¡No eres el propietario de la cueva!"
commands:
admin:
team:
add:
name-has-island: "&c[name] tiene una cueva. ¡Deshazte de ella primero!"
success: "&b[name]&a ha sido agregado a la cueva de &b[owner]&a."
kick:
success: "&b[name] &aha sido expulsado de la cueva de &b[owner]&a."
setowner:
description: transfiere la propiedad de la cueva al jugador
already-owner: "&c¡[name] ya es el propietario de esta cueva!"
success: "&b[name]&a es ahora el propietario de esta cueva."
range:
description: Comando de cuevas para administradores
display:
description: muestra/oculta los indicadores del rango de la cueva
hint: |-
&fLos &ciconos de barrera roja &fmuestran el límite de protección de la cueva.
&fLas &7partículas grises &fmuestran el limite máximo de la cueva.
&fLas &aparticulas verdes &fmuestran el rango predeterminado de protección si el actual es diferente.
set:
description: establece el rango de protección de la cueva
success: "&aHaz establecido el rango de protección de la cueva a &b[number]&a."
reset:
description: restablece el rango de protección de la cueva al predeterminado
del mundo
success: "&aHaz restablecido el rango de protección de la cueva a &b[number]&a."
register:
description: registra a un jugador a la cueva sin propietario en la que estás
registered-island: "&aJugador registrado en la cueva de [xyz]."
already-owned: "&c¡Esta cueva ya tiene propietario!"
no-island-here: "&cNo hay una cueva aquí. Confirmar para crear una."
in-deletion: "&cEsta cueva se está eliminando actualmente. Intenta más tarde."
cannot-make-island: "&c No se puede colocar una cueva aquí, lo sentimos. Revisa
la consola para posibles errores."
unregister:
description: elimina el propietario de la cueva, pero mantiene los bloques
unregistered-island: "&aEliminado el jugador de la cueva de [xyz]."
info:
description: obtener info. sobre donde estás o de la cueva
no-island: "&cNo estás en una cueva ahora mismo..."
title: "======== Info. de la cueva =========="
islands-in-trash: "&dEl jugador tiene cuevas en la basura."
is-spawn: La isla es una cueva de spawneo
switchto:
description: cambia la cueva del jugador a la numerada de la basura
out-of-range: "&cEl número debe estar entre 1 y [number]. Usa &l[label] trash
[player] &r&cpara ver el número de la cueva."
trash:
no-unowned-in-trash: "&cNo hay cuevas sin propietario en la basura."
no-islands-in-trash: "&cEl jugador no tiene cuevas en la basura"
description: muestra cuevas sin propietario o las cuevas del jugador en la
basura
title: "&d========== Cuevas en la basura =========="
count: "&l&dCueva [number]:"
use-switch: "&aUsa &l[label] switch <jugador> <número>&r&a para cambiar la
cueva del jugador a una de la basura."
emptytrash:
description: Limpiar la basura del jugador, o todas las cuevas sin propietario
en la basura
setrange:
description: establece el rango de la cueva del jugador
range-updated: Rango de cueva actualizado a [number]
tp:
description: teletransportarse a una cueva
getrank:
description: ver el rango de un jugador en su cueva
rank-is: "&aEl rango del jugador es [rank] en su cueva."
setrank:
description: establecer el rango del jugador en su cueva
setspawn:
description: establecer una cueva como spawn para este mundo
already-spawn: "&c¡Esta cueva ya es el spawn!"
no-island-here: "&cNo hay una cueva aquí."
confirmation: "&c¿Estás seguro que quieres establecer esta cueva como spawn
de este mundo?"
resetflags:
description: Restablecer todas las cuevas a los ajustes predeterminados en
config.yml
delete:
description: eliminar la cueva de un jugador
cannot-delete-owner: "&cTodos los miembros de la cueva deben ser expulsados
antes de eliminarla."
deleted-island: "&aCueva de &e[xyz] &aeliminada correctamente."
island:
go:
description: teletransportar a tu cueva
teleport: "&aTeletransportandote a tu cueva."
help:
description: El comando principal de las cuevas
create:
description: crear una cueva, usando un plano opcional (requiere permiso)
too-many-islands: "&cHay demasiadas cuevas en este mundo: no hay suficiente
espacio para crear una para ti."
unable-create-island: "&cTu cueva no pudo ser generada, por favor contacta
a un administrador."
creating-island: "&aCreando tu cueva, por favor espera un momento..."
pick: "&aElige una cueva"
info:
description: muestra info. de tu/otra cueva
near:
description: muestra el nombre de las cuevas vecinas
the-following-islands: "&aLas cuevas cercanas son:"
no-neighbors: "&c¡No hay cuevas vecinas!"
reset:
description: reinicia tu cueva y elimina la anterior
must-remove-members: "&cDebes eliminar a todos los miembros de tu cueva antes
de poder reiniciarla (/island team kick <jugador>)."
sethome:
must-be-on-your-island: "&c¡Debes estar en tu cueva para establecer el hogar!"
home-set: "&6El hogar de tu cueva ha sido establecido a tu posición actual."
setname:
description: establece un nombre a tu cueva
resetname:
description: reinicia el nombre de tu cueva
team:
coop:
description: dar rango coop. a un jugador en tu cueva
uncoop:
you-are-no-longer-a-coop-member: "&cYa no eres un miembro coop en la cueva
de [name]"
all-members-logged-off: "&cTodos los miembros de la cueva de [name] se desconectaron
así que ya no eres un miembro coop."
trust:
description: dar rango aliado a un jugador en tu cueva
invite:
description: invita a un jugador a tu cueva
name-has-invited-you: "&a[name] te ha invitado a su cueva."
you-will-lose-your-island: "&c¡ADVERTENCIA! ¡Perderás tu cueva si aceptas!"
errors:
island-is-full: "&cTu cueva está llena, no puedes invitar a nadie más."
accept:
you-joined-island: "&a¡Te uniste a una cueva! Usa /[label] team info para
ver a los otros miembros."
name-joined-your-island: "&a¡[name] se unió a tu cueva!"
confirmation: |-
&c¿Estás seguro que quieres aceptar la invitación?
&c&l¡&nPERDERAS&c&l tu cueva actual!
reject:
you-rejected-invite: "&aHaz rechazado la invitación."
name-rejected-your-invite: "&c¡[name] rechazo la invitación!"
cancel:
description: cancela invitaciones pendientes para unirse a tu cueva
leave:
description: salir de tu cueva
left-your-island: "&c[name] &csalió de la cueva"
kick:
description: elimina un miembro de tu cueva
owner-kicked: "&c¡El propietario te ha expulsado de la cueva!"
success: "&b[name] &aha sido expulsado de tu cueva."
demote:
description: desciende un rango a un jugador de tu cueva
promote:
description: asciende un rango a un jugador de tu cueva
setowner:
description: transfiere la propiedad de tu cueva a otro jugador
errors:
target-is-not-member: "&c¡Este jugador no pertenece a tu cueva!"
name-is-the-owner: "&a¡[name] ahora es el propietario de la cueva!"
you-are-the-owner: "&a¡No eres el propietario de la cueva!"
ban:
description: banear un jugador de tu cueva
cannot-ban-more-players: "&cHaz alcanzado el limite de baneos, no puedes banear
más jugadores de tu cueva."
player-banned: "&b[name]&c ahora está baneado de tu cueva."
owner-banned-you: "&c¡&b[name]&c te ha baneado de su cueva!"
you-are-banned: "&b¡Estás baneado de esta cueva!"
unban:
description: desbanear un jugador de tu cueva
player-unbanned: "&b[name]&a ha sido desbaneado de tu cueva."
you-are-unbanned: "&a¡&b[name]&a te ha desbaneado de su cueva!"
banlist:
noone: "&aNadie está baneado en esta cueva."
settings:
description: muestra los ajustes de la cueva
expel:
description: expulsa a un jugador de tu cueva
not-on-island: "&c¡Ese jugador no está en tu cueva!"
player-expelled-you: "&c¡&b[name]&c te expulsó de la cueva!"
ranks:
owner: Rey enano
sub-owner: Caballero enano
member: Enano
trusted: Aliado
coop: Coop
visitor: Humano
banned: Orco
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
&aLos Endermans pueden quitar
&abloques de las cuevas
name: Grifeo de Endermans
ENTER_EXIT_MESSAGES:
island: Cueva de [name]
GEO_LIMIT_MOBS:
description: |-
&aEliminar las criaturas que salgan
&adel espacio protegido de la cueva
name: "&eLimitar criaturas a la cueva"
ISLAND_RESPAWN:
description: |-
&aLos jugadores reaparecen
&aen sus cuevas
name: Reaparición en cuevas
LIQUIDS_FLOWING_OUT:
name: Flujo de líquidos por fuera
description: |-
&aAlternar si los líquidos pueden fluir por
&afuera del rango de protección de la cueva.
LOCK:
description: Alternar bloqueo
name: Bloquear cueva
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: Aparición natural de criaturas por fuera
description: |-
&aAlternar si las criaturas (animales y
&amonstruos) pueden aparecer naturalmente por fuera
&adel rango de protección de la cueva.
&cTen en cuenta que esto no previene la aparición
&cde criaturas mediante un spawner o huevo.
OFFLINE_GROWTH:
description: |-
&aAl desactivarse, las plantas no
&acrecerán en cuevas con todos
&asus miembros desconectados.
&aPuede ayudar a reducir el lag.
name: Crecimiento fuera de línea
OFFLINE_REDSTONE:
description: |-
&aAl desactivarse, la redstone no
&afuncionará en cuevas con todos
&asus miembros desconectados.
&aPuede ayudar a reducir el lag.
name: Redstone fuera de línea
PISTON_PUSH:
description: |-
&aPermitir que los pistones empujen
&abloques fuera de la cueva
name: Empuje de pistones
REMOVE_MOBS:
description: |-
&aEliminar monstruos cuando te
&ateletransportas a la cueva
name: Eliminar monstruos
TREES_GROWING_OUTSIDE_RANGE:
name: Crecimiento de arboles por fuera
description: |-
&aAlternar si los arboles pueden crecer por fuera
&adel rango de protección de la cueva o no.
PREVENT_TELEPORT_WHEN_FALLING:
name: Evitar el teletransporte al caer
description: |-
&aEvitar que los jugadores se teletransporten
&aa sus cuevas usando comandos
&amientras están cayendo.
hint: "&cNo puedes teletransportarte a tu cueva mientras estás cayendo."
locked: "&c¡Esta cueva está bloqueada!"
protected: "&cCueva protegida: [description]"
spawn-protected: "&cSpawn protegido: [description]"
panel:
PROTECTION:
description: |-
&aAjustes de protección
&apara esta cueva
SETTING:
description: |-
&aAjustes generales
&apara esta cueva
protection:
flags:
SKY_WALKER_FLAG:
description: |-
&5&oEsto permite activar/desactivar
&5&ola habilidad para caminar en el
&5&otecho del mundo de cuevas
&5&osin permisos extra.
name: Caminante aéreo
hint: Permite caminar en el techo de la cueva

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,301 @@
---
caveblock:
sign:
line0: "&cCaveBlock"
line1: Witaj!
line2: "[name]"
line3: Zacznij kopać! &c<3
informational:
to-nether: Uuu... Pech, wpadłes do Netheru.
to-the-end: To już jest koniec.
to-normal: Powrót do jaskini.
general:
errors:
no-island: "&cNie masz jaskini!"
player-has-island: "&cGracz już posiada jaskinie!"
player-has-no-island: "&cTen gracz nie posiada jaskini!"
already-have-island: "&cJuż masz jaskinie!"
no-safe-location-found: "&cNie można znaleźć bezpiecznego miejsca dla teleportu
do jaskini."
not-owner: "&cTo nie twoja jaskinia!"
commands:
admin:
team:
add:
name-has-island: "&c[name] posiada jaskinie. Pierw wyrejestruj lub usuń!"
success: "&b[name]&a został dodany do jaskini gracza &b[owner]."
kick:
success: "&b[name] &azostał wyrzucony z jaskini gracza &b[owner]."
setowner:
description: przenosi własności jaskini do gracza
already-owner: "&c[name] jest już właścicielem tej jaskini!"
success: "&b name]&a jest teraz właścicielem tej jaskini."
range:
description: Zasięg komendy Jaskinii Admina
display:
description: pokaż/ukryj wskaźniki zasięgu jaskiń
hint: |-
&cCzerwone ikony bariery &fpokazują aktualny limit zasięgu chronionego jaskini.
&7Szare cząsteczki &fpokazują maksymalny limit jaskini.
&aZielone cząsteczki &fpokazują domyślny zasięg ochrony, jeśli zasięg ochrony jaskini różni się od niego.
set:
description: ustawia zasięg ochrony jaskini
success: "&aUstaw zasięg ochrony jaskini na &b[liczba]&a."
reset:
description: resetuje zasięg chroniony jaskini do wartości domyślnych świata
success: "&aZresetuj zasięg ochrony jaskini na &b[numer]&a."
register:
description: zarejestruj gracza w niezarejestrowanej jaskini, w której się
znajdujesz
registered-island: "&aZarejestrowano gracza do jaskini w [xyz]."
already-owned: "&cJaskinia jest już własnością innego gracza!"
no-island-here: "&cTutaj nie ma jaskini. Potwierdź, aby utworzyć."
in-deletion: "&cTo miejsce jaskini jest obecnie usuwane. Spróbuj później."
cannot-make-island: "&cPrzepraszamy, nie można tu umieścić jaskini. Zobacz
konsolę, aby poznać możliwe błędy."
unregister:
description: wyrejestruj właściciela z jaskini, ale zachowaj bloki jaskiniowe
unregistered-island: "&aNiezarejestrowany gracz z jaskini w [xyz]."
info:
description: uzyskaj informacje o tym, gdzie jesteś lub o jaskini gracza
no-island: "&cNie jesteś teraz w jaskini ..."
title: "======== Informacje o jaskini ========"
islands-in-trash: "&dGracz ma jaskinie w koszu."
is-spawn: Wyspa jest jaskinią spawnu
switchto:
description: zmień jaskinię gracza na ponumerowaną znajdującą się w koszu
out-of-range: "&cNumer musi mieścić się w przedziale od 1 do [number]. Użyj
&l[label] trash [player], &r&caby zobaczyć numery jaskiń"
trash:
no-unowned-in-trash: "&cŻadnych bezpańskich jaskiń w śmieciach"
no-islands-in-trash: "&cGracz nie ma jaskiń w koszu"
description: pokaż bezpańskie jaskinie lub jaskinie graczy w śmieciach
title: "&d=========== Jaskinie w koszu ==========="
count: "&l&dJaskinia [number]:"
use-switch: "&aUżyj &l[label] switchto <player> <number>&r&a aby przełączyć
gracza do jaskini w koszu"
emptytrash:
description: Usuń śmieci dla gracza lub wszystkie bezpańskie jaskinie w koszu
setrange:
description: ustaw zasięg jaskini gracza
range-updated: Zasięg jaskiń został zaktualizowany do [number]
tp:
description: teleportuj się do jaskini gracza
getrank:
description: zdobądź rangę gracza w swojej jaskini
rank-is: "&aRank to [range] w ich jaskini."
setrank:
description: ustaw rangę gracza w jego jaskini
setspawn:
description: ustaw jaskinię jako spawn dla tego świata
already-spawn: "&cTa jaskinia już się odradza!"
no-island-here: "&cNie ma tu jaskini."
confirmation: "&cCzy na pewno chcesz ustawić tę jaskinię jako miejsce odrodzenia
tego świata?"
resetflags:
description: Zresetuj wszystkie jaskinie do domyślnych ustawień flag w config.yml
delete:
description: usuwa jaskinię gracza
cannot-delete-owner: "&cWszyscy członkowie jaskini muszą zostać wyrzuceni
z jaskini przed jej usunięciem."
deleted-island: "&aWyspa w &e[xyz] &azostała pomyślnie usunięta."
island:
go:
description: teleportować cię do swojej jaskini
teleport: "&aTeleportuję Cię do Twojej jaskini."
help:
description: Główne dowództwo jaskini
create:
description: stwórz jaskinię, korzystając z opcjonalnego planu (wymaga pozwolenia)
too-many-islands: "&cNa tym świecie jest zbyt wiele jaskiń: nie ma wystarczająco
dużo miejsca, aby stworzyć twoją."
unable-create-island: "&cTwoja jaskinia nie może zostać wygenerowana, skontaktuj
się z administratorem."
creating-island: "&aTworzenie jaskini, proszę chwilę poczekać..."
pick: "&aWybierz jaskinię"
info:
description: wyświetlaj informacje o swojej jaskini lub jaskini gracza
near:
description: pokaż nazwy sąsiednich jaskiń wokół ciebie
the-following-islands: "&aW pobliżu znajdują się następujące jaskinie:"
no-neighbors: "&cNie masz bezpośrednio sąsiadujących jaskiń!"
reset:
description: uruchom ponownie jaskinię i usuń starą
must-remove-members: "&cMusisz usunąć wszystkich członków ze swojej jaskini,
zanim będziesz mógł ją ponownie uruchomić (/island team kick <gracz>)."
sethome:
must-be-on-your-island: "&cMusisz być w swojej jaskini, aby wrócić do domu!"
home-set: "&6Twój dom w jaskini został ustawiony na bieżącą lokalizację."
setname:
description: ustaw nazwę dla swojej jaskini
resetname:
description: zresetuj nazwę jaskini
team:
coop:
description: zrób ranking kooperacyjny gracza w swojej jaskini
uncoop:
you-are-no-longer-a-coop-member: "&cNie jesteś już członkiem współpracy
w jaskini [name]"
all-members-logged-off: "&cWszyscy członkowie jaskini wylogowali się, więc
nie jesteś już członkiem kooperacji w jaskini [name]"
trust:
description: dać graczowi zaufaną rangę w swojej jaskini
invite:
description: zaproś gracza do swojej jaskini
name-has-invited-you: "&a[name] zaprasza Cię do swojej jaskini."
you-will-lose-your-island: "&cOSTRZEŻENIE! Stracisz swoją jaskinię, jeśli
się zgodzisz!"
errors:
island-is-full: "&cTwoja jaskinia jest pełna, nie możesz nikogo zaprosić."
accept:
you-joined-island: "&aDołączyłeś do jaskini! Użyj /[etykieta] informacji
o zespole, aby zobaczyć innych członków."
name-joined-your-island: "&a[name] dołączył do Twojej jaskini!"
confirmation: |-
&cCzy na pewno chcesz przyjąć to zaproszenie?
&c&lZgubisz&n&r &c&lyswoją obecną jaskinię!
reject:
you-rejected-invite: "&aOdrzuciłeś zaproszenie do jaskini."
name-rejected-your-invite: "&c[name] odrzucił Twoje zaproszenie do jaskini!"
cancel:
description: anuluj oczekujące zaproszenie do swojej jaskini
leave:
description: opuść swoją jaskinię
left-your-island: "&c[name] &rozszczep swoją jaskinię"
kick:
description: usuń członka ze swojej jaskini
owner-kicked: "&cWłaściciel wykopał cię z jaskini!"
success: "&b[name] &został wyrzucony z Twojej jaskini."
demote:
description: zdegraduj gracza w swojej jaskini w dół o rangę
promote:
description: awansować gracza w swojej jaskini na wyższą rangę
setowner:
description: przenieść własność jaskini na członka
errors:
target-is-not-member: "&cTen gracz nie jest częścią twojej drużyny jaskiniowej!"
name-is-the-owner: "&a[name] jest teraz właścicielem jaskini!"
you-are-the-owner: "&aJesteś teraz właścicielem jaskini!"
ban:
description: zbanuj gracza ze swojej jaskini
cannot-ban-more-players: "&c Osiągnąłeś limit banów, nie możesz zbanować więcej
graczy ze swojej jaskini."
player-banned: "&b[name]&c jest teraz zablokowany w Twojej jaskini."
owner-banned-you: "&b[name]&c zabronił Ci wstępu do swojej jaskini!"
you-are-banned: "&bNie masz dostępu do tej jaskini!"
unban:
description: odbanuj gracza z twojej jaskini
player-unbanned: "&b[name]&a jest teraz odblokowany w Twojej jaskini."
you-are-unbanned: "&b[name]&a odblokował cię w swojej jaskini!"
banlist:
noone: "&aNikt nie jest zabroniony w tej jaskini."
settings:
description: wyświetl ustawienia jaskini
expel:
description: wyrzuć gracza ze swojej jaskini
not-on-island: "&cTego gracza nie ma w twojej jaskini!"
player-expelled-you: "&b[name]&c wyrzucił cię z jaskini!"
ranks:
owner: Król krasnoludów
sub-owner: Krasnoludzki Rycerz
member: Krasnolud
trusted: Zaufane
coop: Kooperacja
visitor: Człowiek
banned: Ork
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
&aEndermen może usunąć
&blokady z jaskiń
name: Rozpacz Endermana
ENTER_EXIT_MESSAGES:
island: Jaskinia [name]
GEO_LIMIT_MOBS:
description: |-
&aUsuń moby, które idą
&poza chronionym
&ostań w przestrzeni
name: "&eOgranicz moby do jaskini"
ISLAND_RESPAWN:
description: |-
&aGracze odradzają się
&w ich jaskini
name: Odrodzenie w jaskini
LIQUIDS_FLOWING_OUT:
name: Płyny wypływające poza jaskinie
description: |-
&aPrzełącz, czy płyny mogą wypływać na zewnątrz
&a zasięgu ochrony jaskini.
LOCK:
description: Przełącz blokadę
name: Zablokuj jaskinię
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: Naturalne stworzenie odradzające się poza zasięgiem
description: |-
&aPrzełącz czy stworzenia (zwierzęta i
i potwory) mogą naturalnie odradzać się na zewnątrz
&aa zasięg ochrony jaskini.
&cPamiętaj, że nie zapobiega to stworzeniom
&cby odradzać się za pomocą generatora mobów lub spawnu
&ceg.
OFFLINE_GROWTH:
description: |-
&aPo wyłączeniu rośliny
&nie będzie rosnąć w jaskiniach
&kiedy wszyscy członkowie są offline.
&aMoże pomóc zmniejszyć opóźnienia.
name: Rozwój offline
OFFLINE_REDSTONE:
description: |-
&aKiedy wyłączone, czerwony kamień
&nie będzie działać w jaskiniach
&gdzie wszyscy członkowie są offline.
&aMoże pomóc zmniejszyć opóźnienia.
name: Offline Redstone
PISTON_PUSH:
description: |-
&aZezwalaj tłokom na pchanie
&blokuje na zewnątrz jaskini
name: Popychanie tłoka
REMOVE_MOBS:
description: |-
&aUsuń potwory, gdy
&ateleport do jaskini
name: Usuń potwory
TREES_GROWING_OUTSIDE_RANGE:
name: Drzewa rosnące poza zasięgiem
description: |-
&aPrzełącz, czy drzewa mogą rosnąć na zewnątrz i
zakres ochrony &acave, czy nie.
PREVENT_TELEPORT_WHEN_FALLING:
name: Zapobiegaj teleportacji podczas upadku
description: |-
&aZapobiegaj teleportacji graczy
&z powrotem do swojej jaskini za pomocą poleceń
i jeśli spadają.
hint: "&cNie możesz teleportować się z powrotem do swojej jaskini, gdy spadasz."
locked: "&cTa jaskinia jest zamknięta!"
protected: "&cJaskinia chroniona: [description]"
spawn-protected: "&cSpawn chroniony: [description]"
panel:
PROTECTION:
description: |-
&aUstawienia ochrony
&dla tej jaskini
SETTING:
description: |-
&aUstawienia ogólne
&dla tej jaskini
protection:
flags:
SKY_WALKER_FLAG:
description: |-
&5&oPozwala to włączyć/wyłączyć
&5&możliwość chodzenia po
&5&otop świata jaskiń
&5&obez dodatkowych uprawnień.
name: Sky Walker
hint: Pozwala chodzić po suficie jaskini.

View File

@ -0,0 +1,306 @@
---
caveblock:
sign:
line0: "&cCaveBlock"
line1: Добро пожаловать!
line2: "[name]"
line3: Начни копать! &c<3
informational:
to-nether: Так неудачно впасть в ад.
to-the-end: Вы достигли конца.
to-normal: Вернуться к вашей пещере.
general:
errors:
no-island: "&cУ вас нет пещеры!"
player-has-island: "&cУ этого игрока уже есть пещера!"
player-has-no-island: "&cУ этого игрока нет пещеры!"
already-have-island: "&cУ вас уже есть пещера!"
no-safe-location-found: "&cНе удалось найти безопасное место для телепортации
в пещеру."
not-owner: "&cВы не владелец этой пещеры!"
cave-limit-reached: "&c Вы достигли вершины своей пещеры. Вы не можете стать
выше!"
commands:
admin:
team:
add:
name-has-island: "&c[name] имеет пещеру. Сначала отмените регистрацию или
удалите её!"
success: "&b[name]&a был добавлен в пещеру игрока&b [owner]&a."
kick:
success: "&b[name]&a был выгнан из пещеры &b[owner]&a."
setowner:
description: передать владение пещеры игроку
already-owner: "&c[name] уже является владельцем этой пещеры!"
success: "&b[name]&a теперь является владельцем этой пещеры."
range:
description: Пещерный диапазон (Админ-команда)
display:
description: показать/скрыть индикаторы диапазона пещеры
hint: |-
&cКрасные барьеры &f- показывают текущий предел защищенного пещерного диапазона.
&7Серые Частицы &f- показывают максимальный предел пещеры.
&aЗеленные Частицы &f- показывают защищенный диапазон по умолчанию, если диапазон защиты пещеры отличается от него.
set:
description: устанавливает диапазон защиты пещеры
success: "&aУстановить диапазон защиты пещеры до &b[number]&a."
reset:
description: сбрасывает защищенный пещерой диапазон в мир по умолчанию
success: "&aСбросить диапазон защиты пещеры до &b[number]&a."
register:
description: зарегистрировать игрока в неизвестной пещере, в которой вы находитесь
registered-island: "&aЗарегистрирован игрок в пещере [xyz]."
already-owned: "&cПещера уже принадлежит другому игроку!"
no-island-here: "&cИ здесь нет пещеры. Подтвердите, чтобы сделать один."
in-deletion: "&cЭто пещерное пространство в настоящее время удаляется. Попробуй
позже."
cannot-make-island: "&cПещера не может быть размещена здесь, извините. Смотрите
консоль для возможных ошибок."
unregister:
description: не зарегистрирован владелец в пещере, но сохранены пещерные блоки
unregistered-island: "&aНезарегистрированный игрок из пещеры в [xyz]."
info:
description: получить информацию о том, где вы находитесь или пещера игрока
no-island: "&cВы не в пещере сейчас..."
title: "==========Информация о пещере============"
islands-in-trash: "&dИгрок имеет пещеры в мусорном ведре."
is-spawn: Этот остров является спавном.
switchto:
description: переключить пещеру игрока на пронумерованную в мусорном ведре
out-of-range: "&cНомер должен быть от 1 до [number]. Используйте &l[label]
мусорки [player] &r&c, чтобы увидеть номера пещер"
trash:
no-unowned-in-trash: "&cНе принадлежат пещеры в мусоре"
no-islands-in-trash: "&cИгрок не имеет пещер в мусорном ведре"
description: показать неиспользуемые пещеры или пещеры игрока в мусорном ведре
title: "&d===========Пещеры в корзине==========="
count: "&l&dПещера [number]:"
use-switch: "&aИспользуйте &l[label] чтобы поменять на <игрок> <номер> &r&a,
чтобы переключить игрока в пещеру в корзине"
emptytrash:
description: Очистить мусор для игрока, или все ненужные пещеры в мусоре
setrange:
description: установить диапазон пещеры игрока
range-updated: Пещерный диапазон обновлен до [number]
tp:
description: телепортироваться в пещеру игрока
getrank:
description: получить звание игрока в своей пещере
rank-is: "&aРанг - [rank] в этой пещере."
setrank:
description: установить ранг игрока в своей пещере
setspawn:
description: установить пещеру как спавн для этого мира
already-spawn: "&cЭта пещера уже спавн!"
no-island-here: "&cЗдесь нет пещеры."
confirmation: "&сВы уверены, что хотите установить эту пещеру в качестве спавна
для этого мира?"
resetflags:
description: Сброс всех пещер к настройкам флага по умолчанию в config.yml
delete:
description: удаляет пещеру игрока
cannot-delete-owner: "&cВсе члены пещеры должны быть выгнаны из пещеры перед
удалением."
deleted-island: "&aОстров на &e[xyz] &aбыл успешно удален."
island:
go:
description: телепортировать вас в вашу пещеру
teleport: "&aТелепортируем вас в вашу пещеру."
help:
description: Основная пещерная команда
create:
description: создать пещеру, используя необязательный проект (требуется разрешение)
too-many-islands: "&cВ этом мире слишком много пещер: недостаточно места для
создания вашей."
unable-create-island: "&cВашу пещеру не удалось создать, обратитесь к администратору."
creating-island: "&aСоздавается ваша пещера, пожалуйста, подождите..."
pick: "&cВыберите пещеру"
info:
description: отображать информацию о вашей пещере или пещере игрока
near:
description: показать названия соседних пещер вокруг вас
the-following-islands: "&aСледующие пещеры находятся поблизости:"
no-neighbors: "&cУ вас нет ближайших соседних пещер!"
reset:
description: перезапустите свою пещеру и удалите старую
must-remove-members: "&cВы должны удалить всех участников из своей пещеры,
прежде чем сможете ее перезапустить (/ island team kick <player>)."
sethome:
must-be-on-your-island: "&cВы должны быть в своей пещере, чтобы установить
дом!"
home-set: "&6Ваш дом в пещере был настроен на ваше текущее местоположение."
setname:
description: установить имя для вашей пещеры
resetname:
description: сбросить имя пещеры
team:
coop:
description: Добавить игрока в вашу пещеру
uncoop:
you-are-no-longer-a-coop-member: "&cВы больше не являетесь членом кооператива
пещеры [name]"
all-members-logged-off: "&cВсе участники пещеры вышли из системы, так что
вы больше не являетесь членом кооператива пещеры [name]"
trust:
description: дать игроку звание доверенного в вашей пещере
invite:
description: пригласить игрока к вашей пещере
name-has-invited-you: "&a[name] пригласил вас к его пещере."
you-will-lose-your-island: "&сВНИМАНИЕ! Вы потеряете свою пещеру, если вы
примете!"
errors:
island-is-full: "&сВаша пещера заполнена, вы не можете пригласить кого-либо
еще."
accept:
you-joined-island: "&aВы присоединились к пещере! Используйте /[label]
информацию о команде, чтобы увидеть других участников."
name-joined-your-island: "&a[name] присоединилось к вашей пещере!"
confirmation: |-
&cВы уверены, что хотите принять это приглашение?
&c&lВы будете &nУДАЛЕНЫ &r&c с вашей пещеры!
reject:
you-rejected-invite: "&aВы отклонили приглашение присоединиться к пещере."
name-rejected-your-invite: "&c[name] отклонил ваше приглашение в пещеру!"
cancel:
description: отменить ожидающее приглашение присоединиться к вашей пещере
leave:
description: покинуть свою пещеру
left-your-island: "&c[name] вышел с вашей пещеры"
kick:
description: удалить члена из вашей пещеры
owner-kicked: "&cВладелец выгнал вас из пещеры!"
success: "&b[name]&a был изгнан из вашей пещеры."
demote:
description: понизить игрока в вашей пещере по рангу
promote:
description: повысить игрока в вашей пещере до более высокого звания
setowner:
description: передать право собственности на пещеру участнику
errors:
target-is-not-member: "&cЭтот игрок не является частью вашей пещерной
команды!"
name-is-the-owner: "&a[name] теперь является владельцем пещеры!"
you-are-the-owner: "&aТеперь вы владелец пещеры!"
ban:
description: забанить игрока из вашей пещеры
cannot-ban-more-players: "&cВы достигли предела банов, вы не можете забанить
больше игроков из своей пещеры."
player-banned: "&b[name]&c теперь заблокировано в вашей пещере."
owner-banned-you: "&b[name]&c забанили вас из своей пещеры!"
you-are-banned: "&bВы забанены в этой пещере!"
unban:
description: разблокировать игрока из вашей пещеры
player-unbanned: "&b[name]&a теперь не заблокирован в вашей пещере."
you-are-unbanned: "&b[name] &aне пускай тебя в пещеру"
banlist:
noone: "&aНикто не забанен в этой пещере."
settings:
description: настройки отображения пещеры
expel:
description: изгнать игрока из вашей пещеры
not-on-island: "&cэтот игрок не в вашей пещере!"
player-expelled-you: "&b[name]&c выгнал тебя из пещеры!"
ranks:
owner: Король гномов
sub-owner: Гном Рыцарь
member: Гном
trusted: доверенный
coop: КО-ОП
visitor: Человек
banned: Огр
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
&aЭндермен может удалить
&aблоки из пещер
name: Гриферство эндермена
ENTER_EXIT_MESSAGES:
island: пещера [name]
GEO_LIMIT_MOBS:
description: |-
&aУдалиет мобов, которые уходят
&aвне защиты
&aв пещеру
name: "&eЛимит мобов в пещере"
ISLAND_RESPAWN:
description: |-
&aреспаун игрока
&aв его пещере
name: Респавн пещеры
LIQUIDS_FLOWING_OUT:
name: Жидкости текут вне пещер
description: |-
&aВключить, могут ли жидкости вытекать наружу
&aиз диапазона защиты пещеры.
LOCK:
description: Включить/Выключить жидкости
name: Замок пещеры
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: Естественное существо появляется вне пределов досягаемости
description: |-
&aПереключить ли существа (животных и
&aмонстров) могут порождаться естественным путем снаружи
&aДиапазон защиты пещеры.
&cОтметьте, что это не мешает существам
&c порождение через порождения моба или спавна
&cяйца.
OFFLINE_GROWTH:
description: |-
&aКогда выключено, растения
&aне будет расти в пещерах
&aкогда все участники не в сети.
&aМожет помочь уменьшить отставание.
name: Оффлайн Рост
OFFLINE_REDSTONE:
description: |-
&aКогда отключено, Редстоун
&aне будет работать в пещерах
&aкогда все участники не в сети.
&aМожет помочь уменьшить отставание.
name: Оффлайн Редстоун
PISTON_PUSH:
description: |-
&aРазрешить толкать поршни
&aи за пределами пещеры
name: Поршневой толчок
REMOVE_MOBS:
description: |-
&aУдалить монстров, при
&aтелепортации в пещеру
name: Удалить монстров
TREES_GROWING_OUTSIDE_RANGE:
name: Деревья, растущие вне диапазона
description: |-
&aВключить, могут ли деревья расти вне
&aДиапазона защиты пещеры или нет.
PREVENT_TELEPORT_WHEN_FALLING:
name: Предотвратить телепорт при падении
description: |-
&aПредотвращение игроков от &aтелепортации
&aснова в свою пещеру, используя команды
&aесли они падают.
hint: "&cВы не можете телепортироваться обратно в свою пещеру, пока падаете."
locked: "&cЭта пещера заперта!"
protected: "&cПещера защищена: [description]"
spawn-protected: "&cСпавн защищен: [description]"
panel:
PROTECTION:
description: |-
&aнастройки защиты
&aдля этой пещеры
SETTING:
description: |-
&aОбщие настройки
&aдля этой пещеры
protection:
flags:
SKY_WALKER_FLAG:
description: |-
&5&oЭто позволяет включить / отключить
&5&oвозможность ходить по
&5&oверхности из пещерного мира
&5&oбез дополнительных разрешений.
name: Ходящий по небу
hint: Позволяет ходить по пещерному потолку.

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,292 @@
###########################################################################################
# This is a YML file. Be careful when editing. Check your edits in a YAML checker like #
# the one at http://yaml-online-parser.appspot.com #
###########################################################################################
caveblock:
sign:
line0: "&cCaveBlock"
line1: "Chào mừng!"
line2: "[name]"
line3: "Đào đi! &c<3"
informational:
to-nether: "Rất tệ khi vào địa ngục."
to-the-end: "Kết thúc rồi."
to-normal: "Về hang của bạn."
# Override BentoBox default command strings
# General strings
general:
errors:
no-island: "&cBạn không có hang!"
player-has-island: "&cNgười chơi đã có hang!"
player-has-no-island: "&cNgười chơi không có hang!"
already-have-island: "&cBạn đã có hang!"
no-safe-location-found: "&cKhông thể tìm thấy vị trí an toàn trong hang."
not-owner: "&cBạn không phải chủ hang!"
commands:
# Parameters in <> are required, parameters in [] are optional
admin:
team:
add:
name-has-island: "&c[name] đã có hang. Huỷ hoặc xoá nó trước!"
success: "&b[name]&a đã được thêm vào hang của &b[owner]&a."
kick:
success: "&b[name] &ađã bị đuổi từ hang của &b[owner]&a."
setowner:
description: "chuyển quyền chủ hang cho người chơi"
already-owner: "&c[name] đã là chủ hang!"
success: "&b[name]&a giờ là chủ hang."
range:
description: "lệnh độ rộng hang của Admin"
display:
description: "hiện/ẩn đánh dấu độ rộng hang"
hint: |-
&cKí tự Rào chặn đỏ &fthể hiện độ rộng vùng bảo vệ của hang.
&7Hạt Xám &fthể hiện giới hạn của hang.
&aHạt Xanh &fthể hiện vùng bảo vệ mặc định nếu vùng bảo vệ của hang khác mặc định.
set:
description: "chỉnh vùng bảo vệ hang"
success: "&aĐã chỉnh vùng bảo vệ hang thành &b[number]&a."
reset:
description: "chỉnh vùng bảo vệ hang về mặc định"
success: "&aĐã chỉnh vùng bảo vệ hang thành &b[number]&a."
register:
description: "đăng kí người chơi vào hang không chủ ở vị trí của bạn"
registered-island: "&aĐã đăng kí người chơi ở hang [xyz]."
already-owned: "&cHang đã có chủ!"
no-island-here: "&cKhông có hang ở đây. Xác nhận để tạo."
in-deletion: "&cHang đang được xoá. Thử lại sau."
cannot-make-island: "&c Hang không thể đặt ở đây. Xem lỗi trên bảng điều khiển."
unregister:
description: "huỷ quyền chủ hang, nhưng giữ lại các khối trong hang"
unregistered-island: "&aĐã huỷ đăng kí người chơi ở hang [xyz]."
info:
description: "lấy thông về nơi bạn ở hoặc hang của người chơi"
no-island: "&cBạn không ở một hang..."
title: "========== Thông tin Hang ============"
islands-in-trash: "&dNgười chơi có hang trong thùng rác."
is-spawn: "Đảo là hang triệu hồi"
switchto:
description: "chuyển hang của người chơi thành một số trong thùng rác"
out-of-range: "&cSố phải từ 1 đến [number]. Dùng &l[label] trash [player] &r&cđể xem số hang"
trash:
no-unowned-in-trash: "&cKhông có hang không chủ trong thùng rác"
no-islands-in-trash: "&cNgười chơi không có hang trong thùng rác"
description: "xem hang không chủ hoặc của người chơi trong thùng rác"
title: "&d=========== Hang trong Thùng Rác ==========="
count: "&l&dHang [number]:"
use-switch: "&aDùng &l[label] switchto <player> <number>&r&a để chuyển người chơi vào hang trong thùng rác"
emptytrash:
description: "Dọn rác cho người chơi, hoặc toàn bộ hang không chủ trong thùng rác"
setrange:
description: "chỉnh độ rộng hang của người chơi"
range-updated: "Đã chỉnh độ rộng của hang thành [number]"
tp:
description: "dịch chuyển đến hang của người chơi"
getrank:
description: "xem cấp độ của người chơi trong hang"
rank-is: "&aCấp độ là [rank] ở hang của họ."
setrank:
description: "chỉnh cấp độ của người chơi ở hang của họ"
setspawn:
description: "chỉnh một hang thành nơi bắt đầu ở thế giới này"
already-spawn: "&cHang này đã là nơi bắt đầu!"
no-island-here: "&cKhông có hang ở đây."
confirmation: "&cBạn có chắc là chọn hang này làm nơi bắt đầu ở thế giới này?"
resetflags:
description: "Đặt lại cờ của các hang về mặc định trong config.yml"
delete:
description: "xoá hang của người chơi"
cannot-delete-owner: "&cThành viên của hang phải bị đuổi trước khi xoá."
deleted-island: "&aĐảo &e[xyz] &ađã được xoá thành công."
island:
go:
description: "dịch chuyển đến hang của bạn"
teleport: "&aĐang dịch chuyển đến hang của bạn."
help:
description: "Lệnh hang chính"
create:
description: "tạo hang, dùng bản vẽ nếu có (cần quyền)"
too-many-islands: "&cQuá nhiều hang ở thế giới này: không đủ khoảng trống cho khu của bạn."
unable-create-island: "&cHang của bạn không được tạo, hãy liên hệ quản trị viên."
creating-island: "&aĐang tạo hang, chờ một chút..."
pick: "&aChọn hang"
info:
description: "xem thông tin hang của bạn hoặc của người chơi"
near:
description: "xem tên của hang kế bên bạn"
the-following-islands: "&aHang kế bên bạn:"
no-neighbors: "&cKhông có hang kế bên bạn!"
reset:
description: "tạo lại hang và xoá hang cũ"
must-remove-members: "&cBạn phải xoá thành viên khỏi hang trước khi xoá (/[label] team kick <player>)."
sethome:
must-be-on-your-island: "&cBạn phải ở hang của bạn để đặt nhà!"
home-set: "&6Nhà của hang đã đặt ở vị trí của bạn."
setname:
description: "đặt tên cho hang"
resetname:
description: "đặt lại tên của hang"
team:
coop:
description: "cho người chơi cấp chơi cùng với hang của bạn"
uncoop:
you-are-no-longer-a-coop-member: '&cBạn không còn chơi cùng với hang của [name].'
all-members-logged-off: '&c Người chơi ở hang đã thoát hết nên bạn không còn chơi cùng với hang của [name].'
trust:
description: "cho người chơi cấp tin tưởng với hang bạn"
invite:
description: "mời người chơi vào hang của bạn"
name-has-invited-you: "&a[name] đã mời bạn vào hang của họ."
you-will-lose-your-island: "&cCHÚ Ý! Bạn sẽ mất hang của bạn nếu chấp nhận lời mời"
errors:
island-is-full: "&cHang đã đầy, bạn không thể mời thêm."
accept:
you-joined-island: "&aBạn đã vào hang! Dùng /[label] team info để xem thành viên khác."
name-joined-your-island: "&a[name] đã vào hang của bạn!"
confirmation: |-
&cBạn có chắc muón chấp nhận lời mời này?
&c&lBạn sẽ &nMẤT&r &c&lhang hiện tại của bạn!
reject:
you-rejected-invite: "&aBạn đã từ chối lời mời vào hang."
name-rejected-your-invite: "&c[name] đã từ chối lời mời của bạn!"
cancel:
description: "huỷ lời mời đang chờ vào hang của bạn"
leave:
description: "rời hang của bạn"
left-your-island: "&c[name] &cđã rời hang của bạn"
kick:
description: "xoá thành viên khỏi hang của bạn"
owner-kicked: "&cChủ hang đã đuổi bạn!"
success: "&b[name] &ađã bị đuổi khỏi hang của bạn."
demote:
description: "hạ cấp của người chơi trong hang"
promote:
description: "nâng cấp của người chơi trong hang"
setowner:
description: "chuyển quyền chủ hang cho người chơi"
errors:
target-is-not-member: "&cNgười chơi đó không ở trong đội của bạn!"
name-is-the-owner: "&a[name] giờ là chủ hang!"
you-are-the-owner: "&aBạn giờ là chủ hang!"
ban:
description: "cấm người chơi khỏi hang của bạn"
cannot-ban-more-players: "&cĐã đạt giới hạn cấm, bạn không thể cấm thêm người."
player-banned: "&b[name]&c đã bị cấm khỏi hang của bạn."
owner-banned-you: "&b[name]&c đã cấm bạn khỏi hang của họ!"
you-are-banned: "&bBạn đã bị cấm ở hang này!"
unban:
description: "bỏ cấm người chơi khỏi hang của bạn"
player-unbanned: "&b[name]&a không còn bị cấm khỏi hang của bạn."
you-are-unbanned: "&b[name]&a huỷ cấm bạn khỏi hang của họ!"
banlist:
noone: "&aKhông ai bị cấm ở hang này."
settings:
description: "xem tuỳ chọn hang"
expel:
description: "trục xuất người chơi khỏi hang của bạn"
not-on-island: "&cNgười chơi đó không ở hang của bạn!"
player-expelled-you: "&b[name]&c đã trục xuất bạn khỏi hang của họ!"
ranks:
owner: "Vua Người Lùn"
sub-owner: "Hiệp Sĩ Người Lùn"
member: "Người Lùn"
trusted: "Tin Tưởng"
coop: "Chơi Cùng"
visitor: "Con Người"
banned: "Orc"
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
&aNgười Ender có thể cướp
&akhối khỏi hang
name: "Trộm bởi Người Ender"
ENTER_EXIT_MESSAGES:
island: "hang của [name]"
GEO_LIMIT_MOBS:
description: |-
&a Xóa các quái đã rời khỏi
&a khu vực bảo vệ trong hang
name: "&eGiới hạn quái trong đảo"
ISLAND_RESPAWN:
description: |-
&aNgười chơi hồi sinh
&aở hang của họ
name: "Hồi sinh tại hang"
LIQUIDS_FLOWING_OUT:
name: "Chất lỏng tràn ra khỏi hang"
description: |-
&aBật/Tắt việc chất lỏng có thể
&atràn ra khỏi khu vực bảo vệ của hang.
LOCK:
description: "Bật/Tắt khóa"
name: "Khoá đảo"
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: "Sinh quái tự nhiên ngoài hang"
description: |-
&aBật/Tắt cho phép con vật (động vật và
&aquái vật) có thể sinh tự nhiên ngoài
&akhu vực bảo vệ của hang.
&cLưu ý là nó không chặn việc sinh quái
&cbằng lồng triệu hồi hoặc trứng.
OFFLINE_GROWTH:
description: |-
&aKhi tắt, cây trồng
&asẽ không mọc lớn trong hang
&anếu tất cả thành viên đều ngoại tuyến.
&aCó thể giúp giảm lag.
name: "Mọc cây khi ngoại tuyến"
OFFLINE_REDSTONE:
description: |-
&aKhi tắt, đá đỏ
&asẽ không hoạt động trong hang
&anếu tất cả thành viên đều ngoại tuyến.
&aCó thể giúp giảm lag.
&aKhông ảnh hưởng đảo triệu hồi.
name: "Đá đỏ khi ngoại tuyến"
PISTON_PUSH:
description: |-
&aCho phép pít tông đẩy
&akhối ra khỏi hang
name: "Pít tông đẩy khối"
REMOVE_MOBS:
description: |-
&aXoá quái khi dịch
&achuyển đến đảo
name: "Xoá quái"
TREES_GROWING_OUTSIDE_RANGE:
name: "Cây mọc ngoài đảo"
description: |-
&aBật/Tắt việc cây có thể mọc ngoài
&akhu vực bảo vệ trong hang.
PREVENT_TELEPORT_WHEN_FALLING:
name: "Chặn dịch chuyển khi đang rời"
description: |-
&aChặn người chơi khỏi việc dịch chuyển
&avề đảo của họ bằng lệnh khi đang rơi.
hint: '&cBạn không thể làm điều đó khi đang rơi.'
locked: "&cHang đã bị khoá!"
protected: "&cĐã bảo vệ hang: [description]"
spawn-protected: "&cĐã bảo vệ nơi bắt đầu: [description]"
panel:
PROTECTION:
description: |-
&aTuỳ chỉnh bảo vệ
&acho hang này
SETTING:
description: |-
&aTuỳ chỉnh tổng quan
&acho hang này
protection:
flags:
SKY_WALKER_FLAG:
description: "&5&oCho phép bật/tắt\n&5&oquyền để đi trên\n&5&ođỉnh của thế giới hang\n&5&omà không cần thêm quyền."
name: "Bước Trên Trời Cao"
hint: "Cho phép đi trên đỉnh hang."

View File

@ -1,286 +1,282 @@
---
caveblock:
sign:
line0: "c方块洞穴"
line1: 欢迎!
line3: 开始挖掘! c <3
line0: "&c洞穴生存"
line1: "欢迎!"
line2: "[name]"
line3: "开始挖掘吧! &c<3"
informational:
to-nether: 真倒霉到地狱了。
to-the-end: 您已经到了末地。
to-normal: 回到你的洞穴。
to-nether: "太不走运了! 掉进了下界."
to-the-end: "您到达了末地."
to-normal: "回到您的洞穴."
general:
errors:
no-island: "c您没有洞穴"
player-has-island: "c玩家已经有一个山洞了"
player-has-no-island: "c该玩家没有洞穴"
already-have-island: "c您已经有一个山洞"
no-safe-location-found: "c在山洞找不到传送您的安全地点。"
not-owner: "c您不是洞穴的所有者"
no-island: "&c您还没有洞穴!"
player-has-island: "&c玩家已有洞穴!"
player-has-no-island: "&c玩家还没有洞穴!"
already-have-island: "&c您已经拥有洞穴!"
no-safe-location-found: "&c无法将您传送到洞穴中, 因为没有找到安全的位置."
not-owner: "&c您不是您洞穴的主人!"
commands:
admin:
team:
add:
name-has-island: "c [name]有一个山洞。首先注销或删除它们!"
success: "b [name]a已添加到b [owner]a的洞穴中。"
name-has-island: "&c[name] 已有洞穴. 请先反注册或删除它们!"
success: "&b[name]&a 已被添加到 &b[owner]&a 的洞穴."
kick:
success: "b [name]ahas被踢出了b [owner]a的山洞。"
success: "&b[name] &a已被 &b[owner]&a 的洞穴移出."
setowner:
description: 将洞穴所有权转移给玩家
already-owner: "c [name]已经是该洞穴的所有者!"
success: "b [name]a现在是这个洞穴的所有者。"
description: "将洞穴的所有权转让给玩家"
already-owner: "&c[name] 玩家已经是此洞穴的主人了!"
success: "&b[name]&a 现在是此洞穴的主人."
range:
description: 管理员洞穴范围命令
description: "管理员洞穴边界命令"
display:
description: 显示/隐藏洞穴范围指示器
description: "显示/隐藏洞穴边界"
hint: |-
c红色屏障图标f显示当前的洞穴保护范围限制。
7灰色粒子f显示最大洞穴极限。
a绿色粒子f如果洞穴保护范围不同于默认保护范围则显示默认保护范围。
&c 红色屏障图标 &f 显示洞穴现在被保护的范围.
&7 灰色粒子 &f 显示最大边界范围.
&a 绿色粒子 &f 显示默认被保护的边界, 如果现在的边界不与其重合的话.
set:
description: 设置洞穴保护范围
success: "a将洞穴保护范围设置为b [number]a。"
description: "设置洞穴被保护的边界范围"
success: "&a洞穴被保护的范围更新至 &b[number]&a."
reset:
description: 将洞穴保护范围重置为世界默认值
success: "a将洞穴保护范围重置为b [number]a。"
description: "重置洞穴被保护的范围到当前世界的默认值"
success: "&a重置洞穴被保护的范围至 &b[number]&a."
register:
description: 注册玩家到您所在的无人洞
registered-island: "a注册玩家到[xyz]洞穴。"
already-owned: "c洞穴已被另一位玩家拥有"
no-island-here: "c这里没有洞穴。确认做一个。"
in-deletion: "c该洞穴空间当前正在被删除。等会再试。"
cannot-make-island: "c抱歉不能在此处放置洞穴。请参阅控制台以获取可能的错误。"
description: "将玩家注册到您所在的未被拥有的洞穴中"
registered-island: "&a在 [xyz] 将玩家注册到洞穴中."
already-owned: "&c此洞穴已被其他玩家所有!"
no-island-here: "&c这里还没有 box. 确认以创建一个."
in-deletion: "&c此区域正在重新生成. 请稍后重试."
cannot-make-island: "&c抱歉, 无法在此处生成洞穴. 从后台查看可能的错误."
unregister:
description: 从山洞中注销所有者,但保留山洞块
unregistered-island: "a来自[xyz]洞穴的未注册玩家。"
description: "反注册洞穴的主人, 同时保留洞穴中的方块"
unregistered-island: "&a在 [xyz] 将玩家从洞穴中反注册."
info:
description: 获取有关您所在位置或玩家洞穴的信息
no-island: "c您现在不在山洞里..."
title: "==========洞穴信息============"
islands-in-trash: "d玩家在垃圾桶中有洞穴。"
is-spawn: 岛是出生点
description: "获取您所在区域或相应玩家洞穴的信息"
no-island: "&c您未在一个洞穴中......"
title: "========== 洞穴信息 ============"
islands-in-trash: "&d玩家拥有废弃的洞穴."
is-spawn: "该区域是主城"
switchto:
description: 将玩家的洞穴切换到垃圾桶中的第一洞
out-of-range: "c数字必须介于1到[number]之间。使用l [label]垃圾[player]rc查看洞穴编号"
description: "将玩家的洞穴切换到废弃的洞穴中的第一位"
out-of-range: "&c数字必须从 1 到 [number]. 输入 &l[label] trash [player] &r&c来查看洞穴数量"
trash:
no-unowned-in-trash: "c垃圾桶中没有无人认领的洞穴"
no-islands-in-trash: "c玩家没有洞穴在垃圾桶中"
description: 在垃圾桶中显示无人洞穴或玩家的洞穴
title: "d ============垃圾洞==========="
no-unowned-in-trash: "&c废弃的洞穴中没有无主人的洞穴"
no-islands-in-trash: "&c玩家没有废弃的洞穴"
description: "在废弃的洞穴中显示无主人的洞穴或玩家的洞穴"
title: "&d=========== 废弃的洞穴 ==========="
count: "&l&d洞穴 [number]:"
use-switch: "a使用l [label]切换到<player> <number>ra将玩家洞穴切换到垃圾桶"
use-switch: "&a输入 &l[label] switchto <player> <number>&r&a 将玩家切换到废弃的洞穴中"
emptytrash:
description: 清除玩家的垃圾桶,或垃圾桶中所有未拥有的洞穴
description: "给玩家清除废弃的洞穴, 或清除所有无主人的废弃的洞穴"
setrange:
description: 设定玩家洞穴的范围
range-updated: 洞穴范围更新为[数字]
description: "设置玩家洞穴的范围"
range-updated: "洞穴范围更新至 [number]"
tp:
description: 传送到玩家的洞穴
description: "传送到玩家的洞穴"
getrank:
description: 在他们的洞穴中获得玩家的排名
rank-is: "aRank在他们的洞穴中[排名]。"
description: "查看玩家在其洞穴中的地位"
rank-is: "&a玩家在其洞穴中的地位是 [rank]."
setrank:
description: 设定玩家在洞穴中的等级
description: "设置玩家在其洞穴中的地位"
setspawn:
description: 为这个世界设置一个洞穴
already-spawn: "c这个洞穴已经是产卵了"
no-island-here: "c这里没有洞穴。"
confirmation: "c您确定要将此洞穴设置为这个世界的生成物吗"
description: "将洞穴设置为当前世界的主城"
already-spawn: "&c此洞穴已经是主城了!"
no-island-here: "&c这里还没有洞穴."
confirmation: "&c确认要将将洞穴设置为当前世界的主城吗?"
resetflags:
description: 将所有洞穴重置为config.yml中的默认标志设置
description: "重置所有洞穴的 flag 值成 config.yml 中的默认值"
delete:
description: 删除玩家的洞穴
cannot-delete-owner: "c删除所有洞穴成员之前必须将其踢出洞穴。"
deleted-island: "e [xyz]ahas中的aIsland已成功删除。"
description: "删除一名玩家的洞穴"
cannot-delete-owner: "&c在删除此洞穴之前, 必须移出此洞穴中的所有成员."
deleted-island: "&a成功删除位于 &e[xyz] &a处的洞穴."
island:
go:
description: 传送你到你的洞穴
teleport: "a将您传送到山洞。"
description: "传送到您的洞穴"
teleport: "&a正在传送到您的洞穴."
help:
description: 主要洞穴命令
description: "洞穴主命令"
create:
description: 使用可选的蓝图创建一个洞穴(需要许可)
too-many-islands: "c这个世界上有太多的洞穴没有足够的空间来创建您的洞穴。"
unable-create-island: "c您的洞穴无法生成请与管理员联系。"
creating-island: "a创建您的洞穴请稍等..."
pick: "a选择一个山洞"
description: "使用模板创建一个新的洞穴 (需要权限)"
too-many-islands: "&c世界中含有太多洞穴了: 没有空间创建您的洞穴."
unable-create-island: "&c生成洞穴失败, 请联系管理员."
creating-island: "&a生成洞穴中, 请稍后..."
pick: "&a选择一个洞穴"
info:
description: 显示有关您的洞穴或玩家洞穴的信息
description: "显示您或相应玩家的洞穴信息"
near:
description: 显示您周围的洞穴名称
the-following-islands: "a附近有以下洞穴"
no-neighbors: "c您没有紧邻的洞穴"
description: "显示周围洞穴的名称"
the-following-islands: "&a周围的洞穴有:"
no-neighbors: "&c您的周围没有其它洞穴!"
reset:
description: 重新启动您的洞穴并删除旧的
must-remove-members: "c您必须先从洞穴中删除所有成员然后才能重新启动洞穴/岛国队踢&lt;player&gt;)。"
description: "删除现有的洞穴并重新开始"
must-remove-members: "&c在您重新开始之前, 您必须移出洞穴中的所有成员 (/island team kick <player>)."
sethome:
must-be-on-your-island: "c您必须在洞穴里才能回家"
home-set: "6您的洞穴之家已设置为您当前的位置。"
must-be-on-your-island: "&c必须在洞穴中才能设置家的位置!"
home-set: "&6洞穴家的位置已设置到您当前位置."
setname:
description: 为你的洞穴命名
description: "设置您洞穴的名称"
resetname:
description: 重设您的洞穴名称
description: "重置您洞穴的名称"
team:
coop:
description: 让玩家在你的洞穴中进行排名
description: "将玩家设置为您洞穴的副 OP"
uncoop:
you-are-no-longer-a-coop-member: "c您不再是[name]的洞穴的鸡舍成员"
all-members-logged-off: "c所有洞穴成员都已注销因此您不再是[name]洞穴的合作伙伴"
you-are-no-longer-a-coop-member: "&c您不再是 [name] 的洞穴的副 OP 了"
all-members-logged-off: "&c洞穴的所有玩家都离线了, 因此您不再是 [name] 的洞穴的副 OP 了"
trust:
description: 给玩家一个值得信赖的等级
description: "将玩家设置为您洞穴的信任者"
invite:
description: 邀请玩家加入你的洞穴
name-has-invited-you: "a [name]邀请您加入他们的洞穴。"
you-will-lose-your-island: "c警告如果您接受您将迷路"
description: "邀请一名玩家到您的洞穴中"
name-has-invited-you: "&a[name] 邀请您加入他(她)的洞穴."
you-will-lose-your-island: "&c注意! 如果接受邀请, 您将失去现有的洞穴!"
errors:
island-is-full: "c您的洞穴已满您不能邀请其他任何人。"
island-is-full: "&c您的洞穴已满, 无法再邀请更多的玩家."
accept:
you-joined-island: "a您加入了一个山洞使用/ [标签]小组信息来查看其他成员。"
name-joined-your-island: "a [name]加入了您的洞穴!"
you-joined-island: "&a您加入了一个洞穴! 输入 /[label] team info 来查看其他成员."
name-joined-your-island: "&a[name] 加入了您的洞穴!"
confirmation: |-
c确定要接受此邀请吗
cl您会nLOSErcly您当前的洞穴
&c确认要接收此邀请?
&c&l您将 &n失去&r &c&l现有的洞穴!
reject:
you-rejected-invite: "a您拒绝了加入洞穴的邀请。"
name-rejected-your-invite: "c [name]拒绝了您的洞穴邀请!"
you-rejected-invite: "&a您拒绝了加入洞穴的邀请."
name-rejected-your-invite: "&c[name] 拒绝了您加入洞穴的邀请!"
cancel:
description: 取消待处理的邀请,加入你的洞穴
description: "取消待接受/拒绝的洞穴加入邀请"
leave:
description: 离开你的洞穴
left-your-island: "c [name]cleft your cave"
description: "退出您的洞穴"
left-your-island: "&c[name] &c退出了您的洞穴"
kick:
description: 从您的洞穴中删除一个成员
owner-kicked: "c主人将您踢出山洞"
success: "b [name]ahas被踢出您的山洞。"
description: "从您的洞穴中移出一名玩家"
owner-kicked: "&c洞穴的主人移出了您!"
success: "&b[name] &a从您的洞穴中被移出."
demote:
description: 将您的玩家降级
description: "降低洞穴中一名玩家的地位"
promote:
description: 提升您的玩家排名
description: "提升洞穴中一名玩家的地位"
setowner:
description: 将您的洞穴所有权转让给成员
description: "将洞穴转让给一名成员"
errors:
target-is-not-member: 该球员不属于您的洞穴团队!
name-is-the-owner: "a [name]现在是洞穴所有者!"
you-are-the-owner: "a您现在是洞穴主人"
target-is-not-member: "&c玩家不在您洞穴的队伍中!"
name-is-the-owner: "&a[name] 现在是洞穴的主人!"
you-are-the-owner: "&a您成为了洞穴的主人!"
ban:
description: 禁止玩家进入您的洞穴
cannot-ban-more-players: "c您已达到禁令限制您不能再从您的洞穴禁赛。"
player-banned: "b [name]c现在被禁止进入您的洞穴。"
owner-banned-you: "b [name]c禁止您进入他们的洞穴"
you-are-banned: "b您被禁止进入这个洞穴"
description: "从洞穴中禁止一名玩家"
cannot-ban-more-players: "&c达到最大禁止玩家的数量, 无法再禁止更多的玩家."
player-banned: "&b[name]&c 被您的洞穴禁止."
owner-banned-you: "&b[name]&c 的洞穴禁止了您!"
you-are-banned: "&b您已被此洞穴禁止!"
unban:
description: 禁止玩家进入您的洞穴
player-unbanned: "b [name]a现在不受您的洞穴限制。"
you-are-unbanned: "b [name]a禁止您进入他们的洞穴"
description: "从洞穴中解封一名玩家"
player-unbanned: "&b[name]&a 被您的洞穴解封."
you-are-unbanned: "&b[name]&a 的洞穴解封了您!"
banlist:
noone: "a没有人被禁止进入这个洞穴。"
noone: "&a没有玩家被此洞穴禁止."
settings:
description: 显示洞穴设置
description: "显示洞穴设置"
expel:
description: 将玩家驱逐出您的洞穴
not-on-island: "c那个玩家不在你的洞穴里"
player-expelled-you: "b [name]c将您赶出了山洞"
description: "从洞穴中请出一名玩家"
not-on-island: "&c该玩家不在您洞穴中!"
player-expelled-you: "&c您被 &b[name]&c 的洞穴请出!"
ranks:
owner: 矮人王
sub-owner: 矮人骑士
member: 侏儒
trusted: 值得信赖
coop: 鸡舍
visitor: 人的
banned: 兽人
owner: "矮人王"
sub-owner: "矮人骑士"
member: "小矮人"
trusted: "信任者"
coop: "副 OP"
visitor: "人类"
banned: "被禁止玩家"
protection:
flags:
ENDERMAN_GRIEFING:
description: |-
aEndermen可以删除
a洞穴
name: 恩德曼悲痛
&a末影人可以
&a移动洞穴中的方块
name: "末影人破坏"
ENTER_EXIT_MESSAGES:
island: "[名字]的洞穴"
island: "[name] 的洞穴"
GEO_LIMIT_MOBS:
description: |-
a删除小怪
&外部保护
&占用空间
name: "e限制小怪进入山洞"
&a移除在洞穴保护
&a范围外的生物
name: "&e将生物限制在洞穴内"
ISLAND_RESPAWN:
description: |-
a玩家重生
和他们的洞穴
name: 洞穴重生
&a玩家在他们的
&a洞穴中重生
name: "洞穴中重生"
LIQUIDS_FLOWING_OUT:
name: 液体在洞穴外流动
name: "流体流出洞穴"
description: |-
a切换液体是否可以流出
a洞穴的保护范围。
&a切换流体是否能
&a流出洞穴保护范围.
LOCK:
description: 拨动锁
name: 锁洞
description: "切换是否禁止访客访问"
name: "锁定洞穴"
NATURAL_SPAWNING_OUTSIDE_RANGE:
name: 自然生物产生范围外
name: "常规生物在保护范围外生成"
description: |-
a切换是否生物动物和
amonsters可以在外面自然产卵
aa洞穴的保护范围。
&a切换常规生物 (动物和
&a怪物) 是否能在洞穴保护
&a范围外生成.
c请注意这不会阻止生物
cto通过暴民生成器或生成器生成
cegg。
&c注意, 此操作不能防止
&c洞穴保护范围外的
&c刷怪笼或刷怪蛋生成生物.
OFFLINE_GROWTH:
description: |-
a禁用时植物
a不会在洞穴中生长
awhen所有成员均处于离线状态。
a可以帮助减少延迟。
name: 离线增长
&a如果禁用, 当洞穴中的所有成员
&a都离线时, 植物将停止生长.
&a或许能减少服务器卡顿.
name: "离线生长"
OFFLINE_REDSTONE:
description: |-
a禁用时红石
a不会在山洞中运作
a所有成员均处于离线状态。
a可以帮助减少延迟。
name: 离线红石
&a如果禁用, 当洞穴中的所有成员
&a都离线时, 红石将停止运作.
&a或许能减少服务器卡顿.
name: "离线红石"
PISTON_PUSH:
description: |-
a允许活塞推动
&在洞穴外面
name: 活塞推
&a允许活塞推动
&a洞穴外的方块
name: "活塞推动"
REMOVE_MOBS:
description: |-
a移除怪物
&前往洞穴
name: 移除怪物
&a传送到洞穴中时,
&a移除洞穴中的所有怪物
name: "Remove monsters"
TREES_GROWING_OUTSIDE_RANGE:
name: 树木生长范围外
name: "树木在洞穴保护范围外生长"
description: |-
a切换树木是否可以在
是否使用acave的保护范围。
&a切换树木是否能长到
&a洞穴保护范围之外.
PREVENT_TELEPORT_WHEN_FALLING:
name: 跌倒时防止传送
name: "掉落时禁止传送"
description: |-
a防止玩家被传送
使用命令返回他们的洞穴
aif他们跌倒了。
hint: "c跌倒时无法传送回洞穴。"
locked: "c这个洞穴被锁了"
protected: "cCave保护[说明]"
spawn-protected: "cSpawn受保护[描述]"
&a当玩家正在掉落时
&a禁止他们通过指令进行传送.
hint: "&c在掉落时不能传送."
locked: "&c该洞穴已禁止访客访问!"
protected: "&c没有权限: [description]"
spawn-protected: "&c没有权限: [description]"
panel:
PROTECTION:
description: |-
a保护设置
a这个洞
&a洞穴的
&a保护设置
SETTING:
description: |-
a常规设置
a这个洞
&a洞穴的
&a一般设置
protection:
flags:
SKY_WALKER_FLAG:
hint: 允许在洞穴顶上行走。
name: 天空行者
description: |-
5o这允许启用/禁用
5o能力继续前进
5otop洞穴世界
5o没有额外的权限。
description: "&5&o这将允许/禁止\n&5&o没有额外权限的玩家\n&5&o在洞穴世界的顶部\n&5&o行走."
name: "天空行者"
hint: "允许在洞穴的天花板上行走."

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}