diff --git a/.github/workflows/modrinth-publish.yml b/.github/workflows/modrinth-publish.yml new file mode 100644 index 00000000..133188b7 --- /dev/null +++ b/.github/workflows/modrinth-publish.yml @@ -0,0 +1,88 @@ +name: Publish to Modrinth + +# Triggers when you publish a GitHub Release +on: + release: + types: [published] + workflow_dispatch: + inputs: + tag: + description: 'Release tag to publish (e.g. 1.6.0)' + required: true + type: string + +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + # 1. Check out the repository at the release tag + - name: Checkout repository + uses: actions/checkout@v4 + + # 2. Set up Java 21 + - name: Set up Java 21 + uses: actions/setup-java@v4 + with: + java-version: '21' + distribution: 'temurin' + + # 3. Cache Maven dependencies to speed up builds + - name: Cache Maven packages + uses: actions/cache@v4 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + + # 4. Build the JAR + # GIT_BRANCH=origin/master activates the Maven 'master' profile which + # produces a clean version number (e.g. 1.6.0) without -SNAPSHOT/-LOCAL. + - name: Build with Maven + run: mvn -B clean package -DskipTests + env: + GIT_BRANCH: origin/master + + # 5. Upload the JAR to Modrinth + # + # Prerequisites — add these secrets in your GitHub repo settings + # (Settings → Secrets and variables → Actions): + # + # MODRINTH_TOKEN — personal access token from https://modrinth.com/settings/pats + # (scope: "Create versions") + # MODRINTH_PROJECT_ID — your Modrinth project ID for Challenges, visible on the + # project page under the three-dot menu ("Copy ID") + # + - name: Publish to Modrinth + uses: cloudnode-pro/modrinth-publish@0be4916ad5f081d936eb5615aa35ce3f0949979c # v2 + with: + token: ${{ secrets.MODRINTH_TOKEN }} + project: ${{ secrets.MODRINTH_PROJECT_ID }} + + # Use the release tag, or the manually supplied tag when triggered via workflow_dispatch + version: ${{ github.event.release.tag_name || inputs.tag }} + + # Use the GitHub release body as the changelog (empty when run manually) + changelog: ${{ github.event.release.body }} + + # Challenges is a BentoBox addon running on Paper-based servers + loaders: |- + paper + purpur + + # Minecraft versions supported (BentoBox API 3.12.0 targets Paper 1.21.11+) + game-versions: |- + 1.21.5 + 1.21.6 + 1.21.7 + 1.21.8 + 1.21.9 + 1.21.10 + 1.21.11 + 26.1 + 26.1.1 + + # Path to the built JAR + files: target/Challenges-${{ github.event.release.tag_name || inputs.tag }}.jar diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..16fb02c8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,176 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project + +Challenges is a BentoBox addon (Bukkit/Spigot plugin module) that adds player challenges to any BentoBox GameMode addon (BSkyBlock, AcidIsland, SkyGrid, CaveBlock). It is not a standalone plugin — it is loaded by BentoBox at runtime. + +- Java 21, Maven, Spigot `1.21.3-R0.1-SNAPSHOT` +- Depends on BentoBox `3.4.0`, optionally Level `2.6.3` and Vault `1.7` +- Version is set via `` in `pom.xml` (uses `${revision}` / CI `-bNNN` suffix) + +## Commands + +```bash +# Full build + tests + shaded jar (output in target/) +mvn clean verify + +# Compile only +mvn compile + +# Run all tests +mvn test + +# Run a single test class +mvn test -Dtest=ChallengesManagerTest + +# Run a single test method +mvn test -Dtest=ChallengesManagerTest#methodName + +# Release build (strips -SNAPSHOT) — set via profile, normally CI only +mvn clean verify -Dbuild.number=-bLOCAL +``` + +Built jar lands in `target/` and must be dropped into `BentoBox/addons/` on a running BentoBox server to test manually. + +## Architecture + +Entry point: `ChallengesAddon` (extends BentoBox `Addon`). `ChallengesPladdon` is the Paper-plugin wrapper used when BentoBox is loaded as a Paper plugin. `onLoad` reads `config.yml` into `Settings`, `onEnable` registers commands against each hooked `GameModeAddon`, instantiates managers, registers flags, and wires listeners. + +Key subsystems: + +- **`managers/ChallengesManager`** — central service. Owns in-memory caches of `Challenge`, `ChallengeLevel`, and per-player `ChallengesPlayerData`, plus the BentoBox `Database` handles that persist them. All mutation of challenges/levels/player progress should go through this manager so caches and DB stay consistent. Challenges and levels are keyed by a unique ID that is prefixed by the gamemode (e.g. `bskyblock_mychallenge`) — see `getUniqueID` / `addChallengeToLevel` for the prefixing contract. +- **`managers/ChallengesImportManager`** — imports/exports challenges from `default.json`, template YAML, and library downloads via `web/WebManager` (the "Web Library" in the GUI). +- **`database/object/`** — Gson-serialized data objects (`Challenge`, `ChallengeLevel`, `ChallengesPlayerData`). `requirements/` holds the polymorphic `Requirement` hierarchy (Island, Inventory, Other, Statistic) used to gate completion; `adapters/` contains Gson type adapters that make the polymorphism work — new requirement types must be registered there. +- **`panel/`** — all GUI code, built on `bentobox-panelutils`. `CommonPanel`/`CommonPagedPanel` are the base classes; `admin/` contains the admin editor GUIs, `user/` the player-facing GUIs. Conversations (text input prompts) go through `ConversationUtils`. +- **`commands/`** — player commands (`ChallengesPlayerCommand`, `ChallengesGlobalPlayerCommand`, `CompleteChallengeCommand`) and `commands/admin/` admin commands. Each is registered per gamemode in `ChallengesAddon.onEnable`. +- **`handlers/`** — BentoBox API request handlers (`ChallengeDataRequestHandler`, `LevelListRequestHandler`, etc.) exposed over the BentoBox inter-addon request API so other addons can query challenge data. +- **`listeners/`** — `ResetListener` wipes player data on island reset; `SaveListener` flushes caches on save/quit. +- **`tasks/`** — `TryToComplete` is the core completion pipeline: validates requirements, consumes costs, applies rewards, fires events. New reward/requirement logic typically plugs in here. +- **`events/`** — custom Bukkit events (`ChallengeCompletedEvent`, `LevelCompletedEvent`, etc.) fired by `TryToComplete`/managers. Extend the existing event hierarchy rather than adding ad-hoc callbacks. +- **`web/WebManager`** — downloads the public challenges library via BentoBox's `WebManager`/GitHub content. + +Resources in `src/main/resources/`: `addon.yml` (addon metadata read by BentoBox), `config.yml` (user settings → `config/Settings`), `default.json` (bundled default challenges), `template.yml`, `panels/*.yml` (GUI layouts loaded by panelutils), `locales/*.yml` (translations — managed via GitLocalize, do not hand-edit beyond `en-US.yml`). + +## Conventions + +- Target branch for PRs is `master`; active development happens on `develop`. +- When adding a new `Requirement` subclass, also register its Gson adapter in `database/object/adapters/` or loading will fail silently with missing fields. +- Challenge/level IDs are always gamemode-prefixed on disk; when comparing or looking up, use `ChallengesManager` helpers rather than raw string compares. +- User-visible strings belong in `locales/en-US.yml` under the appropriate namespace — never hardcode them in Java. + +## Dependency Source Lookup + +When you need to inspect source code for a dependency (e.g., BentoBox, addons): + +1. **Check local Maven repo first**: `~/.m2/repository/` — sources jars are named `*-sources.jar` +2. **Check the workspace**: Look for sibling directories or Git submodules that may contain the dependency as a local project (e.g., `../bentoBox`, `../addon-*`) +3. **Check Maven local cache for already-extracted sources** before downloading anything +4. Only download a jar or fetch from the internet if the above steps yield nothing useful + +Prefer reading `.java` source files directly from a local Git clone over decompiling or extracting a jar. + +In general, the latest version of BentoBox should be targeted. + +## Project Layout + +Related projects are checked out as siblings under `~/git/`: + +**Core:** +- `bentobox/` — core BentoBox framework + +**Game modes:** +- `addon-acidisland/` — AcidIsland game mode +- `addon-bskyblock/` — BSkyBlock game mode +- `Boxed/` — Boxed game mode (expandable box area) +- `CaveBlock/` — CaveBlock game mode +- `OneBlock/` — AOneBlock game mode +- `SkyGrid/` — SkyGrid game mode +- `RaftMode/` — Raft survival game mode +- `StrangerRealms/` — StrangerRealms game mode +- `Brix/` — plot game mode +- `parkour/` — Parkour game mode +- `poseidon/` — Poseidon game mode +- `gg/` — gg game mode + +**Addons:** +- `addon-level/` — island level calculation +- `addon-challenges/` — challenges system +- `addon-welcomewarpsigns/` — warp signs +- `addon-limits/` — block/entity limits +- `addon-invSwitcher/` / `invSwitcher/` — inventory switcher +- `addon-biomes/` / `Biomes/` — biomes management +- `Bank/` — island bank +- `Border/` — world border for islands +- `Chat/` — island chat +- `CheckMeOut/` — island submission/voting +- `ControlPanel/` — game mode control panel +- `Converter/` — ASkyBlock to BSkyBlock converter +- `DimensionalTrees/` — dimension-specific trees +- `discordwebhook/` — Discord integration +- `Downloads/` — BentoBox downloads site +- `DragonFights/` — per-island ender dragon fights +- `ExtraMobs/` — additional mob spawning rules +- `FarmersDance/` — twerking crop growth +- `GravityFlux/` — gravity addon +- `Greenhouses-addon/` — greenhouse biomes +- `IslandFly/` — island flight permission +- `IslandRankup/` — island rankup system +- `Likes/` — island likes/dislikes +- `Limits/` — block/entity limits +- `lost-sheep/` — lost sheep adventure +- `MagicCobblestoneGenerator/` — custom cobblestone generator +- `PortalStart/` — portal-based island start +- `pp/` — pp addon +- `Regionerator/` — region management +- `Residence/` — residence addon +- `TopBlock/` — top ten for OneBlock +- `TwerkingForTrees/` — twerking tree growth +- `Upgrades/` — island upgrades (Vault) +- `Visit/` — island visiting +- `weblink/` — web link addon +- `CrowdBound/` — CrowdBound addon + +**Data packs:** +- `BoxedDataPack/` — advancement datapack for Boxed + +**Documentation & tools:** +- `docs/` — main documentation site +- `docs-chinese/` — Chinese documentation +- `docs-french/` — French documentation +- `BentoBoxWorld.github.io/` — GitHub Pages site +- `website/` — website +- `translation-tool/` — translation tool + +Check these for source before any network fetch. + +## Testing + +The project uses a mixed test stack: + +- **JUnit 4 + PowerMock** — existing tests in `commands/`, `tasks/`, `utils/`, `database/`, and top-level addon/manager tests. These use `@RunWith(PowerMockRunner.class)` and `@PrepareForTest`. +- **JUnit 5 + Mockito** — newer tests in `panel/` package. These use `@ExtendWith(MockitoExtension.class)` with `@MockitoSettings(strictness = Strictness.LENIENT)`. +- Both frameworks coexist via `junit-vintage-engine` which runs JUnit 4 tests on the JUnit 5 platform. + +### Writing new JUnit 5 tests alongside PowerMock + +PowerMock's MockMaker conflicts with mockito-inline, so **`mockStatic()` and `mockConstruction()` are not available** in JUnit 5 tests. Use these workarounds: + +- **Static singletons** (`Bukkit.getServer()`, `BentoBox.getInstance()`): Set via reflection on the private static field. See `PanelTestHelper.setServer()` and `setBentoBoxInstance()` for examples. Always save/restore the previous value in `@BeforeEach`/`@AfterEach`. +- **Final methods** (`JavaPlugin.getServer()` is final): Set the `server` field on the plugin object via reflection walking the class hierarchy. See `PanelTestHelper.setPluginServer()`. +- **Java records** (`ItemTemplateRecord`, `TemplatedPanel.ItemSlot`): Cannot be mocked. Create real instances using their public constructors. For `TemplatedPanel` (which has no public constructor), use `sun.misc.Unsafe.allocateInstance()` then set fields via reflection. See `PanelTestHelper.createItemSlot()`. +- **Varargs methods** (`User.getTranslation(String, String...)`): Use `Mockito.doAnswer().when()` with `Mockito.any()` instead of `when().thenAnswer()`. The `doAnswer` pattern handles varargs correctly. See `PanelTestHelper.setupUserTranslations()`. + +### PanelTestHelper + +`src/test/java/world/bentobox/challenges/panel/PanelTestHelper.java` is a shared utility for all panel tests. It provides: +- Reflection helpers for Bukkit/BentoBox static fields +- `ItemTemplateRecord` factory methods (`createTemplate`, `createSimpleTemplate`, `createEmptyTemplate`) +- `createItemSlot()` for `TemplatedPanel.ItemSlot` records +- `createBasicChallenge()` for fully-mocked `Challenge` objects +- `setupUserTranslations()` for varargs-safe translation mocking + +## Key Dependencies (source locations) + +- `world.bentobox:bentobox` → `~/git/bentobox/src/` diff --git a/pom.xml b/pom.xml index 8bb1c350..314d88b3 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ GitHub https://github.com/BentoBoxWorld/Challenges/issues - + bentoboxworld @@ -40,18 +40,20 @@ UTF-8 UTF-8 21 - 2.0.9 + + 5.10.2 + 5.11.0 + v1.21-SNAPSHOT - 1.21.3-R0.1-SNAPSHOT - 1.2.3-SNAPSHOT - 3.4.0 + 1.21.11-R0.1-SNAPSHOT + 3.14.0 2.6.3 1.7 1.2.0 ${build.version}-SNAPSHOT - 1.5.2 + 1.6.0 -LOCAL BentoBoxWorld_Challenges @@ -98,24 +100,40 @@ - + - spigot-repo - https://hub.spigotmc.org/nexus/content/repositories/snapshots + jitpack.io + https://jitpack.io + true + true - + bentoboxworld + https://repo.codemc.org/repository/bentoboxworld/ + true + false + + + + bentoboxworld-snapshots https://repo.codemc.io/repository/bentoboxworld/ + false + true + - codemc-repo - https://repo.codemc.io/repository/maven-public + papermc + https://repo.papermc.io/repository/maven-public/ + true + true - + - minecraft-repo - https://libraries.minecraft.net/ + codemc-repo + https://repo.codemc.org/repository/maven-public/ + true + false @@ -125,17 +143,11 @@ - - - org.javassist - javassist - 3.30.2-GA - - + - org.spigotmc - spigot-api - ${spigot.version} + io.papermc.paper + paper-api + ${paper.version} provided @@ -172,25 +184,6 @@ 22.0.0 provided - - - org.mockito - mockito-core - 3.11.2 - test - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito2 - ${powermock.version} - test - com.mojang @@ -205,21 +198,54 @@ - me.clip - placeholderapi - 2.11.6 - provided + me.clip + placeholderapi + 2.11.6 + provided + + + + com.github.MockBukkit + MockBukkit + ${mock-bukkit.version} + test + + + + org.junit.jupiter + junit-jupiter-api + ${junit.version} + test + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + + org.mockito + mockito-core + ${mockito.version} + test + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test - - ${project.name}-${revision}${build.number} @@ -243,7 +269,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.6.0 + 3.6.2 true @@ -275,79 +301,75 @@ org.apache.maven.plugins maven-clean-plugin - 3.1.0 + 3.5.0 org.apache.maven.plugins maven-resources-plugin - 3.1.0 + 3.5.0 org.apache.maven.plugins maven-compiler-plugin - 3.7.0 + 3.15.0 - ${java.version} - ${java.version} ${java.version} + true + false org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M5 + 3.5.5 + + **/*Test.java + **/*Test?.java + **/*Test??.java + - ${argLine} + @{argLine} --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.math=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED - --add-opens - java.base/java.util.stream=ALL-UNNAMED + --add-opens java.base/java.util.stream=ALL-UNNAMED --add-opens java.base/java.text=ALL-UNNAMED - --add-opens - java.base/java.util.regex=ALL-UNNAMED - --add-opens - java.base/java.nio.channels.spi=ALL-UNNAMED + --add-opens java.base/java.util.regex=ALL-UNNAMED + --add-opens java.base/java.nio.channels.spi=ALL-UNNAMED --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.net=ALL-UNNAMED - --add-opens - java.base/java.util.concurrent=ALL-UNNAMED + --add-opens java.base/java.util.concurrent=ALL-UNNAMED --add-opens java.base/sun.nio.fs=ALL-UNNAMED --add-opens java.base/sun.nio.cs=ALL-UNNAMED --add-opens java.base/java.nio.file=ALL-UNNAMED - --add-opens - java.base/java.nio.charset=ALL-UNNAMED - --add-opens - java.base/java.lang.reflect=ALL-UNNAMED - --add-opens - java.logging/java.util.logging=ALL-UNNAMED + --add-opens java.base/java.nio.charset=ALL-UNNAMED + --add-opens java.base/java.lang.reflect=ALL-UNNAMED + --add-opens java.logging/java.util.logging=ALL-UNNAMED --add-opens java.base/java.lang.ref=ALL-UNNAMED --add-opens java.base/java.util.jar=ALL-UNNAMED --add-opens java.base/java.util.zip=ALL-UNNAMED - org.apache.maven.plugins maven-jar-plugin - 3.2.0 + 3.5.0 org.apache.maven.plugins maven-javadoc-plugin - 3.1.1 + 3.12.0 - public false -Xdoclint:none - ${java.home}/bin/javadoc attach-javadocs + install jar @@ -357,7 +379,7 @@ org.apache.maven.plugins maven-source-plugin - 3.0.1 + 3.4.0 attach-sources @@ -370,21 +392,21 @@ org.apache.maven.plugins maven-install-plugin - 2.5.2 + 3.1.4 org.apache.maven.plugins maven-deploy-plugin - 2.8.2 + 3.1.4 org.jacoco jacoco-maven-plugin - 0.8.10 + 0.8.14 true - **/*Names* @@ -393,13 +415,13 @@ - prepare-agent + pre-unit-test prepare-agent - report + post-unit-test report @@ -408,7 +430,6 @@ XML - diff --git a/src/main/java/world/bentobox/challenges/commands/ChallengesGlobalPlayerCommand.java b/src/main/java/world/bentobox/challenges/commands/ChallengesGlobalPlayerCommand.java index db018c44..6b6be35b 100644 --- a/src/main/java/world/bentobox/challenges/commands/ChallengesGlobalPlayerCommand.java +++ b/src/main/java/world/bentobox/challenges/commands/ChallengesGlobalPlayerCommand.java @@ -60,7 +60,7 @@ public boolean execute(User user, String label, List args) } else if (this.gameModeAddons.size() == 1) { - this.gameModeAddons.get(0).getPlayerCommand().ifPresent(compositeCommand -> + this.gameModeAddons.getFirst().getPlayerCommand().ifPresent(compositeCommand -> user.performCommand(compositeCommand.getTopLabel() + " " + this.getAddon().getChallengesSettings().getPlayerMainCommand().split(" ")[0])); return true; diff --git a/src/main/java/world/bentobox/challenges/commands/CompleteChallengeCommand.java b/src/main/java/world/bentobox/challenges/commands/CompleteChallengeCommand.java index 0876f55e..8da8f83e 100644 --- a/src/main/java/world/bentobox/challenges/commands/CompleteChallengeCommand.java +++ b/src/main/java/world/bentobox/challenges/commands/CompleteChallengeCommand.java @@ -104,7 +104,7 @@ public Optional> tabComplete(User user, String alias, List { if (args.isEmpty()) return Optional.empty(); - String lastString = args.get(args.size() - 1); + String lastString = args.getLast(); final List returnList = new ArrayList<>(); final int size = args.size(); diff --git a/src/main/java/world/bentobox/challenges/commands/admin/ChallengesGlobalAdminCommand.java b/src/main/java/world/bentobox/challenges/commands/admin/ChallengesGlobalAdminCommand.java index 045df59a..3a1245bc 100644 --- a/src/main/java/world/bentobox/challenges/commands/admin/ChallengesGlobalAdminCommand.java +++ b/src/main/java/world/bentobox/challenges/commands/admin/ChallengesGlobalAdminCommand.java @@ -58,7 +58,7 @@ public boolean execute(User user, String label, List args) } else if (this.gameModeAddons.size() == 1) { - this.gameModeAddons.get(0).getAdminCommand().ifPresent(compositeCommand -> + this.gameModeAddons.getFirst().getAdminCommand().ifPresent(compositeCommand -> user.performCommand(compositeCommand.getTopLabel() + " " + this.getAddon().getChallengesSettings().getAdminMainCommand().split(" ")[0])); } diff --git a/src/main/java/world/bentobox/challenges/commands/admin/CompleteCommand.java b/src/main/java/world/bentobox/challenges/commands/admin/CompleteCommand.java index fc98a471..71f5b3a1 100644 --- a/src/main/java/world/bentobox/challenges/commands/admin/CompleteCommand.java +++ b/src/main/java/world/bentobox/challenges/commands/admin/CompleteCommand.java @@ -86,11 +86,11 @@ else if (!args.get(1).isEmpty()) this.getWorld(), "general.errors.unknown-player", TextVariables.NAME, - args.get(0)); + args.getFirst()); } else { - this.addon.logError("Unknown player name " + args.get(0)); + this.addon.logError("Unknown player name " + args.getFirst()); } return false; @@ -167,7 +167,7 @@ else if (!args.get(1).isEmpty()) @Override public Optional> tabComplete(User user, String alias, List args) { - String lastString = args.get(args.size() - 1); + String lastString = args.getLast(); final List returnList = new ArrayList<>(); final int size = args.size(); diff --git a/src/main/java/world/bentobox/challenges/commands/admin/ReloadChallenges.java b/src/main/java/world/bentobox/challenges/commands/admin/ReloadChallenges.java index dbffc5be..f22a22e7 100644 --- a/src/main/java/world/bentobox/challenges/commands/admin/ReloadChallenges.java +++ b/src/main/java/world/bentobox/challenges/commands/admin/ReloadChallenges.java @@ -52,7 +52,7 @@ public boolean execute(User user, String label, List args) Utils.sendMessage(user, this.getWorld(), "general.success"); return true; } - else if (args.get(0).equalsIgnoreCase("hard")) + else if (args.getFirst().equalsIgnoreCase("hard")) { this.manager.reload(); Utils.sendMessage(user, this.getWorld(), "general.success"); diff --git a/src/main/java/world/bentobox/challenges/commands/admin/ResetCommand.java b/src/main/java/world/bentobox/challenges/commands/admin/ResetCommand.java index b21c2cc2..bef674f1 100644 --- a/src/main/java/world/bentobox/challenges/commands/admin/ResetCommand.java +++ b/src/main/java/world/bentobox/challenges/commands/admin/ResetCommand.java @@ -76,7 +76,7 @@ else if (args.size() < 2) } else if (!args.get(1).isEmpty()) { - UUID targetUUID = this.getPlayers().getUUID(args.get(0)); + UUID targetUUID = this.getPlayers().getUUID(args.getFirst()); if (targetUUID == null) { @@ -86,11 +86,11 @@ else if (!args.get(1).isEmpty()) this.getWorld(), Constants.ERRORS + "unknown-player", TextVariables.NAME, - args.get(0)); + args.getFirst()); } else { - this.addon.logError("Unknown player name " + args.get(0)); + this.addon.logError("Unknown player name " + args.getFirst()); } return false; @@ -188,7 +188,7 @@ else if (!args.get(1).isEmpty()) @Override public Optional> tabComplete(User user, String alias, List args) { - String lastString = args.get(args.size() - 1); + String lastString = args.getLast(); final List returnList = new ArrayList<>(); final int size = args.size(); diff --git a/src/main/java/world/bentobox/challenges/database/object/Challenge.java b/src/main/java/world/bentobox/challenges/database/object/Challenge.java index e20d9b35..65987c02 100644 --- a/src/main/java/world/bentobox/challenges/database/object/Challenge.java +++ b/src/main/java/world/bentobox/challenges/database/object/Challenge.java @@ -852,11 +852,10 @@ public boolean isValid() } /** - * Clone method that returns clone of current challenge. - * @return Challenge that is cloned from current object. + * Returns a deep copy of this challenge. + * @return a new Challenge copied from this object. */ - @Override - public Challenge clone() + public Challenge copy() { Challenge clone; diff --git a/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java b/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java index f9d2982f..9fba6ac2 100644 --- a/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java +++ b/src/main/java/world/bentobox/challenges/database/object/ChallengeLevel.java @@ -466,7 +466,7 @@ public void setIgnoreRewardMetaData(Set ignoreRewardMetaData) /** * This method match if given gameMode relates to current level. It is detected * via level uniqueId, as it always must start with gameMode name. - * + *

* This method is created to avoid issues with capital letters in world names in 1.14. * It is reused for GameMode storage change. * @param gameMode Name that must be checked. diff --git a/src/main/java/world/bentobox/challenges/database/object/requirements/CheckPapi.java b/src/main/java/world/bentobox/challenges/database/object/requirements/CheckPapi.java index 20f5b151..079835a3 100644 --- a/src/main/java/world/bentobox/challenges/database/object/requirements/CheckPapi.java +++ b/src/main/java/world/bentobox/challenges/database/object/requirements/CheckPapi.java @@ -162,7 +162,7 @@ public boolean parseCondition() { } // Collect tokens for the left operand until an operator is encountered. while (hasNext() && !isOperator(peek())) { - if (leftSB.length() > 0) { + if (!leftSB.isEmpty()) { leftSB.append(" "); } leftSB.append(next()); @@ -178,7 +178,7 @@ public boolean parseCondition() { // Parse right operand. StringBuilder rightSB = new StringBuilder(); while (hasNext() && !isBooleanOperator(peek())) { - if (rightSB.length() > 0) { + if (!rightSB.isEmpty()) { rightSB.append(" "); } rightSB.append(next()); @@ -197,48 +197,34 @@ public boolean parseCondition() { Double rightNum = tryParseDouble(rightOperand); if (leftNum != null && rightNum != null) { // Numeric comparison. - switch (operator) { - case "=": - case "==": - return Double.compare(leftNum, rightNum) == 0; - case "<>": - case "!=": - return Double.compare(leftNum, rightNum) != 0; - case "<=": - return leftNum <= rightNum; - case ">=": - return leftNum >= rightNum; - case "<": - return leftNum < rightNum; - case ">": - return leftNum > rightNum; - default: - BentoBox.getInstance().logError("Challenges PAPI formula error: Unsupported operator: " + operator); - return false; - } + return switch (operator) { + case "=", "==" -> Double.compare(leftNum, rightNum) == 0; + case "<>", "!=" -> Double.compare(leftNum, rightNum) != 0; + case "<=" -> leftNum <= rightNum; + case ">=" -> leftNum >= rightNum; + case "<" -> leftNum < rightNum; + case ">" -> leftNum > rightNum; + default -> { + BentoBox.getInstance().logError("Challenges PAPI formula error: Unsupported operator: " + operator); + yield false; + } + }; } else { // String comparison. - switch (operator) { - case "=": - return leftOperand.equalsIgnoreCase(rightOperand); - case "==": - return leftOperand.equals(rightOperand); - case "<>": - return !leftOperand.equalsIgnoreCase(rightOperand); - case "!=": - return !leftOperand.equals(rightOperand); - case "<=": - return leftOperand.compareTo(rightOperand) <= 0; - case ">=": - return leftOperand.compareTo(rightOperand) >= 0; - case "<": - return leftOperand.compareTo(rightOperand) < 0; - case ">": - return leftOperand.compareTo(rightOperand) > 0; - default: - BentoBox.getInstance().logError("Challenges PAPI formula error: Unsupported operator: " + operator); - return false; - } + return switch (operator) { + case "=" -> leftOperand.equalsIgnoreCase(rightOperand); + case "==" -> leftOperand.equals(rightOperand); + case "<>" -> !leftOperand.equalsIgnoreCase(rightOperand); + case "!=" -> !leftOperand.equals(rightOperand); + case "<=" -> leftOperand.compareTo(rightOperand) <= 0; + case ">=" -> leftOperand.compareTo(rightOperand) >= 0; + case "<" -> leftOperand.compareTo(rightOperand) < 0; + case ">" -> leftOperand.compareTo(rightOperand) > 0; + default -> { + BentoBox.getInstance().logError("Challenges PAPI formula error: Unsupported operator: " + operator); + yield false; + } + }; } } diff --git a/src/main/java/world/bentobox/challenges/database/object/requirements/StatisticRequirements.java b/src/main/java/world/bentobox/challenges/database/object/requirements/StatisticRequirements.java index 3df672b2..5e2eb624 100644 --- a/src/main/java/world/bentobox/challenges/database/object/requirements/StatisticRequirements.java +++ b/src/main/java/world/bentobox/challenges/database/object/requirements/StatisticRequirements.java @@ -27,11 +27,12 @@ public class StatisticRequirements extends Requirements { /** * Record for this requirement - * @param Statistic statistic - * @param EntityType entity - * @param Material material - * @param Integer amount - * @param Boolean reduceStatistic + * @param statistic - Type of the statistic field + * @param entity - Type of entity for entity related statistics + * @param material - Type of material for block and item related statistics + * @param amount - Amount of the stats + * @param reduceStatistic - Indicate that player statistic fields must be adjusted after completing challenges + * */ public record StatisticRec(@Expose Statistic statistic, @Expose EntityType entity, @Expose Material material, @Expose Integer amount, @Expose Boolean reduceStatistic) { diff --git a/src/main/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandler.java b/src/main/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandler.java index 58af0c0f..ad37425b 100644 --- a/src/main/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandler.java +++ b/src/main/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandler.java @@ -8,6 +8,7 @@ import world.bentobox.bentobox.api.addons.request.AddonRequestHandler; import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.utils.Constants; /** @@ -57,13 +58,13 @@ public Object handle(Map metaData) if (metaData == null || metaData.isEmpty() || - metaData.get("challenge-name") == null || - !(metaData.get("challenge-name") instanceof String)) + metaData.get(Constants.CHALLENGE_NAME_KEY) == null || + !(metaData.get(Constants.CHALLENGE_NAME_KEY) instanceof String)) { return Collections.emptyMap(); } - Challenge challenge = this.addon.getChallengesManager().getChallenge((String) metaData.get("challenge-name")); + Challenge challenge = this.addon.getChallengesManager().getChallenge((String) metaData.get(Constants.CHALLENGE_NAME_KEY)); Map challengeDataMap; diff --git a/src/main/java/world/bentobox/challenges/handlers/ChallengeListRequestHandler.java b/src/main/java/world/bentobox/challenges/handlers/ChallengeListRequestHandler.java index 9222c0bd..d0ca2952 100644 --- a/src/main/java/world/bentobox/challenges/handlers/ChallengeListRequestHandler.java +++ b/src/main/java/world/bentobox/challenges/handlers/ChallengeListRequestHandler.java @@ -9,6 +9,7 @@ import world.bentobox.bentobox.api.addons.request.AddonRequestHandler; import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.utils.Constants; /** @@ -45,13 +46,13 @@ public Object handle(Map metaData) if (metaData == null || metaData.isEmpty() || - metaData.get("world-name") == null || - !(metaData.get("world-name") instanceof String)) + metaData.get(Constants.WORLD_NAME_KEY) == null || + !(metaData.get(Constants.WORLD_NAME_KEY) instanceof String)) { return Collections.emptyList(); } - World world = Bukkit.getWorld((String) metaData.get("world-name")); + World world = Bukkit.getWorld((String) metaData.get(Constants.WORLD_NAME_KEY)); if (world == null) { diff --git a/src/main/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandler.java b/src/main/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandler.java index dc0f9f07..24378d0a 100644 --- a/src/main/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandler.java +++ b/src/main/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandler.java @@ -12,6 +12,7 @@ import world.bentobox.bentobox.api.addons.request.AddonRequestHandler; import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Constants; /** @@ -51,15 +52,15 @@ public Object handle(Map metaData) if (metaData == null || metaData.isEmpty() || - metaData.get("world-name") == null || - !(metaData.get("world-name") instanceof String) || + metaData.get(Constants.WORLD_NAME_KEY) == null || + !(metaData.get(Constants.WORLD_NAME_KEY) instanceof String) || metaData.get("player") == null || !(metaData.get("player") instanceof UUID player)) { return Collections.emptySet(); } - World world = Bukkit.getWorld((String) metaData.get("world-name")); + World world = Bukkit.getWorld((String) metaData.get(Constants.WORLD_NAME_KEY)); if (world == null) { diff --git a/src/main/java/world/bentobox/challenges/handlers/LevelDataRequestHandler.java b/src/main/java/world/bentobox/challenges/handlers/LevelDataRequestHandler.java index 492148d7..33f732e0 100644 --- a/src/main/java/world/bentobox/challenges/handlers/LevelDataRequestHandler.java +++ b/src/main/java/world/bentobox/challenges/handlers/LevelDataRequestHandler.java @@ -8,6 +8,7 @@ import world.bentobox.bentobox.api.addons.request.AddonRequestHandler; import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.database.object.ChallengeLevel; +import world.bentobox.challenges.utils.Constants; /** @@ -54,13 +55,13 @@ public Object handle(Map metaData) if (metaData == null || metaData.isEmpty() || - metaData.get("level-name") == null || - !(metaData.get("level-name") instanceof String)) + metaData.get(Constants.LEVEL_NAME_KEY) == null || + !(metaData.get(Constants.LEVEL_NAME_KEY) instanceof String)) { return Collections.emptyMap(); } - ChallengeLevel level = this.addon.getChallengesManager().getLevel((String) metaData.get("level-name")); + ChallengeLevel level = this.addon.getChallengesManager().getLevel((String) metaData.get(Constants.LEVEL_NAME_KEY)); Map levelDataMap; diff --git a/src/main/java/world/bentobox/challenges/handlers/LevelListRequestHandler.java b/src/main/java/world/bentobox/challenges/handlers/LevelListRequestHandler.java index 290f1d9a..3a67494b 100644 --- a/src/main/java/world/bentobox/challenges/handlers/LevelListRequestHandler.java +++ b/src/main/java/world/bentobox/challenges/handlers/LevelListRequestHandler.java @@ -9,6 +9,7 @@ import world.bentobox.bentobox.api.addons.request.AddonRequestHandler; import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.utils.Constants; /** @@ -46,13 +47,13 @@ public Object handle(Map metaData) if (metaData == null || metaData.isEmpty() || - metaData.get("world-name") == null || - !(metaData.get("world-name") instanceof String)) + metaData.get(Constants.WORLD_NAME_KEY) == null || + !(metaData.get(Constants.WORLD_NAME_KEY) instanceof String)) { return Collections.emptyList(); } - World world = Bukkit.getWorld((String) metaData.get("world-name")); + World world = Bukkit.getWorld((String) metaData.get(Constants.WORLD_NAME_KEY)); if (world == null) { diff --git a/src/main/java/world/bentobox/challenges/managers/ChallengesImportManager.java b/src/main/java/world/bentobox/challenges/managers/ChallengesImportManager.java index 70a21dd1..7b461c0f 100644 --- a/src/main/java/world/bentobox/challenges/managers/ChallengesImportManager.java +++ b/src/main/java/world/bentobox/challenges/managers/ChallengesImportManager.java @@ -161,9 +161,9 @@ private void createChallenges(YamlConfiguration config, @Nullable User user, Gam long challengeCount = 0; long levelCount = 0; - if (config.contains("challenges")) + if (config.contains(Constants.CHALLENGES_KEY)) { - ConfigurationSection reader = config.getConfigurationSection("challenges"); + ConfigurationSection reader = config.getConfigurationSection(Constants.CHALLENGES_KEY); if (reader != null) { @@ -232,13 +232,13 @@ private int createChallenge(String challengeId, challenge.setIcon(matchIcon(section.getString("icon"), new ItemStack(Material.PAPER))); // Read description - if (section.isList("description")) + if (section.isList(Constants.DESCRIPTION_KEY)) { - challenge.setDescription(section.getStringList("description")); + challenge.setDescription(section.getStringList(Constants.DESCRIPTION_KEY)); } - else if (section.isString("description")) + else if (section.isString(Constants.DESCRIPTION_KEY)) { - String description = section.getString("description"); + String description = section.getString(Constants.DESCRIPTION_KEY); if (description != null) { @@ -258,15 +258,15 @@ else if (section.isString("description")) Set environments = new HashSet<>(); challenge.setEnvironment(environments); - if (section.isList("environments")) + if (section.isList(Constants.ENVIRONMENTS_KEY)) { - section.getStringList("environments"). + section.getStringList(Constants.ENVIRONMENTS_KEY). forEach(text -> environments.add(matchEnvironment(text, World.Environment.NORMAL))); } - else if (section.isString("environments")) + else if (section.isString(Constants.ENVIRONMENTS_KEY)) { - environments.add(matchEnvironment(section.getString("environments"), + environments.add(matchEnvironment(section.getString(Constants.ENVIRONMENTS_KEY), World.Environment.NORMAL)); } @@ -318,9 +318,9 @@ private void populateRequirements(Challenge challenge, ConfigurationSection sect List requiredItems = new ArrayList<>(); requirements.setRequiredItems(requiredItems); - if (section.isList("items")) + if (section.isList(Constants.ITEMS_KEY)) { - section.getStringList("items"). + section.getStringList(Constants.ITEMS_KEY). forEach(text -> { ItemStack itemStack = ItemParser.parse(text); @@ -348,10 +348,10 @@ private void populateRequirements(Challenge challenge, ConfigurationSection sect challenge.setRequirements(requirements); requirements.setTakeMoney(section.getBoolean("take-money", false)); - requirements.setRequiredMoney(section.getDouble("money", 0)); + requirements.setRequiredMoney(section.getDouble(Constants.MONEY_KEY, 0)); requirements.setTakeExperience(section.getBoolean("take-experience", false)); - requirements.setRequiredExperience(section.getInt("experience", 0)); + requirements.setRequiredExperience(section.getInt(Constants.EXPERIENCE_KEY, 0)); requirements.setRequiredIslandLevel(section.getInt("level", 0)); } @@ -373,13 +373,13 @@ private void populateRequirements(Challenge challenge, ConfigurationSection sect Set permissions = new HashSet<>(); challenge.getRequirements().setRequiredPermissions(permissions); - if (section.isList("permissions")) + if (section.isList(Constants.PERMISSIONS_KEY)) { - permissions.addAll(section.getStringList("permissions")); + permissions.addAll(section.getStringList(Constants.PERMISSIONS_KEY)); } - else if (section.isString("permissions")) + else if (section.isString(Constants.PERMISSIONS_KEY)) { - String description = section.getString("permissions"); + String description = section.getString(Constants.PERMISSIONS_KEY); if (description != null) { @@ -462,9 +462,9 @@ private void populateRewards(Challenge challenge, @Nullable ConfigurationSection challenge.setRewardText(section.getString("text", "")); - if (section.isList("items")) + if (section.isList(Constants.ITEMS_KEY)) { - section.getStringList("items"). + section.getStringList(Constants.ITEMS_KEY). forEach(text -> { ItemStack itemStack = ItemParser.parse(text); @@ -475,16 +475,16 @@ private void populateRewards(Challenge challenge, @Nullable ConfigurationSection }); } - challenge.setRewardExperience(section.getInt("experience", 0)); - challenge.setRewardMoney(section.getDouble("money", 0)); + challenge.setRewardExperience(section.getInt(Constants.EXPERIENCE_KEY, 0)); + challenge.setRewardMoney(section.getDouble(Constants.MONEY_KEY, 0)); - if (section.isList("commands")) + if (section.isList(Constants.COMMANDS_KEY)) { - challenge.setRewardCommands(section.getStringList("commands")); + challenge.setRewardCommands(section.getStringList(Constants.COMMANDS_KEY)); } - else if (section.isString("commands")) + else if (section.isString(Constants.COMMANDS_KEY)) { - String description = section.getString("commands"); + String description = section.getString(Constants.COMMANDS_KEY); if (description != null) { @@ -514,9 +514,9 @@ private void populateRepeatRewards(Challenge challenge, @Nullable ConfigurationS challenge.setRepeatRewardText(section.getString("text", "")); - if (section.isList("items")) + if (section.isList(Constants.ITEMS_KEY)) { - section.getStringList("items"). + section.getStringList(Constants.ITEMS_KEY). forEach(text -> { ItemStack itemStack = ItemParser.parse(text); @@ -527,16 +527,16 @@ private void populateRepeatRewards(Challenge challenge, @Nullable ConfigurationS }); } - challenge.setRepeatExperienceReward(section.getInt("experience", 0)); - challenge.setRepeatMoneyReward(section.getDouble("money", 0)); + challenge.setRepeatExperienceReward(section.getInt(Constants.EXPERIENCE_KEY, 0)); + challenge.setRepeatMoneyReward(section.getDouble(Constants.MONEY_KEY, 0)); - if (section.isList("commands")) + if (section.isList(Constants.COMMANDS_KEY)) { - challenge.setRepeatRewardCommands(section.getStringList("commands")); + challenge.setRepeatRewardCommands(section.getStringList(Constants.COMMANDS_KEY)); } - else if (section.isString("commands")) + else if (section.isString(Constants.COMMANDS_KEY)) { - String description = section.getString("commands"); + String description = section.getString(Constants.COMMANDS_KEY); if (description != null) { @@ -566,9 +566,9 @@ private void populateRewards(ChallengeLevel level, @Nullable ConfigurationSectio level.setRewardText(section.getString("text", "")); - if (section.isList("items")) + if (section.isList(Constants.ITEMS_KEY)) { - section.getStringList("items"). + section.getStringList(Constants.ITEMS_KEY). forEach(text -> { ItemStack itemStack = ItemParser.parse(text); @@ -579,16 +579,16 @@ private void populateRewards(ChallengeLevel level, @Nullable ConfigurationSectio }); } - level.setRewardExperience(section.getInt("experience", 0)); - level.setRewardMoney(section.getDouble("money", 0)); + level.setRewardExperience(section.getInt(Constants.EXPERIENCE_KEY, 0)); + level.setRewardMoney(section.getDouble(Constants.MONEY_KEY, 0)); - if (section.isList("commands")) + if (section.isList(Constants.COMMANDS_KEY)) { - level.setRewardCommands(section.getStringList("commands")); + level.setRewardCommands(section.getStringList(Constants.COMMANDS_KEY)); } - else if (section.isString("commands")) + else if (section.isString(Constants.COMMANDS_KEY)) { - String description = section.getString("commands"); + String description = section.getString(Constants.COMMANDS_KEY); if (description != null) { @@ -633,16 +633,16 @@ private int createLevel(String levelId, level.setOrder(section.getInt("order", 0)); level.setWaiverAmount(section.getInt("waiver", 0)); - level.setUnlockMessage(section.getString("description", "")); + level.setUnlockMessage(section.getString(Constants.DESCRIPTION_KEY, "")); this.populateRewards(level, section.getConfigurationSection("rewards")); Set challenges = new HashSet<>(); level.setChallenges(challenges); - if (section.isList("challenges")) + if (section.isList(Constants.CHALLENGES_KEY)) { - section.getStringList("challenges").forEach(text -> { + section.getStringList(Constants.CHALLENGES_KEY).forEach(text -> { Challenge challenge = this.addon.getChallengesManager().getChallenge(prefix + text); if (challenge != null) @@ -830,7 +830,7 @@ public void loadDownloadedChallenges(User user, World world, String downloadStri public void generateDatabaseFile(User user, World world, String fileName) { File defaultFile = new File(this.addon.getDataFolder(), - fileName.endsWith(".json") ? fileName : fileName + ".json"); + fileName.endsWith(Constants.JSON_EXTENSION) ? fileName : fileName + Constants.JSON_EXTENSION); if (defaultFile.exists()) { @@ -860,7 +860,7 @@ public void generateDatabaseFile(User user, World world, String fileName) stream(). map(challenge -> { // Use clone to avoid any changes in existing challenges. - Challenge clone = challenge.clone(); + Challenge clone = challenge.copy(); // Remove world name from challenge id. clone.setUniqueId(challenge.getUniqueId().replaceFirst(replacementString, "")); // Remove world name from level id. @@ -1183,9 +1183,9 @@ String toJsonString(DefaultDataHolder instance) */ DefaultDataHolder loadObject(String fileName) { - if (!fileName.endsWith(".json")) + if (!fileName.endsWith(Constants.JSON_EXTENSION)) { - fileName = fileName + ".json"; + fileName = fileName + Constants.JSON_EXTENSION; } File defaultFile = new File(this.addon.getDataFolder(), fileName); diff --git a/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java b/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java index 7ae75e50..39c02da9 100644 --- a/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java +++ b/src/main/java/world/bentobox/challenges/managers/ChallengesManager.java @@ -273,7 +273,7 @@ public boolean loadChallenge(@Nullable Challenge challenge, { Utils.sendMessage(user, world, - Constants.ERRORS + "load-error", + Constants.LOAD_ERROR, Constants.PARAMETER_VALUE, "NULL"); } @@ -372,7 +372,7 @@ public boolean loadLevel(@Nullable ChallengeLevel level, { Utils.sendMessage(user, world, - Constants.ERRORS + "load-error", + Constants.LOAD_ERROR, Constants.PARAMETER_VALUE, "NULL"); } @@ -399,7 +399,7 @@ public boolean loadLevel(@Nullable ChallengeLevel level, { Utils.sendMessage(user, world, - Constants.ERRORS + "load-error", + Constants.LOAD_ERROR, Constants.PARAMETER_VALUE, level.getFriendlyName()); } else @@ -1116,7 +1116,8 @@ private void resetAllChallenges(@NonNull String storageDataID, @NonNull String g /** * Get the status on every level for required world and playerData * - * @param storageDataID - playerData ID + * @param user - player which level status must be acquired. + * @param world - world which level status must be acquired. * @param gameMode - World Name where levels should be searched. * @return Level status - how many challenges still to do on which level */ @@ -1771,7 +1772,7 @@ public boolean isLastLevel(ChallengeLevel level, World world) { List levels = this.getLevels(world); - return levels.get(levels.size() - 1) == level; + return levels.getLast() == level; } diff --git a/src/main/java/world/bentobox/challenges/panel/CommonPagedPanel.java b/src/main/java/world/bentobox/challenges/panel/CommonPagedPanel.java index dec98c8a..2472fcf4 100644 --- a/src/main/java/world/bentobox/challenges/panel/CommonPagedPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/CommonPagedPanel.java @@ -147,7 +147,7 @@ protected PanelItem getButton(CommonButtons button) if (button == CommonButtons.NEXT) { - description.add(this.user.getTranslation(reference + "description", + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.pageIndex + 2))); description.add(""); @@ -163,7 +163,7 @@ protected PanelItem getButton(CommonButtons button) } else if (button == CommonButtons.PREVIOUS) { - description.add(this.user.getTranslation(reference + "description", + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.pageIndex))); description.add(""); @@ -179,7 +179,7 @@ else if (button == CommonButtons.PREVIOUS) } else if (button == CommonButtons.SEARCH) { - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); if (this.searchString != null && !this.searchString.isEmpty()) { diff --git a/src/main/java/world/bentobox/challenges/panel/CommonPanel.java b/src/main/java/world/bentobox/challenges/panel/CommonPanel.java index 87984091..2e4b6a68 100644 --- a/src/main/java/world/bentobox/challenges/panel/CommonPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/CommonPanel.java @@ -7,6 +7,7 @@ import java.time.Duration; import java.util.Arrays; +import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Map; @@ -138,7 +139,7 @@ protected List generateChallengeDescription(Challenge challenge, @Nullab // Fetch a custom description translation; if empty, fallback to challenge's own description String description = this.user - .getTranslationOrNothing("challenges.challenges." + challenge.getUniqueId() + ".description"); + .getTranslationOrNothing(Constants.CHALLENGES_CHALLENGES + challenge.getUniqueId() + ".description"); if (description.isEmpty()) { // Combine the challenge description list into a single string and translate color codes description = Util.translateColorCodes(String.join("\n", challenge.getDescription())); @@ -156,29 +157,27 @@ protected List generateChallengeDescription(Challenge challenge, @Nullab String returnString; // Check if the description (after removing blank lines) is not empty - if (!description.replaceAll("(?m)^[ \\t]*\\r?\\n", "").isEmpty()) { + if (!description.replaceAll(Constants.BLANK_LINE_REGEX, "").isEmpty()) { // Retrieve the lore translation without the description placeholder returnString = this.user.getTranslationOrNothing(referenceKey + "lore", "[requirements]", requirements, - "[rewards]", rewards, "[status]", status, "[cooldown]", coolDown); + Constants.PARAMETER_REWARDS, rewards, Constants.PARAMETER_STATUS, status, "[cooldown]", coolDown); // Remove any empty lines from the translated text and split it into individual lines final String finalDescription = description; // ensure it's effectively final - List lines = Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + return Arrays.stream(returnString.replaceAll(Constants.BLANK_LINE_REGEX, "").split("\n")) .map(line -> line.contains(Constants.PARAMETER_DESCRIPTION) ? line.replace(Constants.PARAMETER_DESCRIPTION, finalDescription) : line) .collect(Collectors.toList()); - - return lines; } else { // If description is empty, pass it directly as a parameter to the translation returnString = this.user.getTranslationOrNothing(referenceKey + "lore", Constants.PARAMETER_DESCRIPTION, - description, "[requirements]", requirements, "[rewards]", rewards, "[status]", status, "[cooldown]", + description, "[requirements]", requirements, Constants.PARAMETER_REWARDS, rewards, Constants.PARAMETER_STATUS, status, "[cooldown]", coolDown); // Remove empty lines and return the resulting lines as a list - return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + return Arrays.stream(returnString.replaceAll(Constants.BLANK_LINE_REGEX, "").split("\n")) .collect(Collectors.toList()); } } @@ -253,7 +252,7 @@ private String generateRequirements(Challenge challenge, @Nullable User target) if (missingPermissions.size() == 1) { permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permission-single", - Constants.PARAMETER_PERMISSION, missingPermissions.get(0))); + Constants.PARAMETER_PERMISSION, missingPermissions.getFirst())); } else if (!missingPermissions.isEmpty()) { permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permissions-title")); missingPermissions.forEach(permission -> { @@ -296,11 +295,11 @@ private String generateIslandChallenge(IslandRequirements requirement) { blocks.append("\n"); if (entry.getValue() > 1) { - blocks.append(this.user.getTranslationOrNothing(reference + "blocks-value", + blocks.append(this.user.getTranslationOrNothing(reference + Constants.BLOCKS_VALUE, Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); } else { - blocks.append(this.user.getTranslationOrNothing(reference + "block-value", + blocks.append(this.user.getTranslationOrNothing(reference + Constants.BLOCK_VALUE, Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); } }); @@ -354,11 +353,11 @@ private String getBlocksTagsDescription(IslandRequirements requirement, String r builder.append("\n"); if (entry.getValue() > 1) { - builder.append(this.user.getTranslationOrNothing(reference + "blocks-value", + builder.append(this.user.getTranslationOrNothing(reference + Constants.BLOCKS_VALUE, Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); } else { - builder.append(this.user.getTranslationOrNothing(reference + "block-value", + builder.append(this.user.getTranslationOrNothing(reference + Constants.BLOCK_VALUE, Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); } }); @@ -379,11 +378,11 @@ private String getEntityTypeTagsDescription(IslandRequirements requirement, Stri builder.append("\n"); if (entry.getValue() > 1) { - builder.append(this.user.getTranslationOrNothing(reference + "blocks-value", + builder.append(this.user.getTranslationOrNothing(reference + Constants.BLOCKS_VALUE, Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); } else { - builder.append(this.user.getTranslationOrNothing(reference + "block-value", + builder.append(this.user.getTranslationOrNothing(reference + Constants.BLOCK_VALUE, Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); } }); @@ -411,17 +410,17 @@ private String generateInventoryChallenge(InventoryRequirements requirement) { if (!requirement.getRequiredItems().isEmpty()) { StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_TITLE)); Utils.groupEqualItems(requirement.getRequiredItems(), requirement.getIgnoreMetaData()).stream() .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { builder.append("\n"); if (itemStack.getAmount() > 1) { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", - String.valueOf(itemStack.getAmount()), "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEMS_VALUE, Constants.PARAMETER_NUMBER, + String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } else { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_VALUE, Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } }); @@ -433,7 +432,7 @@ private String generateInventoryChallenge(InventoryRequirements requirement) { String warning = requirement.isTakeItems() ? this.user.getTranslationOrNothing(reference + "warning") : ""; - return this.user.getTranslationOrNothing(reference + "lore", "[items]", items, "[warning]", warning); + return this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_ITEMS, items, "[warning]", warning); } /** @@ -446,7 +445,7 @@ private String generateOtherChallenge(OtherRequirements requirement) { final String reference = Constants.DESCRIPTIONS + "challenge.requirements.other."; String experience = requirement.getRequiredExperience() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "experience", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.EXPERIENCE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(requirement.getRequiredExperience())); String experienceWarning = requirement.getRequiredExperience() > 0 && requirement.isTakeExperience() @@ -454,18 +453,18 @@ private String generateOtherChallenge(OtherRequirements requirement) { : ""; String money = !this.addon.isEconomyProvided() || requirement.getRequiredMoney() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "money", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.MONEY_KEY, Constants.PARAMETER_NUMBER, String.valueOf(requirement.getRequiredMoney())); String moneyWarning = this.addon.isEconomyProvided() && requirement.getRequiredMoney() > 0 && requirement.isTakeMoney() ? this.user.getTranslationOrNothing(reference + "money-warning") : ""; String level = !this.addon.isLevelProvided() || requirement.getRequiredIslandLevel() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "level", "[number]", + : this.user.getTranslationOrNothing(reference + "level", Constants.PARAMETER_NUMBER, String.valueOf(requirement.getRequiredIslandLevel())); - return this.user.getTranslationOrNothing(reference + "lore", "[experience]", experience, "[experience-warning]", - experienceWarning, "[money]", money, "[money-warning]", moneyWarning, "[level]", level); + return this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_EXPERIENCE, experience, "[experience-warning]", + experienceWarning, Constants.PARAMETER_MONEY, money, "[money-warning]", moneyWarning, "[level]", level); } /** @@ -485,36 +484,35 @@ private String generateStatisticChallenge(StatisticRequirements requirement) { StringBuilder statistics = new StringBuilder(); for (StatisticRec s : requirement.getRequiredStatistics()) { String statistic = switch (s.statistic().getType()) { - case UNTYPED -> this.user.getTranslationOrNothing(reference + "statistic", "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[number]", String.valueOf(s.amount())); + case UNTYPED -> this.user.getTranslationOrNothing(reference + "statistic", Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_NUMBER, String.valueOf(s.amount())); case ITEM, BLOCK -> { if (s.amount() > 1) { - yield this.user.getTranslationOrNothing(reference + "multiple-target", "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[number]", String.valueOf(s.amount()), - "[target]", Utils.prettifyObject(s.material(), this.user)); + yield this.user.getTranslationOrNothing(reference + "multiple-target", Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_NUMBER, String.valueOf(s.amount()), + Constants.PARAMETER_TARGET, Utils.prettifyObject(s.material(), this.user)); } else { - yield this.user.getTranslationOrNothing(reference + "single-target", "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[target]", + yield this.user.getTranslationOrNothing(reference + "single-target", Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_TARGET, Utils.prettifyObject(s.material(), this.user)); } } case ENTITY -> { if (s.amount() > 1) { - yield this.user.getTranslationOrNothing(reference + "multiple-target", "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[number]", String.valueOf(s.amount()), - "[target]", Utils.prettifyObject(s.entity(), this.user)); + yield this.user.getTranslationOrNothing(reference + "multiple-target", Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_NUMBER, String.valueOf(s.amount()), + Constants.PARAMETER_TARGET, Utils.prettifyObject(s.entity(), this.user)); } else { - yield this.user.getTranslationOrNothing(reference + "single-target", "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[target]", + yield this.user.getTranslationOrNothing(reference + "single-target", Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_TARGET, Utils.prettifyObject(s.entity(), this.user)); } } - default -> ""; }; String warning = s.reduceStatistic() ? this.user.getTranslationOrNothing(reference + "warning") : ""; - statistics.append(this.user.getTranslationOrNothing(reference + "lore", "[statistic]", statistic, "[warning]", + statistics.append(this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_STATISTIC, statistic, "[warning]", warning)); statistics.append("\n"); @@ -585,17 +583,17 @@ private String generateRepeatReward(Challenge challenge) { if (!challenge.getRepeatItemReward().isEmpty()) { StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_TITLE)); Utils.groupEqualItems(challenge.getRepeatItemReward(), challenge.getIgnoreRewardMetaData()).stream() .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { builder.append("\n"); if (itemStack.getAmount() > 1) { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", - String.valueOf(itemStack.getAmount()), "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEMS_VALUE, Constants.PARAMETER_NUMBER, + String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } else { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_VALUE, Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } }); @@ -606,11 +604,11 @@ private String generateRepeatReward(Challenge challenge) { } String experience = challenge.getRepeatExperienceReward() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "experience", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.EXPERIENCE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(challenge.getRepeatExperienceReward())); String money = !this.addon.isEconomyProvided() || challenge.getRepeatMoneyReward() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "money", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.MONEY_KEY, Constants.PARAMETER_NUMBER, addon.getPlugin().getVault().map(v -> v.format(challenge.getRepeatMoneyReward())) .orElse(String.valueOf(challenge.getRepeatMoneyReward()))); @@ -620,12 +618,12 @@ private String generateRepeatReward(Challenge challenge) { StringBuilder permissionBuilder = new StringBuilder(); if (!challenge.getRepeatRewardCommands().isEmpty()) { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); + permissionBuilder.append(this.user.getTranslationOrNothing(reference + Constants.COMMANDS_TITLE)); challenge.getRepeatRewardCommands().forEach(command -> { permissionBuilder.append("\n"); permissionBuilder - .append(this.user.getTranslationOrNothing(reference + "command", "[command]", command)); + .append(this.user.getTranslationOrNothing(reference + Constants.COMMAND_KEY, Constants.PARAMETER_COMMAND, command)); }); } @@ -641,19 +639,19 @@ private String generateRepeatReward(Challenge challenge) { } String rewardText = this.user - .getTranslationOrNothing("challenges.challenges." + challenge.getUniqueId() + ".repeat-reward-text"); + .getTranslationOrNothing(Constants.CHALLENGES_CHALLENGES + challenge.getUniqueId() + ".repeat-reward-text"); if (rewardText.isEmpty()) { - rewardText = Util.translateColorCodes(String.join("\n", challenge.getRepeatRewardText())); + rewardText = wrapToWidth(Util.translateColorCodes(String.join("\n", challenge.getRepeatRewardText())), 30); } - return this.user.getTranslationOrNothing(reference + "lore", "[text]", rewardText, "[items]", items, - "[experience]", experience, "[money]", money, "[commands]", commands); + return this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_TEXT, rewardText, Constants.PARAMETER_ITEMS, items, + Constants.PARAMETER_EXPERIENCE, experience, Constants.PARAMETER_MONEY, money, Constants.PARAMETER_COMMANDS, commands); } /** * This method creates reward lore text. - * + * * @param challenge Challenge which reward lore must be generated. * @return Reward text. */ @@ -664,17 +662,17 @@ private String generateReward(Challenge challenge) { if (!challenge.getRewardItems().isEmpty() && !challenge.isHideRewardItems()) { StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_TITLE)); Utils.groupEqualItems(challenge.getRewardItems(), challenge.getIgnoreRewardMetaData()).stream() .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { builder.append("\n"); if (itemStack.getAmount() > 1) { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", - String.valueOf(itemStack.getAmount()), "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEMS_VALUE, Constants.PARAMETER_NUMBER, + String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } else { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_VALUE, Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } }); @@ -685,11 +683,11 @@ private String generateReward(Challenge challenge) { } String experience = challenge.getRewardExperience() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "experience", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.EXPERIENCE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(challenge.getRewardExperience())); String money = !this.addon.isEconomyProvided() || challenge.getRewardMoney() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "money", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.MONEY_KEY, Constants.PARAMETER_NUMBER, addon.getPlugin().getVault().map(v -> v.format(challenge.getRewardMoney())) .orElse(String.valueOf(challenge.getRewardMoney()))); @@ -699,12 +697,12 @@ private String generateReward(Challenge challenge) { StringBuilder permissionBuilder = new StringBuilder(); if (!challenge.getRewardCommands().isEmpty()) { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); + permissionBuilder.append(this.user.getTranslationOrNothing(reference + Constants.COMMANDS_TITLE)); challenge.getRewardCommands().forEach(command -> { permissionBuilder.append("\n"); permissionBuilder - .append(this.user.getTranslationOrNothing(reference + "command", "[command]", command)); + .append(this.user.getTranslationOrNothing(reference + Constants.COMMAND_KEY, Constants.PARAMETER_COMMAND, command)); }); } @@ -720,14 +718,14 @@ private String generateReward(Challenge challenge) { } String rewardText = this.user - .getTranslationOrNothing("challenges.challenges." + challenge.getUniqueId() + ".reward-text"); + .getTranslationOrNothing(Constants.CHALLENGES_CHALLENGES + challenge.getUniqueId() + ".reward-text"); if (rewardText.isEmpty()) { - rewardText = Util.translateColorCodes(String.join("\n", challenge.getRewardText())); + rewardText = wrapToWidth(Util.translateColorCodes(String.join("\n", challenge.getRewardText())), 30); } - return this.user.getTranslationOrNothing(reference + "lore", "[text]", rewardText, "[items]", items, - "[experience]", experience, "[money]", money, "[commands]", commands); + return this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_TEXT, rewardText, Constants.PARAMETER_ITEMS, items, + Constants.PARAMETER_EXPERIENCE, experience, Constants.PARAMETER_MONEY, money, Constants.PARAMETER_COMMANDS, commands); } /** @@ -752,24 +750,24 @@ protected List generateLevelDescription(ChallengeLevel level) { waiverAdd += level.getWaiverAmount(); // Get requirements in single string String waiver = this.manager.isLastLevel(level, this.world) ? "" - : this.user.getTranslationOrNothing(reference + "waiver", "[number]", + : this.user.getTranslationOrNothing(reference + "waiver", Constants.PARAMETER_NUMBER, String.valueOf(waiverAdd)); // Get rewards in single string String rewards = this.generateReward(level); - String returnString = this.user.getTranslation(reference + "lore", "[text]", - Util.translateColorCodes(level.getUnlockMessage()), "[waiver]", waiver, "[rewards]", rewards, - "[status]", status); + String returnString = this.user.getTranslation(reference + "lore", Constants.PARAMETER_TEXT, + Util.translateColorCodes(level.getUnlockMessage()), "[waiver]", waiver, Constants.PARAMETER_REWARDS, rewards, + Constants.PARAMETER_STATUS, status); // Remove empty lines and returns as a list. - return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + return Arrays.stream(returnString.replaceAll(Constants.BLANK_LINE_REGEX, "").split("\n")) .collect(Collectors.toList()); } /** * This method generates level description string. - * + * * @param levelStatus Level which string must be generated. * @param user User who calls generation. * @return List with generated description. @@ -793,7 +791,7 @@ protected List generateLevelDescription(LevelStatus levelStatus, User us // Get requirements in single string String waiver = this.manager.isLastLevel(level, this.world) || !levelStatus.isUnlocked() || levelStatus.isComplete() ? "" - : this.user.getTranslationOrNothing(reference + "waiver", "[number]", + : this.user.getTranslationOrNothing(reference + "waiver", Constants.PARAMETER_NUMBER, String.valueOf(waiverAdd)); // Get rewards in single string String rewards = !levelStatus.isUnlocked() ? "" : this.generateReward(level); @@ -805,12 +803,12 @@ protected List generateLevelDescription(LevelStatus levelStatus, User us description = Util.translateColorCodes(String.join("\n", level.getUnlockMessage())); } - String returnString = this.user.getTranslation(reference + "lore", "[text]", description, "[waiver]", waiver, - "[rewards]", rewards, "[status]", status); + String returnString = this.user.getTranslation(reference + "lore", Constants.PARAMETER_TEXT, description, "[waiver]", waiver, + Constants.PARAMETER_REWARDS, rewards, Constants.PARAMETER_STATUS, status); // Remove empty lines and returns as a list. - return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + return Arrays.stream(returnString.replaceAll(Constants.BLANK_LINE_REGEX, "").split("\n")) .collect(Collectors.toList()); } @@ -825,7 +823,7 @@ private String generateLevelStatus(LevelStatus levelStatus) { if (!levelStatus.isUnlocked()) { return this.user.getTranslationOrNothing(reference + "locked") + "\n" - + this.user.getTranslationOrNothing(reference + "missing-challenges", "[number]", + + this.user.getTranslationOrNothing(reference + "missing-challenges", Constants.PARAMETER_NUMBER, String.valueOf(levelStatus.getNumberOfChallengesStillToDo())); } else if (levelStatus.isComplete()) { return this.user.getTranslationOrNothing(reference + "completed"); @@ -837,7 +835,7 @@ private String generateLevelStatus(LevelStatus levelStatus) { int doneChallenges = (int) challengeList.stream().filter(challenge -> this.addon.getChallengesManager() .isChallengeComplete(user.getUniqueId(), world, challenge)).count(); - return this.user.getTranslation(reference + "completed-challenges-of", "[number]", + return this.user.getTranslation(reference + "completed-challenges-of", Constants.PARAMETER_NUMBER, String.valueOf(doneChallenges), "[max]", String.valueOf(challengeList.size())); } } @@ -855,17 +853,17 @@ private String generateReward(ChallengeLevel level) { if (!level.getRewardItems().isEmpty()) { StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_TITLE)); Utils.groupEqualItems(level.getRewardItems(), level.getIgnoreRewardMetaData()).stream() .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { builder.append("\n"); if (itemStack.getAmount() > 1) { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", - String.valueOf(itemStack.getAmount()), "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEMS_VALUE, Constants.PARAMETER_NUMBER, + String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } else { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + builder.append(this.user.getTranslationOrNothing(reference + Constants.ITEM_VALUE, Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user))); } }); @@ -876,11 +874,11 @@ private String generateReward(ChallengeLevel level) { } String experience = level.getRewardExperience() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "experience", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.EXPERIENCE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(level.getRewardExperience())); String money = !this.addon.isEconomyProvided() || level.getRewardMoney() <= 0 ? "" - : this.user.getTranslationOrNothing(reference + "money", "[number]", + : this.user.getTranslationOrNothing(reference + Constants.MONEY_KEY, Constants.PARAMETER_NUMBER, String.valueOf(level.getRewardMoney())); String commands; @@ -889,12 +887,12 @@ private String generateReward(ChallengeLevel level) { StringBuilder permissionBuilder = new StringBuilder(); if (!level.getRewardCommands().isEmpty()) { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); + permissionBuilder.append(this.user.getTranslationOrNothing(reference + Constants.COMMANDS_TITLE)); level.getRewardCommands().forEach(command -> { permissionBuilder.append("\n"); permissionBuilder - .append(this.user.getTranslationOrNothing(reference + "command", "[command]", command)); + .append(this.user.getTranslationOrNothing(reference + Constants.COMMAND_KEY, Constants.PARAMETER_COMMAND, command)); }); } @@ -913,13 +911,89 @@ private String generateReward(ChallengeLevel level) { .getTranslationOrNothing("challenges.levels." + level.getUniqueId() + ".reward-text"); if (rewardText.isEmpty()) { - rewardText = Util.translateColorCodes(String.join("\n", level.getRewardText())); + rewardText = wrapToWidth(Util.translateColorCodes(String.join("\n", level.getRewardText())), 30); } - return this.user.getTranslationOrNothing(reference + "lore", "[text]", rewardText, "[items]", items, - "[experience]", experience, "[money]", money, "[commands]", commands); + return this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_TEXT, rewardText, Constants.PARAMETER_ITEMS, items, + Constants.PARAMETER_EXPERIENCE, experience, Constants.PARAMETER_MONEY, money, Constants.PARAMETER_COMMANDS, commands); } + // --------------------------------------------------------------------- + // Section: Utilities + // --------------------------------------------------------------------- + + + /** + * Word-wraps {@code text} so that no visible line exceeds {@code width} characters. + * MiniMessage tags ({@code }) and legacy §x codes are excluded from the width + * measurement. Existing newlines in the source text are preserved as line breaks. + * + * @param text the text to wrap (may contain {@code \n} and formatting tags) + * @param width maximum visible characters per line + * @return the wrapped text with lines joined by {@code \n} + */ + private static String wrapToWidth(String text, int width) + { + if (text == null || text.isEmpty()) + { + return text == null ? "" : text; + } + + List result = new ArrayList<>(); + + for (String line : text.split("\n", -1)) + { + if (line.isEmpty()) + { + result.add(""); + continue; + } + + StringBuilder current = new StringBuilder(); + + for (String word : line.split("\\s+")) + { + if (word.isEmpty()) + { + continue; + } + + int currentLen = stripFormatting(current.toString()).length(); + int wordLen = stripFormatting(word).length(); + + if (currentLen == 0) + { + current.append(word); + } + else if (currentLen + 1 + wordLen <= width) + { + current.append(' ').append(word); + } + else + { + result.add(current.toString()); + current.setLength(0); + current.append(word); + } + } + + if (!current.isEmpty()) + { + result.add(current.toString()); + } + } + + return String.join("\n", result); + } + + + /** Strips MiniMessage {@code } sequences and legacy {@code §x} codes. */ + private static String stripFormatting(String text) + { + return text.replaceAll("<[^>]+>", "").replaceAll("§[0-9a-fk-orA-FK-OR]", ""); + } + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- diff --git a/src/main/java/world/bentobox/challenges/panel/ConversationUtils.java b/src/main/java/world/bentobox/challenges/panel/ConversationUtils.java index e4ca2e90..828ddbff 100644 --- a/src/main/java/world/bentobox/challenges/panel/ConversationUtils.java +++ b/src/main/java/world/bentobox/challenges/panel/ConversationUtils.java @@ -69,7 +69,7 @@ protected boolean isInputValid(@NotNull ConversationContext context, @NotNull St String validEntry = user.getTranslation(Constants.CONVERSATIONS + "confirm-string") + "," + user.getTranslation(Constants.CONVERSATIONS + "deny-string") + "," + user.getTranslation(Constants.CONVERSATIONS + "exit-string") + - "," + user.getTranslation(Constants.CONVERSATIONS + "cancel-string"); + "," + user.getTranslation(Constants.CANCEL_STRING); // Split and check if they exist in valid entries. String[] accepted = validEntry.toLowerCase().replaceAll("\\s", "").split(","); @@ -103,7 +103,7 @@ protected Prompt acceptValidatedInput(@NotNull ConversationContext context, @Not // Return message about failed operation. return ConversationUtils.endMessagePrompt( - user.getTranslation(Constants.CONVERSATIONS + "cancelled")); + user.getTranslation(Constants.CANCELLED)); } } @@ -123,7 +123,7 @@ public String getPromptText(@NotNull ConversationContext conversationContext) }; new ConversationFactory(BentoBox.getInstance()). - withPrefix(context -> user.getTranslation(Constants.CONVERSATIONS + "prefix")). + withPrefix(context -> user.getTranslation(Constants.PREFIX)). withFirstPrompt(confirmationPrompt). withLocalEcho(false). withTimeout(90). @@ -238,12 +238,12 @@ protected Prompt acceptValidatedInput(@NotNull ConversationContext context, @Not }; new ConversationFactory(BentoBox.getInstance()). - withPrefix(context -> user.getTranslation(Constants.CONVERSATIONS + "prefix")). + withPrefix(context -> user.getTranslation(Constants.PREFIX)). withFirstPrompt(validatingPrompt). withLocalEcho(false). withTimeout(90). // On cancel conversation will be closed. - withEscapeSequence(user.getTranslation(Constants.CONVERSATIONS + "cancel-string")). + withEscapeSequence(user.getTranslation(Constants.CANCEL_STRING)). // Use null value in consumer to detect if user has abandoned conversation. addConversationAbandonedListener(ConversationUtils.getAbandonListener(consumer, user)). buildConversation(user.getPlayer()). @@ -353,11 +353,11 @@ public String getPromptText(@NotNull ConversationContext conversationContext) // Init conversation api. new ConversationFactory(BentoBox.getInstance()). - withPrefix(context -> user.getTranslation(Constants.CONVERSATIONS + "prefix")). + withPrefix(context -> user.getTranslation(Constants.PREFIX)). withFirstPrompt(numberPrompt). withLocalEcho(false). withTimeout(90). - withEscapeSequence(user.getTranslation(Constants.CONVERSATIONS + "cancel-string")). + withEscapeSequence(user.getTranslation(Constants.CANCEL_STRING)). // Use null value in consumer to detect if user has abandoned conversation. addConversationAbandonedListener(ConversationUtils.getAbandonListener(consumer, user)). buildConversation(user.getPlayer()). @@ -396,7 +396,7 @@ public String getPromptText(@NotNull ConversationContext context) } else { - return user.getTranslation(Constants.CONVERSATIONS + "cancelled"); + return user.getTranslation(Constants.CANCELLED); } } @@ -421,12 +421,12 @@ public String getPromptText(@NotNull ConversationContext context) { StringBuilder sb = new StringBuilder(); sb.append(user.getTranslation(Constants.CONVERSATIONS + "written-text")); - sb.append(System.getProperty("line.separator")); + sb.append(System.lineSeparator()); for (String line : ((List) context.getSessionData(SESSION_CONSTANT))) { sb.append(line); - sb.append(System.getProperty("line.separator")); + sb.append(System.lineSeparator()); } return sb.toString(); @@ -463,12 +463,12 @@ public Prompt acceptInput(@NotNull ConversationContext context, @Nullable String }; new ConversationFactory(BentoBox.getInstance()). - withPrefix(context -> user.getTranslation(Constants.CONVERSATIONS + "prefix")). + withPrefix(context -> user.getTranslation(Constants.PREFIX)). withFirstPrompt(stringPrompt). withModality(true). withLocalEcho(false). withTimeout(90). - withEscapeSequence(user.getTranslation(Constants.CONVERSATIONS + "cancel-string")). + withEscapeSequence(user.getTranslation(Constants.CANCEL_STRING)). addConversationAbandonedListener(ConversationUtils.getAbandonListener(consumer, user)). buildConversation(user.getPlayer()). begin(); @@ -510,12 +510,12 @@ public Prompt acceptInput(@NotNull ConversationContext context, @Nullable String }; new ConversationFactory(BentoBox.getInstance()). - withPrefix(context -> user.getTranslation(Constants.CONVERSATIONS + "prefix")). + withPrefix(context -> user.getTranslation(Constants.PREFIX)). withFirstPrompt(stringPrompt). // On cancel conversation will be closed. withLocalEcho(false). withTimeout(90). - withEscapeSequence(user.getTranslation(Constants.CONVERSATIONS + "cancel-string")). + withEscapeSequence(user.getTranslation(Constants.CANCEL_STRING)). // Use null value in consumer to detect if user has abandoned conversation. addConversationAbandonedListener(ConversationUtils.getAbandonListener(consumer, user)). buildConversation(user.getPlayer()). @@ -567,8 +567,8 @@ private static ConversationAbandonedListener getAbandonListener(Consumer cons consumer.accept(null); // send cancell message abandonedEvent.getContext().getForWhom().sendRawMessage( - user.getTranslation(Constants.CONVERSATIONS + "prefix") + - user.getTranslation(Constants.CONVERSATIONS + "cancelled")); + user.getTranslation(Constants.PREFIX) + + user.getTranslation(Constants.CANCELLED)); } }; } diff --git a/src/main/java/world/bentobox/challenges/panel/admin/AdminPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/AdminPanel.java index 5a1dd21e..5e840643 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/AdminPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/AdminPanel.java @@ -9,10 +9,15 @@ import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitTask; import lv.id.bonne.panelutils.PanelUtils; +import world.bentobox.bentobox.api.panels.Panel; import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.PanelListener; import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.user.User; @@ -81,6 +86,13 @@ public static void open(ChallengesAddon addon, @Override protected void build() { + // Cancel any leftover refresh task from a previous build. + if (this.libraryRefreshTask != null) + { + this.libraryRefreshTask.cancel(); + this.libraryRefreshTask = null; + } + PanelBuilder panelBuilder = new PanelBuilder().user(this.user).name( this.user.getTranslation(Constants.TITLE + "admin-gui")); @@ -107,7 +119,7 @@ protected void build() // Import Challenges panelBuilder.item(14, this.createButton(Button.IMPORT_TEMPLATE)); panelBuilder.item(15, this.createButton(Button.IMPORT_DATABASE)); - panelBuilder.item(33, this.createButton(Button.LIBRARY)); + panelBuilder.item(LIBRARY_SLOT, this.createButton(Button.LIBRARY)); // Export Challenges panelBuilder.item(24, this.createButton(Button.EXPORT_CHALLENGES)); @@ -127,7 +139,49 @@ protected void build() panelBuilder.item(44, this.returnButton); - panelBuilder.build(); + panelBuilder.listener(new RefreshCanceller()); + + this.activePanel = panelBuilder.build(); + + // If the library button is currently pending, poll for readiness and swap + // the icon in place without reopening the inventory. + if (WebManager.isEnabled() && + this.addon.getWebManager().getLibraryEntries().isEmpty()) + { + this.scheduleLibraryRefresh(); + } + } + + + /** + * Polls every second until the web library catalog has loaded, then swaps + * slot 33 from the pending barrier to the ready cobweb without closing the + * panel. + */ + private void scheduleLibraryRefresh() + { + this.libraryRefreshTask = this.addon.getPlugin().getServer().getScheduler(). + runTaskTimer(this.addon.getPlugin(), () -> + { + if (this.activePanel == null) + { + return; + } + if (this.addon.getWebManager().getLibraryEntries().isEmpty()) + { + return; + } + + PanelItem ready = this.createButton(Button.LIBRARY); + this.activePanel.getItems().put(LIBRARY_SLOT, ready); + this.activePanel.getInventory().setItem(LIBRARY_SLOT, ready.getItem()); + + if (this.libraryRefreshTask != null) + { + this.libraryRefreshTask.cancel(); + this.libraryRefreshTask = null; + } + }, 20L, 20L); } @@ -158,7 +212,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case RESET_USER_CHALLENGES -> { icon = new ItemStack(Material.WRITABLE_BOOK); @@ -281,7 +335,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case EDIT_LEVEL -> { icon = new ItemStack(Material.ANVIL); @@ -292,7 +346,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case DELETE_CHALLENGE -> { icon = new ItemStack(Material.LAVA_BUCKET); @@ -303,7 +357,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case DELETE_LEVEL -> { icon = new ItemStack(Material.LAVA_BUCKET); @@ -314,7 +368,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case EDIT_SETTINGS -> { icon = new ItemStack(Material.CRAFTING_TABLE); @@ -325,7 +379,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case IMPORT_DATABASE -> { icon = new ItemStack(Material.BOOKSHELF); @@ -336,7 +390,7 @@ private PanelItem createButton(Button button) glow = true; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case IMPORT_TEMPLATE -> { icon = new ItemStack(Material.BOOKSHELF); @@ -347,7 +401,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); } case EXPORT_CHALLENGES -> { icon = new ItemStack(Material.HOPPER); @@ -390,27 +444,45 @@ private PanelItem createButton(Button button) description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-export")); } case LIBRARY -> { - if (WebManager.isEnabled()) - { - icon = new ItemStack(Material.COBWEB); - } - else + if (!WebManager.isEnabled()) { icon = new ItemStack(Material.STRUCTURE_VOID); - } + clickHandler = (panel, user, clickType, slot) -> true; + glow = false; - clickHandler = (panel, user, clickType, slot) -> { - if (WebManager.isEnabled()) + description.add(""); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); + } + else if (this.addon.getWebManager().getLibraryEntries().isEmpty()) + { + // Catalog not yet available. Kick off an immediate download if one + // hasn't been started already, and render a pending barrier. + if (this.addon.getWebManager().getCatalogState() == WebManager.CatalogState.IDLE) { - LibraryPanel.open(this, LibraryPanel.Library.WEB); + this.addon.getPlugin().getServer().getScheduler(). + runTaskAsynchronously(this.addon.getPlugin(), + () -> this.addon.getWebManager().requestCatalogGitHubData(false)); } - return true; - }; - glow = false; + icon = new ItemStack(Material.BARRIER); + clickHandler = (panel, user, clickType, slot) -> true; + glow = false; - description.add(""); - description.add(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-open")); + description.clear(); + description.add(this.user.getTranslation(Constants.BUTTON + "library.downloading")); + } + else + { + icon = new ItemStack(Material.COBWEB); + clickHandler = (panel, user, clickType, slot) -> { + LibraryPanel.open(this, LibraryPanel.Library.WEB); + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslationOrNothing(Constants.CLICK_TO_OPEN)); + } } case COMPLETE_WIPE -> { icon = new ItemStack(Material.TNT); @@ -590,4 +662,53 @@ private enum Button * This indicates if wipe button should clear all data, or only challenges. */ private boolean wipeAll; + + /** + * Slot hosting the web-library button. + */ + private static final int LIBRARY_SLOT = 33; + + /** + * Currently open Panel, retained so the library button can be swapped in + * place when the catalog finishes downloading. + */ + private Panel activePanel; + + /** + * Repeating task that polls for catalog readiness while the library button + * is rendered as a pending barrier. + */ + private BukkitTask libraryRefreshTask; + + + /** + * Cancels the library refresh task when the admin panel is closed. + */ + private class RefreshCanceller implements PanelListener + { + @Override + public void onInventoryClick(User user, InventoryClickEvent event) + { + // no-op + } + + + @Override + public void onInventoryClose(InventoryCloseEvent event) + { + if (AdminPanel.this.libraryRefreshTask != null) + { + AdminPanel.this.libraryRefreshTask.cancel(); + AdminPanel.this.libraryRefreshTask = null; + } + AdminPanel.this.activePanel = null; + } + + + @Override + public void setup() + { + // no-op + } + } } \ No newline at end of file diff --git a/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java b/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java index e843223d..17af4ce4 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java @@ -8,18 +8,17 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.stream.Collectors; import org.bukkit.Material; import org.bukkit.World; -import org.bukkit.advancement.Advancement; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.ItemStack; import lv.id.bonne.panelutils.PanelUtils; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.PanelListener; import world.bentobox.bentobox.api.panels.builders.PanelBuilder; @@ -37,8 +36,6 @@ import world.bentobox.challenges.panel.util.EnvironmentSelector; import world.bentobox.challenges.panel.util.ItemSelector; import world.bentobox.challenges.panel.util.MultiBlockSelector; -import world.bentobox.challenges.panel.util.SingleAdvancementSelector; -import world.bentobox.challenges.panel.util.SingleAdvancementSelector.Mode; import world.bentobox.challenges.utils.Constants; import world.bentobox.challenges.utils.Utils; @@ -289,7 +286,7 @@ private PanelItem createMenuButton(MenuType menuType) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-select")); @@ -349,7 +346,7 @@ private PanelItem createButton(Button button) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); ItemStack icon; boolean glow; @@ -357,7 +354,7 @@ private PanelItem createButton(Button button) { switch (button) { case NAME -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NAME, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NAME, this.challenge.getFriendlyName())); icon = new ItemStack(Material.NAME_TAG); @@ -382,7 +379,7 @@ private PanelItem createButton(Button button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case HIDE_REWARD_ITEMS -> { description.add(this.user @@ -404,13 +401,13 @@ private PanelItem createButton(Button button) { glow = this.challenge.isDeployed(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case DEPLOYED -> { description - .add(this.user.getTranslation(reference + (this.challenge.isDeployed() ? "enabled" : "disabled"))); + .add(this.user.getTranslation(reference + (this.challenge.isDeployed() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LEVER); clickHandler = (panel, user, clickType, slot) -> { @@ -428,7 +425,7 @@ private PanelItem createButton(Button button) { glow = this.challenge.isDeployed(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case ICON -> { icon = this.challenge.getIcon(); @@ -441,7 +438,7 @@ private PanelItem createButton(Button button) { if (this.selectedButton != button) { description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } else { description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-on-item")); @@ -450,7 +447,7 @@ private PanelItem createButton(Button button) { case DESCRIPTION -> { icon = new ItemStack(Material.WRITTEN_BOOK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); this.challenge.getDescription().forEach(line -> description.add(Util.translateColorCodes(line))); clickHandler = (panel, user, clickType, i) -> { @@ -478,14 +475,14 @@ private PanelItem createButton(Button button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challenge.getDescription().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case ORDER -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getOrder()))); icon = new ItemStack(Material.HOPPER, Math.max(1, this.challenge.getOrder())); @@ -500,27 +497,27 @@ private PanelItem createButton(Button button) { }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, 2000); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, 2000); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case ENVIRONMENT -> { description.add(this.user.getTranslation( - this.challenge.getEnvironment().contains(World.Environment.NORMAL) ? reference + "enabled" - : reference + "disabled") + this.challenge.getEnvironment().contains(World.Environment.NORMAL) ? reference + Constants.ENABLED_KEY + : reference + Constants.DISABLED_KEY) + Utils.prettifyObject(World.Environment.NORMAL, this.user)); description.add(this.user.getTranslation( - this.challenge.getEnvironment().contains(World.Environment.NETHER) ? reference + "enabled" - : reference + "disabled") + this.challenge.getEnvironment().contains(World.Environment.NETHER) ? reference + Constants.ENABLED_KEY + : reference + Constants.DISABLED_KEY) + Utils.prettifyObject(World.Environment.NETHER, this.user)); description.add(this.user.getTranslation( - this.challenge.getEnvironment().contains(World.Environment.THE_END) ? reference + "enabled" - : reference + "disabled") + this.challenge.getEnvironment().contains(World.Environment.THE_END) ? reference + Constants.ENABLED_KEY + : reference + Constants.DISABLED_KEY) + Utils.prettifyObject(World.Environment.THE_END, this.user)); icon = new ItemStack(Material.DROPPER); @@ -539,7 +536,7 @@ private PanelItem createButton(Button button) { } case REMOVE_ON_COMPLETE -> { description.add(this.user - .getTranslation(reference + (this.challenge.isRemoveWhenCompleted() ? "enabled" : "disabled"))); + .getTranslation(reference + (this.challenge.isRemoveWhenCompleted() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); if (this.challenge.isRemoveWhenCompleted()) { icon = new ItemStack(Material.LAVA_BUCKET); @@ -556,7 +553,7 @@ private PanelItem createButton(Button button) { glow = this.challenge.isRemoveWhenCompleted(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } default -> { icon = new ItemStack(Material.PAPER); @@ -582,12 +579,12 @@ private PanelItem createRequirementButton(RequirementButton button) { String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); if (this.challenge.getRequirements().getRequiredPermissions().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); this.challenge.getRequirements().getRequiredPermissions().forEach(permission -> description .add(this.user.getTranslation(reference + "permission", "[permission]", permission))); @@ -619,10 +616,10 @@ private PanelItem createRequirementButton(RequirementButton button) { }; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challenge.getRequirements().getRequiredPermissions().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } return new PanelItemBuilder().icon(icon).name(name).description(description).clickHandler(clickHandler) .build(); @@ -663,7 +660,7 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); ItemStack icon; boolean glow; @@ -676,11 +673,11 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { if (requirements.getRequiredEntities().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); requirements.getRequiredEntities().forEach( (entity, count) -> description.add(this.user.getTranslation(reference + "list", "[entity]", - Utils.prettifyObject(entity, this.user), "[number]", String.valueOf(count)))); + Utils.prettifyObject(entity, this.user), Constants.PARAMETER_NUMBER, String.valueOf(count)))); } icon = new ItemStack(Material.CREEPER_HEAD); @@ -691,11 +688,11 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REMOVE_ENTITIES -> { description.add( - this.user.getTranslation(reference + (requirements.isRemoveEntities() ? "enabled" : "disabled"))); + this.user.getTranslation(reference + (requirements.isRemoveEntities() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LEVER); clickHandler = (panel, user, clickType, slot) -> { @@ -706,18 +703,18 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { glow = requirements.isRemoveEntities(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case REQUIRED_MATERIALTAGS -> { if (requirements.getRequiredMaterialTags().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); // Add Material Tags only requirements.getRequiredMaterialTags() .forEach((block, count) -> description.add(this.user.getTranslation(reference + "list", "[tag]", - Utils.prettifyObject(block, this.user), "[number]", String.valueOf(count)))); + Utils.prettifyObject(block, this.user), Constants.PARAMETER_NUMBER, String.valueOf(count)))); } icon = new ItemStack(Material.STONE_BRICKS); @@ -728,18 +725,18 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REQUIRED_ENTITYTAGS -> { if (requirements.getRequiredEntityTypeTags().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); // Add Material Tags only requirements.getRequiredEntityTypeTags() .forEach((block, count) -> description.add(this.user.getTranslation(reference + "list", "[tag]", - Utils.prettifyObject(block, this.user), "[number]", String.valueOf(count)))); + Utils.prettifyObject(block, this.user), Constants.PARAMETER_NUMBER, String.valueOf(count)))); } icon = new ItemStack(Material.ZOMBIE_HEAD); @@ -750,17 +747,17 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REQUIRED_BLOCKS -> { if (requirements.getRequiredBlocks().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); requirements.getRequiredBlocks() .forEach((block, count) -> description.add(this.user.getTranslation(reference + "list", - "[block]", Utils.prettifyObject(block, this.user), "[number]", String.valueOf(count)))); + "[block]", Utils.prettifyObject(block, this.user), Constants.PARAMETER_NUMBER, String.valueOf(count)))); } icon = new ItemStack(Material.STONE); @@ -771,11 +768,11 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REMOVE_BLOCKS -> { description.add( - this.user.getTranslation(reference + (requirements.isRemoveBlocks() ? "enabled" : "disabled"))); + this.user.getTranslation(reference + (requirements.isRemoveBlocks() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LEVER); clickHandler = (panel, user, clickType, slot) -> { @@ -786,10 +783,10 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { glow = requirements.isRemoveBlocks(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case SEARCH_RADIUS -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(requirements.getSearchRadius()))); icon = new ItemStack(Material.COBBLESTONE_WALL); clickHandler = (panel, user, clickType, i) -> { @@ -806,14 +803,14 @@ private PanelItem createIslandRequirementButton(RequirementButton button) { .map(gameModeAddon -> gameModeAddon.getWorldSettings().getIslandDistance()).orElse(100); ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 1, maxSearchDistance); + this.user.getTranslation(Constants.INPUT_NUMBER), 1, maxSearchDistance); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } default -> { icon = new ItemStack(Material.PAPER); @@ -836,20 +833,19 @@ private PanelItem createStatisticsRequirementButton(RequirementButton button) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); ItemStack icon; boolean glow; PanelItem.ClickHandler clickHandler; final StatisticRequirements requirements = this.challenge.getRequirements(); - switch (button) { // Just one special statistic button right now - case REQUIRED_STATISTICS -> { + if (button == RequirementButton.REQUIRED_STATISTICS) { if (requirements.getRequiredStatistics().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); requirements.getRequiredStatistics().stream() .sorted(Comparator.comparing(r -> r.statistic().getKey().getKey())) @@ -865,17 +861,14 @@ private PanelItem createStatisticsRequirementButton(RequirementButton button) { return true; }; glow = false; - } - default -> { - // This should never need to be shown. Just for future expansion. + } else {// This should never need to be shown. Just for future expansion. glow = false; icon = new ItemStack(Material.PAPER); clickHandler = null; } - } description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) .clickHandler(clickHandler).build(); } @@ -891,7 +884,7 @@ private PanelItem createInventoryRequirementButton(RequirementButton button) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); ItemStack icon; boolean glow; @@ -904,12 +897,12 @@ private PanelItem createInventoryRequirementButton(RequirementButton button) { if (requirements.getRequiredItems().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); Utils.groupEqualItems(requirements.getRequiredItems(), requirements.getIgnoreMetaData()).stream() .sorted(Comparator.comparing(ItemStack::getType)) .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", - "[number]", String.valueOf(itemStack.getAmount()), "[item]", + Constants.PARAMETER_NUMBER, String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user)))); } @@ -927,11 +920,11 @@ private PanelItem createInventoryRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REMOVE_ITEMS -> { description - .add(this.user.getTranslation(reference + (requirements.isTakeItems() ? "enabled" : "disabled"))); + .add(this.user.getTranslation(reference + (requirements.isTakeItems() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LEVER); clickHandler = (panel, user, clickType, slot) -> { @@ -942,17 +935,17 @@ private PanelItem createInventoryRequirementButton(RequirementButton button) { glow = requirements.isTakeItems(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case ADD_IGNORED_META -> { if (requirements.getIgnoreMetaData().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); requirements.getIgnoreMetaData().stream().sorted(Comparator.comparing(Material::name)) .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", - "[item]", Utils.prettifyObject(itemStack, this.user)))); + Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user)))); } icon = new ItemStack(Material.GREEN_SHULKER_BOX); @@ -1036,7 +1029,7 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); ItemStack icon; boolean glow; @@ -1046,7 +1039,7 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { switch (button) { case REQUIRED_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(requirements.getRequiredExperience()))); icon = new ItemStack(Material.EXPERIENCE_BOTTLE); clickHandler = (panel, user, clickType, i) -> { @@ -1059,18 +1052,18 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Integer.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REMOVE_EXPERIENCE -> { description.add( - this.user.getTranslation(reference + (requirements.isTakeExperience() ? "enabled" : "disabled"))); + this.user.getTranslation(reference + (requirements.isTakeExperience() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LEVER); clickHandler = (panel, user, clickType, slot) -> { @@ -1081,10 +1074,10 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { glow = requirements.isTakeExperience(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case REQUIRED_LEVEL -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(requirements.getRequiredIslandLevel()))); icon = new ItemStack(this.addon.isLevelProvided() ? Material.BEACON : Material.BARRIER); clickHandler = (panel, user, clickType, i) -> { @@ -1097,19 +1090,19 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Integer.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REQUIRED_PAPI -> { if (!requirements.getPapiString().isEmpty()) { description - .add(this.user.getTranslation(reference + "value", "[formula]", requirements.getPapiString())); + .add(this.user.getTranslation(reference + Constants.VALUE_KEY, "[formula]", requirements.getPapiString())); } icon = new ItemStack( this.addon.getPlugin().getHooks().getHook("PlaceholderAPI").isPresent() ? Material.PAPER @@ -1131,11 +1124,11 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REQUIRED_ADVANCEMENTS -> { requirements.getAdvancements().forEach(adv -> description - .add(this.user.getTranslation(reference + "list", "[name]", adv.getDisplay().getTitle()))); + .add(this.user.getTranslation(reference + "list", "[name]", PlainTextComponentSerializer.plainText().serialize(adv.getDisplay().title())))); icon = new ItemStack(Material.CYAN_BANNER); clickHandler = (panel, user, clickType, i) -> { @@ -1147,10 +1140,10 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REQUIRED_MONEY -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(requirements.getRequiredMoney()))); icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); clickHandler = (panel, user, clickType, i) -> { @@ -1163,18 +1156,18 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Double.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Double.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REMOVE_MONEY -> { description - .add(this.user.getTranslation(reference + (requirements.isTakeMoney() ? "enabled" : "disabled"))); + .add(this.user.getTranslation(reference + (requirements.isTakeMoney() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(this.addon.isEconomyProvided() ? Material.LEVER : Material.BARRIER); clickHandler = (panel, user, clickType, slot) -> { @@ -1185,7 +1178,7 @@ private PanelItem createOtherRequirementButton(RequirementButton button) { glow = requirements.isTakeMoney(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } default -> { icon = new ItemStack(Material.PAPER); @@ -1208,7 +1201,7 @@ private PanelItem createRewardButton(RewardButton button) { final String name = this.user.getTranslation(reference + "name"); final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); ItemStack icon; boolean glow; @@ -1218,7 +1211,7 @@ private PanelItem createRewardButton(RewardButton button) { case REWARD_TEXT -> { icon = new ItemStack(Material.WRITTEN_BOOK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.add(Util.translateColorCodes(this.challenge.getRewardText())); clickHandler = (panel, user, clickType, i) -> { @@ -1246,10 +1239,10 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challenge.getRewardText().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case REWARD_ITEMS -> { @@ -1257,12 +1250,12 @@ private PanelItem createRewardButton(RewardButton button) { if (this.challenge.getRewardItems().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); Utils.groupEqualItems(this.challenge.getRewardItems(), this.challenge.getIgnoreRewardMetaData()) .stream().sorted(Comparator.comparing(ItemStack::getType)) .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", - "[number]", String.valueOf(itemStack.getAmount()), "[item]", + Constants.PARAMETER_NUMBER, String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user)))); } @@ -1281,10 +1274,10 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REWARD_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRewardExperience()))); icon = new ItemStack(Material.EXPERIENCE_BOTTLE); clickHandler = (panel, user, clickType, i) -> { @@ -1297,17 +1290,17 @@ private PanelItem createRewardButton(RewardButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Integer.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REWARD_MONEY -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, addon.getPlugin().getVault().map(v -> v.format(challenge.getRewardMoney())) .orElse(String.valueOf(challenge.getRewardMoney())))); icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); @@ -1321,19 +1314,19 @@ private PanelItem createRewardButton(RewardButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Double.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Double.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REWARD_COMMANDS -> { icon = new ItemStack(Material.COMMAND_BLOCK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.addAll(this.challenge.getRewardCommands()); clickHandler = (panel, user, clickType, i) -> { @@ -1361,15 +1354,15 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challenge.getRewardCommands().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case REPEATABLE -> { description.add( - this.user.getTranslation(reference + (this.challenge.isRepeatable() ? "enabled" : "disabled"))); + this.user.getTranslation(reference + (this.challenge.isRepeatable() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LEVER); clickHandler = (panel, user, clickType, slot) -> { @@ -1380,10 +1373,10 @@ private PanelItem createRewardButton(RewardButton button) { glow = this.challenge.isRepeatable(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case REPEAT_COUNT -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getMaxTimes()))); icon = new ItemStack(Material.COBBLESTONE_WALL); clickHandler = (panel, user, clickType, i) -> { @@ -1396,17 +1389,17 @@ private PanelItem createRewardButton(RewardButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Integer.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case COOL_DOWN -> { - description.add(this.user.getTranslation(reference + "value", "[time]", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, "[time]", Utils.parseDuration(Duration.ofMillis(this.challenge.getTimeout()), this.user))); icon = new ItemStack(Material.CLOCK); clickHandler = (panel, user, clickType, i) -> { @@ -1426,12 +1419,12 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REPEAT_REWARD_TEXT -> { icon = new ItemStack(Material.WRITTEN_BOOK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.add(Util.translateColorCodes(this.challenge.getRepeatRewardText())); clickHandler = (panel, user, clickType, i) -> { @@ -1459,10 +1452,10 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challenge.getRepeatRewardText().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case REPEAT_REWARD_ITEMS -> { @@ -1470,12 +1463,12 @@ private PanelItem createRewardButton(RewardButton button) { if (this.challenge.getRepeatItemReward().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); Utils.groupEqualItems(this.challenge.getRepeatItemReward(), this.challenge.getIgnoreRewardMetaData()) .stream().sorted(Comparator.comparing(ItemStack::getType)) .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", - "[number]", String.valueOf(itemStack.getAmount()), "[item]", + Constants.PARAMETER_NUMBER, String.valueOf(itemStack.getAmount()), Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user)))); } @@ -1494,10 +1487,10 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REPEAT_REWARD_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRepeatExperienceReward()))); icon = new ItemStack(Material.EXPERIENCE_BOTTLE); clickHandler = (panel, user, clickType, i) -> { @@ -1510,17 +1503,17 @@ private PanelItem createRewardButton(RewardButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Integer.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REPEAT_REWARD_MONEY -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRepeatMoneyReward()))); icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_NUGGET : Material.BARRIER); clickHandler = (panel, user, clickType, i) -> { @@ -1533,19 +1526,19 @@ private PanelItem createRewardButton(RewardButton button) { this.build(); }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Double.MAX_VALUE); + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Double.MAX_VALUE); return true; }; glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REPEAT_REWARD_COMMANDS -> { icon = new ItemStack(Material.COMMAND_BLOCK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.addAll(this.challenge.getRepeatRewardCommands()); clickHandler = (panel, user, clickType, i) -> { @@ -1573,21 +1566,21 @@ private PanelItem createRewardButton(RewardButton button) { glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challenge.getRepeatRewardCommands().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case ADD_IGNORED_META -> { if (this.challenge.getIgnoreRewardMetaData().isEmpty()) { description.add(this.user.getTranslation(reference + "none")); } else { - description.add(this.user.getTranslation(reference + "title")); + description.add(this.user.getTranslation(reference + Constants.TITLE_KEY)); this.challenge.getIgnoreRewardMetaData().stream().sorted(Comparator.comparing(Material::name)) .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", - "[item]", Utils.prettifyObject(itemStack, this.user)))); + Constants.PARAMETER_ITEM, Utils.prettifyObject(itemStack, this.user)))); } icon = new ItemStack(Material.GREEN_SHULKER_BOX); diff --git a/src/main/java/world/bentobox/challenges/panel/admin/EditLevelPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/EditLevelPanel.java index 2ab24700..3f2fa9f6 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/EditLevelPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/EditLevelPanel.java @@ -353,7 +353,7 @@ private PanelItem createButton(Button button) case REWARD_TEXT -> { icon = new ItemStack(Material.WRITTEN_BOOK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.add(Util.translateColorCodes(this.challengeLevel.getRewardText())); clickHandler = (panel, user, clickType, i) -> @@ -389,11 +389,11 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challengeLevel.getRewardText().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case REWARD_ITEMS -> { @@ -433,10 +433,10 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REWARD_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challengeLevel.getRewardExperience()))); icon = new ItemStack(Material.EXPERIENCE_BOTTLE); clickHandler = (panel, user, clickType, i) -> { @@ -451,7 +451,7 @@ private PanelItem createButton(Button button) }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Integer.MAX_VALUE); @@ -460,10 +460,10 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REWARD_MONEY -> { - description.add(this.user.getTranslation(reference + "value", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challengeLevel.getRewardMoney()))); icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); clickHandler = (panel, user, clickType, i) -> { @@ -478,7 +478,7 @@ private PanelItem createButton(Button button) }; ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), + this.user.getTranslation(Constants.INPUT_NUMBER), 0, Double.MAX_VALUE); @@ -487,12 +487,12 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REWARD_COMMANDS -> { icon = new ItemStack(Material.COMMAND_BLOCK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.addAll(this.challengeLevel.getRewardCommands()); clickHandler = (panel, user, clickType, i) -> @@ -527,11 +527,11 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challengeLevel.getRewardCommands().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case ADD_IGNORED_META -> { @@ -626,7 +626,7 @@ private PanelItem createButton(Button button) description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove")); } case NAME -> { - description.add(this.user.getTranslation(reference + "value", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NAME, this.challengeLevel.getFriendlyName())); icon = new ItemStack(Material.NAME_TAG); @@ -655,12 +655,12 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case DESCRIPTION -> { icon = new ItemStack(Material.WRITTEN_BOOK); - description.add(this.user.getTranslation(reference + "value")); + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY)); description.add(Util.translateColorCodes(this.challengeLevel.getUnlockMessage())); clickHandler = (panel, user, clickType, i) -> @@ -695,11 +695,11 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); if (!this.challengeLevel.getUnlockMessage().isEmpty()) { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + description.add(this.user.getTranslation(Constants.SHIFT_CLICK_TO_RESET)); } } case ICON, LOCKED_ICON -> { @@ -717,7 +717,7 @@ private PanelItem createButton(Button button) if (this.selectedButton != button) { description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } else { @@ -728,7 +728,7 @@ private PanelItem createButton(Button button) glow = this.selectedButton == button; } case ORDER -> { - description.add(this.user.getTranslation(reference + "value", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challengeLevel.getOrder()))); icon = new ItemStack(Material.HOPPER, Math.max(1, this.challengeLevel.getOrder())); @@ -745,7 +745,7 @@ private PanelItem createButton(Button button) ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), + this.user.getTranslation(Constants.INPUT_NUMBER), 0, 2000); @@ -754,10 +754,10 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case WAIVER_AMOUNT -> { - description.add(this.user.getTranslation(reference + "value", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.challengeLevel.getWaiverAmount()))); icon = new ItemStack(Material.HOPPER, Math.max(1, this.challengeLevel.getWaiverAmount())); @@ -774,7 +774,7 @@ private PanelItem createButton(Button button) ConversationUtils.createNumericInput(numberConsumer, this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), + this.user.getTranslation(Constants.INPUT_NUMBER), 0, 2000); @@ -783,7 +783,7 @@ private PanelItem createButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case ADD_CHALLENGES -> { icon = new ItemStack(Material.WATER_BUCKET); diff --git a/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsPanel.java index e4df5f5b..69f0a20e 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsPanel.java @@ -165,7 +165,7 @@ private PanelItem getSettingsButton(Button button) { case RESET_ON_NEW -> { description.add(this.user.getTranslation(reference + - (this.settings.isResetChallenges() ? "enabled" : "disabled"))); + (this.settings.isResetChallenges() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.LAVA_BUCKET); clickHandler = (panel, user1, clickType, i) -> { @@ -177,11 +177,11 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isResetChallenges(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case BROADCAST -> { description.add(this.user.getTranslation(reference + - (this.settings.isBroadcastMessages() ? "enabled" : "disabled"))); + (this.settings.isBroadcastMessages() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.JUKEBOX); clickHandler = (panel, user1, clickType, i) -> { @@ -193,11 +193,11 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isBroadcastMessages(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case REMOVE_COMPLETED -> { description.add(this.user.getTranslation(reference + - (this.settings.isRemoveCompleteOneTimeChallenges() ? "enabled" : "disabled"))); + (this.settings.isRemoveCompleteOneTimeChallenges() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.MAGMA_BLOCK); clickHandler = (panel, user1, clickType, i) -> { @@ -209,12 +209,12 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isRemoveCompleteOneTimeChallenges(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case ACTIVE_WORLD_LIST -> { description.add(this.user.getTranslation(reference + (this.settings.getUserGuiMode().equals(GuiMode.GAMEMODE_LIST) ? - "disabled" : "enabled"))); + Constants.DISABLED_KEY : Constants.ENABLED_KEY))); icon = new ItemStack(Material.STONE_BUTTON); clickHandler = (panel, user1, clickType, i) -> { @@ -234,11 +234,11 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.getUserGuiMode().equals(GuiMode.GAMEMODE_LIST); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case GAMEMODE_GUI -> { description.add(this.user.getTranslation(reference + - (this.settings.isUseCommonGUI() ? "enabled" : "disabled"))); + (this.settings.isUseCommonGUI() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.BLACK_STAINED_GLASS_PANE); clickHandler = (panel, user1, clickType, i) -> { @@ -251,11 +251,11 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isUseCommonGUI(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case STORE_HISTORY -> { description.add(this.user.getTranslation(reference + - (this.settings.isStoreHistory() ? "enabled" : "disabled"))); + (this.settings.isStoreHistory() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.WRITTEN_BOOK); clickHandler = (panel, user1, clickType, i) -> { @@ -267,7 +267,7 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isStoreHistory(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case PURGE_HISTORY -> { description.add(this.user.getTranslation(reference + "value", @@ -297,11 +297,11 @@ private PanelItem getSettingsButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case DATA_PER_ISLAND -> { description.add(this.user.getTranslation(reference + - (this.settings.isStoreAsIslandData() ? "enabled" : "disabled"))); + (this.settings.isStoreAsIslandData() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.GRASS_BLOCK); clickHandler = (panel, user1, clickType, i) -> { @@ -314,11 +314,11 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isStoreAsIslandData(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case GLOW_COMPLETED -> { description.add(this.user.getTranslation(reference + - (this.settings.isAddCompletedGlow() ? "enabled" : "disabled"))); + (this.settings.isAddCompletedGlow() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.GLOWSTONE); clickHandler = (panel, user1, clickType, i) -> { @@ -330,11 +330,11 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isAddCompletedGlow(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case GLOW_COMPLETED_LEVELS -> { description.add(this.user.getTranslation(reference + - (this.settings.isAddCompletedLevelGlow() ? "enabled" : "disabled"))); + (this.settings.isAddCompletedLevelGlow() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.GLOWSTONE); clickHandler = (panel, user1, clickType, i) -> { @@ -346,7 +346,7 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isAddCompletedLevelGlow(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case LOCKED_LEVEL_ICON -> { icon = this.settings.getLockedLevelIcon(); @@ -369,7 +369,7 @@ private PanelItem getSettingsButton(Button button) if (this.selectedButton != button) { description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } else { @@ -381,7 +381,7 @@ private PanelItem getSettingsButton(Button button) } case SHOW_TITLE -> { description.add(this.user.getTranslation(reference + - (this.settings.isShowCompletionTitle() ? "enabled" : "disabled"))); + (this.settings.isShowCompletionTitle() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.OAK_SIGN); clickHandler = (panel, user1, clickType, i) -> { @@ -393,7 +393,7 @@ private PanelItem getSettingsButton(Button button) glow = this.settings.isShowCompletionTitle(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } case TITLE_SHOWTIME -> { description.add(this.user.getTranslation(reference + "value", @@ -423,14 +423,14 @@ private PanelItem getSettingsButton(Button button) glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case VISIBILITY_MODE -> { description.add(this.user.getTranslation(reference + - (this.settings.getVisibilityMode().equals(VisibilityMode.VISIBLE) ? "enabled" : "disabled")) + + (this.settings.getVisibilityMode().equals(VisibilityMode.VISIBLE) ? Constants.ENABLED_KEY : Constants.DISABLED_KEY)) + this.user.getTranslation(reference + "visible")); description.add(this.user.getTranslation(reference + - (this.settings.getVisibilityMode().equals(VisibilityMode.HIDDEN) ? "enabled" : "disabled")) + + (this.settings.getVisibilityMode().equals(VisibilityMode.HIDDEN) ? Constants.ENABLED_KEY : Constants.DISABLED_KEY)) + this.user.getTranslation(reference + "hidden")); if (this.settings.getVisibilityMode().equals(VisibilityMode.VISIBLE)) @@ -471,7 +471,7 @@ else if (this.settings.getVisibilityMode().equals(VisibilityMode.HIDDEN)) } case INCLUDE_UNDEPLOYED -> { description.add(this.user.getTranslation(reference + - (this.settings.isIncludeUndeployed() ? "enabled" : "disabled"))); + (this.settings.isIncludeUndeployed() ? Constants.ENABLED_KEY : Constants.DISABLED_KEY))); icon = new ItemStack(Material.BARREL); clickHandler = (panel, user1, clickType, i) -> { @@ -483,7 +483,7 @@ else if (this.settings.getVisibilityMode().equals(VisibilityMode.HIDDEN)) glow = this.settings.isIncludeUndeployed(); description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + description.add(this.user.getTranslation(Constants.CLICK_TO_TOGGLE)); } default -> { icon = new ItemStack(Material.PAPER); diff --git a/src/main/java/world/bentobox/challenges/panel/admin/LibraryPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/LibraryPanel.java index 544729e8..957ec8a2 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/LibraryPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/LibraryPanel.java @@ -6,8 +6,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Locale; import java.util.function.Consumer; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.bukkit.ChatColor; import org.bukkit.Material; @@ -55,7 +57,78 @@ private LibraryPanel(CommonPanel parentGUI, Library mode) case TEMPLATE -> this.generateTemplateEntries(); }; - this.filterElements = this.libraryEntries; + if (mode == Library.WEB) + { + this.availableLanguages = this.libraryEntries.stream(). + map(LibraryEntry::language). + filter(lang -> lang != null && !lang.isBlank()). + distinct(). + sorted(String.CASE_INSENSITIVE_ORDER). + collect(Collectors.toList()); + this.selectedLanguage = this.pickInitialLanguage(); + } + else + { + this.availableLanguages = Collections.emptyList(); + this.selectedLanguage = null; + } + + this.updateFilters(); + } + + + /** + * Picks the initial language to display based on the user's locale, + * falling back to English, then to {@code null} (show all). + */ + private String pickInitialLanguage() + { + if (this.availableLanguages.isEmpty()) + { + return null; + } + + Locale locale = this.user.getLocale(); + if (locale != null) + { + String tag = locale.toLanguageTag(); + for (String lang : this.availableLanguages) + { + if (lang.equalsIgnoreCase(tag)) + { + return lang; + } + } + + String language = locale.getLanguage(); + if (language != null && !language.isEmpty()) + { + for (String lang : this.availableLanguages) + { + if (lang.equalsIgnoreCase(language)) + { + return lang; + } + } + for (String lang : this.availableLanguages) + { + if (lang.toLowerCase(Locale.ROOT).startsWith(language.toLowerCase(Locale.ROOT))) + { + return lang; + } + } + } + } + + for (String lang : this.availableLanguages) + { + if (lang.equalsIgnoreCase("en") || lang.toLowerCase(Locale.ROOT).startsWith("en")) + { + return lang; + } + } + + return null; } @@ -138,23 +211,25 @@ private List generateTemplateEntries() @Override protected void updateFilters() { - if (this.searchString == null || this.searchString.isBlank()) + Stream stream = this.libraryEntries.stream(); + + if (this.mode == Library.WEB && this.selectedLanguage != null) { - this.filterElements = this.libraryEntries; + stream = stream.filter(element -> + this.selectedLanguage.equalsIgnoreCase(element.language())); } - else + + if (this.searchString != null && !this.searchString.isBlank()) { - this.filterElements = this.libraryEntries.stream(). - filter(element -> { - // If element name is set and name contains search field, then do not filter out. - return element.name().toLowerCase().contains(this.searchString.toLowerCase()) || - element.author().toLowerCase().contains(this.searchString.toLowerCase()) || - element.gameMode().toLowerCase().contains(this.searchString.toLowerCase()) || - element.language().toLowerCase().contains(this.searchString.toLowerCase()); - }). - distinct(). - collect(Collectors.toList()); + String query = this.searchString.toLowerCase(); + stream = stream.filter(element -> + element.name().toLowerCase().contains(query) || + element.author().toLowerCase().contains(query) || + element.gameMode().toLowerCase().contains(query) || + element.language().toLowerCase().contains(query)); } + + this.filterElements = stream.distinct().collect(Collectors.toList()); } @@ -175,7 +250,7 @@ protected void build() // No point to display. Single element. if (this.libraryEntries.size() == 1 && !this.mode.equals(Library.WEB)) { - this.generateConfirmationInput(this.libraryEntries.get(0)); + this.generateConfirmationInput(this.libraryEntries.getFirst()); return; } @@ -190,6 +265,11 @@ protected void build() if (this.mode == Library.WEB) { panelBuilder.item(4, this.createDownloadNow()); + + if (this.availableLanguages.size() > 1) + { + panelBuilder.item(5, this.createLanguageButton()); + } } panelBuilder.item(44, this.returnButton); @@ -254,6 +334,71 @@ private PanelItem createDownloadNow() } + /** + * This creates the language filter cycle button for the web library. + * @return PanelItem that cycles through available languages. + */ + private PanelItem createLanguageButton() + { + final String reference = Constants.BUTTON + "language."; + + String display = this.selectedLanguage != null ? this.selectedLanguage : + this.user.getTranslation(reference + "all"); + + final List description = new ArrayList<>(); + description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + "current", "[lang]", display)); + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "left-click-to-cycle")); + description.add(this.user.getTranslation(Constants.TIPS + "right-click-to-reset")); + + PanelItemBuilder itemBuilder = new PanelItemBuilder(). + name(this.user.getTranslation(reference + "name")). + description(description). + icon(Material.WRITABLE_BOOK). + glow(this.selectedLanguage != null); + + itemBuilder.clickHandler((panel, user1, clickType, slot) -> + { + if (clickType.isRightClick()) + { + this.selectedLanguage = this.pickInitialLanguage(); + } + else + { + // Cycle order: [current lang] -> next lang -> ... -> null (All) -> first lang + if (this.selectedLanguage == null) + { + this.selectedLanguage = this.availableLanguages.getFirst(); + } + else + { + int index = -1; + for (int i = 0; i < this.availableLanguages.size(); i++) + { + if (this.availableLanguages.get(i).equalsIgnoreCase(this.selectedLanguage)) + { + index = i; + break; + } + } + int next = index + 1; + this.selectedLanguage = next >= this.availableLanguages.size() + ? null + : this.availableLanguages.get(next); + } + } + + this.updateFilters(); + this.build(); + return true; + }); + + return itemBuilder.build(); + } + + /** * This method creates button for given library entry. * @param libraryEntry LibraryEntry which button must be created. @@ -360,7 +505,7 @@ private List generateEntryDescription(LibraryEntry entry) description.add(this.user.getTranslation(reference + "author", "[author]", entry.author())); - description.add(entry.description()); + description.addAll(wrapText(entry.description(), 22)); description.add(this.user.getTranslation(reference + "gamemode", "[gamemode]", entry.gameMode())); @@ -373,6 +518,57 @@ private List generateEntryDescription(LibraryEntry entry) } + /** + * Word-wraps text at the given width while preserving the leading color of + * the source string on each wrapped line. + */ + private static List wrapText(String text, int width) + { + List lines = new ArrayList<>(); + if (text == null || text.isEmpty()) + { + lines.add(text == null ? "" : text); + return lines; + } + + String prefix = ChatColor.getLastColors(text); + StringBuilder current = new StringBuilder(); + + for (String word : text.split("\\s+")) + { + if (word.isEmpty()) + { + continue; + } + + int visibleLen = ChatColor.stripColor(current.toString()).length(); + int wordLen = ChatColor.stripColor(word).length(); + + if (visibleLen == 0) + { + current.append(word); + } + else if (visibleLen + 1 + wordLen <= width) + { + current.append(' ').append(word); + } + else + { + lines.add(current.toString()); + current.setLength(0); + current.append(prefix).append(word); + } + } + + if (!current.isEmpty()) + { + lines.add(current.toString()); + } + + return lines; + } + + /** * This class allows changing icon for Generator Tier */ @@ -470,4 +666,14 @@ public enum Library * Stores filtered items. */ private List filterElements; + + /** + * Distinct language codes present in the loaded library entries (web mode). + */ + private final List availableLanguages; + + /** + * Currently selected language filter, or {@code null} to show all. + */ + private String selectedLanguage; } diff --git a/src/main/java/world/bentobox/challenges/panel/admin/ListUsersPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/ListUsersPanel.java index 1fb35961..2a39a472 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/ListUsersPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/ListUsersPanel.java @@ -313,13 +313,13 @@ private PanelItem createToggleButton() description.add(this.user.getTranslation(reference + "description")); description.add(this.user.getTranslation(reference + - (ViewMode.ONLINE == this.mode ? "enabled" : "disabled")) + + (ViewMode.ONLINE == this.mode ? Constants.ENABLED_KEY : Constants.DISABLED_KEY)) + this.user.getTranslation(reference + "online")); description.add(this.user.getTranslation(reference + - (ViewMode.WITH_ISLAND == this.mode ? "enabled" : "disabled")) + + (ViewMode.WITH_ISLAND == this.mode ? Constants.ENABLED_KEY : Constants.DISABLED_KEY)) + this.user.getTranslation(reference + "with_island")); description.add(this.user.getTranslation(reference + - (ViewMode.IN_WORLD == this.mode ? "enabled" : "disabled")) + + (ViewMode.IN_WORLD == this.mode ? Constants.ENABLED_KEY : Constants.DISABLED_KEY)) + this.user.getTranslation(reference + "in_world")); description.add(""); diff --git a/src/main/java/world/bentobox/challenges/panel/admin/ManageAdvancementsPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/ManageAdvancementsPanel.java index c4715245..f803b513 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/ManageAdvancementsPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/ManageAdvancementsPanel.java @@ -14,6 +14,7 @@ import org.bukkit.inventory.ItemStack; import lv.id.bonne.panelutils.PanelUtils; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; @@ -65,7 +66,7 @@ private ManageAdvancementsPanel(CommonPanel parentGUI, List advance this.advancementsList = advancementsList; // Sort tags by their ordinal value. - this.advancementsList.sort(Comparator.comparing(advancement -> advancement.getDisplay().getTitle())); + this.advancementsList.sort(Comparator.comparing(advancement -> PlainTextComponentSerializer.plainText().serialize(advancement.getDisplay().title()))); this.selectedAdvancements = new HashSet<>(); @@ -102,7 +103,7 @@ protected void updateFilters() this.filterElements = this.advancementsList.stream(). filter(element -> { // If element name is set and name contains search field, then do not filter out. - return element.getDisplay().getTitle().toLowerCase(Locale.ENGLISH) + return PlainTextComponentSerializer.plainText().serialize(element.getDisplay().title()).toLowerCase(Locale.ENGLISH) .contains(this.searchString.toLowerCase(Locale.ENGLISH)); }). distinct(). @@ -178,7 +179,7 @@ private PanelItem createButton(Button button) if (!this.selectedAdvancements.isEmpty()) { - this.selectedAdvancements.forEach(adv -> description.add(adv.getDisplay().getTitle())); + this.selectedAdvancements.forEach(adv -> description.add(PlainTextComponentSerializer.plainText().serialize(adv.getDisplay().title()))); } icon = new ItemStack(Material.LAVA_BUCKET); @@ -232,7 +233,7 @@ protected PanelItem createElementButton(Advancement rec) // Show everything about this advancement description .add(this.user.getTranslation(reference + "description", "[description]", - rec.getDisplay().getDescription())); + PlainTextComponentSerializer.plainText().serialize(rec.getDisplay().description()))); if (this.selectedAdvancements.contains(rec)) { @@ -251,8 +252,8 @@ protected PanelItem createElementButton(Advancement rec) } return new PanelItemBuilder(). - name(this.user.getTranslation(reference + "name", "[name]", rec.getDisplay().getTitle())) - .icon(rec.getDisplay().getIcon()). + name(this.user.getTranslation(reference + "name", "[name]", PlainTextComponentSerializer.plainText().serialize(rec.getDisplay().title()))) + .icon(rec.getDisplay().icon()). description(description). clickHandler((panel, user1, clickType, slot) -> { // On right click change which entities are selected for deletion. diff --git a/src/main/java/world/bentobox/challenges/panel/admin/ManageStatisticsPanel.java b/src/main/java/world/bentobox/challenges/panel/admin/ManageStatisticsPanel.java index 7d2a40a4..86aee9cf 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/ManageStatisticsPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/ManageStatisticsPanel.java @@ -191,7 +191,7 @@ private PanelItem createButton(Button button) { description.add(this.user.getTranslation(reference + "title")); this.selectedStats.forEach(stat -> - description.add(this.user.getTranslation(reference + "statistic_element", "[statistic]", + description.add(this.user.getTranslation(reference + "statistic_element", Constants.PARAMETER_STATISTIC, Utils.prettifyObject(stat.statistic(), this.user)))); } @@ -287,7 +287,7 @@ protected PanelItem createElementButton(StatisticRec rec) } return new PanelItemBuilder(). - name(this.user.getTranslation(reference + "name", "[statistic]", + name(this.user.getTranslation(reference + "name", Constants.PARAMETER_STATISTIC, Utils.prettifyObject(rec.statistic(), this.user))) .icon(getStatisticIcon(rec.statistic())). description(description). @@ -445,7 +445,7 @@ private Panel buildStatisticPanel(StatisticRec req) { * Creates a button for statistic requirements. * * @param button Button that must be created. - * @param req + * @param req Statistic requirement * @return PanelItem button. */ private PanelItem createStatisticRequirementButton(RequirementButton button, StatisticRec req) { @@ -461,7 +461,7 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta switch (button) { case STATISTIC -> { - description.add(this.user.getTranslation(reference + "value", "[statistic]", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_STATISTIC, Utils.prettifyObject(req.statistic(), this.user))); icon = new ItemStack(req.statistic() == null ? Material.BARRIER : Material.PAPER); @@ -479,10 +479,10 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case STATISTIC_AMOUNT -> { - description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, Constants.PARAMETER_NUMBER, String.valueOf(req.amount()))); icon = new ItemStack(Material.CHEST); clickHandler = (panel, user, clickType, i) -> { @@ -505,7 +505,7 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case REMOVE_STATISTIC -> { description.add(this.user.getTranslation(reference + (req.reduceStatistic() ? "enabled" : "disabled"))); @@ -526,7 +526,7 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); } case STATISTIC_BLOCKS -> { - description.add(this.user.getTranslation(reference + "value", "[block]", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, "[block]", Utils.prettifyObject(req.material(), this.user))); icon = req.material() == null ? new ItemStack(Material.BARRIER) : new ItemStack(req.material()); @@ -548,10 +548,10 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case STATISTIC_ITEMS -> { - description.add(this.user.getTranslation(reference + "value", "[item]", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, "[item]", Utils.prettifyObject(req.material(), this.user))); icon = req.material() == null ? new ItemStack(Material.BARRIER) : new ItemStack(req.material()); @@ -572,10 +572,10 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } case STATISTIC_ENTITIES -> { - description.add(this.user.getTranslation(reference + "value", "[entity]", + description.add(this.user.getTranslation(reference + Constants.VALUE_KEY, "[entity]", Utils.prettifyObject(req.entity(), this.user))); icon = req.entity() == null ? new ItemStack(Material.BARRIER) @@ -597,7 +597,7 @@ private PanelItem createStatisticRequirementButton(RequirementButton button, Sta glow = false; description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(this.user.getTranslation(Constants.CLICK_TO_CHANGE)); } default -> { icon = new ItemStack(Material.PAPER); diff --git a/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java b/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java index cd49402a..4cddd9f3 100644 --- a/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java @@ -96,8 +96,8 @@ protected void build() panelBuilder.world(this.user.getWorld()); // Register button builders - panelBuilder.registerTypeBuilder("CHALLENGE", this::createChallengeButton); - panelBuilder.registerTypeBuilder("LEVEL", this::createLevelButton); + panelBuilder.registerTypeBuilder(Constants.CHALLENGE_BUILDER_KEY, this::createChallengeButton); + panelBuilder.registerTypeBuilder(Constants.LEVEL_BUILDER_KEY, this::createLevelButton); panelBuilder.registerTypeBuilder("UNASSIGNED_CHALLENGES", this::createFreeChallengesButton); @@ -232,7 +232,7 @@ private PanelItem createChallengeButton(ItemTemplateRecord template, TemplatedPa } else { - int index = this.challengeIndex * slot.amountMap().getOrDefault("CHALLENGE", 1) + slot.slot(); + int index = this.challengeIndex * slot.amountMap().getOrDefault(Constants.CHALLENGE_BUILDER_KEY, 1) + slot.slot(); if (index >= this.challengeList.size()) { @@ -455,7 +455,7 @@ private PanelItem createLevelButton(ItemTemplateRecord template, TemplatedPanel. } else { - int index = this.levelIndex * slot.amountMap().getOrDefault("LEVEL", 1) + slot.slot(); + int index = this.levelIndex * slot.amountMap().getOrDefault(Constants.LEVEL_BUILDER_KEY, 1) + slot.slot(); if (index >= this.levelList.size()) { @@ -641,11 +641,11 @@ private PanelItem createNextButton(@NonNull ItemTemplateRecord template, Templat switch (target) { - case "CHALLENGE" -> { + case Constants.CHALLENGE_BUILDER_KEY -> { int size = this.challengeList.size(); - if (size <= slot.amountMap().getOrDefault("CHALLENGE", 1) || - 1.0 * size / slot.amountMap().getOrDefault("CHALLENGE", 1) <= this.challengeIndex + 1) + if (size <= slot.amountMap().getOrDefault(Constants.CHALLENGE_BUILDER_KEY, 1) || + 1.0 * size / slot.amountMap().getOrDefault(Constants.CHALLENGE_BUILDER_KEY, 1) <= this.challengeIndex + 1) { // There are no next elements return null; @@ -653,11 +653,11 @@ private PanelItem createNextButton(@NonNull ItemTemplateRecord template, Templat nextPageIndex = this.challengeIndex + 2; } - case "LEVEL" -> { + case Constants.LEVEL_BUILDER_KEY -> { int size = this.levelList.size(); - if (size <= slot.amountMap().getOrDefault("LEVEL", 1) || - 1.0 * size / slot.amountMap().getOrDefault("LEVEL", 1) <= this.levelIndex + 1) + if (size <= slot.amountMap().getOrDefault(Constants.LEVEL_BUILDER_KEY, 1) || + 1.0 * size / slot.amountMap().getOrDefault(Constants.LEVEL_BUILDER_KEY, 1) <= this.levelIndex + 1) { // There are no next elements return null; @@ -702,8 +702,8 @@ private PanelItem createNextButton(@NonNull ItemTemplateRecord template, Templat // Next button ignores click type currently. switch (target) { - case "CHALLENGE" -> this.challengeIndex++; - case "LEVEL" -> this.levelIndex++; + case Constants.CHALLENGE_BUILDER_KEY -> this.challengeIndex++; + case Constants.LEVEL_BUILDER_KEY -> this.levelIndex++; } this.build(); @@ -738,7 +738,7 @@ private PanelItem createPreviousButton(@NonNull ItemTemplateRecord template, Tem int previousPageIndex; - if ("CHALLENGE".equals(target)) + if (Constants.CHALLENGE_BUILDER_KEY.equals(target)) { if (this.challengeIndex == 0) { @@ -748,7 +748,7 @@ private PanelItem createPreviousButton(@NonNull ItemTemplateRecord template, Tem previousPageIndex = this.challengeIndex; } - else if ("LEVEL".equals(target)) + else if (Constants.LEVEL_BUILDER_KEY.equals(target)) { if (this.levelIndex == 0) { @@ -795,8 +795,8 @@ else if ("LEVEL".equals(target)) // Next button ignores click type currently. switch (target) { - case "CHALLENGE" -> this.challengeIndex--; - case "LEVEL" -> this.levelIndex--; + case Constants.CHALLENGE_BUILDER_KEY -> this.challengeIndex--; + case Constants.LEVEL_BUILDER_KEY -> this.levelIndex--; } this.build(); diff --git a/src/main/java/world/bentobox/challenges/panel/user/GameModePanel.java b/src/main/java/world/bentobox/challenges/panel/user/GameModePanel.java index 1b3b9b0b..2184b31c 100644 --- a/src/main/java/world/bentobox/challenges/panel/user/GameModePanel.java +++ b/src/main/java/world/bentobox/challenges/panel/user/GameModePanel.java @@ -77,7 +77,7 @@ protected void build() panelBuilder.world(this.user.getWorld()); // Register button builders - panelBuilder.registerTypeBuilder("GAMEMODE", this::createGameModeButton); + panelBuilder.registerTypeBuilder(Constants.GAMEMODE_BUILDER_KEY, this::createGameModeButton); panelBuilder.registerTypeBuilder("NEXT", this::createNextButton); panelBuilder.registerTypeBuilder("PREVIOUS", this::createPreviousButton); @@ -117,7 +117,7 @@ private PanelItem createGameModeButton(ItemTemplateRecord template, TemplatedPan } else { - int index = this.addonIndex * slot.amountMap().getOrDefault("GAMEMODE", 1) + slot.slot(); + int index = this.addonIndex * slot.amountMap().getOrDefault(Constants.GAMEMODE_BUILDER_KEY, 1) + slot.slot(); if (index >= this.addonList.size()) { @@ -217,12 +217,12 @@ private PanelItem createNextButton(@NonNull ItemTemplateRecord template, Templat int nextPageIndex; - if ("GAMEMODE".equals(target)) + if (Constants.GAMEMODE_BUILDER_KEY.equals(target)) { int size = this.addonList.size(); - if (size <= slot.amountMap().getOrDefault("GAMEMODE", 1) || - 1.0 * size / slot.amountMap().getOrDefault("GAMEMODE", 1) <= this.addonIndex + 1) + if (size <= slot.amountMap().getOrDefault(Constants.GAMEMODE_BUILDER_KEY, 1) || + 1.0 * size / slot.amountMap().getOrDefault(Constants.GAMEMODE_BUILDER_KEY, 1) <= this.addonIndex + 1) { // There are no next elements return null; @@ -295,7 +295,7 @@ private PanelItem createPreviousButton(@NonNull ItemTemplateRecord template, Tem int previousPageIndex; - if ("GAMEMODE".equals(target)) + if (Constants.GAMEMODE_BUILDER_KEY.equals(target)) { if (this.addonIndex == 0) { diff --git a/src/main/java/world/bentobox/challenges/panel/util/MultiBlockSelector.java b/src/main/java/world/bentobox/challenges/panel/util/MultiBlockSelector.java index 00bb833d..cb7353ef 100644 --- a/src/main/java/world/bentobox/challenges/panel/util/MultiBlockSelector.java +++ b/src/main/java/world/bentobox/challenges/panel/util/MultiBlockSelector.java @@ -77,16 +77,11 @@ public static void open(User user, BiConsumer> con @Override protected List getElements() { return Arrays.stream(Material.values()).filter(material -> excluded == null || !excluded.contains(material)) - .filter(material -> { - switch (mode) { - case BLOCKS: - return material.isBlock(); - case ITEMS: - return material.isItem(); - default: - return true; - } - }).sorted(Comparator.comparing(Material::name)).collect(Collectors.toList()); + .filter(material -> switch (mode) { + case BLOCKS -> material.isBlock(); + case ITEMS -> material.isItem(); + default -> true; + }).sorted(Comparator.comparing(Material::name)).collect(Collectors.toList()); } @Override diff --git a/src/main/java/world/bentobox/challenges/panel/util/PagedSelector.java b/src/main/java/world/bentobox/challenges/panel/util/PagedSelector.java index 04b3d9b8..ebf77feb 100644 --- a/src/main/java/world/bentobox/challenges/panel/util/PagedSelector.java +++ b/src/main/java/world/bentobox/challenges/panel/util/PagedSelector.java @@ -137,7 +137,7 @@ protected PanelItem getButton(CommonButtons button) if (button == CommonButtons.NEXT) { - description.add(this.user.getTranslation(reference + "description", + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.pageIndex + 2))); description.add(""); @@ -153,7 +153,7 @@ protected PanelItem getButton(CommonButtons button) } else if (button == CommonButtons.PREVIOUS) { - description.add(this.user.getTranslation(reference + "description", + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY, Constants.PARAMETER_NUMBER, String.valueOf(this.pageIndex))); description.add(""); @@ -169,7 +169,7 @@ else if (button == CommonButtons.PREVIOUS) } else if (button == CommonButtons.SEARCH) { - description.add(this.user.getTranslation(reference + "description")); + description.add(this.user.getTranslation(reference + Constants.DESCRIPTION_KEY)); if (this.searchString != null && !this.searchString.isEmpty()) { diff --git a/src/main/java/world/bentobox/challenges/panel/util/SingleAdvancementSelector.java b/src/main/java/world/bentobox/challenges/panel/util/SingleAdvancementSelector.java index e8868034..b25b0550 100644 --- a/src/main/java/world/bentobox/challenges/panel/util/SingleAdvancementSelector.java +++ b/src/main/java/world/bentobox/challenges/panel/util/SingleAdvancementSelector.java @@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack; import lv.id.bonne.panelutils.PanelUtils; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; @@ -39,11 +40,11 @@ private SingleAdvancementSelector(User user, Mode mode, Set exclude BiConsumer consumer) { super(user); - this.elements = new ArrayList(); + this.elements = new ArrayList<>(); this.consumer = consumer; Bukkit.advancementIterator().forEachRemaining(elements::add); elements.removeIf(a -> a.getDisplay() == null); // Remove any that don't get displayed - elements.sort(Comparator.comparing(advancement -> advancement.getDisplay().getTitle())); + elements.sort(Comparator.comparing(advancement -> PlainTextComponentSerializer.plainText().serialize(advancement.getDisplay().title()))); // Init without filters applied. this.filterElements = this.elements; } @@ -118,7 +119,7 @@ protected void updateFilters() { } else { this.filterElements = this.elements.stream().filter(element -> { // If element name is set and name contains search field, then do not filter out. - return element.getDisplay().getTitle().toLowerCase().contains(this.searchString.toLowerCase()); + return PlainTextComponentSerializer.plainText().serialize(element.getDisplay().title()).toLowerCase().contains(this.searchString.toLowerCase()); }).distinct().collect(Collectors.toList()); } } @@ -126,7 +127,7 @@ protected void updateFilters() { /** * This method builds PanelItem for given entity. - * @param entity Entity which PanelItem must be created. + * @param advancement advancement to build button for. * @return new PanelItem for given Entity. */ @Override @@ -134,14 +135,14 @@ protected PanelItem createElementButton(Advancement advancement) { final String reference = Constants.BUTTON + "advancement."; List description = new ArrayList<>(); description.add(this.user.getTranslation(reference + "description", "[description]", - advancement.getDisplay().getDescription())); + PlainTextComponentSerializer.plainText().serialize(advancement.getDisplay().description()))); description.add(""); description.add(this.user.getTranslation(Constants.TIPS + "click-to-choose")); return new PanelItemBuilder() .name(this.user.getTranslation(reference + "name", "[name]", - advancement.getDisplay().getTitle())) + PlainTextComponentSerializer.plainText().serialize(advancement.getDisplay().title()))) .icon(getIcon(advancement)).description(description) .clickHandler((panel, user1, clickType, slot) -> { this.consumer.accept(true, advancement); @@ -151,11 +152,11 @@ protected PanelItem createElementButton(Advancement advancement) { /** * Get an ItemStack icon for any entity type, or PAPER if it's not really known - * @param et entity type + * @param advancement the advancement to get the icon for * @return ItemStack */ public static ItemStack getIcon(Advancement advancement) { - return advancement.getDisplay().getIcon(); + return advancement.getDisplay().icon(); } /** diff --git a/src/main/java/world/bentobox/challenges/panel/util/SingleEntitySelector.java b/src/main/java/world/bentobox/challenges/panel/util/SingleEntitySelector.java index aa2355ac..c53d193f 100644 --- a/src/main/java/world/bentobox/challenges/panel/util/SingleEntitySelector.java +++ b/src/main/java/world/bentobox/challenges/panel/util/SingleEntitySelector.java @@ -45,7 +45,6 @@ public class SingleEntitySelector extends PagedSelector * Instantiates a new Single entity selector. * * @param user the user - * @param asEggs the boolean * @param mode the mode * @param excluded the excluded * @param consumer the consumer diff --git a/src/main/java/world/bentobox/challenges/tasks/TryToComplete.java b/src/main/java/world/bentobox/challenges/tasks/TryToComplete.java index 8bde71c7..d3db902c 100644 --- a/src/main/java/world/bentobox/challenges/tasks/TryToComplete.java +++ b/src/main/java/world/bentobox/challenges/tasks/TryToComplete.java @@ -38,7 +38,7 @@ import com.google.common.collect.UnmodifiableIterator; -import world.bentobox.bentobox.BentoBox; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; @@ -151,7 +151,7 @@ public TryToComplete(ChallengesAddon addon, this.manager = addon.getChallengesManager(); // To avoid any modifications that may occur to challenges in current completion // just clone it. - this.challenge = challenge.clone(); + this.challenge = challenge.copy(); } @@ -1160,8 +1160,8 @@ private ChallengeResult searchForTags(Map, Integer> req Utils.sendMessage(this.user, this.world, Constants.ERRORS + "not-close-enough", Constants.PARAMETER_NUMBER, String.valueOf(this.getIslandRequirements().getSearchRadius())); - tags.forEach((k, v) -> Utils.sendMessage(this.user, this.world, Constants.ERRORS + "you-still-need", "[amount]", - String.valueOf(v), "[item]", Utils.prettifyObject(k, this.user))); + tags.forEach((k, v) -> Utils.sendMessage(this.user, this.world, Constants.YOU_STILL_NEED, Constants.PARAMETER_AMOUNT, + String.valueOf(v), Constants.PARAMETER_ITEM, Utils.prettifyObject(k, this.user))); // kick garbage collector tags.clear(); @@ -1245,8 +1245,8 @@ private ChallengeResult searchForBlocks(Map requiredMap, int Utils.sendMessage(this.user, this.world, Constants.ERRORS + "not-close-enough", Constants.PARAMETER_NUMBER, String.valueOf(this.getIslandRequirements().getSearchRadius())); - blocks.forEach((k, v) -> Utils.sendMessage(this.user, this.world, Constants.ERRORS + "you-still-need", - "[amount]", String.valueOf(v), "[item]", Utils.prettifyObject(k, this.user))); + blocks.forEach((k, v) -> Utils.sendMessage(this.user, this.world, Constants.YOU_STILL_NEED, + Constants.PARAMETER_AMOUNT, String.valueOf(v), Constants.PARAMETER_ITEM, Utils.prettifyObject(k, this.user))); // kick garbage collector @@ -1319,8 +1319,8 @@ private ChallengeResult searchForEntities(Map requiredMap, } minimalRequirements.forEach( - (reqEnt, amount) -> Utils.sendMessage(this.user, this.world, Constants.ERRORS + "you-still-need", - "[amount]", String.valueOf(amount), "[item]", Utils.prettifyObject(reqEnt, this.user))); + (reqEnt, amount) -> Utils.sendMessage(this.user, this.world, Constants.YOU_STILL_NEED, + Constants.PARAMETER_AMOUNT, String.valueOf(amount), Constants.PARAMETER_ITEM, Utils.prettifyObject(reqEnt, this.user))); // Kick garbage collector entitiesFound.clear(); @@ -1400,13 +1400,13 @@ private ChallengeResult checkOthers(int factor) { } else if (!this.addon.isEconomyProvided() && requirements.getRequiredMoney() != 0) { Utils.sendMessage(this.user, this.world, Constants.ERRORS + "missing-addon"); } else if (this.addon.isEconomyProvided() && requirements.getRequiredMoney() < 0) { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "incorrect"); + Utils.sendMessage(this.user, this.world, Constants.INCORRECT); } else if (this.addon.isEconomyProvided() && !this.addon.getEconomyProvider().has(this.user, requirements.getRequiredMoney())) { Utils.sendMessage(this.user, this.world, Constants.ERRORS + "not-enough-money", Constants.PARAMETER_VALUE, Double.toString(requirements.getRequiredMoney())); } else if (requirements.getRequiredExperience() < 0) { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "incorrect"); + Utils.sendMessage(this.user, this.world, Constants.INCORRECT); } else if (this.user.getPlayer().getTotalExperience() < requirements.getRequiredExperience() && this.user.getPlayer().getGameMode() != GameMode.CREATIVE) { // Players in creative gamemode has infinite amount of EXP. @@ -1420,7 +1420,7 @@ private ChallengeResult checkOthers(int factor) { } else if (this.addon.getPlugin().getHooks().getHook("PlaceholderAPI").isPresent() && !requirements.getPapiString().isEmpty() && !CheckPapi.evaluate(user.getPlayer(), requirements.getPapiString())) { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "incorrect"); + Utils.sendMessage(this.user, this.world, Constants.INCORRECT); if (!requirements.getPapiString().isEmpty()) { addon.log("FYI:.Challenge failed for " + user.getName() + ". PAPI formula: " + requirements.getPapiString() + " = " @@ -1428,12 +1428,12 @@ private ChallengeResult checkOthers(int factor) { } } else if (!requirements.getAdvancements().stream().map(user.getPlayer()::getAdvancementProgress) .allMatch(AdvancementProgress::isDone)) { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "incorrect"); + Utils.sendMessage(this.user, this.world, Constants.INCORRECT); user.sendMessage("challenges.gui.buttons.required_advancements.title"); requirements.getAdvancements().stream().filter(ad -> !user.getPlayer().getAdvancementProgress(ad).isDone()) .forEach(ad -> Utils.sendMessage(this.user, this.world, "challenges.gui.buttons.advancement_element.name", "[name]", - ad.getDisplay().getTitle())); + PlainTextComponentSerializer.plainText().serialize(ad.getDisplay().title()))); } else { @@ -1493,26 +1493,20 @@ private ChallengeResult checkStatistic(int factor) { if (currentValue < s.amount()) { switch (Objects.requireNonNull(s.statistic()).getType()) { - case ITEM, BLOCK -> { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "requirement-not-met-material", - TextVariables.NUMBER, String.valueOf(s.amount()), "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[material]", - Utils.prettifyObject(s.material(), this.user), Constants.PARAMETER_VALUE, - String.valueOf(currentValue)); - } - case ENTITY -> { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "requirement-not-met-entity", - TextVariables.NUMBER, String.valueOf(s.amount()), "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), "[entity]", - Utils.prettifyObject(s.entity(), this.user), Constants.PARAMETER_VALUE, - String.valueOf(currentValue)); - } - default -> { - Utils.sendMessage(this.user, this.world, Constants.ERRORS + "requirement-not-met", - TextVariables.NUMBER, String.valueOf(s.amount()), "[statistic]", - Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_VALUE, - String.valueOf(currentValue)); - } + case ITEM, BLOCK -> Utils.sendMessage(this.user, this.world, Constants.ERRORS + "requirement-not-met-material", + TextVariables.NUMBER, String.valueOf(s.amount()), Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), "[material]", + Utils.prettifyObject(s.material(), this.user), Constants.PARAMETER_VALUE, + String.valueOf(currentValue)); + case ENTITY -> Utils.sendMessage(this.user, this.world, Constants.ERRORS + "requirement-not-met-entity", + TextVariables.NUMBER, String.valueOf(s.amount()), Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), "[entity]", + Utils.prettifyObject(s.entity(), this.user), Constants.PARAMETER_VALUE, + String.valueOf(currentValue)); + default -> Utils.sendMessage(this.user, this.world, Constants.ERRORS + "requirement-not-met", + TextVariables.NUMBER, String.valueOf(s.amount()), Constants.PARAMETER_STATISTIC, + Utils.prettifyObject(s.statistic(), this.user), Constants.PARAMETER_VALUE, + String.valueOf(currentValue)); } } else { factor = s.amount() == 0 ? factor : Math.min(factor, currentValue / s.amount()); diff --git a/src/main/java/world/bentobox/challenges/utils/Constants.java b/src/main/java/world/bentobox/challenges/utils/Constants.java index 3d8f28cd..b36590b2 100644 --- a/src/main/java/world/bentobox/challenges/utils/Constants.java +++ b/src/main/java/world/bentobox/challenges/utils/Constants.java @@ -228,4 +228,158 @@ public class Constants * Regex escape chars. */ public static final String ESC = "\\"; + +// --------------------------------------------------------------------- +// Section: GUI Description Keys +// --------------------------------------------------------------------- + + public static final String DESCRIPTION_KEY = "description"; + + public static final String TITLE_KEY = "title"; + + public static final String VALUE_KEY = "value"; + + public static final String ENABLED_KEY = "enabled"; + + public static final String DISABLED_KEY = "disabled"; + +// --------------------------------------------------------------------- +// Section: GUI Tip Keys +// --------------------------------------------------------------------- + + public static final String CLICK_TO_CHANGE = TIPS + "click-to-change"; + + public static final String CLICK_TO_TOGGLE = TIPS + "click-to-toggle"; + + public static final String CLICK_TO_OPEN = TIPS + "click-to-open"; + + public static final String SHIFT_CLICK_TO_RESET = TIPS + "shift-click-to-reset"; + +// --------------------------------------------------------------------- +// Section: Conversation Keys +// --------------------------------------------------------------------- + + public static final String INPUT_NUMBER = CONVERSATIONS + "input-number"; + + public static final String CANCEL_STRING = CONVERSATIONS + "cancel-string"; + + public static final String CANCELLED = CONVERSATIONS + "cancelled"; + + public static final String PREFIX = CONVERSATIONS + "prefix"; + +// --------------------------------------------------------------------- +// Section: Additional Parameters +// --------------------------------------------------------------------- + + public static final String PARAMETER_ITEM = "[item]"; + + public static final String PARAMETER_ITEMS = "[items]"; + + public static final String PARAMETER_AMOUNT = "[amount]"; + + public static final String PARAMETER_STATISTIC = "[statistic]"; + + public static final String PARAMETER_TARGET = "[target]"; + + public static final String PARAMETER_STATUS = "[status]"; + + public static final String PARAMETER_REWARDS = "[rewards]"; + + public static final String PARAMETER_EXPERIENCE = "[experience]"; + + public static final String PARAMETER_MONEY = "[money]"; + + public static final String PARAMETER_COMMAND = "[command]"; + + public static final String PARAMETER_COMMANDS = "[commands]"; + + public static final String PARAMETER_TEXT = "[text]"; + + public static final String PARAMETER_TYPE = "[type]"; + + public static final String PARAMETER_META = "[meta]"; + +// --------------------------------------------------------------------- +// Section: Error Keys +// --------------------------------------------------------------------- + + public static final String LOAD_ERROR = ERRORS + "load-error"; + + public static final String INCORRECT = ERRORS + "incorrect"; + + public static final String YOU_STILL_NEED = ERRORS + "you-still-need"; + +// --------------------------------------------------------------------- +// Section: Panel Description Suffixes +// --------------------------------------------------------------------- + + public static final String BLOCKS_VALUE = "blocks-value"; + + public static final String BLOCK_VALUE = "block-value"; + + public static final String ITEMS_VALUE = "items-value"; + + public static final String ITEM_VALUE = "item-value"; + + public static final String ITEM_TITLE = "item-title"; + + public static final String COMMANDS_TITLE = "commands-title"; + + public static final String EXPERIENCE_KEY = "experience"; + + public static final String MONEY_KEY = "money"; + + public static final String COMMAND_KEY = "command"; + +// --------------------------------------------------------------------- +// Section: Misc +// --------------------------------------------------------------------- + + public static final String CHALLENGES_CHALLENGES = "challenges.challenges."; + + public static final String BLANK_LINE_REGEX = "(?m)^[ \\t]*\\r?\\n"; + + public static final String DOT_NAME = ".name"; + + public static final String DOT_DESCRIPTION = ".description"; + + public static final String META_PREFIX = ITEM_STACKS + "meta."; + + public static final String GENERIC = ITEM_STACKS + "generic"; + + public static final String JSON_EXTENSION = ".json"; + +// --------------------------------------------------------------------- +// Section: Panel Type Builder Keys +// --------------------------------------------------------------------- + + public static final String CHALLENGE_BUILDER_KEY = "CHALLENGE"; + + public static final String LEVEL_BUILDER_KEY = "LEVEL"; + + public static final String GAMEMODE_BUILDER_KEY = "GAMEMODE"; + +// --------------------------------------------------------------------- +// Section: Handler Keys +// --------------------------------------------------------------------- + + public static final String WORLD_NAME_KEY = "world-name"; + + public static final String CHALLENGE_NAME_KEY = "challenge-name"; + + public static final String LEVEL_NAME_KEY = "level-name"; + +// --------------------------------------------------------------------- +// Section: Import Manager Keys +// --------------------------------------------------------------------- + + public static final String CHALLENGES_KEY = "challenges"; + + public static final String ENVIRONMENTS_KEY = "environments"; + + public static final String ITEMS_KEY = "items"; + + public static final String PERMISSIONS_KEY = "permissions"; + + public static final String COMMANDS_KEY = "commands"; } diff --git a/src/main/java/world/bentobox/challenges/utils/Utils.java b/src/main/java/world/bentobox/challenges/utils/Utils.java index 8245b6d0..ab0f62f5 100644 --- a/src/main/java/world/bentobox/challenges/utils/Utils.java +++ b/src/main/java/world/bentobox/challenges/utils/Utils.java @@ -217,7 +217,7 @@ public static String prettifyObject(World.Environment object, User user) // environments: // [environment]: // name: [name] - String translation = user.getTranslationOrNothing(Constants.ENVIRONMENTS + object.name().toLowerCase() + ".name"); + String translation = user.getTranslationOrNothing(Constants.ENVIRONMENTS + object.name().toLowerCase() + Constants.DOT_NAME); if (!translation.isEmpty()) { @@ -271,7 +271,7 @@ public static String prettifyDescription(World.Environment object, User user) // environments: // [environment]: // description: [text] - String translation = user.getTranslationOrNothing(Constants.ENVIRONMENTS + object.name().toLowerCase() + ".description"); + String translation = user.getTranslationOrNothing(Constants.ENVIRONMENTS + object.name().toLowerCase() + Constants.DOT_DESCRIPTION); if (!translation.isEmpty()) { @@ -295,7 +295,7 @@ public static String prettifyObject(@Nullable Tag object, User user) { return ""; } String translation = user.getTranslationOrNothing( - Constants.MATERIALS + object.getKey().getKey().toLowerCase(Locale.ENGLISH) + ".name"); + Constants.MATERIALS + object.getKey().getKey().toLowerCase(Locale.ENGLISH) + Constants.DOT_NAME); String any = user.getTranslationOrNothing(Constants.MATERIALS + "any"); // Prettify and remove last s String tag = any + Util.prettifyText(object.getKey().getKey()).replaceAll("s$", ""); @@ -319,7 +319,7 @@ public static > String prettifyObject(@Nullable T object, User } // Build a translation key using the enum name. String translation = user - .getTranslationOrNothing(Constants.MATERIALS + object.name().toLowerCase(Locale.ENGLISH) + ".name"); + .getTranslationOrNothing(Constants.MATERIALS + object.name().toLowerCase(Locale.ENGLISH) + Constants.DOT_NAME); String any = user.getTranslationOrNothing(Constants.MATERIALS + "any"); // Use the enum's name and prettify it (for example, convert ALL_HANGING_SIGNS to "All Hanging Sign") String tag = any + Util.prettifyText(object.name()).replaceAll("s$", ""); @@ -345,7 +345,7 @@ public static String prettifyMaterial(@Nullable Material object, User user) // materials: // [material]: // name: [name] - String translation = user.getTranslationOrNothing(Constants.MATERIALS + object.name().toLowerCase() + ".name"); + String translation = user.getTranslationOrNothing(Constants.MATERIALS + object.name().toLowerCase() + Constants.DOT_NAME); if (!translation.isEmpty()) { @@ -402,7 +402,7 @@ public static String prettifyDescription(@Nullable Material object, User user) // materials: // [material]: // description: [text] - String translation = user.getTranslationOrNothing(Constants.MATERIALS + object.name().toLowerCase() + ".description"); + String translation = user.getTranslationOrNothing(Constants.MATERIALS + object.name().toLowerCase() + Constants.DOT_DESCRIPTION); if (!translation.isEmpty()) { @@ -434,7 +434,7 @@ public static String prettifyObject(@Nullable EntityType object, User user) // entities: // [entity]: // name: [name] - String translation = user.getTranslationOrNothing(Constants.ENTITIES + object.name().toLowerCase() + ".name"); + String translation = user.getTranslationOrNothing(Constants.ENTITIES + object.name().toLowerCase() + Constants.DOT_NAME); if (!translation.isEmpty()) { @@ -491,7 +491,7 @@ public static String prettifyDescription(@Nullable EntityType object, User user) // entities: // [entity]: // description: [text] - String translation = user.getTranslationOrNothing(Constants.ENTITIES + object.name().toLowerCase() + ".description"); + String translation = user.getTranslationOrNothing(Constants.ENTITIES + object.name().toLowerCase() + Constants.DOT_DESCRIPTION); if (!translation.isEmpty()) { @@ -523,7 +523,7 @@ public static String prettifyObject(@Nullable Statistic object, User user) // statistics: // [statistic]: // name: [name] - String translation = user.getTranslationOrNothing(Constants.STATISTICS + object.name().toLowerCase() + ".name"); + String translation = user.getTranslationOrNothing(Constants.STATISTICS + object.name().toLowerCase() + Constants.DOT_NAME); if (!translation.isEmpty()) { @@ -581,7 +581,7 @@ public static String prettifyDescription(@Nullable Statistic object, User user) // statistics: // [statistic]: // description: [text] - String translation = user.getTranslationOrNothing(Constants.STATISTICS + object.name().toLowerCase() + ".description"); + String translation = user.getTranslationOrNothing(Constants.STATISTICS + object.name().toLowerCase() + Constants.DOT_DESCRIPTION); if (!translation.isEmpty()) { @@ -753,7 +753,7 @@ public static String prettifyObject(ItemStack item, @Nullable PotionMeta potionM Material itemType = item.getType(); final String itemReference = Constants.ITEM_STACKS + itemType.name().toLowerCase() + "."; - final String metaReference = Constants.ITEM_STACKS + "meta."; + final String metaReference = Constants.META_PREFIX; PotionType potionData = potionMeta.getBasePotionType(); @@ -766,18 +766,18 @@ public static String prettifyObject(ItemStack item, @Nullable PotionMeta potionM } // Get item specific translation. String specific = user.getTranslationOrNothing(itemReference + "name", - "[type]", type, + Constants.PARAMETER_TYPE, type, "[upgraded]", "", "[extended]", ""); if (specific.isEmpty()) { // Use generic translation. String meta = user.getTranslationOrNothing(metaReference + "potion-meta", - "[type]", type, + Constants.PARAMETER_TYPE, type, "[upgraded]", "", "[extended]", ""); - specific = user.getTranslationOrNothing(Constants.ITEM_STACKS + "generic", - "[type]", prettifyObject(itemType, user), - "[meta]", meta); + specific = user.getTranslationOrNothing(Constants.GENERIC, + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), + Constants.PARAMETER_META, meta); } if (specific.isEmpty()) { // Last ditch @@ -803,14 +803,14 @@ public static String prettifyObject(ItemStack item, @Nullable SkullMeta skullMet } Material itemType = item.getType(); - final String metaReference = Constants.ITEM_STACKS + "meta."; + final String metaReference = Constants.META_PREFIX; String meta = user.getTranslationOrNothing(metaReference + "skull-meta", "[player-name]", skullMeta.getDisplayName()); - return user.getTranslationOrNothing(Constants.ITEM_STACKS + "generic", - "[type]", prettifyObject(itemType, user), - "[meta]", meta); + return user.getTranslationOrNothing(Constants.GENERIC, + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), + Constants.PARAMETER_META, meta); } @@ -834,7 +834,7 @@ public static String prettifyObject(ItemStack item, @Nullable ItemMeta itemMeta, itemMeta.getEnchants().forEach((enchantment, level) -> { builder.append("\n"); builder.append(user.getTranslationOrNothing(Constants.ITEM_STACKS + "meta.enchant-meta", - "[type]", prettifyObject(enchantment, user), + Constants.PARAMETER_TYPE, prettifyObject(enchantment, user), "[level]", String.valueOf(level))); }); @@ -843,14 +843,14 @@ public static String prettifyObject(ItemStack item, @Nullable ItemMeta itemMeta, final String itemReference = Constants.ITEM_STACKS + itemType.name().toLowerCase() + "."; String translation = user.getTranslationOrNothing(itemReference + "name", - "[type]", prettifyObject(itemType, user), + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), "[enchant]", builder.toString()); if (translation.isEmpty()) { - translation = user.getTranslationOrNothing(Constants.ITEM_STACKS + "generic", - "[type]", prettifyObject(itemType, user), - "[meta]", builder.toString()); + translation = user.getTranslationOrNothing(Constants.GENERIC, + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), + Constants.PARAMETER_META, builder.toString()); } return translation; @@ -877,7 +877,7 @@ public static String prettifyObject(ItemStack item, @Nullable EnchantmentStorage enchantmentMeta.getStoredEnchants().forEach((enchantment, level) -> { builder.append("\n"); builder.append(user.getTranslationOrNothing(Constants.ITEM_STACKS + "meta.enchant-meta", - "[type]", prettifyObject(enchantment, user), + Constants.PARAMETER_TYPE, prettifyObject(enchantment, user), "[level]", String.valueOf(level))); }); @@ -886,14 +886,14 @@ public static String prettifyObject(ItemStack item, @Nullable EnchantmentStorage final String itemReference = Constants.ITEM_STACKS + itemType.name().toLowerCase() + "."; String translation = user.getTranslationOrNothing(itemReference + "name", - "[type]", prettifyObject(itemType, user), + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), "[enchant]", builder.toString()); if (translation.isEmpty()) { - translation = user.getTranslationOrNothing(Constants.ITEM_STACKS + "generic", - "[type]", prettifyObject(itemType, user), - "[meta]", builder.toString()); + translation = user.getTranslationOrNothing(Constants.GENERIC, + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), + Constants.PARAMETER_META, builder.toString()); } return translation; @@ -916,15 +916,15 @@ public static String prettifyObject(ItemStack item, @Nullable BookMeta bookMeta, } Material itemType = item.getType(); - final String metaReference = Constants.ITEM_STACKS + "meta."; + final String metaReference = Constants.META_PREFIX; String meta = user.getTranslationOrNothing(metaReference + "book-meta", "[title]", bookMeta.hasTitle() ? bookMeta.getTitle() : "", "[author]", bookMeta.hasAuthor() ? bookMeta.getAuthor() : ""); - return user.getTranslationOrNothing(Constants.ITEM_STACKS + "generic", - "[type]", prettifyObject(itemType, user), - "[meta]", meta); + return user.getTranslationOrNothing(Constants.GENERIC, + Constants.PARAMETER_TYPE, prettifyObject(itemType, user), + Constants.PARAMETER_META, meta); } diff --git a/src/main/java/world/bentobox/challenges/web/WebManager.java b/src/main/java/world/bentobox/challenges/web/WebManager.java index ec91f3bb..4a4f33ec 100644 --- a/src/main/java/world/bentobox/challenges/web/WebManager.java +++ b/src/main/java/world/bentobox/challenges/web/WebManager.java @@ -64,60 +64,80 @@ public WebManager(ChallengesAddon addon) */ public void requestCatalogGitHubData(boolean clearCache) { - this.plugin.getWebManager().getGitHub().ifPresent(gitHubWebAPI -> + this.catalogState = CatalogState.DOWNLOADING; + try { - if (this.plugin.getSettings().isLogGithubDownloadData()) + this.plugin.getWebManager().getGitHub().ifPresent(gitHubWebAPI -> { - this.plugin.log("Downloading data from GitHub..."); - } + if (this.plugin.getSettings().isLogGithubDownloadData()) + { + this.plugin.log("Downloading data from GitHub..."); + } - String catalogContent = ""; + String catalogContent = ""; - // Downloading the data - try - { - catalogContent = gitHubWebAPI.getRepository("BentoBoxWorld", "weblink"). - getContent("challenges/catalog.json"). - getContent().replaceAll("\\n", ""); - } - catch (IllegalAccessException e) - { + // Downloading the data + try + { + catalogContent = gitHubWebAPI.getRepository("BentoBoxWorld", "weblink"). + getContent("challenges/catalog.json"). + getContent().replaceAll("\\n", ""); + } + catch (Exception e) + { + this.plugin.logError("An error occurred when downloading data from GitHub..."); + this.plugin.logStacktrace(e); + } + + // People were concerned that the download took ages, so we need to tell them it's over now. if (this.plugin.getSettings().isLogGithubDownloadData()) { - this.plugin.log("Could not connect to GitHub."); + this.plugin.log("Successfully downloaded data from GitHub."); } - } - catch (Exception e) - { - this.plugin.logError("An error occurred when downloading data from GitHub..."); - this.plugin.logStacktrace(e); - } - // People were concerned that the download took ages, so we need to tell them it's over now. - if (this.plugin.getSettings().isLogGithubDownloadData()) - { - this.plugin.log("Successfully downloaded data from GitHub."); - } + // Decoding the Base64 encoded contents + catalogContent = new String(Base64.getDecoder().decode(catalogContent), + StandardCharsets.UTF_8); - // Decoding the Base64 encoded contents - catalogContent = new String(Base64.getDecoder().decode(catalogContent), - StandardCharsets.UTF_8); + /* Parsing the data */ - /* Parsing the data */ - - // Register the catalog data - if (!catalogContent.isEmpty()) - { - if (clearCache) + // Register the catalog data + if (!catalogContent.isEmpty()) { - this.library.clear(); + if (clearCache) + { + this.library.clear(); + } + + JsonObject catalog = new JsonParser().parse(catalogContent).getAsJsonObject(); + catalog.getAsJsonArray("challenges").forEach(gamemode -> + { + JsonObject entryJson = gamemode.getAsJsonObject(); + try + { + LibraryEntry entry = LibraryEntry.fromJson(entryJson); + if (entry.repository() == null || entry.repository().isBlank()) + { + this.addon.logWarning("Skipping catalog entry with missing 'repository' field: " + entryJson); + } + else + { + this.library.add(entry); + } + } + catch (Exception e) + { + this.addon.logWarning("Skipping malformed catalog entry: " + entryJson); + this.addon.logWarning("Reason: " + e.getMessage()); + } + }); } - - JsonObject catalog = new JsonParser().parse(catalogContent).getAsJsonObject(); - catalog.getAsJsonArray("challenges").forEach(gamemode -> - this.library.add(LibraryEntry.fromJson(gamemode.getAsJsonObject()))); - } - }); + }); + } + finally + { + this.catalogState = CatalogState.READY; + } } @@ -146,18 +166,6 @@ public void requestEntryGitHubData(User user, World world, LibraryEntry entry) getContent(). replaceAll("\\n", ""); } - catch (IllegalAccessException e) - { - if (this.plugin.getSettings().isLogGithubDownloadData()) - { - this.plugin.log("Could not connect to GitHub."); - this.plugin.log( - "JSON files can be found at https://github.com/BentoBoxWorld/weblink/tree/master/challenges/library"); - user.sendRawMessage("Could not connect to GitHub."); - user.sendRawMessage( - "JSON files can be found at https://github.com/BentoBoxWorld/weblink/tree/master/challenges/library"); - } - } catch (Exception e) { this.plugin.logError("An error occurred when downloading data from GitHub..."); @@ -232,4 +240,32 @@ public static boolean isEnabled() * This list contains all entries that were downloaded from GitHub. */ private final List library; + + /** + * Tracks the state of the catalog download so UI can render a pending indicator. + */ + private volatile CatalogState catalogState = CatalogState.IDLE; + + + /** + * Returns the current catalog download state. + */ + public CatalogState getCatalogState() + { + return this.catalogState; + } + + + /** + * State of the GitHub catalog download. + */ + public enum CatalogState + { + /** No download has been requested yet. */ + IDLE, + /** A download is currently in flight. */ + DOWNLOADING, + /** A download has completed (successfully or not). */ + READY + } } diff --git a/src/main/java/world/bentobox/challenges/web/object/LibraryEntry.java b/src/main/java/world/bentobox/challenges/web/object/LibraryEntry.java index c31ac542..3c38d71a 100644 --- a/src/main/java/world/bentobox/challenges/web/object/LibraryEntry.java +++ b/src/main/java/world/bentobox/challenges/web/object/LibraryEntry.java @@ -25,20 +25,45 @@ public record LibraryEntry(String name, Material icon, String description, Strin /** * Default constructor. * @param object Json Object that must be translated to LibraryEntry. + * @throws IllegalArgumentException if a required field is missing or null. */ public static LibraryEntry fromJson(@NonNull JsonObject object) { - Material material = Material.matchMaterial(object.get("icon").getAsString()); + String iconStr = getString(object, "icon"); + Material material = iconStr != null ? Material.matchMaterial(iconStr) : null; - return new LibraryEntry(object.get("name").getAsString(), + return new LibraryEntry( + getString(object, "name"), (material != null) ? material : Material.PAPER, - object.get("description").getAsString(), - object.get("repository").getAsString(), - object.get("language").getAsString(), - object.get("slot").getAsInt(), - object.get("for").getAsString(), - object.get("author").getAsString(), - object.get("version").getAsString()); + getString(object, "description"), + getString(object, "repository"), + getString(object, "language"), + getInt(object, "slot"), + getString(object, "for"), + getString(object, "author"), + getString(object, "version")); + } + + + private static String getString(@NonNull JsonObject obj, @NonNull String key) + { + var el = obj.get(key); + if (el == null || el.isJsonNull()) + { + throw new IllegalArgumentException("Missing required field: \"" + key + "\""); + } + return el.getAsString(); + } + + + private static int getInt(@NonNull JsonObject obj, @NonNull String key) + { + var el = obj.get(key); + if (el == null || el.isJsonNull()) + { + throw new IllegalArgumentException("Missing required field: \"" + key + "\""); + } + return el.getAsInt(); } diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 8c70bcde..7877a63c 100755 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -1,7 +1,7 @@ name: Challenges main: world.bentobox.challenges.ChallengesAddon version: ${version}${build.number} -api-version: 3.2.4 +api-version: 3.12.0 repository: 'BentoBoxWorld/Challenges' metrics: true diff --git a/src/main/resources/locales/cs.yml b/src/main/resources/locales/cs.yml index 1ae69e1e..e017a0bc 100644 --- a/src/main/resources/locales/cs.yml +++ b/src/main/resources/locales/cs.yml @@ -31,799 +31,799 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0&l Nabídka výzev" - gamemode-gui: "&0&l Vyberte GameMode" - multiple-gui: "&0&l Kolikrát?" - admin-gui: "&0&l Nabídka správce výzev" - edit-challenge: "&0&l Upravit [challenge]" - edit-level: "&0&l Upravit [level]" - settings: "&0&l Nastavení" - choose-challenge: "&0&l Vyber výzvu" - choose-level: "&0&l Vyber level" - choose-player: "&0&l Vyber hráče" - library: Knihovna &0&l - manage-blocks: "&0&l Spravovat bloky" - manage-entities: "&0&l Spravovat entity" - type-selector: "&0&l Výběr typu výzvy" - item-selector: "&0&l Výběr položek" - block-selector: "&0&l Výběr bloku" - entity-selector: "&0&l Výběr entity" - challenge-selector: "&0&l Výběr výzvy" - statistic-selector: "&0&l Výběr statistiky" - environment-selector: "&0&l Výběr prostředí" + player-gui: "Nabídka výzev" + gamemode-gui: "Vyberte GameMode" + multiple-gui: "Kolikrát?" + admin-gui: "Nabídka správce výzev" + edit-challenge: "Upravit [challenge]" + edit-level: "Upravit [level]" + settings: "Nastavení" + choose-challenge: "Vyber výzvu" + choose-level: "Vyber level" + choose-player: "Vyber hráče" + library: Knihovna + manage-blocks: "Spravovat bloky" + manage-entities: "Spravovat entity" + type-selector: "Výběr typu výzvy" + item-selector: "Výběr položek" + block-selector: "Výběr bloku" + entity-selector: "Výběr entity" + challenge-selector: "Výběr výzvy" + statistic-selector: "Výběr statistiky" + environment-selector: "Výběr prostředí" buttons: free-challenges: - name: "&f&l Výzvy zdarma" + name: "Výzvy zdarma" description: |- - &7 Zobrazí seznam - &7 bezplatných výzev + Zobrazí seznam + bezplatných výzev return: - name: "&f&l Návrat" + name: "Návrat" description: |- - &7 Návrat do předchozí nabídky - &7 nebo ukončete GUI + Návrat do předchozí nabídky + nebo ukončete GUI previous: - name: "&f&l Předchozí stránka" - description: "&7 Přepnout na stránku &e [number] &7" + name: "Předchozí stránka" + description: "Přepnout na stránku [number] " next: - name: "&f&l Další stránka" - description: "&7 Přepnout na stránku &e [number] &7" + name: "Další stránka" + description: "Přepnout na stránku [number] " reduce: - name: "&f&l Snížit" - description: "&7 Snížit o &e [number]" + name: "Snížit" + description: "Snížit o [number]" increase: - name: "&f&l Zvýšit" - description: "&7 Zvýšit o &e [number]" + name: "Zvýšit" + description: "Zvýšit o [number]" accept: - name: "&f&l Hotovo" + name: "Hotovo" description: |- - &7 Dokonči výzvu &e [number] - &7 krát (-s) + Dokonči výzvu [number] + krát (-s) quit: - name: "&f&l Ukončit" - description: "&7 Ukončete GUI." + name: "Ukončit" + description: "Ukončete GUI." complete_user_challenges: - name: "&f&l Dokončit uživatelskou výzvu(-y)" + name: "Dokončit uživatelskou výzvu(-y)" description: |- - &7 Umožňuje vybrat uživatele a - &7 kompletních výzev pro - &7 ho + Umožňuje vybrat uživatele a + kompletních výzev pro + ho reset_user_challenges: - name: "&f&l Obnovit uživatelské výzvy" + name: "Obnovit uživatelské výzvy" description: |- - &7 Umožňuje vybrat uživatele a - &7 resetoval své výzvy + Umožňuje vybrat uživatele a + resetoval své výzvy add_challenge: - name: "&f&l Vytvořit výzvu" + name: "Vytvořit výzvu" description: |- - &7 Spustí proces pro - &7 vytvoření nové výzvy. + Spustí proces pro + vytvoření nové výzvy. add_level: - name: "&f&l Vytvořit úroveň" + name: "Vytvořit úroveň" description: |- - &7 Spustí proces pro - &7 vytvoření nové úrovně. + Spustí proces pro + vytvoření nové úrovně. edit_challenge: - name: "&f&l Upravit výzvu" + name: "Upravit výzvu" description: |- - &7 Umožňuje vybrat a upravit - &7 výzva. + Umožňuje vybrat a upravit + výzva. edit_level: - name: "&f&l Upravit úroveň" + name: "Upravit úroveň" description: |- - &7 Umožňuje vybrat a upravit - &7 úroveň. + Umožňuje vybrat a upravit + úroveň. delete_challenge: - name: "&f&l Smazat výzvu" + name: "Smazat výzvu" description: |- - &7 Umožňuje vybrat a odstranit - &7 výzva. + Umožňuje vybrat a odstranit + výzva. delete_level: - name: "&f&l Odstranit úroveň" + name: "Odstranit úroveň" description: |- - &7 Umožňuje vybrat a odstranit - &7 úroveň. + Umožňuje vybrat a odstranit + úroveň. edit_settings: - name: "&f&l Nastavení" + name: "Nastavení" description: |- - &7 Umožňuje prohlížet a upravovat - &7 nastavení doplňku. + Umožňuje prohlížet a upravovat + nastavení doplňku. complete_wipe: - name: "&f&l Kompletní vymazání" + name: "Kompletní vymazání" description: |- - &7 Zcela odstraňuje výzvy - Databáze doplňků &7, včetně - &7 uživatelských dat. + Zcela odstraňuje výzvy + Databáze doplňků , včetně + uživatelských dat. challenge_wipe: - name: "&f&l Vymazání výzvy" + name: "Vymazání výzvy" description: |- - &7 Zcela odstraňuje výzvy - &7 a úrovně z databáze. + Zcela odstraňuje výzvy + a úrovně z databáze. user_wipe: - name: "&f&l Vymazání uživatele" + name: "Vymazání uživatele" description: |- - &7 Úplně vymaže uživatele - &7 data z databáze. + Úplně vymaže uživatele + data z databáze. library: - name: "&f&l Knihovna" + name: "Knihovna" description: |- - &7 Otevře veřejnost - Knihovna výzev &7. + Otevře veřejnost + Knihovna výzev . import_database: - name: "&f&l Importovat databázi" + name: "Importovat databázi" description: |- - &7 Umožňuje exportovat import - &7 databáze výzev. + Umožňuje exportovat import + databáze výzev. import_template: - name: "&f&l Importovat šablonu" + name: "Importovat šablonu" description: |- - &7 Umožňuje importovat šablonu - &7 soubor s výzvami. + Umožňuje importovat šablonu + soubor s výzvami. export_challenges: - name: "&f&l Výzvy exportu" + name: "Výzvy exportu" description: |- - &7 Umožňuje exportovat databázi - &7 do místního souboru. + Umožňuje exportovat databázi + do místního souboru. properties: - name: "&f&l Vlastnosti" - description: "&7 Zobrazit všechny hlavní vlastnosti." + name: "Vlastnosti" + description: "Zobrazit všechny hlavní vlastnosti." requirements: - name: "&f&l Požadavky" - description: "&7 Zobrazit vlastnosti požadavků." + name: "Požadavky" + description: "Zobrazit vlastnosti požadavků." rewards: - name: "&f&l Odměny" - description: "&7 Zobrazit vlastnosti odměn." + name: "Odměny" + description: "Zobrazit vlastnosti odměn." deployed: - name: "&f&l Nasazení" + name: "Nasazení" description: |- - &7 Přepnout, pokud je výzva - &7 nasazeno a uživatelé mohou - &7 dokončit. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Přepnout, pokud je výzva + nasazeno a uživatelé mohou + dokončit. + enabled: "Povoleno" + disabled: "Zakázáno" name: - name: "&f&l Jméno" + name: "Jméno" description: |- - &7 Umožňuje změnu - &7 zobrazovaný název. - value: "&7 Aktuálně: &r [name]" + Umožňuje změnu + zobrazovaný název. + value: "Aktuálně: [name]" remove_on_complete: - name: "&f&l Skrýt po dokončení" + name: "Skrýt po dokončení" description: |- - &7 Přepnout, pokud má být výzva - &7 poté skryto před hráčem - &7 je hotovo. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Přepnout, pokud má být výzva + poté skryto před hráčem + je hotovo. + enabled: "Povoleno" + disabled: "Zakázáno" description: - name: "&f&l Popis" + name: "Popis" description: |- - &7 Konkrétní popis - &7 za výzvu. Barva - Musí na něj být použity kódy &7. - value: "&7 Aktuální popis:" + Konkrétní popis + za výzvu. Barva + Musí na něj být použity kódy . + value: "Aktuální popis:" environment: - name: "&f&l rozměr" + name: "rozměr" description: |- - &7 Umožňuje omezit ve kterém - &7 rozměr výzvy - &7 lze dokončit. - enabled: "&2" - disabled: "&C" + Umožňuje omezit ve kterém + rozměr výzvy + lze dokončit. + enabled: "" + disabled: "" order: - name: "&f&l Objednávka" - description: |- - &7 Umožňuje změnit pořadí - &7 objektů. - &7 Objekty se stejnými čísly - &7 bude objednáno jejich - &7 jedinečných ID jmen. - value: "&7 Aktuální objednávka: &e [number]" + name: "Objednávka" + description: |- + Umožňuje změnit pořadí + objektů. + Objekty se stejnými čísly + bude objednáno jejich + jedinečných ID jmen. + value: "Aktuální objednávka: [number]" icon: - name: Ikona &f&l + name: Ikona description: |- - &7 Umožňuje změnit ikonu - &7 pro tuto výzvu. + Umožňuje změnit ikonu + pro tuto výzvu. locked_icon: - name: "&f&l Ikona uzamčení" + name: "Ikona uzamčení" description: |- - &7 Umožňuje změnit uzamčeno - Ikona úrovně &7. + Umožňuje změnit uzamčeno + Ikona úrovně . required_permissions: - name: "&f&l Požadovaná oprávnění" - description: |- - &7 Umožňuje požadovanou změnu - &7 oprávnění pro toto - &7 výzva k dokončení. - title: "&7 Oprávnění: " - permission: " &8 – [permission]" - none: "&7 Oprávnění nejsou nastavena." + name: "Požadovaná oprávnění" + description: |- + Umožňuje požadovanou změnu + oprávnění pro toto + výzva k dokončení. + title: "Oprávnění: " + permission: " – [permission]" + none: "Oprávnění nejsou nastavena." remove_entities: - name: "&f&l Odebrat entity" - description: |- - &7 Umožňuje přepínat, pokud - &7 požadovaných subjektů - &7 být odstraněn ze světa - &7 po dokončení - &7 výzva. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Odebrat entity" + description: |- + Umožňuje přepínat, pokud + požadovaných subjektů + být odstraněn ze světa + po dokončení + výzva. + enabled: "Povoleno" + disabled: "Zakázáno" required_entities: - name: "&f&l Požadované entity" - description: |- - &7 Umožňuje požadovanou změnu - &7 subjektů za to - &7 výzva k dokončení. - title: "&7 entity: " - list: " &8 - [number] x [entity]" - none: "&7 Entity nejsou přidány." + name: "Požadované entity" + description: |- + Umožňuje požadovanou změnu + subjektů za to + výzva k dokončení. + title: "entity: " + list: " - [number] x [entity]" + none: "Entity nejsou přidány." remove_blocks: - name: "&f&l Odebrat bloky" - description: |- - &7 Umožňuje přepínat, pokud - &7 požadovaných bloků bude - &7 být odstraněn ze světa - &7 po dokončení - &7 výzva. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Odebrat bloky" + description: |- + Umožňuje přepínat, pokud + požadovaných bloků bude + být odstraněn ze světa + po dokončení + výzva. + enabled: "Povoleno" + disabled: "Zakázáno" required_blocks: - name: "&f&l Požadované bloky" - description: |- - &7 Umožňuje požadovanou změnu - K tomu &7 bloků - &7 výzva k dokončení. - title: "&7 bloků: " - list: " &8 - [number] x [block]" - none: "&7 Bloky nejsou přidány." + name: "Požadované bloky" + description: |- + Umožňuje požadovanou změnu + K tomu bloků + výzva k dokončení. + title: "bloků: " + list: " - [number] x [block]" + none: "Bloky nejsou přidány." search_radius: - name: "&f&l Poloměr hledání" + name: "Poloměr hledání" description: |- - &7 Umožňuje změnit poloměr - &7 kolem hráče, ze kterého - &7 bloků a/nebo entit - &7 zjištěno. - value: "&7 Aktuální vzdálenost: &e [number]" + Umožňuje změnit poloměr + kolem hráče, ze kterého + bloků a/nebo entit + zjištěno. + value: "Aktuální vzdálenost: [number]" remove_items: - name: "&f&l Odebrat položky" - description: |- - &7 Umožňuje přepínat, pokud - &7 požadovaných položek bude - &7 být odstraněn z inventáře - &7 po dokončení - &7 výzva. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Odebrat položky" + description: |- + Umožňuje přepínat, pokud + požadovaných položek bude + být odstraněn z inventáře + po dokončení + výzva. + enabled: "Povoleno" + disabled: "Zakázáno" required_items: - name: "&f&l Požadované položky" - description: |- - &7 Umožňuje požadovanou změnu - &7 položek k tomu - &7 výzva k dokončení. - title: "&7 položek: " - list: " &8 - [number] x [item]" - none: "&7 Itemy nejsou přidány." + name: "Požadované položky" + description: |- + Umožňuje požadovanou změnu + položek k tomu + výzva k dokončení. + title: "položek: " + list: " - [number] x [item]" + none: "Itemy nejsou přidány." add_ignored_meta: - name: "&f&l Přidat Ignorovat metadata" - description: |- - &7 Umožňuje přidat které - &7 položky by měly být ignorovány - &7 jakákoli metadata, která - Je jim přiřazen &7. - title: "&7 Itemy: " - list: " &8 - [number] x [item]" - none: "&7 Položky nejsou přidány." + name: "Přidat Ignorovat metadata" + description: |- + Umožňuje přidat které + položky by měly být ignorovány + jakákoli metadata, která + Je jim přiřazen . + title: "Itemy: " + list: " - [number] x [item]" + none: "Položky nejsou přidány." remove_ignored_meta: - name: "&f&l Odebrat Ignorovat metadata" + name: "Odebrat Ignorovat metadata" description: |- - &7 Umožňuje odstranit které - &7 položky by měly být ignorovány - &7 jakákoli metadata, která - Je jim přiřazen &7. + Umožňuje odstranit které + položky by měly být ignorovány + jakákoli metadata, která + Je jim přiřazen . remove_experience: - name: "&f&l Odebrat zážitek" - description: |- - &7 Umožňuje přepínat, pokud - &7 požadované zkušenosti budou - &7 být odstraněn z přehrávače - &7 po dokončení - &7 výzva. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Odebrat zážitek" + description: |- + Umožňuje přepínat, pokud + požadované zkušenosti budou + být odstraněn z přehrávače + po dokončení + výzva. + enabled: "Povoleno" + disabled: "Zakázáno" required_experience: - name: "&f&l Požadované zkušenosti" + name: "Požadované zkušenosti" description: |- - &7 Umožňuje změnit - &7 požadované zkušenosti pro - &7 přehrávač. - value: "&7 Aktuální zkušenost: &e [number]" + Umožňuje změnit + požadované zkušenosti pro + přehrávač. + value: "Aktuální zkušenost: [number]" required_level: - name: "&f&l Požadovaná úroveň ostrova" + name: "Požadovaná úroveň ostrova" description: |- - &7 Umožňuje změnit - &7 požadovaná úroveň ostrova - &7 za výzvu. - value: "&7 Aktuální úroveň: &e [number]" + Umožňuje změnit + požadovaná úroveň ostrova + za výzvu. + value: "Aktuální úroveň: [number]" remove_money: - name: "&f&l Odebrat peníze" - description: |- - &7 Umožňuje přepínat, pokud - &7 požadované peníze budou - &7 být odstraněn z přehrávače - &7 účet po dokončení - &7 výzva. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Odebrat peníze" + description: |- + Umožňuje přepínat, pokud + požadované peníze budou + být odstraněn z přehrávače + účet po dokončení + výzva. + enabled: "Povoleno" + disabled: "Zakázáno" required_money: - name: "&f&l Požadované peníze" + name: "Požadované peníze" description: |- - &7 Umožňuje změnit - &7 vyžaduje od hráče peníze - &7 odpovídá za výzvu. - value: "&7 Aktuální hodnota: &e [number]" + Umožňuje změnit + vyžaduje od hráče peníze + odpovídá za výzvu. + value: "Aktuální hodnota: [number]" statistic: - name: "&f&l Statistika" + name: "Statistika" description: |- - &7 Umožňuje změnit - Typ statistiky &7 - &7 se zapsal do této výzvy. - value: "&7 Aktuální hodnota: &e [statistic]" + Umožňuje změnit + Typ statistiky + se zapsal do této výzvy. + value: "Aktuální hodnota: [statistic]" statistic_amount: - name: "&f&l Cílová hodnota" + name: "Cílová hodnota" description: |- - &7 Umožňuje změnit - &7 statistická cílová hodnota - &7, které musí být splněny. - value: "&7 Aktuální hodnota: &e [number]" + Umožňuje změnit + statistická cílová hodnota + , které musí být splněny. + value: "Aktuální hodnota: [number]" remove_statistic: - name: "&f&l Snížit statistiku" - description: |- - &7 Umožňuje přepínat, pokud - &7 statistická hodnota bude - &7 se po dokončení sníží - &7 výzva. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Snížit statistiku" + description: |- + Umožňuje přepínat, pokud + statistická hodnota bude + se po dokončení sníží + výzva. + enabled: "Povoleno" + disabled: "Zakázáno" statistic_blocks: - name: "&f&l Cílový blok" + name: "Cílový blok" description: |- - &7 Umožňuje změnit - &7 statistický cílový blok. - value: "&7 Aktuální blok: &e [block]" + Umožňuje změnit + statistický cílový blok. + value: "Aktuální blok: [block]" statistic_items: - name: "&f&l Cílová položka" + name: "Cílová položka" description: |- - &7 Umožňuje změnit - &7 statistická cílová položka. - value: "&7 Aktuální položka: &e [item]" + Umožňuje změnit + statistická cílová položka. + value: "Aktuální položka: [item]" statistic_entities: - name: "&f&l Cílová entita" + name: "Cílová entita" description: |- - &7 Umožňuje změnit - &7 statistická cílová entita. - value: "&7 Aktuální entita: &e [entity]" + Umožňuje změnit + statistická cílová entita. + value: "Aktuální entita: [entity]" reward_text: - name: "&f&l Text odměny" + name: "Text odměny" description: |- - &7 Konkrétní text odměny. - &7 Kódy barev musí být - &7 se na něj vztahovalo. - value: "&7 Aktuální text:" + Konkrétní text odměny. + Kódy barev musí být + se na něj vztahovalo. + value: "Aktuální text:" repeat_reward_text: - name: "&f&l Opakovat text odměny" + name: "Opakovat text odměny" description: |- - &7 Specifický text odměny za opakování - &7 za výzvu. Barva - Musí na něj být použity kódy &7. - value: "&7 Aktuální text:" + Specifický text odměny za opakování + za výzvu. Barva + Musí na něj být použity kódy . + value: "Aktuální text:" reward_items: - name: "&f&l Odměnové položky" + name: "Odměnové položky" description: |- - &7 Umožňuje změnit odměnu - &7 položek. - title: "&7 položek: " - list: " &8 - [number] x [item]" - none: "&7 Položky nejsou přidány." + Umožňuje změnit odměnu + položek. + title: "položek: " + list: " - [number] x [item]" + none: "Položky nejsou přidány." repeat_reward_items: - name: "&f&l Opakovat položky odměn" - description: |- - &7 Umožňuje změnit opakování - &7 odměn za to - &7 výzva. - title: "&7 Itemy: " - list: " &8 - [number] x [item]" - none: "&7 Položky nejsou přidány." + name: "Opakovat položky odměn" + description: |- + Umožňuje změnit opakování + odměn za to + výzva. + title: "Itemy: " + list: " - [number] x [item]" + none: "Položky nejsou přidány." reward_experience: - name: "&f&l Zkušenosti s odměnou" + name: "Zkušenosti s odměnou" description: |- - &7 Umožňuje změnit - &7 zkušenost s odměnou za - &7 přehrávač. - value: "&7 Zkušenosti s odměnou: &e [number]" + Umožňuje změnit + zkušenost s odměnou za + přehrávač. + value: "Zkušenosti s odměnou: [number]" repeat_reward_experience: - name: "&f&l Opakovat odměnu" + name: "Opakovat odměnu" description: |- - &7 Umožňuje změnit - &7 opakování odměny - &7 pro hráče. - value: "&7 Zkušenosti s odměnou: &e [number]" + Umožňuje změnit + opakování odměny + pro hráče. + value: "Zkušenosti s odměnou: [number]" reward_money: - name: "&f&l Odměna" + name: "Odměna" description: |- - &7 Umožňuje změnit - &7 peníze na odměnu. - value: "&7 Aktuální hodnota: &e [number]" + Umožňuje změnit + peníze na odměnu. + value: "Aktuální hodnota: [number]" repeat_reward_money: - name: "&f&l Opakovat odměnu" + name: "Opakovat odměnu" description: |- - &7 Umožňuje změnit - &7 opakování peněz za odměnu - &7 za výzvu. - value: "&7 Aktuální hodnota: &e [number]" + Umožňuje změnit + opakování peněz za odměnu + za výzvu. + value: "Aktuální hodnota: [number]" reward_commands: - name: "&f&l Příkazy odměny" - description: |- - &7 Konkrétní příkazy k odměně. - &8 Tip: - &8 Příkaz nevyžaduje - &8 zapsat jako první `/` - &8 se použije automaticky. - &8 Ve výchozím nastavení budou příkazy - &8 spuštěný serverem. Však - &8 přidání „[SELF]“ na začátku - &8 umožní příkaz být - &8 provedená hráčem. To také - &8 podporuje jeden zástupný symbol - &8 `[player]` to bude - &8 nahrazeno jménem hráče - &8, kteří dokončili výzvu. - value: "&7 Aktuální příkazy:" + name: "Příkazy odměny" + description: |- + Konkrétní příkazy k odměně. + Tip: + Příkaz nevyžaduje + zapsat jako první `/` + se použije automaticky. + Ve výchozím nastavení budou příkazy + spuštěný serverem. Však + přidání „[SELF]“ na začátku + umožní příkaz být + provedená hráčem. To také + podporuje jeden zástupný symbol + `[player]` to bude + nahrazeno jménem hráče + , kteří dokončili výzvu. + value: "Aktuální příkazy:" repeat_reward_commands: - name: "&f&l Opakovat příkazy odměny" - description: |- - &7 Konkrétní opakovací odměna - &7 příkazů pro výzvu. - &8 Tip: - &8 Příkaz nevyžaduje - &8 zapsat jako první `/` - &8 se použije automaticky. - &8 Ve výchozím nastavení budou příkazy - &8 spuštěný serverem. Však - &8 přidání „[SELF]“ na začátku - &8 umožní příkaz být - &8 provedená hráčem. To také - &8 podporuje jeden zástupný symbol - &8 `[player]` to bude - &8 nahrazeno jménem hráče - &8, kteří dokončili výzvu. - value: "&7 Aktuální příkazy:" + name: "Opakovat příkazy odměny" + description: |- + Konkrétní opakovací odměna + příkazů pro výzvu. + Tip: + Příkaz nevyžaduje + zapsat jako první `/` + se použije automaticky. + Ve výchozím nastavení budou příkazy + spuštěný serverem. Však + přidání „[SELF]“ na začátku + umožní příkaz být + provedená hráčem. To také + podporuje jeden zástupný symbol + `[player]` to bude + nahrazeno jménem hráče + , kteří dokončili výzvu. + value: "Aktuální příkazy:" repeatable: - name: "&f&l Opakovatelné" + name: "Opakovatelné" description: |- - &7 Umožňuje přepínat, pokud - &7 výzvou je - &7 opakovatelné. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Umožňuje přepínat, pokud + výzvou je + opakovatelné. + enabled: "Povoleno" + disabled: "Zakázáno" repeat_count: - name: "&f&l Počet opakování" + name: "Počet opakování" description: |- - &7 Umožňuje změnit - &7 počet opakování - &7 za výzvu. - value: "&7 Aktuální hodnota: &e [number]" + Umožňuje změnit + počet opakování + za výzvu. + value: "Aktuální hodnota: [number]" cool_down: - name: "&f&l Vychladnout" - description: |- - &7 Umožňuje změnit - &7 vychladnout sekund, že - Mezi tím je třeba počkat na &7 - &7 opakovatelná výzva - &7 dokončení. - value: "&7 Aktuální hodnota: &e [time]" + name: "Vychladnout" + description: |- + Umožňuje změnit + vychladnout sekund, že + Mezi tím je třeba počkat na + opakovatelná výzva + dokončení. + value: "Aktuální hodnota: [time]" challenges: - name: "&f&l Výzvy" + name: "Výzvy" description: |- - &7 Zobrazit přiřazené výzvy - &7 na úroveň. + Zobrazit přiřazené výzvy + na úroveň. waiver_amount: - name: "&f&l Částka prominutí" + name: "Částka prominutí" description: |- - &7 Umožňuje nastavit číslo - &7 výzev, které mohou - &7 bude ponecháno nevyplněno pro - &7 odemknutí další úrovně. - value: "&7 Aktuální hodnota: &e [number]" + Umožňuje nastavit číslo + výzev, které mohou + bude ponecháno nevyplněno pro + odemknutí další úrovně. + value: "Aktuální hodnota: [number]" add_challenges: - name: "&f&l Přidat výzvu(-y)" + name: "Přidat výzvu(-y)" description: |- - &7 Umožňuje vybrat a - &7 přidává výzvy k - &7 úroveň. + Umožňuje vybrat a + přidává výzvy k + úroveň. remove_challenges: - name: "&f&l Odstranit výzvy" + name: "Odstranit výzvy" description: |- - &7 Umožňuje vybrat a - &7 odstranit výzvy k - &7 úroveň. + Umožňuje vybrat a + odstranit výzvy k + úroveň. reset_on_new: - name: "&f&l Resetovat na Nový" - description: |- - &7 Umožňuje přepínat, pokud - &7 výzvy by měly být - &7 se resetuje, když uživatel odejde - &7 ostrov nebo vytvoří nový - Ostrov &7. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Resetovat na Nový" + description: |- + Umožňuje přepínat, pokud + výzvy by měly být + se resetuje, když uživatel odejde + ostrov nebo vytvoří nový + Ostrov . + enabled: "Povoleno" + disabled: "Zakázáno" broadcast: - name: "&f&l Vysílat" + name: "Vysílat" description: |- - &7 Vysílá výzva a - První dokončení úrovně &7 - &7 všem. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Vysílá výzva a + První dokončení úrovně + všem. + enabled: "Povoleno" + disabled: "Zakázáno" remove_completed: - name: "&f&l Skrýt dokončené" + name: "Skrýt dokončené" description: |- - &7 Skryje dokončené výzvy - &7 z nabídky. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Skryje dokončené výzvy + z nabídky. + enabled: "Povoleno" + disabled: "Zakázáno" glow_completed: - name: "&f&l Záře dokončena" + name: "Záře dokončena" description: |- - &7 Přidá okouzlující záři - &7 k dokončeným výzvám. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Přidá okouzlující záři + k dokončeným výzvám. + enabled: "Povoleno" + disabled: "Zakázáno" store_history: - name: "&f&l Historie obchodu" - description: |- - &7 Ukládá interní historii - &7, když je každá výzva - &7 dokončeno. - &7 Aktuálně pouze k zobrazení - &7 v databázi. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Historie obchodu" + description: |- + Ukládá interní historii + , když je každá výzva + dokončeno. + Aktuálně pouze k zobrazení + v databázi. + enabled: "Povoleno" + disabled: "Zakázáno" data_per_island: - name: "&f&l Obchod na ostrově" - description: |- - &7 Uloží dokončené - &7 výzev na ostrov. - &7 Průběh bude sdílen - &7 se všemi hráči v týmu. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Obchod na ostrově" + description: |- + Uloží dokončené + výzev na ostrov. + Průběh bude sdílen + se všemi hráči v týmu. + enabled: "Povoleno" + disabled: "Zakázáno" show_title: - name: "&f&l Zobrazit název" + name: "Zobrazit název" description: |- - &7 Zobrazí název, když a - &7 výzva nebo úroveň - &7 je dokončena. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + Zobrazí název, když a + výzva nebo úroveň + je dokončena. + enabled: "Povoleno" + disabled: "Zakázáno" gamemode_gui: - name: "&f&l GUI pro výběr herního režimu" - description: |- - &7 Povolí jediné GUI - &7 je k dispozici přes /challenges - příkaz &7. - &c Vyžaduje restart serveru. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "GUI pro výběr herního režimu" + description: |- + Povolí jediné GUI + je k dispozici přes /challenges + příkaz . + Vyžaduje restart serveru. + enabled: "Povoleno" + disabled: "Zakázáno" locked_level_icon: - name: "&f&l Výchozí ikona uzamčené úrovně" + name: "Výchozí ikona uzamčené úrovně" description: |- - &7 Výchozí ikona pro všechny uzamčené - &7 úrovní. Každá úroveň se může změnit - &7 této ikony. + Výchozí ikona pro všechny uzamčené + úrovní. Každá úroveň se může změnit + této ikony. purge_history: - name: "&f&l Životnost historie" - description: |- - &7 Počet dní, jak dlouho - &7 data historie jsou uložena - &7 v uživatelských datech. - &7 0 znamená, že data budou - &7 nelze odstranit. - value: "&7 Aktuální hodnota: &e [number]" + name: "Životnost historie" + description: |- + Počet dní, jak dlouho + data historie jsou uložena + v uživatelských datech. + 0 znamená, že data budou + nelze odstranit. + value: "Aktuální hodnota: [number]" title_showtime: - name: "&f&l Název Showtime" + name: "Název Showtime" description: |- - &7 Počet zaškrtnutí tohoto titulu - &7 se zobrazí přehrávači. - value: "&7 Aktuální hodnota: &e [number]" + Počet zaškrtnutí tohoto titulu + se zobrazí přehrávači. + value: "Aktuální hodnota: [number]" active_world_list: - name: "&f&l Zobrazit pouze aktivní svět" - description: |- - &7 Pokud GUI pro výběr herního režimu - &7 je povoleno, může se přepínat - &7, pokud GUI zobrazuje výběr GameMode - &7 aneb výzvy pro současný svět. - &c Vyžaduje restart serveru. - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Zobrazit pouze aktivní svět" + description: |- + Pokud GUI pro výběr herního režimu + je povoleno, může se přepínat + , pokud GUI zobrazuje výběr GameMode + aneb výzvy pro současný svět. + Vyžaduje restart serveru. + enabled: "Povoleno" + disabled: "Zakázáno" visibility_mode: - name: "&f&l Režim viditelnosti" + name: "Režim viditelnosti" description: |- - &7 Režim viditelnosti pro - &7 výzev, které jsou - &7 skrytý. - enabled: "&2" - disabled: "&C" + Režim viditelnosti pro + výzev, které jsou + skrytý. + enabled: "" + disabled: "" visible: Zobrazit viditelné výzvy hidden: Zobrazit všechny výzvy toggleable: Povolit přepínání include_undeployed: - name: "&f&l Zahrnout nenasazené výzvy" - description: "&7 Označuje, zda není rozmístěno \n&7 výzvy by měly být \n&7 - se počítá do úrovně \n&7 dokončení." - enabled: "&2 Povoleno" - disabled: "&c Zakázáno" + name: "Zahrnout nenasazené výzvy" + description: "Označuje, zda není rozmístěno \nvýzvy by měly být \n + se počítá do úrovně \ndokončení." + enabled: "Povoleno" + disabled: "Zakázáno" download: - name: "&f&l Stáhnout knihovny" + name: "Stáhnout knihovny" description: |- - &7 K dispozici je ruční aktualizace - &7 vyzývá knihovny. - enabled: "&2 S vymazáním mezipaměti" - disabled: "&c Bez vymazání mezipaměti" + K dispozici je ruční aktualizace + vyzývá knihovny. + enabled: "S vymazáním mezipaměti" + disabled: "Bez vymazání mezipaměti" player: - name: "&f&l [name]" - description: "&7 Vlastník ostrova: [owner]" - members: "&7 Island Members:" - member: "&8 - [name]" + name: "[name]" + description: "Vlastník ostrova: [owner]" + members: "Island Members:" + member: "- [name]" no-island: |- - &c Hráč nemá - &c ostrov. + Hráč nemá + ostrov. player_list: - name: "&f&l Vyberte seznam uživatelů" + name: "Vyberte seznam uživatelů" description: |- - &7 Vyberte seznam uživatelů - Mělo by se zobrazit &7. - enabled: "&2" - disabled: "&C" + Vyberte seznam uživatelů + Mělo by se zobrazit . + enabled: "" + disabled: "" online: Online hráči with_island: Hráči s ostrovy in_world: Hráči ve světě add_block: - name: "&f&l Přidat blok" + name: "Přidat blok" description: |- - &7 Umožňuje přidat nový - &7 blokovat do seznamu. + Umožňuje přidat nový + blokovat do seznamu. remove_block: - name: "&f&l Odebrat blok" + name: "Odebrat blok" description: |- - &7 Umožňuje odstranit - &7 vybraných bloků - &7 ze seznamů. - title: "&7 Vybrané materiály:" - material: "&8 - [material]" + Umožňuje odstranit + vybraných bloků + ze seznamů. + title: "Vybrané materiály:" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 ID materiálu: [id]" - selected: "&2 Vybráno" + name: "[material]" + description: "ID materiálu: [id]" + selected: "Vybráno" add_entity: - name: "&f&l Přidat entitu" + name: "Přidat entitu" description: |- - &7 Umožňuje přidat nový - &7 entity do seznamu. + Umožňuje přidat nový + entity do seznamu. switch_entity: - name: "&f&l Přepnout vejce" + name: "Přepnout vejce" description: |- - &7 Umožňuje přepnout z - &7 vajec do hlav davů. + Umožňuje přepnout z + vajec do hlav davů. remove_entity: - name: "&f&l Odebrat entitu" + name: "Odebrat entitu" description: |- - &7 Umožňuje odstranit - &7 vybraných subjektů - &7 ze seznamů. - title: "&7 vybrané entity:" - entity: "&8 - [entity]" + Umožňuje odstranit + vybraných subjektů + ze seznamů. + title: "vybrané entity:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 ID entity: [id]" - selected: "&2 Vybráno" + name: "[entity]" + description: "ID entity: [id]" + selected: "Vybráno" inventory_type: - name: "&f&l Typ inventáře" + name: "Typ inventáře" description: |- - &7 Výzva, která kontroluje - &7 položek v inventáři hráče + Výzva, která kontroluje + položek v inventáři hráče island_type: - name: "&f&l Typ ostrova" + name: "Typ ostrova" description: |- - &7 Výzva, která kontroluje - &7 bloků nebo entit kolem - Hráč &7. + Výzva, která kontroluje + bloků nebo entit kolem + Hráč . other_type: - name: "&f&l Jiný typ" + name: "Jiný typ" description: |- - &7 Výzva, která využívá - &7 pluginy nebo doplňky, - &7 jako úroveň a peníze. + Výzva, která využívá + pluginy nebo doplňky, + jako úroveň a peníze. statistic_type: - name: "&f&l Typ statistiky" + name: "Typ statistiky" description: |- - &7 Výzva, která kontroluje - Statistika hráče &7. + Výzva, která kontroluje + Statistika hráče . save: - name: "&f&l Uložit" + name: "Uložit" description: |- - &7 Uloží změny a - &7 se vrací. + Uloží změny a + se vrací. cancel: - name: "&f&l Zrušit" + name: "Zrušit" description: |- - &7 Zahodí změny a - &7 se vrací. + Zahodí změny a + se vrací. accept_selected: - name: "&f&l Přijmout vybrané" + name: "Přijmout vybrané" description: |- - &7 Vrátí vybrané prvky - &7 a otevře předchozí GUI. - title: "&7 Vybráno: " - element: "&8 - [element]" + Vrátí vybrané prvky + a otevře předchozí GUI. + title: "Vybráno: " + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Hledat" + name: "Hledat" description: |- - &7 Umožňuje vyhledávat - &7 prvek se vstupem - textová hodnota &7. - search: "&b Hodnota: [value]" + Umožňuje vyhledávat + prvek se vstupem + textová hodnota . + search: "Hodnota: [value]" tips: - click-to-select: "&e Klepnutím na &7 vyberte." - click-to-choose: "&e Klepnutím na &7 vyberte." - click-to-complete: "&e Dokončete kliknutím na &7." - right-click-multiple-open: "&e Klikněte pravým tlačítkem na &7 pro výběr počtu + click-to-select: "Klepnutím na vyberte." + click-to-choose: "Klepnutím na vyberte." + click-to-complete: "Dokončete kliknutím na ." + right-click-multiple-open: "Klikněte pravým tlačítkem na pro výběr počtu dokončení." - shift-left-click-to-complete-all: "&e Shift Klepnutím na &7 vše dokončíte." - left-click-to-accept: "&e Klikněte levým tlačítkem &7 pro dokončení." - right-click-to-write: "&e Klikněte pravým tlačítkem na &7 pro psaní." - click-to-reduce: "&e Klikněte na &7 pro zmenšení." - click-to-increase: "&e Klikněte na &7 pro zvýšení." - click-to-return: "&e Klepnutím na &7 se vrátíte." - click-to-quit: "&e Klikněte na &7 pro ukončení." - click-to-wipe: "&e Klepnutím na &7 vymažete." - left-click-to-wipe: "&e Levým kliknutím &7 vymažete." - right-click-to-switch: "&e Klepnutím pravým tlačítkem na &7 přepnete." - click-to-open: "&e Klepnutím na &7 otevřete." - click-to-export: "&e Klepnutím na &7 exportujte." - click-to-create: "&e Klepnutím na &7 vytvořte." - left-click-to-open: "&e Levým tlačítkem otevřete &7." - right-click-to-reset-all: "&e Klikněte pravým tlačítkem na &7 pro vymazání všech." - click-to-toggle: "&e Klepnutím na &7 přepnete." - click-to-change: "&e Klikněte na &7 pro změnu." - shift-click-to-reset: "&e Shift Klepnutím na &7 resetujete." - click-to-add: "&e Klepnutím na &7 přidejte." - click-to-remove: "&e Klikni &7 pro odebrání." - left-click-to-cycle: "&e Levým kliknutím &7 přejdete dolů." - right-click-to-cycle: "&e Klikněte pravým tlačítkem na &7 pro přechod nahoru." - click-to-edit: "&e Klikni &7 pro editaci." - left-click-to-download: "&e Klikněte levým tlačítkem &7 pro stažení." - right-click-to-toggle: "&e Klepnutím pravým tlačítkem &7 přepnete." - click-to-install: "&e Klikni &7 pro instalaci." - click-to-reset-all: "&e klikni &7 pro resetování všeho." - right-click-to-select: "&e Klikni pravým tlačítkem na &7 pro výběr." - right-click-to-deselect: "&e Klikněte pravým tlačítkem na &7 pro zrušení výběru." - left-click-to-choose: "&e Levým tlačítkem vyberte &7." - click-to-cancel: "&e Klepnutím na &7 zrušíte." - click-to-save: "&e Klepnutím na &7 uložíte." - click-to-deselect: "&e Klepnutím na &7 zrušíte výběr." + shift-left-click-to-complete-all: "Shift Klepnutím na vše dokončíte." + left-click-to-accept: "Klikněte levým tlačítkem pro dokončení." + right-click-to-write: "Klikněte pravým tlačítkem na pro psaní." + click-to-reduce: "Klikněte na pro zmenšení." + click-to-increase: "Klikněte na pro zvýšení." + click-to-return: "Klepnutím na se vrátíte." + click-to-quit: "Klikněte na pro ukončení." + click-to-wipe: "Klepnutím na vymažete." + left-click-to-wipe: "Levým kliknutím vymažete." + right-click-to-switch: "Klepnutím pravým tlačítkem na přepnete." + click-to-open: "Klepnutím na otevřete." + click-to-export: "Klepnutím na exportujte." + click-to-create: "Klepnutím na vytvořte." + left-click-to-open: "Levým tlačítkem otevřete ." + right-click-to-reset-all: "Klikněte pravým tlačítkem na pro vymazání všech." + click-to-toggle: "Klepnutím na přepnete." + click-to-change: "Klikněte na pro změnu." + shift-click-to-reset: "Shift Klepnutím na resetujete." + click-to-add: "Klepnutím na přidejte." + click-to-remove: "Klikni pro odebrání." + left-click-to-cycle: "Levým kliknutím přejdete dolů." + right-click-to-cycle: "Klikněte pravým tlačítkem na pro přechod nahoru." + click-to-edit: "Klikni pro editaci." + left-click-to-download: "Klikněte levým tlačítkem pro stažení." + right-click-to-toggle: "Klepnutím pravým tlačítkem přepnete." + click-to-install: "Klikni pro instalaci." + click-to-reset-all: "klikni pro resetování všeho." + right-click-to-select: "Klikni pravým tlačítkem na pro výběr." + right-click-to-deselect: "Klikněte pravým tlačítkem na pro zrušení výběru." + left-click-to-choose: "Levým tlačítkem vyberte ." + click-to-cancel: "Klepnutím na zrušíte." + click-to-save: "Klepnutím na uložíte." + click-to-deselect: "Klepnutím na zrušíte výběr." click-on-item: |- - &e Klikněte na &7 na položku v - &7 váš inventář. - left-click-to-edit: "&e Levým tlačítkem myši &7 upravíte." - right-click-to-clear: "&e Klikněte pravým tlačítkem na &7 pro vymazání." - click-to-previous: "&e Klepnutím na &7 zobrazíte předchozí stránku." - click-to-next: "&e Klepnutím na &7 zobrazíte další stránku." + Klikněte na na položku v + váš inventář. + left-click-to-edit: "Levým tlačítkem myši upravíte." + right-click-to-clear: "Klikněte pravým tlačítkem na pro vymazání." + click-to-previous: "Klepnutím na zobrazíte předchozí stránku." + click-to-next: "Klepnutím na zobrazíte další stránku." descriptions: challenge: lore: |- @@ -833,16 +833,16 @@ challenges: [requirements] [rewards] status: - completed: "&2&l Dokončeno" - completed-times: "&2 Dokončeno &7&l [number] &r&2 čas(-y)" - completed-times-of: "&2 Dokončeno &7&l [number] &r&2 z &7&l [max] &r&2krát" - completed-times-reached: "&2&l Dokončeno vše &7 [max] &2krát" + completed: "Dokončeno" + completed-times: "Dokončeno [number] čas(-y)" + completed-times-of: "Dokončeno [number] z [max] krát" + completed-times-reached: "Dokončeno vše [max] krát" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Vychladnout: &r&7 [time]" - wait-time: "&c&l Dostupné po: &r&c [time]" + timeout: "Vychladnout: [time]" + wait-time: "Dostupné po: [time]" in-days: "[number] d " in-hours: "[number] h " in-minutes: "[number] min " @@ -852,12 +852,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Omezeno na [environment]" - environment-title: "&7 Omezeno na: " - environment-list: " &7 - &e [environment]" - permission-single: "&c Vyžaduje oprávnění [permission]" - permissions-title: "&c Vyžaduje oprávnění: " - permissions-list: " &c - [permission]" + environment-single: "Omezeno na [environment]" + environment-title: "Omezeno na: " + environment-list: " - [environment]" + permission-single: "Vyžaduje oprávnění [permission]" + permissions-title: "Vyžaduje oprávnění: " + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -865,23 +865,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Požadované bloky:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Požadované entity:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 Ne dále než &e [number] &7 metrů" - warning-block: "&e Bloky budou odstraněny &c" - warning-entity: "&e Entity budou &c odstraněny" + blocks-title: "Požadované bloky:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Požadované entity:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "Ne dále než [number] metrů" + warning-block: "Bloky budou odstraněny " + warning-entity: "Entity budou odstraněny" inventory: lore: |- [items] [warning] - item-title: "&7&l Požadované položky:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e Položky budou odstraněny &c" + item-title: "Požadované položky:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "Položky budou odstraněny " other: lore: |- [experience] @@ -889,34 +889,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Požadovaná zkušenost: &r&e [number]" - experience-warning: "&e Zkušenosti budou &c odstraněny" - money: "&7&l Požadované peníze: &r&e [number]" - money-warning: "&e Peníze budou odebrány &c" - level: "&7&l Požadovaná úroveň ostrova: &r&e [number]" + experience: "Požadovaná zkušenost: [number]" + experience-warning: "Zkušenosti budou odstraněny" + money: "Požadované peníze: [number]" + money-warning: "Peníze budou odebrány " + level: "Požadovaná úroveň ostrova: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Statistická data se sníží &c" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "Statistická data se sníží " rewards: lore: |- - Odměny &7&l: + Odměny : [text] [items] [experience] [money] [commands] - item-title: "&7 Itemy:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Zkušenosti: &r&e [number]" - money: "&7 Peníze: &r&e [number]" - commands-title: "&7 příkazy:" - command: " &7 - &e [command]" + item-title: "Itemy:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Zkušenosti: [number]" + money: "Peníze: [number]" + commands-title: "příkazy:" + command: " - [command]" level: lore: |- [text] @@ -924,179 +924,179 @@ challenges: [waiver] [rewards] status: - completed: "&2&l Dokončeno" + completed: "Dokončeno" completed-challenges-of: |- - &2 Dokončeno &7&l [number] &r&2 z - &7&l [max] &r&2 výzvy. - locked: "&c&l Uzamčeno" + Dokončeno [number] z + [max] výzvy. + locked: "Uzamčeno" missing-challenges: |- - &7 [number] musí být další výzvy - Dokončeno &7 k odemknutí této úrovně. + [number] musí být další výzvy + Dokončeno k odemknutí této úrovně. waiver: |- - &7&l [number] výzva(-y) &r&7 může být - &7 přeskočeno k odemknutí další úrovně. + [number] výzva(-y) může být + přeskočeno k odemknutí další úrovně. rewards: lore: |- - Odměny &7&l: + Odměny : [text] [items] [experience] [money] [commands] - item-title: "&7 Itemy:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Zkušenosti: &r&e [number]" - money: "&7 Peníze: &r&e [number]" - commands-title: "&7 příkazy:" - command: " &7 - &e [command]" + item-title: "Itemy:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Zkušenosti: [number]" + money: "Peníze: [number]" + commands-title: "příkazy:" + command: " - [command]" library: - author: "&7 od &e [autor]" - version: "&7 Made with Challenges &e [version]" - lang: "&7 Jazyk: &e [lang]" - gamemode: "&7 Primární pro &e [gamemode]" + author: "od [autor]" + version: "Made with Challenges [version]" + lang: "Jazyk: [lang]" + gamemode: "Primární pro [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: pravda, na, ano, potvrdit, y, platný, správný deny-string: nepravdivý, vypnutý, ne, popřít, n, neplatný, nesprávný cancel-string: zrušit exit-string: zrušit, odejít, ukončit - cancelled: "&c Konverzace zrušena!" - input-number: "&e Zadejte prosím číslo do chatu." - input-seconds: "&e Zadejte prosím sekundy do chatu." - numeric-only: "&c Daná [value] není číslo!" - not-valid-value: "&c Dané číslo [value] není platné. Musí být větší než [min] + cancelled: "Konverzace zrušena!" + input-number: "Zadejte prosím číslo do chatu." + input-seconds: "Zadejte prosím sekundy do chatu." + numeric-only: "Daná [value] není číslo!" + not-valid-value: "Dané číslo [value] není platné. Musí být větší než [min] a menší než [max]!" - user-data-removed: "&a Všechna uživatelská data pro [gamemode] jsou vymazána + user-data-removed: "Všechna uživatelská data pro [gamemode] jsou vymazána z databáze." - confirm-user-data-deletion: "&e Potvrďte prosím, že chcete vymazat databázi uživatelů + confirm-user-data-deletion: "Potvrďte prosím, že chcete vymazat databázi uživatelů pro [gamemode]." - challenge-data-removed: "&a Všechna data výzev pro [gamemode] jsou vymazána + challenge-data-removed: "Všechna data výzev pro [gamemode] jsou vymazána z databáze." - confirm-challenge-data-deletion: "&e Potvrďte prosím, že chcete vymazat databázi + confirm-challenge-data-deletion: "Potvrďte prosím, že chcete vymazat databázi výzev pro [gamemode]." - all-data-removed: "&a Všechna data doplňků pro [gamemode] jsou vymazána z databáze." - confirm-all-data-deletion: "&e Potvrďte, že chcete vymazat data doplňků pro [herní + all-data-removed: "Všechna data doplňků pro [gamemode] jsou vymazána z databáze." + confirm-all-data-deletion: "Potvrďte, že chcete vymazat data doplňků pro [herní režim]." - write-name: "&e Napiš prosím jméno do chatu." - new-object-created: "&a Je vytvořen nový objekt pro [gamemode]." - object-already-exists: "&c Objekt &7 [id] &c již existuje. Vyberte jiný název." - invalid-challenge: "&c Výzva [challenge] obsahuje neplatná data. Nelze jej nasadit!" - name-changed: "&a Úspěch, název byl aktualizován." - write-description: "&e Zadejte prosím nový popis v chatu a 'konec' na samostatném + write-name: "Napiš prosím jméno do chatu." + new-object-created: "Je vytvořen nový objekt pro [gamemode]." + object-already-exists: "Objekt [id] již existuje. Vyberte jiný název." + invalid-challenge: "Výzva [challenge] obsahuje neplatná data. Nelze jej nasadit!" + name-changed: "Úspěch, název byl aktualizován." + write-description: "Zadejte prosím nový popis v chatu a 'konec' na samostatném řádku pro dokončení." - description-changed: "&a Úspěch, popis byl aktualizován." - write-permissions: "&e Zadejte prosím požadovaná oprávnění, jedno na každý řádek + description-changed: "Úspěch, popis byl aktualizován." + write-permissions: "Zadejte prosím požadovaná oprávnění, jedno na každý řádek v chatu, a dokončete ukončení na samostatném řádku." - permissions-changed: "&a Úspěch, oprávnění k výzvě byla aktualizována." - write-reward-text: "&e Zadejte prosím nový text odměny do chatu a dokončete ho + permissions-changed: "Úspěch, oprávnění k výzvě byla aktualizována." + write-reward-text: "Zadejte prosím nový text odměny do chatu a dokončete ho na samostatném řádku." - reward-text-changed: "&a Úspěch, text odměny byl aktualizován." - write-repeat-reward-text: "&e Zadejte prosím nový opakující se text odměny v chatu + reward-text-changed: "Úspěch, text odměny byl aktualizován." + write-repeat-reward-text: "Zadejte prosím nový opakující se text odměny v chatu a dokončete jej na samostatném řádku." - repeat-reward-text-changed: "&a Úspěch, text opakování odměny byl aktualizován." - write-reward-commands: "&e Zadejte prosím nový příkaz pro odměnu na řádek v chatu + repeat-reward-text-changed: "Úspěch, text opakování odměny byl aktualizován." + write-reward-commands: "Zadejte prosím nový příkaz pro odměnu na řádek v chatu a dokončete jej na samostatném řádku." - reward-commands-changed: "&a Úspěch, příkazy odměn byly aktualizovány." - write-repeat-reward-commands: "&e Zadejte prosím nový příkaz pro opakování odměny + reward-commands-changed: "Úspěch, příkazy odměn byly aktualizovány." + write-repeat-reward-commands: "Zadejte prosím nový příkaz pro opakování odměny na řádek v chatu a dokončete jej na samostatném řádku." - repeat-reward-commands-changed: "&a Úspěch, příkazy k opakování odměny byly aktualizovány." - challenge-removed: "&a Výzvy [challenge] pro [gamemode] jsou odstraněny z databáze." - confirm-challenge-deletion: "&e Potvrďte, že chcete odstranit [challenge] pro [gamemode] + repeat-reward-commands-changed: "Úspěch, příkazy k opakování odměny byly aktualizovány." + challenge-removed: "Výzvy [challenge] pro [gamemode] jsou odstraněny z databáze." + confirm-challenge-deletion: "Potvrďte, že chcete odstranit [challenge] pro [gamemode] z databáze." - level-removed: "&a Úroveň [level] pro [gamemode] je odstraněna z databáze." - confirm-level-deletion: "&e Potvrďte prosím, že chcete odstranit [level] pro + level-removed: "Úroveň [level] pro [gamemode] je odstraněna z databáze." + confirm-level-deletion: "Potvrďte prosím, že chcete odstranit [level] pro [gamemode] z databáze." - start-downloading: "&a Začíná stahování a import knihovny výzev." - written-text: "&a Vstupní text:" - confirm-data-replacement: "&e Potvrďte prosím, že chcete nahradit své stávající + start-downloading: "Začíná stahování a import knihovny výzev." + written-text: "Vstupní text:" + confirm-data-replacement: "Potvrďte prosím, že chcete nahradit své stávající výzvy novými." - new-challenges-imported: "&a Úspěch, byly importovány nové výzvy pro [gamemode]." - exported-file-name: "&e Zadejte prosím název souboru pro exportovaný databázový + new-challenges-imported: "Úspěch, byly importovány nové výzvy pro [gamemode]." + exported-file-name: "Zadejte prosím název souboru pro exportovaný databázový soubor. (pro ukončení napište 'zrušit')" - database-export-completed: "&a Úspěch, export databáze pro [world] je dokončen. + database-export-completed: "Úspěch, export databáze pro [world] je dokončen. Vygenerován soubor [file]." - file-name-exist: "&c Soubor s názvem '[id]' existuje. Nelze jej přepsat." - write-search: "&e Napište prosím hodnotu hledání. (pro ukončení napiš 'cancel')" - search-updated: "&a Hodnota vyhledávání byla aktualizována." + file-name-exist: "Soubor s názvem '[id]' existuje. Nelze jej přepsat." + write-search: "Napište prosím hodnotu hledání. (pro ukončení napiš 'cancel')" + search-updated: "Hodnota vyhledávání byla aktualizována." titles: challenge-title: Úspěšně dokončeno challenge-subtitle: "[friendlyName]" level-title: Úspěšně dokončeno level-subtitle: "[friendlyName]" messages: - completed: "&2 Dokončili jste výzvu [name] pro [player]!" - already-completed: "&2 Tato výzva již byla dokončena!" - reset: "&2 Resetoval jsi výzvu[name] hráči [player]!" - reset-all: "&2 Všechny [player] výzvy byly resetovány!" - not-completed: "&2 Tato výzva ještě není dokončena!" - migrate-start: "&2 Začněte migrovat data doplňků výzev." - migrate-end: Data doplňků &2 Challenges aktualizována na nový formát. - migrate-not: "&2 Všechna data jsou platná." - start-downloading: "&5 Začíná stahování a import knihovny výzev." - you-completed-challenge: "&2Dokončil jsi výzvu [value]&r&2!" - you-repeated-challenge: "&2Zopakoval jsi výzvu [value]&r&2!" - you-repeated-challenge-multiple: "&2Zopakoval jsi výzvu [value] &r&2[count]x!" - you-completed-level: "&2Dokončil jsi úroveň [value]&r&2!" - name-has-completed-challenge: "&5[name] dokončil výzvu [value]&r&5!" - name-has-completed-level: "&5[name] dokončil úroveň [value]&r&5!" + completed: "Dokončili jste výzvu [name] pro [player]!" + already-completed: "Tato výzva již byla dokončena!" + reset: "Resetoval jsi výzvu[name] hráči [player]!" + reset-all: "Všechny [player] výzvy byly resetovány!" + not-completed: "Tato výzva ještě není dokončena!" + migrate-start: "Začněte migrovat data doplňků výzev." + migrate-end: Data doplňků Challenges aktualizována na nový formát. + migrate-not: "Všechna data jsou platná." + start-downloading: "Začíná stahování a import knihovny výzev." + you-completed-challenge: "Dokončil jsi výzvu [value]!" + you-repeated-challenge: "Zopakoval jsi výzvu [value]!" + you-repeated-challenge-multiple: "Zopakoval jsi výzvu [value] [count]x!" + you-completed-level: "Dokončil jsi úroveň [value]!" + name-has-completed-challenge: "[name] dokončil výzvu [value]!" + name-has-completed-level: "[name] dokončil úroveň [value]!" load-skipping: '"[value]" již existuje - přeskakuji' load-overwriting: Přepisuji "[value]" load-add: 'Přidávám nový objekt: [value]' errors: - no-name: "&cChybějící název výzvy" - unknown-challenge: "&cNeznámá výzva" - not-valid-integer: '&cUvedené celé číslo "[value]" je neplatné!|Hodnota by měla + no-name: "Chybějící název výzvy" + unknown-challenge: "Neznámá výzva" + not-valid-integer: 'Uvedené celé číslo "[value]" je neplatné!|Hodnota by měla být mezi [min] a [max].' - not-deployed: "&cVýzva není zveřejněna!" - not-on-island: "&cK tomuto musíš být na svém ostrově!" - challenge-level-not-available: "&cNeodemkl jsi úroveň k dokončení této výzvy." - not-repeatable: "&cTato výzva není opakovatelná!" - wrong-environment: "&cJsi ve špatném prostředí!" - not-enough-items: "&cNemáš dostatek [items] k dokončení této výzvy!" - not-close-enough: "&cMusíš stát alespoň [number] bloků od požadovaných položek." - you-still-need: "&cStále potřebuješ [amount] x [item]" - missing-addon: "&cNelze dokončit výzvu. Vyžadovaný doplňek nebo plugin chybí." - incorrect: "&cNelze dokončit výzvu. Požadavky nejsou správně." - not-enough-money: "&cJe důležité mít [value] na svém účtu k dokončení této výzvy." - not-enough-experience: "&cJe důležité mít [value] zkuš. k dokončení této výzvy." - island-level: "&cÚroveň tvého ostrova musí být [number] k dokončení této výzvy!" - no-load: "&cChyba: Nelze načíst soubor challenges.yml. [message]" - load-error: "&cChyba: Nelze načíst [value]." - no-rank: "&cNa toto nemáš hodnost." - cannot-remove-items: "&cNěkteré předměty nelze odebrat z tvého inventáře!" - exist-challenges-or-levels: "&cVe tvém světě již existují výzvy. Nelze pokračovat!" - no-challenges: "&cVýzvy nejsou v aktuálním světě implementovány!" - no-challenges-admin: "&cVýzvy nejsou v aktuálním světě implementovány! Měl bys - použít &5/[command] &ck jejich přidání!" - missing-arguments: "&cPříkaz postrádá argumenty." - no-multiple-permission: "&cNemáš oprávnění k dokončení výzev vícekrát najednou." - invalid-level: "&c Level [level] obsahuje neplatná data. Nebude načten z databáze!" - invalid-challenge: "&c Challenge [challenge] obsahuje neplatná data. Nebude načtena + not-deployed: "Výzva není zveřejněna!" + not-on-island: "K tomuto musíš být na svém ostrově!" + challenge-level-not-available: "Neodemkl jsi úroveň k dokončení této výzvy." + not-repeatable: "Tato výzva není opakovatelná!" + wrong-environment: "Jsi ve špatném prostředí!" + not-enough-items: "Nemáš dostatek [items] k dokončení této výzvy!" + not-close-enough: "Musíš stát alespoň [number] bloků od požadovaných položek." + you-still-need: "Stále potřebuješ [amount] x [item]" + missing-addon: "Nelze dokončit výzvu. Vyžadovaný doplňek nebo plugin chybí." + incorrect: "Nelze dokončit výzvu. Požadavky nejsou správně." + not-enough-money: "Je důležité mít [value] na svém účtu k dokončení této výzvy." + not-enough-experience: "Je důležité mít [value] zkuš. k dokončení této výzvy." + island-level: "Úroveň tvého ostrova musí být [number] k dokončení této výzvy!" + no-load: "Chyba: Nelze načíst soubor challenges.yml. [message]" + load-error: "Chyba: Nelze načíst [value]." + no-rank: "Na toto nemáš hodnost." + cannot-remove-items: "Některé předměty nelze odebrat z tvého inventáře!" + exist-challenges-or-levels: "Ve tvém světě již existují výzvy. Nelze pokračovat!" + no-challenges: "Výzvy nejsou v aktuálním světě implementovány!" + no-challenges-admin: "Výzvy nejsou v aktuálním světě implementovány! Měl bys + použít /[command] k jejich přidání!" + missing-arguments: "Příkaz postrádá argumenty." + no-multiple-permission: "Nemáš oprávnění k dokončení výzev vícekrát najednou." + invalid-level: "Level [level] obsahuje neplatná data. Nebude načten z databáze!" + invalid-challenge: "Challenge [challenge] obsahuje neplatná data. Nebude načtena z databáze!" - no-library-entries: "&c Nelze najít žádné položky knihovny. Nic k zobrazení." - not-hooked: "&c Výzvy Addon nenašel žádný GameMode." - timeout: "&c Tato výzva vyžaduje mezi dokončeními čekat [timeout]. Musíte + no-library-entries: "Nelze najít žádné položky knihovny. Nic k zobrazení." + not-hooked: "Výzvy Addon nenašel žádný GameMode." + timeout: "Tato výzva vyžaduje mezi dokončeními čekat [timeout]. Musíte počkat [wait-time], než to znovu dokončíte." - requirement-not-met: "&c Tato výzva vyžaduje, aby [statistic] měla [number]. Máte + requirement-not-met: "Tato výzva vyžaduje, aby [statistic] měla [number]. Máte pouze [hodnotu]. " - requirement-not-met-entity: "&c Tato výzva vyžaduje, aby [statistic] [entity] + requirement-not-met-entity: "Tato výzva vyžaduje, aby [statistic] [entity] měla [number]. Máte pouze [hodnotu]. " - requirement-not-met-material: "&c Tato výzva vyžaduje, aby [statistic] [material] + requirement-not-met-material: "Tato výzva vyžaduje, aby [statistic] [material] měl [number]. Máte pouze [hodnotu]. " protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5&oPřepnout, kdo může - &5&odokončit výzvy + Přepnout, kdo může + dokončit výzvy name: Protekce výzev CHALLENGES_WORLD_PROTECTION: description: |- - &5&oToto umožní zapnout/vypnout - &5&opožadavky hráčů - &5&obýt na jejich ostrově - &5&ok dokončení výzvy. + Toto umožní zapnout/vypnout + požadavky hráčů + být na jejich ostrově + k dokončení výzvy. name: Limitace výzev na ostrov hint: Žádné výzvy mimo ostrov version: 11 diff --git a/src/main/resources/locales/de.yml b/src/main/resources/locales/de.yml index bc893777..e6ff5018 100644 --- a/src/main/resources/locales/de.yml +++ b/src/main/resources/locales/de.yml @@ -32,800 +32,800 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0&l Herausforderungsmenü" - gamemode-gui: "&0&l Spielmodus auswählen" - multiple-gui: "&0&l Wie oft?" - admin-gui: "&0&l Herausforderung Admin Menu" - edit-challenge: "&0&l Herausforderung [challenge]" - edit-level: "&0&l Level Bearbeiten [level]" - settings: "&0&l Einstellungen" - choose-challenge: "&0&l Herausforderung wählen" - choose-level: "&0&l Level wählen" - choose-player: "&0&l Spieler wählen" - library: "&0&l Bibliothek" - manage-blocks: "&0&l Blöcke verwalten" - manage-entities: "&0&l Einheiten verwalten" - type-selector: "&0&l Wahl des Herausforderungstyps" - item-selector: "&0&l Item Auswahl" - block-selector: "&0&l Block wählen" - entity-selector: "&0&l Mob wählen" - challenge-selector: "&0&l Herausforderungsauswahl" - statistic-selector: "&0&l Statistik Auswahl" - environment-selector: "&0&l Umgebungs Auswahl" + player-gui: "Herausforderungsmenü" + gamemode-gui: "Spielmodus auswählen" + multiple-gui: "Wie oft?" + admin-gui: "Herausforderung Admin Menu" + edit-challenge: "Herausforderung [challenge]" + edit-level: "Level Bearbeiten [level]" + settings: "Einstellungen" + choose-challenge: "Herausforderung wählen" + choose-level: "Level wählen" + choose-player: "Spieler wählen" + library: "Bibliothek" + manage-blocks: "Blöcke verwalten" + manage-entities: "Einheiten verwalten" + type-selector: "Wahl des Herausforderungstyps" + item-selector: "Item Auswahl" + block-selector: "Block wählen" + entity-selector: "Mob wählen" + challenge-selector: "Herausforderungsauswahl" + statistic-selector: "Statistik Auswahl" + environment-selector: "Umgebungs Auswahl" buttons: free-challenges: - name: "&f&l Kostenlose Herausforderungen" + name: "Kostenlose Herausforderungen" description: |- - &7 Zeigt eine Liste von - &7 kostenlose Herausforderungen + Zeigt eine Liste von + kostenlose Herausforderungen return: - name: "&f&l Zurück" + name: "Zurück" description: |- - &7 Zurück zum vorherigen Menü - &7 oder beenden Sie die GUI + Zurück zum vorherigen Menü + oder beenden Sie die GUI previous: - name: "&f&l Vorherige Seite" - description: "&7 Zur Seite &e [number] &7 wechseln" + name: "Vorherige Seite" + description: "Zur Seite [number] wechseln" next: - name: "&f&l Nächste Seite" - description: "&7 Zur Seite &e [number] &7 wechseln" + name: "Nächste Seite" + description: "Zur Seite [number] wechseln" reduce: - name: "&f&l Verringern" - description: "&7 verringern um &e [Zahl]" + name: "Verringern" + description: "verringern um [Zahl]" increase: - name: "&f&l Erhöhen" - description: "&7 Erhöhen um &e [number]" + name: "Erhöhen" + description: "Erhöhen um [number]" accept: - name: "&f&l Abgeschlossen" + name: "Abgeschlossen" description: |- - &7 Erledige Herausforderung &e [number] - &7 time(-s) + Erledige Herausforderung [number] + time(-s) quit: - name: "&f&l Beenden" - description: "&7 Verlasse die GUI." + name: "Beenden" + description: "Verlasse die GUI." complete_user_challenges: - name: "&f&l Schließe die Benutzerherausforderung(en) ab" + name: "Schließe die Benutzerherausforderung(en) ab" description: |- - &7 Ermöglicht die Auswahl von einem Spieler und - &7 das Abschließen von Herausforderung(en) für - &7 ihn + Ermöglicht die Auswahl von einem Spieler und + das Abschließen von Herausforderung(en) für + ihn reset_user_challenges: - name: "&f&l Benutzerherausforderungen zurücksetzen" + name: "Benutzerherausforderungen zurücksetzen" description: |- - &7 Ermöglicht die Auswahl von einem Spieler und - &7 setzt seine Herausforderungen zurück + Ermöglicht die Auswahl von einem Spieler und + setzt seine Herausforderungen zurück add_challenge: - name: "&f&l Herausforderung erstellen" + name: "Herausforderung erstellen" description: |- - &7 Startet einen Prozess um - &7 einer neue Herausforderung ertellen. + Startet einen Prozess um + einer neue Herausforderung ertellen. add_level: - name: "&f&l Level erstellen" + name: "Level erstellen" description: |- - &7 Startet einen Prozess für - &7 Erstellen eines neuen Level. + Startet einen Prozess für + Erstellen eines neuen Level. edit_challenge: - name: "&f&l Herausforderung bearbeiten" + name: "Herausforderung bearbeiten" description: |- - &7 Ermöglicht die Auswahl und Bearbeitung - &7 eine Herausforderung. + Ermöglicht die Auswahl und Bearbeitung + eine Herausforderung. edit_level: - name: "&f&l Level bearbeiten" + name: "Level bearbeiten" description: |- - &7 Ermöglicht die Auswahl und Bearbeitung - &7 eines Level's. + Ermöglicht die Auswahl und Bearbeitung + eines Level's. delete_challenge: - name: "&f&l Herausforderung löschen" + name: "Herausforderung löschen" description: |- - &7 Ermöglicht das Auswählen und Löschen - &7 eine Herausforderung. + Ermöglicht das Auswählen und Löschen + eine Herausforderung. delete_level: - name: "&f&l Level löschen" + name: "Level löschen" description: |- - &7 Ermöglicht das Auswählen und Löschen - &7 eines Level. + Ermöglicht das Auswählen und Löschen + eines Level. edit_settings: - name: "&f&l Einstellungen" + name: "Einstellungen" description: |- - &7 Ermöglicht das Anzeigen und Bearbeiten der - &7 Add-on-Einstellungen. + Ermöglicht das Anzeigen und Bearbeiten der + Add-on-Einstellungen. complete_wipe: - name: "&f&l Löschen abschließen" + name: "Löschen abschließen" description: |- - &7 Löscht Herausforderungen vollständig - &7 Zusatzdatenbank, einschließlich - &7 Benutzerdaten. + Löscht Herausforderungen vollständig + Zusatzdatenbank, einschließlich + Benutzerdaten. challenge_wipe: - name: "&f&l Herausforderung Löschen" + name: "Herausforderung Löschen" description: |- - &7 Löscht Herausforderungen vollständig - &7 und Level aus der Datenbank. + Löscht Herausforderungen vollständig + und Level aus der Datenbank. user_wipe: - name: "&f&l Benutzerlöschung" + name: "Benutzerlöschung" description: |- - &7 Benutzer vollständig aus der - &7 Datenbank löschen. + Benutzer vollständig aus der + Datenbank löschen. library: - name: "&f&l Bibliothek" + name: "Bibliothek" description: |- - &7 Öffnet eine öffentliche - Bibliothek für &7-Herausforderungen. + Öffnet eine öffentliche + Bibliothek für -Herausforderungen. import_database: - name: "&f&l Datenbank importieren" + name: "Datenbank importieren" description: |- - &7 Ermöglicht den Import von Exportierten - &7 Herausforderungen. + Ermöglicht den Import von Exportierten + Herausforderungen. import_template: - name: "&f&l Vorlage importieren" + name: "Vorlage importieren" description: |- - &7 Ermöglicht das Importieren einer Vorlagen Datei - &7 mit Herausforderungen. + Ermöglicht das Importieren einer Vorlagen Datei + mit Herausforderungen. export_challenges: - name: "&f&l Export der Herausforderungen" + name: "Export der Herausforderungen" description: |- - &7 Ermöglicht den Export der Datenbank - &7 in eine lokale Datei. + Ermöglicht den Export der Datenbank + in eine lokale Datei. properties: - name: "&f&l Eigenschaften" - description: "&7 Alle Haupteigenschaften anzeigen." + name: "Eigenschaften" + description: "Alle Haupteigenschaften anzeigen." requirements: - name: "&f&l Voraussetzungen" - description: "&7 Anforderungseigenschaften anzeigen." + name: "Voraussetzungen" + description: "Anforderungseigenschaften anzeigen." rewards: - name: "&f&l Belohnungen" - description: "&7 Belohnung Eigenschaften anzeigen." + name: "Belohnungen" + description: "Belohnung Eigenschaften anzeigen." deployed: - name: "&f&l Bereitstellung" - description: "&7 Umschalten, wenn Herausforderung \n&7 bereitgestellt ist - und Benutzer sie abschließen\n&7 können." - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Bereitstellung" + description: "Umschalten, wenn Herausforderung \nbereitgestellt ist + und Benutzer sie abschließen\nkönnen." + enabled: "Aktiviert" + disabled: "Deaktiviert" name: - name: "&f&l Name" + name: "Name" description: |- - &7 Änderung erlaubt - &7 der Anzeigename. - value: "&7 Aktuell: &r [name]" + Änderung erlaubt + der Anzeigename. + value: "Aktuell: [name]" remove_on_complete: - name: "&f&l Nach Abschluss ausblenden" + name: "Nach Abschluss ausblenden" description: |- - &7 Umschalten ob Herausforderungen - &7 verborgen werden wenn diese - &7 vom Spieler abgeschlossen wurden. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + Umschalten ob Herausforderungen + verborgen werden wenn diese + vom Spieler abgeschlossen wurden. + enabled: "Aktiviert" + disabled: "Deaktiviert" description: - name: "&f&l Beschreibung" + name: "Beschreibung" description: |- - &7 Die spezifische Beschreibung - &7 für die Herausforderung. Die FarbCodes - &7 müssen darauf angewendet werden. - value: "&7 Aktuelle Beschreibung:" + Die spezifische Beschreibung + für die Herausforderung. Die FarbCodes + müssen darauf angewendet werden. + value: "Aktuelle Beschreibung:" environment: - name: "&f&l Dimension" + name: "Dimension" description: |- - &7 Erlaubt die Limitierung - &7 in welcher Welt Sie die Herausforderung - &7 abgeschlossen werden kann. - enabled: "&2" - disabled: "&c" + Erlaubt die Limitierung + in welcher Welt Sie die Herausforderung + abgeschlossen werden kann. + enabled: "" + disabled: "" order: - name: "&f&l Reihenfolge" - description: |- - &7 Ermöglicht das Ändern der Reihenfolge von - &7 Items. - &7 Items mit gleichen Nummern - &7 werden sortiert nach - &7 eindeutigem ID-Namen. - value: "&7 Aktueller Auftrag: &e [number]" + name: "Reihenfolge" + description: |- + Ermöglicht das Ändern der Reihenfolge von + Items. + Items mit gleichen Nummern + werden sortiert nach + eindeutigem ID-Namen. + value: "Aktueller Auftrag: [number]" icon: - name: "&f&l Icon" + name: "Icon" description: |- - &7 Ermöglicht das Ändern des Symbols - &7 für diese Herausforderung. + Ermöglicht das Ändern des Symbols + für diese Herausforderung. locked_icon: - name: "&f&l Sperrsymbol" + name: "Sperrsymbol" description: |- - &7 Erlaubt Änderung gesperrt - &7 des Level-Symbol. + Erlaubt Änderung gesperrt + des Level-Symbol. required_permissions: - name: "&f&l Erforderliche Berechtigungen" - description: "&7 Änderungserlaubnis erforderlich,\n&7 Berechtigungen welche - benötigt werden damit die \n&7 Herausforderung abgeschlossen werden kann." - title: "&7 Berechtigungen:" - permission: " &8 - [permission]" - none: "&7 Berechtigungen sind nicht gesetzt." + name: "Erforderliche Berechtigungen" + description: "Änderungserlaubnis erforderlich,\nBerechtigungen welche + benötigt werden damit die \nHerausforderung abgeschlossen werden kann." + title: "Berechtigungen:" + permission: " - [permission]" + none: "Berechtigungen sind nicht gesetzt." remove_entities: - name: "&f&l Mobs entfernen" - description: |- - &7 Erlaubt Umschalten ob - &7 erforderliche Mobs - &7 aus der Welt entfernt werden - &7 nach Abschluss der - &7 Herausforderung. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Mobs entfernen" + description: |- + Erlaubt Umschalten ob + erforderliche Mobs + aus der Welt entfernt werden + nach Abschluss der + Herausforderung. + enabled: "Aktiviert" + disabled: "Deaktiviert" required_entities: - name: "&f&l Erforderliche Mobs" - description: |- - &7 Ermöglicht die Änderung der erforderlichen - &7 Mobs, damit diese - &7 Herausforderung abgeschlossen werden kann. - title: "&7 Mobs: " - list: " &8 - [number] x [entity]" - none: "&7 Mobs werden nicht hinzugefügt." + name: "Erforderliche Mobs" + description: |- + Ermöglicht die Änderung der erforderlichen + Mobs, damit diese + Herausforderung abgeschlossen werden kann. + title: "Mobs: " + list: " - [number] x [entity]" + none: "Mobs werden nicht hinzugefügt." remove_blocks: - name: "&f&l Blöcke entfernen" - description: "&7 Ermöglicht das Umschalten, ob\n&7 erforderliche Blöcke\n&7 - aus der Welt entfernt werden\n&7 nach Beendigung \n&7 der Herausforderung" - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Blöcke entfernen" + description: "Ermöglicht das Umschalten, ob\nerforderliche Blöcke\n + aus der Welt entfernt werden\nnach Beendigung \nder Herausforderung" + enabled: "Aktiviert" + disabled: "Deaktiviert" required_blocks: - name: "&f&l Erforderliche Blöcke" - description: |- - &7 Ermöglicht die Änderung der erforderlichen - &7 Blöcke um die - &7 Aufgabe abschließen zu können. - title: "&7 Blöcke:" - list: " &8 - [number] x [block]" - none: "&7 Blöcke werden nicht hinzugefügt." + name: "Erforderliche Blöcke" + description: |- + Ermöglicht die Änderung der erforderlichen + Blöcke um die + Aufgabe abschließen zu können. + title: "Blöcke:" + list: " - [number] x [block]" + none: "Blöcke werden nicht hinzugefügt." search_radius: - name: "&f&l Suchradius" + name: "Suchradius" description: |- - &7 Ermöglicht die Änderung des Radius - &7 um den Spieler, von dem aus - &7 Blöcke und/oder Objekte - &7 erkannt werden. - value: "&7 Aktueller Abstand: &e [number]" + Ermöglicht die Änderung des Radius + um den Spieler, von dem aus + Blöcke und/oder Objekte + erkannt werden. + value: "Aktueller Abstand: [number]" remove_items: - name: "&f&l Items entfernen" - description: |- - &7 Ermöglicht das Umschalten, ob - &7 benötigte Gegenstände - &7 aus dem Inventar entfernt werden - &7 nach Beendigung der - &7 Herausforderung. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Items entfernen" + description: |- + Ermöglicht das Umschalten, ob + benötigte Gegenstände + aus dem Inventar entfernt werden + nach Beendigung der + Herausforderung. + enabled: "Aktiviert" + disabled: "Deaktiviert" required_items: - name: "&f&l Erforderliche Gegenstände" - description: |- - &7 Ermöglicht die Änderung der erforderlichen - &7 Elemente für diese - &7 Herausforderung abgeschlossen werden kann. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 Items werden nicht hinzugefügt." + name: "Erforderliche Gegenstände" + description: |- + Ermöglicht die Änderung der erforderlichen + Elemente für diese + Herausforderung abgeschlossen werden kann. + title: "Items: " + list: " - [number] x [item]" + none: "Items werden nicht hinzugefügt." add_ignored_meta: - name: "&f&l Metadaten ignorieren hinzufügen" - description: |- - &7 Ermöglicht das Hinzufügen, welche - &7 Items ignoriert werden sollen, inkl. - &7 aller Metadaten, die - &7 ihnen zugewiesen sind. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 Items werden nicht hinzugefügt." + name: "Metadaten ignorieren hinzufügen" + description: |- + Ermöglicht das Hinzufügen, welche + Items ignoriert werden sollen, inkl. + aller Metadaten, die + ihnen zugewiesen sind. + title: "Items: " + list: " - [number] x [item]" + none: "Items werden nicht hinzugefügt." remove_ignored_meta: - name: "&f&l Entfernen Metadaten ignorieren" + name: "Entfernen Metadaten ignorieren" description: |- - &7 Ermöglicht das Entfernen der - &7 Items, die ignoriert werden sollen und - &7 allen Metadaten, die - &7 ihnen zugewiesen sind. + Ermöglicht das Entfernen der + Items, die ignoriert werden sollen und + allen Metadaten, die + ihnen zugewiesen sind. remove_experience: - name: "&f&l Erfahrung entfernen" - description: |- - &7 Ermöglicht das Umschalten, ob - &7 erforderliche Erfahrung - &7 vom Spieler entfernt wird - &7 nach Beendigung der - &7 Herausforderung. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Erfahrung entfernen" + description: |- + Ermöglicht das Umschalten, ob + erforderliche Erfahrung + vom Spieler entfernt wird + nach Beendigung der + Herausforderung. + enabled: "Aktiviert" + disabled: "Deaktiviert" required_experience: - name: "&f&l Erforderliche Erfahrung" + name: "Erforderliche Erfahrung" description: |- - &7 Ermöglicht die Änderung der - &7 erforderliche Erfahrung für - &7 den Spieler. - value: "&7 Aktuelle Erfahrung: &e [number]" + Ermöglicht die Änderung der + erforderliche Erfahrung für + den Spieler. + value: "Aktuelle Erfahrung: [number]" required_level: - name: "&f&l Erforderliche Inselstufe" + name: "Erforderliche Inselstufe" description: |- - &7 Ermöglicht die Änderung der - &7 erforderliche Inselstufe - &7 für die Herausforderung. - value: "&7 Aktuelle Ebene: &e [number]" + Ermöglicht die Änderung der + erforderliche Inselstufe + für die Herausforderung. + value: "Aktuelle Ebene: [number]" remove_money: - name: "&f&l Geld entfernen" - description: |- - &7 Ermöglicht das Umschalten, ob - &7 das benötigte Geld - &7 vom Spieler entfernt wird,das - &7 Konto entfernt wird, nachdem er die - &7 die Herausforderung. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Geld entfernen" + description: |- + Ermöglicht das Umschalten, ob + das benötigte Geld + vom Spieler entfernt wird,das + Konto entfernt wird, nachdem er die + die Herausforderung. + enabled: "Aktiviert" + disabled: "Deaktiviert" required_money: - name: "&f&l Benötigtes Geld" + name: "Benötigtes Geld" description: |- - &7 Ermöglicht die Änderung der - &7 erforderliche Geld auf dem Spieler - &7 Konto für die Herausforderung. - value: "&7 Aktueller Wert: &e [number]" + Ermöglicht die Änderung der + erforderliche Geld auf dem Spieler + Konto für die Herausforderung. + value: "Aktueller Wert: [number]" statistic: - name: "&f&l Statistik" + name: "Statistik" description: |- - &7 Ermöglicht die Änderung des - &7 Statistiktyp, der - &7 in dieser Challenge geprüft wird. - value: "&7 Aktueller Wert: &e [statistic]" + Ermöglicht die Änderung des + Statistiktyp, der + in dieser Challenge geprüft wird. + value: "Aktueller Wert: [statistic]" statistic_amount: - name: "&f&l Zielwert" + name: "Zielwert" description: |- - &7 Ermöglicht die Änderung des - &7 statistischen Zielwert - &7, der erfüllt werden muss. - value: "&7 Aktueller Wert: &e [number]" + Ermöglicht die Änderung des + statistischen Zielwert + , der erfüllt werden muss. + value: "Aktueller Wert: [number]" remove_statistic: - name: "&f&l Statistik verkleinern" - description: |- - &7 Ermöglicht das Umschalten, ob - &7 der statistische Wert - &7 nach Beendigung der Herausforderung - &7 die Herausforderung. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Statistik verkleinern" + description: |- + Ermöglicht das Umschalten, ob + der statistische Wert + nach Beendigung der Herausforderung + die Herausforderung. + enabled: "Aktiviert" + disabled: "Deaktiviert" statistic_blocks: - name: "&f&l Zielblock" + name: "Zielblock" description: |- - &7 Ermöglicht die Änderung des - &7 statistischen Zielblocks. - value: "&7 Aktueller Block: &e [block]" + Ermöglicht die Änderung des + statistischen Zielblocks. + value: "Aktueller Block: [block]" statistic_items: - name: "&f&l Ziel Item" + name: "Ziel Item" description: |- - &7 Ermöglicht die Änderung des - &7 statistische Zielposition. - value: "&7 Aktuelles Element: &e [item]" + Ermöglicht die Änderung des + statistische Zielposition. + value: "Aktuelles Element: [item]" statistic_entities: - name: "&f&l Ziel Mob" + name: "Ziel Mob" description: |- - &7 Ermöglicht die Änderung des - &7 statistischen Zielobjekts. - value: "&7 Aktuelle Mob: &e [entity]" + Ermöglicht die Änderung des + statistischen Zielobjekts. + value: "Aktuelle Mob: [entity]" reward_text: - name: "&f&l Belohnungstext" + name: "Belohnungstext" description: |- - &7 Der spezifische Belohnungstext. - &7 Die Farbcodes müssen - &7 darauf angewendet werden. - value: "&7 Aktueller Text:" + Der spezifische Belohnungstext. + Die Farbcodes müssen + darauf angewendet werden. + value: "Aktueller Text:" repeat_reward_text: - name: "&f&l Belohnungstext wiederholen" + name: "Belohnungstext wiederholen" description: |- - &7 Der spezifische Wiederholungsbelohnungstext - &7 für die Herausforderung. Die Farb - &7 Codes müssen darauf angewendet werden. - value: "&7 Aktueller Text:" + Der spezifische Wiederholungsbelohnungstext + für die Herausforderung. Die Farb + Codes müssen darauf angewendet werden. + value: "Aktueller Text:" reward_items: - name: "&f&l Belohnungsgegenstände" + name: "Belohnungsgegenstände" description: |- - &7 Ermöglicht das Ändern von Belohnungen - &7 Gegenstände. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 Items werden nicht hinzugefügt." + Ermöglicht das Ändern von Belohnungen + Gegenstände. + title: "Items: " + list: " - [number] x [item]" + none: "Items werden nicht hinzugefügt." repeat_reward_items: - name: "&f&l Belohnungs Item wiederholen" - description: |- - &7 Ermöglicht die Änderung der Wiederholung - &7 Belohnungsgegenstände für diese - &7-Herausforderung. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 Items werden nicht hinzugefügt." + name: "Belohnungs Item wiederholen" + description: |- + Ermöglicht die Änderung der Wiederholung + Belohnungsgegenstände für diese + -Herausforderung. + title: "Items: " + list: " - [number] x [item]" + none: "Items werden nicht hinzugefügt." reward_experience: - name: "&f&l Belohnungserfahrung" + name: "Belohnungserfahrung" description: |- - &7 Ermöglicht die Änderung des - &7 Belohnungserlebnis für - &7 den Spieler. - value: "&7 Belohnungserfahrung: &e [number]" + Ermöglicht die Änderung des + Belohnungserlebnis für + den Spieler. + value: "Belohnungserfahrung: [number]" repeat_reward_experience: - name: "&f&l Belohnungserfahrung wiederholen" + name: "Belohnungserfahrung wiederholen" description: |- - &7 Ermöglicht die Änderung des - &7 Wiederholung der Belohnungserfahrung - &7 für den Spieler. - value: "&7 Belohnungserlebnis: &e [number]" + Ermöglicht die Änderung des + Wiederholung der Belohnungserfahrung + für den Spieler. + value: "Belohnungserlebnis: [number]" reward_money: - name: "&f&l Belohnungsgeld" + name: "Belohnungsgeld" description: |- - &7 Ermöglicht die Änderung des - &7 Belohnungsgeld. - value: "&7 Aktueller Wert: &e [number]" + Ermöglicht die Änderung des + Belohnungsgeld. + value: "Aktueller Wert: [number]" repeat_reward_money: - name: "&f&l Belohnungsgeld wiederholen" + name: "Belohnungsgeld wiederholen" description: |- - &7 Ermöglicht die Änderung des - &7 Wiederholung des Belohnungsgeldes - &7 für die Herausforderung. - value: "&7 Aktueller Wert: &e [number]" + Ermöglicht die Änderung des + Wiederholung des Belohnungsgeldes + für die Herausforderung. + value: "Aktueller Wert: [number]" reward_commands: - name: "&f&l Belohnungsbefehle" - description: |- - &7 Die spezifischen Belohnungsbefehle. - &8 Tipp: - &8 Der Befehl muss - &8 zuerst mit `/` geschrieben werden, da er - &8 automatisch angewendet wird. - &8 Standardmäßig werden die Befehle - &8 vom Server ausgeführt. Jedoch - &8 das Hinzufügen von `[SELF]` am Anfang - &8 ermöglicht es, dass der Befehl - &8 vom Spieler ausgeführt werden. Außerdem - &8 unterstützt einen Platzhalter - &8 `[player]`, der dann - &8 durch einen Spielernamen ersetzt wird - &8 der die Herausforderung abgeschlossen hat. - value: "&7 Aktuelle Befehle:" + name: "Belohnungsbefehle" + description: |- + Die spezifischen Belohnungsbefehle. + Tipp: + Der Befehl muss + zuerst mit `/` geschrieben werden, da er + automatisch angewendet wird. + Standardmäßig werden die Befehle + vom Server ausgeführt. Jedoch + das Hinzufügen von `[SELF]` am Anfang + ermöglicht es, dass der Befehl + vom Spieler ausgeführt werden. Außerdem + unterstützt einen Platzhalter + `[player]`, der dann + durch einen Spielernamen ersetzt wird + der die Herausforderung abgeschlossen hat. + value: "Aktuelle Befehle:" repeat_reward_commands: - name: "&f&l Belohnungsbefehle wiederholen" - description: |- - &7 Die spezifische Wiederholungsbelohnung - &7 Befehle für die Herausforderung. - &8 Tipp: - &8 Der Befehl muss - &8 zuerst mit `/` geschrieben werden, da er - &8 automatisch angewendet wird. - &8 Standardmäßig werden die Befehle - &8 vom Server ausgeführt. Jedoch - &8 das Hinzufügen von `[SELF]` am Anfang - &8 ermöglicht es, dass der Befehl - &8 vom Spieler ausgeführt werden. Außerdem - &8 unterstützt einen Platzhalter - &8 `[player]`, der dann - &8 durch einen Spielernamen ersetzt wird - &8 der die Herausforderung abgeschlossen hat. - value: "&7 Aktuelle Befehle:" + name: "Belohnungsbefehle wiederholen" + description: |- + Die spezifische Wiederholungsbelohnung + Befehle für die Herausforderung. + Tipp: + Der Befehl muss + zuerst mit `/` geschrieben werden, da er + automatisch angewendet wird. + Standardmäßig werden die Befehle + vom Server ausgeführt. Jedoch + das Hinzufügen von `[SELF]` am Anfang + ermöglicht es, dass der Befehl + vom Spieler ausgeführt werden. Außerdem + unterstützt einen Platzhalter + `[player]`, der dann + durch einen Spielernamen ersetzt wird + der die Herausforderung abgeschlossen hat. + value: "Aktuelle Befehle:" repeatable: - name: "&f&l Wiederholbar" + name: "Wiederholbar" description: |- - &7 Ermöglicht das Umschalten, ob - &7 die Herausforderung - &7 wiederholbar ist. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + Ermöglicht das Umschalten, ob + die Herausforderung + wiederholbar ist. + enabled: "Aktiviert" + disabled: "Deaktiviert" repeat_count: - name: "&f&l Wiederholungszähler" + name: "Wiederholungszähler" description: |- - &7 Ermöglicht die Änderung der - &7 Anzahl der Wiederholungen - &7 für die Herausforderung. - value: "&7 Aktueller Wert: &e [number]" + Ermöglicht die Änderung der + Anzahl der Wiederholungen + für die Herausforderung. + value: "Aktueller Wert: [number]" cool_down: - name: "&f&l Abkühlen" - description: |- - &7 Ermöglicht die Änderung der - &7 Abkühlsekunden, die - &7 gewartet werden muss zwischen - &7 wiederholbaren Herausforderungen - &7 und deren Beendigung gewartet werden muss. - value: "&7 Aktueller Wert: &e [time]" + name: "Abkühlen" + description: |- + Ermöglicht die Änderung der + Abkühlsekunden, die + gewartet werden muss zwischen + wiederholbaren Herausforderungen + und deren Beendigung gewartet werden muss. + value: "Aktueller Wert: [time]" challenges: - name: "&f&l Herausforderungen" + name: "Herausforderungen" description: |- - &7 Zugewiesene Herausforderungen anzeigen - &7 zum Level. + Zugewiesene Herausforderungen anzeigen + zum Level. waiver_amount: - name: "&f&l Verzichtsbetrag" + name: "Verzichtsbetrag" description: |- - &7 Ermöglicht die Festlegung einer Anzahl - &7 von Herausforderungen, die - &7 unvollendet gelassen werden können, um - &7 das nächste Level freizuschalten. - value: "&7 Aktueller Wert: &e [number]" + Ermöglicht die Festlegung einer Anzahl + von Herausforderungen, die + unvollendet gelassen werden können, um + das nächste Level freizuschalten. + value: "Aktueller Wert: [number]" add_challenges: - name: "&f&l Herausforderung(en) hinzufügen" + name: "Herausforderung(en) hinzufügen" description: |- - &7 Ermöglicht die Auswahl und - &7 fügt Herausforderungen zum - &7 leveln. + Ermöglicht die Auswahl und + fügt Herausforderungen zum + leveln. remove_challenges: - name: "&f&l Herausforderung(en) entfernen" + name: "Herausforderung(en) entfernen" description: |- - &7 Ermöglicht die Auswahl und - &7 Entfernen von Herausforderungen auf dem - &7 Level. + Ermöglicht die Auswahl und + Entfernen von Herausforderungen auf dem + Level. reset_on_new: - name: "&f&l Zurücksetzen auf Neu" - description: |- - &7 Ermöglicht das Umschalten, ob - &7 Herausforderungen - &7 zurückgesetzt werden sollen, wenn der Benutzer die - &7 Insel verlässt oder eine neue - &7 Insel erstellt. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Zurücksetzen auf Neu" + description: |- + Ermöglicht das Umschalten, ob + Herausforderungen + zurückgesetzt werden sollen, wenn der Benutzer die + Insel verlässt oder eine neue + Insel erstellt. + enabled: "Aktiviert" + disabled: "Deaktiviert" broadcast: - name: "&f&l Broadcast" + name: "Broadcast" description: |- - &7 Sendungen Herausforderung und - &7 Erstmaliger Abschluss eines Levels - &7 an alle. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + Sendungen Herausforderung und + Erstmaliger Abschluss eines Levels + an alle. + enabled: "Aktiviert" + disabled: "Deaktiviert" remove_completed: - name: "&f&l Ausblenden abgeschlossen" + name: "Ausblenden abgeschlossen" description: |- - &7 Versteckt abgeschlossene Herausforderungen - &7 aus dem Menü. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + Versteckt abgeschlossene Herausforderungen + aus dem Menü. + enabled: "Aktiviert" + disabled: "Deaktiviert" glow_completed: - name: "&f&l Glühen wenn abgeschlossen" + name: "Glühen wenn abgeschlossen" description: |- - &7 Fügt Verzauberungsglühen - &7 zu den abgeschlossenen Herausforderungen. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + Fügt Verzauberungsglühen + zu den abgeschlossenen Herausforderungen. + enabled: "Aktiviert" + disabled: "Deaktiviert" store_history: - name: "&f&l Store-Verlauf" - description: |- - &7 Speichert den internen Verlauf - &7 wenn jede Herausforderung - &7 abgeschlossen ist. - &7 Derzeit nur einsehbar - &7 in der Datenbank. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Store-Verlauf" + description: |- + Speichert den internen Verlauf + wenn jede Herausforderung + abgeschlossen ist. + Derzeit nur einsehbar + in der Datenbank. + enabled: "Aktiviert" + disabled: "Deaktiviert" data_per_island: - name: "&f&l Speichern pro Insel" - description: |- - &7 Speichert die abgeschlossenen - &7 Herausforderungen pro Insel. - &7 Der Fortschritt wird mit allen - &7 mit allen Spielern im Team geteilt. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Speichern pro Insel" + description: |- + Speichert die abgeschlossenen + Herausforderungen pro Insel. + Der Fortschritt wird mit allen + mit allen Spielern im Team geteilt. + enabled: "Aktiviert" + disabled: "Deaktiviert" show_title: - name: "&f&l Titel anzeigen" + name: "Titel anzeigen" description: |- - &7 Zeigt den Titel an, wenn eine - &7 Herausforderung oder Level - &7 abgeschlossen ist. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + Zeigt den Titel an, wenn eine + Herausforderung oder Level + abgeschlossen ist. + enabled: "Aktiviert" + disabled: "Deaktiviert" gamemode_gui: - name: "&f&l GameMode-Auswahl-GUI" - description: |- - &7 Ermöglicht eine einzige GUI, die - &7 verfügbar über /challenges - &7 Befehl. - &c Erfordert einen Neustart des Servers. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "GameMode-Auswahl-GUI" + description: |- + Ermöglicht eine einzige GUI, die + verfügbar über /challenges + Befehl. + Erfordert einen Neustart des Servers. + enabled: "Aktiviert" + disabled: "Deaktiviert" locked_level_icon: - name: "&f&l Standardsymbol für gesperrte Icon" + name: "Standardsymbol für gesperrte Icon" description: |- - &7 Standardsymbol für alle gesperrten - &7 Level. Jedes Level kann - &7 dieses Symbol ändern. + Standardsymbol für alle gesperrten + Level. Jedes Level kann + dieses Symbol ändern. purge_history: - name: "&f&l Geschichte Lebenszeit" - description: |- - &7 Anzahl der Tage, wie lange - &7 Verlaufsdaten gespeichert werden - &7 in den Benutzerdaten. - &7 0 bedeutet, dass die Daten - &7 nicht entfernt werden. - value: "&7 Aktueller Wert: &e [number]" + name: "Geschichte Lebenszeit" + description: |- + Anzahl der Tage, wie lange + Verlaufsdaten gespeichert werden + in den Benutzerdaten. + 0 bedeutet, dass die Daten + nicht entfernt werden. + value: "Aktueller Wert: [number]" title_showtime: - name: "&f&l Titel Showtime" + name: "Titel Showtime" description: |- - &7 Anzahl der Ticks, die der Titel - &7 dem Spieler angezeigt wird. - value: "&7 Aktueller Wert: &e [number]" + Anzahl der Ticks, die der Titel + dem Spieler angezeigt wird. + value: "Aktueller Wert: [number]" active_world_list: - name: "&f&l Nur aktive Welt anzeigen" - description: |- - &7 Wenn GameMode Selection GUI - &7 aktiviert ist, kann dieser Schalter - &7 die GUI GameMode-Auswahl anzeigen - &7 oder Herausforderungen für die aktuelle Welt anzeigt. - &c Erfordert einen Server-Neustart. - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Nur aktive Welt anzeigen" + description: |- + Wenn GameMode Selection GUI + aktiviert ist, kann dieser Schalter + die GUI GameMode-Auswahl anzeigen + oder Herausforderungen für die aktuelle Welt anzeigt. + Erfordert einen Server-Neustart. + enabled: "Aktiviert" + disabled: "Deaktiviert" visibility_mode: - name: "&f&l Sichtbarkeitsmodus" + name: "Sichtbarkeitsmodus" description: |- - &7 Sichtbarkeitsmodus für - &7 Herausforderungen, die - &7 versteckt sind. - enabled: "&2" - disabled: "&c" + Sichtbarkeitsmodus für + Herausforderungen, die + versteckt sind. + enabled: "" + disabled: "" visible: Zeigen Sie sichtbare Herausforderungen hidden: Alle Herausforderungen anzeigen toggleable: Umschalten zulassen include_undeployed: - name: "&f&l Nicht bereitgestellte Herausforderungen einschließen" - description: "&7 Gibt an, ob nicht bereitgestellte \n&7 Herausforderungen - \n&7 für den Abschluss von Level \n&7 angerechnet werden sollen." - enabled: "&2 Aktiviert" - disabled: "&c Deaktiviert" + name: "Nicht bereitgestellte Herausforderungen einschließen" + description: "Gibt an, ob nicht bereitgestellte \nHerausforderungen + \nfür den Abschluss von Level \nangerechnet werden sollen." + enabled: "Aktiviert" + disabled: "Deaktiviert" download: - name: "&f&l Bibliotheken herunterladen" + name: "Bibliotheken herunterladen" description: |- - &7 Manuelle Aktualisierung verfügbar für - &7 die Herausforderungs Bibliotheken. - enabled: "&2 Mit Cache löschen" - disabled: "&c Ohne Cache löschen" + Manuelle Aktualisierung verfügbar für + die Herausforderungs Bibliotheken. + enabled: "Mit Cache löschen" + disabled: "Ohne Cache löschen" player: - name: "&f&l [name]" - description: "&7 Insel Owner: [owner]" - members: "&7 Inselmitglieder:" - member: "&8 - [name]" + name: "[name]" + description: "Insel Owner: [owner]" + members: "Inselmitglieder:" + member: "- [name]" no-island: |- - &c Player hat - &c keine Insel. + Player hat + keine Insel. player_list: - name: "&f&l Spielerliste wählen" + name: "Spielerliste wählen" description: |- - &7 Wählen Sie, welche Benutzerliste - &7 angezeigt werden soll. - enabled: "&2" - disabled: "&c" + Wählen Sie, welche Benutzerliste + angezeigt werden soll. + enabled: "" + disabled: "" online: Online-Spieler with_island: Spieler mit Inseln in_world: Spieler in der Welt add_block: - name: "&f&l Block hinzufügen" + name: "Block hinzufügen" description: |- - &7 Ermöglicht das Hinzufügen eines neuen - &7 Blocks zur Liste. + Ermöglicht das Hinzufügen eines neuen + Blocks zur Liste. remove_block: - name: "&f&l Block entfernen" + name: "Block entfernen" description: |- - &7 Ermöglicht das Entfernen - &7 ausgewählte Blöcke - &7 aus Listen zu entfernen. - title: "&7 Ausgewählte Materialien:" - material: "&8 - [material]" + Ermöglicht das Entfernen + ausgewählte Blöcke + aus Listen zu entfernen. + title: "Ausgewählte Materialien:" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 Material ID: [id]" - selected: "&2 Ausgewählt" + name: "[material]" + description: "Material ID: [id]" + selected: "Ausgewählt" add_entity: - name: "&f&l Mob hinzufügen" + name: "Mob hinzufügen" description: |- - &7 Ermöglicht das Hinzufügen einer neuen - &7 Mobs zur Liste. + Ermöglicht das Hinzufügen einer neuen + Mobs zur Liste. switch_entity: - name: "&f&l Eier wechseln" + name: "Eier wechseln" description: |- - &7 Ermöglicht Umschalten von - &7 Eier zu Mob-Köpfe. + Ermöglicht Umschalten von + Eier zu Mob-Köpfe. remove_entity: - name: "&f&l Mob entfernen" + name: "Mob entfernen" description: |- - &7 Ermöglicht das Entfernen von - &7 ausgewählte Objekte - &7 aus Listen zu entfernen. - title: "&7 Ausgewählte Mobs:" - entity: "&8 - [entity]" + Ermöglicht das Entfernen von + ausgewählte Objekte + aus Listen zu entfernen. + title: "Ausgewählte Mobs:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 Mob ID: [id]" - selected: "&2 Ausgewählt" + name: "[entity]" + description: "Mob ID: [id]" + selected: "Ausgewählt" inventory_type: - name: "&f&l Inventartyp" + name: "Inventartyp" description: |- - &7 Herausforderung, die nach - &7 Gegenständen im Inventar des Spielers prüft + Herausforderung, die nach + Gegenständen im Inventar des Spielers prüft island_type: - name: "&f&l Inseltyp" + name: "Inseltyp" description: |- - &7 Herausforderung, die nach - &7 Blöcke oder Mob um den - &7 Spieler prüft. + Herausforderung, die nach + Blöcke oder Mob um den + Spieler prüft. other_type: - name: "&f&l Anderer Typ" + name: "Anderer Typ" description: |- - &7 Challenge, die verwendet - &7 Plugins oder Addons Dinge, - &7 wie Level und Geld. + Challenge, die verwendet + Plugins oder Addons Dinge, + wie Level und Geld. statistic_type: - name: "&f&l Statistiktyp" + name: "Statistiktyp" description: |- - &7 Challenge, die die - &7 Spieler-Statistiken prüfen. + Challenge, die die + Spieler-Statistiken prüfen. save: - name: "&f&l Speichern" + name: "Speichern" description: |- - &7 Speichert Änderungen und - &7 kehrt zurück. + Speichert Änderungen und + kehrt zurück. cancel: - name: "&f&l Abbrechen" + name: "Abbrechen" description: |- - &7 Verwirft Änderungen und - &7 kehrt zurück. + Verwirft Änderungen und + kehrt zurück. accept_selected: - name: "&f&l Ausgewählte akzeptieren" + name: "Ausgewählte akzeptieren" description: |- - &7 Gibt ausgewählte Elemente zurück - &7 und öffnet die vorherige GUI. - title: "&7 Ausgewählt:" - element: "&8 - [element]" + Gibt ausgewählte Elemente zurück + und öffnet die vorherige GUI. + title: "Ausgewählt:" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Suchen" + name: "Suchen" description: |- - &7 Ermöglicht die Suche nach einem - &7 Element mit Eingabe des - &7 Textwert. - search: "&b Wert: [value]" + Ermöglicht die Suche nach einem + Element mit Eingabe des + Textwert. + search: "Wert: [value]" tips: - click-to-select: "&e Klick &7 zu markieren." - click-to-choose: "&e Klick &7 zum wählen." - click-to-complete: "&e Klick &7 zum Abschließen." - right-click-multiple-open: "&e Klicken Sie mit der rechten Maustaste &7, um + click-to-select: "Klick zu markieren." + click-to-choose: "Klick zum wählen." + click-to-complete: "Klick zum Abschließen." + right-click-multiple-open: "Klicken Sie mit der rechten Maustaste , um den Fertigstellungsgrad auszuwählen." - shift-left-click-to-complete-all: "&e Klicken Sie mit gedrückter Umschalttaste - &7, um alles abzuschließen." - left-click-to-accept: "&e Klicken Sie zum Abschließen mit der &7 linken Maustaste." - right-click-to-write: "&e Rechtsklick &7 zum Schreiben." - click-to-reduce: "&e Klicken Sie zum Reduzieren &7." - click-to-increase: "&e Zum Erhöhen &7 klicken." - click-to-return: "&e Klicken Sie &7, um zurückzukehren." - click-to-quit: "&e Zum Beenden &7 klicken." - click-to-wipe: "&e Zum Löschen &7 klicken." - left-click-to-wipe: "&e Klicken Sie zum Löschen mit der linken Maustaste &7." - right-click-to-switch: "&e Rechtsklick &7 zum Umschalten." - click-to-open: "&e Klicken zum Öffnen&7." - click-to-export: "&e Zum Exportieren &7 klicken." - click-to-create: "&e Zum Exportieren &7 klicken." - left-click-to-open: "&e Klicken Sie zum Öffnen mit der linken Maustaste &7." - right-click-to-reset-all: "&e Klicken Sie mit der rechten Maustaste &7, um alles + shift-left-click-to-complete-all: "Klicken Sie mit gedrückter Umschalttaste + , um alles abzuschließen." + left-click-to-accept: "Klicken Sie zum Abschließen mit der linken Maustaste." + right-click-to-write: "Rechtsklick zum Schreiben." + click-to-reduce: "Klicken Sie zum Reduzieren ." + click-to-increase: "Zum Erhöhen klicken." + click-to-return: "Klicken Sie , um zurückzukehren." + click-to-quit: "Zum Beenden klicken." + click-to-wipe: "Zum Löschen klicken." + left-click-to-wipe: "Klicken Sie zum Löschen mit der linken Maustaste ." + right-click-to-switch: "Rechtsklick zum Umschalten." + click-to-open: "Klicken zum Öffnen." + click-to-export: "Zum Exportieren klicken." + click-to-create: "Zum Exportieren klicken." + left-click-to-open: "Klicken Sie zum Öffnen mit der linken Maustaste ." + right-click-to-reset-all: "Klicken Sie mit der rechten Maustaste , um alles zu löschen." - click-to-toggle: "&e Zum Umschalten &7 klicken." - click-to-change: "&e Zum Ändern &7 klicken." - shift-click-to-reset: "&e Shift Klicken Sie zum Zurücksetzen &7." - click-to-add: "&e Zum Hinzufügen &7 klicken." - click-to-remove: "&e Zum Entfernen &7 klicken." - left-click-to-cycle: "&e Klicken Sie mit der linken Maustaste &7, um nach unten + click-to-toggle: "Zum Umschalten klicken." + click-to-change: "Zum Ändern klicken." + shift-click-to-reset: "Shift Klicken Sie zum Zurücksetzen ." + click-to-add: "Zum Hinzufügen klicken." + click-to-remove: "Zum Entfernen klicken." + left-click-to-cycle: "Klicken Sie mit der linken Maustaste , um nach unten zu blättern." - right-click-to-cycle: "&e Klicken Sie mit der rechten Maustaste &7, um nach + right-click-to-cycle: "Klicken Sie mit der rechten Maustaste , um nach oben zu wechseln." - click-to-edit: "&e Zum Bearbeiten &7 klicken." - left-click-to-download: "&e Klicken Sie zum Herunterladen mit der linken Maustaste - &7." - right-click-to-toggle: "&e Klicken Sie mit der rechten Maustaste &7, um umzuschalten." - click-to-install: "&e Zum Installieren &7 klicken." - click-to-reset-all: "&e Klicken Sie &7, um alle zurückzusetzen." - right-click-to-select: "&e Klicken Sie zum Auswählen mit der rechten Maustaste - &7." - right-click-to-deselect: "&e Klicken Sie mit der rechten Maustaste &7, um die + click-to-edit: "Zum Bearbeiten klicken." + left-click-to-download: "Klicken Sie zum Herunterladen mit der linken Maustaste + ." + right-click-to-toggle: "Klicken Sie mit der rechten Maustaste , um umzuschalten." + click-to-install: "Zum Installieren klicken." + click-to-reset-all: "Klicken Sie , um alle zurückzusetzen." + right-click-to-select: "Klicken Sie zum Auswählen mit der rechten Maustaste + ." + right-click-to-deselect: "Klicken Sie mit der rechten Maustaste , um die Auswahl aufzuheben." - left-click-to-choose: "&e Klicken Sie mit der linken Maustaste &7, um auszuwählen." - click-to-cancel: "&e Zum Abbrechen &7 klicken." - click-to-save: "&e Zum Speichern &7 klicken." - click-to-deselect: "&e Klicken Sie &7, um die Auswahl aufzuheben." + left-click-to-choose: "Klicken Sie mit der linken Maustaste , um auszuwählen." + click-to-cancel: "Zum Abbrechen klicken." + click-to-save: "Zum Speichern klicken." + click-to-deselect: "Klicken Sie , um die Auswahl aufzuheben." click-on-item: |- - &e Klicken Sie &7 auf ein Item im - &7 Inventar. - left-click-to-edit: "&e Klicken Sie zum Bearbeiten mit der linken Maustaste - &7." - right-click-to-clear: "&e Klicken Sie zum Löschen mit der rechten Maustaste - &7." - click-to-previous: "&e Klicken Sie &7, um die vorherige Seite anzuzeigen." - click-to-next: "&e Klicken Sie &7, um die nächste Seite anzuzeigen." + Klicken Sie auf ein Item im + Inventar. + left-click-to-edit: "Klicken Sie zum Bearbeiten mit der linken Maustaste + ." + right-click-to-clear: "Klicken Sie zum Löschen mit der rechten Maustaste + ." + click-to-previous: "Klicken Sie , um die vorherige Seite anzuzeigen." + click-to-next: "Klicken Sie , um die nächste Seite anzuzeigen." descriptions: challenge: lore: |- @@ -835,16 +835,16 @@ challenges: [requirements] [rewards] status: - completed: "&2&l Abgeschlossen" - completed-times: "&2 Abgeschlossen &7&l [number] &r&2 time(-s)" - completed-times-of: "&2 &7&l [number] &r&2 von &7&l [max] &r&2 mal abgeschlossen" - completed-times-reached: "&2&l Alle Abschließen &7 [max] &2 times" + completed: "Abgeschlossen" + completed-times: "Abgeschlossen [number] time(-s)" + completed-times-of: "[number] von [max] mal abgeschlossen" + completed-times-reached: "Alle Abschließen [max] times" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Cool down: &r&7 [time]" - wait-time: "&c&l Verfügbar nach: &r&c [time]" + timeout: "Cool down: [time]" + wait-time: "Verfügbar nach: [time]" in-days: "[number] d " in-hours: "[number] H" in-minutes: "[number] min " @@ -854,12 +854,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Limitiert auf [environment]" - environment-title: "&7 Limitiert auf:" - environment-list: " &7 - &e [environment]" - permission-single: "&c Erfordert die Berechtigung [permission]" - permissions-title: "&c Erfordert Berechtigungen:" - permissions-list: " &c - [permission]" + environment-single: "Limitiert auf [environment]" + environment-title: "Limitiert auf:" + environment-list: " - [environment]" + permission-single: "Erfordert die Berechtigung [permission]" + permissions-title: "Erfordert Berechtigungen:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -867,23 +867,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Erforderliche Blöcke:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Erforderliche Entitäten:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 Nicht weiter als &e [number] &7 Meter" - warning-block: "&e Blöcke werden &c entfernt" - warning-entity: "&e Mobs werden &c entfernt" + blocks-title: "Erforderliche Blöcke:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Erforderliche Entitäten:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "Nicht weiter als [number] Meter" + warning-block: "Blöcke werden entfernt" + warning-entity: "Mobs werden entfernt" inventory: lore: |- [items] [warning] - item-title: "&7&l Erforderliche Items:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e Item(-s) wird &c entfernt werden" + item-title: "Erforderliche Items:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "Item(-s) wird entfernt werden" other: lore: |- [experience] @@ -891,34 +891,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Erforderliche Erfahrung: &r&e [number]" - experience-warning: "&e Erfahrung wird &c entfernt" - money: "&7&l Benötigtes Geld: &r&e [number]" - money-warning: "&e Geld wird &c entfernt" - level: "&7&l Erforderliches Insellevel: &r&e [number]" + experience: "Erforderliche Erfahrung: [number]" + experience-warning: "Erfahrung wird entfernt" + money: "Benötigtes Geld: [number]" + money-warning: "Geld wird entfernt" + level: "Erforderliches Insellevel: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Statistikdaten werden &c reduziert" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "Statistikdaten werden reduziert" rewards: lore: |- - &7&l Rewards: + Rewards: [text] [items] [experience] [money] [commands] - item-title: "&7 Items:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Erfahrung: &r&e [number]" - money: "&7 Geld: &r&e [number]" - commands-title: "&7 Befehle:" - command: " &7 - &e [command]" + item-title: "Items:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Erfahrung: [number]" + money: "Geld: [number]" + commands-title: "Befehle:" + command: " - [command]" level: lore: |- [text] @@ -926,198 +926,198 @@ challenges: [waiver] [rewards] status: - completed: "&2&l Abgeschlossen" + completed: "Abgeschlossen" completed-challenges-of: |- - &2 Abgeschlossen &7&l [number] &r&2 aus - &7&l [max] &r&2 Herausforderungen. - locked: "&c&l Gesperrt" - missing-challenges: "&7 [number] weitere Herausforderungen müssen \n&7 abgeschlossen + Abgeschlossen [number] aus + [max] Herausforderungen. + locked: "Gesperrt" + missing-challenges: "[number] weitere Herausforderungen müssen \nabgeschlossen sein, um diese Stufe freizuschalten." waiver: |- - &7&l [number] Herausforderung(en) &r&7 können - &7 übersprungen werden, um die nächste Stufe freizuschalten. + [number] Herausforderung(en) können + übersprungen werden, um die nächste Stufe freizuschalten. rewards: lore: |- - &7&l Rewards: + Rewards: [text] [items] [experience] [money] [commands] - item-title: "&7 Items:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Erfahrung: &r&e [number]" - money: "&7 Geld: &r&e [number]" - commands-title: "&7 Befehle:" - command: " &7 - &e [command]" + item-title: "Items:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Erfahrung: [number]" + money: "Geld: [number]" + commands-title: "Befehle:" + command: " - [command]" library: - author: "&7 by &e [author]" - version: "&7 Made with Challenges &e [version]" - lang: "&7 Sprache: &e [lang]" - gamemode: "&7 Primär für &e [gamemode]" + author: "by [author]" + version: "Made with Challenges [version]" + lang: "Sprache: [lang]" + gamemode: "Primär für [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: zustimmen, an, ja, bestätigen, ja, gültig, richtig deny-string: falsch, aus, nein, verweigern, n, ungültig, falsch cancel-string: Abbrechen exit-string: abbrechen, beenden, beenden - cancelled: "&c Gespräch abgebrochen!" - input-number: "&e Bitte geben Sie im Chat eine Nummer ein." - input-seconds: "&e Bitte geben Sie im Chat eine Sekunde ein." - numeric-only: "&c Der angegebene [value] ist keine Zahl!" - not-valid-value: "&c Die angegebene Zahl [value] ist ungültig. Er muss größer + cancelled: "Gespräch abgebrochen!" + input-number: "Bitte geben Sie im Chat eine Nummer ein." + input-seconds: "Bitte geben Sie im Chat eine Sekunde ein." + numeric-only: "Der angegebene [value] ist keine Zahl!" + not-valid-value: "Die angegebene Zahl [value] ist ungültig. Er muss größer als [min] und kleiner als [max] sein!" - user-data-removed: "&a Alle Benutzerdaten für [gamemode] werden aus der Datenbank + user-data-removed: "Alle Benutzerdaten für [gamemode] werden aus der Datenbank gelöscht." - confirm-user-data-deletion: "&e Bitte bestätigen Sie, dass Sie die Benutzerdatenbank + confirm-user-data-deletion: "Bitte bestätigen Sie, dass Sie die Benutzerdatenbank für [gamemode] löschen möchten." - challenge-data-removed: "&a Alle Herausforderungsdaten für [gamemode] werden aus + challenge-data-removed: "Alle Herausforderungsdaten für [gamemode] werden aus der Datenbank gelöscht." - confirm-challenge-data-deletion: "&e Bitte bestätigen Sie, dass Sie die Herausforderungsdatenbank + confirm-challenge-data-deletion: "Bitte bestätigen Sie, dass Sie die Herausforderungsdatenbank für [gamemode] löschen möchten." - all-data-removed: "&a Alle Addon-Daten für [gamemode] werden aus der Datenbank + all-data-removed: "Alle Addon-Daten für [gamemode] werden aus der Datenbank gelöscht." - confirm-all-data-deletion: "&e Bitte bestätigen Sie, dass Sie Addon-Daten für + confirm-all-data-deletion: "Bitte bestätigen Sie, dass Sie Addon-Daten für [gamemode] löschen möchten." - write-name: "&e Bitte schreiben Sie einen Namen in den Chat." - new-object-created: "&ein neues Objekt für [gamemode] wird erstellt." - object-already-exists: "&c Objekt &7 [id] &c existiert bereits. Wählen Sie einen + write-name: "Bitte schreiben Sie einen Namen in den Chat." + new-object-created: "in neues Objekt für [gamemode] wird erstellt." + object-already-exists: "Objekt [id] existiert bereits. Wählen Sie einen anderen Namen." - invalid-challenge: "&c Challenge [challenge] enthält ungültige Daten. Es kann + invalid-challenge: "Challenge [challenge] enthält ungültige Daten. Es kann nicht eingesetzt werden!" - name-changed: "&a Erfolg, der Name wurde aktualisiert." - write-description: "&e Bitte geben Sie eine neue Beschreibung im Chat ein und + name-changed: "Erfolg, der Name wurde aktualisiert." + write-description: "Bitte geben Sie eine neue Beschreibung im Chat ein und beenden Sie den Chat in einer eigenen Zeile." - description-changed: "&a Erfolg, die Beschreibung wurde aktualisiert." - write-permissions: "&e Bitte geben Sie die erforderlichen Berechtigungen ein, + description-changed: "Erfolg, die Beschreibung wurde aktualisiert." + write-permissions: "Bitte geben Sie die erforderlichen Berechtigungen ein, eine pro Zeile im Chat, und 'beenden' in einer eigenen Zeile, um den Chat zu beenden." - permissions-changed: "&a Erfolg, Challenge-Berechtigungen wurden aktualisiert." - write-reward-text: "&e Bitte geben Sie einen neuen Belohnungstext im Chat ein + permissions-changed: "Erfolg, Challenge-Berechtigungen wurden aktualisiert." + write-reward-text: "Bitte geben Sie einen neuen Belohnungstext im Chat ein und beenden Sie den Chat in einer eigenen Zeile." - reward-text-changed: "&a Erfolg, der Belohnungstext wurde aktualisiert." - write-repeat-reward-text: "&e Bitte geben Sie einen neuen Wiederholungsbelohnungstext + reward-text-changed: "Erfolg, der Belohnungstext wurde aktualisiert." + write-repeat-reward-text: "Bitte geben Sie einen neuen Wiederholungsbelohnungstext im Chat ein und beenden Sie den Chat in einer eigenen Zeile." - repeat-reward-text-changed: "&a Erfolg, der Wiederholungsbelohnungstext wurde + repeat-reward-text-changed: "Erfolg, der Wiederholungsbelohnungstext wurde aktualisiert." - write-reward-commands: "&e Bitte geben Sie pro Zeile im Chat einen neuen Belohnungsbefehl + write-reward-commands: "Bitte geben Sie pro Zeile im Chat einen neuen Belohnungsbefehl ein und beenden Sie den Chat in einer eigenen Zeile." - reward-commands-changed: "&a Erfolg, die Belohnungsbefehle wurden aktualisiert." - write-repeat-reward-commands: "&e Geben Sie bitte pro Zeile im Chat einen neuen + reward-commands-changed: "Erfolg, die Belohnungsbefehle wurden aktualisiert." + write-repeat-reward-commands: "Geben Sie bitte pro Zeile im Chat einen neuen Befehl zur Wiederholung der Belohnung ein und klicken Sie zum Beenden auf „Beenden“ in einer eigenen Zeile." - repeat-reward-commands-changed: "&a Erfolg, die Wiederholungsbelohnungsbefehle + repeat-reward-commands-changed: "Erfolg, die Wiederholungsbelohnungsbefehle wurden aktualisiert." - challenge-removed: "&a Herausforderungen [challende] für [gamemode] wird aus der + challenge-removed: "Herausforderungen [challende] für [gamemode] wird aus der Datenbank entfernt." - confirm-challenge-deletion: "&e Bitte bestätigen Sie, dass Sie [challenge] für + confirm-challenge-deletion: "Bitte bestätigen Sie, dass Sie [challenge] für [gamemode] aus der Datenbank entfernen möchten." - level-removed: "&a Level [level] für [gamemode] wird aus der Datenbank entfernt." - confirm-level-deletion: "&e Bitte bestätigen Sie, dass Sie [level] für [gamemode] + level-removed: "Level [level] für [gamemode] wird aus der Datenbank entfernt." + confirm-level-deletion: "Bitte bestätigen Sie, dass Sie [level] für [gamemode] aus der Datenbank entfernen möchten." - start-downloading: "&a Herunterladen und Importieren der Challenges-Bibliothek + start-downloading: "Herunterladen und Importieren der Challenges-Bibliothek beginnen." - written-text: "&a Eingabetext:" - confirm-data-replacement: "&e Bitte bestätigen Sie, dass Sie Ihre aktuellen Herausforderungen + written-text: "Eingabetext:" + confirm-data-replacement: "Bitte bestätigen Sie, dass Sie Ihre aktuellen Herausforderungen durch neue ersetzen möchten." - new-challenges-imported: "&a Erfolg, neue Herausforderungen für [gamemode] wurden + new-challenges-imported: "Erfolg, neue Herausforderungen für [gamemode] wurden importiert." - exported-file-name: "&e Bitte geben Sie einen Dateinamen für die exportierte Datenbankdatei + exported-file-name: "Bitte geben Sie einen Dateinamen für die exportierte Datenbankdatei ein. (zum Beenden 'cancel' schreiben)" - database-export-completed: "&a Erfolg, der Datenbankexport für [world] ist abgeschlossen. + database-export-completed: "Erfolg, der Datenbankexport für [world] ist abgeschlossen. Datei wurde [file] generiert." - file-name-exist: "&c Datei mit dem Namen '[id]' existiert. Kann nicht überschrieben + file-name-exist: "Datei mit dem Namen '[id]' existiert. Kann nicht überschrieben werden." - write-search: "&e Bitte geben Sie einen Suchwert ein. (zum Beenden 'cancel' schreiben)" - search-updated: "&a Suchwert aktualisiert." + write-search: "Bitte geben Sie einen Suchwert ein. (zum Beenden 'cancel' schreiben)" + search-updated: "Suchwert aktualisiert." titles: challenge-title: Erfolgreich abgeschlossen challenge-subtitle: "[friendlyName]" level-title: Erfolgreich abgeschlossen level-subtitle: "[friendlyName]" messages: - completed: "&2 Sie haben die Herausforderung [name] für [player] abgeschlossen!" - already-completed: "&2 Diese Herausforderung wurde bereits abgeschlossen!" - reset: "&2 Sie haben die Herausforderung [name] für [player] zurückgesetzt!" - reset-all: "&2 Alle [player]-Herausforderungen wurden zurückgesetzt!" - not-completed: "&2 Diese Herausforderung ist noch nicht abgeschlossen!" - migrate-start: "&2 Starten Sie die Migration von Challenges-Addon-Daten." - migrate-end: "&2 Challenges-Addon-Daten auf neues Format aktualisiert." - migrate-not: "&2 Alle Daten sind gültig." - start-downloading: "&5 Herunterladen und Importieren der Challenges-Bibliothek + completed: "Sie haben die Herausforderung [name] für [player] abgeschlossen!" + already-completed: "Diese Herausforderung wurde bereits abgeschlossen!" + reset: "Sie haben die Herausforderung [name] für [player] zurückgesetzt!" + reset-all: "Alle [player]-Herausforderungen wurden zurückgesetzt!" + not-completed: "Diese Herausforderung ist noch nicht abgeschlossen!" + migrate-start: "Starten Sie die Migration von Challenges-Addon-Daten." + migrate-end: "Challenges-Addon-Daten auf neues Format aktualisiert." + migrate-not: "Alle Daten sind gültig." + start-downloading: "Herunterladen und Importieren der Challenges-Bibliothek beginnen." - you-completed-challenge: "&2Du hast die [value] &r&2Herausforderungen abgeschlossen!" - you-repeated-challenge: "&2Du hast die [value] &r&2Herausforderung wiederholt!" - you-repeated-challenge-multiple: "&2Du hast die [value] &r&2Herausforderungen + you-completed-challenge: "Du hast die [value] Herausforderungen abgeschlossen!" + you-repeated-challenge: "Du hast die [value] Herausforderung wiederholt!" + you-repeated-challenge-multiple: "Du hast die [value] Herausforderungen [count] mal wiederholt!" - you-completed-level: "&2Du hast den [value] &r&2level abgeschlossen!" - name-has-completed-challenge: "&5[name] hat die [value] &r&5-Herausforderung abgeschlossen!" - name-has-completed-level: "&5[name] hat den [value] &r&5Level abgeschlossen!" + you-completed-level: "Du hast den [value] level abgeschlossen!" + name-has-completed-challenge: "[name] hat die [value] -Herausforderung abgeschlossen!" + name-has-completed-level: "[name] hat den [value] Level abgeschlossen!" load-skipping: '"[value]" existiert bereits - überspringen' load-overwriting: Überschreibt "[value]" load-add: 'Neues Objekt hinzufügen: [value]' errors: - no-name: "&cFehlender Herausforderungsname" - unknown-challenge: "&cUnbekannte Herausforderung" + no-name: "Fehlender Herausforderungsname" + unknown-challenge: "Unbekannte Herausforderung" not-valid-integer: |- - &cDie Angabe der ganzen Zahl "[value]" ist nicht gültig! + Die Angabe der ganzen Zahl "[value]" ist nicht gültig! Der Wert sollte zwischen [min] und [max] liegen. - not-deployed: "&cHerausforderung wird nicht eingesetzt!" - not-on-island: "&cDu musst auf deiner Insel sein, um das zu tun!" - challenge-level-not-available: "&cDu hast das erforderliche Level nicht freigeschaltet, + not-deployed: "Herausforderung wird nicht eingesetzt!" + not-on-island: "Du musst auf deiner Insel sein, um das zu tun!" + challenge-level-not-available: "Du hast das erforderliche Level nicht freigeschaltet, um diese Herausforderung abzuschließen." - not-repeatable: "&cDiese Herausforderung ist nicht wiederholbar!" - wrong-environment: "&cDu bist in der falschen Umgebung!" - not-enough-items: "&cDu hast nicht genug [items], um diese Herausforderung abzuschließen!" - not-close-enough: "&cDu musst innerhalb von [number] Blöcken aller benötigten + not-repeatable: "Diese Herausforderung ist nicht wiederholbar!" + wrong-environment: "Du bist in der falschen Umgebung!" + not-enough-items: "Du hast nicht genug [items], um diese Herausforderung abzuschließen!" + not-close-enough: "Du musst innerhalb von [number] Blöcken aller benötigten Positionen stehen." - you-still-need: "&cDu brauchst noch [amount] x [item]" - missing-addon: "&cKann die Herausforderung nicht vollenden: Benötigtes Addon oder + you-still-need: "Du brauchst noch [amount] x [item]" + missing-addon: "Kann die Herausforderung nicht vollenden: Benötigtes Addon oder Plugin fehlt." - incorrect: "&cKann die Herausforderung nicht abschließen: Anforderungen sind falsch." - not-enough-money: "&cEs ist notwendig, [value] auf deinem Konto zu haben, um die + incorrect: "Kann die Herausforderung nicht abschließen: Anforderungen sind falsch." + not-enough-money: "Es ist notwendig, [value] auf deinem Konto zu haben, um die Herausforderung abzuschließen." - not-enough-experience: "&cEs ist notwendig [value] EXP zu haben, um diese Herausforderung + not-enough-experience: "Es ist notwendig [value] EXP zu haben, um diese Herausforderung abzuschließen." - island-level: "&cDeine Insel muss mindestens Level [number] oder höher sein, um + island-level: "Deine Insel muss mindestens Level [number] oder höher sein, um diese Herausforderung abzuschließen!" - no-load: "&cFehler: Die challenges.yml konnte nicht geladen werden.[message]" - load-error: "&cFehler: [value] kann nicht geladen werden." - no-rank: "&cDu hast keinen Rang, der hoch genug ist, um das zu tun." - cannot-remove-items: "&cEinige Items können nicht aus deinem Inventar entfernt + no-load: "Fehler: Die challenges.yml konnte nicht geladen werden.[message]" + load-error: "Fehler: [value] kann nicht geladen werden." + no-rank: "Du hast keinen Rang, der hoch genug ist, um das zu tun." + cannot-remove-items: "Einige Items können nicht aus deinem Inventar entfernt werden!" - exist-challenges-or-levels: "&cDie Herausforderung existiert bereits in deiner + exist-challenges-or-levels: "Die Herausforderung existiert bereits in deiner Welt. Kann nicht fortfahren!" - no-challenges: "&cDie Herausforderungen sind in dieser Welt noch nicht implementiert!" - no-challenges-admin: "&cDie Herausforderungen sind in dieser Welt noch nicht implementiert! - Verwende &5/[command] &cum sie hinzuzufügen!" - missing-arguments: "&cDem Befehl fehlen Argumente." - no-multiple-permission: "&cDu hast keine Berechtigung, diese Herausforderung mehrmals + no-challenges: "Die Herausforderungen sind in dieser Welt noch nicht implementiert!" + no-challenges-admin: "Die Herausforderungen sind in dieser Welt noch nicht implementiert! + Verwende /[command] um sie hinzuzufügen!" + missing-arguments: "Dem Befehl fehlen Argumente." + no-multiple-permission: "Du hast keine Berechtigung, diese Herausforderung mehrmals hintereinander auszuführen." invalid-level: "& c Level [Level] enthält ungültige Daten. Es wird nicht aus der Datenbank geladen!" invalid-challenge: "& c Challenge [Challenge] enthält ungültige Daten. Sie wird nicht aus der Datenbank geladen!" - no-library-entries: "&c Es können keine Bibliothekseinträge gefunden werden. Nichts + no-library-entries: "Es können keine Bibliothekseinträge gefunden werden. Nichts zu zeigen." - not-hooked: "&c Challenges Addon konnte keinen GameMode finden." - timeout: "&c Diese Abfrage erfordert eine Wartezeit von [timeout] zwischen den + not-hooked: "Challenges Addon konnte keinen GameMode finden." + timeout: "Diese Abfrage erfordert eine Wartezeit von [timeout] zwischen den Vervollständigungen. Sie müssen [wait-time] warten, bis Sie es erneut abschließen." - requirement-not-met: "&c Für diese Herausforderung muss [statistic] [number] haben. + requirement-not-met: "Für diese Herausforderung muss [statistic] [number] haben. Sie haben nur [value]." - requirement-not-met-entity: "&c Für diese Herausforderung muss [statistic] [entity] + requirement-not-met-entity: "Für diese Herausforderung muss [statistic] [entity] über [number] verfügen. Sie haben nur [value]." - requirement-not-met-material: "&c Diese Herausforderung erfordert, dass [statistic] + requirement-not-met-material: "Diese Herausforderung erfordert, dass [statistic] [material] [number] hat. Sie haben nur [value]." protection: flags: CHALLENGES_ISLAND_PROTECTION: - description: "&5Umschalten, wer &5Herausforderungen erledigen kann" + description: "Umschalten, wer Herausforderungen erledigen kann" name: Herausforderungen Schutz CHALLENGES_WORLD_PROTECTION: - description: "&5&oAktivieren/Deaktivieren von \n&5&oAnforderung für Spieler,\n&5&oauf - ihrer Insel zu sein, um \n&5&oeine Herausforderung abzuschließen." + description: "Aktivieren/Deaktivieren von \nAnforderung für Spieler,\nauf + ihrer Insel zu sein, um \neine Herausforderung abzuschließen." name: Herausforderungen Inselbegrenzung hint: Keine Herausforderungen außerhalb der Insel version: 12 diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index cc5b2ad9..581b3456 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -45,899 +45,910 @@ challenges: gui: titles: # The title for the Main GUI - player-gui: "&0&l Challenges Menu" + player-gui: "Challenges Menu" # The title for the Main GUI - gamemode-gui: "&0&l Select Game Mode" + gamemode-gui: "Select Game Mode" # The title for the Multiple Completion GUI - multiple-gui: "&0&l How many times?" + multiple-gui: "How many times?" # GUI titles below are visible just for Admins. - admin-gui: "&0&l Challenges Admin Menu" - edit-challenge: "&0&l Edit [challenge]" - edit-level: "&0&l Edit [level]" - settings: "&0&l Settings" - choose-challenge: "&0&l Choose Challenge" - choose-level: "&0&l Choose Level" - choose-player: "&0&l Choose Player" - library: "&0&l Library" - manage-blocks: "&0&l Manage Blocks" - manage-block-groups: "&0&l Manage Block Groups" - manage-entity-groups: "&0&l Manage Entity Groups" - manage-entities: "&0&l Manage Entities" - manage-statistics: "&0&l Manage Statistics" - manage-advancements: "&0&l Manage Advancements" - advancement-selector: "&0&l Advancement Selector" - type-selector: "&0&l Challenge Type Selector" - item-selector: "&0&l Item Selector" - block-selector: "&0&l Block Selector" - entity-selector: "&0&l Entity Selector" - challenge-selector: "&0&l Challenge Selector" - statistic-selector: "&0&l Statistic Selector" - environment-selector: "&0&l Environment Selector" + admin-gui: "Challenges Admin Menu" + edit-challenge: "Edit [challenge]" + edit-level: "Edit [level]" + settings: "Settings" + choose-challenge: "Choose Challenge" + choose-level: "Choose Level" + choose-player: "Choose Player" + library: "Library" + manage-blocks: "Manage Blocks" + manage-block-groups: "Manage Block Groups" + manage-entity-groups: "Manage Entity Groups" + manage-entities: "Manage Entities" + manage-statistics: "Manage Statistics" + manage-advancements: "Manage Advancements" + advancement-selector: "Advancement Selector" + type-selector: "Challenge Type Selector" + item-selector: "Item Selector" + block-selector: "Block Selector" + entity-selector: "Entity Selector" + challenge-selector: "Challenge Selector" + statistic-selector: "Statistic Selector" + environment-selector: "Environment Selector" buttons: # Button in the Challenges GUI that allows to select free challenges. free-challenges: - name: "&f&l Free Challenges" + name: "Free Challenges" description: |- - &7 Displays a list of - &7 free challenges + Displays a list of + free challenges # Button that is used to return to previous GUI or exit it completely. return: - name: "&f&l Return" + name: "Return" description: |- - &7 Return to the previous menu - &7 or exit the GUI + Return to the previous menu + or exit the GUI # Button that is used in multi-page GUIs which allows to return to previous page. previous: - name: "&f&l Previous Page" + name: "Previous Page" description: |- - &7 Switch to page &e [number] + Switch to page [number] # Button that is used in multi-page GUIs which allows to go to next page. next: - name: "&f&l Next Page" + name: "Next Page" description: |- - &7 Switch to page &e [number] + Switch to page [number] # Button that allows to reduce number reduce: - name: "&f&l Reduce" + name: "Reduce" description: |- - &7 Decrease by &e [number] + Decrease by [number] # Button that allows to increase number increase: - name: "&f&l Increase" + name: "Increase" description: |- - &7 Increase by &e [number] + Increase by [number] # Button that displays and allows completing challenge accept: - name: "&f&l Complete" + name: "Complete" description: |- - &7 Complete challenge &e [number] - &7 time(s) + Complete challenge [number] + time(s) # Button that allows to quit the current gui. quit: - name: "&f&l Quit" + name: "Quit" description: |- - &7 Exit the GUI. + Exit the GUI. # All following buttons are mainly for Admin GUI. complete_user_challenges: - name: "&f&l Complete User Challenge(-s)" + name: "Complete User Challenge(-s)" description: |- - &7 Allows you to select a user and - &7 complete challenge(s) for them. + Allows you to select a user and + complete challenge(s) for them. reset_user_challenges: - name: "&f&l Reset User Challenges" + name: "Reset User Challenges" description: |- - &7 Allows you to select a user and - &7 reset their challenges. + Allows you to select a user and + reset their challenges. add_challenge: - name: "&f&l Create Challenge" + name: "Create Challenge" description: |- - &7 Starts a process for - &7 creating a new challenge. + Starts a process for + creating a new challenge. add_level: - name: "&f&l Create Level" + name: "Create Level" description: |- - &7 Starts a process for - &7 creating a new level. + Starts a process for + creating a new level. edit_challenge: - name: "&f&l Edit Challenge" + name: "Edit Challenge" description: |- - &7 Allows you to select and edit - &7 a challenge. + Allows you to select and edit + a challenge. edit_level: - name: "&f&l Edit Level" + name: "Edit Level" description: |- - &7 Allows you to select and edit - &7 a level. + Allows you to select and edit + a level. delete_challenge: - name: "&f&l Delete Challenge" + name: "Delete Challenge" description: |- - &7 Allows you to select and delete - &7 a challenge. + Allows you to select and delete + a challenge. delete_level: - name: "&f&l Delete Level" + name: "Delete Level" description: |- - &7 Allows you to select and delete - &7 a level. + Allows you to select and delete + a level. edit_settings: - name: "&f&l Settings" + name: "Settings" description: |- - &7 Allows you to view and edit - &7 the add-on settings. + Allows you to view and edit + the add-on settings. complete_wipe: - name: "&f&l Complete Wipe" + name: "Complete Wipe" description: |- - &7 Completely clears the challenges - &7 add-on database, including - &7 user data. + Completely clears the challenges + add-on database, including + user data. challenge_wipe: - name: "&f&l Challenge Wipe" + name: "Challenge Wipe" description: |- - &7 Completely clears the challenges - &7 and levels from the database. + Completely clears the challenges + and levels from the database. user_wipe: - name: "&f&l User Wipe" + name: "User Wipe" description: |- - &7 Completely clears user - &7 data from the database. + Completely clears user + data from the database. library: - name: "&f&l Library" + name: "Library" description: |- - &7 Opens the public - &7 challenges library. + Opens the public + challenges library. + downloading: |- + Library download + requested... import_database: - name: "&f&l Import Database" + name: "Import Database" description: |- - &7 Allows you to import an exported - &7 challenges database. + Allows you to import an exported + challenges database. import_template: - name: "&f&l Import Template" + name: "Import Template" description: |- - &7 Allows you to import a template - &7 file containing challenges. + Allows you to import a template + file containing challenges. export_challenges: - name: "&f&l Export Challenges" + name: "Export Challenges" description: |- - &7 Allows you to export the database - &7 to a local file. + Allows you to export the database + to a local file. properties: - name: "&f&l Properties" + name: "Properties" description: |- - &7 View all main properties. + View all main properties. requirements: - name: "&f&l Requirements" + name: "Requirements" description: |- - &7 View the requirements properties. + View the requirements properties. rewards: - name: "&f&l Rewards" + name: "Rewards" description: |- - &7 View the rewards properties. + View the rewards properties. hide_reward_items: - name: "&f&l Hide Reward Items" + name: "Hide Reward Items" description: |- - &7 Toggle whether reward items - &7 are shown or not in GUI. - hide: "&2 Hide" - show: "&c Show" + Toggle whether reward items + are shown or not in GUI. + hide: "Hide" + show: "Show" deployed: - name: "&f&l Deployment" + name: "Deployment" description: |- - &7 Toggle whether the challenge is - &7 deployed and can be completed - &7 by users. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Toggle whether the challenge is + deployed and can be completed + by users. + enabled: "Enabled" + disabled: "Disabled" name: - name: "&f&l Name" + name: "Name" description: |- - &7 Allows you to change - &7 the display name. - value: "&7 Currently: &r [name]" + Allows you to change + the display name. + value: "Currently: [name]" remove_on_complete: - name: "&f&l Hide After Completion" + name: "Hide After Completion" description: |- - &7 Toggle whether the challenge should - &7 be hidden from the player after - &7 it is completed. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Toggle whether the challenge should + be hidden from the player after + it is completed. + enabled: "Enabled" + disabled: "Disabled" description: - name: "&f&l Description" + name: "Description" description: |- - &7 Specifies the challenge's description. - &7 Color codes must be applied to it. - value: "&7 Current description:" + Specifies the challenge's description. + Color codes must be applied to it. + value: "Current description:" environment: - name: "&f&l Dimension" + name: "Dimension" description: |- - &7 Allows you to restrict the challenge - &7 to a specific dimension. - enabled: "&2" - disabled: "&c" + Allows you to restrict the challenge + to a specific dimension. + enabled: "" + disabled: "" order: - name: "&f&l Order" - description: |- - &7 Allows you to change the order of - &7 objects. - &7 Objects with the same number - &7 will be ordered by their - &7 unique ID names. - value: "&7 Current order: &e [number]" + name: "Order" + description: |- + Allows you to change the order of + objects. + Objects with the same number + will be ordered by their + unique ID names. + value: "Current order: [number]" icon: - name: "&f&l Icon" + name: "Icon" description: |- - &7 Allows you to change the icon - &7 for this challenge. + Allows you to change the icon + for this challenge. locked_icon: - name: "&f&l Locked Icon" + name: "Locked Icon" description: |- - &7 Allows you to change the locked - &7 level icon. + Allows you to change the locked + level icon. required_permissions: - name: "&f&l Required Permissions" - description: |- - &7 Allows you to change the required - &7 permissions for this challenge to - &7 be completed. - title: "&7 Permissions: " - permission: " &8 - [permission]" - none: "&7 No permissions are set." + name: "Required Permissions" + description: |- + Allows you to change the required + permissions for this challenge to + be completed. + title: "Permissions: " + permission: " - [permission]" + none: "No permissions are set." remove_entities: - name: "&f&l Remove Entities" + name: "Remove Entities" description: |- - &7 Toggle whether required entities will - &7 be removed from the world after - &7 completing the challenge. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Toggle whether required entities will + be removed from the world after + completing the challenge. + enabled: "Enabled" + disabled: "Disabled" required_entities: - name: "&f&l Required Entities" - description: |- - &7 Allows you to change the required - &7 entities for this challenge to be - &7 completed. - title: "&7 Entities: " - list: " &8 - [number] x [entity]" - none: "&7 No entities have been added." + name: "Required Entities" + description: |- + Allows you to change the required + entities for this challenge to be + completed. + title: "Entities: " + list: " - [number] x [entity]" + none: "No entities have been added." remove_blocks: - name: "&f&l Remove Blocks" + name: "Remove Blocks" description: |- - &7 Toggle whether required blocks will - &7 be removed from the world after - &7 completing the challenge. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Toggle whether required blocks will + be removed from the world after + completing the challenge. + enabled: "Enabled" + disabled: "Disabled" required_blocks: - name: "&f&l Required Blocks" - description: |- - &7 Allows you to change the required - &7 blocks for this challenge to be - &7 completed. - title: "&7 Blocks: " - list: " &8 - [number] x [block]" - none: "&7 No blocks have been added." + name: "Required Blocks" + description: |- + Allows you to change the required + blocks for this challenge to be + completed. + title: "Blocks: " + list: " - [number] x [block]" + none: "No blocks have been added." required_statistics: - name: "&f&l Required Statistics" - description: |- - &7 Allows you to change the required - &7 statistics for this challenge to be - &7 completed. - title: "&7 Statistics: " - list: " &8 - [name]" - none: "&7 No statistics have been added." + name: "Required Statistics" + description: |- + Allows you to change the required + statistics for this challenge to be + completed. + title: "Statistics: " + list: " - [name]" + none: "No statistics have been added." required_advancements: - name: "&f&l Required Advancements" - description: |- - &7 Allows you to change the required - &7 advancements for this challenge to - &7 be completed. - title: "&7 Advancements: " - list: " &8 - [name]" - none: "&7 No advancements have been added." + name: "Required Advancements" + description: |- + Allows you to change the required + advancements for this challenge to + be completed. + title: "Advancements: " + list: " - [name]" + none: "No advancements have been added." search_radius: - name: "&f&l Search Radius" + name: "Search Radius" description: |- - &7 Allows you to change the radius - &7 around the player from which - &7 blocks and/or entities are detected. - value: "&7 Current distance: &e [number]" + Allows you to change the radius + around the player from which + blocks and/or entities are detected. + value: "Current distance: [number]" remove_items: - name: "&f&l Remove Items" + name: "Remove Items" description: |- - &7 Toggle whether required items will - &7 be removed from the inventory after - &7 completing the challenge. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Toggle whether required items will + be removed from the inventory after + completing the challenge. + enabled: "Enabled" + disabled: "Disabled" required_items: - name: "&f&l Required Items" + name: "Required Items" description: |- - &7 Allows you to change the required - &7 items for this challenge to be completed. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 No items have been added." + Allows you to change the required + items for this challenge to be completed. + title: "Items: " + list: " - [number] x [item]" + none: "No items have been added." add_ignored_meta: - name: "&f&l Add Ignore Metadata" - description: |- - &7 Allows you to specify which items - &7 should ignore any metadata - &7 assigned to them. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 No items have been added." + name: "Add Ignore Metadata" + description: |- + Allows you to specify which items + should ignore any metadata + assigned to them. + title: "Items: " + list: " - [number] x [item]" + none: "No items have been added." remove_ignored_meta: - name: "&f&l Remove Ignore Metadata" + name: "Remove Ignore Metadata" description: |- - &7 Removes items that ignore metadata - &7 assigned to them. + Removes items that ignore metadata + assigned to them. remove_experience: - name: "&f&l Remove Experience" - description: |- - &7 Toggle whether the required - &7 experience will be removed - &7 from the player after completing - &7 the challenge. - enabled: "&2 Enabled" - disabled: "&c Disabled" + name: "Remove Experience" + description: |- + Toggle whether the required + experience will be removed + from the player after completing + the challenge. + enabled: "Enabled" + disabled: "Disabled" required_experience: - name: "&f&l Required Experience" + name: "Required Experience" description: |- - &7 Allows you to change the required - &7 experience for the player. - value: "&7 Current experience: &e [number]" + Allows you to change the required + experience for the player. + value: "Current experience: [number]" required_level: - name: "&f&l Required Island Level" + name: "Required Island Level" description: |- - &7 Allows you to change the - &7 required island level - &7 for the challenge. - value: "&7 Current level: &e [number]" + Allows you to change the + required island level + for the challenge. + value: "Current level: [number]" required_materialtags: - name: "&f&l Required Block Groups" - description: |- - &7 Allows you to change the required - &7 block groups for this challenge to - &7 be completed. - title: "&7 Block group: " - list: " &8 - [number] x [tag]" - none: "&7 No block groups have been added." + name: "Required Block Groups" + description: |- + Allows you to change the required + block groups for this challenge to + be completed. + title: "Block group: " + list: " - [number] x [tag]" + none: "No block groups have been added." required_entitytags: - name: "&f&l Required Entity Groups" - description: |- - &7 Allows you to change the required - &7 entity groups for this challenge to - &7 be completed. - title: "&7 Entity group: " - list: " &8 - [number] x [tag]" - none: "&7 No entity groups have been added." + name: "Required Entity Groups" + description: |- + Allows you to change the required + entity groups for this challenge to + be completed. + title: "Entity group: " + list: " - [number] x [tag]" + none: "No entity groups have been added." remove_money: - name: "&f&l Remove Money" - description: |- - &7 Toggle whether the required - &7 money will be removed from - &7 the player's account after - &7 completing the challenge. - enabled: "&2 Enabled" - disabled: "&c Disabled" + name: "Remove Money" + description: |- + Toggle whether the required + money will be removed from + the player's account after + completing the challenge. + enabled: "Enabled" + disabled: "Disabled" required_money: - name: "&f&l Required Money" + name: "Required Money" description: |- - &7 Allows you to change the required - &7 money on the player's - &7 account for the challenge. - value: "&7 Current value: &e [number]" + Allows you to change the required + money on the player's + account for the challenge. + value: "Current value: [number]" required_papi: - name: "&f&l Required PAPI" + name: "Required PAPI" description: |- - &7 Checks a formula that can - &7 include PAPI placeholders - &7 and math and logical elements. - value: "&7 Formula: &e [formula]" + Checks a formula that can + include PAPI placeholders + and math and logical elements. + value: "Formula: [formula]" statistic: - name: "&f&l Statistic" + name: "Statistic" description: |- - &7 Allows you to change the statistic - &7 type that is checked for - &7 this challenge. - value: "&7 Current value: &e [statistic]" + Allows you to change the statistic + type that is checked for + this challenge. + value: "Current value: [statistic]" statistic_amount: - name: "&f&l Target Value" + name: "Target Value" description: |- - &7 Allows you to change the target - &7 statistic value - &7 that must be met. - value: "&7 Current value: &e [number]" + Allows you to change the target + statistic value + that must be met. + value: "Current value: [number]" add_statistic: - name: "&f&l Add Statistic" + name: "Add Statistic" description: |- - &7 Allows you to add a new - &7 statistic to the list. + Allows you to add a new + statistic to the list. remove_statistic: - name: "&f&l Remove Statistic" + name: "Remove Statistic" description: |- - &7 Allows you to remove - &7 selected statistics - &7 from the list. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Allows you to remove + selected statistics + from the list. + enabled: "Enabled" + disabled: "Disabled" advancement: - name: "&f&l [name]" + name: "[name]" description: "[description]" add_advancement: - name: "&f&l Add Advancement" + name: "Add Advancement" description: |- - &7 Allows you to add a new - &7 advancement to the list. + Allows you to add a new + advancement to the list. remove_advancement: - name: "&f&l Remove Advancement" + name: "Remove Advancement" description: |- - &7 Allows you to remove - &7 selected advancements - &7 from the list. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Allows you to remove + selected advancements + from the list. + enabled: "Enabled" + disabled: "Disabled" statistic_blocks: - name: "&f&l Target Block" + name: "Target Block" description: |- - &7 Allows you to change the target - &7 block for the statistic. - value: "&7 Current block: &e [block]" + Allows you to change the target + block for the statistic. + value: "Current block: [block]" statistic_items: - name: "&f&l Target Item" + name: "Target Item" description: |- - &7 Allows you to change the target - &7 item for the statistic. - value: "&7 Current item: &e [item]" + Allows you to change the target + item for the statistic. + value: "Current item: [item]" statistic_entities: - name: "&f&l Target Entity" + name: "Target Entity" description: |- - &7 Allows you to change the target - &7 entity for the statistic. - value: "&7 Current entity: &e [entity]" + Allows you to change the target + entity for the statistic. + value: "Current entity: [entity]" reward_text: - name: "&f&l Reward Text" + name: "Reward Text" description: |- - &7 Specifies the reward text. - &7 Color codes must be applied. - value: "&7 Current text:" + Specifies the reward text. + Color codes must be applied. + value: "Current text:" repeat_reward_text: - name: "&f&l Repeat Reward Text" + name: "Repeat Reward Text" description: |- - &7 Specifies the repeat reward - &7 text for the challenge. - &7 Color codes must be applied. - value: "&7 Current text:" + Specifies the repeat reward + text for the challenge. + Color codes must be applied. + value: "Current text:" reward_items: - name: "&f&l Reward Items" + name: "Reward Items" description: |- - &7 Allows you to change the reward items. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 No items have been added." + Allows you to change the reward items. + title: "Items: " + list: " - [number] x [item]" + none: "No items have been added." repeat_reward_items: - name: "&f&l Repeat Reward Items" + name: "Repeat Reward Items" description: |- - &7 Allows you to change the repeat - &7 reward items for this challenge. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 No items have been added." + Allows you to change the repeat + reward items for this challenge. + title: "Items: " + list: " - [number] x [item]" + none: "No items have been added." reward_experience: - name: "&f&l Reward Experience" + name: "Reward Experience" description: |- - &7 Allows you to change the reward + Allows you to change the reward & experience for the player. - value: "&7 Reward experience: &e [number]" + value: "Reward experience: [number]" repeat_reward_experience: - name: "&f&l Repeat Reward Experience" + name: "Repeat Reward Experience" description: |- - &7 Allows you to change the repeat - &7 reward experience for the player. - value: "&7 Reward experience: &e [number]" + Allows you to change the repeat + reward experience for the player. + value: "Reward experience: [number]" reward_money: - name: "&f&l Reward Money" + name: "Reward Money" description: |- - &7 Allows you to change the reward money. - value: "&7 Current value: &e [number]" + Allows you to change the reward money. + value: "Current value: [number]" repeat_reward_money: - name: "&f&l Repeat Reward Money" + name: "Repeat Reward Money" description: |- - &7 Allows you to change the repeat - &7 reward money for the challenge. - value: "&7 Current value: &e [number]" + Allows you to change the repeat + reward money for the challenge. + value: "Current value: [number]" reward_commands: - name: "&f&l Reward Commands" - description: |- - &7 Specifies the reward commands. - &8 Tip: - &8 The command does not require a leading `/` as it is - &8 applied automatically. - &8 By default, commands are executed by the server. - &8 However, adding `[SELF]` at the beginning will cause - &8 the command to be executed by the player. - &8 It also supports the placeholder `[player]` which will be - &8 replaced with the name of the player who completed the challenge. - value: "&7 Current commands:" + name: "Reward Commands" + description: |- + Specifies the reward commands. + Tip: + The command does not require a leading `/` as it is + applied automatically. + By default, commands are executed by the server. + However, adding `[SELF]` at the beginning will cause + the command to be executed by the player. + It also supports the placeholder `[player]` which will be + replaced with the name of the player who completed the challenge. + value: "Current commands:" repeat_reward_commands: - name: "&f&l Repeat Reward Commands" - description: |- - &7 Specifies the repeat reward commands for the challenge. - &8 Tip: - &8 The command does not require a leading `/` as it is - &8 applied automatically. - &8 By default, commands are executed by the server. - &8 However, adding `[SELF]` at the beginning will cause - &8 the command to be executed by the player. - &8 It also supports the placeholder `[player]` which will be - &8 replaced with the name of the player who completed the challenge. - value: "&7 Current commands:" + name: "Repeat Reward Commands" + description: |- + Specifies the repeat reward commands for the challenge. + Tip: + The command does not require a leading `/` as it is + applied automatically. + By default, commands are executed by the server. + However, adding `[SELF]` at the beginning will cause + the command to be executed by the player. + It also supports the placeholder `[player]` which will be + replaced with the name of the player who completed the challenge. + value: "Current commands:" repeatable: - name: "&f&l Repeatable" + name: "Repeatable" description: |- - &7 Toggle whether the challenge is repeatable. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Toggle whether the challenge is repeatable. + enabled: "Enabled" + disabled: "Disabled" repeat_count: - name: "&f&l Repeat Count" + name: "Repeat Count" description: |- - &7 Allows you to change the number of repeats - &7 for the challenge. - value: "&7 Current value: &e [number]" + Allows you to change the number of repeats + for the challenge. + value: "Current value: [number]" cool_down: - name: "&f&l Cool Down" + name: "Cool Down" description: |- - &7 Allows you to change the cooldown - &7 period (in seconds) that must elapse - &7 between repeatable challenge completions. - value: "&7 Current value: &e [time]" + Allows you to change the cooldown + period (in seconds) that must elapse + between repeatable challenge completions. + value: "Current value: [time]" challenges: - name: "&f&l Challenges" + name: "Challenges" description: |- - &7 View challenges assigned - &7 to the level. + View challenges assigned + to the level. waiver_amount: - name: "&f&l Waiver Amount" + name: "Waiver Amount" description: |- - &7 Allows you to set the number of challenges - &7 that can be left uncompleted to unlock - &7 the next level. - value: "&7 Current value: &e [number]" + Allows you to set the number of challenges + that can be left uncompleted to unlock + the next level. + value: "Current value: [number]" add_challenges: - name: "&f&l Add Challenge(-s)" + name: "Add Challenge(-s)" description: |- - &7 Allows you to select and add - &7 challenges to the level. + Allows you to select and add + challenges to the level. remove_challenges: - name: "&f&l Remove Challenge(-s)" + name: "Remove Challenge(-s)" description: |- - &7 Allows you to select and remove - &7 challenges from the level. + Allows you to select and remove + challenges from the level. reset_on_new: - name: "&f&l Reset On New" + name: "Reset On New" description: |- - &7 Toggle whether challenges should + Toggle whether challenges should & be reset when a user leaves - &7 their island or creates a new one. - enabled: "&2 Enabled" - disabled: "&c Disabled" + their island or creates a new one. + enabled: "Enabled" + disabled: "Disabled" broadcast: - name: "&f&l Broadcast" + name: "Broadcast" description: |- - &7 Broadcasts the first-time completion - &7 of a challenge or level to everyone. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Broadcasts the first-time completion + of a challenge or level to everyone. + enabled: "Enabled" + disabled: "Disabled" remove_completed: - name: "&f&l Hide Completed" + name: "Hide Completed" description: |- - &7 Hides completed challenges - &7 from the menu. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Hides completed challenges + from the menu. + enabled: "Enabled" + disabled: "Disabled" glow_completed: - name: "&f&l Glow Completed Challenges" + name: "Glow Completed Challenges" description: |- - &7 Applies an enchantment glow - &7 to completed challenges. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Applies an enchantment glow + to completed challenges. + enabled: "Enabled" + disabled: "Disabled" glow_completed_levels: - name: "&f&l Glow Completed Levels" + name: "Glow Completed Levels" description: |- - &7 Applies an enchantment glow - &7 to completed levels. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Applies an enchantment glow + to completed levels. + enabled: "Enabled" + disabled: "Disabled" store_history: - name: "&f&l Store History" - description: |- - &7 Stores internal history each time - &7 a challenge is completed. - &7 Currently viewable only in the - &7 database. - enabled: "&2 Enabled" - disabled: "&c Disabled" + name: "Store History" + description: |- + Stores internal history each time + a challenge is completed. + Currently viewable only in the + database. + enabled: "Enabled" + disabled: "Disabled" data_per_island: - name: "&f&l Store Per Island" - description: |- - &7 Stores completed challenges - &7 on a per-island basis. - &7 Progress will be shared - &7 with all team members. - enabled: "&2 Enabled" - disabled: "&c Disabled" + name: "Store Per Island" + description: |- + Stores completed challenges + on a per-island basis. + Progress will be shared + with all team members. + enabled: "Enabled" + disabled: "Disabled" show_title: - name: "&f&l Show Title" + name: "Show Title" description: |- - &7 Displays a title when a challenge - &7 or level is completed. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Displays a title when a challenge + or level is completed. + enabled: "Enabled" + disabled: "Disabled" gamemode_gui: - name: "&f&l GameMode Selection GUI" + name: "GameMode Selection GUI" description: |- - &7 Enables a single GUI accessible - &7 via the /challenges command. - &7 (Requires server restart.) - enabled: "&2 Enabled" - disabled: "&c Disabled" + Enables a single GUI accessible + via the /challenges command. + (Requires server restart.) + enabled: "Enabled" + disabled: "Disabled" locked_level_icon: - name: "&f&l Default Locked Level Icon" + name: "Default Locked Level Icon" description: |- - &7 Default icon for all locked levels. - &7 Each level can override this icon. + Default icon for all locked levels. + Each level can override this icon. purge_history: - name: "&f&l History Lifetime" - description: |- - &7 Specifies the number of days - &7 that history data is stored - &7 in user data. - &7 A value of 0 means the data will - &7 not be removed. - value: "&7 Current value: &e [number]" + name: "History Lifetime" + description: |- + Specifies the number of days + that history data is stored + in user data. + A value of 0 means the data will + not be removed. + value: "Current value: [number]" title_showtime: - name: "&f&l Title Showtime" + name: "Title Showtime" description: |- - &7 Number of ticks the title will + Number of ticks the title will & be displayed to the player. - value: "&7 Current value: &e [number]" + value: "Current value: [number]" active_world_list: - name: "&f&l Show Only Active World" - description: |- - &7 If the GameMode Selection GUI is - &7 enabled, this setting determines - &7 whether the GUI displays the - &7 GameMode selection or challenges - &7 for the current world. - &7 (Requires server restart.) - enabled: "&2 Enabled" - disabled: "&c Disabled" + name: "Show Only Active World" + description: |- + If the GameMode Selection GUI is + enabled, this setting determines + whether the GUI displays the + GameMode selection or challenges + for the current world. + (Requires server restart.) + enabled: "Enabled" + disabled: "Disabled" visibility_mode: - name: "&f&l Visibility Mode" + name: "Visibility Mode" description: |- - &7 Visibility mode for challenges that are hidden. - enabled: "&2" - disabled: "&c" + Visibility mode for challenges that are hidden. + enabled: "" + disabled: "" visible: "Show visible challenges" hidden: "Show all challenges" toggleable: "Allow toggling" include_undeployed: - name: "&f&l Include Undeployed Challenges" + name: "Include Undeployed Challenges" description: |- - &7 Indicates whether undeployed challenges - &7 should be counted towards level completion. - enabled: "&2 Enabled" - disabled: "&c Disabled" + Indicates whether undeployed challenges + should be counted towards level completion. + enabled: "Enabled" + disabled: "Disabled" download: - name: "&f&l Download Libraries" - description: |- - &7 Manually updates the available - &7 challenges libraries. - enabled: "&2 With cache clear" - disabled: "&c Without cache clear" + name: "Download Libraries" + description: |- + Manually updates the available + challenges libraries. + enabled: "With cache clear" + disabled: "Without cache clear" + language: + name: "Language" + description: |- + Filter challenge libraries + by language. + current: "Showing: [lang]" + all: "All" player: - name: "&f&l [name]" + name: "[name]" description: |- - &7 Island Owner: [owner] - members: "&7 Island Members:" - member: "&8 - [name]" + Island Owner: [owner] + members: "Island Members:" + member: "- [name]" no-island: |- - &c This player does not have - &c an island. + This player does not have + an island. player_list: - name: "&f&l Choose User List" + name: "Choose User List" description: |- - &7 Choose which user list - &7 should be displayed. - enabled: "&2" - disabled: "&c" + Choose which user list + should be displayed. + enabled: "" + disabled: "" online: "Online Players" with_island: "Players With Islands" in_world: "Players In World" add_block: - name: "&f&l Add Block" + name: "Add Block" description: |- - &7 Allows you to add a new - &7 block to the list. + Allows you to add a new + block to the list. add_block_group: - name: "&f&l Add Block Group" + name: "Add Block Group" description: |- - &7 Allows you to add a new - &7 block group to the list. + Allows you to add a new + block group to the list. remove_block: - name: "&f&l Remove Block" + name: "Remove Block" description: |- - &7 Allows you to remove - &7 selected blocks - &7 from the list. - title: "&7 Selected Materials:" - material: "&8 - [material]" + Allows you to remove + selected blocks + from the list. + title: "Selected Materials:" + material: "- [material]" remove_block_group: - name: "&f&l Remove Block Group" + name: "Remove Block Group" description: |- - &7 Allows you to remove - &7 selected block groups - &7 from the list. - title: "&7 Selected Block Groups:" - material: "&8 - [material]" + Allows you to remove + selected block groups + from the list. + title: "Selected Block Groups:" + material: "- [material]" material: - name: "&f&l [material]" + name: "[material]" description: |- - &7 Material ID: [id] - selected: "&2 Selected" + Material ID: [id] + selected: "Selected" block-group: - name: "&f&l [id]" + name: "[id]" description: "" - selected: "&2 Selected" + selected: "Selected" add_entity: - name: "&f&l Add Entity" + name: "Add Entity" description: |- - &7 Allows you to add a new - &7 entity to the list. + Allows you to add a new + entity to the list. add_entity_group: - name: "&f&l Add Entity Group" + name: "Add Entity Group" description: |- - &7 Allows you to add a new - &7 entity group to the list. + Allows you to add a new + entity group to the list. switch_entity: - name: "&f&l Switch Eggs" + name: "Switch Eggs" description: |- - &7 Allows you to switch from - &7 eggs to mob heads. + Allows you to switch from + eggs to mob heads. remove_entity: - name: "&f&l Remove Entity" + name: "Remove Entity" description: |- - &7 Allows you to remove - &7 selected entities - &7 from the list. - title: "&7 Selected Entities:" - entity: "&8 - [entity]" + Allows you to remove + selected entities + from the list. + title: "Selected Entities:" + entity: "- [entity]" remove_entity_group: - name: "&f&l Remove Entity Group" + name: "Remove Entity Group" description: |- - &7 Allows you to remove - &7 selected entity groups - &7 from the list. - title: "&7 Selected Entity Groups:" - entity: "&8 - [tag]" + Allows you to remove + selected entity groups + from the list. + title: "Selected Entity Groups:" + entity: "- [tag]" entity: - name: "&f&l [entity]" + name: "[entity]" description: |- - &7 Entity ID: [id] - selected: "&2 Selected" + Entity ID: [id] + selected: "Selected" entity-group: - name: "&f&l [id]" + name: "[id]" description: "" - selected: "&2 Selected" + selected: "Selected" inventory_type: - name: "&f&l Inventory Type" + name: "Inventory Type" description: |- - &7 Challenge that checks items - &7 in the player's inventory. + Challenge that checks items + in the player's inventory. island_type: - name: "&f&l Island Type" + name: "Island Type" description: |- - &7 Challenge that checks blocks - &7 or entities around the player. + Challenge that checks blocks + or entities around the player. other_type: - name: "&f&l Other Type" + name: "Other Type" description: |- - &7 Challenge that utilizes plugins - &7 or add-on features, - &7 such as level and money. + Challenge that utilizes plugins + or add-on features, + such as level and money. statistic_type: - name: "&f&l Statistic Type" + name: "Statistic Type" description: |- - &7 Challenge that checks the - &7 player's statistic data. + Challenge that checks the + player's statistic data. save: - name: "&f&l Save" + name: "Save" description: |- - &7 Saves changes and - &7 returns. + Saves changes and + returns. cancel: - name: "&f&l Cancel" + name: "Cancel" description: |- - &7 Discards changes and - &7 returns. + Discards changes and + returns. accept_selected: - name: "&f&l Accept Selected" + name: "Accept Selected" description: |- - &7 Returns the selected elements - &7 and reopens the previous GUI. - title: "&7 Selected: " - element: "&8 - [element]" + Returns the selected elements + and reopens the previous GUI. + title: "Selected: " + element: "- [element]" advancement_element: - name: "&f&l [name]" + name: "[name]" description: "[description]" - selected: "&2 Selected" + selected: "Selected" statistic_element: - name: "&f&l [statistic]" - amount: "&7 Target Value: &e [number]" + name: "[statistic]" + amount: "Target Value: [number]" remove: - name: "&7 Reduce Statistic: [value]" + name: "Reduce Statistic: [value]" value: - enabled: "&c Enabled" - disabled: "&2 Disabled" - block: "&7 Target Block: &e [block]" - item: "&7 Target Item: &e [item]" - entity: "&7 Target Entity: &e [entity]" + enabled: "Enabled" + disabled: "Disabled" + block: "Target Block: [block]" + item: "Target Item: [item]" + entity: "Target Entity: [entity]" description: "[description]" - selected: "&2 Selected" + selected: "Selected" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Search" + name: "Search" description: |- - &7 Allows you to search for an - &7 element using a text input value. - search: "&b Value: [value]" + Allows you to search for an + element using a text input value. + search: "Value: [value]" tips: - click-to-select: "&e Click &7 to select." - click-to-choose: "&e Click &7 to choose." - click-to-complete: "&e Click &7 to complete." - right-click-multiple-open: "&e Right Click &7 to choose a completion count." - shift-left-click-to-complete-all: "&e Shift Click &7 to complete all." - left-click-to-accept: "&e Left Click &7 to complete." - right-click-to-write: "&e Right Click &7 to write." - click-to-reduce: "&e Click &7 to reduce." - click-to-increase: "&e Click &7 to increase." - click-to-return: "&e Click &7 to return." - click-to-quit: "&e Click &7 to quit." - click-to-wipe: "&e Click &7 to wipe." - left-click-to-wipe: "&e Left Click &7 to wipe." - right-click-to-switch: "&e Right Click &7 to switch." - click-to-open: "&e Click &7 to open." - click-to-export: "&e Click &7 to export." - click-to-create: "&e Click &7 to create." - left-click-to-open: "&e Left Click &7 to open." - right-click-to-reset-all: "&e Right Click &7 to reset all." - click-to-toggle: "&e Click &7 to toggle." - click-to-change: "&e Click &7 to change." - shift-click-to-reset: "&e Shift Click &7 to reset." - click-to-add: "&e Click &7 to add." - click-to-remove: "&e Click &7 to remove." - left-click-to-cycle: "&e Left Click &7 to cycle down." - right-click-to-cycle: "&e Right Click &7 to cycle up." - click-to-edit: "&e Click &7 to edit." - left-click-to-download: "&e Left Click &7 to download." - right-click-to-toggle: "&e Right Click &7 to toggle." - click-to-install: "&e Click &7 to install." - click-to-reset-all: "&e Click &7 to reset all." - right-click-to-select: "&e Right Click &7 to select." - right-click-to-deselect: "&e Right Click &7 to deselect." - left-click-to-choose: "&e Left Click &7 to choose." - click-to-cancel: "&e Click &7 to cancel." - click-to-save: "&e Click &7 to save." - click-to-deselect: "&e Click &7 to deselect." + click-to-select: "Click to select." + click-to-choose: "Click to choose." + click-to-complete: "Click to complete." + right-click-multiple-open: "Right Click to choose a completion count." + shift-left-click-to-complete-all: "Shift Click to complete all." + left-click-to-accept: "Left Click to complete." + right-click-to-write: "Right Click to write." + click-to-reduce: "Click to reduce." + click-to-increase: "Click to increase." + click-to-return: "Click to return." + click-to-quit: "Click to quit." + click-to-wipe: "Click to wipe." + left-click-to-wipe: "Left Click to wipe." + right-click-to-switch: "Right Click to switch." + click-to-open: "Click to open." + click-to-export: "Click to export." + click-to-create: "Click to create." + left-click-to-open: "Left Click to open." + right-click-to-reset-all: "Right Click to reset all." + click-to-toggle: "Click to toggle." + click-to-change: "Click to change." + shift-click-to-reset: "Shift Click to reset." + click-to-add: "Click to add." + click-to-remove: "Click to remove." + left-click-to-cycle: "Left Click to cycle down." + right-click-to-cycle: "Right Click to cycle up." + click-to-edit: "Click to edit." + left-click-to-download: "Left Click to download." + right-click-to-toggle: "Right Click to toggle." + click-to-install: "Click to install." + click-to-reset-all: "Click to reset all." + right-click-to-select: "Right Click to select." + right-click-to-deselect: "Right Click to deselect." + right-click-to-reset: "Right Click to reset." + left-click-to-choose: "Left Click to choose." + click-to-cancel: "Click to cancel." + click-to-save: "Click to save." + click-to-deselect: "Click to deselect." click-on-item: |- - &e Click &7 on an item in - &7 your inventory. - left-click-to-edit: "&e Left Click &7 to edit." - right-click-to-clear: "&e Right Click &7 to clear." - click-to-previous: "&e Click &7 to view previous page." - click-to-next: "&e Click &7 to view next page." + Click on an item in + your inventory. + left-click-to-edit: "Left Click to edit." + right-click-to-clear: "Right Click to clear." + click-to-previous: "Click to view previous page." + click-to-next: "Click to view next page." descriptions: # This part generates description text for challenges object in all GUI's. challenge: @@ -952,22 +963,22 @@ challenges: # Contains a text generated inside [status] lore status: # Status message for completed unrepeatable challenge - completed: "&2&l Completed" + completed: "Completed" # Status message that contains number of completions for unlimited repeatable challenge - completed-times: "&2 Completed &7&l [number] &r&2 time(s)" + completed-times: "Completed [number] time(s)" # Status message that contains number of completions from max available for repeatable challenge - completed-times-of: "&2 Completed &7&l [number] &r&2 out of &7&l [max] &r&2 times" + completed-times-of: "Completed [number] out of [max] times" # Status message that indicates that max completion count reached for repeatable challenge - completed-times-reached: "&2&l Completed all &7 [max] &2 times" + completed-times-reached: "Completed all [max] times" # Contains a text generated inside [cooldown] lore cooldown: lore: |- [timeout] [wait-time] # Text message that shows challenge timeout. - timeout: "&7&l Cool down: &r&7 [time]" + timeout: "Cool down: [time]" # Text message that shows challenge wait time if it is larger than 0. - wait-time: "&c&l Available after: &r&c [time]" + wait-time: "Available after: [time]" # Text message that replaces days if number > 1 in-days: "[number] d " # Text message that replaces hours if number > 1 @@ -983,17 +994,17 @@ challenges: [type-requirement] [permissions] # Message that will replace [environment] placeholder if there is just a single environment. - environment-single: "&7 Limited to [environment]" + environment-single: "Limited to [environment]" # Message that will replace [environment] placeholder if there are multiple environments. - environment-title: "&7 Limited to: " + environment-title: "Limited to: " # Message that will be added after environment-title-multiple. - environment-list: " &7 - &e [environment]" + environment-list: " - [environment]" # Message that will replace [permissions] placeholder if there is just a single permission. - permission-single: "&c Requires [permission] permission." + permission-single: "Requires [permission] permission." # Message that will replace [permissions] placeholder if there are multiple permissions. - permissions-title: "&c Requires permissions: " + permissions-title: "Requires permissions: " # Message that will be added after permissions-title-multiple. - permissions-list: " &c - [permission]" + permissions-list: " - [permission]" # Message that will generate for island type requirements and replace [type-requirements] island: lore: |- @@ -1003,32 +1014,32 @@ challenges: [warning-block] [warning-entity] # Title that will be used if there are defined blocks in an island challenge - blocks-title: "&7&l Required Blocks:" + blocks-title: "Required Blocks:" # Listing of blocks that are required on the island. - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" + block-value: " - [material]" + blocks-value: " - [number] x [material]" # Title that will be used if there are defined entities in an island challenge - entities-title: "&7&l Required Entities:" + entities-title: "Required Entities:" # Listing of entities that are required on the island. - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" # Search radius for the blocks/entities - search-radius: "&7 No further than &e [number] &7 meters" + search-radius: "No further than [number] meters" # Warning about block/entity removal - warning-block: "&e Blocks will be &c removed" - warning-entity: "&e Entities will be &c removed" + warning-block: "Blocks will be removed" + warning-entity: "Entities will be removed" # Message that will generate for inventory type requirements and replace [type-requirements] inventory: lore: |- [items] [warning] # Title that will be used if there is a list of items for the challenge - item-title: "&7&l Required Items:" + item-title: "Required Items:" # Listing of an item that is required once or multiple times. - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" + item-value: " - [item]" + items-value: " - [number] x [item]" # Warning that items will be removed - warning: "&e Item(s) will be &c removed" + warning: "Item(s) will be removed" # Message that will generate for other type requirements and replace [type-requirements] other: lore: |- @@ -1038,50 +1049,50 @@ challenges: [money-warning] [level] # Text for required experience - experience: "&7&l Required Experience: &r&e [number]" + experience: "Required Experience: [number]" # Warning that experience will be reduced - experience-warning: "&e Experience will be &c removed" + experience-warning: "Experience will be removed" # Text for required money - money: "&7&l Required money: &r&e [number]" + money: "Required money: [number]" # Warning that money will be reduced - money-warning: "&e Money will be &c removed" + money-warning: "Money will be removed" # Text for required island level - level: "&7&l Required island level: &r&e [number]" + level: "Required island level: [number]" # Message that will generate for statistic type requirements and replace [type-requirement] statistic: lore: |- [statistic] [warning] # Type of statistic for multiple target counter. Target may be entity or material/block - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" + multiple-target: "[statistic]: [number] x [target]" # Type of statistic for a single target. Target may be entity or material/block - single-target: "&7&l [statistic]: &r&e [target]" + single-target: "[statistic]: [target]" # Type of statistic without an entity/block target - statistic: "&7&l [statistic] &r&e [number]" + statistic: "[statistic] [number]" # Warning that statistic will be reduced - warning: "&e Statistic data will be &c reduced" + warning: "Statistic data will be reduced" # Contains a text generated inside [rewards] lore rewards: lore: |- - &7&l Rewards: + Rewards: [text] [items] [experience] [money] [commands] # Title that will be used if there is a list of items for rewards - item-title: "&7 Items:" + item-title: "Items:" # Listing of an item that is rewarded multiple times. - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" + item-value: " - [item]" + items-value: " - [number] x [item]" # Text for reward experience - experience: "&7 Experience: &r&e [number]" + experience: "Experience: [number]" # Text for reward money - money: "&7 Money: &r&e [number]" + money: "Money: [number]" # Title for commands listing: - commands-title: "&7 Commands:" + commands-title: "Commands:" # Command listing element - command: " &7 - &e [command]" + command: " - [command]" # This part generates description text for levels object in all GUI's. level: lore: |- @@ -1092,150 +1103,150 @@ challenges: # Status is either challengeLevel.unlockMessage or the current status of the level status: # Status message for a completed unrepeatable challenge - completed: "&2&l Completed" + completed: "Completed" # Status message that contains the number of completed challenges out of all challenges completed-challenges-of: |- - &2 Completed &7&l [number] &r&2 out of &7&l [max] &r&2 challenges. + Completed [number] out of [max] challenges. # Status message for a locked level - locked: "&c&l Locked" + locked: "Locked" # Status message for a locked level that will show the missing challenge count. missing-challenges: |- - &7 [number] more challenges need to be - &7 completed to unlock this level. + [number] more challenges need to be + completed to unlock this level. # Contains text for the waiver amount to unlock the next level waiver: |- - &7&l [number] challenge(s) can be - &7 skipped to unlock the next level. + [number] challenge(s) can be + skipped to unlock the next level. # Contains text generated inside [rewards] lore rewards: lore: |- - &7&l Rewards: + Rewards: [text] [items] [experience] [money] [commands] - item-title: "&7 Items:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experience: &r&e [number]" - money: "&7 Money: &r&e [number]" - commands-title: "&7 Commands:" - command: " &7 - &e [command]" + item-title: "Items:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experience: [number]" + money: "Money: [number]" + commands-title: "Commands:" + command: " - [command]" # This part generates description for the Library Entry library: - author: "&7 by &e [author]" - version: "&7 Made with Challenges &e [version]" - lang: "&7 Language: &e [lang]" - gamemode: "&7 Primary for &e [gamemode]" + author: "by [author]" + version: "Made with Challenges [version]" + lang: "Language: [lang]" + gamemode: "Primary for [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: "true, on, yes, confirm, y, valid, correct" deny-string: "false, off, no, deny, n, invalid, incorrect" cancel-string: "cancel" exit-string: "cancel, exit, quit" - cancelled: "&c Conversation cancelled!" - input-number: "&e Please enter a number in the chat." - input-seconds: "&e Please enter a number of seconds in the chat." - numeric-only: "&c The given [value] is not a number!" - not-valid-value: "&c The given number [value] is not valid. It must be greater than [min] and less than [max]!" - user-data-removed: "&a All user data for [gamemode] has been cleared from the database." - confirm-user-data-deletion: "&e Please confirm that you want to clear the user database for [gamemode]." - challenge-data-removed: "&a All challenge data for [gamemode] has been cleared from the database." - confirm-challenge-data-deletion: "&e Please confirm that you want to clear the challenges database for [gamemode]." - all-data-removed: "&a All add-on data for [gamemode] has been cleared from the database." - confirm-all-data-deletion: "&e Please confirm that you want to clear the add-on data for [gamemode]." - write-name: "&e Please enter a name in the chat." - new-object-created: "&a A new object for [gamemode] has been created." - object-already-exists: "&c Object &7 [id] &c already exists. Please choose a different name." - invalid-challenge: "&c Challenge [challenge] contains invalid data and cannot be deployed!" - name-changed: "&a Success: the name has been updated." - write-description: "&e Please enter a new description in the chat. Type 'quit' on a new line to finish." - description-changed: "&a Success: the description has been updated." - write-permissions: "&e Please enter the required permissions, one per line, in the chat. Type 'quit' on a new line to finish." - permissions-changed: "&a Success: the challenge permissions have been updated." - write-reward-text: "&e Please enter a new reward text in the chat. Type 'quit' on a new line to finish." - reward-text-changed: "&a Success: the reward text has been updated." - write-repeat-reward-text: "&e Please enter a new repeat reward text in the chat. Type 'quit' on a new line to finish." - repeat-reward-text-changed: "&a Success: the repeat reward text has been updated." - write-reward-commands: "&e Please enter a new reward command on each line in the chat. Type 'quit' on a new line to finish." - reward-commands-changed: "&a Success: the reward commands have been updated." - write-repeat-reward-commands: "&e Please enter a new repeat reward command on each line in the chat. Type 'quit' on a new line to finish." - repeat-reward-commands-changed: "&a Success: the repeat reward commands have been updated." - challenge-removed: "&a Challenge [challenge] for [gamemode] has been removed from the database." - confirm-challenge-deletion: "&e Please confirm that you want to remove [challenge] for [gamemode] from the database." - level-removed: "&a Level [level] for [gamemode] has been removed from the database." - confirm-level-deletion: "&e Please confirm that you want to remove [level] for [gamemode] from the database." - start-downloading: "&a Starting to download and import the Challenges Library." - written-text: "&a Input Text:" - confirm-data-replacement: "&e Please confirm that you want to replace your current challenges with the new ones." - new-challenges-imported: "&a Success: new challenges for [gamemode] have been imported." - exported-file-name: "&e Please enter a file name for the exported database file. (Type 'cancel' to exit)" - database-export-completed: "&a Success: the database export for [world] is complete. File [file] generated." - file-name-exist: "&c A file named '[id]' already exists. Cannot overwrite." - write-search: "&e Please enter a search value. (Type 'cancel' to exit)" - search-updated: "&a Search value updated." - enter-formula: "&a Enter a formula that uses PAPI placeholders and symbols =,<>,<+,>=, ==, !=, AND, OR only.\n&a Example: &7 %my_lifetime_count% >= 1000 AND %island_level% >= 100" + cancelled: "Conversation cancelled!" + input-number: "Please enter a number in the chat." + input-seconds: "Please enter a number of seconds in the chat." + numeric-only: "The given [value] is not a number!" + not-valid-value: "The given number [value] is not valid. It must be greater than [min] and less than [max]!" + user-data-removed: "All user data for [gamemode] has been cleared from the database." + confirm-user-data-deletion: "Please confirm that you want to clear the user database for [gamemode]." + challenge-data-removed: "All challenge data for [gamemode] has been cleared from the database." + confirm-challenge-data-deletion: "Please confirm that you want to clear the challenges database for [gamemode]." + all-data-removed: "All add-on data for [gamemode] has been cleared from the database." + confirm-all-data-deletion: "Please confirm that you want to clear the add-on data for [gamemode]." + write-name: "Please enter a name in the chat." + new-object-created: "A new object for [gamemode] has been created." + object-already-exists: "Object [id] already exists. Please choose a different name." + invalid-challenge: "Challenge [challenge] contains invalid data and cannot be deployed!" + name-changed: "Success: the name has been updated." + write-description: "Please enter a new description in the chat. Type 'quit' on a new line to finish." + description-changed: "Success: the description has been updated." + write-permissions: "Please enter the required permissions, one per line, in the chat. Type 'quit' on a new line to finish." + permissions-changed: "Success: the challenge permissions have been updated." + write-reward-text: "Please enter a new reward text in the chat. Type 'quit' on a new line to finish." + reward-text-changed: "Success: the reward text has been updated." + write-repeat-reward-text: "Please enter a new repeat reward text in the chat. Type 'quit' on a new line to finish." + repeat-reward-text-changed: "Success: the repeat reward text has been updated." + write-reward-commands: "Please enter a new reward command on each line in the chat. Type 'quit' on a new line to finish." + reward-commands-changed: "Success: the reward commands have been updated." + write-repeat-reward-commands: "Please enter a new repeat reward command on each line in the chat. Type 'quit' on a new line to finish." + repeat-reward-commands-changed: "Success: the repeat reward commands have been updated." + challenge-removed: "Challenge [challenge] for [gamemode] has been removed from the database." + confirm-challenge-deletion: "Please confirm that you want to remove [challenge] for [gamemode] from the database." + level-removed: "Level [level] for [gamemode] has been removed from the database." + confirm-level-deletion: "Please confirm that you want to remove [level] for [gamemode] from the database." + start-downloading: "Starting to download and import the Challenges Library." + written-text: "Input Text:" + confirm-data-replacement: "Please confirm that you want to replace your current challenges with the new ones." + new-challenges-imported: "Success: new challenges for [gamemode] have been imported." + exported-file-name: "Please enter a file name for the exported database file. (Type 'cancel' to exit)" + database-export-completed: "Success: the database export for [world] is complete. File [file] generated." + file-name-exist: "A file named '[id]' already exists. Cannot overwrite." + write-search: "Please enter a search value. (Type 'cancel' to exit)" + search-updated: "Search value updated." + enter-formula: "Enter a formula that uses PAPI placeholders and symbols =,<>,<+,>=, ==, !=, AND, OR only.\nExample: %my_lifetime_count% >= 1000 AND %island_level% >= 100" titles: challenge-title: "Success!" challenge-subtitle: "[friendlyName]" level-title: "Success!" level-subtitle: "[friendlyName]" messages: - completed: "&2 You completed the challenge [name] for [player]!" - already-completed: "&2 This challenge has already been completed!" - reset: "&2 You have reset the challenge [name] for [player]!" - reset-all: "&2 All challenges for [player] have been reset!" - not-completed: "&2 This challenge has not been completed yet!" - migrate-start: "&2 Starting migration of challenges add-on data." - migrate-end: "&2 Challenges add-on data has been updated to the new format." - migrate-not: "&2 All data is valid." - start-downloading: "&5 Starting to download and import the Challenges Library." - you-completed-challenge: "&2 You completed the [value] &r &2 challenge!" - you-repeated-challenge: "&2 You repeated the [value] &r &2 challenge!" - you-repeated-challenge-multiple: "&2 You repeated the [value] &r &2 challenge [count] times!" - you-completed-level: "&2 You completed the [value] &r &2 level!" - name-has-completed-challenge: "&5 [name] has completed the [value] &r &5 challenge!" - name-has-completed-level: "&5 [name] has completed the [value] &r &5 level!" + completed: "You completed the challenge [name] for [player]!" + already-completed: "This challenge has already been completed!" + reset: "You have reset the challenge [name] for [player]!" + reset-all: "All challenges for [player] have been reset!" + not-completed: "This challenge has not been completed yet!" + migrate-start: "Starting migration of challenges add-on data." + migrate-end: "Challenges add-on data has been updated to the new format." + migrate-not: "All data is valid." + start-downloading: "Starting to download and import the Challenges Library." + you-completed-challenge: "You completed the [value] challenge!" + you-repeated-challenge: "You repeated the [value] challenge!" + you-repeated-challenge-multiple: "You repeated the [value] challenge [count] times!" + you-completed-level: "You completed the [value] level!" + name-has-completed-challenge: "[name] has completed the [value] challenge!" + name-has-completed-level: "[name] has completed the [value] level!" load-skipping: "\"[value]\" already exists - skipping" load-overwriting: "Overwriting \"[value]\"" load-add: "Adding new object: [value]" errors: - no-name: "&c Missing challenge name" - unknown-challenge: "&c Unknown challenge" + no-name: "Missing challenge name" + unknown-challenge: "Unknown challenge" not-valid-integer: |- - &c The given integer "[value]" is not valid! + The given integer "[value]" is not valid! It should be between [min] and [max]. - not-deployed: "&c The challenge is not deployed!" - not-on-island: "&c You must be on your island to do that!" - challenge-level-not-available: "&c You have not unlocked the required level to complete this challenge." - not-repeatable: "&c This challenge is not repeatable!" - wrong-environment: "&c You are in the wrong environment!" - not-enough-items: "&c You do not have enough [items] to complete this challenge!" - not-close-enough: "&c You must be standing within [number] blocks of all required items." - you-still-need: "&c You still need [amount] x [item]" - missing-addon: "&c Cannot complete the challenge: a required add-on or plugin is missing." - incorrect: "&c Cannot complete the challenge: the requirements are not met." - not-enough-money: "&c You must have [value] in your account to complete the challenge." - not-enough-experience: "&c You must have [value] EXP to complete this challenge." - island-level: "&c Your island must be at least level [number] to complete this challenge!" - no-load: "&c Error: Could not load [file]. Error: [message]." - load-error: "&c Error: Cannot load [value]." - no-rank: "&c You do not have a high enough rank to do that." - cannot-remove-items: "&c Some items cannot be removed from your inventory!" - exist-challenges-or-levels: "&c Challenges already exist in your world. Cannot proceed!" - no-challenges: "&c Challenges are not implemented in this world yet!" - no-challenges-admin: "&c Challenges are not implemented in this world yet! Use &5 /[command] &c to add them!" - missing-arguments: "&c The command is missing arguments." - no-multiple-permission: "&c You do not have permission to complete this challenge multiple times at once." - invalid-level: "&c Level [level] contains invalid data and will not be loaded from the database!" - invalid-challenge: "&c Challenge [challenge] contains invalid data and will not be loaded from the database!" - no-library-entries: "&c No library entries found. Nothing to show." - not-hooked: "&c The Challenges add-on could not find any GameMode." - timeout: "&c This challenge requires a wait time of [timeout] between completions. You must wait [wait-time] before completing it again." - requirement-not-met: "&c This challenge requires [statistic] of [number]. You only have [value]." - requirement-not-met-entity: "&c This challenge requires [statistic] for [entity] to be [number]. You only have [value]." - requirement-not-met-material: "&c This challenge requires [statistic] for [material] to be [number]. You only have [value]." + not-deployed: "The challenge is not deployed!" + not-on-island: "You must be on your island to do that!" + challenge-level-not-available: "You have not unlocked the required level to complete this challenge." + not-repeatable: "This challenge is not repeatable!" + wrong-environment: "You are in the wrong environment!" + not-enough-items: "You do not have enough [items] to complete this challenge!" + not-close-enough: "You must be standing within [number] blocks of all required items." + you-still-need: "You still need [amount] x [item]" + missing-addon: "Cannot complete the challenge: a required add-on or plugin is missing." + incorrect: "Cannot complete the challenge: the requirements are not met." + not-enough-money: "You must have [value] in your account to complete the challenge." + not-enough-experience: "You must have [value] EXP to complete this challenge." + island-level: "Your island must be at least level [number] to complete this challenge!" + no-load: "Error: Could not load [file]. Error: [message]." + load-error: "Error: Cannot load [value]." + no-rank: "You do not have a high enough rank to do that." + cannot-remove-items: "Some items cannot be removed from your inventory!" + exist-challenges-or-levels: "Challenges already exist in your world. Cannot proceed!" + no-challenges: "Challenges are not implemented in this world yet!" + no-challenges-admin: "Challenges are not implemented in this world yet! Use /[command] to add them!" + missing-arguments: "The command is missing arguments." + no-multiple-permission: "You do not have permission to complete this challenge multiple times at once." + invalid-level: "Level [level] contains invalid data and will not be loaded from the database!" + invalid-challenge: "Challenge [challenge] contains invalid data and will not be loaded from the database!" + no-library-entries: "No library entries found. Nothing to show." + not-hooked: "The Challenges add-on could not find any GameMode." + timeout: "This challenge requires a wait time of [timeout] between completions. You must wait [wait-time] before completing it again." + requirement-not-met: "This challenge requires [statistic] of [number]. You only have [value]." + requirement-not-met-entity: "This challenge requires [statistic] for [entity] to be [number]. You only have [value]." + requirement-not-met-material: "This challenge requires [statistic] for [material] to be [number]. You only have [value]." # # Showcase for manual material translation # materials: # # Names should be lowercase. @@ -1253,11 +1264,11 @@ challenges: # meta: # upgraded: "Upgraded" # extended: "Extended" -# potion-meta: "&e [type] [upgraded] [extended]" +# potion-meta: "[type] [upgraded] [extended]" # # Be aware, enchants are always listed below item in separate line. -# enchant-meta: " &7 - &e [type] [level]" -# skull-meta: ": &e [player-name]" -# book-meta: "&e [title] [author]" +# enchant-meta: " - [type] [level]" +# skull-meta: ": [player-name]" +# book-meta: "[title] [author]" # # Custom Enchantment Translation. # enchant: # menting: "Mending" @@ -1301,33 +1312,33 @@ challenges: # challenges: # # Database ID name. # example_challenge_id: -# name: "&2 Translated Name" +# name: "Translated Name" # description: |- -# &7 Translated Custom -# &7 description +# Translated Custom +# description # reward-text: |- -# &7 Translated Reward -# &7 text +# Translated Reward +# text # repeat-reward-text: |- -# &7 Translated Repeat -# &7 Reward text +# Translated Repeat +# Reward text # levels: # # Database ID name. # example_level_id: -# name: "&2 Translated Name" +# name: "Translated Name" # description: |- -# &7 Translated Custom -# &7 description +# Translated Custom +# description # reward-text: |- -# &7 Translated Reward -# &7 text +# Translated Reward +# text protection: flags: CHALLENGES_ISLAND_PROTECTION: - description: "&5 &o Toggle who can\n&5 &o complete challenges" + description: "Toggle who can\ncomplete challenges" name: "Challenges protection" CHALLENGES_WORLD_PROTECTION: - description: "&5 &o Enable/disable\n&5 &o the requirement for players to\n&5 &o be on their island to\n&5 &o complete a challenge." + description: "Enable/disable\nthe requirement for players to\nbe on their island to\ncomplete a challenge." name: "Challenges Island limitation" hint: "No challenges outside the island" version: 12 diff --git a/src/main/resources/locales/es.yml b/src/main/resources/locales/es.yml index 92e8ce0b..2c7630c9 100755 --- a/src/main/resources/locales/es.yml +++ b/src/main/resources/locales/es.yml @@ -32,801 +32,801 @@ challenges: parameters: [count] gui: titles: - player-gui: "&0&l Menú de desafíos" - gamemode-gui: "&0&l Seleccionar modo de juego" - multiple-gui: "&0&l ¿Cuántas veces?" - admin-gui: "&0&l Menú de administración de desafíos" - edit-challenge: "&0&l Editar [challenge]" - edit-level: "&0&l Editar [level]" - settings: "&0&l Configuración" - choose-challenge: "&0&l Elegir desafío" - choose-level: "&0&l Elegir nivel" - choose-player: "&0&l Elegir jugador" - library: "&0&l Biblioteca" - manage-blocks: "&0&l Administrar bloques" - manage-entities: "&0&l Administrar entidades" - type-selector: "&0&l Selector de tipo de desafío" - item-selector: "&0&l Selector de artículos" - block-selector: "&0&l Selector de bloque" - entity-selector: "&0&l Selector de entidad" - challenge-selector: "&0&l Selector de desafío" - statistic-selector: "&0&l Selector de estadísticas" - environment-selector: "&0&l Selector de entorno" + player-gui: "Menú de desafíos" + gamemode-gui: "Seleccionar modo de juego" + multiple-gui: "¿Cuántas veces?" + admin-gui: "Menú de administración de desafíos" + edit-challenge: "Editar [challenge]" + edit-level: "Editar [level]" + settings: "Configuración" + choose-challenge: "Elegir desafío" + choose-level: "Elegir nivel" + choose-player: "Elegir jugador" + library: "Biblioteca" + manage-blocks: "Administrar bloques" + manage-entities: "Administrar entidades" + type-selector: "Selector de tipo de desafío" + item-selector: "Selector de artículos" + block-selector: "Selector de bloque" + entity-selector: "Selector de entidad" + challenge-selector: "Selector de desafío" + statistic-selector: "Selector de estadísticas" + environment-selector: "Selector de entorno" buttons: free-challenges: - name: "&f&l desafíos gratuitos" + name: "desafíos gratuitos" description: |- - &7 Muestra una lista de - &7 desafíos gratuitos + Muestra una lista de + desafíos gratuitos return: - name: "&f&l Devolución" + name: "Devolución" description: |- - &7 Volver al menú anterior - &7 o salir de GUI + Volver al menú anterior + o salir de GUI previous: - name: "&f&l Página anterior" - description: "&7 Cambiar a &e [number] &7 página" + name: "Página anterior" + description: "Cambiar a [number] página" next: - name: "&f&l Página siguiente" - description: "&7 Cambiar a &e [number] &7 página" + name: "Página siguiente" + description: "Cambiar a [number] página" reduce: - name: "&f&l Reducir" - description: "&7 Reducir en &e [number]" + name: "Reducir" + description: "Reducir en [number]" increase: - name: "&f&l Aumento" - description: "&7 Aumentar en &e [number]" + name: "Aumento" + description: "Aumentar en [number]" accept: - name: "&f&l completo" + name: "completo" description: |- - &7 Completa el desafío &e [number] - &7 veces) + Completa el desafío [number] + veces) quit: - name: "&f&l Salir" - description: "&7 Salir de la GUI." + name: "Salir" + description: "Salir de la GUI." complete_user_challenges: - name: "&f&l Complete el(los) desafío(s) de usuario" + name: "Complete el(los) desafío(s) de usuario" description: |- - &7 Permite elegir usuario y - &7 desafíos completos para - &7 él + Permite elegir usuario y + desafíos completos para + él reset_user_challenges: - name: "&f&l Restablecer desafíos de usuario" + name: "Restablecer desafíos de usuario" description: |- - &7 Permite elegir usuario y - &7 restablecer sus desafíos + Permite elegir usuario y + restablecer sus desafíos add_challenge: - name: "&f&l Crear desafío" + name: "Crear desafío" description: |- - &7 Inicia un proceso para - &7 creando un nuevo desafío. + Inicia un proceso para + creando un nuevo desafío. add_level: - name: "&f&l Crear nivel" + name: "Crear nivel" description: |- - &7 Inicia un proceso para - &7 creando un nuevo nivel. + Inicia un proceso para + creando un nuevo nivel. edit_challenge: - name: "&f&l Editar desafío" + name: "Editar desafío" description: |- - &7 Permite elegir y editar - &7 un desafío. + Permite elegir y editar + un desafío. edit_level: - name: "&f&l Editar nivel" + name: "Editar nivel" description: |- - &7 Permite elegir y editar - &7 un nivel. + Permite elegir y editar + un nivel. delete_challenge: - name: "&f&l Eliminar desafío" + name: "Eliminar desafío" description: |- - &7 Permite elegir y eliminar - &7 un desafío. + Permite elegir y eliminar + un desafío. delete_level: - name: "&f&l Eliminar nivel" + name: "Eliminar nivel" description: |- - &7 Permite elegir y eliminar - &7 un nivel. + Permite elegir y eliminar + un nivel. edit_settings: - name: Configuración &f&l + name: Configuración description: |- - &7 Permite ver y editar - &7 configuración de un complemento. + Permite ver y editar + configuración de un complemento. complete_wipe: - name: "&f&l Limpieza completa" + name: "Limpieza completa" description: |- - &7 Elimina completamente los desafíos - &7 base de datos adicional, incluida - &7 datos de usuario. + Elimina completamente los desafíos + base de datos adicional, incluida + datos de usuario. challenge_wipe: - name: "&f&l Desafío Limpiar" + name: "Desafío Limpiar" description: |- - &7 Elimina completamente los desafíos - &7 y niveles de la base de datos. + Elimina completamente los desafíos + y niveles de la base de datos. user_wipe: - name: "&f&l borrado de usuario" + name: "borrado de usuario" description: |- - &7 borra completamente al usuario - &7 datos de la base de datos. + borra completamente al usuario + datos de la base de datos. library: - name: Biblioteca &f&l + name: Biblioteca description: |- - &7 Abre un público - &7 biblioteca de desafíos. + Abre un público + biblioteca de desafíos. import_database: - name: "&f&l Importar base de datos" + name: "Importar base de datos" description: |- - &7 Permite importar exportado - &7 base de datos de desafíos. + Permite importar exportado + base de datos de desafíos. import_template: - name: Plantilla de importación &f&l + name: Plantilla de importación description: |- - &7 Permite importar plantilla - &7 archivo con desafíos. + Permite importar plantilla + archivo con desafíos. export_challenges: - name: "&f&l Desafíos de Exportación" + name: "Desafíos de Exportación" description: |- - &7 Permite exportar base de datos - &7 a un archivo local. + Permite exportar base de datos + a un archivo local. properties: - name: Propiedades &f&l - description: "&7 Ver todas las propiedades principales." + name: Propiedades + description: "Ver todas las propiedades principales." requirements: - name: Requisitos &f&l - description: "&7 Ver propiedades de requisitos." + name: Requisitos + description: "Ver propiedades de requisitos." rewards: - name: Recompensas &f&l - description: "&7 Ver propiedades de recompensas." + name: Recompensas + description: "Ver propiedades de recompensas." deployed: - name: Implementación &f&l + name: Implementación description: |- - &7 Alternar si el desafío es - &7 implementado y los usuarios pueden - &7 complétalo. - enabled: "&2 habilitado" + Alternar si el desafío es + implementado y los usuarios pueden + complétalo. + enabled: "habilitado" disabled: etc. deshabilitado name: - name: "&f&l Nombre" + name: "Nombre" description: |- - &7 Permite cambiar - &7 el nombre para mostrar. - value: "&7 Actualmente: &r [name]" + Permite cambiar + el nombre para mostrar. + value: "Actualmente: [name]" remove_on_complete: - name: "&f&l Ocultar después de finalizar" + name: "Ocultar después de finalizar" description: |- - &7 Alternar si el desafío debe - &7 oculto al jugador después - &7 está completo. - enabled: "&2 habilitado" + Alternar si el desafío debe + oculto al jugador después + está completo. + enabled: "habilitado" disabled: etc. deshabilitado description: - name: "&f&l descripción" + name: "descripción" description: |- - &7 La descripción específica - &7 para el desafío. El color - Se le deben aplicar códigos &7. - value: "&7 Descripción actual:" + La descripción específica + para el desafío. El color + Se le deben aplicar códigos . + value: "Descripción actual:" environment: - name: Dimensión &f&l + name: Dimensión description: |- - &7 Permite limitar en que - &7 dimensión del desafío - &7 se puede completar. - enabled: "&2" - disabled: "&C" + Permite limitar en que + dimensión del desafío + se puede completar. + enabled: "" + disabled: "" order: - name: "&f&l Orden" - description: |- - &7 Permite cambiar el orden de - &7 objetos. - &7 Objetos con números iguales - &7 serán ordenados por su - &7 nombres de identificación únicos. - value: "&7 Orden actual: &e [number]" + name: "Orden" + description: |- + Permite cambiar el orden de + objetos. + Objetos con números iguales + serán ordenados por su + nombres de identificación únicos. + value: "Orden actual: [number]" icon: - name: Icono &f&l + name: Icono description: |- - &7 Permite cambiar icono - &7 para este desafío. + Permite cambiar icono + para este desafío. locked_icon: - name: "&f&l icono bloqueado" + name: "icono bloqueado" description: |- - &7 Permite cambiar bloqueado - &7 icono de nivel. + Permite cambiar bloqueado + icono de nivel. required_permissions: - name: "&f&l Permisos requeridos" - description: |- - &7 Permite el cambio requerido - &7 permisos para esto - &7 desafío para ser completable. - title: "&7 permisos:" - permission: " &8 - [permission]" - none: "&7 Los permisos no están establecidos." + name: "Permisos requeridos" + description: |- + Permite el cambio requerido + permisos para esto + desafío para ser completable. + title: "permisos:" + permission: " - [permission]" + none: "Los permisos no están establecidos." remove_entities: - name: "&f&l Eliminar entidades" - description: |- - &7 Permite alternar si - &7 entidades requeridas - &7 ser eliminado del mundo - &7 después de completar el - &7 desafío. - enabled: "&2 habilitado" + name: "Eliminar entidades" + description: |- + Permite alternar si + entidades requeridas + ser eliminado del mundo + después de completar el + desafío. + enabled: "habilitado" disabled: etc. deshabilitado required_entities: - name: "&f&l entidades requeridas" - description: |- - &7 Permite el cambio requerido - &7 entidades para esto - &7 desafío para ser completable. - title: "&7 entidades:" - list: " &8 - [number] x [entity]" - none: "&7 Entidades no se agregan." + name: "entidades requeridas" + description: |- + Permite el cambio requerido + entidades para esto + desafío para ser completable. + title: "entidades:" + list: " - [number] x [entity]" + none: "Entidades no se agregan." remove_blocks: - name: "&f&l Quitar bloques" - description: |- - &7 Permite alternar si - &7 bloques requeridos - &7 ser eliminado del mundo - &7 después de completar el - &7 desafío. - enabled: "&2 habilitado" + name: "Quitar bloques" + description: |- + Permite alternar si + bloques requeridos + ser eliminado del mundo + después de completar el + desafío. + enabled: "habilitado" disabled: etc. deshabilitado required_blocks: - name: "&f&l Bloques requeridos" - description: |- - &7 Permite el cambio requerido - &7 bloques para esto - &7 desafío para ser completable. - title: "&7 bloques:" - list: " &8 - [number] x [block]" - none: "&7 bloques no se agregan." + name: "Bloques requeridos" + description: |- + Permite el cambio requerido + bloques para esto + desafío para ser completable. + title: "bloques:" + list: " - [number] x [block]" + none: "bloques no se agregan." search_radius: - name: "&f&l Radio de búsqueda" + name: "Radio de búsqueda" description: |- - &7 Permite cambiar el radio - &7 alrededor del jugador del cual - &7 bloques y/o entidades son - &7 detectado. - value: "&7 Distancia actual: &e [number]" + Permite cambiar el radio + alrededor del jugador del cual + bloques y/o entidades son + detectado. + value: "Distancia actual: [number]" remove_items: - name: "&f&l Eliminar elementos" - description: |- - &7 Permite alternar si - &7 artículos requeridos - &7 será eliminado del inventario - &7 después de completar el - &7 desafío. - enabled: "&2 habilitado" + name: "Eliminar elementos" + description: |- + Permite alternar si + artículos requeridos + será eliminado del inventario + después de completar el + desafío. + enabled: "habilitado" disabled: etc. deshabilitado required_items: - name: "&f&l Artículos requeridos" - description: |- - &7 Permite el cambio requerido - &7 artículos para esto - &7 desafío para ser completable. - title: "&7 artículos:" - list: " &8 - [number] x [item]" - none: "&7 Los artículos no se agregan." + name: "Artículos requeridos" + description: |- + Permite el cambio requerido + artículos para esto + desafío para ser completable. + title: "artículos:" + list: " - [number] x [item]" + none: "Los artículos no se agregan." add_ignored_meta: - name: "&f&l Agregar Ignorar metadatos" - description: |- - &7 Permite agregar cual - &7 elementos deben ignorarse - &7 cualquier metadato que - Se les asigna &7. - title: "&7 artículos:" - list: " &8 - [number] x [item]" - none: "&7 Los artículos no se agregan." + name: "Agregar Ignorar metadatos" + description: |- + Permite agregar cual + elementos deben ignorarse + cualquier metadato que + Se les asigna . + title: "artículos:" + list: " - [number] x [item]" + none: "Los artículos no se agregan." remove_ignored_meta: - name: "&f&l Eliminar Ignorar metadatos" + name: "Eliminar Ignorar metadatos" description: |- - &7 Permite eliminar qué - &7 elementos deben ignorarse - &7 cualquier metadato que - Se les asigna &7. + Permite eliminar qué + elementos deben ignorarse + cualquier metadato que + Se les asigna . remove_experience: - name: "&f&l Eliminar experiencia" - description: |- - &7 Permite alternar si - &7 experiencia requerida - &7 será eliminado del jugador - &7 después de completar el - &7 desafío. - enabled: "&2 habilitado" + name: "Eliminar experiencia" + description: |- + Permite alternar si + experiencia requerida + será eliminado del jugador + después de completar el + desafío. + enabled: "habilitado" disabled: etc. deshabilitado required_experience: - name: "&f&l Experiencia requerida" + name: "Experiencia requerida" description: |- - &7 Permite cambiar el - &7 experiencia requerida para - &7 el jugador. - value: "&7 Experiencia actual: &e [number]" + Permite cambiar el + experiencia requerida para + el jugador. + value: "Experiencia actual: [number]" required_level: - name: "&f&l Nivel de isla requerido" + name: "Nivel de isla requerido" description: |- - &7 Permite cambiar el - &7 nivel de isla requerido - &7 para el desafío. - value: "&7 Nivel actual: &e [number]" + Permite cambiar el + nivel de isla requerido + para el desafío. + value: "Nivel actual: [number]" remove_money: - name: "&f&l Quitar dinero" - description: |- - &7 Permite alternar si - &7 dinero requerido - &7 será eliminado del jugador - &7 cuenta después de completar - &7 el desafío. - enabled: "&2 habilitado" + name: "Quitar dinero" + description: |- + Permite alternar si + dinero requerido + será eliminado del jugador + cuenta después de completar + el desafío. + enabled: "habilitado" disabled: etc. deshabilitado required_money: - name: "&f&l Dinero requerido" + name: "Dinero requerido" description: |- - &7 Permite cambiar el - &7 dinero requerido en el jugador - &7 explica el desafío. - value: "&7 Valor actual: &e [number]" + Permite cambiar el + dinero requerido en el jugador + explica el desafío. + value: "Valor actual: [number]" statistic: - name: "&f&l estadística" + name: "estadística" description: |- - &7 Permite cambiar el - &7 tipo de estadística que es - &7 marcó este desafío. - value: "&7 Valor actual: &e [statistic]" + Permite cambiar el + tipo de estadística que es + marcó este desafío. + value: "Valor actual: [statistic]" statistic_amount: - name: "&f&l Valor objetivo" + name: "Valor objetivo" description: |- - &7 Permite cambiar el - &7 valor objetivo estadístico - &7 que se debe cumplir. - value: "&7 Valor actual: &e [number]" + Permite cambiar el + valor objetivo estadístico + que se debe cumplir. + value: "Valor actual: [number]" remove_statistic: - name: "&f&l Reducir estadística" + name: "Reducir estadística" description: |- - &7 Permite alternar si - &7 valor estadístico - &7 se reducirá después de completar - &7 el desafío. - enabled: "&2 habilitado" + Permite alternar si + valor estadístico + se reducirá después de completar + el desafío. + enabled: "habilitado" disabled: etc. deshabilitado statistic_blocks: - name: Bloque de destino &f&l + name: Bloque de destino description: |- - &7 Permite cambiar el - &7 bloque objetivo estadístico. - value: "&7 Bloque actual: &e [block]" + Permite cambiar el + bloque objetivo estadístico. + value: "Bloque actual: [block]" statistic_items: - name: "&f&l Artículo de destino" + name: "Artículo de destino" description: |- - &7 Permite cambiar el - &7 elemento objetivo estadístico. - value: "&7 Artículo actual: &e [item]" + Permite cambiar el + elemento objetivo estadístico. + value: "Artículo actual: [item]" statistic_entities: - name: "&f&l entidad objetivo" + name: "entidad objetivo" description: |- - &7 Permite cambiar el - &7 entidad objetivo estadística. - value: "&7 Entidad actual: &e [entity]" + Permite cambiar el + entidad objetivo estadística. + value: "Entidad actual: [entity]" reward_text: - name: "&f&l Texto de recompensa" + name: "Texto de recompensa" description: |- - &7 El texto de recompensa específico. - &7 Los códigos de color deben ser - &7 aplicado a él. - value: "&7 Texto actual:" + El texto de recompensa específico. + Los códigos de color deben ser + aplicado a él. + value: "Texto actual:" repeat_reward_text: - name: "&f&l Repetir texto de recompensa" + name: "Repetir texto de recompensa" description: |- - &7 El texto específico de recompensa repetida - &7 para el desafío. El color - Se le deben aplicar códigos &7. - value: "&7 Texto actual:" + El texto específico de recompensa repetida + para el desafío. El color + Se le deben aplicar códigos . + value: "Texto actual:" reward_items: - name: "&f&l artículos de recompensa" + name: "artículos de recompensa" description: |- - &7 Permite cambiar recompensa - &7 artículos. - title: "&7 artículos:" - list: " &8 - [number] x [item]" - none: "&7 Los artículos no se agregan." + Permite cambiar recompensa + artículos. + title: "artículos:" + list: " - [number] x [item]" + none: "Los artículos no se agregan." repeat_reward_items: - name: "&f&l Repetir artículos de recompensa" - description: |- - &7 Permite cambiar repetición - &7 artículos de recompensa por esto - &7 desafío. - title: "&7 artículos:" - list: " &8 - [number] x [item]" - none: "&7 Los artículos no se agregan." + name: "Repetir artículos de recompensa" + description: |- + Permite cambiar repetición + artículos de recompensa por esto + desafío. + title: "artículos:" + list: " - [number] x [item]" + none: "Los artículos no se agregan." reward_experience: - name: Experiencia de recompensa &f&l + name: Experiencia de recompensa description: |- - &7 Permite cambiar el - &7 experiencia de recompensa para - &7 el jugador. - value: "&7 Experiencia de recompensa: &e [number]" + Permite cambiar el + experiencia de recompensa para + el jugador. + value: "Experiencia de recompensa: [number]" repeat_reward_experience: - name: "&f&l Repetir experiencia de recompensa" + name: "Repetir experiencia de recompensa" description: |- - &7 Permite cambiar el - &7 repetir experiencia de recompensa - &7 para el jugador. - value: "&7 Experiencia de recompensa: &e [number]" + Permite cambiar el + repetir experiencia de recompensa + para el jugador. + value: "Experiencia de recompensa: [number]" reward_money: - name: "&f&l Recompensa en dinero" + name: "Recompensa en dinero" description: |- - &7 Permite cambiar el - &7 dinero de recompensa. - value: "&7 Valor actual: &e [number]" + Permite cambiar el + dinero de recompensa. + value: "Valor actual: [number]" repeat_reward_money: - name: "&f&l repetir dinero de recompensa" + name: "repetir dinero de recompensa" description: |- - &7 Permite cambiar el - &7 repetir dinero de recompensa - &7 para el desafío. - value: "&7 Valor actual: &e [number]" + Permite cambiar el + repetir dinero de recompensa + para el desafío. + value: "Valor actual: [number]" reward_commands: - name: "&f&l Comandos de recompensa" - description: |- - &7 Los comandos de recompensa específicos. - &8 Consejo: - &8 El comando no requiere - &8 escribiendo primero `/` como será - &8 se aplicará automáticamente. - &8 Por defecto los comandos serán - &8 ejecutado por el servidor. Sin embargo - &8 añadiendo `[SELF]` al inicio - &8 permitirá que el comando sea - &8 ejecutado por el jugador. También - &8 admite un marcador de posición - &8 `[player]` que será - &8 reemplazado con el nombre de un jugador - &8 que completó el desafío. - value: "&7 Comandos actuales:" + name: "Comandos de recompensa" + description: |- + Los comandos de recompensa específicos. + Consejo: + El comando no requiere + escribiendo primero `/` como será + se aplicará automáticamente. + Por defecto los comandos serán + ejecutado por el servidor. Sin embargo + añadiendo `[SELF]` al inicio + permitirá que el comando sea + ejecutado por el jugador. También + admite un marcador de posición + `[player]` que será + reemplazado con el nombre de un jugador + que completó el desafío. + value: "Comandos actuales:" repeat_reward_commands: - name: "&f&l Repetir comandos de recompensa" - description: |- - &7 La recompensa repetida específica - &7 comandos para el desafío. - &8 Consejo: - &8 El comando no requiere - &8 escribiendo primero `/` como será - &8 se aplicará automáticamente. - &8 Por defecto los comandos serán - &8 ejecutado por el servidor. Sin embargo - &8 añadiendo `[SELF]` al principio - &8 permitirá que el comando sea - &8 ejecutado por el jugador. También - &8 admite un marcador de posición - &8 `[player]` que será - &8 reemplazado con el nombre de un jugador - &8 que completó el desafío. - value: "&7 Comandos actuales:" + name: "Repetir comandos de recompensa" + description: |- + La recompensa repetida específica + comandos para el desafío. + Consejo: + El comando no requiere + escribiendo primero `/` como será + se aplicará automáticamente. + Por defecto los comandos serán + ejecutado por el servidor. Sin embargo + añadiendo `[SELF]` al principio + permitirá que el comando sea + ejecutado por el jugador. También + admite un marcador de posición + `[player]` que será + reemplazado con el nombre de un jugador + que completó el desafío. + value: "Comandos actuales:" repeatable: - name: "&f&l repetible" + name: "repetible" description: |- - &7 Permite alternar si - &7 el desafío es - &7 repetible. - enabled: "&2 habilitado" + Permite alternar si + el desafío es + repetible. + enabled: "habilitado" disabled: etc. deshabilitado repeat_count: - name: "&f&l Recuento de repeticiones" + name: "Recuento de repeticiones" description: |- - &7 Permite cambiar el - &7 número de repeticiones - &7 para el desafío. - value: "&7 Valor actual: &e [number]" + Permite cambiar el + número de repeticiones + para el desafío. + value: "Valor actual: [number]" cool_down: - name: "&f&l enfriamiento" - description: |- - &7 Permite cambiar el - &7 segundos de enfriamiento que - &7 debe esperarse entre - &7 desafío repetible - &7 finalizaciones. - value: "&7 Valor actual: &e [time]" + name: "enfriamiento" + description: |- + Permite cambiar el + segundos de enfriamiento que + debe esperarse entre + desafío repetible + finalizaciones. + value: "Valor actual: [time]" challenges: - name: Desafíos &f&l + name: Desafíos description: |- - &7 Ver desafíos asignados - &7 al nivel. + Ver desafíos asignados + al nivel. waiver_amount: - name: "&f&l Monto de la exención" + name: "Monto de la exención" description: |- - &7 Permite establecer un número - &7 de desafíos que pueden - &7 quedará sin completar durante - &7 desbloqueando el siguiente nivel. - value: "&7 Valor actual: &e [number]" + Permite establecer un número + de desafíos que pueden + quedará sin completar durante + desbloqueando el siguiente nivel. + value: "Valor actual: [number]" add_challenges: - name: "&f&l Agregar desafío(s)" + name: "Agregar desafío(s)" description: |- - &7 Permite seleccionar y - &7 añade desafíos al - &7 nivel. + Permite seleccionar y + añade desafíos al + nivel. remove_challenges: - name: "&f&l Eliminar desafío(s)" + name: "Eliminar desafío(s)" description: |- - &7 Permite seleccionar y - &7 eliminar desafíos al - &7 nivel. + Permite seleccionar y + eliminar desafíos al + nivel. reset_on_new: - name: "&f&l Restablecer en nuevo" - description: |- - &7 Permite alternar si - &7 desafíos deben ser - &7 se reinicia cuando el usuario se va - &7 isla o crea una nueva - &7 isla. - enabled: "&2 habilitado" + name: "Restablecer en nuevo" + description: |- + Permite alternar si + desafíos deben ser + se reinicia cuando el usuario se va + isla o crea una nueva + isla. + enabled: "habilitado" disabled: etc. deshabilitado broadcast: - name: "&f&l Transmisión" + name: "Transmisión" description: |- - &7 Desafío de transmisiones y - &7 nivel completado por primera vez - &7 para todos. - enabled: "&2 habilitado" + Desafío de transmisiones y + nivel completado por primera vez + para todos. + enabled: "habilitado" disabled: etc. deshabilitado remove_completed: - name: "&f&l Ocultar completado" + name: "Ocultar completado" description: |- - &7 Oculta desafíos completados - &7 del menú. - enabled: "&2 habilitado" + Oculta desafíos completados + del menú. + enabled: "habilitado" disabled: etc. deshabilitado glow_completed: - name: "&f&l Resplandor completado" + name: "Resplandor completado" description: |- - &7 Añade brillo de encantamiento - &7 a los desafíos completados. - enabled: "&2 habilitado" + Añade brillo de encantamiento + a los desafíos completados. + enabled: "habilitado" disabled: etc. deshabilitado store_history: - name: Historial de la tienda &f&l - description: |- - &7 Almacena historial interno - &7 cuando cada desafío es - &7 completado. - &7 Actualmente solo visible - &7 en la base de datos. - enabled: "&2 habilitado" + name: Historial de la tienda + description: |- + Almacena historial interno + cuando cada desafío es + completado. + Actualmente solo visible + en la base de datos. + enabled: "habilitado" disabled: etc. deshabilitado data_per_island: - name: "&f&l tienda por isla" + name: "tienda por isla" description: |- - &7 Almacena el completado - &7 desafíos por isla. - &7 Se compartirá el progreso - &7 con todos los jugadores del equipo. - enabled: "&2 habilitado" + Almacena el completado + desafíos por isla. + Se compartirá el progreso + con todos los jugadores del equipo. + enabled: "habilitado" disabled: etc. deshabilitado show_title: - name: "&f&l Mostrar título" + name: "Mostrar título" description: |- - &7 Muestra el título cuando - &7 desafío o nivel - &7 está completado. - enabled: "&2 habilitado" + Muestra el título cuando + desafío o nivel + está completado. + enabled: "habilitado" disabled: etc. deshabilitado gamemode_gui: - name: "&f&l GUI de selección de modo de juego" + name: "GUI de selección de modo de juego" description: |- - &7 Habilita una GUI única que - &7 está disponible a través de /challenges - &7 comando. - &c Requiere reiniciar el servidor. - enabled: "&2 habilitado" + Habilita una GUI única que + está disponible a través de /challenges + comando. + Requiere reiniciar el servidor. + enabled: "habilitado" disabled: etc. deshabilitado locked_level_icon: - name: "&f&l Icono de nivel bloqueado predeterminado" + name: "Icono de nivel bloqueado predeterminado" description: |- - &7 Icono predeterminado para todos los bloqueados - &7 niveles. Cada nivel puede cambiar - &7 este icono. + Icono predeterminado para todos los bloqueados + niveles. Cada nivel puede cambiar + este icono. purge_history: - name: "&f&l Historial Vida útil" - description: |- - &7 Número de días cuanto tiempo - &7 datos históricos almacenados - &7 en datos de usuario. - &7 0 significa que los datos - &7 no se eliminará. - value: "&7 Valor actual: &e [number]" + name: "Historial Vida útil" + description: |- + Número de días cuanto tiempo + datos históricos almacenados + en datos de usuario. + 0 significa que los datos + no se eliminará. + value: "Valor actual: [number]" title_showtime: - name: "&f&l Título Showtime" + name: "Título Showtime" description: |- - &7 Número de ticks de ese título - &7 se mostrará al jugador. - value: "&7 Valor actual: &e [number]" + Número de ticks de ese título + se mostrará al jugador. + value: "Valor actual: [number]" active_world_list: - name: "&f&l Mostrar sólo mundo activo" - description: |- - &7 Si GUI de selección de modo de juego - &7 está habilitado, esto puede cambiar - &7 si la GUI muestra la selección de GameMode - &7 o desafíos para el mundo actual. - &c Requiere reiniciar el servidor. - enabled: "&2 habilitado" + name: "Mostrar sólo mundo activo" + description: |- + Si GUI de selección de modo de juego + está habilitado, esto puede cambiar + si la GUI muestra la selección de GameMode + o desafíos para el mundo actual. + Requiere reiniciar el servidor. + enabled: "habilitado" disabled: etc. deshabilitado visibility_mode: - name: "&f&l Modo de visibilidad" + name: "Modo de visibilidad" description: |- - &7 Modo de visibilidad para - &7 desafíos que son - &7 oculto. - enabled: "&2" - disabled: "&C" + Modo de visibilidad para + desafíos que son + oculto. + enabled: "" + disabled: "" visible: Mostrar desafíos visibles hidden: Mostrar todos los desafíos toggleable: Permitir alternar include_undeployed: - name: "&f&l incluye desafíos no implementados" + name: "incluye desafíos no implementados" description: |- - &7 Indica si no está implementado - &7 desafíos deben ser - &7 contado para el nivel - &7 finalización. - enabled: "&2 habilitado" + Indica si no está implementado + desafíos deben ser + contado para el nivel + finalización. + enabled: "habilitado" disabled: etc. deshabilitado download: - name: "&f&l Descargar bibliotecas" + name: "Descargar bibliotecas" description: |- - &7 Actualización manual disponible - &7 desafía las bibliotecas. - enabled: "&2 Con borrado de caché" - disabled: "&c Sin borrar caché" + Actualización manual disponible + desafía las bibliotecas. + enabled: "Con borrado de caché" + disabled: "Sin borrar caché" player: - name: "&f&l [name]" - description: "&7 Propietario de la isla: [owner]" - members: "&7 miembros de la isla:" - member: "&8 - [name]" + name: "[name]" + description: "Propietario de la isla: [owner]" + members: "miembros de la isla:" + member: "- [name]" no-island: |- - &c El jugador no tiene - &c una isla. + El jugador no tiene + una isla. player_list: - name: "&f&l Elegir lista de usuarios" + name: "Elegir lista de usuarios" description: |- - &7 Elige qué lista de usuarios - &7 debería mostrarse. - enabled: "&2" - disabled: "&C" + Elige qué lista de usuarios + debería mostrarse. + enabled: "" + disabled: "" online: Jugadores en línea with_island: Jugadores con islas in_world: jugadores en el mundo add_block: - name: "&f&l Agregar bloque" + name: "Agregar bloque" description: |- - &7 Permite agregar un nuevo - &7 bloque a la lista. + Permite agregar un nuevo + bloque a la lista. remove_block: - name: "&f&l Quitar bloque" + name: "Quitar bloque" description: |- - &7 Permite eliminar - &7 bloques seleccionados - &7 de listas. - title: "&7 Materiales seleccionados:" - material: "&8 - [material]" + Permite eliminar + bloques seleccionados + de listas. + title: "Materiales seleccionados:" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 ID de material: [id]" - selected: "&2 seleccionado" + name: "[material]" + description: "ID de material: [id]" + selected: "seleccionado" add_entity: - name: "&f&l Agregar entidad" + name: "Agregar entidad" description: |- - &7 Permite agregar un nuevo - &7 entidad a la lista. + Permite agregar un nuevo + entidad a la lista. switch_entity: - name: "&f&l cambiar huevos" + name: "cambiar huevos" description: |- - &7 Permite cambiar de + Permite cambiar de & 7 huevos para los jefes de la mafia. remove_entity: - name: "&f&l Eliminar entidad" + name: "Eliminar entidad" description: |- - &7 Permite eliminar - &7 entidades seleccionadas - &7 de listas. - title: "&7 entidades seleccionadas:" - entity: "&8 - [entity]" + Permite eliminar + entidades seleccionadas + de listas. + title: "entidades seleccionadas:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 ID de entidad: [id]" - selected: "&2 seleccionado" + name: "[entity]" + description: "ID de entidad: [id]" + selected: "seleccionado" inventory_type: - name: "&f&l Tipo de inventario" + name: "Tipo de inventario" description: |- - &7 Desafío que verifica - &7 artículos en el inventario del jugador + Desafío que verifica + artículos en el inventario del jugador island_type: - name: "&f&l Tipo de isla" + name: "Tipo de isla" description: |- - &7 Desafío que verifica - &7 bloques o entidades alrededor - &7 jugador. + Desafío que verifica + bloques o entidades alrededor + jugador. other_type: - name: "&f&l Otro tipo" + name: "Otro tipo" description: |- - &7 Desafío que utiliza - &7 complementos o complementos, - &7 como nivel y dinero. + Desafío que utiliza + complementos o complementos, + como nivel y dinero. statistic_type: - name: "&f&l Tipo de estadística" + name: "Tipo de estadística" description: |- - &7 Desafío que verifica - &7 datos estadísticos de jugadores. + Desafío que verifica + datos estadísticos de jugadores. save: - name: "&f&l Guardar" + name: "Guardar" description: |- - &7 Guarda cambios y - &7 devuelve. + Guarda cambios y + devuelve. cancel: - name: "&f&l Cancelar" + name: "Cancelar" description: |- - &7 Descarta cambios y - &7 devuelve. + Descarta cambios y + devuelve. accept_selected: - name: "&f&l Aceptar Seleccionado" + name: "Aceptar Seleccionado" description: |- - &7 Devuelve elementos seleccionados - &7 y abre la GUI anterior. - title: "&7 seleccionado:" - element: "&8 - [element]" + Devuelve elementos seleccionados + y abre la GUI anterior. + title: "seleccionado:" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Buscar" + name: "Buscar" description: |- - &7 Permite buscar un - &7 elemento con entrada - &7 valor de texto. - search: "&b Valor: [value]" + Permite buscar un + elemento con entrada + valor de texto. + search: "Valor: [value]" tips: - click-to-select: "&e Haga clic en &7 para seleccionar." - click-to-choose: "&e Haga clic en &7 para elegir." - click-to-complete: "&e Haga clic en &7 para completar." - right-click-multiple-open: "&e Haga clic derecho en &7 para elegir el recuento de finalización." - shift-left-click-to-complete-all: "&e Shift Haga clic en &7 para completar todo." - left-click-to-accept: "&e Haga clic izquierdo en &7 para completar." - right-click-to-write: "&e Haga clic derecho en &7 para escribir." - click-to-reduce: "&e Haga clic en &7 para reducir." - click-to-increase: "&e Haga clic en &7 para aumentar." - click-to-return: "&e Haga clic en &7 para regresar." - click-to-quit: "&e Haga clic en &7 para salir." - click-to-wipe: "&e Haga clic en &7 para borrar." - left-click-to-wipe: "&e Haga clic izquierdo en &7 para borrar." - right-click-to-switch: "&e Haga clic derecho en &7 para cambiar." - click-to-open: "&e Haga clic en &7 para abrir." - click-to-export: "&e Haga clic en &7 para exportar." - click-to-create: "&e Haga clic en &7 para crear." - left-click-to-open: "&e Haga clic izquierdo en &7 para abrir." - right-click-to-reset-all: "&e Haga clic derecho en &7 para borrar todo." - click-to-toggle: "&e Haga clic en &7 para alternar." - click-to-change: "&e Haga clic en &7 para cambiar." - shift-click-to-reset: "&e Shift Haga clic en &7 para restablecer." - click-to-add: "&e Haga clic en &7 para agregar." - click-to-remove: "&e Haga clic en &7 para eliminar." - left-click-to-cycle: "&e Haga clic izquierdo en &7 para bajar." - right-click-to-cycle: "&e Haga clic derecho en &7 para subir." - click-to-edit: "&e Haga clic en &7 para editar." - left-click-to-download: "&e Haga clic izquierdo en &7 para descargar." - right-click-to-toggle: "&e Haga clic derecho en &7 para alternar." - click-to-install: "&e Haga clic en &7 para instalar." - click-to-reset-all: "&e Haga clic en &7 para restablecer todo." - right-click-to-select: "&e Haga clic derecho en &7 para seleccionar." - right-click-to-deselect: "&e Haga clic derecho en &7 para anular la selección." - left-click-to-choose: "&e Haga clic izquierdo en &7 para elegir." - click-to-cancel: "&e Haga clic en &7 para cancelar." - click-to-save: "&e Haga clic en &7 para guardar." - click-to-deselect: "&e Haga clic en &7 para anular la selección." + click-to-select: "Haga clic en para seleccionar." + click-to-choose: "Haga clic en para elegir." + click-to-complete: "Haga clic en para completar." + right-click-multiple-open: "Haga clic derecho en para elegir el recuento de finalización." + shift-left-click-to-complete-all: "Shift Haga clic en para completar todo." + left-click-to-accept: "Haga clic izquierdo en para completar." + right-click-to-write: "Haga clic derecho en para escribir." + click-to-reduce: "Haga clic en para reducir." + click-to-increase: "Haga clic en para aumentar." + click-to-return: "Haga clic en para regresar." + click-to-quit: "Haga clic en para salir." + click-to-wipe: "Haga clic en para borrar." + left-click-to-wipe: "Haga clic izquierdo en para borrar." + right-click-to-switch: "Haga clic derecho en para cambiar." + click-to-open: "Haga clic en para abrir." + click-to-export: "Haga clic en para exportar." + click-to-create: "Haga clic en para crear." + left-click-to-open: "Haga clic izquierdo en para abrir." + right-click-to-reset-all: "Haga clic derecho en para borrar todo." + click-to-toggle: "Haga clic en para alternar." + click-to-change: "Haga clic en para cambiar." + shift-click-to-reset: "Shift Haga clic en para restablecer." + click-to-add: "Haga clic en para agregar." + click-to-remove: "Haga clic en para eliminar." + left-click-to-cycle: "Haga clic izquierdo en para bajar." + right-click-to-cycle: "Haga clic derecho en para subir." + click-to-edit: "Haga clic en para editar." + left-click-to-download: "Haga clic izquierdo en para descargar." + right-click-to-toggle: "Haga clic derecho en para alternar." + click-to-install: "Haga clic en para instalar." + click-to-reset-all: "Haga clic en para restablecer todo." + right-click-to-select: "Haga clic derecho en para seleccionar." + right-click-to-deselect: "Haga clic derecho en para anular la selección." + left-click-to-choose: "Haga clic izquierdo en para elegir." + click-to-cancel: "Haga clic en para cancelar." + click-to-save: "Haga clic en para guardar." + click-to-deselect: "Haga clic en para anular la selección." click-on-item: |- - &e Haga clic en &7 en el artículo de - &7 tu inventario. - left-click-to-edit: "&e Haga clic izquierdo en &7 para editar." - right-click-to-clear: "&e Haga clic derecho en &7 para borrar." - click-to-previous: "&e Haga clic en &7 para ver la página anterior." - click-to-next: "&e Haga clic en &7 para ver la página siguiente." + Haga clic en en el artículo de + tu inventario. + left-click-to-edit: "Haga clic izquierdo en para editar." + right-click-to-clear: "Haga clic derecho en para borrar." + click-to-previous: "Haga clic en para ver la página anterior." + click-to-next: "Haga clic en para ver la página siguiente." descriptions: challenge: lore: |- @@ -836,16 +836,16 @@ challenges: [requirements] [rewards] status: - completed: "&2&l completado" - completed-times: "&2 completado &7&l [number] &r&2 vez(-s)" - completed-times-of: "&2 completado &7&l [number] &r&2 de &7&l [max] &r&2 veces" - completed-times-reached: "&2&l Completado todo &7 [max] &2 veces" + completed: "completado" + completed-times: "completado [number] vez(-s)" + completed-times-of: "completado [number] de [max] veces" + completed-times-reached: "Completado todo [max] veces" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Enfriamiento: &r&7 [time]" - wait-time: "&c&l Disponible después de: &r&c [time]" + timeout: "Enfriamiento: [time]" + wait-time: "Disponible después de: [time]" in-days: "[number] d" in-hours: "[number] h" in-minutes: "[number] min" @@ -855,12 +855,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Limitado a [environment]" - environment-title: "&7 Limitado a:" - environment-list: " &7 - &e [environment]" - permission-single: "&c Requiere permiso [permission]" - permissions-title: "&c Requiere permisos:" - permissions-list: " &c - [permission]" + environment-single: "Limitado a [environment]" + environment-title: "Limitado a:" + environment-list: " - [environment]" + permission-single: "Requiere permiso [permission]" + permissions-title: "Requiere permisos:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -868,23 +868,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Bloques requeridos:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Entidades requeridas:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 No más allá de &e [number] &7 metros" - warning-block: "&e Los bloques serán &c eliminados" - warning-entity: "&e Entidades serán &c eliminadas" + blocks-title: "Bloques requeridos:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Entidades requeridas:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "No más allá de [number] metros" + warning-block: "Los bloques serán eliminados" + warning-entity: "Entidades serán eliminadas" inventory: lore: |- [items] [warning] - item-title: "&7&l Elementos necesarios:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "& los artículos serán &c eliminados" + item-title: "Elementos necesarios:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "& los artículos serán eliminados" other: lore: |- [experience] @@ -892,34 +892,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Experiencia requerida: &r&e [number]" - experience-warning: "&e experiencia será &c eliminada" - money: "&7&l Dinero requerido: &r&e [number]" - money-warning: "&e dinero será &c eliminado" - level: "&7&l Nivel de isla requerido: &r&e [number]" + experience: "Experiencia requerida: [number]" + experience-warning: "experiencia será eliminada" + money: "Dinero requerido: [number]" + money-warning: "dinero será eliminado" + level: "Nivel de isla requerido: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Los datos estadísticos serán &c reducidos." + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "Los datos estadísticos serán reducidos." rewards: lore: |- - &7&l Recompensas: + Recompensas: [text] [items] [experience] [money] [commands] - item-title: "&7 artículos:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experiencia: &r&e [number]" - money: "&7 Dinero: &r&e [number]" - commands-title: "&7 comandos:" - command: " &7 - &e [command]" + item-title: "artículos:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experiencia: [number]" + money: "Dinero: [number]" + commands-title: "comandos:" + command: " - [command]" level: lore: |- [text] @@ -927,100 +927,100 @@ challenges: [waiver] [rewards] status: - completed: "&2&l completado" + completed: "completado" completed-challenges-of: |- - &2 completado &7&l [number] &r&2 de - &7&l [max] &r&2 desafíos. - locked: "&c&l bloqueado" + completado [number] de + [max] desafíos. + locked: "bloqueado" missing-challenges: |- - &7 [number] más desafíos deben ser - &7 completado para desbloquear este nivel. + [number] más desafíos deben ser + completado para desbloquear este nivel. waiver: |- - &7&l [number] desafío(s) &r&7 puede ser - &7 se saltó para desbloquear el siguiente nivel. + [number] desafío(s) puede ser + se saltó para desbloquear el siguiente nivel. rewards: lore: |- - &7&l Recompensas: + Recompensas: [text] [items] [experience] [money] [commands] - item-title: "&7 artículos:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experiencia: &r&e [number]" - money: "&7 Dinero: &r&e [number]" - commands-title: "&7 comandos:" - command: " &7 - &e [command]" + item-title: "artículos:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experiencia: [number]" + money: "Dinero: [number]" + commands-title: "comandos:" + command: " - [command]" library: - author: "&7 por &e [author]" - version: "&7 Hecho con desafíos &e [version]" - lang: "&7 Idioma: &e [lang]" - gamemode: "&7 Principal para &e [gamemode]" + author: "por [author]" + version: "Hecho con desafíos [version]" + lang: "Idioma: [lang]" + gamemode: "Principal para [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: verdadero, activado, sí, confirmar, y, válido, correcto deny-string: falso, apagado, no, negar, n, inválido, incorrecto cancel-string: Cancelar exit-string: cancelar, salir, salir - cancelled: "&c ¡Conversación cancelada!" - input-number: "&e Por favor ingresa un número en el chat." - input-seconds: "&e Por favor ingrese unos segundos en el chat." - numeric-only: "&c ¡El [value] dado no es un número!" - not-valid-value: "&c El número dado [value] no es válido. ¡Debe ser mayor que + cancelled: "¡Conversación cancelada!" + input-number: "Por favor ingresa un número en el chat." + input-seconds: "Por favor ingrese unos segundos en el chat." + numeric-only: "¡El [value] dado no es un número!" + not-valid-value: "El número dado [value] no es válido. ¡Debe ser mayor que [min] y menor que [max]!" - user-data-removed: "&a Todos los datos del usuario para [gamemode] se borran de + user-data-removed: "Todos los datos del usuario para [gamemode] se borran de la base de datos." - confirm-user-data-deletion: "&e Confirme que desea borrar la base de datos de + confirm-user-data-deletion: "Confirme que desea borrar la base de datos de usuarios para [gamemode]." - challenge-data-removed: "&a Todos los datos de los desafíos para [gamemode] se + challenge-data-removed: "Todos los datos de los desafíos para [gamemode] se borran de la base de datos." - confirm-challenge-data-deletion: "&e Confirme que desea borrar la base de datos + confirm-challenge-data-deletion: "Confirme que desea borrar la base de datos de desafíos para [gamemode]." - all-data-removed: "&a Todos los datos adicionales para [gamemode] se borran de + all-data-removed: "Todos los datos adicionales para [gamemode] se borran de la base de datos." - confirm-all-data-deletion: "&e Confirme que desea borrar los datos adicionales para [gamemode]." - write-name: "&e Por favor escribe un nombre en el chat." + confirm-all-data-deletion: "Confirme que desea borrar los datos adicionales para [gamemode]." + write-name: "Por favor escribe un nombre en el chat." new-object-created: "&Se crea un nuevo objeto para [gamemode]." - object-already-exists: "&c El objeto &7 [id] &c ya existe. Elija un nombre diferente." - invalid-challenge: "&c Desafío [challenge] contiene datos no válidos. ¡No se puede desplegar!" - name-changed: "&a Éxito, se actualizó el nombre." - write-description: '&e Ingrese una nueva descripción en el chat y "salir" en una + object-already-exists: "El objeto [id] ya existe. Elija un nombre diferente." + invalid-challenge: "Desafío [challenge] contiene datos no válidos. ¡No se puede desplegar!" + name-changed: "Éxito, se actualizó el nombre." + write-description: 'Ingrese una nueva descripción en el chat y "salir" en una línea sola para finalizar.' - description-changed: "&a Éxito, se actualizó la descripción." - write-permissions: '&e Ingrese los permisos requeridos, uno por línea en el + description-changed: "Éxito, se actualizó la descripción." + write-permissions: 'Ingrese los permisos requeridos, uno por línea en el chat, y "salga" en una línea sola para finalizar.' - permissions-changed: "&a Éxito, se actualizaron los permisos de desafío." - write-reward-text: '&e Ingrese un nuevo texto de recompensa en el chat y "salir" + permissions-changed: "Éxito, se actualizaron los permisos de desafío." + write-reward-text: 'Ingrese un nuevo texto de recompensa en el chat y "salir" en una línea aparte para finalizar.' - reward-text-changed: "&a Éxito, se actualizó el texto de recompensa." - write-repeat-reward-text: '&e Ingrese un nuevo texto de recompensa repetida en + reward-text-changed: "Éxito, se actualizó el texto de recompensa." + write-repeat-reward-text: 'Ingrese un nuevo texto de recompensa repetida en el chat y "salir" en una línea aparte para finalizar.' - repeat-reward-text-changed: "&a Éxito, se actualizó el texto de recompensa repetida." - write-reward-commands: '&e Ingrese un nuevo comando de recompensa por línea en + repeat-reward-text-changed: "Éxito, se actualizó el texto de recompensa repetida." + write-reward-commands: 'Ingrese un nuevo comando de recompensa por línea en el chat y "salga" en una línea sola para finalizar.' - reward-commands-changed: "&a Éxito, se actualizaron los comandos de recompensa." - write-repeat-reward-commands: '&e Ingrese un nuevo comando de recompensa + reward-commands-changed: "Éxito, se actualizaron los comandos de recompensa." + write-repeat-reward-commands: 'Ingrese un nuevo comando de recompensa repetida por línea en el chat y "salga" en una línea sola para finalizar.' - repeat-reward-commands-changed: "&a Éxito, se actualizaron los comandos de recompensa repetida." - challenge-removed: "&a Los desafíos [challenge] para [gamemode] se eliminan de + repeat-reward-commands-changed: "Éxito, se actualizaron los comandos de recompensa repetida." + challenge-removed: "Los desafíos [challenge] para [gamemode] se eliminan de la base de datos." - confirm-challenge-deletion: "&e Confirme que desea eliminar [challenge] para + confirm-challenge-deletion: "Confirme que desea eliminar [challenge] para [gamemode] de la base de datos." - level-removed: "&a Nivel [level] para [gamemode] se elimina de la base de datos." - confirm-level-deletion: "&e Confirme que desea eliminar [level] para [gamemode] + level-removed: "Nivel [level] para [gamemode] se elimina de la base de datos." + confirm-level-deletion: "Confirme que desea eliminar [level] para [gamemode] de la base de datos." - start-downloading: "&a Comenzando a descargar e importar la biblioteca de desafíos." + start-downloading: "Comenzando a descargar e importar la biblioteca de desafíos." written-text: "&un texto de entrada:" - confirm-data-replacement: "&e Confirme que desea reemplazar sus desafíos actuales por uno nuevo." - new-challenges-imported: "&a Éxito, se importaron nuevos desafíos para [gamemode]." - exported-file-name: "&e Introduzca un nombre de archivo para el archivo de base + confirm-data-replacement: "Confirme que desea reemplazar sus desafíos actuales por uno nuevo." + new-challenges-imported: "Éxito, se importaron nuevos desafíos para [gamemode]." + exported-file-name: "Introduzca un nombre de archivo para el archivo de base de datos exportado. (escriba 'cancelar' para salir)" - database-export-completed: "&a Éxito, se completó la exportación de la base de + database-export-completed: "Éxito, se completó la exportación de la base de datos para [world]. Archivo [file] generado." - file-name-exist: "&c Existe un archivo con el nombre '[id]'. No se puede sobrescribir." - write-search: "&e Por favor escriba un valor de búsqueda. (escriba 'cancelar' + file-name-exist: "Existe un archivo con el nombre '[id]'. No se puede sobrescribir." + write-search: "Por favor escriba un valor de búsqueda. (escriba 'cancelar' para salir)" search-updated: "&un valor de búsqueda actualizado." titles: @@ -1029,79 +1029,79 @@ challenges: level-title: Completado con éxito level-subtitle: "[friendlyName]" messages: - completed: "&2 ¡Has completado el desafío [name] para [player]!" - already-completed: "&2 ¡Este desafío ya se completó!" - reset: "&2 ¡Reiniciaste el desafío [name] para [player]!" - reset-all: "&2 ¡Todos los desafíos [player] fueron reiniciados!" - not-completed: "&2 ¡Este desafío aún no se ha completado!" - migrate-start: "&2 Comenzar a migrar datos del complemento de desafíos." - migrate-end: Datos del complemento &2 Challenges actualizados al nuevo formato. - migrate-not: "&2 Todos los datos son válidos." - start-downloading: "&5 Comenzando a descargar e importar la biblioteca de desafíos." - you-completed-challenge: "&2¡Has completado el desafío [value]!" - you-repeated-challenge: "&2¡Has repetido el desafío [value]!" - you-repeated-challenge-multiple: "&2¡Has repetido el &r&2desafío [value] [count] veces!" - you-completed-level: "&2¡Has completado el nivel [value]!" - name-has-completed-challenge: "&5¡[name] ha completado el desafío [value]!" - name-has-completed-level: "&5¡[name] ha completado el nivel [value]!" + completed: "¡Has completado el desafío [name] para [player]!" + already-completed: "¡Este desafío ya se completó!" + reset: "¡Reiniciaste el desafío [name] para [player]!" + reset-all: "¡Todos los desafíos [player] fueron reiniciados!" + not-completed: "¡Este desafío aún no se ha completado!" + migrate-start: "Comenzar a migrar datos del complemento de desafíos." + migrate-end: Datos del complemento Challenges actualizados al nuevo formato. + migrate-not: "Todos los datos son válidos." + start-downloading: "Comenzando a descargar e importar la biblioteca de desafíos." + you-completed-challenge: "¡Has completado el desafío [value]!" + you-repeated-challenge: "¡Has repetido el desafío [value]!" + you-repeated-challenge-multiple: "¡Has repetido el desafío [value] [count] veces!" + you-completed-level: "¡Has completado el nivel [value]!" + name-has-completed-challenge: "¡[name] ha completado el desafío [value]!" + name-has-completed-level: "¡[name] ha completado el nivel [value]!" load-skipping: '"[value]" ya existe - saltando' load-overwriting: Sobrescribiendo "[value]" load-add: "Añadiendo nuevo objeto: [value]" errors: - no-name: "&cFalta el nombre del desafío" - unknown-challenge: "&cDesafío desconocido" + no-name: "Falta el nombre del desafío" + unknown-challenge: "Desafío desconocido" not-valid-integer: |- - &c ¡El entero "[value]" dado no es válido! + ¡El entero "[value]" dado no es válido! El valor debe estar entre [min] y [max]. - not-deployed: "&c¡El desafío no está desplegado!" - not-on-island: "&c¡Debes estar en tu isla para hacer eso!" - challenge-level-not-available: "&cNo has desbloqueado el nivel requerido para completar este desafío." - not-repeatable: "&c¡Este reto no es repetible!" - wrong-environment: "&c¡Estás en el entorno equivocado!" - not-enough-items: "&c¡No tienes [items] suficientes para completar este desafío!" - not-close-enough: "&cDebes estar a un mínimo de [number] bloques de todos los + not-deployed: "¡El desafío no está desplegado!" + not-on-island: "¡Debes estar en tu isla para hacer eso!" + challenge-level-not-available: "No has desbloqueado el nivel requerido para completar este desafío." + not-repeatable: "¡Este reto no es repetible!" + wrong-environment: "¡Estás en el entorno equivocado!" + not-enough-items: "¡No tienes [items] suficientes para completar este desafío!" + not-close-enough: "Debes estar a un mínimo de [number] bloques de todos los ítems requeridos." - you-still-need: "&cTodavía necesitas [amount] x [item]" - missing-addon: "&cNo se puede completar el desafío: falta un addon o plugin requerido." - incorrect: "&cNo se puede completar el desafío: los requisitos son incorrectos." - not-enough-money: "&cEs necesario tener [value] en tu cuenta para completar el desafío." - not-enough-experience: "&cEs necesario tener [value] EXP para completar este desafío." - island-level: "&c¡Tu isla debe ser de nivel [number] o mayor para completar este + you-still-need: "Todavía necesitas [amount] x [item]" + missing-addon: "No se puede completar el desafío: falta un addon o plugin requerido." + incorrect: "No se puede completar el desafío: los requisitos son incorrectos." + not-enough-money: "Es necesario tener [value] en tu cuenta para completar el desafío." + not-enough-experience: "Es necesario tener [value] EXP para completar este desafío." + island-level: "¡Tu isla debe ser de nivel [number] o mayor para completar este desafío!" - no-load: "&cError: No se pudo cargar challenge.yml. [message]" - load-error: "&cError: No se pudo cargar [value]." - no-rank: "&cNo tienes un rango lo suficientemente alto como para hacer eso." - cannot-remove-items: "&c¡Algunos items no se pueden eliminar de tu inventario!" - exist-challenges-or-levels: "&cLos desafíos ya existen en tu mundo. ¡No se puede proceder!" - no-challenges: "&c¡Los desafíos aún no se han implementado en este mundo!" - no-challenges-admin: "&c¡Los desafíos aún no se han implementado en este mundo! - ¡Usa &5/[command] &cpara agregarlos!" - missing-arguments: "&cFaltan argumentos de comando." - no-multiple-permission: "&cNo tienes permiso para completar este desafío varias veces a la vez." - invalid-level: "&c El nivel [level] contiene datos no válidos. ¡No se cargará + no-load: "Error: No se pudo cargar challenge.yml. [message]" + load-error: "Error: No se pudo cargar [value]." + no-rank: "No tienes un rango lo suficientemente alto como para hacer eso." + cannot-remove-items: "¡Algunos items no se pueden eliminar de tu inventario!" + exist-challenges-or-levels: "Los desafíos ya existen en tu mundo. ¡No se puede proceder!" + no-challenges: "¡Los desafíos aún no se han implementado en este mundo!" + no-challenges-admin: "¡Los desafíos aún no se han implementado en este mundo! + ¡Usa /[command] para agregarlos!" + missing-arguments: "Faltan argumentos de comando." + no-multiple-permission: "No tienes permiso para completar este desafío varias veces a la vez." + invalid-level: "El nivel [level] contiene datos no válidos. ¡No se cargará desde la base de datos!" - invalid-challenge: "&c Desafío [challenge] contiene datos no válidos. ¡No se + invalid-challenge: "Desafío [challenge] contiene datos no válidos. ¡No se cargará desde la base de datos!" - no-library-entries: "&c No se pueden encontrar entradas de la biblioteca. Nada que mostrar." - not-hooked: "&c Challenges Addon no pudo encontrar ningún modo de juego." - timeout: "&c Este desafío requiere esperar [timeout] entre finalizaciones. Debes + no-library-entries: "No se pueden encontrar entradas de la biblioteca. Nada que mostrar." + not-hooked: "Challenges Addon no pudo encontrar ningún modo de juego." + timeout: "Este desafío requiere esperar [timeout] entre finalizaciones. Debes esperar [wait-time] hasta completarlo nuevamente." - requirement-not-met: "&c Este desafío requiere que [statistic] tenga [number]. + requirement-not-met: "Este desafío requiere que [statistic] tenga [number]. Solo tienes [value]." - requirement-not-met-entity: "&c Este desafío requiere que [statistic] [entity] + requirement-not-met-entity: "Este desafío requiere que [statistic] [entity] tenga [number]. Solo tienes [value]." - requirement-not-met-material: "&c Este desafío requiere que [statistic] + requirement-not-met-material: "Este desafío requiere que [statistic] [material] tenga [number]. Solo tienes [value]." protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5&oModifica quien puede - &5&ocompletar desafíos + Modifica quien puede + completar desafíos name: Proteccion de desafios CHALLENGES_WORLD_PROTECTION: - description: "&5&oHabilitar/deshabilitar &5&orequerimiento para que los - jugadores &5&o esten en su isla para &5&ocompletar un desafío." + description: "Habilitar/deshabilitar requerimiento para que los + jugadores esten en su isla para completar un desafío." name: Limitaciones de la isla hint: No hay desafíos fuera de la isla version: 12 diff --git a/src/main/resources/locales/fr.yml b/src/main/resources/locales/fr.yml index 6efac2af..1ee9746f 100644 --- a/src/main/resources/locales/fr.yml +++ b/src/main/resources/locales/fr.yml @@ -29,798 +29,798 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0&l Menu Challenges" - gamemode-gui: "&0&l Sélectionner le mode de jeu" - multiple-gui: "&0&l Combien de fois ?" - admin-gui: "&0&l Menu d'administration des Challenges" - edit-challenge: "&0&l Editer [challenge]" - edit-level: "&0&l Editer [level]" - settings: "&0&l Paramètres" - choose-challenge: "&0&l Choisir le Challenge" - choose-level: "&0&l Choisir le niveau" - choose-player: "&0&l Choisir un joueur" - library: "&0&l Bibliothèque" - manage-blocks: "&0&l Gérer les blocs" - manage-entities: "&0&l Gérer les entités" - type-selector: "&0&l Sélecteur de type de Challenge" - item-selector: "&0&l Sélecteur d'item" - block-selector: "&0&l Sélecteur de bloc" - entity-selector: "&0&l Sélecteur d'entité" - challenge-selector: "&0&l Sélecteur de Challenge" - statistic-selector: "&0&l Sélecteur de statistiques" - environment-selector: "&0&l Sélecteur d'environnement" + player-gui: "Menu Challenges" + gamemode-gui: "Sélectionner le mode de jeu" + multiple-gui: "Combien de fois ?" + admin-gui: "Menu d'administration des Challenges" + edit-challenge: "Editer [challenge]" + edit-level: "Editer [level]" + settings: "Paramètres" + choose-challenge: "Choisir le Challenge" + choose-level: "Choisir le niveau" + choose-player: "Choisir un joueur" + library: "Bibliothèque" + manage-blocks: "Gérer les blocs" + manage-entities: "Gérer les entités" + type-selector: "Sélecteur de type de Challenge" + item-selector: "Sélecteur d'item" + block-selector: "Sélecteur de bloc" + entity-selector: "Sélecteur d'entité" + challenge-selector: "Sélecteur de Challenge" + statistic-selector: "Sélecteur de statistiques" + environment-selector: "Sélecteur d'environnement" buttons: free-challenges: - name: "&f&l Challenges gratuits" + name: "Challenges gratuits" description: |- - &7 Affiche une liste de - &7 Challenges gratuits + Affiche une liste de + Challenges gratuits return: - name: "&f&l Retour" + name: "Retour" description: |- - &7 Revenir au menu précédent - &7 ou quitter l'interface graphique + Revenir au menu précédent + ou quitter l'interface graphique previous: - name: "&f&l Page précédente" - description: "&7 Passer à &e [number] &7 page" + name: "Page précédente" + description: "Passer à [number] page" next: - name: "&f&l Page suivante" - description: "&7 Passer à &e [number] &7 page" + name: "Page suivante" + description: "Passer à [number] page" reduce: - name: "&f&l Réduire" - description: "&7 Réduire de &e [number]" + name: "Réduire" + description: "Réduire de [number]" increase: - name: "&f&l Augmenter" - description: "&7 Augmenter de &e [number]" + name: "Augmenter" + description: "Augmenter de [number]" accept: - name: "&f&l terminé" + name: "terminé" description: |- - &7 Compléter le Challenge &e [number] - &7 fois(-s) + Compléter le Challenge [number] + fois(-s) quit: - name: "&f&l Quitter" - description: "&7 Quitter l'interface graphique." + name: "Quitter" + description: "Quitter l'interface graphique." complete_user_challenges: - name: "&f&l Challenge(s) utilisateur terminé(s)" - description: "&7 Permet de choisir l'utilisateur et de lui compléter le ou + name: "Challenge(s) utilisateur terminé(s)" + description: "Permet de choisir l'utilisateur et de lui compléter le ou les challenges" reset_user_challenges: - name: "&f&l Réinitialiser les Challenges de l'utilisateur" + name: "Réinitialiser les Challenges de l'utilisateur" description: |- - &7 Permet de choisir l'utilisateur et - &7 réinitialiser ses Challenges + Permet de choisir l'utilisateur et + réinitialiser ses Challenges add_challenge: - name: "&f&l Créer un Challenge" + name: "Créer un Challenge" description: |- - &7 Démarre un processus de - &7 création d'un nouveau Challenge. + Démarre un processus de + création d'un nouveau Challenge. add_level: - name: "&f&l Créer un niveau" + name: "Créer un niveau" description: |- - &7 Démarre un processus de - &7 création d'un nouveau niveau. + Démarre un processus de + création d'un nouveau niveau. edit_challenge: - name: "&f&l Modifier le Challenge" + name: "Modifier le Challenge" description: |- - &7 Permet de choisir et de modifier - &7 un Challenge. + Permet de choisir et de modifier + un Challenge. edit_level: - name: "&f&l Modifier le niveau" - description: "&7 Permet de choisir et de modifier un niveau." + name: "Modifier le niveau" + description: "Permet de choisir et de modifier un niveau." delete_challenge: - name: "&f&l Supprimer le Challenge" + name: "Supprimer le Challenge" description: |- - &7 Permet de choisir et de supprimer - &7 un Challenge. + Permet de choisir et de supprimer + un Challenge. delete_level: - name: "&f&l Supprimer le niveau" + name: "Supprimer le niveau" description: |- - &7 Permet de choisir et de supprimer - &7 un niveau. + Permet de choisir et de supprimer + un niveau. edit_settings: - name: "&f&l Paramètres" + name: "Paramètres" description: |- - &7 Permet de visualiser et de modifier - &7 un paramètre de module complémentaire. + Permet de visualiser et de modifier + un paramètre de module complémentaire. complete_wipe: - name: "&f&l Effacer complètement" + name: "Effacer complètement" description: |- - &7 Efface complètement les Challenges - &7 base de données d'extensions, y compris - &7 données utilisateur. + Efface complètement les Challenges + base de données d'extensions, y compris + données utilisateur. challenge_wipe: - name: "&f&l Effacer le challenge" + name: "Effacer le challenge" description: |- - &7 Efface complètement les défis - &7 et les niveaux de la base de données. + Efface complètement les défis + et les niveaux de la base de données. user_wipe: - name: "&f&l Suppression utilisateur" + name: "Suppression utilisateur" description: |- - &7 Supprimer les données de l'utilisateur - &7 e la base de données. + Supprimer les données de l'utilisateur + e la base de données. library: - name: "&f&l Bibliothèque" + name: "Bibliothèque" description: |- - &7 Ouvre une bibliothèque - &7 publique de défis. + Ouvre une bibliothèque + publique de défis. import_database: - name: "&f&l Importer la base de données" + name: "Importer la base de données" description: |- - &7 Permet d'importer exporté + Permet d'importer exporté & 7 la base de données de défis. import_template: - name: "&f&l Importer un modèle" + name: "Importer un modèle" description: |- - &7 Permet d'importer un modèle - &7 fichier avec défis. + Permet d'importer un modèle + fichier avec défis. export_challenges: - name: "&f&l Eporter les Challenges" + name: "Eporter les Challenges" description: |- - &7 Permet d'exporter la base de données - &7 dans un fichier local. + Permet d'exporter la base de données + dans un fichier local. properties: - name: "&f&l Propriétés" - description: "&7 Afficher toutes les propriétés principales." + name: "Propriétés" + description: "Afficher toutes les propriétés principales." requirements: - name: "&f&l Exigences" - description: "&7 Afficher les propriétés des exigences." + name: "Exigences" + description: "Afficher les propriétés des exigences." rewards: - name: "&f&l Récompenses" - description: "&7 Afficher les propriétés des récompenses." + name: "Récompenses" + description: "Afficher les propriétés des récompenses." deployed: - name: "&f&l Déploiement" + name: "Déploiement" description: |- - &7 Basculer si le défi est - &7 déployé et les utilisateurs peuvent - &7 terminez-le. - enabled: "&2 Activé" - disabled: "&c désactivé" + Basculer si le défi est + déployé et les utilisateurs peuvent + terminez-le. + enabled: "Activé" + disabled: "désactivé" name: - name: "&f&l Nom" + name: "Nom" description: |- - &7 Permet de modifier - &7 le nom d'affichage. - value: "&7 Actuellement : &r [name]" + Permet de modifier + le nom d'affichage. + value: "Actuellement : [name]" remove_on_complete: - name: "&f&l Masquer après l'achèvement" + name: "Masquer après l'achèvement" description: |- - &7 Basculer si le défi doit - &7 caché au joueur après - &7, il est terminé. - enabled: "&2 Activé" - disabled: "&c désactivé" + Basculer si le défi doit + caché au joueur après + , il est terminé. + enabled: "Activé" + disabled: "désactivé" description: - name: "&f&l Description" + name: "Description" description: |- - &7 La description spécifique - &7 pour le défi. La couleur - Les codes &7 doivent lui être appliqués. - value: "&7 Descriptif actuel :" + La description spécifique + pour le défi. La couleur + Les codes doivent lui être appliqués. + value: "Descriptif actuel :" environment: - name: "&f&l Dimension" + name: "Dimension" description: |- - &7 Permet de limiter dans quels - &7 dimensionne le défi - &7 peut être complété. - enabled: "&2" - disabled: "&c" + Permet de limiter dans quels + dimensionne le défi + peut être complété. + enabled: "" + disabled: "" order: - name: "&f&l Commande" - description: |- - &7 Permet de modifier l'ordre des - &7 objets. - &7 Objets avec des nombres égaux - &7 sera ordonné par leur - &7 noms d'identification uniques. - value: "&7 Commande en cours : &e [number]" + name: "Commande" + description: |- + Permet de modifier l'ordre des + objets. + Objets avec des nombres égaux + sera ordonné par leur + noms d'identification uniques. + value: "Commande en cours : [number]" icon: - name: "&f&l Icône" + name: "Icône" description: |- - &7 Permet de changer d'icône - &7 pour ce défi. + Permet de changer d'icône + pour ce défi. locked_icon: - name: "&f&l Icône verrouillée" + name: "Icône verrouillée" description: |- - &7 Permet de changer l'icône - &7 du niveau verrouillé. + Permet de changer l'icône + du niveau verrouillé. required_permissions: - name: "&f&l Autorisations requises" - description: |- - &7 Permet de modifier les - &7 autorisations requises pour - &7 que ce défi soit réalisable. - title: "&7 Autorisations :" - permission: " &8 - [permission]" - none: "&7 Les autorisations ne sont pas définies." + name: "Autorisations requises" + description: |- + Permet de modifier les + autorisations requises pour + que ce défi soit réalisable. + title: "Autorisations :" + permission: " - [permission]" + none: "Les autorisations ne sont pas définies." remove_entities: - name: "&f&l Supprimer des entités" - description: |- - &7 Permet de basculer si - &7 entités requises - &7 être supprimé du monde - &7 après avoir terminé le - &7 défi. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Supprimer des entités" + description: |- + Permet de basculer si + entités requises + être supprimé du monde + après avoir terminé le + défi. + enabled: "Activé" + disabled: "désactivé" required_entities: - name: "&f&l entités requises" - description: |- - &7 Permet la modification requise - &7 entités pour cela - &7 défi à réaliser. - title: "&7 Entités :" - list: " &8 - [number] x [entity]" - none: "&7 Les entités ne sont pas ajoutées." + name: "entités requises" + description: |- + Permet la modification requise + entités pour cela + défi à réaliser. + title: "Entités :" + list: " - [number] x [entity]" + none: "Les entités ne sont pas ajoutées." remove_blocks: - name: "&f&l Supprimer des blocs" - description: |- - &7 Permet de basculer si - &7 blocs requis seront - &7 soit supprimé du monde - &7 après avoir terminé le - &7 défi. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Supprimer des blocs" + description: |- + Permet de basculer si + blocs requis seront + soit supprimé du monde + après avoir terminé le + défi. + enabled: "Activé" + disabled: "désactivé" required_blocks: - name: "&f&l Blocs requis" - description: |- - &7 Permet la modification requise - &7 blocs pour cela - &7 défi à réaliser. - title: "&7 Blocs :" - list: " &8 - [number] x [block]" - none: "&7 Les blocs ne sont pas ajoutés." + name: "Blocs requis" + description: |- + Permet la modification requise + blocs pour cela + défi à réaliser. + title: "Blocs :" + list: " - [number] x [block]" + none: "Les blocs ne sont pas ajoutés." search_radius: - name: "&f&l Rayon de recherche" + name: "Rayon de recherche" description: |- - &7 Permet de modifier le rayon - &7 autour du joueur dont - &7 blocs et/ou entités sont - &7 détecté. - value: "&7 Distance actuelle : &e [number]" + Permet de modifier le rayon + autour du joueur dont + blocs et/ou entités sont + détecté. + value: "Distance actuelle : [number]" remove_items: - name: "&f&l Supprimer des éléments" - description: |- - &7 Permet de basculer si - &7 éléments requis seront - &7 doit être supprimé du stock - &7 après avoir terminé le - &7 défi. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Supprimer des éléments" + description: |- + Permet de basculer si + éléments requis seront + doit être supprimé du stock + après avoir terminé le + défi. + enabled: "Activé" + disabled: "désactivé" required_items: - name: "&f&l Éléments requis" - description: |- - &7 Permet la modification requise - &7 articles pour cela - &7 défi à réaliser. - title: "&7 Items:" - list: " &8 - [number] x [item]" - none: "&7 Items ne sont pas ajoutés." + name: "Éléments requis" + description: |- + Permet la modification requise + articles pour cela + défi à réaliser. + title: "Items:" + list: " - [number] x [item]" + none: "Items ne sont pas ajoutés." add_ignored_meta: - name: "&f&l Ajouter Ignorer les métadonnées" - description: |- - &7 Permet d'ajouter quel - &7 éléments doivent être ignorés - &7 toutes les métadonnées qui - &7 leur est affecté. - title: "&7 Items: " - list: " &8 - [number] x [item]" - none: "&7 Les éléments ne sont pas ajoutés." + name: "Ajouter Ignorer les métadonnées" + description: |- + Permet d'ajouter quel + éléments doivent être ignorés + toutes les métadonnées qui + leur est affecté. + title: "Items: " + list: " - [number] x [item]" + none: "Les éléments ne sont pas ajoutés." remove_ignored_meta: - name: "&f&l Supprimer Ignorer les métadonnées" + name: "Supprimer Ignorer les métadonnées" description: |- - &7 Permet de supprimer ce qui - &7 éléments doivent être ignorés - &7 toutes les métadonnées qui - &7 leur est affecté. + Permet de supprimer ce qui + éléments doivent être ignorés + toutes les métadonnées qui + leur est affecté. remove_experience: - name: "&f&l Supprimer l'expérience" - description: |- - &7 Permet de basculer si - &7 expérience requise - &7 doit être supprimé du lecteur - &7 après avoir terminé le - &7 défi. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Supprimer l'expérience" + description: |- + Permet de basculer si + expérience requise + doit être supprimé du lecteur + après avoir terminé le + défi. + enabled: "Activé" + disabled: "désactivé" required_experience: - name: "&f&l Expérience requise" + name: "Expérience requise" description: |- - &7 Permet de modifier le - &7 expérience requise pour - &7 le joueur. - value: "&7 Expérience actuelle : &e [number]" + Permet de modifier le + expérience requise pour + le joueur. + value: "Expérience actuelle : [number]" required_level: - name: "&f&l Niveau d'île requis" + name: "Niveau d'île requis" description: |- - &7 Permet de modifier le - &7 niveau d'îlot requis - &7 pour le défi. - value: "&7 Niveau actuel : &e [number]" + Permet de modifier le + niveau d'îlot requis + pour le défi. + value: "Niveau actuel : [number]" remove_money: - name: "&f&l Supprimer de l'argent" - description: |- - &7 Permet de basculer si - &7 l'argent requis sera - &7 être supprimé du lecteur - &7 compte après avoir terminé - &7 le défi. - enabled: "&2 activé" - disabled: "&c Désactivé" + name: "Supprimer de l'argent" + description: |- + Permet de basculer si + l'argent requis sera + être supprimé du lecteur + compte après avoir terminé + le défi. + enabled: "activé" + disabled: "Désactivé" required_money: - name: "&f&l Argent requis" + name: "Argent requis" description: |- - &7 Permet de modifier le - &7 argent requis sur le joueur - &7 représente le défi. - value: "&7 Valeur actuelle : &e [number]" + Permet de modifier le + argent requis sur le joueur + représente le défi. + value: "Valeur actuelle : [number]" statistic: - name: "&f&l Statistique" + name: "Statistique" description: |- - &7 Permet de modifier le - &7 type de statistique qui est - &7 a vérifié ce défi. - value: "&7 Valeur actuelle : &e [statistic]" + Permet de modifier le + type de statistique qui est + a vérifié ce défi. + value: "Valeur actuelle : [statistic]" statistic_amount: - name: "&f&l Valeur cible" + name: "Valeur cible" description: |- - &7 Permet de modifier le - &7 valeur cible statistique - &7 qui doit être respecté. - value: "&7 Valeur actuelle : &e [number]" + Permet de modifier le + valeur cible statistique + qui doit être respecté. + value: "Valeur actuelle : [number]" remove_statistic: - name: "&f&l Réduire la statistique" - description: |- - &7 Permet de basculer si - La valeur statistique &7 sera - &7 soit réduit une fois terminé - &7 le défi. - enabled: "&2 Activé" - disabled: "&c Désactivé" + name: "Réduire la statistique" + description: |- + Permet de basculer si + La valeur statistique sera + soit réduit une fois terminé + le défi. + enabled: "Activé" + disabled: "Désactivé" statistic_blocks: - name: "&f&l Bloc cible" + name: "Bloc cible" description: |- - &7 Permet de modifier le - &7 bloc cible statistique. - value: "&7 Bloc actuel : &e [block]" + Permet de modifier le + bloc cible statistique. + value: "Bloc actuel : [block]" statistic_items: - name: "&f&l Article cible" + name: "Article cible" description: |- - &7 Permet de modifier le - &7 poste cible statistique. - value: "&7 Poste actuel : &e [item]" + Permet de modifier le + poste cible statistique. + value: "Poste actuel : [item]" statistic_entities: - name: "&f&l Entité cible" + name: "Entité cible" description: |- - &7 Permet de modifier le - &7 entité cible statistique. - value: "&7 Entité actuelle : &e [entity]" + Permet de modifier le + entité cible statistique. + value: "Entité actuelle : [entity]" reward_text: - name: "&f&l Texte de récompense" + name: "Texte de récompense" description: |- - &7 Le texte de récompense spécifique. - &7 Les codes couleurs doivent être - &7 lui est appliqué. - value: "&7 Texte actuel :" + Le texte de récompense spécifique. + Les codes couleurs doivent être + lui est appliqué. + value: "Texte actuel :" repeat_reward_text: - name: "&f&l Répéter le texte de récompense" + name: "Répéter le texte de récompense" description: |- - &7 Le texte de récompense de répétition spécifique - &7 pour le défi. La couleur - Les codes &7 doivent lui être appliqués. - value: "&7 Texte actuel :" + Le texte de récompense de répétition spécifique + pour le défi. La couleur + Les codes doivent lui être appliqués. + value: "Texte actuel :" reward_items: - name: "&f&l Objets de récompense" + name: "Objets de récompense" description: |- - &7 Permet de modifier la récompense - &7 articles. - title: "&7 articles :" - list: " &8 - [number] x [item]" - none: "&7 Les postes ne sont pas ajoutés." + Permet de modifier la récompense + articles. + title: "articles :" + list: " - [number] x [item]" + none: "Les postes ne sont pas ajoutés." repeat_reward_items: - name: "&f&l Répéter les objets de récompense" - description: |- - &7 Permet de modifier la répétition - &7 objets de récompense pour cela - &7 défi. - title: "&7 articles :" - list: " &8 - [number] x [item]" - none: "&7 Les postes ne sont pas ajoutés." + name: "Répéter les objets de récompense" + description: |- + Permet de modifier la répétition + objets de récompense pour cela + défi. + title: "articles :" + list: " - [number] x [item]" + none: "Les postes ne sont pas ajoutés." reward_experience: - name: "&f&l Expérience de récompense" + name: "Expérience de récompense" description: |- - &7 Permet de modifier le - &7 expérience de récompense pour - &7 le joueur. - value: "&7 Expérience de récompense : &e [number]" + Permet de modifier le + expérience de récompense pour + le joueur. + value: "Expérience de récompense : [number]" repeat_reward_experience: - name: "&f&l Répéter l'expérience de récompense" + name: "Répéter l'expérience de récompense" description: |- - &7 Permet de modifier le - &7 répéter l'expérience de récompense - &7 pour le joueur. - value: "&7 Expérience de récompense : &e [number]" + Permet de modifier le + répéter l'expérience de récompense + pour le joueur. + value: "Expérience de récompense : [number]" reward_money: - name: "&f&l Récompense en argent" + name: "Récompense en argent" description: |- - &7 Permet de modifier le - &7 récompense en argent. - value: "&7 Valeur actuelle : &e [number]" + Permet de modifier le + récompense en argent. + value: "Valeur actuelle : [number]" repeat_reward_money: - name: "&f&l Répéter l'argent de la récompense" + name: "Répéter l'argent de la récompense" description: |- - &7 Permet de modifier le - &7 répéter l'argent de la récompense - &7 pour le défi. - value: "&7 Valeur actuelle : &e [number]" + Permet de modifier le + répéter l'argent de la récompense + pour le défi. + value: "Valeur actuelle : [number]" reward_commands: - name: "&f&l Commandes de récompense" - description: |- - &7 Les commandes de récompense spécifiques. - &8 Astuce : - &8 La commande ne nécessite pas - &8 écrivant d'abord `/` comme il le fera - &8 soit appliqué automatiquement. - &8 Par défaut, les commandes seront - &8 exécuté par le serveur. Cependant - &8 en ajoutant `[SELF]` au début - &8 permettra à la commande d'être - &8 exécuté par le joueur. Ça aussi - &8 prend en charge un espace réservé - &8 `[player]` qui sera - &8 remplacé par un nom de joueur - &8 qui ont terminé le défi. - value: "&7 Commandes actuelles :" + name: "Commandes de récompense" + description: |- + Les commandes de récompense spécifiques. + Astuce : + La commande ne nécessite pas + écrivant d'abord `/` comme il le fera + soit appliqué automatiquement. + Par défaut, les commandes seront + exécuté par le serveur. Cependant + en ajoutant `[SELF]` au début + permettra à la commande d'être + exécuté par le joueur. Ça aussi + prend en charge un espace réservé + `[player]` qui sera + remplacé par un nom de joueur + qui ont terminé le défi. + value: "Commandes actuelles :" repeat_reward_commands: - name: "&f&l Répéter les commandes de récompense" - description: |- - &7 La récompense de répétition spécifique - &7 commandes pour le défi. - &8 Astuce : - &8 La commande ne nécessite pas - &8 écrivant d'abord `/` comme il le fera - &8 soit appliqué automatiquement. - &8 Par défaut, les commandes seront - &8 exécuté par le serveur. Cependant - &8 en ajoutant `[SELF]` au début - &8 permettra à la commande d'être - &8 exécuté par le joueur. Ça aussi - &8 prend en charge un espace réservé - &8 `[player]` qui sera - &8 remplacé par un nom de joueur - &8 qui ont terminé le défi. - value: "&7 Commandes actuelles :" + name: "Répéter les commandes de récompense" + description: |- + La récompense de répétition spécifique + commandes pour le défi. + Astuce : + La commande ne nécessite pas + écrivant d'abord `/` comme il le fera + soit appliqué automatiquement. + Par défaut, les commandes seront + exécuté par le serveur. Cependant + en ajoutant `[SELF]` au début + permettra à la commande d'être + exécuté par le joueur. Ça aussi + prend en charge un espace réservé + `[player]` qui sera + remplacé par un nom de joueur + qui ont terminé le défi. + value: "Commandes actuelles :" repeatable: - name: "&f&l Répétable" + name: "Répétable" description: |- - &7 Permet de basculer si - &7 le défi est - &7 répétable. - enabled: "&2 Activé" - disabled: "&c désactivé" + Permet de basculer si + le défi est + répétable. + enabled: "Activé" + disabled: "désactivé" repeat_count: - name: "&f&l Nombre de répétitions" + name: "Nombre de répétitions" description: |- - &7 Permet de modifier le - &7 nombre de répétitions - &7 pour le défi. - value: "&7 Valeur actuelle : &e [number]" + Permet de modifier le + nombre de répétitions + pour le défi. + value: "Valeur actuelle : [number]" cool_down: - name: "&f&l Refroidissement" - description: |- - &7 Permet de modifier le - &7 secondes de refroidissement qui - &7 doit être attendu entre - &7 défi répétable - &7 achèvements. - value: "&7 Valeur actuelle : &e [time]" + name: "Refroidissement" + description: |- + Permet de modifier le + secondes de refroidissement qui + doit être attendu entre + défi répétable + achèvements. + value: "Valeur actuelle : [time]" challenges: - name: "&f&l Défis" + name: "Défis" description: |- - &7 Afficher les défis assignés - &7 au niveau. + Afficher les défis assignés + au niveau. waiver_amount: - name: "&f&l Montant de la renonciation" + name: "Montant de la renonciation" description: |- - &7 Permet de définir un numéro - &7 de défis qui peuvent - &7 reste inachevé pendant - &7 déverrouillant le niveau suivant. - value: "&7 Valeur actuelle : &e [number]" + Permet de définir un numéro + de défis qui peuvent + reste inachevé pendant + déverrouillant le niveau suivant. + value: "Valeur actuelle : [number]" add_challenges: - name: "&f&l Ajouter des défis" + name: "Ajouter des défis" description: |- - &7 Permet de sélectionner et - &7 ajoute des défis au - Niveau &7. + Permet de sélectionner et + ajoute des défis au + Niveau . remove_challenges: - name: "&f&l Supprimer le(s) défi(s)" + name: "Supprimer le(s) défi(s)" description: |- - &7 Permet de sélectionner et - &7 supprime les défis du - Niveau &7. + Permet de sélectionner et + supprime les défis du + Niveau . reset_on_new: - name: "&f&l Réinitialiser sur Nouveau" - description: |- - &7 Permet de basculer si - &7 défis devraient être - &7 réinitialisé lorsque l'utilisateur quitte - &7 ou crée un nouvel îlot - &7 île. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Réinitialiser sur Nouveau" + description: |- + Permet de basculer si + défis devraient être + réinitialisé lorsque l'utilisateur quitte + ou crée un nouvel îlot + île. + enabled: "Activé" + disabled: "désactivé" broadcast: - name: "&f&l Diffuser" + name: "Diffuser" description: |- - &7 Défi diffusions et - Niveau &7 terminé pour la première fois - &7 à tout le monde. - enabled: "&2 Activé" - disabled: "&c désactivé" + Défi diffusions et + Niveau terminé pour la première fois + à tout le monde. + enabled: "Activé" + disabled: "désactivé" remove_completed: - name: "&f&l Masquer Terminé" + name: "Masquer Terminé" description: |- - &7 Masque les défis terminés - &7 dans le menu. - enabled: "&2 Activé" - disabled: "&c désactivé" + Masque les défis terminés + dans le menu. + enabled: "Activé" + disabled: "désactivé" glow_completed: - name: "&f&l Glow Terminé" + name: "Glow Terminé" description: |- - &7 Ajoute une lueur d'enchantement - &7 aux défis terminés. - enabled: "&2 Activé" - disabled: "&c désactivé" + Ajoute une lueur d'enchantement + aux défis terminés. + enabled: "Activé" + disabled: "désactivé" store_history: - name: "&f&l Historique de la boutique" - description: |- - &7 Stocke l'historique interne - &7 lorsque chaque défi est - &7 terminé. - &7 Actuellement visible uniquement - &7 dans la base de données. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Historique de la boutique" + description: |- + Stocke l'historique interne + lorsque chaque défi est + terminé. + Actuellement visible uniquement + dans la base de données. + enabled: "Activé" + disabled: "désactivé" data_per_island: - name: "&f&l Magasin par île" - description: |- - &7 Stocke le travail terminé - &7 défis par île. - &7 La progression sera partagée - &7 avec tous les joueurs de l'équipe. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Magasin par île" + description: |- + Stocke le travail terminé + défis par île. + La progression sera partagée + avec tous les joueurs de l'équipe. + enabled: "Activé" + disabled: "désactivé" show_title: - name: "&f&l Afficher le titre" + name: "Afficher le titre" description: |- - &7 Affiche le titre lorsqu'un - &7 défi ou niveau - &7 est terminé. - enabled: "&2 Activé" - disabled: "&c désactivé" + Affiche le titre lorsqu'un + défi ou niveau + est terminé. + enabled: "Activé" + disabled: "désactivé" gamemode_gui: - name: "&f&l Interface graphique de sélection du mode de jeu" - description: |- - &7 Active une interface graphique - &7 unique disponible via - &7 la commande /challenges. - &c Nécessite un redémarrage du serveur. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Interface graphique de sélection du mode de jeu" + description: |- + Active une interface graphique + unique disponible via + la commande /challenges. + Nécessite un redémarrage du serveur. + enabled: "Activé" + disabled: "désactivé" locked_level_icon: - name: "&f&l Icône de niveau verrouillé par défaut" + name: "Icône de niveau verrouillé par défaut" description: |- - &7 Icône par défaut pour tous les verrouillés - &7 niveaux. Chaque niveau peut changer - &7 cette icône. + Icône par défaut pour tous les verrouillés + niveaux. Chaque niveau peut changer + cette icône. purge_history: - name: "&f&l Historique à vie" - description: |- - &7 Nombre de jours combien de temps - &7 données d'historique sont stockées - &7 dans les données utilisateur. - &7 0 signifie que les données seront - &7 ne doit pas être supprimé. - value: "&7 Valeur actuelle : &e [number]" + name: "Historique à vie" + description: |- + Nombre de jours combien de temps + données d'historique sont stockées + dans les données utilisateur. + 0 signifie que les données seront + ne doit pas être supprimé. + value: "Valeur actuelle : [number]" title_showtime: - name: "&f&l Titre Showtime" + name: "Titre Showtime" description: |- - &7 Nombre de ticks pour ce titre - &7 sera affiché au joueur. - value: "&7 Valeur actuelle : &e [number]" + Nombre de ticks pour ce titre + sera affiché au joueur. + value: "Valeur actuelle : [number]" active_world_list: - name: "&f&l Afficher uniquement le monde actif" - description: |- - &7 Si interface graphique de sélection du mode jeu - &7 est activé, cela peut changer - &7 si l'interface graphique affiche la sélection GameMode - &7 ou défis pour le monde actuel. - &c Nécessite le redémarrage du serveur. - enabled: "&2 Activé" - disabled: "&c désactivé" + name: "Afficher uniquement le monde actif" + description: |- + Si interface graphique de sélection du mode jeu + est activé, cela peut changer + si l'interface graphique affiche la sélection GameMode + ou défis pour le monde actuel. + Nécessite le redémarrage du serveur. + enabled: "Activé" + disabled: "désactivé" visibility_mode: - name: "&f&l Mode de visibilité" + name: "Mode de visibilité" description: |- - &7 Mode visibilité pour - &7 défis qui sont - &7 caché. - enabled: "&2" - disabled: "&c" + Mode visibilité pour + défis qui sont + caché. + enabled: "" + disabled: "" visible: Afficher les défis visibles hidden: Afficher tous les défis toggleable: Autoriser le basculement include_undeployed: - name: "&f&l Inclure les défis non déployés" - description: |- - &7 Indique si non déployé - &7 défis devraient être - &7 comptabilisé pour le niveau - &7 achèvement. - enabled: "&2 activé" - disabled: "&c Désactivé" + name: "Inclure les défis non déployés" + description: |- + Indique si non déployé + défis devraient être + comptabilisé pour le niveau + achèvement. + enabled: "activé" + disabled: "Désactivé" download: - name: "&f&l Télécharger les bibliothèques" + name: "Télécharger les bibliothèques" description: |- - &7 Mise à jour manuelle disponible - &7 défie les bibliothèques. - enabled: "&2 Avec le cache vide" - disabled: "&c Sans effacer le cache" + Mise à jour manuelle disponible + défie les bibliothèques. + enabled: "Avec le cache vide" + disabled: "Sans effacer le cache" player: - name: "&f&l [name]" - description: "&7 Propriétaire de l'île : [owner]" - members: "&7 Membres de l'île :" - member: "&8 - [name]" + name: "[name]" + description: "Propriétaire de l'île : [owner]" + members: "Membres de l'île :" + member: "- [name]" no-island: |- - &c Le joueur n'a pas - &c d' île. + Le joueur n'a pas + d' île. player_list: - name: "&f&l Choisir la liste des utilisateurs" + name: "Choisir la liste des utilisateurs" description: |- - &7 Choisissez quelle liste d'utilisateurs - &7 doit être affiché. - enabled: "&2" - disabled: "&c" + Choisissez quelle liste d'utilisateurs + doit être affiché. + enabled: "" + disabled: "" online: Joueurs en ligne with_island: Joueurs avec îles in_world: Joueurs dans le monde add_block: - name: "&f&l Ajouter un bloc" + name: "Ajouter un bloc" description: |- - &7 Permet d'ajouter un nouveau - &7 bloc à la liste. + Permet d'ajouter un nouveau + bloc à la liste. remove_block: - name: "&f&l Supprimer le bloc" + name: "Supprimer le bloc" description: |- - &7 Permet de supprimer - &7 les blocs sélectionnés - &7 des listes. - title: "&7 Matériaux sélectionnés :" - material: "&8 - [material]" + Permet de supprimer + les blocs sélectionnés + des listes. + title: "Matériaux sélectionnés :" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 Material ID: [id]" - selected: "&2 sélectionnés" + name: "[material]" + description: "Material ID: [id]" + selected: "sélectionnés" add_entity: - name: "&f&l Ajouter une entité" + name: "Ajouter une entité" description: |- - &7 Permet d'ajouter une nouvelle - &7 entité à la liste. + Permet d'ajouter une nouvelle + entité à la liste. switch_entity: - name: "&f&l Changer d'œufs" + name: "Changer d'œufs" description: |- - &7 Permet de passer de - &7 œufs aux chefs de la foule. + Permet de passer de + œufs aux chefs de la foule. remove_entity: - name: "&f&l Supprimer l'entité" + name: "Supprimer l'entité" description: |- - &7 Permet de supprimer - &7 entités sélectionnées - &7 à partir des listes. - title: "&7 Entités sélectionnées :" - entity: "&8 - [entity]" + Permet de supprimer + entités sélectionnées + à partir des listes. + title: "Entités sélectionnées :" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 Entity ID: [id]" - selected: "&2 sélectionnés" + name: "[entity]" + description: "Entity ID: [id]" + selected: "sélectionnés" inventory_type: - name: "&f&l Type d'inventaire" + name: "Type d'inventaire" description: |- - &7 Défi qui vérifie - &7 objets dans l'inventaire du joueur + Défi qui vérifie + objets dans l'inventaire du joueur island_type: - name: "&f&l Type d'île" + name: "Type d'île" description: |- - &7 Défi qui vérifie - &7 blocs ou entités autour - &7 joueur. + Défi qui vérifie + blocs ou entités autour + joueur. other_type: - name: "&f&l Autre Type" + name: "Autre Type" description: |- - &7 Défi qui utilise - &7 plugins ou addons choses, - &7 comme le niveau et l'argent. + Défi qui utilise + plugins ou addons choses, + comme le niveau et l'argent. statistic_type: - name: "&f&l Type de statistique" + name: "Type de statistique" description: |- - &7 Défi qui vérifie - &7 données statistiques sur les joueurs. + Défi qui vérifie + données statistiques sur les joueurs. save: - name: "&f&l Enregistrer" + name: "Enregistrer" description: |- - &7 Enregistre les modifications et - &7 revenir. + Enregistre les modifications et + revenir. cancel: - name: "&f&l Annuler" + name: "Annuler" description: |- - &7 Ignore les modifications et - &7 revenir. + Ignore les modifications et + revenir. accept_selected: - name: "&f&l Accepter la sélection" + name: "Accepter la sélection" description: |- - &7 Renvoie les éléments sélectionnés - &7 et ouvre l'interface graphique précédente. - title: "&7 sélectionné :" - element: "&8 - [element]" + Renvoie les éléments sélectionnés + et ouvre l'interface graphique précédente. + title: "sélectionné :" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Rechercher" + name: "Rechercher" description: |- - &7 Permet de rechercher un - &7 élément avec une valeur - &7 de texte d'entrée. - search: "&b valeur: [value]" + Permet de rechercher un + élément avec une valeur + de texte d'entrée. + search: "valeur: [value]" tips: - click-to-select: "&e Cliquez &7 pour sélectionner." - click-to-choose: "&e Cliquez sur &7 pour choisir." - click-to-complete: "&e Cliquez &7 pour terminer." - right-click-multiple-open: "&e Cliquez avec le bouton droit &7 pour choisir + click-to-select: "Cliquez pour sélectionner." + click-to-choose: "Cliquez sur pour choisir." + click-to-complete: "Cliquez pour terminer." + right-click-multiple-open: "Cliquez avec le bouton droit pour choisir le nombre d'achèvements." - shift-left-click-to-complete-all: "&e Maj Cliquez &7 pour tout terminer." - left-click-to-accept: "&e Clic gauche &7 pour terminer." - right-click-to-write: "&e Clic droit &7 pour écrire." - click-to-reduce: "&e Cliquez &7 pour réduire." - click-to-increase: "&e Cliquez &7 pour augmenter." - click-to-return: "&e Cliquez &7 pour revenir." - click-to-quit: "&e Cliquez &7 pour quitter." - click-to-wipe: "&e Cliquez &7 pour effacer." - left-click-to-wipe: "&e Clic gauche &7 pour effacer." - right-click-to-switch: "&e Cliquez avec le bouton droit &7 pour basculer." - click-to-open: "&e Cliquez &7 pour ouvrir." - click-to-export: "&e Cliquez &7 pour exporter." - click-to-create: "&e Cliquez &7 pour créer." - left-click-to-open: "&e Clic gauche &7 pour ouvrir." - right-click-to-reset-all: "&e Clic droit &7 pour tout effacer." - click-to-toggle: "&e Cliquez &7 pour basculer." - click-to-change: "&e Cliquez &7 pour modifier." - shift-click-to-reset: "&e Maj Cliquer &7 pour réinitialiser." - click-to-add: "&e Cliquez &7 pour ajouter." - click-to-remove: "&e Cliquez &7 pour supprimer." - left-click-to-cycle: "&e Clic gauche &7 pour faire défiler vers le bas." - right-click-to-cycle: "&e Clic droit &7 pour remonter." - click-to-edit: "&e Cliquez &7 pour modifier." - left-click-to-download: "&e Clic gauche &7 pour télécharger." - right-click-to-toggle: "&e Cliquez avec le bouton droit &7 pour basculer." - click-to-install: "&e Cliquez &7 pour installer." - click-to-reset-all: "&e Cliquez &7 pour tout réinitialiser." - right-click-to-select: "&e Cliquez avec le bouton droit sur &7 pour sélectionner." - right-click-to-deselect: "&e Clic droit &7 pour désélectionner." - left-click-to-choose: "&e Clic gauche &7 pour choisir." - click-to-cancel: "&e Cliquez &7 pour annuler." - click-to-save: "&e Cliquez &7 pour enregistrer." - click-to-deselect: "&e Cliquez &7 pour désélectionner." + shift-left-click-to-complete-all: "Maj Cliquez pour tout terminer." + left-click-to-accept: "Clic gauche pour terminer." + right-click-to-write: "Clic droit pour écrire." + click-to-reduce: "Cliquez pour réduire." + click-to-increase: "Cliquez pour augmenter." + click-to-return: "Cliquez pour revenir." + click-to-quit: "Cliquez pour quitter." + click-to-wipe: "Cliquez pour effacer." + left-click-to-wipe: "Clic gauche pour effacer." + right-click-to-switch: "Cliquez avec le bouton droit pour basculer." + click-to-open: "Cliquez pour ouvrir." + click-to-export: "Cliquez pour exporter." + click-to-create: "Cliquez pour créer." + left-click-to-open: "Clic gauche pour ouvrir." + right-click-to-reset-all: "Clic droit pour tout effacer." + click-to-toggle: "Cliquez pour basculer." + click-to-change: "Cliquez pour modifier." + shift-click-to-reset: "Maj Cliquer pour réinitialiser." + click-to-add: "Cliquez pour ajouter." + click-to-remove: "Cliquez pour supprimer." + left-click-to-cycle: "Clic gauche pour faire défiler vers le bas." + right-click-to-cycle: "Clic droit pour remonter." + click-to-edit: "Cliquez pour modifier." + left-click-to-download: "Clic gauche pour télécharger." + right-click-to-toggle: "Cliquez avec le bouton droit pour basculer." + click-to-install: "Cliquez pour installer." + click-to-reset-all: "Cliquez pour tout réinitialiser." + right-click-to-select: "Cliquez avec le bouton droit sur pour sélectionner." + right-click-to-deselect: "Clic droit pour désélectionner." + left-click-to-choose: "Clic gauche pour choisir." + click-to-cancel: "Cliquez pour annuler." + click-to-save: "Cliquez pour enregistrer." + click-to-deselect: "Cliquez pour désélectionner." click-on-item: |- - &e Cliquez &7 sur l'élément dans - &7 votre inventaire. - left-click-to-edit: "&e Clic gauche &7 pour éditer." - right-click-to-clear: "&e Clic droit &7 pour effacer." - click-to-previous: "&e Cliquez &7 pour afficher la page précédente." - click-to-next: "&e Cliquez &7 pour afficher la page suivante." + Cliquez sur l'élément dans + votre inventaire. + left-click-to-edit: "Clic gauche pour éditer." + right-click-to-clear: "Clic droit pour effacer." + click-to-previous: "Cliquez pour afficher la page précédente." + click-to-next: "Cliquez pour afficher la page suivante." descriptions: challenge: lore: |- @@ -830,16 +830,16 @@ challenges: [requirements] [rewards] status: - completed: "&2&l Terminé" - completed-times: "&2 Terminé &7&l [number] &r&2 fois(-s)" - completed-times-of: "&2 Terminé &7&l [number] &r&2 sur &7&l [max] &r&2 fois" - completed-times-reached: "&2&l Terminé tout &7 [max] &2 fois" + completed: "Terminé" + completed-times: "Terminé [number] fois(-s)" + completed-times-of: "Terminé [number] sur [max] fois" + completed-times-reached: "Terminé tout [max] fois" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Temps d'attente: &r&7 [time]" - wait-time: "&c&l Disponible après : &r&c [time]" + timeout: "Temps d'attente: [time]" + wait-time: "Disponible après : [time]" in-days: "[number] d " in-hours: "[number] h " in-minutes: "[number] min " @@ -849,12 +849,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Limité à [environment]" - environment-title: "&7 Limité à :" - environment-list: " &7 - &e [environment]" - permission-single: "&c Nécessite l'autorisation [permission]" - permissions-title: "&c Nécessite des autorisations :" - permissions-list: " &c - [permission]" + environment-single: "Limité à [environment]" + environment-title: "Limité à :" + environment-list: " - [environment]" + permission-single: "Nécessite l'autorisation [permission]" + permissions-title: "Nécessite des autorisations :" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -862,23 +862,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Blocs requis :" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Entités requises :" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 Pas plus loin que &e [number] &7 mètres" - warning-block: "&e Les blocs seront &c supprimés" - warning-entity: "&e Les entités seront &c supprimées" + blocks-title: "Blocs requis :" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Entités requises :" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "Pas plus loin que [number] mètres" + warning-block: "Les blocs seront supprimés" + warning-entity: "Les entités seront supprimées" inventory: lore: |- [items] [warning] - item-title: "&7&l Éléments requis :" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e Le ou les éléments seront &c supprimés" + item-title: "Éléments requis :" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "Le ou les éléments seront supprimés" other: lore: |- [experience] @@ -886,34 +886,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Expérience requise : &r&e [number]" - experience-warning: "&e L'expérience sera &c supprimée" - money: "&7&l Argent requis : &r&e [number]" - money-warning: "&e L'argent sera &c supprimé" - level: "&7&l Niveau d'îlot requis : &r&e [number]" + experience: "Expérience requise : [number]" + experience-warning: "L'expérience sera supprimée" + money: "Argent requis : [number]" + money-warning: "L'argent sera supprimé" + level: "Niveau d'îlot requis : [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Les données statistiques seront &c réduites" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "Les données statistiques seront réduites" rewards: lore: |- - &7&l Récompenses: + Récompenses: [text] [items] [experience] [money] [commands] - item-title: "&7 Items:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experience: &r&e [number]" - money: "&7 Argent : &r&e [number]" - commands-title: "&7 Commandes :" - command: " &7 - &e [command]" + item-title: "Items:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experience: [number]" + money: "Argent : [number]" + commands-title: "Commandes :" + command: " - [command]" level: lore: |- [text] @@ -921,203 +921,203 @@ challenges: [waiver] [rewards] status: - completed: "&2&l Terminé" + completed: "Terminé" completed-challenges-of: |- - &2 Terminé &7&l [number] &r&2 sur - &7&l [max] &r&2 défis. - locked: "&c&l Verrouillé" + Terminé [number] sur + [max] défis. + locked: "Verrouillé" missing-challenges: |- - &7 [number] d'autres défis doivent être relevés - &7 terminé pour débloquer ce niveau. + [number] d'autres défis doivent être relevés + terminé pour débloquer ce niveau. waiver: |- - &7&l [number] défi(s) &r&7 peut être - &7 ignoré pour débloquer le niveau suivant. + [number] défi(s) peut être + ignoré pour débloquer le niveau suivant. rewards: lore: |- - &7&l Récompenses: + Récompenses: [text] [items] [experience] [money] [commands] - item-title: "&7 Items:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experience: &r&e [number]" - money: "&7 Argent : &r&e [number]" - commands-title: "&7 Commandes :" - command: " &7 - &e [command]" + item-title: "Items:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experience: [number]" + money: "Argent : [number]" + commands-title: "Commandes :" + command: " - [command]" library: - author: "&7 par &e [author]" - version: "&7 Fait avec des défis &e [version]" - lang: "&7 Langue : &e [lang]" - gamemode: "&7 Primaire pour &e [gamemode]" + author: "par [author]" + version: "Fait avec des défis [version]" + lang: "Langue : [lang]" + gamemode: "Primaire pour [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: vrai, activé, oui, confirmer, oui, valide, correct deny-string: faux, désactivé, non, refuser, n, invalide, incorrect cancel-string: annuler exit-string: annuler, sortir, quitter - cancelled: "&c Conversation annulée !" - input-number: "&e Veuillez saisir un numéro dans le chat." - input-seconds: "&e Veuillez entrer une seconde dans le chat." - numeric-only: "&c La [value] donnée n'est pas un nombre !" - not-valid-value: "&c Le nombre donné [value] n'est pas valide. Elle doit être + cancelled: "Conversation annulée !" + input-number: "Veuillez saisir un numéro dans le chat." + input-seconds: "Veuillez entrer une seconde dans le chat." + numeric-only: "La [value] donnée n'est pas un nombre !" + not-valid-value: "Le nombre donné [value] n'est pas valide. Elle doit être supérieure à [min] et inférieure à [max] !" - user-data-removed: "&a Toutes les données utilisateur pour [gamemode] sont effacées + user-data-removed: "Toutes les données utilisateur pour [gamemode] sont effacées de la base de données." - confirm-user-data-deletion: "&e Veuillez confirmer que vous souhaitez effacer + confirm-user-data-deletion: "Veuillez confirmer que vous souhaitez effacer la base de données utilisateur pour [gamemode]." - challenge-data-removed: "&a Toutes les données des défis pour [gamemode] sont + challenge-data-removed: "Toutes les données des défis pour [gamemode] sont effacées de la base de données." - confirm-challenge-data-deletion: "&e Veuillez confirmer que vous souhaitez effacer + confirm-challenge-data-deletion: "Veuillez confirmer que vous souhaitez effacer la base de données des défis pour [gamemode]." - all-data-removed: "&a Toutes les données du module complémentaire pour [gamemode] + all-data-removed: "Toutes les données du module complémentaire pour [gamemode] sont effacées de la base de données." - confirm-all-data-deletion: "&e Veuillez confirmer que vous souhaitez effacer les + confirm-all-data-deletion: "Veuillez confirmer que vous souhaitez effacer les données du module complémentaire pour [gamemode]." - write-name: "&e Veuillez écrire un nom dans le chat." - new-object-created: "&a Un nouvel objet pour [gamemode] est créé." - object-already-exists: "&c L'objet &7 [id] &c existe déjà. Choisissez un nom différent." - invalid-challenge: "&c Challenge [challenge] contient des données non valides. + write-name: "Veuillez écrire un nom dans le chat." + new-object-created: "Un nouvel objet pour [gamemode] est créé." + object-already-exists: "L'objet [id] existe déjà. Choisissez un nom différent." + invalid-challenge: "Challenge [challenge] contient des données non valides. Il ne peut pas être déployé !" - name-changed: "&a Succès, le nom a été mis à jour." - write-description: "&e Veuillez saisir une nouvelle description dans le chat et + name-changed: "Succès, le nom a été mis à jour." + write-description: "Veuillez saisir une nouvelle description dans le chat et « quitter » sur une seule ligne pour terminer." - description-changed: "&a Succès, la description a été mise à jour." - write-permissions: "&e Veuillez saisir les autorisations requises, une par ligne + description-changed: "Succès, la description a été mise à jour." + write-permissions: "Veuillez saisir les autorisations requises, une par ligne dans le chat, et « quitter » sur une ligne distincte pour terminer." - permissions-changed: "&a Succès, les autorisations de défi ont été mises à jour." - write-reward-text: "&e Veuillez saisir un nouveau texte de récompense dans le + permissions-changed: "Succès, les autorisations de défi ont été mises à jour." + write-reward-text: "Veuillez saisir un nouveau texte de récompense dans le chat et « quitter » sur une seule ligne pour terminer." - reward-text-changed: "&a Succès, le texte de la récompense a été mis à jour." - write-repeat-reward-text: "&e Veuillez saisir un nouveau texte de récompense répété + reward-text-changed: "Succès, le texte de la récompense a été mis à jour." + write-repeat-reward-text: "Veuillez saisir un nouveau texte de récompense répété dans le chat et « quitter » sur une ligne seule pour terminer." - repeat-reward-text-changed: "&a Succès, le texte de la récompense répétée a été + repeat-reward-text-changed: "Succès, le texte de la récompense répétée a été mis à jour." - write-reward-commands: "&e Veuillez saisir une nouvelle commande de récompense + write-reward-commands: "Veuillez saisir une nouvelle commande de récompense par ligne dans le chat et « quitter » sur une ligne distincte pour terminer." - reward-commands-changed: "&a Succès, les commandes de récompense ont été mises + reward-commands-changed: "Succès, les commandes de récompense ont été mises à jour." - write-repeat-reward-commands: "&e Veuillez saisir une nouvelle commande de récompense + write-repeat-reward-commands: "Veuillez saisir une nouvelle commande de récompense répétée par ligne dans le chat et « quitter » sur une ligne distincte pour terminer." - repeat-reward-commands-changed: "&a Succès, les commandes de récompense répétées + repeat-reward-commands-changed: "Succès, les commandes de récompense répétées ont été mises à jour." - challenge-removed: "&a Les défis [challenge] pour [gamemode] sont supprimés de + challenge-removed: "Les défis [challenge] pour [gamemode] sont supprimés de la base de données." - confirm-challenge-deletion: "&e Veuillez confirmer que vous souhaitez supprimer + confirm-challenge-deletion: "Veuillez confirmer que vous souhaitez supprimer [challenge] pour [gamemode] de la base de données." - level-removed: "&a Le niveau [level] pour [gamemode] est supprimé de la base de + level-removed: "Le niveau [level] pour [gamemode] est supprimé de la base de données." - confirm-level-deletion: "&e Veuillez confirmer que vous souhaitez supprimer [level] + confirm-level-deletion: "Veuillez confirmer que vous souhaitez supprimer [level] pour [gamemode] de la base de données." - start-downloading: "&a Début du téléchargement et de l'importation de la bibliothèque + start-downloading: "Début du téléchargement et de l'importation de la bibliothèque de défis." - written-text: "&a Saisir du texte :" - confirm-data-replacement: "&e Veuillez confirmer que vous souhaitez remplacer + written-text: "Saisir du texte :" + confirm-data-replacement: "Veuillez confirmer que vous souhaitez remplacer vos défis actuels par de nouveaux." - new-challenges-imported: "&a Succès, de nouveaux défis pour [gamemode] ont été + new-challenges-imported: "Succès, de nouveaux défis pour [gamemode] ont été importés." - exported-file-name: "&e Veuillez entrer un nom de fichier pour le fichier de base + exported-file-name: "Veuillez entrer un nom de fichier pour le fichier de base de données exporté. (écrivez « annuler » pour quitter)" - database-export-completed: "&a Succès, l'exportation de la base de données pour + database-export-completed: "Succès, l'exportation de la base de données pour [world] est terminée. Fichier [file] généré." - file-name-exist: "&c Le fichier portant le nom '[id]' existe. Ne peut pas écraser." - write-search: "&e Veuillez saisir une valeur de recherche. (écrire 'cancel' pour + file-name-exist: "Le fichier portant le nom '[id]' existe. Ne peut pas écraser." + write-search: "Veuillez saisir une valeur de recherche. (écrire 'cancel' pour quitter)" - search-updated: "&a Valeur de recherche mise à jour." + search-updated: "Valeur de recherche mise à jour." titles: challenge-title: Complété avec succès challenge-subtitle: "[friendlyName]" level-title: Complété avec succès level-subtitle: "[friendlyName]" messages: - completed: "&2 Vous avez terminé le défi [name] pour [player] !" - already-completed: "&2 Ce défi a déjà été relevé !" - reset: "&2 Vous réinitialisez le défi [name] pour [player] !" - reset-all: "&2 Tous les défis de [player] ont été réinitialisés !" - not-completed: "&2 Ce défi n'est pas encore terminé !" - migrate-start: "&2 Commencer à migrer les données supplémentaires des défis." - migrate-end: "&2 données d'addon Challenges mises à jour dans un nouveau format." - migrate-not: "&2 Toutes les données sont valides." - start-downloading: "&5 Début du téléchargement et de l'importation de la bibliothèque + completed: "Vous avez terminé le défi [name] pour [player] !" + already-completed: "Ce défi a déjà été relevé !" + reset: "Vous réinitialisez le défi [name] pour [player] !" + reset-all: "Tous les défis de [player] ont été réinitialisés !" + not-completed: "Ce défi n'est pas encore terminé !" + migrate-start: "Commencer à migrer les données supplémentaires des défis." + migrate-end: "données d'addon Challenges mises à jour dans un nouveau format." + migrate-not: "Toutes les données sont valides." + start-downloading: "Début du téléchargement et de l'importation de la bibliothèque de défis." - you-completed-challenge: "&2Vous avez complété le challenge: [value] !" - you-repeated-challenge: "&2Vous avez répété le challenge: [value] !" - you-repeated-challenge-multiple: "&2Vous avez répété le challenge: [value] &r&2 + you-completed-challenge: "Vous avez complété le challenge: [value] !" + you-repeated-challenge: "Vous avez répété le challenge: [value] !" + you-repeated-challenge-multiple: "Vous avez répété le challenge: [value] [count] fois !" - you-completed-level: "&2Vous avez complété le niveau: [value] !" - name-has-completed-challenge: "&5[name] a complété le challenge: [value] !" - name-has-completed-level: "&5[name] a complété le niveau: [value] !" + you-completed-level: "Vous avez complété le niveau: [value] !" + name-has-completed-challenge: "[name] a complété le challenge: [value] !" + name-has-completed-level: "[name] a complété le niveau: [value] !" load-skipping: '"[value]" existe déjà - ignoré' load-overwriting: Écrasement "[value]" load-add: 'Ajout d''un nouveau objet: [value]' errors: - no-name: "&cNom du Challenge manquant" - unknown-challenge: "&cChallenge inconnu" + no-name: "Nom du Challenge manquant" + unknown-challenge: "Challenge inconnu" not-valid-integer: |- - &c L'entier donné "[value]" n'est pas valide ! + L'entier donné "[value]" n'est pas valide ! La valeur doit être comprise entre [min] et [max]. - not-deployed: "&cLe Challenge ne peut pas être réalisé !" - not-on-island: "&cVous devez être sur votre île pour faire le Challenge !" - challenge-level-not-available: "&c Vous n'avez pas débloqué le niveau requis pour + not-deployed: "Le Challenge ne peut pas être réalisé !" + not-on-island: "Vous devez être sur votre île pour faire le Challenge !" + challenge-level-not-available: "Vous n'avez pas débloqué le niveau requis pour relever ce défi." - not-repeatable: "&cCe Challenge n'est pas répétable !" - wrong-environment: "&cVous êtes dans le mauvais environnement !" - not-enough-items: "&cVous n'avez pas assez [items] pour relever ce Challenge !" - not-close-enough: "&cVous devez vous tenir dans un rayon de [number] blocs autour + not-repeatable: "Ce Challenge n'est pas répétable !" + wrong-environment: "Vous êtes dans le mauvais environnement !" + not-enough-items: "Vous n'avez pas assez [items] pour relever ce Challenge !" + not-close-enough: "Vous devez vous tenir dans un rayon de [number] blocs autour de tous les éléments requis." - you-still-need: "&cTu as encore besoin [amount] [item]" - missing-addon: "&cImpossible de terminer le Challenge. L'addon ou le plugin requis + you-still-need: "Tu as encore besoin [amount] [item]" + missing-addon: "Impossible de terminer le Challenge. L'addon ou le plugin requis est manquant." - incorrect: "&c Impossible de terminer le défi : les exigences sont incorrectes." - not-enough-money: "&cIl est nécéssaire d'avoir [value] sur votre compte pour compléter + incorrect: "Impossible de terminer le défi : les exigences sont incorrectes." + not-enough-money: "Il est nécéssaire d'avoir [value] sur votre compte pour compléter le challenge." - not-enough-experience: "&c Il est nécessaire d'avoir [value] EXP pour relever + not-enough-experience: "Il est nécessaire d'avoir [value] EXP pour relever ce défi." - island-level: "&c Votre île doit être de niveau [number] ou plus pour relever + island-level: "Votre île doit être de niveau [number] ou plus pour relever ce défi !" - no-load: "&cErreur: Impossible de charger le fichier challenges.yml. [message]" - load-error: "&cErreur: Impossible de charger [value]." - no-rank: "&c Vous n'avez pas un rang assez élevé pour faire cela." - cannot-remove-items: "&c Certains objets ne peuvent pas être supprimés de votre + no-load: "Erreur: Impossible de charger le fichier challenges.yml. [message]" + load-error: "Erreur: Impossible de charger [value]." + no-rank: "Vous n'avez pas un rang assez élevé pour faire cela." + cannot-remove-items: "Certains objets ne peuvent pas être supprimés de votre inventaire !" - exist-challenges-or-levels: "&cDans votre monde il existe déjà des challenges. + exist-challenges-or-levels: "Dans votre monde il existe déjà des challenges. Impossible de continuer !" - no-challenges: "&cLes challenges ne sont pas actifs dans le monde actuel !" - no-challenges-admin: "&cLes Challenges ne sont pas actifs dans le monde actuel - ! Vous devez utiliser &5/[command] &cpour ajouter cela !" - missing-arguments: "&c La commande n'a pas d'arguments." - no-multiple-permission: "&cVous n'avez pas la permission d'accomplir ce challenge + no-challenges: "Les challenges ne sont pas actifs dans le monde actuel !" + no-challenges-admin: "Les Challenges ne sont pas actifs dans le monde actuel + ! Vous devez utiliser /[command] pour ajouter cela !" + missing-arguments: "La commande n'a pas d'arguments." + no-multiple-permission: "Vous n'avez pas la permission d'accomplir ce challenge plusieurs fois à la fois." - invalid-level: "&c Le niveau [level] contient des données non valides. Il ne sera + invalid-level: "Le niveau [level] contient des données non valides. Il ne sera pas chargé à partir de la base de données !" - invalid-challenge: "&c Challenge [challenge] contient des données non valides. + invalid-challenge: "Challenge [challenge] contient des données non valides. Il ne sera pas chargé à partir de la base de données !" - no-library-entries: "&c Impossible de trouver des entrées de bibliothèque. Rien + no-library-entries: "Impossible de trouver des entrées de bibliothèque. Rien à montrer." - not-hooked: "&c Challenges Addon n'a trouvé aucun GameMode." - timeout: "&c Ce défi nécessite d'attendre [timeout] entre les achèvements. Vous + not-hooked: "Challenges Addon n'a trouvé aucun GameMode." + timeout: "Ce défi nécessite d'attendre [timeout] entre les achèvements. Vous devez attendre [wait-time] pour le terminer à nouveau." - requirement-not-met: "&c Ce défi nécessite que [statistic] ait [number]. Vous + requirement-not-met: "Ce défi nécessite que [statistic] ait [number]. Vous n'avez que [value]." - requirement-not-met-entity: "&c Ce défi nécessite que [statistic] [entity] ait + requirement-not-met-entity: "Ce défi nécessite que [statistic] [entity] ait [number]. Vous n'avez que [value]." - requirement-not-met-material: "&c Ce défi nécessite que [statistic] [material] + requirement-not-met-material: "Ce défi nécessite que [statistic] [material] ait [number]. Vous n'avez que [value]." protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5&oChange qui peut - &5&ocompléter les Challenges + Change qui peut + compléter les Challenges name: Protection de Challenge CHALLENGES_WORLD_PROTECTION: description: |- - &5&oCela permet d''activer / désactiver - &5&oles prérequis pour les joueurs de - &5&oqui doivent être sur leur île pour - &5&ocompléter le Challenge. + Cela permet d''activer / désactiver + les prérequis pour les joueurs de + qui doivent être sur leur île pour + compléter le Challenge. name: 'Limite de Challenge sur l''''île ' hint: Aucun Challenge en dehors de l''île version: 12 diff --git a/src/main/resources/locales/hu.yml b/src/main/resources/locales/hu.yml index 1af7a2d9..7fada13f 100644 --- a/src/main/resources/locales/hu.yml +++ b/src/main/resources/locales/hu.yml @@ -29,796 +29,796 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0 &l Kihívások menü" - gamemode-gui: "&0 &l Válassza a GameMode lehetőséget" - multiple-gui: "&0 &l Hányszor?" - admin-gui: "&0 &l Challenges Admin menü" - edit-challenge: "&0 &l Szerkesztés [challenge]" - edit-level: "&0 &l Szerkesztés [level]" - settings: "&0 &l Beállítások" - choose-challenge: "&0 &l Válassza ki a kihívást" - choose-level: "&0 &l Válassza ki a szintet" - choose-player: "&0 &l Válassza ki a lejátszót" - library: "&0 &l Könyvtár" - manage-blocks: "&0 &l Blokkok kezelése" - manage-entities: "&0 &l Entitások kezelése" - type-selector: "&0 &l Kihívás típusválasztó" - item-selector: "&0 &l Elemválasztó" - block-selector: "&0 &l Blokkválasztó" - entity-selector: "&0 &l entitásválasztó" - challenge-selector: "&0 &l Kihívásválasztó" - statistic-selector: "&0 &l statisztikaválasztó" - environment-selector: "&0 &l Környezetválasztó" + player-gui: "Kihívások menü" + gamemode-gui: "Válassza a GameMode lehetőséget" + multiple-gui: "Hányszor?" + admin-gui: "Challenges Admin menü" + edit-challenge: "Szerkesztés [challenge]" + edit-level: "Szerkesztés [level]" + settings: "Beállítások" + choose-challenge: "Válassza ki a kihívást" + choose-level: "Válassza ki a szintet" + choose-player: "Válassza ki a lejátszót" + library: "Könyvtár" + manage-blocks: "Blokkok kezelése" + manage-entities: "Entitások kezelése" + type-selector: "Kihívás típusválasztó" + item-selector: "Elemválasztó" + block-selector: "Blokkválasztó" + entity-selector: "entitásválasztó" + challenge-selector: "Kihívásválasztó" + statistic-selector: "statisztikaválasztó" + environment-selector: "Környezetválasztó" buttons: free-challenges: - name: "&f &l Ingyenes kihívások" + name: "Ingyenes kihívások" description: |- - &7 Megjeleníti a listát - &7 ingyenes kihívás + Megjeleníti a listát + ingyenes kihívás return: - name: "&f &l Vissza" + name: "Vissza" description: |- - &7 Visszatérés az előző menübe - &7 vagy lépjen ki a GUI -ból + Visszatérés az előző menübe + vagy lépjen ki a GUI -ból previous: - name: "&f &l Előző oldal" - description: "&7 Váltás &e [number] és 7 oldalra" + name: "Előző oldal" + description: "Váltás [number] és 7 oldalra" next: - name: "&f &l Következő oldal" - description: "&7 Váltás &e [number] és 7 oldalra" + name: "Következő oldal" + description: "Váltás [number] és 7 oldalra" reduce: - name: "&f &l Csökkent" - description: "&7 Csökkentés &e -vel [number]" + name: "Csökkent" + description: "Csökkentés -vel [number]" increase: - name: "&f &l Növelés" - description: "&7 Növelés &e -vel [number]" + name: "Növelés" + description: "Növelés -vel [number]" accept: - name: "&f &l Teljes" + name: "Teljes" description: |- - &7 Teljesítsd a kihívást és e [number] - &7 alkalom + Teljesítsd a kihívást és e [number] + alkalom quit: - name: "&f &l Kilépés" - description: "&7 Kilépés a GUI -ból." + name: "Kilépés" + description: "Kilépés a GUI -ból." complete_user_challenges: - name: "&f &l Teljes felhasználói kihívás (ok)" + name: "Teljes felhasználói kihívás (ok)" description: |- - &7 Lehetővé teszi a felhasználó és a kiválasztását - &7 teljes kihívás - &7 őt + Lehetővé teszi a felhasználó és a kiválasztását + teljes kihívás + őt reset_user_challenges: - name: "&f &l Felhasználói kihívások visszaállítása" + name: "Felhasználói kihívások visszaállítása" description: |- - &7 Lehetővé teszi a felhasználó és a kiválasztását - &7 visszaállítja a kihívásait + Lehetővé teszi a felhasználó és a kiválasztását + visszaállítja a kihívásait add_challenge: - name: "&f &l Kihívás létrehozása" + name: "Kihívás létrehozása" description: |- - &7 Elindít egy folyamatot - &7 új kihívást jelent. + Elindít egy folyamatot + új kihívást jelent. add_level: - name: "&f &l Szint létrehozása" + name: "Szint létrehozása" description: |- - &7 Elindít egy folyamatot - &7 új szint létrehozása. + Elindít egy folyamatot + új szint létrehozása. edit_challenge: - name: "&f &l Kihívás szerkesztése" + name: "Kihívás szerkesztése" description: |- - &7 Lehetővé teszi a választást és a szerkesztést - &7 kihívás. + Lehetővé teszi a választást és a szerkesztést + kihívás. edit_level: - name: "&f &l Szint szerkesztése" + name: "Szint szerkesztése" description: |- - &7 Lehetővé teszi a választást és a szerkesztést - &7 szinten. + Lehetővé teszi a választást és a szerkesztést + szinten. delete_challenge: - name: "&f &l Kihívás törlése" + name: "Kihívás törlése" description: |- - &7 Lehetővé teszi a választást és a törlést - &7 kihívás. + Lehetővé teszi a választást és a törlést + kihívás. delete_level: - name: "&f &l Szint törlése" + name: "Szint törlése" description: |- - &7 Lehetővé teszi a választást és a törlést - &7 szinten. + Lehetővé teszi a választást és a törlést + szinten. edit_settings: - name: "&f &l Beállítások" + name: "Beállítások" description: |- - &7 Lehetővé teszi a megtekintést és a szerkesztést - &7 és a kiegészítő beállítások. + Lehetővé teszi a megtekintést és a szerkesztést + és a kiegészítő beállítások. complete_wipe: - name: "&f &l Teljes törlés" + name: "Teljes törlés" description: |- - &7 Teljesen elhárítja a kihívásokat - &7 addon adatbázis, beleértve - &7 felhasználói adat. + Teljesen elhárítja a kihívásokat + addon adatbázis, beleértve + felhasználói adat. challenge_wipe: - name: "&f &l Challenge Wipe" + name: "Challenge Wipe" description: |- - &7 Teljesen elhárítja a kihívásokat - &7 és szintek az adatbázisból. + Teljesen elhárítja a kihívásokat + és szintek az adatbázisból. user_wipe: - name: "&f &l Felhasználói törlés" + name: "Felhasználói törlés" description: |- - &7 Teljesen törli a felhasználót - &7 adat az adatbázisból. + Teljesen törli a felhasználót + adat az adatbázisból. library: - name: "&f &l Könyvtár" + name: "Könyvtár" description: |- - &7 Nyit egy nyilvánosságot - &7 kihívások könyvtár. + Nyit egy nyilvánosságot + kihívások könyvtár. import_database: - name: "&f &l Adatbázis importálása" + name: "Adatbázis importálása" description: |- - &7 Lehetővé teszi az exportált importálást - &7 kihívások adatbázis. + Lehetővé teszi az exportált importálást + kihívások adatbázis. import_template: - name: "&f &l Sablon importálása" + name: "Sablon importálása" description: |- - &7 Lehetővé teszi sablon importálását - &7 fájl kihívásokkal. + Lehetővé teszi sablon importálását + fájl kihívásokkal. export_challenges: - name: "&f &l Export kihívások" + name: "Export kihívások" description: |- - &7 Lehetővé teszi az adatbázis exportálását - &7 helyi fájlba. + Lehetővé teszi az adatbázis exportálását + helyi fájlba. properties: - name: "&f &l Tulajdonságok" - description: "&7 Az összes fő tulajdonság megtekintése." + name: "Tulajdonságok" + description: "Az összes fő tulajdonság megtekintése." requirements: - name: "&f &l Követelmények" - description: "&7 A követelmények tulajdonságainak megtekintése." + name: "Követelmények" + description: "A követelmények tulajdonságainak megtekintése." rewards: - name: "&f &l Jutalmak" - description: "&7 A jutalmak tulajdonságainak megtekintése." + name: "Jutalmak" + description: "A jutalmak tulajdonságainak megtekintése." deployed: - name: "&f &l Telepítés" + name: "Telepítés" description: |- - &7 Váltás ha kihívás - &7 telepítve van, és a felhasználók is - &7 fejezze be. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Váltás ha kihívás + telepítve van, és a felhasználók is + fejezze be. + enabled: "Engedélyezve" + disabled: "Letiltva" name: - name: "&f &l Név" + name: "Név" description: |- - &7 Lehetővé teszi a változtatást - &7 a megjelenített név. - value: "&7 Jelenleg: &r [name]" + Lehetővé teszi a változtatást + a megjelenített név. + value: "Jelenleg: [name]" remove_on_complete: - name: "&f &l Elrejtés a befejezés után" + name: "Elrejtés a befejezés után" description: |- - &7 Váltás, ha a kihívás szükséges - &7 rejtve a játékos után - &7 befejeződött. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Váltás, ha a kihívás szükséges + rejtve a játékos után + befejeződött. + enabled: "Engedélyezve" + disabled: "Letiltva" description: - name: "&f &l Leírás" + name: "Leírás" description: |- - &7 A konkrét leírás - &7 a kihíváshoz. A szín - &7 kódot kell alkalmazni rá. - value: "&7 Aktuális leírás:" + A konkrét leírás + a kihíváshoz. A szín + kódot kell alkalmazni rá. + value: "Aktuális leírás:" environment: - name: "&f &l Dimenzió" + name: "Dimenzió" description: |- - &7 Lehetővé teszi annak korlátozását - &7 dimenzió a kihívás - &7 befejezhető. - enabled: "&2" + Lehetővé teszi annak korlátozását + dimenzió a kihívás + befejezhető. + enabled: "" disabled: és c order: - name: "&f &l Rendelés" - description: |- - &7 Lehetővé teszi a sorrend megváltoztatását - &7 objektum. - &7 Egyenlő számú objektum - &7 -et ők rendelik - &7 egyedi azonosító név. - value: "&7 Jelenlegi sorrend: &e [number]" + name: "Rendelés" + description: |- + Lehetővé teszi a sorrend megváltoztatását + objektum. + Egyenlő számú objektum + -et ők rendelik + egyedi azonosító név. + value: "Jelenlegi sorrend: [number]" icon: - name: "&f &l ikon" + name: "ikon" description: |- - &7 Lehetővé teszi az ikon megváltoztatását - &7 erre a kihívásra. + Lehetővé teszi az ikon megváltoztatását + erre a kihívásra. locked_icon: - name: "&f &l Zárolt ikon" + name: "Zárolt ikon" description: |- - &7 Lehetővé teszi a zárolt módosítást - &7 szint ikon. + Lehetővé teszi a zárolt módosítást + szint ikon. required_permissions: - name: "&f &l Szükséges engedélyek" - description: |- - &7 Lehetővé teszi a szükséges módosítást - &7 engedély erre - &7 kihívás teljesíthető. - title: "&7 engedély:" - permission: " &8 - [permission]" - none: "&7 Az engedélyek nincsenek beállítva." + name: "Szükséges engedélyek" + description: |- + Lehetővé teszi a szükséges módosítást + engedély erre + kihívás teljesíthető. + title: "engedély:" + permission: " - [permission]" + none: "Az engedélyek nincsenek beállítva." remove_entities: - name: "&f &l Entitások eltávolítása" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 szükséges entitás - &7 távolítsa el a világból - &7 befejezése után - &7 kihívás. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Entitások eltávolítása" + description: |- + Lehetővé teszi a váltást, ha + szükséges entitás + távolítsa el a világból + befejezése után + kihívás. + enabled: "Engedélyezve" + disabled: "Letiltva" required_entities: - name: "&f &l Kötelező entitások" - description: |- - &7 Lehetővé teszi a szükséges módosítást - &7 entitás ehhez - &7 kihívás teljesíthető. - title: "&7 entitás:" - list: " &8 - [number] x [block]" - none: "&7 Entitások nincsenek hozzáadva." + name: "Kötelező entitások" + description: |- + Lehetővé teszi a szükséges módosítást + entitás ehhez + kihívás teljesíthető. + title: "entitás:" + list: " - [number] x [block]" + none: "Entitások nincsenek hozzáadva." remove_blocks: - name: "&f &l Blokkok eltávolítása" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 szükséges blokk lesz - &7 távolítsa el a világból - &7 befejezése után - &7 kihívás. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Blokkok eltávolítása" + description: |- + Lehetővé teszi a váltást, ha + szükséges blokk lesz + távolítsa el a világból + befejezése után + kihívás. + enabled: "Engedélyezve" + disabled: "Letiltva" required_blocks: - name: "&f &l Kötelező blokkok" - description: |- - &7 Lehetővé teszi a szükséges módosítást - &7 blokk erre - &7 kihívás teljesíthető. - title: "&7 blokk:" - list: " &8 - [number] x [block]" - none: "&7 Blokkok nincsenek hozzáadva." + name: "Kötelező blokkok" + description: |- + Lehetővé teszi a szükséges módosítást + blokk erre + kihívás teljesíthető. + title: "blokk:" + list: " - [number] x [block]" + none: "Blokkok nincsenek hozzáadva." search_radius: - name: "&f &l Keresési sugár" + name: "Keresési sugár" description: |- - &7 Lehetővé teszi a sugár megváltoztatását - &7 körül játékos, ahonnan - &7 blokk és/vagy entitás - &7 észlelve. - value: "&7 Jelenlegi távolság: &e [number]" + Lehetővé teszi a sugár megváltoztatását + körül játékos, ahonnan + blokk és/vagy entitás + észlelve. + value: "Jelenlegi távolság: [number]" remove_items: - name: "&f &l Elemek eltávolítása" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 kötelező elem lesz - &7 eltávolításra kerül a készletből - &7 befejezése után - &7 kihívás. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Elemek eltávolítása" + description: |- + Lehetővé teszi a váltást, ha + kötelező elem lesz + eltávolításra kerül a készletből + befejezése után + kihívás. + enabled: "Engedélyezve" + disabled: "Letiltva" required_items: - name: "&f &l Kötelező elemek" - description: |- - &7 Lehetővé teszi a szükséges módosítást - &7 elem ehhez - &7 kihívás teljesíthető. - title: "&7 elem:" - list: " &8 - [item]" - none: "&7 Elemek nincsenek hozzáadva." + name: "Kötelező elemek" + description: |- + Lehetővé teszi a szükséges módosítást + elem ehhez + kihívás teljesíthető. + title: "elem:" + list: " - [item]" + none: "Elemek nincsenek hozzáadva." add_ignored_meta: - name: "&f &l Metaadatok figyelmen kívül hagyása" - description: |- - &7 Lehetővé teszi, hogy melyiket adja hozzá - &7 elemet figyelmen kívül kell hagyni - &7 minden olyan metaadat - &7 van hozzárendelve. - title: "&7 elem:" - list: " &8 - [item]" - none: "&7 Elemek nincsenek hozzáadva." + name: "Metaadatok figyelmen kívül hagyása" + description: |- + Lehetővé teszi, hogy melyiket adja hozzá + elemet figyelmen kívül kell hagyni + minden olyan metaadat + van hozzárendelve. + title: "elem:" + list: " - [item]" + none: "Elemek nincsenek hozzáadva." remove_ignored_meta: - name: "&f &l A metaadatok figyelmen kívül hagyásának eltávolítása" + name: "A metaadatok figyelmen kívül hagyásának eltávolítása" description: |- - &7 Lehetővé teszi annak eltávolítását - &7 elemet figyelmen kívül kell hagyni - &7 minden olyan metaadat - &7 van hozzárendelve. + Lehetővé teszi annak eltávolítását + elemet figyelmen kívül kell hagyni + minden olyan metaadat + van hozzárendelve. remove_experience: - name: "&f &l Tapasztalat eltávolítása" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 szükséges tapasztalat lesz - &7 eltávolításra kerül a lejátszóból - &7 befejezése után - &7 kihívás. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Tapasztalat eltávolítása" + description: |- + Lehetővé teszi a váltást, ha + szükséges tapasztalat lesz + eltávolításra kerül a lejátszóból + befejezése után + kihívás. + enabled: "Engedélyezve" + disabled: "Letiltva" required_experience: - name: "&f &l Szükséges tapasztalat" + name: "Szükséges tapasztalat" description: |- - &7 Lehetővé teszi a - &7 szükséges tapasztalat - &7 a lejátszó. - value: "&7 Jelenlegi tapasztalat: &e [number]" + Lehetővé teszi a + szükséges tapasztalat + a lejátszó. + value: "Jelenlegi tapasztalat: [number]" required_level: - name: "&f &l Kötelező szigetszint" + name: "Kötelező szigetszint" description: |- - &7 Lehetővé teszi a - &7 szükséges sziget szint - &7 a kihíváshoz. - value: "&7 Jelenlegi szint: &e [number]" + Lehetővé teszi a + szükséges sziget szint + a kihíváshoz. + value: "Jelenlegi szint: [number]" remove_money: - name: "&f &l Pénz eltávolítása" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 szükséges pénz lesz - &7 eltávolításra kerül a lejátszóból - &7 fiók befejezése után - &7 a kihívás. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Pénz eltávolítása" + description: |- + Lehetővé teszi a váltást, ha + szükséges pénz lesz + eltávolításra kerül a lejátszóból + fiók befejezése után + a kihívás. + enabled: "Engedélyezve" + disabled: "Letiltva" required_money: - name: "&f &l Szükséges pénz" + name: "Szükséges pénz" description: |- - &7 Lehetővé teszi a - &7 szükséges pénz a játékosra - &7 figyelembe veszi a kihívást. - value: "&7 Jelenlegi érték: &e [number]" + Lehetővé teszi a + szükséges pénz a játékosra + figyelembe veszi a kihívást. + value: "Jelenlegi érték: [number]" statistic: - name: "&f &l Statisztika" + name: "Statisztika" description: |- - &7 Lehetővé teszi a - &7 statisztikai típus - &7 ellenőrizte ezt a kihívást. - value: "&7 Jelenlegi érték: &e [statistic]" + Lehetővé teszi a + statisztikai típus + ellenőrizte ezt a kihívást. + value: "Jelenlegi érték: [statistic]" statistic_amount: - name: "&f &l Célérték" + name: "Célérték" description: |- - &7 Lehetővé teszi a - &7 statisztikai célérték - &7, amit teljesíteni kell. - value: "&7 Jelenlegi érték: &e [number]" + Lehetővé teszi a + statisztikai célérték + , amit teljesíteni kell. + value: "Jelenlegi érték: [number]" remove_statistic: - name: "&f &l Statisztika csökkentése" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 statisztikai érték lesz - &7 befejezése után csökkenteni kell - &7 a kihívás. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Statisztika csökkentése" + description: |- + Lehetővé teszi a váltást, ha + statisztikai érték lesz + befejezése után csökkenteni kell + a kihívás. + enabled: "Engedélyezve" + disabled: "Letiltva" statistic_blocks: - name: "&f &l céltábla" + name: "céltábla" description: |- - &7 Lehetővé teszi a - &7 statisztikai célblokk. - value: "&7 Aktuális blokk: &e [block]" + Lehetővé teszi a + statisztikai célblokk. + value: "Aktuális blokk: [block]" statistic_items: - name: "&f &l Célpont" + name: "Célpont" description: |- - &7 Lehetővé teszi a - &7 statisztikai célpont. - value: "&7 Jelenlegi tétel: &e [item]" + Lehetővé teszi a + statisztikai célpont. + value: "Jelenlegi tétel: [item]" statistic_entities: - name: "&f &l Cél Entitás" + name: "Cél Entitás" description: |- - &7 Lehetővé teszi a - &7 statisztikai cél entitást. - value: "&7 Jelenlegi entitás: &e [block]" + Lehetővé teszi a + statisztikai cél entitást. + value: "Jelenlegi entitás: [block]" reward_text: - name: "&f &l Jutalomszöveg" + name: "Jutalomszöveg" description: |- - &7 A konkrét jutalomszöveg. - &7 A színkódoknak meg kell lenniük - &7 vonatkozik rá. - value: "&7 Jelenlegi szöveg:" + A konkrét jutalomszöveg. + A színkódoknak meg kell lenniük + vonatkozik rá. + value: "Jelenlegi szöveg:" repeat_reward_text: - name: "&f &l Jutalomszöveg ismétlése" + name: "Jutalomszöveg ismétlése" description: |- - &7 Az adott ismétlődő jutalomszöveg - &7 a kihíváshoz. A szín - &7 kódot kell alkalmazni rá. - value: "&7 Jelenlegi szöveg:" + Az adott ismétlődő jutalomszöveg + a kihíváshoz. A szín + kódot kell alkalmazni rá. + value: "Jelenlegi szöveg:" reward_items: - name: "&f &l Jutalom" + name: "Jutalom" description: |- - &7 Lehetővé teszi a jutalom megváltoztatását - &7 elem. - title: "&7 elem:" - list: " &8 - [item]" - none: "&7 Elemek nincsenek hozzáadva." + Lehetővé teszi a jutalom megváltoztatását + elem. + title: "elem:" + list: " - [item]" + none: "Elemek nincsenek hozzáadva." repeat_reward_items: - name: "&f &l Ismételje meg a jutalom tételeit" - description: |- - &7 Lehetővé teszi az ismétlés megváltoztatását - &7 jutalom elemet ezért - &7 kihívás. - title: "&7 elem:" - list: " &8 - [item]" - none: "&7 Elemek nincsenek hozzáadva." + name: "Ismételje meg a jutalom tételeit" + description: |- + Lehetővé teszi az ismétlés megváltoztatását + jutalom elemet ezért + kihívás. + title: "elem:" + list: " - [item]" + none: "Elemek nincsenek hozzáadva." reward_experience: - name: "&f &l Jutalomélmény" + name: "Jutalomélmény" description: |- - &7 Lehetővé teszi a - &7 jutalmazási élmény - &7 a lejátszó. - value: "&7 Jutalomélmény: &e [number]" + Lehetővé teszi a + jutalmazási élmény + a lejátszó. + value: "Jutalomélmény: [number]" repeat_reward_experience: - name: "&f &l Ismétlődő jutalomélmény" + name: "Ismétlődő jutalomélmény" description: |- - &7 Lehetővé teszi a - &7 ismétlődő jutalomélmény - &7 a játékos számára. - value: "&7 Jutalomélmény: &e [number]" + Lehetővé teszi a + ismétlődő jutalomélmény + a játékos számára. + value: "Jutalomélmény: [number]" reward_money: - name: "&f &l Pénzjutalom" + name: "Pénzjutalom" description: |- - &7 Lehetővé teszi a - &7 jutalompénz. - value: "&7 Jelenlegi érték: &e [number]" + Lehetővé teszi a + jutalompénz. + value: "Jelenlegi érték: [number]" repeat_reward_money: - name: "&f &l Ismételje meg a jutalompénzt" + name: "Ismételje meg a jutalompénzt" description: |- - &7 Lehetővé teszi a - &7 ismételt jutalompénz - &7 a kihíváshoz. - value: "&7 Jelenlegi érték: &e [number]" + Lehetővé teszi a + ismételt jutalompénz + a kihíváshoz. + value: "Jelenlegi érték: [number]" reward_commands: - name: "&f &l Jutalomparancsok" - description: |- - &7 A specifikus jutalmazási parancsok. - &8 Tipp: - &8 A parancs nem követeli meg - &8 először írni "/", ahogy akarja - &8 automatikusan alkalmazásra kerül. - &8 Alapértelmezés szerint a parancsok lesznek - &8 szerver hajtja végre. azonban - &8 a "[SELF]" hozzáadása az elején - &8 lehetővé teszi a parancsok megadását - &8 végrehajtja a játékos. Az is - &8 egy helyőrzőt támogat - &8 `[player]` lesz - &8 játékos névvel helyettesítve - &8, aki teljesítette a kihívást. - value: "&7 Aktuális parancsok:" + name: "Jutalomparancsok" + description: |- + A specifikus jutalmazási parancsok. + Tipp: + A parancs nem követeli meg + először írni "/", ahogy akarja + automatikusan alkalmazásra kerül. + Alapértelmezés szerint a parancsok lesznek + szerver hajtja végre. azonban + a "[SELF]" hozzáadása az elején + lehetővé teszi a parancsok megadását + végrehajtja a játékos. Az is + egy helyőrzőt támogat + `[player]` lesz + játékos névvel helyettesítve + , aki teljesítette a kihívást. + value: "Aktuális parancsok:" repeat_reward_commands: - name: "&f &l Ismételje meg a jutalmazási parancsokat" - description: |- - &7 A konkrét ismétlődő jutalom - &7 parancs a kihíváshoz. - &8 Tipp: - &8 A parancs nem követeli meg - &8 először írni "/", ahogy akarja - &8 automatikusan alkalmazásra kerül. - &8 Alapértelmezés szerint a parancsok lesznek - &8 szerver hajtja végre. azonban - &8 a "[SELF]" hozzáadása az elején - &8 lehetővé teszi a parancsok megadását - &8 végrehajtja a játékos. Az is - &8 egy helyőrzőt támogat - &8 `[player]` lesz - &8 játékos névvel helyettesítve - &8, aki teljesítette a kihívást. - value: "&7 Aktuális parancsok:" + name: "Ismételje meg a jutalmazási parancsokat" + description: |- + A konkrét ismétlődő jutalom + parancs a kihíváshoz. + Tipp: + A parancs nem követeli meg + először írni "/", ahogy akarja + automatikusan alkalmazásra kerül. + Alapértelmezés szerint a parancsok lesznek + szerver hajtja végre. azonban + a "[SELF]" hozzáadása az elején + lehetővé teszi a parancsok megadását + végrehajtja a játékos. Az is + egy helyőrzőt támogat + `[player]` lesz + játékos névvel helyettesítve + , aki teljesítette a kihívást. + value: "Aktuális parancsok:" repeatable: - name: "&f &l Ismételhető" + name: "Ismételhető" description: |- - &7 Lehetővé teszi a váltást, ha - &7 a kihívás - &7 megismételhető. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Lehetővé teszi a váltást, ha + a kihívás + megismételhető. + enabled: "Engedélyezve" + disabled: "Letiltva" repeat_count: - name: "&f &l Ismétlés Count" + name: "Ismétlés Count" description: |- - &7 Lehetővé teszi a - &7 ismétlésszám - &7 a kihíváshoz. - value: "&7 Jelenlegi érték: &e [number]" + Lehetővé teszi a + ismétlésszám + a kihíváshoz. + value: "Jelenlegi érték: [number]" cool_down: - name: "&f &l Lehűlni" - description: |- - &7 Lehetővé teszi a - &7 lehűlési másodperc - &7 között várni kell - &7 megismételhető kihívás - &7 befejezés. - value: "&7 Jelenlegi érték: &e [time]" + name: "Lehűlni" + description: |- + Lehetővé teszi a + lehűlési másodperc + között várni kell + megismételhető kihívás + befejezés. + value: "Jelenlegi érték: [time]" challenges: - name: "&f &l Kihívások" + name: "Kihívások" description: |- - &7 A hozzárendelt kihívások megtekintése - &7 szintre. + A hozzárendelt kihívások megtekintése + szintre. waiver_amount: - name: "&f &l Lemondási összeg" + name: "Lemondási összeg" description: |- - &7 Lehetővé teszi szám beállítását - &7 kihívás, amely képes - &7 befejezetlen marad - &7 a következő szint felszabadítása. - value: "&7 Jelenlegi érték: &e [number]" + Lehetővé teszi szám beállítását + kihívás, amely képes + befejezetlen marad + a következő szint felszabadítása. + value: "Jelenlegi érték: [number]" add_challenges: - name: "&f &l Kihívás hozzáadása" + name: "Kihívás hozzáadása" description: |- - &7 Lehetővé teszi a és kiválasztását - &7 további kihívásokat jelent a - &7 szint. + Lehetővé teszi a és kiválasztását + további kihívásokat jelent a + szint. remove_challenges: - name: "&f &l Kihívás (ok) eltávolítása" + name: "Kihívás (ok) eltávolítása" description: |- - &7 Lehetővé teszi a és kiválasztását - &7 távolítsa el a kihívásokat - &7 szint. + Lehetővé teszi a és kiválasztását + távolítsa el a kihívásokat + szint. reset_on_new: - name: "&f &l Reset On New" - description: |- - &7 Lehetővé teszi a váltást, ha - &7 kihívásnak kell lennie - &7 alaphelyzetbe állítás, amikor a felhasználó távozik - &7 szigeten, vagy létrehoz egy újat - &7 sziget. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Reset On New" + description: |- + Lehetővé teszi a váltást, ha + kihívásnak kell lennie + alaphelyzetbe állítás, amikor a felhasználó távozik + szigeten, vagy létrehoz egy újat + sziget. + enabled: "Engedélyezve" + disabled: "Letiltva" broadcast: - name: "&f &l Közvetítés" + name: "Közvetítés" description: |- - &7 Adások kihívása és - &7 szintű első befejezés - &7 mindenkinek. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Adások kihívása és + szintű első befejezés + mindenkinek. + enabled: "Engedélyezve" + disabled: "Letiltva" remove_completed: - name: "&f &l Elrejtés befejezve" + name: "Elrejtés befejezve" description: |- - &7 Elrejti a befejezett kihívásokat - &7 a menüből. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Elrejti a befejezett kihívásokat + a menüből. + enabled: "Engedélyezve" + disabled: "Letiltva" glow_completed: - name: "&f &l Ragyogás befejezve" + name: "Ragyogás befejezve" description: |- - &7 Varázslatos ragyogást kölcsönöz - &7 a befejezett kihívásokra. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Varázslatos ragyogást kölcsönöz + a befejezett kihívásokra. + enabled: "Engedélyezve" + disabled: "Letiltva" store_history: - name: "&f &l Store History" - description: |- - &7 Belső előzményeket tárol - &7, amikor minden kihívás - &7 elkészült. - &7 Jelenleg csak megtekinthető - &7 az adatbázisban. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Store History" + description: |- + Belső előzményeket tárol + , amikor minden kihívás + elkészült. + Jelenleg csak megtekinthető + az adatbázisban. + enabled: "Engedélyezve" + disabled: "Letiltva" data_per_island: - name: "&f &l Store Per Island" - description: |- - &7 A befejezettet tárolja - &7 kihívás szigetenként. - &7 A haladás megosztásra kerül - &7 a csapat összes játékosával. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Store Per Island" + description: |- + A befejezettet tárolja + kihívás szigetenként. + A haladás megosztásra kerül + a csapat összes játékosával. + enabled: "Engedélyezve" + disabled: "Letiltva" show_title: - name: "&f &l Cím megjelenítése" + name: "Cím megjelenítése" description: |- - &7 Megjeleníti a címet, amikor a - &7 kihívás vagy szint - &7 befejeződött. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + Megjeleníti a címet, amikor a + kihívás vagy szint + befejeződött. + enabled: "Engedélyezve" + disabled: "Letiltva" gamemode_gui: - name: "&f &l GameMode Selection GUI" - description: |- - &7 Engedélyezi az egyetlen GUI -t - &7 a /kihívásokon keresztül érhető el - &7 parancsot. - &c A szerver újraindítását igényli. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "GameMode Selection GUI" + description: |- + Engedélyezi az egyetlen GUI -t + a /kihívásokon keresztül érhető el + parancsot. + A szerver újraindítását igényli. + enabled: "Engedélyezve" + disabled: "Letiltva" locked_level_icon: - name: "&f &l Alapértelmezett zárolt szint ikon" + name: "Alapértelmezett zárolt szint ikon" description: |- - &7 Az összes zárolt alapértelmezett ikonja - &7 szint. Minden szint változhat - &7 ezt az ikont. + Az összes zárolt alapértelmezett ikonja + szint. Minden szint változhat + ezt az ikont. purge_history: - name: "&f &l Történelem Élettartam" - description: |- - &7 Napok száma, mennyi ideig - &7 előzményadat tárolódik - &7 a felhasználói adatok között. - &7 0 azt jelenti, hogy az adatok fognak - &7 nem távolítható el. - value: "&7 Jelenlegi érték: &e [number]" + name: "Történelem Élettartam" + description: |- + Napok száma, mennyi ideig + előzményadat tárolódik + a felhasználói adatok között. + 0 azt jelenti, hogy az adatok fognak + nem távolítható el. + value: "Jelenlegi érték: [number]" title_showtime: - name: "&f &l Cím Showtime" + name: "Cím Showtime" description: |- - &7 A címkék száma - &7 jelenik meg a játékosnak. - value: "&7 Jelenlegi érték: &e [number]" + A címkék száma + jelenik meg a játékosnak. + value: "Jelenlegi érték: [number]" active_world_list: - name: "&f &l Csak aktív világ megjelenítése" - description: |- - &7 Ha a GameMode Selection GUI - &7 engedélyezve van, ez válthat - &7, ha a grafikus felhasználói felület megjeleníti a GameMode választást - &7 vagy kihívások a jelenlegi világ számára. - &c A szerver újraindítását igényli. - enabled: "&2 Engedélyezve" - disabled: "&c Letiltva" + name: "Csak aktív világ megjelenítése" + description: |- + Ha a GameMode Selection GUI + engedélyezve van, ez válthat + , ha a grafikus felhasználói felület megjeleníti a GameMode választást + vagy kihívások a jelenlegi világ számára. + A szerver újraindítását igényli. + enabled: "Engedélyezve" + disabled: "Letiltva" visibility_mode: - name: "&f &l Láthatósági mód" + name: "Láthatósági mód" description: |- - &7 Láthatósági mód - &7 kihívás - &7 hiddend. - enabled: "&2" + Láthatósági mód + kihívás + hiddend. + enabled: "" disabled: és c visible: Látható kihívások megjelenítése hidden: Mutasd meg az összes kihívást toggleable: Váltás engedélyezése download: - name: "&f &l Könyvtárak letöltése" + name: "Könyvtárak letöltése" description: |- - &7 Manuális frissítés érhető el - &7 kihívást jelent a könyvtáraknak. - enabled: "&2 A gyorsítótár üres" - disabled: "&c Gyorsítótár nélkül törölje" + Manuális frissítés érhető el + kihívást jelent a könyvtáraknak. + enabled: "A gyorsítótár üres" + disabled: "Gyorsítótár nélkül törölje" player: - name: "&f &l [name]" - description: "&7 szigettulajdonos: [owner]" - members: "&7 szigettag:" - member: "&8 - [name]" + name: "[name]" + description: "szigettulajdonos: [owner]" + members: "szigettag:" + member: "- [name]" no-island: |- - &c Player nem rendelkezik + Player nem rendelkezik és c egy sziget. player_list: - name: "&f &l Válassza ki a Felhasználói listát" + name: "Válassza ki a Felhasználói listát" description: |- - &7 Válassza ki a felhasználói listát - &7 -et kell mutatni. - enabled: "&2" + Válassza ki a felhasználói listát + -et kell mutatni. + enabled: "" disabled: és c online: Online játékosok with_island: Játékosok szigetekkel in_world: Játékosok a világban add_block: - name: "&f &l Blokk hozzáadása" + name: "Blokk hozzáadása" description: |- - &7 Lehetővé teszi újak hozzáadását - &7 blokk a listához. + Lehetővé teszi újak hozzáadását + blokk a listához. remove_block: - name: "&f &l Blokk eltávolítása" + name: "Blokk eltávolítása" description: |- - &7 Lehetővé teszi az eltávolítást - &7 kiválasztott blokk - &7 a listákból. - title: "&7 kiválasztott anyag:" - material: "&8 - [material]" + Lehetővé teszi az eltávolítást + kiválasztott blokk + a listákból. + title: "kiválasztott anyag:" + material: "- [material]" material: - name: "&f &l [material]" - description: "&7 Anyag -azonosító: [id]" - selected: "&2 Kiválasztva" + name: "[material]" + description: "Anyag -azonosító: [id]" + selected: "Kiválasztva" add_entity: - name: "&f &l Entitás hozzáadása" + name: "Entitás hozzáadása" description: |- - &7 Lehetővé teszi újak hozzáadását - &7 entitás a listában. + Lehetővé teszi újak hozzáadását + entitás a listában. switch_entity: - name: "&f &l Tojásváltás" + name: "Tojásváltás" description: |- - &7 Lehetővé teszi a váltást - &7 tojás a csőcselékfejekhez. + Lehetővé teszi a váltást + tojás a csőcselékfejekhez. remove_entity: - name: "&f &l Entitás eltávolítása" + name: "Entitás eltávolítása" description: |- - &7 Lehetővé teszi az eltávolítást - &7 kiválasztott entitás - &7 a listákból. - title: "&7 kiválasztott entitás:" - entity: "&8 - [block]" + Lehetővé teszi az eltávolítást + kiválasztott entitás + a listákból. + title: "kiválasztott entitás:" + entity: "- [block]" entity: - name: "&f &l [block]" - description: "&7 Entitás azonosító: [id]" - selected: "&2 Kiválasztva" + name: "[block]" + description: "Entitás azonosító: [id]" + selected: "Kiválasztva" inventory_type: - name: "&f &l Készlet típusa" + name: "Készlet típusa" description: |- - &7 Kihívás, amely ellenőrzi - &7 elem a játékosok készletében + Kihívás, amely ellenőrzi + elem a játékosok készletében island_type: - name: "&f &l Sziget típusa" + name: "Sziget típusa" description: |- - &7 Kihívás, amely ellenőrzi - &7 blokk vagy entitás körül - &7 játékos. + Kihívás, amely ellenőrzi + blokk vagy entitás körül + játékos. other_type: - name: "&f &l Egyéb típus" + name: "Egyéb típus" description: |- - &7 Kihívás - &7 bővítmény vagy kiegészítő, - &7, mint a szint és a pénz. + Kihívás + bővítmény vagy kiegészítő, + , mint a szint és a pénz. statistic_type: - name: "&f &l Statisztika típusa" + name: "Statisztika típusa" description: |- - &7 Kihívás, amely ellenőrzi - &7 játékos statisztikai adatai. + Kihívás, amely ellenőrzi + játékos statisztikai adatai. save: - name: "&f &l Mentés" + name: "Mentés" description: |- - &7 Menti a változtatásokat és - &7 visszatér. + Menti a változtatásokat és + visszatér. cancel: - name: "&f &l Mégse" + name: "Mégse" description: |- - &7 Elveti a módosításokat és - &7 visszatér. + Elveti a módosításokat és + visszatér. accept_selected: - name: "&f &l Kiválasztott elfogadása" + name: "Kiválasztott elfogadása" description: |- - &7 Visszaadja a kijelölt elemeket - &7 és megnyitja az előző GUI -t. - title: "&7 kiválasztva:" - element: "&8 - [item]" + Visszaadja a kijelölt elemeket + és megnyitja az előző GUI -t. + title: "kiválasztva:" + element: "- [item]" statistic_element: - name: "&f &l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f &l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f &l Keresés" + name: "Keresés" description: |- - &7 Lehetővé teszi a keresést egy - &7 elem bemenettel - &7 szövegérték. - search: "&b Érték: [value]" + Lehetővé teszi a keresést egy + elem bemenettel + szövegérték. + search: "Érték: [value]" tips: - click-to-select: "&e Kattintson a &7 gombra a kiválasztáshoz." - click-to-choose: "&e Kattintson a &7 gombra a kiválasztáshoz." - click-to-complete: "&e Kattintson a &7 gombra a befejezéshez." - right-click-multiple-open: "&e Kattintson a jobb egérgombbal és a 7 gombbal + click-to-select: "Kattintson a gombra a kiválasztáshoz." + click-to-choose: "Kattintson a gombra a kiválasztáshoz." + click-to-complete: "Kattintson a gombra a befejezéshez." + right-click-multiple-open: "Kattintson a jobb egérgombbal és a 7 gombbal a befejezés számának kiválasztásához." - shift-left-click-to-complete-all: "&e Shift Kattintson a &7 gombra az összes + shift-left-click-to-complete-all: "Shift Kattintson a gombra az összes befejezéséhez." - left-click-to-accept: "&e A bal egérgombbal &7 a befejezéshez." - right-click-to-write: "&e Íráshoz kattintson a jobb gombbal &7." - click-to-reduce: "&e Kattintson a &7 gombra a kicsinyítéshez." - click-to-increase: "&e Kattintson a &7 gombra a növeléshez." - click-to-return: "&e Kattintson a &7 gombra a visszatéréshez." - click-to-quit: "&e Kilépéshez kattintson a &7 gombra." - click-to-wipe: "&e Törléshez kattintson a &7 gombra." - left-click-to-wipe: "&e Bal kattintás &7 a törléshez." - right-click-to-switch: "&e A jobb egérgombbal &7 váltani." - click-to-open: "&e Kattintson a &7 gombra a megnyitáshoz." - click-to-export: "&e Kattintson a &7 gombra az exportáláshoz." - click-to-create: "&e Kattintson a &7 gombra a létrehozáshoz." - left-click-to-open: "&e A bal egérgombbal &7 megnyitásához." - right-click-to-reset-all: "&e Az összes törléséhez kattintson a jobb gombbal - &7." - click-to-toggle: "&e A &7 gombra kattintva válthat." - click-to-change: "&e Kattintson a &7 gombra a változtatáshoz." - shift-click-to-reset: "&e Shift Kattintson a &7 gombra a visszaállításhoz." - click-to-add: "&e Kattintson a &7 gombra a hozzáadáshoz." - click-to-remove: "&e Az eltávolításhoz kattintson a &7 gombra." - left-click-to-cycle: "&e Bal egérgombbal &7 a lefelé léptetéshez." - right-click-to-cycle: "&e A jobb egérgombbal és a 7 gombbal válthat." - click-to-edit: "&e Kattintson a &7 gombra a szerkesztéshez." - left-click-to-download: "&e Bal kattintás és 7 a letöltéshez." - right-click-to-toggle: "&e A jobb egérgombbal &7 a váltáshoz." - click-to-install: "&e Kattintson a &7 gombra a telepítéshez." - click-to-reset-all: "&e Kattintson az &7 gombra az összes visszaállításához." - right-click-to-select: "&e A jobb egérgombbal és a 7 gombbal választhat." - right-click-to-deselect: "&e Kattintson a jobb egérgombbal és a 7 gombbal a + left-click-to-accept: "A bal egérgombbal a befejezéshez." + right-click-to-write: "Íráshoz kattintson a jobb gombbal ." + click-to-reduce: "Kattintson a gombra a kicsinyítéshez." + click-to-increase: "Kattintson a gombra a növeléshez." + click-to-return: "Kattintson a gombra a visszatéréshez." + click-to-quit: "Kilépéshez kattintson a gombra." + click-to-wipe: "Törléshez kattintson a gombra." + left-click-to-wipe: "Bal kattintás a törléshez." + right-click-to-switch: "A jobb egérgombbal váltani." + click-to-open: "Kattintson a gombra a megnyitáshoz." + click-to-export: "Kattintson a gombra az exportáláshoz." + click-to-create: "Kattintson a gombra a létrehozáshoz." + left-click-to-open: "A bal egérgombbal megnyitásához." + right-click-to-reset-all: "Az összes törléséhez kattintson a jobb gombbal + ." + click-to-toggle: "A gombra kattintva válthat." + click-to-change: "Kattintson a gombra a változtatáshoz." + shift-click-to-reset: "Shift Kattintson a gombra a visszaállításhoz." + click-to-add: "Kattintson a gombra a hozzáadáshoz." + click-to-remove: "Az eltávolításhoz kattintson a gombra." + left-click-to-cycle: "Bal egérgombbal a lefelé léptetéshez." + right-click-to-cycle: "A jobb egérgombbal és a 7 gombbal válthat." + click-to-edit: "Kattintson a gombra a szerkesztéshez." + left-click-to-download: "Bal kattintás és 7 a letöltéshez." + right-click-to-toggle: "A jobb egérgombbal a váltáshoz." + click-to-install: "Kattintson a gombra a telepítéshez." + click-to-reset-all: "Kattintson az gombra az összes visszaállításához." + right-click-to-select: "A jobb egérgombbal és a 7 gombbal választhat." + right-click-to-deselect: "Kattintson a jobb egérgombbal és a 7 gombbal a kijelölés megszüntetéséhez." - left-click-to-choose: "&e Bal egérgombbal &7 a kiválasztáshoz." - click-to-cancel: "&e Kattintson a &7 gombra a törléshez." - click-to-save: "&e Kattintson a &7 gombra a mentéshez." - click-to-deselect: "&e Kattintson a &7 gombra a kijelölés megszüntetéséhez." + left-click-to-choose: "Bal egérgombbal a kiválasztáshoz." + click-to-cancel: "Kattintson a gombra a törléshez." + click-to-save: "Kattintson a gombra a mentéshez." + click-to-deselect: "Kattintson a gombra a kijelölés megszüntetéséhez." click-on-item: |- - &e Kattintson a &7 -re az elemen - &7 a készletét. - left-click-to-edit: "&e Bal kattintás &7 a szerkesztéshez." - right-click-to-clear: "&e A jobb egérgombbal és a 7 törléshez." - click-to-previous: "&e Kattintson a &7 gombra az előző oldal megtekintéséhez." - click-to-next: "&e Kattintson a &7 gombra a következő oldal megtekintéséhez." + Kattintson a -re az elemen + a készletét. + left-click-to-edit: "Bal kattintás a szerkesztéshez." + right-click-to-clear: "A jobb egérgombbal és a 7 törléshez." + click-to-previous: "Kattintson a gombra az előző oldal megtekintéséhez." + click-to-next: "Kattintson a gombra a következő oldal megtekintéséhez." descriptions: challenge: lore: |- @@ -828,17 +828,17 @@ challenges: [requirements] [rewards] status: - completed: "&2 &l Befejezve" - completed-times: "&2 befejezve &7 &l [number] &r &2 idő (k)" - completed-times-of: "&2 befejezve &7 &l [number] &r &2 / &7 &l [max] - &r &2 alkalommal" - completed-times-reached: "&2 &l Összes &7 [max] és 2 alkalommal befejezve" + completed: "Befejezve" + completed-times: "befejezve [number] idő (k)" + completed-times-of: "befejezve [number] / [max] + alkalommal" + completed-times-reached: "Összes [max] és 2 alkalommal befejezve" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7 &l Lehűlés: &r &7 [time]" - wait-time: "&c &l Elérhető: &r&c [time]" + timeout: "Lehűlés: [time]" + wait-time: "Elérhető: [time]" in-days: "[number] d" in-hours: "[number] h" in-minutes: "[number] perc" @@ -848,12 +848,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Korlátozott: [environment]" - environment-title: "&7 Korlátozott:" - environment-list: " &7 - &e [environment]" - permission-single: "&c [permissions] engedély szükséges" - permissions-title: "&c Engedélyek szükségesek:" - permissions-list: " &c - [permission]" + environment-single: "Korlátozott: [environment]" + environment-title: "Korlátozott:" + environment-list: " - [environment]" + permission-single: "[permissions] engedély szükséges" + permissions-title: "Engedélyek szükségesek:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -861,23 +861,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7 &l Kötelező blokkok:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7 &l Kötelező entitások:" - entity-value: " &7 - &e [block]" - entities-value: " &7 - &e [number] x [block]" - search-radius: "&7 Legfeljebb &e [number] &7 méternél" - warning-block: "&e Blokkok &c eltávolításra kerülnek" - warning-entity: "&e Az entitások eltávolításra kerülnek" + blocks-title: "Kötelező blokkok:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Kötelező entitások:" + entity-value: " - [block]" + entities-value: " - [number] x [block]" + search-radius: "Legfeljebb [number] méternél" + warning-block: "Blokkok eltávolításra kerülnek" + warning-entity: "Az entitások eltávolításra kerülnek" inventory: lore: |- [items] [warning] - item-title: "&7 &l Kötelező elemek:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e Elem (ek) eltávolításra kerülnek" + item-title: "Kötelező elemek:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "Elem (ek) eltávolításra kerülnek" other: lore: |- [experience] @@ -885,34 +885,34 @@ challenges: [money] [money-warning] [level] - experience: "&7 &l Szükséges tapasztalat: &r &e [number]" - experience-warning: "&e A tapasztalatok eltávolításra kerülnek" - money: "&7 &l Szükséges pénz: &r &e [number]" - money-warning: "&e A pénz eltávolításra kerül" - level: "&7 &l Kötelező szigetszint: &r &e [number]" + experience: "Szükséges tapasztalat: [number]" + experience-warning: "A tapasztalatok eltávolításra kerülnek" + money: "Szükséges pénz: [number]" + money-warning: "A pénz eltávolításra kerül" + level: "Kötelező szigetszint: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7 &l [statistic]: &r &e [number] x [target]" - single-target: "&7 &l [statistic]: &r &e [target]" - statistic: "&7 &l [statistic] &r &e [number]" - warning: "&e A statisztikai adatok csökkennek" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "A statisztikai adatok csökkennek" rewards: lore: |- - &7 &l jutalmak: + jutalmak: [text] [items] [experience] [money] [commands] - item-title: "&7 elem:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Tapasztalat: &r &e [number]" - money: "&7 Pénz: &r &e [number]" - commands-title: "&7 parancs:" - command: " &7 - &e [command]" + item-title: "elem:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Tapasztalat: [number]" + money: "Pénz: [number]" + commands-title: "parancs:" + command: " - [command]" level: lore: |- [text] @@ -920,183 +920,183 @@ challenges: [waiver] [rewards] status: - completed: "&2 &l Befejezve" + completed: "Befejezve" completed-challenges-of: |- - &2 Befejezve &7 &l [number] &r &2 ki - &7 &l [max] &r &2 kihívások. - locked: "&c &l zárolva" + Befejezve [number] ki + [max] kihívások. + locked: "zárolva" missing-challenges: |- - &7 [number] több kihívás kell - &7 befejeződött ennek a szintnek a feloldásához. + [number] több kihívás kell + befejeződött ennek a szintnek a feloldásához. waiver: |- - &7 &l [number] kihívás (ok) &r &7 lehet - &7 átugrott a következő szint feloldásához. + [number] kihívás (ok) lehet + átugrott a következő szint feloldásához. rewards: lore: |- - &7 &l jutalmak: + jutalmak: [text] [items] [experience] [money] [commands] - item-title: "&7 elem:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Tapasztalat: &r &e [number]" - money: "&7 Pénz: &r &e [number]" - commands-title: "&7 parancs:" - command: " &7 - &e [command]" + item-title: "elem:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Tapasztalat: [number]" + money: "Pénz: [number]" + commands-title: "parancs:" + command: " - [command]" library: - author: "&7 [author]" - version: "&7 Kihívásokkal készült és e [version]" - lang: "&7 Nyelv: &e [lang]" - gamemode: "&7 Elsődleges &e [gamemode]" + author: "[author]" + version: "Kihívásokkal készült és e [version]" + lang: "Nyelv: [lang]" + gamemode: "Elsődleges [gamemode]" conversations: - prefix: "&l &6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: igaz, be, igen, megerősítés, y, érvényes, helyes deny-string: hamis, ki, nem, tagad, n, érvénytelen, helytelen cancel-string: megszünteti exit-string: törlés, kilépés, kilépés - cancelled: "&c A beszélgetés megszakítva!" - input-number: "&e Kérjük, adjon meg egy számot a chatben." - input-seconds: "&e Kérjük, adjon meg egy másodpercet a csevegésben." - numeric-only: "&c A megadott [value] nem szám!" - not-valid-value: "&c A megadott szám [value] nem érvényes. Nagyobbnak kell lennie, + cancelled: "A beszélgetés megszakítva!" + input-number: "Kérjük, adjon meg egy számot a chatben." + input-seconds: "Kérjük, adjon meg egy másodpercet a csevegésben." + numeric-only: "A megadott [value] nem szám!" + not-valid-value: "A megadott szám [value] nem érvényes. Nagyobbnak kell lennie, mint [min] és kisebbnek, mint [max]!" - user-data-removed: "&a A [gamemode] összes felhasználói adata törlődik az adatbázisból." - confirm-user-data-deletion: "&e Kérjük, erősítse meg, hogy törölni szeretné a + user-data-removed: "A [gamemode] összes felhasználói adata törlődik az adatbázisból." + confirm-user-data-deletion: "Kérjük, erősítse meg, hogy törölni szeretné a [gamemode] felhasználói adatbázisát." - challenge-data-removed: "&a [gamemode] adatai törlődnek az adatbázisból." - confirm-challenge-data-deletion: "&e Kérjük, erősítse meg, hogy törölni szeretné + challenge-data-removed: "[gamemode] adatai törlődnek az adatbázisból." + confirm-challenge-data-deletion: "Kérjük, erősítse meg, hogy törölni szeretné a [gamemode] kihívások adatbázisát." - all-data-removed: "&a A [gamemode] összes kiegészítő adata törlődik az adatbázisból." - confirm-all-data-deletion: "&e Kérjük, erősítse meg, hogy törölni szeretné a + all-data-removed: "A [gamemode] összes kiegészítő adata törlődik az adatbázisból." + confirm-all-data-deletion: "Kérjük, erősítse meg, hogy törölni szeretné a [gamemode] addon adatait." - write-name: "&e Kérjük, írjon nevet a chatbe." + write-name: "Kérjük, írjon nevet a chatbe." new-object-created: "&Új objektum jön létre a [gamemode] számára." - object-already-exists: "&c Az objektum &7 [id] &c már létezik. Válasszon másik + object-already-exists: "Az objektum [id] már létezik. Válasszon másik nevet." - invalid-challenge: "&c Challenge [gamemode] érvénytelen adatokat tartalmaz. Nem + invalid-challenge: "Challenge [gamemode] érvénytelen adatokat tartalmaz. Nem telepíthető!" - name-changed: "&a siker, a név frissült." - write-description: "&e Kérjük, írjon be egy új leírást a chat -be, és a befejezéshez + name-changed: "siker, a név frissült." + write-description: "Kérjük, írjon be egy új leírást a chat -be, és a befejezéshez 'kilép' egy sorban." - description-changed: "&a siker, a leírás frissült." - write-permissions: "&e Kérjük, adja meg a szükséges jogosultságokat, egyet soronként + description-changed: "siker, a leírás frissült." + write-permissions: "Kérjük, adja meg a szükséges jogosultságokat, egyet soronként a csevegésben, és 'kilép' egy soron a befejezéshez." - permissions-changed: "&a siker, a kihívási jogosultságok frissültek." - write-reward-text: "&e Kérjük, írjon be egy új jutalomszöveget a csevegésbe, + permissions-changed: "siker, a kihívási jogosultságok frissültek." + write-reward-text: "Kérjük, írjon be egy új jutalomszöveget a csevegésbe, és a befejezéshez 'kilép' egy sorban." - reward-text-changed: "&a siker, a jutalom szövege frissült." - write-repeat-reward-text: "&e Kérjük, írjon be egy új ismétlődő jutalomszöveget + reward-text-changed: "siker, a jutalom szövege frissült." + write-repeat-reward-text: "Kérjük, írjon be egy új ismétlődő jutalomszöveget a csevegésbe, és a befejezéshez 'kilép' egy sorban." - repeat-reward-text-changed: "&a siker, az ismételt jutalom szövege frissült." - write-reward-commands: "&e Kérjük, írjon be egy új jutalmazási parancsot a csevegés + repeat-reward-text-changed: "siker, az ismételt jutalom szövege frissült." + write-reward-commands: "Kérjük, írjon be egy új jutalmazási parancsot a csevegés minden sorába, és a befejezéshez 'kilép' egy soron." - reward-commands-changed: "&a siker, a jutalmazási parancsok frissültek." - write-repeat-reward-commands: "&e Kérjük, írjon be egy új ismétlési jutalmazási + reward-commands-changed: "siker, a jutalmazási parancsok frissültek." + write-repeat-reward-commands: "Kérjük, írjon be egy új ismétlési jutalmazási parancsot a csevegés minden sorába, és a befejezéshez 'kilép' egy soron." - repeat-reward-commands-changed: "&a siker, az ismétlődő jutalmazási parancsok + repeat-reward-commands-changed: "siker, az ismétlődő jutalmazási parancsok frissültek." - challenge-removed: "&a [gamemode] a [gamemode] számára eltávolításra kerül az + challenge-removed: "[gamemode] a [gamemode] számára eltávolításra kerül az adatbázisból." - confirm-challenge-deletion: "&e Kérjük, erősítse meg, hogy el szeretné távolítani + confirm-challenge-deletion: "Kérjük, erősítse meg, hogy el szeretné távolítani a [gamemode] [challenge] az adatbázisból." - level-removed: "&A [gamemode] szint [level] eltávolításra kerül az adatbázisból." - confirm-level-deletion: "&e Kérjük, erősítse meg, hogy el szeretné távolítani + level-removed: "[gamemode] szint [level] eltávolításra kerül az adatbázisból." + confirm-level-deletion: "Kérjük, erősítse meg, hogy el szeretné távolítani a [gamemode] [level] szintjét az adatbázisból." - start-downloading: "&a A kihívások könyvtárának letöltése és importálása." - written-text: "&beviteli szöveg:" - confirm-data-replacement: "&e Kérjük, erősítse meg, hogy a jelenlegi kihívásokat + start-downloading: "A kihívások könyvtárának letöltése és importálása." + written-text: "eviteli szöveg:" + confirm-data-replacement: "Kérjük, erősítse meg, hogy a jelenlegi kihívásokat újakra kívánja cserélni." - new-challenges-imported: "&a siker, új kihívásokat importált a [gamemode] számára." - exported-file-name: "&e Kérjük, adja meg az exportált adatbázis fájl fájlnevét. + new-challenges-imported: "siker, új kihívásokat importált a [gamemode] számára." + exported-file-name: "Kérjük, adja meg az exportált adatbázis fájl fájlnevét. (a kilépéshez írja be: „Mégse”)" - database-export-completed: "&a siker, a [world] adatbázis -exportálása befejeződött. + database-export-completed: "siker, a [world] adatbázis -exportálása befejeződött. Fájl [file] létrehozva." - file-name-exist: "&c Létezik „[id]” nevű fájl. Nem írható felül." - write-search: "&e Kérjük, írjon be egy keresési értéket. (a kilépéshez írja be: + file-name-exist: "Létezik „[id]” nevű fájl. Nem írható felül." + write-search: "Kérjük, írjon be egy keresési értéket. (a kilépéshez írja be: „Mégse”)" - search-updated: "&a keresési érték frissítve." + search-updated: "keresési érték frissítve." titles: challenge-title: Sikeresen teljesítve challenge-subtitle: "[friendlyName]" level-title: Sikeresen teljesítve level-subtitle: "[friendlyName]" messages: - completed: "&2 Befejezte a [player] kihívását [name] a [player] számára!" - already-completed: "&2 Ez a kihívás már befejeződött!" - reset: "&2 Visszaállítja a [player] kihívását [name]!" - reset-all: "&2 Minden [player] kihívás visszaállt!" - not-completed: "&2 Ez a kihívás még nem fejeződött be!" - migrate-start: "&2 Kezdje el a kihívások bővítési adatainak áttelepítését." - migrate-end: "&2 Challenges addon adatok új formátumba frissítve." - migrate-not: "&2 Minden adat érvényes." - start-downloading: "&5 A kihívások könyvtárának letöltése és importálása." - you-completed-challenge: "&2 Teljesítette a [value] &r &2 kihívást!" - you-repeated-challenge: "&2 Megismételte a [value] &r &2 kihívást!" - you-repeated-challenge-multiple: "&2 Ismételted a [value] &r &2 kihívást [count]!" - you-completed-level: "&2 Elérted az [value] &r &2 szintet!" - name-has-completed-challenge: "&5 [name] teljesítette a [value] &r &5 kihívást!" - name-has-completed-level: "&5 [name] befejezte az [value] &r &5 szintet!" + completed: "Befejezte a [player] kihívását [name] a [player] számára!" + already-completed: "Ez a kihívás már befejeződött!" + reset: "Visszaállítja a [player] kihívását [name]!" + reset-all: "Minden [player] kihívás visszaállt!" + not-completed: "Ez a kihívás még nem fejeződött be!" + migrate-start: "Kezdje el a kihívások bővítési adatainak áttelepítését." + migrate-end: "Challenges addon adatok új formátumba frissítve." + migrate-not: "Minden adat érvényes." + start-downloading: "A kihívások könyvtárának letöltése és importálása." + you-completed-challenge: "Teljesítette a [value] kihívást!" + you-repeated-challenge: "Megismételte a [value] kihívást!" + you-repeated-challenge-multiple: "Ismételted a [value] kihívást [count]!" + you-completed-level: "Elérted az [value] szintet!" + name-has-completed-challenge: "[name] teljesítette a [value] kihívást!" + name-has-completed-level: "[name] befejezte az [value] szintet!" load-skipping: '"[value]" már létezik - kihagyás' load-overwriting: A "[value]" felülírása load-add: 'Új objektum hozzáadása: [value]' errors: - no-name: "&c Hiányzik a kihívás neve" - unknown-challenge: "&c Ismeretlen kihívás" + no-name: "Hiányzik a kihívás neve" + unknown-challenge: "Ismeretlen kihívás" not-valid-integer: |- - &c A megadott "[value]" egész szám nem érvényes! + A megadott "[value]" egész szám nem érvényes! Az értéknek [min] és [max] között kell lennie. - not-deployed: "&c Challenge nincs telepítve!" - not-on-island: "&c Ehhez a szigeten kell lennie!" - challenge-level-not-available: "&c Még nem oldotta fel a kihívás teljesítéséhez + not-deployed: "Challenge nincs telepítve!" + not-on-island: "Ehhez a szigeten kell lennie!" + challenge-level-not-available: "Még nem oldotta fel a kihívás teljesítéséhez szükséges szintet." - not-repeatable: "&c Ez a kihívás nem ismételhető!" - wrong-environment: "&c Rossz környezetben van!" - not-enough-items: "&c Nincs elég [item] a kihívás teljesítéséhez!" - not-close-enough: "&c Az összes szükséges tétel [number] mondatán belül kell állnia." - you-still-need: "&c Továbbra is szüksége van [amount] x [item]" - missing-addon: "&c Nem lehet teljesíteni a kihívást: Hiányzik a szükséges kiegészítő + not-repeatable: "Ez a kihívás nem ismételhető!" + wrong-environment: "Rossz környezetben van!" + not-enough-items: "Nincs elég [item] a kihívás teljesítéséhez!" + not-close-enough: "Az összes szükséges tétel [number] mondatán belül kell állnia." + you-still-need: "Továbbra is szüksége van [amount] x [item]" + missing-addon: "Nem lehet teljesíteni a kihívást: Hiányzik a szükséges kiegészítő vagy bővítmény." - incorrect: "&c Nem lehet teljesíteni a kihívást: A követelmények helytelenek." - not-enough-money: "&c A kihívás teljesítéséhez fiókjában [value] szükséges." - not-enough-experience: "&c A kihívás teljesítéséhez [value] EXP szükséges." - island-level: "&c A szigetnek [number] szintnek vagy magasabbnak kell lennie a + incorrect: "Nem lehet teljesíteni a kihívást: A követelmények helytelenek." + not-enough-money: "A kihívás teljesítéséhez fiókjában [value] szükséges." + not-enough-experience: "A kihívás teljesítéséhez [value] EXP szükséges." + island-level: "A szigetnek [number] szintnek vagy magasabbnak kell lennie a kihívás teljesítéséhez!" - no-load: "&c Hiba: Nem sikerült betölteni a fájlt. [message]" - load-error: "&c Hiba: Nem lehet betölteni az [value] értéket." - no-rank: "&c Nincs elég magas rangod ahhoz." - cannot-remove-items: "&c Néhány elem nem távolítható el a készletből!" - exist-challenges-or-levels: "&c A világban már léteznek kihívások. Nem lehet + no-load: "Hiba: Nem sikerült betölteni a fájlt. [message]" + load-error: "Hiba: Nem lehet betölteni az [value] értéket." + no-rank: "Nincs elég magas rangod ahhoz." + cannot-remove-items: "Néhány elem nem távolítható el a készletből!" + exist-challenges-or-levels: "A világban már léteznek kihívások. Nem lehet folytatni!" - no-challenges: "&c A kihívások még nem valósultak meg ezen a világon!" - no-challenges-admin: "&c A kihívások még nem valósultak meg ezen a világon! Használja - a &5 /[command] &c billentyűket a hozzáadásukhoz!" - missing-arguments: "&c A parancsból hiányoznak az argumentumok." - no-multiple-permission: "&c Nincs engedélye arra, hogy ezt a kihívást egyszerre + no-challenges: "A kihívások még nem valósultak meg ezen a világon!" + no-challenges-admin: "A kihívások még nem valósultak meg ezen a világon! Használja + a /[command] billentyűket a hozzáadásukhoz!" + missing-arguments: "A parancsból hiányoznak az argumentumok." + no-multiple-permission: "Nincs engedélye arra, hogy ezt a kihívást egyszerre többször teljesítse." - invalid-level: "&c A [level] szint érvénytelen adatokat tartalmaz. Nem töltődik + invalid-level: "A [level] szint érvénytelen adatokat tartalmaz. Nem töltődik be az adatbázisból!" - invalid-challenge: "&c Challenge [gamemode] érvénytelen adatokat tartalmaz. Nem + invalid-challenge: "Challenge [gamemode] érvénytelen adatokat tartalmaz. Nem töltődik be az adatbázisból!" - no-library-entries: "&c Nem találhatók könyvtári bejegyzések. Nincs mit mutatni." - not-hooked: "&c Challenges Az Addon nem talált GameMode módot." - timeout: "&c Ehhez a kihíváshoz várni kell [timeout] a befejezések között. Meg + no-library-entries: "Nem találhatók könyvtári bejegyzések. Nincs mit mutatni." + not-hooked: "Challenges Az Addon nem talált GameMode módot." + timeout: "Ehhez a kihíváshoz várni kell [timeout] a befejezések között. Meg kell várnia [wait-time], amíg újra befejezi." protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5 &o Váltás ki teheti - &5 &o teljes kihívások + Váltás ki teheti + teljes kihívások name: Kihívja a védelmet CHALLENGES_WORLD_PROTECTION: description: |- - &5 &o Engedélyezés/letiltás - &5 &o követelmény a játékosoknak - &5 &o legyen a szigetükön - &5 &o teljesít egy kihívást. + Engedélyezés/letiltás + követelmény a játékosoknak + legyen a szigetükön + teljesít egy kihívást. name: Kihívások a sziget korlátozására hint: Nincs kihívás a szigeten kívül version: 12 diff --git a/src/main/resources/locales/ja.yml b/src/main/resources/locales/ja.yml index 1ff9ebc5..dbbb95f1 100644 --- a/src/main/resources/locales/ja.yml +++ b/src/main/resources/locales/ja.yml @@ -68,13 +68,13 @@ challenges: free-challenges: name: 無料の課題 description: |- - &7 無料の課題 - &7 のリストを表示します + 無料の課題 + のリストを表示します return: name: 戻る description: |- - &7 前のメニューに戻ります - &7 またはGUIを終了します + 前のメニューに戻ります + またはGUIを終了します previous: name: 前のページ description: ページに切り替えます[number] @@ -190,16 +190,16 @@ challenges: description: |- 報酬アイテムかどうかを切り替えます GUIに表示されるかどうか。 - hide: '&2 隠れる' - show: '&c 見せる' + hide: '隠れる' + show: '見せる' deployed: name: 展開 description: |- 課題があるかどうかを切り替えます 展開され、完了することができます ユーザーによって。 - enabled: '&2 有効になっています' - disabled: '&c 無効' + enabled: '有効になっています' + disabled: '無効' name: name: 名前 description: |- @@ -212,8 +212,8 @@ challenges: チャレンジがすべきかどうかを切り替えます その後プレイヤーから隠されてください 完成しました。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' description: name: 説明 description: |- @@ -225,8 +225,8 @@ challenges: description: |- 課題を制限することができます 特定の次元に。 - enabled: '&2' - disabled: '&c' + enabled: '' + disabled: '' order: name: 注文 description: |- @@ -253,7 +253,7 @@ challenges: この課題の許可 完成します。 title: 許可: - permission: ' &8 - [permission]' + permission: ' - [permission]' none: 許可は設定されていません。 remove_entities: name: エンティティを削除します @@ -261,8 +261,8 @@ challenges: 必要なエンティティがそうするかどうかを切り替えます その後世界から除外されます チャレンジを完了します。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' required_entities: name: 必要なエンティティ description: |- @@ -270,7 +270,7 @@ challenges: この課題のエンティティはそうです 完了しました。 title: エンティティ: - list: ' &8 - [number] x [entity]' + list: ' - [number] x [entity]' none: エンティティは追加されていません。 remove_blocks: name: ブロックを削除します @@ -278,8 +278,8 @@ challenges: 必要なブロックがそうなるかどうかを切り替えます その後世界から除外されます チャレンジを完了します。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' required_blocks: name: 必要なブロック description: |- @@ -287,7 +287,7 @@ challenges: この課題があるためにブロックされます 完了しました。 title: ブロック: - list: ' &8 - [number] x [block]' + list: ' - [number] x [block]' none: ブロックは追加されていません。 required_statistics: name: 必要な統計 @@ -295,8 +295,8 @@ challenges: 必要なものを変更できます この課題の統計 完了しました。 - title: '&7 統計:' - list: ' &8 - [name]' + title: '統計:' + list: ' - [name]' none: 統計は追加されていません。 required_advancements: name: 必要な進歩 @@ -305,7 +305,7 @@ challenges: この挑戦の進歩 完成します。 title: 進歩: - list: ' &8 - [name]' + list: ' - [name]' none: 進歩は追加されていません。 search_radius: name: 半径を検索します @@ -320,15 +320,15 @@ challenges: 必要なアイテムがそうなるかどうかを切り替えます その後、在庫から削除されます チャレンジを完了します。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' required_items: name: 必要なアイテム description: |- 必要なものを変更できます この課題が完了するための項目。 title: アイテム: - list: ' &8 - [number] x [item]' + list: ' - [number] x [item]' none: アイテムは追加されていません。 add_ignored_meta: name: メタデータを無視します @@ -337,7 +337,7 @@ challenges: メタデータを無視する必要があります それらに割り当てられます。 title: アイテム: - list: ' &8 - [number] x [item]' + list: ' - [number] x [item]' none: アイテムは追加されていません。 remove_ignored_meta: name: 削除メタデータを無視します @@ -351,8 +351,8 @@ challenges: 経験は削除されます 完了した後のプレイヤーから 挑戦。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' required_experience: name: 必要な経験 description: |- @@ -373,7 +373,7 @@ challenges: この挑戦のためのグループをブロックします 完成します。 title: ブロックグループ: - list: ' &8 - [number] x [tag]' + list: ' - [number] x [tag]' none: ブロックグループは追加されていません。 required_entitytags: name: 必要なエンティティグループ @@ -382,7 +382,7 @@ challenges: この課題のためのエンティティグループ 完成します。 title: エンティティグループ: - list: ' &8 - [number] x [tag]' + list: ' - [number] x [tag]' none: エンティティグループは追加されていません。 remove_money: name: お金を削除します @@ -391,8 +391,8 @@ challenges: お金は削除されます プレイヤーのアカウントの後 チャレンジを完了します。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' required_money: name: 必要なお金 description: |- @@ -432,8 +432,8 @@ challenges: 削除できます 選択された統計 リストから。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' advancement: name: '[name]' description: '[description]' @@ -448,8 +448,8 @@ challenges: 削除できます 選択された進歩 リストから。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' statistic_blocks: name: ターゲットブロック description: |- @@ -485,7 +485,7 @@ challenges: name: 報酬アイテム description: 報酬アイテムを変更できます。 title: アイテム: - list: ' &8 - [number] x [item]' + list: ' - [number] x [item]' none: アイテムは追加されていません。 repeat_reward_items: name: 報酬アイテムを繰り返します @@ -493,7 +493,7 @@ challenges: 繰り返しを変更できます この課題のためにアイテムに報いる。 title: アイテム: - list: ' &8 - [number] x [item]' + list: ' - [number] x [item]' none: アイテムは追加されていません。 reward_experience: name: 報酬体験 @@ -546,8 +546,8 @@ challenges: repeatable: name: 繰り返し可能 description: チャレンジが再現可能かどうかを切り替えます。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' repeat_count: name: 繰り返しカウント description: |- @@ -589,29 +589,29 @@ challenges: 課題がすべきかどうかを切り替えます &ユーザーが去るときにリセットします 彼らの島または新しい島を作成します。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' broadcast: name: 放送 description: |- 初めての完了を放送します 皆への挑戦やレベルの。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' remove_completed: name: 完成した非表示 description: |- 完了した課題を隠します メニューから。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' glow_completed: name: グローが完成しました description: |- エンチャントグローを適用します 完了した課題に。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' store_history: name: 履歴を保存します description: |- @@ -619,8 +619,8 @@ challenges: チャレンジが完了しました。 現在、でのみ表示可能です データベース。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' data_per_island: name: 島ごとの店 description: |- @@ -628,23 +628,23 @@ challenges: 島ごとに。 進捗が共有されます すべてのチームメンバーと。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' show_title: name: ショータイトル description: |- チャレンジ時にタイトルを表示します またはレベルが完了します。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' gamemode_gui: name: GameMode選択GUI description: |- 単一のGUIにアクセスできるようにします /Challengesコマンドを介して。 (サーバーの再起動が必要です。) - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' locked_level_icon: name: デフォルトのロックレベルアイコン description: |- @@ -674,13 +674,13 @@ challenges: ゲームモードの選択または課題 現在の世界のために。 (サーバーの再起動が必要です。) - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' visibility_mode: name: 可視性モード description: 非表示の課題の可視性モード。 - enabled: '&2' - disabled: '&c' + enabled: '' + disabled: '' visible: 目に見える課題を示します hidden: すべての課題を示します toggleable: 切り替えを許可します @@ -689,30 +689,30 @@ challenges: description: |- 展開されていない課題があるかどうかを示します レベル完了にカウントする必要があります。 - enabled: '&2 有効' - disabled: '&c 無効' + enabled: '有効' + disabled: '無効' download: name: ライブラリをダウンロードします description: |- 使用可能なものを手動で更新します ライブラリに挑戦します。 - enabled: '&2 キャッシュがクリアされています' - disabled: '&c キャッシュがクリアされていません' + enabled: 'キャッシュがクリアされています' + disabled: 'キャッシュがクリアされていません' player: name: '[name]' description: 島の所有者:[owner] members: 島のメンバー: - member: '&8 - [name]' + member: '- [name]' no-island: |- - &c このプレーヤーは島が - &c ありません。 + このプレーヤーは島が + ありません。 player_list: name: ユーザーリストを選択します description: |- ユーザーリストを選択します 表示する必要があります。 - enabled: '&2' - disabled: '&c' + enabled: '' + disabled: '' online: オンラインプレーヤー with_island: 島のプレイヤー in_world: 世界のプレイヤー @@ -733,7 +733,7 @@ challenges: 選択したブロック リストから。 title: 選択した資料: - material: '&8 - [material]' + material: '- [material]' remove_block_group: name: ブロックグループを削除します description: |- @@ -741,15 +741,15 @@ challenges: 選択されたブロックグループ リストから。 title: 選択されたブロックグループ: - material: '&8 - [material]' + material: '- [material]' material: - name: '&f&l [material]' + name: '[material]' description: マテリアルID:[id] - selected: '&2 選択' + selected: '選択' block-group: - name: '&f&l [id]' + name: '[id]' description: '' - selected: '&2 選択' + selected: '選択' add_entity: name: 追加エンティティ description: |- @@ -772,7 +772,7 @@ challenges: 選択されたエンティティ リストから。 title: 選択されたエンティティ: - entity: '&8 - [entity]' + entity: '- [entity]' remove_entity_group: name: エンティティグループを削除します description: |- @@ -780,15 +780,15 @@ challenges: 選択されたエンティティグループ リストから。 title: 選択されたエンティティグループ: - entity: '&8 - [tag]' + entity: '- [tag]' entity: - name: '&f&l [entity]' + name: '[entity]' description: エンティティID:[id] - selected: '&2 選択' + selected: '選択' entity-group: - name: '&f&l [id]' + name: '[id]' description: '' - selected: '&2 選択' + selected: '選択' inventory_type: name: 在庫タイプ description: |- @@ -826,33 +826,33 @@ challenges: 選択した要素を返します 以前のGUIを再開します。 title: 選択: - element: '&8 - [element]' + element: '- [element]' advancement_element: - name: '&f&l [name]' + name: '[name]' description: '[description]' - selected: '&2 選択' + selected: '選択' statistic_element: - name: '&f&l [statistic]' + name: '[statistic]' amount: 目標値:[number] remove: name: 統計を減らす:[value] value: - enabled: '&c 有効' - disabled: '&2 無効' + enabled: '有効' + disabled: '無効' block: ターゲットブロック:[block] item: ターゲットアイテム:[item] entity: ターゲットエンティティ:[entity] description: '[description]' - selected: '&2 選択' + selected: '選択' environment_element: - name: '&f&l [environment]' + name: '[environment]' description: '[description]' search: name: 検索 description: |- - &7 テキスト入力値を使用 - &7 して要素を検索できます。 - search: '&b 値:[value]' + テキスト入力値を使用 + して要素を検索できます。 + search: '値:[value]' tips: click-to-select: クリックして選択します。 click-to-choose: クリックして選択します。 @@ -907,16 +907,16 @@ challenges: [requirements] [rewards] status: - completed: '&2 完了しました' - completed-times: '&2 完了[number]時間' - completed-times-of: '&2 [number] 回のうち [max] 回完了しました' + completed: '完了しました' + completed-times: '完了[number]時間' + completed-times-of: '[number] 回のうち [max] 回完了しました' completed-times-reached: すべての[max]を完了しました cooldown: lore: |- [timeout] [wait-time] timeout: クールダウン:[time] - wait-time: '&c 後に利用可能:[time]' + wait-time: '後に利用可能:[time]' in-days: '[number] 日' in-hours: '[number] 時' in-minutes: '[number] 分 ' @@ -928,10 +928,10 @@ challenges: [permissions] environment-single: '[environment]に制限されています' environment-title: 制限: - environment-list: ' &7 - &e [environment]' + environment-list: ' - [environment]' permission-single: &c[permission]の許可が必要です。 permissions-title: &c許可が必要です: - permissions-list: ' &c - [permission]' + permissions-list: ' - [permission]' island: lore: |- [blocks] @@ -940,11 +940,11 @@ challenges: [warning-block] [warning-entity] blocks-title: 必須ブロック: - block-value: ' &7 - &e [material]' - blocks-value: ' &7 - &e [number] x [material]' + block-value: ' - [material]' + blocks-value: ' - [number] x [material]' entities-title: 必要なエンティティ: - entity-value: ' &7 - &e [entity]' - entities-value: ' &7 - &e [number] x [entity]' + entity-value: ' - [entity]' + entities-value: ' - [number] x [entity]' search-radius: '[number]メートル以下' warning-block: ブロックが削除されます warning-entity: エンティティは削除されます @@ -953,8 +953,8 @@ challenges: [items] [warning] item-title: 必要なアイテム: - item-value: ' &7 - &e [item]' - items-value: ' &7 - &e [number] x [item]' + item-value: ' - [item]' + items-value: ' - [number] x [item]' warning: アイテムは削除されます other: lore: |- @@ -972,9 +972,9 @@ challenges: lore: |- [statistic] [warning] - multiple-target: '&7&l [statistic]: &r&e [number] x [target]' - single-target: '&7&l [statistic]: &r&e [target]' - statistic: '&7&l [statistic] &r&e [number]' + multiple-target: '[statistic]: [number] x [target]' + single-target: '[statistic]: [target]' + statistic: '[statistic] [number]' warning: 統計データが削減されます rewards: lore: |- @@ -985,12 +985,12 @@ challenges: [money] [commands] item-title: アイテム: - item-value: ' &7 - &e [item]' - items-value: ' &7 - &e [number] x [item]' + item-value: ' - [item]' + items-value: ' - [number] x [item]' experience: 経験:[number] money: お金:[number] commands-title: コマンド: - command: ' &7 - &e [command]' + command: ' - [command]' level: lore: |- [text] @@ -999,15 +999,15 @@ challenges: [rewards] status: completed: 完了しました - completed-challenges-of: '&2 [max] 個のチャレンジのうち [number] 個を完了しました。' - locked: '&c ロックされています' + completed-challenges-of: '[max] 個のチャレンジのうち [number] 個を完了しました。' + locked: 'ロックされています' missing-challenges: |- [number]_より多くの課題が必要です このレベルのロックを解除するために完了しました。 waiver: |- - &7 [number]チャレンジができます - &7 次のレベルのロックを解除する - &7 ためにスキップしました。 + [number]チャレンジができます + 次のレベルのロックを解除する + ためにスキップしました。 rewards: lore: |- 報酬: @@ -1017,86 +1017,86 @@ challenges: [money] [commands] item-title: アイテム: - item-value: ' &7 - &e [item]' - items-value: ' &7 - &e [number] x [item]' + item-value: ' - [item]' + items-value: ' - [number] x [item]' experience: 経験:[number] money: お金:[number] commands-title: コマンド: - command: ' &7 - &e [command]' + command: ' - [command]' library: - author: '&e [author]' + author: '[author]' version: 課題で作られた[version] lang: 言語:[lang] gamemode: '[gamemode]のプライマリ' conversations: - prefix: '&l&6 [BentoBox]: &r' + prefix: '[BentoBox]: ' confirm-string: 確かに、はい、確認、y、有効、正しい deny-string: false、off、no、deny、n、無効、間違っています cancel-string: 終了 exit-string: キャンセル、出口、終了 - cancelled: '&c 会話がキャンセルされました!' + cancelled: '会話がキャンセルされました!' input-number: チャットに番号を入力してください。 input-seconds: チャットに数秒を入力してください。 - numeric-only: '&c 与えられた[value]は数字ではありません!' - not-valid-value: '&c 指定された番号[value]は無効です。 [min]よりも大きく、[max]未満でなければなりません!' - user-data-removed: '&a [gamemode]のすべてのユーザーデータは、データベースからクリアされています。' + numeric-only: '与えられた[value]は数字ではありません!' + not-valid-value: '指定された番号[value]は無効です。 [min]よりも大きく、[max]未満でなければなりません!' + user-data-removed: '[gamemode]のすべてのユーザーデータは、データベースからクリアされています。' confirm-user-data-deletion: '[gamemode]のユーザーデータベースをクリアすることを確認してください。' - challenge-data-removed: '&a [gamemode]のすべてのチャレンジデータは、データベースからクリアされています。' + challenge-data-removed: '[gamemode]のすべてのチャレンジデータは、データベースからクリアされています。' confirm-challenge-data-deletion: '[gamemode]の課題データベースをクリアしたいことを確認してください。' - all-data-removed: '&a [gamemode]のすべてのアドオンデータは、データベースからクリアされています。' + all-data-removed: '[gamemode]のすべてのアドオンデータは、データベースからクリアされています。' confirm-all-data-deletion: '[gamemode]のアドオンデータをクリアすることを確認してください。' write-name: チャットに名前を入力してください。 - new-object-created: '&a [gamemode]の新しいオブジェクトが作成されました。' - object-already-exists: '&c オブジェクト[id]はすでに存在しています。別の名前を選択してください。' - invalid-challenge: '&c 課題[challenge]展開できません!' - name-changed: '&a 成功:名前が更新されました。' + new-object-created: '[gamemode]の新しいオブジェクトが作成されました。' + object-already-exists: 'オブジェクト[id]はすでに存在しています。別の名前を選択してください。' + invalid-challenge: '課題[challenge]展開できません!' + name-changed: '成功:名前が更新されました。' write-description: チャットに新しい説明を入力してください。新しいラインで「終了」と入力して終了します。 - description-changed: '&a 成功:説明が更新されました。' + description-changed: '成功:説明が更新されました。' write-permissions: チャットに必要な権限を1行に1行に入力してください。新しいラインで「終了」と入力して終了します。 - permissions-changed: '&a 成功:チャレンジ許可が更新されました。' + permissions-changed: '成功:チャレンジ許可が更新されました。' write-reward-text: チャットに新しい報酬テキストを入力してください。新しいラインで「終了」と入力して終了します。 - reward-text-changed: '&a 成功:報酬テキストが更新されました。' + reward-text-changed: '成功:報酬テキストが更新されました。' write-repeat-reward-text: チャットに新しい繰り返し報酬テキストを入力してください。新しいラインで「終了」と入力して終了します。 - repeat-reward-text-changed: '&a 成功:繰り返し報酬テキストが更新されました。' + repeat-reward-text-changed: '成功:繰り返し報酬テキストが更新されました。' write-reward-commands: チャット内の各行に新しい報酬コマンドを入力してください。新しいラインで「終了」と入力して終了します。 - reward-commands-changed: '&a 成功:報酬コマンドが更新されました。' + reward-commands-changed: '成功:報酬コマンドが更新されました。' write-repeat-reward-commands: チャット内の各行に新しい繰り返し報酬コマンドを入力してください。新しいラインで「終了」と入力して終了します。 - repeat-reward-commands-changed: '&a 成功:繰り返し報酬コマンドが更新されました。' - challenge-removed: '&a [gamemode]の課題[challenge]はデータベースから削除されました。' + repeat-reward-commands-changed: '成功:繰り返し報酬コマンドが更新されました。' + challenge-removed: '[gamemode]の課題[challenge]はデータベースから削除されました。' confirm-challenge-deletion: データベースから[gamemode]の[challenge]を削除することを確認してください。 - level-removed: '&a [gamemode]のレベル[level]はデータベースから削除されました。' + level-removed: '[gamemode]のレベル[level]はデータベースから削除されました。' confirm-level-deletion: データベースから[gamemode]の[level]を削除することを確認してください。 - start-downloading: '&a Challenges Libraryのダウンロードとインポートを開始します。' - written-text: '&a 入力テキスト:' + start-downloading: 'Challenges Libraryのダウンロードとインポートを開始します。' + written-text: '入力テキスト:' confirm-data-replacement: 現在の課題を新しい課題に置き換えたいことを確認してください。 - new-challenges-imported: '&a 成功:[gamemode]の新しい課題がインポートされています。' + new-challenges-imported: '成功:[gamemode]の新しい課題がインポートされています。' exported-file-name: エクスポートされたデータベースファイルのファイル名を入力してください。 (「キャンセル」と入力して終了します) - database-export-completed: '&a 成功:[world]のデータベースエクスポートは完了しました。ファイル[file]生成。' - file-name-exist: '&c「[id]」という名前のファイルがすでに存在しています。上書きできません。' + database-export-completed: '成功:[world]のデータベースエクスポートは完了しました。ファイル[file]生成。' + file-name-exist: '「[id]」という名前のファイルがすでに存在しています。上書きできません。' write-search: 検索値を入力してください。 (「キャンセル」と入力して終了します) - search-updated: '&a 検索値が更新されました。' + search-updated: '検索値が更新されました。' enter-formula: |- - &a Papiプレースホルダーとシンボルを使用する式を入力します=、<>、<+、> =、==、!=、および、またはのみ。 - &a 例:&7 %my_lifetime_count%> = 1000および%Island_Level%> = 100 + Papiプレースホルダーとシンボルを使用する式を入力します=、<>、<+、> =、==、!=、および、またはのみ。 + 例:%my_lifetime_count%> = 1000および%Island_Level%> = 100 titles: challenge-title: 正常に完了しました challenge-subtitle: '[friendlyName]' level-title: 正常に完了しました level-subtitle: '[friendlyName]' messages: - completed: '&2 [player]のチャレンジ[name]_を完了しました!' - already-completed: '&2 この課題はすでに完了しています!' - reset: '&2 [player]のチャレンジ[name]をリセットしました!' - reset-all: '&2 [player]のすべての課題がリセットされました!' - not-completed: '&2 この課題はまだ完了していません!' - migrate-start: '&2 課題の移行の開始アドオンデータ。' - migrate-end: '&2 課題アドオンデータは新しい形式に更新されました。' - migrate-not: '&2 すべてのデータが有効です。' + completed: '[player]のチャレンジ[name]_を完了しました!' + already-completed: 'この課題はすでに完了しています!' + reset: '[player]のチャレンジ[name]をリセットしました!' + reset-all: '[player]のすべての課題がリセットされました!' + not-completed: 'この課題はまだ完了していません!' + migrate-start: '課題の移行の開始アドオンデータ。' + migrate-end: '課題アドオンデータは新しい形式に更新されました。' + migrate-not: 'すべてのデータが有効です。' start-downloading: Challenges Libraryのダウンロードとインポートを開始します。 - you-completed-challenge: &2 [value]&r&2チャレンジを完了しました! - you-repeated-challenge: &2 [value]&r&2チャレンジを繰り返しました! - you-repeated-challenge-multiple: &2 [value]&r&2チャレンジ [count]回繰り返しました! - you-completed-level: &2 [value]&r&2レベルを完了しました! + you-completed-challenge: &2 [value]チャレンジを完了しました! + you-repeated-challenge: &2 [value]チャレンジを繰り返しました! + you-repeated-challenge-multiple: &2 [value]チャレンジ [count]回繰り返しました! + you-completed-level: &2 [value]レベルを完了しました! name-has-completed-challenge: &5 [name]は[value]&r&5チャレンジ を完了しました! name-has-completed-level: &5 [name]は[value]&r&5レベルを完了しました! load-skipping: 「[value]」は既に存在します-スキップします @@ -1128,17 +1128,17 @@ challenges: no-challenges-admin: &cチャレンジは現在の世界では実装されていません!それらを追加するには&5 / [command]&cを使用する必要があります。 missing-arguments: &cコマンドに引数がありません。 no-multiple-permission: &cチャレンジを一度に複数回完了する権限がありません。 - invalid-level: '&c レベル[level]は無効なデータを含み、データベースからロードされません!' - invalid-challenge: '&c 課題[challenge]はデータベースからロードされません!' - no-library-entries: '&c ライブラリエントリは見つかりませんでした。表示するものは何もありません。' - not-hooked: '&c 課題アドオンはゲームモードを見つけることができませんでした。' - timeout: '&c この課題には、完了の間に[timeout]の待ち時間が必要です。 [wait-time]をもう一度完了する前に待つ必要があります。' - requirement-not-met: '&c この課題には、[number]の[statistic]が必要です。 [value]のみがあります。' + invalid-level: 'レベル[level]は無効なデータを含み、データベースからロードされません!' + invalid-challenge: '課題[challenge]はデータベースからロードされません!' + no-library-entries: 'ライブラリエントリは見つかりませんでした。表示するものは何もありません。' + not-hooked: '課題アドオンはゲームモードを見つけることができませんでした。' + timeout: 'この課題には、完了の間に[timeout]の待ち時間が必要です。 [wait-time]をもう一度完了する前に待つ必要があります。' + requirement-not-met: 'この課題には、[number]の[statistic]が必要です。 [value]のみがあります。' requirement-not-met-entity: >- - &c このチャレンジでは、[entity] の [statistic] が [number] である必要があります。持っているのは [value] + このチャレンジでは、[entity] の [statistic] が [number] である必要があります。持っているのは [value] のみです。 requirement-not-met-material: >- - &c このチャレンジでは、[material] の [statistic] が [number] である必要があります。持っているのは + このチャレンジでは、[material] の [statistic] が [number] である必要があります。持っているのは [value] のみです。 protection: flags: diff --git a/src/main/resources/locales/lv.yml b/src/main/resources/locales/lv.yml index 43c8d691..2403164a 100644 --- a/src/main/resources/locales/lv.yml +++ b/src/main/resources/locales/lv.yml @@ -38,835 +38,835 @@ challenges: gui: titles: # The title for the Main GUI - player-gui: "&0&l Uzdevumu Izvēlne" + player-gui: "Uzdevumu Izvēlne" # The title for the Main GUI - gamemode-gui: "&0&l Izvēlies Spēles Režīmu" + gamemode-gui: "Izvēlies Spēles Režīmu" # The title for the Multiple Completion GUI - multiple-gui: "&0&l Cik daudz reižu?" + multiple-gui: "Cik daudz reižu?" # GUI titles below is visible just for Admins. - admin-gui: "&0&l Administratora Izvēlne" - edit-challenge: "&0&l Mainīt [challenge]" - edit-level: "&0&l Mainīt [level]" - settings: "&0&l Iestatījumi" - choose-challenge: "&0&l Izvēlies Uzdevumu" - choose-level: "&0&l Izvēlies Līmeni" - choose-player: "&0&l Izvēlies Spēlētāju" - library: "&0&l Bibliotēka" - manage-blocks: "&0&l Pārvaldīt Blokus" - manage-entities: "&0&l Pārvaldīt Radības" - type-selector: "&0&l Uzdevumu Tipu Izvēlne" - item-selector: "&0&l Lietu Izvēlne" - block-selector: "&0&l Bloku Izvēlne" - entity-selector: "&0&l Radību Izvēlne" - challenge-selector: "&0&l Uzdevumu Izvēlne" - statistic-selector: "&0&l Statistikas Izvēlne" - environment-selector: "&0&l Vides Izvēlne" + admin-gui: "Administratora Izvēlne" + edit-challenge: "Mainīt [challenge]" + edit-level: "Mainīt [level]" + settings: "Iestatījumi" + choose-challenge: "Izvēlies Uzdevumu" + choose-level: "Izvēlies Līmeni" + choose-player: "Izvēlies Spēlētāju" + library: "Bibliotēka" + manage-blocks: "Pārvaldīt Blokus" + manage-entities: "Pārvaldīt Radības" + type-selector: "Uzdevumu Tipu Izvēlne" + item-selector: "Lietu Izvēlne" + block-selector: "Bloku Izvēlne" + entity-selector: "Radību Izvēlne" + challenge-selector: "Uzdevumu Izvēlne" + statistic-selector: "Statistikas Izvēlne" + environment-selector: "Vides Izvēlne" buttons: # Button in the Challenges GUI that allows to select free challenges. free-challenges: - name: "&f&l Brīvie Uzdevumi" + name: "Brīvie Uzdevumi" description: |- - &7 Attainos visus brīvos - &7 uzdevumus + Attainos visus brīvos + uzdevumus # Button that is used to return to previous GUI or exit it completely. return: - name: "&f&l Atgriezties" + name: "Atgriezties" description: |- - &7 Atgriežas uz iepriekšējo - &7 izvēlni vai iziet no - &7 izvēlnes. + Atgriežas uz iepriekšējo + izvēlni vai iziet no + izvēlnes. # Button that is used in multi-page GUIs which allows to return to previous page. previous: - name: "&f&l Iepriekšējā Lapa" + name: "Iepriekšējā Lapa" description: |- - &7 Pārslēgties uz &e [number] &7 lapu + Pārslēgties uz [number] lapu # Button that is used in multi-page GUIs which allows to go to next page. next: - name: "&f&l Nākošā Lapa" + name: "Nākošā Lapa" description: |- - &7 Pārslēgties uz &e [number] &7 lapu + Pārslēgties uz [number] lapu # Button that allows to reduce number reduce: - name: "&f&l Samazināt" + name: "Samazināt" description: |- - &7 Samazināt par &e [number] + Samazināt par [number] # Button that allows to increase number increase: - name: "&f&l Palielināt" + name: "Palielināt" description: |- - &7 Palielināt par &e [number] + Palielināt par [number] # Button that displays and allows completing challenge accept: - name: "&f&l Pabeigt" + name: "Pabeigt" description: |- - &7 Pabeigt uzdevumu &e [number] - &7 reizi(-es) + Pabeigt uzdevumu [number] + reizi(-es) # Button that allows to quit the current gui. quit: - name: "&f&l Iziet" + name: "Iziet" description: |- - &7 Iziet no izvēlnes. + Iziet no izvēlnes. # All following buttons are mainly for Admin GUI. complete_user_challenges: - name: "&f&l Pabeigt Spēlētāja Uzdevumu(-s)" + name: "Pabeigt Spēlētāja Uzdevumu(-s)" description: |- - &7 Ļauj pabeigt uzdevumu(-s) - &7 spēlētāja vietā. + Ļauj pabeigt uzdevumu(-s) + spēlētāja vietā. reset_user_challenges: - name: "&f&l Atjaunot Spēlētāja Uzdevumu(-s)" + name: "Atjaunot Spēlētāja Uzdevumu(-s)" description: |- - &7 Ļauj atjaunot uzdevumu(-s) - &7 priekš spēlētāja. + Ļauj atjaunot uzdevumu(-s) + priekš spēlētāja. add_challenge: - name: "&f&l Izveidot Uzdevumu" + name: "Izveidot Uzdevumu" description: |- - &7 Sāk uzdevuma izveides - &7 procesu. + Sāk uzdevuma izveides + procesu. add_level: - name: "&f&l Izveidot Līmeni" + name: "Izveidot Līmeni" description: |- - &7 Sāk līmeņa izveides - &7 procesu. + Sāk līmeņa izveides + procesu. edit_challenge: - name: "&f&l Labot Uzdevumu" + name: "Labot Uzdevumu" description: |- - &7 Ļauj izvēlēties un - &7 labot uzdevumu. + Ļauj izvēlēties un + labot uzdevumu. edit_level: - name: "&f&l Labot Līmeni" + name: "Labot Līmeni" description: |- - &7 Ļauj izvēlēties un - &7 labot līmeni. + Ļauj izvēlēties un + labot līmeni. delete_challenge: - name: "&f&l Dzēst Uzdevumu" + name: "Dzēst Uzdevumu" description: |- - &7 Ļauj izvēlēties un - &7 dzēst uzdevumu. + Ļauj izvēlēties un + dzēst uzdevumu. delete_level: - name: "&f&l Dzēst Līmeni" + name: "Dzēst Līmeni" description: |- - &7 Ļauj izvēlēties un - &7 dzēst līmeni. + Ļauj izvēlēties un + dzēst līmeni. edit_settings: - name: "&f&l Iestatījumi" + name: "Iestatījumi" description: |- - &7 Ļauj skatīt un mainīt - &7 papildinājuma iestatījumus. + Ļauj skatīt un mainīt + papildinājuma iestatījumus. complete_wipe: - name: "&f&l Pilnīga Datu Dzēšana" + name: "Pilnīga Datu Dzēšana" description: |- - &7 Pilnībā dzēš visus - &7 datus no papildinājuma - &7 datubāzes. + Pilnībā dzēš visus + datus no papildinājuma + datubāzes. challenge_wipe: - name: "&f&l Uzdevumu Dzēšana" + name: "Uzdevumu Dzēšana" description: |- - &7 Pilnībā dzēš uzdevumu un - &7 līmeņu datus no papildinājuma - &7 datubāzes. + Pilnībā dzēš uzdevumu un + līmeņu datus no papildinājuma + datubāzes. user_wipe: - name: "&f&l Lietotāju Datu Dzēšana" + name: "Lietotāju Datu Dzēšana" description: |- - &7 Pilnībā dzēš lietotāju - &7 datus no papildinājuma - &7 datubāzes. + Pilnībā dzēš lietotāju + datus no papildinājuma + datubāzes. library: - name: "&f&l Bibliotēka" + name: "Bibliotēka" description: |- - &7 Atver publisko - &7 uzdevumu datubāzi. + Atver publisko + uzdevumu datubāzi. import_database: - name: "&f&l Ielādēt Datubāzi" + name: "Ielādēt Datubāzi" description: |- - &7 Ļauj ielādēt eksportētu - &7 datubāzes failu. + Ļauj ielādēt eksportētu + datubāzes failu. import_template: - name: "&f&l Ielādēt Paraugu" + name: "Ielādēt Paraugu" description: |- - &7 Ļauj ielādēt parauga - &7 failu. + Ļauj ielādēt parauga + failu. export_challenges: - name: "&f&l Eksportēt Uzdevumus" + name: "Eksportēt Uzdevumus" description: |- - &7 Ļauj eksportēt datubāzi - &7 uz failu. + Ļauj eksportēt datubāzi + uz failu. properties: - name: "&f&l Iestatījumi" + name: "Iestatījumi" description: |- - &7 Skatīt galvenos iestatījumus. + Skatīt galvenos iestatījumus. requirements: - name: "&f&l Prasības" + name: "Prasības" description: |- - &7 Skatīt prasības. + Skatīt prasības. rewards: - name: "&f&l Atlīdzības" + name: "Atlīdzības" description: |- - &7 Skatīt atlīdzības. + Skatīt atlīdzības. deployed: - name: "&f&l Strādājošs" + name: "Strādājošs" description: |- - &7 Ļauj pārslēgt vai - &7 uzdevums ir pieejams - &7 priekš spēlētājiem. - enabled: "&2 Pieejams" - disabled: "&c Nepieejams" + Ļauj pārslēgt vai + uzdevums ir pieejams + priekš spēlētājiem. + enabled: "Pieejams" + disabled: "Nepieejams" name: - name: "&f&l Nosaukums" + name: "Nosaukums" description: |- - &7 Ļauj mainīt uzdevuma - &7 nosaukumu. - value: "&7 Šobrīd: &r [name]" + Ļauj mainīt uzdevuma + nosaukumu. + value: "Šobrīd: [name]" remove_on_complete: - name: "&f&l Slēpt pēc Pabeigšanas" + name: "Slēpt pēc Pabeigšanas" description: |- - &7 Ļauj pārslēgt uzdevumu - &7 paslēpšanu pēc pilnīga - &7 uzdevuma izpildes. - enabled: "&2 Ieslēgs" - disabled: "&c Izslēgs" + Ļauj pārslēgt uzdevumu + paslēpšanu pēc pilnīga + uzdevuma izpildes. + enabled: "Ieslēgs" + disabled: "Izslēgs" description: - name: "&f&l Apraksts" + name: "Apraksts" description: |- - &7 Ļauj uzstādīt un mainīt - &7 uzdevumam specifisku - &7 aprakstu. - value: "&7 Esošais apraksts:" + Ļauj uzstādīt un mainīt + uzdevumam specifisku + aprakstu. + value: "Esošais apraksts:" environment: - name: "&f&l Dimensija" + name: "Dimensija" description: |- - &7 Ļauj limitēt uzdevuma - &7 izpildes vidi. - enabled: "&2" - disabled: "&c" + Ļauj limitēt uzdevuma + izpildes vidi. + enabled: "" + disabled: "" order: - name: "&f&l Prioritāte" - description: |- - &7 Ļauj uzstādīt prioritātes - &7 numuru. - &7 Objekti tiks sakārtoti augošā - &7 secībā. Ja prioritātes numuri - &7 ir vienādi, tad objekti tiks - &7 kārtoti pēc to `id` vārdiem.. - value: "&7 Esošais numurs: &e [number]" + name: "Prioritāte" + description: |- + Ļauj uzstādīt prioritātes + numuru. + Objekti tiks sakārtoti augošā + secībā. Ja prioritātes numuri + ir vienādi, tad objekti tiks + kārtoti pēc to `id` vārdiem.. + value: "Esošais numurs: [number]" icon: - name: "&f&l Ikona" + name: "Ikona" description: |- - &7 Ļauj mainīt ikonu. + Ļauj mainīt ikonu. locked_icon: - name: "&f&l Slēgtā Ikona" + name: "Slēgtā Ikona" description: |- - &7 Ļauj mainīt slēgta - &7 līmeņa ikonu. + Ļauj mainīt slēgta + līmeņa ikonu. required_permissions: - name: "&f&l Nepieciešamās Atļaujas" - description: |- - &7 Ļauj uzstādīt un mainīt - &7 atļaujas, lai uzdevumu - &7 varētu izpildīt. - title: "&7 Atļaujas: " - permission: " &8 - [permission]" - none: "&7 Atļaujas nav uzstādītas." + name: "Nepieciešamās Atļaujas" + description: |- + Ļauj uzstādīt un mainīt + atļaujas, lai uzdevumu + varētu izpildīt. + title: "Atļaujas: " + permission: " - [permission]" + none: "Atļaujas nav uzstādītas." remove_entities: - name: "&f&l Izņemt Radības" - description: |- - &7 Ļauj pārslēgt vai - &7 radības tiks izņemtas - &7 no pasaules pēc - &7 uzdevuma izpildes. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Izņemt Radības" + description: |- + Ļauj pārslēgt vai + radības tiks izņemtas + no pasaules pēc + uzdevuma izpildes. + enabled: "Ieslēgts" + disabled: "Izslēgts" required_entities: - name: "&f&l Nepieciešamās Radības" - description: |- - &7 Ļauj mainīt uzdevuma - &7 radības, kas nepieciešamas - &7 uzdevuma izpildei. - title: "&7 Radības: " - list: " &8 - [number] x [entity]" - none: "&7 Radības nav uzstādītas." + name: "Nepieciešamās Radības" + description: |- + Ļauj mainīt uzdevuma + radības, kas nepieciešamas + uzdevuma izpildei. + title: "Radības: " + list: " - [number] x [entity]" + none: "Radības nav uzstādītas." remove_blocks: - name: "&f&l Izņemt Blokus" - description: |- - &7 Ļauj pārslēgt vai - &7 bloki tiks izņemti - &7 no pasaules pēc - &7 uzdevuma izpildes. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Izņemt Blokus" + description: |- + Ļauj pārslēgt vai + bloki tiks izņemti + no pasaules pēc + uzdevuma izpildes. + enabled: "Ieslēgts" + disabled: "Izslēgts" required_blocks: - name: "&f&l Nepieciešamie Bloki" - description: |- - &7 Ļauj mainīt uzdevuma - &7 blokus, kas nepieciešamas - &7 uzdevuma izpildei. - title: "&7 Bloki: " - list: " &8 - [number] x [block]" - none: "&7 Bloki nav uzstādīti." + name: "Nepieciešamie Bloki" + description: |- + Ļauj mainīt uzdevuma + blokus, kas nepieciešamas + uzdevuma izpildei. + title: "Bloki: " + list: " - [number] x [block]" + none: "Bloki nav uzstādīti." search_radius: - name: "&f&l Meklēšanas Rādiuss" + name: "Meklēšanas Rādiuss" description: |- - &7 Ļauj mainīt bloku un radību - &7 meklēšanas rādiusu. - value: "&7 Esošā distance: &e [number]" + Ļauj mainīt bloku un radību + meklēšanas rādiusu. + value: "Esošā distance: [number]" remove_items: - name: "&f&l Izņemt Priekšmetus" - description: |- - &7 Ļauj pārslēgt vai - &7 priekšmetus tiks izņemtas - &7 no spēlētāja inventāra - &7 pēc uzdevuma izpildes. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Izņemt Priekšmetus" + description: |- + Ļauj pārslēgt vai + priekšmetus tiks izņemtas + no spēlētāja inventāra + pēc uzdevuma izpildes. + enabled: "Ieslēgts" + disabled: "Izslēgts" required_items: - name: "&f&l Priekšmeti" - description: |- - &7 Ļauj mainīt uzdevuma - &7 priekšmeti, kas nepieciešamas - &7 uzdevuma izpildei. - title: "&7 Priekšmeti: " - list: " &8 - [number] x [item]" - none: "&7 Priekšmeti nav uzstādīti." + name: "Priekšmeti" + description: |- + Ļauj mainīt uzdevuma + priekšmeti, kas nepieciešamas + uzdevuma izpildei. + title: "Priekšmeti: " + list: " - [number] x [item]" + none: "Priekšmeti nav uzstādīti." add_ignored_meta: - name: "&f&l Pievienot Meta-datu Ignorēšanu" - description: |- - &7 Ļauj uzstādīt, kuriem - &7 priekšmetiem drīkst - &7 ignorēt meta-datus, kā - &7 bojājumi, vārdi, uzlabojumi. - title: "&7 Priekšmeti: " - list: " &8 - [item]" - none: "&7 Priekšmeti nav uzstādīti." + name: "Pievienot Meta-datu Ignorēšanu" + description: |- + Ļauj uzstādīt, kuriem + priekšmetiem drīkst + ignorēt meta-datus, kā + bojājumi, vārdi, uzlabojumi. + title: "Priekšmeti: " + list: " - [item]" + none: "Priekšmeti nav uzstādīti." remove_ignored_meta: - name: "&f&l Noņemt Meta-datu Ignorēšanu" + name: "Noņemt Meta-datu Ignorēšanu" description: |- - &7 Ļauj noņemt, kuriem - &7 priekšmetiem drīkst - &7 ignorēt meta-datus, kā - &7 bojājumi, vārdi, uzlabojumi. + Ļauj noņemt, kuriem + priekšmetiem drīkst + ignorēt meta-datus, kā + bojājumi, vārdi, uzlabojumi. remove_experience: - name: "&f&l Noņemt Pieredzi" - description: |- - &7 Ļauj pārslēgt vai pēc - &7 uzdevuma izpildes - &7 pieredzes punkti - &7 spēlētājam tiks noņemti. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Noņemt Pieredzi" + description: |- + Ļauj pārslēgt vai pēc + uzdevuma izpildes + pieredzes punkti + spēlētājam tiks noņemti. + enabled: "Ieslēgts" + disabled: "Izslēgts" required_experience: - name: "&f&l Nepieciešamā Pieredze" + name: "Nepieciešamā Pieredze" description: |- - &7 Ļauj uzstādīt nepieciešamo - &7 pieredzi uzdevuma izpildei. - value: "&7 Pieredze: &e [number]" + Ļauj uzstādīt nepieciešamo + pieredzi uzdevuma izpildei. + value: "Pieredze: [number]" required_level: - name: "&f&l Salas Līmenis" + name: "Salas Līmenis" description: |- - &7 Ļauj uzstādīt nepieciešamo - &7 salas līmeni uzdevuma + Ļauj uzstādīt nepieciešamo + salas līmeni uzdevuma 77 izpildei. - value: "&7 Līmenis: &e [number]" + value: "Līmenis: [number]" remove_money: - name: "&f&l Noskaitīt Naudu" - description: |- - &7 Ļauj pārslēgt vai pēc - &7 uzdevuma izpildes - &7 nauda tiks noskaitīta - &7 spēlētāja maka. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Noskaitīt Naudu" + description: |- + Ļauj pārslēgt vai pēc + uzdevuma izpildes + nauda tiks noskaitīta + spēlētāja maka. + enabled: "Ieslēgts" + disabled: "Izslēgts" required_money: - name: "&f&l Nepieciešamā Nauda" + name: "Nepieciešamā Nauda" description: |- - &7 Ļauj uzstādīt nepieciešamo - &7 naudas daudzumu spēlētāja - &7 makā. - value: "&7 Naudas Daudzums: &e [number]" + Ļauj uzstādīt nepieciešamo + naudas daudzumu spēlētāja + makā. + value: "Naudas Daudzums: [number]" statistic: - name: "&f&l Statistika" + name: "Statistika" description: |- - &7 Ļauj mainīt, kura - &7 statistikas vērtība - &7 tiks skatīta. - value: "&7 Vērtība: &e [statistic]" + Ļauj mainīt, kura + statistikas vērtība + tiks skatīta. + value: "Vērtība: [statistic]" statistic_amount: - name: "&f&l Nepieciešamā Vērtība" + name: "Nepieciešamā Vērtība" description: |- - &7 Ļauj uzstādīt kādu - &7 vērtību statistikas - &7 rādītājam ir jāsasniedz. - value: "&7 Vērtība: &e [number]" + Ļauj uzstādīt kādu + vērtību statistikas + rādītājam ir jāsasniedz. + value: "Vērtība: [number]" remove_statistic: - name: "&f&l Samazināt Statistiku" - description: |- - &7 Ļauj pārslēgt vai pēc - &7 uzdevuma izpildes - &7 no statistikas datiem - &7 nepieciešamā vērtība - &7 tiks noskaitīta. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Samazināt Statistiku" + description: |- + Ļauj pārslēgt vai pēc + uzdevuma izpildes + no statistikas datiem + nepieciešamā vērtība + tiks noskaitīta. + enabled: "Ieslēgts" + disabled: "Izslēgts" statistic_blocks: - name: "&f&l Bloks" + name: "Bloks" description: |- - &7 Ļauj uzstādīt bloku, - &7 ko skatīs statistika. - value: "&7 Bloks: &e [block]" + Ļauj uzstādīt bloku, + ko skatīs statistika. + value: "Bloks: [block]" statistic_items: - name: "&f&l Priekšmets" + name: "Priekšmets" description: |- - &7 Ļauj uzstādīt priekšmetu, - &7 ko skatīs statistika. - value: "&7 Priekšmets: &e [item]" + Ļauj uzstādīt priekšmetu, + ko skatīs statistika. + value: "Priekšmets: [item]" statistic_entities: - name: "&f&l Radība" + name: "Radība" description: |- - &7 Ļauj uzstādīt radību, - &7 ko skatīs statistika. - value: "&7 Radība: &e [entity]" + Ļauj uzstādīt radību, + ko skatīs statistika. + value: "Radība: [entity]" reward_text: - name: "&f&l Atlīdzības Teksts" + name: "Atlīdzības Teksts" description: |- - &7 Ļauj uzrakstīt uzdevumam - &7 specifisku atlīdzības - &7 tekstu. - value: "&7 Teksts:" + Ļauj uzrakstīt uzdevumam + specifisku atlīdzības + tekstu. + value: "Teksts:" repeat_reward_text: - name: "&f&l Atkārtotas Atlīdzības Teksts" + name: "Atkārtotas Atlīdzības Teksts" description: |- - &7 Ļauj uzrakstīt uzdevumam - &7 specifisku atkārtotas - &7 atlīdzības tekstu. - value: "&7 Teksts:" + Ļauj uzrakstīt uzdevumam + specifisku atkārtotas + atlīdzības tekstu. + value: "Teksts:" reward_items: - name: "&f&l Atlīdzības Priekšmeti" + name: "Atlīdzības Priekšmeti" description: |- - &7 Ļauj uzstādīt atlīdzības - &7 priekšmetus. - title: "&7 Priekšmeti: " - list: " &8 - [number] x [item]" - none: "&7 Priekšmeti nav uzstādīti." + Ļauj uzstādīt atlīdzības + priekšmetus. + title: "Priekšmeti: " + list: " - [number] x [item]" + none: "Priekšmeti nav uzstādīti." repeat_reward_items: - name: "&f&l Atkārtotas Atlīdzības Priekšmeti" + name: "Atkārtotas Atlīdzības Priekšmeti" description: |- - &7 Ļauj uzstādīt atkārtotās - &7 atlīdzības priekšmetus. - title: "&7 Priekšmeti: " - list: " &8 - [number] x [item]" - none: "&7 Priekšmeti nav uzstādīti." + Ļauj uzstādīt atkārtotās + atlīdzības priekšmetus. + title: "Priekšmeti: " + list: " - [number] x [item]" + none: "Priekšmeti nav uzstādīti." reward_experience: - name: "&f&l Atlīdzības Pieredze" + name: "Atlīdzības Pieredze" description: |- - &7 Ļauj uzstādīt atlīdzības - &7 pieredzi spēlētājam. - value: "&7 Pieredze: &e [number]" + Ļauj uzstādīt atlīdzības + pieredzi spēlētājam. + value: "Pieredze: [number]" repeat_reward_experience: - name: "&f&l Atkārtotas Atlīdzības Pieredze" + name: "Atkārtotas Atlīdzības Pieredze" description: |- - &7 Ļauj uzstādīt atkārtotas - &7 atlīdzības pieredzi - &7 spēlētājam. - value: "&7 Pieredze: &e [number]" + Ļauj uzstādīt atkārtotas + atlīdzības pieredzi + spēlētājam. + value: "Pieredze: [number]" reward_money: - name: "&f&l Atlīdzības Nauda" + name: "Atlīdzības Nauda" description: |- - &7 Ļauj uzstādīt atlīdzības - &7 naudu spēlētājam. - value: "&7 Vērtība: &e [number]" + Ļauj uzstādīt atlīdzības + naudu spēlētājam. + value: "Vērtība: [number]" repeat_reward_money: - name: "&f&l Atkārtotas Atlīdzības Nauda" + name: "Atkārtotas Atlīdzības Nauda" description: |- - &7 Ļauj uzstādīt atkārtotas - &7 atlīdzības naudu spēlētājam. - value: "&7 Vērtība: &e [number]" + Ļauj uzstādīt atkārtotas + atlīdzības naudu spēlētājam. + value: "Vērtība: [number]" reward_commands: - name: "&f&l Atlīdzības Komandas" - description: |- - &7 Ļauj uzstādīt atlīdzības - &7 komandas. - &8 Padomi: - &8 Komandām nav nepieciešams - &8 pirmais `/` to sākumā. - &8 Pēc noklusējuma komandas - &8 izpildīs serveris. Taču - &8 pievienojot `[SELF]` sākumā - &8 komanda tiks izpildīta no - &8 spēlētāja konta. - &8 Komanda atbalsta arī - &8 `[player]` aizvietotāju, - &8 kurš tiks pārvidots par - &8 spēlētāja vārdu. - value: "&7 Komandas:" + name: "Atlīdzības Komandas" + description: |- + Ļauj uzstādīt atlīdzības + komandas. + Padomi: + Komandām nav nepieciešams + pirmais `/` to sākumā. + Pēc noklusējuma komandas + izpildīs serveris. Taču + pievienojot `[SELF]` sākumā + komanda tiks izpildīta no + spēlētāja konta. + Komanda atbalsta arī + `[player]` aizvietotāju, + kurš tiks pārvidots par + spēlētāja vārdu. + value: "Komandas:" repeat_reward_commands: - name: "&f&l Atkārtotas Atlīdzības Komandas" - description: |- - &7 Ļauj uzstādīt atkārtotas - &7 atlīdzības komandas. - &8 Padomi: - &8 Komandām nav nepieciešams - &8 pirmais `/` to sākumā. - &8 Pēc noklusējuma komandas - &8 izpildīs serveris. Taču - &8 pievienojot `[SELF]` sākumā - &8 komanda tiks izpildīta no - &8 spēlētāja konta. - &8 Komanda atbalsta arī - &8 `[player]` aizvietotāju, - &8 kurš tiks pārvidots par - &8 spēlētāja vārdu. - value: "&7 Komandas:" + name: "Atkārtotas Atlīdzības Komandas" + description: |- + Ļauj uzstādīt atkārtotas + atlīdzības komandas. + Padomi: + Komandām nav nepieciešams + pirmais `/` to sākumā. + Pēc noklusējuma komandas + izpildīs serveris. Taču + pievienojot `[SELF]` sākumā + komanda tiks izpildīta no + spēlētāja konta. + Komanda atbalsta arī + `[player]` aizvietotāju, + kurš tiks pārvidots par + spēlētāja vārdu. + value: "Komandas:" repeatable: - name: "&f&l Atkārtojams" + name: "Atkārtojams" description: |- - &7 Ļauj pārslēgt vai - &7 uzdevums ir atkārtojams. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + Ļauj pārslēgt vai + uzdevums ir atkārtojams. + enabled: "Ieslēgts" + disabled: "Izslēgts" repeat_count: - name: "&f&l Atkārtojumu Daudzums" + name: "Atkārtojumu Daudzums" description: |- - &7 Ļauj uzstādīt cik - &7 daudz reižu uzdevumu - &7 varēs izpildīt. - value: "&7 Vērtība: &e [number]" + Ļauj uzstādīt cik + daudz reižu uzdevumu + varēs izpildīt. + value: "Vērtība: [number]" cool_down: - name: "&f&l Taimouts" - description: |- - &7 Ļauj uzstādīt sekunžu - &7 daudzumu, kas jānogaida - &7 starp sekunžu izpildīšanu - &7 starp atkārtojamajiem - &7 uzdevumiem. - value: "&7 Current value: &e [time]" + name: "Taimouts" + description: |- + Ļauj uzstādīt sekunžu + daudzumu, kas jānogaida + starp sekunžu izpildīšanu + starp atkārtojamajiem + uzdevumiem. + value: "Current value: [time]" challenges: - name: "&f&l Uzdevumi" + name: "Uzdevumi" description: |- - &7 Skatīt uzdevumus, kas - &7 piesaistīti līmenim. + Skatīt uzdevumus, kas + piesaistīti līmenim. waiver_amount: - name: "&f&l Atbrīvojuma Daudzums" + name: "Atbrīvojuma Daudzums" description: |- - &7 Ļauj uzstādīt cik daudz - &7 uzdevumu var palikt - &7 neizpildīti iekš līmeņa, - &7 lai atvērtu nākošo līmeni. - value: "&7 Vērtība: &e [number]" + Ļauj uzstādīt cik daudz + uzdevumu var palikt + neizpildīti iekš līmeņa, + lai atvērtu nākošo līmeni. + value: "Vērtība: [number]" add_challenges: - name: "&f&l Pievienot Uzdevumu(-us)" + name: "Pievienot Uzdevumu(-us)" description: |- - &7 Ļauj pievienot uzdevumus - &7 līmenim. + Ļauj pievienot uzdevumus + līmenim. remove_challenges: - name: "&f&l Noņemt Uzdevumu(-us)" + name: "Noņemt Uzdevumu(-us)" description: |- - &7 Ļauj noņemt uzdevumus - &7 no līmeņa. + Ļauj noņemt uzdevumus + no līmeņa. reset_on_new: - name: "&f&l Atjaunot pēc Iziešanas" - description: |- - &7 Ļauj ieslēgt uzdevumu - &7 progresa atjaunošanu - &7 pēc iziešanas no komandas - &7 vai jaunas salas izveidi. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Atjaunot pēc Iziešanas" + description: |- + Ļauj ieslēgt uzdevumu + progresa atjaunošanu + pēc iziešanas no komandas + vai jaunas salas izveidi. + enabled: "Ieslēgts" + disabled: "Izslēgts" broadcast: - name: "&f&l Izziņot" + name: "Izziņot" description: |- - &7 Paziņot uzdevuma un līmeņa - &7 pirmās reizes pabeigšanu - &7 visiem spēlētājiem. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + Paziņot uzdevuma un līmeņa + pirmās reizes pabeigšanu + visiem spēlētājiem. + enabled: "Ieslēgts" + disabled: "Izslēgts" remove_completed: - name: "&f&l Slēpt Izpildītos" + name: "Slēpt Izpildītos" description: |- - &7 Ļauj slēpt izpildītos - &7 uzdevumus no spēlētāju - &7 izvēlnēm. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + Ļauj slēpt izpildītos + uzdevumus no spēlētāju + izvēlnēm. + enabled: "Ieslēgts" + disabled: "Izslēgts" glow_completed: - name: "&f&l Atzīmēt Izpildītos" + name: "Atzīmēt Izpildītos" description: |- - &7 Pievienot uzlabojuma - &7 mirdzēšanu izpildītajiem - &7 uzdevumiem. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + Pievienot uzlabojuma + mirdzēšanu izpildītajiem + uzdevumiem. + enabled: "Ieslēgts" + disabled: "Izslēgts" store_history: - name: "&f&l Saglabāt Vēsturi" - description: |- - &7 Saglabā vēsturi par - &7 uzdevumu izpildīšanu. - &7 Šobrīd skatāms tikai - &7 datubāzē. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Saglabāt Vēsturi" + description: |- + Saglabā vēsturi par + uzdevumu izpildīšanu. + Šobrīd skatāms tikai + datubāzē. + enabled: "Ieslēgts" + disabled: "Izslēgts" data_per_island: - name: "&f&l Kopīgot Salām" - description: |- - &7 Uzdevumi tiek kopīgoti - &7 visiem salas biedriem, - &7 ja ieslēgts, vai katram - &7 atsevišķi, ja izslēgts. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Kopīgot Salām" + description: |- + Uzdevumi tiek kopīgoti + visiem salas biedriem, + ja ieslēgts, vai katram + atsevišķi, ja izslēgts. + enabled: "Ieslēgts" + disabled: "Izslēgts" show_title: - name: "&f&l Rādīt Virsrakstu" + name: "Rādīt Virsrakstu" description: |- - &7 Rādīt virsrakstu par - &7 uzdevuma izpildīšanu. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + Rādīt virsrakstu par + uzdevuma izpildīšanu. + enabled: "Ieslēgts" + disabled: "Izslēgts" gamemode_gui: - name: "&f&l Globālā Komanda" - description: |- - &7 Ļauj ieslēgt vienotu globālo - &7 komandu priekš šī papildinājuma. - &7 Pēc noklusējuma: /challenges - &c Nepieciešams restarts. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Globālā Komanda" + description: |- + Ļauj ieslēgt vienotu globālo + komandu priekš šī papildinājuma. + Pēc noklusējuma: /challenges + Nepieciešams restarts. + enabled: "Ieslēgts" + disabled: "Izslēgts" locked_level_icon: - name: "&f&l Noklusējuma Slēgta Līmeņa Ikona" + name: "Noklusējuma Slēgta Līmeņa Ikona" description: |- - &7 Noklusējuma ikona priekš visiem - &7 slēgtajiem līmeņiem, kam nav - &7 sava specificējuma. + Noklusējuma ikona priekš visiem + slēgtajiem līmeņiem, kam nav + sava specificējuma. purge_history: - name: "&f&l Vēstures Ilgums" + name: "Vēstures Ilgums" description: |- - &7 Dienu skaits cik ilgi - &7 vēsture tiks glabāta. - value: "&7 Dienas: &e [number]" + Dienu skaits cik ilgi + vēsture tiks glabāta. + value: "Dienas: [number]" title_showtime: - name: "&f&l Virsraksta Ilgums" + name: "Virsraksta Ilgums" description: |- - &7 Virsraksta rādīšanas ilgums. - value: "&7 Vērtība: &e [number]" + Virsraksta rādīšanas ilgums. + value: "Vērtība: [number]" active_world_list: - name: "&f&l Spēlētāja Pasaules Izvēlne" - description: |- - &7 Ļauj pārslēgt vai globālā - &7 komanda atvērs spēles režīmu - &7 izvēlni vai uzdevumu izvēlni - &7 no spēlētāja pasaules. - enabled: "&2 Ieslēgts" - disabled: "&c Izslēgts" + name: "Spēlētāja Pasaules Izvēlne" + description: |- + Ļauj pārslēgt vai globālā + komanda atvērs spēles režīmu + izvēlni vai uzdevumu izvēlni + no spēlētāja pasaules. + enabled: "Ieslēgts" + disabled: "Izslēgts" visibility_mode: - name: "&f&l Redzamība" + name: "Redzamība" description: |- - &7 Redzamība priekš - &7 uzdevumiem spēlētāju - &7 izvēlnēs. - enabled: "&2" - disabled: "&c" + Redzamība priekš + uzdevumiem spēlētāju + izvēlnēs. + enabled: "" + disabled: "" visible: "Rādīt Pieejamos Uzdevumus" hidden: "Rādīt Visus Uzdevumus" toggleable: "Pārslēdzams" download: - name: "&f&l Lejupielādēt Bibliotēku" + name: "Lejupielādēt Bibliotēku" description: |- - &7 Manuāli lejupielādēt - &7 bibliotētku. - enabled: "&2 Notīrīt iekšējo atmiņu" - disabled: "&c Netīrīt iekšējo atmiņu" + Manuāli lejupielādēt + bibliotētku. + enabled: "Notīrīt iekšējo atmiņu" + disabled: "Netīrīt iekšējo atmiņu" player: - name: "&f&l [name]" + name: "[name]" description: |- - &7 Salas īpašnieks: [owner] - members: "&7 Salas biedri:" - member: "&8 - [name]" + Salas īpašnieks: [owner] + members: "Salas biedri:" + member: "- [name]" no-island: |- - &c Spēlētājam nav salas. + Spēlētājam nav salas. player_list: - name: "&f&l Filtrēt Spēlētājus" + name: "Filtrēt Spēlētājus" description: |- - &7 Ļauj filtrēt spēlētājus. - enabled: "&2" - disabled: "&c" + Ļauj filtrēt spēlētājus. + enabled: "" + disabled: "" online: "Spēlētāji Tiešsaitē" with_island: "Spēlētāji ar Salām" in_world: "Spēlētāji šajā Pasaulē" add_block: - name: "&f&l Pievienot Bloku" + name: "Pievienot Bloku" description: |- - &7 Ļauj pievienot bloku - &7 sarakstam. + Ļauj pievienot bloku + sarakstam. remove_block: - name: "&f&l Noņemt Bloku(-us)" + name: "Noņemt Bloku(-us)" description: |- - &7 Ļauj noņemt iezīmētos - &7 blokus no saraksta. - title: "&7 Iezīmētie Bloki:" - material: "&8 - [material]" + Ļauj noņemt iezīmētos + blokus no saraksta. + title: "Iezīmētie Bloki:" + material: "- [material]" material: - name: "&f&l [material]" + name: "[material]" description: |- - &7 Materiāla ID: [id] - selected: "&2 Iezīmēts" + Materiāla ID: [id] + selected: "Iezīmēts" add_entity: - name: "&f&l Pievienot Radību" + name: "Pievienot Radību" description: |- - &7 Ļauj pievienot jaunu - &7 radību sarakstam. + Ļauj pievienot jaunu + radību sarakstam. switch_entity: - name: "&f&l Pārslēgt Ikonas" + name: "Pārslēgt Ikonas" description: |- - &7 Ļauj pārslēgt radību - &7 olas uz radību galvām. + Ļauj pārslēgt radību + olas uz radību galvām. remove_entity: - name: "&f&l Dzēst Radības" + name: "Dzēst Radības" description: |- - &7 Ļauj noņemt iezīmētās - &7 radības no saraksta. - title: "&7 Iezīmētās Radības:" - entity: "&8 - [entity]" + Ļauj noņemt iezīmētās + radības no saraksta. + title: "Iezīmētās Radības:" + entity: "- [entity]" entity: - name: "&f&l [entity]" + name: "[entity]" description: |- - &7 Radības ID: [id] - selected: "&2 Iezīmēts" + Radības ID: [id] + selected: "Iezīmēts" inventory_type: - name: "&f&l Inventāra Tips" + name: "Inventāra Tips" description: |- - &7 Uzdevums, kas skatās - &7 priekšmetus spēlētāja - &7 inventārā. + Uzdevums, kas skatās + priekšmetus spēlētāja + inventārā. island_type: - name: "&f&l Salas Tips" + name: "Salas Tips" description: |- - &7 Uzdevums, kas skatās - &7 lietas uz spēlētāja salas. + Uzdevums, kas skatās + lietas uz spēlētāja salas. other_type: - name: "&f&l Cits Tips" + name: "Cits Tips" description: |- - &7 Uzdevums, kas skatās - &7 pieredzi, naudu un salas - &7 līmeni. + Uzdevums, kas skatās + pieredzi, naudu un salas + līmeni. statistic_type: - name: "&f&l Statistikas Tips" + name: "Statistikas Tips" description: |- - &7 Uzdevums, kas skatās - &7 spēlētāja statistiku. + Uzdevums, kas skatās + spēlētāja statistiku. save: - name: "&f&l Saglabāt" + name: "Saglabāt" description: |- - &7 Saglabāt izmaiņas un - &7 atgriezties. + Saglabāt izmaiņas un + atgriezties. cancel: - name: "&f&l Atcelt" + name: "Atcelt" description: |- - &7 Atcelt izmaiņas un - &7 atgriezties iepriekšējā - &7 izvēlnē. + Atcelt izmaiņas un + atgriezties iepriekšējā + izvēlnē. accept_selected: - name: "&f&l Akceptēt Atzīmētos" + name: "Akceptēt Atzīmētos" description: |- - &7 Akceptēt atzīmētos un - &7 atgriezties iepriekšējā - &7 izvēlnē. - title: "&7 Atzīmēti: " - element: "&8 - [element]" + Akceptēt atzīmētos un + atgriezties iepriekšējā + izvēlnē. + title: "Atzīmēti: " + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Meklēt" + name: "Meklēt" description: |- - &7 Ļauj ievadīt meklēšanas - &7 tekstu. - search: "&b Vērtība: [value]" + Ļauj ievadīt meklēšanas + tekstu. + search: "Vērtība: [value]" tips: - click-to-select: "&e Klikšķini, &7 lai atlasītu." - click-to-choose: "&e Klikšķini, &7 lai izvēlētos." - click-to-complete: "&e Klikšķini, &7 lai pabeigtu." + click-to-select: "Klikšķini, lai atlasītu." + click-to-choose: "Klikšķini, lai izvēlētos." + click-to-complete: "Klikšķini, lai pabeigtu." right-click-multiple-open: |- - &e Labais klikšķis, - &7 lai izvēlētos daudzumu. + Labais klikšķis, + lai izvēlētos daudzumu. shift-left-click-to-complete-all: |- - &e Shift un klikšķis, - &7 lai pabeigtu visus. + Shift un klikšķis, + lai pabeigtu visus. left-click-to-accept: |- - &e Kreisais klikšķis, - &7 lai pabeigtu. + Kreisais klikšķis, + lai pabeigtu. right-click-to-write: |- - &e Labais klikšķis, - &7 lai rakstītu. - click-to-reduce: "&e Klikšķini, &7 lai samazinātu." - click-to-increase: "&e Klikšķini, &7 lai palielinātu." - click-to-return: "&e Klikšķini, &7 lai atgrieztos." - click-to-quit: "&e Klikšķini, &7 lai izietu." - click-to-wipe: "&e Klikšķini, &7 lai dzēstu." + Labais klikšķis, + lai rakstītu. + click-to-reduce: "Klikšķini, lai samazinātu." + click-to-increase: "Klikšķini, lai palielinātu." + click-to-return: "Klikšķini, lai atgrieztos." + click-to-quit: "Klikšķini, lai izietu." + click-to-wipe: "Klikšķini, lai dzēstu." left-click-to-wipe: |- - &e Kreisais klikšķis, - &7 lai dzēstu. + Kreisais klikšķis, + lai dzēstu. right-click-to-switch: |- - &e Labais klikšķis, - &7 lai mainītu. - click-to-open: "&e Klikšķini, &7 lai atvērtu." - click-to-export: "&e Klikšķini, &7 lai eksportētu." - click-to-create: "&e Klikšķini, &7 lai izveidotu." + Labais klikšķis, + lai mainītu. + click-to-open: "Klikšķini, lai atvērtu." + click-to-export: "Klikšķini, lai eksportētu." + click-to-create: "Klikšķini, lai izveidotu." left-click-to-open: |- - &e Kreisais klikšķis, - &7 lai atvērtu. + Kreisais klikšķis, + lai atvērtu. right-click-to-reset-all: |- - &e Labais klikšķis, - &7 lai dzēstu visu. - click-to-toggle: "&e Klikšķini, &7 lai pārslēgtu." - click-to-change: "&e Klikšķini, &7 lai mainītu." + Labais klikšķis, + lai dzēstu visu. + click-to-toggle: "Klikšķini, lai pārslēgtu." + click-to-change: "Klikšķini, lai mainītu." shift-click-to-reset: |- - &e Shift un klikšķis, - &7 lai dzēstu. - click-to-add: "&e Klikšķini, &7 lai pievienotu." - click-to-remove: "&e Klikšķini, &7 lai noņemtu." + Shift un klikšķis, + lai dzēstu. + click-to-add: "Klikšķini, lai pievienotu." + click-to-remove: "Klikšķini, lai noņemtu." left-click-to-cycle: |- - &e Kreisais klikšķis, - &7 pārslēgtu uz leju. + Kreisais klikšķis, + pārslēgtu uz leju. right-click-to-cycle: |- - &e Labais klikšķis, - &7 pārslēgtu uz augšu. - click-to-edit: "&e Klikšķini, &7 lai labotu." + Labais klikšķis, + pārslēgtu uz augšu. + click-to-edit: "Klikšķini, lai labotu." left-click-to-download: |- - &e Kreisais klikšķis, - &7 lai lejupielādētu + Kreisais klikšķis, + lai lejupielādētu right-click-to-toggle: |- - &e Labais klikšķis, - &7 lai pārslēgtu. - click-to-install: "&e Klikšķini, &7 lai instalētu." - click-to-reset-all: "&e Klikšķini, &7 lai dzēstu visu." + Labais klikšķis, + lai pārslēgtu. + click-to-install: "Klikšķini, lai instalētu." + click-to-reset-all: "Klikšķini, lai dzēstu visu." right-click-to-select: |- - &e Labais klikšķis, - &7 lai atzīmētu. + Labais klikšķis, + lai atzīmētu. right-click-to-deselect: |- - &e Labais klikšķis, - &7 lai atceltu atzīmi. + Labais klikšķis, + lai atceltu atzīmi. left-click-to-choose: |- - &e Kreisais klikšķis, - &7 lai izvēlētos. - click-to-cancel: "&e Klikšķini, &7 lai atceltu." - click-to-save: "&e Klikšķini, &7 lai saglabātu." + Kreisais klikšķis, + lai izvēlētos. + click-to-cancel: "Klikšķini, lai atceltu." + click-to-save: "Klikšķini, lai saglabātu." click-to-deselect: |- - &e Klikšķini, &7 lai - &7 atceltu atzīmi. + Klikšķini, lai + atceltu atzīmi. click-on-item: |- - &e Klikšķini, &7 uz priekšmeta - &7 tavā inventārā. + Klikšķini, uz priekšmeta + tavā inventārā. left-click-to-edit: |- - &e Kreisais klikšķis, - &7 lai labotu. + Kreisais klikšķis, + lai labotu. right-click-to-clear: |- - &e Labais klikšķis, - &7 lai notīrītu. + Labais klikšķis, + lai notīrītu. click-to-previous: |- - &e Klikšķini, &7 lai - &7 skatītu iepriekšējo. + Klikšķini, lai + skatītu iepriekšējo. click-to-next: |- - &e Klikšķini, &7 lai - &7 skatītu nākošo. + Klikšķini, lai + skatītu nākošo. descriptions: # This part generates description text for challenges object in all GUI's. challenge: @@ -881,22 +881,22 @@ challenges: # Contains a text generated inside [status] lore status: # Status message for completed unrepeatable challenge - completed: "&2&l Izpildīts" + completed: "Izpildīts" # Status message that contains number of completions for unlimited repeatable challenge - completed-times: "&2 Izpildīts &7&l [number] &r&2 reizi(-es)" + completed-times: "Izpildīts [number] reizi(-es)" # Status message that contains number of completions from max available for repeatable challenge - completed-times-of: "&2 Izpildīts &7&l [number] &r&2 no &7&l [max] &r&2 reizēm" + completed-times-of: "Izpildīts [number] no [max] reizēm" # Status message that indicates that max completion count reached for repeatable challenge - completed-times-reached: "&2&l Izpildīts visas &7 [max] &2 reizes" + completed-times-reached: "Izpildīts visas [max] reizes" # Contains a text generated inside [cooldown] lore cooldown: lore: |- [timeout] [wait-time] # Text message that shows challenges timeout. - timeout: "&7&l Taimauts: &r&7 [time]" + timeout: "Taimauts: [time]" # Text message that shows challenges wait time if it is larger than 0. - wait-time: "&c&l Jānogaida: &r&c [time]" + wait-time: "Jānogaida: [time]" # Text message that replaces days if number > 1 in-days: "[number] d " # Text message that replaces hours if number > 1 @@ -912,17 +912,17 @@ challenges: [type-requirement] [permissions] # Message that will replace [environment] placeholder if there is just a single environment. - environment-single: "&7 Limitēts iekš [environment]" + environment-single: "Limitēts iekš [environment]" # Message that will replace [environment] placeholder if there are multiple environments. - environment-title: "&7 Limitēts iekš: " + environment-title: "Limitēts iekš: " # Message that will be added after environment-title-multiple. - environment-list: " &7 - &e [environment]" + environment-list: " - [environment]" # Message that will replace [permissions] placeholder if there is just a single permission. - permission-single: "&c Nepieciešama [permissions] atļauja" + permission-single: "Nepieciešama [permissions] atļauja" # Message that will replace [permissions] placeholder if there are multiple permissions. - permissions-title: "&c Nepieciešamās atļaujas: " + permissions-title: "Nepieciešamās atļaujas: " # Message that will be added after permissions-title-multiple. - permissions-list: " &c - [permission]" + permissions-list: " - [permission]" # Message that will generate for island type requirements and replace [type-requirements] island: lore: |- @@ -932,34 +932,34 @@ challenges: [warning-block] [warning-entity] # Title that will be used if there are defined blocks in island challenge - blocks-title: "&7&l Nepieciešamie bloki:" + blocks-title: "Nepieciešamie bloki:" # Listing of blocks that are required on the island. - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" + block-value: " - [material]" + blocks-value: " - [number] x [material]" # Title that will be used if there are defined entities in island challenge - entities-title: "&7&l Nepieciešamās radības:" + entities-title: "Nepieciešamās radības:" # Listing of entities that are required on the island. - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" # Search radius for the blocks/entities search-radius: |- - &7 Ne tālāk kā &e [number] - &7 metru attālumā + Ne tālāk kā [number] + metru attālumā # Waning about block/entity removing - warning-block: "&e Bloks(-i) tiks &c dzēsti" - warning-entity: "&e Radība(-as) tiks &c dzēstas" + warning-block: "Bloks(-i) tiks dzēsti" + warning-entity: "Radība(-as) tiks dzēstas" # Message that will generate for inventory type requirements and replace [type-requirements] inventory: lore: |- [items] [warning] # Title that will be used if there are list of items for challenge - item-title: "&7&l Nepieciešamie Priekšmeti:" + item-title: "Nepieciešamie Priekšmeti:" # Listing of an item that are required multiple times. - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" + item-value: " - [item]" + items-value: " - [number] x [item]" # Warning that items will be removed - warning: "&e Priekšmets(-i) tiks &c dzēsti" + warning: "Priekšmets(-i) tiks dzēsti" # Message that will generate for other type requirements and replace [type-requirements] other: lore: |- @@ -969,51 +969,51 @@ challenges: [money-warning] [level] # Text for required experience - experience: "&7&l Nepieciešamā pieredze: &r&e [number]" + experience: "Nepieciešamā pieredze: [number]" # Warning that experience will be reduced - experience-warning: "&e Pieredze tiks &c noņemta" + experience-warning: "Pieredze tiks noņemta" # Text for required money - money: "&7&l Nepieciešamā nauda: &r&e [number]" + money: "Nepieciešamā nauda: [number]" # Warning that money will be reduced - money-warning: "&e Nauda tiks &c noskaitīta" + money-warning: "Nauda tiks noskaitīta" # Text for required island level - level: "&7&l Nepieciešamais salas līmenis: &r&e [number]" + level: "Nepieciešamais salas līmenis: [number]" # Message that will generate for statistic type requirements and replace [type-requirements] statistic: lore: |- [statistic] [warning] # Type of statistic for multiple target counter. Target may be entity or material/block - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" + multiple-target: "[statistic]: [number] x [target]" # Type of statistic for single target. Target may be entity or material/block - single-target: "&7&l [statistic]: &r&e [target]" + single-target: "[statistic]: [target]" # Type of statistic without entity/block target - statistic: "&7&l [statistic] &r&e [number]" + statistic: "[statistic] [number]" # Warning that statistic will be removed - warning: "&e Statistikas dati tiks &c samazināti" + warning: "Statistikas dati tiks samazināti" # Contains a text generated inside [rewards] lore rewards: # [text] comes from challenge.rewardText and challenge.repeatRewardText lore: |- - &7&l Atlīdzības: + Atlīdzības: [text] [items] [experience] [money] [commands] # Title that will be used if there are list of items for rewards - item-title: "&7 Priekšmeti:" + item-title: "Priekšmeti:" # Listing of an item that are rewards multiple times. - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" + item-value: " - [item]" + items-value: " - [number] x [item]" # Text for reward experience - experience: "&7 Pieredze: &r&e [number]" + experience: "Pieredze: [number]" # Text for reward money - money: "&7 Nauda: &r&e [number]" + money: "Nauda: [number]" # Title for commands listing: - commands-title: "&7 Komandas:" + commands-title: "Komandas:" # Command listing element - command: " &7 - &e [command]" + command: " - [command]" # This part generates description text for levels object in all GUI's. level: lore: |- @@ -1024,54 +1024,54 @@ challenges: # Status is either challengeLevel.unlockMessage or current status of the level status: # Status message for completed unrepeatable challenge - completed: "&2&l Izpildīts" + completed: "Izpildīts" # Status message that contains number of completed challenges from all challenges completed-challenges-of: |- - &2 Izpildīti &7&l [number] &r&2 no - &7&l [max] &r&2 uzdevumiem. + Izpildīti [number] no + [max] uzdevumiem. # Status message for locked level - locked: "&c&l Slēgts" + locked: "Slēgts" # Status message for locked level that will show missing challenge count. missing-challenges: |- - &7 Nepieciešams izpildīt vēl [number] - &7 uzdevumus, lai atvērtu šo līmeni. + Nepieciešams izpildīt vēl [number] + uzdevumus, lai atvērtu šo līmeni. # Contains a text for waiver amount to unlock next level waiver: |- - &7&l [number] uzdevums(-i) &r&7 var - &7 palikt neizpildīti, lai atvērtu - &7 nākošo līmeni. + [number] uzdevums(-i) var + palikt neizpildīti, lai atvērtu + nākošo līmeni. # Contains a text generated inside [rewards] lore rewards: # [text] comes from challengeLevel.rewardText lore: |- - &7&l Atlīdzības: + Atlīdzības: [text] [items] [experience] [money] [commands] # Title that will be used if there are list of items for rewards - item-title: "&7 Priekšmeti:" + item-title: "Priekšmeti:" # Listing of an item that are rewards multiple times. - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" + item-value: " - [item]" + items-value: " - [number] x [item]" # Text for reward experience - experience: "&7 Pieredze: &r&e [number]" + experience: "Pieredze: [number]" # Text for reward money - money: "&7 Nauda: &r&e [number]" + money: "Nauda: [number]" # Title for commands listing: - commands-title: "&7 Komandas:" + commands-title: "Komandas:" # Command listing element - command: " &7 - &e [command]" + command: " - [command]" # This part generates description for the Library Entry library: - author: '&7 veidoja &e [author]' - version: '&7 Uzdevuma Versija: &e [version]' - lang: '&7 Valoda: &e [lang]' - gamemode: '&7 Priekš &e [gamemode]' + author: 'veidoja [author]' + version: 'Uzdevuma Versija: [version]' + lang: 'Valoda: [lang]' + gamemode: 'Priekš [gamemode]' conversations: # Prefix for messages that are send from server. - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " # List of strings that are valid for confirming input. (separated with ,) confirm-string: "true, on, yes, confirm, y, valid, correct, jā, ja, apstiprinu, pareizi" # List of strings that are valid for denying input. (separated with ,) @@ -1081,87 +1081,87 @@ challenges: # List of strings that allows to exit conversation. (separated with ,) exit-string: "cancel, exit, quit, atcelt, iziet" # Message that is send to user when conversation is cancelled. - cancelled: "&c Saruna pārtraukta!" + cancelled: "Saruna pārtraukta!" # Message that appears when admin clicks on number editing button. - input-number: "&e Lūdzu ieraksti skaitli sarakstē!" + input-number: "Lūdzu ieraksti skaitli sarakstē!" # Message that appears when admin clicks on seconds editing button. - input-seconds: "&e Lūdzu ieraksti sekunžu skaitu sarakstē!" + input-seconds: "Lūdzu ieraksti sekunžu skaitu sarakstē!" # Error message that is showed if user input a value that is not a number. - numeric-only: "&c Šis `[value]` nav skaitlis!" + numeric-only: "Šis `[value]` nav skaitlis!" # Error message that is showed if user input a number that is smaller or larger that allowed. - not-valid-value: "&c Ierakstītais skaitlis [value] nav derīgs. Skaitlis nedrīkst būt mazāks par [min] un lielāks par [max]!" + not-valid-value: "Ierakstītais skaitlis [value] nav derīgs. Skaitlis nedrīkst būt mazāks par [min] un lielāks par [max]!" # Message that confirms user data removing. - user-data-removed: "&a Visi lietotāju dati priekš [gamemode] ir dzēsti." + user-data-removed: "Visi lietotāju dati priekš [gamemode] ir dzēsti." # Message that asks confirmation for user data removing. - confirm-user-data-deletion: "&e Lūdzu apstiprini sarakstē (jā), ka vēlies dzēst lietotāju datus par [gamemode]." + confirm-user-data-deletion: "Lūdzu apstiprini sarakstē (jā), ka vēlies dzēst lietotāju datus par [gamemode]." # Message that confirms user data removing. - challenge-data-removed: "&a Visu uzdevumu dati priekš [gamemode] ir dzēsti." + challenge-data-removed: "Visu uzdevumu dati priekš [gamemode] ir dzēsti." # Message that asks confirmation for user data removing. - confirm-challenge-data-deletion: "&e Lūdzu apstiprini sarakstē (jā), ka vēlies dzēst uzdevumu datus par [gamemode]." + confirm-challenge-data-deletion: "Lūdzu apstiprini sarakstē (jā), ka vēlies dzēst uzdevumu datus par [gamemode]." # Message that confirms user data removing. - all-data-removed: "&a Visi dati priekš [gamemode] ir dzēsti." + all-data-removed: "Visi dati priekš [gamemode] ir dzēsti." # Message that asks confirmation for user data removing. - confirm-all-data-deletion: "&e Lūdzu apstiprini sarakstē (jā), ka vēlies dzēst visus datus par [gamemode]." + confirm-all-data-deletion: "Lūdzu apstiprini sarakstē (jā), ka vēlies dzēst visus datus par [gamemode]." # Message that asks user to write a name - write-name: "&e Lūdzu ieraksti sarakstē vārdu." + write-name: "Lūdzu ieraksti sarakstē vārdu." # Message that confirms new object creation. - new-object-created: "&a Jauns objekts priekš [gamemode] ir uztaisīts." + new-object-created: "Jauns objekts priekš [gamemode] ir uztaisīts." # Error message that sends that object cannot be created with a given name - object-already-exists: "&c Objekts ar &7 [id] &c jau eksistē. Izvēlies citu vārdu." + object-already-exists: "Objekts ar [id] jau eksistē. Izvēlies citu vārdu." # Error message that sends information that challenge cannot be deployed. - invalid-challenge: "&c Uzdevums [challenge] satur nekorektus datus. Tas nevar tikt izlaists!" + invalid-challenge: "Uzdevums [challenge] satur nekorektus datus. Tas nevar tikt izlaists!" # Message that confirms name changing - name-changed: "&a Nosaukums veiksmīgi mainīts." + name-changed: "Nosaukums veiksmīgi mainīts." # Message that appears after clicking - write-description: "&e Lūdzu raksti jauno aprakstu sarakstē un 'iziet' jaunā rindā, lai beigtu." + write-description: "Lūdzu raksti jauno aprakstu sarakstē un 'iziet' jaunā rindā, lai beigtu." # Message that appears after successful description change. - description-changed: "&a Apraksts vaiksmīgi mainīts." + description-changed: "Apraksts vaiksmīgi mainīts." # Message that appears when admin clicks on permission editing button. - write-permissions: "&e Lūdzu ieraksti nepieciešamās atļaujas sarakstē, katru savā rindā, and 'iziet' jaunā rindā, lai beigtu." + write-permissions: "Lūdzu ieraksti nepieciešamās atļaujas sarakstē, katru savā rindā, and 'iziet' jaunā rindā, lai beigtu." # Message that appears after successful permission updating. - permissions-changed: "&a Atļaujas veiksmīgi mainītas." + permissions-changed: "Atļaujas veiksmīgi mainītas." # Message that appears after clicking - write-reward-text: "&e Lūdzu ieraksti apbalvojuma tekstu un 'iziet' jaunā rindā, lai beigtu." + write-reward-text: "Lūdzu ieraksti apbalvojuma tekstu un 'iziet' jaunā rindā, lai beigtu." # Message that appears after successful reward-text change. - reward-text-changed: "&a Apbalvojuma paraksts veiksmīgi mainīts." + reward-text-changed: "Apbalvojuma paraksts veiksmīgi mainīts." # Message that appears after clicking - write-repeat-reward-text: "&e Lūdzu ieraksti atkārtotā apbalvojuma tekstu un 'iziet' jaunā rindā, lai beigtu." + write-repeat-reward-text: "Lūdzu ieraksti atkārtotā apbalvojuma tekstu un 'iziet' jaunā rindā, lai beigtu." # Message that appears after successful repeat-reward-text change. - repeat-reward-text-changed: "&a Atkārtotā apbalvojuma paraksts veiksmīgi mainīts." + repeat-reward-text-changed: "Atkārtotā apbalvojuma paraksts veiksmīgi mainīts." # Message that appears after clicking - write-reward-commands: "&e Lūdzu ieraksti apbalvojuma komandas katru savā rindā, un 'iziet' jaunā rindā, lai beigtu." + write-reward-commands: "Lūdzu ieraksti apbalvojuma komandas katru savā rindā, un 'iziet' jaunā rindā, lai beigtu." # Message that appears after successful commands-text change. - reward-commands-changed: "&a Apbalvojuma komandas veiksmīgi mainīts." + reward-commands-changed: "Apbalvojuma komandas veiksmīgi mainīts." # Message that appears after clicking - write-repeat-reward-commands: "&e Lūdzu ieraksti atkārtotā apbalvojuma komandas katru savā rindā, un 'iziet' jaunā rindā, lai beigtu." + write-repeat-reward-commands: "Lūdzu ieraksti atkārtotā apbalvojuma komandas katru savā rindā, un 'iziet' jaunā rindā, lai beigtu." # Message that appears after successful repeat-commands-text change. - repeat-reward-commands-changed: "&a Atkārtotā apbalvojuma komandas veiksmīgi mainīts." + repeat-reward-commands-changed: "Atkārtotā apbalvojuma komandas veiksmīgi mainīts." # Message that confirms user data removing. - challenge-removed: "&a Uzdevums [challenge] priekš [gamemode] ir dzēsts no datubāzes." + challenge-removed: "Uzdevums [challenge] priekš [gamemode] ir dzēsts no datubāzes." # Message that asks confirmation for user data removing. - confirm-challenge-deletion: "&e Lūdzu apstiprini (jā), ka vēlies dzēst [challenge] priekš [gamemode] no datubāzes." + confirm-challenge-deletion: "Lūdzu apstiprini (jā), ka vēlies dzēst [challenge] priekš [gamemode] no datubāzes." # Message that confirms user data removing. - level-removed: "&a Līmenis [level] priekš [gamemode] ir dzēsts no datubāzes." + level-removed: "Līmenis [level] priekš [gamemode] ir dzēsts no datubāzes." # Message that asks confirmation for user data removing. - confirm-level-deletion: "&e Lūdzu apstiprini (jā), ka vēlies dzēst [level] priekš [gamemode] no datubāzes." + confirm-level-deletion: "Lūdzu apstiprini (jā), ka vēlies dzēst [level] priekš [gamemode] no datubāzes." # Message that appears when user clicks on library installation. - start-downloading: "&a Sāk lejupielādēt Uzdevumu Bibliotēku." + start-downloading: "Sāk lejupielādēt Uzdevumu Bibliotēku." # Message that appears when writing multiline text. - written-text: "&a Ievadītais teksts:" + written-text: "Ievadītais teksts:" # Message that appears after importing library data into database. - confirm-data-replacement: "&e Lūdzu apstiprini (jā), ka vēlies dzēst esošos uzdevumus un aizstāt ar jauniem." + confirm-data-replacement: "Lūdzu apstiprini (jā), ka vēlies dzēst esošos uzdevumus un aizstāt ar jauniem." # Message that appears after successful data importing - new-challenges-imported: "&a Jaunie Uzdevumi ir veiksmīgi ielādēti priekš [gamemode]." + new-challenges-imported: "Jaunie Uzdevumi ir veiksmīgi ielādēti priekš [gamemode]." # Message that appears after admin clicks on database exporting button. - exported-file-name: "&e Lūdzu ieraksti eksportētā faila nosaukumu. (ieraksti 'atcelt', lai izietu)" + exported-file-name: "Lūdzu ieraksti eksportētā faila nosaukumu. (ieraksti 'atcelt', lai izietu)" # Message that appears after successful database exporting to file. - database-export-completed: "&a Veiksmīgi eksportēti uzdevumi no [world]. Fails [file] ir izveidots." + database-export-completed: "Veiksmīgi eksportēti uzdevumi no [world]. Fails [file] ir izveidots." # Message that appears if input file name is already taken. - file-name-exist: "&c Faila nosaukums '[id]' jau eksistē. Nevar pārrakstīt." + file-name-exist: "Faila nosaukums '[id]' jau eksistē. Nevar pārrakstīt." # Message that asks for search value input. - write-search: "&e Lūdzu ievadi meklēšanas vērtību. (vai 'atcelt', lai izietu)" + write-search: "Lūdzu ievadi meklēšanas vērtību. (vai 'atcelt', lai izietu)" # Message that appears after updating search value. - search-updated: "&a Meklēšanas vērtība atjaunota." + search-updated: "Meklēšanas vērtība atjaunota." titles: # Title and subtitle may contain variables in [] that will be replaced with a proper message from the challenge object. @@ -1177,56 +1177,56 @@ challenges: level-subtitle: '[friendlyName]' messages: - completed: '&2 Tu izpildīji uzdevumu [name] priekš [player]!' - already-completed: '&2 Šis uzdevums jau bija izpildīts!' - reset: '&2 Tu atjaunoji uzdevumu [name] priekš [player]!' - reset-all: '&2 Visi spēlētāja [player] uzdevumi ir atjaunoti!' - not-completed: '&2 Šis uzdevums vēl nav izpildīts!' - migrate-start: '&2 Sāk migrēt papildinājuma datus.' - migrate-end: '&2 Papildinājuma dati ir migrēti.' - migrate-not: '&2 Visi dati ir derīgi.' - start-downloading: '&5 Sāk lejupielādēt un importēt uzdevumus.' - you-completed-challenge: '&2 Tu izpildīji [value] &r&2 uzdevumu!' - you-repeated-challenge: '&2 Tu atkārtoti izpildīji [value] &r&2 uzdevumu!' - you-repeated-challenge-multiple: '&2 Tu atkārtoji [value] &r&2 uzdevumu [count] reizes!' - you-completed-level: '&2 Tu pabeidzi [value] &r&2 līmeni!' - name-has-completed-challenge: '&5 [name] pabeidza [value] &r&5 uzdevumu!' - name-has-completed-level: '&5 [name] pabeidza [value] &r&5 līmeni!' + completed: 'Tu izpildīji uzdevumu [name] priekš [player]!' + already-completed: 'Šis uzdevums jau bija izpildīts!' + reset: 'Tu atjaunoji uzdevumu [name] priekš [player]!' + reset-all: 'Visi spēlētāja [player] uzdevumi ir atjaunoti!' + not-completed: 'Šis uzdevums vēl nav izpildīts!' + migrate-start: 'Sāk migrēt papildinājuma datus.' + migrate-end: 'Papildinājuma dati ir migrēti.' + migrate-not: 'Visi dati ir derīgi.' + start-downloading: 'Sāk lejupielādēt un importēt uzdevumus.' + you-completed-challenge: 'Tu izpildīji [value] uzdevumu!' + you-repeated-challenge: 'Tu atkārtoti izpildīji [value] uzdevumu!' + you-repeated-challenge-multiple: 'Tu atkārtoji [value] uzdevumu [count] reizes!' + you-completed-level: 'Tu pabeidzi [value] līmeni!' + name-has-completed-challenge: '[name] pabeidza [value] uzdevumu!' + name-has-completed-level: '[name] pabeidza [value] līmeni!' load-skipping: '"[value]" jau eksistē - izlaiž' load-overwriting: 'Pārraksta "[value]"' load-add: 'Pievieno jaunu objektu: [value]' errors: - no-name: '&c Trūkst uzdevuma nosaukums' - unknown-challenge: '&c Nezināms uzdevums' + no-name: 'Trūkst uzdevuma nosaukums' + unknown-challenge: 'Nezināms uzdevums' not-valid-integer: |- - &c Ievadītais skaitlis "[value]" nau darīgs! Vērtībai jābūt no [min] līdz [max]. - not-deployed: '&c Uzdevums nav pieejams!' - not-on-island: '&c Tev jābūt uz salas, lai veiktu šo darbību!' - challenge-level-not-available: '&c Tu neesi atvēriz nepieciešamo līmeni, lai izpildītu šo uzdevumu.' - not-repeatable: '&c Šis uzdevums nav atkārtojams!' - wrong-environment: '&c Tu neesi pareizajā vidē!' - not-enough-items: '&c Tev nav pietiekoši daudz [items], lai pabeigtu uzdevumu!' - not-close-enough: '&c Tev tuvumā nav pietiekoši daudz nepieciešamie bloki vai radības.' - you-still-need: '&c Tev vēl nepieciešams [amount] x [item] lietas' - missing-addon: '&c Nav iespējams izpildīt šo uzdevumu: trūkst nepieciešamais papildinājums vai plugins.' - incorrect: '&c Nav iespējams izpildīt uzdevumu. Prasības nav korektas.' - not-enough-money: '&c Tev ir nepieciešama [value] nauda kontā, lai izpildītu uzdevumu!' - not-enough-experience: '&c Tev ir nepieciešama [value] pieredze, lai izpildītu uzdevumu!' - island-level: '&c Tavai salai jāsasniedz [number] līmeni, lai izpildītu uzdevumu!' - no-load: '&c Kļūda: Nevar ielādēt failu. [message]' - load-error: '&c Kļūda: Nevar ielādēt [value].' - no-rank: "&c Tavs ranks nav pietiekoši augsts, lai veiktu šo darbību." - cannot-remove-items: '&c Dažus priekšmetus neizdevās izņemt no tava inventāra!' - exist-challenges-or-levels: '&c Šajā pasaulē jau existē uzdevumi, nevar turpināt!' - no-challenges: '&c Uzdevumi nav izveidoti šajā pasaulē!' - no-challenges-admin: '&c Uzdevumi nav izveidoti šajā pasaulē! Izmanto &5 /[command], &c lai tos pievienotu!' - missing-arguments: '&c Pietrūkst komandas parametri.' - no-multiple-permission: "&c Tev nav atļaujas, lai pildītu uzdevumu vairākas reizes." - invalid-level: "&c Līmenis [level] satur nekorektus datus. Tas var tikt ielādēts nekorekti!" - invalid-challenge: "&c Uzdevums [challenge] satur nekorektus datus. Tas var tikt ielādēts nekorekti!" - no-library-entries: "&c Nevar atrast bibliotēkas ierakstus. Nav ko rādīt." - not-hooked: "&c Uzdevumu Papildinājumam neizdevās atrast Spēles Režīmu." - timeout: "&c Šim uzdevumam ir uzstādīts [timeout] taimauts starp izpildēm. Tev vēl ir jāgaida [wait-time], lai varētu pildīt uzdevumu." + Ievadītais skaitlis "[value]" nau darīgs! Vērtībai jābūt no [min] līdz [max]. + not-deployed: 'Uzdevums nav pieejams!' + not-on-island: 'Tev jābūt uz salas, lai veiktu šo darbību!' + challenge-level-not-available: 'Tu neesi atvēriz nepieciešamo līmeni, lai izpildītu šo uzdevumu.' + not-repeatable: 'Šis uzdevums nav atkārtojams!' + wrong-environment: 'Tu neesi pareizajā vidē!' + not-enough-items: 'Tev nav pietiekoši daudz [items], lai pabeigtu uzdevumu!' + not-close-enough: 'Tev tuvumā nav pietiekoši daudz nepieciešamie bloki vai radības.' + you-still-need: 'Tev vēl nepieciešams [amount] x [item] lietas' + missing-addon: 'Nav iespējams izpildīt šo uzdevumu: trūkst nepieciešamais papildinājums vai plugins.' + incorrect: 'Nav iespējams izpildīt uzdevumu. Prasības nav korektas.' + not-enough-money: 'Tev ir nepieciešama [value] nauda kontā, lai izpildītu uzdevumu!' + not-enough-experience: 'Tev ir nepieciešama [value] pieredze, lai izpildītu uzdevumu!' + island-level: 'Tavai salai jāsasniedz [number] līmeni, lai izpildītu uzdevumu!' + no-load: 'Kļūda: Nevar ielādēt failu. [message]' + load-error: 'Kļūda: Nevar ielādēt [value].' + no-rank: "Tavs ranks nav pietiekoši augsts, lai veiktu šo darbību." + cannot-remove-items: 'Dažus priekšmetus neizdevās izņemt no tava inventāra!' + exist-challenges-or-levels: 'Šajā pasaulē jau existē uzdevumi, nevar turpināt!' + no-challenges: 'Uzdevumi nav izveidoti šajā pasaulē!' + no-challenges-admin: 'Uzdevumi nav izveidoti šajā pasaulē! Izmanto /[command], lai tos pievienotu!' + missing-arguments: 'Pietrūkst komandas parametri.' + no-multiple-permission: "Tev nav atļaujas, lai pildītu uzdevumu vairākas reizes." + invalid-level: "Līmenis [level] satur nekorektus datus. Tas var tikt ielādēts nekorekti!" + invalid-challenge: "Uzdevums [challenge] satur nekorektus datus. Tas var tikt ielādēts nekorekti!" + no-library-entries: "Nevar atrast bibliotēkas ierakstus. Nav ko rādīt." + not-hooked: "Uzdevumu Papildinājumam neizdevās atrast Spēles Režīmu." + timeout: "Šim uzdevumam ir uzstādīts [timeout] taimauts starp izpildēm. Tev vēl ir jāgaida [wait-time], lai varētu pildīt uzdevumu." # # Showcase for manual material translation # materials: # # Names should be lowercase. @@ -1244,11 +1244,11 @@ challenges: # meta: # upgraded: "Uzlabots" # extended: "Pagarināts" -# potion-meta: "&e [type] [upgraded] [extended]" +# potion-meta: "[type] [upgraded] [extended]" # # Be aware, enchants are always listed below item in separate line. -# enchant-meta: " &7 - &e [type] [level]" -# skull-meta: ": &e [player-name]" -# book-meta: "&e [title] [author]" +# enchant-meta: " - [type] [level]" +# skull-meta: ": [player-name]" +# book-meta: "[title] [author]" # # Custom Enchantment Translation. # enchant: # menting: "Lāpīšana" @@ -1271,15 +1271,15 @@ protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5&o Pārslēdz kurš var - &5&o pildīt uzdevumus + Pārslēdz kurš var + pildīt uzdevumus name: Uzdevumu izpildes aizsardzība CHALLENGES_WORLD_PROTECTION: description: |- - &5&o Ļauj pārslēgt vai - &5&o spēlētājam ir nepieciešams - &5&o būt uz salais, - &5&o lai pildītu uzdevumus. + Ļauj pārslēgt vai + spēlētājam ir nepieciešams + būt uz salais, + lai pildītu uzdevumus. hint: Uzdevumus nevar pildīt ārpus salas name: Uzdevumu salas ierobežosāna version: 12 diff --git a/src/main/resources/locales/pl.yml b/src/main/resources/locales/pl.yml index 169cd1b6..22a278a9 100644 --- a/src/main/resources/locales/pl.yml +++ b/src/main/resources/locales/pl.yml @@ -29,743 +29,743 @@ challenges: parameters: " [ilość]" gui: titles: - player-gui: "&0&l Menu wyzwań" - gamemode-gui: "&0&l Wybierz tryb gry" - multiple-gui: "&0&l Ile razy?" - admin-gui: "&0&l Wyzwania - Menu administratora" - edit-challenge: "&0&l Edytuj [challenge]" - edit-level: "&0&l Edytuj [level]" - settings: "&0&l Ustawienia" - choose-challenge: "&0&l Wybierz wyzwanie" - choose-level: "&0&l Wybierz poziom" - choose-player: "&0&l Wybierz gracza" - library: "&0&l Biblioteka" - manage-blocks: "&0Zarządzaj blokami" - manage-entities: "&0&l Zarządzaj bytami" - type-selector: "&0&l Selektor typu wyzwania" - item-selector: "&0&l Selektor przedmiotu" - block-selector: "&0&l Selektor bloku" - entity-selector: "&0&l Selektor bytów" - challenge-selector: "&0&l Selektor wyzwań" - statistic-selector: "&0&l Selektor statystyk" - environment-selector: "&0&l Selektor środowiska" + player-gui: "Menu wyzwań" + gamemode-gui: "Wybierz tryb gry" + multiple-gui: "Ile razy?" + admin-gui: "Wyzwania - Menu administratora" + edit-challenge: "Edytuj [challenge]" + edit-level: "Edytuj [level]" + settings: "Ustawienia" + choose-challenge: "Wybierz wyzwanie" + choose-level: "Wybierz poziom" + choose-player: "Wybierz gracza" + library: "Biblioteka" + manage-blocks: "Zarządzaj blokami" + manage-entities: "Zarządzaj bytami" + type-selector: "Selektor typu wyzwania" + item-selector: "Selektor przedmiotu" + block-selector: "Selektor bloku" + entity-selector: "Selektor bytów" + challenge-selector: "Selektor wyzwań" + statistic-selector: "Selektor statystyk" + environment-selector: "Selektor środowiska" buttons: free-challenges: - name: "&f&l Wyzwania bez kategorii" + name: "Wyzwania bez kategorii" description: |- - &7 Wyświetla listę - &7 wyzwań, które nie - &7 mają kategorii + Wyświetla listę + wyzwań, które nie + mają kategorii return: - name: "&f&l Powrót" + name: "Powrót" description: |- - &7 Powrót do poprzedniego menu - &7 lub wyjście z GUI + Powrót do poprzedniego menu + lub wyjście z GUI previous: - name: "&f&l Poprzednia strona" - description: "&7 Przełącz na &e [number] &7 stronę" + name: "Poprzednia strona" + description: "Przełącz na [number] stronę" next: - name: "&f&l Następna strona" - description: "&7 Przełącz na &e [number] &7 stronę" + name: "Następna strona" + description: "Przełącz na [number] stronę" reduce: - name: "&f&l Zmniejsz" - description: "&7 Zmniejsz o &e [number]" + name: "Zmniejsz" + description: "Zmniejsz o [number]" increase: - name: "&f&l Zwiększ" - description: "&7 Zwiększenie o &e [number]" + name: "Zwiększ" + description: "Zwiększenie o [number]" accept: - name: "&f&l Ukończono" + name: "Ukończono" description: |- - &7 Ukończ wyzwanie &e [number] - &7 razy(-y) + Ukończ wyzwanie [number] + razy(-y) quit: - name: "&f&l Wyjdź" - description: "&7 Wyjdź z GUI." + name: "Wyjdź" + description: "Wyjdź z GUI." complete_user_challenges: - name: "&f&l Ukończ wyzwanie użytkownika" - description: "&7 Pozwala wybrać użytkownika i\n&7 zakończyć wyzwanie(-a) \n&7 + name: "Ukończ wyzwanie użytkownika" + description: "Pozwala wybrać użytkownika i\nzakończyć wyzwanie(-a) \n za niego" reset_user_challenges: - name: "&f&l Resetuj wyzwania użytkownika" + name: "Resetuj wyzwania użytkownika" description: |- - &7 Pozwala wybrać użytkownika i - &7 zresetować jego wyzwania + Pozwala wybrać użytkownika i + zresetować jego wyzwania add_challenge: - name: "&f&l Utwórz wyzwanie" + name: "Utwórz wyzwanie" description: |- - &7 Rozpoczyna proces dla - &7 tworzenie nowego wyzwania. + Rozpoczyna proces dla + tworzenie nowego wyzwania. add_level: - name: "&f&l Utwórz poziom" + name: "Utwórz poziom" description: |- - &7 Rozpoczyna proces - &7 tworzenia nowego poziomu. + Rozpoczyna proces + tworzenia nowego poziomu. edit_challenge: - name: "&f&l Edytuj wyzwanie" + name: "Edytuj wyzwanie" description: |- - &7 Pozwala wybrać i - &7 edytować wyzwanie. + Pozwala wybrać i + edytować wyzwanie. edit_level: - name: "&f&l Edytuj poziom" + name: "Edytuj poziom" description: |- - &7 Pozwala wybrać i - &7 edytować poziom. + Pozwala wybrać i + edytować poziom. delete_challenge: - name: "&f&l Usuń wyzwanie" + name: "Usuń wyzwanie" description: |- - &7 Pozwala wybrać i - &7 usunąć wyzwanie. + Pozwala wybrać i + usunąć wyzwanie. delete_level: - name: "&f&l Usuń poziom" + name: "Usuń poziom" description: |- - &7 Pozwala wybrać i - &7 usunąć poziom. + Pozwala wybrać i + usunąć poziom. edit_settings: - name: "&f&l Ustawienia" + name: "Ustawienia" description: |- - &7 Pozwala przeglądać i edytować - &7 ustawienia dodatków. + Pozwala przeglądać i edytować + ustawienia dodatków. complete_wipe: - name: "&f&l Całkowite czyszczenie" + name: "Całkowite czyszczenie" description: |- - &7 Całkowicie usuwa bazę - &7 zadań, w tym - &7 dane użytkownika. + Całkowicie usuwa bazę + zadań, w tym + dane użytkownika. challenge_wipe: - name: "&f&l Wyczyść wyzwanie" + name: "Wyczyść wyzwanie" description: |- - &7 Całkowicie usuwa wyzwania - &7 i poziomy z bazy danych. + Całkowicie usuwa wyzwania + i poziomy z bazy danych. user_wipe: - name: "&f&l Wyczyść użytkownika" + name: "Wyczyść użytkownika" description: |- - &7 Całkowicie czyści dane - &7 użytkownika z bazy danych. + Całkowicie czyści dane + użytkownika z bazy danych. library: - name: "&f&l Biblioteka" + name: "Biblioteka" description: |- - &7 Otwiera publiczną - &7 bibliotekę wyzwań. + Otwiera publiczną + bibliotekę wyzwań. import_database: - name: "&f&l Importuj bazę danych" + name: "Importuj bazę danych" description: |- - &7 Pozwala na import i eksport - &7 bazy wyzwań. + Pozwala na import i eksport + bazy wyzwań. import_template: - name: "&f&l Importuj szablon" - description: "&7 Pozwala zaimportować \n&7 szablon z wyzwaniami." + name: "Importuj szablon" + description: "Pozwala zaimportować \nszablon z wyzwaniami." export_challenges: - name: "&f&l Eksport wyzwań" + name: "Eksport wyzwań" description: |- - &7 Pozwala na eksport bazy danych - &7 do pliku lokalnego. + Pozwala na eksport bazy danych + do pliku lokalnego. properties: - name: "&f&l Właściwości" - description: "&7 Wyświetl wszystkie główne właściwości." + name: "Właściwości" + description: "Wyświetl wszystkie główne właściwości." requirements: - name: "&f&l Wymagania" - description: "&7 Wyświetla wymagania." + name: "Wymagania" + description: "Wyświetla wymagania." rewards: - name: "&f&l Nagrody" - description: "&7 Wyświetl właściwości nagród." + name: "Nagrody" + description: "Wyświetl właściwości nagród." deployed: - name: "&f&l Wdrożenie" + name: "Wdrożenie" description: |- - &7 Przełącz, jeśli wyzwanie jest - &7 skończone i użytkownicy - &7 mogą je wykonywać. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Przełącz, jeśli wyzwanie jest + skończone i użytkownicy + mogą je wykonywać. + enabled: "Włączone" + disabled: "Wyłączone" name: - name: "&f&l Nazwa" + name: "Nazwa" description: |- - &7 Pozwala na zmianę - &7 wyświetlanej nazwy. - value: "&7 Obecnie: &r [name]" + Pozwala na zmianę + wyświetlanej nazwy. + value: "Obecnie: [name]" remove_on_complete: - name: "&f&l Ukryj po zakończeniu" + name: "Ukryj po zakończeniu" description: |- - &7 Przełącz, jeśli wyzwanie - &7 powinno być ukryte przed - &7 graczem po zakończeniu. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Przełącz, jeśli wyzwanie + powinno być ukryte przed + graczem po zakończeniu. + enabled: "Włączone" + disabled: "Wyłączone" description: - name: "&f&l Opis" + name: "Opis" description: |- - &7 Szczegółowy opis - &7 wyzwania. Można użyć - &7 kolorów. - value: "&7 Aktualny opis:" + Szczegółowy opis + wyzwania. Można użyć + kolorów. + value: "Aktualny opis:" environment: - name: "&f&l Świat" - description: "&7 Pozwala ograniczyć, w \n&7 których światach wyzwanie\n&7 + name: "Świat" + description: "Pozwala ograniczyć, w \nktórych światach wyzwanie\n można ukończyć." - enabled: "&2" - disabled: "&c" + enabled: "" + disabled: "" order: - name: "&f&l Kolejność" - description: |- - &7 Pozwala zmienić kolejność - &7 obiektów. - &7 Obiekty o równych numerach - &7 zostaną ułożone zgodnie - &7 z ich systemowym ID - value: "&7 Bieżąca kolejność: &e [number]" + name: "Kolejność" + description: |- + Pozwala zmienić kolejność + obiektów. + Obiekty o równych numerach + zostaną ułożone zgodnie + z ich systemowym ID + value: "Bieżąca kolejność: [number]" icon: - name: "&f&l Ikona" + name: "Ikona" description: |- - &7 Pozwala zmienić ikonę - &7 dla tego wyzwania. + Pozwala zmienić ikonę + dla tego wyzwania. locked_icon: - name: "&f&l Zablokowana ikona" + name: "Zablokowana ikona" description: |- - &7 Pozwala zmienić ikonę - &7 zablokowanego poziomu. + Pozwala zmienić ikonę + zablokowanego poziomu. required_permissions: - name: "&f&l Wymagane uprawnienia" - description: |- - &7 Pozwala na zmianę - &7 wymaganej permisji - &7 do tego wyzwania. - &7 (aby zostało zakończone) - title: "&7 Uprawnienia:" - permission: " &8 - [permission]" - none: "&7 Permisje nie są ustawione." + name: "Wymagane uprawnienia" + description: |- + Pozwala na zmianę + wymaganej permisji + do tego wyzwania. + (aby zostało zakończone) + title: "Uprawnienia:" + permission: " - [permission]" + none: "Permisje nie są ustawione." remove_entities: - name: "&f&l Usuń elementy" - description: |- - &7 Pozwala na przełączanie: - &7 Wymagany byt zostanie - &7 usunięty ze świata po - &7 ukończeniu wyzwania. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Usuń elementy" + description: |- + Pozwala na przełączanie: + Wymagany byt zostanie + usunięty ze świata po + ukończeniu wyzwania. + enabled: "Włączone" + disabled: "Wyłączone" required_entities: - name: "&f&l Wymagane byty" - description: |- - &7 Pozwala na zmianę - &7 wymaganych bytów, - &7 aby zakończyć wyzwanie. - title: "&7 Byty:" - list: " &8 - [number] x [entity]" - none: "&7 Byty nie są dodawane." + name: "Wymagane byty" + description: |- + Pozwala na zmianę + wymaganych bytów, + aby zakończyć wyzwanie. + title: "Byty:" + list: " - [number] x [entity]" + none: "Byty nie są dodawane." remove_blocks: - name: "&f&l Usuń bloki" - description: |- - &7 Pozwala na przełączanie: - &7 Wymagane bloki zostaną - &7 usunięte z wyspy po - &7 zakończeniu wyzwania. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Usuń bloki" + description: |- + Pozwala na przełączanie: + Wymagane bloki zostaną + usunięte z wyspy po + zakończeniu wyzwania. + enabled: "Włączone" + disabled: "Wyłączone" required_blocks: - name: "&f&l Wymagane bloki" - description: "&7 Pozwala na zmianę \n&7 wymaganych bloków\n&7 do tego wyzwania." - title: "&7 Bloki:" - list: " &8 - [number] x [block]" - none: "&7 Bloki nie są dodane." + name: "Wymagane bloki" + description: "Pozwala na zmianę \nwymaganych bloków\ndo tego wyzwania." + title: "Bloki:" + list: " - [number] x [block]" + none: "Bloki nie są dodane." search_radius: - name: "&f&l Promień wyszukiwania" + name: "Promień wyszukiwania" description: |- - &7 Pozwala zmienić promień - &7 wokół gracza, gdzie bloki - &7 oraz byty zostaną wykryte. - value: "&7 Aktualna odległość: &e [number]" + Pozwala zmienić promień + wokół gracza, gdzie bloki + oraz byty zostaną wykryte. + value: "Aktualna odległość: [number]" remove_items: - name: "&f&l Usuń przedmioty" - description: |- - &7 Pozwala na przełączanie: - &7 Wymagane przedmioty - &7 zostaną usunięte z - &7 ekwipunku po zakończeniu - &7 wyzwania. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Usuń przedmioty" + description: |- + Pozwala na przełączanie: + Wymagane przedmioty + zostaną usunięte z + ekwipunku po zakończeniu + wyzwania. + enabled: "Włączone" + disabled: "Wyłączone" required_items: - name: "&f&l Wymagane przedmioty" - description: "&7 Pozwala na zmianę \n&7 wymaganych przedmiotów \n&7 do tego + name: "Wymagane przedmioty" + description: "Pozwala na zmianę \nwymaganych przedmiotów \ndo tego wyzwania." - title: "&7 Przedmioty:" - list: " &8 - [number] x [item]" - none: "&7 Przedmioty nie są dodane." + title: "Przedmioty:" + list: " - [number] x [item]" + none: "Przedmioty nie są dodane." add_ignored_meta: - name: "&f&l Dodaj ignorowane metadane" - description: "&7 Pozwala dodać, w których\n&7 przedmiotach należy \n&7 zignorować - wszelkie\n&7 metadane, które zostały\n&7 do nich przypisane." - title: "&7 Przedmioty:" - list: " &8 - [number] x [item]" - none: "&7 Przedmioty nie są dodane." + name: "Dodaj ignorowane metadane" + description: "Pozwala dodać, w których\nprzedmiotach należy \nzignorować + wszelkie\nmetadane, które zostały\ndo nich przypisane." + title: "Przedmioty:" + list: " - [number] x [item]" + none: "Przedmioty nie są dodane." remove_ignored_meta: - name: "&f&l Usuń ignorowanie metadanych" + name: "Usuń ignorowanie metadanych" description: |- - &7 Pozwala usunąć na której - &7 pozycji należy zignorować - &7 wszelkie metadane, które - &7 są do nich przypisany. + Pozwala usunąć na której + pozycji należy zignorować + wszelkie metadane, które + są do nich przypisany. remove_experience: - name: "&f&l Usuń doświadczenie" - description: |- - &7 Pozwala na przełączanie czy - &7 wymagane doświadczenie - &7 zostanie usunięte po oddaniu - &7 tego zadania - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Usuń doświadczenie" + description: |- + Pozwala na przełączanie czy + wymagane doświadczenie + zostanie usunięte po oddaniu + tego zadania + enabled: "Włączone" + disabled: "Wyłączone" required_experience: - name: "&f&l Wymagane doświadczenie" + name: "Wymagane doświadczenie" description: |- - &7 Pozwala na zmianę - &7 wymaganego doświadczenie dla - &7 gracza. - value: "&7 Aktualne doświadczenie: &e [number]" + Pozwala na zmianę + wymaganego doświadczenie dla + gracza. + value: "Aktualne doświadczenie: [number]" required_level: - name: "&f&l Wymagany poziom wyspy" + name: "Wymagany poziom wyspy" description: |- - &7 Pozwala na zmianę - &7 wymaganego poziomu wyspy - &7 do zadania. - value: "&7 Bieżący poziom: &e [number]" + Pozwala na zmianę + wymaganego poziomu wyspy + do zadania. + value: "Bieżący poziom: [number]" remove_money: - name: "&f&l Usuń pieniądze" - description: |- - &7 Pozwala na przełączanie czy - &7 wymagane pieniądze - &7 zostaną usunięte z konta - &7 gracza za to zadanie - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Usuń pieniądze" + description: |- + Pozwala na przełączanie czy + wymagane pieniądze + zostaną usunięte z konta + gracza za to zadanie + enabled: "Włączone" + disabled: "Wyłączone" required_money: - name: "&f&l Wymagane pieniądze" + name: "Wymagane pieniądze" description: |- - &7 Pozwala na zmianę czy zadania - &7 wymaga pieniędzy na koncie gracza - value: "&7 Aktualna wartość: &e [number]" + Pozwala na zmianę czy zadania + wymaga pieniędzy na koncie gracza + value: "Aktualna wartość: [number]" statistic: - name: "&f&l Statystyka" + name: "Statystyka" description: |- - &7 Pozwala na zmianę - &7 typ statystyki, który jest - &7 sprawdził się w tym wyzwaniu. - value: "&7 Aktualna wartość: &e [statistic]" + Pozwala na zmianę + typ statystyki, który jest + sprawdził się w tym wyzwaniu. + value: "Aktualna wartość: [statistic]" statistic_amount: - name: "&f&l Wartość docelowa" + name: "Wartość docelowa" description: |- - &7 Pozwala na zmianę - &7 wartości ze statystyk - &7 która musi zostać spełniona - value: "&7 Aktualna wartość: &e [number]" + Pozwala na zmianę + wartości ze statystyk + która musi zostać spełniona + value: "Aktualna wartość: [number]" remove_statistic: - name: "&f&l Zmniejsz statystykę" + name: "Zmniejsz statystykę" description: |- - &7 Pozwala na przełączanie czy po wykonaniu - &7 zadania statystyki zostaną usunięte - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Pozwala na przełączanie czy po wykonaniu + zadania statystyki zostaną usunięte + enabled: "Włączone" + disabled: "Wyłączone" statistic_blocks: - name: "&f&l Blok celu" + name: "Blok celu" description: |- - &7 Pozwala na zmianę - &7 statystyk bloku docelowego. - value: "&7 Bieżący blok: &e [block]" + Pozwala na zmianę + statystyk bloku docelowego. + value: "Bieżący blok: [block]" statistic_items: - name: "&f&l Element docelowy" + name: "Element docelowy" description: |- - &7 Pozwala na zmianę - &7 statystyczny przedmiot docelowy. - value: "&7 Bieżąca pozycja: &e [item]" + Pozwala na zmianę + statystyczny przedmiot docelowy. + value: "Bieżąca pozycja: [item]" statistic_entities: - name: "&f&l Jednostka docelowa" + name: "Jednostka docelowa" description: |- - &7 Pozwala na zmianę - &7 statystyczna jednostka docelowa. - value: "&7 Bieżąca jednostka: &e [entity]" + Pozwala na zmianę + statystyczna jednostka docelowa. + value: "Bieżąca jednostka: [entity]" reward_text: - name: "&f&l Tekst nagrody" + name: "Tekst nagrody" description: |- - &7 Konkretny tekst nagrody. - &7 Kody kolorów muszą być - &7 ustawione - value: "&7 Aktualny tekst:" + Konkretny tekst nagrody. + Kody kolorów muszą być + ustawione + value: "Aktualny tekst:" repeat_reward_text: - name: "&f&l Powtórz tekst nagrody" + name: "Powtórz tekst nagrody" description: |- - &7 Konkretny tekst nagrody powtórnej - &7 na wyzwanie. Kolor - Należy do niego zastosować kody &7. - value: "&7 Aktualny tekst:" + Konkretny tekst nagrody powtórnej + na wyzwanie. Kolor + Należy do niego zastosować kody . + value: "Aktualny tekst:" reward_items: - name: "&f&l przedmioty nagrody" + name: "przedmioty nagrody" description: |- - &7 Pozwala zmienić nagrodę - &7 pozycji. - title: "&7 Przedmioty:" - list: " &8 - [number] x [item]" - none: "&7 Pozycje nie są dodawane." + Pozwala zmienić nagrodę + pozycji. + title: "Przedmioty:" + list: " - [number] x [item]" + none: "Pozycje nie są dodawane." repeat_reward_items: - name: "&f&l Powtórz przedmioty z nagrodami" - description: |- - &7 Pozwala na zmianę powtarzania - &7 nagród za to - &7 wyzwanie. - title: "&7 Przedmioty:" - list: " &8 - [number] x [item]" - none: "&7 Pozycje nie są dodawane." + name: "Powtórz przedmioty z nagrodami" + description: |- + Pozwala na zmianę powtarzania + nagród za to + wyzwanie. + title: "Przedmioty:" + list: " - [number] x [item]" + none: "Pozycje nie są dodawane." reward_experience: - name: "&f&l Nagroda za doświadczenie" + name: "Nagroda za doświadczenie" description: |- - &7 Pozwala na zmianę - &7 nagrody doświadczenia za - &7 gracza. - value: "&7 Doświadczenie w postaci nagrody: &e [number]" + Pozwala na zmianę + nagrody doświadczenia za + gracza. + value: "Doświadczenie w postaci nagrody: [number]" repeat_reward_experience: - name: "&f&l Powtarzanie nagrody doświadczenie" - description: "&7 Pozwala na zmianę nagrody \n&7 z doświadczeniem\n&7 po ponownym + name: "Powtarzanie nagrody doświadczenie" + description: "Pozwala na zmianę nagrody \nz doświadczeniem\npo ponownym wykonaniu zadania" - value: "&7 Doświadczenie w postaci nagrody: &e [number]" + value: "Doświadczenie w postaci nagrody: [number]" reward_money: - name: "&f&l Nagroda za pieniądze" + name: "Nagroda za pieniądze" description: |- - &7 Pozwala na zmianę - &7 nagrody pieniężne. - value: "&7 Aktualna wartość: &e [number]" + Pozwala na zmianę + nagrody pieniężne. + value: "Aktualna wartość: [number]" repeat_reward_money: - name: "&f&l Powtarzaj nagrody pieniężne" - description: "&7 Pozwala na zmianę nagrody \n&7 pieniężnej\n&7 po ponownym + name: "Powtarzaj nagrody pieniężne" + description: "Pozwala na zmianę nagrody \npieniężnej\npo ponownym wykonaniu zadania" - value: "&7 Aktualna wartość: &e [number]" + value: "Aktualna wartość: [number]" reward_commands: - name: "&f&l Polecenia nagrody" - description: "&7 Konkretne polecenie nagrody:\n&8 Podpowiedź:\n&8 Komenda - nie wymaga '/'\n&8 jest on dodawany automatycznie.\n&8 Domyślnie polecenie - wykonuje serwer\n&8 jeżeli chcesz by polecenie zostało \n&8 wykonane przez - gracza przed\n&8 nim wpisz &e[SELF] &8\n&8 Wartość &e[player] &8użyta w - poleceniu\n&8 będzie zamieniona na nick gracza\n&8 który wykonał zadanie" - value: "&7 Bieżące polecenia:" + name: "Polecenia nagrody" + description: "Konkretne polecenie nagrody:\nPodpowiedź:\nKomenda + nie wymaga '/'\njest on dodawany automatycznie.\nDomyślnie polecenie + wykonuje serwer\njeżeli chcesz by polecenie zostało \nwykonane przez + gracza przed\nnim wpisz [SELF] \nWartość [player] użyta w + poleceniu\nbędzie zamieniona na nick gracza\nktóry wykonał zadanie" + value: "Bieżące polecenia:" repeat_reward_commands: - name: "&f&l Powtarzaj polecenia nagrody" - description: "&7 Konkretne polecenia wykonania\n&7nagrody za wyzwanie.\n&8 - Wskazówka:\n&8 Polecenie nie wymaga pisania najpierw `/`, \n&8 ponieważ - zostanie zastosowane automatycznie. \n&8 Domyślnie polecenia będą wykonywane - \n&8 przez serwer, jednak dodanie `[SELF]` na początku\n&8 pozwoli na wykonanie - polecenia przez gracza. \n&8 Obsługuje również jeden symbol zastępczy \n&8 - „[player]”, który zostanie zastąpiony nazwą \n&8 gracza, który ukończył + name: "Powtarzaj polecenia nagrody" + description: "Konkretne polecenia wykonania\nnagrody za wyzwanie.\n + Wskazówka:\nPolecenie nie wymaga pisania najpierw `/`, \nponieważ + zostanie zastosowane automatycznie. \nDomyślnie polecenia będą wykonywane + \nprzez serwer, jednak dodanie `[SELF]` na początku\npozwoli na wykonanie + polecenia przez gracza. \nObsługuje również jeden symbol zastępczy \n + „[player]”, który zostanie zastąpiony nazwą \ngracza, który ukończył wyzwanie." - value: "&7 Bieżące polecenia:" + value: "Bieżące polecenia:" repeatable: - name: "&f&l Powtarzalne" + name: "Powtarzalne" description: |- - &7 Pozwala na przełączanie, czy - &7 wyzwaniem jest - &7 powtarzalne. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Pozwala na przełączanie, czy + wyzwaniem jest + powtarzalne. + enabled: "Włączone" + disabled: "Wyłączone" repeat_count: - name: "&f&l Liczba powtórzeń" + name: "Liczba powtórzeń" description: |- - &7 Pozwala na zmianę - &7 liczby powtórzeń - &7 dla zadania. - value: "&7 Aktualna wartość: &e [number]" + Pozwala na zmianę + liczby powtórzeń + dla zadania. + value: "Aktualna wartość: [number]" cool_down: - name: "&f&l Opóźnienie" + name: "Opóźnienie" description: |- - &7 Ustaw cooldown pomiędzy - &7 wykonywaniem zadań - value: "&7 Aktualna wartość: &e [time]" + Ustaw cooldown pomiędzy + wykonywaniem zadań + value: "Aktualna wartość: [time]" challenges: - name: "&f&l Zadania" + name: "Zadania" description: |- - &7 Wyświetl przypisane wyzwania - &7 do poziomu. + Wyświetl przypisane wyzwania + do poziomu. waiver_amount: - name: "&f&l Kwota zwolnienia" + name: "Kwota zwolnienia" description: |- - &7 Pozwala ustawić numery - &7 zadań, które mogą - &7 pozostaw niedokończone dla - &7 odblokowanie następnego poziomu. - value: "&7 Aktualna wartość: &e [number]" + Pozwala ustawić numery + zadań, które mogą + pozostaw niedokończone dla + odblokowanie następnego poziomu. + value: "Aktualna wartość: [number]" add_challenges: - name: "&f&l Dodaj wyzwanie(-a)" + name: "Dodaj wyzwanie(-a)" description: |- - &7 Pozwala wybrać i - &7 dodaje wyzwania do - Poziom &7. + Pozwala wybrać i + dodaje wyzwania do + Poziom . remove_challenges: - name: "&f&l Usuń wyzwanie(-a)" + name: "Usuń wyzwanie(-a)" description: |- - &7 Pozwala wybrać i - &7 usunąć wyzwania z - &7 poziomu + Pozwala wybrać i + usunąć wyzwania z + poziomu reset_on_new: - name: "&f&l Resetuj przy nowym" - description: |- - &7 Pozwala na przełączanie, czy - &7 zadanie powinno być - &7 resetowane, gdy użytkownik odchodzi - &7 od wyspy lub tworzy nową - &7 wyspe. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Resetuj przy nowym" + description: |- + Pozwala na przełączanie, czy + zadanie powinno być + resetowane, gdy użytkownik odchodzi + od wyspy lub tworzy nową + wyspe. + enabled: "Włączone" + disabled: "Wyłączone" broadcast: - name: "&f&l Ogłoszenie\n" - description: |- - &7 Ogłasza jakie zadania zostały - &7 wykonane, bądź jaki poziom - &7 został osiągnięty - &7 (wiadomość do wszystkich) - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Ogłoszenie\n" + description: |- + Ogłasza jakie zadania zostały + wykonane, bądź jaki poziom + został osiągnięty + (wiadomość do wszystkich) + enabled: "Włączone" + disabled: "Wyłączone" remove_completed: - name: "&f&l Ukryj ukończone" + name: "Ukryj ukończone" description: |- - &7 Ukrywa ukończone zadania - &7 z menu. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Ukrywa ukończone zadania + z menu. + enabled: "Włączone" + disabled: "Wyłączone" glow_completed: - name: "&f&l Blask zakończony" + name: "Blask zakończony" description: |- - &7 Dodaje blask zaklęcia - &7 do ukończonych wyzwań. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Dodaje blask zaklęcia + do ukończonych wyzwań. + enabled: "Włączone" + disabled: "Wyłączone" store_history: - name: "&f&l Historia zadań" - description: |- - &7 Przechowuje historię wewnętrzną - &7 kiedy każde zakończone jest - &7 zakończone. - &7 Tylko obecnie widoczne - &7 w bazie danych. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Historia zadań" + description: |- + Przechowuje historię wewnętrzną + kiedy każde zakończone jest + zakończone. + Tylko obecnie widoczne + w bazie danych. + enabled: "Włączone" + disabled: "Wyłączone" data_per_island: - name: "&f&l Przypisz do wyspy" - description: "&7 Przypisuje wykonanie zadania \n&7 do wyspy.\n&7 Status zostanie - udostępniony\n&7 innym graczom w zespole" - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Przypisz do wyspy" + description: "Przypisuje wykonanie zadania \ndo wyspy.\nStatus zostanie + udostępniony\ninnym graczom w zespole" + enabled: "Włączone" + disabled: "Wyłączone" show_title: - name: "&f&l Pokaż tytuł" + name: "Pokaż tytuł" description: |- - &7 Pokazuje tytuł, gdy - &7 wyzwanie lub poziom - &7 jest zakończony. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + Pokazuje tytuł, gdy + wyzwanie lub poziom + jest zakończony. + enabled: "Włączone" + disabled: "Wyłączone" gamemode_gui: - name: "&f&l GUI wyboru trybu gry" - description: |- - &7 Włącza pojedynczy GUI, który - &7 jest dostępny przez /challenges - Polecenie &7. - &c Wymaga ponownego uruchomienia serwera. - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "GUI wyboru trybu gry" + description: |- + Włącza pojedynczy GUI, który + jest dostępny przez /challenges + Polecenie . + Wymaga ponownego uruchomienia serwera. + enabled: "Włączone" + disabled: "Wyłączone" locked_level_icon: - name: "&f&l Ikona domyślnego zablokowanego poziomu" + name: "Ikona domyślnego zablokowanego poziomu" description: |- - &7 Domyślna ikona dla wszystkich zablokowanych - &7 poziomów. Każdy poziom może się zmienić - &7 tę ikonę. + Domyślna ikona dla wszystkich zablokowanych + poziomów. Każdy poziom może się zmienić + tę ikonę. purge_history: - name: "&f&l Czas życia historii" - description: |- - &7 Liczba dni jak długo - &7 dane historii są przechowywane - &7 w danych użytkownika. - &7 0 oznacza, że dane będą - &7 zapisane zawsze - value: "&7 Aktualna wartość: &e [number]" + name: "Czas życia historii" + description: |- + Liczba dni jak długo + dane historii są przechowywane + w danych użytkownika. + 0 oznacza, że dane będą + zapisane zawsze + value: "Aktualna wartość: [number]" title_showtime: - name: "&f&l Czas ukazania tytułu" - description: "&7 Czas w tickach ( 20 = 1 sekunda ) \n&7 przez który będzie + name: "Czas ukazania tytułu" + description: "Czas w tickach ( 20 = 1 sekunda ) \nprzez który będzie wyświetlany czas" - value: "&7 Aktualna wartość: &e [number]" + value: "Aktualna wartość: [number]" active_world_list: - name: "&f&l Pokaż tylko aktywny świat" - description: |- - &7 If GameMode Selection GUI - &7 is enabled, this can switch - &7 if GUI shows GameMode selection - &7 or challenges for current world. - &c Wymaga ponownego uruchomienia serwera - enabled: "&2 Włączone" - disabled: "&c Wyłączone" + name: "Pokaż tylko aktywny świat" + description: |- + If GameMode Selection GUI + is enabled, this can switch + if GUI shows GameMode selection + or challenges for current world. + Wymaga ponownego uruchomienia serwera + enabled: "Włączone" + disabled: "Wyłączone" visibility_mode: - name: "&f&l Tryb widoczności" + name: "Tryb widoczności" description: |- - &7 Tryb widoczności dla - &7 zadań, które są - &7 ukryte. - enabled: "&2" - disabled: "&c" + Tryb widoczności dla + zadań, które są + ukryte. + enabled: "" + disabled: "" visible: Pokaż widoczne zadania hidden: Pokaż wszystkie zadania toggleable: Zezwalaj na przełączanie download: - name: "&f&l Pobierz biblioteki" + name: "Pobierz biblioteki" description: |- - &7 Dostępna jest ręczna aktualizacja - &7 biblioteki zadań - enabled: "&2 Przy wyczyszczeniu pamięci podręcznej" - disabled: "&c Bez czyszczenia pamięci podręcznej" + Dostępna jest ręczna aktualizacja + biblioteki zadań + enabled: "Przy wyczyszczeniu pamięci podręcznej" + disabled: "Bez czyszczenia pamięci podręcznej" player: - name: "&f&l [name]" - description: "&7 Właściciel wyspy: [owner]" - members: "&7 Członkowie wyspy:" - member: "&8 - [name]" - no-island: "&c Gracz nie posiada wyspy" + name: "[name]" + description: "Właściciel wyspy: [owner]" + members: "Członkowie wyspy:" + member: "- [name]" + no-island: "Gracz nie posiada wyspy" player_list: - name: "&f&l Wybierz listę użytkowników" + name: "Wybierz listę użytkowników" description: |- - &7 Wybierz listę użytkowników - Należy pokazać &7. - enabled: "&2" - disabled: "&c" + Wybierz listę użytkowników + Należy pokazać . + enabled: "" + disabled: "" online: Gracze online with_island: Gracze z wyspami in_world: Gracze na świecie add_block: - name: "&f&l Dodaj blok" + name: "Dodaj blok" description: |- - &7 Pozwala dodać nowy - &7 blok do listy. + Pozwala dodać nowy + blok do listy. remove_block: - name: "&f&l Usuń blok" + name: "Usuń blok" description: |- - &7 Pozwala na usunięcie - &7 wybranych bloków - &7 z list. - title: "&7 Wybrane materiały:" - material: "&8 - [material]" + Pozwala na usunięcie + wybranych bloków + z list. + title: "Wybrane materiały:" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 Identyfikator materiału: [id]" - selected: "&2 Wybrane" + name: "[material]" + description: "Identyfikator materiału: [id]" + selected: "Wybrane" add_entity: - name: "&f&l Dodaj jednostkę" + name: "Dodaj jednostkę" description: |- - &7 Pozwala dodać nowy - &7 podmiot do listy. + Pozwala dodać nowy + podmiot do listy. switch_entity: - name: "&f&l Zmień jajka" + name: "Zmień jajka" description: |- - &7 Pozwala na przełączenie z - &7 jajek do głów potworów. + Pozwala na przełączenie z + jajek do głów potworów. remove_entity: - name: "&f&l Usuń jednostkę" + name: "Usuń jednostkę" description: |- - &7 Pozwala na usunięcie - &7 wybranych podmiotów - &7 z listy. - title: "&7 Wybrane jednostki:" - entity: "&8 - [entity]" + Pozwala na usunięcie + wybranych podmiotów + z listy. + title: "Wybrane jednostki:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 Identyfikator jednostki: [id]" - selected: "&2 wybrane" + name: "[entity]" + description: "Identyfikator jednostki: [id]" + selected: "wybrane" inventory_type: - name: "&f&l Typ ekwipunku" + name: "Typ ekwipunku" description: |- - &7 Zadania sprawdza przedmioty - &7 w ekwipunku gracza + Zadania sprawdza przedmioty + w ekwipunku gracza island_type: - name: "&f&l Typ wyspy" + name: "Typ wyspy" description: |- - &7 Zadanie sprawdza dostępność - &7 bloków w okolicy gracza + Zadanie sprawdza dostępność + bloków w okolicy gracza other_type: - name: "&f&l Inny typ" + name: "Inny typ" description: |- - &7 Wyzwanie, które używa - &7 wtyczek lub dodatków, - &7 jak poziom i pieniądze. + Wyzwanie, które używa + wtyczek lub dodatków, + jak poziom i pieniądze. statistic_type: - name: "&f&l Typ statystyki" + name: "Typ statystyki" description: |- - &7 Wyzwanie sprawdzania - &7 dane statystyczne graczy. + Wyzwanie sprawdzania + dane statystyczne graczy. save: - name: "&f&l Zapisz" + name: "Zapisz" description: |- - &7 Zapisuje zmiany i - &7 zwraca. + Zapisuje zmiany i + zwraca. cancel: - name: "&f&l Anuluj" + name: "Anuluj" description: |- - &7 Odrzuca zmiany i - &7 zwraca. + Odrzuca zmiany i + zwraca. accept_selected: - name: "&f&l Akceptuj zaznaczone" + name: "Akceptuj zaznaczone" description: |- - &7 Zwraca wybrane elementy - &7 i otwiera poprzedni GUI. - title: "&7 Wybrane:" - element: "&8 - [element]" + Zwraca wybrane elementy + i otwiera poprzedni GUI. + title: "Wybrane:" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]\t\n" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Szukaj" + name: "Szukaj" description: |- - &7 Umożliwia wyszukiwanie i - &7 element z wejściem - &7 wartość tekstowa. - search: "&b Wartość: [value]" + Umożliwia wyszukiwanie i + element z wejściem + wartość tekstowa. + search: "Wartość: [value]" tips: - click-to-select: "&e Kliknij &7, aby wybrać." - click-to-choose: "&e Kliknij &7, aby wybrać." - click-to-complete: "&e Kliknij &7, aby zakończyć." - right-click-multiple-open: "&e Kliknij prawym przyciskiem myszy &7, aby wybrać + click-to-select: "Kliknij , aby wybrać." + click-to-choose: "Kliknij , aby wybrać." + click-to-complete: "Kliknij , aby zakończyć." + right-click-multiple-open: "Kliknij prawym przyciskiem myszy , aby wybrać liczbę ukończeń." - shift-left-click-to-complete-all: "&e Kliknij Shift &7, aby zakończyć wszystko." - left-click-to-accept: "&e Kliknij lewym przyciskiem &7, aby zakończyć." - right-click-to-write: "&e Kliknij prawym przyciskiem myszy &7, aby pisać." - click-to-reduce: "&e Kliknij &7, aby zmniejszyć." - click-to-increase: "&e Kliknij &7, aby zwiększyć." - click-to-return: "&e Kliknij &7, aby powrócić." - click-to-quit: "&e Kliknij &7, aby zakończyć." - click-to-wipe: "&e Kliknij &7, aby wyczyścić." - left-click-to-wipe: "&e Kliknij lewym przyciskiem &7, aby wyczyścić." - right-click-to-switch: "&e Kliknij prawym przyciskiem &7, aby przełączyć." - click-to-open: "&e Kliknij &7, aby otworzyć." - click-to-export: "&e Kliknij &7, aby wyeksportować." - click-to-create: "&e Kliknij &7, aby utworzyć." - left-click-to-open: "&e Kliknij lewym przyciskiem &7, aby otworzyć." - right-click-to-reset-all: "&e Kliknij prawym przyciskiem myszy &7, aby wyczyścić + shift-left-click-to-complete-all: "Kliknij Shift , aby zakończyć wszystko." + left-click-to-accept: "Kliknij lewym przyciskiem , aby zakończyć." + right-click-to-write: "Kliknij prawym przyciskiem myszy , aby pisać." + click-to-reduce: "Kliknij , aby zmniejszyć." + click-to-increase: "Kliknij , aby zwiększyć." + click-to-return: "Kliknij , aby powrócić." + click-to-quit: "Kliknij , aby zakończyć." + click-to-wipe: "Kliknij , aby wyczyścić." + left-click-to-wipe: "Kliknij lewym przyciskiem , aby wyczyścić." + right-click-to-switch: "Kliknij prawym przyciskiem , aby przełączyć." + click-to-open: "Kliknij , aby otworzyć." + click-to-export: "Kliknij , aby wyeksportować." + click-to-create: "Kliknij , aby utworzyć." + left-click-to-open: "Kliknij lewym przyciskiem , aby otworzyć." + right-click-to-reset-all: "Kliknij prawym przyciskiem myszy , aby wyczyścić wszystko." - click-to-toggle: "&e Kliknij &7, aby przełączyć." - click-to-change: "&e Kliknij &7, aby zmienić." - shift-click-to-reset: "&e Shift Kliknij &7, aby zresetować." - click-to-add: "&e Kliknij &7, aby dodać." - click-to-remove: "&e Kliknij &7, aby usunąć." - left-click-to-cycle: "&e Kliknij lewym przyciskiem &7, aby przejść w dół." - right-click-to-cycle: "&e Kliknij prawym przyciskiem myszy &7, aby przejść w + click-to-toggle: "Kliknij , aby przełączyć." + click-to-change: "Kliknij , aby zmienić." + shift-click-to-reset: "Shift Kliknij , aby zresetować." + click-to-add: "Kliknij , aby dodać." + click-to-remove: "Kliknij , aby usunąć." + left-click-to-cycle: "Kliknij lewym przyciskiem , aby przejść w dół." + right-click-to-cycle: "Kliknij prawym przyciskiem myszy , aby przejść w górę." - click-to-edit: "&e Kliknij &7, aby edytować." - left-click-to-download: "&e Kliknij lewym przyciskiem &7, aby pobrać." - right-click-to-toggle: "&e Kliknij prawym przyciskiem &7, aby przełączyć." - click-to-install: "&e Kliknij &7, aby zainstalować." - click-to-reset-all: "&e Kliknij &7, aby zresetować wszystko." - right-click-to-select: "&e Kliknij prawym przyciskiem &7, aby wybrać." - right-click-to-deselect: "&e Kliknij prawym przyciskiem myszy &7, aby odznaczyć." - left-click-to-choose: "&e Kliknij lewym przyciskiem &7, aby wybrać." - click-to-cancel: "&e Kliknij &7, aby anulować." - click-to-save: "&e Kliknij &7, aby zapisać." - click-to-deselect: "&e Kliknij &7, aby odznaczyć." + click-to-edit: "Kliknij , aby edytować." + left-click-to-download: "Kliknij lewym przyciskiem , aby pobrać." + right-click-to-toggle: "Kliknij prawym przyciskiem , aby przełączyć." + click-to-install: "Kliknij , aby zainstalować." + click-to-reset-all: "Kliknij , aby zresetować wszystko." + right-click-to-select: "Kliknij prawym przyciskiem , aby wybrać." + right-click-to-deselect: "Kliknij prawym przyciskiem myszy , aby odznaczyć." + left-click-to-choose: "Kliknij lewym przyciskiem , aby wybrać." + click-to-cancel: "Kliknij , aby anulować." + click-to-save: "Kliknij , aby zapisać." + click-to-deselect: "Kliknij , aby odznaczyć." click-on-item: |- - &e Kliknij &7 na elemencie w - &7 twój ekwipunek. - left-click-to-edit: "&e Kliknij lewym przyciskiem &7, aby edytować." - right-click-to-clear: "&e Kliknij prawym przyciskiem &7, aby wyczyścić." - click-to-previous: "&e Kliknij &7, aby wyświetlić poprzednią stronę." - click-to-next: "&e Kliknij &7, aby wyświetlić następną stronę." + Kliknij na elemencie w + twój ekwipunek. + left-click-to-edit: "Kliknij lewym przyciskiem , aby edytować." + right-click-to-clear: "Kliknij prawym przyciskiem , aby wyczyścić." + click-to-previous: "Kliknij , aby wyświetlić poprzednią stronę." + click-to-next: "Kliknij , aby wyświetlić następną stronę." descriptions: challenge: lore: |- @@ -775,17 +775,17 @@ challenges: [requirements] [rewards] status: - completed: "&2&l Zakończono" - completed-times: "&2 Ukończono &7&l [number] &r&2 raz(-y)" - completed-times-of: "&2 Zakończono &7&l [number] &r&2 z &7&l [max] &r&2 + completed: "Zakończono" + completed-times: "Ukończono [number] raz(-y)" + completed-times-of: "Zakończono [number] z [max] razy" - completed-times-reached: "&2&l Ukończono wszystkie &7 [max] &2 razy" + completed-times-reached: "Ukończono wszystkie [max] razy" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Ochłodzenie: &r&7 [time]" - wait-time: "&c&l Dostępne po: &r&c [time]" + timeout: "Ochłodzenie: [time]" + wait-time: "Dostępne po: [time]" in-days: "[number] dni" in-hours: "[number] h" in-minutes: "[number] min" @@ -795,12 +795,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Ograniczone do [environment]" - environment-title: "&7 Ograniczone do:" - environment-list: "&7 - &e [environment]\t\n" - permission-single: "&c Wymaga uprawnień [permission]" - permissions-title: "&c Wymaga uprawnień:" - permissions-list: " &c - [permission]" + environment-single: "Ograniczone do [environment]" + environment-title: "Ograniczone do:" + environment-list: "- [environment]\t\n" + permission-single: "Wymaga uprawnień [permission]" + permissions-title: "Wymaga uprawnień:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -808,23 +808,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Wymagane bloki:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Wymagane jednostki:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 Nie dalej niż &e [number] &7 metrów" - warning-block: "&e Bloki zostaną &c usunięte" - warning-entity: "&e Jednostki zostaną &c usunięte" + blocks-title: "Wymagane bloki:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Wymagane jednostki:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "Nie dalej niż [number] metrów" + warning-block: "Bloki zostaną usunięte" + warning-entity: "Jednostki zostaną usunięte" inventory: lore: |- [items] [warning] - item-title: "&7&l Wymagane pozycje:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e Przedmiot(y) zostaną &c usunięte" + item-title: "Wymagane pozycje:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "Przedmiot(y) zostaną usunięte" other: lore: |- [experience] @@ -832,34 +832,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Wymagane doświadczenie: &r&e [number]" - experience-warning: "&e Doświadczenie zostanie &c usunięte" - money: "&7&l Wymagane pieniądze: &r&e [number]" - money-warning: "&e Pieniądze zostaną &c usunięte" - level: "&7&l Wymagany poziom wyspy: &r&e [number]" + experience: "Wymagane doświadczenie: [number]" + experience-warning: "Doświadczenie zostanie usunięte" + money: "Wymagane pieniądze: [number]" + money-warning: "Pieniądze zostaną usunięte" + level: "Wymagany poziom wyspy: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Dane statystyczne zostaną &c zredukowane" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "Dane statystyczne zostaną zredukowane" rewards: lore: |- - &7&l Nagrody: + Nagrody: [text] [items] [experience] [money] [commands] - item-title: "&7 Przedmioty:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Doświadczenie: &r&e [number]" - money: "&7 Pieniądze: &r&e [number]" - commands-title: "&7 Polecenia:" - command: " &7 - &e [command]" + item-title: "Przedmioty:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Doświadczenie: [number]" + money: "Pieniądze: [number]" + commands-title: "Polecenia:" + command: " - [command]" level: lore: |- [text] @@ -867,185 +867,185 @@ challenges: [waiver] [rewards] status: - completed: "&2&l Zakończono" + completed: "Zakończono" completed-challenges-of: |- - &2 Ukończono&7&l [number] &r&2 z - &7&l [max] &r&2 zadań. - locked: "&c&l Zablokowane" + Ukończono[number] z + [max] zadań. + locked: "Zablokowane" missing-challenges: |- - &7 [number] musi być więcej wyzwań - &7 ukończone, aby odblokować ten poziom. + [number] musi być więcej wyzwań + ukończone, aby odblokować ten poziom. waiver: |- - &7&l [number] wyzwanie(-a) &r&7 może być - &7 pominięto, aby odblokować następny poziom. + [number] wyzwanie(-a) może być + pominięto, aby odblokować następny poziom. rewards: lore: |- - &7&l Nagrody: + Nagrody: [text] [items] [experience] [money] [commands] - item-title: "&7 Przedmioty:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Doświadczenie: &r&e [number]" - money: "&7 Pieniądze: &r&e [number]" - commands-title: "&7 Polecenia:" - command: " &7 - &e [command]" + item-title: "Przedmioty:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Doświadczenie: [number]" + money: "Pieniądze: [number]" + commands-title: "Polecenia:" + command: " - [command]" library: - author: "&7 autor: &e [author]" - version: "&7 Wykonane z wyzwaniami &e [version]" - lang: "&7 Język: &e [lang]" - gamemode: "&7 Główny dla &e [gamemode]" + author: "autor: [author]" + version: "Wykonane z wyzwaniami [version]" + lang: "Język: [lang]" + gamemode: "Główny dla [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: true, on, yes, confirm, y, valid, correct, prawda, wł., tak, potwierdź, y, poprawny, poprawny deny-string: fałszywe, wyłączone, nie, zaprzeczyć, n, nieprawidłowe, niepoprawne, false, off, no, deny, n, invalid, incorrect cancel-string: anuluj exit-string: anuluj, wyjdz, wyjdź, cancel, exit, quit - cancelled: "&c Rozmowa została anulowana!" - input-number: "&e Proszę podać numer na czacie." - input-seconds: "&e Wprowadź sekundy na czacie." - numeric-only: "&c Podana [value] nie jest liczbą!" - not-valid-value: "&c Podana liczba [value] jest nieprawidłowa. Musi być większy + cancelled: "Rozmowa została anulowana!" + input-number: "Proszę podać numer na czacie." + input-seconds: "Wprowadź sekundy na czacie." + numeric-only: "Podana [value] nie jest liczbą!" + not-valid-value: "Podana liczba [value] jest nieprawidłowa. Musi być większy niż [min] i mniejszy niż [max]!" - user-data-removed: "&a Wszystkie dane użytkownika dla trybu [gamemode] są usuwane + user-data-removed: "Wszystkie dane użytkownika dla trybu [gamemode] są usuwane z bazy danych." - confirm-user-data-deletion: "&e Potwierdź, że chcesz wyczyścić bazę danych użytkowników + confirm-user-data-deletion: "Potwierdź, że chcesz wyczyścić bazę danych użytkowników dla [gamemode]." - challenge-data-removed: "&a Wszystkie dane wyzwań dla trybu [gamemode] zostaną + challenge-data-removed: "Wszystkie dane wyzwań dla trybu [gamemode] zostaną usunięte z bazy danych." - confirm-challenge-data-deletion: "&e Potwierdź, że chcesz wyczyścić bazę danych + confirm-challenge-data-deletion: "Potwierdź, że chcesz wyczyścić bazę danych wyzwań dla [gamemode]." - all-data-removed: "&a Wszystkie dane dodatków dla [gamemode] są usuwane z bazy + all-data-removed: "Wszystkie dane dodatków dla [gamemode] są usuwane z bazy danych." - confirm-all-data-deletion: "&e Potwierdź, że chcesz wyczyścić dane dodatków dla + confirm-all-data-deletion: "Potwierdź, że chcesz wyczyścić dane dodatków dla [gamemode]." - write-name: "&e Proszę wpisać imię na czacie." - new-object-created: "&a Nowy obiekt dla [gamemode] został utworzony." - object-already-exists: "&c Obiekt &7 [id] &c już istnieje. Wybierz inną nazwę." - invalid-challenge: "&c Wyzwanie [challenge] zawiera nieprawidłowe dane. Nie można + write-name: "Proszę wpisać imię na czacie." + new-object-created: "Nowy obiekt dla [gamemode] został utworzony." + object-already-exists: "Obiekt [id] już istnieje. Wybierz inną nazwę." + invalid-challenge: "Wyzwanie [challenge] zawiera nieprawidłowe dane. Nie można go wdrożyć!" - name-changed: "&a Sukces, nazwa została zaktualizowana." - write-description: "&e Wprowadź nowy opis na czacie i 'wyjdź' w linii, aby zakończyć." - description-changed: "&a Sukces, opis został zaktualizowany." - write-permissions: "&e Wprowadź wymagane uprawnienia, po jednym dla każdej linii + name-changed: "Sukces, nazwa została zaktualizowana." + write-description: "Wprowadź nowy opis na czacie i 'wyjdź' w linii, aby zakończyć." + description-changed: "Sukces, opis został zaktualizowany." + write-permissions: "Wprowadź wymagane uprawnienia, po jednym dla każdej linii na czacie i 'wyjdź' w samej linii, aby zakończyć." - permissions-changed: "&a Udało się, zaktualizowano uprawnienia do wyzwań." - write-reward-text: "&e Aby zakończyć, wprowadź nowy tekst nagrody na czacie i + permissions-changed: "Udało się, zaktualizowano uprawnienia do wyzwań." + write-reward-text: "Aby zakończyć, wprowadź nowy tekst nagrody na czacie i 'wyjdź' w osobnej wiadomości." - reward-text-changed: "&a Sukces, tekst nagrody został zaktualizowany." - write-repeat-reward-text: "&e Proszę wprowadzić nowy tekst powtórnej nagrody na + reward-text-changed: "Sukces, tekst nagrody został zaktualizowany." + write-repeat-reward-text: "Proszę wprowadzić nowy tekst powtórnej nagrody na czacie i „wyjdź” w osobnym wierszu, aby zakończyć." - repeat-reward-text-changed: "&a Sukces, tekst powtórnej nagrody został zaktualizowany." - write-reward-commands: "&e Proszę wprowadzić nową komendę nagrody w każdej linii + repeat-reward-text-changed: "Sukces, tekst powtórnej nagrody został zaktualizowany." + write-reward-commands: "Proszę wprowadzić nową komendę nagrody w każdej linii na czacie i 'quit' w samej linii, aby zakończyć." - reward-commands-changed: "&a Sukces, komendy nagrody zostały zaktualizowane." - write-repeat-reward-commands: "&e Proszę wpisać nowe polecenie powtórzenia nagrody + reward-commands-changed: "Sukces, komendy nagrody zostały zaktualizowane." + write-repeat-reward-commands: "Proszę wpisać nowe polecenie powtórzenia nagrody w każdej linii na czacie i „wyjdź” w samej linii, aby zakończyć." - repeat-reward-commands-changed: "&a Sukces, zaktualizowano polecenia powtórzenia + repeat-reward-commands-changed: "Sukces, zaktualizowano polecenia powtórzenia nagrody." - challenge-removed: "&a Zadanie [challenge] dla [gamemode] zostało usunięte z bazy + challenge-removed: "Zadanie [challenge] dla [gamemode] zostało usunięte z bazy danych." - confirm-challenge-deletion: "&e Potwierdź, że chcesz usunąć [challenge] dla [gamemode] + confirm-challenge-deletion: "Potwierdź, że chcesz usunąć [challenge] dla [gamemode] z bazy danych." - level-removed: "&a Rozdział [level] dla [gamemode] został usunięty z bazy danych." - confirm-level-deletion: "&e Proszę potwierdzić, że chcesz usunąć [level] dla [gamemode] + level-removed: "Rozdział [level] dla [gamemode] został usunięty z bazy danych." + confirm-level-deletion: "Proszę potwierdzić, że chcesz usunąć [level] dla [gamemode] z bazy danych." - start-downloading: "&a Rozpoczęcie pobierania i importowania biblioteki wyzwań." + start-downloading: "Rozpoczęcie pobierania i importowania biblioteki wyzwań." written-text: "& Tekst wejściowy:" - confirm-data-replacement: "&e Potwierdź, że chcesz zastąpić obecne wyzwania nowym." - new-challenges-imported: "&a Sukces, zaimportowano nowe wyzwania dla trybu [gamemode]." - exported-file-name: "&e Proszę podać nazwę pliku dla eksportowanego pliku bazy + confirm-data-replacement: "Potwierdź, że chcesz zastąpić obecne wyzwania nowym." + new-challenges-imported: "Sukces, zaimportowano nowe wyzwania dla trybu [gamemode]." + exported-file-name: "Proszę podać nazwę pliku dla eksportowanego pliku bazy danych. (napisz „anuluj”, aby wyjść)" - database-export-completed: "&a Sukces, eksport bazy danych dla [world] został + database-export-completed: "Sukces, eksport bazy danych dla [world] został zakończony. Wygenerowano plik [file]." - file-name-exist: "&c Plik o nazwie „[id]” istnieje. Nie można nadpisać." - write-search: "&e Proszę wpisać wartość wyszukiwania. (napisz „anuluj”, aby wyjść)" - search-updated: "&a Zaktualizowano wartość wyszukiwania." + file-name-exist: "Plik o nazwie „[id]” istnieje. Nie można nadpisać." + write-search: "Proszę wpisać wartość wyszukiwania. (napisz „anuluj”, aby wyjść)" + search-updated: "Zaktualizowano wartość wyszukiwania." titles: challenge-title: Zakończone sukcesem challenge-subtitle: "[friendlyName]" level-title: Zakończone sukcesem level-subtitle: "[friendlyName]" messages: - completed: "&2 Ukończyłeś wyzwanie [name] dla [player]!" - already-completed: "&2 To wyzwanie zostało już ukończone!" - reset: "&2 Zresetowałeś wyzwanie [name] dla [player]!" - reset-all: "&2 Wszystkie wyzwania [player] zostały zresetowane!" - not-completed: "&2 To wyzwanie nie zostało jeszcze ukończone!" - migrate-start: "&2 Rozpocznij migrację danych dodatkowych wyzwań." - migrate-end: "&2 Zaktualizowano dane dodatku Challenges do nowego formatu." - migrate-not: "&2 Wszystkie dane są prawidłowe." - start-downloading: "&5 Rozpoczęcie pobierania i importowania Biblioteki wyzwań." - you-completed-challenge: "&2 Ukończono [value] &r&2 wyzwanie!" - you-repeated-challenge: "&2 Powtórzyłeś [value] &r&2 wyzwanie!" - you-repeated-challenge-multiple: "&2 Powtórzyłeś [value] &r&2 challenge [count] + completed: "Ukończyłeś wyzwanie [name] dla [player]!" + already-completed: "To wyzwanie zostało już ukończone!" + reset: "Zresetowałeś wyzwanie [name] dla [player]!" + reset-all: "Wszystkie wyzwania [player] zostały zresetowane!" + not-completed: "To wyzwanie nie zostało jeszcze ukończone!" + migrate-start: "Rozpocznij migrację danych dodatkowych wyzwań." + migrate-end: "Zaktualizowano dane dodatku Challenges do nowego formatu." + migrate-not: "Wszystkie dane są prawidłowe." + start-downloading: "Rozpoczęcie pobierania i importowania Biblioteki wyzwań." + you-completed-challenge: "Ukończono [value] wyzwanie!" + you-repeated-challenge: "Powtórzyłeś [value] wyzwanie!" + you-repeated-challenge-multiple: " Powtórzyłeś [value] challenge [count] razy!" - you-completed-level: "&2 Ukończono [value] &r&2 poziom!" - name-has-completed-challenge: "&5 [name] zakończyła [value] &r&5 wyzwanie!" - name-has-completed-level: "&5 [name] uzupełniła [value] &r&5 poziom!" + you-completed-level: "Ukończono [value] poziom!" + name-has-completed-challenge: " [name] zakończyła [value] wyzwanie!" + name-has-completed-level: " [name] uzupełniła [value] poziom!" load-skipping: '"[value]" Istnieje - pominięto' load-overwriting: Nadpisywanie „[value]” load-add: 'Dodanie nowego obiektu: [value]' errors: - no-name: "&cNieprawidłowa nazwa wyzwania" - unknown-challenge: "&cNieznane wyzwanie" + no-name: "Nieprawidłowa nazwa wyzwania" + unknown-challenge: "Nieznane wyzwanie" not-valid-integer: |- - &c Podana liczba całkowita "[value]" jest nieprawidłowa! + Podana liczba całkowita "[value]" jest nieprawidłowa! Wartość powinna mieścić się w zakresie od [min] do [max]. - not-deployed: "&c Challenge nie został wdrożony!" - not-on-island: "&cMusisz być na swojej wyspie by to zrobic!" - challenge-level-not-available: "&c Nie odblokowałeś wymaganego poziomu, aby ukończyć + not-deployed: "Challenge nie został wdrożony!" + not-on-island: "Musisz być na swojej wyspie by to zrobic!" + challenge-level-not-available: " Nie odblokowałeś wymaganego poziomu, aby ukończyć to wyzwanie." - not-repeatable: "&cTo wyzwanie możesz wykonać tylko raz!" - wrong-environment: "&c Jesteś w złym środowisku!" - not-enough-items: "&cNie posiadasz wystarczająco [items] do zakończenia tego wyzwania!" - not-close-enough: "&c Musisz stać [number] kratek od wymaganych bloków" - you-still-need: "&cPotrzebujesz nadal [amount] x [item]" - missing-addon: "&c Nie można ukończyć wyzwania: brakuje wymaganego dodatku lub + not-repeatable: "To wyzwanie możesz wykonać tylko raz!" + wrong-environment: "Jesteś w złym środowisku!" + not-enough-items: "Nie posiadasz wystarczająco [items] do zakończenia tego wyzwania!" + not-close-enough: "Musisz stać [number] kratek od wymaganych bloków" + you-still-need: "Potrzebujesz nadal [amount] x [item]" + missing-addon: "Nie można ukończyć wyzwania: brakuje wymaganego dodatku lub wtyczki." - incorrect: "&c Nie można ukończyć wyzwania: Wymagania są niepoprawne." - not-enough-money: "&cAby ukończyć wyzwanie, musisz mieć [value] na swoim koncie." - not-enough-experience: "&c Konieczne jest posiadanie [value] EXP, aby ukończyć + incorrect: "Nie można ukończyć wyzwania: Wymagania są niepoprawne." + not-enough-money: "Aby ukończyć wyzwanie, musisz mieć [value] na swoim koncie." + not-enough-experience: " Konieczne jest posiadanie [value] EXP, aby ukończyć to wyzwanie." - island-level: "&c Ta wyspa musi mieć poziom [count] lub wyższy, aby ukończyć to + island-level: "Ta wyspa musi mieć poziom [count] lub wyższy, aby ukończyć to wyzwanie!" - no-load: "&cBłąd: Nie można załadować challenges.yml. Błąd: [message]" - load-error: "&c Error: Nie można załadować [value]." - no-rank: "&c Nie masz wystarczająco wysokiej rangi, aby to zrobić." - cannot-remove-items: "&c Niektórych przedmiotów nie można usunąć z ekwipunku!" - exist-challenges-or-levels: "&c Zadania już istnieją w twoim świecie. Nie można + no-load: "Błąd: Nie można załadować challenges.yml. Błąd: [message]" + load-error: "Error: Nie można załadować [value]." + no-rank: " Nie masz wystarczająco wysokiej rangi, aby to zrobić." + cannot-remove-items: " Niektórych przedmiotów nie można usunąć z ekwipunku!" + exist-challenges-or-levels: "Zadania już istnieją w twoim świecie. Nie można kontynuować!" - no-challenges: "&c Zadania nie są jeszcze zaimplementowane na tym świecie!" - no-challenges-admin: "&c Zadania nie są jeszcze zaimplementowane na tym świecie! - Użyj &5 /[command] i &c, aby je dodać!" - missing-arguments: "&c Poleceniu brakuje argumentów." - no-multiple-permission: "&c Nie masz uprawnień do wielokrotnego wykonania tego + no-challenges: "Zadania nie są jeszcze zaimplementowane na tym świecie!" + no-challenges-admin: "Zadania nie są jeszcze zaimplementowane na tym świecie! + Użyj /[command] i , aby je dodać!" + missing-arguments: "Poleceniu brakuje argumentów." + no-multiple-permission: " Nie masz uprawnień do wielokrotnego wykonania tego zadania" - invalid-level: "&c Poziom [level] zawiera nieprawidłowe dane. Nie zostanie załadowany + invalid-level: "Poziom [level] zawiera nieprawidłowe dane. Nie zostanie załadowany z bazy danych!" - invalid-challenge: "&c Wyzwanie [challenge] zawiera nieprawidłowe dane. Nie zostanie + invalid-challenge: "Wyzwanie [challenge] zawiera nieprawidłowe dane. Nie zostanie załadowany z bazy danych!" - no-library-entries: "&c Nie można znaleźć żadnych wpisów biblioteki. Nic do pokazania." - not-hooked: "&c Dodatek z zadaniami nie mógł znaleźć żadnego trybu gry." - timeout: "&c To zadanie wymaga odczekania [timeout] między ukończeniami. Musisz + no-library-entries: "Nie można znaleźć żadnych wpisów biblioteki. Nic do pokazania." + not-hooked: "Dodatek z zadaniami nie mógł znaleźć żadnego trybu gry." + timeout: "To zadanie wymaga odczekania [timeout] między ukończeniami. Musisz poczekać [wait-time], aż ukończysz go ponownie." protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5&o Przełącz kto może - &5&o wykonywać wyzwania + Przełącz kto może + wykonywać wyzwania name: Ochrona wyzwań CHALLENGES_WORLD_PROTECTION: description: |- - &5&o Przełącz wymaganie - &5&o bycia na swojej wyspie - &5&o by ukończyć zadanie + Przełącz wymaganie + bycia na swojej wyspie + by ukończyć zadanie name: Wyzwania ograniczają wyspe hint: Nie można wykonywać wyzwań poza wyspą version: 12 diff --git a/src/main/resources/locales/pt.yml b/src/main/resources/locales/pt.yml index 3d40042f..43b233d1 100644 --- a/src/main/resources/locales/pt.yml +++ b/src/main/resources/locales/pt.yml @@ -31,793 +31,793 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0&lMenu de Desafios" - gamemode-gui: "&0&lSeleccionar GameMode" - multiple-gui: "&0&l Quantas vezes?" - admin-gui: "&0&l Menu Admin de Desafios" - edit-challenge: "&0&l Editar [desafio]" - edit-level: "&0&l Editar [level]" - settings: "&0&l Configurações" - choose-challenge: "&0&l Escolher Desafio" - choose-level: "&0&l Escolher Nível" - choose-player: "&0&l Escolher jogador" - library: "&0&l Biblioteca" - manage-blocks: "&0&l Gerenciar Blocos" - manage-entities: "&0&l Gerenciar Entidades" - type-selector: "&0&l Seletor de tipo de desafio" - item-selector: "&0&l Seletor de itens" - block-selector: "&0&l Seletor de bloco" - entity-selector: "&0&l Seletor de Entidade" - challenge-selector: "&0&l Seletor de Desafio" - statistic-selector: "&0&l Seletor de Estatística" - environment-selector: "&0&l Seletor de Ambiente" + player-gui: "Menu de Desafios" + gamemode-gui: "Seleccionar GameMode" + multiple-gui: "Quantas vezes?" + admin-gui: "Menu Admin de Desafios" + edit-challenge: "Editar [desafio]" + edit-level: "Editar [level]" + settings: "Configurações" + choose-challenge: "Escolher Desafio" + choose-level: "Escolher Nível" + choose-player: "Escolher jogador" + library: "Biblioteca" + manage-blocks: "Gerenciar Blocos" + manage-entities: "Gerenciar Entidades" + type-selector: "Seletor de tipo de desafio" + item-selector: "Seletor de itens" + block-selector: "Seletor de bloco" + entity-selector: "Seletor de Entidade" + challenge-selector: "Seletor de Desafio" + statistic-selector: "Seletor de Estatística" + environment-selector: "Seletor de Ambiente" buttons: free-challenges: - name: "&f&l Desafios Gratuitos" + name: "Desafios Gratuitos" description: |- - &7 Exibe uma lista de - &7 desafios gratuitos + Exibe uma lista de + desafios gratuitos return: - name: "&f&l Retornar" + name: "Retornar" description: |- - &7 Retornar ao menu anterior - &7 ou sair da GUI + Retornar ao menu anterior + ou sair da GUI previous: - name: "&f&lPágina Anterior" - description: "&7 Mudar para &e [number] &7 página" + name: "Página Anterior" + description: "Mudar para [number] página" next: - name: "&f&l Próxima página" - description: "&7 Mudar para &e [number] &7 página" + name: "Próxima página" + description: "Mudar para [number] página" reduce: - name: "&f&lReduzir" - description: "&7 Reduzir por &e [number]" + name: "Reduzir" + description: "Reduzir por [number]" increase: - name: "&f&l Aumento" - description: "&7 Aumento de &e [number]" + name: "Aumento" + description: "Aumento de [number]" accept: - name: "&f&l Concluído" + name: "Concluído" description: |- - &7 Completar desafio &e [number] - &7 vezes(-s) + Completar desafio [number] + vezes(-s) quit: - name: "&f&l Sair" - description: "&7 Sai da GUI." + name: "Sair" + description: "Sai da GUI." complete_user_challenges: - name: "&f&l Conclua o(s) desafio(s) do usuário" + name: "Conclua o(s) desafio(s) do usuário" description: |- - &7 Permite escolher o usuário e - &7 desafio(-s) completo(s) para - &7 ele + Permite escolher o usuário e + desafio(-s) completo(s) para + ele reset_user_challenges: - name: "&f&l Redefinir desafios do usuário" + name: "Redefinir desafios do usuário" description: |- - &7 Permite escolher o usuário e - &7 redefiniu seus desafios + Permite escolher o usuário e + redefiniu seus desafios add_challenge: - name: "&f&l Criar desafio" + name: "Criar desafio" description: |- - &7 Inicia um processo para - &7 criando um novo desafio. + Inicia um processo para + criando um novo desafio. add_level: - name: "&f&l Criar Nível" + name: "Criar Nível" description: |- - &7 Inicia um processo para - &7 criando um novo nível. + Inicia um processo para + criando um novo nível. edit_challenge: - name: "&f&lEditar Desafio" + name: "Editar Desafio" description: |- - &7 Permite escolher e editar - &7 um desafio. + Permite escolher e editar + um desafio. edit_level: - name: "&f&l Editar Nível" + name: "Editar Nível" description: |- - &7 Permite escolher e editar - &7 um nível. + Permite escolher e editar + um nível. delete_challenge: - name: "&f&l Excluir desafio" + name: "Excluir desafio" description: |- - &7 Permite escolher e excluir - &7 um desafio. + Permite escolher e excluir + um desafio. delete_level: - name: "&f&l Excluir Nível" + name: "Excluir Nível" description: |- - &7 Permite escolher e excluir - &7 um nível. + Permite escolher e excluir + um nível. edit_settings: - name: "&f&l Configurações" + name: "Configurações" description: |- - &7 Permite visualizar e editar - &7 configurações de um complemento. + Permite visualizar e editar + configurações de um complemento. complete_wipe: - name: "&f&l Limpeza completa" + name: "Limpeza completa" description: |- - &7 Limpa completamente os desafios - &7 banco de dados de complementos, incluindo - &7 dados do usuário. + Limpa completamente os desafios + banco de dados de complementos, incluindo + dados do usuário. challenge_wipe: - name: "&f&l Limpeza de desafio" + name: "Limpeza de desafio" description: |- - &7 Limpa completamente os desafios - &7 e níveis do banco de dados. + Limpa completamente os desafios + e níveis do banco de dados. user_wipe: - name: "&f&l Limpeza do usuário" + name: "Limpeza do usuário" description: |- - &7 Limpa completamente o usuário - &7 dados do banco de dados. + Limpa completamente o usuário + dados do banco de dados. library: - name: "&f&l Biblioteca" + name: "Biblioteca" description: |- - &7 Abre um público - &7 biblioteca de desafios. + Abre um público + biblioteca de desafios. import_database: - name: "&f&l Importar Banco de Dados" + name: "Importar Banco de Dados" description: |- - &7 Permite importar exportados - &7 banco de dados de desafios. + Permite importar exportados + banco de dados de desafios. import_template: - name: "&f&l Modelo de importação" + name: "Modelo de importação" description: |- - &7 Permite importar o modelo - &7 arquivo com desafios. + Permite importar o modelo + arquivo com desafios. export_challenges: - name: "&f&l Desafios de exportação" + name: "Desafios de exportação" description: |- - &7 Permite exportar o banco de dados - &7 para um arquivo local. + Permite exportar o banco de dados + para um arquivo local. properties: - name: "&f&l Propriedades" - description: "&7 Exibe todas as propriedades principais." + name: "Propriedades" + description: "Exibe todas as propriedades principais." requirements: - name: "&f&l Requisitos" - description: "&7 Exibe as propriedades dos requisitos." + name: "Requisitos" + description: "Exibe as propriedades dos requisitos." rewards: - name: "&f&l Recompensas" - description: "&7 Ver propriedades de recompensas." + name: "Recompensas" + description: "Ver propriedades de recompensas." deployed: - name: "&f&l Implantação" + name: "Implantação" description: |- - &7 Alterna se o desafio for - &7 implantado e os usuários podem - &7 completá-lo. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Alterna se o desafio for + implantado e os usuários podem + completá-lo. + enabled: "Ativado" + disabled: "Desativado" name: - name: "&f&l Nome" + name: "Nome" description: |- - &7 Permite alterar - &7 o nome de exibição. - value: "&7 Atualmente: &r [name]" + Permite alterar + o nome de exibição. + value: "Atualmente: [name]" remove_on_complete: - name: "&f&l Ocultar após a conclusão" + name: "Ocultar após a conclusão" description: |- - &7 Alterna se o desafio deve - &7 oculto do jogador após - &7 está concluído. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Alterna se o desafio deve + oculto do jogador após + está concluído. + enabled: "Ativado" + disabled: "Desativado" description: - name: "&f&l Descrição" + name: "Descrição" description: |- - &7 A descrição específica - &7 para o desafio. A cor - Os códigos &7 devem ser aplicados a ele. - value: "&7 Descrição atual:" + A descrição específica + para o desafio. A cor + Os códigos devem ser aplicados a ele. + value: "Descrição atual:" environment: - name: "&f&l Dimensão" + name: "Dimensão" description: |- - &7 Permite limitar em que - &7 dimensionar o desafio - &7 pode ser completado. - enabled: "&2" - disabled: "&c" + Permite limitar em que + dimensionar o desafio + pode ser completado. + enabled: "" + disabled: "" order: - name: "&f&l Pedido" - description: |- - &7 Permite alterar a ordem de - &7 objetos. - &7 Objetos com números iguais - &7 serão ordenados por seus - &7 nomes de id exclusivos. - value: "&7 Ordem atual: &e [number]" + name: "Pedido" + description: |- + Permite alterar a ordem de + objetos. + Objetos com números iguais + serão ordenados por seus + nomes de id exclusivos. + value: "Ordem atual: [number]" icon: - name: Ícone &f&l + name: Ícone description: |- - &7 Permite alterar o ícone - &7 para este desafio. + Permite alterar o ícone + para este desafio. locked_icon: - name: "&f&l Ícone bloqueado" + name: "Ícone bloqueado" description: |- - &7 Permite alterar bloqueado - &7 ícone de nível. + Permite alterar bloqueado + ícone de nível. required_permissions: - name: "&f&l Permissões Necessárias" - description: |- - &7 Permite a alteração necessária - &7 permissões para isso - &7 desafio para ser completado. - title: "&7 Permissões:" - permission: " &8 - [permission]" - none: "&7 As permissões não estão definidas." + name: "Permissões Necessárias" + description: |- + Permite a alteração necessária + permissões para isso + desafio para ser completado. + title: "Permissões:" + permission: " - [permission]" + none: "As permissões não estão definidas." remove_entities: - name: "&f&l Remover Entidades" - description: |- - &7 Permite alternar se - &7 entidades obrigatórias irão - &7 ser removido do mundo - &7 após completar o - &7 desafio. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Remover Entidades" + description: |- + Permite alternar se + entidades obrigatórias irão + ser removido do mundo + após completar o + desafio. + enabled: "Ativado" + disabled: "Desativado" required_entities: - name: "&f&l Entidades Requeridas" - description: |- - &7 Permite a alteração necessária - &7 entidades para isso - &7 desafio para ser completado. - title: "&7 Entidades:" - list: " &8 - [number] x [entity]" - none: "&7 As entidades não são adicionadas." + name: "Entidades Requeridas" + description: |- + Permite a alteração necessária + entidades para isso + desafio para ser completado. + title: "Entidades:" + list: " - [number] x [entity]" + none: "As entidades não são adicionadas." remove_blocks: - name: "&f&l Remover Blocos" - description: |- - &7 Permite alternar se - &7 blocos necessários irão - &7 ser removido do mundo - &7 após completar o - &7 desafio. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Remover Blocos" + description: |- + Permite alternar se + blocos necessários irão + ser removido do mundo + após completar o + desafio. + enabled: "Ativado" + disabled: "Desativado" required_blocks: - name: "&f&l Blocos Necessários" - description: |- - &7 Permite a alteração necessária - &7 blocos para isso - &7 desafio para ser completado. - title: "&7 Blocos:" - list: " &8 - [number] x [block]" - none: "&7 Os blocos não são adicionados." + name: "Blocos Necessários" + description: |- + Permite a alteração necessária + blocos para isso + desafio para ser completado. + title: "Blocos:" + list: " - [number] x [block]" + none: "Os blocos não são adicionados." search_radius: - name: "&f&l Raio de pesquisa" + name: "Raio de pesquisa" description: |- - &7 Permite alterar o raio - &7 em torno do jogador do qual - &7 blocos e/ou entidades são - &7 detectado. - value: "&7 Distância atual: &e [number]" + Permite alterar o raio + em torno do jogador do qual + blocos e/ou entidades são + detectado. + value: "Distância atual: [number]" remove_items: - name: "&f&l Remover itens" - description: |- - &7 Permite alternar se - &7 itens necessários serão - &7 ser removido do inventário - &7 após completar o - &7 desafio. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Remover itens" + description: |- + Permite alternar se + itens necessários serão + ser removido do inventário + após completar o + desafio. + enabled: "Ativado" + disabled: "Desativado" required_items: - name: "&f&l Itens Necessários" - description: |- - &7 Permite a alteração necessária - &7 itens para isso - &7 desafio para ser completado. - title: "&7 Itens:" - list: " &8 - [número] x [item]" - none: "&7 Os itens não são adicionados." + name: "Itens Necessários" + description: |- + Permite a alteração necessária + itens para isso + desafio para ser completado. + title: "Itens:" + list: " - [número] x [item]" + none: "Os itens não são adicionados." add_ignored_meta: - name: "&f&l Adicionar Ignorar Metadados" - description: |- - &7 Permite adicionar quais - &7 itens devem ignorar - &7 quaisquer metadados que - &7 é atribuído a eles. - title: "&7 Itens:" - list: " &8 - [number] x [item]" - none: "&7 Os itens não são adicionados." + name: "Adicionar Ignorar Metadados" + description: |- + Permite adicionar quais + itens devem ignorar + quaisquer metadados que + é atribuído a eles. + title: "Itens:" + list: " - [number] x [item]" + none: "Os itens não são adicionados." remove_ignored_meta: - name: "&f&l Remover Ignorar Metadados" + name: "Remover Ignorar Metadados" description: |- - &7 Permite remover quais - &7 itens devem ignorar - &7 quaisquer metadados que - &7 é atribuído a eles. + Permite remover quais + itens devem ignorar + quaisquer metadados que + é atribuído a eles. remove_experience: - name: "&f&l Remover experiência" - description: |- - &7 Permite alternar se - &7 experiência necessária irá - &7 ser removido do player - &7 após completar o - &7 desafio. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Remover experiência" + description: |- + Permite alternar se + experiência necessária irá + ser removido do player + após completar o + desafio. + enabled: "Ativado" + disabled: "Desativado" required_experience: - name: "&f&l Experiência Necessária" + name: "Experiência Necessária" description: |- - &7 Permite alterar o - &7 experiência necessária para - &7 o jogador. - value: "&7 Experiência atual: &e [number]" + Permite alterar o + experiência necessária para + o jogador. + value: "Experiência atual: [number]" required_level: - name: "&f&l Nível de Ilha Necessário" + name: "Nível de Ilha Necessário" description: |- - &7 Permite alterar o - &7 nível de ilha obrigatório - &7 para o desafio. - value: "&7 Nível atual: &e [number]" + Permite alterar o + nível de ilha obrigatório + para o desafio. + value: "Nível atual: [number]" remove_money: - name: "&f&l Remover dinheiro" - description: |- - &7 Permite alternar se - &7 dinheiro necessário - &7 ser removido do player - &7 conta após completar - &7 o desafio. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Remover dinheiro" + description: |- + Permite alternar se + dinheiro necessário + ser removido do player + conta após completar + o desafio. + enabled: "Ativado" + disabled: "Desativado" required_money: - name: "&f&l Dinheiro necessário" + name: "Dinheiro necessário" description: |- - &7 Permite alterar o - &7 dinheiro necessário no jogador - &7 representam o desafio. - value: "&7 Valor atual: &e [number]" + Permite alterar o + dinheiro necessário no jogador + representam o desafio. + value: "Valor atual: [number]" statistic: - name: Estatística &f&l + name: Estatística description: |- - &7 Permite alterar o - &7 tipo de estatística que é - &7 marcou neste desafio. - value: "&7 Valor atual: &e [statistic]" + Permite alterar o + tipo de estatística que é + marcou neste desafio. + value: "Valor atual: [statistic]" statistic_amount: - name: "&f&l Valor Alvo" + name: "Valor Alvo" description: |- - &7 Permite alterar o - &7 valor alvo da estatística - &7 que devem ser atendidos. - value: "&7 Valor atual: &e [number]" + Permite alterar o + valor alvo da estatística + que devem ser atendidos. + value: "Valor atual: [number]" remove_statistic: - name: "&f&l Reduzir Estatística" - description: |- - &7 Permite alternar se - O valor estatístico &7 irá - &7 ser reduzido após completar - &7 o desafio. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Reduzir Estatística" + description: |- + Permite alternar se + O valor estatístico irá + ser reduzido após completar + o desafio. + enabled: "Ativado" + disabled: "Desativado" statistic_blocks: - name: "&f&l Bloco de destino" + name: "Bloco de destino" description: |- - &7 Permite alterar o - &7 bloco de destino estatístico. - value: "&7 Bloco atual: &e [block]" + Permite alterar o + bloco de destino estatístico. + value: "Bloco atual: [block]" statistic_items: - name: "&f&l Item de destino" + name: "Item de destino" description: |- - &7 Permite alterar o - &7 item de destino estatístico. - value: "&7 Item atual: &e [item]" + Permite alterar o + item de destino estatístico. + value: "Item atual: [item]" statistic_entities: - name: "&f&l Entidade Alvo" + name: "Entidade Alvo" description: |- - &7 Permite alterar o - &7 entidade alvo da estatística. - value: "&7 Entidade atual: &e [entity]" + Permite alterar o + entidade alvo da estatística. + value: "Entidade atual: [entity]" reward_text: - name: "&f&l Texto de recompensa" + name: "Texto de recompensa" description: |- - &7 O texto de recompensa específico. - &7 Os códigos de cores devem ser - &7 aplicado a ele. - value: "&7 Texto atual:" + O texto de recompensa específico. + Os códigos de cores devem ser + aplicado a ele. + value: "Texto atual:" repeat_reward_text: - name: "&f&l Repetir Texto de Recompensa" + name: "Repetir Texto de Recompensa" description: |- - &7 O texto específico da recompensa de repetição - &7 para o desafio. A cor - Os códigos &7 devem ser aplicados a ele. - value: "&7 Texto atual:" + O texto específico da recompensa de repetição + para o desafio. A cor + Os códigos devem ser aplicados a ele. + value: "Texto atual:" reward_items: - name: "&f&l Itens de recompensa" + name: "Itens de recompensa" description: |- - &7 Permite alterar a recompensa - &7 itens. - title: "&7 Itens:" - list: " &8 - [number] x [item]" - none: "&7 Os itens não são adicionados." + Permite alterar a recompensa + itens. + title: "Itens:" + list: " - [number] x [item]" + none: "Os itens não são adicionados." repeat_reward_items: - name: "&f&l Repetir Itens de Recompensa" - description: |- - &7 Permite alterar a repetição - &7 itens de recompensa por isso - &7 desafio. - title: "&7 Itens:" - list: " &8 - [number] x [item]" - none: "&7 Os itens não são adicionados." + name: "Repetir Itens de Recompensa" + description: |- + Permite alterar a repetição + itens de recompensa por isso + desafio. + title: "Itens:" + list: " - [number] x [item]" + none: "Os itens não são adicionados." reward_experience: - name: "&f&l Experiência de recompensa" + name: "Experiência de recompensa" description: |- - &7 Permite alterar o - &7 experiência de recompensa para - &7 o jogador. - value: "&7 Experiência de recompensa: &e [number]" + Permite alterar o + experiência de recompensa para + o jogador. + value: "Experiência de recompensa: [number]" repeat_reward_experience: - name: "&f&l Repetir Experiência de Recompensa" + name: "Repetir Experiência de Recompensa" description: |- - &7 Permite alterar o - &7 repetir experiência de recompensa - &7 para o jogador. - value: "&7 Experiência de recompensa: &e [number]" + Permite alterar o + repetir experiência de recompensa + para o jogador. + value: "Experiência de recompensa: [number]" reward_money: - name: "&f&l Recompensa em Dinheiro" + name: "Recompensa em Dinheiro" description: |- - &7 Permite alterar o - &7 recompensa em dinheiro. - value: "&7 Valor atual: &e [number]" + Permite alterar o + recompensa em dinheiro. + value: "Valor atual: [number]" repeat_reward_money: - name: "&f&l Repetir Dinheiro de Recompensa" + name: "Repetir Dinheiro de Recompensa" description: |- - &7 Permite alterar o - &7 repetir dinheiro de recompensa - &7 para o desafio. - value: "&7 Valor atual: &e [number]" + Permite alterar o + repetir dinheiro de recompensa + para o desafio. + value: "Valor atual: [number]" reward_commands: - name: "&f&l Comandos de Recompensa" - description: |- - &7 Os comandos de recompensa específicos. - &8 Dica: - &8 O comando não requer - &8 escrevendo primeiro `/` como será - &8 ser aplicado automaticamente. - &8 Por padrão, os comandos serão - &8 executado pelo servidor. No entanto - &8 adicionando `[SELF]` no início - &8 permitirá que o comando seja - &8 executado pelo jogador. Isso também - &8 suporta um marcador de posição - &8 `[player]` que será - &8 substituído por um nome de jogador - &8 que completaram o desafio. - value: "&7 Comandos atuais:" + name: "Comandos de Recompensa" + description: |- + Os comandos de recompensa específicos. + Dica: + O comando não requer + escrevendo primeiro `/` como será + ser aplicado automaticamente. + Por padrão, os comandos serão + executado pelo servidor. No entanto + adicionando `[SELF]` no início + permitirá que o comando seja + executado pelo jogador. Isso também + suporta um marcador de posição + `[player]` que será + substituído por um nome de jogador + que completaram o desafio. + value: "Comandos atuais:" repeat_reward_commands: - name: "&f&l Repetir Comandos de Recompensa" - description: |- - &7 A recompensa de repetição específica - &7 comandos para o desafio. - &8 Dica: - &8 O comando não requer - &8 escrevendo primeiro `/` como será - &8 ser aplicado automaticamente. - &8 Por padrão, os comandos serão - &8 executado pelo servidor. No entanto - &8 adicionando `[SELF]` no início - &8 permitirá que o comando seja - &8 executado pelo jogador. Isso também - &8 suporta um marcador de posição - &8 `[player]` que será - &8 substituído por um nome de jogador - &8 que completaram o desafio. - value: "&7 Comandos atuais:" + name: "Repetir Comandos de Recompensa" + description: |- + A recompensa de repetição específica + comandos para o desafio. + Dica: + O comando não requer + escrevendo primeiro `/` como será + ser aplicado automaticamente. + Por padrão, os comandos serão + executado pelo servidor. No entanto + adicionando `[SELF]` no início + permitirá que o comando seja + executado pelo jogador. Isso também + suporta um marcador de posição + `[player]` que será + substituído por um nome de jogador + que completaram o desafio. + value: "Comandos atuais:" repeatable: - name: "&f&l Repetível" + name: "Repetível" description: |- - &7 Permite alternar se - &7 o desafio é - &7 repetível. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Permite alternar se + o desafio é + repetível. + enabled: "Ativado" + disabled: "Desativado" repeat_count: - name: "&f&l Contagem de repetições" + name: "Contagem de repetições" description: |- - &7 Permite alterar o - &7 número de repetições - &7 para o desafio. - value: "&7 Valor atual: &e [number]" + Permite alterar o + número de repetições + para o desafio. + value: "Valor atual: [number]" cool_down: - name: "&f&l Resfriamento" - description: |- - &7 Permite alterar o - &7 segundos de resfriamento que - &7 deve ser esperado entre - &7 desafio repetível - &7 conclusões. - value: "&7 Valor atual: &e [time]" + name: "Resfriamento" + description: |- + Permite alterar o + segundos de resfriamento que + deve ser esperado entre + desafio repetível + conclusões. + value: "Valor atual: [time]" challenges: - name: "&f&l Desafios" + name: "Desafios" description: |- - &7 Ver desafios atribuídos - &7 ao nível. + Ver desafios atribuídos + ao nível. waiver_amount: - name: "&f&l Valor da Renúncia" + name: "Valor da Renúncia" description: |- - &7 Permite definir um número - &7 de desafios que podem - &7 ser deixado incompleto para - &7 desbloqueando o próximo nível. - value: "&7 Valor atual: &e [number]" + Permite definir um número + de desafios que podem + ser deixado incompleto para + desbloqueando o próximo nível. + value: "Valor atual: [number]" add_challenges: - name: "&f&l Adicionar desafio(-s)" + name: "Adicionar desafio(-s)" description: |- - &7 Permite selecionar e - &7 adiciona desafios ao - &7 nível. + Permite selecionar e + adiciona desafios ao + nível. remove_challenges: - name: "&f&l Remover desafio(-s)" + name: "Remover desafio(-s)" description: |- - &7 Permite selecionar e - &7 remover desafios para o - &7 nível. + Permite selecionar e + remover desafios para o + nível. reset_on_new: - name: "&f&l Redefinir em Novo" - description: |- - &7 Permite alternar se - &7 desafios devem ser - &7 redefinir quando o usuário sair - &7 ilha ou cria uma nova - &7 ilha. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Redefinir em Novo" + description: |- + Permite alternar se + desafios devem ser + redefinir quando o usuário sair + ilha ou cria uma nova + ilha. + enabled: "Ativado" + disabled: "Desativado" broadcast: - name: "&f&l Transmissão" + name: "Transmissão" description: |- - &7 Desafio de transmissões e - &7 nível de conclusão pela primeira vez - &7 para todos. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Desafio de transmissões e + nível de conclusão pela primeira vez + para todos. + enabled: "Ativado" + disabled: "Desativado" remove_completed: - name: "&f&l Ocultar concluído" + name: "Ocultar concluído" description: |- - &7 Oculta desafios concluídos - &7 do menu. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Oculta desafios concluídos + do menu. + enabled: "Ativado" + disabled: "Desativado" glow_completed: - name: "&f&lBrilho concluído" + name: "Brilho concluído" description: |- - &7 Adiciona brilho de encantamento - &7 para os desafios concluídos. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Adiciona brilho de encantamento + para os desafios concluídos. + enabled: "Ativado" + disabled: "Desativado" store_history: - name: "&f&l Histórico da Loja" - description: |- - &7 Armazena o histórico interno - &7 quando cada desafio é - &7 concluído. - &7 Atualmente apenas visível - &7 no banco de dados. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Histórico da Loja" + description: |- + Armazena o histórico interno + quando cada desafio é + concluído. + Atualmente apenas visível + no banco de dados. + enabled: "Ativado" + disabled: "Desativado" data_per_island: - name: "&f&l Loja por ilha" - description: |- - &7 Armazena os - &7 desafios por ilha. - &7 O progresso será compartilhado - &7 com todos os jogadores da equipe. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Loja por ilha" + description: |- + Armazena os + desafios por ilha. + O progresso será compartilhado + com todos os jogadores da equipe. + enabled: "Ativado" + disabled: "Desativado" show_title: - name: "&f&l Mostrar título" + name: "Mostrar título" description: |- - &7 Mostra o título quando um - &7 desafio ou nível - &7 é concluído. - enabled: "&2 Ativado" - disabled: "&c Desativado" + Mostra o título quando um + desafio ou nível + é concluído. + enabled: "Ativado" + disabled: "Desativado" gamemode_gui: - name: "&f&l GUI de seleção do modo de jogo" - description: |- - &7 Ativa uma interface única que - &7 está disponível via /challenges - &7 comando. - &c Requer reinicialização do servidor. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "GUI de seleção do modo de jogo" + description: |- + Ativa uma interface única que + está disponível via /challenges + comando. + Requer reinicialização do servidor. + enabled: "Ativado" + disabled: "Desativado" locked_level_icon: - name: "&f&l Ícone de nível bloqueado padrão" + name: "Ícone de nível bloqueado padrão" description: |- - &7 Ícone padrão para todos bloqueados - &7 níveis. Cada nível pode mudar - &7 este ícone. + Ícone padrão para todos bloqueados + níveis. Cada nível pode mudar + este ícone. purge_history: - name: "&f&l Histórico de vida" - description: |- - &7 Número de dias quanto tempo - &7 os dados do histórico são armazenados - &7 nos dados do usuário. - &7 0 significa que os dados serão - &7 não ser removido. - value: "&7 Valor atual: &e [number]" + name: "Histórico de vida" + description: |- + Número de dias quanto tempo + os dados do histórico são armazenados + nos dados do usuário. + 0 significa que os dados serão + não ser removido. + value: "Valor atual: [number]" title_showtime: - name: "&f&l Hora de exibição do título" + name: "Hora de exibição do título" description: |- - &7 Número de tiques desse título - &7 será mostrado ao jogador. - value: "&7 Valor atual: &e [number]" + Número de tiques desse título + será mostrado ao jogador. + value: "Valor atual: [number]" active_world_list: - name: "&f&l Mostrar apenas o mundo ativo" - description: |- - &7 Se a GUI de seleção do modo de jogo - &7 estiver ativado, isso pode alternar - &7 se a GUI mostrar a seleção do GameMode - &7 ou desafios para o mundo atual. - &c Requer reinicialização do servidor. - enabled: "&2 Ativado" - disabled: "&c Desativado" + name: "Mostrar apenas o mundo ativo" + description: |- + Se a GUI de seleção do modo de jogo + estiver ativado, isso pode alternar + se a GUI mostrar a seleção do GameMode + ou desafios para o mundo atual. + Requer reinicialização do servidor. + enabled: "Ativado" + disabled: "Desativado" visibility_mode: - name: "&f&l Modo de visibilidade" + name: "Modo de visibilidade" description: |- - &7 Modo de visibilidade para - &7 desafios que são - &7 oculto. - enabled: "&2" - disabled: "&c" + Modo de visibilidade para + desafios que são + oculto. + enabled: "" + disabled: "" visible: Mostrar desafios visíveis hidden: Mostrar todos os desafios toggleable: Permitir alternar download: - name: "&f&l Baixar bibliotecas" + name: "Baixar bibliotecas" description: |- - &7 Atualização manual disponível - &7 desafia as bibliotecas. - enabled: "&2 Com limpeza de cache" - disabled: "&c Sem limpar o cache" + Atualização manual disponível + desafia as bibliotecas. + enabled: "Com limpeza de cache" + disabled: "Sem limpar o cache" player: - name: "&f&l [name]" - description: "&7 Proprietário da Ilha: [proprietário]" - members: "&7 Membros da Ilha:" - member: "&8 - [name]" + name: "[name]" + description: "Proprietário da Ilha: [proprietário]" + members: "Membros da Ilha:" + member: "- [name]" no-island: |- - &c O jogador não tem - &c uma ilha. + O jogador não tem + uma ilha. player_list: - name: "&f&l Escolher lista de usuários" + name: "Escolher lista de usuários" description: |- - &7 Escolha qual lista de usuários - &7 deve ser mostrado. - enabled: "&2" - disabled: "&c" + Escolha qual lista de usuários + deve ser mostrado. + enabled: "" + disabled: "" online: Jogadores online with_island: Jogadores com ilhas in_world: Jogadores do mundo add_block: - name: "&f&l Adicionar bloco" + name: "Adicionar bloco" description: |- - &7 Permite adicionar um novo - &7 bloco para a lista. + Permite adicionar um novo + bloco para a lista. remove_block: - name: "&f&l Remover bloqueio" + name: "Remover bloqueio" description: |- - &7 Permite remover - &7 blocos selecionados - &7 das listas. - title: "&7 Materiais Selecionados:" - material: "&8 - [material]" + Permite remover + blocos selecionados + das listas. + title: "Materiais Selecionados:" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 ID do material: [id]" - selected: "&2 Selecionado" + name: "[material]" + description: "ID do material: [id]" + selected: "Selecionado" add_entity: - name: "&f&l Adicionar Entidade" + name: "Adicionar Entidade" description: |- - &7 Permite adicionar um novo - &7 entidade à lista. + Permite adicionar um novo + entidade à lista. switch_entity: - name: "&f&l Trocar Ovos" + name: "Trocar Ovos" description: |- - &7 Permite mudar de - &7 ovos para as cabeças da máfia. + Permite mudar de + ovos para as cabeças da máfia. remove_entity: - name: "&f&l Remover Entidade" + name: "Remover Entidade" description: |- - &7 Permite remover - &7 entidades selecionadas - &7 das listas. - title: "&7 Entidades Selecionadas:" - entity: "&8 - [entity]" + Permite remover + entidades selecionadas + das listas. + title: "Entidades Selecionadas:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 ID da entidade: [id]" - selected: "&2 Selecionado" + name: "[entity]" + description: "ID da entidade: [id]" + selected: "Selecionado" inventory_type: - name: "&f&l Tipo de inventário" + name: "Tipo de inventário" description: |- - &7 Desafio que verifica - &7 itens no inventário do jogador + Desafio que verifica + itens no inventário do jogador island_type: - name: "&f&l Tipo de ilha" + name: "Tipo de ilha" description: |- - &7 Desafio que verifica - &7 blocos ou entidades ao redor - &7 jogador. + Desafio que verifica + blocos ou entidades ao redor + jogador. other_type: - name: "&f&l Outro Tipo" + name: "Outro Tipo" description: |- - &7 Desafio que usa - &7 plugins ou complementos, - &7 como nível e dinheiro. + Desafio que usa + plugins ou complementos, + como nível e dinheiro. statistic_type: - name: "&f&l Tipo de Estatística" + name: "Tipo de Estatística" description: |- - &7 Desafio que verifica - &7 dados estatísticos do jogador. + Desafio que verifica + dados estatísticos do jogador. save: - name: "&f&l Salvar" + name: "Salvar" description: |- - &7 Salva as alterações e - &7 retorna. + Salva as alterações e + retorna. cancel: - name: "&f&l Cancelar" + name: "Cancelar" description: |- - &7 Descarta as alterações e - &7 retorna. + Descarta as alterações e + retorna. accept_selected: - name: "&f&l Aceitar Selecionado" + name: "Aceitar Selecionado" description: |- - &7 Retorna os elementos selecionados - &7 e abre a GUI anterior. - title: "&7 Selecionado:" - element: "&8 - [element]" + Retorna os elementos selecionados + e abre a GUI anterior. + title: "Selecionado:" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Pesquisa" + name: "Pesquisa" description: |- - &7 Permite pesquisar um - Elemento &7 com entrada - &7 valor do texto. - search: "&b Valor: [value]" + Permite pesquisar um + Elemento com entrada + valor do texto. + search: "Valor: [value]" tips: - click-to-select: "&e Clique em &7 para selecionar." - click-to-choose: "&e Clique em &7 para escolher." - click-to-complete: "&eClique &7para concluir." - right-click-multiple-open: "&e Clique com o botão direito em &7 para escolher + click-to-select: "Clique em para selecionar." + click-to-choose: "Clique em para escolher." + click-to-complete: "Clique para concluir." + right-click-multiple-open: "Clique com o botão direito em para escolher a contagem de conclusão." - shift-left-click-to-complete-all: "&e Shift Clique em &7 para completar tudo." - left-click-to-accept: "&e Clique com o botão esquerdo em &7 para concluir." - right-click-to-write: "&e Clique com o botão direito em &7 para escrever." - click-to-reduce: "&e Clique em &7 para reduzir." - click-to-increase: "&e Clique em &7 para aumentar." - click-to-return: "&e Clique em &7 para retornar." - click-to-quit: "&e Clique em &7 para sair." - click-to-wipe: "&e Clique em &7 para limpar." - left-click-to-wipe: "&e Clique com o botão esquerdo em &7 para limpar." - right-click-to-switch: "&e Clique com o botão direito em &7 para alternar." - click-to-open: "&e Clique em &7 para abrir." - click-to-export: "&e Clique em &7 para exportar." - click-to-create: "&e Clique em &7 para criar." - left-click-to-open: "&e Clique com o botão esquerdo em &7 para abrir." - right-click-to-reset-all: "&e Clique com o botão direito em &7 para limpar tudo." - click-to-toggle: "&e Clique em &7 para alternar." - click-to-change: "&e Clique em &7 para alterar." - shift-click-to-reset: "&e Shift Clique em &7 para redefinir." - click-to-add: "&e Clique em &7 para adicionar." - click-to-remove: "&e Clique em &7 para remover." - left-click-to-cycle: "&e Clique com o botão esquerdo em &7 para descer." - right-click-to-cycle: "&e Clique com o botão direito em &7 para subir o ciclo." - click-to-edit: "&e Clique em &7 para editar." - left-click-to-download: "&e Clique com o botão esquerdo em &7 para fazer o download." - right-click-to-toggle: "&e Clique com o botão direito em &7 para alternar." - click-to-install: "&e Clique em &7 para instalar." - click-to-reset-all: "&e Clique em &7 para redefinir tudo." - right-click-to-select: "&e Clique com o botão direito em &7 para selecionar." - right-click-to-deselect: "&e Clique com o botão direito em &7 para desmarcar." - left-click-to-choose: "&e Clique com o botão esquerdo em &7 para escolher." - click-to-cancel: "&e Clique em &7 para cancelar." - click-to-save: "&e Clique em &7 para salvar." - click-to-deselect: "&e Clique em &7 para desmarcar." + shift-left-click-to-complete-all: "Shift Clique em para completar tudo." + left-click-to-accept: "Clique com o botão esquerdo em para concluir." + right-click-to-write: "Clique com o botão direito em para escrever." + click-to-reduce: "Clique em para reduzir." + click-to-increase: "Clique em para aumentar." + click-to-return: "Clique em para retornar." + click-to-quit: "Clique em para sair." + click-to-wipe: "Clique em para limpar." + left-click-to-wipe: "Clique com o botão esquerdo em para limpar." + right-click-to-switch: "Clique com o botão direito em para alternar." + click-to-open: "Clique em para abrir." + click-to-export: "Clique em para exportar." + click-to-create: "Clique em para criar." + left-click-to-open: "Clique com o botão esquerdo em para abrir." + right-click-to-reset-all: "Clique com o botão direito em para limpar tudo." + click-to-toggle: "Clique em para alternar." + click-to-change: "Clique em para alterar." + shift-click-to-reset: "Shift Clique em para redefinir." + click-to-add: "Clique em para adicionar." + click-to-remove: "Clique em para remover." + left-click-to-cycle: "Clique com o botão esquerdo em para descer." + right-click-to-cycle: "Clique com o botão direito em para subir o ciclo." + click-to-edit: "Clique em para editar." + left-click-to-download: "Clique com o botão esquerdo em para fazer o download." + right-click-to-toggle: "Clique com o botão direito em para alternar." + click-to-install: "Clique em para instalar." + click-to-reset-all: "Clique em para redefinir tudo." + right-click-to-select: "Clique com o botão direito em para selecionar." + right-click-to-deselect: "Clique com o botão direito em para desmarcar." + left-click-to-choose: "Clique com o botão esquerdo em para escolher." + click-to-cancel: "Clique em para cancelar." + click-to-save: "Clique em para salvar." + click-to-deselect: "Clique em para desmarcar." click-on-item: |- - &e Clique em &7 no item em - &7 seu inventário. - left-click-to-edit: "&e Clique com o botão esquerdo em &7 para editar." - right-click-to-clear: "&e Clique com o botão direito em &7 para limpar." - click-to-previous: "&e Clique em &7 para visualizar a página anterior." - click-to-next: "&e Clique em &7 para visualizar a próxima página." + Clique em no item em + seu inventário. + left-click-to-edit: "Clique com o botão esquerdo em para editar." + right-click-to-clear: "Clique com o botão direito em para limpar." + click-to-previous: "Clique em para visualizar a página anterior." + click-to-next: "Clique em para visualizar a próxima página." descriptions: challenge: lore: |- @@ -827,17 +827,17 @@ challenges: [requirements] [rewards] status: - completed: "&2&l Concluído" - completed-times: "&2 Concluído &7&l [number] &r&2 vezes(-s)" - completed-times-of: "&2 Concluído &7&l [number] &r&2 de &7&l [máx.] &r&2 + completed: "Concluído" + completed-times: "Concluído [number] vezes(-s)" + completed-times-of: "Concluído [number] de [máx.] vezes" - completed-times-reached: "&2&l Completou todos &7 [max] &2 vezes" + completed-times-reached: "Completou todos [max] vezes" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Resfriamento: &r&7 [time]" - wait-time: "&c&l Disponível após: &r&c [time]" + timeout: "Resfriamento: [time]" + wait-time: "Disponível após: [time]" in-days: "[number] d" in-hours: "[number] h" in-minutes: "[número] min" @@ -847,12 +847,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Limitado a [environment]" - environment-title: "&7 Limitado a:" - environment-list: " &7 - &e [environment]" - permission-single: "&c Requer permissão [permissions]" - permissions-title: "&c Requer permissões:" - permissions-list: " &c - [permission]" + environment-single: "Limitado a [environment]" + environment-title: "Limitado a:" + environment-list: " - [environment]" + permission-single: "Requer permissão [permissions]" + permissions-title: "Requer permissões:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -860,23 +860,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Blocos Necessários:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Entidades Requeridas:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 Não além de &e [number] &7 metros" - warning-block: "&e Os blocos serão &c removidos" - warning-entity: "&e As entidades serão &c removidas" + blocks-title: "Blocos Necessários:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Entidades Requeridas:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "Não além de [number] metros" + warning-block: "Os blocos serão removidos" + warning-entity: "As entidades serão removidas" inventory: lore: |- [Items] [warning] - item-title: "&7&l Itens Necessários:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e O(s) item(ns) será(ão) &c removido(s)" + item-title: "Itens Necessários:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "O(s) item(ns) será(ão) removido(s)" other: lore: |- [experience] @@ -884,34 +884,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Experiência necessária: &r&e [number]" - experience-warning: "&e A experiência será &c removida" - money: "&7&l Dinheiro necessário: &r&e [number]" - money-warning: "&e O dinheiro será &c removido" - level: "&7&l Nível de ilha necessário: &r&e [number]" + experience: "Experiência necessária: [number]" + experience-warning: "A experiência será removida" + money: "Dinheiro necessário: [number]" + money-warning: "O dinheiro será removido" + level: "Nível de ilha necessário: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Os dados estatísticos serão &c reduzidos" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "Os dados estatísticos serão reduzidos" rewards: lore: |- - &7&l Recompensas: + Recompensas: [text] [Items] [experience] [money] [commands] - item-title: "&7 Itens:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experiência: &r&e [number]" - money: "&7 Dinheiro: &r&e [number]" - commands-title: "&7 Comandos:" - command: " &7 - &e [command]" + item-title: "Itens:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experiência: [number]" + money: "Dinheiro: [number]" + commands-title: "Comandos:" + command: " - [command]" level: lore: |- [text] @@ -919,189 +919,189 @@ challenges: [waiver] [rewards] status: - completed: "&2&l Concluído" + completed: "Concluído" completed-challenges-of: |- - &2 Concluído &7&l [number] &r&2 de - &7&l [max] &r&2 desafios. - locked: "&c&l Bloqueado" + Concluído [number] de + [max] desafios. + locked: "Bloqueado" missing-challenges: |- - &7 [número] mais desafios devem ser - &7 concluído para desbloquear este nível. + [número] mais desafios devem ser + concluído para desbloquear este nível. waiver: |- - &7&l [number] desafio(-s) &r&7 pode ser - &7 pulou para desbloquear o próximo nível. + [number] desafio(-s) pode ser + pulou para desbloquear o próximo nível. rewards: lore: |- - &7&l Recompensas: + Recompensas: [text] [Items] [experience] [money] [commands] - item-title: "&7 Itens:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Experiência: &r&e [number]" - money: "&7 Dinheiro: &r&e [number]" - commands-title: "&7 Comandos:" - command: " &7 - &e [command]" + item-title: "Itens:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Experiência: [number]" + money: "Dinheiro: [number]" + commands-title: "Comandos:" + command: " - [command]" library: - author: "&7 por &e [author]" - version: "&7 Feito com Desafios &e [version]" - lang: "&7 Idioma: &e [lang]" - gamemode: "&7 Primário para &e [gamemode]" + author: "por [author]" + version: "Feito com Desafios [version]" + lang: "Idioma: [lang]" + gamemode: "Primário para [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: verdadeiro, ligado, sim, confirmar, y, válido, correto deny-string: falso, desativado, não, negar, n, inválido, incorreto cancel-string: cancelar exit-string: cancelar, sair, sair - cancelled: "&c Conversa cancelada!" - input-number: "&e Digite um número no chat." - input-seconds: "&e Por favor, digite um segundo no chat." - numeric-only: "&c O [value] dado não é um número!" - not-valid-value: "&c O número dado [valor] não é válido. Deve ser maior que [min] + cancelled: "Conversa cancelada!" + input-number: "Digite um número no chat." + input-seconds: "Por favor, digite um segundo no chat." + numeric-only: "O [value] dado não é um número!" + not-valid-value: "O número dado [valor] não é válido. Deve ser maior que [min] e menor que [max]!" - user-data-removed: "&a Todos os dados do usuário para [gamemode] são apagados + user-data-removed: "Todos os dados do usuário para [gamemode] são apagados do banco de dados." - confirm-user-data-deletion: "&e Confirme que deseja limpar o banco de dados do + confirm-user-data-deletion: "Confirme que deseja limpar o banco de dados do usuário para [gamemode]." - challenge-data-removed: "&a Todos os dados de desafios para [gamemode] são apagados + challenge-data-removed: "Todos os dados de desafios para [gamemode] são apagados do banco de dados." - confirm-challenge-data-deletion: "&e Por favor, confirme que você deseja limpar + confirm-challenge-data-deletion: "Por favor, confirme que você deseja limpar o banco de dados de desafios para [gamemode]." - all-data-removed: "&a Todos os dados de addon para [gamemode] são apagados do + all-data-removed: "Todos os dados de addon para [gamemode] são apagados do banco de dados." - confirm-all-data-deletion: "&e Confirme que deseja limpar os dados do addon para + confirm-all-data-deletion: "Confirme que deseja limpar os dados do addon para [gamemode]." - write-name: "&e Por favor, escreva um nome no chat." - new-object-created: "&a Um novo objeto para [gamemode] é criado." - object-already-exists: "&c O objeto &7 [id] &c já existe. Escolha um nome diferente." - invalid-challenge: "&c Desafio [challenge] contém dados inválidos. Não pode ser + write-name: "Por favor, escreva um nome no chat." + new-object-created: "Um novo objeto para [gamemode] é criado." + object-already-exists: "O objeto [id] já existe. Escolha um nome diferente." + invalid-challenge: "Desafio [challenge] contém dados inválidos. Não pode ser implantado!" - name-changed: "&a Sucesso, o nome foi atualizado." - write-description: "&e Por favor, insira uma nova descrição no chat e 'sair' em + name-changed: "Sucesso, o nome foi atualizado." + write-description: "Por favor, insira uma nova descrição no chat e 'sair' em uma linha para terminar." - description-changed: "&a Sucesso, a descrição foi atualizada." - write-permissions: "&e Por favor, insira as permissões necessárias, uma por linha + description-changed: "Sucesso, a descrição foi atualizada." + write-permissions: "Por favor, insira as permissões necessárias, uma por linha no chat, e 'quit' em uma linha por si só para terminar." - permissions-changed: "&a Sucesso, as permissões de desafio foram atualizadas." - write-reward-text: "&e Por favor, digite um novo texto de recompensa no chat e + permissions-changed: "Sucesso, as permissões de desafio foram atualizadas." + write-reward-text: "Por favor, digite um novo texto de recompensa no chat e 'quit' em uma linha para terminar." - reward-text-changed: "&a Sucesso, o texto da recompensa foi atualizado." - write-repeat-reward-text: "&e Por favor, digite um novo texto de recompensa de + reward-text-changed: "Sucesso, o texto da recompensa foi atualizado." + write-repeat-reward-text: "Por favor, digite um novo texto de recompensa de repetição no chat e 'quit' em uma linha por si só para terminar." - repeat-reward-text-changed: "&a Sucesso, o texto da recompensa repetida foi atualizado." - write-reward-commands: "&e Por favor, digite um novo comando de recompensa por + repeat-reward-text-changed: "Sucesso, o texto da recompensa repetida foi atualizado." + write-reward-commands: "Por favor, digite um novo comando de recompensa por linha no chat e 'quit' em uma linha por si só para terminar." - reward-commands-changed: "&a Sucesso, os comandos de recompensa foram atualizados." - write-repeat-reward-commands: "&e Por favor, digite um novo comando de repetição + reward-commands-changed: "Sucesso, os comandos de recompensa foram atualizados." + write-repeat-reward-commands: "Por favor, digite um novo comando de repetição de recompensa por linha no chat e 'quit' em uma linha por si só para terminar." - repeat-reward-commands-changed: "&a Sucesso, os comandos de repetição de recompensa + repeat-reward-commands-changed: "Sucesso, os comandos de repetição de recompensa foram atualizados." - challenge-removed: "&a Os desafios [challenge] para [gamemode] foram removidos + challenge-removed: "Os desafios [challenge] para [gamemode] foram removidos do banco de dados." - confirm-challenge-deletion: "&e Por favor, confirme que você deseja remover [challenge] + confirm-challenge-deletion: "Por favor, confirme que você deseja remover [challenge] para [gamemode] do banco de dados." - level-removed: "&a O nível [level] para [gamemode] foi removido do banco de dados." - confirm-level-deletion: "&e Confirme que deseja remover [level] para [gamemode] + level-removed: "O nível [level] para [gamemode] foi removido do banco de dados." + confirm-level-deletion: "Confirme que deseja remover [level] para [gamemode] do banco de dados." - start-downloading: "&a Iniciando o download e a importação da Biblioteca de Desafios." - written-text: "&a Texto de entrada:" - confirm-data-replacement: "&e Confirme que deseja substituir seus desafios atuais + start-downloading: "Iniciando o download e a importação da Biblioteca de Desafios." + written-text: "Texto de entrada:" + confirm-data-replacement: "Confirme que deseja substituir seus desafios atuais por um novo." - new-challenges-imported: "&a Sucesso, novos Desafios para [gamemode] foram importados." - exported-file-name: "&e Insira um nome de arquivo para o arquivo de banco de dados + new-challenges-imported: "Sucesso, novos Desafios para [gamemode] foram importados." + exported-file-name: "Insira um nome de arquivo para o arquivo de banco de dados exportado. (escreva 'cancel' para sair)" - database-export-completed: "&a Sucesso, a exportação do banco de dados para [world] + database-export-completed: "Sucesso, a exportação do banco de dados para [world] foi concluída. Arquivo [file] gerado." - file-name-exist: "&c Existe um arquivo com o nome '[id]'. Não é possível sobrescrever." - write-search: "&e Por favor, escreva um valor de pesquisa. (escreva 'cancel' para + file-name-exist: "Existe um arquivo com o nome '[id]'. Não é possível sobrescrever." + write-search: "Por favor, escreva um valor de pesquisa. (escreva 'cancel' para sair)" - search-updated: "&a Valor de pesquisa atualizado." + search-updated: "Valor de pesquisa atualizado." titles: challenge-title: Completado com sucesso challenge-subtitle: "[friendlyName]" level-title: Completado com sucesso level-subtitle: "[friendlyName]" messages: - completed: "&2 Você completou o desafio [name] para [player]!" - already-completed: "&2 Este desafio já foi concluído!" - reset: "&2 Você redefiniu o desafio [name] para [player]!" - reset-all: "&2 Todos os desafios do [player] foram reiniciados!" - not-completed: "&2 Este desafio ainda não foi concluído!" - migrate-start: "&2 Iniciar a migração de dados de complemento de desafios." - migrate-end: "&2 Desafios dados do addon atualizados para o novo formato." - migrate-not: "&2 Todos os dados são válidos." - start-downloading: "&5 Iniciando o download e a importação da Biblioteca de Desafios." - you-completed-challenge: "&2Você completou [value] o desafio&2!" - you-repeated-challenge: "& Você repetiu o desafio [value]&2!" + completed: "Você completou o desafio [name] para [player]!" + already-completed: "Este desafio já foi concluído!" + reset: "Você redefiniu o desafio [name] para [player]!" + reset-all: "Todos os desafios do [player] foram reiniciados!" + not-completed: "Este desafio ainda não foi concluído!" + migrate-start: "Iniciar a migração de dados de complemento de desafios." + migrate-end: "Desafios dados do addon atualizados para o novo formato." + migrate-not: "Todos os dados são válidos." + start-downloading: "Iniciando o download e a importação da Biblioteca de Desafios." + you-completed-challenge: "Você completou [value] o desafio!" + you-repeated-challenge: "& Você repetiu o desafio [value]!" you-repeated-challenge-multiple: |- - &2Você repetiu o [value] - &2desafio [count] vezes! - you-completed-level: "&2 Você completou o nível [valor] &r &2!" - name-has-completed-challenge: "&5[name] completou [value] o desafio&5!" - name-has-completed-level: "&5[name] completou o nível [value]&5!" + Você repetiu o [value] + desafio [count] vezes! + you-completed-level: "Você completou o nível [valor] !" + name-has-completed-challenge: "[name] completou [value] o desafio!" + name-has-completed-level: "[name] completou o nível [value]!" load-skipping: '"[value]" já existe - pulando' load-overwriting: Substituindo "[value]" load-add: 'Adicionando novo objeto: [value]' errors: - no-name: "&c Nome do desafio ausente" - unknown-challenge: "&cDesafio desconhecido" + no-name: "Nome do desafio ausente" + unknown-challenge: "Desafio desconhecido" not-valid-integer: |- - &c O inteiro "[value]" fornecido não é válido! + O inteiro "[value]" fornecido não é válido! O valor deve estar entre [min] e [max]. - not-deployed: "&c O desafio não foi implantado!" - not-on-island: "&c Você deve estar em sua ilha para fazer isso!" - challenge-level-not-available: "&c Você não desbloqueou o nível necessário para + not-deployed: "O desafio não foi implantado!" + not-on-island: "Você deve estar em sua ilha para fazer isso!" + challenge-level-not-available: "Você não desbloqueou o nível necessário para completar este desafio." - not-repeatable: "&c Este desafio não pode ser repetido!" - wrong-environment: "&cVocê está no ambiente errado!" - not-enough-items: "&c Você não tem [items] suficientes para completar este desafio!" - not-close-enough: "&c Você deve estar dentro de [number] blocos de todos os itens + not-repeatable: "Este desafio não pode ser repetido!" + wrong-environment: "Você está no ambiente errado!" + not-enough-items: "Você não tem [items] suficientes para completar este desafio!" + not-close-enough: "Você deve estar dentro de [number] blocos de todos os itens necessários." - you-still-need: "&c Você ainda precisa de [amount] x [item]" - missing-addon: "&cNão é possível concluir o desafio: o complemento ou plug-in + you-still-need: "Você ainda precisa de [amount] x [item]" + missing-addon: "Não é possível concluir o desafio: o complemento ou plug-in necessário está ausente." - incorrect: "&c Não é possível concluir o desafio: os requisitos estão incorretos." - not-enough-money: "&c É necessário ter [value] em sua conta para completar o desafio." - not-enough-experience: "&c É necessário ter [value] EXP para completar este desafio." - island-level: "&c Sua ilha deve estar no nível [number] ou superior para completar + incorrect: "Não é possível concluir o desafio: os requisitos estão incorretos." + not-enough-money: "É necessário ter [value] em sua conta para completar o desafio." + not-enough-experience: "É necessário ter [value] EXP para completar este desafio." + island-level: "Sua ilha deve estar no nível [number] ou superior para completar este desafio!" - no-load: "&c Erro: Não foi possível carregar [file]. [message]" - load-error: "&cErro: Não é possível carregar [value]." - no-rank: "&c Você não tem uma classificação alta o suficiente para fazer isso." - cannot-remove-items: "&c Alguns itens não podem ser removidos do seu inventário!" - exist-challenges-or-levels: "&c Desafios já existem em seu mundo. Não é possível + no-load: "Erro: Não foi possível carregar [file]. [message]" + load-error: "Erro: Não é possível carregar [value]." + no-rank: "Você não tem uma classificação alta o suficiente para fazer isso." + cannot-remove-items: "Alguns itens não podem ser removidos do seu inventário!" + exist-challenges-or-levels: "Desafios já existem em seu mundo. Não é possível prosseguir!" - no-challenges: "&c Os desafios ainda não foram implementados neste mundo!" - no-challenges-admin: "&c Os desafios ainda não foram implementados neste mundo! - Use &5 /[command] &c para adicioná-los!" - missing-arguments: "&c O comando não tem argumentos." - no-multiple-permission: "&c Você não tem permissão para concluir este desafio + no-challenges: "Os desafios ainda não foram implementados neste mundo!" + no-challenges-admin: "Os desafios ainda não foram implementados neste mundo! + Use /[command] para adicioná-los!" + missing-arguments: "O comando não tem argumentos." + no-multiple-permission: "Você não tem permissão para concluir este desafio várias vezes ao mesmo tempo." - invalid-level: "&c O nível [level] contém dados inválidos. Ele não será carregado + invalid-level: "O nível [level] contém dados inválidos. Ele não será carregado do banco de dados!" - invalid-challenge: "&c Desafio [challenge] contém dados inválidos. Ele não será + invalid-challenge: "Desafio [challenge] contém dados inválidos. Ele não será carregado do banco de dados!" - no-library-entries: "&c Não é possível encontrar nenhuma entrada da biblioteca. + no-library-entries: "Não é possível encontrar nenhuma entrada da biblioteca. Nada para mostrar." - not-hooked: "&c Challenges Addon não encontrou nenhum GameMode." - timeout: "&c Este desafio requer esperar [timeout] entre as conclusões. Você deve + not-hooked: "Challenges Addon não encontrou nenhum GameMode." + timeout: "Este desafio requer esperar [timeout] entre as conclusões. Você deve esperar [wait-time] até completá-lo novamente." protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5 &o Alterna quem pode - &5&o desafios completos + Alterna quem pode + desafios completos name: Proteção de desafios CHALLENGES_WORLD_PROTECTION: description: |- - &5 &o Ativar/desativar - &5&o requisito para os jogadores - &5 &o estar em sua ilha para - &5 &o completar um desafio. + Ativar/desativar + requisito para os jogadores + estar em sua ilha para + completar um desafio. name: Limitação da Ilha dos Desafios hint: Sem desafios fora da ilha version: 12 diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index a79e7e03..64766226 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -43,31 +43,31 @@ challenges: gui: title: admin: - gui-title: "&aУправление челленджами и заданиями" - edit-challenge-title: "&aРедактировать задание" - edit-level-title: "&aРедактировать уровень" - settings-title: "&aИзменить настройки" - choose-challenge-title: "&aВыберите челлендж" - choose-level-title: "&aВыберите уровень" - choose-user-title: "&aВыберите игрока" - manage-blocks: "&aУправление блоками" - manage-entities: "&aУправление сущностями" - confirm-title: "&aПодтверждение" - manage-items: "&aУправление предметами" - manage-numbers: "&aЦифровая панель" - select-block: "&aВыберите блок" - select-challenge: "&aВыберите челлендж" - select-entity: "&aВыберите сущность" - toggle-environment: "&aПереключить окружение" - edit-text-fields: "&aРедактировать текстовые поля" - library-title: "&aЗагружаемые библиотеки" - lore-add: "&aДобавить элемент описания" - lore-remove: "&aУдалить элемент описания" - lore-edit: "&aРедактировать описание" - type-select: "&aВыберите тип челленджа" - challenges: "&6Челленджи" - game-modes: "&6Выберите игровой режим" - multiple-complete: "&6Сколько раз?" + gui-title: "Управление челленджами и заданиями" + edit-challenge-title: "Редактировать задание" + edit-level-title: "Редактировать уровень" + settings-title: "Изменить настройки" + choose-challenge-title: "Выберите челлендж" + choose-level-title: "Выберите уровень" + choose-user-title: "Выберите игрока" + manage-blocks: "Управление блоками" + manage-entities: "Управление сущностями" + confirm-title: "Подтверждение" + manage-items: "Управление предметами" + manage-numbers: "Цифровая панель" + select-block: "Выберите блок" + select-challenge: "Выберите челлендж" + select-entity: "Выберите сущность" + toggle-environment: "Переключить окружение" + edit-text-fields: "Редактировать текстовые поля" + library-title: "Загружаемые библиотеки" + lore-add: "Добавить элемент описания" + lore-remove: "Удалить элемент описания" + lore-edit: "Редактировать описание" + type-select: "Выберите тип челленджа" + challenges: "Челленджи" + game-modes: "Выберите игровой режим" + multiple-complete: "Сколько раз?" buttons: admin: complete: Завершить челлендж игрока @@ -125,9 +125,9 @@ challenges: library: Веб-библиотека download: Скачать библиотеки type: - island: "&6Тип острова" - inventory: "&6Тип инвентаря" - other: "&6Другой тип" + island: "Тип острова" + inventory: "Тип инвентаря" + other: "Другой тип" import: Импортировать челленджи из ASkyblock settings: Изменить настройки name: Дружественное имя @@ -183,10 +183,10 @@ challenges: toggle-user-list: Переключиться на другой список игроков. selected: Выбрано show-eggs: Переключить вид сущности между режимом Egg или Head. - click-to-edit: "&4Нажмите здесь, чтобы редактировать ввод." + click-to-edit: "Нажмите здесь, чтобы редактировать ввод." input-mode: Переключайтесь между режимами ввода чата и наковальни. - library-lang: "&aЯзык: [lang]" - library-gamemode: "&aОсновной для [gamemode]" + library-lang: "Язык: [lang]" + library-gamemode: "Основной для [gamemode]" download-disabled: Загрузчик данных GitHub отключен в BentoBox. Без этого вы не можете использовать библиотеки! create-level: Добавить новый уровень. @@ -226,7 +226,7 @@ challenges: challenge-wipe: Полная чистка базы данных челленджей и их уровней! players-wipe: Полностью очищенная база данных игроков! library: Откройте GUI, который показывает все доступные публичные библиотеки. - library-version: "&9Сделано в Челленджах [version]" + library-version: "Сделано в Челленджах [version]" save: Сохраните и вернитесь к предыдущему GUI. cancel: Вернитесь к предыдущему GUI. Изменения не будут сохранены. set: Установить сумму. Нажатие на цифру установит значение на выбранный число. @@ -263,8 +263,8 @@ challenges: mode-in-world: Игроки в GameMode мире. mode-with-island: Игроки, у которых есть остров в GameMode мире. visibility-mode: Показать/Cкрыть неразрешенные челленджи. - edit-text-line: "&6Редактировать текстовое сообщение!" - add-text-line: "&6Добавить новое текстовое сообщение!" + edit-text-line: "Редактировать текстовое сообщение!" + add-text-line: "Добавить новое текстовое сообщение!" title-enable: Включите/Отключите заглавное сообщение, которое будет показано игрокам, когда они выполнят челлендж. title-showtime: Измените, как долго заглавные сообщения будут видны игроку. @@ -293,18 +293,18 @@ challenges: required-items: 'Необходимые предметы в инвентаре игрока. Предметы:' required-level: |- Укажите необходимый уровень острова для этого челленджа. - &cТребуется аддон Level.' + Требуется аддон Level.' required-money: |- Укажите необходимое кол-во денег на счету игрока. - &cТребуется Vault и любой плагин на экономику.' + Требуется Vault и любой плагин на экономику.' remove-money: |- Снять необходимое кол-во денег со счета игрока. - &cТребуется Vault и любой плагин на экономику.' + Требуется Vault и любой плагин на экономику.' reward-items: 'Изменить награду в виде предмета за первое завершение челленджа. Предметы:' reward-money: |- Изменить денежное вознаграждение за первое выполнение челленджа. - &cТребуется Vault и любой плагин на экономику. + Требуется Vault и любой плагин на экономику. reward-commands: |- Установите вознаграждения в виде команд, которые будут выполняться после первого завершения. ***Добавление "[SELF]" в начале, означает, что команда будет запущена игроком, например, "/kill" @@ -315,7 +315,7 @@ challenges: Предметы: repeat-reward-money: |- Изменить денежное вознаграждение за повторное выполнение челленджа. - &cТребуется Vault и любой плагин на экономику. + Требуется Vault и любой плагин на экономику. repeat-reward-commands: |- Установите команды в виде награды, которые будут выполняться после повторного выполнения челленджа. ***Добавление "[SELF]" в начале, означает, что команда будет запущена игроком, например, "/kill" @@ -329,13 +329,13 @@ challenges: Значение 0 - означает навсегда. island-store: |- Включить/Отключить хранение данных челленджей на каждом острове. Это означает, что челленджи будут одинаковыми для всей команды, если это включено. - &cНЕ будет конвертировать данные по клику. Прогресс будет потерян.' + НЕ будет конвертировать данные по клику. Прогресс будет потерян.' default-locked-icon: |- Изменить иконку заблокированного уровня по умолчанию. Эта опция может быть перезаписана каждым уровнем. gui-mode: |- Включить/Отключить одиночный вызов GUI. - &2Потребуется перезапустить сервер.' + Потребуется перезапустить сервер.' download: |- Обновить вручную доступные библиотеки челленджей. Щелкните правой кнопкой мыши, чтобы включить очистку кэша.' @@ -414,7 +414,7 @@ challenges: level_reward_commands: |- Команды в виде награды. Список команды которые будут выполнены в виде награды, определены в challengeLevel.rewardCommands - library-author: автор &e[автор] + library-author: автор [автор] enabled: Включено disabled: Отключено the-end: "- Край" @@ -425,17 +425,17 @@ challenges: level-unlocked: Нажмите, чтобы увидеть [level] челленджей! level-locked: Заверши больше [count] заданий, уровня [level], чтобы открыть этот уровень! - increase-by: "&aУвеличьте кол-во завершений на [value]" - reduce-by: "&aУменьшите кол-во завершений на [value]" + increase-by: "Увеличьте кол-во завершений на [value]" + reduce-by: "Уменьшите кол-во завершений на [value]" visibility: hidden: Видны только отображаемые челленджи. visible: Все челленджи видны всем toggleable: Переключить, если неиспользуемые челленджи должны отображаться type: - island: "&aтребовать блоков или мобов вокруг игрока" - other: "&aтребовать предметы от других плагинов/аддонов" - inventory: "&aтребовать предметы в инвентаре игрока" - current-value: "&6Текущее значение: [value]." + island: "требовать блоков или мобов вокруг игрока" + other: "требовать предметы от других плагинов/аддонов" + inventory: "требовать предметы в инвентаре игрока" + current-value: "Текущее значение: [value]." block: "- [block] : [count]" item: "- [count] x [item]" item-meta: "([meta])" @@ -445,37 +445,37 @@ challenges: completed-times-of: Завершено [donetimes] из [maxtimes] maxed-reached: Завершено [donetimes] из [maxtimes] completed-times: Завершено [donetimes] - objects-close-by: "&cВсе необходимые блоки и сущности должны быть рядом с вами, + objects-close-by: "Все необходимые блоки и сущности должны быть рядом с вами, на вашем острове!" - warning-entities-kill: "&cВсе необходимые сущности будут убиты, когда вы завершите + warning-entities-kill: "Все необходимые сущности будут убиты, когда вы завершите этот челлендж!" - warning-blocks-remove: "&cВсе необходимые блоки будут удалены, когда вы выполните + warning-blocks-remove: "Все необходимые блоки будут удалены, когда вы выполните этот челлендж!" - not-repeatable: "&cЭтот челлендж нельзя повторить!" - experience-reward: "&6Опыта в награде: [value]" - money-reward: "&6Денежная награда: $[value]" - required-experience: "&6Требуется опыта: [value]" - required-money: "&6Требуется денег: $[value]" - required-island-level: "&6Требуемый уровень острова: [value]" + not-repeatable: "Этот челлендж нельзя повторить!" + experience-reward: "Опыта в награде: [value]" + money-reward: "Денежная награда: $[value]" + required-experience: "Требуется опыта: [value]" + required-money: "Требуется денег: $[value]" + required-island-level: "Требуемый уровень острова: [value]" environment: 'Обязательные условия:' - reward-items: "&6Пердметы в награде:" - reward-commands: "&6Команды в награде:" + reward-items: "Пердметы в награде:" + reward-commands: "Команды в награде:" required-items: 'Требуемые предметы:' required-entities: 'Требуемые сущности:' required-blocks: 'Требуемые блоки:' - level: "&fУровень: [level]" - completed: "&bЗавершено" - warning-items-take: "&cВсе необходимые предметы будут изъяты из вашего инвентаря, + level: "Уровень: [level]" + completed: "Завершено" + warning-items-take: "Все необходимые предметы будут изъяты из вашего инвентаря, когда вы завершите этот челлендж!" level-description: - experience-reward: "&6Опыта в награде: [value]" - money-reward: "&6Денежная награда: $[value]" - reward-items: "&6Предметы в награде:" - reward-commands: "&6Команды в награде:" - waver-amount: "&6[value] челленджи могут быть пропущены, чтобы разблокировать + experience-reward: "Опыта в награде: [value]" + money-reward: "Денежная награда: $[value]" + reward-items: "Предметы в награде:" + reward-commands: "Команды в награде:" + waver-amount: "[value] челленджи могут быть пропущены, чтобы разблокировать следующий уровень." - completed: "&bЗавершено" - completed-challenges-of: "&3Вы завершили [number] из [max] челленджей на этом + completed: "Завершено" + completed-challenges-of: "Вы завершили [number] из [max] челленджей на этом уровне." item-description: item: "- [count] x [item]" @@ -496,7 +496,7 @@ challenges: book-meta: "[title] [author]" recipe-count: "[count] рецептов" questions: - prefix: "&2[СЕРВЕР]:" + prefix: "[СЕРВЕР]:" admin: unique-id: Введите уникальное имя объекта и нажмите клавишу ENTER. number: Напишите номер в чате и нажмите ENTER. @@ -510,31 +510,31 @@ challenges: messages: admin: you-added: Вы добавили один [thing] в челлендж - challenge-created: "[challenge]&r создан!" - completed: "&2Вы завершили челлендж [name] для игрока [player]!" - already-completed: "&2Этот челлендж уже был выполнен!" - reset: "&2Вы сбрасываете челлендж [name] для игрока [player]!" - reset-all: "&2Все [player] челленджи были сброшены!" - not-completed: "&2Этот челлендж еще не завершен!" - migrate-start: "&2Начать миграцию данных аддона для челленджей." - migrate-not: "&2Все данные действительны." - start-downloading: "&5Начинаем скачивать и импортировать Challenges Library." - migrate-end: "&2Данные аддона челленджей обновлены до нового формата." + challenge-created: "[challenge]создан!" + completed: "Вы завершили челлендж [name] для игрока [player]!" + already-completed: "Этот челлендж уже был выполнен!" + reset: "Вы сбрасываете челлендж [name] для игрока [player]!" + reset-all: "Все [player] челленджи были сброшены!" + not-completed: "Этот челлендж еще не завершен!" + migrate-start: "Начать миграцию данных аддона для челленджей." + migrate-not: "Все данные действительны." + start-downloading: "Начинаем скачивать и импортировать Challenges Library." + migrate-end: "Данные аддона челленджей обновлены до нового формата." hit-things: Нажмите на предметы, чтобы добавить их в список необходимых предметов. Щелкните правой кнопкой мыши, когда закончите. - complete-wipe: "&cНадеюсь, у вас есть резервные копии, потому что вы просто + complete-wipe: "Надеюсь, у вас есть резервные копии, потому что вы просто стерли все данные из базы аддона Challenges!" - challenge-wipe: "&cНадеюсь, у вас есть резервные копии, потому что вы просто + challenge-wipe: "Надеюсь, у вас есть резервные копии, потому что вы просто стерли все челленджи и их уровни!" - players-wipe: "&cНадеюсь, у вас есть резервные копии, потому что вы просто стерли + players-wipe: "Надеюсь, у вас есть резервные копии, потому что вы просто стерли все выполненные игроками челленджи!" - you-completed-challenge: "&2Вы завершили [value] &r&2челлендж!" - you-repeated-challenge: "&2Ты перепрошел [value] &r&2челлендж!" - you-repeated-challenge-multiple: "&2Вы перепрошли [value] &r&2челлендж [count] + you-completed-challenge: "Вы завершили [value] челлендж!" + you-repeated-challenge: "Ты перепрошел [value] челлендж!" + you-repeated-challenge-multiple: "Вы перепрошли [value] челлендж [count] раз!" - you-completed-level: "&2Вы завершили [value] &r&2уровень!" - name-has-completed-challenge: "&5[name] завершил [value] &r&5челлендж!" - name-has-completed-level: "&5[name] завершил [value] &r&5уровень!" + you-completed-level: "Вы завершили [value] уровень!" + name-has-completed-challenge: "[name] завершил [value] челлендж!" + name-has-completed-level: "[name] завершил [value] уровень!" import-levels: Начало импорта уровней import-challenges: Начало импорта челленджей no-levels: 'Предупреждение: Уровни не определены в challenge.yml' @@ -545,68 +545,68 @@ challenges: defaults-file-overwrite: defaults.json существует. Это будет перезаписано. defaults-file-completed: defaults.json файл заполнен челленджами из [world]! errors: - no-name: "&cОтсутствует имя челленджа" - unknown-challenge: "&cНеизвестный челлендж" - unique-id: '&cУникальный идентификатор "[id]" недействителен.' - wrong-icon: '&cДанный материал "[value]" недействителен и не может использоваться + no-name: "Отсутствует имя челленджа" + unknown-challenge: "Неизвестный челлендж" + unique-id: 'Уникальный идентификатор "[id]" недействителен.' + wrong-icon: 'Данный материал "[value]" недействителен и не может использоваться в качестве иконки.' - not-deployed: "&cЧеллендж не отображается!" - not-on-island: "&cВы должны быть на своем острове, чтобы сделать это!" - not-repeatable: "&cЭтот челлендж нельзя пройти повторно!" - not-enough-items: "&cУ тебя недостаточно [items] чтобы завершить этот челлендж!" - not-close-enough: "&cВы должны стоять в пределах [number] блоков от всех необходимых + not-deployed: "Челлендж не отображается!" + not-on-island: "Вы должны быть на своем острове, чтобы сделать это!" + not-repeatable: "Этот челлендж нельзя пройти повторно!" + not-enough-items: "У тебя недостаточно [items] чтобы завершить этот челлендж!" + not-close-enough: "Вы должны стоять в пределах [number] блоков от всех необходимых предметов." - you-still-need: "&cВам еще нужно [amount] x [item]" - not-enough-money: "&cНеобходимо иметь [value] на вашем аккаунте, чтобы завершить + you-still-need: "Вам еще нужно [amount] x [item]" + not-enough-money: "Необходимо иметь [value] на вашем аккаунте, чтобы завершить челлендж." - import-no-file: "&cНе могу найти challenges.yml файл для импорта!" - no-load: "&cОшибка: Не смог загрузить challenges.yml. [message]" - load-error: "&cОшибка: Не удается загрузить [value]." - defaults-file-exist: "&cdefaults.json уже существует. Используйте режим перезаписи, + import-no-file: "Не могу найти challenges.yml файл для импорта!" + no-load: "Ошибка: Не смог загрузить challenges.yml. [message]" + load-error: "Ошибка: Не удается загрузить [value]." + defaults-file-exist: "defaults.json уже существует. Используйте режим перезаписи, чтобы заменить его!" - defaults-file-error: "&cПроизошла ошибка при создании файла defaults.json! Проверьте + defaults-file-error: "Произошла ошибка при создании файла defaults.json! Проверьте консоль!" - missing-arguments: "&cВ команде отсутствуют аргументы." - wrong-environment: "&cВы находитесь в неправильном окружении!" - missing-addon: "&cНевозможно выполнить задание: отсутствует обязательный аддон + missing-arguments: "В команде отсутствуют аргументы." + wrong-environment: "Вы находитесь в неправильном окружении!" + missing-addon: "Невозможно выполнить задание: отсутствует обязательный аддон или плагин." - exist-challenges-or-levels: "&cЧелленджи уже существуют в вашем мире. Не могу + exist-challenges-or-levels: "Челленджи уже существуют в вашем мире. Не могу продолжить!" - no-challenges: "&cЧелленджи еще не реализованы в этом мире!" - no-challenges-admin: "&cЧелленджи еще не реализованы в этом мире! Используйте - \ &5/[command] &cчтобы добавить их!" - missing-level: "&cУровень челленджа [level] не определен в базе данных. Это может + no-challenges: "Челленджи еще не реализованы в этом мире!" + no-challenges-admin: "Челленджи еще не реализованы в этом мире! Используйте + \ /[command] чтобы добавить их!" + missing-level: "Уровень челленджа [level] не определен в базе данных. Это может привести к ошибкам!" - no-multiple-permission: "&cУ вас нет разрешения на выполнение этого задания несколько + no-multiple-permission: "У вас нет разрешения на выполнение этого задания несколько раз одновременно." - not-a-integer: '&cДанное значение "[value]" не является целым числом!' - challenge-level-not-available: "&cВы не разблокировали необходимый уровень для + not-a-integer: 'Данное значение "[value]" не является целым числом!' + challenge-level-not-available: "Вы не разблокировали необходимый уровень для выполнения этого челленджа." - incorrect: "&cНевозможно выполнить челлендж: требования неверны." - not-enough-experience: "&cНеобходимо иметь [value] опыта, чтобы завершить этот + incorrect: "Невозможно выполнить челлендж: требования неверны." + not-enough-experience: "Необходимо иметь [value] опыта, чтобы завершить этот челлендж." - island-level: "&cВаш остров должен быть [number] уровня или больше, чтобы завершить + island-level: "Ваш остров должен быть [number] уровня или больше, чтобы завершить этот челлендж!" - no-rank: "&cУ вас нет достаточно высокого ранга, чтобы сделать это." - cannot-remove-items: "&cНекоторые предметы не могут быть удалены из вашего инвентаря!" + no-rank: "У вас нет достаточно высокого ранга, чтобы сделать это." + cannot-remove-items: "Некоторые предметы не могут быть удалены из вашего инвентаря!" not-valid-integer: |- - &cЗаданное целое число "[value]" не является действительным! + Заданное целое число "[value]" не является действительным! Значение должно быть между [min] и [max]. protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5&oПереключить, кто может - &5&oзавершить челлендж + Переключить, кто может + завершить челлендж name: Защита челленджа CHALLENGES_WORLD_PROTECTION: name: Ограничения острова челленджей hint: Нет челленджей за пределами острова description: |- - &5&oВключить/Выключить - &5&oтребование к игрокам - &5&oбыть на их острове, чтобы - &5&oвыполнить челлендж. + Включить/Выключить + требование к игрокам + быть на их острове, чтобы + выполнить челлендж. version: 11 meta: authors: diff --git a/src/main/resources/locales/uk.yml b/src/main/resources/locales/uk.yml index 03fe8f64..92fad61d 100644 --- a/src/main/resources/locales/uk.yml +++ b/src/main/resources/locales/uk.yml @@ -29,803 +29,803 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0&l Меню викликів" - gamemode-gui: "&0&l Виберіть GameMode" - multiple-gui: "&0&l Скільки разів?" - admin-gui: "&0&l Меню адміністратора завдань" - edit-challenge: "&0&l Редагувати [challenge]" - edit-level: "&0&l Редагувати [level]" - settings: "&0&l Налаштування" - choose-challenge: "&0&l Виберіть завдання" - choose-level: "&0&l Виберіть рівень" - choose-player: "&0&l Виберіть програвач" - library: Бібліотека &0&l - manage-blocks: "&0&l Керувати блоками" - manage-entities: "&0&l Керувати сутностями" - type-selector: "&0&l Вибір типу завдання" - item-selector: "&0&l Вибір елементів" - block-selector: "&0&l Вибір блоку" - entity-selector: "&0&l Вибір сутності" - challenge-selector: "&0&l Вибір викликів" - statistic-selector: "&0&l Селектор статистики" - environment-selector: "&0&l Вибір середовища" + player-gui: "Меню викликів" + gamemode-gui: "Виберіть GameMode" + multiple-gui: "Скільки разів?" + admin-gui: "Меню адміністратора завдань" + edit-challenge: "Редагувати [challenge]" + edit-level: "Редагувати [level]" + settings: "Налаштування" + choose-challenge: "Виберіть завдання" + choose-level: "Виберіть рівень" + choose-player: "Виберіть програвач" + library: Бібліотека + manage-blocks: "Керувати блоками" + manage-entities: "Керувати сутностями" + type-selector: "Вибір типу завдання" + item-selector: "Вибір елементів" + block-selector: "Вибір блоку" + entity-selector: "Вибір сутності" + challenge-selector: "Вибір викликів" + statistic-selector: "Селектор статистики" + environment-selector: "Вибір середовища" buttons: free-challenges: - name: "&f&l Безкоштовні виклики" + name: "Безкоштовні виклики" description: |- - &7 Відображає список - &7 безкоштовних завдань + Відображає список + безкоштовних завдань return: - name: "&f&l Повернути" + name: "Повернути" description: |- - &7 Повернення до попереднього меню - &7 або вийти з GUI + Повернення до попереднього меню + або вийти з GUI previous: - name: "&f&l Попередня сторінка" - description: "&7 Перейти на сторінку &e [number] &7" + name: "Попередня сторінка" + description: "Перейти на сторінку [number] " next: - name: "&f&l Наступна сторінка" - description: "&7 Перейти на сторінку &e [number] &7" + name: "Наступна сторінка" + description: "Перейти на сторінку [number] " reduce: - name: "&f&l Зменшити" - description: "&7 Зменшити на &e [number]" + name: "Зменшити" + description: "Зменшити на [number]" increase: - name: "&f&l Збільшити" - description: "&7 Зменшити на &e [number]" + name: "Збільшити" + description: "Зменшити на [number]" accept: - name: "&f&l Завершено" + name: "Завершено" description: |- - &7 Виконати завдання &e [number] - &7 раз(ів) + Виконати завдання [number] + раз(ів) quit: - name: "&f&l Вийти" - description: "&7 Вийти з GUI." + name: "Вийти" + description: "Вийти з GUI." complete_user_challenges: - name: "&f&l Виконайте завдання користувача(-и)" + name: "Виконайте завдання користувача(-и)" description: |- - &7 Дозволяє вибрати користувача та - &7 завершити виклик(и) для - &7 його + Дозволяє вибрати користувача та + завершити виклик(и) для + його reset_user_challenges: - name: "&f&l Скинути виклики користувача" + name: "Скинути виклики користувача" description: |- - &7 Дозволяє вибрати користувача та - &7 скинути його виклики + Дозволяє вибрати користувача та + скинути його виклики add_challenge: - name: "&f&l Створити виклик" + name: "Створити виклик" description: |- - &7 Запускає процес для - &7 створення нового виклику. + Запускає процес для + створення нового виклику. add_level: - name: "&f&l Створити рівень" + name: "Створити рівень" description: |- - &7 Запускає процес для - &7 створення нового рівня. + Запускає процес для + створення нового рівня. edit_challenge: - name: "&f&l Редагувати завдання" + name: "Редагувати завдання" description: |- - &7 Дозволяє вибирати та редагувати - &7 виклик. + Дозволяє вибирати та редагувати + виклик. edit_level: - name: "&f&l Редагувати рівень" + name: "Редагувати рівень" description: |- - &7 Дозволяє вибирати та редагувати - &7 рівень. + Дозволяє вибирати та редагувати + рівень. delete_challenge: - name: "&f&l Видалити завдання" + name: "Видалити завдання" description: |- - &7 Дозволяє вибирати та видаляти - &7 виклик. + Дозволяє вибирати та видаляти + виклик. delete_level: - name: "&f&l Видалити рівень" + name: "Видалити рівень" description: |- - &7 Дозволяє вибирати та видаляти - &7 рівень. + Дозволяє вибирати та видаляти + рівень. edit_settings: - name: "&f&l Налаштування" + name: "Налаштування" description: |- - &7 Дозволяє переглядати та редагувати - &7 налаштування аддона. + Дозволяє переглядати та редагувати + налаштування аддона. complete_wipe: - name: "&f&l Повне очищення" + name: "Повне очищення" description: |- - &7 Повністю усуває проблеми - &7 база даних аддонів, у тому числі - &7 даних користувача. + Повністю усуває проблеми + база даних аддонів, у тому числі + даних користувача. challenge_wipe: - name: "&f&l Витирання виклику" + name: "Витирання виклику" description: |- - &7 Повністю усуває проблеми - &7 та рівні з бази даних. + Повністю усуває проблеми + та рівні з бази даних. user_wipe: - name: "&f&l Стирання користувача" + name: "Стирання користувача" description: |- - &7 Повністю очищає користувача - &7 дані з бази даних. + Повністю очищає користувача + дані з бази даних. library: - name: "&f&l Бібліотека" + name: "Бібліотека" description: |- - &7 Відкриває паблік - Бібліотека &7 викликів. + Відкриває паблік + Бібліотека викликів. import_database: - name: "&f&l Імпорт бази даних" + name: "Імпорт бази даних" description: |- - &7 Дозволяє імпортувати експортовані - База даних викликів &7. + Дозволяє імпортувати експортовані + База даних викликів . import_template: - name: "&f&l Імпортувати шаблон" + name: "Імпортувати шаблон" description: |- - &7 Дозволяє імпортувати шаблон - &7 файл із викликами. + Дозволяє імпортувати шаблон + файл із викликами. export_challenges: - name: "&f&l Виклики експорту" + name: "Виклики експорту" description: |- - &7 Дозволяє експортувати базу даних - &7 до локального файлу. + Дозволяє експортувати базу даних + до локального файлу. properties: - name: "&f&l властивості" - description: "&7 Переглянути всі основні властивості." + name: "властивості" + description: "Переглянути всі основні властивості." requirements: - name: "&f&l Вимоги" - description: "&7 Переглянути властивості вимог." + name: "Вимоги" + description: "Переглянути властивості вимог." rewards: - name: "&f&l Нагороди" - description: "&7 Переглянути властивості нагород." + name: "Нагороди" + description: "Переглянути властивості нагород." deployed: - name: "&f&l Розгортання" + name: "Розгортання" description: |- - &7 Перемкнути, якщо виклик є - &7 розгорнуто, і користувачі можуть - &7 завершити його. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Перемкнути, якщо виклик є + розгорнуто, і користувачі можуть + завершити його. + enabled: "Увімкнено" + disabled: "Вимкнено" name: - name: "&f&l Ім'я" + name: "Ім'я" description: |- - &7 Дозволяє змінювати - &7 відображуване ім'я. - value: "&7 Зараз: &r [nane]" + Дозволяє змінювати + відображуване ім'я. + value: "Зараз: [nane]" remove_on_complete: - name: "&f&l Приховати після завершення" + name: "Приховати після завершення" description: |- - &7 Перемкнути, якщо виклик повинен - &7 прихований від гравця після - &7 це завершено. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Перемкнути, якщо виклик повинен + прихований від гравця після + це завершено. + enabled: "Увімкнено" + disabled: "Вимкнено" description: - name: "&f&l Опис" + name: "Опис" description: |- - &7 Конкретний опис - &7 за виклик. Колір - До нього необхідно застосувати коди &7. - value: "&7 Поточний опис:" + Конкретний опис + за виклик. Колір + До нього необхідно застосувати коди . + value: "Поточний опис:" environment: - name: "&f&l Розмір" + name: "Розмір" description: |- - &7 Дозволяє обмежити, у якому - &7 оцініть завдання - &7 можна завершити. - enabled: "&2" + Дозволяє обмежити, у якому + оцініть завдання + можна завершити. + enabled: "" disabled: і c order: - name: "&f&l Порядок" - description: |- - &7 Дозволяє змінювати порядок - &7 об'єктів. - &7 Об’єкти з рівними номерами - &7 замовлять їх - &7 унікальних імен ідентифікаторів. - value: "&7 Поточне замовлення: &e [number]" + name: "Порядок" + description: |- + Дозволяє змінювати порядок + об'єктів. + Об’єкти з рівними номерами + замовлять їх + унікальних імен ідентифікаторів. + value: "Поточне замовлення: [number]" icon: - name: "&f&l Значок" + name: "Значок" description: |- - &7 Дозволяє змінити значок - &7 за цей виклик. + Дозволяє змінити значок + за цей виклик. locked_icon: - name: "&f&l Заблокований значок" + name: "Заблокований значок" description: |- - &7 Дозволяє змінювати заблоковані - значок рівня &7. + Дозволяє змінювати заблоковані + значок рівня . required_permissions: - name: "&f&l Необхідні дозволи" - description: |- - &7 Дозволяє змінювати потрібні - &7 дозволів для цього - &7 завдання, яке потрібно виконати. - title: "&7 Дозволи:" - permission: " &8 - [permission]" - none: "&7 Дозволи не встановлено." + name: "Необхідні дозволи" + description: |- + Дозволяє змінювати потрібні + дозволів для цього + завдання, яке потрібно виконати. + title: "Дозволи:" + permission: " - [permission]" + none: "Дозволи не встановлено." remove_entities: - name: "&f&l Видалити сутності" - description: |- - &7 Дозволяє перемикати якщо - &7 необхідних сутностей будуть - &7 бути видаленим зі світу - &7 після завершення - &7 завдання. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Видалити сутності" + description: |- + Дозволяє перемикати якщо + необхідних сутностей будуть + бути видаленим зі світу + після завершення + завдання. + enabled: "Увімкнено" + disabled: "Вимкнено" required_entities: - name: "&f&l Обов'язкові сутності" - description: |- - &7 Дозволяє змінювати потрібні - &7 сутностей для цього - &7 завдання, яке потрібно виконати. - title: "&7 Сутності:" - list: " &8 - [number] x [entity]" - none: "&7 Сутності не додано." + name: "Обов'язкові сутності" + description: |- + Дозволяє змінювати потрібні + сутностей для цього + завдання, яке потрібно виконати. + title: "Сутності:" + list: " - [number] x [entity]" + none: "Сутності не додано." remove_blocks: - name: "&f&l Видалити блоки" - description: |- - &7 Дозволяє перемикати якщо - &7 необхідних блоків буде - &7 буде видалено зі світу - &7 після завершення - &7 завдання. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Видалити блоки" + description: |- + Дозволяє перемикати якщо + необхідних блоків буде + буде видалено зі світу + після завершення + завдання. + enabled: "Увімкнено" + disabled: "Вимкнено" required_blocks: - name: "&f&l Необхідні блоки" - description: |- - &7 Дозволяє змінювати потрібні - &7 блоків для цього - &7 завдання, яке потрібно виконати. - title: "&7 блоків:" - list: "&8 - [number] x [entity]" - none: "&7 Блоки не додаються." + name: "Необхідні блоки" + description: |- + Дозволяє змінювати потрібні + блоків для цього + завдання, яке потрібно виконати. + title: "блоків:" + list: "- [number] x [entity]" + none: "Блоки не додаються." search_radius: - name: "&f&l Радіус пошуку" + name: "Радіус пошуку" description: |- - &7 Дозволяє змінювати радіус - &7 навколо гравця, з якого - &7 блоків та/або сутностей - &7 виявлено. - value: "&7 Поточна відстань: &e [number]" + Дозволяє змінювати радіус + навколо гравця, з якого + блоків та/або сутностей + виявлено. + value: "Поточна відстань: [number]" remove_items: - name: "&f&l Видалити елементи" - description: |- - &7 Дозволяє перемикати якщо - &7 обов'язкових елементів будуть - &7 буде видалено з інвентарю - &7 після завершення - &7 завдання. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Видалити елементи" + description: |- + Дозволяє перемикати якщо + обов'язкових елементів будуть + буде видалено з інвентарю + після завершення + завдання. + enabled: "Увімкнено" + disabled: "Вимкнено" required_items: - name: "&f&l Обов'язкові елементи" - description: |- - &7 Дозволяє змінювати потрібні - &7 елементів для цього - &7 завдання, яке потрібно виконати. - title: "&7 елементів:" - list: " &8 - [number] x [entity]" - none: "&7 Елементи не додано." + name: "Обов'язкові елементи" + description: |- + Дозволяє змінювати потрібні + елементів для цього + завдання, яке потрібно виконати. + title: "елементів:" + list: " - [number] x [entity]" + none: "Елементи не додано." add_ignored_meta: - name: "&f&l Додати ігнорувати метадані" - description: |- - &7 Дозволяє додати which - &7 елементів слід ігнорувати - &7 будь-які метадані, які - Їм призначається &7. - title: "&7 елементів:" - list: " &8 - [number] x [entity]" - none: "&7 Елементи не додано." + name: "Додати ігнорувати метадані" + description: |- + Дозволяє додати which + елементів слід ігнорувати + будь-які метадані, які + Їм призначається . + title: "елементів:" + list: " - [number] x [entity]" + none: "Елементи не додано." remove_ignored_meta: - name: "&f&l Видалити ігнорувати метадані" + name: "Видалити ігнорувати метадані" description: |- - &7 Дозволяє видалити які - &7 елементів слід ігнорувати - &7 будь-які метадані, які - Їм призначається &7. + Дозволяє видалити які + елементів слід ігнорувати + будь-які метадані, які + Їм призначається . remove_experience: - name: "&f&l Видалити досвід" - description: |- - &7 Дозволяє перемикати якщо - &7 необхідний досвід буде - &7 буде видалено з гравця - &7 після завершення - &7 завдання. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Видалити досвід" + description: |- + Дозволяє перемикати якщо + необхідний досвід буде + буде видалено з гравця + після завершення + завдання. + enabled: "Увімкнено" + disabled: "Вимкнено" required_experience: - name: "&f&l Необхідний досвід" + name: "Необхідний досвід" description: |- - &7 Дозволяє змінювати - &7 необхідний досвід для - &7 гравець. - value: "&7 Поточний досвід: &e [number]" + Дозволяє змінювати + необхідний досвід для + гравець. + value: "Поточний досвід: [number]" required_level: - name: "&f&l Необхідний рівень острова" + name: "Необхідний рівень острова" description: |- - &7 Дозволяє змінювати - &7 необхідний рівень острова - &7 за виклик. - value: "&7 Поточний рівень: &e [number]" + Дозволяє змінювати + необхідний рівень острова + за виклик. + value: "Поточний рівень: [number]" remove_money: - name: "&f&l Видалити гроші" - description: |- - &7 Дозволяє перемикати якщо - &7 потрібні гроші будуть - &7 буде видалено з гравця - &7 обліковий запис після завершення - &7 виклик. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Видалити гроші" + description: |- + Дозволяє перемикати якщо + потрібні гроші будуть + буде видалено з гравця + обліковий запис після завершення + виклик. + enabled: "Увімкнено" + disabled: "Вимкнено" required_money: - name: "&f&l Необхідні гроші" + name: "Необхідні гроші" description: |- - &7 Дозволяє змінювати - &7 потрібні гроші для гравця - &7 рахунок для виклику. - value: "&7 Поточне значення: &e [number]" + Дозволяє змінювати + потрібні гроші для гравця + рахунок для виклику. + value: "Поточне значення: [number]" statistic: - name: "&f&l Статистика" + name: "Статистика" description: |- - &7 Дозволяє змінювати - &7 тип статистики - &7 перевірив у цьому виклику. - value: "&7 Поточне значення: &e [statistic]" + Дозволяє змінювати + тип статистики + перевірив у цьому виклику. + value: "Поточне значення: [statistic]" statistic_amount: - name: "&f&l Цільове значення" + name: "Цільове значення" description: |- - &7 Дозволяє змінювати - &7 статистичне цільове значення - &7, які повинні бути виконані. - value: "&7 Поточне значення: &e [number]" + Дозволяє змінювати + статистичне цільове значення + , які повинні бути виконані. + value: "Поточне значення: [number]" remove_statistic: - name: "&f&l Зменшити статистику" - description: |- - &7 Дозволяє перемикати якщо - &7 статистичне значення буде - &7 буде зменшено після завершення - &7 виклик. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Зменшити статистику" + description: |- + Дозволяє перемикати якщо + статистичне значення буде + буде зменшено після завершення + виклик. + enabled: "Увімкнено" + disabled: "Вимкнено" statistic_blocks: - name: "&f&l Цільовий блок" + name: "Цільовий блок" description: |- - &7 Дозволяє змінювати - &7 статистичний цільовий блок. - value: "&7 Поточний блок: &e [block]" + Дозволяє змінювати + статистичний цільовий блок. + value: "Поточний блок: [block]" statistic_items: - name: "&f&l Цільовий елемент" + name: "Цільовий елемент" description: |- - &7 Дозволяє змінювати - &7 статистичний цільовий елемент. - value: "&7 Поточний елемент: &e [item]" + Дозволяє змінювати + статистичний цільовий елемент. + value: "Поточний елемент: [item]" statistic_entities: - name: "&f&l Цільова сутність" + name: "Цільова сутність" description: |- - &7 Дозволяє змінювати - &7 статистична цільова сутність. - value: "&7 Поточна сутність: &e [entity]" + Дозволяє змінювати + статистична цільова сутність. + value: "Поточна сутність: [entity]" reward_text: - name: "&f&l Текст винагороди" + name: "Текст винагороди" description: |- - &7 Конкретний текст винагороди. - &7 Кольорові коди мають бути - &7 застосовано до нього. - value: "&7 Поточний текст:" + Конкретний текст винагороди. + Кольорові коди мають бути + застосовано до нього. + value: "Поточний текст:" repeat_reward_text: - name: "&f&l Повторити текст винагороди" + name: "Повторити текст винагороди" description: |- - &7 Конкретний повторний текст винагороди - &7 за виклик. Колір - До нього необхідно застосувати коди &7. - value: "&7 Поточний текст:" + Конкретний повторний текст винагороди + за виклик. Колір + До нього необхідно застосувати коди . + value: "Поточний текст:" reward_items: - name: "&f&l Нагородні предмети" + name: "Нагородні предмети" description: |- - &7 Дозволяє змінювати винагороду - &7 предметів. - title: "&7 елементів:" - list: " &8 - [number] x [item]" - none: "&7 Елементи не додано." + Дозволяє змінювати винагороду + предметів. + title: "елементів:" + list: " - [number] x [item]" + none: "Елементи не додано." repeat_reward_items: - name: "&f&l Повторюйте елементи винагороди" - description: |- - &7 Дозволяє змінити повтор - &7 предметів нагороди за це - &7 завдання. - title: "&7 елементів:" - list: " &8 - [number] x [item]" - none: "&7 Елементи не додано." + name: "Повторюйте елементи винагороди" + description: |- + Дозволяє змінити повтор + предметів нагороди за це + завдання. + title: "елементів:" + list: " - [number] x [item]" + none: "Елементи не додано." reward_experience: - name: "&f&l Досвід винагороди" + name: "Досвід винагороди" description: |- - &7 Дозволяє змінювати - &7 винагорода за досвід - &7 гравець. - value: "&7 Поточний рівень: &e [number]" + Дозволяє змінювати + винагорода за досвід + гравець. + value: "Поточний рівень: [number]" repeat_reward_experience: - name: "&f&l Повторіть нагороду" + name: "Повторіть нагороду" description: |- - &7 Дозволяє змінювати - &7 повторний досвід винагороди - &7 для гравця. - value: "&7 Поточний рівень: &e [number]" + Дозволяє змінювати + повторний досвід винагороди + для гравця. + value: "Поточний рівень: [number]" reward_money: - name: "&f&l Гроші винагороди" + name: "Гроші винагороди" description: |- - &7 Дозволяє змінювати - &7 грошова винагорода. - value: "&7 Поточне значення: &e [number]" + Дозволяє змінювати + грошова винагорода. + value: "Поточне значення: [number]" repeat_reward_money: - name: "&f&l Повторити винагороду" + name: "Повторити винагороду" description: |- - &7 Дозволяє змінювати - &7 повторити грошову винагороду - &7 за виклик. - value: "&7 Поточне значення: &e [number]" + Дозволяє змінювати + повторити грошову винагороду + за виклик. + value: "Поточне значення: [number]" reward_commands: - name: "&f&l Команди винагороди" - description: |- - &7 Конкретні команди винагороди. - &8 Порада: - &8 Команда не вимагає - &8 написання першого `/` як буде - &8 буде застосовано автоматично. - &8 За замовчуванням команди будуть - &8 виконується сервером. Проте - &8 додавання `[SELF]` на початку - &8 дозволить команді бути - &8 виконується гравцем. Він також - &8 підтримує один заповнювач - &8 `[player]` це буде - &8 замінено іменем гравця - &8, який виконав завдання. - value: "&7 Поточні команди:" + name: "Команди винагороди" + description: |- + Конкретні команди винагороди. + Порада: + Команда не вимагає + написання першого `/` як буде + буде застосовано автоматично. + За замовчуванням команди будуть + виконується сервером. Проте + додавання `[SELF]` на початку + дозволить команді бути + виконується гравцем. Він також + підтримує один заповнювач + `[player]` це буде + замінено іменем гравця + , який виконав завдання. + value: "Поточні команди:" repeat_reward_commands: - name: "&f&l Повторити команди винагороди" - description: |- - &7 Конкретна повторна винагорода - &7 команд для завдання. - &8 Порада: - &8 Команда не вимагає - &8 написання першого `/` як буде - &8 буде застосовано автоматично. - &8 За замовчуванням команди будуть - &8 виконується сервером. Проте - &8 додавання `[SELF]` на початку - &8 дозволить команді бути - &8 виконується гравцем. Він також - &8 підтримує один заповнювач - &8 `[player]` це буде - &8 замінено іменем гравця - &8, який виконав завдання. - value: "&7 Поточні команди:" + name: "Повторити команди винагороди" + description: |- + Конкретна повторна винагорода + команд для завдання. + Порада: + Команда не вимагає + написання першого `/` як буде + буде застосовано автоматично. + За замовчуванням команди будуть + виконується сервером. Проте + додавання `[SELF]` на початку + дозволить команді бути + виконується гравцем. Він також + підтримує один заповнювач + `[player]` це буде + замінено іменем гравця + , який виконав завдання. + value: "Поточні команди:" repeatable: - name: "&f&l Повторюється" + name: "Повторюється" description: |- - &7 Дозволяє перемикати якщо - &7 виклик полягає в тому - &7 повторюється. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Дозволяє перемикати якщо + виклик полягає в тому + повторюється. + enabled: "Увімкнено" + disabled: "Вимкнено" repeat_count: - name: "&f&l Підрахунок повторів" + name: "Підрахунок повторів" description: |- - &7 Дозволяє змінювати - &7 кількість повторень - &7 за виклик. - value: "&7 Поточне значення: &e [number]" + Дозволяє змінювати + кількість повторень + за виклик. + value: "Поточне значення: [number]" cool_down: - name: "&f&l Охолодження" - description: |- - &7 Дозволяє змінювати - &7 охолонути секунд, що - &7 потрібно почекати між - &7 повторюване завдання - &7 завершень. - value: "&7 Поточне значення: &e [time]" + name: "Охолодження" + description: |- + Дозволяє змінювати + охолонути секунд, що + потрібно почекати між + повторюване завдання + завершень. + value: "Поточне значення: [time]" challenges: - name: "&f&l Виклики" + name: "Виклики" description: |- - &7 Перегляньте призначені завдання - &7 до рівня. + Перегляньте призначені завдання + до рівня. waiver_amount: - name: "&f&l Сума відмови" + name: "Сума відмови" description: |- - &7 Дозволяє встановити число - &7 викликів, які можуть - &7 залишити незавершеним для - &7 розблокування наступного рівня. - value: "&7 Поточне значення: &e [number]" + Дозволяє встановити число + викликів, які можуть + залишити незавершеним для + розблокування наступного рівня. + value: "Поточне значення: [number]" add_challenges: - name: "&f&l Додати виклик(и)" + name: "Додати виклик(и)" description: |- - &7 Дозволяє вибрати та - &7 додає виклики - &7 рівень. + Дозволяє вибрати та + додає виклики + рівень. remove_challenges: - name: "&f&l Видалити виклик(и)" + name: "Видалити виклик(и)" description: |- - &7 Дозволяє вибрати та - &7 видалити виклики для - &7 рівень. + Дозволяє вибрати та + видалити виклики для + рівень. reset_on_new: - name: "&f&l Скинути на новий" - description: |- - &7 Дозволяє перемикати якщо - &7 проблем має бути - &7 скидання, коли користувач залишає - &7 острів або створює новий - &7 острів. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Скинути на новий" + description: |- + Дозволяє перемикати якщо + проблем має бути + скидання, коли користувач залишає + острів або створює новий + острів. + enabled: "Увімкнено" + disabled: "Вимкнено" broadcast: - name: "&f&l Трансляція" + name: "Трансляція" description: |- - &7 Трансляції виклик і - &7 рівень перше завершення - &7 кожному. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Трансляції виклик і + рівень перше завершення + кожному. + enabled: "Увімкнено" + disabled: "Вимкнено" remove_completed: - name: "&f&l Приховати завершено" + name: "Приховати завершено" description: |- - &7 Приховує виконані завдання - &7 з меню. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Приховує виконані завдання + з меню. + enabled: "Увімкнено" + disabled: "Вимкнено" glow_completed: - name: "&f&l Світіння завершено" + name: "Світіння завершено" description: |- - &7 Додає чарівне сяйво - &7 до виконаних завдань. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Додає чарівне сяйво + до виконаних завдань. + enabled: "Увімкнено" + disabled: "Вимкнено" store_history: - name: "&f&l Історія магазину" - description: |- - &7 Зберігає внутрішню історію - &7, коли є кожне завдання - &7 завершено. - &7 Наразі лише для перегляду - &7 у базі даних. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Історія магазину" + description: |- + Зберігає внутрішню історію + , коли є кожне завдання + завершено. + Наразі лише для перегляду + у базі даних. + enabled: "Увімкнено" + disabled: "Вимкнено" data_per_island: - name: "&f&l Магазин для кожного острова" - description: |- - &7 Зберігає виконане - &7 викликів на острів. - &7 Буде надано спільний доступ до прогресу - &7 з усіма гравцями в команді. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Магазин для кожного острова" + description: |- + Зберігає виконане + викликів на острів. + Буде надано спільний доступ до прогресу + з усіма гравцями в команді. + enabled: "Увімкнено" + disabled: "Вимкнено" show_title: - name: "&f&l Показати назву" + name: "Показати назву" description: |- - &7 Показує назву, коли a - &7 виклик або рівень - &7 завершено. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + Показує назву, коли a + виклик або рівень + завершено. + enabled: "Увімкнено" + disabled: "Вимкнено" gamemode_gui: - name: "&f&l Графічний інтерфейс вибору GameMode" - description: |- - &7 Вмикає один GUI, який - &7 доступний через /challenges - &7 команда. - &c Вимагає перезавантаження сервера. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Графічний інтерфейс вибору GameMode" + description: |- + Вмикає один GUI, який + доступний через /challenges + команда. + Вимагає перезавантаження сервера. + enabled: "Увімкнено" + disabled: "Вимкнено" locked_level_icon: - name: "&f&l Значок заблокованого рівня за умовчанням" + name: "Значок заблокованого рівня за умовчанням" description: |- - &7 Значок за умовчанням для всіх заблокованих - &7 рівнів. Кожен рівень може змінюватися - &7 цей значок. + Значок за умовчанням для всіх заблокованих + рівнів. Кожен рівень може змінюватися + цей значок. purge_history: - name: "&f&l Історія життя" - description: |- - &7 Кількість днів як довго - &7 дані історії зберігаються - &7 у даних користувача. - &7 0 означає, що дані будуть - &7 не видаляти. - value: "&7 Поточне значення: &e [number]" + name: "Історія життя" + description: |- + Кількість днів як довго + дані історії зберігаються + у даних користувача. + 0 означає, що дані будуть + не видаляти. + value: "Поточне значення: [number]" title_showtime: - name: "&f&l Час показу заголовка" + name: "Час показу заголовка" description: |- - &7 Кількість позначок цієї назви - &7 буде показано гравцеві. - value: "&7 Поточне значення: &e [number]" + Кількість позначок цієї назви + буде показано гравцеві. + value: "Поточне значення: [number]" active_world_list: - name: "&f&l Показати лише активний світ" - description: |- - &7 Якщо графічний інтерфейс вибору GameMode - &7 увімкнено, це можна перемикати - &7, якщо GUI показує вибір GameMode - &7 або виклики для сучасного світу. - &c Вимагає перезавантаження сервера. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Показати лише активний світ" + description: |- + Якщо графічний інтерфейс вибору GameMode + увімкнено, це можна перемикати + , якщо GUI показує вибір GameMode + або виклики для сучасного світу. + Вимагає перезавантаження сервера. + enabled: "Увімкнено" + disabled: "Вимкнено" visibility_mode: - name: "&f&l Режим видимості" + name: "Режим видимості" description: |- - &7 Режим видимості для - &7 проблем, які є - &7 приховано. - enabled: "&2" - disabled: "&c" + Режим видимості для + проблем, які є + приховано. + enabled: "" + disabled: "" visible: Покажіть видимі виклики hidden: Показати всі виклики toggleable: Дозволити перемикання include_undeployed: - name: "&f&l Включити нерозгорнуті завдання" - description: |- - &7 Вказує, якщо не розгорнуто - &7 проблем має бути - &7 зараховується до рівня - &7 завершення. - enabled: "&2 Увімкнено" - disabled: "&c Вимкнено" + name: "Включити нерозгорнуті завдання" + description: |- + Вказує, якщо не розгорнуто + проблем має бути + зараховується до рівня + завершення. + enabled: "Увімкнено" + disabled: "Вимкнено" download: - name: "&f&l Бібліотеки завантажень" + name: "Бібліотеки завантажень" description: |- - &7 Доступне оновлення вручну - &7 викликів бібліотек. - enabled: "&2 З очищенням кешу" - disabled: "&c Без очищення кешу" + Доступне оновлення вручну + викликів бібліотек. + enabled: "З очищенням кешу" + disabled: "Без очищення кешу" player: - name: "&f&l [name]" - description: 'Власник острова &7: [owner]' - members: "&7 членів острова:" - member: "&8 - [name]" + name: "[name]" + description: 'Власник острова : [owner]' + members: "членів острова:" + member: "- [name]" no-island: |- - &c Гравець не має - &c острів. + Гравець не має + острів. player_list: - name: "&f&l Виберіть список користувачів" + name: "Виберіть список користувачів" description: |- - &7 Виберіть список користувачів - Має бути показано &7. - enabled: "&2" - disabled: "&c" + Виберіть список користувачів + Має бути показано . + enabled: "" + disabled: "" online: Онлайн гравці with_island: Гравці з островами in_world: Гравці у світі add_block: - name: "&f&l Додати блок" + name: "Додати блок" description: |- - &7 Дозволяє додати новий - &7 блок до списку. + Дозволяє додати новий + блок до списку. remove_block: - name: "&f&l Видалити блок" + name: "Видалити блок" description: |- - &7 Дозволяє видалити - &7 вибраних блоків - &7 зі списків. - title: "&7 Вибрані матеріали:" - material: "&8 - [material]" + Дозволяє видалити + вибраних блоків + зі списків. + title: "Вибрані матеріали:" + material: "- [material]" material: - name: "&8 - [material]" - description: "&7 Ідентифікатор матеріалу: [id]" - selected: "&2 Вибрано" + name: "- [material]" + description: "Ідентифікатор матеріалу: [id]" + selected: "Вибрано" add_entity: - name: "&f&l Додати сутність" + name: "Додати сутність" description: |- - &7 Дозволяє додати новий - &7 сутність до списку. + Дозволяє додати новий + сутність до списку. switch_entity: - name: "&f&l Зміна яєць" + name: "Зміна яєць" description: |- - &7 Дозволяє перемикатися з - &7 яєць головам натовпу. + Дозволяє перемикатися з + яєць головам натовпу. remove_entity: - name: "&f&l Видалити сутність" + name: "Видалити сутність" description: |- - &7 Дозволяє видалити - &7 вибраних сутностей - &7 зі списків. - title: "&7 Вибрані сутності:" - entity: "&8 - [entity]" + Дозволяє видалити + вибраних сутностей + зі списків. + title: "Вибрані сутності:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 Ідентифікатор організації: [id]" - selected: "&2 Вибрано" + name: "[entity]" + description: "Ідентифікатор організації: [id]" + selected: "Вибрано" inventory_type: - name: "&f&l Тип запасів" + name: "Тип запасів" description: |- - &7 Виклик, який перевіряє - &7 предметів в інвентарі гравця + Виклик, який перевіряє + предметів в інвентарі гравця island_type: - name: "&f&l Тип острова" + name: "Тип острова" description: |- - &7 Виклик, який перевіряє - &7 блоків або сутностей навколо - &7 гравець. + Виклик, який перевіряє + блоків або сутностей навколо + гравець. other_type: - name: "&f&l Інший тип" + name: "Інший тип" description: |- - &7 Виклик, який використовує - &7 плагінів або додаткових речей, - &7 як рівень і гроші. + Виклик, який використовує + плагінів або додаткових речей, + як рівень і гроші. statistic_type: - name: "&f&l Тип статистики" + name: "Тип статистики" description: |- - &7 Виклик, який перевіряє - &7 статистичні дані гравців. + Виклик, який перевіряє + статистичні дані гравців. save: - name: "&f&l Зберегти" + name: "Зберегти" description: |- - &7 Зберігає зміни та - &7 повертає. + Зберігає зміни та + повертає. cancel: - name: "&f&l Скасувати" + name: "Скасувати" description: |- - &7 Скасування змін і - &7 повертає. + Скасування змін і + повертає. accept_selected: - name: "&f&l Прийняти вибране" + name: "Прийняти вибране" description: |- - &7 Повертає вибрані елементи - &7 і відкриває попередній графічний інтерфейс. - title: "&7 Вибрано:" - element: "&8 - [element]" + Повертає вибрані елементи + і відкриває попередній графічний інтерфейс. + title: "Вибрано:" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l Пошук" + name: "Пошук" description: |- - &7 Дозволяє шукати - &7 елемент із введенням - &7 текстове значення. - search: "&b Значення: [value]" + Дозволяє шукати + елемент із введенням + текстове значення. + search: "Значення: [value]" tips: - click-to-select: "&e Натисніть &7, щоб вибрати." - click-to-choose: "&e Натисніть &7, щоб вибрати." - click-to-complete: "&e Натисніть &7, щоб завершити." - right-click-multiple-open: "&e Клацніть правою кнопкою миші &7, щоб вибрати + click-to-select: "Натисніть , щоб вибрати." + click-to-choose: "Натисніть , щоб вибрати." + click-to-complete: "Натисніть , щоб завершити." + right-click-multiple-open: "Клацніть правою кнопкою миші , щоб вибрати кількість завершень." - shift-left-click-to-complete-all: "&e Shift Натисніть &7, щоб завершити все." - left-click-to-accept: "&e Клацніть лівою кнопкою миші &7, щоб завершити." - right-click-to-write: "&e Клацніть правою кнопкою миші &7, щоб написати." - click-to-reduce: "&e Натисніть &7, щоб зменшити." - click-to-increase: "&e Натисніть &7, щоб збільшити." - click-to-return: "&e Натисніть &7, щоб повернутися." - click-to-quit: "&e Натисніть &7, щоб вийти." - click-to-wipe: "&e Натисніть &7, щоб стерти." - left-click-to-wipe: "&e Клацніть лівою кнопкою миші &7, щоб стерти." - right-click-to-switch: "&e Клацніть правою кнопкою миші &7, щоб переключитися." - click-to-open: "&e Натисніть &7, щоб відкрити." - click-to-export: "&e Натисніть &7, щоб експортувати." - click-to-create: "&e Натисніть &7, щоб створити." - left-click-to-open: "&e Клацніть лівою кнопкою миші &7, щоб відкрити." - right-click-to-reset-all: "&e Клацніть правою кнопкою миші &7, щоб стерти все." - click-to-toggle: "&e Натисніть &7, щоб перемкнути." - click-to-change: "&e Натисніть &7, щоб змінити." - shift-click-to-reset: "&e Shift Натисніть &7, щоб скинути." - click-to-add: "&e Натисніть &7, щоб додати." - click-to-remove: "&e Натисніть &7, щоб видалити." - left-click-to-cycle: "&e Клацніть лівою кнопкою миші &7, щоб перейти вниз." - right-click-to-cycle: "&e Клацніть правою кнопкою миші &7, щоб перейти вгору." - click-to-edit: "&e Натисніть &7, щоб редагувати." - left-click-to-download: "&e Клацніть лівою кнопкою миші &7, щоб завантажити." - right-click-to-toggle: "&e Клацніть правою кнопкою миші &7 для перемикання." - click-to-install: "&e Натисніть &7, щоб установити." - click-to-reset-all: "&e Натисніть &7, щоб скинути все." - right-click-to-select: "&e Клацніть правою кнопкою миші &7, щоб вибрати." - right-click-to-deselect: "&e Клацніть правою кнопкою миші &7, щоб скасувати + shift-left-click-to-complete-all: "Shift Натисніть , щоб завершити все." + left-click-to-accept: "Клацніть лівою кнопкою миші , щоб завершити." + right-click-to-write: "Клацніть правою кнопкою миші , щоб написати." + click-to-reduce: "Натисніть , щоб зменшити." + click-to-increase: "Натисніть , щоб збільшити." + click-to-return: "Натисніть , щоб повернутися." + click-to-quit: "Натисніть , щоб вийти." + click-to-wipe: "Натисніть , щоб стерти." + left-click-to-wipe: "Клацніть лівою кнопкою миші , щоб стерти." + right-click-to-switch: "Клацніть правою кнопкою миші , щоб переключитися." + click-to-open: "Натисніть , щоб відкрити." + click-to-export: "Натисніть , щоб експортувати." + click-to-create: "Натисніть , щоб створити." + left-click-to-open: "Клацніть лівою кнопкою миші , щоб відкрити." + right-click-to-reset-all: "Клацніть правою кнопкою миші , щоб стерти все." + click-to-toggle: "Натисніть , щоб перемкнути." + click-to-change: "Натисніть , щоб змінити." + shift-click-to-reset: "Shift Натисніть , щоб скинути." + click-to-add: "Натисніть , щоб додати." + click-to-remove: "Натисніть , щоб видалити." + left-click-to-cycle: "Клацніть лівою кнопкою миші , щоб перейти вниз." + right-click-to-cycle: "Клацніть правою кнопкою миші , щоб перейти вгору." + click-to-edit: "Натисніть , щоб редагувати." + left-click-to-download: "Клацніть лівою кнопкою миші , щоб завантажити." + right-click-to-toggle: "Клацніть правою кнопкою миші для перемикання." + click-to-install: "Натисніть , щоб установити." + click-to-reset-all: "Натисніть , щоб скинути все." + right-click-to-select: "Клацніть правою кнопкою миші , щоб вибрати." + right-click-to-deselect: "Клацніть правою кнопкою миші , щоб скасувати вибір." - left-click-to-choose: "&e Клацніть лівою кнопкою миші &7, щоб вибрати." - click-to-cancel: "&e Натисніть &7, щоб скасувати." - click-to-save: "&e Натисніть &7, щоб зберегти." - click-to-deselect: "&e Натисніть &7, щоб скасувати вибір." + left-click-to-choose: "Клацніть лівою кнопкою миші , щоб вибрати." + click-to-cancel: "Натисніть , щоб скасувати." + click-to-save: "Натисніть , щоб зберегти." + click-to-deselect: "Натисніть , щоб скасувати вибір." click-on-item: |- - &e Клацніть &7 на елементі в - &7 ваш інвентар. - left-click-to-edit: "&e Клацніть лівою кнопкою миші &7 для редагування." - right-click-to-clear: "&e Клацніть правою кнопкою миші &7, щоб очистити." - click-to-previous: "&e Натисніть &7, щоб переглянути попередню сторінку." - click-to-next: "&e Натисніть &7, щоб переглянути наступну сторінку." + Клацніть на елементі в + ваш інвентар. + left-click-to-edit: "Клацніть лівою кнопкою миші для редагування." + right-click-to-clear: "Клацніть правою кнопкою миші , щоб очистити." + click-to-previous: "Натисніть , щоб переглянути попередню сторінку." + click-to-next: "Натисніть , щоб переглянути наступну сторінку." descriptions: challenge: lore: |- @@ -835,16 +835,16 @@ challenges: [requirements] [rewards] status: - completed: "&2&l Завершено" - completed-times: "&2 Виконано &7&l [number] &r&2 раз(ів)" - completed-times-of: "&2 Виконано &7&l [number] &r&2 із &7&l [max] &r&2 разів" - completed-times-reached: "&2&l Виконано всі &7 [max] &2 рази" + completed: "Завершено" + completed-times: "Виконано [number] раз(ів)" + completed-times-of: "Виконано [number] із [max] разів" + completed-times-reached: "Виконано всі [max] рази" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l Охолодження: &r&7 [time]" - wait-time: "&c&l Доступно після: &r&c [time]" + timeout: "Охолодження: [time]" + wait-time: "Доступно після: [time]" in-days: "[number] дн " in-hours: "[number] год " in-minutes: "[number] хв" @@ -854,12 +854,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 Обмежено [environment]" - environment-title: "&7 Обмежується:" - environment-list: " &7 - &e [environment]" - permission-single: "&c Потрібен дозвіл [permissions]." - permissions-title: "&c Потрібні дозволи:" - permissions-list: " &c - [permission]" + environment-single: "Обмежено [environment]" + environment-title: "Обмежується:" + environment-list: " - [environment]" + permission-single: "Потрібен дозвіл [permissions]." + permissions-title: "Потрібні дозволи:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -867,23 +867,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l Необхідні блоки:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l Необхідні сутності:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 Не далі &e [number] &7 метрів" - warning-block: "&e Блоки будуть &c видалені" - warning-entity: "&e Сутності будуть &c видалені" + blocks-title: "Необхідні блоки:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "Необхідні сутності:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "Не далі [number] метрів" + warning-block: "Блоки будуть видалені" + warning-entity: "Сутності будуть видалені" inventory: lore: |- [items] [warning] - item-title: "&7&l Необхідні елементи:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e Елемент(и) буде &c видалено" + item-title: "Необхідні елементи:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "Елемент(и) буде видалено" other: lore: |- [experience] @@ -891,34 +891,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l Необхідний досвід: &r&e [number]" - experience-warning: "&e Досвід буде &c видалено" - money: "&7&l Необхідні гроші: &r&e [number]" - money-warning: "&e Гроші будуть &c видалені" - level: "&7&l Необхідний рівень острова: &r&e [number]" + experience: "Необхідний досвід: [number]" + experience-warning: "Досвід буде видалено" + money: "Необхідні гроші: [number]" + money-warning: "Гроші будуть видалені" + level: "Необхідний рівень острова: [number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [статистика]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [terget]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e Статистичні дані будуть &c зменшені" + multiple-target: "[статистика]: [number] x [target]" + single-target: "[statistic]: [terget]" + statistic: "[statistic] [number]" + warning: "Статистичні дані будуть зменшені" rewards: lore: |- - &7&l Нагороди: + Нагороди: [text] [items] [experience] [money] [commands] - item-title: "&7 елементів:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Досвід: &r&e [номер]" - money: "&7 Гроші: &r&e [number]" - commands-title: "&7 Команди:" - command: " &7 - &e [command]" + item-title: "елементів:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Досвід: [номер]" + money: "Гроші: [number]" + commands-title: "Команди:" + command: " - [command]" level: lore: |- [text] @@ -926,188 +926,188 @@ challenges: [waiver] [rewards] status: - completed: "&2&l Завершено" + completed: "Завершено" completed-challenges-of: |- - &2 Завершено &7&l [number] &r&2 з - &7&l [max] &r&2 виклики. - locked: "&c&l Заблоковано" + Завершено [number] з + [max] виклики. + locked: "Заблоковано" missing-challenges: |- - &7 [number] має бути більше викликів - &7 завершено, щоб розблокувати цей рівень. + [number] має бути більше викликів + завершено, щоб розблокувати цей рівень. waiver: |- - &7&l [number] завдання(-и) &r&7 може бути - &7 пропущено, щоб розблокувати наступний рівень. + [number] завдання(-и) може бути + пропущено, щоб розблокувати наступний рівень. rewards: lore: |- - &7&l Нагороди: + Нагороди: [text] [items] [experience] [money] [commands] - item-title: "&7 елементів:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 Досвід: &r&e [number]" - money: "&7 Гроші: &r&e [number]" - commands-title: "&7 Команди:" - command: " &7 - &e [command]" + item-title: "елементів:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "Досвід: [number]" + money: "Гроші: [number]" + commands-title: "Команди:" + command: " - [command]" library: - author: "&7 від &e [author]" - version: "&7 Made with Challenges &e [version]" - lang: "&7 Мова: &e [lang]" - gamemode: "&7 Основний для &e [gamemode]" + author: "від [author]" + version: "Made with Challenges [version]" + lang: "Мова: [lang]" + gamemode: "Основний для [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: true, on, yes, confirm, y, valid, correct deny-string: false, off, no, deny, n, invalid, incorrect cancel-string: скасувати exit-string: скасувати, вийти, вийти - cancelled: "&c Розмова скасована!" - input-number: "&e Будь ласка, введіть номер у чаті." - input-seconds: "&e Будь ласка, введіть секунди в чаті." - numeric-only: "&c Дане [value] не є числом!" - not-valid-value: "&c Дане число [value] недійсне. Він має бути більшим за [min] + cancelled: "Розмова скасована!" + input-number: "Будь ласка, введіть номер у чаті." + input-seconds: "Будь ласка, введіть секунди в чаті." + numeric-only: "Дане [value] не є числом!" + not-valid-value: "Дане число [value] недійсне. Він має бути більшим за [min] і меншим за [max]!" - user-data-removed: "&a Усі дані користувача для [gamemode] видалено з бази даних." - confirm-user-data-deletion: "&e Підтвердьте, що ви бажаєте очистити базу даних + user-data-removed: "Усі дані користувача для [gamemode] видалено з бази даних." + confirm-user-data-deletion: "Підтвердьте, що ви бажаєте очистити базу даних користувачів для [gamemode]." - challenge-data-removed: "&a Усі дані викликів для [gamemode] видалено з бази даних." - confirm-challenge-data-deletion: "&e Будь ласка, підтвердьте, що ви хочете очистити + challenge-data-removed: "Усі дані викликів для [gamemode] видалено з бази даних." + confirm-challenge-data-deletion: "Будь ласка, підтвердьте, що ви хочете очистити базу даних викликів для [gamemode]." - all-data-removed: "&a Усі дані аддонів для [gamemode] видалено з бази даних." - confirm-all-data-deletion: "&e Будь ласка, підтвердьте, що ви хочете очистити + all-data-removed: "Усі дані аддонів для [gamemode] видалено з бази даних." + confirm-all-data-deletion: "Будь ласка, підтвердьте, що ви хочете очистити дані аддонів для [gamemode]." - write-name: "&e Будь ласка, напишіть ім'я в чаті." + write-name: "Будь ласка, напишіть ім'я в чаті." new-object-created: "&Створено новий об’єкт для [gamemode]." - object-already-exists: "&c Об'єкт &7 [id] &c вже існує. Виберіть інше ім'я." - invalid-challenge: "&c Завдання [challenge] містить недійсні дані. Його не можна + object-already-exists: "Об'єкт [id] вже існує. Виберіть інше ім'я." + invalid-challenge: "Завдання [challenge] містить недійсні дані. Його не можна розгортати!" - name-changed: "&a Успіх, назву оновлено." - write-description: "&e Будь ласка, введіть новий опис у чаті та 'quit' у окремому + name-changed: "Успіх, назву оновлено." + write-description: "Будь ласка, введіть новий опис у чаті та 'quit' у окремому рядку, щоб завершити." - description-changed: "&a Успіх, опис оновлено." - write-permissions: "&e Будь ласка, введіть необхідні дозволи, по одному на рядок + description-changed: "Успіх, опис оновлено." + write-permissions: "Будь ласка, введіть необхідні дозволи, по одному на рядок у чаті, і 'quit' на окремому рядку, щоб завершити." - permissions-changed: "&a Успіх, дозволи на виклик оновлено." - write-reward-text: "&e Будь ласка, введіть новий текст винагороди в чаті та 'quit' + permissions-changed: "Успіх, дозволи на виклик оновлено." + write-reward-text: "Будь ласка, введіть новий текст винагороди в чаті та 'quit' в окремому рядку, щоб завершити." - reward-text-changed: "&a Успіх, текст нагороди оновлено." - write-repeat-reward-text: "&e Будь ласка, введіть новий повторний текст винагороди + reward-text-changed: "Успіх, текст нагороди оновлено." + write-repeat-reward-text: "Будь ласка, введіть новий повторний текст винагороди в чаті та 'quit' в окремому рядку, щоб завершити." - repeat-reward-text-changed: "&a Успіх, текст повторної винагороди оновлено." - write-reward-commands: "&e Будь ласка, введіть нову команду винагороди для кожного + repeat-reward-text-changed: "Успіх, текст повторної винагороди оновлено." + write-reward-commands: "Будь ласка, введіть нову команду винагороди для кожного рядка в чаті та 'quit' в окремому рядку, щоб завершити." - reward-commands-changed: "&a Успіх, команди винагород оновлено." - write-repeat-reward-commands: "&e Будь ласка, введіть нову повторну команду винагороди + reward-commands-changed: "Успіх, команди винагород оновлено." + write-repeat-reward-commands: "Будь ласка, введіть нову повторну команду винагороди для кожного рядка в чаті та 'quit' в окремому рядку, щоб завершити." - repeat-reward-commands-changed: "&a Успіх, повторні команди винагороди оновлено." - challenge-removed: "&a Challenges [challenge] для [gamemode] видалено з бази даних." - confirm-challenge-deletion: "&e Будь ласка, підтвердьте, що ви хочете видалити + repeat-reward-commands-changed: "Успіх, повторні команди винагороди оновлено." + challenge-removed: "Challenges [challenge] для [gamemode] видалено з бази даних." + confirm-challenge-deletion: "Будь ласка, підтвердьте, що ви хочете видалити [challenge] для [gamemode] з бази даних." - level-removed: "&a Рівень [level] для [gamemode] видалено з бази даних." - confirm-level-deletion: "&e Будь ласка, підтвердьте, що ви хочете видалити [level] + level-removed: "Рівень [level] для [gamemode] видалено з бази даних." + confirm-level-deletion: "Будь ласка, підтвердьте, що ви хочете видалити [level] для [gamemode] з бази даних." - start-downloading: "&a Початок завантаження та імпорту бібліотеки завдань." - written-text: "&a Текст введення:" - confirm-data-replacement: "&e Будь ласка, підтвердьте, що ви бажаєте замінити + start-downloading: "Початок завантаження та імпорту бібліотеки завдань." + written-text: "Текст введення:" + confirm-data-replacement: "Будь ласка, підтвердьте, що ви бажаєте замінити свої поточні завдання новими." - new-challenges-imported: "&a Успіху, нові завдання для [gamemode] імпортовано." - exported-file-name: "&e Будь ласка, введіть назву файлу для експортованого файлу + new-challenges-imported: "Успіху, нові завдання для [gamemode] імпортовано." + exported-file-name: "Будь ласка, введіть назву файлу для експортованого файлу бази даних. (напишіть 'cancel', щоб вийти)" - database-export-completed: "&a Успіх, експорт бази даних для [world] завершено. + database-export-completed: "Успіх, експорт бази даних для [world] завершено. Файл [file] створено." - file-name-exist: "&c Файл із назвою '[id]' існує. Неможливо перезаписати." - write-search: "&e Введіть пошукове значення. (напишіть 'cancel', щоб вийти)" - search-updated: "&a Значення пошуку оновлено." + file-name-exist: "Файл із назвою '[id]' існує. Неможливо перезаписати." + write-search: "Введіть пошукове значення. (напишіть 'cancel', щоб вийти)" + search-updated: "Значення пошуку оновлено." titles: challenge-title: Успішно завершено challenge-subtitle: "[friendlyName]" level-title: Успішно завершено level-subtitle: "[friendlyName]" messages: - completed: "&2 Ви виконали виклик [name] для [player]!" - already-completed: "&2 Це завдання вже виконано!" - reset: "&2 Ви скинули виклик [name] для [player]!" - reset-all: "&2 Усі завдання [player] скинуто!" - not-completed: "&2 Це завдання ще не завершено!" - migrate-start: "&2 Розпочати міграцію даних аддонів викликів." - migrate-end: "&2 Дані надбудови Challenges оновлено до нового формату." - migrate-not: "&2 Усі дані дійсні." - start-downloading: "&5 Початок завантаження та імпорту бібліотеки завдань." - you-completed-challenge: "&2 Ви завершили завдання [value] &r &2!" - you-repeated-challenge: "&2 Ви повторили завдання [value] &r &2!" - you-repeated-challenge-multiple: "&2 Ви повторили завдання [value] &r &2 [count] + completed: "Ви виконали виклик [name] для [player]!" + already-completed: "Це завдання вже виконано!" + reset: "Ви скинули виклик [name] для [player]!" + reset-all: "Усі завдання [player] скинуто!" + not-completed: "Це завдання ще не завершено!" + migrate-start: "Розпочати міграцію даних аддонів викликів." + migrate-end: "Дані надбудови Challenges оновлено до нового формату." + migrate-not: "Усі дані дійсні." + start-downloading: "Початок завантаження та імпорту бібліотеки завдань." + you-completed-challenge: "Ви завершили завдання [value] !" + you-repeated-challenge: "Ви повторили завдання [value] !" + you-repeated-challenge-multiple: "Ви повторили завдання [value] [count] разів!" - you-completed-level: "&2 Ви завершили рівень [value] &r &2!" - name-has-completed-challenge: "&5 [name] виконав завдання [value] &r &5!" - name-has-completed-level: "&5 [name] завершив рівень [value] &r &5!" + you-completed-level: "Ви завершили рівень [value] !" + name-has-completed-challenge: "[name] виконав завдання [value] !" + name-has-completed-level: "[name] завершив рівень [value] !" load-skipping: '"[value]" вже існує - пропуск' load-overwriting: Перезапис "[value]" load-add: 'Додавання нового об''єкта: [value]' errors: - no-name: "&c Відсутня назва завдання" - unknown-challenge: "&c Невідомий виклик" + no-name: "Відсутня назва завдання" + unknown-challenge: "Невідомий виклик" not-valid-integer: |- - &c Дане ціле число "[value]" недійсне! + Дане ціле число "[value]" недійсне! Значення має бути між [min] і [max]. - not-deployed: "&c Challenge не розгорнуто!" - not-on-island: "&c Для цього ви повинні бути на своєму острові!" - challenge-level-not-available: "&c Ви не розблокували необхідний рівень для виконання + not-deployed: "Challenge не розгорнуто!" + not-on-island: "Для цього ви повинні бути на своєму острові!" + challenge-level-not-available: "Ви не розблокували необхідний рівень для виконання цього завдання." - not-repeatable: "&c Цей виклик неможливо повторити!" - wrong-environment: "&c Ви перебуваєте в неправильному середовищі!" - not-enough-items: "&c У вас недостатньо [items], щоб виконати це завдання!" - not-close-enough: "&c Ви повинні знаходитися в межах [number] блоків від усіх + not-repeatable: "Цей виклик неможливо повторити!" + wrong-environment: "Ви перебуваєте в неправильному середовищі!" + not-enough-items: "У вас недостатньо [items], щоб виконати це завдання!" + not-close-enough: "Ви повинні знаходитися в межах [number] блоків від усіх необхідних елементів." - you-still-need: "&c Вам все ще потрібно [amount] x [item]" - missing-addon: "&c Неможливо виконати завдання: відсутній необхідний аддон або + you-still-need: "Вам все ще потрібно [amount] x [item]" + missing-addon: "Неможливо виконати завдання: відсутній необхідний аддон або плагін." - incorrect: "&c Неможливо завершити завдання: вимоги неправильні." - not-enough-money: "&c Щоб виконати завдання, у вашому обліковому записі необхідно + incorrect: "Неможливо завершити завдання: вимоги неправильні." + not-enough-money: "Щоб виконати завдання, у вашому обліковому записі необхідно мати [value]." - not-enough-experience: "&c Щоб виконати це завдання, необхідно мати [value] досвіду." - island-level: "&c Ваш острів має бути рівня [number] або вище, щоб виконати це + not-enough-experience: "Щоб виконати це завдання, необхідно мати [value] досвіду." + island-level: "Ваш острів має бути рівня [number] або вище, щоб виконати це завдання!" - no-load: "&c Помилка: Не вдалося завантажити [file]. [message]" - load-error: "&c Помилка: неможливо завантажити [value]." - no-rank: "&c Ви не маєте достатньо високого рангу, щоб це зробити." - cannot-remove-items: "&c Деякі предмети не можна видалити з вашого інвентарю!" - exist-challenges-or-levels: "&c Проблеми вже існують у вашому світі. Неможливо + no-load: "Помилка: Не вдалося завантажити [file]. [message]" + load-error: "Помилка: неможливо завантажити [value]." + no-rank: "Ви не маєте достатньо високого рангу, щоб це зробити." + cannot-remove-items: "Деякі предмети не можна видалити з вашого інвентарю!" + exist-challenges-or-levels: "Проблеми вже існують у вашому світі. Неможливо продовжити!" - no-challenges: "&c Виклики ще не реалізовані в цьому світі!" - no-challenges-admin: "&c Виклики ще не реалізовані в цьому світі! Використовуйте - &5 /[command] &c, щоб додати їх!" - missing-arguments: У команді &c відсутні аргументи. - no-multiple-permission: "&c Ви не маєте дозволу виконувати це завдання кілька + no-challenges: "Виклики ще не реалізовані в цьому світі!" + no-challenges-admin: "Виклики ще не реалізовані в цьому світі! Використовуйте + /[command] , щоб додати їх!" + missing-arguments: У команді відсутні аргументи. + no-multiple-permission: "Ви не маєте дозволу виконувати це завдання кілька разів одночасно." - invalid-level: "&c Рівень [level] містить недійсні дані. Він не буде завантажений + invalid-level: "Рівень [level] містить недійсні дані. Він не буде завантажений з бази даних!" - invalid-challenge: "&c Завдання [challenge] містить недійсні дані. Він не буде + invalid-challenge: "Завдання [challenge] містить недійсні дані. Він не буде завантажений з бази даних!" - no-library-entries: "&c Не вдається знайти жодного запису бібліотеки. Нічого показати." - not-hooked: "&c Challenges Addon не вдалося знайти режим гри." - timeout: "&c Цей виклик вимагає очікування [timeout] між завершеннями. Ви повинні + no-library-entries: "Не вдається знайти жодного запису бібліотеки. Нічого показати." + not-hooked: "Challenges Addon не вдалося знайти режим гри." + timeout: "Цей виклик вимагає очікування [timeout] між завершеннями. Ви повинні зачекати [wait-time], поки завершите його знову." - requirement-not-met: "&c Цей виклик вимагає [statistic] мати [number]. У вас є + requirement-not-met: "Цей виклик вимагає [statistic] мати [number]. У вас є лише [value]." - requirement-not-met-entity: "&c Цей виклик вимагає [statistic] [entity] мати [number]. + requirement-not-met-entity: "Цей виклик вимагає [statistic] [entity] мати [number]. У вас є лише [value]." - requirement-not-met-material: "&c Цей виклик вимагає, щоб [statistic] [material] + requirement-not-met-material: "Цей виклик вимагає, щоб [statistic] [material] мала [number]. У вас є лише [value]." protection: flags: CHALLENGES_ISLAND_PROTECTION: description: |- - &5 &o Перемкнути, хто може - &5 &o завершення завдань + Перемкнути, хто може + завершення завдань name: Захист викликів CHALLENGES_WORLD_PROTECTION: description: |- - &5 &o Увімкнути/вимкнути - &5 &o вимоги до гравців - &5 &o бути на своєму острові, щоб - &5 &o виконати завдання. + Увімкнути/вимкнути + вимоги до гравців + бути на своєму острові, щоб + виконати завдання. name: Обмеження острова викликів hint: Жодних проблем за межами острова version: 12 diff --git a/src/main/resources/locales/zh-CN.yml b/src/main/resources/locales/zh-CN.yml index a69a4cb3..3c527ee2 100644 --- a/src/main/resources/locales/zh-CN.yml +++ b/src/main/resources/locales/zh-CN.yml @@ -27,592 +27,592 @@ challenges: parameters: " [count]" gui: titles: - player-gui: "&0&l 挑战菜单" - gamemode-gui: "&0&l 选择游戏模式" - multiple-gui: "&0&l 多少次?" - admin-gui: "&0&l 管理员挑战菜单" - edit-challenge: "&0&l 编辑 [challenge]" - edit-level: "&0&l 编辑 [level]" - settings: "&0&l 设置" - choose-challenge: "&0&l 选择挑战" - choose-level: "&0&l 选择挑战等级" - choose-player: "&0&l 选择玩家" - library: "&0&l 库" - manage-blocks: "&0&l 管理方块" - manage-entities: "&0&l 管理实体" - type-selector: "&0&l 选择挑战类型" - item-selector: "&0&l 选择物品" - block-selector: "&0&l 选择方块" - entity-selector: "&0&l 选择实体" - challenge-selector: "&0&l 选择挑战" - statistic-selector: "&0&l 选择统计数据" - environment-selector: "&0&l 选择环境条件" + player-gui: "挑战菜单" + gamemode-gui: "选择游戏模式" + multiple-gui: "多少次?" + admin-gui: "管理员挑战菜单" + edit-challenge: "编辑 [challenge]" + edit-level: "编辑 [level]" + settings: "设置" + choose-challenge: "选择挑战" + choose-level: "选择挑战等级" + choose-player: "选择玩家" + library: "库" + manage-blocks: "管理方块" + manage-entities: "管理实体" + type-selector: "选择挑战类型" + item-selector: "选择物品" + block-selector: "选择方块" + entity-selector: "选择实体" + challenge-selector: "选择挑战" + statistic-selector: "选择统计数据" + environment-selector: "选择环境条件" buttons: free-challenges: - name: "&f&l 自由挑战" + name: "自由挑战" description: |- - &7 显示自由 - &7 挑战列表 + 显示自由 + 挑战列表 return: - name: "&f&l 返回" + name: "返回" description: |- - &7 返回上一级菜单 - &7 或关闭菜单 + 返回上一级菜单 + 或关闭菜单 previous: - name: "&f&l 上一页" - description: "&7 跳转到 &e [number] &7 页" + name: "上一页" + description: "跳转到 [number] 页" next: - name: "&f&l 下一页" - description: "&7 跳转到 &e [number] &7 页" + name: "下一页" + description: "跳转到 [number] 页" reduce: - name: "&f&l 减少" - description: "&7 已减少 &e [number]" + name: "减少" + description: "已减少 [number]" increase: - name: "&f&l 增加" - description: "&7 已增加 &e [number]" + name: "增加" + description: "已增加 [number]" accept: - name: "&f&l 完成" + name: "完成" description: |- - &7 已完成该挑战 - &e [number] &7次 + 已完成该挑战 + [number] 次 quit: - name: "&f&l 退出" - description: "&7 关闭菜单。" + name: "退出" + description: "关闭菜单。" complete_user_challenges: - name: "&f&l 完成玩家的挑战" + name: "完成玩家的挑战" description: |- - &7 在这里选择 - &7 玩家并为他 - &7 完成挑战 + 在这里选择 + 玩家并为他 + 完成挑战 reset_user_challenges: - name: "&f&l 重置玩家的挑战" + name: "重置玩家的挑战" description: |- - &7 在这里选择玩家并 - &7 重置他的挑战 + 在这里选择玩家并 + 重置他的挑战 add_challenge: - name: "&f&l 创建挑战" + name: "创建挑战" description: |- - &7 进入挑战 - &7 创建模式。 + 进入挑战 + 创建模式。 add_level: - name: "&f&l 创建挑战等级" + name: "创建挑战等级" description: |- - &7 进入挑战等级 - &7 创建模式。 + 进入挑战等级 + 创建模式。 edit_challenge: - name: "&f&l 编辑挑战" + name: "编辑挑战" description: |- - &7 在这里选择和 - &7 编辑挑战。 + 在这里选择和 + 编辑挑战。 edit_level: - name: "&f&l 编辑挑战等级" + name: "编辑挑战等级" description: |- - &7 在这里选择和 - &7 编辑挑战等级。 + 在这里选择和 + 编辑挑战等级。 delete_challenge: - name: "&f&l 删除挑战" + name: "删除挑战" description: |- - &7 在这里选择并删除 - &7 挑战。 + 在这里选择并删除 + 挑战。 delete_level: - name: "&f&l 删除挑战等级" + name: "删除挑战等级" description: |- - &7 在这里选择并删除 - &7 某个挑战等级。 + 在这里选择并删除 + 某个挑战等级。 edit_settings: - name: "&f&l 设置" + name: "设置" description: |- - &7 在这里查看和编辑 - &7 扩展设置。 + 在这里查看和编辑 + 扩展设置。 complete_wipe: - name: "&f&l 清除所有数据" - description: "&7 彻底清除挑战扩展数据,包括用户数据。" + name: "清除所有数据" + description: "彻底清除挑战扩展数据,包括用户数据。" challenge_wipe: - name: "&f&l 清除挑战数据" + name: "清除挑战数据" description: |- - &7 彻底清除挑战 - &7 及挑战等级数据。 + 彻底清除挑战 + 及挑战等级数据。 user_wipe: - name: "&f&l 清除玩家数据" - description: "&7 彻底清除玩家数据。" + name: "清除玩家数据" + description: "彻底清除玩家数据。" library: - name: "&f&l 库" - description: "&7 打开公共挑战库。" + name: "库" + description: "打开公共挑战库。" import_database: - name: "&f&l 导入数据" - description: "&7 导入或导出挑战扩展数据。" + name: "导入数据" + description: "导入或导出挑战扩展数据。" import_template: - name: "&f&l 导入模板" - description: "&7 点击导入挑战模板文件。" + name: "导入模板" + description: "点击导入挑战模板文件。" export_challenges: - name: "&f&l 导出挑战" - description: "&7 导出挑战数据到本地文件。" + name: "导出挑战" + description: "导出挑战数据到本地文件。" properties: - name: "&f&l 属性" - description: "&7 查看所有主要属性。" + name: "属性" + description: "查看所有主要属性。" requirements: - name: "&f&l 要求" - description: "&7 查看要求。" + name: "要求" + description: "查看要求。" rewards: - name: "&f&l 奖励" - description: "&7 查看奖励。" + name: "奖励" + description: "查看奖励。" deployed: - name: "&f&l 发布" + name: "发布" description: |- - &7切换挑战是否部署完成 - &7从而玩家可以完成它。 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 切换挑战是否部署完成 + 从而玩家可以完成它。 + enabled: "已启用" + disabled: "已禁用" name: - name: "&f&l 名称" + name: "名称" description: |- - &7 在这里修改 - &7 挑战名称。 - value: "&7 当前名称:&r [name]" + 在这里修改 + 挑战名称。 + value: "当前名称:[name]" remove_on_complete: - name: "&f&l 完成后隐藏" - description: "&7 切换是否隐藏已完成挑战" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "完成后隐藏" + description: "切换是否隐藏已完成挑战" + enabled: "已启用" + disabled: "已禁用" description: - name: "&f&l 说明" + name: "说明" description: |- - &7关于该挑战的详细描述。 - &7必须使用颜色代码。 - value: "&7 当前描述:" + 关于该挑战的详细描述。 + 必须使用颜色代码。 + value: "当前描述:" environment: - name: "&f&l 维度" + name: "维度" description: |- - &7 限制哪些维度 - &7 可以完成此挑战。 - enabled: "&2" - disabled: "&c" + 限制哪些维度 + 可以完成此挑战。 + enabled: "" + disabled: "" order: - name: "&f&l 位置" + name: "位置" description: |- - &7允许修改挑战的排序 - &7带有相同序号的挑战会通过ID排序 - value: "&7 当前位置值:&e [number]" + 允许修改挑战的排序 + 带有相同序号的挑战会通过ID排序 + value: "当前位置值:[number]" icon: - name: "&f&l 图标" - description: "&7修改此挑战的图标。" + name: "图标" + description: "修改此挑战的图标。" locked_icon: - name: "&f&l 未解锁图标" + name: "未解锁图标" description: |- - &7 修改未解锁 - &7 等级的图标。 + 修改未解锁 + 等级的图标。 required_permissions: - name: "&f&l 所需权限" - description: "&7 修改完成此挑战所需的权限。" - title: "&7 权限:" - permission: " &8 - [permission]" - none: "&7 未设置权限。" + name: "所需权限" + description: "修改完成此挑战所需的权限。" + title: "权限:" + permission: " - [permission]" + none: "未设置权限。" remove_entities: - name: "&f&l 移除实体" + name: "移除实体" description: |- - &7 是否在完成挑战后 - &7移除所需的实体 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 是否在完成挑战后 + 移除所需的实体 + enabled: "已启用" + disabled: "已禁用" required_entities: - name: "&f&l 所需实体" - description: "&7允许修改完成挑战所需的实体" - title: "&7 实体:" - list: " &8 - [number] x [entity]" - none: "&7 不添加实体。" + name: "所需实体" + description: "允许修改完成挑战所需的实体" + title: "实体:" + list: " - [number] x [entity]" + none: "不添加实体。" remove_blocks: - name: "&f&l 移除方块" + name: "移除方块" description: |- - &7允许切换是否在挑战完成后 - &7移除所需方块 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 允许切换是否在挑战完成后 + 移除所需方块 + enabled: "已启用" + disabled: "已禁用" required_blocks: - name: "&f&l 所需方块" + name: "所需方块" description: |- - &7允许更改为完成挑战 - &7所需要的方块 - title: "&7 方块:" - list: " &8 - [number] x [block]" - none: "&7 块不被添加。" + 允许更改为完成挑战 + 所需要的方块 + title: "方块:" + list: " - [number] x [block]" + none: "块不被添加。" search_radius: - name: "&f&l 搜索半径" + name: "搜索半径" description: |- - &7 允许更改任务所需的方块 - &7 或实体的检测半径。 - &7 (部分任务需要玩家周围 - &7 有一定数量的方块/实体) - value: "&7 当前距离:&e [number]" + 允许更改任务所需的方块 + 或实体的检测半径。 + (部分任务需要玩家周围 + 有一定数量的方块/实体) + value: "当前距离:[number]" remove_items: - name: "&f&l 删除道具" - description: "&7允许切换是否在完成挑战后移除所需物品" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "删除道具" + description: "允许切换是否在完成挑战后移除所需物品" + enabled: "已启用" + disabled: "已禁用" required_items: - name: "&f&l 需求道具" - description: "&7 允许更改待完成任务中所需的物品" - title: "&7 项:" - list: " &8 - [number] x [item]" - none: "&7 项目未添加。" + name: "需求道具" + description: "允许更改待完成任务中所需的物品" + title: "项:" + list: " - [number] x [item]" + none: "项目未添加。" add_ignored_meta: - name: "&f&l 添加忽略元数据" - description: "&7允许添加忽略所有元数据的物品" - title: "&7 项:" - list: " &8 - [number] x [item]" - none: "&7 物品未添加。" + name: "添加忽略元数据" + description: "允许添加忽略所有元数据的物品" + title: "项:" + list: " - [number] x [item]" + none: "物品未添加。" remove_ignored_meta: - name: "&f&l 删除忽略元数据" - description: "&7允许移除忽略所有元数据的物品" + name: "删除忽略元数据" + description: "允许移除忽略所有元数据的物品" remove_experience: - name: "&f&l 移除经验" + name: "移除经验" description: |- - &7允许切换是否在挑战完成后 - &7移除玩家经验 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 允许切换是否在挑战完成后 + 移除玩家经验 + enabled: "已启用" + disabled: "已禁用" required_experience: - name: "&f&l 所需经验" + name: "所需经验" description: |- - &7 允许更改 - &7 所需经验 - &7 玩家。 - value: "&7 当前经验:&e [number]" + 允许更改 + 所需经验 + 玩家。 + value: "当前经验:[number]" required_level: - name: "&f&l 所需岛屿等级" - description: "&7允许更改挑战所需的岛屿等级" - value: "&7 当前级别:&e [number]" + name: "所需岛屿等级" + description: "允许更改挑战所需的岛屿等级" + value: "当前级别:[number]" remove_money: - name: "&f&l 移除金钱" - description: "&7允许切换是否在玩家完成任务后移除所需金额" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "移除金钱" + description: "允许切换是否在玩家完成任务后移除所需金额" + enabled: "已启用" + disabled: "已禁用" required_money: - name: "&f&l 所需资金" + name: "所需资金" description: |- - &7允许更改挑战所需 - &7玩家账户里的钱 - value: "&7 当前值:&e [number]" + 允许更改挑战所需 + 玩家账户里的钱 + value: "当前值:[number]" statistic: - name: "&f&l 统计" - description: "&7允许修改该挑战所检查的统计类型" - value: "&7 当前值:&e [statistic]" + name: "统计" + description: "允许修改该挑战所检查的统计类型" + value: "当前值:[statistic]" statistic_amount: - name: "&f&l 目标值" - description: "&7允许更改必须完成的统计目标" - value: "&7 当前值:&e [number]" + name: "目标值" + description: "允许更改必须完成的统计目标" + value: "当前值:[number]" remove_statistic: - name: "&f&l 减少统计量" + name: "减少统计量" description: |- - &7允许切换是否在完成挑战后 - &7减少对应数目的统计值 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 允许切换是否在完成挑战后 + 减少对应数目的统计值 + enabled: "已启用" + disabled: "已禁用" statistic_blocks: - name: "&f&l 目标方块" - description: "&7允许更改方块统计目标。" - value: "&7 当前方块:&e [block]" + name: "目标方块" + description: "允许更改方块统计目标。" + value: "当前方块:[block]" statistic_items: - name: "&f&l 目标项目" - description: "&7 允许更改物品统计目标" - value: "&7 当前项目:&e [item]" + name: "目标项目" + description: "允许更改物品统计目标" + value: "当前项目:[item]" statistic_entities: - name: "&f&l 目标实体" - description: "&7 允许更改实体统计目标" - value: "&7 当前实体:&e [entity]" + name: "目标实体" + description: "允许更改实体统计目标" + value: "当前实体:[entity]" reward_text: - name: "&f&l 奖励文本" + name: "奖励文本" description: |- - &7 具体奖励文本。 - &7 必须应用颜色代码 - value: "&7 当前文本:" + 具体奖励文本。 + 必须应用颜色代码 + value: "当前文本:" repeat_reward_text: - name: "&f&l 重复奖励文本" + name: "重复奖励文本" description: |- - &7 该挑战特定的重复奖励文本 - &7 必须使用颜色代码。 - value: "&7 当前文本:" + 该挑战特定的重复奖励文本 + 必须使用颜色代码。 + value: "当前文本:" reward_items: - name: "&f&l 奖励物品" - description: "&7 允许更改奖励物品" - title: "&7 项:" - list: " &8 - [number] x [item]" - none: "&7 项目未添加。" + name: "奖励物品" + description: "允许更改奖励物品" + title: "项:" + list: " - [number] x [item]" + none: "项目未添加。" repeat_reward_items: - name: "&f&l 重复奖励物品" - description: "&7允许更改该挑战的重复奖励物品" - title: "&7 物品:" - list: " &8 - [number] x [item]" - none: "&7 物品未添加。" + name: "重复奖励物品" + description: "允许更改该挑战的重复奖励物品" + title: "物品:" + list: " - [number] x [item]" + none: "物品未添加。" reward_experience: - name: "&f&l 奖励经验" - description: "&7 允许更改对玩家的经验奖励" - value: "&7 奖励经验:&e [number]" + name: "奖励经验" + description: "允许更改对玩家的经验奖励" + value: "奖励经验:[number]" repeat_reward_experience: - name: "&f&l 重复奖励体验" - description: "&7 允许更改给玩家的重复经验奖励" - value: "&7 奖励经验:&e [number]" + name: "重复奖励体验" + description: "允许更改给玩家的重复经验奖励" + value: "奖励经验:[number]" reward_money: - name: "&f&l 奖励金" - description: "&7 允许更改金钱奖励" - value: "&7 当前值:&e [number]" + name: "奖励金" + description: "允许更改金钱奖励" + value: "当前值:[number]" repeat_reward_money: - name: "&f&l 重复奖励金钱" - description: "&7 允许更改重复挑战的金钱奖励" - value: "&7 当前值:&e [number]" + name: "重复奖励金钱" + description: "允许更改重复挑战的金钱奖励" + value: "当前值:[number]" reward_commands: - name: "&f&l 奖励命令" - description: |- - &7 具体奖励命令。 - &8 该命令不需要输入 `/` - &8 默认情况下,命令将由服务器执行。 - &8 在开头添加 `[SELF]`时,命令由玩家执行。 - &8 支持占位符`[player]`,代表完成该挑战的玩家 - value: "&7 当前命令:" + name: "奖励命令" + description: |- + 具体奖励命令。 + 该命令不需要输入 `/` + 默认情况下,命令将由服务器执行。 + 在开头添加 `[SELF]`时,命令由玩家执行。 + 支持占位符`[player]`,代表完成该挑战的玩家 + value: "当前命令:" repeat_reward_commands: - name: "&f&l 重复奖励命令" - description: |- - &7 重复奖励命令。 - &8 该命令不需要输入 `/` - &8 默认情况下,命令将由服务器执行。 - &8 在开头添加 `[SELF]`时,命令由玩家执行。 - &8 支持占位符`[player]`,代表完成该挑战的玩家 - value: "&7 当前命令:" + name: "重复奖励命令" + description: |- + 重复奖励命令。 + 该命令不需要输入 `/` + 默认情况下,命令将由服务器执行。 + 在开头添加 `[SELF]`时,命令由玩家执行。 + 支持占位符`[player]`,代表完成该挑战的玩家 + value: "当前命令:" repeatable: - name: "&f&l 可重复" - description: "&7 允许切换挑战是否可重复" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "可重复" + description: "允许切换挑战是否可重复" + enabled: "已启用" + disabled: "已禁用" repeat_count: - name: "&f&l 重复次数" - description: "&7 允许更改挑战的重复次数" - value: "&7 当前值:&e [number]" + name: "重复次数" + description: "允许更改挑战的重复次数" + value: "当前值:[number]" cool_down: - name: "&f&l 冷却" - description: "&7允许更改重复挑战的冷却时间" - value: "&7 当前值:&e [time]" + name: "冷却" + description: "允许更改重复挑战的冷却时间" + value: "当前值:[time]" challenges: - name: "&f&l 挑战" - description: "&7查看当前等级的挑战" + name: "挑战" + description: "查看当前等级的挑战" waiver_amount: - name: "&f&l 豁免金额" + name: "豁免金额" description: |- - &7 允许设置一些挑战, - &7 解锁下一级时,这些挑战可以未完成 - value: "&7 当前值:&e [number]" + 允许设置一些挑战, + 解锁下一级时,这些挑战可以未完成 + value: "当前值:[number]" add_challenges: - name: "&f&l 添加挑战(-s)" - description: "&7允许向该等级选择并添加挑战" + name: "添加挑战(-s)" + description: "允许向该等级选择并添加挑战" remove_challenges: - name: "&f&l 移除挑战(-s)" - description: "&7允许向该等级选择并删除挑战" + name: "移除挑战(-s)" + description: "允许向该等级选择并删除挑战" reset_on_new: - name: "&f&l 重置" - description: "&7允许切换玩家创建新岛/离开旧岛时是否重置挑战" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "重置" + description: "允许切换玩家创建新岛/离开旧岛时是否重置挑战" + enabled: "已启用" + disabled: "已禁用" broadcast: - name: "&f&l 广播" - description: "&7 首次完成挑战与级别时向所有玩家广播" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "广播" + description: "首次完成挑战与级别时向所有玩家广播" + enabled: "已启用" + disabled: "已禁用" remove_completed: - name: "&f&l 隐藏完成" - description: "&7 从菜单中隐藏已完成的挑战" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "隐藏完成" + description: "从菜单中隐藏已完成的挑战" + enabled: "已启用" + disabled: "已禁用" glow_completed: - name: "&f&l 完成后发光" - description: "&7 为完成的挑战添加附魔光效" - enabled: "&2 已启用" - disabled: "&c 已禁用" + name: "完成后发光" + description: "为完成的挑战添加附魔光效" + enabled: "已启用" + disabled: "已禁用" store_history: - name: "&f&l 商店历史" + name: "商店历史" description: |- - &7 每个挑战被完成时都将其存储 - &7 当前只能在数据库查看 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 每个挑战被完成时都将其存储 + 当前只能在数据库查看 + enabled: "已启用" + disabled: "已禁用" data_per_island: - name: "&f&l 每岛商店" + name: "每岛商店" description: |- - &7存储每个岛屿完成的挑战 - &7该岛屿团队会共享进度 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 存储每个岛屿完成的挑战 + 该岛屿团队会共享进度 + enabled: "已启用" + disabled: "已禁用" show_title: - name: "&f&l 显示标题" + name: "显示标题" description: |- - &7 当一个完成挑战或级别时 - &7 在标题栏展示 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 当一个完成挑战或级别时 + 在标题栏展示 + enabled: "已启用" + disabled: "已禁用" gamemode_gui: - name: "&f&l 游戏模式选择界面" + name: "游戏模式选择界面" description: |- - &7允许/challenges开启GUI - &c 需要重新启动服务器。 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 允许/challenges开启GUI + 需要重新启动服务器。 + enabled: "已启用" + disabled: "已禁用" locked_level_icon: - name: "&f&l 默认锁定级别图标" + name: "默认锁定级别图标" description: |- - &7 等级锁定时的默认图标。 - &7 每个级别都可以单独修改。 + 等级锁定时的默认图标。 + 每个级别都可以单独修改。 purge_history: - name: "&f&l 数据存储时间" + name: "数据存储时间" description: |- - &7用户历史数据存储的时间 - &70代表永远不会移除老旧数据 - value: "&7 当前值:&e [number]" + 用户历史数据存储的时间 + 0代表永远不会移除老旧数据 + value: "当前值:[number]" title_showtime: - name: "&f&l 标题显示时间" - description: "&7标题栏显示的时间(以tick计)" - value: "&7 当前值:&e [number]" + name: "标题显示时间" + description: "标题栏显示的时间(以tick计)" + value: "当前值:[number]" active_world_list: - name: "&f&l 仅显示活跃世界" + name: "仅显示活跃世界" description: |- - &7 如果启用游戏模式选择 GUI,这个可以切换 - &7 GUI 是否显示游戏模式选择或当前世界的挑战。 - &c 需要重新启动服务器 - enabled: "&2 已启用" - disabled: "&c 已禁用" + 如果启用游戏模式选择 GUI,这个可以切换 + GUI 是否显示游戏模式选择或当前世界的挑战。 + 需要重新启动服务器 + enabled: "已启用" + disabled: "已禁用" visibility_mode: - name: "&f&l 可见性模式" - description: "&7隐藏挑战的可见性" - enabled: "&2" + name: "可见性模式" + description: "隐藏挑战的可见性" + enabled: "" disabled: "&C" visible: 显示可见的挑战 hidden: 显示所有挑战 toggleable: 允许切换 include_undeployed: - name: "&f&l 包括未部署的挑战" - description: "&7是否把未部署挑战纳入对应级别的进度中" - enabled: "&2 启用" - disabled: "&c 禁用" + name: "包括未部署的挑战" + description: "是否把未部署挑战纳入对应级别的进度中" + enabled: "启用" + disabled: "禁用" download: - name: "&f&l 下载库" - description: "&7 可手动更新挑战库。" - enabled: "&2 清除缓存" - disabled: "&c 不清除缓存" + name: "下载库" + description: "可手动更新挑战库。" + enabled: "清除缓存" + disabled: "不清除缓存" player: - name: "&f&l [name]" - description: "&7 岛主:[owner]" - members: "&7 岛成员:" - member: "&8 - [name]" - no-island: "&c 玩家没有岛屿。" + name: "[name]" + description: "岛主:[owner]" + members: "岛成员:" + member: "- [name]" + no-island: "玩家没有岛屿。" player_list: - name: "&f&l 选择用户列表" - description: "&7 选择应该显示哪个用户列表 " - enabled: "&2" - disabled: "&c" + name: "选择用户列表" + description: "选择应该显示哪个用户列表 " + enabled: "" + disabled: "" online: 在线玩家 with_island: 有岛屿的玩家 in_world: 世界玩家 add_block: - name: "&f&l 添加方块" - description: "&7 允许添加一个新的方块到列表中。" + name: "添加方块" + description: "允许添加一个新的方块到列表中。" remove_block: - name: "&f&l 删除方块" - description: "&7 允许从列表删除选定的方块" - title: "&7 已选择材料:" - material: "&8 - [material]" + name: "删除方块" + description: "允许从列表删除选定的方块" + title: "已选择材料:" + material: "- [material]" material: - name: "&f&l [material]" - description: "&7 材料 ID:[id]" - selected: "&2 已选择" + name: "[material]" + description: "材料 ID:[id]" + selected: "已选择" add_entity: - name: "&f&l 添加实体" - description: "&7 允许添加一个新的实体到列表中。" + name: "添加实体" + description: "允许添加一个新的实体到列表中。" switch_entity: - name: "&f&l 交换鸡蛋" - description: "&7 允许从鸡蛋转换到怪物头" + name: "交换鸡蛋" + description: "允许从鸡蛋转换到怪物头" remove_entity: - name: "&f&l 删除实体" - description: "&7 允许从列表删除选定的实体" - title: "&7 选定实体:" - entity: "&8 - [entity]" + name: "删除实体" + description: "允许从列表删除选定的实体" + title: "选定实体:" + entity: "- [entity]" entity: - name: "&f&l [entity]" - description: "&7 实体 ID:[id]" - selected: "&2 已选择" + name: "[entity]" + description: "实体 ID:[id]" + selected: "已选择" inventory_type: - name: "&f&l 库存类型" - description: "&7 检查的玩家物品栏中物品的挑战" + name: "库存类型" + description: "检查的玩家物品栏中物品的挑战" island_type: - name: "&f&l 空岛类型" - description: "&7 检查的周围的方块或实体玩家的挑战。" + name: "空岛类型" + description: "检查的周围的方块或实体玩家的挑战。" other_type: - name: "&f&l 其他类型" - description: "&7使用插件的东西的挑战,如等级和金钱。" + name: "其他类型" + description: "使用插件的东西的挑战,如等级和金钱。" statistic_type: - name: "&f&l 统计类型" - description: "&7 检查的挑战玩家统计数据。" + name: "统计类型" + description: "检查的挑战玩家统计数据。" save: - name: "&f&l 保存" - description: "&7 保存更改并返回。" + name: "保存" + description: "保存更改并返回。" cancel: - name: "&f&l 取消" - description: "&7 放弃更改并返回。" + name: "取消" + description: "放弃更改并返回。" accept_selected: - name: "&f&l 接受选择" - description: "&7 返回选中的元素并打开上一个GUI。" - title: "&7 已选择:" - element: "&8 - [element]" + name: "接受选择" + description: "返回选中的元素并打开上一个GUI。" + title: "已选择:" + element: "- [element]" statistic_element: - name: "&f&l [statistic]" + name: "[statistic]" description: "[description]" environment_element: - name: "&f&l [environment]" + name: "[environment]" description: "[description]" search: - name: "&f&l 搜索" - description: "&7 允许通过输入文本值搜索元素" - search: "&b 值:[value]" + name: "搜索" + description: "允许通过输入文本值搜索元素" + search: "值:[value]" tips: - click-to-select: "&e 单击 &7 进行选择。" - click-to-choose: "&e 单击 &7 进行选择。" - click-to-complete: "&e 单击 &7 完成。" - right-click-multiple-open: "&e 右击 &7 选择完成挑战的次数。" - shift-left-click-to-complete-all: "&e 按住Shift并左击 &7 一键完成(根据背包中所需道具数量)。" - left-click-to-accept: "&e 左击 &7 接受。" - right-click-to-write: "&e 右击 &7 写入。" - click-to-reduce: "&e 点击 &7 减少。" - click-to-increase: "&e 点击 &7 增加。" - click-to-return: "&e 单击 &7 返回。" - click-to-quit: "&e 点击 &7 退出。" - click-to-wipe: "&e 单击 &7 清除。" - left-click-to-wipe: "&e 左键单击 &7 清除。" - right-click-to-switch: "&e 右键 &7 切换。" - click-to-open: "&e 点击 &7 打开。" - click-to-export: "&e 点击 &7 导出。" - click-to-create: "&e 点击 &7 创建。" - left-click-to-open: "&e 左键单击 &7 打开。" - right-click-to-reset-all: "&e 右键单击 &7 重置所有内容。" - click-to-toggle: "&e 单击 &7 进行切换。" - click-to-change: "&e 单击 &7 进行更改。" - shift-click-to-reset: "&e Shift 单击 &7 进行重置。" - click-to-add: "&e 点击 &7 添加。" - click-to-remove: "&e 单击 &7 删除。" - left-click-to-cycle: "&e 左键单击 &7 向下循环。" - right-click-to-cycle: "&e 右键单击 &7 向上循环。" - click-to-edit: "&e 单击 &7 进行编辑。" - left-click-to-download: "&e 左键 &7 下载。" - right-click-to-toggle: "&e 右键单击 &7 进行切换。" - click-to-install: "&e 点击 &7 安装。" - click-to-reset-all: "&e 点击 &7 全部重置。" - right-click-to-select: "&e 右击 &7 选择。" - right-click-to-deselect: "&e 右击 &7 取消选择。" - left-click-to-choose: "&e 左键单击 &7 进行选择。" - click-to-cancel: "&e 单击 &7 取消。" - click-to-save: "&e 点击 &7 保存。" - click-to-deselect: "&e 单击 &7 取消选择。" + click-to-select: "单击 进行选择。" + click-to-choose: "单击 进行选择。" + click-to-complete: "单击 完成。" + right-click-multiple-open: "右击 选择完成挑战的次数。" + shift-left-click-to-complete-all: "按住Shift并左击 一键完成(根据背包中所需道具数量)。" + left-click-to-accept: "左击 接受。" + right-click-to-write: "右击 写入。" + click-to-reduce: "点击 减少。" + click-to-increase: "点击 增加。" + click-to-return: "单击 返回。" + click-to-quit: "点击 退出。" + click-to-wipe: "单击 清除。" + left-click-to-wipe: "左键单击 清除。" + right-click-to-switch: "右键 切换。" + click-to-open: "点击 打开。" + click-to-export: "点击 导出。" + click-to-create: "点击 创建。" + left-click-to-open: "左键单击 打开。" + right-click-to-reset-all: "右键单击 重置所有内容。" + click-to-toggle: "单击 进行切换。" + click-to-change: "单击 进行更改。" + shift-click-to-reset: "Shift 单击 进行重置。" + click-to-add: "点击 添加。" + click-to-remove: "单击 删除。" + left-click-to-cycle: "左键单击 向下循环。" + right-click-to-cycle: "右键单击 向上循环。" + click-to-edit: "单击 进行编辑。" + left-click-to-download: "左键 下载。" + right-click-to-toggle: "右键单击 进行切换。" + click-to-install: "点击 安装。" + click-to-reset-all: "点击 全部重置。" + right-click-to-select: "右击 选择。" + right-click-to-deselect: "右击 取消选择。" + left-click-to-choose: "左键单击 进行选择。" + click-to-cancel: "单击 取消。" + click-to-save: "点击 保存。" + click-to-deselect: "单击 取消选择。" click-on-item: |- - &e 在项目中单击 &7 - &7 您的库存。 - left-click-to-edit: "&e 左键单击 &7 进行编辑。" - right-click-to-clear: "&e 右击 &7 清除。" - click-to-previous: "&e 点击 &7 查看上一页。" - click-to-next: "&e 点击 &7 查看下一页。" + 在项目中单击 + 您的库存。 + left-click-to-edit: "左键单击 进行编辑。" + right-click-to-clear: "右击 清除。" + click-to-previous: "点击 查看上一页。" + click-to-next: "点击 查看下一页。" descriptions: challenge: lore: |- @@ -622,16 +622,16 @@ challenges: [requirements] [rewards] status: - completed: "&2&l 已完成" - completed-times: "&2 已完成&7&l [number] &r&2次" - completed-times-of: "&2 已完成&7&l [number] &r&2次,最多完成&7&l [max] &r&2次" - completed-times-reached: "&2&l 你最多只能完成&7 [max] &2次" + completed: "已完成" + completed-times: "已完成[number] 次" + completed-times-of: "已完成[number] 次,最多完成[max] 次" + completed-times-reached: "你最多只能完成[max] 次" cooldown: lore: |- [timeout] [wait-time] - timeout: "&7&l 冷却时间:&r&7[time]" - wait-time: "&c&l 冷却中:&r&c[time]" + timeout: "冷却时间:[time]" + wait-time: "冷却中:[time]" in-days: "[number] 天" in-hours: "[number] 小时" in-minutes: "[number] 分钟" @@ -641,12 +641,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: "&7 仅限在 [environment] 完成" - environment-title: "&7 仅限在这些维度完成:" - environment-list: " &7 - &e [environment]" - permission-single: "&c 需要 [permission] 权限" - permissions-title: "&c 需要权限:" - permissions-list: " &c - [permission]" + environment-single: "仅限在 [environment] 完成" + environment-title: "仅限在这些维度完成:" + environment-list: " - [environment]" + permission-single: "需要 [permission] 权限" + permissions-title: "需要权限:" + permissions-list: " - [permission]" island: lore: |- [blocks] @@ -654,23 +654,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: "&7&l 所需方块:" - block-value: " &7 - &e [material]" - blocks-value: " &7 - &e [number] x [material]" - entities-title: "&7&l 所需实体:" - entity-value: " &7 - &e [entity]" - entities-value: " &7 - &e [number] x [entity]" - search-radius: "&7 必须在在&e [number] &7米范围内" - warning-block: "&e 所需方块将在完成挑战时&c移除" - warning-entity: "&e 所需实体将在完成挑战时&c移除" + blocks-title: "所需方块:" + block-value: " - [material]" + blocks-value: " - [number] x [material]" + entities-title: "所需实体:" + entity-value: " - [entity]" + entities-value: " - [number] x [entity]" + search-radius: "必须在在[number] 米范围内" + warning-block: "所需方块将在完成挑战时移除" + warning-entity: "所需实体将在完成挑战时移除" inventory: lore: |- [items] [warning] - item-title: "&7&l 所需物品:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - warning: "&e 所需物品将在挑战完成时&c移除" + item-title: "所需物品:" + item-value: " - [item]" + items-value: " - [number] x [item]" + warning: "所需物品将在挑战完成时移除" other: lore: |- [experience] @@ -678,34 +678,34 @@ challenges: [money] [money-warning] [level] - experience: "&7&l 所需经验:&r&e[number]" - experience-warning: "&e 所需经验将在挑战完成时&c扣除" - money: "&7&l 所需金钱:&r&e[number]" - money-warning: "&e 所需金钱将在挑战完成时&c扣除" - level: "&7&l 所需岛屿等级:&r&e[number]" + experience: "所需经验:[number]" + experience-warning: "所需经验将在挑战完成时扣除" + money: "所需金钱:[number]" + money-warning: "所需金钱将在挑战完成时扣除" + level: "所需岛屿等级:[number]" statistic: lore: |- [statistic] [warning] - multiple-target: "&7&l [statistic]: &r&e [number] x [target]" - single-target: "&7&l [statistic]: &r&e [target]" - statistic: "&7&l [statistic] &r&e [number]" - warning: "&e 统计数据将 &c 减少" + multiple-target: "[statistic]: [number] x [target]" + single-target: "[statistic]: [target]" + statistic: "[statistic] [number]" + warning: "统计数据将 减少" rewards: lore: |- - &7&l 奖励: + 奖励: [text] [items] [experience] [money] [commands] - item-title: "&7 物品:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 经验:&r&e [number]" - money: "&7 金钱:&r&e [number]" - commands-title: "&7 指令:" - command: " &7 - &e [command]" + item-title: "物品:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "经验:[number]" + money: "金钱:[number]" + commands-title: "指令:" + command: " - [command]" level: lore: |- [text] @@ -713,150 +713,150 @@ challenges: [waiver] [rewards] status: - completed: "&2&l 已完成" + completed: "已完成" completed-challenges-of: |- - &2 已完成&7&l [number] &r&2个挑战, - &7&l 共 [max] &r&2个挑战。 - locked: "&c&l 未解锁" + 已完成[number] 个挑战, + 共 [max] 个挑战。 + locked: "未解锁" missing-challenges: |- - &7 你需要再完成 [number] 个挑战 - &7 才能解锁此等级。 + 你需要再完成 [number] 个挑战 + 才能解锁此等级。 waiver: |- - &7&l 你可以跳过 [number] 个挑战 - &7 来解锁下一等级。 + 你可以跳过 [number] 个挑战 + 来解锁下一等级。 rewards: lore: |- - &7&l 奖励: + 奖励: [text] [items] [experience] [money] [commands] - item-title: "&7 物品:" - item-value: " &7 - &e [item]" - items-value: " &7 - &e [number] x [item]" - experience: "&7 经验:&r&e [number]" - money: "&7 金钱:&r&e [number]" - commands-title: "&7 指令:" - command: " &7 - &e [command]" + item-title: "物品:" + item-value: " - [item]" + items-value: " - [number] x [item]" + experience: "经验:[number]" + money: "金钱:[number]" + commands-title: "指令:" + command: " - [command]" library: - author: "&7 作者:&e[author]" - version: "&7 使用 Challenges &e [version] 制作" - lang: "&7 语言:&e [lang]" - gamemode: "&7 主要用于 &e [gamemode]" + author: "作者:[author]" + version: "使用 Challenges [version] 制作" + lang: "语言:[lang]" + gamemode: "主要用于 [gamemode]" conversations: - prefix: "&l&6 [BentoBox]: &r" + prefix: "[BentoBox]: " confirm-string: true, on, yes, confirm, y, valid, correct, 是, 确认, 对 deny-string: false, off, no, deny, n, invalid, incorrect, 否, 错, 不是 cancel-string: cancel, 取消 exit-string: cancel, exit, quit, 取消, 退出 - cancelled: "&c 会话已取消!" - input-number: "&e 请在聊天中输入一个数字。" - input-seconds: "&e 请在聊天中输入秒数。" - numeric-only: "&c 你输入的 [value] 不是数字!" - not-valid-value: "&c 你输入的的数字 [value] 无效。它必须大于 [min] 且小于 [max]!" - user-data-removed: "&a 已清除 [gamemode] 的所有玩家数据。" - confirm-user-data-deletion: "&e 请确认您要清除 [gamemode] 的玩家数据。" - challenge-data-removed: "&a 已清除 [gamemode] 的所有挑战数据。" - confirm-challenge-data-deletion: "&e 请确认您要清除 [gamemode] 的挑战数据。" - all-data-removed: "&a 已清除 [gamemode] 的所有扩展数据。" - confirm-all-data-deletion: "&e 请确认您要清除 [gamemode] 的扩展数据。" - write-name: "&e 请在聊天中输入一个名字。" - new-object-created: "&a 为 [gamemode] 创建了一个新对象。" - object-already-exists: "&c 对象 &7 [id] &c 已经存在。选择不同的名称。" - invalid-challenge: "&c 挑战 [challenge] 包含无效数据。无法发布!" - name-changed: "&a 成功,名称已更新。" - write-description: "&e 请在聊天中输入新的描述,可输入多行,输入 'quit' 完成编辑。" - description-changed: "&a 成功,描述已更新。" - write-permissions: "&e 请输入所需的权限,每次输入一个,输入 'quit' 完成编辑。" - permissions-changed: "&a 成功,挑战权限已更新。" - write-reward-text: "&e 请在聊天中输入新的奖励提示,输入 'quit' 完成编辑。" - reward-text-changed: "&a 成功,奖励提示已更新。" - write-repeat-reward-text: "&e 请在聊天中输入新的重复奖励提示,输入 'quit' 结束编辑。" - repeat-reward-text-changed: "&a 成功,重复奖励提示已更新。" - write-reward-commands: "&e 请在聊天中每行输入新的奖励命令,输入 'quit' 结束编辑。" - reward-commands-changed: "&a 成功,奖励命令已更新。" - write-repeat-reward-commands: "&e 请在聊天中每行输入一个新的重复奖励命令,输入 'quit' 结束编辑。" - repeat-reward-commands-changed: "&a 成功,重复奖励命令已更新。" - challenge-removed: "&a 已删除 [gamemode] 中的挑战 [challenge]。" - confirm-challenge-deletion: "&e 请确认您要删除 [gamemode] 中的 [challenge]。" - level-removed: "&a [gamemode] 中的挑战等级 [level] 已删除。" - confirm-level-deletion: "&e 请确认您要删除 [gamemode] 中的 [level]。" - start-downloading: "&a 开始下载和导入挑战库。" - written-text: "&a 输入文本:" - confirm-data-replacement: "&e 请确认您想用新的挑战替换当前的挑战。" - new-challenges-imported: "&a 成功,[gamemode] 的新挑战已导入。" - exported-file-name: "&e 请输入导出的数据库文件的文件名。(输入 'cancel ' 退出)" - database-export-completed: "&a 成功,[world] 的数据库导出完成。文件 [file] 已生成。" - file-name-exist: "&c 名称为 “[id]” 的文件已存在。无法覆盖。" - write-search: "&e 请写一个搜索值。(输入 'cancel' 取消)" - search-updated: "&a 搜索值已更新。" + cancelled: "会话已取消!" + input-number: "请在聊天中输入一个数字。" + input-seconds: "请在聊天中输入秒数。" + numeric-only: "你输入的 [value] 不是数字!" + not-valid-value: "你输入的的数字 [value] 无效。它必须大于 [min] 且小于 [max]!" + user-data-removed: "已清除 [gamemode] 的所有玩家数据。" + confirm-user-data-deletion: "请确认您要清除 [gamemode] 的玩家数据。" + challenge-data-removed: "已清除 [gamemode] 的所有挑战数据。" + confirm-challenge-data-deletion: "请确认您要清除 [gamemode] 的挑战数据。" + all-data-removed: "已清除 [gamemode] 的所有扩展数据。" + confirm-all-data-deletion: "请确认您要清除 [gamemode] 的扩展数据。" + write-name: "请在聊天中输入一个名字。" + new-object-created: "为 [gamemode] 创建了一个新对象。" + object-already-exists: "对象 [id] 已经存在。选择不同的名称。" + invalid-challenge: "挑战 [challenge] 包含无效数据。无法发布!" + name-changed: "成功,名称已更新。" + write-description: "请在聊天中输入新的描述,可输入多行,输入 'quit' 完成编辑。" + description-changed: "成功,描述已更新。" + write-permissions: "请输入所需的权限,每次输入一个,输入 'quit' 完成编辑。" + permissions-changed: "成功,挑战权限已更新。" + write-reward-text: "请在聊天中输入新的奖励提示,输入 'quit' 完成编辑。" + reward-text-changed: "成功,奖励提示已更新。" + write-repeat-reward-text: "请在聊天中输入新的重复奖励提示,输入 'quit' 结束编辑。" + repeat-reward-text-changed: "成功,重复奖励提示已更新。" + write-reward-commands: "请在聊天中每行输入新的奖励命令,输入 'quit' 结束编辑。" + reward-commands-changed: "成功,奖励命令已更新。" + write-repeat-reward-commands: "请在聊天中每行输入一个新的重复奖励命令,输入 'quit' 结束编辑。" + repeat-reward-commands-changed: "成功,重复奖励命令已更新。" + challenge-removed: "已删除 [gamemode] 中的挑战 [challenge]。" + confirm-challenge-deletion: "请确认您要删除 [gamemode] 中的 [challenge]。" + level-removed: "[gamemode] 中的挑战等级 [level] 已删除。" + confirm-level-deletion: "请确认您要删除 [gamemode] 中的 [level]。" + start-downloading: "开始下载和导入挑战库。" + written-text: "输入文本:" + confirm-data-replacement: "请确认您想用新的挑战替换当前的挑战。" + new-challenges-imported: "成功,[gamemode] 的新挑战已导入。" + exported-file-name: "请输入导出的数据库文件的文件名。(输入 'cancel ' 退出)" + database-export-completed: "成功,[world] 的数据库导出完成。文件 [file] 已生成。" + file-name-exist: "名称为 “[id]” 的文件已存在。无法覆盖。" + write-search: "请写一个搜索值。(输入 'cancel' 取消)" + search-updated: "搜索值已更新。" titles: - challenge-title: "&a已完成" + challenge-title: "已完成" challenge-subtitle: "[friendlyName]" - level-title: "&a已完成" + level-title: "已完成" level-subtitle: "[friendlyName]" messages: - completed: "&2 你为[player]完成了挑战[name]!" - already-completed: "&2 这个挑战已经完成了!" - reset: "&2 你为 [player] 重置挑战 [name]!" - reset-all: "&2 所有[player]挑战均已重置!" - not-completed: "&2 此挑战尚未完成!" - migrate-start: "&2 开始转换挑战扩展数据。" - migrate-end: "&2 挑战扩展数据已更新为新格式。" - migrate-not: "&2 所有数据均有效。" - start-downloading: "&5 开始下载和导入挑战库。" - you-completed-challenge: "&2你完成了挑战 &r[value] &2!" - you-repeated-challenge: "&2你再次完成了挑战 &r[value] &2!" - you-repeated-challenge-multiple: "&2你完成挑战 &r[value] &r[count] &2次了!" - you-completed-level: "&2恭喜,你已完成挑战等级 &r[value]&2!" - name-has-completed-challenge: "&a恭喜! &r[name] &a完成了挑战 [value] &a!" - name-has-completed-level: "&a恭喜! &r[name] &a已完成挑战等级 [value]&a!" - load-skipping: '&c挑战项 "[value]" &c已存在 - 将跳过' - load-overwriting: '&6覆盖了已载入的挑战: "[value]"' - load-add: "&a新增了挑战: [value]" + completed: "你为[player]完成了挑战[name]!" + already-completed: "这个挑战已经完成了!" + reset: "你为 [player] 重置挑战 [name]!" + reset-all: "所有[player]挑战均已重置!" + not-completed: "此挑战尚未完成!" + migrate-start: "开始转换挑战扩展数据。" + migrate-end: "挑战扩展数据已更新为新格式。" + migrate-not: "所有数据均有效。" + start-downloading: "开始下载和导入挑战库。" + you-completed-challenge: "你完成了挑战 [value] !" + you-repeated-challenge: "你再次完成了挑战 [value] !" + you-repeated-challenge-multiple: "你完成挑战 [value] [count] 次了!" + you-completed-level: "恭喜,你已完成挑战等级 [value]!" + name-has-completed-challenge: "恭喜! [name] 完成了挑战 [value] !" + name-has-completed-level: "恭喜! [name] 已完成挑战等级 [value]!" + load-skipping: '挑战项 "[value]" 已存在 - 将跳过' + load-overwriting: '覆盖了已载入的挑战: "[value]"' + load-add: "新增了挑战: [value]" errors: - no-name: "&c缺少挑战名称。" - unknown-challenge: "&c未知的挑战。" - not-valid-integer: "&c给定整数“[value]”无效!|值应介于[min]和[max]之间。" - not-deployed: "&c这个挑战还未发布!" - not-on-island: "&c您必须在您的岛上才能完成挑战!" - challenge-level-not-available: "&c您还未解锁这个挑战等级。" - not-repeatable: "&c这项挑战不可重复进行!" - wrong-environment: "&c你不在指定的维度中!" - not-enough-items: "&c你没有足够的 &r[items] &c来完成这项挑战。" - not-close-enough: "&c要完成挑战,你必须站在所需物品 &f[number] &c格范围内。" - you-still-need: "&c你还差 &f[amount] &c个 &f[item] &c才能完成挑战。" - missing-addon: "&c无法完成挑战:缺少必需的扩展或插件。" - incorrect: "&c无法完成挑战:必要条件设定错误。" - not-enough-money: "&c你必须有 &f[value] &c金钱才能完成任务。" - not-enough-experience: "&c你必须有 &f[value] &c经验值才能完成任务。" - island-level: "&c你的岛屿等级必须达到 &flv[number] &c才能完成任务!" - no-load: "&c错误: 无法载入 &fchallenges.yml&c. [message]" - load-error: "&c错误: 无法载入 &r[value]&c。" - no-rank: "&c你没有等级可以做到这一点." - cannot-remove-items: "&c有些物品无法从你的物品栏中删除!" + no-name: "缺少挑战名称。" + unknown-challenge: "未知的挑战。" + not-valid-integer: "给定整数“[value]”无效!|值应介于[min]和[max]之间。" + not-deployed: "这个挑战还未发布!" + not-on-island: "您必须在您的岛上才能完成挑战!" + challenge-level-not-available: "您还未解锁这个挑战等级。" + not-repeatable: "这项挑战不可重复进行!" + wrong-environment: "你不在指定的维度中!" + not-enough-items: "你没有足够的 [items] 来完成这项挑战。" + not-close-enough: "要完成挑战,你必须站在所需物品 [number] 格范围内。" + you-still-need: "你还差 [amount] 个 [item] 才能完成挑战。" + missing-addon: "无法完成挑战:缺少必需的扩展或插件。" + incorrect: "无法完成挑战:必要条件设定错误。" + not-enough-money: "你必须有 [value] 金钱才能完成任务。" + not-enough-experience: "你必须有 [value] 经验值才能完成任务。" + island-level: "你的岛屿等级必须达到 lv[number] 才能完成任务!" + no-load: "错误: 无法载入 challenges.yml. [message]" + load-error: "错误: 无法载入 [value]。" + no-rank: "你没有等级可以做到这一点." + cannot-remove-items: "有些物品无法从你的物品栏中删除!" exist-challenges-or-levels: "&c挑战已经存在于您的世界中。无法继续!" - no-challenges: "&c这个游戏模式没有可进行的挑战!" - no-challenges-admin: "&c这个游戏模式还没有可进行的挑战!请使用 &f/[command] &c来添加挑战。" - missing-arguments: "&c命令缺少参数。" - no-multiple-permission: "&c你没有权限多次完成这项挑战。" - invalid-level: "&c挑战等级 [level] &c包含错误,它不会从数据库中加载!" - invalid-challenge: "&c挑战项 [challenge] &c包含错误,它不会从数据库中加载!" - no-library-entries: "&c 找不到任何库条目。没什么可显示的。" - not-hooked: "&c Challenges Addon 找不到任何游戏模式。" - timeout: "&c 此挑战需要在完成之间等待 [timeout]。您必须等待 [wait-time] 才能再次完成。" - requirement-not-met: "&c 这个挑战需要 [statistic] 至少为 [number]. 你只有 [value]. " - requirement-not-met-entity: "&c 这个挑战需要 [number] 个 [statistic] [entity]. 你只有 [value]. " - requirement-not-met-material: "&c 这个挑战需要 [number] 个 [statistic] [material]. 你只有 + no-challenges: "这个游戏模式没有可进行的挑战!" + no-challenges-admin: "这个游戏模式还没有可进行的挑战!请使用 /[command] 来添加挑战。" + missing-arguments: "命令缺少参数。" + no-multiple-permission: "你没有权限多次完成这项挑战。" + invalid-level: "挑战等级 [level] 包含错误,它不会从数据库中加载!" + invalid-challenge: "挑战项 [challenge] 包含错误,它不会从数据库中加载!" + no-library-entries: "找不到任何库条目。没什么可显示的。" + not-hooked: "Challenges Addon 找不到任何游戏模式。" + timeout: "此挑战需要在完成之间等待 [timeout]。您必须等待 [wait-time] 才能再次完成。" + requirement-not-met: "这个挑战需要 [statistic] 至少为 [number]. 你只有 [value]. " + requirement-not-met-entity: "这个挑战需要 [number] 个 [statistic] [entity]. 你只有 [value]. " + requirement-not-met-material: "这个挑战需要 [number] 个 [statistic] [material]. 你只有 [value]. " protection: flags: CHALLENGES_ISLAND_PROTECTION: - description: "&5 &o 切换可以完成挑战的人" + description: "切换可以完成挑战的人" name: 挑战保护 CHALLENGES_WORLD_PROTECTION: - description: "&5 &o 启用 / 禁用 玩家在自己空岛完成挑战的要求" + description: "启用 / 禁用 玩家在自己空岛完成挑战的要求" name: 岛屿挑战限制 hint: 岛屿外无挑战 version: 12 diff --git a/src/main/resources/locales/zh-HK.yml b/src/main/resources/locales/zh-HK.yml index 0bea736b..18560cf9 100644 --- a/src/main/resources/locales/zh-HK.yml +++ b/src/main/resources/locales/zh-HK.yml @@ -40,650 +40,650 @@ challenges: gui: titles: # 這是主要菜單GUI的標題 - player-gui: '&0&l島嶼挑戰菜單' + player-gui: '島嶼挑戰菜單' # 這是主要菜單GUI的標題 - gamemode-gui: '&0&l選擇空島模式' + gamemode-gui: '選擇空島模式' # The title for the Multiple Completion GUI - multiple-gui: '&0&l可重覆完成多少次?' + multiple-gui: '可重覆完成多少次?' # GUI titles below is visible just for Admins. - admin-gui: '&0&l挑戰管理菜單' - edit-challenge: '&0&l編輯[challenge]' - edit-level: '&0&l編輯[level]' - settings: '&0&l設定' - choose-challenge: '&0&l選擇挑戰' - choose-level: '&0&l選擇挑戰等級' - choose-player: '&0&l選擇玩家' - library: '&0&l圖書館' - manage-blocks: '&0&l管理方塊' - manage-entities: '&0&l管理實體' - type-selector: '&0&l選擇挑戰類型' - item-selector: '&0&l選擇物品' - block-selector: '&0&l選擇方塊' - entity-selector: '&0&l選擇實體' - challenge-selector: '&0&l選擇挑戰' - statistic-selector: '&0&l選擇統計數據' - environment-selector: '&0&l選擇環境' + admin-gui: '挑戰管理菜單' + edit-challenge: '編輯[challenge]' + edit-level: '編輯[level]' + settings: '設定' + choose-challenge: '選擇挑戰' + choose-level: '選擇挑戰等級' + choose-player: '選擇玩家' + library: '圖書館' + manage-blocks: '管理方塊' + manage-entities: '管理實體' + type-selector: '選擇挑戰類型' + item-selector: '選擇物品' + block-selector: '選擇方塊' + entity-selector: '選擇實體' + challenge-selector: '選擇挑戰' + statistic-selector: '選擇統計數據' + environment-selector: '選擇環境' buttons: free-challenges: - name: '&f&l自由挑戰' - description: '&7 列出所有自由挑戰' + name: '自由挑戰' + description: '列出所有自由挑戰' return: - name: '&f&l返回上一級' + name: '返回上一級' description: |- - &7 返回上一層&r或 - &7 退出並關閉菜單 + 返回上一層或 + 退出並關閉菜單 previous: - name: '&f&l上一頁' - description: '&7 轉到第&e[number]&7頁' + name: '上一頁' + description: '轉到第[number]頁' next: - name: '&f&l下一頁' - description: '&7轉到第&e[number]&7頁' + name: '下一頁' + description: '轉到第[number]頁' reduce: - name: '&f&l减少' - description: '&7减少&e[number]' + name: '减少' + description: '减少[number]' increase: - name: '&f&l增加' - description: '&7 增加&e[number]' + name: '增加' + description: '增加[number]' accept: - name: '&f&l完成' - description: '&7 完成挑戰共&e[number]次' + name: '完成' + description: '完成挑戰共[number]次' quit: - name: '&f&l退出' - description: '&7 退出並關閉菜單' + name: '退出' + description: '退出並關閉菜單' complete_user_challenges: - name: '&f&l強制玩家完成某個挑戰' + name: '強制玩家完成某個挑戰' description: |- - &7 強制讓指定玩家完成某個挑戰 - &7 玩家無法獲得完成獎勵 + 強制讓指定玩家完成某個挑戰 + 玩家無法獲得完成獎勵 reset_user_challenges: - name: '&f&l重置玩家挑戰進度' - description: '&7 重置指定玩家的挑戰進度' + name: '重置玩家挑戰進度' + description: '重置指定玩家的挑戰進度' add_challenge: - name: '&f&l添加 新挑戰' - description: '&7 啟動添加 新挑戰 的程序' + name: '添加 新挑戰' + description: '啟動添加 新挑戰 的程序' add_level: - name: '&f&l添加 新挑戰等級' - description: '&7 啟動添加 新挑戰等級 的程序' + name: '添加 新挑戰等級' + description: '啟動添加 新挑戰等級 的程序' edit_challenge: - name: '&f&l編輯 挑戰設定' - description: '&7 對 某個挑戰的設定 進行修改調整' + name: '編輯 挑戰設定' + description: '對 某個挑戰的設定 進行修改調整' edit_level: - name: '&f&l編輯 挑戰等級' - description: '&7 對 某個挑戰等級的設定 進行修改調整' + name: '編輯 挑戰等級' + description: '對 某個挑戰等級的設定 進行修改調整' delete_challenge: - name: '&f&l删除 挑戰' - description: '&7 删除 指定挑戰' + name: '删除 挑戰' + description: '删除 指定挑戰' delete_level: - name: '&f&l删除 挑戰等級' - description: '&7 删除 指定挑戰等級' + name: '删除 挑戰等級' + description: '删除 指定挑戰等級' edit_settings: - name: '&f&l修改設定' - description: '&7 查看及修改附加插件設定' + name: '修改設定' + description: '查看及修改附加插件設定' complete_wipe: - name: '&f&l清空數據庫' + name: '清空數據庫' description: |- - &7 清空數據庫中的所有挑戰, - &7 包括玩家的挑戰數據 + 清空數據庫中的所有挑戰, + 包括玩家的挑戰數據 challenge_wipe: - name: '&f&l清空挑戰' + name: '清空挑戰' description: |- - '&7 清空數據庫中的' - '&7 所有挑戰及挑戰等級' + '清空數據庫中的' + '所有挑戰及挑戰等級' user_wipe: - name: '&f&l清空玩家' - description: '&7 清空玩家的挑戰數據' + name: '清空玩家' + description: '清空玩家的挑戰數據' library: - name: '&f&l文庫' - description: '&7 打開公開的挑戰文庫' + name: '文庫' + description: '打開公開的挑戰文庫' import_database: - name: '&f&l導入挑戰數據庫' - description: '&7 導入挑戰數據庫' + name: '導入挑戰數據庫' + description: '導入挑戰數據庫' import_template: - name: '&f&l導入模板' - description: '&7 導入挑戰模板' + name: '導入模板' + description: '導入挑戰模板' export_challenges: - name: '&f&l導出挑戰' - description: '&7 導出挑戰數據庫' + name: '導出挑戰' + description: '導出挑戰數據庫' properties: - name: '&f&l屬性' - description: '&7 查看所有主要屬性' + name: '屬性' + description: '查看所有主要屬性' requirements: - name: '&f&l挑戰要求' - description: '&7 查看挑戰要求' + name: '挑戰要求' + description: '查看挑戰要求' rewards: - name: '&f&l挑戰獎勵' - description: '&7 查看挑戰獎勵' + name: '挑戰獎勵' + description: '查看挑戰獎勵' deployed: - name: '&f&l切換挑戰開放狀態' - description: '&7 切換 挑戰是否可被玩家完成' - enabled: "&2 已啟用" - disabled: "&c 已禁用" + name: '切換挑戰開放狀態' + description: '切換 挑戰是否可被玩家完成' + enabled: "已啟用" + disabled: "已禁用" name: - name: '&f&l挑戰名稱' - description: '&7 修改挑戰名稱' - value: '&7目前: &r[name]' + name: '挑戰名稱' + description: '修改挑戰名稱' + value: '目前: [name]' remove_on_complete: - name: '&f&l完成後隱藏挑戰' + name: '完成後隱藏挑戰' description: |- - '&7 切換是否於於玩家完成後' - '&7 將該挑戰隱藏' - enabled: "&2 已啟用" - disabled: "&c 已禁用" + '切換是否於於玩家完成後' + '將該挑戰隱藏' + enabled: "已啟用" + disabled: "已禁用" description: - name: '&f&l挑戰介紹' - description: '&7 修改挑戰介紹 可使用顏色編碼' - value: '&7目前介紹:' + name: '挑戰介紹' + description: '修改挑戰介紹 可使用顏色編碼' + value: '目前介紹:' environment: - name: '&f&l世界環境' + name: '世界環境' description: |- - &7 修改挑戰的世界限定: - &7 限制挑戰只能在 - &7 指定世界內完成 - enabled: '&2' - disabled: '&c' + 修改挑戰的世界限定: + 限制挑戰只能在 + 指定世界內完成 + enabled: '' + disabled: '' order: - name: '&f&l順序' + name: '順序' description: |- - &7 修改挑戰順序 - &7 相同順序的物品會 - &7 依據相對應的物品ID排序 - value: '&7目前順序: &e[number]' + 修改挑戰順序 + 相同順序的物品會 + 依據相對應的物品ID排序 + value: '目前順序: [number]' icon: - name: '&f&l圖標' - description: '&7 修改挑戰圖標' + name: '圖標' + description: '修改挑戰圖標' locked_icon: - name: '&f&l圖標-未解鎖' - description: '&7 修改未解鎖挑戰的圖標' + name: '圖標-未解鎖' + description: '修改未解鎖挑戰的圖標' required_permissions: - name: '&f&l權限要求' + name: '權限要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的權限 - title: '&7 權限: ' - permission: ' &8 - [permission]' - none: '&7 尚未設置權限' + 修改完成挑戰時 + 需要具有的權限 + title: '權限: ' + permission: ' - [permission]' + none: '尚未設置權限' remove_entities: - name: '&f&l 移除實體' + name: '移除實體' description: |- - &7切換所要求的實體 - &7會否在完成挑戰後被移除 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 切換所要求的實體 + 會否在完成挑戰後被移除 + enabled: "已啟用" + disabled: "已禁用" required_entities: - name: '&f&l 實體要求' + name: '實體要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的實體 - title: '&7 實體: ' - list: ' &8 - [number] x [entity]' - none: '&7 未有加入實體' + 修改完成挑戰時 + 需要具有的實體 + title: '實體: ' + list: ' - [number] x [entity]' + none: '未有加入實體' remove_blocks: - name: '&f&l 移除方塊' + name: '移除方塊' description: |- - &7 切換所要求的方塊 - &7 會否在完成挑戰後被移除 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 切換所要求的方塊 + 會否在完成挑戰後被移除 + enabled: "已啟用" + disabled: "已禁用" required_blocks: - name: '&f&l 方塊要求' + name: '方塊要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的方塊 - title: '&7 方塊: ' - list: ' &8 - [number] x [block]' - none: '&7 未有加入方塊' + 修改完成挑戰時 + 需要具有的方塊 + title: '方塊: ' + list: ' - [number] x [block]' + none: '未有加入方塊' search_radius: - name: '&f&l 搜索半徑' + name: '搜索半徑' description: |- - &7 玩家完成挑戰時 - &7 檢測實體/方塊的範圍(半徑) - value: '&7 目前距離: &e [number]' + 玩家完成挑戰時 + 檢測實體/方塊的範圍(半徑) + value: '目前距離: [number]' remove_items: - name: '&f&l 移除物品' + name: '移除物品' description: |- - &7 切換所要求的物品 - &7 會否在完成挑戰後被移除 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 切換所要求的物品 + 會否在完成挑戰後被移除 + enabled: "已啟用" + disabled: "已禁用" required_items: - name: '&f&l 物品要求' + name: '物品要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的物品 - title: '&7 物品: ' - list: ' &8 - [number] x [item]' - none: '&7 未有加入物品' + 修改完成挑戰時 + 需要具有的物品 + title: '物品: ' + list: ' - [number] x [item]' + none: '未有加入物品' add_ignored_meta: - name: '&f&l 加入Metadata忽略清單' + name: '加入Metadata忽略清單' description: |- - &7 把物品加入至 - &7 Metadata忽略清單中 - title: '&7 物品: ' - list: ' &8 - [number] x [item]' - none: '&7 未有加入物品' + 把物品加入至 + Metadata忽略清單中 + title: '物品: ' + list: ' - [number] x [item]' + none: '未有加入物品' remove_ignored_meta: - name: '&f&l 移除Metadata忽略名單' + name: '移除Metadata忽略名單' description: |- - &7 把物品移除自 - &7 Metadata忽略清單中 + 把物品移除自 + Metadata忽略清單中 remove_experience: - name: '&f&l 扣除經驗值' + name: '扣除經驗值' description: |- - &7 切換所要求的經驗值 - &7 會否在完成挑戰後被扣除 - enabled: "&2已啟用" - disabled: "&c已禁用" + 切換所要求的經驗值 + 會否在完成挑戰後被扣除 + enabled: "已啟用" + disabled: "已禁用" required_experience: - name: '&f&l 經驗值要求' + name: '經驗值要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的經驗值 - value: '&7 目前經驗值要求: &e [number]等' + 修改完成挑戰時 + 需要具有的經驗值 + value: '目前經驗值要求: [number]等' required_level: - name: '&f&l 島嶼等級要求' + name: '島嶼等級要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的島嶼等級 - value: '&7 目前島嶼等級要求: &e [number]' + 修改完成挑戰時 + 需要具有的島嶼等級 + value: '目前島嶼等級要求: [number]' remove_money: - name: '&f&l 扣除遊戲幣' + name: '扣除遊戲幣' description: |- - &7 切換所要求的遊戲幣 - &7 會否在完成挑戰後被扣除 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 切換所要求的遊戲幣 + 會否在完成挑戰後被扣除 + enabled: "已啟用" + disabled: "已禁用" required_money: - name: '&f&l 遊戲幣要求' + name: '遊戲幣要求' description: |- - &7 修改完成挑戰時 - &7 需要具有的遊戲幣 - value: '&7 目前遊戲幣要求: &e [number]' + 修改完成挑戰時 + 需要具有的遊戲幣 + value: '目前遊戲幣要求: [number]' statistic: - name: '&f&l 統計' + name: '統計' description: |- - &7 修改完成挑戰時 - &7 需要具有的統計數據類型 - value: '&7 目前類型: &e [statistic]' + 修改完成挑戰時 + 需要具有的統計數據類型 + value: '目前類型: [statistic]' statistic_amount: - name: '&f&l 目標數量' + name: '目標數量' description: |- - &7 修改完成挑戰時 - &7 需要具有的指定統計 - &7 數據類型的目標數量 - value: '&7 目前數量: &e[number]' + 修改完成挑戰時 + 需要具有的指定統計 + 數據類型的目標數量 + value: '目前數量: [number]' remove_statistic: - name: "&f&l 扣除統計數據" + name: "扣除統計數據" description: |- - &7 切換所要求的統計數據 - &7 會否在完成挑戰後被扣除 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 切換所要求的統計數據 + 會否在完成挑戰後被扣除 + enabled: "已啟用" + disabled: "已禁用" statistic_blocks: - name: "&f&l 目標方塊類型" + name: "目標方塊類型" description: |- - &7 修改挑戰所要求獲得 - &7 統計數據的方塊類型 - &7 (如: 紅石塊, 木材等)。 - value: "&7 目前方塊類型: &e[block]" + 修改挑戰所要求獲得 + 統計數據的方塊類型 + (如: 紅石塊, 木材等)。 + value: "目前方塊類型: [block]" statistic_items: - name: "&f&l 目標物品類型" + name: "目標物品類型" description: |- - &7 修改挑戰所要求獲得 - &7 統計數據的物品類型 - &7 (如: 終界珍珠, 紅石火把等)。 - value: "&7 目前物品類型: &e[item]" + 修改挑戰所要求獲得 + 統計數據的物品類型 + (如: 終界珍珠, 紅石火把等)。 + value: "目前物品類型: [item]" statistic_entities: - name: "&f&l 目標實體" + name: "目標實體" description: |- - &7 修改挑戰所要求獲得 - &7 統計數據的實體類型 - &7 (如: 羊隻, 村民等)。 - value: "&7 目前實體:&e [entity]" + 修改挑戰所要求獲得 + 統計數據的實體類型 + (如: 羊隻, 村民等)。 + value: "目前實體:[entity]" reward_text: - name: "&f&l獎勵文本" + name: "獎勵文本" description: |- - &7 挑戰獎勵的文字 - &7 必須使用顏色代碼 - value: "&7 目前文本:" + 挑戰獎勵的文字 + 必須使用顏色代碼 + value: "目前文本:" repeat_reward_text: - name: "&f&l 重覆獎勵文本" + name: "重覆獎勵文本" description: |- - &7 挑戰重覆獎勵的文字 - &7 必須使用顏色代碼 - value: "&7 目前文本:" + 挑戰重覆獎勵的文字 + 必須使用顏色代碼 + value: "目前文本:" reward_items: - name: "&f&l 獎勵物品" - description: '&7 修改挑戰的獎勵物品' - title: "&7 物品: " - list: " &8 - [number] x [item]" - none: "&7 未添加物品" + name: "獎勵物品" + description: '修改挑戰的獎勵物品' + title: "物品: " + list: " - [number] x [item]" + none: "未添加物品" repeat_reward_items: - name: "&f&l 重覆挑戰的獎勵物品" - description: '&7 修改重覆挑戰的獎勵物品' - title: "&7 物品: " - list: " &8 - [number] x [item]" - none: "&7 未添加物品" + name: "重覆挑戰的獎勵物品" + description: '修改重覆挑戰的獎勵物品' + title: "物品: " + list: " - [number] x [item]" + none: "未添加物品" reward_experience: - name: "&f&l 獎勵經驗瓶" - description: '&7 修改挑戰獎勵的經驗瓶' - value: "&7 目前經驗瓶數量: &e[number]" + name: "獎勵經驗瓶" + description: '修改挑戰獎勵的經驗瓶' + value: "目前經驗瓶數量: [number]" repeat_reward_experience: - name: "&f&l 重覆挑戰的獎勵經驗瓶" - description: '&7 修改重覆挑戰的獎勵經驗瓶' - value: "&7 目前經驗瓶數量: &e [number]" + name: "重覆挑戰的獎勵經驗瓶" + description: '修改重覆挑戰的獎勵經驗瓶' + value: "目前經驗瓶數量: [number]" reward_money: - name: "&f&l 獎勵遊戲幣" - description: '&7 修改挑戰獎勵的遊戲幣' - value: "&7 目前數量: &e [number]" + name: "獎勵遊戲幣" + description: '修改挑戰獎勵的遊戲幣' + value: "目前數量: [number]" repeat_reward_money: - name: "&f&l 獎勵遊戲幣" - description: '&7 修改重覆挑戰的獎勵遊戲幣' - value: "&7 目前數量: &e [number]" + name: "獎勵遊戲幣" + description: '修改重覆挑戰的獎勵遊戲幣' + value: "目前數量: [number]" reward_commands: - name: '&f&l 獎勵指令' - description: |- - &7 獎勵指令 - &8 提示: - &8 此指令默認設置: - &8 - 所有指令在開首加入 `/` - &8 - 所有指令由伺服器執行 - &8 - &8 如果想讓玩家執行指令 - &8 可以在開首加入`[SELF]` - &8 - &8 指令支援一個placeholder - &8 `[player]` 可用於取代 - &8 完成挑戰的玩家的名字 - value: '&7 目前指令:' + name: '獎勵指令' + description: |- + 獎勵指令 + 提示: + 此指令默認設置: + - 所有指令在開首加入 `/` + - 所有指令由伺服器執行 + + 如果想讓玩家執行指令 + 可以在開首加入`[SELF]` + + 指令支援一個placeholder + `[player]` 可用於取代 + 完成挑戰的玩家的名字 + value: '目前指令:' repeat_reward_commands: - name: '&f&l 重覆挑戰獎勵指令' - description: |- - &7 重覆挑戰獎勵指令 - &8 提示: - &8 此指令默認設置: - &8 - 所有指令在開首加入 `/` - &8 - 所有指令由伺服器執行 - &8 - &8 如果想讓玩家執行指令 - &8 可以在開首加入`[SELF]` - &8 - &8 指令支援一個placeholder - &8 `[player]` 可用於取代 - &8 完成挑戰的玩家的名字 - value: '&7 目前指令:' + name: '重覆挑戰獎勵指令' + description: |- + 重覆挑戰獎勵指令 + 提示: + 此指令默認設置: + - 所有指令在開首加入 `/` + - 所有指令由伺服器執行 + + 如果想讓玩家執行指令 + 可以在開首加入`[SELF]` + + 指令支援一個placeholder + `[player]` 可用於取代 + 完成挑戰的玩家的名字 + value: '目前指令:' repeatable: - name: '&f&l 可重覆挑戰' - description: '&7 切換 是否容許重覆完成挑戰' - enabled: "&2 已啟用" - disabled: "&c 已禁用" + name: '可重覆挑戰' + description: '切換 是否容許重覆完成挑戰' + enabled: "已啟用" + disabled: "已禁用" repeat_count: - name: '&f&l 重覆完成次數' + name: '重覆完成次數' description: |- - &7 修改 挑戰可重覆完成 - &7 的最大次數 - value: '&7 目前數: &e[number]次' + 修改 挑戰可重覆完成 + 的最大次數 + value: '目前數: [number]次' cool_down: - name: '&f&l 冷卻時間' + name: '冷卻時間' description: |- - &7 修改 每次重覆完成挑戰 - &7 相距的冷卻時間(以秒計) - value: '&7 目前數: &e[time]秒' + 修改 每次重覆完成挑戰 + 相距的冷卻時間(以秒計) + value: '目前數: [time]秒' challenges: - name: '&f&l 挑戰' + name: '挑戰' description: |- - &7 查看各島嶼等級 - &7 需要完成的相應挑戰 + 查看各島嶼等級 + 需要完成的相應挑戰 waiver_amount: - name: '&f&l 豁免挑戰' - description: |- - &7 可設定在解鎖下一等級時 - &7 有多少挑戰可被豁免完成 - &7 (如: 共30個挑戰,只需要 - &7 完成20個就可以解鎖, - &7 相等於&f10個被豁免完成&7) - value: '&7 目前數: &e[number]個' + name: '豁免挑戰' + description: |- + 可設定在解鎖下一等級時 + 有多少挑戰可被豁免完成 + (如: 共30個挑戰,只需要 + 完成20個就可以解鎖, + 相等於10個被豁免完成) + value: '目前數: [number]個' add_challenges: - name: '&f&l 添加挑戰' + name: '添加挑戰' description: |- - &7 將挑戰加入到 - &7 指定島嶼等級的要求中 + 將挑戰加入到 + 指定島嶼等級的要求中 remove_challenges: - name: '&f&l 刪除挑戰' + name: '刪除挑戰' description: |- - &7 將挑戰從島嶼等級的 - &7 要求中刪除 + 將挑戰從島嶼等級的 + 要求中刪除 reset_on_new: - name: '&f&l 挑戰紀錄與島嶼一起重刷' - description: |- - &7 切換 是否當玩家重刷島嶼時 - &7 挑戰紀錄與島嶼清空 及 - &7 離開島嶼(即轉讓所有權)時 - &7 挑戰紀錄自動清空 - enabled: "&2已啟用" - disabled: "&c已禁用" + name: '挑戰紀錄與島嶼一起重刷' + description: |- + 切換 是否當玩家重刷島嶼時 + 挑戰紀錄與島嶼清空 及 + 離開島嶼(即轉讓所有權)時 + 挑戰紀錄自動清空 + enabled: "已啟用" + disabled: "已禁用" broadcast: - name: '&f&l 廣播' + name: '廣播' description: |- - &7 當玩家首次完成項目挑戰時 - &7 會否在伺服器內公開廣播 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 當玩家首次完成項目挑戰時 + 會否在伺服器內公開廣播 + enabled: "已啟用" + disabled: "已禁用" remove_completed: - name: '&f&l 隱藏已完成項目' + name: '隱藏已完成項目' description: |- - &7 將所有已完成的挑戰從菜單中隱藏 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 將所有已完成的挑戰從菜單中隱藏 + enabled: "已啟用" + disabled: "已禁用" glow_completed: - name: '&f&l 已完成項目發光顯示' + name: '已完成項目發光顯示' description: |- - &7 將所有已完成的挑戰 - &7 加入發光顯示效果 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 將所有已完成的挑戰 + 加入發光顯示效果 + enabled: "已啟用" + disabled: "已禁用" store_history: - name: '&f&l 保存記錄' + name: '保存記錄' description: |- - &7 保存所有已完成挑戰的相關紀錄 - &7 目前只能從後台的數據庫重新查看 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 保存所有已完成挑戰的相關紀錄 + 目前只能從後台的數據庫重新查看 + enabled: "已啟用" + disabled: "已禁用" data_per_island: - name: '&f&l 保存記錄(以島嶼為單位)' - description: |- - &7 獨立保存各個島嶼上所有 - &7 已完成挑戰的相關紀錄 - &7 完成的進度會在同一隊伍 - &7 中的隊員之間共享 - enabled: "&2 已啟用" - disabled: "&c 已禁用" + name: '保存記錄(以島嶼為單位)' + description: |- + 獨立保存各個島嶼上所有 + 已完成挑戰的相關紀錄 + 完成的進度會在同一隊伍 + 中的隊員之間共享 + enabled: "已啟用" + disabled: "已禁用" show_title: - name: '&f&l 顯示標題' + name: '顯示標題' description: |- - &7 當玩家完成挑戰或提升等級時 - &7 在畫面中央顯示標題(Title) - enabled: "&2 已啟用" - disabled: "&c 已禁用" + 當玩家完成挑戰或提升等級時 + 在畫面中央顯示標題(Title) + enabled: "已啟用" + disabled: "已禁用" gamemode_gui: - name: '&f&l 空島模式選擇界面' - description: |- - &7 啟用 可以透過`/challenges`指令 - &7 獲得可選擇的指定界面 - &7 - &c **需要重新啟動套用更改** - enabled: "&2 已啟用" - disabled: "&c 已禁用" + name: '空島模式選擇界面' + description: |- + 啟用 可以透過`/challenges`指令 + 獲得可選擇的指定界面 + + **需要重新啟動套用更改** + enabled: "已啟用" + disabled: "已禁用" locked_level_icon: - name: '&f&l 預設未解鎖等級的圖標' + name: '預設未解鎖等級的圖標' description: |- - &7 預設未解鎖等級的圖標 - &7 每個等級均可單獨設置圖標 + 預設未解鎖等級的圖標 + 每個等級均可單獨設置圖標 purge_history: - name: '&f&l 記錄保存時限' + name: '記錄保存時限' description: |- - &7 玩家數據被保留的最大時長(天) - &7 0 代表數據不會被刪除 - value: '&7 目前: &e [number] 天' + 玩家數據被保留的最大時長(天) + 0 代表數據不會被刪除 + value: '目前: [number] 天' title_showtime: - name: '&f&l 標題顯示時長' + name: '標題顯示時長' description: |- - &7 當玩家完成挑戰或提升等級時 - &7 標題(Title)顯示的時長(tick) - &7 (20 tick = 1秒) - value: '&7 目前: &e [number] tick' + 當玩家完成挑戰或提升等級時 + 標題(Title)顯示的時長(tick) + (20 tick = 1秒) + value: '目前: [number] tick' active_world_list: - name: '&f&l 只顯示身處世界' - description: |- - &7 (這設置只適用於空島模式 - &7 選擇器已開放給玩家使用) - &7 - &7 切換 在目前世界使用選擇器時 - &7 會否顯示該空島模式或挑戰 - &7 - &c **需要重新啟動套用更改** - enabled: "&2已啟用" - disabled: "&c已禁用" + name: '只顯示身處世界' + description: |- + (這設置只適用於空島模式 + 選擇器已開放給玩家使用) + + 切換 在目前世界使用選擇器時 + 會否顯示該空島模式或挑戰 + + **需要重新啟動套用更改** + enabled: "已啟用" + disabled: "已禁用" visibility_mode: - name: '&f&l 可見性模式' + name: '可見性模式' description: |- - &7 可見性模式會顯示所有挑戰 - &7 包括己隱藏挑戰 - enabled: '&2' - disabled: '&c' + 可見性模式會顯示所有挑戰 + 包括己隱藏挑戰 + enabled: '' + disabled: '' visible: '顯示非隱藏挑戰' hidden: '顯示所有挑戰' toggleable: '可切換' download: - name: '&f&l 從網上挑戰庫下載更新' + name: '從網上挑戰庫下載更新' description: |- - &7 手動從網上挑戰庫 - &7 下載挑戰更新 - enabled: '&2 下載同時清除緩存' - disabled: '&c 只下載但不清除緩存' + 手動從網上挑戰庫 + 下載挑戰更新 + enabled: '下載同時清除緩存' + disabled: '只下載但不清除緩存' player: - name: '&f&l [name]' - description: '&7 島主: [owner]' - members: '&7 島成員:' - member: '&8 - [name]' - no-island: '&c 這玩家沒有島嶼' + name: '[name]' + description: '島主: [owner]' + members: '島成員:' + member: '- [name]' + no-island: '這玩家沒有島嶼' player_list: - name: '&f&l 選擇玩家清單' - description: '&7 選擇指定玩家清單' - enabled: '&2' - disabled: '&c' + name: '選擇玩家清單' + description: '選擇指定玩家清單' + enabled: '' + disabled: '' online: '在線玩家' with_island: '有島嶼玩家' in_world: '當前世界內的玩家' add_block: - name: '&f&l 添加方塊' - description: '&7 添加方塊至清單中' + name: '添加方塊' + description: '添加方塊至清單中' remove_block: - name: '&f&l 移除方塊' - description: '&7 將方塊從清單中移除' - title: '&7 已選材料:' - material: '&8 - [material]' + name: '移除方塊' + description: '將方塊從清單中移除' + title: '已選材料:' + material: '- [material]' material: - name: '&f&l [material]' - description: '&7 材料ID: [id]' - selected: '&2 已選' + name: '[material]' + description: '材料ID: [id]' + selected: '已選' add_entity: - name: '&f&l 添加實體' - description: '&7 添加實體至清單中' + name: '添加實體' + description: '添加實體至清單中' switch_entity: - name: '&f&l 轉變生怪蛋' - description: '&7 把生怪蛋轉變成頭顱' + name: '轉變生怪蛋' + description: '把生怪蛋轉變成頭顱' remove_entity: - name: '&f&l 移除實體' - description: '&7 將實體從清單中移除' - title: '&7 已選實體:' - entity: '&8 - [entity]' + name: '移除實體' + description: '將實體從清單中移除' + title: '已選實體:' + entity: '- [entity]' entity: - name: '&f&l [entity]' - description: '&7 實體ID: [id]' - selected: '&2 已選' + name: '[entity]' + description: '實體ID: [id]' + selected: '已選' inventory_type: - name: '&f&l 類型: 背包' - description: '&7 挑戰需要檢驗玩家背包內的物品' + name: '類型: 背包' + description: '挑戰需要檢驗玩家背包內的物品' island_type: - name: '&f&l 類型: 島嶼' - description: '&7 挑戰需要檢驗玩家附近的方塊或實體' + name: '類型: 島嶼' + description: '挑戰需要檢驗玩家附近的方塊或實體' other_type: - name: '&f&l 類型: 其他' + name: '類型: 其他' description: |- - &7 挑戰需要依據外帶插件進行檢驗 - &7 如: 個人經驗等級或遊戲幣等 + 挑戰需要依據外帶插件進行檢驗 + 如: 個人經驗等級或遊戲幣等 statistic_type: - name: '&f&l 類型: 統計數據' - description: '&7 挑戰需要檢驗玩家的個人統計數據' + name: '類型: 統計數據' + description: '挑戰需要檢驗玩家的個人統計數據' description: |- - &7 挑戰需要檢驗玩家的個人統計數據 - &7 如: 走了多遠 殺了多少怪等 + 挑戰需要檢驗玩家的個人統計數據 + 如: 走了多遠 殺了多少怪等 save: - name: '&f&l 保存' - description: '&7 保存更改並返回' + name: '保存' + description: '保存更改並返回' cancel: - name: '&f&l 取消' - description: '&7 放棄更改並返回' + name: '取消' + description: '放棄更改並返回' accept_selected: - name: '&f&l 確定已選' - description: '&7 確定已選定並返回上一菜單' - title: '&7 已選定: ' - element: '&8 - [element]' + name: '確定已選' + description: '確定已選定並返回上一菜單' + title: '已選定: ' + element: '- [element]' statistic_element: - name: '&f&l [statistic]' + name: '[statistic]' description: '[description]' environment_element: - name: '&f&l [environment]' + name: '[environment]' description: '[description]' search: - name: '&f&l 搜索' - description: '&7 搜索就搜索 沒他了' - search: '&b 字條: [value]' + name: '搜索' + description: '搜索就搜索 沒他了' + search: '字條: [value]' tips: - click-to-select: "&e 點擊&7選擇" - click-to-choose: "&e 點擊&7選擇" - click-to-complete: "&e 點擊&7完成" - right-click-multiple-open: "&7 右&e擊 &7選擇完成挑戰的次數" + click-to-select: "點擊選擇" + click-to-choose: "點擊選擇" + click-to-complete: "點擊完成" + right-click-multiple-open: "右擊 選擇完成挑戰的次數" shift-left-click-to-complete-all: |- - &e 按住Shift並左擊&7一鍵完成 - &e (根據背包中所需道具數量) - left-click-to-accept: "&7 左&e擊&7接受" - right-click-to-write: "&7 右&e擊&7寫入" - click-to-reduce: "&e 點擊&7減少" - click-to-increase: "&e 點擊&7增加" - click-to-return: "&e 點擊&7返回" - click-to-quit: "&e 點擊&7退出" - click-to-wipe: "&e 點擊&7清空" - left-click-to-wipe: "&7 左&e擊&7清除" - right-click-to-switch: "&7 右&e擊&7切換" - click-to-open: "&e 點擊&7打開" - click-to-export: "&e 點擊&7導出" - click-to-create: "&e 點擊&7創建" - left-click-to-open: "&7 左&e擊&7打開" - right-click-to-reset-all: "&7 右&e擊&7重置所有內容" - click-to-toggle: "&e 點擊&7進行切換" - click-to-change: "&e 點擊&7進行更改" - shift-click-to-reset: "&e 按住Shift並點擊&7進行重置" - click-to-add: "&e 點擊&7添加" - click-to-remove: "&e 點擊&7刪除" - left-click-to-cycle: "&7 左&e擊&7向下循環" - right-click-to-cycle: "&7 右&e擊&7向上循環" - click-to-edit: "&e 點擊&7進行編輯" - left-click-to-download: "&7 左&e擊&7下載" - right-click-to-toggle: "&7 右&e擊&7進行切換" - click-to-install: "&e 點擊&7安裝" - click-to-reset-all: "&e 點擊&7全部重置" - right-click-to-select: "&7 右&e擊&7選擇" - right-click-to-deselect: "&7 右&e擊&7取消" - left-click-to-choose: "&7 左&e擊&7選擇" - click-to-cancel: "&e 點擊&7取消" - click-to-save: "&e 點擊&7保存" - click-to-deselect: "&e 點擊&7取消選擇" - click-on-item: "&7 從你的背包中&e點選&7物品" - left-click-to-edit: "&7 左&e擊&7進行編輯。" - right-click-to-clear: "&7 右&e擊&7清除。" - click-to-previous: "&e 點擊 &7 查看上一頁。" - click-to-next: "&e 點擊 &7 查看下一頁。" + 按住Shift並左擊一鍵完成 + (根據背包中所需道具數量) + left-click-to-accept: "左擊接受" + right-click-to-write: "右擊寫入" + click-to-reduce: "點擊減少" + click-to-increase: "點擊增加" + click-to-return: "點擊返回" + click-to-quit: "點擊退出" + click-to-wipe: "點擊清空" + left-click-to-wipe: "左擊清除" + right-click-to-switch: "右擊切換" + click-to-open: "點擊打開" + click-to-export: "點擊導出" + click-to-create: "點擊創建" + left-click-to-open: "左擊打開" + right-click-to-reset-all: "右擊重置所有內容" + click-to-toggle: "點擊進行切換" + click-to-change: "點擊進行更改" + shift-click-to-reset: "按住Shift並點擊進行重置" + click-to-add: "點擊添加" + click-to-remove: "點擊刪除" + left-click-to-cycle: "左擊向下循環" + right-click-to-cycle: "右擊向上循環" + click-to-edit: "點擊進行編輯" + left-click-to-download: "左擊下載" + right-click-to-toggle: "右擊進行切換" + click-to-install: "點擊安裝" + click-to-reset-all: "點擊全部重置" + right-click-to-select: "右擊選擇" + right-click-to-deselect: "右擊取消" + left-click-to-choose: "左擊選擇" + click-to-cancel: "點擊取消" + click-to-save: "點擊保存" + click-to-deselect: "點擊取消選擇" + click-on-item: "從你的背包中點選物品" + left-click-to-edit: "左擊進行編輯。" + right-click-to-clear: "右擊清除。" + click-to-previous: "點擊 查看上一頁。" + click-to-next: "點擊 查看下一頁。" descriptions: challenge: lore: |- @@ -693,16 +693,16 @@ challenges: [requirements] [rewards] status: - completed: '&2&l 已完成' - completed-times: '&2 已完成&7&l[number]&r&2次' - completed-times-of: '&2 已完成&7&l[number]&r&2次 (最大&7&l[max]&r&2次) ' - completed-times-reached: '&2&l 已完成最大&7&l[max]&r&2次' + completed: '已完成' + completed-times: '已完成[number]次' + completed-times-of: '已完成[number]次 (最大[max]次) ' + completed-times-reached: '已完成最大[max]次' cooldown: lore: |- [timeout] [wait-time] - timeout: '&7&l 冷卻時間: &r&7 [time]' - wait-time: '&c&l 冷卻倒計時: &r&c [time]' + timeout: '冷卻時間: [time]' + wait-time: '冷卻倒計時: [time]' in-days: '[number]天' in-hours: '[number]小時' in-minutes: '[number]分鐘' @@ -712,12 +712,12 @@ challenges: [environment] [type-requirement] [permissions] - environment-single: '&7 限於[environment]' - environment-title: '&7 限於: ' - environment-list: ' &7 - &e [environment]' - permission-single: '&c 需要 [permissions] 權限' - permissions-title: '&c 需要多個權限: ' - permissions-list: ' &c - [permission]' + environment-single: '限於[environment]' + environment-title: '限於: ' + environment-list: ' - [environment]' + permission-single: '需要 [permissions] 權限' + permissions-title: '需要多個權限: ' + permissions-list: ' - [permission]' island: lore: |- [blocks] @@ -725,23 +725,23 @@ challenges: [search-radius] [warning-block] [warning-entity] - blocks-title: '&7&l 所需方塊:' - block-value: ' &7 - &e [material]' - blocks-value: ' &7 - &e [number] x [material]' - entities-title: '&7&l 所需實體:' - entity-value: ' &7 - &e [entity]' - entities-value: ' &7 - &e [number] x [entity]' - search-radius: '&7 不可超過&e[number]&7米' - warning-block: '&e 方塊會被收取不退還' - warning-entity: '&e 實體會被收取不退還' + blocks-title: '所需方塊:' + block-value: ' - [material]' + blocks-value: ' - [number] x [material]' + entities-title: '所需實體:' + entity-value: ' - [entity]' + entities-value: ' - [number] x [entity]' + search-radius: '不可超過[number]米' + warning-block: '方塊會被收取不退還' + warning-entity: '實體會被收取不退還' inventory: lore: |- [items] [warning] - item-title: '&7&l 所需物品:' - item-value: ' &7 - &e [item]' - items-value: ' &7 - &e [number] x [item]' - warning: '&e 物品會被收取不退還' + item-title: '所需物品:' + item-value: ' - [item]' + items-value: ' - [number] x [item]' + warning: '物品會被收取不退還' other: lore: |- [experience] @@ -749,34 +749,34 @@ challenges: [money] [money-warning] [level] - experience: '&7&l 所需經驗值: &r&e [number]' - experience-warning: '&e 經驗值會被收取不退還' - money: '&7&l 所需遊戲幣: &r&e [number]' - money-warning: '&e 遊戲幣會被收取不退還' - level: '&7&l 需要的島嶼等級: &r&e [number]' + experience: '所需經驗值: [number]' + experience-warning: '經驗值會被收取不退還' + money: '所需遊戲幣: [number]' + money-warning: '遊戲幣會被收取不退還' + level: '需要的島嶼等級: [number]' statistic: lore: |- [statistic] [warning] - multiple-target: '&7&l [statistic]: &r&e [number] x [target]' - single-target: '&7&l [statistic]: &r&e [target]' - statistic: '&7&l [statistic] &r&e [number]' - warning: '&e 該統計記錄會&c被扣除' + multiple-target: '[statistic]: [number] x [target]' + single-target: '[statistic]: [target]' + statistic: '[statistic] [number]' + warning: '該統計記錄會被扣除' rewards: lore: |- - &7&l 完成獎勵: + 完成獎勵: [text] [items] [experience] [money] [commands] - item-title: '&7 物品:' - item-value: ' &7 - &e [item]' - items-value: ' &7 - &e [number] x [item]' - experience: '&7 經驗值: &r&e [number]' - money: '&7 遊戲幣: &r&e [number]' - commands-title: '&7 指令:' - command: ' &7 - &e [command]' + item-title: '物品:' + item-value: ' - [item]' + items-value: ' - [number] x [item]' + experience: '經驗值: [number]' + money: '遊戲幣: [number]' + commands-title: '指令:' + command: ' - [command]' level: lore: |- [text] @@ -784,90 +784,90 @@ challenges: [waiver] [rewards] status: - completed: '&2&l 已完成' + completed: '已完成' completed-challenges-of: |- - &2 已完成&7&l[max]個&r&2挑戰中的 - &7&l [number]個 - locked: '&c&l未解鎖' + 已完成[max]個挑戰中的 + [number]個 + locked: '未解鎖' missing-challenges: |- - &7 需要先完成 [number] 挑戰 - &7 才可解鎖這等級。 + 需要先完成 [number] 挑戰 + 才可解鎖這等級。 waiver: |- - &7 目前等級容許豁免完成 &l[number]個挑戰 - &7 以提升到下一等級 + 目前等級容許豁免完成 [number]個挑戰 + 以提升到下一等級 rewards: lore: |- - &7&l 完成獎勵: + 完成獎勵: [text] [items] [experience] [money] [commands] - item-title: '&7 物品:' - item-value: ' &7 - &e[item]' - items-value: ' &7 - &e[number] x [item]' - experience: '&7 經驗值: &r&e[number]' - money: '&7 遊戲幣: &r&e[number]' - commands-title: '&7 指令:' - command: ' &7 - &e[command]' + item-title: '物品:' + item-value: ' - [item]' + items-value: ' - [number] x [item]' + experience: '經驗值: [number]' + money: '遊戲幣: [number]' + commands-title: '指令:' + command: ' - [command]' library: - author: '&7 作者: &e[author]' - version: '&7 依據挑戰附加-版本: &e[version]' - lang: '&7 語言: &e [lang]' - gamemode: '&7 主要模式: &e [gamemode]' + author: '作者: [author]' + version: '依據挑戰附加-版本: [version]' + lang: '語言: [lang]' + gamemode: '主要模式: [gamemode]' conversations: - prefix: '&l&6 [BentoBox]: &r' + prefix: '[BentoBox]: ' confirm-string: true, on, yes, confirm, y, valid, correct deny-string: false, off, no, deny, n, invalid, incorrect cancel-string: cancel exit-string: cancel, exit, quit - cancelled: '&c 對話取消!' - input-number: '&e 請在聊天中輸入 一個數字' - input-seconds: '&e 請在聊天中輸入 一個秒數' - numeric-only: '&c 輸入的[value]不是 有效數字!' - not-valid-value: '&c 輸入的[value]無效. 數字必須於[min]及[max]之間!' - user-data-removed: '&a 空島模式[gamemode]中的&4所有玩家數據&a已被清除' + cancelled: '對話取消!' + input-number: '請在聊天中輸入 一個數字' + input-seconds: '請在聊天中輸入 一個秒數' + numeric-only: '輸入的[value]不是 有效數字!' + not-valid-value: '輸入的[value]無效. 數字必須於[min]及[max]之間!' + user-data-removed: '空島模式[gamemode]中的所有玩家數據已被清除' confirm-user-data-deletion: |- - &e 請再次 &4確認 &e要把空島模式[gamemode]中的 - &4所有&e玩家數據 &a從數據庫中刪除 - challenge-data-removed: '&a 空島模式[gamemode]中的&4所有挑戰紀錄&a已被清除' + 請再次 確認 要把空島模式[gamemode]中的 + 所有玩家數據 從數據庫中刪除 + challenge-data-removed: '空島模式[gamemode]中的所有挑戰紀錄已被清除' confirm-challenge-data-deletion: |- - &e 請再次 &4確認 &e要把空島模式[gamemode]中的 - &4所有&e挑戰紀錄 &a從數據庫中刪除 - all-data-removed: '&a 空島模式[gamemode]中的&4所有附加插件(addon)的紀錄&a已被清除' + 請再次 確認 要把空島模式[gamemode]中的 + 所有挑戰紀錄 從數據庫中刪除 + all-data-removed: '空島模式[gamemode]中的所有附加插件(addon)的紀錄已被清除' confirm-all-data-deletion: |- - &e 請再次 &4確認 &e要把空島模式[gamemode]中的 - &4所有&e附加插件(addon)的紀錄 &a從數據庫中刪除 - write-name: '&e 請在聊天中輸入 一個名字' - new-object-created: '&a 為空島模式[gamemode]創造了新物品' - object-already-exists: '&c 物品&7[id] &c已經存在。 請選擇新名字。' - invalid-challenge: '&c 挑戰[challenge]包含無效數據。 無法啟用!' - name-changed: '&a 動作完成,名稱已被更新。' - write-description: '&e 請在聊天中輸入 介紹 及 在單獨一行中輸入''quit''完成。' - description-changed: '&a 動作完成,介紹已被更新。' - write-permissions: '&e 請在聊天中輸入所要求的權限,每個權限以單獨一行輸入 及 在單獨一行中輸入''quit''完成。' - permissions-changed: '&a 動作完成,挑戰所要求的權限已被更新。' - write-reward-text: '&e 請在聊天中輸入(首次)完成挑戰後顯示的字句 及 在單獨一行中輸入''quit''完成。' - reward-text-changed: '&a 動作完成,(首次)完成後顯示的字句已被更新。' - write-repeat-reward-text: '&e 請在聊天中輸入(重覆)完成挑戰後顯示的字句 及 在單獨一行中輸入''quit''完成。' - repeat-reward-text-changed: '&a 動作完成,(重覆)完成後顯示的字句已被更新。' - write-reward-commands: '&e 請在聊天中輸入(首次)完成挑戰後執行的指令 及 在單獨一行中輸入''quit''完成。' - reward-commands-changed: '&a 動作完成,(首次)完成後執行的指令已被更新。' - write-repeat-reward-commands: '&e 請在聊天中輸入(重覆)完成挑戰後執行的指令 及 在單獨一行中輸入''quit''完成。' - repeat-reward-commands-changed: '&a 動作完成,(重覆)完成後執行的指令已被更新。' - challenge-removed: '&a 空島模式[gamemode]中的挑戰[challenge] 已被清除。' - confirm-challenge-deletion: '&e 請 再次確認 要清除空島模式[gamemode]中的挑戰[challenge]' - level-removed: '&a 空島模式[gamemode]中的等級[level] 已被清除。' - confirm-level-deletion: '&e 請 再次確認 要清除空島模式[gamemode]中的等級[level]' - start-downloading: '&a 開始下載及導入挑戰庫' - written-text: '&a 已輸入文本:' - confirm-data-replacement: '&e 請 再次確認 要以新挑戰替代現存挑戰。' - new-challenges-imported: '&a 動作完成,空島模式[gamemode]中新的挑戰已被導入。' - exported-file-name: '&e 輸入已導出數據庫的檔案名稱。 (輸入''cancel''退出)' - database-export-completed: '&a 動作完成,世界[world]數據已完成導出,檔案[file]已生成。' - file-name-exist: '&c 檔案''[id]''已存在。 無法覆蓋。' - write-search: '&e 請輸入搜索字條 (輸入''cancel''退出)' - search-updated: '&a 搜索完成' + 請再次 確認 要把空島模式[gamemode]中的 + 所有附加插件(addon)的紀錄 從數據庫中刪除 + write-name: '請在聊天中輸入 一個名字' + new-object-created: '為空島模式[gamemode]創造了新物品' + object-already-exists: '物品[id] 已經存在。 請選擇新名字。' + invalid-challenge: '挑戰[challenge]包含無效數據。 無法啟用!' + name-changed: '動作完成,名稱已被更新。' + write-description: '請在聊天中輸入 介紹 及 在單獨一行中輸入''quit''完成。' + description-changed: '動作完成,介紹已被更新。' + write-permissions: '請在聊天中輸入所要求的權限,每個權限以單獨一行輸入 及 在單獨一行中輸入''quit''完成。' + permissions-changed: '動作完成,挑戰所要求的權限已被更新。' + write-reward-text: '請在聊天中輸入(首次)完成挑戰後顯示的字句 及 在單獨一行中輸入''quit''完成。' + reward-text-changed: '動作完成,(首次)完成後顯示的字句已被更新。' + write-repeat-reward-text: '請在聊天中輸入(重覆)完成挑戰後顯示的字句 及 在單獨一行中輸入''quit''完成。' + repeat-reward-text-changed: '動作完成,(重覆)完成後顯示的字句已被更新。' + write-reward-commands: '請在聊天中輸入(首次)完成挑戰後執行的指令 及 在單獨一行中輸入''quit''完成。' + reward-commands-changed: '動作完成,(首次)完成後執行的指令已被更新。' + write-repeat-reward-commands: '請在聊天中輸入(重覆)完成挑戰後執行的指令 及 在單獨一行中輸入''quit''完成。' + repeat-reward-commands-changed: '動作完成,(重覆)完成後執行的指令已被更新。' + challenge-removed: '空島模式[gamemode]中的挑戰[challenge] 已被清除。' + confirm-challenge-deletion: '請 再次確認 要清除空島模式[gamemode]中的挑戰[challenge]' + level-removed: '空島模式[gamemode]中的等級[level] 已被清除。' + confirm-level-deletion: '請 再次確認 要清除空島模式[gamemode]中的等級[level]' + start-downloading: '開始下載及導入挑戰庫' + written-text: '已輸入文本:' + confirm-data-replacement: '請 再次確認 要以新挑戰替代現存挑戰。' + new-challenges-imported: '動作完成,空島模式[gamemode]中新的挑戰已被導入。' + exported-file-name: '輸入已導出數據庫的檔案名稱。 (輸入''cancel''退出)' + database-export-completed: '動作完成,世界[world]數據已完成導出,檔案[file]已生成。' + file-name-exist: '檔案''[id]''已存在。 無法覆蓋。' + write-search: '請輸入搜索字條 (輸入''cancel''退出)' + search-updated: '搜索完成' titles: # Title and subtitle may contain variables in [] that will be replaced with a proper message from the challenge object. # [friendlyName] will be replaced with challenge friendly name. @@ -881,58 +881,58 @@ challenges: level-title: '等級完成' level-subtitle: '[friendlyName]' messages: - completed: '&2 你已為[player]完成挑戰[name]!' - already-completed: '&2 這個挑戰已經完成了!' - reset: '&2 你已重設玩家[player]的[name]挑戰紀錄!' - reset-all: '&2 玩家[player]的所有挑戰紀錄已被重設!' - not-completed: '&2 這個挑戰還未完成啊!' - migrate-start: '&2 開始遷移挑戰附加插件的數據。' - migrate-end: '&2 挑戰附加插件的數據已遷移至新格式。' - migrate-not: '&2 數據已確認有效。' - start-downloading: '&5 開始下載及導入挑戰。' - you-completed-challenge: '&2 你已完成了 [value]&2挑戰!' - you-repeated-challenge: '&2 你已重覆完成了 [value]&2挑戰!' - you-repeated-challenge-multiple: '&2 你已重覆完成了 [value]&2挑戰 [count]次!' - you-completed-level: '&2 你已完成了 [value]&2等級!' - name-has-completed-challenge: '&5 [name]已完成了 [value]&2挑戰!' - name-has-completed-level: '&5 [name]已完成了 [value]&2等級!' + completed: '你已為[player]完成挑戰[name]!' + already-completed: '這個挑戰已經完成了!' + reset: '你已重設玩家[player]的[name]挑戰紀錄!' + reset-all: '玩家[player]的所有挑戰紀錄已被重設!' + not-completed: '這個挑戰還未完成啊!' + migrate-start: '開始遷移挑戰附加插件的數據。' + migrate-end: '挑戰附加插件的數據已遷移至新格式。' + migrate-not: '數據已確認有效。' + start-downloading: '開始下載及導入挑戰。' + you-completed-challenge: '你已完成了 [value]挑戰!' + you-repeated-challenge: '你已重覆完成了 [value]挑戰!' + you-repeated-challenge-multiple: '你已重覆完成了 [value]挑戰 [count]次!' + you-completed-level: '你已完成了 [value]等級!' + name-has-completed-challenge: '[name]已完成了 [value]挑戰!' + name-has-completed-level: '[name]已完成了 [value]等級!' load-skipping: '"[value]"已存在 - 忽略中' load-overwriting: 覆蓋 "[value]" load-add: '加入新物品: [value]' errors: - no-name: '&c 欠缺挑戰名稱' - unknown-challenge: '&c 不明挑戰' + no-name: '欠缺挑戰名稱' + unknown-challenge: '不明挑戰' not-valid-integer: |- - &c 輸入的數字"[value]"無效! - &c 數字必須在[min]和[max]之間。 - not-deployed: '&c 挑戰並未開放!' - not-on-island: '&c 你必須在你的島上進行這動作!' - challenge-level-not-available: '&c 你尚未解鎖這挑戰的空島等級。' - not-repeatable: '&c 這挑戰只能完成一次!' - wrong-environment: '&c 你身處的不合適的環境或世界中!' - not-enough-items: '&c 你沒有足夠的[items]去完成挑戰!' - not-close-enough: '&c 你必須站在所要求物品的[number]米(格)範圍內。' - you-still-need: '&c 你尚內[amount] x [item]' - missing-addon: '&c 無法完成挑戰: 欠缺所需要的插件或附加插件。' - incorrect: '&c 無法完成挑戰: 所要求的條件不正確。' - not-enough-money: '&c 你帳戶內需要有最少[value]遊戲幣以完成挑戰。' - not-enough-experience: '&c 你需要[value]經驗值以完成挑戰。' - island-level: '&c 你的島嶼必須到達最少[number]等級以完成挑戰!' - no-load: '&c 錯誤: 無法載入檔案。 [message]' - load-error: '&c 錯誤: 無法載入 [value].' - no-rank: '&c 你還未達到足夠的頭銜等級以完成挑戰。' - cannot-remove-items: '&c 部分物品無法從你的背包內移除!' - exist-challenges-or-levels: '&c 你的世界內已經有了這挑戰。 無法進行!' - no-challenges: '&c 這個世界尚未開放挑戰功能!' - no-challenges-admin: '&c 這個世界尚未開放挑戰功能! 使用&5 /[command] &c添加挑戰!' - missing-arguments: '&c 指令不完整。' - no-multiple-permission: '&c 你沒有權限同時重覆完成這挑戰。' - invalid-level: '&c 等級[level]中存在錯誤數據。 無法從數據庫中加載!' - invalid-challenge: '&c 挑戰[challenge]中存在錯誤數據。 無法從數據庫中加載!' - no-library-entries: '&c 無法找到任何可用的資料。 沒有可以顯示的。' - not-hooked: '&c 挑戰附加插件沒有發現任何遊戲模式。' - timeout: '&c 每次完成這挑戰要求最少等待[timeout]秒。 你必須等待[wait-time]秒才可以再次完成。' - requirement-not-met: '&c 這挑戰要求[statistic]達到[number]。 你只有[value]。' + 輸入的數字"[value]"無效! + 數字必須在[min]和[max]之間。 + not-deployed: '挑戰並未開放!' + not-on-island: '你必須在你的島上進行這動作!' + challenge-level-not-available: '你尚未解鎖這挑戰的空島等級。' + not-repeatable: '這挑戰只能完成一次!' + wrong-environment: '你身處的不合適的環境或世界中!' + not-enough-items: '你沒有足夠的[items]去完成挑戰!' + not-close-enough: '你必須站在所要求物品的[number]米(格)範圍內。' + you-still-need: '你尚內[amount] x [item]' + missing-addon: '無法完成挑戰: 欠缺所需要的插件或附加插件。' + incorrect: '無法完成挑戰: 所要求的條件不正確。' + not-enough-money: '你帳戶內需要有最少[value]遊戲幣以完成挑戰。' + not-enough-experience: '你需要[value]經驗值以完成挑戰。' + island-level: '你的島嶼必須到達最少[number]等級以完成挑戰!' + no-load: '錯誤: 無法載入檔案。 [message]' + load-error: '錯誤: 無法載入 [value].' + no-rank: '你還未達到足夠的頭銜等級以完成挑戰。' + cannot-remove-items: '部分物品無法從你的背包內移除!' + exist-challenges-or-levels: '你的世界內已經有了這挑戰。 無法進行!' + no-challenges: '這個世界尚未開放挑戰功能!' + no-challenges-admin: '這個世界尚未開放挑戰功能! 使用/[command] 添加挑戰!' + missing-arguments: '指令不完整。' + no-multiple-permission: '你沒有權限同時重覆完成這挑戰。' + invalid-level: '等級[level]中存在錯誤數據。 無法從數據庫中加載!' + invalid-challenge: '挑戰[challenge]中存在錯誤數據。 無法從數據庫中加載!' + no-library-entries: '無法找到任何可用的資料。 沒有可以顯示的。' + not-hooked: '挑戰附加插件沒有發現任何遊戲模式。' + timeout: '每次完成這挑戰要求最少等待[timeout]秒。 你必須等待[wait-time]秒才可以再次完成。' + requirement-not-met: '這挑戰要求[statistic]達到[number]。 你只有[value]。' # # Showcase for manual material translation # materials: # # Names should be lowercase. @@ -950,11 +950,11 @@ challenges: # meta: # upgraded: "Upgraded" # extended: "Extended" -# potion-meta: "&e [type] [upgraded] [extended]" +# potion-meta: "[type] [upgraded] [extended]" # # Be aware, enchants are always listed below item in separate line. -# enchant-meta: " &7 - &e [type] [level]" -# skull-meta: ": &e [player-name]" -# book-meta: "&e [title] [author]" +# enchant-meta: " - [type] [level]" +# skull-meta: ": [player-name]" +# book-meta: "[title] [author]" # # Custom Enchantment Translation. # enchant: # menting: "Mending" @@ -978,36 +978,36 @@ challenges: # challenges: # # Database ID name. # example_challenge_id: -# name: "&2 Translated Name" +# name: "Translated Name" # description: |- -# &7 Translated Custom -# &7 description +# Translated Custom +# description # reward-text: |- -# &7 Translated Reward -# &7 text +# Translated Reward +# text # repeat-reward-text: |- -# &7 Translated Repeat -# &7 Reward text +# Translated Repeat +# Reward text # levels: # # Database ID name. # example_level_id: -# name: "&2 Translated Name" +# name: "Translated Name" # description: |- -# &7 Translated Custom -# &7 description +# Translated Custom +# description # reward-text: |- -# &7 Translated Reward -# &7 text +# Translated Reward +# text protection: flags: CHALLENGES_ISLAND_PROTECTION: - description: '&5&o 切換 任何玩家可以完成挑戰' + description: '切換 任何玩家可以完成挑戰' name: 挑戰保護 CHALLENGES_WORLD_PROTECTION: description: |- - &5&o爲玩家啓用/禁用 - &5&o要求他們在他們的島嶼上 - &5&o才能完成挑戰. + 爲玩家啓用/禁用 + 要求他們在他們的島嶼上 + 才能完成挑戰. name: 挑戰島嶼限制 hint: 請在自己的島嶼完成挑戰! diff --git a/src/main/resources/locales/zh-TW.yml b/src/main/resources/locales/zh-TW.yml index fef40600..8e09aa9e 100644 --- a/src/main/resources/locales/zh-TW.yml +++ b/src/main/resources/locales/zh-TW.yml @@ -44,25 +44,25 @@ challenges: gui: title: admin: - gui-title: '&a島嶼挑戰管理' - edit-challenge-title: '&a編輯挑戰' - edit-level-title: '&a編輯挑戰等級' - settings-title: '&a編輯設定' - choose-challenge-title: '&a選擇挑戰' - choose-level-title: '&a選擇挑戰等級' - choose-user-title: '&a選擇玩家' - manage-blocks: '&a管理方塊' - manage-entities: '&a管理實體' - confirm-title: '&a確認' - manage-items: '&a管理物品' - manage-numbers: '&a數字墊' - select-block: '&a選擇方塊' - select-challenge: '&a選擇挑戰' - select-entity: '&a選擇實體' - toggle-environment: '&a切換環境' - edit-text-fields: '&a編輯文本字段' - challenges: '&a島嶼挑戰' - game-modes: '&a選擇游戲模式' + gui-title: '島嶼挑戰管理' + edit-challenge-title: '編輯挑戰' + edit-level-title: '編輯挑戰等級' + settings-title: '編輯設定' + choose-challenge-title: '選擇挑戰' + choose-level-title: '選擇挑戰等級' + choose-user-title: '選擇玩家' + manage-blocks: '管理方塊' + manage-entities: '管理實體' + confirm-title: '確認' + manage-items: '管理物品' + manage-numbers: '數字墊' + select-block: '選擇方塊' + select-challenge: '選擇挑戰' + select-entity: '選擇實體' + toggle-environment: '切換環境' + edit-text-fields: '編輯文本字段' + challenges: '島嶼挑戰' + game-modes: '選擇游戲模式' buttons: admin: complete: '完成某個玩家的挑戰' @@ -200,20 +200,20 @@ challenges: remove-items: '是否在完成挑戰後删除玩家背包中的挑戰需求物品' required-experience: '玩家需要有該項目所設置的經驗值才可以完成挑戰' remove-experience: '是否在玩家完成挑戰後删除任務需求的經驗值' - required-level: '玩家需要島嶼等級達到該項目所設置的等級才能完成挑戰.|&c需要 Level 組件.' - required-money: '玩家需要有該項目所設置的金錢才能完成挑戰.|&c需要經濟前置.' - remove-money: '是否在玩家完成挑戰後删除任務需求的金錢.|&c需要經濟前置.' + required-level: '玩家需要島嶼等級達到該項目所設置的等級才能完成挑戰.|需要 Level 組件.' + required-money: '玩家需要有該項目所設置的金錢才能完成挑戰.|需要經濟前置.' + remove-money: '是否在玩家完成挑戰後删除任務需求的金錢.|需要經濟前置.' reward-text: '設置完成任務後的獎勵信息' reward-items: '設置完成任務後的物品獎勵.|物品:' reward-experience: '設置完成任務後的經驗獎勵.' - reward-money: '設置完成任務後的金錢獎勵.|&c需要經濟前置.' + reward-money: '設置完成任務後的金錢獎勵.|需要經濟前置.' reward-commands: '設置完成任務後的指令獎勵.|指令:' repeatable: '挑戰是否可以重複' repeat-count: '重複挑戰的次數,如果設置爲0則爲無限制' repeat-reward-text: '重複挑戰完成後的信息' repeat-reward-items: '重複挑戰完成後的物品獎勵.|物品:' repeat-reward-experience: '重複挑戰完成後的經驗獎勵.' - repeat-reward-money: '重複挑戰完成後的金錢獎勵.|&c需要經濟前置.' + repeat-reward-money: '重複挑戰完成後的金錢獎勵.|需要經濟前置.' repeat-reward-commands: '重複挑戰完成後的指令獎勵.||指令:' waiver-amount: '完成該數量的挑戰玩家方能解鎖下一挑戰級別的挑戰' reward-text-level: '完成某挑戰級別所有挑戰後發送給玩家的信息' @@ -239,17 +239,17 @@ challenges: history-lifespan: '允許修改將保存歷史數據的天數| 0表示永久' island-store: '啓用/禁用挑戰每個島的數據存儲。如果啓用此選項,整個島嶼團隊的挑戰進度將是相同的。|不會在點擊時轉換數據。進展將會失敗。' default-locked-icon: '更改默認鎖定級別圖標。|此級別可以覆蓋此選項。' - gui-mode: '啓用/禁用單一挑戰GUI。|&2要求服務器重啓。' - click-to-edit: '&4點擊此處編輯輸入.' - edit-text-line: '&6編輯文本!' - add-text-line: '&6 添加新的文本!' + gui-mode: '啓用/禁用單一挑戰GUI。|要求服務器重啓。' + click-to-edit: '點擊此處編輯輸入.' + edit-text-line: '編輯文本!' + add-text-line: '添加新的文本!' input-mode: '在聊天和鐵砧輸入模式之間切換。' title-enable: '啓用/禁用玩家完成挑戰時顯示的標題消息。' title-showtime: '修改標題消息對玩家可見的時間。' default-import: '導入插件自帶挑戰' default-export: '將現有的挑戰導出至 defaults.json 文件中.' complete-wipe: '清空插件數據庫中的所有挑戰,包括玩家的挑戰數據!' - current-value: '|&6當前值: [value].' + current-value: '|當前值: [value].' enabled: '有效' disabled: '禁用' type: @@ -269,35 +269,35 @@ challenges: level-unlocked: '點擊查看 [level] 級別的挑戰!' level-locked: '請完成 [count] 個 [level] 級別的挑戰來解鎖這個挑戰級別!' challenge-description: - level: '&F挑戰級別: [level]' - completed: '&B已完成' + level: '挑戰級別: [level]' + completed: '已完成' completed-times-of: '完成次數: [donetimes] 上限: [maxtimes]' maxed-reached: '完成次數: [donetimes] 上限: [maxtimes]' completed-times: '已完成 [donetimes]' - warning-items-take: '&c完成此挑戰後,該挑戰的需要物品將會被清空' - objects-close-by: '&c任務需求的方塊/生物不能離你太遠!(超出偵測範圍)' - warning-entities-kill: '&c完成此挑戰後,該挑戰需要的生物將會被清空' - warning-blocks-remove: '&c完成此挑戰後,該挑戰需要的方塊將會被清空' - not-repeatable: '&c該挑戰不可重複!' - experience-reward: '&6經驗獎勵: [value]' - money-reward: '&6金錢獎勵: $[value]' - required-experience: '&6所需經驗: [value]' - required-money: '&6所需金錢: $[value]' - required-island-level: '&6所需島嶼等級: [value]' + warning-items-take: '完成此挑戰後,該挑戰的需要物品將會被清空' + objects-close-by: '任務需求的方塊/生物不能離你太遠!(超出偵測範圍)' + warning-entities-kill: '完成此挑戰後,該挑戰需要的生物將會被清空' + warning-blocks-remove: '完成此挑戰後,該挑戰需要的方塊將會被清空' + not-repeatable: '該挑戰不可重複!' + experience-reward: '經驗獎勵: [value]' + money-reward: '金錢獎勵: $[value]' + required-experience: '所需經驗: [value]' + required-money: '所需金錢: $[value]' + required-island-level: '所需島嶼等級: [value]' environment: '所需實體:' - reward-items: '&6物品獎勵:' - reward-commands: '&6指令獎勵:' + reward-items: '物品獎勵:' + reward-commands: '指令獎勵:' required-items: '所需物品:' required-entities: '所需實體:' required-blocks: '所需方塊:' level-description: - completed: '&B已完成' + completed: '已完成' completed-challenges-of: '&你已經完成 [number] 個該級別的挑戰,達到了 [max]個挑戰.' - waver-amount: '&6可以跳過[value] 個挑戰來解鎖下一個挑戰級別.' - experience-reward: '&6經驗獎勵: [value]' - money-reward: '&6金錢獎勵: $[value]' - reward-items: '&6物品獎勵:' - reward-commands: '&6指令獎勵:' + waver-amount: '可以跳過[value] 個挑戰來解鎖下一個挑戰級別.' + experience-reward: '經驗獎勵: [value]' + money-reward: '金錢獎勵: $[value]' + reward-items: '物品獎勵:' + reward-commands: '指令獎勵:' item-description: item: '- [count] x [item]' item-meta: ' ([meta])' @@ -318,7 +318,7 @@ challenges: fish-meta: ' [body-color] with [pattern-color] [pattern]' questions: - prefix: "&2[SERVER]: " + prefix: "[SERVER]: " admin: number: "Write a number in chat and press enter to accept it and press enter." @@ -341,16 +341,16 @@ challenges: admin: hit-things: '點擊物品將它們添加到所需的事物列表中。 完成後右鍵單擊。' you-added: '你在挑戰中添加了一個[thing]' - challenge-created: '[challenge]&r created!' - complete-wipe: '&c希望你有備份,因爲你已經創建了所有Challenges Addon數據庫!' - completed: '&2已爲[player]完成挑戰[name]!' - already-completed: '&2這個挑戰已經完成' - you-completed-challenge: '&2你已經完成了 [value] &r&2挑戰!' - you-repeated-challenge: '&2你已經重複完成了 [value] &r&2挑戰!' - you-repeated-challenge-multiple: '&2你重複完成了 [value] &r&2挑戰 [count] 次!' - you-completed-level: '&2你完成了 [value] &r&2級別!' - name-has-completed-challenge: '&5[name] 已完成 [value] &r&5挑戰!' - name-has-completed-level: '&5[name] 已完成 [value] &r&5挑戰級別!' + challenge-created: '[challenge]created!' + complete-wipe: '希望你有備份,因爲你已經創建了所有Challenges Addon數據庫!' + completed: '已爲[player]完成挑戰[name]!' + already-completed: '這個挑戰已經完成' + you-completed-challenge: '你已經完成了 [value] 挑戰!' + you-repeated-challenge: '你已經重複完成了 [value] 挑戰!' + you-repeated-challenge-multiple: '你重複完成了 [value] 挑戰 [count] 次!' + you-completed-level: '你完成了 [value] 級別!' + name-has-completed-challenge: '[name] 已完成 [value] 挑戰!' + name-has-completed-level: '[name] 已完成 [value] 挑戰級別!' import-levels: '開始導入挑戰級別' import-challenges: '開始導入挑戰' no-levels: '警告: challenges.yml文件中沒有定義挑戰級別' @@ -361,44 +361,44 @@ challenges: defaults-file-overwrite: 'defaults.json存在。 它將被覆蓋。' defaults-file-completed: 'defaults.json文件填充了來自[world]的挑戰!' errors: - no-name: '&c缺少挑戰名稱' - unknown-challenge: '&c未知挑戰' - unique-id: '&cUniqueID "[id]" 無效.' - wrong-icon: '&c給定材料“[value]”無效且不能用作圖標。' - not-valid-integer: '&c給定整數“[value]”無效!|值應介于[min]和[max]之間。' - not-a-integer: '&c給定值“[value]”不是整數!' - not-deployed: '&c未開啓挑戰!' - not-on-island: '&c你必須在你的島上做到這一點!' - challenge-level-not-available: '&c你沒有解鎖挑戰級別來完成這個挑戰。' - not-repeatable: '&c這個挑戰是不可重複的!' - wrong-environment: '&c你在錯誤的環境中!' - not-enough-items: '&c你沒有足够的[items]來完成這個挑戰!' - not-close-enough: '&c你必須站在擁有[number]個任務需求方塊的旁邊.' - you-still-need: '&c你還需要 [amount] x [item]' - missing-addon: '&c無法完成挑戰。 缺少必需的插件或組件。' - incorrect: '&c無法完成挑戰。 要求不正確。' - not-enough-money: '&c您的帳戶必須有[value]金錢才能完成挑戰。.' - not-enough-experience: '&c必須有[value]EXP才能完成挑戰' - island-level: '&c你的島嶼等級需要達到[number]才能完成挑戰' - import-no-file: '&c找不到challenge.yml文件導入!' - no-load: '&c錯誤:無法加載challenge.yml。 [message]' - load-error: '&c錯誤:無法加載 [value].' - no-rank: "&c你沒有等級可以做到這一點." - cannot-remove-items: '&c有些物品無法從你的背包中删除!' - exist-challenges-or-levels: '&c在你的世界裏已經存在挑戰。 無法繼續!' - defaults-file-exist: '&cdefaults.json已經存在。 使用覆蓋模式替換它!' - defaults-file-error: '&c創建defaults.json文件時出錯! 檢查控制台!' - no-challenges: '&c當前世界沒有實施挑戰!' - no-challenges-admin: '&c當前世界沒有實施挑戰!你應該使用 &5/[label] challenges &c添加他們!' - missing-level: '&c挑戰級別[level]未在數據庫中定義. 可能會出現錯誤!' - missing-arguments: '&c命令缺少參數.' + no-name: '缺少挑戰名稱' + unknown-challenge: '未知挑戰' + unique-id: 'UniqueID "[id]" 無效.' + wrong-icon: '給定材料“[value]”無效且不能用作圖標。' + not-valid-integer: '給定整數“[value]”無效!|值應介于[min]和[max]之間。' + not-a-integer: '給定值“[value]”不是整數!' + not-deployed: '未開啓挑戰!' + not-on-island: '你必須在你的島上做到這一點!' + challenge-level-not-available: '你沒有解鎖挑戰級別來完成這個挑戰。' + not-repeatable: '這個挑戰是不可重複的!' + wrong-environment: '你在錯誤的環境中!' + not-enough-items: '你沒有足够的[items]來完成這個挑戰!' + not-close-enough: '你必須站在擁有[number]個任務需求方塊的旁邊.' + you-still-need: '你還需要 [amount] x [item]' + missing-addon: '無法完成挑戰。 缺少必需的插件或組件。' + incorrect: '無法完成挑戰。 要求不正確。' + not-enough-money: '您的帳戶必須有[value]金錢才能完成挑戰。.' + not-enough-experience: '必須有[value]EXP才能完成挑戰' + island-level: '你的島嶼等級需要達到[number]才能完成挑戰' + import-no-file: '找不到challenge.yml文件導入!' + no-load: '錯誤:無法加載challenge.yml。 [message]' + load-error: '錯誤:無法加載 [value].' + no-rank: "你沒有等級可以做到這一點." + cannot-remove-items: '有些物品無法從你的背包中删除!' + exist-challenges-or-levels: '在你的世界裏已經存在挑戰。 無法繼續!' + defaults-file-exist: 'defaults.json已經存在。 使用覆蓋模式替換它!' + defaults-file-error: '創建defaults.json文件時出錯! 檢查控制台!' + no-challenges: '當前世界沒有實施挑戰!' + no-challenges-admin: '當前世界沒有實施挑戰!你應該使用 /[label] challenges 添加他們!' + missing-level: '挑戰級別[level]未在數據庫中定義. 可能會出現錯誤!' + missing-arguments: '命令缺少參數.' protection: flags: CHALLENGES_ISLAND_PROTECTION: - description: "&5&o切換誰可以\n&5&o挖槽挑戰" + description: "切換誰可以\n挖槽挑戰" name: "挑戰保護" CHALLENGES_WORLD_PROTECTION: - description: "&5&o爲玩家啓用/禁用\n&5&o要求他們在他們的島嶼上\n&5&o才能完成挑戰." + description: "爲玩家啓用/禁用\n要求他們在他們的島嶼上\n才能完成挑戰." name: "挑戰島嶼限制" hint: "請在自己的島嶼完成挑戰!" version: 11 diff --git a/src/test/java/world/bentobox/challenges/AbstractChallengesTest.java b/src/test/java/world/bentobox/challenges/AbstractChallengesTest.java new file mode 100644 index 00000000..dcd7d011 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/AbstractChallengesTest.java @@ -0,0 +1,240 @@ +package world.bentobox.challenges; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.World.Environment; +import org.bukkit.entity.Player; +import org.bukkit.entity.Player.Spigot; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.util.BoundingBox; +import org.eclipse.jdt.annotation.Nullable; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.AddonDescription; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.configuration.WorldSettings; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.managers.AddonsManager; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.IslandsManager; +import world.bentobox.bentobox.managers.LocalesManager; +import world.bentobox.bentobox.managers.PlaceholdersManager; +import world.bentobox.bentobox.util.Util; +import world.bentobox.challenges.config.Settings; +import world.bentobox.challenges.managers.ChallengesManager; + +/** + * Abstract base class for Challenges addon tests. + * Provides common BentoBox/MockBukkit/Mockito setup and teardown. + */ +public abstract class AbstractChallengesTest { + + // Constants + protected static final String GAME_MODE_NAME = "BSkyBlock"; + + // Core BentoBox + @Mock + protected BentoBox plugin; + @Mock + protected ChallengesAddon addon; + @Mock + protected User user; + @Mock + protected World world; + @Mock + protected Player player; + @Mock + protected Island island; + + // Managers + @Mock + protected ChallengesManager cm; + @Mock + protected IslandsManager im; + @Mock + protected IslandWorldManager iwm; + @Mock + protected AddonsManager am; + @Mock + protected GameModeAddon gameMode; + @Mock + protected Settings settings; + @Mock + protected WorldSettings mySettings; + + // Player peripherals + @Mock + protected @Nullable PlayerInventory inv; + @Mock + protected BoundingBox bb; + @Mock + protected Spigot spigot; + + // Infrastructure + protected ServerMock mbServer; + protected AutoCloseable closeable; + protected MockedStatic mockedBukkit; + protected MockedStatic mockedUtil; + + // Shared state + protected UUID playerUUID; + + @BeforeEach + public void setUp() { + closeable = MockitoAnnotations.openMocks(this); + mbServer = MockBukkit.mock(); + // Force tag registry initialization + @SuppressWarnings("unused") + var unusedTagRef = org.bukkit.Tag.LEAVES; + + // BentoBox singleton + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); + when(addon.getPlugin()).thenReturn(plugin); + + // World + when(user.getWorld()).thenReturn(world); + when(world.getName()).thenReturn("world"); + when(world.getEnvironment()).thenReturn(Environment.NORMAL); + + // Addons manager — one game mode + when(plugin.getAddonsManager()).thenReturn(am); + when(am.getGameModeAddons()).thenReturn(Collections.singletonList(gameMode)); + AddonDescription desc = new AddonDescription.Builder("bentobox", GAME_MODE_NAME, "1.3") + .description("test").authors("tasty").build(); + when(gameMode.getDescription()).thenReturn(desc); + + // Util static mock + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(world); + mockedUtil.when(() -> Util.prettifyText(anyString())).thenCallRealMethod(); + mockedUtil.when(() -> Util.stripSpaceAfterColorCodes(anyString())).thenCallRealMethod(); + mockedUtil.when(() -> Util.translateColorCodes(anyString())) + .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); + + // Island World Manager + when(plugin.getIWM()).thenReturn(iwm); + when(iwm.getAddon(any())).thenReturn(Optional.of(gameMode)); + when(iwm.getIslandDistance(any())).thenReturn(400); + when(iwm.inWorld(any(World.class))).thenReturn(true); + when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); + + // Island Manager + when(addon.getIslands()).thenReturn(im); + when(im.getIslandAt(any())).thenReturn(Optional.of(island)); + when(im.getIsland(any(), any(User.class))).thenReturn(island); + when(im.locationIsOnIsland(any(), any())).thenReturn(true); + // Island flags — everything allowed by default + when(island.isAllowed(any(), any())).thenReturn(true); + @Nullable + Location islandCenter = mock(Location.class); + when(islandCenter.toString()).thenReturn("center"); + when(island.getCenter()).thenReturn(islandCenter); + + // Challenges Manager + when(addon.getChallengesManager()).thenReturn(cm); + when(cm.isLevelUnlocked(any(), any(), any())).thenReturn(true); + when(cm.getChallengeTimes(any(), any(), any(world.bentobox.challenges.database.object.Challenge.class))) + .thenReturn(3L); + + // User + Player + playerUUID = UUID.randomUUID(); + when(user.hasPermission(anyString())).thenReturn(true); + when(user.getPlayer()).thenReturn(player); + when(player.getUniqueId()).thenReturn(playerUUID); + when(player.getWorld()).thenReturn(world); + when(player.spigot()).thenReturn(spigot); + when(user.getUniqueId()).thenReturn(playerUUID); + when(user.getTranslation(anyString())) + .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); + when(user.getTranslation(anyString(), anyString())) + .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); + when(user.getTranslationOrNothing(anyString())) + .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); + when(user.getName()).thenReturn("tastybento"); + User.getInstance(player); + @Nullable + Location userLoc = mock(Location.class); + when(userLoc.toString()).thenReturn("location"); + when(user.getLocation()).thenReturn(userLoc); + + // Inventory + when(user.getInventory()).thenReturn(inv); + when(inv.getContents()).thenReturn(new org.bukkit.inventory.ItemStack[0]); + + // BoundingBox + when(player.getBoundingBox()).thenReturn(bb); + when(bb.clone()).thenReturn(bb); + when(bb.toString()).thenReturn("BoundingBox"); + + // Locales + User.setPlugin(plugin); + LocalesManager lm = mock(LocalesManager.class); + when(plugin.getLocalesManager()).thenReturn(lm); + when(lm.get(any(), any())) + .thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); + PlaceholdersManager phm = mock(PlaceholdersManager.class); + when(plugin.getPlaceholdersManager()).thenReturn(phm); + when(phm.replacePlaceholders(any(), any())) + .thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); + + // Player defaults + when(player.getGameMode()).thenReturn(GameMode.SURVIVAL); + + // Addon settings + when(addon.getChallengesSettings()).thenReturn(settings); + when(settings.isBroadcastMessages()).thenReturn(true); + when(settings.isShowCompletionTitle()).thenReturn(false); + + // Bukkit static mock + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getOnlinePlayers) + .then((Answer>) invocation -> Set.of(player)); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + + // World settings + flag + Map worldFlags = new HashMap<>(); + when(mySettings.getWorldFlags()).thenReturn(worldFlags); + when(iwm.getWorldSettings(any())).thenReturn(mySettings); + ChallengesAddon.CHALLENGES_WORLD_PROTECTION.setSetting(world, true); + } + + @AfterEach + public void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (mockedUtil != null) mockedUtil.closeOnDemand(); + try { + if (closeable != null) closeable.close(); + } catch (Exception e) { + throw new IOException(e); + } + MockBukkit.unmock(); + User.clearUsers(); + Mockito.framework().clearInlineMocks(); + } +} diff --git a/src/test/java/world/bentobox/challenges/ChallengesAddonTest.java b/src/test/java/world/bentobox/challenges/ChallengesAddonTest.java index 2fc13f2f..1e2bd48d 100644 --- a/src/test/java/world/bentobox/challenges/ChallengesAddonTest.java +++ b/src/test/java/world/bentobox/challenges/ChallengesAddonTest.java @@ -1,10 +1,10 @@ package world.bentobox.challenges; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -39,17 +39,14 @@ import org.bukkit.plugin.PluginManager; import org.bukkit.scheduler.BukkitScheduler; import org.eclipse.jdt.annotation.NonNull; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.Settings; @@ -58,7 +55,6 @@ import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.commands.CompositeCommand; -import world.bentobox.bentobox.api.configuration.Config; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType; import world.bentobox.bentobox.database.objects.Island; @@ -74,8 +70,6 @@ * */ @SuppressWarnings("deprecation") -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, User.class, Config.class }) public class ChallengesAddonTest { @Mock @@ -101,15 +95,15 @@ public class ChallengesAddonTest { @Mock private PlaceholdersManager phm; - /** - * @throws java.lang.Exception - */ - @Before + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach public void setUp() throws Exception { + closeable = MockitoAnnotations.openMocks(this); // Set up plugin - Whitebox.setInternalState(BentoBox.class, "instance", plugin); + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); when(plugin.getLogger()).thenReturn(Logger.getAnonymousLogger()); - //when(plugin.isEnabled()).thenReturn(true); // Command manager CommandsManager cm = mock(CommandsManager.class); when(plugin.getCommandsManager()).thenReturn(cm); @@ -119,7 +113,6 @@ public void setUp() throws Exception { // Player Player p = mock(Player.class); - // Sometimes use Mockito.withSettings().verboseLogging() when(user.isOp()).thenReturn(false); UUID uuid = UUID.randomUUID(); when(user.getUniqueId()).thenReturn(uuid); @@ -131,22 +124,20 @@ public void setUp() throws Exception { IslandWorldManager iwm = mock(IslandWorldManager.class); when(plugin.getIWM()).thenReturn(iwm); - // Player has island to begin with island = mock(Island.class); when(im.getIsland(Mockito.any(), Mockito.any(UUID.class))).thenReturn(island); when(plugin.getIslands()).thenReturn(im); // Locales - // Return the reference (USE THIS IN THE FUTURE) when(user.getTranslation(Mockito.anyString())).thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); // Server - PowerMockito.mockStatic(Bukkit.class); + mockedBukkit = Mockito.mockStatic(Bukkit.class); Server server = mock(Server.class); - when(Bukkit.getServer()).thenReturn(server); - when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); - when(Bukkit.getPluginManager()).thenReturn(mock(PluginManager.class)); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + mockedBukkit.when(Bukkit::getLogger).thenReturn(Logger.getAnonymousLogger()); + mockedBukkit.when(Bukkit::getPluginManager).thenReturn(mock(PluginManager.class)); // Addon addon = new ChallengesAddon(); @@ -179,51 +170,44 @@ public void setUp() throws Exception { @NonNull Optional opCmd = Optional.of(cmd); when(gameMode.getPlayerCommand()).thenReturn(opCmd); - // Admin command when(gameMode.getAdminCommand()).thenReturn(opCmd); // Flags manager when(plugin.getFlagsManager()).thenReturn(fm); when(fm.getFlags()).thenReturn(Collections.emptyList()); - // The database type has to be created one line before the thenReturn() to work! when(plugin.getSettings()).thenReturn(settings); DatabaseType value = DatabaseType.JSON; when(settings.getDatabaseType()).thenReturn(value); // Bukkit - PowerMockito.mockStatic(Bukkit.class); - when(Bukkit.getScheduler()).thenReturn(scheduler); + mockedBukkit.when(Bukkit::getScheduler).thenReturn(scheduler); ItemMeta meta = mock(ItemMeta.class); ItemFactory itemFactory = mock(ItemFactory.class); when(itemFactory.getItemMeta(any())).thenReturn(meta); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(itemFactory); UnsafeValues unsafe = mock(UnsafeValues.class); when(unsafe.getDataVersion()).thenReturn(777); - when(Bukkit.getUnsafe()).thenReturn(unsafe); - - + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(unsafe); } private void addToJar(JarOutputStream tempJarOutputStream, Path path) throws IOException { - //Added the new files to the jar. try (FileInputStream fis = new FileInputStream(path.toFile())) { - byte[] buffer = new byte[1024]; int bytesRead = 0; JarEntry entry = new JarEntry(path.toString().replace("src/main/resources/", "")); tempJarOutputStream.putNextEntry(entry); - while((bytesRead = fis.read(buffer)) != -1) { + while ((bytesRead = fis.read(buffer)) != -1) { tempJarOutputStream.write(buffer, 0, bytesRead); } } } - /** - * @throws java.lang.Exception - */ - @After + @AfterEach public void tearDown() throws Exception { + mockedBukkit.closeOnDemand(); + closeable.close(); + Mockito.framework().clearInlineMocks(); new File("addon.jar").delete(); new File("config.yml").delete(); deleteAll(new File("addons")); @@ -238,23 +222,15 @@ private void deleteAll(File file) throws IOException { .map(Path::toFile) .forEach(File::delete); } - } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onLoad()}. - */ @Test public void testOnLoad() { addon.onLoad(); - // Check that config.yml file has been saved - File check = new File("addons/Challenges","config.yml"); + File check = new File("addons/Challenges", "config.yml"); assertTrue(check.exists()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onEnable()}. - */ @Test public void testOnEnableDisabledPlugin() { when(plugin.isEnabled()).thenReturn(false); @@ -263,9 +239,6 @@ public void testOnEnableDisabledPlugin() { assertEquals(Addon.State.DISABLED, addon.getState()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onEnable()}. - */ @Test public void testOnEnableDisabledAddon() { when(plugin.isEnabled()).thenReturn(true); @@ -274,12 +247,8 @@ public void testOnEnableDisabledAddon() { verify(plugin).logError("[challenges] Challenges Addon is not available or disabled!"); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onEnable()}. - */ @Test public void testOnEnableIncompatibleDatabase() { - // The database type has to be created one line before the thenReturn() to work! DatabaseType value = DatabaseType.YAML; when(settings.getDatabaseType()).thenReturn(value); when(plugin.isEnabled()).thenReturn(true); @@ -290,9 +259,6 @@ public void testOnEnableIncompatibleDatabase() { assertEquals(State.INCOMPATIBLE, addon.getState()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onEnable()}. - */ @Test public void testOnEnableHooked() { addon.onLoad(); @@ -301,12 +267,8 @@ public void testOnEnableHooked() { addon.onEnable(); verify(plugin).log("[challenges] Loading challenges..."); verify(plugin, never()).logError("Challenges could not hook into AcidIsland or BSkyBlock so will not do anything!"); - } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onEnable()}. - */ @Test public void testOnEnableNotHooked() { addon.onLoad(); @@ -316,37 +278,25 @@ public void testOnEnableNotHooked() { addon.onEnable(); verify(plugin).log("[challenges] Loading challenges..."); verify(plugin).logError("[challenges] Challenges could not hook into AcidIsland or BSkyBlock so will not do anything!"); - } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onReload()}. - */ @Test public void testOnReloadNotHooked() { addon.onReload(); verify(plugin, never()).log(anyString()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#onDisable()}. - */ @Test public void testOnDisable() { this.testOnEnableHooked(); addon.onDisable(); - // Verify database saved exists File chDir = new File("database", "Challenge"); assertTrue(chDir.exists()); File lvDir = new File("database", "ChallengeLevel"); assertTrue(lvDir.exists()); - } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getChallengesManager()}. - */ @Test public void testGetChallengesManager() { assertNull(addon.getChallengesManager()); @@ -354,17 +304,11 @@ public void testGetChallengesManager() { assertNotNull(addon.getChallengesManager()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getPermissionPrefix()}. - */ @Test public void testGetPermissionPrefix() { assertEquals("addon.", addon.getPermissionPrefix()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getImportManager()}. - */ @Test public void testGetImportManager() { assertNull(addon.getImportManager()); @@ -372,9 +316,6 @@ public void testGetImportManager() { assertNotNull(addon.getImportManager()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getWebManager()}. - */ @Test public void testGetWebManager() { assertNull(addon.getWebManager()); @@ -382,44 +323,28 @@ public void testGetWebManager() { assertNotNull(addon.getWebManager()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getChallengesSettings()}. - */ @Test public void testGetChallengesSettings() { assertNull(addon.getChallengesSettings()); addon.onLoad(); assertNotNull(addon.getChallengesSettings()); - } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#isEconomyProvided()}. - */ @Test public void testIsEconomyProvided() { assertFalse(addon.isEconomyProvided()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getEconomyProvider()}. - */ @Test public void testGetEconomyProvider() { assertNull(addon.getEconomyProvider()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#isLevelProvided()}. - */ @Test public void testIsLevelProvided() { assertFalse(addon.isLevelProvided()); } - /** - * Test method for {@link world.bentobox.challenges.ChallengesAddon#getLevelAddon()}. - */ @Test public void testGetLevelAddon() { assertNull(addon.getLevelAddon()); diff --git a/src/test/java/world/bentobox/challenges/ChallengesManagerTest.java b/src/test/java/world/bentobox/challenges/ChallengesManagerTest.java index c690e348..fe4a7ed6 100644 --- a/src/test/java/world/bentobox/challenges/ChallengesManagerTest.java +++ b/src/test/java/world/bentobox/challenges/ChallengesManagerTest.java @@ -1,10 +1,10 @@ package world.bentobox.challenges; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; @@ -27,32 +27,39 @@ import java.util.Optional; import java.util.UUID; +import com.google.common.collect.ImmutableSet; + import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.Server; +import org.bukkit.Statistic; import org.bukkit.UnsafeValues; import org.bukkit.World; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFactory; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.plugin.PluginManager; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; import org.mockito.Mock; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.DatabaseSetup.DatabaseType; +import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.managers.PlaceholdersManager; import world.bentobox.bentobox.util.Util; import world.bentobox.challenges.config.Settings; @@ -72,8 +79,6 @@ * */ @SuppressWarnings("deprecation") -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class, BentoBox.class, Util.class}) public class ChallengesManagerTest { // Constants @@ -110,14 +115,25 @@ public class ChallengesManagerTest { private String cName; private String levelName; - /** - * @throws java.lang.Exception - */ - @Before + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + private MockedStatic mockedUtil; + + @BeforeEach public void setUp() throws Exception { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + @SuppressWarnings("unused") + var unusedTagRef = org.bukkit.Tag.LEAVES; + // Database folder must exist before any DatabaseType class init, + // because YamlDatabaseConnector resolves it from BentoBox.getInstance().getDataFolder(). + database = new File("database"); + cleanupFiles(); + // Set up plugin BentoBox plugin = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", plugin); + when(plugin.getDataFolder()).thenReturn(new File(".")); + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); when(addon.getPlugin()).thenReturn(plugin); User.setPlugin(plugin); @@ -128,10 +144,15 @@ public void setUp() throws Exception { // Placeholders when(plugin.getPlaceholdersManager()).thenReturn(plhm); + // Force DatabaseType enum class init now, before any in-progress + // Mockito stubbing — its calls plugin.getDataFolder() (a mock + // invocation), which would otherwise trip UnfinishedStubbingException. + DatabaseType jsonType = DatabaseType.JSON; + // Settings for Database world.bentobox.bentobox.Settings s = mock(world.bentobox.bentobox.Settings.class); when(plugin.getSettings()).thenReturn(s); - when(s.getDatabaseType()).thenReturn(DatabaseType.JSON); + when(s.getDatabaseType()).thenReturn(jsonType); // Addon Settings settings = new Settings(); @@ -140,22 +161,15 @@ public void setUp() throws Exception { settings.setStoreHistory(true); settings.setLifeSpan(10); - // Database - database = new File("database"); - tearDown(); - - // Bukkit - PowerMockito.mockStatic(Bukkit.class); - when(Bukkit.getServer()).thenReturn(server); - when(Bukkit.getPluginManager()).thenReturn(pim); - when(Bukkit.getWorld(anyString())).thenReturn(world); - - ItemMeta meta = mock(ItemMeta.class); - when(itemFactory.getItemMeta(any())).thenReturn(meta); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); + // Bukkit — delegate to MockBukkit's real ItemFactory. + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + mockedBukkit.when(Bukkit::getPluginManager).thenReturn(pim); + mockedBukkit.when(() -> Bukkit.getWorld(anyString())).thenReturn(world); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); UnsafeValues unsafe = mock(UnsafeValues.class); when(unsafe.getDataVersion()).thenReturn(777); - when(Bukkit.getUnsafe()).thenReturn(unsafe); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(unsafe); // Challenge challenge = new Challenge(); @@ -176,8 +190,8 @@ public void setUp() throws Exception { when(user.getUniqueId()).thenReturn(playerID); // Util - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenReturn(world); + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(world); // Addon AddonDescription desc = new AddonDescription.Builder("main", GAME_MODE_NAME, "1.0").build(); @@ -192,11 +206,17 @@ public void setUp() throws Exception { cm = new ChallengesManager(addon); } - /** - * @throws java.lang.Exception - */ - @After + @AfterEach public void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (mockedUtil != null) mockedUtil.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + cleanupFiles(); + } + + private void cleanupFiles() throws IOException { new File("addon.jar").delete(); new File("config.yml").delete(); deleteAll(new File("addons")); @@ -211,13 +231,8 @@ private void deleteAll(File file) throws IOException { .map(Path::toFile) .forEach(File::delete); } - } - /** - * Test method for {@link ChallengesManager#load()}. - * @throws InterruptedException - */ @Test public void testLoad() throws InterruptedException { verify(addon).log("Loading challenges..."); @@ -230,10 +245,6 @@ public void testLoad() throws InterruptedException { assertTrue(cm.containsChallenge(cName)); } - /** - * Test method for {@link ChallengesManager#reload()}. - * @throws InterruptedException - */ @Test public void testReload() throws InterruptedException { cm.reload(); @@ -246,121 +257,71 @@ public void testReload() throws InterruptedException { assertTrue(cm.containsChallenge(cName)); } - /** - * Test method for {@link ChallengesManager#loadChallenge(world.bentobox.challenges.database.object.Challenge, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadChallengeNoOverwriteSilent() { - // load once assertTrue(cm.loadChallenge(challenge, world, false, user, true)); - // load twice - no overwrite assertFalse(cm.loadChallenge(challenge, world, false, user, true)); } - /** - * Test method for {@link ChallengesManager#loadChallenge(world.bentobox.challenges.database.object.Challenge, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadChallengeNoOverwriteNotSilent() { - // load once assertTrue(cm.loadChallenge(challenge, world, false, user, true)); - // load twice - no overwrite, not silent assertFalse(cm.loadChallenge(challenge, world, false, user, false)); verify(user).getTranslation(world, "challenges.messages.load-skipping", "[value]", "name"); } - /** - * Test method for {@link ChallengesManager#loadChallenge(world.bentobox.challenges.database.object.Challenge, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadChallengeOverwriteSilent() { - // load once assertTrue(cm.loadChallenge(challenge, world, false, user, true)); - // overwrite assertTrue(cm.loadChallenge(challenge, world, true, user, true)); verify(user, never()).getTranslation(any(World.class), anyString(), anyString(), anyString()); } - /** - * Test method for {@link ChallengesManager#loadChallenge(world.bentobox.challenges.database.object.Challenge, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadChallengeOverwriteNotSilent() { - // load once assertTrue(cm.loadChallenge(challenge, world, false, user, true)); - // overwrite not silent assertTrue(cm.loadChallenge(challenge, world, true, user, false)); verify(user).getTranslation(world, "challenges.messages.load-overwriting", "[value]", "name"); } - /** - * Test method for {@link ChallengesManager#loadLevel(world.bentobox.challenges.database.object.ChallengeLevel, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadLevelNoOverwriteSilent() { - // load once assertTrue(cm.loadLevel(level, world, false, user, true)); - // load twice - no overwrite assertFalse(cm.loadLevel(level, world, false, user, true)); } - /** - * Test method for {@link ChallengesManager#loadLevel(world.bentobox.challenges.database.object.ChallengeLevel, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadLevelNoOverwriteNotSilent() { - // load once assertTrue(cm.loadLevel(level, world, false, user, true)); - // load twice - no overwrite, not silent assertFalse(cm.loadLevel(level, world, false, user, false)); verify(user).getTranslation(world, "challenges.messages.load-skipping", "[value]", "Novice"); } - /** - * Test method for {@link ChallengesManager#loadLevel(world.bentobox.challenges.database.object.ChallengeLevel, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadLevelOverwriteSilent() { - // load once assertTrue(cm.loadLevel(level, world, false, user, true)); - // overwrite assertTrue(cm.loadLevel(level, world, true, user, true)); verify(user, never()).getTranslation(any(World.class), anyString(), anyString(), anyString()); } - /** - * Test method for {@link ChallengesManager#loadLevel(world.bentobox.challenges.database.object.ChallengeLevel, World, boolean, world.bentobox.bentobox.api.user.User, boolean)}. - */ @Test public void testLoadLevelOverwriteNotSilent() { - // load once assertTrue(cm.loadLevel(level, world, false, user, true)); - // overwrite not silent assertTrue(cm.loadLevel(level, world, true, user, false)); verify(user).getTranslation(world, "challenges.messages.load-overwriting", "[value]", "Novice"); } - /** - * Test method for {@link ChallengesManager#removeFromCache(java.util.UUID)}. - */ - @Ignore("This method does not do anything so there is no need to test right now.") + @Disabled("This method does not do anything so there is no need to test right now.") @Test public void testRemoveFromCache() { cm.removeFromCache(playerID); verify(settings).isStoreAsIslandData(); - // TODO there should be a test where isStoreAsIslandData returns true } - /** - * Test method for {@link ChallengesManager#wipeDatabase(boolean, String)}. - * @throws InterruptedException - */ @Test public void testWipeDatabase() throws InterruptedException { - // Create some database this.testLoad(); - // Verify file exists File chDir = new File(database, "Challenge"); File check = new File(chDir, cName + ".json"); assertTrue(check.exists()); @@ -370,71 +331,50 @@ public void testWipeDatabase() throws InterruptedException { assertTrue(checkLv.exists()); cm.setChallengeComplete(user, world, challenge, 20); - //cm.save(); File plData = new File(database, "ChallengesPlayerData"); - File checkPd = new File(plData, playerID.toString() + ".json"); + File checkPd = new File(plData, playerID + ".json"); assertTrue(checkPd.exists()); - // Wipe it cm.wipeDatabase(false, ""); - // Verify assertFalse(check.exists()); assertFalse(checkLv.exists()); assertTrue(checkPd.exists()); cm.wipeDatabase(true, ""); - // This fails because ChallengesPlayerData still exists - //assertFalse(checkPd.exists()); } - /** - * Test method for {@link ChallengesManager#wipePlayers(String)}. - * @throws InterruptedException - */ @Test public void testWipePlayers() throws InterruptedException { this.testLoad(); cm.setChallengeComplete(user, world, challenge, 20); cm.save(); File plData = new File(database, "ChallengesPlayerData"); - File checkLv = new File(plData, playerID.toString() + ".json"); + File checkLv = new File(plData, playerID + ".json"); assertTrue(checkLv.exists()); cm.wipePlayers(""); - // This fails because ChallengesPlayerData still exists - //assertFalse(checkLv.exists()); } - /** - * Test method for {@link ChallengesManager#migrateDatabase(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. - */ @Test public void testMigrateDatabase() { cm.migrateDatabase(user, world); + verify(addon, never()).logError(anyString()); } - /** - * Test method for {@link ChallengesManager#save()}. - */ @Test public void testSave() { cm.save(); + verify(addon, never()).logError(anyString()); } - /** - * Test method for {@link ChallengesManager#saveChallenge(world.bentobox.challenges.database.object.Challenge)}. - * @throws InterruptedException - */ @Test public void testSaveChallenge() throws InterruptedException { - // Async - may not happen quickly cm.saveChallenge(challenge); Thread.sleep(500); File chDir = new File(database, "Challenge"); assertTrue(chDir.exists()); File check = new File(chDir, cName + ".json"); assertTrue(check.exists()); - // Remove icon becauseit has mockito meta in it removeLine(check); } @@ -443,15 +383,13 @@ private void removeLine(File inputFile) { try (BufferedReader reader = new BufferedReader(new FileReader(inputFile))) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile))) { - String lineToRemove = "\"icon"; String currentLine; - while((currentLine = reader.readLine()) != null) { - // trim newline when comparing with lineToRemove + while ((currentLine = reader.readLine()) != null) { String trimmedLine = currentLine.trim(); - if(trimmedLine.startsWith(lineToRemove)) continue; - writer.write(currentLine + System.getProperty("line.separator")); + if (trimmedLine.startsWith(lineToRemove)) continue; + writer.write(currentLine + System.lineSeparator()); } } } catch (IOException e) { @@ -460,10 +398,7 @@ private void removeLine(File inputFile) { tempFile.renameTo(inputFile); } - /** - * Test method for {@link ChallengesManager#saveLevel(world.bentobox.challenges.database.object.ChallengeLevel)}. - * @throws InterruptedException - */ + @Test public void testSaveLevel() throws InterruptedException { cm.saveLevel(level); @@ -472,37 +407,24 @@ public void testSaveLevel() throws InterruptedException { assertTrue(chDir.exists()); File check = new File(chDir, GAME_MODE_NAME + "_novice.json"); assertTrue(check.exists()); - // Remove icon becauseit has mockito meta in it removeLine(check); } - /** - * Test method for {@link ChallengesManager#isChallengeComplete(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.Challenge)}. - */ @Test public void testIsChallengeCompleteUserWorldChallenge() { assertFalse(cm.isChallengeComplete(user, world, challenge)); } - /** - * Test method for {@link ChallengesManager#isChallengeComplete(java.util.UUID, org.bukkit.World, world.bentobox.challenges.database.object.Challenge)}. - */ @Test public void testIsChallengeCompleteUUIDWorldChallenge() { assertFalse(cm.isChallengeComplete(playerID, world, challenge)); } - /** - * Test method for {@link ChallengesManager#isChallengeComplete(java.util.UUID, org.bukkit.World, java.lang.String)}. - */ @Test public void testIsChallengeCompleteUUIDWorldString() { assertFalse(cm.isChallengeComplete(playerID, world, "Novice")); } - /** - * Test method for {@link ChallengesManager#setChallengeComplete(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.Challenge, int)}. - */ @Test public void testSetChallengeCompleteUserWorldChallengeInt() { cm.setChallengeComplete(user, world, challenge, 3); @@ -510,9 +432,6 @@ public void testSetChallengeCompleteUserWorldChallengeInt() { verify(pim).callEvent(any(ChallengeCompletedEvent.class)); } - /** - * Test method for {@link ChallengesManager#setChallengeComplete(java.util.UUID, org.bukkit.World, world.bentobox.challenges.database.object.Challenge, int)}. - */ @Test public void testSetChallengeCompleteUUIDWorldChallengeInt() { cm.setChallengeComplete(playerID, world, challenge, 3); @@ -520,9 +439,6 @@ public void testSetChallengeCompleteUUIDWorldChallengeInt() { verify(pim).callEvent(any(ChallengeCompletedEvent.class)); } - /** - * Test method for {@link ChallengesManager#setChallengeComplete(java.util.UUID, org.bukkit.World, world.bentobox.challenges.database.object.Challenge, java.util.UUID)}. - */ @Test public void testSetChallengeCompleteUUIDWorldChallengeUUID() { UUID adminID = UUID.randomUUID(); @@ -531,9 +447,6 @@ public void testSetChallengeCompleteUUIDWorldChallengeUUID() { verify(pim).callEvent(any(ChallengeCompletedEvent.class)); } - /** - * Test method for {@link ChallengesManager#resetChallenge(java.util.UUID, org.bukkit.World, world.bentobox.challenges.database.object.Challenge, java.util.UUID)}. - */ @Test public void testResetChallenge() { cm.setChallengeComplete(user, world, challenge, 3); @@ -543,9 +456,6 @@ public void testResetChallenge() { verify(pim).callEvent(any(ChallengeResetEvent.class)); } - /** - * Test method for {@link ChallengesManager#resetAllChallenges(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. - */ @Test public void testResetAllChallengesUserWorld() { cm.setChallengeComplete(user, world, challenge, 3); @@ -555,9 +465,6 @@ public void testResetAllChallengesUserWorld() { verify(pim).callEvent(any(ChallengeResetAllEvent.class)); } - /** - * Test method for {@link ChallengesManager#resetAllChallenges(java.util.UUID, org.bukkit.World, java.util.UUID)}. - */ @Test public void testResetAllChallengesUUIDWorldUUID() { cm.setChallengeComplete(user, world, challenge, 3); @@ -567,9 +474,6 @@ public void testResetAllChallengesUUIDWorldUUID() { verify(pim).callEvent(any(ChallengeResetAllEvent.class)); } - /** - * Test method for {@link ChallengesManager#getChallengeTimes(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.Challenge)}. - */ @Test public void testGetChallengeTimesUserWorldChallenge() { assertEquals(0L, cm.getChallengeTimes(user, world, challenge)); @@ -577,9 +481,6 @@ public void testGetChallengeTimesUserWorldChallenge() { assertEquals(6L, cm.getChallengeTimes(user, world, challenge)); } - /** - * Test method for {@link ChallengesManager#getChallengeTimes(world.bentobox.bentobox.api.user.User, org.bukkit.World, java.lang.String)}. - */ @Test public void testGetChallengeTimesUserWorldString() { assertEquals(0L, cm.getChallengeTimes(user, world, cName)); @@ -587,17 +488,11 @@ public void testGetChallengeTimesUserWorldString() { assertEquals(6L, cm.getChallengeTimes(user, world, cName)); } - /** - * Test method for {@link ChallengesManager#isLevelCompleted(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.ChallengeLevel)}. - */ @Test public void testIsLevelCompleted() { assertFalse(cm.isLevelCompleted(user, world, level)); } - /** - * Test method for {@link ChallengesManager#isLevelUnlocked(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.ChallengeLevel)}. - */ @Test public void testIsLevelUnlocked() { assertFalse(cm.isLevelUnlocked(user, world, level)); @@ -605,9 +500,6 @@ public void testIsLevelUnlocked() { assertTrue(cm.isLevelUnlocked(user, world, level)); } - /** - * Test method for {@link ChallengesManager#setLevelComplete(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.ChallengeLevel)}. - */ @Test public void testSetLevelComplete() { assertFalse(cm.isLevelCompleted(user, world, level)); @@ -616,48 +508,35 @@ public void testSetLevelComplete() { verify(pim).callEvent(any(LevelCompletedEvent.class)); } - /** - * Test method for {@link ChallengesManager#validateLevelCompletion(world.bentobox.bentobox.api.user.User, org.bukkit.World, world.bentobox.challenges.database.object.ChallengeLevel)}. - */ @Test public void testValidateLevelCompletion() { assertTrue(cm.validateLevelCompletion(user, world, level)); } - /** - * Test method for {@link ChallengesManager#getChallengeLevelStatus(java.util.UUID, org.bukkit.World, world.bentobox.challenges.database.object.ChallengeLevel)}. - */ @Test public void testGetChallengeLevelStatus() { this.testLoadLevelNoOverwriteSilent(); LevelStatus cls = cm.getChallengeLevelStatus(playerID, world, level); - assertTrue(cls.getNumberOfChallengesStillToDo() == 0); + assertEquals(0, cls.getNumberOfChallengesStillToDo()); assertEquals(level, cls.getLevel()); assertTrue(cls.isComplete()); assertTrue(cls.isUnlocked()); assertEquals("BSkyBlock_novice", cls.getLevel().getUniqueId()); - } - /** - * Test method for {@link ChallengesManager#getAllChallengeLevelStatus(world.bentobox.bentobox.api.user.User, org.bukkit.World)}. - */ @Test public void testGetAllChallengeLevelStatus() { this.testLoadLevelNoOverwriteSilent(); List list = cm.getAllChallengeLevelStatus(user, world); - assertTrue(list.size() == 1); - LevelStatus cls = list.get(0); - assertTrue(cls.getNumberOfChallengesStillToDo() == 0); + assertEquals(1, list.size()); + LevelStatus cls = list.getFirst(); + assertEquals(0, cls.getNumberOfChallengesStillToDo()); assertEquals(level, cls.getLevel()); assertTrue(cls.isComplete()); assertTrue(cls.isUnlocked()); assertEquals("BSkyBlock_novice", cls.getLevel().getUniqueId()); } - /** - * Test method for {@link ChallengesManager#getAllChallengesNames(org.bukkit.World)}. - */ @Test public void testGetAllChallengesNames() { assertTrue(cm.getAllChallengesNames(world).isEmpty()); @@ -665,12 +544,9 @@ public void testGetAllChallengesNames() { cm.loadChallenge(challenge, world, false, user, true); List list = cm.getAllChallengesNames(world); assertFalse(list.isEmpty()); - assertEquals(cName, list.get(0)); + assertEquals(cName, list.getFirst()); } - /** - * Test method for {@link ChallengesManager#getAllChallenges(org.bukkit.World)}. - */ @Test public void testGetAllChallenges() { assertTrue(cm.getAllChallenges(world).isEmpty()); @@ -678,50 +554,34 @@ public void testGetAllChallenges() { cm.loadChallenge(challenge, world, false, user, true); List list = cm.getAllChallenges(world); assertFalse(list.isEmpty()); - assertEquals(challenge, list.get(0)); + assertEquals(challenge, list.getFirst()); } - /** - * Test method for {@link ChallengesManager#getFreeChallenges(org.bukkit.World)}. - */ @Test public void testGetFreeChallenges() { - // Empty assertTrue(cm.getFreeChallenges(world).isEmpty()); - // One normal cm.saveChallenge(challenge); cm.loadChallenge(challenge, world, false, user, true); assertTrue(cm.getFreeChallenges(world).isEmpty()); - // One free challenge.setLevel(""); cm.saveChallenge(challenge); cm.loadChallenge(challenge, world, false, user, true); List list = cm.getFreeChallenges(world); assertFalse(list.isEmpty()); - assertEquals(challenge, list.get(0)); + assertEquals(challenge, list.getFirst()); } - /** - * Test method for {@link ChallengesManager#getLevelChallenges(world.bentobox.challenges.database.object.ChallengeLevel)}. - * @throws InterruptedException - */ @Test public void testGetLevelChallenges() throws InterruptedException { assertTrue(cm.getLevelChallenges(level).isEmpty()); - // make some challenges this.testSaveLevel(); this.testSaveChallenge(); level.setChallenges(Collections.singleton(challenge.getUniqueId())); - // Test again List list = cm.getLevelChallenges(level); assertFalse(list.isEmpty()); - assertEquals(challenge, list.get(0)); + assertEquals(challenge, list.getFirst()); } - /** - * Test method for {@link ChallengesManager#getChallenge(java.lang.String)}. - * @throws InterruptedException - */ @Test public void testGetChallenge() throws InterruptedException { assertNull(cm.getChallenge(cName)); @@ -732,17 +592,11 @@ public void testGetChallenge() throws InterruptedException { assertEquals(cName, ch.getUniqueId()); } - /** - * Test method for {@link ChallengesManager#containsChallenge(java.lang.String)}. - */ @Test public void testContainsChallenge() { assertFalse(cm.containsChallenge("no-such-challenge")); } - /** - * Test method for {@link ChallengesManager#createChallenge(java.lang.String, java.lang.String, world.bentobox.challenges.database.object.Challenge.ChallengeType, world.bentobox.challenges.database.object.requirements.Requirements)}. - */ @Test public void testCreateChallenge() { @Nullable @@ -751,10 +605,6 @@ public void testCreateChallenge() { assertEquals("newChal", ch.getUniqueId()); } - /** - * Test method for {@link ChallengesManager#deleteChallenge(world.bentobox.challenges.database.object.Challenge)}. - * @throws InterruptedException - */ @Test public void testDeleteChallenge() throws InterruptedException { this.testSaveLevel(); @@ -767,29 +617,20 @@ public void testDeleteChallenge() throws InterruptedException { assertNull(ch); } - /** - * Test method for {@link ChallengesManager#getLevels(org.bukkit.World)}. - */ @Test public void testGetLevels() { this.testGetLevelString(); List lvs = cm.getLevels(world); assertFalse(lvs.isEmpty()); - assertEquals(level, lvs.get(0)); + assertEquals(level, lvs.getFirst()); } - /** - * Test method for {@link ChallengesManager#getLevel(world.bentobox.challenges.database.object.Challenge)}. - */ @Test public void testGetLevelChallenge() { this.testGetLevelString(); assertEquals(level, cm.getLevel(challenge)); } - /** - * Test method for {@link ChallengesManager#getLevel(java.lang.String)}. - */ @Test public void testGetLevelString() { assertNull(cm.getLevel("dss")); @@ -798,9 +639,6 @@ public void testGetLevelString() { assertEquals(level, cm.getLevel(levelName)); } - /** - * Test method for {@link ChallengesManager#containsLevel(java.lang.String)}. - */ @Test public void testContainsLevel() { this.testGetLevelString(); @@ -808,10 +646,6 @@ public void testContainsLevel() { assertTrue(cm.containsLevel(levelName)); } - /** - * Test method for {@link ChallengesManager#addChallengeToLevel(world.bentobox.challenges.database.object.Challenge, world.bentobox.challenges.database.object.ChallengeLevel)}. - * @throws InterruptedException - */ @Test public void testAddChallengeToLevel() throws InterruptedException { this.testLoad(); @@ -821,10 +655,6 @@ public void testAddChallengeToLevel() throws InterruptedException { assertEquals(level, cm.getLevel(challenge)); } - /** - * Test method for {@link ChallengesManager#removeChallengeFromLevel(world.bentobox.challenges.database.object.Challenge, world.bentobox.challenges.database.object.ChallengeLevel)}. - * @throws InterruptedException - */ @Test public void testRemoveChallengeFromLevel() throws InterruptedException { this.testAddChallengeToLevel(); @@ -832,9 +662,6 @@ public void testRemoveChallengeFromLevel() throws InterruptedException { assertFalse(cm.containsChallenge(cName)); } - /** - * Test method for {@link ChallengesManager#createLevel(java.lang.String, java.lang.String, org.bukkit.World)}. - */ @Test public void testCreateLevel() { @Nullable @@ -843,10 +670,6 @@ public void testCreateLevel() { assertEquals(world.getName(), cl.getWorld()); } - /** - * Test method for {@link ChallengesManager#deleteChallengeLevel(world.bentobox.challenges.database.object.ChallengeLevel)}. - * @throws InterruptedException - */ @Test public void testDeleteChallengeLevel() throws InterruptedException { this.testAddChallengeToLevel(); @@ -855,10 +678,6 @@ public void testDeleteChallengeLevel() throws InterruptedException { assertFalse(cm.containsLevel(levelName)); } - /** - * Test method for {@link ChallengesManager#hasAnyChallengeData(org.bukkit.World)}. - * @throws InterruptedException - */ @Test public void testHasAnyChallengeDataWorld() throws InterruptedException { assertFalse(cm.hasAnyChallengeData(world)); @@ -866,10 +685,6 @@ public void testHasAnyChallengeDataWorld() throws InterruptedException { assertTrue(cm.hasAnyChallengeData(world)); } - /** - * Test method for {@link ChallengesManager#hasAnyChallengeData(java.lang.String)}. - * @throws InterruptedException - */ @Test public void testHasAnyChallengeDataString() throws InterruptedException { assertFalse(cm.hasAnyChallengeData("BSkyBlock")); @@ -877,4 +692,338 @@ public void testHasAnyChallengeDataString() throws InterruptedException { assertTrue(cm.hasAnyChallengeData("BSkyBlock")); } + // ------------------------------------------------------------------------- + // Section: getStatisticData tests + // ------------------------------------------------------------------------- + + @Test + public void testGetStatisticDataPlayerOnly() { + Player mockPlayer = mock(Player.class); + when(mockPlayer.getStatistic(Statistic.JUMP)).thenReturn(42); + when(user.getPlayer()).thenReturn(mockPlayer); + + assertEquals(42, cm.getStatisticData(user, world, Statistic.JUMP)); + } + + @Test + public void testGetStatisticDataIslandAggregation() { + settings.setStoreAsIslandData(true); + + IslandsManager islandsManager = mock(IslandsManager.class); + when(addon.getIslands()).thenReturn(islandsManager); + Island island = mock(Island.class); + when(islandsManager.getIsland(any(World.class), any(User.class))).thenReturn(island); + + UUID member1 = UUID.randomUUID(); + UUID member2 = UUID.randomUUID(); + when(island.getMemberSet()).thenReturn(ImmutableSet.of(member1, member2)); + + Player p1 = mock(Player.class); + Player p2 = mock(Player.class); + when(p1.getStatistic(Statistic.JUMP)).thenReturn(10); + when(p2.getStatistic(Statistic.JUMP)).thenReturn(15); + + mockedBukkit.when(() -> Bukkit.getPlayer(member1)).thenReturn(p1); + mockedBukkit.when(() -> Bukkit.getPlayer(member2)).thenReturn(p2); + + assertEquals(25, cm.getStatisticData(user, world, Statistic.JUMP)); + } + + @Test + public void testGetStatisticDataIslandNoIsland() { + settings.setStoreAsIslandData(true); + + IslandsManager islandsManager = mock(IslandsManager.class); + when(addon.getIslands()).thenReturn(islandsManager); + when(islandsManager.getIsland(any(World.class), any(User.class))).thenReturn(null); + + assertEquals(0, cm.getStatisticData(user, world, Statistic.JUMP)); + } + + @Test + public void testGetStatisticDataMaterialPlayerOnly() { + Player mockPlayer = mock(Player.class); + when(mockPlayer.getStatistic(Statistic.MINE_BLOCK, Material.DIAMOND_ORE)).thenReturn(100); + when(user.getPlayer()).thenReturn(mockPlayer); + + assertEquals(100, cm.getStatisticData(user, world, Statistic.MINE_BLOCK, Material.DIAMOND_ORE)); + } + + @Test + public void testGetStatisticDataMaterialIslandAggregation() { + settings.setStoreAsIslandData(true); + + IslandsManager islandsManager = mock(IslandsManager.class); + when(addon.getIslands()).thenReturn(islandsManager); + Island island = mock(Island.class); + when(islandsManager.getIsland(any(World.class), any(User.class))).thenReturn(island); + + UUID member1 = UUID.randomUUID(); + when(island.getMemberSet()).thenReturn(ImmutableSet.of(member1)); + + Player p1 = mock(Player.class); + when(p1.getStatistic(Statistic.MINE_BLOCK, Material.DIAMOND_ORE)).thenReturn(50); + mockedBukkit.when(() -> Bukkit.getPlayer(member1)).thenReturn(p1); + + assertEquals(50, cm.getStatisticData(user, world, Statistic.MINE_BLOCK, Material.DIAMOND_ORE)); + } + + @Test + public void testGetStatisticDataEntityPlayerOnly() { + Player mockPlayer = mock(Player.class); + when(mockPlayer.getStatistic(Statistic.KILL_ENTITY, EntityType.ZOMBIE)).thenReturn(77); + when(user.getPlayer()).thenReturn(mockPlayer); + + assertEquals(77, cm.getStatisticData(user, world, Statistic.KILL_ENTITY, EntityType.ZOMBIE)); + } + + @Test + public void testGetStatisticDataEntityIslandAggregation() { + settings.setStoreAsIslandData(true); + + IslandsManager islandsManager = mock(IslandsManager.class); + when(addon.getIslands()).thenReturn(islandsManager); + Island island = mock(Island.class); + when(islandsManager.getIsland(any(World.class), any(User.class))).thenReturn(island); + + UUID member1 = UUID.randomUUID(); + UUID member2 = UUID.randomUUID(); + when(island.getMemberSet()).thenReturn(ImmutableSet.of(member1, member2)); + + Player p1 = mock(Player.class); + Player p2 = mock(Player.class); + when(p1.getStatistic(Statistic.KILL_ENTITY, EntityType.ZOMBIE)).thenReturn(20); + when(p2.getStatistic(Statistic.KILL_ENTITY, EntityType.ZOMBIE)).thenReturn(30); + mockedBukkit.when(() -> Bukkit.getPlayer(member1)).thenReturn(p1); + mockedBukkit.when(() -> Bukkit.getPlayer(member2)).thenReturn(p2); + + assertEquals(50, cm.getStatisticData(user, world, Statistic.KILL_ENTITY, EntityType.ZOMBIE)); + } + + @Test + public void testGetStatisticDataIslandOfflineMemberFiltered() { + settings.setStoreAsIslandData(true); + + IslandsManager islandsManager = mock(IslandsManager.class); + when(addon.getIslands()).thenReturn(islandsManager); + Island island = mock(Island.class); + when(islandsManager.getIsland(any(World.class), any(User.class))).thenReturn(island); + + UUID onlineMember = UUID.randomUUID(); + UUID offlineMember = UUID.randomUUID(); + when(island.getMemberSet()).thenReturn(ImmutableSet.of(onlineMember, offlineMember)); + + Player p1 = mock(Player.class); + when(p1.getStatistic(Statistic.JUMP)).thenReturn(10); + mockedBukkit.when(() -> Bukkit.getPlayer(onlineMember)).thenReturn(p1); + // offlineMember returns null from Bukkit.getPlayer() + mockedBukkit.when(() -> Bukkit.getPlayer(offlineMember)).thenReturn(null); + + // Only the online member's stat should count + assertEquals(10, cm.getStatisticData(user, world, Statistic.JUMP)); + } + + // ------------------------------------------------------------------------- + // Section: isBreachingTimeOut / getLastCompletionDate tests + // ------------------------------------------------------------------------- + + @Test + public void testIsBreachingTimeOutNoTimeout() { + challenge.setTimeout(0); + assertFalse(cm.isBreachingTimeOut(user, world, challenge)); + } + + @Test + public void testIsBreachingTimeOutNeverCompleted() { + challenge.setTimeout(60000); + // Never completed => lastCompletionDate=0 => 0+60000 < currentTimeMillis => false + assertFalse(cm.isBreachingTimeOut(user, world, challenge)); + } + + @Test + public void testIsBreachingTimeOutRecentCompletion() { + challenge.setTimeout(600000); // 10 minutes + cm.loadChallenge(challenge, world, false, user, true); + cm.setChallengeComplete(user, world, challenge, 1); + + // Just completed => lastCompletionDate ~ now => now < now + 600000 => true + assertTrue(cm.isBreachingTimeOut(user, world, challenge)); + } + + @Test + public void testGetLastCompletionDateNeverCompleted() { + assertEquals(0L, cm.getLastCompletionDate(user, world, challenge)); + } + + @Test + public void testGetLastCompletionDateAfterCompletion() { + cm.loadChallenge(challenge, world, false, user, true); + long before = System.currentTimeMillis(); + cm.setChallengeComplete(user, world, challenge, 1); + long after = System.currentTimeMillis(); + + long lastDate = cm.getLastCompletionDate(user, world, challenge); + assertTrue(lastDate >= before && lastDate <= after, + "Last completion date should be between before and after timestamps"); + } + + // ------------------------------------------------------------------------- + // Section: Level query tests + // ------------------------------------------------------------------------- + + @Test + public void testGetLevelNamesEmpty() { + assertTrue(cm.getLevelNames(world).isEmpty()); + } + + @Test + public void testGetLevelNamesWithLevel() { + cm.loadLevel(level, world, false, user, true); + List names = cm.getLevelNames(world); + assertEquals(1, names.size()); + assertEquals(levelName, names.getFirst()); + } + + @Test + public void testGetLevelCount() { + assertEquals(0, cm.getLevelCount(world)); + cm.loadLevel(level, world, false, user, true); + assertEquals(1, cm.getLevelCount(world)); + } + + @Test + public void testIsLastLevelSingleLevel() { + cm.loadLevel(level, world, false, user, true); + assertTrue(cm.isLastLevel(level, world)); + } + + @Test + public void testIsLastLevelMultipleLevels() { + cm.loadLevel(level, world, false, user, true); + + ChallengeLevel level2 = new ChallengeLevel(); + level2.setUniqueId(GAME_MODE_NAME + "_expert"); + level2.setFriendlyName("Expert"); + level2.setOrder(10); + cm.loadLevel(level2, world, false, user, true); + + assertFalse(cm.isLastLevel(level, world)); + assertTrue(cm.isLastLevel(level2, world)); + } + + @Test + public void testGetLatestUnlockedLevelNoLevels() { + assertNull(cm.getLatestUnlockedLevel(user, world)); + } + + @Test + public void testGetLatestUnlockedLevelSingleLevel() { + cm.loadLevel(level, world, false, user, true); + // With a single unlocked level, previousLevel is null for the first status + ChallengeLevel result = cm.getLatestUnlockedLevel(user, world); + assertNull(result); + } + + // ------------------------------------------------------------------------- + // Section: Challenge/Level count tests + // ------------------------------------------------------------------------- + + @Test + public void testGetChallengeCountEmpty() { + assertEquals(0, cm.getChallengeCount(world)); + } + + @Test + public void testGetChallengeCountWithChallenge() { + challenge.setDeployed(true); + cm.loadChallenge(challenge, world, false, user, true); + assertEquals(1, cm.getChallengeCount(world)); + } + + @Test + public void testGetChallengeCountUndeployedExcluded() { + challenge.setDeployed(false); + settings.setIncludeUndeployed(false); + cm.loadChallenge(challenge, world, false, user, true); + assertEquals(0, cm.getChallengeCount(world)); + } + + @Test + public void testGetChallengeCountUndeployedIncluded() { + challenge.setDeployed(false); + settings.setIncludeUndeployed(true); + cm.loadChallenge(challenge, world, false, user, true); + assertEquals(1, cm.getChallengeCount(world)); + } + + @Test + public void testGetCompletedChallengeCountNone() { + cm.loadChallenge(challenge, world, false, user, true); + assertEquals(0L, cm.getCompletedChallengeCount(user, world)); + } + + @Test + public void testGetCompletedChallengeCountOne() { + cm.loadChallenge(challenge, world, false, user, true); + cm.setChallengeComplete(user, world, challenge, 1); + assertEquals(1L, cm.getCompletedChallengeCount(user, world)); + } + + @Test + public void testGetTotalChallengeCompletionCountZero() { + cm.loadChallenge(challenge, world, false, user, true); + assertEquals(0L, cm.getTotalChallengeCompletionCount(user, world)); + } + + @Test + public void testGetTotalChallengeCompletionCountMultiple() { + cm.loadChallenge(challenge, world, false, user, true); + cm.setChallengeComplete(user, world, challenge, 5); + assertEquals(5L, cm.getTotalChallengeCompletionCount(user, world)); + } + + @Test + public void testGetLevelCompletedChallengeCountNone() { + cm.loadLevel(level, world, false, user, true); + cm.loadChallenge(challenge, world, false, user, true); + level.setChallenges(Collections.singleton(challenge.getUniqueId())); + assertEquals(0L, cm.getLevelCompletedChallengeCount(user, world, level)); + } + + @Test + public void testGetLevelCompletedChallengeCountOne() { + cm.loadLevel(level, world, false, user, true); + cm.loadChallenge(challenge, world, false, user, true); + level.setChallenges(Collections.singleton(challenge.getUniqueId())); + cm.setChallengeComplete(user, world, challenge, 1); + assertEquals(1L, cm.getLevelCompletedChallengeCount(user, world, level)); + } + + @Test + public void testGetCompletedLevelCountNone() { + // A level with no challenges is considered complete, so with one empty level + // the completed count is 1 + cm.loadLevel(level, world, false, user, true); + assertEquals(1L, cm.getCompletedLevelCount(user, world)); + } + + @Test + public void testGetCompletedLevelCountOne() { + cm.loadLevel(level, world, false, user, true); + cm.setLevelComplete(user, world, level); + assertEquals(1L, cm.getCompletedLevelCount(user, world)); + } + + @Test + public void testGetUnlockedLevelCountEmpty() { + assertEquals(0L, cm.getUnlockedLevelCount(user, world)); + } + + @Test + public void testGetUnlockedLevelCountWithLevel() { + cm.loadLevel(level, world, false, user, true); + // First level is always unlocked + assertEquals(1L, cm.getUnlockedLevelCount(user, world)); + } + } diff --git a/src/test/java/world/bentobox/challenges/WhiteBox.java b/src/test/java/world/bentobox/challenges/WhiteBox.java new file mode 100644 index 00000000..7503da61 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/WhiteBox.java @@ -0,0 +1,16 @@ +package world.bentobox.challenges; + +public class WhiteBox { + /** + * Sets the value of a private static field using Java Reflection. + */ + public static void setInternalState(Class targetClass, String fieldName, Object value) { + try { + java.lang.reflect.Field field = targetClass.getDeclaredField(fieldName); + field.setAccessible(true); + field.set(null, value); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Failed to set static field '" + fieldName + "' on class " + targetClass.getName(), e); + } + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/ChallengesCommandTest.java b/src/test/java/world/bentobox/challenges/commands/ChallengesCommandTest.java index 56c041c9..96144239 100644 --- a/src/test/java/world/bentobox/challenges/commands/ChallengesCommandTest.java +++ b/src/test/java/world/bentobox/challenges/commands/ChallengesCommandTest.java @@ -1,8 +1,8 @@ package world.bentobox.challenges.commands; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -18,19 +18,17 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFactory; -import org.bukkit.inventory.meta.ItemMeta; import org.eclipse.jdt.annotation.NonNull; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; @@ -43,6 +41,7 @@ import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.WhiteBox; import world.bentobox.challenges.config.Settings; import world.bentobox.challenges.config.SettingsUtils.VisibilityMode; import world.bentobox.challenges.managers.ChallengesManager; @@ -51,8 +50,6 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, BentoBox.class, Util.class }) public class ChallengesCommandTest { @Mock @@ -75,13 +72,21 @@ public class ChallengesCommandTest { @Mock private GameModeAddon gameModeAddon; - /** - */ - @Before + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + private MockedStatic mockedUtil; + + @BeforeEach public void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock server = MockBukkit.mock(); + // Force Paper static fields to initialize against the real MockBukkit server + // before mockStatic(Bukkit) replaces Bukkit with Mockito stubs. + @SuppressWarnings("unused") + var unusedTagRef = org.bukkit.Tag.LEAVES; // Set up plugin BentoBox plugin = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", plugin); + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); User.setPlugin(plugin); // Command manager @@ -116,7 +121,6 @@ public void setUp() { // Player Player p = mock(Player.class); - // Sometimes use Mockito.withSettings().verboseLogging() when(user.isOp()).thenReturn(false); UUID uuid = UUID.randomUUID(); when(user.getUniqueId()).thenReturn(uuid); @@ -127,12 +131,11 @@ public void setUp() { when(user.getTranslationOrNothing(anyString())).thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); when(user.getWorld()).thenReturn(world); - // Mock item factory (for itemstacks) - PowerMockito.mockStatic(Bukkit.class); - ItemFactory itemFactory = mock(ItemFactory.class); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); - ItemMeta itemMeta = mock(ItemMeta.class); - when(itemFactory.getItemMeta(any())).thenReturn(itemMeta); + // Bukkit static mock — leave most calls as deep stubs and delegate + // server/itemFactory to the real MockBukkit instance. + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(server.getItemFactory()); // Addon when(addon.getChallengesManager()).thenReturn(chm); @@ -148,22 +151,27 @@ public void setUp() { // Island when(plugin.getIslands()).thenReturn(im); when(im.getIsland(any(), any(User.class))).thenReturn(island); - // Default to player being on the island when(im.locationIsOnIsland(any(Player.class), any())).thenReturn(true); // Util - PowerMockito.mockStatic(Util.class, Mockito.RETURNS_MOCKS); - when(Util.sameWorld(any(), any())).thenReturn(true); - when(Util.translateColorCodes(anyString())) + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.sameWorld(any(), any())).thenReturn(true); + mockedUtil.when(() -> Util.translateColorCodes(anyString())) .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); // Command under test cc = new ChallengesPlayerCommand(addon, ic); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ + @AfterEach + public void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (mockedUtil != null) mockedUtil.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + @Test public void testCanExecuteWrongWorld() { when(iwm.inWorld(any(World.class))).thenReturn(false); @@ -171,9 +179,6 @@ public void testCanExecuteWrongWorld() { verify(user).getTranslation(world, "general.errors.wrong-world"); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testCanExecuteNoChallenges() { when(iwm.inWorld(any(World.class))).thenReturn(true); @@ -183,9 +188,6 @@ public void testCanExecuteNoChallenges() { verify(user).getTranslation(world, "challenges.errors.no-challenges"); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testCanExecuteNoChallengesOp() { when(user.isOp()).thenReturn(true); @@ -196,9 +198,6 @@ public void testCanExecuteNoChallengesOp() { verify(user, never()).getTranslation(world, "challenges.errors.no-challenges"); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testCanExecuteNoChallengesHasPerm() { when(user.hasPermission(anyString())).thenReturn(true); @@ -209,9 +208,6 @@ public void testCanExecuteNoChallengesHasPerm() { verify(user, never()).getTranslation(world, "challenges.errors.no-challenges"); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testCanExecuteNoAdminCommand() { when(gameModeAddon.getAdminCommand()).thenReturn(Optional.empty()); @@ -223,9 +219,6 @@ public void testCanExecuteNoAdminCommand() { verify(user, never()).getTranslation(world, "challenges.errors.no-challenges"); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testCanExecuteNoIsland() { when(im.getIsland(any(), any(User.class))).thenReturn(null); @@ -233,26 +226,17 @@ public void testCanExecuteNoIsland() { verify(user).getTranslation(world, "general.errors.no-island"); } - /** - * Test method for {@link ChallengesPlayerCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testCanExecuteSuccess() { assertTrue(cc.canExecute(user, "challenges", Collections.emptyList())); verify(user, never()).sendMessage(anyString()); } - /** - * Test method for {@link ChallengesPlayerCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringUser() { assertTrue(cc.execute(user, "challenges", Collections.emptyList())); } - /** - * Test method for {@link ChallengesPlayerCommand#setup()}. - */ @Test public void testSetup() { assertEquals("bskyblock.challenges", cc.getPermission()); diff --git a/src/test/java/world/bentobox/challenges/commands/CompleteChallengeCommandTest.java b/src/test/java/world/bentobox/challenges/commands/CompleteChallengeCommandTest.java index 876717a2..3f26bfc9 100644 --- a/src/test/java/world/bentobox/challenges/commands/CompleteChallengeCommandTest.java +++ b/src/test/java/world/bentobox/challenges/commands/CompleteChallengeCommandTest.java @@ -1,8 +1,8 @@ package world.bentobox.challenges.commands; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -21,18 +21,17 @@ import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFactory; -import org.bukkit.inventory.meta.ItemMeta; import org.eclipse.jdt.annotation.NonNull; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.GameModeAddon; @@ -45,6 +44,7 @@ import world.bentobox.bentobox.managers.IslandsManager; import world.bentobox.bentobox.util.Util; import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.WhiteBox; import world.bentobox.challenges.config.Settings; import world.bentobox.challenges.config.SettingsUtils.VisibilityMode; import world.bentobox.challenges.database.object.Challenge; @@ -57,8 +57,6 @@ * @author tastybento * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, BentoBox.class, Utils.class, TryToComplete.class, Util.class }) public class CompleteChallengeCommandTest { @Mock @@ -85,14 +83,22 @@ public class CompleteChallengeCommandTest { @Mock private Challenge challenge; - /** - */ + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + private MockedStatic mockedUtils; + private MockedStatic mockedTtc; + private MockedStatic mockedUtil; + @SuppressWarnings("unchecked") - @Before + @BeforeEach public void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock server = MockBukkit.mock(); + @SuppressWarnings("unused") + var unusedTagRef = org.bukkit.Tag.LEAVES; // Set up plugin BentoBox plugin = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", plugin); + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); User.setPlugin(plugin); // Command manager @@ -123,7 +129,6 @@ public void setUp() { // Player Player p = mock(Player.class); - // Sometimes use Mockito.withSettings().verboseLogging() when(user.isOp()).thenReturn(false); UUID uuid = UUID.randomUUID(); when(user.getUniqueId()).thenReturn(uuid); @@ -132,19 +137,15 @@ public void setUp() { when(user.getPermissionValue(anyString(), anyInt())).thenReturn(-1); when(user.isPlayer()).thenReturn(true); - // Mock item factory (for itemstacks) - PowerMockito.mockStatic(Bukkit.class); - ItemFactory itemFactory = mock(ItemFactory.class); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); - ItemMeta itemMeta = mock(ItemMeta.class); - when(itemFactory.getItemMeta(any())).thenReturn(itemMeta); + // Bukkit static mock — delegate item factory to MockBukkit's real one. + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(server.getItemFactory()); // Addon & Challenge Manager when(addon.getChallengesManager()).thenReturn(chm); when(chm.getAllChallengeLevelStatus(any(), any())).thenReturn(Collections.emptyList()); - // Challenges exist when(chm.hasAnyChallengeData(any(World.class))).thenReturn(true); - // Challenges when(chm.getChallenge(anyString())).thenReturn(challenge); List nameList = Arrays.asList("world_maker", "world_placer", "bad_challenge_name", "world_breaker"); when(chm.getAllChallengesNames(any())).thenReturn(nameList); @@ -159,100 +160,85 @@ public void setUp() { when(im.getIsland(any(), any(User.class))).thenReturn(island); // Utils - PowerMockito.mockStatic(Utils.class); - when(Utils.getGameMode(any())).thenReturn("world"); + mockedUtils = Mockito.mockStatic(Utils.class); + mockedUtils.when(() -> Utils.getGameMode(any())).thenReturn("world"); // Try to complete - PowerMockito.mockStatic(TryToComplete.class); - // All challenges are successful! - when(TryToComplete.complete(any(), any(), any(), any(), anyString(), anyString(), anyInt())).thenReturn(true); + mockedTtc = Mockito.mockStatic(TryToComplete.class); + mockedTtc.when(() -> TryToComplete.complete(any(), any(), any(), any(), anyString(), anyString(), anyInt())) + .thenReturn(true); // Util - PowerMockito.mockStatic(Util.class); - when(Util.tabLimit(any(), any())).thenAnswer((Answer>) invocation -> (List)invocation.getArgument(0, List.class)); - when(Util.translateColorCodes(anyString())) + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.tabLimit(any(), any())) + .thenAnswer((Answer>) invocation -> (List) invocation.getArgument(0, List.class)); + mockedUtil.when(() -> Util.translateColorCodes(anyString())) .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); // Command under test cc = new CompleteChallengeCommand(addon, ic); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#CompleteChallengeCommand(world.bentobox.bentobox.api.addons.Addon, world.bentobox.bentobox.api.commands.CompositeCommand)}. - */ + @AfterEach + public void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (mockedUtils != null) mockedUtils.closeOnDemand(); + if (mockedTtc != null) mockedTtc.closeOnDemand(); + if (mockedUtil != null) mockedUtil.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + @Test public void testCompleteChallengeCommand() { assertEquals("complete", cc.getLabel()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#setup()}. - */ @Test public void testSetup() { assertEquals("bskyblock.challenges", cc.getPermission()); assertEquals("challenges.commands.user.complete.parameters", cc.getParameters()); assertEquals("challenges.commands.user.complete.description", cc.getDescription()); assertTrue(cc.isOnlyPlayer()); - // No sub commands assertEquals(0, cc.getSubCommands(true).size()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringNoArgs() { assertFalse(cc.execute(user, "complete", Collections.emptyList())); - PowerMockito.verifyStatic(Utils.class); - Utils.sendMessage(user, world, Constants.ERRORS + "no-name"); + mockedUtils.verify(() -> Utils.sendMessage(user, world, Constants.ERRORS + "no-name")); verify(user).sendMessage(eq("commands.help.header"), eq(TextVariables.LABEL), eq("BSkyBlock")); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringUnknownChallenge() { when(chm.getChallenge(anyString())).thenReturn(null); assertFalse(cc.execute(user, "complete", Collections.singletonList("mychal"))); - PowerMockito.verifyStatic(Utils.class); - Utils.sendMessage(user, world, Constants.ERRORS + "unknown-challenge"); + mockedUtils.verify(() -> Utils.sendMessage(user, world, Constants.ERRORS + "unknown-challenge")); verify(user).sendMessage(eq("commands.help.header"), eq(TextVariables.LABEL), eq("BSkyBlock")); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringKnownChallengeFail() { - when(TryToComplete.complete(any(), any(), any(), any(), anyString(), anyString(), anyInt())).thenReturn(false); + mockedTtc.when(() -> TryToComplete.complete(any(), any(), any(), any(), anyString(), anyString(), anyInt())) + .thenReturn(false); assertFalse(cc.execute(user, "complete", Collections.singletonList("mychal"))); verify(user, never()).sendMessage(any()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringKnownChallengeSuccess() { assertTrue(cc.execute(user, "complete", Collections.singletonList("mychal"))); verify(user, never()).sendMessage(any()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringKnownChallengeSuccessMultipleTimesNoPerm() { assertTrue(cc.execute(user, "complete", Arrays.asList("mychal", "5"))); - PowerMockito.verifyStatic(Utils.class); - Utils.sendMessage(user, world, Constants.ERRORS + "no-multiple-permission"); + mockedUtils.verify(() -> Utils.sendMessage(user, world, Constants.ERRORS + "no-multiple-permission")); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#execute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testExecuteUserStringListOfStringKnownChallengeSuccessMultipleTimesHasPerm() { when(user.hasPermission(anyString())).thenReturn(true); @@ -260,37 +246,26 @@ public void testExecuteUserStringListOfStringKnownChallengeSuccessMultipleTimesH verify(user, never()).sendMessage(any()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringNoArgs() { - cc.tabComplete(user, "complete", Collections.emptyList()); + Optional> result = cc.tabComplete(user, "complete", Collections.emptyList()); + assertTrue(result.isEmpty() || result.get().isEmpty()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringOneArg() { List list = cc.tabComplete(user, "complete", Collections.singletonList("arg")).get(); assertFalse(list.isEmpty()); - assertEquals("help", list.get(0)); + assertEquals("help", list.getFirst()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringTwoArgs() { List list = cc.tabComplete(user, "complete", Arrays.asList("arg1", "arg2")).get(); assertFalse(list.isEmpty()); - assertEquals("help", list.get(0)); + assertEquals("help", list.getFirst()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringThreeArgs() { List list = cc.tabComplete(user, "complete", Arrays.asList("arg1", "arg2", "arg3")).get(); @@ -300,33 +275,24 @@ public void testTabCompleteUserStringListOfStringThreeArgs() { assertEquals("breaker", list.get(2)); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringFourArgs() { List list = cc.tabComplete(user, "complete", Arrays.asList("arg1", "arg2", "arg3", "arg4")).get(); assertTrue(list.isEmpty()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringFourArgsNumber() { List list = cc.tabComplete(user, "complete", Arrays.asList("arg1", "arg2", "arg3", "4")).get(); assertFalse(list.isEmpty()); - assertEquals("", list.get(0)); + assertEquals("", list.getFirst()); } - /** - * Test method for {@link world.bentobox.challenges.commands.CompleteChallengeCommand#tabComplete(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}. - */ @Test public void testTabCompleteUserStringListOfStringFiveArgs() { List list = cc.tabComplete(user, "complete", Arrays.asList("arg1", "arg2", "arg23", "arg4", "arg5")).get(); assertFalse(list.isEmpty()); - assertEquals("help", list.get(0)); + assertEquals("help", list.getFirst()); } } diff --git a/src/test/java/world/bentobox/challenges/commands/admin/AdminCommandTestBase.java b/src/test/java/world/bentobox/challenges/commands/admin/AdminCommandTestBase.java new file mode 100644 index 00000000..7907c81e --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/AdminCommandTestBase.java @@ -0,0 +1,172 @@ +package world.bentobox.challenges.commands.admin; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.managers.CommandsManager; +import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.bentobox.managers.IslandsManager; +import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.bentobox.managers.WebManager; +import world.bentobox.bentobox.util.Util; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.WhiteBox; +import world.bentobox.challenges.config.Settings; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Utils; + +/** + * Base class for admin command tests. Provides the common mock setup + * (BentoBox, Bukkit, parent CompositeCommand, etc.) shared by all admin + * command test classes. + */ +public abstract class AdminCommandTestBase { + + @Mock + protected CompositeCommand parentCmd; + @Mock + protected User user; + @Mock + protected IslandsManager im; + @Mock + protected Island island; + @Mock + protected ChallengesAddon addon; + @Mock + protected World world; + @Mock + protected ChallengesManager chm; + @Mock + protected IslandWorldManager iwm; + @Mock + protected GameModeAddon gameModeAddon; + @Mock + protected PlayersManager pm; + + protected BentoBox plugin; + protected Settings settings; + protected UUID userUUID; + protected AutoCloseable closeable; + protected ServerMock server; + protected MockedStatic mockedBukkit; + protected MockedStatic mockedUtils; + protected MockedStatic mockedUtil; + + @BeforeEach + public void setUpBase() { + closeable = MockitoAnnotations.openMocks(this); + server = MockBukkit.mock(); + @SuppressWarnings("unused") + var unusedTagRef = org.bukkit.Tag.LEAVES; + + // BentoBox singleton + plugin = mock(BentoBox.class); + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); + User.setPlugin(plugin); + + // Command manager + CommandsManager cm = mock(CommandsManager.class); + when(plugin.getCommandsManager()).thenReturn(cm); + + // Parent command + when(parentCmd.getAddon()).thenReturn(addon); + when(parentCmd.getPermissionPrefix()).thenReturn("bskyblock."); + when(parentCmd.getLabel()).thenReturn("challenges"); + when(parentCmd.getTopLabel()).thenReturn("bsb"); + when(parentCmd.getWorld()).thenReturn(world); + + // IWM + when(iwm.getFriendlyName(any())).thenReturn("BSkyBlock"); + when(iwm.inWorld(any(World.class))).thenReturn(true); + when(iwm.getAddon(any())).thenReturn(Optional.of(gameModeAddon)); + when(plugin.getIWM()).thenReturn(iwm); + + // Game Mode Addon + when(gameModeAddon.getAdminCommand()).thenReturn(Optional.of(parentCmd)); + + // World + when(world.toString()).thenReturn("world"); + when(world.getName()).thenReturn("world"); + + // User / Player + Player p = mock(Player.class); + userUUID = UUID.randomUUID(); + when(user.isOp()).thenReturn(false); + when(user.getUniqueId()).thenReturn(userUUID); + when(user.getPlayer()).thenReturn(p); + when(user.getName()).thenReturn("tastybento"); + when(user.isPlayer()).thenReturn(true); + when(user.getWorld()).thenReturn(world); + when(user.getTranslation(anyString())) + .thenAnswer((Answer) inv -> inv.getArgument(0, String.class)); + when(user.getTranslationOrNothing(anyString())) + .thenAnswer((Answer) inv -> inv.getArgument(0, String.class)); + + // Bukkit static mock + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(server); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(server.getItemFactory()); + + // Addon & ChallengesManager + when(addon.getChallengesManager()).thenReturn(chm); + when(chm.hasAnyChallengeData(any(World.class))).thenReturn(true); + + // Settings + settings = new Settings(); + when(addon.getChallengesSettings()).thenReturn(settings); + + // Island Manager + when(plugin.getIslands()).thenReturn(im); + when(im.getIsland(any(), any(User.class))).thenReturn(island); + + // Players Manager + when(plugin.getPlayers()).thenReturn(pm); + + // Web Manager (needed by AdminPanel.open) + WebManager wm = mock(WebManager.class); + when(plugin.getWebManager()).thenReturn(wm); + + // Utils static mock + mockedUtils = Mockito.mockStatic(Utils.class); + mockedUtils.when(() -> Utils.getGameMode(any())).thenReturn("BSkyBlock"); + + // Util static mock + mockedUtil = Mockito.mockStatic(Util.class, Mockito.CALLS_REAL_METHODS); + mockedUtil.when(() -> Util.translateColorCodes(anyString())) + .thenAnswer((Answer) inv -> inv.getArgument(0, String.class)); + } + + @AfterEach + public void tearDownBase() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (mockedUtils != null) mockedUtils.closeOnDemand(); + if (mockedUtil != null) mockedUtil.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + User.clearUsers(); + Mockito.framework().clearInlineMocks(); + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/admin/ChallengesAdminCommandTest.java b/src/test/java/world/bentobox/challenges/commands/admin/ChallengesAdminCommandTest.java new file mode 100644 index 00000000..54aa5fe3 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/ChallengesAdminCommandTest.java @@ -0,0 +1,43 @@ +package world.bentobox.challenges.commands.admin; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.Collections; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class ChallengesAdminCommandTest extends AdminCommandTestBase { + + private ChallengesAdminCommand cac; + + @BeforeEach + public void setUp() { + cac = new ChallengesAdminCommand(addon, parentCmd); + } + + @Test + public void testSetup() { + assertEquals("bskyblock.admin.challenges", cac.getPermission()); + assertEquals("challenges.commands.admin.main.parameters", cac.getParameters()); + assertEquals("challenges.commands.admin.main.description", cac.getDescription()); + // Sub-commands: reload, complete, reset, show, migrate + assertEquals(5, cac.getSubCommands(true).size()); + } + + @Test + public void testExecutePlayer() { + // Player should get the admin panel opened (returns true) + assertTrue(cac.execute(user, "challenges", Collections.emptyList())); + } + + @Test + public void testExecuteConsole() { + when(user.isPlayer()).thenReturn(false); + // Console gets help shown (returns false) + assertFalse(cac.execute(user, "challenges", Collections.emptyList())); + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/admin/CompleteCommandTest.java b/src/test/java/world/bentobox/challenges/commands/admin/CompleteCommandTest.java new file mode 100644 index 00000000..b30cd0b6 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/CompleteCommandTest.java @@ -0,0 +1,196 @@ +package world.bentobox.challenges.commands.admin; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.World; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.stubbing.Answer; + +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.util.Util; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.utils.Constants; +import world.bentobox.challenges.utils.Utils; + +public class CompleteCommandTest extends AdminCommandTestBase { + + private CompleteCommand cc; + private Challenge challenge; + + @BeforeEach + public void setUp() { + challenge = mock(Challenge.class); + when(challenge.getFriendlyName()).thenReturn("Test Challenge"); + when(chm.getChallenge(anyString())).thenReturn(challenge); + + cc = new CompleteCommand(addon, parentCmd); + } + + @Test + public void testSetup() { + assertEquals("bskyblock.complete", cc.getPermission()); + assertEquals("challenges.commands.admin.complete.parameters", cc.getParameters()); + assertEquals("challenges.commands.admin.complete.description", cc.getDescription()); + } + + // --- execute: no args --- + + @Test + public void testExecuteNoArgsPlayer() { + assertFalse(cc.execute(user, "complete", Collections.emptyList())); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.ERRORS + "no-name"))); + } + + @Test + public void testExecuteNoArgsConsole() { + when(user.isPlayer()).thenReturn(false); + assertFalse(cc.execute(user, "complete", Collections.emptyList())); + verify(addon).logError("Missing parameters"); + } + + // --- execute: one arg (missing player target) --- + + @Test + public void testExecuteOneArgPlayer() { + assertFalse(cc.execute(user, "complete", List.of("someplayer"))); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.ERRORS + "missing-arguments"))); + } + + @Test + public void testExecuteOneArgConsole() { + when(user.isPlayer()).thenReturn(false); + assertFalse(cc.execute(user, "complete", List.of("someplayer"))); + verify(addon).logError("Missing parameters"); + } + + // --- execute: unknown player --- + + @Test + public void testExecuteUnknownPlayer() { + when(pm.getUUID(anyString())).thenReturn(null); + assertFalse(cc.execute(user, "complete", Arrays.asList("unknown", "mychal"))); + } + + @Test + public void testExecuteUnknownPlayerConsole() { + when(user.isPlayer()).thenReturn(false); + when(pm.getUUID(anyString())).thenReturn(null); + assertFalse(cc.execute(user, "complete", Arrays.asList("unknown", "mychal"))); + verify(addon).logError("Unknown player name unknown"); + } + + // --- execute: unknown challenge --- + + @Test + public void testExecuteUnknownChallenge() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.getChallenge(anyString())).thenReturn(null); + + assertFalse(cc.execute(user, "complete", Arrays.asList("tastybento", "badchal"))); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.ERRORS + "unknown-challenge"))); + } + + @Test + public void testExecuteUnknownChallengeConsole() { + when(user.isPlayer()).thenReturn(false); + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.getChallenge(anyString())).thenReturn(null); + + assertFalse(cc.execute(user, "complete", Arrays.asList("tastybento", "badchal"))); + verify(addon).logError("Unknown challenge badchal"); + } + + // --- execute: challenge already completed --- + + @Test + public void testExecuteAlreadyCompleted() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(true); + + assertTrue(cc.execute(user, "complete", Arrays.asList("tastybento", "mychal"))); + verify(chm, never()).setChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class), any(UUID.class)); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.MESSAGES + "already-completed"))); + } + + // --- execute: success --- + + @Test + public void testExecuteSuccess() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(false); + + assertTrue(cc.execute(user, "complete", Arrays.asList("tastybento", "mychal"))); + verify(chm).setChallengeComplete(eq(targetUUID), any(World.class), eq(challenge), eq(userUUID)); + } + + @Test + public void testExecuteSuccessConsole() { + when(user.isPlayer()).thenReturn(false); + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(false); + + assertTrue(cc.execute(user, "complete", Arrays.asList("tastybento", "mychal"))); + verify(chm).setChallengeComplete(eq(targetUUID), any(World.class), eq(challenge), eq(userUUID)); + } + + // --- tabComplete --- + + @Test + public void testTabCompletePlayerNames() { + mockedUtil.when(() -> Util.getOnlinePlayerList(any(User.class))).thenReturn(List.of("alice", "bob")); + // args size 3 = player name position (label + "complete" + partial) + Optional> result = cc.tabComplete(user, "complete", Arrays.asList("complete", "x", "a")); + assertTrue(result.isPresent()); + assertTrue(result.get().contains("alice")); + } + + @Test + public void testTabCompleteChallengeNames() { + when(chm.getAllChallengesNames(any())).thenReturn(List.of("BSkyBlock_mychal", "BSkyBlock_otherchal")); + mockedUtil.when(() -> Util.tabLimit(any(), any())) + .thenAnswer((Answer>) inv -> inv.getArgument(0, List.class)); + Optional> result = cc.tabComplete(user, "complete", Arrays.asList("complete", "x", "alice", "m")); + assertTrue(result.isPresent()); + assertTrue(result.get().contains("mychal")); + assertTrue(result.get().contains("otherchal")); + } + + @Test + public void testTabCompleteDefault() { + mockedUtil.when(() -> Util.tabLimit(any(), any())) + .thenAnswer((Answer>) inv -> inv.getArgument(0, List.class)); + Optional> result = cc.tabComplete(user, "complete", + Arrays.asList("complete", "x", "alice", "chal", "extra")); + assertTrue(result.isPresent()); + assertEquals("help", result.get().getFirst()); + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/admin/MigrateCommandTest.java b/src/test/java/world/bentobox/challenges/commands/admin/MigrateCommandTest.java new file mode 100644 index 00000000..f19ea1d2 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/MigrateCommandTest.java @@ -0,0 +1,37 @@ +package world.bentobox.challenges.commands.admin; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; + +import java.util.Collections; + +import org.bukkit.World; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import world.bentobox.bentobox.api.user.User; + +public class MigrateCommandTest extends AdminCommandTestBase { + + private MigrateCommand mc; + + @BeforeEach + public void setUp() { + mc = new MigrateCommand(addon, parentCmd); + } + + @Test + public void testSetup() { + assertEquals("bskyblock.challenges.admin", mc.getPermission()); + assertEquals("challenges.commands.admin.migrate.parameters", mc.getParameters()); + assertEquals("challenges.commands.admin.migrate.description", mc.getDescription()); + } + + @Test + public void testExecute() { + assertTrue(mc.execute(user, "migrate", Collections.emptyList())); + verify(chm).migrateDatabase(any(User.class), any(World.class)); + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/admin/ReloadChallengesTest.java b/src/test/java/world/bentobox/challenges/commands/admin/ReloadChallengesTest.java new file mode 100644 index 00000000..73b9c582 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/ReloadChallengesTest.java @@ -0,0 +1,46 @@ +package world.bentobox.challenges.commands.admin; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.verify; + +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class ReloadChallengesTest extends AdminCommandTestBase { + + private ReloadChallenges rc; + + @BeforeEach + public void setUp() { + rc = new ReloadChallenges(addon, parentCmd); + } + + @Test + public void testSetup() { + assertEquals("bskyblock.admin.challenges", rc.getPermission()); + assertEquals("challenges.commands.admin.reload.parameters", rc.getParameters()); + assertEquals("challenges.commands.admin.reload.description", rc.getDescription()); + } + + @Test + public void testExecuteSoftReload() { + assertTrue(rc.execute(user, "reload", Collections.emptyList())); + verify(chm).load(); + } + + @Test + public void testExecuteHardReload() { + assertTrue(rc.execute(user, "reload", List.of("hard"))); + verify(chm).reload(); + } + + @Test + public void testExecuteUnknownArg() { + assertFalse(rc.execute(user, "reload", List.of("unknown"))); + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/admin/ResetCommandTest.java b/src/test/java/world/bentobox/challenges/commands/admin/ResetCommandTest.java new file mode 100644 index 00000000..b5f388d4 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/ResetCommandTest.java @@ -0,0 +1,220 @@ +package world.bentobox.challenges.commands.admin; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.World; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.stubbing.Answer; + +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.util.Util; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.utils.Constants; +import world.bentobox.challenges.utils.Utils; + +public class ResetCommandTest extends AdminCommandTestBase { + + private ResetCommand rc; + private Challenge challenge; + + @BeforeEach + public void setUp() { + challenge = mock(Challenge.class); + when(challenge.getFriendlyName()).thenReturn("Test Challenge"); + when(chm.getChallenge(anyString())).thenReturn(challenge); + + rc = new ResetCommand(addon, parentCmd); + } + + @Test + public void testSetup() { + assertEquals("bskyblock.reset", rc.getPermission()); + assertEquals("challenges.commands.admin.reset.parameters", rc.getParameters()); + assertEquals("challenges.commands.admin.reset.description", rc.getDescription()); + } + + // --- execute: no args --- + + @Test + public void testExecuteNoArgsPlayer() { + assertFalse(rc.execute(user, "reset", Collections.emptyList())); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.ERRORS + "no-name"))); + } + + @Test + public void testExecuteNoArgsConsole() { + when(user.isPlayer()).thenReturn(false); + assertFalse(rc.execute(user, "reset", Collections.emptyList())); + verify(addon).logError("Missing parameters"); + } + + // --- execute: one arg (missing challenge/all) --- + + @Test + public void testExecuteOneArgPlayer() { + assertFalse(rc.execute(user, "reset", List.of("someplayer"))); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.ERRORS + "missing-arguments"))); + } + + // --- execute: unknown player --- + + @Test + public void testExecuteUnknownPlayer() { + when(pm.getUUID(anyString())).thenReturn(null); + assertFalse(rc.execute(user, "reset", Arrays.asList("unknown", "mychal"))); + } + + @Test + public void testExecuteUnknownPlayerConsole() { + when(user.isPlayer()).thenReturn(false); + when(pm.getUUID(anyString())).thenReturn(null); + assertFalse(rc.execute(user, "reset", Arrays.asList("unknown", "mychal"))); + verify(addon).logError("Unknown player name unknown"); + } + + // --- execute: reset all --- + + @Test + public void testExecuteResetAll() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + + assertTrue(rc.execute(user, "reset", Arrays.asList("tastybento", "all"))); + verify(chm).resetAllChallenges(eq(targetUUID), any(World.class), eq(userUUID)); + } + + @Test + public void testExecuteResetAllConsole() { + when(user.isPlayer()).thenReturn(false); + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + + assertTrue(rc.execute(user, "reset", Arrays.asList("tastybento", "all"))); + verify(chm).resetAllChallenges(eq(targetUUID), any(World.class), eq(userUUID)); + } + + // --- execute: unknown challenge --- + + @Test + public void testExecuteUnknownChallenge() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.getChallenge(anyString())).thenReturn(null); + + assertFalse(rc.execute(user, "reset", Arrays.asList("tastybento", "badchal"))); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.ERRORS + "unknown-challenge"))); + } + + @Test + public void testExecuteUnknownChallengeConsole() { + when(user.isPlayer()).thenReturn(false); + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.getChallenge(anyString())).thenReturn(null); + + assertFalse(rc.execute(user, "reset", Arrays.asList("tastybento", "badchal"))); + verify(addon).logError("Unknown challenge badchal"); + } + + // --- execute: challenge completed -> reset --- + + @Test + public void testExecuteResetCompletedChallenge() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(true); + + assertTrue(rc.execute(user, "reset", Arrays.asList("tastybento", "mychal"))); + verify(chm).resetChallenge(eq(targetUUID), any(World.class), eq(challenge), eq(userUUID)); + } + + @Test + public void testExecuteResetCompletedChallengeConsole() { + when(user.isPlayer()).thenReturn(false); + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(true); + + assertTrue(rc.execute(user, "reset", Arrays.asList("tastybento", "mychal"))); + verify(chm).resetChallenge(eq(targetUUID), any(World.class), eq(challenge), eq(userUUID)); + } + + // --- execute: challenge not completed --- + + @Test + public void testExecuteResetNotCompletedChallenge() { + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(false); + + assertTrue(rc.execute(user, "reset", Arrays.asList("tastybento", "mychal"))); + verify(chm, never()).resetChallenge(any(), any(), any(), any()); + mockedUtils.verify(() -> + Utils.sendMessage(eq(user), any(World.class), + eq(Constants.MESSAGES + "not-completed"))); + } + + @Test + public void testExecuteResetNotCompletedConsole() { + when(user.isPlayer()).thenReturn(false); + UUID targetUUID = UUID.randomUUID(); + when(pm.getUUID("tastybento")).thenReturn(targetUUID); + when(chm.isChallengeComplete(any(UUID.class), any(World.class), any(Challenge.class))).thenReturn(false); + + assertTrue(rc.execute(user, "reset", Arrays.asList("tastybento", "mychal"))); + verify(addon).log("Challenge is not completed yet"); + } + + // --- tabComplete --- + + @Test + public void testTabCompletePlayerNames() { + mockedUtil.when(() -> Util.getOnlinePlayerList(any(User.class))).thenReturn(List.of("alice", "bob")); + Optional> result = rc.tabComplete(user, "reset", Arrays.asList("reset", "x", "a")); + assertTrue(result.isPresent()); + assertTrue(result.get().contains("alice")); + } + + @Test + public void testTabCompleteChallengeNamesAndAll() { + when(chm.getAllChallengesNames(any())).thenReturn(List.of("BSkyBlock_mychal")); + mockedUtil.when(() -> Util.tabLimit(any(), any())) + .thenAnswer((Answer>) inv -> inv.getArgument(0, List.class)); + Optional> result = rc.tabComplete(user, "reset", Arrays.asList("reset", "x", "alice", "m")); + assertTrue(result.isPresent()); + assertTrue(result.get().contains("mychal")); + assertTrue(result.get().contains("all")); + } + + @Test + public void testTabCompleteDefault() { + mockedUtil.when(() -> Util.tabLimit(any(), any())) + .thenAnswer((Answer>) inv -> inv.getArgument(0, List.class)); + Optional> result = rc.tabComplete(user, "reset", + Arrays.asList("reset", "x", "alice", "chal", "extra")); + assertTrue(result.isPresent()); + assertEquals("help", result.get().getFirst()); + } +} diff --git a/src/test/java/world/bentobox/challenges/commands/admin/ShowChallengesTest.java b/src/test/java/world/bentobox/challenges/commands/admin/ShowChallengesTest.java new file mode 100644 index 00000000..15b15757 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/commands/admin/ShowChallengesTest.java @@ -0,0 +1,53 @@ +package world.bentobox.challenges.commands.admin; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class ShowChallengesTest extends AdminCommandTestBase { + + private ShowChallenges sc; + + @BeforeEach + public void setUp() { + sc = new ShowChallenges(addon, parentCmd); + } + + @Test + public void testSetup() { + assertEquals("bskyblock.admin.challenges", sc.getPermission()); + assertEquals("challenges.commands.admin.show.parameters", sc.getParameters()); + assertEquals("challenges.commands.admin.show.description", sc.getDescription()); + } + + @Test + public void testExecutePlayerSendsNames() { + when(chm.getAllChallengesNames(any())).thenReturn(Arrays.asList("chal_one", "chal_two")); + assertTrue(sc.execute(user, "show", Collections.emptyList())); + verify(user).sendRawMessage("chal_one"); + verify(user).sendRawMessage("chal_two"); + } + + @Test + public void testExecutePlayerNoChallenges() { + when(chm.getAllChallengesNames(any())).thenReturn(Collections.emptyList()); + assertTrue(sc.execute(user, "show", Collections.emptyList())); + } + + @Test + public void testExecuteConsole() { + when(user.isPlayer()).thenReturn(false); + when(chm.getAllChallengesNames(any())).thenReturn(List.of("chal_one")); + assertTrue(sc.execute(user, "show", Collections.emptyList())); + verify(addon).log("chal_one"); + } +} diff --git a/src/test/java/world/bentobox/challenges/database/object/ChallengesPlayerDataTest.java b/src/test/java/world/bentobox/challenges/database/object/ChallengesPlayerDataTest.java new file mode 100644 index 00000000..2220cfbe --- /dev/null +++ b/src/test/java/world/bentobox/challenges/database/object/ChallengesPlayerDataTest.java @@ -0,0 +1,285 @@ +package world.bentobox.challenges.database.object; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; + +import java.util.UUID; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import world.bentobox.bentobox.api.logs.LogEntry; + +/** + * Tests for {@link ChallengesPlayerData}. + */ +class ChallengesPlayerDataTest { + + private static final String UUID_STR = UUID.randomUUID().toString(); + private static final String CHALLENGE = "bskyblock_mychallenge"; + + private ChallengesPlayerData data; + + @BeforeEach + void setUp() { + data = new ChallengesPlayerData(UUID_STR); + } + + // --------------------------------------------------------------- + // Constructor / identity + // --------------------------------------------------------------- + + @Test + void testConstructorSetsUniqueId() { + assertEquals(UUID_STR, data.getUniqueId()); + } + + @Test + void testDefaultConstructorHasEmptyUniqueId() { + ChallengesPlayerData empty = new ChallengesPlayerData(); + assertEquals("", empty.getUniqueId()); + } + + @Test + void testSetUniqueId() { + String newId = UUID.randomUUID().toString(); + data.setUniqueId(newId); + assertEquals(newId, data.getUniqueId()); + } + + // --------------------------------------------------------------- + // Challenge completion state + // --------------------------------------------------------------- + + @Test + void testNewDataChallengeNotDone() { + assertFalse(data.isChallengeDone(CHALLENGE)); + assertEquals(0, data.getTimes(CHALLENGE)); + } + + @Test + void testSetChallengeDoneIncrements() { + data.setChallengeDone(CHALLENGE); + assertTrue(data.isChallengeDone(CHALLENGE)); + assertEquals(1, data.getTimes(CHALLENGE)); + } + + @Test + void testSetChallengeDoneRepeatedly() { + data.setChallengeDone(CHALLENGE); + data.setChallengeDone(CHALLENGE); + assertEquals(2, data.getTimes(CHALLENGE)); + } + + @Test + void testAddChallengeDone() { + data.addChallengeDone(CHALLENGE, 5); + assertEquals(5, data.getTimes(CHALLENGE)); + data.addChallengeDone(CHALLENGE, 3); + assertEquals(8, data.getTimes(CHALLENGE)); + } + + @Test + void testSetChallengeTimesAbsoluteOverride() { + data.setChallengeDone(CHALLENGE); + data.setChallengeTimes(CHALLENGE, 10); + assertEquals(10, data.getTimes(CHALLENGE)); + } + + @Test + void testCaseInsensitiveChallengeStatus() { + data.setChallengeDone("BSkyBlock_Challenge"); + assertTrue(data.isChallengeDone("bskyblock_challenge")); + assertEquals(1, data.getTimes("BSKYBLOCK_CHALLENGE")); + } + + // --------------------------------------------------------------- + // Timestamps + // --------------------------------------------------------------- + + @Test + void testGetLastCompletionTimeZeroIfNotDone() { + assertEquals(0L, data.getLastCompletionTime(CHALLENGE)); + } + + @Test + void testGetLastCompletionTimeUpdatedOnDone() { + long before = System.currentTimeMillis(); + data.setChallengeDone(CHALLENGE); + long after = System.currentTimeMillis(); + long ts = data.getLastCompletionTime(CHALLENGE); + assertTrue(ts >= before && ts <= after); + } + + @Test + void testSetChallengeTimesUpdatesTimestamp() { + long before = System.currentTimeMillis(); + data.setChallengeTimes(CHALLENGE, 1); + long after = System.currentTimeMillis(); + long ts = data.getLastCompletionTime(CHALLENGE); + assertTrue(ts >= before && ts <= after); + } + + // --------------------------------------------------------------- + // Reset + // --------------------------------------------------------------- + + @Test + void testResetRemovesGameModeChallenge() { + data.setChallengeDone(CHALLENGE); + data.reset("bskyblock"); + assertFalse(data.isChallengeDone(CHALLENGE)); + assertEquals(0, data.getTimes(CHALLENGE)); + } + + @Test + void testResetLeavesOtherGameModeIntact() { + data.setChallengeDone(CHALLENGE); + data.setChallengeDone("acidisland_other"); + data.reset("bskyblock"); + assertTrue(data.isChallengeDone("acidisland_other")); + } + + @Test + void testResetCaseInsensitive() { + data.setChallengeDone("BSkyBlock_ch1"); + data.reset("bskyblock"); + assertFalse(data.isChallengeDone("BSkyBlock_ch1")); + } + + @Test + void testResetClearsTimestamp() { + data.setChallengeDone(CHALLENGE); + data.reset("bskyblock"); + assertEquals(0L, data.getLastCompletionTime(CHALLENGE)); + } + + // --------------------------------------------------------------- + // Levels + // --------------------------------------------------------------- + + @Test + void testIsLevelDoneFalseWhenEmpty() { + assertFalse(data.isLevelDone("bskyblock_level1")); + } + + @Test + void testAddCompletedLevel() { + data.addCompletedLevel("bskyblock_level1"); + assertTrue(data.isLevelDone("bskyblock_level1")); + } + + @Test + void testIsLevelDoneFalseForUnknownLevel() { + data.addCompletedLevel("bskyblock_level1"); + assertFalse(data.isLevelDone("bskyblock_level2")); + } + + @Test + void testResetClearsLevels() { + data.addCompletedLevel("bskyblock_level1"); + data.reset("bskyblock"); + assertFalse(data.isLevelDone("bskyblock_level1")); + } + + // --------------------------------------------------------------- + // History + // --------------------------------------------------------------- + + @Test + void testHistoryEmptyInitially() { + assertTrue(data.getHistory().isEmpty()); + } + + @Test + void testAddHistoryRecord() { + LogEntry entry = mock(LogEntry.class); + data.addHistoryRecord(entry); + assertEquals(1, data.getHistory().size()); + assertSame(entry, data.getHistory().get(0)); + } + + @Test + void testMultipleHistoryRecordsPreserveOrder() { + LogEntry e1 = mock(LogEntry.class); + LogEntry e2 = mock(LogEntry.class); + data.addHistoryRecord(e1); + data.addHistoryRecord(e2); + assertEquals(2, data.getHistory().size()); + assertSame(e1, data.getHistory().get(0)); + assertSame(e2, data.getHistory().get(1)); + } + + // --------------------------------------------------------------- + // equals / hashCode + // --------------------------------------------------------------- + + @Test + void testEqualsSelf() { + assertEquals(data, data); + } + + @Test + void testEqualsWithSameId() { + ChallengesPlayerData other = new ChallengesPlayerData(UUID_STR); + assertEquals(data, other); + } + + @Test + void testEqualsWithDifferentCaseId() { + ChallengesPlayerData other = new ChallengesPlayerData(UUID_STR.toUpperCase()); + assertEquals(data, other); + } + + @Test + void testEqualsWithDifferentId() { + ChallengesPlayerData other = new ChallengesPlayerData(UUID.randomUUID().toString()); + assertNotEquals(data, other); + } + + @Test + void testEqualsNull() { + assertNotEquals(null, data); + } + + @Test + void testEqualsOtherType() { + assertNotEquals("string", data); + } + + @Test + void testHashCodeConsistentForEqualObjects() { + ChallengesPlayerData other = new ChallengesPlayerData(UUID_STR); + assertEquals(data.hashCode(), other.hashCode()); + } + + // --------------------------------------------------------------- + // Bulk getters / setters + // --------------------------------------------------------------- + + @Test + void testGetChallengeStatus() { + data.setChallengeDone(CHALLENGE); + assertNotNull(data.getChallengeStatus()); + assertTrue(data.getChallengeStatus().containsKey(CHALLENGE)); + } + + @Test + void testGetChallengesTimestamp() { + data.setChallengeDone(CHALLENGE); + assertNotNull(data.getChallengesTimestamp()); + assertTrue(data.getChallengesTimestamp().containsKey(CHALLENGE)); + } + + @Test + void testGetLevelsDone() { + data.addCompletedLevel("bskyblock_level1"); + assertNotNull(data.getLevelsDone()); + assertTrue(data.getLevelsDone().contains("bskyblock_level1")); + } +} diff --git a/src/test/java/world/bentobox/challenges/database/object/requirements/CheckPapiTest.java b/src/test/java/world/bentobox/challenges/database/object/requirements/CheckPapiTest.java index b0013913..cdbf84f2 100644 --- a/src/test/java/world/bentobox/challenges/database/object/requirements/CheckPapiTest.java +++ b/src/test/java/world/bentobox/challenges/database/object/requirements/CheckPapiTest.java @@ -1,42 +1,47 @@ package world.bentobox.challenges.database.object.requirements; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; import org.bukkit.entity.Player; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; import me.clip.placeholderapi.PlaceholderAPI; -@RunWith(PowerMockRunner.class) -@PrepareForTest(PlaceholderAPI.class) public class CheckPapiTest { @Mock private Player player; - @Before + private AutoCloseable closeable; + private MockedStatic mockedPapi; + + @BeforeEach public void setUp() { - PowerMockito.mockStatic(PlaceholderAPI.class, Mockito.RETURNS_MOCKS); - // Return back the input string - when(PlaceholderAPI.setPlaceholders(eq(player), anyString())) + closeable = MockitoAnnotations.openMocks(this); + mockedPapi = Mockito.mockStatic(PlaceholderAPI.class, Mockito.RETURNS_MOCKS); + mockedPapi.when(() -> PlaceholderAPI.setPlaceholders(eq(player), anyString())) .thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); } + @AfterEach + public void tearDown() throws Exception { + mockedPapi.closeOnDemand(); + closeable.close(); + Mockito.framework().clearInlineMocks(); + } + @Test public void testNumericEquality() { - // Using numeric equality comparisons. assertTrue(CheckPapi.evaluate(player, "40 == 40")); assertFalse(CheckPapi.evaluate(player, "40 == 50")); assertTrue(CheckPapi.evaluate(player, "100 = 100")); @@ -53,24 +58,19 @@ public void testNumericComparison() { assertFalse(CheckPapi.evaluate(player, "31 <= 30")); assertTrue(CheckPapi.evaluate(player, "30 >= 30")); assertFalse(CheckPapi.evaluate(player, "29 >= 30")); - // Extra tokens beyond a valid expression. assertTrue(CheckPapi.evaluate(player, "40 > 20 extra")); - } @Test public void testStringEquality() { - // String comparisons with multi-word operands. assertTrue(CheckPapi.evaluate(player, "john smith == john smith")); assertFalse(CheckPapi.evaluate(player, "john smith == jane doe")); - // Using inequality operators. assertTrue(CheckPapi.evaluate(player, "john smith <> jane doe")); assertFalse(CheckPapi.evaluate(player, "john smith <> john smith")); } @Test public void testStringLexicographicalComparison() { - // Lexicographical comparison using string compareTo semantics. assertTrue(CheckPapi.evaluate(player, "apple < banana")); assertTrue(CheckPapi.evaluate(player, "banana > apple")); assertTrue(CheckPapi.evaluate(player, "cat >= cat")); @@ -79,23 +79,15 @@ public void testStringLexicographicalComparison() { @Test public void testMultipleConditionsAndOr() { - // AND has higher precedence than OR. - // "john smith == john smith AND 40 > 20" should be true. assertTrue(CheckPapi.evaluate(player, "john smith == john smith AND 40 > 20")); - // "john smith == jane doe OR 40 > 20" should be true because second condition is true. assertTrue(CheckPapi.evaluate(player, "john smith == jane doe OR 40 > 20")); - // "john smith == jane doe AND 40 > 20" should be false because first condition fails. assertFalse(CheckPapi.evaluate(player, "john smith == jane doe AND 40 > 20")); - // Mixed AND and OR: AND is evaluated first. - // Equivalent to: (john smith == jane doe) OR ((40 > 20) AND (10 < 20)) assertTrue(CheckPapi.evaluate(player, "john smith == jane doe OR 40 > 20 AND 10 < 20")); } @Test public void testInvalidFormula() { - // Missing operator between operands. assertFalse(CheckPapi.evaluate(player, "40 40")); - // Incomplete condition. assertFalse(CheckPapi.evaluate(player, "40 >")); } diff --git a/src/test/java/world/bentobox/challenges/events/ChallengeEventsTest.java b/src/test/java/world/bentobox/challenges/events/ChallengeEventsTest.java new file mode 100644 index 00000000..2a59306b --- /dev/null +++ b/src/test/java/world/bentobox/challenges/events/ChallengeEventsTest.java @@ -0,0 +1,170 @@ +package world.bentobox.challenges.events; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.UUID; + +import org.junit.jupiter.api.Test; + +/** + * Tests for all four challenge event POJOs. + */ +class ChallengeEventsTest { + + // --------------------------------------------------------------- + // ChallengeCompletedEvent + // --------------------------------------------------------------- + + @Test + void testChallengeCompletedEvent_constructorAndGetters() { + UUID uuid = UUID.randomUUID(); + ChallengeCompletedEvent event = new ChallengeCompletedEvent("ch1", uuid, false, 3); + assertEquals("ch1", event.getChallengeID()); + assertEquals(uuid, event.getPlayerUUID()); + assertFalse(event.isAdmin()); + assertEquals(3, event.getCompletionCount()); + } + + @Test + void testChallengeCompletedEvent_setters() { + UUID uuid = UUID.randomUUID(); + ChallengeCompletedEvent event = new ChallengeCompletedEvent("ch1", uuid, false, 1); + UUID newUuid = UUID.randomUUID(); + event.setChallengeID("ch2"); + event.setPlayerUUID(newUuid); + event.setAdmin(true); + event.setCompletionCount(5); + assertEquals("ch2", event.getChallengeID()); + assertEquals(newUuid, event.getPlayerUUID()); + assertTrue(event.isAdmin()); + assertEquals(5, event.getCompletionCount()); + } + + @Test + void testChallengeCompletedEvent_adminFlag() { + ChallengeCompletedEvent event = new ChallengeCompletedEvent("ch1", UUID.randomUUID(), true, 1); + assertTrue(event.isAdmin()); + } + + @Test + void testChallengeCompletedEvent_handlers() { + assertNotNull(ChallengeCompletedEvent.getHandlerList()); + ChallengeCompletedEvent event = new ChallengeCompletedEvent("ch1", UUID.randomUUID(), false, 1); + assertNotNull(event.getHandlers()); + assertEquals(ChallengeCompletedEvent.getHandlerList(), event.getHandlers()); + } + + // --------------------------------------------------------------- + // ChallengeResetEvent + // --------------------------------------------------------------- + + @Test + void testChallengeResetEvent_constructorAndGetters() { + UUID uuid = UUID.randomUUID(); + ChallengeResetEvent event = new ChallengeResetEvent("ch1", uuid, true, "reason"); + assertEquals("ch1", event.getChallengeID()); + assertEquals(uuid, event.getPlayerUUID()); + assertTrue(event.isAdmin()); + assertEquals("reason", event.getReason()); + } + + @Test + void testChallengeResetEvent_setters() { + ChallengeResetEvent event = new ChallengeResetEvent("ch1", UUID.randomUUID(), false, "r1"); + UUID newUuid = UUID.randomUUID(); + event.setChallengeID("ch2"); + event.setPlayerUUID(newUuid); + event.setAdmin(true); + event.setReason("r2"); + assertEquals("ch2", event.getChallengeID()); + assertEquals(newUuid, event.getPlayerUUID()); + assertTrue(event.isAdmin()); + assertEquals("r2", event.getReason()); + } + + @Test + void testChallengeResetEvent_handlers() { + assertNotNull(ChallengeResetEvent.getHandlerList()); + ChallengeResetEvent event = new ChallengeResetEvent("ch1", UUID.randomUUID(), false, "r"); + assertNotNull(event.getHandlers()); + assertEquals(ChallengeResetEvent.getHandlerList(), event.getHandlers()); + } + + // --------------------------------------------------------------- + // ChallengeResetAllEvent + // --------------------------------------------------------------- + + @Test + void testChallengeResetAllEvent_constructorAndGetters() { + UUID uuid = UUID.randomUUID(); + ChallengeResetAllEvent event = new ChallengeResetAllEvent("world_nether", uuid, true, "wipe"); + assertEquals("world_nether", event.getWorldName()); + assertEquals(uuid, event.getPlayerUUID()); + assertTrue(event.isAdmin()); + assertEquals("wipe", event.getReason()); + } + + @Test + void testChallengeResetAllEvent_setters() { + ChallengeResetAllEvent event = new ChallengeResetAllEvent("w1", UUID.randomUUID(), false, "r1"); + UUID newUuid = UUID.randomUUID(); + event.setWorldName("w2"); + event.setPlayerUUID(newUuid); + event.setAdmin(true); + event.setReason("r2"); + assertEquals("w2", event.getWorldName()); + assertEquals(newUuid, event.getPlayerUUID()); + assertTrue(event.isAdmin()); + assertEquals("r2", event.getReason()); + } + + @Test + void testChallengeResetAllEvent_handlers() { + assertNotNull(ChallengeResetAllEvent.getHandlerList()); + ChallengeResetAllEvent event = new ChallengeResetAllEvent("w", UUID.randomUUID(), false, "r"); + assertNotNull(event.getHandlers()); + assertEquals(ChallengeResetAllEvent.getHandlerList(), event.getHandlers()); + } + + // --------------------------------------------------------------- + // LevelCompletedEvent + // --------------------------------------------------------------- + + @Test + void testLevelCompletedEvent_constructorAndGetters() { + UUID uuid = UUID.randomUUID(); + LevelCompletedEvent event = new LevelCompletedEvent("lvl1", uuid, false); + assertEquals("lvl1", event.getLevelID()); + assertEquals(uuid, event.getPlayerUUID()); + assertFalse(event.isAdmin()); + } + + @Test + void testLevelCompletedEvent_setters() { + LevelCompletedEvent event = new LevelCompletedEvent("lvl1", UUID.randomUUID(), false); + UUID newUuid = UUID.randomUUID(); + event.setLevelID("lvl2"); + event.setPlayerUUID(newUuid); + event.setAdmin(true); + assertEquals("lvl2", event.getLevelID()); + assertEquals(newUuid, event.getPlayerUUID()); + assertTrue(event.isAdmin()); + } + + @Test + void testLevelCompletedEvent_adminFlag() { + LevelCompletedEvent event = new LevelCompletedEvent("lvl1", UUID.randomUUID(), true); + assertTrue(event.isAdmin()); + } + + @Test + void testLevelCompletedEvent_handlers() { + assertNotNull(LevelCompletedEvent.getHandlerList()); + LevelCompletedEvent event = new LevelCompletedEvent("lvl", UUID.randomUUID(), false); + assertNotNull(event.getHandlers()); + assertEquals(LevelCompletedEvent.getHandlerList(), event.getHandlers()); + } +} diff --git a/src/test/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandlerTest.java b/src/test/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandlerTest.java new file mode 100644 index 00000000..3c064111 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/handlers/ChallengeDataRequestHandlerTest.java @@ -0,0 +1,138 @@ +package world.bentobox.challenges.handlers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.database.object.Challenge.ChallengeType; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Constants; + +/** + * Tests for {@link ChallengeDataRequestHandler}. + */ +class ChallengeDataRequestHandlerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private Challenge challenge; + + private ChallengeDataRequestHandler handler; + private AutoCloseable closeable; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + handler = new ChallengeDataRequestHandler(addon); + } + + @AfterEach + void tearDown() throws Exception { + closeable.close(); + } + + @Test + void testHandleNull() { + Object result = handler.handle(null); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleEmptyMap() { + Object result = handler.handle(Collections.emptyMap()); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleMissingChallengeKey() { + Object result = handler.handle(Map.of("other-key", "value")); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleWrongValueType() { + Object result = handler.handle(Map.of(Constants.CHALLENGE_NAME_KEY, 42)); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleUnknownChallenge() { + when(manager.getChallenge("unknown")).thenReturn(null); + Object result = handler.handle(Map.of(Constants.CHALLENGE_NAME_KEY, "unknown")); + assertTrue(((Map) result).isEmpty()); + } + + @Test + @SuppressWarnings("unchecked") + void testHandleValidChallenge() { + when(manager.getChallenge("bskyblock_ch1")).thenReturn(challenge); + when(challenge.getUniqueId()).thenReturn("bskyblock_ch1"); + when(challenge.getFriendlyName()).thenReturn("My Challenge"); + when(challenge.getIcon()).thenReturn(null); + when(challenge.getLevel()).thenReturn("bskyblock_level1"); + when(challenge.getOrder()).thenReturn(1); + when(challenge.isDeployed()).thenReturn(true); + when(challenge.getDescription()).thenReturn(List.of("A challenge")); + when(challenge.getChallengeType()).thenReturn(ChallengeType.INVENTORY_TYPE); + when(challenge.isRepeatable()).thenReturn(false); + when(challenge.getMaxTimes()).thenReturn(1); + + Map result = (Map) handler.handle( + Map.of(Constants.CHALLENGE_NAME_KEY, "bskyblock_ch1")); + + assertFalse(result.isEmpty()); + assertEquals("bskyblock_ch1", result.get("uniqueId")); + assertEquals("My Challenge", result.get("name")); + assertEquals("bskyblock_level1", result.get("levelId")); + assertEquals(1, result.get("order")); + assertEquals(true, result.get("deployed")); + assertEquals(List.of("A challenge"), result.get("description")); + assertEquals("INVENTORY_TYPE", result.get("type")); + assertEquals(false, result.get("repeatable")); + assertEquals(1, result.get("maxTimes")); + } + + @Test + @SuppressWarnings("unchecked") + void testHandleRepeatableChallengeUsesMaxTimes() { + when(manager.getChallenge("bskyblock_ch1")).thenReturn(challenge); + when(challenge.getUniqueId()).thenReturn("bskyblock_ch1"); + when(challenge.getFriendlyName()).thenReturn("Repeatable"); + when(challenge.getIcon()).thenReturn(null); + when(challenge.getLevel()).thenReturn(""); + when(challenge.getOrder()).thenReturn(0); + when(challenge.isDeployed()).thenReturn(false); + when(challenge.getDescription()).thenReturn(Collections.emptyList()); + when(challenge.getChallengeType()).thenReturn(ChallengeType.ISLAND_TYPE); + when(challenge.isRepeatable()).thenReturn(true); + when(challenge.getMaxTimes()).thenReturn(5); + + Map result = (Map) handler.handle( + Map.of(Constants.CHALLENGE_NAME_KEY, "bskyblock_ch1")); + + assertEquals(true, result.get("repeatable")); + assertEquals(5, result.get("maxTimes")); + } + + @Test + void testHandlerLabel() { + assertEquals("challenge-data", handler.getLabel()); + } +} diff --git a/src/test/java/world/bentobox/challenges/handlers/ChallengeListRequestHandlerTest.java b/src/test/java/world/bentobox/challenges/handlers/ChallengeListRequestHandlerTest.java new file mode 100644 index 00000000..6e04815c --- /dev/null +++ b/src/test/java/world/bentobox/challenges/handlers/ChallengeListRequestHandlerTest.java @@ -0,0 +1,113 @@ +package world.bentobox.challenges.handlers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Constants; + +/** + * Tests for {@link ChallengeListRequestHandler}. + */ +class ChallengeListRequestHandlerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private World world; + + private ChallengeListRequestHandler handler; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + mockedBukkit = Mockito.mockStatic(Bukkit.class); + handler = new ChallengeListRequestHandler(addon); + } + + @AfterEach + void tearDown() throws Exception { + mockedBukkit.close(); + closeable.close(); + } + + @Test + void testHandleNull() { + Object result = handler.handle(null); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleEmptyMap() { + Object result = handler.handle(Collections.emptyMap()); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleMissingWorldKey() { + Object result = handler.handle(Map.of("other-key", "value")); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleWrongValueType() { + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, 123)); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleUnknownWorld() { + mockedBukkit.when(() -> Bukkit.getWorld("nonexistent")).thenReturn(null); + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, "nonexistent")); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleValidWorldReturnsChallenges() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getAllChallengesNames(world)).thenReturn(List.of("bskyblock_ch1", "bskyblock_ch2")); + + @SuppressWarnings("unchecked") + List result = (List) handler.handle(Map.of(Constants.WORLD_NAME_KEY, "world")); + + assertEquals(2, result.size()); + assertTrue(result.contains("bskyblock_ch1")); + assertTrue(result.contains("bskyblock_ch2")); + } + + @Test + void testHandleValidWorldEmptyChallenges() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getAllChallengesNames(world)).thenReturn(Collections.emptyList()); + + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, "world")); + + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandlerLabel() { + assertEquals("challenge-list", handler.getLabel()); + } +} diff --git a/src/test/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandlerTest.java b/src/test/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandlerTest.java new file mode 100644 index 00000000..8a86ad21 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/handlers/CompletedChallengesRequestHandlerTest.java @@ -0,0 +1,163 @@ +package world.bentobox.challenges.handlers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Constants; + +/** + * Tests for {@link CompletedChallengesRequestHandler}. + */ +class CompletedChallengesRequestHandlerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private World world; + + private CompletedChallengesRequestHandler handler; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + private static final UUID PLAYER_UUID = UUID.randomUUID(); + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + mockedBukkit = Mockito.mockStatic(Bukkit.class); + handler = new CompletedChallengesRequestHandler(addon); + } + + @AfterEach + void tearDown() throws Exception { + mockedBukkit.close(); + closeable.close(); + } + + @Test + void testHandleNull() { + Object result = handler.handle(null); + assertTrue(((Set) result).isEmpty()); + } + + @Test + void testHandleEmptyMap() { + Object result = handler.handle(Collections.emptyMap()); + assertTrue(((Set) result).isEmpty()); + } + + @Test + void testHandleMissingWorldKey() { + Object result = handler.handle(Map.of("player", PLAYER_UUID)); + assertTrue(((Set) result).isEmpty()); + } + + @Test + void testHandleMissingPlayerKey() { + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, "world")); + assertTrue(((Set) result).isEmpty()); + } + + @Test + void testHandleWrongPlayerType() { + Object result = handler.handle(Map.of( + Constants.WORLD_NAME_KEY, "world", + "player", "not-a-uuid")); + assertTrue(((Set) result).isEmpty()); + } + + @Test + void testHandleUnknownWorld() { + mockedBukkit.when(() -> Bukkit.getWorld("nonexistent")).thenReturn(null); + Object result = handler.handle(Map.of( + Constants.WORLD_NAME_KEY, "nonexistent", + "player", PLAYER_UUID)); + assertTrue(((Set) result).isEmpty()); + } + + @Test + void testHandleValidRequestNoCompletedChallenges() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getAllChallengesNames(world)).thenReturn(List.of("bskyblock_ch1", "bskyblock_ch2")); + when(manager.isChallengeComplete(PLAYER_UUID, world, "bskyblock_ch1")).thenReturn(false); + when(manager.isChallengeComplete(PLAYER_UUID, world, "bskyblock_ch2")).thenReturn(false); + + @SuppressWarnings("unchecked") + Set result = (Set) handler.handle(Map.of( + Constants.WORLD_NAME_KEY, "world", + "player", PLAYER_UUID)); + + assertTrue(result.isEmpty()); + } + + @Test + void testHandleValidRequestSomeCompletedChallenges() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getAllChallengesNames(world)).thenReturn(List.of("bskyblock_ch1", "bskyblock_ch2")); + when(manager.isChallengeComplete(PLAYER_UUID, world, "bskyblock_ch1")).thenReturn(true); + when(manager.isChallengeComplete(PLAYER_UUID, world, "bskyblock_ch2")).thenReturn(false); + + @SuppressWarnings("unchecked") + Set result = (Set) handler.handle(Map.of( + Constants.WORLD_NAME_KEY, "world", + "player", PLAYER_UUID)); + + assertEquals(1, result.size()); + assertTrue(result.contains("bskyblock_ch1")); + } + + @Test + void testHandleValidRequestAllCompleted() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getAllChallengesNames(world)).thenReturn(List.of("bskyblock_ch1", "bskyblock_ch2")); + when(manager.isChallengeComplete(PLAYER_UUID, world, "bskyblock_ch1")).thenReturn(true); + when(manager.isChallengeComplete(PLAYER_UUID, world, "bskyblock_ch2")).thenReturn(true); + + @SuppressWarnings("unchecked") + Set result = (Set) handler.handle(Map.of( + Constants.WORLD_NAME_KEY, "world", + "player", PLAYER_UUID)); + + assertEquals(2, result.size()); + } + + @Test + void testHandleValidWorldNoChallengesInWorld() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getAllChallengesNames(world)).thenReturn(Collections.emptyList()); + + @SuppressWarnings("unchecked") + Set result = (Set) handler.handle(Map.of( + Constants.WORLD_NAME_KEY, "world", + "player", PLAYER_UUID)); + + assertTrue(result.isEmpty()); + } + + @Test + void testHandlerLabel() { + assertEquals("completed-challenges", handler.getLabel()); + } +} diff --git a/src/test/java/world/bentobox/challenges/handlers/LevelDataRequestHandlerTest.java b/src/test/java/world/bentobox/challenges/handlers/LevelDataRequestHandlerTest.java new file mode 100644 index 00000000..55063bf0 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/handlers/LevelDataRequestHandlerTest.java @@ -0,0 +1,112 @@ +package world.bentobox.challenges.handlers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.database.object.ChallengeLevel; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Constants; + +/** + * Tests for {@link LevelDataRequestHandler}. + */ +class LevelDataRequestHandlerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private ChallengeLevel level; + + private LevelDataRequestHandler handler; + private AutoCloseable closeable; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + handler = new LevelDataRequestHandler(addon); + } + + @AfterEach + void tearDown() throws Exception { + closeable.close(); + } + + @Test + void testHandleNull() { + Object result = handler.handle(null); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleEmptyMap() { + Object result = handler.handle(Collections.emptyMap()); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleMissingLevelKey() { + Object result = handler.handle(Map.of("other-key", "value")); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleWrongValueType() { + Object result = handler.handle(Map.of(Constants.LEVEL_NAME_KEY, 99)); + assertTrue(((Map) result).isEmpty()); + } + + @Test + void testHandleUnknownLevel() { + when(manager.getLevel("unknown")).thenReturn(null); + Object result = handler.handle(Map.of(Constants.LEVEL_NAME_KEY, "unknown")); + assertTrue(((Map) result).isEmpty()); + } + + @Test + @SuppressWarnings("unchecked") + void testHandleValidLevel() { + Set challenges = Set.of("bskyblock_ch1", "bskyblock_ch2"); + when(manager.getLevel("bskyblock_level1")).thenReturn(level); + when(level.getUniqueId()).thenReturn("bskyblock_level1"); + when(level.getFriendlyName()).thenReturn("Level One"); + when(level.getIcon()).thenReturn(null); + when(level.getOrder()).thenReturn(1); + when(level.getUnlockMessage()).thenReturn("Unlocked!"); + when(level.getWorld()).thenReturn("world"); + when(level.getChallenges()).thenReturn(challenges); + when(level.getWaiverAmount()).thenReturn(3); + + Map result = (Map) handler.handle( + Map.of(Constants.LEVEL_NAME_KEY, "bskyblock_level1")); + + assertFalse(result.isEmpty()); + assertEquals("bskyblock_level1", result.get("uniqueId")); + assertEquals("Level One", result.get("name")); + assertEquals(1, result.get("order")); + assertEquals("Unlocked!", result.get("message")); + assertEquals("world", result.get("world")); + assertEquals(challenges, result.get("challenges")); + assertEquals(3, result.get("waiveramount")); + } + + @Test + void testHandlerLabel() { + assertEquals("level-data", handler.getLabel()); + } +} diff --git a/src/test/java/world/bentobox/challenges/handlers/LevelListRequestHandlerTest.java b/src/test/java/world/bentobox/challenges/handlers/LevelListRequestHandlerTest.java new file mode 100644 index 00000000..5589f04a --- /dev/null +++ b/src/test/java/world/bentobox/challenges/handlers/LevelListRequestHandlerTest.java @@ -0,0 +1,113 @@ +package world.bentobox.challenges.handlers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.utils.Constants; + +/** + * Tests for {@link LevelListRequestHandler}. + */ +class LevelListRequestHandlerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private World world; + + private LevelListRequestHandler handler; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + mockedBukkit = Mockito.mockStatic(Bukkit.class); + handler = new LevelListRequestHandler(addon); + } + + @AfterEach + void tearDown() throws Exception { + mockedBukkit.close(); + closeable.close(); + } + + @Test + void testHandleNull() { + Object result = handler.handle(null); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleEmptyMap() { + Object result = handler.handle(Collections.emptyMap()); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleMissingWorldKey() { + Object result = handler.handle(Map.of("other-key", "value")); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleWrongValueType() { + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, 123)); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleUnknownWorld() { + mockedBukkit.when(() -> Bukkit.getWorld("nonexistent")).thenReturn(null); + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, "nonexistent")); + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandleValidWorldReturnsLevels() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getLevelNames(world)).thenReturn(List.of("bskyblock_level1", "bskyblock_level2")); + + @SuppressWarnings("unchecked") + List result = (List) handler.handle(Map.of(Constants.WORLD_NAME_KEY, "world")); + + assertEquals(2, result.size()); + assertTrue(result.contains("bskyblock_level1")); + assertTrue(result.contains("bskyblock_level2")); + } + + @Test + void testHandleValidWorldEmptyLevels() { + mockedBukkit.when(() -> Bukkit.getWorld("world")).thenReturn(world); + when(manager.getLevelNames(world)).thenReturn(Collections.emptyList()); + + Object result = handler.handle(Map.of(Constants.WORLD_NAME_KEY, "world")); + + assertTrue(((List) result).isEmpty()); + } + + @Test + void testHandlerLabel() { + assertEquals("level-list", handler.getLabel()); + } +} diff --git a/src/test/java/world/bentobox/challenges/listeners/ResetListenerTest.java b/src/test/java/world/bentobox/challenges/listeners/ResetListenerTest.java new file mode 100644 index 00000000..2abe465f --- /dev/null +++ b/src/test/java/world/bentobox/challenges/listeners/ResetListenerTest.java @@ -0,0 +1,237 @@ +package world.bentobox.challenges.listeners; + +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.UUID; + +import org.bukkit.Location; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.api.events.island.IslandCreatedEvent; +import world.bentobox.bentobox.api.events.island.IslandRegisteredEvent; +import world.bentobox.bentobox.api.events.island.IslandResettedEvent; +import world.bentobox.bentobox.api.events.team.TeamKickEvent; +import world.bentobox.bentobox.api.events.team.TeamLeaveEvent; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.config.Settings; +import world.bentobox.challenges.managers.ChallengesManager; + +/** + * Tests for {@link ResetListener}. + */ +class ResetListenerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private Settings settings; + @Mock + private Island island; + @Mock + private Location location; + @Mock + private World world; + + private ResetListener listener; + private AutoCloseable closeable; + + private static final UUID OWNER_UUID = UUID.randomUUID(); + private static final UUID PLAYER_UUID = UUID.randomUUID(); + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + when(addon.getChallengesSettings()).thenReturn(settings); + when(island.getOwner()).thenReturn(OWNER_UUID); + when(location.getWorld()).thenReturn(world); + listener = new ResetListener(addon); + } + + @AfterEach + void tearDown() throws Exception { + closeable.close(); + } + + // --------------------------------------------------------------- + // onIslandCreated + // --------------------------------------------------------------- + + @Test + void testOnIslandCreated_resetEnabled_callsReset() { + when(settings.isResetChallenges()).thenReturn(true); + IslandCreatedEvent event = new IslandCreatedEvent(island, OWNER_UUID, false, location); + + listener.onIslandCreated(event); + + verify(manager).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + @Test + void testOnIslandCreated_resetDisabled_noReset() { + when(settings.isResetChallenges()).thenReturn(false); + IslandCreatedEvent event = new IslandCreatedEvent(island, OWNER_UUID, false, location); + + listener.onIslandCreated(event); + + verify(manager, never()).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + // --------------------------------------------------------------- + // onIslandResetted — only resets when NOT storing as island data + // --------------------------------------------------------------- + + @Test + void testOnIslandResetted_resetEnabledPerPlayer_callsReset() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(false); + // Mock the event directly to avoid IslandResettedEvent copying the old island + IslandResettedEvent event = Mockito.mock(IslandResettedEvent.class); + when(event.getOwner()).thenReturn(OWNER_UUID); + when(event.getLocation()).thenReturn(location); + + listener.onIslandResetted(event); + + verify(manager).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + @Test + void testOnIslandResetted_resetEnabledIslandData_noReset() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(true); + IslandResettedEvent event = Mockito.mock(IslandResettedEvent.class); + + listener.onIslandResetted(event); + + verify(manager, never()).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + @Test + void testOnIslandResetted_resetDisabled_noReset() { + when(settings.isResetChallenges()).thenReturn(false); + IslandResettedEvent event = Mockito.mock(IslandResettedEvent.class); + + listener.onIslandResetted(event); + + verify(manager, never()).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + // --------------------------------------------------------------- + // onIslandRegistered + // --------------------------------------------------------------- + + @Test + void testOnIslandRegistered_resetEnabledPerPlayer_callsReset() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(false); + IslandRegisteredEvent event = new IslandRegisteredEvent(island, OWNER_UUID, false, location); + + listener.onIslandRegistered(event); + + verify(manager).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + @Test + void testOnIslandRegistered_resetEnabledIslandData_noReset() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(true); + IslandRegisteredEvent event = new IslandRegisteredEvent(island, OWNER_UUID, false, location); + + listener.onIslandRegistered(event); + + verify(manager, never()).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + @Test + void testOnIslandRegistered_resetDisabled_noReset() { + when(settings.isResetChallenges()).thenReturn(false); + IslandRegisteredEvent event = new IslandRegisteredEvent(island, OWNER_UUID, false, location); + + listener.onIslandRegistered(event); + + verify(manager, never()).resetAllChallenges(OWNER_UUID, world, OWNER_UUID); + } + + // --------------------------------------------------------------- + // onTeamLeave — resets the leaving player (not the owner) + // --------------------------------------------------------------- + + @Test + void testOnTeamLeave_resetEnabledPerPlayer_resetsLeavingPlayer() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(false); + TeamLeaveEvent event = new TeamLeaveEvent(island, PLAYER_UUID, false, location); + + listener.onTeamLeave(event); + + verify(manager).resetAllChallenges(PLAYER_UUID, world, OWNER_UUID); + } + + @Test + void testOnTeamLeave_resetEnabledIslandData_noReset() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(true); + TeamLeaveEvent event = new TeamLeaveEvent(island, PLAYER_UUID, false, location); + + listener.onTeamLeave(event); + + verify(manager, never()).resetAllChallenges(PLAYER_UUID, world, OWNER_UUID); + } + + @Test + void testOnTeamLeave_resetDisabled_noReset() { + when(settings.isResetChallenges()).thenReturn(false); + TeamLeaveEvent event = new TeamLeaveEvent(island, PLAYER_UUID, false, location); + + listener.onTeamLeave(event); + + verify(manager, never()).resetAllChallenges(PLAYER_UUID, world, OWNER_UUID); + } + + // --------------------------------------------------------------- + // onTeamKick — resets the kicked player (not the owner) + // --------------------------------------------------------------- + + @Test + void testOnTeamKick_resetEnabledPerPlayer_resetsKickedPlayer() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(false); + TeamKickEvent event = new TeamKickEvent(island, PLAYER_UUID, false, location); + + listener.onTeamKick(event); + + verify(manager).resetAllChallenges(PLAYER_UUID, world, OWNER_UUID); + } + + @Test + void testOnTeamKick_resetEnabledIslandData_noReset() { + when(settings.isResetChallenges()).thenReturn(true); + when(settings.isStoreAsIslandData()).thenReturn(true); + TeamKickEvent event = new TeamKickEvent(island, PLAYER_UUID, false, location); + + listener.onTeamKick(event); + + verify(manager, never()).resetAllChallenges(PLAYER_UUID, world, OWNER_UUID); + } + + @Test + void testOnTeamKick_resetDisabled_noReset() { + when(settings.isResetChallenges()).thenReturn(false); + TeamKickEvent event = new TeamKickEvent(island, PLAYER_UUID, false, location); + + listener.onTeamKick(event); + + verify(manager, never()).resetAllChallenges(PLAYER_UUID, world, OWNER_UUID); + } +} diff --git a/src/test/java/world/bentobox/challenges/listeners/SaveListenerTest.java b/src/test/java/world/bentobox/challenges/listeners/SaveListenerTest.java new file mode 100644 index 00000000..a10cccce --- /dev/null +++ b/src/test/java/world/bentobox/challenges/listeners/SaveListenerTest.java @@ -0,0 +1,84 @@ +package world.bentobox.challenges.listeners; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.managers.ChallengesManager; + +/** + * Tests for {@link SaveListener}. + */ +class SaveListenerTest { + + @Mock + private ChallengesAddon addon; + @Mock + private ChallengesManager manager; + @Mock + private Player player; + + private SaveListener listener; + private AutoCloseable closeable; + + private static final UUID PLAYER_UUID = UUID.randomUUID(); + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + when(addon.getChallengesManager()).thenReturn(manager); + when(player.getUniqueId()).thenReturn(PLAYER_UUID); + listener = new SaveListener(addon); + } + + @AfterEach + void tearDown() throws Exception { + closeable.close(); + } + + @Test + void testOnPlayerKickEvent_removesPlayerFromCache() { + PlayerKickEvent event = Mockito.mock(PlayerKickEvent.class); + when(event.getPlayer()).thenReturn(player); + + listener.onPlayerKickEvent(event); + + verify(manager).removeFromCache(PLAYER_UUID); + } + + @Test + void testOnPlayerQuitEvent_removesPlayerFromCache() { + PlayerQuitEvent event = Mockito.mock(PlayerQuitEvent.class); + when(event.getPlayer()).thenReturn(player); + + listener.onPlayerQuitEvent(event); + + verify(manager).removeFromCache(PLAYER_UUID); + } + + @Test + void testOnPlayerKickEvent_differentPlayers() { + UUID otherUuid = UUID.randomUUID(); + Player otherPlayer = Mockito.mock(Player.class); + when(otherPlayer.getUniqueId()).thenReturn(otherUuid); + + PlayerKickEvent event = Mockito.mock(PlayerKickEvent.class); + when(event.getPlayer()).thenReturn(otherPlayer); + + listener.onPlayerKickEvent(event); + + verify(manager).removeFromCache(otherUuid); + } +} diff --git a/src/test/java/world/bentobox/challenges/managers/ChallengesImportManagerTest.java b/src/test/java/world/bentobox/challenges/managers/ChallengesImportManagerTest.java new file mode 100644 index 00000000..2b1931a7 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/managers/ChallengesImportManagerTest.java @@ -0,0 +1,519 @@ +package world.bentobox.challenges.managers; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.isNull; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import world.bentobox.bentobox.api.addons.AddonDescription; +import world.bentobox.bentobox.util.Util; +import world.bentobox.challenges.AbstractChallengesTest; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.database.object.Challenge.ChallengeType; +import world.bentobox.challenges.database.object.ChallengeLevel; +import world.bentobox.challenges.database.object.requirements.IslandRequirements; +import world.bentobox.challenges.utils.Utils; + +/** + * @author tastybento + */ +public class ChallengesImportManagerTest extends AbstractChallengesTest { + + private ChallengesImportManager cim; + private File dataFolder; + private MockedStatic mockedUtils; + + @Override + @BeforeEach + public void setUp() { + super.setUp(); + + // Data folder for file I/O tests + dataFolder = new File("test-data-folder"); + dataFolder.mkdirs(); + when(addon.getDataFolder()).thenReturn(dataFolder); + + // Addon description for version + AddonDescription addonDesc = new AddonDescription.Builder("bentobox", "Challenges", "1.5.0") + .description("test").authors("tasty").build(); + when(addon.getDescription()).thenReturn(addonDesc); + + // Utils.getGameMode — static method that calls BentoBox.getInstance().getIWM().getAddon(world) + // which is already mocked in the abstract base. We mock Utils directly for cleaner control. + mockedUtils = Mockito.mockStatic(Utils.class, Mockito.CALLS_REAL_METHODS); + mockedUtils.when(() -> Utils.getGameMode(any())).thenReturn(GAME_MODE_NAME); + // Let sendMessage pass through to real implementation + mockedUtils.when(() -> Utils.sendMessage(any(), any(), anyString())).thenCallRealMethod(); + + // ChallengesManager stubs for loading + when(cm.loadChallenge(any(), any(), anyBoolean(), any(), anyBoolean())).thenReturn(true); + when(cm.loadLevel(any(), any(), anyBoolean(), any(), anyBoolean())).thenReturn(true); + + // Class under test + cim = new ChallengesImportManager(addon); + } + + @Override + @AfterEach + public void tearDown() throws Exception { + if (mockedUtils != null) mockedUtils.closeOnDemand(); + super.tearDown(); + deleteFolder(dataFolder); + } + + private void deleteFolder(File folder) throws IOException { + if (folder != null && folder.exists()) { + Files.walk(folder.toPath()) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } + + // ------------------------------------------------------------------------- + // importFile (YAML) + // ------------------------------------------------------------------------- + + @Test + public void testImportFileNotFound() { + cim.importFile(user, world, "nonexistent"); + verify(user).getTranslation(any(World.class), eq("challenges.errors.no-file"), + eq("[file]"), eq("nonexistent")); + } + + @Test + public void testImportFileSuccess() throws IOException { + String yaml = """ + challenges: + mychallenge: + name: "My Challenge" + type: ISLAND_TYPE + deployed: true + order: 1 + environments: + - NORMAL + requirements: + search-distance: 10 + blocks: + STONE: 5 + entities: + ZOMBIE: 2 + rewards: + text: "Good job" + experience: 10 + levels: + novice: + name: "Novice" + order: 1 + waiver: 0 + challenges: + - mychallenge + rewards: + experience: 50 + """; + File yamlFile = new File(dataFolder, "test.yml"); + Files.writeString(yamlFile.toPath(), yaml, StandardCharsets.UTF_8); + + // getChallenge must return the created challenge for level linking + Challenge createdChallenge = new Challenge(); + createdChallenge.setUniqueId("bskyblock_mychallenge"); + when(cm.getChallenge("bskyblock_mychallenge")).thenReturn(createdChallenge); + + cim.importFile(user, world, "test"); + + // Verify wipeDatabase was called with lowercase gamemode name + verify(cm).wipeDatabase("bskyblock"); + // Verify challenge was saved and loaded + verify(cm).saveChallenge(any(Challenge.class)); + verify(cm).loadChallenge(any(Challenge.class), eq(world), eq(true), isNull(), eq(true)); + // Verify level was saved and loaded + verify(cm).saveLevel(any(ChallengeLevel.class)); + verify(cm).loadLevel(any(ChallengeLevel.class), eq(world), eq(true), isNull(), eq(true)); + } + + @Test + public void testImportFileNoGameMode() throws IOException { + // Write a valid YAML file + File yamlFile = new File(dataFolder, "test.yml"); + Files.writeString(yamlFile.toPath(), "challenges:", StandardCharsets.UTF_8); + + // No game mode addon for this world + when(iwm.getAddon(any())).thenReturn(java.util.Optional.empty()); + + cim.importFile(user, world, "test"); + + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-a-gamemode-world"), + eq("[world]"), anyString()); + verify(cm, never()).wipeDatabase(anyString()); + } + + @Test + public void testImportFileNullUser() throws IOException { + String yaml = """ + challenges: + simple: + name: "Simple" + type: INVENTORY_TYPE + deployed: true + requirements: + take-items: false + """; + File yamlFile = new File(dataFolder, "test.yml"); + Files.writeString(yamlFile.toPath(), yaml, StandardCharsets.UTF_8); + + // Should not throw with null user + cim.importFile(null, world, "test"); + + verify(cm).wipeDatabase("bskyblock"); + verify(cm).saveChallenge(any(Challenge.class)); + } + + // ------------------------------------------------------------------------- + // importDatabaseFile (JSON from file) + // ------------------------------------------------------------------------- + + @Test + public void testImportDatabaseFileNullWorld() { + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(null); + cim.importDatabaseFile(user, world, "test.json"); + verify(addon).logError("Given world is not part of BentoBox"); + verify(cm, never()).loadChallenge(any(), any(), anyBoolean(), any(), anyBoolean()); + } + + @Test + public void testImportDatabaseFileNotFound() { + when(cm.hasAnyChallengeData(anyString())).thenReturn(false); + cim.importDatabaseFile(user, world, "nonexistent.json"); + // The file doesn't exist, so loadObject returns null + verify(cm, never()).loadChallenge(any(), any(), anyBoolean(), any(), anyBoolean()); + } + + @Test + public void testImportDatabaseFileWipesExisting() throws IOException { + when(cm.hasAnyChallengeData(anyString())).thenReturn(true); + + // Write a minimal valid JSON file + String json = """ + { + "challengeList": [], + "challengeLevelList": [], + "version": "1.0" + } + """; + File jsonFile = new File(dataFolder, "test.json"); + Files.writeString(jsonFile.toPath(), json, StandardCharsets.UTF_8); + + cim.importDatabaseFile(user, world, "test"); + + verify(cm).wipeDatabase("bskyblock"); + } + + @Test + public void testImportDatabaseFileWithChallenges() throws IOException { + when(cm.hasAnyChallengeData(anyString())).thenReturn(false); + + // JSON with a challenge and level — uses Gson with @Expose annotations + // The DefaultDataHolder expects challengeList and challengeLevelList + String json = """ + { + "challengeList": [ + { + "uniqueId": "testchallenge", + "friendlyName": "Test", + "deployed": true, + "challengeType": "INVENTORY_TYPE", + "level": "testlevel", + "description": ["A test"], + "order": 1, + "repeatable": false, + "maxTimes": 0, + "environment": ["NORMAL"] + } + ], + "challengeLevelList": [ + { + "uniqueId": "testlevel", + "friendlyName": "Test Level", + "world": "", + "order": 1, + "challenges": ["testchallenge"] + } + ], + "version": "1.0" + } + """; + File jsonFile = new File(dataFolder, "test.json"); + Files.writeString(jsonFile.toPath(), json, StandardCharsets.UTF_8); + + cim.importDatabaseFile(user, world, "test"); + + // Challenge should be loaded with prefixed ID + verify(cm).loadChallenge(any(Challenge.class), eq(world), eq(false), eq(user), eq(false)); + // Level should be loaded with prefixed ID + verify(cm).loadLevel(any(ChallengeLevel.class), eq(world), eq(false), eq(user), eq(false)); + // Should save after import + verify(cm).saveChallenges(); + verify(cm).saveLevels(); + } + + // ------------------------------------------------------------------------- + // loadDownloadedChallenges (JSON string) + // ------------------------------------------------------------------------- + + @Test + public void testLoadDownloadedChallengesNullWorld() { + mockedUtil.when(() -> Util.getWorld(any())).thenReturn(null); + cim.loadDownloadedChallenges(user, world, "{}"); + verify(addon).logError("Given world is not part of BentoBox"); + } + + @Test + public void testLoadDownloadedChallengesExistingData() { + when(cm.hasAnyChallengeData(anyString())).thenReturn(true); + when(user.isPlayer()).thenReturn(true); + cim.loadDownloadedChallenges(user, world, "{}"); + verify(user).getTranslation(any(World.class), eq("challenges.errors.exist-challenges-or-levels")); + verify(cm, never()).loadChallenge(any(), any(), anyBoolean(), any(), anyBoolean()); + } + + @Test + public void testLoadDownloadedChallengesExistingDataConsoleUser() { + when(cm.hasAnyChallengeData(anyString())).thenReturn(true); + when(user.isPlayer()).thenReturn(false); + cim.loadDownloadedChallenges(user, world, "{}"); + verify(addon).logWarning("challenges.errors.exist-challenges-or-levels"); + } + + @Test + public void testLoadDownloadedChallengesSuccess() { + when(cm.hasAnyChallengeData(anyString())).thenReturn(false); + + String json = """ + { + "challengeList": [ + { + "uniqueId": "dlchallenge", + "friendlyName": "Downloaded", + "deployed": true, + "challengeType": "ISLAND_TYPE", + "level": "dllevel", + "description": ["Downloaded challenge"], + "order": 1, + "repeatable": true, + "maxTimes": 5, + "environment": ["NORMAL"] + } + ], + "challengeLevelList": [ + { + "uniqueId": "dllevel", + "friendlyName": "DL Level", + "world": "", + "order": 1, + "challenges": ["dlchallenge"] + } + ], + "version": "1.0" + } + """; + + cim.loadDownloadedChallenges(user, world, json); + + verify(cm).loadChallenge(any(Challenge.class), eq(world), eq(false), eq(user), eq(false)); + verify(cm).loadLevel(any(ChallengeLevel.class), eq(world), eq(false), eq(user), eq(false)); + verify(cm).saveChallenges(); + verify(cm).saveLevels(); + } + + @Test + public void testLoadDownloadedChallengesEmptyLists() { + when(cm.hasAnyChallengeData(anyString())).thenReturn(false); + + String json = """ + { + "challengeList": [], + "challengeLevelList": [], + "version": "1.0" + } + """; + + cim.loadDownloadedChallenges(user, world, json); + + verify(cm, never()).loadChallenge(any(), any(), anyBoolean(), any(), anyBoolean()); + verify(cm, never()).loadLevel(any(), any(), anyBoolean(), any(), anyBoolean()); + verify(cm).saveChallenges(); + verify(cm).saveLevels(); + } + + @Test + public void testLoadDownloadedChallengesMultiple() { + when(cm.hasAnyChallengeData(anyString())).thenReturn(false); + + String json = """ + { + "challengeList": [ + { + "uniqueId": "ch1", + "friendlyName": "Challenge 1", + "deployed": true, + "challengeType": "INVENTORY_TYPE", + "level": "", + "description": ["First"], + "order": 1 + }, + { + "uniqueId": "ch2", + "friendlyName": "Challenge 2", + "deployed": true, + "challengeType": "ISLAND_TYPE", + "level": "lvl1", + "description": ["Second"], + "order": 2 + } + ], + "challengeLevelList": [ + { + "uniqueId": "lvl1", + "friendlyName": "Level 1", + "world": "", + "order": 1, + "challenges": ["ch2"] + } + ], + "version": "1.0" + } + """; + + cim.loadDownloadedChallenges(user, world, json); + + verify(cm, times(2)).loadChallenge(any(Challenge.class), eq(world), eq(false), eq(user), eq(false)); + verify(cm).loadLevel(any(ChallengeLevel.class), eq(world), eq(false), eq(user), eq(false)); + } + + // ------------------------------------------------------------------------- + // generateDatabaseFile (JSON export) + // ------------------------------------------------------------------------- + + @Test + public void testGenerateDatabaseFileAlreadyExists() throws IOException { + File existing = new File(dataFolder, "export.json"); + existing.createNewFile(); + when(user.isPlayer()).thenReturn(true); + + cim.generateDatabaseFile(user, world, "export"); + + verify(user).getTranslation(any(World.class), eq("challenges.errors.file-exist"), + eq("[file]"), eq("export")); + } + + @Test + public void testGenerateDatabaseFileSuccess() { + when(user.isPlayer()).thenReturn(true); + + // Set up challenges and levels to export + Challenge ch = new Challenge(); + ch.setUniqueId("bskyblock_testch"); + ch.setFriendlyName("Test"); + ch.setLevel("bskyblock_novice"); + ch.setChallengeType(ChallengeType.ISLAND_TYPE); + ch.setRequirements(new IslandRequirements()); + ch.setDeployed(true); + + ChallengeLevel lvl = new ChallengeLevel(); + lvl.setUniqueId("bskyblock_novice"); + lvl.setFriendlyName("Novice"); + lvl.setWorld("world"); + lvl.setChallenges(Collections.singleton("bskyblock_testch")); + + when(cm.getAllChallenges(world)).thenReturn(List.of(ch)); + when(cm.getLevels(world)).thenReturn(List.of(lvl)); + + cim.generateDatabaseFile(user, world, "export"); + + // Verify the file was created + File exported = new File(dataFolder, "export.json"); + assertTrue(exported.exists()); + + // Verify completion message + verify(user).getTranslation(any(World.class), eq("challenges.conversations.database-export-completed"), + eq("[world]"), eq("world"), eq("[file]"), eq("export")); + } + + @Test + public void testGenerateDatabaseFileEmptyData() { + when(user.isPlayer()).thenReturn(true); + when(cm.getAllChallenges(world)).thenReturn(Collections.emptyList()); + when(cm.getLevels(world)).thenReturn(Collections.emptyList()); + + cim.generateDatabaseFile(user, world, "empty-export"); + + File exported = new File(dataFolder, "empty-export.json"); + assertTrue(exported.exists()); + } + + @Test + public void testGenerateDatabaseFileConsoleUser() { + when(user.isPlayer()).thenReturn(false); + when(cm.getAllChallenges(world)).thenReturn(Collections.emptyList()); + when(cm.getLevels(world)).thenReturn(Collections.emptyList()); + + cim.generateDatabaseFile(user, world, "console-export"); + + File exported = new File(dataFolder, "console-export.json"); + assertTrue(exported.exists()); + verify(addon).logWarning("Database Export Completed"); + } + + @Test + public void testGenerateDatabaseFileStripsPrefix() throws IOException { + when(user.isPlayer()).thenReturn(true); + + Challenge ch = new Challenge(); + ch.setUniqueId("bskyblock_mychallenge"); + ch.setFriendlyName("My Challenge"); + ch.setLevel("bskyblock_novice"); + ch.setChallengeType(ChallengeType.INVENTORY_TYPE); + ch.setDeployed(true); + + ChallengeLevel lvl = new ChallengeLevel(); + lvl.setUniqueId("bskyblock_novice"); + lvl.setFriendlyName("Novice"); + lvl.setWorld("world"); + lvl.setChallenges(Collections.singleton("bskyblock_mychallenge")); + + when(cm.getAllChallenges(world)).thenReturn(List.of(ch)); + when(cm.getLevels(world)).thenReturn(List.of(lvl)); + + cim.generateDatabaseFile(user, world, "prefix-test"); + + File exported = new File(dataFolder, "prefix-test.json"); + assertTrue(exported.exists()); + String content = Files.readString(exported.toPath(), StandardCharsets.UTF_8); + // The exported JSON should have stripped the "bskyblock_" prefix + assertTrue(content.contains("\"mychallenge\"") || content.contains("mychallenge")); + assertFalse(content.contains("bskyblock_mychallenge")); + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/CommonPagedPanelTest.java b/src/test/java/world/bentobox/challenges/panel/CommonPagedPanelTest.java new file mode 100644 index 00000000..ece17b39 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/CommonPagedPanelTest.java @@ -0,0 +1,277 @@ +package world.bentobox.challenges.panel; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.IntStream; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.builders.PanelBuilder; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.managers.ChallengesManager; + +/** + * Tests for {@link CommonPagedPanel} pagination and button creation logic. + */ +class CommonPagedPanelTest { + + @Mock + private ChallengesAddon addon; + @Mock + private User user; + @Mock + private World world; + @Mock + private ChallengesManager manager; + @Mock + private PanelBuilder panelBuilder; + + private TestablePagedPanel panel; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + private static class TestablePagedPanel extends CommonPagedPanel { + private final List createdButtons = new ArrayList<>(); + + protected TestablePagedPanel(ChallengesAddon addon, User user, World world, + String topLabel, String permissionPrefix) { + super(addon, user, world, topLabel, permissionPrefix); + } + + @Override + protected void build() { } + + @Override + protected void updateFilters() { + boolean filterUpdated = true; + } + + @Override + protected PanelItem createElementButton(String object) { + PanelItem item = mock(PanelItem.class); + createdButtons.add(item); + return item; + } + + public void callPopulateElements(PanelBuilder builder, List objects) { + this.populateElements(builder, objects); + } + + @SuppressWarnings("unchecked") + public PanelItem callGetButton(String buttonName) throws Exception { + Class enumClass = Class.forName( + "world.bentobox.challenges.panel.CommonPagedPanel$CommonButtons"); + Object enumValue = null; + for (Object c : enumClass.getEnumConstants()) { + if (c.toString().equals(buttonName)) { + enumValue = c; + break; + } + } + var method = CommonPagedPanel.class.getDeclaredMethod("getButton", enumClass); + method.setAccessible(true); + return (PanelItem) method.invoke(this, enumValue); + } + + public void setPageIndex(int index) throws Exception { + var field = CommonPagedPanel.class.getDeclaredField("pageIndex"); + field.setAccessible(true); + field.setInt(this, index); + } + + public int getPageIndex() throws Exception { + var field = CommonPagedPanel.class.getDeclaredField("pageIndex"); + field.setAccessible(true); + return field.getInt(this); + } + } + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + when(addon.getChallengesManager()).thenReturn(manager); + PanelTestHelper.setupUserTranslations(user); + when(panelBuilder.slotOccupied(anyInt())).thenReturn(false); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(mbServer.getUnsafe()); + + panel = new TestablePagedPanel(addon, user, world, "island", "bskyblock."); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + @Test + void testPopulateEmptyList() { + panel.callPopulateElements(panelBuilder, List.of()); + verify(panelBuilder, never()).item(anyInt(), any(PanelItem.class)); + } + + @Test + void testPopulateSingleElement() { + panel.callPopulateElements(panelBuilder, List.of("one")); + verify(panelBuilder).item(eq(10), any(PanelItem.class)); + assertEquals(1, panel.createdButtons.size()); + } + + @Test + void testPopulateExactlyMaxElements() { + List elements = IntStream.range(0, 21).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + assertEquals(21, panel.createdButtons.size()); + } + + @Test + void testPopulateMoreThanMaxShowsNextButton() { + List elements = IntStream.range(0, 22).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + verify(panelBuilder, times(23)).item(slotCaptor.capture(), any(PanelItem.class)); + assertTrue(slotCaptor.getAllValues().contains(26)); + } + + @Test + void testPopulateSecondPageShowsPreviousButton() throws Exception { + panel.setPageIndex(1); + List elements = IntStream.range(0, 42).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + // 21 items + previous button + search button = 23 + verify(panelBuilder, times(23)).item(slotCaptor.capture(), any(PanelItem.class)); + assertTrue(slotCaptor.getAllValues().contains(18)); + } + + @Test + void testPopulateSkipsOccupiedSlots() { + when(panelBuilder.slotOccupied(10)).thenReturn(true); + panel.callPopulateElements(panelBuilder, List.of("one", "two", "three")); + verify(panelBuilder, never()).item(eq(10), any(PanelItem.class)); + assertEquals(3, panel.createdButtons.size()); + } + + @Test + void testNegativePageIndexWrapsToLastPage() throws Exception { + panel.setPageIndex(-1); + List elements = IntStream.range(0, 42).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + assertEquals(2, panel.getPageIndex()); + } + + @Test + void testPageIndexBeyondMaxWrapsToZero() throws Exception { + panel.setPageIndex(5); + List elements = IntStream.range(0, 21).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + assertEquals(0, panel.getPageIndex()); + } + + @Test + void testSearchButtonAppearsWhenMoreThanMaxElements() { + List elements = IntStream.range(0, 22).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + verify(panelBuilder, times(23)).item(slotCaptor.capture(), any(PanelItem.class)); + assertTrue(slotCaptor.getAllValues().contains(40)); + } + + @Test + void testSearchButtonAppearsWhenSearchStringSet() { + panel.searchString = "test"; + panel.callPopulateElements(panelBuilder, List.of("one")); + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + verify(panelBuilder, times(2)).item(slotCaptor.capture(), any(PanelItem.class)); + assertTrue(slotCaptor.getAllValues().contains(40)); + } + + @Test + void testNoSearchButtonWhenFewElementsAndNoSearch() { + panel.callPopulateElements(panelBuilder, List.of("one", "two")); + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + verify(panelBuilder, times(2)).item(slotCaptor.capture(), any(PanelItem.class)); + assertFalse(slotCaptor.getAllValues().contains(40)); + } + + @Test + void testGetNextButton() throws Exception { + PanelItem nextButton = panel.callGetButton("NEXT"); + assertNotNull(nextButton); + } + + @Test + void testGetPreviousButton() throws Exception { + PanelItem prevButton = panel.callGetButton("PREVIOUS"); + assertNotNull(prevButton); + } + + @Test + void testGetSearchButton() throws Exception { + PanelItem searchButton = panel.callGetButton("SEARCH"); + assertNotNull(searchButton); + } + + @Test + void testGetSearchButtonWithExistingSearchString() throws Exception { + panel.searchString = "diamond"; + PanelItem searchButton = panel.callGetButton("SEARCH"); + assertNotNull(searchButton); + } + + @Test + void testPopulateLastPageNoNextButton() throws Exception { + panel.setPageIndex(1); + List elements = IntStream.range(0, 42).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + // 21 items + previous button + search button = 23 + verify(panelBuilder, times(23)).item(slotCaptor.capture(), any(PanelItem.class)); + assertTrue(slotCaptor.getAllValues().contains(18)); + assertEquals(1, panel.getPageIndex()); + } + + @Test + void testPopulateFirstPageNoPreviousButton() throws Exception { + List elements = IntStream.range(0, 42).mapToObj(i -> "item" + i).toList(); + panel.callPopulateElements(panelBuilder, elements); + // First page: 21 items + next button + search button = 23 + ArgumentCaptor slotCaptor = ArgumentCaptor.forClass(Integer.class); + verify(panelBuilder, times(23)).item(slotCaptor.capture(), any(PanelItem.class)); + assertTrue(slotCaptor.getAllValues().contains(26)); + assertEquals(0, panel.getPageIndex()); + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/CommonPanelTest.java b/src/test/java/world/bentobox/challenges/panel/CommonPanelTest.java new file mode 100644 index 00000000..337ab89f --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/CommonPanelTest.java @@ -0,0 +1,210 @@ +package world.bentobox.challenges.panel; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.managers.ChallengesManager; + +/** + * Tests for {@link CommonPanel} including description generation. + */ +class CommonPanelTest { + + @Mock + private ChallengesAddon addon; + @Mock + private User user; + @Mock + private World world; + @Mock + private ChallengesManager manager; + + private TestableCommonPanel panel; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + private static class TestableCommonPanel extends CommonPanel { + private int buildCount = 0; + + protected TestableCommonPanel(ChallengesAddon addon, User user, World world, + String topLabel, String permissionPrefix) { + super(addon, user, world, topLabel, permissionPrefix); + } + + protected TestableCommonPanel(CommonPanel parentPanel) { + super(parentPanel); + } + + @Override + protected void build() { + buildCount++; + } + + public int getBuildCount() { + return buildCount; + } + + public List callGenerateChallengeDescription(Challenge challenge, User target) { + return this.generateChallengeDescription(challenge, target); + } + + public PanelItem getReturnButton() { + return this.returnButton; + } + } + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + when(addon.getChallengesManager()).thenReturn(manager); + PanelTestHelper.setupUserTranslations(user); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(mbServer.getUnsafe()); + + panel = new TestableCommonPanel(addon, user, world, "island", "bskyblock."); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + @Test + void testMainConstructorSetsFields() { + assertEquals(addon, panel.addon); + assertEquals(manager, panel.manager); + assertEquals(user, panel.user); + assertEquals(world, panel.world); + assertEquals("island", panel.topLabel); + assertEquals("bskyblock.", panel.permissionPrefix); + } + + @Test + void testMainConstructorCreatesReturnButton() { + assertNotNull(panel.getReturnButton()); + } + + @Test + void testChildConstructorInheritsFields() { + TestableCommonPanel child = new TestableCommonPanel(panel); + assertEquals(addon, child.addon); + assertEquals(manager, child.manager); + assertEquals(user, child.user); + assertEquals(world, child.world); + assertEquals("island", child.topLabel); + assertEquals("bskyblock.", child.permissionPrefix); + } + + @Test + void testChildConstructorCreatesReturnButton() { + TestableCommonPanel child = new TestableCommonPanel(panel); + assertNotNull(child.getReturnButton()); + } + + @Test + void testReopenCallsBuild() { + CommonPanel.reopen(panel); + assertEquals(1, panel.getBuildCount()); + } + + @Test + void testReopenMultipleTimes() { + CommonPanel.reopen(panel); + CommonPanel.reopen(panel); + CommonPanel.reopen(panel); + assertEquals(3, panel.getBuildCount()); + } + + @Test + void testGenerateChallengeDescriptionNullTarget() { + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + List description = panel.callGenerateChallengeDescription(challenge, null); + assertNotNull(description); + } + + @Test + void testGenerateChallengeDescriptionCompletedChallenge() { + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + UUID uuid = UUID.randomUUID(); + when(user.getUniqueId()).thenReturn(uuid); + when(manager.isChallengeComplete(uuid, world, challenge)).thenReturn(true); + + List description = panel.callGenerateChallengeDescription(challenge, user); + assertNotNull(description); + } + + @Test + void testGenerateChallengeDescriptionRepeatableChallenge() { + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + when(challenge.isRepeatable()).thenReturn(true); + when(challenge.getMaxTimes()).thenReturn(5); + UUID uuid = UUID.randomUUID(); + when(user.getUniqueId()).thenReturn(uuid); + when(manager.isChallengeComplete(uuid, world, challenge)).thenReturn(true); + when(manager.getChallengeTimes(user, world, challenge)).thenReturn(3L); + + List description = panel.callGenerateChallengeDescription(challenge, user); + assertNotNull(description); + } + + @Test + void testGenerateChallengeDescriptionFullyCompletedRepeatable() { + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + when(challenge.isRepeatable()).thenReturn(true); + when(challenge.getMaxTimes()).thenReturn(5); + UUID uuid = UUID.randomUUID(); + when(user.getUniqueId()).thenReturn(uuid); + when(manager.isChallengeComplete(uuid, world, challenge)).thenReturn(true); + when(manager.getChallengeTimes(user, world, challenge)).thenReturn(5L); + + List description = panel.callGenerateChallengeDescription(challenge, user); + assertNotNull(description); + } + + @Test + void testGenerateChallengeDescriptionWithCustomDescription() { + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + when(challenge.getDescription()).thenReturn(List.of("Custom line 1", "Custom line 2")); + + List description = panel.callGenerateChallengeDescription(challenge, null); + assertNotNull(description); + } + + @Test + void testGenerateChallengeDescriptionEmptyDescription() { + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + when(challenge.getDescription()).thenReturn(Collections.emptyList()); + + List description = panel.callGenerateChallengeDescription(challenge, null); + assertNotNull(description); + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/ConversationUtilsTest.java b/src/test/java/world/bentobox/challenges/panel/ConversationUtilsTest.java new file mode 100644 index 00000000..b8f9ff6b --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/ConversationUtilsTest.java @@ -0,0 +1,139 @@ +package world.bentobox.challenges.panel; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.List; +import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.Function; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; +import org.mockito.stubbing.Answer; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.WhiteBox; + +/** + * Tests for {@link ConversationUtils} conversation creation methods. + * Uses MockBukkit + mockStatic(Bukkit.class) for server infrastructure. + */ +class ConversationUtilsTest { + + @Mock + private User user; + @Mock + private Player player; + + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + when(user.getTranslation(anyString())).thenAnswer( + (Answer) inv -> inv.getArgument(0, String.class)); + when(user.getPlayer()).thenReturn(player); + when(user.getUniqueId()).thenReturn(UUID.randomUUID()); + + // BentoBox.getInstance() for ConversationFactory. + // getServer() is final from JavaPlugin — Mockito 5 inline mock maker can stub finals. + BentoBox bentoBox = mock(BentoBox.class); + WhiteBox.setInternalState(BentoBox.class, "instance", bentoBox); + when(bentoBox.getServer()).thenReturn(mbServer); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getScheduler).thenReturn(mbServer.getScheduler()); + mockedBukkit.when(Bukkit::getPluginManager).thenReturn(mbServer.getPluginManager()); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + @Test + void testCreateConfirmation() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + ConversationUtils.createConfirmation(consumer, user, "Are you sure?", "Done!"); + verify(user).getPlayer(); + } + + @Test + void testCreateConfirmationWithNullSuccessMessage() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + ConversationUtils.createConfirmation(consumer, user, "Are you sure?", null); + verify(user).getPlayer(); + } + + @Test + void testCreateIDStringInput() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + Function validation = input -> true; + ConversationUtils.createIDStringInput(consumer, validation, user, + "Enter ID:", "Created!", "challenges.conversations.object-already-exists"); + verify(user).getPlayer(); + } + + @Test + void testCreateNumericInput() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + ConversationUtils.createNumericInput(consumer, user, "Enter number:", 1, 100); + verify(user).getPlayer(); + } + + @Test + void testCreateNumericInputWithBounds() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + ConversationUtils.createNumericInput(consumer, user, "Enter:", 0, 2000); + verify(user).getPlayer(); + } + + @Test + void testCreateStringInput() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + ConversationUtils.createStringInput(consumer, user, "Enter text:", "Saved!"); + verify(user).getPlayer(); + } + + @Test + void testCreateStringInputWithNullSuccess() { + @SuppressWarnings("unchecked") + Consumer consumer = mock(Consumer.class); + ConversationUtils.createStringInput(consumer, user, "Enter text:", null); + verify(user).getPlayer(); + } + + @Test + void testCreateStringListInput() { + @SuppressWarnings("unchecked") + Consumer> consumer = mock(Consumer.class); + ConversationUtils.createStringListInput(consumer, user, "Enter lines:", "Saved!"); + verify(user).getPlayer(); + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/PanelTestHelper.java b/src/test/java/world/bentobox/challenges/panel/PanelTestHelper.java new file mode 100644 index 00000000..39552a30 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/PanelTestHelper.java @@ -0,0 +1,143 @@ +package world.bentobox.challenges.panel; + +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; + +import world.bentobox.bentobox.api.panels.TemplatedPanel; +import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.database.object.requirements.InventoryRequirements; + +/** + * Shared test utilities for panel tests. + */ +public class PanelTestHelper { + + /** + * Set up user translation mocks to return the key for any invocation. + * Uses a lenient default answer that returns the first String argument + * for any method that returns String. + */ + public static void setupUserTranslations(User user) { + // Catch-all for getTranslation(String, String...) — returns the first arg + Mockito.lenient().when(user.getTranslation(Mockito.anyString())) + .thenAnswer((Answer) inv -> inv.getArgument(0, String.class)); + + // For varargs overloads, Mockito 5 needs any(String[].class) to match the whole varargs array + Mockito.lenient().doAnswer((Answer) inv -> inv.getArgument(0, String.class)) + .when(user).getTranslation(Mockito.anyString(), Mockito.any(String[].class)); + + // getTranslation(World, String, String...) + Mockito.lenient().doAnswer((Answer) inv -> inv.getArgument(1, String.class)) + .when(user).getTranslation(Mockito.any(org.bukkit.World.class), + Mockito.anyString(), Mockito.any(String[].class)); + + // getTranslationOrNothing(String, String...) — catch-all + Mockito.lenient().when(user.getTranslationOrNothing(Mockito.anyString())) + .thenAnswer((Answer) inv -> inv.getArgument(0, String.class)); + + Mockito.lenient().doAnswer((Answer) inv -> inv.getArgument(0, String.class)) + .when(user).getTranslationOrNothing(Mockito.anyString(), Mockito.any(String[].class)); + } + + /** + * Create an ItemTemplateRecord with the given parameters. + */ + public static ItemTemplateRecord createTemplate(ItemStack icon, String title, + String description, Map dataMap, + List actions) { + return new ItemTemplateRecord(icon, title, description, actions, dataMap, null); + } + + /** + * Create a simple ItemTemplateRecord with basic settings. + */ + public static ItemTemplateRecord createSimpleTemplate(Map dataMap) { + return new ItemTemplateRecord( + new ItemStack(Material.PAPER), "Title", "Description", + Collections.emptyList(), dataMap, null); + } + + /** + * Create an ItemTemplateRecord with no icon/title/description. + */ + public static ItemTemplateRecord createEmptyTemplate(Map dataMap) { + return new ItemTemplateRecord( + null, null, null, + Collections.emptyList(), dataMap, null); + } + + /** + * Create a TemplatedPanel.ItemSlot using reflection. + * Constructs a minimal TemplatedPanel stub with typeSlotMap. + */ + public static TemplatedPanel.ItemSlot createItemSlot(int slot, + Map typeSlotMap) throws Exception { + TemplatedPanel panel = createTemplatedPanelStub(typeSlotMap); + return new TemplatedPanel.ItemSlot(slot, panel); + } + + private static TemplatedPanel createTemplatedPanelStub(Map typeSlotMap) + throws Exception { + // Use sun.misc.Unsafe to create instance without calling constructor + Class unsafeClass = Class.forName("sun.misc.Unsafe"); + Field unsafeField = unsafeClass.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + Object unsafe = unsafeField.get(null); + + java.lang.reflect.Method allocate = unsafeClass.getMethod("allocateInstance", Class.class); + TemplatedPanel panel = (TemplatedPanel) allocate.invoke(unsafe, TemplatedPanel.class); + + // Set the typeSlotMap field + Field mapField = TemplatedPanel.class.getDeclaredField("typeSlotMap"); + mapField.setAccessible(true); + mapField.set(panel, typeSlotMap); + + return panel; + } + + /** + * Create a mock Challenge with all required fields populated. + */ + public static Challenge createBasicChallenge(String name, boolean deployed) { + Challenge challenge = Mockito.mock(Challenge.class); + Mockito.when(challenge.getFriendlyName()).thenReturn(name); + Mockito.when(challenge.getUniqueId()).thenReturn( + "bskyblock_" + name.toLowerCase().replace(" ", "_")); + Mockito.when(challenge.getChallengeType()).thenReturn( + Challenge.ChallengeType.INVENTORY_TYPE); + Mockito.when(challenge.getIcon()).thenReturn(new ItemStack(Material.DIAMOND)); + Mockito.when(challenge.isDeployed()).thenReturn(deployed); + Mockito.when(challenge.isRepeatable()).thenReturn(false); + Mockito.when(challenge.getMaxTimes()).thenReturn(0); + Mockito.when(challenge.getTimeout()).thenReturn(0L); + Mockito.when(challenge.getEnvironment()).thenReturn(new HashSet<>()); + Mockito.when(challenge.getDescription()).thenReturn(List.of("Test description")); + Mockito.when(challenge.getRewardText()).thenReturn(""); + Mockito.when(challenge.getRepeatRewardText()).thenReturn(""); + Mockito.when(challenge.getRewardItems()).thenReturn(Collections.emptyList()); + Mockito.when(challenge.getRepeatItemReward()).thenReturn(Collections.emptyList()); + Mockito.when(challenge.getRewardCommands()).thenReturn(Collections.emptyList()); + Mockito.when(challenge.getRepeatRewardCommands()).thenReturn(Collections.emptyList()); + Mockito.when(challenge.getRewardMoney()).thenReturn(0.0); + Mockito.when(challenge.getRepeatMoneyReward()).thenReturn(0.0); + Mockito.when(challenge.getRewardExperience()).thenReturn(0); + Mockito.when(challenge.getRepeatExperienceReward()).thenReturn(0); + + InventoryRequirements req = Mockito.mock(InventoryRequirements.class); + Mockito.when(req.getRequiredPermissions()).thenReturn(new HashSet<>()); + Mockito.when(req.getRequiredItems()).thenReturn(Collections.emptyList()); + Mockito.when(challenge.getRequirements()).thenReturn(req); + + return challenge; + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java b/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java new file mode 100644 index 00000000..08d910e3 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/admin/AdminPanelTest.java @@ -0,0 +1,190 @@ +package world.bentobox.challenges.panel.admin; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Method; +import java.util.Optional; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.WebManager; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.WhiteBox; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.panel.PanelTestHelper; + +/** + * Tests for {@link AdminPanel} button creation logic. + */ +class AdminPanelTest { + + @Mock + private ChallengesAddon addon; + @Mock + private User user; + @Mock + private World world; + @Mock + private ChallengesManager manager; + @Mock + private BentoBox plugin; + @Mock + private WebManager webManager; + + private Object adminPanel; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() throws Exception { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + when(addon.getChallengesManager()).thenReturn(manager); + PanelTestHelper.setupUserTranslations(user); + + // BentoBox instance for WebManager.isEnabled() + when(plugin.getWebManager()).thenReturn(webManager); + when(webManager.getGitHub()).thenReturn(Optional.empty()); + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(mbServer.getUnsafe()); + + var ctor = AdminPanel.class.getDeclaredConstructor( + ChallengesAddon.class, World.class, User.class, String.class, String.class); + ctor.setAccessible(true); + adminPanel = ctor.newInstance(addon, world, user, "island", "bskyblock."); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + private PanelItem callCreateButton(String buttonName) throws Exception { + Class buttonEnum = Class.forName( + "world.bentobox.challenges.panel.admin.AdminPanel$Button"); + Object enumValue = null; + for (Object c : buttonEnum.getEnumConstants()) { + if (c.toString().equals(buttonName)) { + enumValue = c; + break; + } + } + Method method = AdminPanel.class.getDeclaredMethod("createButton", buttonEnum); + method.setAccessible(true); + return (PanelItem) method.invoke(adminPanel, enumValue); + } + + @Test + void testCreateCompleteUserChallengesButton() throws Exception { + assertNotNull(callCreateButton("COMPLETE_USER_CHALLENGES")); + } + + @Test + void testCreateResetUserChallengesButton() throws Exception { + assertNotNull(callCreateButton("RESET_USER_CHALLENGES")); + } + + @Test + void testCreateAddChallengeButton() throws Exception { + assertNotNull(callCreateButton("ADD_CHALLENGE")); + } + + @Test + void testCreateAddLevelButton() throws Exception { + assertNotNull(callCreateButton("ADD_LEVEL")); + } + + @Test + void testCreateEditChallengeButton() throws Exception { + assertNotNull(callCreateButton("EDIT_CHALLENGE")); + } + + @Test + void testCreateEditLevelButton() throws Exception { + assertNotNull(callCreateButton("EDIT_LEVEL")); + } + + @Test + void testCreateDeleteChallengeButton() throws Exception { + assertNotNull(callCreateButton("DELETE_CHALLENGE")); + } + + @Test + void testCreateDeleteLevelButton() throws Exception { + assertNotNull(callCreateButton("DELETE_LEVEL")); + } + + @Test + void testCreateEditSettingsButton() throws Exception { + assertNotNull(callCreateButton("EDIT_SETTINGS")); + } + + @Test + void testCreateImportDatabaseButton() throws Exception { + assertNotNull(callCreateButton("IMPORT_DATABASE")); + } + + @Test + void testCreateImportTemplateButton() throws Exception { + assertNotNull(callCreateButton("IMPORT_TEMPLATE")); + } + + @Test + void testCreateExportChallengesButton() throws Exception { + assertNotNull(callCreateButton("EXPORT_CHALLENGES")); + } + + @Test + void testCreateChallengeWipeButton() throws Exception { + assertNotNull(callCreateButton("CHALLENGE_WIPE")); + } + + @Test + void testCreateCompleteWipeButton() throws Exception { + assertNotNull(callCreateButton("COMPLETE_WIPE")); + } + + @Test + void testCreateUserWipeButton() throws Exception { + assertNotNull(callCreateButton("USER_WIPE")); + } + + @Test + void testCreateLibraryButton() throws Exception { + assertNotNull(callCreateButton("LIBRARY")); + } + + @Test + void testAllButtonsCreateSuccessfully() throws Exception { + Class buttonEnum = Class.forName( + "world.bentobox.challenges.panel.admin.AdminPanel$Button"); + + for (Object constant : buttonEnum.getEnumConstants()) { + assertDoesNotThrow(() -> callCreateButton(constant.toString()), + "Failed to create button: " + constant); + } + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java b/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java new file mode 100644 index 00000000..36c2a553 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/admin/ListChallengesPanelTest.java @@ -0,0 +1,137 @@ +package world.bentobox.challenges.panel.admin; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.database.object.Challenge; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.panel.PanelTestHelper; + +/** + * Tests for {@link ListChallengesPanel} element button creation. + */ +class ListChallengesPanelTest { + + @Mock + private ChallengesAddon addon; + @Mock + private User user; + @Mock + private World world; + @Mock + private ChallengesManager manager; + + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + when(addon.getChallengesManager()).thenReturn(manager); + PanelTestHelper.setupUserTranslations(user); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(mbServer.getUnsafe()); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + private ListChallengesPanel createPanel(ListChallengesPanel.Mode mode) throws Exception { + Constructor ctor = ListChallengesPanel.class.getDeclaredConstructor( + ChallengesAddon.class, World.class, User.class, + ListChallengesPanel.Mode.class, String.class, String.class); + ctor.setAccessible(true); + return ctor.newInstance(addon, world, user, mode, "island", "bskyblock."); + } + + private PanelItem callCreateElementButton(ListChallengesPanel panel, Challenge challenge) + throws Exception { + Method method = ListChallengesPanel.class.getDeclaredMethod("createElementButton", + Challenge.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, challenge); + } + + @Test + void testCreateElementButtonEditMode() throws Exception { + ListChallengesPanel panel = createPanel(ListChallengesPanel.Mode.EDIT); + Challenge challenge = PanelTestHelper.createBasicChallenge("Diamond Challenge", true); + PanelItem item = callCreateElementButton(panel, challenge); + assertNotNull(item); + } + + @Test + void testCreateElementButtonDeleteMode() throws Exception { + ListChallengesPanel panel = createPanel(ListChallengesPanel.Mode.DELETE); + Challenge challenge = PanelTestHelper.createBasicChallenge("Diamond Challenge", true); + PanelItem item = callCreateElementButton(panel, challenge); + assertNotNull(item); + } + + @Test + void testCreateElementButtonUndeployedChallengeGlows() throws Exception { + ListChallengesPanel panel = createPanel(ListChallengesPanel.Mode.EDIT); + Challenge challenge = PanelTestHelper.createBasicChallenge("Undeployed", false); + PanelItem item = callCreateElementButton(panel, challenge); + assertNotNull(item); + } + + @Test + void testCreateElementButtonDeployedChallengeNoGlow() throws Exception { + ListChallengesPanel panel = createPanel(ListChallengesPanel.Mode.EDIT); + Challenge challenge = PanelTestHelper.createBasicChallenge("Deployed", true); + PanelItem item = callCreateElementButton(panel, challenge); + assertNotNull(item); + } + + @Test + void testCreateMultipleElementButtons() throws Exception { + ListChallengesPanel panel = createPanel(ListChallengesPanel.Mode.EDIT); + for (int i = 0; i < 5; i++) { + Challenge challenge = PanelTestHelper.createBasicChallenge("Challenge " + i, true); + PanelItem item = callCreateElementButton(panel, challenge); + assertNotNull(item, "Button for challenge " + i + " should not be null"); + } + } + + @Test + void testBothModesCreateButtons() { + for (ListChallengesPanel.Mode mode : ListChallengesPanel.Mode.values()) { + assertDoesNotThrow(() -> { + ListChallengesPanel panel = createPanel(mode); + Challenge challenge = PanelTestHelper.createBasicChallenge("Test", true); + PanelItem item = callCreateElementButton(panel, challenge); + assertNotNull(item); + }, "Mode " + mode + " should create buttons successfully"); + } + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java b/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java new file mode 100644 index 00000000..038f09ed --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/user/GameModePanelTest.java @@ -0,0 +1,241 @@ +package world.bentobox.challenges.panel.user; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.api.addons.AddonDescription; +import world.bentobox.bentobox.api.addons.GameModeAddon; +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.TemplatedPanel; +import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.managers.ChallengesManager; +import world.bentobox.challenges.panel.PanelTestHelper; + +/** + * Tests for {@link GameModePanel} button creation logic. + */ +class GameModePanelTest { + + @Mock + private ChallengesAddon addon; + @Mock + private User user; + @Mock + private World world; + @Mock + private ChallengesManager manager; + + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + when(addon.getChallengesManager()).thenReturn(manager); + PanelTestHelper.setupUserTranslations(user); + when(user.getWorld()).thenReturn(world); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(mbServer.getUnsafe()); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + private GameModePanel createPanel(List addons, boolean adminMode) throws Exception { + Constructor ctor = GameModePanel.class.getDeclaredConstructor( + ChallengesAddon.class, World.class, User.class, List.class, boolean.class); + ctor.setAccessible(true); + return ctor.newInstance(addon, world, user, addons, adminMode); + } + + private GameModeAddon createMockGameMode(String name) { + GameModeAddon gm = mock(GameModeAddon.class); + AddonDescription desc = new AddonDescription.Builder("bentobox", name, "1.0") + .description("test").authors("tester").build(); + when(gm.getDescription()).thenReturn(desc); + return gm; + } + + private PanelItem callCreateGameModeButtonWithSlot(GameModePanel panel, + ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) throws Exception { + Method method = GameModePanel.class.getDeclaredMethod("createGameModeButton", + ItemTemplateRecord.class, TemplatedPanel.ItemSlot.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, template, slot); + } + + private PanelItem callCreateNextButton(GameModePanel panel, + ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) throws Exception { + Method method = GameModePanel.class.getDeclaredMethod("createNextButton", + ItemTemplateRecord.class, TemplatedPanel.ItemSlot.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, template, slot); + } + + private PanelItem callCreatePreviousButton(GameModePanel panel, + ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) throws Exception { + Method method = GameModePanel.class.getDeclaredMethod("createPreviousButton", + ItemTemplateRecord.class, TemplatedPanel.ItemSlot.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, template, slot); + } + + @Test + void testCreateGameModeButtonReturnsNullForEmptyList() throws Exception { + GameModePanel panel = createPanel(Collections.emptyList(), false); + + ItemTemplateRecord template = PanelTestHelper.createSimpleTemplate(new HashMap<>()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, + Map.of("GAMEMODE", 1)); + + PanelItem item = callCreateGameModeButtonWithSlot(panel, template, slot); + assertNull(item); + } + + @Test + void testCreateGameModeButtonWithAddon() throws Exception { + GameModeAddon gm = createMockGameMode("BSkyBlock"); + when(gm.inWorld(any(World.class))).thenReturn(false); + GameModePanel panel = createPanel(List.of(gm), false); + + ItemTemplateRecord template = PanelTestHelper.createEmptyTemplate(new HashMap<>()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, + Map.of("GAMEMODE", 1)); + + PanelItem item = callCreateGameModeButtonWithSlot(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateGameModeButtonWithIdMatch() throws Exception { + GameModeAddon gm = createMockGameMode("BSkyBlock"); + when(gm.inWorld(any(World.class))).thenReturn(false); + GameModePanel panel = createPanel(List.of(gm), false); + + Map dataMap = new HashMap<>(); + dataMap.put("id", "BSkyBlock"); + ItemTemplateRecord template = PanelTestHelper.createEmptyTemplate(dataMap); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateGameModeButtonWithSlot(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateGameModeButtonWithIdNoMatch() throws Exception { + GameModeAddon gm = createMockGameMode("BSkyBlock"); + GameModePanel panel = createPanel(List.of(gm), false); + + Map dataMap = new HashMap<>(); + dataMap.put("id", "AcidIsland"); + ItemTemplateRecord template = PanelTestHelper.createEmptyTemplate(dataMap); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateGameModeButtonWithSlot(panel, template, slot); + assertNull(item); + } + + @Test + void testCreateGameModeButtonOutOfRange() throws Exception { + GameModeAddon gm = createMockGameMode("BSkyBlock"); + GameModePanel panel = createPanel(List.of(gm), false); + + ItemTemplateRecord template = PanelTestHelper.createSimpleTemplate(new HashMap<>()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(5, + Map.of("GAMEMODE", 1)); + + PanelItem item = callCreateGameModeButtonWithSlot(panel, template, slot); + assertNull(item); + } + + @Test + void testCreateNextButtonNoTarget() throws Exception { + GameModePanel panel = createPanel(Collections.emptyList(), false); + + ItemTemplateRecord template = PanelTestHelper.createSimpleTemplate(new HashMap<>()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateNextButton(panel, template, slot); + assertNull(item); + } + + @Test + void testCreatePreviousButtonAtStart() throws Exception { + GameModePanel panel = createPanel(Collections.emptyList(), false); + + Map dataMap = new HashMap<>(); + dataMap.put("target", "GAMEMODE"); + ItemTemplateRecord template = PanelTestHelper.createSimpleTemplate(dataMap); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreatePreviousButton(panel, template, slot); + assertNull(item); + } + + @Test + void testCreateNextButtonNotEnoughAddons() throws Exception { + GameModeAddon gm = createMockGameMode("BSkyBlock"); + GameModePanel panel = createPanel(List.of(gm), false); + + Map dataMap = new HashMap<>(); + dataMap.put("target", "GAMEMODE"); + ItemTemplateRecord template = PanelTestHelper.createSimpleTemplate(dataMap); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, + Map.of("GAMEMODE", 5)); + + PanelItem item = callCreateNextButton(panel, template, slot); + assertNull(item); + } + + @Test + void testCreateGameModeButtonWithCustomTemplate() throws Exception { + GameModeAddon gm = createMockGameMode("BSkyBlock"); + when(gm.inWorld(any(World.class))).thenReturn(true); + GameModePanel panel = createPanel(List.of(gm), false); + + ItemTemplateRecord template = PanelTestHelper.createTemplate( + new ItemStack(Material.DIAMOND), "custom.title", "custom.desc", + new HashMap<>(), Collections.emptyList()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, + Map.of("GAMEMODE", 1)); + + PanelItem item = callCreateGameModeButtonWithSlot(panel, template, slot); + assertNotNull(item); + } +} diff --git a/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java b/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java new file mode 100644 index 00000000..322b6092 --- /dev/null +++ b/src/test/java/world/bentobox/challenges/panel/user/MultiplePanelTest.java @@ -0,0 +1,230 @@ +package world.bentobox.challenges.panel.user; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Consumer; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockbukkit.mockbukkit.MockBukkit; +import org.mockbukkit.mockbukkit.ServerMock; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.TemplatedPanel; +import world.bentobox.bentobox.api.panels.reader.ItemTemplateRecord; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.ChallengesAddon; +import world.bentobox.challenges.panel.PanelTestHelper; + +/** + * Tests for {@link MultiplePanel} button creation logic. + */ +class MultiplePanelTest { + + @Mock + private ChallengesAddon addon; + @Mock + private User user; + @Mock + private World world; + + private AutoCloseable closeable; + private MockedStatic mockedBukkit; + + @BeforeEach + void setUp() { + closeable = MockitoAnnotations.openMocks(this); + ServerMock mbServer = MockBukkit.mock(); + + PanelTestHelper.setupUserTranslations(user); + when(user.getWorld()).thenReturn(world); + + mockedBukkit = Mockito.mockStatic(Bukkit.class, Mockito.RETURNS_DEEP_STUBS); + mockedBukkit.when(Bukkit::getServer).thenReturn(mbServer); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(mbServer.getItemFactory()); + mockedBukkit.when(Bukkit::getUnsafe).thenReturn(mbServer.getUnsafe()); + } + + @AfterEach + void tearDown() throws Exception { + if (mockedBukkit != null) mockedBukkit.closeOnDemand(); + if (closeable != null) closeable.close(); + MockBukkit.unmock(); + Mockito.framework().clearInlineMocks(); + } + + @SuppressWarnings("unchecked") + private MultiplePanel createPanel(Consumer action) throws Exception { + Constructor ctor = MultiplePanel.class.getDeclaredConstructor( + ChallengesAddon.class, User.class, Consumer.class); + ctor.setAccessible(true); + return ctor.newInstance(addon, user, action); + } + + private int getCompletionValue(MultiplePanel panel) throws Exception { + Field field = MultiplePanel.class.getDeclaredField("completionValue"); + field.setAccessible(true); + return field.getInt(panel); + } + + private void setCompletionValue(MultiplePanel panel, int value) throws Exception { + Field field = MultiplePanel.class.getDeclaredField("completionValue"); + field.setAccessible(true); + field.setInt(panel, value); + } + + private PanelItem callCreateIncreaseButton(MultiplePanel panel, + ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) throws Exception { + Method method = MultiplePanel.class.getDeclaredMethod("createIncreaseButton", + ItemTemplateRecord.class, TemplatedPanel.ItemSlot.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, template, slot); + } + + private PanelItem callCreateReduceButton(MultiplePanel panel, + ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) throws Exception { + Method method = MultiplePanel.class.getDeclaredMethod("createReduceButton", + ItemTemplateRecord.class, TemplatedPanel.ItemSlot.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, template, slot); + } + + private PanelItem callCreateValueButton(MultiplePanel panel, + ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) throws Exception { + Method method = MultiplePanel.class.getDeclaredMethod("createValueButton", + ItemTemplateRecord.class, TemplatedPanel.ItemSlot.class); + method.setAccessible(true); + return (PanelItem) method.invoke(panel, template, slot); + } + + @Test + void testDefaultCompletionValueIsOne() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + assertEquals(1, getCompletionValue(panel)); + } + + @Test + void testCreateIncreaseButton() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + + Map dataMap = new HashMap<>(); + dataMap.put("value", 5); + ItemTemplateRecord template = PanelTestHelper.createTemplate( + new ItemStack(Material.PAPER), "Title", "Desc [number]", + dataMap, Collections.emptyList()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateIncreaseButton(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateReduceButton() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + + Map dataMap = new HashMap<>(); + dataMap.put("value", 5); + ItemTemplateRecord template = PanelTestHelper.createTemplate( + new ItemStack(Material.PAPER), "Title", "Desc [number]", + dataMap, Collections.emptyList()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateReduceButton(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateValueButton() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + + Map dataMap = new HashMap<>(); + dataMap.put("value", 1); + ItemTemplateRecord template = PanelTestHelper.createTemplate( + new ItemStack(Material.PAPER), "Title", "Desc [number]", + dataMap, Collections.emptyList()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateValueButton(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateIncreaseButtonWithNullIcon() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + + Map dataMap = new HashMap<>(); + dataMap.put("value", 1); + ItemTemplateRecord template = PanelTestHelper.createEmptyTemplate(dataMap); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateIncreaseButton(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateReduceButtonWithNullIcon() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + + Map dataMap = new HashMap<>(); + dataMap.put("value", 1); + ItemTemplateRecord template = PanelTestHelper.createEmptyTemplate(dataMap); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateReduceButton(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCreateIncreaseButtonDefaultValue() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + + ItemTemplateRecord template = PanelTestHelper.createTemplate( + new ItemStack(Material.PAPER), "Title", "Desc", + new HashMap<>(), Collections.emptyList()); + TemplatedPanel.ItemSlot slot = PanelTestHelper.createItemSlot(0, new HashMap<>()); + + PanelItem item = callCreateIncreaseButton(panel, template, slot); + assertNotNull(item); + } + + @Test + void testCompletionValueSetAndGet() throws Exception { + @SuppressWarnings("unchecked") + Consumer action = mock(Consumer.class); + MultiplePanel panel = createPanel(action); + setCompletionValue(panel, 10); + assertEquals(10, getCompletionValue(panel)); + } +} diff --git a/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTest.java b/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTest.java index 89c2dd64..2de826e6 100644 --- a/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTest.java +++ b/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTest.java @@ -1,8 +1,8 @@ package world.bentobox.challenges.tasks; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; @@ -12,7 +12,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -23,328 +22,178 @@ import java.util.Set; import java.util.UUID; -import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Statistic; import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.entity.Player.Spigot; -import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; import org.bukkit.util.BoundingBox; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.stubbing.Answer; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; import net.md_5.bungee.api.chat.TextComponent; -import world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.api.addons.AddonDescription; -import world.bentobox.bentobox.api.addons.GameModeAddon; -import world.bentobox.bentobox.api.configuration.WorldSettings; -import world.bentobox.bentobox.api.user.User; -import world.bentobox.bentobox.database.objects.Island; -import world.bentobox.bentobox.managers.AddonsManager; -import world.bentobox.bentobox.managers.IslandWorldManager; -import world.bentobox.bentobox.managers.IslandsManager; -import world.bentobox.bentobox.managers.LocalesManager; -import world.bentobox.bentobox.managers.PlaceholdersManager; -import world.bentobox.bentobox.util.Util; +import world.bentobox.bentobox.hooks.VaultHook; +import world.bentobox.challenges.AbstractChallengesTest; import world.bentobox.challenges.ChallengesAddon; -import world.bentobox.challenges.config.Settings; import world.bentobox.challenges.database.object.Challenge; import world.bentobox.challenges.database.object.Challenge.ChallengeType; import world.bentobox.challenges.database.object.ChallengeLevel; import world.bentobox.challenges.database.object.requirements.InventoryRequirements; import world.bentobox.challenges.database.object.requirements.IslandRequirements; +import world.bentobox.challenges.database.object.requirements.OtherRequirements; +import world.bentobox.challenges.database.object.requirements.StatisticRequirements; +import world.bentobox.challenges.database.object.requirements.StatisticRequirements.StatisticRec; import world.bentobox.challenges.managers.ChallengesManager; import world.bentobox.challenges.tasks.TryToComplete.ChallengeResult; +import world.bentobox.level.Level; /** * @author tastybento - * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class, BentoBox.class, Util.class }) -public class TryToCompleteTest { - - // Constants - private static final String GAME_MODE_NAME = "BSkyBlock"; - private static final String[] NAMES = { "adam", "ben", "cara", "dave", "ed", "frank", "freddy", "george", "harry", - "ian", "joe" }; - - private TryToComplete ttc; - private Challenge challenge; - @Mock - private ChallengesAddon addon; - @Mock - private User user; - @Mock - private World world; - private final String topLabel = "island"; - private final String permissionPrefix = "perm."; - - @Mock - private ChallengesManager cm; - @Mock - private BentoBox plugin; - @Mock - private GameModeAddon gameMode; - @Mock - private AddonsManager am; - @Mock - private IslandsManager im; - @Mock - private Island island; - @Mock - private Player player; - @Mock - private Settings settings; - @Mock - private WorldSettings mySettings; - @Mock - private @Nullable PlayerInventory inv; - private final ItemStack[] contents = {}; - @Mock - private BoundingBox bb; - private Set onlinePlayers; - @Mock - private Spigot spigot; - - /** - */ - @Before - public void setUp() { - // Set up plugin - Whitebox.setInternalState(BentoBox.class, "instance", plugin); - when(addon.getPlugin()).thenReturn(plugin); - // World - when(user.getWorld()).thenReturn(world); - when(world.getName()).thenReturn("world"); - when(world.getEnvironment()).thenReturn(Environment.NORMAL); - - // Addons manager - when(plugin.getAddonsManager()).thenReturn(am); - // One game mode - when(am.getGameModeAddons()).thenReturn(Collections.singletonList(gameMode)); - AddonDescription desc2 = new AddonDescription.Builder("bentobox", GAME_MODE_NAME, "1.3").description("test") - .authors("tasty").build(); - when(gameMode.getDescription()).thenReturn(desc2); - - // Challenge Level - @NonNull - ChallengeLevel level = new ChallengeLevel(); - String levelName = GAME_MODE_NAME + "_novice"; - level.setUniqueId(levelName); - level.setFriendlyName("Novice"); - // Set up challenge - String uuid = UUID.randomUUID().toString(); - challenge = new Challenge(); - challenge.setUniqueId(GAME_MODE_NAME + "_" + uuid); - challenge.setFriendlyName("name"); - challenge.setLevel(GAME_MODE_NAME + "_novice"); - challenge.setDescription(Collections.singletonList("A description")); - challenge.setChallengeType(ChallengeType.INVENTORY_TYPE); - challenge.setDeployed(true); - challenge.setIcon(new ItemStack(Material.EMERALD)); - challenge.setEnvironment(Collections.singleton(World.Environment.NORMAL)); - challenge.setLevel(levelName); - challenge.setRepeatable(true); - challenge.setMaxTimes(10); - InventoryRequirements req = new InventoryRequirements(); - - challenge.setRequirements(req); - // Util - PowerMockito.mockStatic(Util.class); - when(Util.getWorld(any())).thenReturn(world); - when(Util.prettifyText(anyString())).thenCallRealMethod(); - when(Util.stripSpaceAfterColorCodes(anyString())).thenCallRealMethod(); - when(Util.translateColorCodes(anyString())) - .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); - - // Island World Manager - IslandWorldManager iwm = mock(IslandWorldManager.class); - when(plugin.getIWM()).thenReturn(iwm); - Optional optionalGameMode = Optional.of(gameMode); - when(iwm.getAddon(any())).thenReturn(optionalGameMode); - when(iwm.getIslandDistance(any())).thenReturn(400); - when(iwm.inWorld(any(World.class))).thenReturn(true); - - // Island Manager - when(addon.getIslands()).thenReturn(im); - Optional opIsland = Optional.of(island); - when(im.getIslandAt(any())).thenReturn(opIsland); - when(im.getIsland(any(), any(User.class))).thenReturn(island); - // Player is on island - when(im.locationIsOnIsland(any(), any())).thenReturn(true); - // Island flags - everything is allowed by default - when(island.isAllowed(any(), any())).thenReturn(true); - // Island - - @Nullable - Location loc = mock(Location.class); - when(loc.toString()).thenReturn("center"); - when(island.getCenter()).thenReturn(loc); - - // Challenges Manager - when(addon.getChallengesManager()).thenReturn(cm); - // All levels unlocked by default - when(cm.isLevelUnlocked(any(), any(), any())).thenReturn(true); - // Player has done this challenge 3 times (default max is 10) - when(cm.getChallengeTimes(any(), any(), any(Challenge.class))).thenReturn(3L); - - // User has all perms by default - when(user.hasPermission(anyString())).thenReturn(true); - when(user.getPlayer()).thenReturn(player); - UUID uniqueId = UUID.randomUUID(); - when(player.getUniqueId()).thenReturn(uniqueId); - when(player.spigot()).thenReturn(spigot); - when(user.getUniqueId()).thenReturn(uniqueId); - when(user.getTranslation(anyString())) - .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); - when(user.getTranslation(anyString(), anyString())) - .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); - when(user.getTranslationOrNothing(anyString())) - .thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); - when(user.getName()).thenReturn("tastybento"); - User.getInstance(player); - @Nullable - Location userLoc = mock(Location.class); - when(userLoc.toString()).thenReturn("location"); - when(user.getLocation()).thenReturn(userLoc); - when(user.getInventory()).thenReturn(inv); - when(inv.getContents()).thenReturn(contents); - when(player.getBoundingBox()).thenReturn(bb); - when(bb.clone()).thenReturn(bb); - when(bb.toString()).thenReturn("BoundingBox"); - // Locales - User.setPlugin(plugin); - LocalesManager lm = mock(LocalesManager.class); - when(plugin.getLocalesManager()).thenReturn(lm); - when(lm.get(any(), any())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); - when(lm.get(any(), any())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); - PlaceholdersManager phm = mock(PlaceholdersManager.class); - when(plugin.getPlaceholdersManager()).thenReturn(phm); - when(phm.replacePlaceholders(any(), any())) - .thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); - - // Survival by default - when(player.getGameMode()).thenReturn(GameMode.SURVIVAL); - - // Addon - when(addon.getChallengesSettings()).thenReturn(settings); - when(settings.isBroadcastMessages()).thenReturn(true); - - // Bukkit - online players - Map online = new HashMap<>(); - - onlinePlayers = new HashSet<>(); - for (String name : NAMES) { - Player p1 = mock(Player.class); - UUID uuid2 = UUID.randomUUID(); - when(p1.getUniqueId()).thenReturn(uuid2); - when(p1.getName()).thenReturn(name); - online.put(uuid2, name); - onlinePlayers.add(p1); - } - PowerMockito.mockStatic(Bukkit.class); - when(Bukkit.getOnlinePlayers()).then((Answer>) invocation -> Set.of(player)); - - // World settings - Map map = new HashMap<>(); - when(mySettings.getWorldFlags()).thenReturn(map); - when(iwm.getWorldSettings(any())).thenReturn(mySettings); - ChallengesAddon.CHALLENGES_WORLD_PROTECTION.setSetting(world, true); - - // ItemFactory - ItemFactory itemFactory = mock(ItemFactory.class); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); - - } - - @After - public void tearDown() throws IOException { - User.clearUsers(); - Mockito.framework().clearInlineMocks(); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#TryToComplete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testTryToCompleteChallengesAddonUserChallengeWorldStringString() { - ttc = new TryToComplete(addon, user, challenge, world, topLabel, permissionPrefix); - verify(addon).getChallengesManager(); - - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringNotDeployed() { - challenge.setDeployed(false); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.not-deployed")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringWrongWorld() { - challenge.setUniqueId("test"); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("general.errors.wrong-world")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringNotOnIsland() { - ChallengesAddon.CHALLENGES_WORLD_PROTECTION.setSetting(world, true); - when(im.locationIsOnIsland(any(Player.class), any(Location.class))).thenReturn(false); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.not-on-island")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringNotOnIslandButOk() { - ChallengesAddon.CHALLENGES_WORLD_PROTECTION.setSetting(world, false); - when(im.locationIsOnIsland(any(Player.class), any(Location.class))).thenReturn(false); - assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), - eq("name")); - } - - /** - * Test method for {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ +public class TryToCompleteTest extends AbstractChallengesTest { + + // Constants + private static final String[] NAMES = { "adam", "ben", "cara", "dave", "ed", "frank", "freddy", "george", "harry", + "ian", "joe" }; + + private TryToComplete ttc; + private Challenge challenge; + private final String topLabel = "island"; + private final String permissionPrefix = "perm."; + private final ItemStack[] contents = {}; + + @Override + @BeforeEach + public void setUp() { + super.setUp(); + + // Challenge Level + @NonNull + ChallengeLevel level = new ChallengeLevel(); + String levelName = GAME_MODE_NAME + "_novice"; + level.setUniqueId(levelName); + level.setFriendlyName("Novice"); + + // Set up challenge + String uuid = UUID.randomUUID().toString(); + challenge = new Challenge(); + challenge.setUniqueId(GAME_MODE_NAME + "_" + uuid); + challenge.setFriendlyName("name"); + challenge.setLevel(GAME_MODE_NAME + "_novice"); + challenge.setDescription(Collections.singletonList("A description")); + challenge.setChallengeType(ChallengeType.INVENTORY_TYPE); + challenge.setDeployed(true); + challenge.setIcon(new ItemStack(Material.EMERALD)); + challenge.setEnvironment(Collections.singleton(World.Environment.NORMAL)); + challenge.setLevel(levelName); + challenge.setRepeatable(true); + challenge.setMaxTimes(10); + InventoryRequirements req = new InventoryRequirements(); + challenge.setRequirements(req); + + // Override inventory contents to use the local empty array + when(inv.getContents()).thenReturn(contents); + + // Bukkit - online players + Set onlinePlayers = new HashSet<>(); + for (String name : NAMES) { + Player p1 = mock(Player.class); + UUID uuid2 = UUID.randomUUID(); + when(p1.getUniqueId()).thenReturn(uuid2); + when(p1.getName()).thenReturn(name); + onlinePlayers.add(p1); + } + } + + @Override + @AfterEach + public void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + private void setupOtherChallenge(OtherRequirements req) { + challenge.setChallengeType(ChallengeType.OTHER_TYPE); + challenge.setRequirements(req); + } + + private void setupStatisticChallenge(List recs) { + challenge.setChallengeType(ChallengeType.STATISTIC_TYPE); + StatisticRequirements req = new StatisticRequirements(); + req.setStatisticList(recs); + challenge.setRequirements(req); + } + + private VaultHook mockEconomy(boolean has, double balance) { + VaultHook vault = mock(VaultHook.class); + when(addon.isEconomyProvided()).thenReturn(true); + when(addon.getEconomyProvider()).thenReturn(vault); + when(vault.has(any(), any(double.class))).thenReturn(has); + when(vault.getBalance(any())).thenReturn(balance); + return vault; + } + + private Level mockLevelAddon(long islandLevel) { + Level levelAddon = mock(Level.class); + when(addon.isLevelProvided()).thenReturn(true); + when(addon.getLevelAddon()).thenReturn(levelAddon); + when(levelAddon.getIslandLevel(any(), any())).thenReturn(islandLevel); + return levelAddon; + } + + // ------------------------------------------------------------------------- + // Existing tests + // ------------------------------------------------------------------------- + + @Test + public void testTryToCompleteChallengesAddonUserChallengeWorldStringString() { + ttc = new TryToComplete(addon, user, challenge, world, topLabel, permissionPrefix); + verify(addon).getChallengesManager(); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringNotDeployed() { + challenge.setDeployed(false); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-deployed")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringWrongWorld() { + challenge.setUniqueId("test"); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("general.errors.wrong-world")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringNotOnIsland() { + ChallengesAddon.CHALLENGES_WORLD_PROTECTION.setSetting(world, true); + when(im.locationIsOnIsland(any(Player.class), any(Location.class))).thenReturn(false); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.not-on-island")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringNotOnIslandButOk() { + ChallengesAddon.CHALLENGES_WORLD_PROTECTION.setSetting(world, false); + when(im.locationIsOnIsland(any(Player.class), any(Location.class))).thenReturn(false); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), + eq("name")); + } + @Test public void testCompleteChallengesAddonUserChallengeWorldStringStringLevelNotUnlocked() { when(cm.isLevelUnlocked(any(), any(), any())).thenReturn(false); @@ -352,35 +201,24 @@ public void testCompleteChallengesAddonUserChallengeWorldStringStringLevelNotUnl verify(user).getTranslation(any(World.class), eq("challenges.errors.challenge-level-not-available")); } - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringNotRepeatable() { - challenge.setRepeatable(false); - when(cm.isChallengeComplete(any(User.class), any(), any())).thenReturn(true); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.not-repeatable")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringNotRepeatableFirstTime() { - challenge.setRepeatable(false); - challenge.setMaxTimes(0); - when(cm.getChallengeTimes(any(), any(), any(Challenge.class))).thenReturn(0L); - assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), - eq("name")); - } - - /** - * Test method for {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringNotRepeatable() { + challenge.setRepeatable(false); + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(true); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-repeatable")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringNotRepeatableFirstTime() { + challenge.setRepeatable(false); + challenge.setMaxTimes(0); + when(cm.getChallengeTimes(any(), any(), any(Challenge.class))).thenReturn(0L); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), + eq("name")); + } + @Test public void testCompleteChallengesAddonUserChallengeWorldStringStringNoRank() { when(island.isAllowed(any(), any())).thenReturn(false); @@ -388,354 +226,620 @@ public void testCompleteChallengesAddonUserChallengeWorldStringStringNoRank() { verify(user).getTranslation(any(World.class), eq("challenges.messages.no-rank")); } - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String, int)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIntZero() { - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 0)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.not-valid-integer")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String, int)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIntNegative() { - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, -10)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.not-valid-integer")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String, int)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIntPositiveWrongEnvinonment() { - challenge.setEnvironment(Collections.singleton(Environment.NETHER)); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 100)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.wrong-environment")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String, int)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIntPositiveNoPerm() { - InventoryRequirements req = new InventoryRequirements(); - req.setRequiredPermissions(Collections.singleton("perm-you-dont-have")); - when(user.hasPermission(anyString())).thenReturn(false); - challenge.setRequirements(req); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 100)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.no-permission")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccess() { - assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), - eq("name")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - @Ignore("Method is too large for JVM") - public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccessSingleReq() { - InventoryRequirements req = new InventoryRequirements(); - req.setRequiredItems(Collections.singletonList(new ItemStack(Material.EMERALD_BLOCK))); - challenge.setRequirements(req); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.not-enough-items"), eq("[items]"), - eq("challenges.materials.emerald_block")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - @Ignore("Too big for JVM") - public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccessMultipleReq() { - - InventoryRequirements req = new InventoryRequirements(); - ItemStack itemStackMock = mock(ItemStack.class); - when(itemStackMock.getAmount()).thenReturn(3); - when(itemStackMock.getType()).thenReturn(Material.EMERALD_BLOCK); - when(itemStackMock.clone()).thenReturn(itemStackMock); - - ItemStack itemStackMock2 = mock(ItemStack.class); - when(itemStackMock2.getType()).thenReturn(Material.ENCHANTED_BOOK); - when(itemStackMock2.getAmount()).thenReturn(10); - when(itemStackMock2.clone()).thenReturn(itemStackMock2); - - ItemStack itemStackMock3 = mock(ItemStack.class); - when(itemStackMock3.getType()).thenReturn(Material.EMERALD_BLOCK); - when(itemStackMock3.getAmount()).thenReturn(15); - when(itemStackMock3.clone()).thenReturn(itemStackMock3); - // itemStackMock and 3 are same type - when(itemStackMock3.isSimilar(eq(itemStackMock))).thenReturn(true); - when(itemStackMock.isSimilar(eq(itemStackMock3))).thenReturn(true); - - req.setRequiredItems(Arrays.asList(itemStackMock, itemStackMock2)); - challenge.setRequirements(req); - ItemStack[] newContents = { itemStackMock3 }; - when(inv.getContents()).thenReturn(newContents); - - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - // Sufficient emerald blocks - verify(user, never()).getTranslation(any(World.class), eq("challenges.errors.not-enough-items"), eq("[items]"), - eq("challenges.materials.emerald_block")); - // Not enough books - verify(user).getTranslation(any(World.class), eq("challenges.errors.not-enough-items"), eq("[items]"), - eq("challenges.materials.enchanted_book")); - } - - /** - * Test method for {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIntZero() { + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 0)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-valid-integer")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIntNegative() { + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, -10)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-valid-integer")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIntPositiveWrongEnvinonment() { + challenge.setEnvironment(Collections.singleton(Environment.NETHER)); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 100)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.wrong-environment")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIntPositiveNoPerm() { + InventoryRequirements req = new InventoryRequirements(); + req.setRequiredPermissions(Collections.singleton("perm-you-dont-have")); + when(user.hasPermission(anyString())).thenReturn(false); + challenge.setRequirements(req); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 100)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.no-permission")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccess() { + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), + eq("name")); + } + + @Test + @Disabled("Method is too large for JVM") + public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccessSingleReq() { + InventoryRequirements req = new InventoryRequirements(); + req.setRequiredItems(Collections.singletonList(new ItemStack(Material.EMERALD_BLOCK))); + challenge.setRequirements(req); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-enough-items"), eq("[items]"), + eq("challenges.materials.emerald_block")); + } + + @Test + @Disabled("Too big for JVM") + public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccessMultipleReq() { + InventoryRequirements req = new InventoryRequirements(); + ItemStack itemStackMock = mock(ItemStack.class); + when(itemStackMock.getAmount()).thenReturn(3); + when(itemStackMock.getType()).thenReturn(Material.EMERALD_BLOCK); + when(itemStackMock.clone()).thenReturn(itemStackMock); + + ItemStack itemStackMock2 = mock(ItemStack.class); + when(itemStackMock2.getType()).thenReturn(Material.ENCHANTED_BOOK); + when(itemStackMock2.getAmount()).thenReturn(10); + when(itemStackMock2.clone()).thenReturn(itemStackMock2); + + ItemStack itemStackMock3 = mock(ItemStack.class); + when(itemStackMock3.getType()).thenReturn(Material.EMERALD_BLOCK); + when(itemStackMock3.getAmount()).thenReturn(15); + when(itemStackMock3.clone()).thenReturn(itemStackMock3); + when(itemStackMock3.isSimilar(eq(itemStackMock))).thenReturn(true); + when(itemStackMock.isSimilar(eq(itemStackMock3))).thenReturn(true); + + req.setRequiredItems(Arrays.asList(itemStackMock, itemStackMock2)); + challenge.setRequirements(req); + ItemStack[] newContents = { itemStackMock3 }; + when(inv.getContents()).thenReturn(newContents); + + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user, never()).getTranslation(any(World.class), eq("challenges.errors.not-enough-items"), eq("[items]"), + eq("challenges.materials.emerald_block")); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-enough-items"), eq("[items]"), + eq("challenges.materials.enchanted_book")); + } + @Test public void testCompleteChallengesAddonUserChallengeWorldStringStringSuccessCreative() { when(player.getGameMode()).thenReturn(GameMode.CREATIVE); assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - // Creative players automatically complete inventory challenges twice - they have infinite inventory verify(user).getTranslation(world, "challenges.messages.you-repeated-challenge-multiple", "[value]", "name", "[count]", "2"); } - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandBBTooLarge() { - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - req.setSearchRadius(1); - challenge.setRequirements(req); - // Trigger big bounding box error - when(bb.getWidthX()).thenReturn(50000D); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(addon).logError( - "BoundingBox is larger than SearchRadius. | BoundingBox: BoundingBox | Search Distance: 1 | Location: location | Center: center | Range: 0"); - verify(bb).expand(1); - - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandSuccessNoEntities() { - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - req.setSearchRadius(1); - challenge.setRequirements(req); - assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), - eq("name")); - - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandFailEntities() { - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - Map requiredEntities = Collections.singletonMap(EntityType.GHAST, 3); - req.setRequiredEntities(requiredEntities); - req.setSearchRadius(1); - challenge.setRequirements(req); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("3"), - eq("[item]"), eq("challenges.entities.ghast.name")); - - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandFailMultipleEntities() { - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - Map requiredEntities = new HashMap<>(); - requiredEntities.put(EntityType.GHAST, 3); - requiredEntities.put(EntityType.CHICKEN, 5); - requiredEntities.put(EntityType.PUFFERFISH, 1); - req.setRequiredEntities(requiredEntities); - req.setSearchRadius(1); - challenge.setRequirements(req); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("3"), - eq("[item]"), eq("challenges.entities.ghast.name")); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("1"), - eq("[item]"), eq("challenges.entities.pufferfish.name")); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("5"), - eq("[item]"), eq("challenges.entities.chicken.name")); - - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandFailPartialMultipleEntities() { - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - Map requiredEntities = new HashMap<>(); - requiredEntities.put(EntityType.GHAST, 3); - requiredEntities.put(EntityType.CHICKEN, 5); - requiredEntities.put(EntityType.PUFFERFISH, 1); - req.setRequiredEntities(requiredEntities); - req.setSearchRadius(1); - challenge.setRequirements(req); - Entity ent = mock(Entity.class); - when(ent.getType()).thenReturn(EntityType.PUFFERFISH); - Location loc = mock(Location.class); - when(ent.getLocation()).thenReturn(loc); - List list = Collections.singletonList(ent); - when(world.getNearbyEntities(any(BoundingBox.class))).thenReturn(list); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("3"), - eq("[item]"), eq("challenges.entities.ghast.name")); - verify(user, never()).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), - eq("1"), eq("[item]"), eq("challenges.entities.pufferfish.name")); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("5"), - eq("[item]"), eq("challenges.entities.chicken.name")); - - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandSuccess() { - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - Map requiredEntities = new HashMap<>(); - requiredEntities.put(EntityType.PUFFERFISH, 1); - req.setRequiredEntities(requiredEntities); - req.setSearchRadius(1); - challenge.setRequirements(req); - Entity ent = mock(Entity.class); - when(ent.getType()).thenReturn(EntityType.PUFFERFISH); - Location loc = mock(Location.class); - when(ent.getLocation()).thenReturn(loc); - List list = Collections.singletonList(ent); - when(world.getNearbyEntities(any(BoundingBox.class))).thenReturn(list); - assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), - eq("name")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandPlayerInOtherEnvironment() { - challenge.setEnvironment(Collections.singleton(Environment.NETHER)); - World netherWorld = mock(World.class); - when(user.getWorld()).thenReturn(netherWorld); - when(netherWorld.getName()).thenReturn("world_nether"); - when(netherWorld.getEnvironment()).thenReturn(Environment.NETHER); - challenge.setChallengeType(ChallengeType.ISLAND_TYPE); - IslandRequirements req = new IslandRequirements(); - Map requiredEntities = new HashMap<>(); - requiredEntities.put(EntityType.PUFFERFISH, 1); - req.setRequiredEntities(requiredEntities); - req.setSearchRadius(1); - challenge.setRequirements(req); - Entity ent = mock(Entity.class); - when(ent.getType()).thenReturn(EntityType.PUFFERFISH); - Location loc = mock(Location.class); - when(ent.getLocation()).thenReturn(loc); - List list = Collections.singletonList(ent); - when(world.getNearbyEntities(any(BoundingBox.class))).thenReturn(list); - when(netherWorld.getNearbyEntities(any(BoundingBox.class))).thenReturn(Collections.emptyList()); - assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); - verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("1"), - eq("[item]"), eq("challenges.entities.pufferfish.name")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#complete(world.bentobox.challenges.ChallengesAddon, world.bentobox.bentobox.api.user.User, world.bentobox.challenges.database.object.Challenge, org.bukkit.World, java.lang.String, java.lang.String, int)}. - */ - @Test - public void testCompleteChallengesAddonUserChallengeWorldStringStringIntMultipleTimesPositiveSuccess() { - // Try to complete 10 times. Already done 3 times, and max is 10, so it should - // be only done 7 times - assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 10)); - verify(user).getTranslation(any(World.class), eq("challenges.messages.you-repeated-challenge-multiple"), - eq("[value]"), eq("name"), eq("[count]"), eq("7")); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#build(int)}. - */ - @Test - public void testBuild() { - this.testTryToCompleteChallengesAddonUserChallengeWorldStringString(); - ChallengeResult result = this.ttc.build(10); - assertTrue(result.isMeetsRequirements()); - } - - /** - * Test method for - * {@link world.bentobox.challenges.tasks.TryToComplete#removeItems(java.util.List, int)}. - */ - @Test - public void testRemoveItemsNothing() { - this.testTryToCompleteChallengesAddonUserChallengeWorldStringString(); - assertTrue(ttc.removeItems(Collections.emptyList(), 1).isEmpty()); - - } - - /** - * Check that spigot sent the message - * @param message - message to check - */ + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandBBTooLarge() { + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + req.setSearchRadius(1); + challenge.setRequirements(req); + when(bb.getWidthX()).thenReturn(50000D); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(addon).logError( + "BoundingBox is larger than SearchRadius. | BoundingBox: BoundingBox | Search Distance: 1 | Location: location | Center: center | Range: 0"); + verify(bb).expand(1); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandSuccessNoEntities() { + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + req.setSearchRadius(1); + challenge.setRequirements(req); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), + eq("name")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandFailEntities() { + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + Map requiredEntities = Collections.singletonMap(EntityType.GHAST, 3); + req.setRequiredEntities(requiredEntities); + req.setSearchRadius(1); + challenge.setRequirements(req); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("3"), + eq("[item]"), eq("challenges.entities.ghast.name")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandFailMultipleEntities() { + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + Map requiredEntities = new HashMap<>(); + requiredEntities.put(EntityType.GHAST, 3); + requiredEntities.put(EntityType.CHICKEN, 5); + requiredEntities.put(EntityType.PUFFERFISH, 1); + req.setRequiredEntities(requiredEntities); + req.setSearchRadius(1); + challenge.setRequirements(req); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("3"), + eq("[item]"), eq("challenges.entities.ghast.name")); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("1"), + eq("[item]"), eq("challenges.entities.pufferfish.name")); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("5"), + eq("[item]"), eq("challenges.entities.chicken.name")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandFailPartialMultipleEntities() { + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + Map requiredEntities = new HashMap<>(); + requiredEntities.put(EntityType.GHAST, 3); + requiredEntities.put(EntityType.CHICKEN, 5); + requiredEntities.put(EntityType.PUFFERFISH, 1); + req.setRequiredEntities(requiredEntities); + req.setSearchRadius(1); + challenge.setRequirements(req); + Entity ent = mock(Entity.class); + when(ent.getType()).thenReturn(EntityType.PUFFERFISH); + Location loc = mock(Location.class); + when(ent.getLocation()).thenReturn(loc); + List list = Collections.singletonList(ent); + when(world.getNearbyEntities(any(BoundingBox.class))).thenReturn(list); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("3"), + eq("[item]"), eq("challenges.entities.ghast.name")); + verify(user, never()).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), + eq("1"), eq("[item]"), eq("challenges.entities.pufferfish.name")); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("5"), + eq("[item]"), eq("challenges.entities.chicken.name")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandSuccess() { + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + Map requiredEntities = new HashMap<>(); + requiredEntities.put(EntityType.PUFFERFISH, 1); + req.setRequiredEntities(requiredEntities); + req.setSearchRadius(1); + challenge.setRequirements(req); + Entity ent = mock(Entity.class); + when(ent.getType()).thenReturn(EntityType.PUFFERFISH); + Location loc = mock(Location.class); + when(ent.getLocation()).thenReturn(loc); + List list = Collections.singletonList(ent); + when(world.getNearbyEntities(any(BoundingBox.class))).thenReturn(list); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.you-completed-challenge"), eq("[value]"), + eq("name")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIslandPlayerInOtherEnvironment() { + challenge.setEnvironment(Collections.singleton(Environment.NETHER)); + World netherWorld = mock(World.class); + when(user.getWorld()).thenReturn(netherWorld); + when(netherWorld.getName()).thenReturn("world_nether"); + when(netherWorld.getEnvironment()).thenReturn(Environment.NETHER); + challenge.setChallengeType(ChallengeType.ISLAND_TYPE); + IslandRequirements req = new IslandRequirements(); + Map requiredEntities = new HashMap<>(); + requiredEntities.put(EntityType.PUFFERFISH, 1); + req.setRequiredEntities(requiredEntities); + req.setSearchRadius(1); + challenge.setRequirements(req); + Entity ent = mock(Entity.class); + when(ent.getType()).thenReturn(EntityType.PUFFERFISH); + Location loc = mock(Location.class); + when(ent.getLocation()).thenReturn(loc); + List list = Collections.singletonList(ent); + when(world.getNearbyEntities(any(BoundingBox.class))).thenReturn(list); + when(netherWorld.getNearbyEntities(any(BoundingBox.class))).thenReturn(Collections.emptyList()); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.you-still-need"), eq("[amount]"), eq("1"), + eq("[item]"), eq("challenges.entities.pufferfish.name")); + } + + @Test + public void testCompleteChallengesAddonUserChallengeWorldStringStringIntMultipleTimesPositiveSuccess() { + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 10)); + verify(user).getTranslation(any(World.class), eq("challenges.messages.you-repeated-challenge-multiple"), + eq("[value]"), eq("name"), eq("[count]"), eq("7")); + } + + @Test + public void testBuild() { + this.testTryToCompleteChallengesAddonUserChallengeWorldStringString(); + ChallengeResult result = this.ttc.build(10); + assertTrue(result.isMeetsRequirements()); + } + + @Test + public void testRemoveItemsNothing() { + this.testTryToCompleteChallengesAddonUserChallengeWorldStringString(); + assertTrue(ttc.removeItems(Collections.emptyList(), 1).isEmpty()); + } + public void checkSpigotMessage(String expectedMessage) { checkSpigotMessage(expectedMessage, 1); } public void checkSpigotMessage(String expectedMessage, int expectedOccurrences) { - // Capture the argument passed to spigot().sendMessage(...) if messages are sent ArgumentCaptor captor = ArgumentCaptor.forClass(TextComponent.class); - - // Verify that sendMessage() was called at least 0 times (capture any sent messages) verify(spigot, atLeast(0)).sendMessage(captor.capture()); - - // Get all captured TextComponents List capturedMessages = captor.getAllValues(); + long actualOccurrences = capturedMessages.stream().map(component -> component.toLegacyText()) + .filter(messageText -> messageText.contains(expectedMessage)) + .count(); + assertEquals(expectedOccurrences, actualOccurrences, + "Expected message occurrence mismatch: " + expectedMessage); + } + + // ------------------------------------------------------------------------- + // OTHER_TYPE tests + // ------------------------------------------------------------------------- + + @Test + public void testOtherTypeSuccessNoRequirements() { + OtherRequirements req = new OtherRequirements(); + setupOtherChallenge(req); + // Stub PAPI hook absent so the check is skipped + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + @Test + public void testOtherTypeFailIslandLevelNoAddon() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredIslandLevel(100); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.missing-addon")); + } + + @Test + public void testOtherTypeFailMoneyNoEconomy() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredMoney(100.0); + setupOtherChallenge(req); + when(addon.isEconomyProvided()).thenReturn(false); + when(addon.isLevelProvided()).thenReturn(false); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.missing-addon")); + } + + @Test + public void testOtherTypeFailMoneyInsufficient() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredMoney(100.0); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + mockEconomy(false, 50.0); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-enough-money"), eq("[value]"), + eq("100.0")); + } + + @Test + public void testOtherTypeSuccessMoney() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredMoney(50.0); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + mockEconomy(true, 100.0); + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + @Test + public void testOtherTypeFailExperienceInsufficient() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredExperience(100); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + when(player.getTotalExperience()).thenReturn(50); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.not-enough-experience"), eq("[value]"), + eq("100")); + } + + @Test + public void testOtherTypeSuccessExperienceCreative() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredExperience(100); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + when(player.getTotalExperience()).thenReturn(0); + when(player.getGameMode()).thenReturn(GameMode.CREATIVE); + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + @Test + public void testOtherTypeFailIslandLevelInsufficient() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredIslandLevel(100); + req.setRequiredMoney(0); + setupOtherChallenge(req); + mockLevelAddon(50); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.island-level"), eq("[number]"), + eq("100")); + } + + @Test + public void testOtherTypeSuccessIslandLevel() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredIslandLevel(50); + req.setRequiredMoney(0); + setupOtherChallenge(req); + mockLevelAddon(100); + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + @Test + public void testOtherTypeFulfillTakesMoney() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredMoney(50.0); + req.setTakeMoney(true); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + VaultHook vault = mockEconomy(true, 100.0); + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(vault).withdraw(eq(user), eq(50.0)); + } + + @Test + public void testOtherTypeFulfillTakesExperience() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredExperience(30); + req.setTakeExperience(true); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + when(player.getTotalExperience()).thenReturn(100); + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(player).setTotalExperience(70); + } + + @Test + public void testOtherTypeFulfillCreativeSkipsXpTake() { + OtherRequirements req = new OtherRequirements(); + req.setRequiredExperience(30); + req.setTakeExperience(true); + setupOtherChallenge(req); + when(addon.isLevelProvided()).thenReturn(false); + when(player.getTotalExperience()).thenReturn(100); + when(player.getGameMode()).thenReturn(GameMode.CREATIVE); + when(plugin.getHooks()).thenReturn(mock(world.bentobox.bentobox.managers.HooksManager.class)); + when(plugin.getHooks().getHook("PlaceholderAPI")).thenReturn(Optional.empty()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(player, never()).setTotalExperience(any(int.class)); + } + + // ------------------------------------------------------------------------- + // STATISTIC_TYPE tests + // ------------------------------------------------------------------------- + + @Test + public void testStatisticTypeEmptyRequirements() { + setupStatisticChallenge(Collections.emptyList()); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + @Test + public void testStatisticTypeSuccessUntyped() { + StatisticRec rec = new StatisticRec(Statistic.JUMP, null, null, 10, false); + setupStatisticChallenge(List.of(rec)); + when(cm.getStatisticData(any(), any(), eq(Statistic.JUMP))).thenReturn(15); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + @Test + public void testStatisticTypeFailUntypedInsufficient() { + StatisticRec rec = new StatisticRec(Statistic.JUMP, null, null, 10, false); + setupStatisticChallenge(List.of(rec)); + when(cm.getStatisticData(any(), any(), eq(Statistic.JUMP))).thenReturn(5); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.requirement-not-met"), + eq("[number]"), eq("10"), eq("[statistic]"), anyString(), eq("[value]"), eq("5")); + } + + @Test + public void testStatisticTypeSuccessItemType() { + StatisticRec rec = new StatisticRec(Statistic.MINE_BLOCK, null, Material.STONE, 20, false); + setupStatisticChallenge(List.of(rec)); + when(cm.getStatisticData(any(), any(), eq(Statistic.MINE_BLOCK), eq(Material.STONE))).thenReturn(25); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } - // Count the number of occurrences of the expectedMessage in the captured messages - long actualOccurrences = capturedMessages.stream().map(component -> component.toLegacyText()) // Convert each TextComponent to plain text - .filter(messageText -> messageText.contains(expectedMessage)) // Check if the message contains the expected text - .count(); // Count how many times the expected message appears + @Test + public void testStatisticTypeFailItemInsufficient() { + StatisticRec rec = new StatisticRec(Statistic.MINE_BLOCK, null, Material.STONE, 20, false); + setupStatisticChallenge(List.of(rec)); + when(cm.getStatisticData(any(), any(), eq(Statistic.MINE_BLOCK), eq(Material.STONE))).thenReturn(5); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.requirement-not-met-material"), + eq("[number]"), eq("20"), eq("[statistic]"), anyString(), eq("[material]"), anyString(), + eq("[value]"), eq("5")); + } - // Assert that the number of occurrences matches the expectedOccurrences - assertEquals("Expected message occurrence mismatch: " + expectedMessage, expectedOccurrences, - actualOccurrences); + @Test + public void testStatisticTypeSuccessEntityType() { + StatisticRec rec = new StatisticRec(Statistic.KILL_ENTITY, EntityType.ZOMBIE, null, 5, false); + setupStatisticChallenge(List.of(rec)); + when(cm.getStatisticData(any(), any(), eq(Statistic.KILL_ENTITY), eq(EntityType.ZOMBIE))).thenReturn(10); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); } + @Test + public void testStatisticTypeFailEntityInsufficient() { + StatisticRec rec = new StatisticRec(Statistic.KILL_ENTITY, EntityType.ZOMBIE, null, 5, false); + setupStatisticChallenge(List.of(rec)); + when(cm.getStatisticData(any(), any(), eq(Statistic.KILL_ENTITY), eq(EntityType.ZOMBIE))).thenReturn(2); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.requirement-not-met-entity"), + eq("[number]"), eq("5"), eq("[statistic]"), anyString(), eq("[entity]"), anyString(), + eq("[value]"), eq("2")); + } + + @Test + public void testStatisticTypeMultipleMixed() { + StatisticRec rec1 = new StatisticRec(Statistic.JUMP, null, null, 10, false); + StatisticRec rec2 = new StatisticRec(Statistic.KILL_ENTITY, EntityType.ZOMBIE, null, 5, false); + setupStatisticChallenge(List.of(rec1, rec2)); + when(cm.getStatisticData(any(), any(), eq(Statistic.JUMP))).thenReturn(15); + when(cm.getStatisticData(any(), any(), eq(Statistic.KILL_ENTITY), eq(EntityType.ZOMBIE))).thenReturn(10); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + // ------------------------------------------------------------------------- + // Timeout tests + // ------------------------------------------------------------------------- + + @Test + public void testTimeoutBreached() { + challenge.setTimeout(60000); + when(cm.isBreachingTimeOut(any(), any(), any())).thenReturn(true); + when(cm.getLastCompletionDate(any(), any(), any())).thenReturn(System.currentTimeMillis() - 10000); + assertFalse(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(user).getTranslation(any(World.class), eq("challenges.errors.timeout"), + eq("[timeout]"), anyString(), eq("[wait-time]"), anyString()); + } + + @Test + public void testTimeoutNotBreached() { + challenge.setTimeout(60000); + when(cm.isBreachingTimeOut(any(), any(), any())).thenReturn(false); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + } + + // ------------------------------------------------------------------------- + // Reward distribution tests + // ------------------------------------------------------------------------- + + @Test + public void testFirstTimeRewardMoney() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(false); + challenge.setRewardMoney(100.0); + VaultHook vault = mockEconomy(true, 1000.0); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(vault).deposit(eq(user), eq(100.0)); + } + + @Test + public void testFirstTimeRewardExperience() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(false); + challenge.setRewardExperience(50); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(player).giveExp(50); + } + + @Test + public void testRepeatRewardMoney() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(true); + challenge.setRepeatMoneyReward(25.0); + VaultHook vault = mockEconomy(true, 1000.0); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(vault).deposit(eq(user), eq(25.0)); + } + + @Test + public void testRepeatRewardExperience() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(true); + challenge.setRepeatExperienceReward(10); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(player).giveExp(10); + } + + @Test + public void testMultipleTimesFirstCompletion() { + // First completion with factor > 1: first-time rewards once + repeat rewards (factor-1) times + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(false); + challenge.setRewardMoney(100.0); + challenge.setRepeatMoneyReward(25.0); + challenge.setRewardExperience(50); + challenge.setRepeatExperienceReward(10); + VaultHook vault = mockEconomy(true, 1000.0); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + when(cm.getChallengeTimes(any(), any(), any(Challenge.class))).thenReturn(3L); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix, 5)); + // Factor = 5. First-time: deposit(100), repeat: deposit(25*4=100). Total: 2 deposit calls. + ArgumentCaptor moneyCaptor = ArgumentCaptor.forClass(Double.class); + verify(vault, org.mockito.Mockito.times(2)).deposit(eq(user), moneyCaptor.capture()); + List deposits = moneyCaptor.getAllValues(); + assertEquals(100.0, deposits.get(0)); // first-time reward + assertEquals(100.0, deposits.get(1)); // repeat: 25 * 4 + // First-time: giveExp(50), repeat: giveExp(10*4=40) + ArgumentCaptor xpCaptor = ArgumentCaptor.forClass(Integer.class); + verify(player, org.mockito.Mockito.times(2)).giveExp(xpCaptor.capture()); + List xps = xpCaptor.getAllValues(); + assertEquals(50, xps.get(0)); + assertEquals(40, xps.get(1)); + } + + // ------------------------------------------------------------------------- + // Level completion tests + // ------------------------------------------------------------------------- + + @Test + public void testLevelCompletionTriggered() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(false); + // Non-free challenge with a level + challenge.setLevel(GAME_MODE_NAME + "_novice"); + ChallengeLevel lvl = new ChallengeLevel(); + lvl.setUniqueId(GAME_MODE_NAME + "_novice"); + lvl.setFriendlyName("Novice"); + lvl.setRewardExperience(200); + // Stub both overloads: getLevel(String) used in checkIfCanCompleteChallenge, + // getLevel(Challenge) used in build() for level completion check + when(cm.getLevel(eq(GAME_MODE_NAME + "_novice"))).thenReturn(lvl); + when(cm.getLevel(any(Challenge.class))).thenReturn(lvl); + when(cm.isLevelCompleted(any(), any(), any())).thenReturn(false); + when(cm.validateLevelCompletion(any(), any(), any())).thenReturn(true); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(cm).setLevelComplete(any(), any(), eq(lvl)); + verify(player).giveExp(200); + } + + @Test + public void testLevelCompletionAlreadyDone() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(false); + challenge.setLevel(GAME_MODE_NAME + "_novice"); + ChallengeLevel lvl = new ChallengeLevel(); + lvl.setUniqueId(GAME_MODE_NAME + "_novice"); + lvl.setFriendlyName("Novice"); + when(cm.getLevel(eq(GAME_MODE_NAME + "_novice"))).thenReturn(lvl); + when(cm.getLevel(any(Challenge.class))).thenReturn(lvl); + when(cm.isLevelCompleted(any(), any(), any())).thenReturn(true); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(cm, never()).setLevelComplete(any(), any(), any()); + } + + @Test + public void testFreeChallengeNoLevelCheck() { + when(cm.isChallengeComplete(any(world.bentobox.bentobox.api.user.User.class), any(), any())).thenReturn(false); + challenge.setLevel(ChallengesManager.FREE); + when(inv.addItem(any())).thenReturn(new HashMap<>()); + assertTrue(TryToComplete.complete(addon, user, challenge, world, topLabel, permissionPrefix)); + verify(cm, never()).getLevel(any(Challenge.class)); + } } diff --git a/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTestOld.java b/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTestOld.java deleted file mode 100644 index fcf45c41..00000000 --- a/src/test/java/world/bentobox/challenges/tasks/TryToCompleteTestOld.java +++ /dev/null @@ -1,240 +0,0 @@ -package world.bentobox.challenges.tasks; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.Server; -import org.bukkit.inventory.ItemFactory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.PlayerInventory; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -import world.bentobox.bentobox.api.user.User; -import world.bentobox.challenges.ChallengesAddon; - -/** - * @author tastybento - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({ Bukkit.class}) -public class TryToCompleteTestOld { - - private User user; - ItemStack[] stacks = { new ItemStack(Material.PAPER, 32), - new ItemStack(Material.ACACIA_BOAT), - null, - null, - new ItemStack(Material.CACTUS, 32), - new ItemStack(Material.CACTUS, 32), - new ItemStack(Material.CACTUS, 32), - new ItemStack(Material.BRICK_STAIRS, 64), - new ItemStack(Material.BRICK_STAIRS, 64), - new ItemStack(Material.BRICK_STAIRS, 5), - new ItemStack(Material.GOLD_BLOCK, 32) - }; - List required; - private ChallengesAddon addon; - - /** - */ - @Before - public void setUp() { - Server server = mock(Server.class); - PowerMockito.mockStatic(Bukkit.class); - when(Bukkit.getServer()).thenReturn(server); - when(Bukkit.getBukkitVersion()).thenReturn("1.13.2"); - - user = mock(User.class); - PlayerInventory inv = mock(PlayerInventory.class); - when(inv.getContents()).thenReturn(stacks); - when(user.getInventory()).thenReturn(inv); - addon = mock(ChallengesAddon.class); - required = new ArrayList<>(); - - ItemFactory itemFactory = mock(ItemFactory.class); - when(server.getItemFactory()).thenReturn(itemFactory); - - // Test will not work with items that has meta data. - when(itemFactory.getItemMeta(any())).thenReturn(null); - when(itemFactory.equals(null, null)).thenReturn(true); - - when(Bukkit.getItemFactory()).thenReturn(itemFactory); - when(Bukkit.getLogger()).thenReturn(Logger.getAnonymousLogger()); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsSuccess() { - Material requiredMaterial = Material.PAPER; - int requiredQuantity = 21; - - this.required.add(new ItemStack(requiredMaterial, requiredQuantity)); - TryToComplete x = new TryToComplete(this.addon); - x.user(this.user); - Map removed = x.removeItems(this.required, 1); - - assertEquals((int) removed.getOrDefault(new ItemStack(requiredMaterial, 1), 0), requiredQuantity); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsMax() { - Material requiredMaterial = Material.PAPER; - int requiredQuantity = 50; - - this.required.add(new ItemStack(requiredMaterial, requiredQuantity)); - TryToComplete x = new TryToComplete(this.addon); - x.user(this.user); - Map removed = x.removeItems(this.required, 1); - - assertNotEquals((int) removed.getOrDefault(new ItemStack(requiredMaterial, 1), 0), requiredQuantity); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsZero() { - Material requiredMaterial = Material.PAPER; - int requiredQuantity = 0; - - this.required.add(new ItemStack(requiredMaterial, requiredQuantity)); - TryToComplete x = new TryToComplete(this.addon); - x.user(this.user); - Map removed = x.removeItems(this.required, 1); - - assertTrue(removed.isEmpty()); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsSuccessMultiple() { - required.add(new ItemStack(Material.PAPER, 11)); - required.add(new ItemStack(Material.PAPER, 5)); - required.add(new ItemStack(Material.PAPER, 5)); - TryToComplete x = new TryToComplete(addon); - x.user(user); - Map removed = x.removeItems(required, 1); - - assertEquals((int) removed.getOrDefault(new ItemStack(Material.PAPER, 1), 0), 21); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsSuccessMultipleOther() { - required.add(new ItemStack(Material.CACTUS, 5)); - required.add(new ItemStack(Material.PAPER, 11)); - required.add(new ItemStack(Material.PAPER, 5)); - required.add(new ItemStack(Material.PAPER, 5)); - required.add(new ItemStack(Material.CACTUS, 5)); - TryToComplete x = new TryToComplete(addon); - x.user(user); - Map removed = x.removeItems(required, 1); - - assertEquals((int) removed.getOrDefault(new ItemStack(Material.PAPER, 1), 0), 21); - assertEquals((int) removed.getOrDefault(new ItemStack(Material.CACTUS, 1), 0), 10); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsMultipleOtherFail() { - required.add(new ItemStack(Material.ACACIA_FENCE, 5)); - required.add(new ItemStack(Material.ARROW, 11)); - required.add(new ItemStack(Material.STONE, 5)); - required.add(new ItemStack(Material.BAKED_POTATO, 5)); - required.add(new ItemStack(Material.GHAST_SPAWN_EGG, 5)); - TryToComplete x = new TryToComplete(addon); - x.user(user); - Map removed = x.removeItems(required, 1); - assertTrue(removed.isEmpty()); - } - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRemoveItemsFail() { - ItemStack input = new ItemStack(Material.GOLD_BLOCK, 55); - required.add(input); - TryToComplete x = new TryToComplete(addon); - x.user(user); - Map removed = x.removeItems(required, 1); - - // It will remove 32, but not any more - assertEquals((int) removed.getOrDefault(new ItemStack(Material.GOLD_BLOCK, 1), 0), 32); - - // An error will be thrown - Mockito.verify(addon, Mockito.times(1)).logError(Mockito.anyString()); - } - - - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testRequireTwoStacks() { - required.add(new ItemStack(Material.BRICK_STAIRS, 64)); - required.add(new ItemStack(Material.BRICK_STAIRS, 64)); - - TryToComplete x = new TryToComplete(addon); - x.user(user); - Map removed = x.removeItems(required, 1); - - // It should remove both stacks - assertEquals((int) removed.getOrDefault(new ItemStack(Material.BRICK_STAIRS, 1), 0), 128); - } - - - /** - * Test method for {@link TryToComplete#removeItems(java.util.List, int)}. - */ - @SuppressWarnings("deprecation") - @Test - public void testFactorStacks() { - required.add(new ItemStack(Material.BRICK_STAIRS, 32)); - - TryToComplete x = new TryToComplete(addon); - x.user(user); - Map removed = x.removeItems(required, 4); - - // It should remove both stacks - assertEquals((int) removed.getOrDefault(new ItemStack(Material.BRICK_STAIRS, 1), 0), 128); - } -} - diff --git a/src/test/java/world/bentobox/challenges/utils/UtilsTest.java b/src/test/java/world/bentobox/challenges/utils/UtilsTest.java index e355241e..4b385a73 100644 --- a/src/test/java/world/bentobox/challenges/utils/UtilsTest.java +++ b/src/test/java/world/bentobox/challenges/utils/UtilsTest.java @@ -1,8 +1,8 @@ package world.bentobox.challenges.utils; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -21,68 +21,66 @@ import org.bukkit.World; import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.ItemStack; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mock; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; -import org.powermock.reflect.Whitebox; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.addons.AddonDescription; import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.managers.IslandWorldManager; +import world.bentobox.challenges.WhiteBox; import world.bentobox.challenges.config.SettingsUtils.VisibilityMode; /** * @author tastybento - * */ -@RunWith(PowerMockRunner.class) -@PrepareForTest({Bukkit.class}) public class UtilsTest { - + @Mock private IslandWorldManager iwm; @Mock private GameModeAddon gameModeAddon; + private AutoCloseable closeable; + private MockedStatic mockedBukkit; - /** - */ - @Before + @BeforeEach public void setUp() { + closeable = MockitoAnnotations.openMocks(this); // Set up plugin BentoBox plugin = mock(BentoBox.class); - Whitebox.setInternalState(BentoBox.class, "instance", plugin); - + WhiteBox.setInternalState(BentoBox.class, "instance", plugin); + // Mock item factory (for itemstacks) - PowerMockito.mockStatic(Bukkit.class); + mockedBukkit = Mockito.mockStatic(Bukkit.class); ItemFactory itemFactory = mock(ItemFactory.class); - when(Bukkit.getItemFactory()).thenReturn(itemFactory); + mockedBukkit.when(Bukkit::getItemFactory).thenReturn(itemFactory); - // IWM getAddon + // IWM getAddon AddonDescription desc = new AddonDescription.Builder("main", "name", "1.0").build(); when(gameModeAddon.getDescription()).thenReturn(desc); Optional optionalAddon = Optional.of(gameModeAddon); when(iwm.getAddon(any())).thenReturn(optionalAddon); when(plugin.getIWM()).thenReturn(iwm); + } + @AfterEach + public void tearDown() throws Exception { + mockedBukkit.closeOnDemand(); + closeable.close(); + Mockito.framework().clearInlineMocks(); } - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#groupEqualItems(java.util.List, java.util.Set)}. - */ @Test public void testGroupEqualItemsEmpty() { assertTrue(Utils.groupEqualItems(Collections.emptyList(), Collections.emptySet()).isEmpty()); } - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#groupEqualItems(java.util.List, java.util.Set)}. - */ @Test public void testGroupEqualItems() { List requiredItems = new ArrayList<>(); @@ -105,14 +103,10 @@ public void testGroupEqualItems() { requiredItems.add(is2); } List list = Utils.groupEqualItems(requiredItems, ignoreMeta); - // Result should be two stacks stack of 64 doors and 36 doors assertEquals(1, list.size()); verify(is, times(9)).setAmount(2); } - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#groupEqualItems(java.util.List, java.util.Set)}. - */ @Test public void testGroupEqualItemsUnique() { List requiredItems = new ArrayList<>(); @@ -127,38 +121,28 @@ public void testGroupEqualItemsUnique() { for (int i = 0; i < 9; i++) { ItemStack is2 = mock(ItemStack.class); when(is2.getAmount()).thenReturn(1); - when(is2.getType()).thenReturn(Material.values()[i+20]); + when(is2.getType()).thenReturn(Material.values()[i + 20]); when(is2.getMaxStackSize()).thenReturn(64); when(is2.isSimilar(any())).thenReturn(false); when(is2.clone()).thenReturn(is); requiredItems.add(is2); } List list = Utils.groupEqualItems(requiredItems, Collections.emptySet()); - // Result should be two stacks stack of 64 doors and 36 doors assertEquals(10, list.size()); verify(is, never()).setAmount(2); } - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#getGameMode(org.bukkit.World)}. - */ @Test public void testGetGameModeNoGameMode() { when(iwm.getAddon(any())).thenReturn(Optional.empty()); assertNull(Utils.getGameMode(mock(World.class))); } - - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#getGameMode(org.bukkit.World)}. - */ + @Test public void testGetGameMode() { assertEquals("name", Utils.getGameMode(mock(World.class))); } - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#getNextValue(T[], java.lang.Object)}. - */ @Test public void testGetNextValue() { assertEquals(VisibilityMode.HIDDEN, Utils.getNextValue(VisibilityMode.values(), VisibilityMode.VISIBLE)); @@ -166,9 +150,6 @@ public void testGetNextValue() { assertEquals(VisibilityMode.VISIBLE, Utils.getNextValue(VisibilityMode.values(), VisibilityMode.TOGGLEABLE)); } - /** - * Test method for {@link world.bentobox.challenges.utils.Utils#getPreviousValue(T[], java.lang.Object)}. - */ @Test public void testGetPreviousValue() { assertEquals(VisibilityMode.TOGGLEABLE, Utils.getPreviousValue(VisibilityMode.values(), VisibilityMode.VISIBLE));