diff --git a/pom.xml b/pom.xml index ed33b8e..5d4fcc5 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ -LOCAL - 1.2.1 + 1.3.0 BentoBoxWorld_ChunkBlock bentobox-world diff --git a/src/main/java/world/bentobox/chunkblock/ChunkBlockPlaceholders.java b/src/main/java/world/bentobox/chunkblock/ChunkBlockPlaceholders.java index 902c0ec..14ea94d 100644 --- a/src/main/java/world/bentobox/chunkblock/ChunkBlockPlaceholders.java +++ b/src/main/java/world/bentobox/chunkblock/ChunkBlockPlaceholders.java @@ -68,6 +68,7 @@ public ChunkBlockPlaceholders(ChunkBlock addon, placeholdersManager.registerPlaceholder(addon, "island_chunk_credit", this::getIslandChunkCredit); placeholdersManager.registerPlaceholder(addon, "island_ring", this::getIslandRing); placeholdersManager.registerPlaceholder(addon, "island_rings_complete", this::getIslandRingsComplete); + placeholdersManager.registerPlaceholder(addon, "island_next_ring_remaining", this::getNextRingRemaining); placeholdersManager.registerPlaceholder(addon, "island_title", this::getIslandTitle); placeholdersManager.registerPlaceholder(addon, "island_trophies", this::getIslandTrophies); } @@ -167,6 +168,24 @@ public String getIslandRingsComplete(User user) { return getUsersIsland(user).map(i -> String.valueOf(addon.getChunkManager().completedRings(i))).orElse(""); } + /** + * @param user user + * @return how many chunks remain to complete the user's island's next ring, or "0" if + * all rings are done + */ + public String getNextRingRemaining(User user) { + if (user == null || user.getUniqueId() == null) { + return ""; + } + return getUsersIsland(user).map(i -> { + int next = addon.getChunkManager().completedRings(i) + 1; + if (next > addon.getChunkManager().maxRingRadius(i)) { + return "0"; + } + return String.valueOf(addon.getChunkManager().chunksRemainingInRing(i, next)); + }).orElse(""); + } + /** * Get the user's owned island. Returns the island owned by the user, not a team * island they may be visiting as a member. If the user owns more than one island, diff --git a/src/main/java/world/bentobox/chunkblock/Settings.java b/src/main/java/world/bentobox/chunkblock/Settings.java index bc5a338..4defcee 100644 --- a/src/main/java/world/bentobox/chunkblock/Settings.java +++ b/src/main/java/world/bentobox/chunkblock/Settings.java @@ -314,8 +314,9 @@ public class Settings implements WorldSettings { @ConfigComment("Admins can change protection sizes for players individually using /chadmin range set ") @ConfigComment("or set this permission: chunkblock.island.range.") @ConfigComment("ChunkBlock: this must cover the largest unlockable ring of chunks (see chunkblock.max-chunks).") + @ConfigComment("With max-chunks 441 (21x21, ring 10) the minimum needed is 168.") @ConfigEntry(path = "world.protection-range") - private int islandProtectionRange = 240; + private int islandProtectionRange = 168; @ConfigComment("Start islands at these coordinates. This is where new islands will start in the") @ConfigComment("world. These must be a factor of your island distance, but the plugin will auto") diff --git a/src/main/java/world/bentobox/chunkblock/chunks/ChunkManager.java b/src/main/java/world/bentobox/chunkblock/chunks/ChunkManager.java index 0fb1b74..f461f73 100644 --- a/src/main/java/world/bentobox/chunkblock/chunks/ChunkManager.java +++ b/src/main/java/world/bentobox/chunkblock/chunks/ChunkManager.java @@ -207,6 +207,28 @@ public int completedRings(Island island) { return ring; } + /** + * @param island the island + * @param ring the ring radius to check + * @return how many chunks in the ring are still locked; 0 means the ring is complete + */ + public int chunksRemainingInRing(Island island, int ring) { + if (ring <= 0) { + return 0; + } + OneBlockIslands data = addon.getOneBlocksIsland(island); + int missing = 0; + for (int d = -ring; d <= ring; d++) { + if (!data.isChunkUnlocked(d, -ring)) missing++; + if (!data.isChunkUnlocked(d, ring)) missing++; + if (d != -ring && d != ring) { + if (!data.isChunkUnlocked(-ring, d)) missing++; + if (!data.isChunkUnlocked(ring, d)) missing++; + } + } + return missing; + } + /** * @param island the island * @return the island's unlocked chunk offsets in unlock order (x and z are chunk diff --git a/src/main/java/world/bentobox/chunkblock/commands/island/IslandChunksCommand.java b/src/main/java/world/bentobox/chunkblock/commands/island/IslandChunksCommand.java index caa2938..89a6685 100644 --- a/src/main/java/world/bentobox/chunkblock/commands/island/IslandChunksCommand.java +++ b/src/main/java/world/bentobox/chunkblock/commands/island/IslandChunksCommand.java @@ -80,8 +80,17 @@ public boolean execute(User user, String label, List args) { user.sendMessage("chunkblock.chunks.info", "[unlocked]", String.valueOf(unlocked), "[max]", String.valueOf(max), "[credit]", String.valueOf(credit), "[cost]", String.valueOf(cm.getChunkCost())); - user.sendMessage("chunkblock.chunks.rings", "[rings]", String.valueOf(cm.completedRings(island)), "[max]", - String.valueOf(cm.maxRingRadius(island))); + int completedRings = cm.completedRings(island); + int maxRing = cm.maxRingRadius(island); + user.sendMessage("chunkblock.chunks.rings", "[rings]", String.valueOf(completedRings), "[max]", + String.valueOf(maxRing)); + int nextRing = completedRings + 1; + if (nextRing <= maxRing) { + int remaining = cm.chunksRemainingInRing(island, nextRing); + int total = 8 * nextRing; + user.sendMessage("chunkblock.chunks.ring-progress", "[ring]", String.valueOf(nextRing), + "[remaining]", String.valueOf(remaining), "[total]", String.valueOf(total)); + } showMap(user, island, unlocked, max); return true; } diff --git a/src/main/java/world/bentobox/chunkblock/commands/island/IslandLedgerCommand.java b/src/main/java/world/bentobox/chunkblock/commands/island/IslandLedgerCommand.java new file mode 100644 index 0000000..76a61d7 --- /dev/null +++ b/src/main/java/world/bentobox/chunkblock/commands/island/IslandLedgerCommand.java @@ -0,0 +1,127 @@ +package world.bentobox.chunkblock.commands.island; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +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.util.Util; +import world.bentobox.chunkblock.ChunkBlock; +import world.bentobox.chunkblock.activity.ActivityManager; +import world.bentobox.chunkblock.activity.CounterType; + +/** + * /ch ledger — shows each team member's contributions to the island: blocks broken, + * chunks claimed, and rings completed. Reads from the activity counters foundation; + * the ledger itself adds no persistence. + * + * @author tastybento + */ +public class IslandLedgerCommand extends CompositeCommand { + + private static final String REF = "chunkblock.commands.ledger."; + + private ChunkBlock addon; + + public IslandLedgerCommand(CompositeCommand islandCommand, String label, String[] aliases) { + super(islandCommand, label, aliases); + } + + @Override + public void setup() { + setDescription(REF + "description"); + setParametersHelp(REF + "parameters"); + setOnlyPlayer(true); + setPermission("island.ledger"); + addon = getAddon(); + } + + @Override + public boolean canExecute(User user, String label, List args) { + if (!Util.sameWorld(getWorld(), user.getWorld())) { + user.sendMessage("general.errors.wrong-world"); + return false; + } + return true; + } + + @Override + public boolean execute(User user, String label, List args) { + Optional optionalIsland = getIslands().getIslandAt(user.getLocation()); + if (optionalIsland.isEmpty()) { + user.sendMessage("general.errors.not-on-island"); + return false; + } + Island island = optionalIsland.get(); + ActivityManager am = addon.getActivityManager(); + if (am == null) { + return false; + } + + int window = parseWindow(args); + String windowLabel = window <= 0 + ? user.getTranslation(REF + "all-time") + : user.getTranslation(REF + "last-days", "[days]", String.valueOf(window)); + + user.sendMessage(REF + "header", "[window]", windowLabel); + + List rows = buildRows(island, am, window); + if (rows.isEmpty()) { + user.sendMessage(REF + "no-activity"); + return true; + } + + for (MemberRow row : rows) { + user.sendMessage(REF + "row", + "[name]", row.name, + "[blocks]", String.valueOf(row.blocks), + "[chunks]", String.valueOf(row.chunks), + "[rings]", String.valueOf(row.rings)); + } + + long totalBlocks = rows.stream().mapToLong(r -> r.blocks).sum(); + long totalChunks = rows.stream().mapToLong(r -> r.chunks).sum(); + long totalRings = rows.stream().mapToLong(r -> r.rings).sum(); + user.sendMessage(REF + "total", + "[blocks]", String.valueOf(totalBlocks), + "[chunks]", String.valueOf(totalChunks), + "[rings]", String.valueOf(totalRings)); + + return true; + } + + private int parseWindow(List args) { + if (args.isEmpty()) { + return 0; + } + try { + return Math.max(0, Integer.parseInt(args.get(0))); + } catch (NumberFormatException e) { + return 0; + } + } + + private List buildRows(Island island, ActivityManager am, int window) { + List rows = new ArrayList<>(); + for (UUID uuid : am.getContributors(island)) { + long blocks = am.getCount(island, uuid, CounterType.MAGIC_BLOCKS, window); + long chunks = am.getCount(island, uuid, CounterType.CHUNKS_CLAIMED, window) + + am.getCount(island, uuid, CounterType.CHUNKS_RECLAIMED, window); + long rings = am.getCount(island, uuid, CounterType.RINGS_COMPLETED, window); + if (blocks > 0 || chunks > 0 || rings > 0) { + String name = addon.getPlayers().getName(uuid); + rows.add(new MemberRow(name == null || name.isEmpty() ? uuid.toString() : name, + blocks, chunks, rings)); + } + } + rows.sort(Comparator.comparingLong(MemberRow::blocks).reversed()); + return rows; + } + + private record MemberRow(String name, long blocks, long chunks, long rings) { + } +} diff --git a/src/main/java/world/bentobox/chunkblock/commands/island/IslandTitleCommand.java b/src/main/java/world/bentobox/chunkblock/commands/island/IslandTitleCommand.java index 7ea83af..6ac089e 100644 --- a/src/main/java/world/bentobox/chunkblock/commands/island/IslandTitleCommand.java +++ b/src/main/java/world/bentobox/chunkblock/commands/island/IslandTitleCommand.java @@ -60,6 +60,9 @@ public boolean execute(User user, String label, List args) { return false; } if (args.isEmpty()) { + return toggleTitle(user, island); + } + if ("list".equalsIgnoreCase(args.get(0))) { showTitles(user, island); return true; } @@ -105,6 +108,25 @@ private void showTitles(User user, Island island) { } } + private boolean toggleTitle(User user, Island island) { + String active = addon.getTrophyManager().getActiveTitleText(island); + if (!active.isEmpty()) { + addon.getTrophyManager().setActiveTitle(island, null); + user.sendMessage("chunkblock.commands.title.toggled-off", TITLE_VAR, active); + return true; + } + // No active title — try to activate the first earned trophy that carries one + Optional first = addon.getTrophyManager().getEarned(island).stream() + .filter(t -> t.title() != null).findFirst(); + if (first.isEmpty()) { + user.sendMessage("chunkblock.commands.title.none-earned-yet"); + return false; + } + addon.getTrophyManager().setActiveTitle(island, first.get().id()); + user.sendMessage("chunkblock.commands.title.toggled-on", TITLE_VAR, first.get().title()); + return true; + } + @Override public Optional> tabComplete(User user, String alias, List args) { Island island = getIslands().getIsland(getWorld(), user); @@ -112,6 +134,7 @@ public Optional> tabComplete(User user, String alias, List return Optional.empty(); } List options = new ArrayList<>(); + options.add("list"); options.add(CLEAR); addon.getTrophyManager().getEarned(island).stream().filter(t -> t.title() != null) .map(Trophy::id).forEach(options::add); diff --git a/src/main/java/world/bentobox/chunkblock/commands/island/PlayerCommand.java b/src/main/java/world/bentobox/chunkblock/commands/island/PlayerCommand.java index b99d6db..ffbf840 100644 --- a/src/main/java/world/bentobox/chunkblock/commands/island/PlayerCommand.java +++ b/src/main/java/world/bentobox/chunkblock/commands/island/PlayerCommand.java @@ -33,6 +33,8 @@ public void setup() { settings.getSetCountCommand().split(" ")); // Chunk territory info and map new IslandChunksCommand(this, "chunks", new String[] {"chunks"}); + // Contribution ledger + new IslandLedgerCommand(this, "ledger", new String[] {"ledger"}); // Trophy titles new IslandTitleCommand(this, "title", new String[] {"title"}); // Force block respawn diff --git a/src/main/java/world/bentobox/chunkblock/listeners/BossBarListener.java b/src/main/java/world/bentobox/chunkblock/listeners/BossBarListener.java index 9610f78..a065544 100644 --- a/src/main/java/world/bentobox/chunkblock/listeners/BossBarListener.java +++ b/src/main/java/world/bentobox/chunkblock/listeners/BossBarListener.java @@ -198,10 +198,19 @@ private void tryToShowBossBar(UUID uuid, Island island) { int numBlocksToGo = addon.getOneBlockManager().getNextPhaseBlocks(obi); int phaseBlocks = addon.getOneBlockManager().getPhaseBlocks(obi); int done = phaseBlocks - numBlocksToGo; + String titlePrefix = ""; + if (addon.getTrophyManager() != null) { + String activeTitle = addon.getTrophyManager().getActiveTitleText(island); + if (!activeTitle.isEmpty()) { + titlePrefix = user.getTranslationOrNothing("chunkblock.bossbar.title-prefix", + "[title]", activeTitle); + } + } String translation = user.getTranslationOrNothing("chunkblock.bossbar.status", "[togo]", String.valueOf(numBlocksToGo), "[total]", String.valueOf(phaseBlocks), "[done]", String.valueOf(done), "[phase-name]", obi.getPhaseName(), "[percent-done]", Math.round(addon.getOneBlockManager().getPercentageDone(obi)) + "%"); + translation = translation.replace("[island-title]", titlePrefix); bar.setTitle(translation); // Add to user if they don't have it already Player player = Bukkit.getPlayer(uuid); diff --git a/src/main/java/world/bentobox/chunkblock/listeners/LevelListener.java b/src/main/java/world/bentobox/chunkblock/listeners/LevelListener.java index a76f81b..fa1d085 100644 --- a/src/main/java/world/bentobox/chunkblock/listeners/LevelListener.java +++ b/src/main/java/world/bentobox/chunkblock/listeners/LevelListener.java @@ -27,6 +27,7 @@ import world.bentobox.chunkblock.events.ChunkUnlockEvent; import world.bentobox.chunkblock.events.RingCompleteEvent; import world.bentobox.level.events.IslandLevelCalculatedEvent; +import world.bentobox.level.events.IslandPreLevelEvent; /** * Watches island level changes from the Level addon. Levels are chunk currency here: @@ -44,6 +45,27 @@ public LevelListener(ChunkBlock addon) { this.addon = addon; } + /** + * Shrinks the island's protection range to cover only the unlocked chunks so the + * Level addon scans the playable area instead of the entire 240-block default. + * The calculator reads the range in the same tick; the original is restored on + * the next tick. + */ + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onIslandPreLevel(IslandPreLevelEvent e) { + Island island = e.getIsland(); + if (island == null || !addon.inWorld(island.getWorld())) { + return; + } + int ring = addon.getChunkManager().currentRing(island); + int needed = ring * 16 + ChunkManager.CHUNK_CENTER; + int stored = island.getProtectionRange(); + if (needed < stored) { + island.setProtectionRange(needed); + Bukkit.getScheduler().runTask(addon.getPlugin(), () -> island.setProtectionRange(stored)); + } + } + /** * Fires after every island level calculation, before results are saved. Never * cancelled here — we only read the level. @@ -226,6 +248,10 @@ private void rewardRing(Island island, int ring) { "[chunks]", chunkText)); } celebrateRing(island, ring); + if (addon.getActivityManager() != null) { + addon.getActivityManager().recordActivity(island, null, + world.bentobox.chunkblock.activity.CounterType.RINGS_COMPLETED, 1); + } List ownerCommands = addon.getSettings().getRingCommands(); if (!ownerCommands.isEmpty()) { runCommands(ownerCommands, ringText, chunkText, "[owner]", playerName(island.getOwner())); diff --git a/src/main/resources/locales/cs.yml b/src/main/resources/locales/cs.yml index 2557fad..6505acf 100644 --- a/src/main/resources/locales/cs.yml +++ b/src/main/resources/locales/cs.yml @@ -26,9 +26,17 @@ protection: Zobrazuje stav pro každou fázi v Action Baru. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Uzavřít Kusy + description: |- + Hodnost, která může utratit + úroveň kreditu ostrova + aby si nárokovala nové kusy. + hint: "Vaše hodnost nemůže nárokovat kusy pro tento ostrov!" chunkblock: bossbar: title: Bloky zbývající + title-prefix: "[title] | " status: 'Fázové bloky & B [done] & d / & b [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "Fáze: [phase-name] | Bloky: [done] / [total] | Postup: [percent-done]" not-active: "Action Bar není pro tento ostrov aktivní" + trophies: + awarded: "Trofej získána: [name]!" + title-available: "Váš ostrov získal titul [title] — přepínejte jej zapínáním a vypínáním pomocí /ch title." + chunks: + entry-denied: "Ten kus je zamčený." + locked: "Nemůžeš se tam dotknout — kus je zamčený." + claim-hint: "Zasáhni hranici, aby ses nárokoval tento kus za [cost] úroveň(í)! Máš [credit] úroveň(í) kreditu." + claim-confirm: "Nárokovat si tento kus za [cost] úroveň(í)? To ti zanechá [after] úroveň(í) kreditu. Plíž se a zasáhni hranici znovu během [seconds]s pro potvrzení." + no-credit: "Potřebuješ [needed] více úroveň(í) kreditu pro nárok na tento kus." + beyond-limit: "Ten kus je za oblastí ochrany tvého ostrova." + claimed: "Kus nárokován! Tvůj ostrov má nyní [number] kusů. Zbývající kredit: [credit] úroveň(í)." + credit: "Můžeš si nárokovat [count] více kusů! Jdi k své hranici a zasáhni ji kde chceš růst." + relocked: "Úroveň tvého ostrova klesla — [count] kus(y) znovu zamčen(y), nejnovější první. Získej úrovně zpět, abys si je znovu nárokoval!" + ejected: "Kus, ve kterém si byl, byl znovu zamčen, takže jsi byl přesunut do bezpečí." + max-reached: "Tvůj ostrov dosáhl maximální velikosti [number] kusů!" + ring-complete: "Kruh [ring] dokončen! Celý kruh kolem tvého ostrova je tvůj — [chunks] kusů celkem." + ring-broadcast: "Ostrov [name] uzavřel kruh [ring] [chunks] kusů a stále roste!" + rings: "Dokončené kruhy: [rings] z [max]." + ring-progress: "Kruh [ring]: [remaining]/[total] kusů zbývá." + sethome-denied: "Nemůžeš nastavit domov v zamčeném kusu." + info: "Kusy: [unlocked]/[max]. Kredit: [credit] úroveň(í) — kus stojí [cost]." + map: + title: "Území tvého ostrova ([unlocked]/[max] kusů):" + row: "[row]" + legend: "■ tvůj ▣ se dá nárokovat ([cost] úroveň(í) každý) □ zamčený ◎ střed ◆ ty" + you-are-here: "Stojíš na označeném kusu." + dialog: + close: "Zavřít" + tooltip: + center: "Střední kus — tvůj kouzelný blok je zde." + owned: "Kus [x], [z] — tvůj." + claimable: "Kus [x], [z] — se dá nárokovat za [cost] úroveň(í). Jdi na tu hranici a zasáhni ji." + no-credit: "Kus [x], [z] — stojí [cost] úroveň(í). Potřebuješ [needed] více úroveň(í) kreditu." + locked: "Kus [x], [z] — zamčený. Nárokuj si cestu ven k němu." + you-are-here: "Stojíš zde." commands: admin: setcount: @@ -57,6 +100,45 @@ chunkblock: parameters: description: zobrazí v konzoli kontrolu pravděpodobnosti fází see-console: 'Podívejte se do konzoly pro zprávu' + bypass: + description: "přepnout vynucení zámku kusu sebe" + "on": "Teď obchází zámky kusů. Vizuály hranic jsou pro tebe skryté." + "off": "Zámky kusů se na tebe znovu aplikují." + chunks: + parameters: " [reset]" + description: "inspekovat odemčené kusy hráče nebo je znovu zamknout na začátek" + info: "[name]: [number]/[max] kusů, [spent] úroveň(í) utraceno, [credit] kredit." + reset: "Kusy [name] byly znovu zamčeny na pouhý střední kus." + phases: + description: "otevřít editor pořadí fází" + no-index: "Není načten žádný index fází, takže fáze nelze přeuspořádat" + saved: "Pořadí fází uloženo a aplikováno" + save-failed: "Nelze uložit pořadí fází! Chyby najdete v konzoli" + gui: + title: "Pořadí Fází" + info-title: "Jak používat" + instructions: |- + Klikni na fázi, aby si jsi ji zvednul, + pak klikni kde by měla jít. + Pravý klik přepne fázi + zapnuto nebo vypnuto. + repeat: "Po poslední fázi se počet skočí na [number]" + phase-name: "[name]" + start: "Začátek: [number]" + length: "Délka: [number]" + disabled: "Zakázáno" + version-locked: "Potřebuje Minecraft [version]+" + pick-up: "Klikni pro přesunutí" + toggle: "Pravý klik pro přepnutí" + set-length: "Shift+levý klik pro nastavení délky" + drop-here: "Klikni pro upuštění zde" + drop-at-end: "Upustit na konec" + held: "Pohybování: [name]" + put-back: "Klikni pro vrácení" + enter-length: "Zadej novou délku v chatu pro [name] - v současné době je [number] bloků. Zadej cancel pro zachování." + invalid-length: "Délka musí být celé číslo vyšší než 0" + length-cancelled: "Délka nezměněna" + cancel-word: "cancel" count: description: zobrazit počet bloků a fázi info: 'Jste na bloku [number] ve fázi [name]' @@ -85,6 +167,31 @@ chunkblock: description: respawnuje magický blok v situacích, kdy zmizí block-exist: 'Blok existuje, nevyžadoval respawning. Označil jsem to za vás.' block-respawned: 'Blok byl znovu vytvořen.' + chunks: + description: "zobrazit tvoje odemčené kusy a mapu tvého území" + ledger: + description: "zobrazit příspěvky členů týmu" + parameters: "[days]" + header: "Ledger příspěvků ostrova ([window])" + all-time: "celkově" + last-days: "poslední [days] dní" + row: " - [name]: [blocks] bloků, [chunks] kusů, [rings] kruhů" + total: "Celkem: [blocks] bloků, [chunks] kusů, [rings] kruhů" + no-activity: "Zatím nebyla zaznamenána žádná aktivita." + title: + description: "přepínat titul svého ostrova zapínáním/vypínáním, nebo si vybrat jeden" + parameters: "[list | trophy-id | none]" + header: "Trofeje tvého ostrova:" + trophy-entry: " - [name]" + title-entry: " - [name] — titul [title] (/ch title [id])" + none-earned-yet: "Tvůj ostrov si zatím nevydělal žádné trofeje." + active: "Aktivní titul: [title]" + no-active: "Žádný titul není aktivní. Vyber si jeden pomocí /ch title." + set: "Titul tvého ostrova je nyní [title]." + cleared: "Tvůj ostrov už neukazuje titul." + toggled-on: "Titul ostrova [title] se teď zobrazuje." + toggled-off: "Titul ostrova [title] se teď skrývá." + not-earned: "Tvůj ostrov si nevydělal trofej s tímto titulem." phase: insufficient-level: Tvůj ostrov je na příliš nízké úrovni, musí být alespoň [number]. insufficient-funds: Nemáš dostatečné prostředky! Musíš mít alespoň [number]. diff --git a/src/main/resources/locales/de.yml b/src/main/resources/locales/de.yml index be7880a..532e5fd 100644 --- a/src/main/resources/locales/de.yml +++ b/src/main/resources/locales/de.yml @@ -26,9 +26,17 @@ protection: Zeigt einen Status für jede Phase in der Action-Leiste. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Chunks Beanspruchen + description: |- + Rang, der die Levelguthaben + der Insel ausgeben kann, + um neue Chunks zu beanspruchen. + hint: "Dein Rang kann für diese Insel keine Chunks beanspruchen!" chunkblock: bossbar: title: Verbleibende Blöcke + title-prefix: "[title] | " status: 'Phasenblöcke [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "Phase: [phase-name] | Blöcke: [done] / [total] | Fortschritt: [percent-done]" not-active: "Action Bar ist für diese Insel nicht aktiv" + trophies: + awarded: "Trophäe verdient: [name]!" + title-available: "Ihre Insel hat den Titel [title] verdient — schalten Sie ihn mit /ch title ein und aus." + chunks: + entry-denied: "Dieser Chunk ist gesperrt." + locked: "Du kannst das nicht anfassen — der Chunk ist gesperrt." + claim-hint: "Schlag die Grenze, um diesen Chunk für [cost] Level zu beanspruchen! Du hast [credit] Level Guthaben." + claim-confirm: "Diesen Chunk für [cost] Level beanspruchen? Das hinterlässt dir [after] Level Guthaben. Schleichen und schlag die Grenze erneut innerhalb von [seconds]s um zu bestätigen." + no-credit: "Du brauchst [needed] mehr Level Guthaben, um diesen Chunk zu beanspruchen." + beyond-limit: "Dieser Chunk liegt über dem Schutzgebiet deiner Insel hinaus." + claimed: "Chunk beansprucht! Deine Insel hat jetzt [number] Chunks. Verbleibendes Guthaben: [credit] Level." + credit: "Du kannst [count] weitere Chunk(s) beanspruchen! Geh zu deiner Grenze und schlag sie dort, wo du wachsen möchtest." + relocked: "Dein Insellevel ist gesunken — [count] Chunk(s) erneut gesperrt, neueste zuerst. Gewinne die Level zurück, um sie erneut zu beanspruchen!" + ejected: "Der Chunk, in dem du warst, wurde erneut gesperrt, daher wurdest du in Sicherheit verlegt." + max-reached: "Deine Insel hat die maximale Größe von [number] Chunks erreicht!" + ring-complete: "Ring [ring] vollständig! Der ganze Ring um deine Insel gehört dir — [chunks] Chunks insgesamt." + ring-broadcast: "Die Insel von [name] hat Ring [ring] geschlossen — [chunks] Chunks und wächst noch immer!" + rings: "Vervollständigte Ringe: [rings] von [max]." + ring-progress: "Ring [ring]: [remaining]/[total] Chunks bis zum Ende." + sethome-denied: "Du kannst keinen Heimatort in einem gesperrten Chunk setzen." + info: "Chunks: [unlocked]/[max]. Guthaben: [credit] Level — ein Chunk kostet [cost]." + map: + title: "Dein Inselsgebiet ([unlocked]/[max] Chunks):" + row: "[row]" + legend: "■ dein ▣ zu beanspruchen ([cost] Level(s) je) □ gesperrt ◎ Mitte ◆ du" + you-are-here: "Du bist auf dem markierten Chunk." + dialog: + close: "Schließen" + tooltip: + center: "Der mittlere Chunk — dein Zauberblock ist hier." + owned: "Chunk [x], [z] — deiner." + claimable: "Chunk [x], [z] — zu beanspruchen für [cost] Level. Geh zu dieser Grenze und schlag sie." + no-credit: "Chunk [x], [z] — kostet [cost] Level. Du brauchst [needed] mehr Level Guthaben." + locked: "Chunk [x], [z] — gesperrt. Beanspruche deinen Weg dorthin." + you-are-here: "Du stehst hier." commands: admin: setcount: @@ -61,6 +104,45 @@ chunkblock: Zeigen Sie eine Überprüfung der Phasenwahrscheinlichkeiten in der Konsole an see-console: 'Den Bericht finden Sie in der Konsole' + bypass: + description: "Durchsetzung von Chunk-Locks für dich selbst umschalten" + "on": "Du umgehst jetzt Chunk-Locks. Grenzenvisionen sind für dich verborgen." + "off": "Chunk-Locks gelten wieder für dich." + chunks: + parameters: " [reset]" + description: "freigeschaltete Chunks eines Spielers inspizieren oder auf den Anfang zurücksetzen" + info: "[name]: [number]/[max] Chunks, [spent] Level ausgegeben, [credit] Guthaben." + reset: "Chunks von [name] wurden auf nur den mittleren Chunk zurückgesetzt." + phases: + description: "öffne den Editor für die Reihenfolge der Phasen" + no-index: "Kein Phasenindex geladen, daher können Phasen nicht neu geordnet werden" + saved: "Phasenreihenfolge gespeichert und angewendet" + save-failed: "Phasenreihenfolge konnte nicht gespeichert werden! Fehler in der Konsole" + gui: + title: "Reihenfolge der Phasen" + info-title: "Wie man es benutzt" + instructions: |- + Klicke auf eine Phase um sie zu nehmen, + dann klicke wo sie hin sollte. + Rechtsklick schaltet eine Phase + ein oder aus. + repeat: "Nach der letzten Phase springt die Zählung zu [number]" + phase-name: "[name]" + start: "Start: [number]" + length: "Länge: [number]" + disabled: "Deaktiviert" + version-locked: "Benötigt Minecraft [version]+" + pick-up: "Klick um zu verschieben" + toggle: "Rechtsklick zum Umschalten" + set-length: "Shift+Linksklick zum Einstellen der Länge" + drop-here: "Klick um hier zu fallen" + drop-at-end: "Am Ende fallen lassen" + held: "Verschieben: [name]" + put-back: "Klick zum Zurückgeben" + enter-length: "Geben Sie eine neue Länge im Chat für [name] ein - derzeit [number] Blöcke. Geben Sie cancel ein um zu behalten." + invalid-length: "Die Länge muss eine ganze Zahl größer als 0 sein" + length-cancelled: "Länge nicht geändert" + cancel-word: "cancel" count: description: Zeige die Blockanzahl und Phase info: 'Sie befinden sich in der Phase [name] in Block [number]' @@ -91,6 +173,31 @@ chunkblock: verschwindet block-exist: 'in Block existiert, musste nicht neu gestartet werden. Ich habe es für dich markiert.' block-respawned: 'Block wieder aufgetaucht.' + chunks: + description: "zeige deine freigeschalteten Chunks und eine Karte deines Gebiets" + ledger: + description: "zeige die Beiträge der Teammitglieder" + parameters: "[days]" + header: "Inselkontributionsbuch ([window])" + all-time: "die ganze Zeit" + last-days: "letzte [days] Tage" + row: " - [name]: [blocks] Blöcke, [chunks] Chunks, [rings] Ringe" + total: "Gesamt: [blocks] Blöcke, [chunks] Chunks, [rings] Ringe" + no-activity: "Bislang keine Aktivität aufgezeichnet." + title: + description: "den Titel deiner Insel ein/ausschalten oder einen auswählen" + parameters: "[list | trophy-id | none]" + header: "Trophäen deiner Insel:" + trophy-entry: " - [name]" + title-entry: " - [name] — Titel [title] (/ch title [id])" + none-earned-yet: "Deine Insel hat noch keine Trophäen verdient." + active: "Aktiver Titel: [title]" + no-active: "Kein Titel ist aktiv. Wählen Sie einen mit /ch title aus." + set: "Der Titel deiner Insel ist jetzt [title]." + cleared: "Deine Insel zeigt keinen Titel mehr." + toggled-on: "Inseltitel [title] wird jetzt angezeigt." + toggled-off: "Inseltitel [title] ist jetzt verborgen." + not-earned: "Deine Insel hat eine Trophäe mit diesem Titel nicht verdient." phase: insufficient-level: 'Ihr Insellevel ist zu niedrig, um fortzufahren! Es muss [number] sein.' insufficient-funds: 'Ihr Guthaben ist zu gering, um fortzufahren! Sie müssen [number] sein.' diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index bb8d7b0..483e52b 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -54,6 +54,7 @@ chunkblock: ring-complete: "Ring [ring] complete! The whole ring around your island is yours — [chunks] chunks in all." ring-broadcast: "[name]'s island has closed ring [ring] [chunks] chunks and still growing!" rings: "Rings completed: [rings] of [max]." + ring-progress: "Ring [ring]: [remaining]/[total] chunks to go." sethome-denied: "You can't set a home in a locked chunk." info: "Chunks: [unlocked]/[max]. Credit: [credit] level(s) — a chunk costs [cost]." map: @@ -76,7 +77,8 @@ chunkblock: title: "Blocks remaining" # status: "&a Phase blocks &b [total]. Blocks left: [todo]" # status: "&a [phase-name] : [percent-done]" - status: "Phase blocks [done] / [total]" + title-prefix: "[title] | " + status: "[island-title]Phase blocks [done] / [total]" # RED, WHITE, PINK, BLUE, GREEN, YELLOW, or PURPLE color: RED # SOLID, SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20 @@ -87,13 +89,22 @@ chunkblock: not-active: "Action Bar is not active for this island" trophies: awarded: "Trophy earned: [name]!" - title-available: "Your island can now show the title [title] — pick it with /ch title." + title-available: "Your island earned the title [title] — toggle it on and off using /ch title." commands: chunks: description: "show your unlocked chunks and a map of your territory" + ledger: + description: "show team member contributions" + parameters: "[days]" + header: "Island Contribution Ledger ([window])" + all-time: "all time" + last-days: "last [days] days" + row: " - [name]: [blocks] blocks, [chunks] chunks, [rings] rings" + total: "Total: [blocks] blocks, [chunks] chunks, [rings] rings" + no-activity: "No activity recorded yet." title: - description: "show your island's trophies and choose its title" - parameters: "[trophy-id | none]" + description: "toggle your island's title on/off, or choose one" + parameters: "[list | trophy-id | none]" header: "Your island's trophies:" trophy-entry: " - [name]" title-entry: " - [name] — title [title] (/ch title [id])" @@ -102,6 +113,8 @@ chunkblock: no-active: "No title is active. Pick one with /ch title." set: "Your island's title is now [title]." cleared: "Your island no longer shows a title." + toggled-on: "Island title [title] is now showing." + toggled-off: "Island title [title] is now hidden." not-earned: "Your island has not earned a trophy with that title." admin: chunks: diff --git a/src/main/resources/locales/es.yml b/src/main/resources/locales/es.yml index d9111dc..a3c9d26 100644 --- a/src/main/resources/locales/es.yml +++ b/src/main/resources/locales/es.yml @@ -26,9 +26,17 @@ protection: Muestra un estado para cada fase en la Barra de Acción. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Reclamar Bloques + description: |- + Rango que puede gastar el + crédito de nivel de la isla + para reclamar nuevos bloques. + hint: "¡Tu rango no puede reclamar bloques para esta isla!" chunkblock: bossbar: title: Bloques restantes + title-prefix: "[title] | " status: 'Bloques de fase [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "Fase: [phase-name] | Bloques: [done] / [total] | Progreso: [percent-done]" not-active: "La barra de acción no está activa para esta isla" + trophies: + awarded: "Trofeo ganado: [name]!" + title-available: "Tu isla ganó el título [title] — actívalo y desactívalo con /ch title." + chunks: + entry-denied: "Este bloque está bloqueado." + locked: "No puedes tocar eso — el bloque está bloqueado." + claim-hint: "Golpea el borde para reclamar este bloque por [cost] nivel(es)! Tienes [credit] nivel(es) de crédito." + claim-confirm: "¿Reclamar este bloque por [cost] nivel(es)? Eso te deja [after] nivel(es) de crédito. Agáchate y golpea el borde de nuevo dentro de [seconds]s para confirmar." + no-credit: "Necesitas [needed] más nivel(es) de crédito para reclamar este bloque." + beyond-limit: "Este bloque está más allá del área de protección de tu isla." + claimed: "¡Bloque reclamado! Tu isla ahora tiene [number] bloques. Crédito restante: [credit] nivel(es)." + credit: "¡Puedes reclamar [count] bloque(s) más! Ve a tu borde y golpéalo donde quieras crecer." + relocked: "El nivel de tu isla bajó — [count] bloque(s) re-bloqueado(s), el más nuevo primero. ¡Recupera los niveles para reclamarlos de nuevo!" + ejected: "El bloque en el que estabas se bloqueó de nuevo, así que fuiste trasladado a un lugar seguro." + max-reached: "¡Tu isla ha alcanzado su tamaño máximo de [number] bloques!" + ring-complete: "¡Anillo [ring] completado! Todo el anillo alrededor de tu isla es tuyo — [chunks] bloques en total." + ring-broadcast: "La isla de [name] ha cerrado el anillo [ring] [chunks] ¡bloques y sigue creciendo!" + rings: "Anillos completados: [rings] de [max]." + ring-progress: "Anillo [ring]: [remaining]/[total] bloques restantes." + sethome-denied: "No puedes establecer un hogar en un bloque bloqueado." + info: "Bloques: [unlocked]/[max]. Crédito: [credit] nivel(es) — un bloque cuesta [cost]." + map: + title: "Territorio de tu isla ([unlocked]/[max] bloques):" + row: "[row]" + legend: "■ tuyo ▣ reclamable ([cost] nivel(es) cada uno) □ bloqueado ◎ centro ◆ tú" + you-are-here: "Estás en el bloque marcado." + dialog: + close: "Cerrar" + tooltip: + center: "El bloque central — tu bloque mágico está aquí." + owned: "Bloque [x], [z] — tuyo." + claimable: "Bloque [x], [z] — reclamable por [cost] nivel(es). Ve a ese borde y golpéalo." + no-credit: "Bloque [x], [z] — cuesta [cost] nivel(es). Necesitas [needed] más nivel(es) de crédito." + locked: "Bloque [x], [z] — bloqueado. Reclama tu camino hacia él." + you-are-here: "Estás parado aquí." commands: admin: setcount: @@ -61,6 +104,45 @@ chunkblock: Muestra una comprobación de las probabilidades de la fase en la consola see-console: 'Revisa la consola para ver el informe' + bypass: + description: "alternar la aplicación de bloqueos de bloques para ti mismo" + "on": "Ahora evitas bloqueos de bloques. Los efectos visuales de los bordes se ocultan para ti." + "off": "Los bloqueos de bloques se aplican a ti nuevamente." + chunks: + parameters: " [reset]" + description: "inspecciona los bloques desbloqueados de un jugador o reinícialos al inicio" + info: "[name]: [number]/[max] bloques, [spent] nivel(es) gastado(s), [credit] crédito." + reset: "Los bloques de [name] fueron re-bloqueados solo al bloque central." + phases: + description: "abre el editor de orden de fases" + no-index: "No hay índice de fases cargado, por lo que las fases no se pueden reordenar" + saved: "Orden de fases guardado y aplicado" + save-failed: "¡No se pudo guardar el orden de fases! Ver consola para errores" + gui: + title: "Orden de Fases" + info-title: "Cómo usar" + instructions: |- + Haz clic en una fase para levantarla, + luego haz clic donde debe ir. + Haz clic derecho para alternar una fase + encendida o apagada. + repeat: "Después de la última fase, el conteo salta a [number]" + phase-name: "[name]" + start: "Inicio: [number]" + length: "Longitud: [number]" + disabled: "Deshabilitado" + version-locked: "Requiere Minecraft [version]+" + pick-up: "Haz clic para mover" + toggle: "Haz clic derecho para alternar" + set-length: "Shift+clic izquierdo para establecer longitud" + drop-here: "Haz clic para soltar aquí" + drop-at-end: "Soltar al final" + held: "Moviendo: [name]" + put-back: "Haz clic para devolver" + enter-length: "Ingresa una nueva longitud en el chat para [name] - actualmente es [number] bloques. Escribe cancel para mantenerlo." + invalid-length: "La longitud debe ser un número entero mayor que 0" + length-cancelled: "Longitud no cambiada" + cancel-word: "cancel" count: description: Muestra el número de bloques minados y la fase correspondiente info: 'Tienes [number] bloques minados en la fase [name]' @@ -89,6 +171,31 @@ chunkblock: description: reaparece el bloque mágico en situaciones en las que desaparece block-exist: 'Block existe, no requirió reaparición. Te lo marqué.' block-respawned: '& un bloque reapareció.' + chunks: + description: "muestra tus bloques desbloqueados y un mapa de tu territorio" + ledger: + description: "mostrar las contribuciones de los miembros del equipo" + parameters: "[days]" + header: "Registro de Contribuciones de la Isla ([window])" + all-time: "todo el tiempo" + last-days: "últimos [days] días" + row: " - [name]: [blocks] bloques, [chunks] fragmentos, [rings] anillos" + total: "Total: [blocks] bloques, [chunks] fragmentos, [rings] anillos" + no-activity: "Aún no se ha registrado actividad." + title: + description: "alternar el título de tu isla encendido/apagado, o elegir uno" + parameters: "[list | trophy-id | none]" + header: "Trofeos de tu isla:" + trophy-entry: " - [name]" + title-entry: " - [name] — título [title] (/ch title [id])" + none-earned-yet: "Tu isla aún no ha ganado ningún trofeo." + active: "Título activo: [title]" + no-active: "Ningún título está activo. Elige uno con /ch title." + set: "El título de tu isla es ahora [title]." + cleared: "Tu isla ya no muestra un título." + toggled-on: "El título de la isla [title] ahora se muestra." + toggled-off: "El título de la isla [title] ahora está oculto." + not-earned: "Tu isla no ha ganado un trofeo con ese título." phase: insufficient-level: '¡Tu nivel de isla es demasiado bajo para seguir! Este debe ser de [number].' insufficient-funds: '¡Tus fondos son insuficientes! Debes tener [number].' diff --git a/src/main/resources/locales/fr.yml b/src/main/resources/locales/fr.yml index 6c13716..f10f1fb 100644 --- a/src/main/resources/locales/fr.yml +++ b/src/main/resources/locales/fr.yml @@ -26,9 +26,17 @@ protection: Affiche un statut pour chaque phase dans la Barre d'Action. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Réclamer des Blocs + description: |- + Rang qui peut dépenser le + crédit de niveau de l'île + pour réclamer de nouveaux blocs. + hint: "Votre rang ne peut pas réclamer de blocs pour cette île!" chunkblock: bossbar: title: Blocs restants + title-prefix: "[title] | " status: 'Blocs de phase [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "Phase : [phase-name] | Blocs : [done] / [total] | Progression : [percent-done]" not-active: "La barre d'action n'est pas active pour cette île" + trophies: + awarded: "Trophée remporté : [name]!" + title-available: "Votre île a remporté le titre [title] — activez-le et désactivez-le à l'aide de /ch title." + chunks: + entry-denied: "Ce bloc est verrouillé." + locked: "Tu ne peux pas le toucher — le bloc est verrouillé." + claim-hint: "Frappez la bordure pour réclamer ce bloc pour [cost] niveau(x) ! Vous avez [credit] niveau(x) de crédit." + claim-confirm: "Réclamer ce bloc pour [cost] niveau(x) ? Cela vous laisse [after] niveau(x) de crédit. Accroupissez-vous et frappez la bordure à nouveau dans [seconds]s pour confirmer." + no-credit: "Vous avez besoin de [needed] plus de niveau(x) de crédit pour réclamer ce bloc." + beyond-limit: "Ce bloc dépasse la zone de protection de votre île." + claimed: "Bloc réclamé! Votre île a maintenant [number] blocs. Crédit restant: [credit] niveau(x)." + credit: "Vous pouvez réclamer [count] plus de bloc(s)! Allez à votre bordure et frappez-la où vous voulez grandir." + relocked: "Le niveau de votre île a baissé — [count] bloc(s) à nouveau verrouillé(s), le plus récent d'abord. Regagnez les niveaux pour les réclamer!" + ejected: "Le bloc dans lequel vous étiez a été à nouveau verrouillé, vous avez donc été transféré en sécurité." + max-reached: "Votre île a atteint sa taille maximale de [number] blocs!" + ring-complete: "Anneau [ring] complété! L'anneau entier autour de votre île est le vôtre — [chunks] blocs au total." + ring-broadcast: "L'île de [name] a fermé l'anneau [ring] [chunks] blocs et elle grandit encore!" + rings: "Anneaux complétés: [rings] sur [max]." + ring-progress: "Anneau [ring]: [remaining]/[total] blocs restants." + sethome-denied: "Vous ne pouvez pas définir une maison dans un bloc verrouillé." + info: "Blocs: [unlocked]/[max]. Crédit: [credit] niveau(x) — un bloc coûte [cost]." + map: + title: "Territoire de votre île ([unlocked]/[max] blocs):" + row: "[row]" + legend: "■ le vôtre ▣ réclamable ([cost] niveau(x) chacun) □ verrouillé ◎ centre ◆ vous" + you-are-here: "Vous êtes sur le bloc marqué." + dialog: + close: "Fermer" + tooltip: + center: "Le bloc central — votre bloc magique est ici." + owned: "Bloc [x], [z] — le vôtre." + claimable: "Bloc [x], [z] — réclamable pour [cost] niveau(x). Allez à cette bordure et frappez-la." + no-credit: "Bloc [x], [z] — coûte [cost] niveau(x). Vous avez besoin de [needed] plus de niveau(x) de crédit." + locked: "Bloc [x], [z] — verrouillé. Réclamez votre chemin vers celui-ci." + you-are-here: "Vous êtes debout ici." commands: admin: setcount: @@ -59,6 +102,45 @@ chunkblock: afficher un contrôle d'intégrité des probabilités de phase dans la console see-console: 'Voir la console pour le rapport' + bypass: + description: "basculer l'application de verrouillage des blocs pour vous-même" + "on": "Vous contournez maintenant les verrous de bloc. Les visuels de bordure sont cachés pour vous." + "off": "Les verrous de bloc s'appliquent à nouveau à vous." + chunks: + parameters: " [reset]" + description: "inspecter les blocs déverrouillés d'un joueur ou les réinitialiser au début" + info: "[name]: [number]/[max] blocs, [spent] niveau(x) dépensé(s), [credit] crédit." + reset: "Les blocs de [name] ont été à nouveau verrouillés au seul bloc central." + phases: + description: "ouvrir l'éditeur d'ordre de phase" + no-index: "Aucun index de phase chargé, les phases ne peuvent donc pas être réordonnées" + saved: "Ordre de phase enregistré et appliqué" + save-failed: "Impossible d'enregistrer l'ordre de phase! Voir la console pour les erreurs" + gui: + title: "Ordre des Phases" + info-title: "Comment utiliser" + instructions: |- + Cliquez sur une phase pour la ramasser, + puis cliquez où elle doit aller. + Clic droit pour basculer une phase + activée ou désactivée. + repeat: "Après la dernière phase, le décompte passe à [number]" + phase-name: "[name]" + start: "Début: [number]" + length: "Longueur: [number]" + disabled: "Désactivé" + version-locked: "Nécessite Minecraft [version]+" + pick-up: "Cliquez pour déplacer" + toggle: "Clic droit pour basculer" + set-length: "Maj+clic gauche pour définir la longueur" + drop-here: "Cliquez pour déposer ici" + drop-at-end: "Déposer à la fin" + held: "Déplacement: [name]" + put-back: "Cliquez pour remettre" + enter-length: "Entrez une nouvelle longueur dans le chat pour [name] - actuellement [number] blocs. Tapez cancel pour conserver." + invalid-length: "La longueur doit être un nombre entier supérieur à 0" + length-cancelled: "Longueur non modifiée" + cancel-word: "cancel" count: description: afficher le nombre de blocs et la phase info: 'Vous êtes sur le bloc [number] dans la phase [name]' @@ -89,6 +171,31 @@ chunkblock: &un bloc existe, n'a pas nécessité de réapparition. Je l'ai noté pour toi. block-respawned: '&un bloc réapparu.' + chunks: + description: "afficher vos blocs déverrouillés et une carte de votre territoire" + ledger: + description: "afficher les contributions des membres de l'équipe" + parameters: "[days]" + header: "Registre de Contribution de l'Île ([window])" + all-time: "tout le temps" + last-days: "derniers [days] jours" + row: " - [name]: [blocks] blocs, [chunks] morceaux, [rings] anneaux" + total: "Total: [blocks] blocs, [chunks] morceaux, [rings] anneaux" + no-activity: "Aucune activité enregistrée pour l'instant." + title: + description: "basculer le titre de votre île allumé/éteint, ou en choisir un" + parameters: "[list | trophy-id | none]" + header: "Trophées de votre île:" + trophy-entry: " - [name]" + title-entry: " - [name] — titre [title] (/ch title [id])" + none-earned-yet: "Votre île n'a pas encore remporté de trophées." + active: "Titre actif: [title]" + no-active: "Aucun titre n'est actif. Choisissez-en un avec /ch title." + set: "Le titre de votre île est maintenant [title]." + cleared: "Votre île n'affiche plus de titre." + toggled-on: "Le titre de l'île [title] s'affiche maintenant." + toggled-off: "Le titre de l'île [title] est maintenant caché." + not-earned: "Votre île n'a pas remporté un trophée avec ce titre." phase: insufficient-level: Ton niveau d'île est trop bas ! Il doit être de [number] au minimum. insufficient-funds: Tu n'as pas les fonds nécessaire ! Tu dois au moins avoir [number]. diff --git a/src/main/resources/locales/hr.yml b/src/main/resources/locales/hr.yml index 3a0288e..166449c 100644 --- a/src/main/resources/locales/hr.yml +++ b/src/main/resources/locales/hr.yml @@ -26,9 +26,17 @@ protection: Prikazuje status za svaku fazu u Traci Akcije. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Zahtjevi Dijelove + description: |- + Rang koji može trošiti + otočnu razinu kredita + za zahtijevanje novih dijelova. + hint: "Vaš rang ne može zahtijevati dijelove za ovaj otok!" chunkblock: bossbar: title: Preostali blokovi + title-prefix: "[title] | " status: 'Fazni blokovi [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,8 +44,106 @@ chunkblock: actionbar: status: "Faza: [phase-name] | Blokovi: [done] / [total] | Napredak: [percent-done]" not-active: "Akcijska traka nije aktivna za ovaj otok" + trophies: + awarded: "Trofej osvojen: [name]!" + title-available: "Vaš otok je osvojio naslov [title] — aktivirajte i deaktivirajte ga pomoću /ch title." + chunks: + entry-denied: "Taj dio je zaključan." + locked: "Ne možeš to dodirnuti — dio je zaključan." + claim-hint: "Udari granicu kako bi zahtijevao ovaj dio za [cost] razina(e)! Imaš [credit] razina(e) kredita." + claim-confirm: "Zahtievaj ovaj dio za [cost] razina(e)? Ostaje ti [after] razina(e) kredita. Kradi se i ponovno udari granicu u roku [seconds]s da potvrdis." + no-credit: "Trebas [needed] više razina(e) kredita za zahtijevanje ovog dijela." + beyond-limit: "Taj dio je izvan zaštitnog područja vašeg otoka." + claimed: "Dio zahtjevljen! Vaš otok je sada [number] dijelova. Preostali kredit: [credit] razina(e)." + credit: "Možeš zahtijevati [count] više dijela(a)! Idi na svoju granicu i udari je gdje želiš rasti." + relocked: "Razina vašeg otoka je pala — [count] dio(a) je ponovno zaključan, najnoviji prvi. Povrati razine da ih ponovno zahtijevaš!" + ejected: "Dio u kojem si bio je ponovno zaključan, pa si premješten na sigurno." + max-reached: "Vaš otok je dostigao maksimalnu veličinu od [number] dijelova!" + ring-complete: "Prsten [ring] kompletan! Cijeli prsten oko vašeg otoka je tvoj — [chunks] dijelova ukupno." + ring-broadcast: "[name]'s otok je zatvorio prsten [ring] [chunks] dijelova i nastavlja rasti!" + rings: "Završeni prsteni: [rings] od [max]." + ring-progress: "Prsten [ring]: [remaining]/[total] dijelova još." + sethome-denied: "Ne možeš postaviti dom u zaključanom dijelu." + info: "Dijelovi: [unlocked]/[max]. Kredit: [credit] razina(e) — dio stoji [cost]." + map: + title: "Vaše otočno područje ([unlocked]/[max] dijelova):" + row: "[row]" + legend: "■ tvoj ▣ zahtjeviv ([cost] razina(e) svaki) □ zaključan ◎ centar ◆ ti" + you-are-here: "Nalazis se na označenom dijelu." + dialog: + close: "Zatvori" + tooltip: + center: "Centralni dio — tvoj magični blok je ovdje." + owned: "Dio [x], [z] — tvoj." + claimable: "Dio [x], [z] — može se zahtijevati za [cost] razina(e). Idi na tu granicu i udari je." + no-credit: "Dio [x], [z] — stoji [cost] razina(e). Trebas [needed] više razina(e) kredita." + locked: "Dio [x], [z] — zaključan. Zahtjevaj se prema njemu." + you-are-here: "Stoji ovdje." commands: + chunks: + description: "prikaži svoje otključane dijelove i kartu vašeg teritorija" + ledger: + description: "prikaži doprinos članova tima" + parameters: "[days]" + header: "Otočni Knjiga Doprinos ([window])" + all-time: "svereme" + last-days: "zadnjih [days] dana" + row: " - [name]: [blocks] blokova, [chunks] dijelova, [rings] prstena" + total: "Ukupno: [blocks] blokova, [chunks] dijelova, [rings] prstena" + no-activity: "Nije zabilježena aktivnost." + title: + description: "aktiviraj/deaktiviraj naslov vašeg otoka, ili odaberi jedan" + parameters: "[list | trophy-id | none]" + header: "Trofej vašeg otoka:" + trophy-entry: " - [name]" + title-entry: " - [name] — naslov [title] (/ch title [id])" + none-earned-yet: "Vaš otok nije ainda osvojio nijedan trofej." + active: "Aktivni naslov: [title]" + no-active: "Nema aktivnog naslova. Odaberi jedan s /ch title." + set: "Naslov vašeg otoka je sada [title]." + cleared: "Vaš otok više ne prikazuje naslov." + toggled-on: "Otočni naslov [title] se sada prikazuje." + toggled-off: "Otočni naslov [title] je sada skriven." + not-earned: "Vaš otok nije osvojio trofej s tim naslovom." admin: + bypass: + description: "aktiviraj/deaktiviraj namjeru zaključavanja dijelova" + "on": "Sada zaobilaziš zaključavanja dijelova. Vizualni elementi granice su skriveni za tebe." + "off": "Zaključavanja dijelova se na tebe ponovno primjenjuju." + chunks: + parameters: " [reset]" + description: "ispitaj otključane dijelove igrača ili ih ponovno zaključaj na početak" + info: "[name]: [number]/[max] dijelova, [spent] razina(e) potrošena, [credit] kredit." + reset: "[name]'s dijelovi su ponovno zaključani samo na srednji dio." + phases: + description: "otvori uređivač reda faza" + no-index: "Nema učitanog indeksa faza, pa faze ne mogu biti preuredene" + saved: "Red faza je sačuvan i primijenjen" + save-failed: "Nije moguće spremiti red faza! Pogledaj konzolu za greške" + gui: + title: "Red Faza" + info-title: "Kako se koristi" + instructions: |- + Klikni na fazu da je podigneš, + zatim klikni gdje bi trebala ići. + Desni klik uključuje/isključuje fazu. + repeat: "Nakon posljednje faze brojač se premješta u [number]" + phase-name: "[name]" + start: "Početak: [number]" + length: "Dužina: [number]" + disabled: "Onemogućeno" + version-locked: "Trebam Minecraft [version]+" + pick-up: "Klikni za pomicanje" + toggle: "Desni klik za prebacivanje" + set-length: "Shift-lijevi klik za postavljanje dužine" + drop-here: "Klikni za spuštanje ovdje" + drop-at-end: "Spusti na kraju" + held: "Pomicanje: [name]" + put-back: "Klikni za vraćanje" + enter-length: "Unesi novu dužinu u chat za [name] - trenutno je [number] blokova. Upiši cancel da ga održiš." + invalid-length: "Dužina mora biti cijeli broj veći od 0" + length-cancelled: "Dužina nepromijenjena" + cancel-word: "cancel" setcount: parameters: description: postavljanje broja blokova igrača diff --git a/src/main/resources/locales/hu.yml b/src/main/resources/locales/hu.yml index c94cca2..3343d47 100644 --- a/src/main/resources/locales/hu.yml +++ b/src/main/resources/locales/hu.yml @@ -27,9 +27,17 @@ protection: Állapotot mutat minden fázishoz a Műveleti Sávban. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Szövegek Igénylése + description: |- + Rang, amely az sziget + szintje kreditjét költheti + új szövegek igényléséhez. + hint: "A rangod nem tudja igényelni a szövegeket erre a szigetre!" chunkblock: bossbar: title: Blokkok maradtak + title-prefix: "[title] | " status: 'Fázisblokkok [done] / [total]' color: RED style: SEGMENTED_20 @@ -37,8 +45,106 @@ chunkblock: actionbar: status: "Fázis: [phase-name] | Blokkok: [done] / [total] | Haladás: [percent-done]" not-active: "Az akciósáv nem aktív ezen a szigeten" + trophies: + awarded: "Trófea szerzett: [name]!" + title-available: "A szigeted megnyerte a [title] címet — kapcsold ki és be a /ch title paranccsal." + chunks: + entry-denied: "Ez a szöveg zárolva van." + locked: "Nem érintheted azt — a szöveg zárolva van." + claim-hint: "Üss a határra ennek a szövegnek az igényléséhez [cost] szint(hez)! Van [credit] szinted kredid." + claim-confirm: "Igényelj ezt a szöveget [cost] szint(ért)? Ez azt hagyja neked [after] szint kredid. Lopózz és üss ismét a határra belül [seconds]s hogy megerősítsd." + no-credit: "Szükséged van [needed] több szint kreditre ennek a szövegnek az igényléséhez." + beyond-limit: "Ez a szöveg a szigeted védelmi területe túl van." + claimed: "Szöveg igényelve! A szigeted most [number] szöveg. Megmaradt kredit: [credit] szint." + credit: "Igényelhetiels [count] több szöveget! Menj a hatádhoz és ütsd meg ahol szeretnél növekedni." + relocked: "A szigeted szintje csökkent — [count] szöveg lett ismét zárolva, legújabb elsőnek. Szerzj meg a szinteket hogy ismét igényelhesd!" + ejected: "A szöveg amit benned voltál ismét zárolva lett, így biztonságra kerültél." + max-reached: "A szigeted elérte a maximális méretét [number] szöveg!" + ring-complete: "Gyűrű [ring] kész! Az egész gyűrű a szigeted körül a tiéd — [chunks] szöveg összesen." + ring-broadcast: "[name] szigete lezárta a gyűrűt [ring] [chunks] szöveg és még növekszik!" + rings: "Befejezett gyűrűk: [rings] a [max] közül." + ring-progress: "Gyűrű [ring]: [remaining]/[total] szöveg még." + sethome-denied: "Nem állíthatod be a házad zárolva szövegben." + info: "Szövegek: [unlocked]/[max]. Kredit: [credit] szint — egy szöveg költségei [cost]." + map: + title: "A szigeted területe ([unlocked]/[max] szövegek):" + row: "[row]" + legend: "■ tiéd ▣ igényelhető ([cost] szint mindegyik) □ zárolva ◎ közép ◆ te" + you-are-here: "A megjelölt szövegen vagy." + dialog: + close: "Bezárás" + tooltip: + center: "A közép szöveg — a mágikus blokk itt van." + owned: "Szöveg [x], [z] — tied." + claimable: "Szöveg [x], [z] — igényelhető [cost] szintért. Menj arra a határra és ütsd meg." + no-credit: "Szöveg [x], [z] — költségei [cost] szint. Szükséged van [needed] több szint kreditre." + locked: "Szöveg [x], [z] — zárolva. Igényelj ki magad oda." + you-are-here: "Itt állsz." commands: + chunks: + description: "mutasd meg a feloldott szövegeket és a terület térképét" + ledger: + description: "mutasd meg a csapat tagjainak hozzájárulásait" + parameters: "[days]" + header: "Sziget Hozzájárulás Főkönyv ([window])" + all-time: "mind ideje" + last-days: "utolsó [days] nap" + row: " - [name]: [blocks] blokk, [chunks] szöveg, [rings] gyűrűk" + total: "Összesen: [blocks] blokk, [chunks] szöveg, [rings] gyűrűk" + no-activity: "Nincs feljegyzett tevékenység." + title: + description: "szerzd ki/szerzd ki a szigeted címét, vagy válassz egyet" + parameters: "[list | trophy-id | none]" + header: "A szigeted troféái:" + trophy-entry: " - [name]" + title-entry: " - [name] — cím [title] (/ch title [id])" + none-earned-yet: "A szigeted még nem szerzett meg trófeát." + active: "Aktív cím: [title]" + no-active: "Nincs aktív cím. Válassz egyet a /ch title paranccsal." + set: "A szigeted címe most [title]." + cleared: "A szigeted már nem jelenít meg címet." + toggled-on: "Sziget cím [title] most megjelenik." + toggled-off: "Sziget cím [title] most rejtett." + not-earned: "A szigeted nem szerzett trófeát ezzel a címmel." admin: + bypass: + description: "szerzd ki/szerzd ki a szöveg zárolási kikényszerítést magadra" + "on": "Most megkerülöd a szöveg zárolásokat. Határvizuális elemek rejtve vannak számodra." + "off": "A szöveg zárolások ismét vonatkoznak rád." + chunks: + parameters: " [reset]" + description: "vizsgáld meg egy játékos feloldott szövegeit vagy zárd vissza őket az elejére" + info: "[name]: [number]/[max] szövegek, [spent] szint(et) költött, [credit] kredit." + reset: "[name]'s szövege visszáról csak a közép szövegre lett zárolva." + phases: + description: "nyitsd meg a fázis sorrendszerkesztőt" + no-index: "Nincs betöltött fázisindex, így a fázisokat nem lehet átrendezni" + saved: "Fázis sorrend mentve és alkalmazva" + save-failed: "Nem sikerült menteni a fázis sorrendet! Lásd a konzolt a hibákért" + gui: + title: "Fázis Sorrend" + info-title: "Hogyan használd" + instructions: |- + Kattints egy fázisra hogy felemelje, + majd kattints ahol kellene legyen. + Jobb kattintás egy fázis ki/bekapcsol. + repeat: "Az utolsó fázis után a szám ugrálása [number]" + phase-name: "[name]" + start: "Kezdés: [number]" + length: "Hossz: [number]" + disabled: "Letiltva" + version-locked: "Minecraft [version]+ szükséges" + pick-up: "Kattints a mozgatáshoz" + toggle: "Jobb kattints a váltáshoz" + set-length: "Shift-bal kattints a hossz beállításához" + drop-here: "Kattints ide történő eldobáshoz" + drop-at-end: "Dobj a végén" + held: "Mozgatás: [name]" + put-back: "Kattints visszahelyezéshez" + enter-length: "Írj be egy új hosszt a csatban a [name] - jelenleg [number] blokk. Írj cancel hogy megtartsad." + invalid-length: "A hossz egész szám 0-nál nagyobb kell legyen" + length-cancelled: "Hossz nem módosítva" + cancel-word: "cancel" setcount: parameters: description: állítsa be a játékos blokkszámát diff --git a/src/main/resources/locales/id.yml b/src/main/resources/locales/id.yml index 1e1085f..5769d3f 100644 --- a/src/main/resources/locales/id.yml +++ b/src/main/resources/locales/id.yml @@ -26,9 +26,17 @@ protection: Menampilkan status untuk setiap fase di Action Bar. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Klaim Chunk + description: |- + Pangkat yang dapat menghabiskan + kredit tingkat pulau + untuk klaim chunk baru. + hint: "Pangkatmu tidak dapat mengklaim chunk untuk pulau ini!" chunkblock: bossbar: title: Blok tersisa + title-prefix: "[title] | " status: 'Blok fase [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,8 +44,107 @@ chunkblock: actionbar: status: "Fase: [phase-name] | Blok: [done] / [total] | Kemajuan: [percent-done]" not-active: "Action Bar tidak aktif untuk pulau ini" + trophies: + awarded: "Trofi diraih: [name]!" + title-available: "Pulau mu meraih gelar [title] — aktifkan dan nonaktifkan menggunakan /ch title." + chunks: + entry-denied: "Chunk itu terkunci." + locked: "Anda tidak bisa menyentuh itu — chunk terkunci." + claim-hint: "Tekan perbatasan untuk mengklaim chunk ini untuk [cost] level! Anda memiliki [credit] level kredit." + claim-confirm: "Klaim chunk ini untuk [cost] level? Itu meninggalkan Anda [after] level kredit. Berselundup dan tekan perbatasan lagi dalam [seconds]s untuk mengkonfirmasi." + no-credit: "Anda perlu [needed] lebih banyak level kredit untuk mengklaim chunk ini." + beyond-limit: "Chunk itu melampaui area perlindungan pulau Anda." + claimed: "Chunk diklaim! Pulau Anda sekarang [number] chunk. Kredit tersisa: [credit] level." + credit: "Anda dapat mengklaim [count] chunk lagi! Pergi ke perbatasan Anda dan tekan di mana Anda ingin tumbuh." + relocked: "Level pulau Anda turun — [count] chunk terkunci kembali, yang terbaru terlebih dahulu. Dapatkan kembali levelnya untuk mengklaimnya kembali!" + ejected: "Chunk tempat Anda berada terkunci kembali, jadi Anda dipindahkan ke tempat aman." + max-reached: "Pulau Anda telah mencapai ukuran maksimal [number] chunk!" + ring-complete: "Ring [ring] selesai! Seluruh ring di sekitar pulau Anda adalah milik Anda — [chunks] chunk semuanya." + ring-broadcast: "Pulau [name] telah menutup ring [ring] [chunks] chunk dan masih berkembang!" + rings: "Ring selesai: [rings] dari [max]." + ring-progress: "Ring [ring]: [remaining]/[total] chunk lagi." + sethome-denied: "Anda tidak dapat mengatur rumah di chunk terkunci." + info: "Chunk: [unlocked]/[max]. Kredit: [credit] level — chunk biaya [cost]." + map: + title: "Wilayah pulau Anda ([unlocked]/[max] chunk):" + row: "[row]" + legend: "■ milik Anda ▣ dapat diklaim ([cost] level masing-masing) □ terkunci ◎ pusat ◆ Anda" + you-are-here: "Anda berada di chunk yang ditandai." + dialog: + close: "Tutup" + tooltip: + center: "Chunk pusat — blok ajaib Anda ada di sini." + owned: "Chunk [x], [z] — milik Anda." + claimable: "Chunk [x], [z] — dapat diklaim untuk [cost] level. Pergi ke perbatasan itu dan tekan." + no-credit: "Chunk [x], [z] — biaya [cost] level. Anda memerlukan [needed] lebih banyak level kredit." + locked: "Chunk [x], [z] — terkunci. Klaim jalan Anda ke sana." + you-are-here: "Anda berdiri di sini." commands: + chunks: + description: "tampilkan chunk yang tidak terkunci dan peta wilayah Anda" + ledger: + description: "tampilkan kontribusi anggota tim" + parameters: "[days]" + header: "Buku Besar Kontribusi Pulau ([window])" + all-time: "semua waktu" + last-days: "[days] hari terakhir" + row: " - [name]: [blocks] blok, [chunks] chunk, [rings] ring" + total: "Total: [blocks] blok, [chunks] chunk, [rings] ring" + no-activity: "Tidak ada aktivitas yang tercatat." + title: + description: "aktifkan/nonaktifkan gelar pulau Anda, atau pilih satu" + parameters: "[list | trophy-id | none]" + header: "Trofi pulau Anda:" + trophy-entry: " - [name]" + title-entry: " - [name] — gelar [title] (/ch title [id])" + none-earned-yet: "Pulau Anda belum meraih trofi apa pun." + active: "Gelar aktif: [title]" + no-active: "Tidak ada gelar aktif. Pilih satu dengan /ch title." + set: "Gelar pulau Anda sekarang [title]." + cleared: "Pulau Anda tidak lagi menampilkan gelar." + toggled-on: "Gelar pulau [title] sekarang ditampilkan." + toggled-off: "Gelar pulau [title] sekarang disembunyikan." + not-earned: "Pulau Anda belum meraih trofi dengan gelar itu." admin: + bypass: + description: "aktifkan/nonaktifkan penegakan kunci chunk untuk Anda sendiri" + "on": "Anda sekarang memotong kunci chunk. Visual perbatasan disembunyikan untuk Anda." + "off": "Kunci chunk berlaku untuk Anda lagi." + chunks: + parameters: " [reset]" + description: "inspeksi chunk yang tidak terkunci pemain atau kunci kembali ke awal" + info: "[name]: [number]/[max] chunk, [spent] level dihabiskan, [credit] kredit." + reset: "Chunk [name] terkunci kembali hanya ke chunk pusat." + phases: + description: "buka editor urutan fase" + no-index: "Tidak ada indeks fase yang dimuat, jadi fase tidak dapat disusun ulang" + saved: "Urutan fase disimpan dan diterapkan" + save-failed: "Tidak dapat menyimpan urutan fase! Lihat konsol untuk kesalahan" + gui: + title: "Urutan Fase" + info-title: "Cara menggunakan" + instructions: |- + Klik fase untuk mengambilnya, + lalu klik di mana seharusnya. + Klik kanan untuk mengalihkan fase + on atau off. + repeat: "Setelah fase terakhir penghitungan melompat ke [number]" + phase-name: "[name]" + start: "Mulai: [number]" + length: "Panjang: [number]" + disabled: "Dinonaktifkan" + version-locked: "Memerlukan Minecraft [version]+" + pick-up: "Klik untuk memindahkan" + toggle: "Klik kanan untuk mengalihkan" + set-length: "Shift-klik kiri untuk menetapkan panjang" + drop-here: "Klik untuk menjatuhkan di sini" + drop-at-end: "Jatuhkan di akhir" + held: "Memindahkan: [name]" + put-back: "Klik untuk mengembalikan" + enter-length: "Masukkan panjang baru di obrolan untuk [name] - saat ini [number] blok. Ketik cancel untuk menyimpannya." + invalid-length: "Panjang harus berupa bilangan bulat di atas 0" + length-cancelled: "Panjang tidak berubah" + cancel-word: "cancel" setcount: parameters: description: atur jumlah blok pemain diff --git a/src/main/resources/locales/it.yml b/src/main/resources/locales/it.yml index 8333bdb..15c57f7 100644 --- a/src/main/resources/locales/it.yml +++ b/src/main/resources/locales/it.yml @@ -26,9 +26,17 @@ protection: Mostra uno stato per ogni fase nella Action Bar. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Rivendica Blocchi + description: |- + Grado che può spendere il + credito di livello dell'isola + per rivendicare nuovi blocchi. + hint: "Il tuo grado non può rivendicare blocchi per quest'isola!" chunkblock: bossbar: title: Blocca i restanti + title-prefix: "[title] | " status: 'Blocchi di fase [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,8 +44,107 @@ chunkblock: actionbar: status: "Fase: [phase-name] | Blocchi: [done] / [total] | Progresso: [percent-done]" not-active: "La barra d'azione non è attiva per quest'isola" + trophies: + awarded: "Trofeo vinto: [name]!" + title-available: "La tua isola ha vinto il titolo [title] — attiva e disattiva usando /ch title." + chunks: + entry-denied: "Quel blocco è bloccato." + locked: "Non puoi toccare questo — il blocco è bloccato." + claim-hint: "Colpisci il confine per rivendicare questo blocco per [cost] livello! Hai [credit] livello di credito." + claim-confirm: "Rivendica questo blocco per [cost] livello? Ti rimangono [after] livello di credito. Striscia e colpisci di nuovo il confine entro [seconds]s per confermare." + no-credit: "Hai bisogno di [needed] più livello di credito per rivendicare questo blocco." + beyond-limit: "Quel blocco è oltre l'area di protezione della tua isola." + claimed: "Blocco rivendicato! La tua isola è ora [number] blocchi. Credito rimanente: [credit] livello." + credit: "Puoi rivendicare [count] altri blocchi! Vai al tuo confine e colpiscilo dove vuoi crescere." + relocked: "Il livello della tua isola è sceso — [count] blocco(i) è(sono) stato(i) bloccato(i) di nuovo, il più nuovo prima. Recupera i livelli per rivendicarli di nuovo!" + ejected: "Il blocco in cui eri è stato ribloccato, quindi sei stato spostato al sicuro." + max-reached: "La tua isola ha raggiunto la dimensione massima di [number] blocchi!" + ring-complete: "Anello [ring] completato! L'intero anello intorno alla tua isola è tuo — [chunks] blocchi in tutto." + ring-broadcast: "L'isola di [name] ha chiuso l'anello [ring] [chunks] blocchi e ancora in crescita!" + rings: "Anelli completati: [rings] di [max]." + ring-progress: "Anello [ring]: [remaining]/[total] blocchi rimasti." + sethome-denied: "Non puoi impostare una casa in un blocco bloccato." + info: "Blocchi: [unlocked]/[max]. Credito: [credit] livello — un blocco costa [cost]." + map: + title: "Territorio della tua isola ([unlocked]/[max] blocchi):" + row: "[row]" + legend: "■ il tuo ▣ rivendicabile ([cost] livello ciascuno) □ bloccato ◎ centro ◆ tu" + you-are-here: "Sei sul blocco contrassegnato." + dialog: + close: "Chiudi" + tooltip: + center: "Il blocco centrale — il tuo blocco magico è qui." + owned: "Blocco [x], [z] — tuo." + claimable: "Blocco [x], [z] — rivendicabile per [cost] livello. Vai a quel confine e colpiscilo." + no-credit: "Blocco [x], [z] — costa [cost] livello. Hai bisogno di [needed] più livello di credito." + locked: "Blocco [x], [z] — bloccato. Rivendica il tuo percorso verso di esso." + you-are-here: "Stai in piedi qui." commands: + chunks: + description: "mostra i tuoi blocchi sbloccati e una mappa del tuo territorio" + ledger: + description: "mostra i contributi dei membri del team" + parameters: "[days]" + header: "Libro Mastro dei Contributi dell'Isola ([window])" + all-time: "sempre" + last-days: "ultimi [days] giorni" + row: " - [name]: [blocks] blocchi, [chunks] chunk, [rings] anelli" + total: "Totale: [blocks] blocchi, [chunks] chunk, [rings] anelli" + no-activity: "Nessuna attività registrata." + title: + description: "attiva/disattiva il titolo della tua isola, o scegline uno" + parameters: "[list | trophy-id | none]" + header: "I tuoi trofei dell'isola:" + trophy-entry: " - [name]" + title-entry: " - [name] — titolo [title] (/ch title [id])" + none-earned-yet: "La tua isola non ha ancora vinto alcun trofeo." + active: "Titolo attivo: [title]" + no-active: "Nessun titolo attivo. Scegline uno con /ch title." + set: "Il titolo della tua isola è ora [title]." + cleared: "La tua isola non mostra più un titolo." + toggled-on: "Titolo dell'isola [title] è ora visibile." + toggled-off: "Titolo dell'isola [title] è ora nascosto." + not-earned: "La tua isola non ha vinto un trofeo con quel titolo." admin: + bypass: + description: "attiva/disattiva l'applicazione del blocco per te stesso" + "on": "Ora ignori i blocchi dei blocchi. Gli elementi visivi del confine sono nascosti per te." + "off": "I blocchi di blocco si applicano di nuovo a te." + chunks: + parameters: " [reset]" + description: "ispeziona i blocchi sbloccati di un giocatore o bloccali di nuovo all'inizio" + info: "[name]: [number]/[max] blocchi, [spent] livello speso, [credit] credito." + reset: "I blocchi di [name] sono stati ribloccati solo al blocco centrale." + phases: + description: "apri l'editor dell'ordine delle fasi" + no-index: "Nessun indice di fase caricato, quindi le fasi non possono essere riordinate" + saved: "Ordine delle fasi salvato e applicato" + save-failed: "Impossibile salvare l'ordine delle fasi! Vedere la console per gli errori" + gui: + title: "Ordine Fase" + info-title: "Come usare" + instructions: |- + Fai clic su una fase per sollevarla, + quindi fai clic su dove dovrebbe andare. + Fai clic con il pulsante destro del mouse per attivare/disattivare una fase + attiva o disattiva. + repeat: "Dopo l'ultima fase il conteggio salta a [number]" + phase-name: "[name]" + start: "Inizio: [number]" + length: "Lunghezza: [number]" + disabled: "Disabilitato" + version-locked: "Richiede Minecraft [version]+" + pick-up: "Fai clic per spostare" + toggle: "Fai clic con il pulsante destro del mouse per attivare/disattivare" + set-length: "Maiusc+clic sinistro per impostare la lunghezza" + drop-here: "Fai clic per rilasciare qui" + drop-at-end: "Rilascia alla fine" + held: "Spostamento: [name]" + put-back: "Fai clic per rimettere" + enter-length: "Immetti una nuova lunghezza in chat per [name] - attualmente [number] blocchi. Digita cancel per mantenerlo." + invalid-length: "La lunghezza deve essere un numero intero superiore a 0" + length-cancelled: "Lunghezza non modificata" + cancel-word: "cancel" setcount: parameters: description: imposta il conteggio dei blocchi del giocatore diff --git a/src/main/resources/locales/ja.yml b/src/main/resources/locales/ja.yml index 68e94fc..d98bbc1 100644 --- a/src/main/resources/locales/ja.yml +++ b/src/main/resources/locales/ja.yml @@ -26,9 +26,17 @@ protection: 各フェーズの ステータスを アクションバーに表示します。 + CHUNKBLOCK_CLAIM_CHUNKS: + name: チャンク認領 + description: |- + 島のレベル額度を使用して + 新しいチャンクを認領できる + ランク。 + hint: "あなたのランクではこの島のチャンクを認領できません!" chunkblock: bossbar: title: 残りのブロック + title-prefix: "[title] | " status: '位相ブロック [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "フェーズ: [phase-name] | ブロック数: [done] / [total] | 進行状況: [percent-done]" not-active: "この島ではアクションバーが有効ではありません" + chunks: + entry-denied: "そのチャンクはロックされています。" + locked: "そこに触れることはできません — チャンクがロックされています。" + claim-hint: "ボーダーをヒットしてこのチャンクを [cost] レベルで認領してください!現在 [credit] レベルの額度があります。" + claim-confirm: "このチャンクを [cost] レベルで認領しますか?その後 [after] レベルの額度が残ります。潜行してボーダーを再度ヒットしてください [seconds]s 以内に確認してください。" + no-credit: "このチャンクを認領するには [needed] レベルの額度が必要です。" + beyond-limit: "そのチャンクは島の保護範囲を超えています。" + claimed: "チャンク認領完了! あなたの島は今 [number] 個のチャンクです。残りの額度: [credit] レベル。" + credit: "さらに [count] 個のチャンクを認領できます!ボーダーに行き、成長させたい場所をヒットしてください。" + relocked: "島のレベルが低下しました — [count] 個のチャンクが再ロックされました(新しい順)。レベルを取り戻して再度認領してください!" + ejected: "あなたがいたチャンクが再ロックされたため、安全な場所に移動されました。" + max-reached: "島が最大サイズ [number] チャンクに達しました!" + ring-complete: "リング [ring] 完成! 島の周り全体があなたのものです — [chunks] 個のチャンク全部。" + ring-broadcast: "[name] の島がリング [ring] を閉じました — [chunks] 個のチャンク、まだ成長中!" + rings: "完成したリング: [rings] / [max]" + ring-progress: "リング [ring]: [remaining]/[total] チャンクまで。" + sethome-denied: "ロックされたチャンク内にホームを設定することはできません。" + info: "チャンク: [unlocked]/[max]。額度: [credit] レベル — チャンク1個のコストは [cost]" + map: + title: "あなたの島の領土([unlocked]/[max] チャンク):" + row: "[row]" + legend: "■ あなたのもの ▣ 認領可能(各 [cost] レベル) □ ロック済み ◎ 中心 ◆ あなた" + you-are-here: "あなたはマークされたチャンク上にいます。" + dialog: + close: "閉じる" + tooltip: + center: "中央チャンク — あなたの魔法ブロックはここにあります。" + owned: "チャンク [x], [z] — あなたのもの。" + claimable: "チャンク [x], [z] — [cost] レベルで認領可能。そのボーダーに行ってヒットしてください。" + no-credit: "チャンク [x], [z] — [cost] レベルが必要です。[needed] レベルの額度が不足しています。" + locked: "チャンク [x], [z] — ロック済み。認領して到達してください。" + you-are-here: "あなたはここに立っています。" + trophies: + awarded: "トロフィー獲得:[name]" + title-available: "島が称号 [title] を獲得しました — /ch title で切り替えてください。" commands: admin: setcount: @@ -57,6 +100,70 @@ chunkblock: parameters: <フェーズ> description: コンソールに位相確率の健全性チェックを表示する see-console: &aコンソールでレポートを表示 + bypass: + description: "チャンクロック強制を自分に対して切り替える" + 'on': "チャンクロックをバイパスできるようになりました。ボーダービジュアルはあなたに隠されています。" + 'off': "チャンクロックが再びあなたに適用されます。" + chunks: + parameters: "<プレイヤー> [reset]" + description: "プレイヤーの解放されたチャンクを調査するか、開始時点に戻す" + info: "[name]: [number]/[max] チャンク、[spent] レベル費用、[credit] 額度。" + reset: "[name] のチャンクが中央チャンクのみに再ロックされました。" + phases: + description: "フェーズ順序エディターを開く" + no-index: "フェーズインデックスが読み込まれていないため、フェーズを並べ替えることはできません" + saved: "フェーズ順序が保存され適用されました" + save-failed: "フェーズ順序を保存できませんでした!コンソールをチェックしてください" + gui: + title: "フェーズ順序" + info-title: "使用方法" + instructions: |- + フェーズをクリックして拾い上げ、 + その後ドロップする場所をクリックしてください。 + 右クリックでフェーズのオン/オフを + 切り替えます。 + repeat: "最後のフェーズの後、カウントは [number] にジャンプします" + phase-name: "[name]" + start: "開始: [number]" + length: "長さ: [number]" + disabled: "無効" + version-locked: "Minecraft [version]+ が必要です" + pick-up: "クリックして移動" + toggle: "右クリックして切り替え" + set-length: "Shift + 左クリックして長さを設定" + drop-here: "クリックしてここにドロップ" + drop-at-end: "最後にドロップ" + held: "移動中:[name]" + put-back: "クリックして戻す" + enter-length: "チャットで [name] の新しい長さを入力してください — 現在 [number] ブロックです。キープするには cancel と入力してください。" + invalid-length: "長さは0より大きい整数である必要があります" + length-cancelled: "長さが変更されていません" + cancel-word: "cancel" + chunks: + description: "解放されたチャンクと領土マップを表示" + ledger: + description: "チームメンバーの貢献度を表示" + parameters: "[days]" + header: "島の貢献度台帳 ([window])" + all-time: "全時間" + last-days: "過去 [days] 日" + row: " - [name][blocks] ブロック、[chunks] チャンク、[rings] リング" + total: "合計:[blocks] ブロック、[chunks] チャンク、[rings] リング" + no-activity: "記録されたアクティビティはまだありません。" + title: + description: "島の称号を切り替えるか選択する" + parameters: "[list | trophy-id | none]" + header: "島のトロフィー:" + trophy-entry: " - [name]" + title-entry: " - [name] — 称号 [title] (/ch title [id])" + none-earned-yet: "島はまだトロフィーを獲得していません。" + active: "アクティブな称号: [title]" + no-active: "アクティブな称号がありません。/ch title で選んでください。" + set: "島の称号が [title] に設定されました。" + cleared: "島は称号を表示しなくなりました。" + toggled-on: "島の称号 [title] が表示されるようになりました。" + toggled-off: "島の称号 [title] が非表示になりました。" + not-earned: "島はその称号のトロフィーを獲得していません。" count: description: ブロック数とフェーズを表示する info: '[name]フェーズのブロック[number]にいます' diff --git a/src/main/resources/locales/pl.yml b/src/main/resources/locales/pl.yml index 05585f1..95a0a91 100644 --- a/src/main/resources/locales/pl.yml +++ b/src/main/resources/locales/pl.yml @@ -26,9 +26,17 @@ protection: Pokazuje status dla każdej fazy na Pasku Akcji. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Rościj Kawałki + description: |- + Ranga, która może wydać + kredyt poziomu wyspy + do roszczenia nowych kawałków. + hint: "Twoja ranga nie może rościć kawałków dla tej wyspy!" chunkblock: bossbar: title: Pozostałe bloki + title-prefix: "[title] | " status: 'Bloki fazowe [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "Faza: [phase-name] | Bloki: [done] / [total] | Postęp: [percent-done]" not-active: "Pasek akcji nie jest aktywny dla tej wyspy" + chunks: + entry-denied: "Ten kawałek jest zablokowany." + locked: "Nie możesz go dotknąć — kawałek jest zablokowany." + claim-hint: "Uderz w granicę, aby rościć ten kawałek za [cost] poziomu! Masz [credit] poziomów kredytu." + claim-confirm: "Rościć ten kawałek za [cost] poziomu? Zostawia Ci [after] poziomów kredytu. Ukradkiem i uderz w granicę ponownie w ciągu [seconds]s aby potwierdzić." + no-credit: "Potrzebujesz [needed] więcej poziomów kredytu, aby rościć ten kawałek." + beyond-limit: "Ten kawałek jest poza obszarem ochrony Twojej wyspy." + claimed: "Kawałek roścignięty! Twoja wyspa ma teraz [number] kawałków. Pozostały kredyt: [credit] poziomów." + credit: "Możesz rościć [count] więcej kawałków! Idź do swojej granicy i uderz tam, gdzie chcesz rosnąć." + relocked: "Poziom Twojej wyspy spadł — [count] kawałków ponownie zablokowanych, najnowsze najpierw. Odzyskaj poziomy, aby je odblokować!" + ejected: "Kawałek, w którym byłeś, ponownie się zablokował, więc zostałeś przeniesiony w bezpieczne miejsce." + max-reached: "Wyspa osiągnęła maksymalny rozmiar [number] kawałków!" + ring-complete: "Pierścień [ring] ukończony! Cały pierścień wokół Twojej wyspy jest Twój — [chunks] kawałków w sumie." + ring-broadcast: "Wyspa [name] zamknęła pierścień [ring] [chunks] kawałków i wciąż rośnie!" + rings: "Pierścienie ukończone: [rings] z [max]." + ring-progress: "Pierścień [ring]: [remaining]/[total] kawałków zostało." + sethome-denied: "Nie możesz ustawić domu w zablokowanym kawałku." + info: "Kawałki: [unlocked]/[max]. Kredyt: [credit] poziomów — kawałek kosztuje [cost]." + map: + title: "Terytorium Twojej wyspy ([unlocked]/[max] kawałków):" + row: "[row]" + legend: "■ Twój ▣ Możliwy do roszczenia ([cost] poziomu każdy) □ Zablokowany ◎ Centrum ◆ Ty" + you-are-here: "Jesteś na zaznaczonym kawałku." + dialog: + close: "Zamknij" + tooltip: + center: "Kawałek centralny — Twój magiczny blok jest tutaj." + owned: "Kawałek [x], [z] — Twój." + claimable: "Kawałek [x], [z] — możliwy do roszczenia za [cost] poziomów. Idź do tej granicy i uderz ją." + no-credit: "Kawałek [x], [z] — kosztuje [cost] poziomów. Potrzebujesz [needed] więcej poziomów kredytu." + locked: "Kawałek [x], [z] — zablokowany. Rość swoją ścieżkę do niego." + you-are-here: "Stoisz tutaj." + trophies: + awarded: "Trofeum uzyskane: [name]!" + title-available: "Twoja wyspa uzyskała tytuł [title] — przełączaj go w /ch title." commands: admin: setcount: @@ -57,6 +100,70 @@ chunkblock: parameters: description: wyświetlać kontrolę poprawności prawdopodobieństwa fazy w konsoli see-console: 'Zobacz raport w konsoli' + bypass: + description: "przełącz egzekwowanie blokady kawałków na siebie" + 'on': "Teraz omijasz blokady kawałków. Wizualne granice są ukryte dla Ciebie." + 'off': "Blokady kawałków ponownie się do Ciebie stosują." + chunks: + parameters: " [reset]" + description: "zbadaj odblokowane kawałki gracza lub zablokuj je z powrotem do początku" + info: "[name]: [number]/[max] kawałków, [spent] wydanych poziomów, [credit] kredytu." + reset: "Kawałki [name] zostały ponownie zablokowane do tylko kawałka centralnego." + phases: + description: "otwórz edytor kolejności faz" + no-index: "Indeks fazy nie jest załadowany, więc nie można zmienić kolejności faz" + saved: "Kolejność faz została zapisana i zastosowana" + save-failed: "Nie udało się zapisać kolejności faz! Sprawdź błędy w konsoli" + gui: + title: "Kolejność Faz" + info-title: "Jak używać" + instructions: |- + Kliknij fazę, aby ją podnieść, + a następnie kliknij miejsce, gdzie powinna być. + Prawy przycisk myszy przełącza fazę + w tę/tamtą stronę. + repeat: "Po ostatniej fazie liczba przechodzi do [number]" + phase-name: "[name]" + start: "Start: [number]" + length: "Długość: [number]" + disabled: "Wyłączone" + version-locked: "Wymaga Minecraft [version]+" + pick-up: "Kliknij, aby przenieść" + toggle: "Prawy klik, aby przełączyć" + set-length: "Shift + lewy klik, aby ustawić długość" + drop-here: "Kliknij, aby upuścić tutaj" + drop-at-end: "Upuść na koniec" + held: "Przenoszenie: [name]" + put-back: "Kliknij, aby odłożyć" + enter-length: "Wprowadź nową długość na czacie dla [name] - aktualnie [number] bloków. Wpisz cancel aby zachować." + invalid-length: "Długość musi być liczbą całkowitą większą od 0" + length-cancelled: "Długość nie zmieniona" + cancel-word: "cancel" + chunks: + description: "pokaż swoje odblokowane kawałki i mapę swojego terytorium" + ledger: + description: "pokaż wkład członków zespołu" + parameters: "[days]" + header: "Rejestr Wkład Wyspy ([window])" + all-time: "cały czas" + last-days: "ostatnie [days] dni" + row: " - [name]: [blocks] bloków, [chunks] kawałków, [rings] pierścieni" + total: "Razem: [blocks] bloków, [chunks] kawałków, [rings] pierścieni" + no-activity: "Nie zarejestowano jeszcze żadnej aktywności." + title: + description: "przełącz tytuł wyspy lub wybierz jeden" + parameters: "[list | trophy-id | none]" + header: "Trofea Twojej wyspy:" + trophy-entry: " - [name]" + title-entry: " - [name] — tytuł [title] (/ch title [id])" + none-earned-yet: "Twoja wyspa nie uzyskała jeszcze żadnych trofeów." + active: "Aktywny tytuł: [title]" + no-active: "Brak aktywnego tytułu. Wybierz jeden za pomocą /ch title." + set: "Tytuł Twojej wyspy to teraz [title]." + cleared: "Twoja wyspa nie wyświetla już tytułu." + toggled-on: "Tytuł wyspy [title] jest teraz widoczny." + toggled-off: "Tytuł wyspy [title] jest teraz ukryty." + not-earned: "Twoja wyspa nie uzyskała trofeum z tym tytułem." count: description: pokaż liczbę bloków i fazę info: 'Jesteś na bloku [number] w fazie [name]' diff --git a/src/main/resources/locales/pt.yml b/src/main/resources/locales/pt.yml index 592e045..f062865 100644 --- a/src/main/resources/locales/pt.yml +++ b/src/main/resources/locales/pt.yml @@ -26,9 +26,17 @@ protection: Mostra um status para cada fase na Action Bar. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Reivindicar Blocos + description: |- + Rank que pode gastar o + crédito de nível da ilha + para reivindicar novos blocos. + hint: "Seu rank não pode reivindicar blocos para esta ilha!" chunkblock: bossbar: title: Bloqueia o restante + title-prefix: "[title] | " status: 'Blocos de fase [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,6 +44,41 @@ chunkblock: actionbar: status: "Fase: [phase-name] | Blocos: [done] / [total] | Progresso: [percent-done]" not-active: "A barra de ação não está ativa para esta ilha" + chunks: + entry-denied: "Aquele bloco está travado." + locked: "Você não pode tocar nisso — o bloco está travado." + claim-hint: "Acerte a borda para reivindicar este bloco por [cost] nível(ns)! Você tem [credit] nível(ns) de crédito." + claim-confirm: "Reivindicar este bloco por [cost] nível(ns)? Isso deixa você [after] nível(ns) de crédito. Esgueirar-se e acertar a borda novamente dentro de [seconds]s para confirmar." + no-credit: "Você precisa [needed] de mais nível(ns) de crédito para reivindicar este bloco." + beyond-limit: "Aquele bloco está além da área de proteção da sua ilha." + claimed: "Bloco reivindicado! Sua ilha tem agora [number] blocos. Crédito restante: [credit] nível(ns)." + credit: "Você pode reivindicar [count] bloco(s) a mais! Vá para sua borda e acerte onde quer crescer." + relocked: "O nível da sua ilha caiu — [count] bloco(s) travado(s) novamente, mais recentes primeiro. Reganha os níveis para reivindicá-los de volta!" + ejected: "O bloco em que você estava se trancou, então você foi movido para um local seguro." + max-reached: "Sua ilha atingiu o tamanho máximo de [number] blocos!" + ring-complete: "Anel [ring] completo! Todo o anel ao redor da sua ilha é seu — [chunks] blocos ao todo." + ring-broadcast: "A ilha de [name] fechou o anel [ring] [chunks] blocos e ainda crescendo!" + rings: "Anéis concluídos: [rings] de [max]." + ring-progress: "Anel [ring]: [remaining]/[total] blocos a partir." + sethome-denied: "Você não pode definir uma home em um bloco travado." + info: "Blocos: [unlocked]/[max]. Crédito: [credit] nível(ns) — um bloco custa [cost]." + map: + title: "Seu território de ilha ([unlocked]/[max] blocos):" + row: "[row]" + legend: "■ seu ▣ reivindicável ([cost] nível(ns) cada) □ travado ◎ centro ◆ você" + you-are-here: "Você está no bloco marcado." + dialog: + close: "Fechar" + tooltip: + center: "O bloco do centro — seu bloco mágico está aqui." + owned: "Bloco [x], [z] — seu." + claimable: "Bloco [x], [z] — reivindicável por [cost] nível(ns). Vá para aquela borda e acerte." + no-credit: "Bloco [x], [z] — custos [cost] nível(ns). Você precisa de [needed] mais nível(ns) de crédito." + locked: "Bloco [x], [z] — travado. Reivindique seu caminho para fora para isso." + you-are-here: "Você está em pé aqui." + trophies: + awarded: "Troféu conquistado: [name]!" + title-available: "Sua ilha ganhou o título [title] — alterne-o em /ch title." commands: admin: setcount: @@ -59,6 +102,70 @@ chunkblock: exibir uma verificação de sanidade das probabilidades de fase no console see-console: 'Veja o console para o relatório' + bypass: + description: "ativar/desativar a aplicação de bloqueio de blocos para você" + 'on': "Você agora desvia dos bloqueios de blocos. Visuais de borda estão ocultos para você." + 'off': "Os bloqueios de blocos se aplicam a você novamente." + chunks: + parameters: " [reset]" + description: "inspecionar os blocos desbloqueados de um jogador ou reconectá-los ao início" + info: "[name]: [number]/[max] blocos, [spent] níveis gastos, [credit] crédito." + reset: "Os blocos de [name] foram retravados de volta ao bloco do centro." + phases: + description: "abrir o editor de ordem de fases" + no-index: "Nenhum índice de fase está carregado, portanto as fases não podem ser reordenadas" + saved: "Ordem de fase salva e aplicada" + save-failed: "Não foi possível salvar a ordem de fase! Veja o console para erros" + gui: + title: "Ordem de Fase" + info-title: "Como usar" + instructions: |- + Clique em uma fase para pegá-la, + depois clique onde ela deve ir. + Clique com o botão direito para alternar uma fase + ligada ou desligada. + repeat: "Após a última fase, a contagem salta para [number]" + phase-name: "[name]" + start: "Início: [number]" + length: "Comprimento: [number]" + disabled: "Desativado" + version-locked: "Precisa de Minecraft [version]+" + pick-up: "Clique para mover" + toggle: "Clique com o botão direito para alternar" + set-length: "Shift-clique esquerdo para definir comprimento" + drop-here: "Clique para soltar aqui" + drop-at-end: "Soltar no final" + held: "Movendo: [name]" + put-back: "Clique para colocar de volta" + enter-length: "Digite um novo comprimento no bate-papo para [name] - atualmente é [number] blocos. Digite cancel para mantê-lo." + invalid-length: "O comprimento deve ser um número inteiro acima de 0" + length-cancelled: "Comprimento não alterado" + cancel-word: "cancel" + chunks: + description: "mostrar seus blocos desbloqueados e um mapa de seu território" + ledger: + description: "mostrar contribuições de membros da equipe" + parameters: "[days]" + header: "Razão de Contribuição da Ilha ([window])" + all-time: "a todo o tempo" + last-days: "últimos [days] dias" + row: " - [name]: [blocks] blocos, [chunks] blocos, [rings] anéis" + total: "Total: [blocks] blocos, [chunks] blocos, [rings] anéis" + no-activity: "Nenhuma atividade registrada ainda." + title: + description: "alterne o título da sua ilha ou escolha um" + parameters: "[list | trophy-id | none]" + header: "Troféus da sua ilha:" + trophy-entry: " - [name]" + title-entry: " - [name] — título [title] (/ch title [id])" + none-earned-yet: "Sua ilha não ganhou nenhum troféu ainda." + active: "Título ativo: [title]" + no-active: "Nenhum título ativo. Escolha um com /ch title." + set: "O título da sua ilha é agora [title]." + cleared: "Sua ilha não mostra mais um título." + toggled-on: "Título da ilha [title] agora está mostrando." + toggled-off: "Título da ilha [title] agora está oculto." + not-earned: "Sua ilha não ganhou um troféu com esse título." count: description: mostra a contagem de blocos e a fase info: 'Você está no bloco [number] no [name] fase' diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index 97032f7..4fe19ba 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -24,9 +24,17 @@ protection: CHUNKBLOCK_ACTIONBAR: name: Панель действий description: Показывает статус фазы в панели действий + CHUNKBLOCK_CLAIM_CHUNKS: + name: Захват Чанков + description: |- + Ранг, который может потратить + кредит уровня острова + для захвата новых чанков. + hint: "Ваш ранг не может захватывать чанки для этого острова!" chunkblock: bossbar: title: Осталось блоков + title-prefix: "[title] | " # статус: "Статус фазы [total]. Осталось: [todo]" # статус: "[phase-name] : [percent-done]" status: Статус фазы [done] / [total] @@ -38,6 +46,41 @@ chunkblock: actionbar: status: 'Фаза: [phase-name] | Блоков: [done] / [total] | Прогресс: [percent-done]' not-active: Панель действий отключена на этом острове. + chunks: + entry-denied: "Этот чанк заблокирован." + locked: "Вы не можете это трогать — чанк заблокирован." + claim-hint: "Ударьте границу, чтобы захватить этот чанк за [cost] уровень(ей)! У вас есть [credit] уровень(ей) кредита." + claim-confirm: "Захватить этот чанк за [cost] уровень(ей)? Это оставит вас [after] уровень(ей) кредита. Встаньте на корточки и ударьте границу еще раз в течение [seconds]s для подтверждения." + no-credit: "Вам нужно [needed] больше уровень(ей) кредита, чтобы захватить этот чанк." + beyond-limit: "Этот чанк находится за пределами области защиты вашего острова." + claimed: "Чанк захвачен! Ваш остров теперь [number] чанков. Остаток кредита: [credit] уровень(ей)." + credit: "Вы можете захватить еще [count] чанк(ов)! Идите на границу и ударьте там, где хотите расти." + relocked: "Уровень вашего острова упал — [count] чанк(ов) повторно заблокирован, новые первыми. Вернитесь к уровням, чтобы повторно их захватить!" + ejected: "Чанк, в котором вы были, повторно заблокировался, поэтому вас переместили в безопасное место." + max-reached: "Ваш остров достиг максимального размера [number] чанков!" + ring-complete: "Кольцо [ring] завершено! Все кольцо вокруг вашего острова принадлежит вам — [chunks] чанков всего." + ring-broadcast: "Остров [name] закрыл кольцо [ring] [chunks] чанков и продолжает расти!" + rings: "Завершенные кольца: [rings] из [max]." + ring-progress: "Кольцо [ring]: [remaining]/[total] чанков осталось." + sethome-denied: "Вы не можете установить дом в заблокированном чанке." + info: "Чанки: [unlocked]/[max]. Кредит: [credit] уровень(ей) — чанк стоит [cost]." + map: + title: "Территория вашего острова ([unlocked]/[max] чанков):" + row: "[row]" + legend: "■ ваш ▣ доступный для захвата ([cost] уровень(ей) каждый) □ заблокирован ◎ центр ◆ вы" + you-are-here: "Вы находитесь на отмеченном чанке." + dialog: + close: "Закрыть" + tooltip: + center: "Центральный чанк — ваш магический блок здесь." + owned: "Чанк [x], [z] — ваш." + claimable: "Чанк [x], [z] — доступен для захвата за [cost] уровень(ей). Идите на эту границу и ударьте." + no-credit: "Чанк [x], [z] — стоит [cost] уровень(ей). Вам нужно [needed] больше уровень(ей) кредита." + locked: "Чанк [x], [z] — заблокирован. Захватите себе путь к нему." + you-are-here: "Вы стоите здесь." + trophies: + awarded: "Трофей заработан: [name]!" + title-available: "Ваш остров заработал звание [title] — переключайте его с помощью /ch title." commands: admin: setcount: @@ -59,6 +102,70 @@ chunkblock: parameters: <фаза> description: вывести в консоль проверку вероятностей фазы see-console: Смотрите отчёт в консоли. + bypass: + description: "переключать принудительное применение блокировки чанков для себя" + 'on': "Вы теперь обходите блокировки чанков. Визуальные границы скрыты от вас." + 'off': "Блокировки чанков снова применяются к вам." + chunks: + parameters: "<игрок> [reset]" + description: "проверить разблокированные чанки игрока или заблокировать их обратно в начало" + info: "[name]: [number]/[max] чанков, [spent] потраченных уровней, [credit] кредита." + reset: "Чанки [name] были повторно заблокированы только для центрального чанка." + phases: + description: "открыть редактор порядка фаз" + no-index: "Индекс фаз не загружен, поэтому фазы не могут быть переупорядочены" + saved: "Порядок фаз сохранен и применен" + save-failed: "Не удалось сохранить порядок фаз! Проверьте консоль на наличие ошибок" + gui: + title: "Порядок Фаз" + info-title: "Как использовать" + instructions: |- + Нажмите на фазу, чтобы поднять ее, + затем нажмите, где она должна быть. + Щелкните правой кнопкой мыши, чтобы переключить фазу + включении или отключении. + repeat: "После последней фазы счетчик переходит на [number]" + phase-name: "[name]" + start: "Начало: [number]" + length: "Длина: [number]" + disabled: "Отключено" + version-locked: "Требуется Minecraft [version]+" + pick-up: "Нажмите, чтобы переместить" + toggle: "Щелкните правой кнопкой мыши, чтобы переключить" + set-length: "Shift + левый клик, чтобы установить длину" + drop-here: "Нажмите, чтобы поместить здесь" + drop-at-end: "Поместить в конец" + held: "Перемещение: [name]" + put-back: "Нажмите, чтобы положить обратно" + enter-length: "Введите новую длину в чат для [name] - в настоящее время [number] блоков. Введите cancel чтобы сохранить." + invalid-length: "Длина должна быть целым числом больше 0" + length-cancelled: "Длина не изменена" + cancel-word: "cancel" + chunks: + description: "показать ваши разблокированные чанки и карту вашей территории" + ledger: + description: "показать взносы членов команды" + parameters: "[days]" + header: "Реестр вклада острова ([window])" + all-time: "за все время" + last-days: "последние [days] дней" + row: " - [name]: [blocks] блоков, [chunks] чанков, [rings] колец" + total: "Итого: [blocks] блоков, [chunks] чанков, [rings] колец" + no-activity: "Пока нет записей об активности." + title: + description: "переключать звание острова или выбрать один" + parameters: "[list | trophy-id | none]" + header: "Трофеи вашего острова:" + trophy-entry: " - [name]" + title-entry: " - [name] — звание [title] (/ch title [id])" + none-earned-yet: "Ваш остров еще не заработал ни одного трофея." + active: "Активное звание: [title]" + no-active: "Нет активного звания. Выберите один с помощью /ch title." + set: "Звание вашего острова теперь [title]." + cleared: "Ваш остров больше не показывает звание." + toggled-on: "Звание острова [title] теперь отображается." + toggled-off: "Звание острова [title] теперь скрыто." + not-earned: "Ваш остров не заработал трофей с этим званием." count: description: показать количество вскопано блоков и фазу info: Вскопано [number] блоков на фазе [name] diff --git a/src/main/resources/locales/tr.yml b/src/main/resources/locales/tr.yml index 9aa4cec..a466ed3 100644 --- a/src/main/resources/locales/tr.yml +++ b/src/main/resources/locales/tr.yml @@ -26,9 +26,17 @@ protection: Her aşama için bir durumu Eylem Çubuğunda gösterir. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Kısımları Talep Et + description: |- + Adanın seviye kredisini + harcayarak yeni kısımları talep + edebilecek rütbe. + hint: "Rütbeniz bu ada için kısımları talep edemez!" chunkblock: bossbar: title: Kalan bloklar + title-prefix: "[title] | " status: 'Faz blokları [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,7 +44,67 @@ chunkblock: actionbar: status: "Aşama: [phase-name] | Bloklar: [done] / [total] | İlerleme: [percent-done]" not-active: "Bu ada için eylem çubuğu aktif değil" + trophies: + awarded: "Ödül kazanıldı: [name]!" + title-available: "Adanız şu başlığı kazandı [title]/ch title kullanarak açıp kapatın." + chunks: + entry-denied: "Bu kısım kilitli." + locked: "Buna dokunmayabilirsin — kısım kilitli." + claim-hint: "Bu kısımı talep etmek için sınırı vur [cost] seviye(si) için! Var [credit] seviye(si) kredi." + claim-confirm: "Bu kısımı [cost] seviye(si) için talep etmek istiyor musun? Sana [after] seviye(si) kredi bırakacak. Gizli tuş ve sınırı yeniden vur içinde [seconds]s onaylamak için." + no-credit: "Bu kısımı talep etmek için [needed] daha fazla seviye(si) krediye ihtiyacın var." + beyond-limit: "Bu kısım adanın koruma alanının ötesinde." + claimed: "Kısım talep edildi! Adanız şimdi [number] kısım. Kalan kredi: [credit] seviye(si)." + credit: "Daha [count] kısım talep edebilirsin! Sınırına git ve büyütmek istediğin yeri vur." + relocked: "Ada seviyeniz düştü — [count] kısım yeniden kilitlendi, en yenisi önce. Seviyelerinizi geri kazanarak talep edin!" + ejected: "İçinde bulunduğun kısım yeniden kilitlendi, bu yüzden seni güvenli alana taşındım." + max-reached: "Adanız maksimum boyutu [number] kısma ulaştı!" + ring-complete: "Halka [ring] tamamlandı! Adanın etrafındaki tüm halka sinin — [chunks] kısım toplamı." + ring-broadcast: "[name]'nin adası halka [ring] kapattı — [chunks] kısım ve hala büyüyor!" + rings: "Tamamlanan halkalar: [rings] / [max]." + ring-progress: "Halka [ring]: [remaining]/[total] kısım gitmek için." + sethome-denied: "Kilitli bir kısımda ev ayarlayamazsın." + info: "Kısımlar: [unlocked]/[max]. Kredi: [credit] seviye(si) — bir kısım maliyeti [cost]." + map: + title: "Adanızın bölgesi ([unlocked]/[max] kısım):" + row: "[row]" + legend: "■ senin ▣ talep edilebilir ([cost] seviye(si) her biri) □ kilitli ◎ merkez ◆ sen" + you-are-here: "İşaretlenmiş kısımda varsın." + dialog: + close: "Kapat" + tooltip: + center: "Merkez kısım — sihirli bloğun burada." + owned: "Kısım [x], [z] — senin." + claimable: "Kısım [x], [z] — talep edilebilir [cost] seviye(si) için. O sınırına git ve vur." + no-credit: "Kısım [x], [z] — maliyetler [cost] seviye(si). [needed] daha fazla seviye(si) krediye ihtiyacın var." + locked: "Kısım [x], [z] — kilitli. Talep ederek çık." + you-are-here: "Burada duruyorsun." commands: + chunks: + description: "talep edilen kısımlarınızı ve bölgenizin haritasını göster" + ledger: + description: "takım üyesi katkılarını göster" + parameters: "[gün]" + header: "Ada Katkı Defteri ([window])" + all-time: "tüm zaman" + last-days: "son [days] gün" + row: " - [name]: [blocks] blok, [chunks] kısım, [rings] halka" + total: "Toplam: [blocks] blok, [chunks] kısım, [rings] halka" + no-activity: "Henüz hiçbir etkinlik kaydedilmedi." + title: + description: "adanızın başlığını aç/kapat veya birini seç" + parameters: "[liste | ödül-id | yok]" + header: "Adanızın ödülleri:" + trophy-entry: " - [name]" + title-entry: " - [name] — başlık [title] (/ch title [id])" + none-earned-yet: "Adanız henüz hiçbir ödül kazanmadı." + active: "Etkin başlık: [title]" + no-active: "Etkin başlık yok. Birini seç /ch title." + set: "Adanızın başlığı şimdi [title]." + cleared: "Adanız artık başlık göstermiyor." + toggled-on: "Ada başlığı [title] şimdi gösteriliyor." + toggled-off: "Ada başlığı [title] şimdi gizli." + not-earned: "Adanız bu başlığa sahip bir ödül kazanmadı." admin: setcount: parameters: [lifetime] @@ -57,6 +125,45 @@ chunkblock: parameters: description: konsoldaki faz olasılıklarının akıl sağlığını kontrol etmek see-console: 'Rapor için konsola bakın' + bypass: + description: "kendiniz için kısım kilit uygulamasını değiştir" + "on": "Kısım kilitlerini atlayıyorsunuz. Sınır görselleri sizin için gizli." + "off": "Kısım kilitleri yeniden uygulanıyor." + chunks: + parameters: " [sıfırla]" + description: "oyuncunun talep edilen kısımlarını kontrol et veya başlangıca kilitle" + info: "[name]: [number]/[max] kısım, [spent] seviye(si) harcanmış, [credit] kredi." + reset: "[name]'nin kısımları yalnızca merkez kısma kadar yeniden kilitlendi." + phases: + description: "faz sırası editörünü aç" + no-index: "Hiçbir faz dizini yüklenmedi, bu yüzden fazlar yeniden sıralanamaz" + saved: "Faz sırası kaydedildi ve uygulandı" + save-failed: "Faz sırası kaydedilemedi! Hatalar için konsola bakın" + gui: + title: "Faz Sırası" + info-title: "Nasıl Kullanılır" + instructions: |- + Bir fazı almak için tıkla, + sonra nereye gitmesi gerektiğini tıkla. + Sağ tıkla bir fazı + açıp kapatmak için. + repeat: "Son fazdan sonra sayı [number] ye atlar" + phase-name: "[name]" + start: "Başlangıç: [number]" + length: "Uzunluk: [number]" + disabled: "Devre Dışı" + version-locked: "Minecraft [version]+ Gerekli" + pick-up: "Taşımak için tıkla" + toggle: "Değiştirmek için sağ tıkla" + set-length: "Uzunluğu ayarlamak için Shift+Sol tıkla" + drop-here: "Buraya düşürmek için tıkla" + drop-at-end: "Sona düşür" + held: "Taşınıyor: [name]" + put-back: "Geri koymak için tıkla" + enter-length: "Sohbete [name] için yeni bir uzunluk gir - şu anda [number] blok. Yazı cancel onu tutmak için." + invalid-length: "Uzunluk 0'dan büyük bir tam sayı olmalı" + length-cancelled: "Uzunluk değiştirilmedi" + cancel-word: "cancel" count: description: blok sayısını ve aşamayı göster info: '[name] aşamasında blok [number] üzerindesiniz' diff --git a/src/main/resources/locales/uk.yml b/src/main/resources/locales/uk.yml index 2ee5b22..ad76b90 100644 --- a/src/main/resources/locales/uk.yml +++ b/src/main/resources/locales/uk.yml @@ -26,9 +26,17 @@ protection: Показує статус для кожної фази в Action Bar. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Заявити Чанки + description: |- + Ранг, який може витратити + кредит рівня острова на + заяву нових чанків. + hint: "Ваш ранг не може заявити чанки для цього острова!" chunkblock: bossbar: title: Блоки, що залишилися + title-prefix: "[title] | " status: 'Фазові блоки [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,7 +44,67 @@ chunkblock: actionbar: status: "Фаза: [phase-name] | Блоки: [done] / [total] | Прогрес: [percent-done]" not-active: "Панель дій не активна для цього острова" + trophies: + awarded: "Трофей отримано: [name]!" + title-available: "Ваш остріїв отримав назву [title] — перемикайте її вкл/вимк, використовуючи /ch title." + chunks: + entry-denied: "Цей чанк заблокований." + locked: "Ти не можеш це торкатись — чанк заблокований." + claim-hint: "Ударьте кордон, щоб заявити цей чанк за [cost] рівень(я)! У вас є [credit] рівень(я) кредиту." + claim-confirm: "Заявити цей чанк за [cost] рівень(я)? Це залишить вас [after] рівень(я) кредиту. Присядьте та ударьте кордон ще раз протягом [seconds]s для підтвердження." + no-credit: "Вам потрібно [needed] більше рівнів кредиту для заяви цього чанку." + beyond-limit: "Цей чанк знаходиться за межами зони захисту вашого острова." + claimed: "Чанк заявлено! Ваш остріїв тепер [number] чанків. Залишилось кредиту: [credit] рівень(я)." + credit: "Ви можете заявити [count] більше чанків! Йдіть до свого кордону й ударьте туди, де хочете розростатися." + relocked: "Рівень вашого острова впав — [count] чанків перезаблоковано, найновіші першими. Повернення рівнів для повторного заявлення!" + ejected: "Чанк, в якому ви були, перезаблокований, тому вас переведено в безпеку." + max-reached: "Ваш остріїв досяг максимального розміру [number] чанків!" + ring-complete: "Кільце [ring] завершено! Все кільце навколо вашого острова - ваше — [chunks] чанків всього." + ring-broadcast: "Остріїв [name] закрив кільце [ring] [chunks] чанків та все ще зростає!" + rings: "Завершених кілець: [rings] / [max]." + ring-progress: "Кільце [ring]: [remaining]/[total] чанків залишилось." + sethome-denied: "Ви не можете встановити домівку в заблокованому чанку." + info: "Чанки: [unlocked]/[max]. Кредит: [credit] рівень(я) — чанк коштує [cost]." + map: + title: "Територія вашого острова ([unlocked]/[max] чанків):" + row: "[row]" + legend: "■ ваш ▣ можна заявити ([cost] рівень(я) кожен) □ заблокований ◎ центр ◆ ви" + you-are-here: "Ви на позначеному чанку." + dialog: + close: "Закрити" + tooltip: + center: "Центральний чанк — ваш магічний блок тут." + owned: "Чанк [x], [z] — ваш." + claimable: "Чанк [x], [z] — можна заявити за [cost] рівень(я). Йдіть до того кордону та ударьте." + no-credit: "Чанк [x], [z] — коштує [cost] рівень(я). Вам потрібно [needed] більше рівнів кредиту." + locked: "Чанк [x], [z] — заблокований. Заявіть свій шлях до нього." + you-are-here: "Ви тут стоїте." commands: + chunks: + description: "показати ваші розблоковані чанки та карту вашої території" + ledger: + description: "показати внески членів команди" + parameters: "[дні]" + header: "Реєстр внесків острова ([window])" + all-time: "весь час" + last-days: "останні [days] днів" + row: " - [name]: [blocks] блоків, [chunks] чанків, [rings] кілець" + total: "Всього: [blocks] блоків, [chunks] чанків, [rings] кілець" + no-activity: "Ще не записано ніякої діяльності." + title: + description: "перемикати назву острова вкл/вимк або виберіть одну" + parameters: "[список | id-трофею | немає]" + header: "Трофеї вашого острова:" + trophy-entry: " - [name]" + title-entry: " - [name] — назва [title] (/ch title [id])" + none-earned-yet: "Ваш остріїв ще не отримав жодних трофеїв." + active: "Активна назва: [title]" + no-active: "Немає активної назви. Виберіть одну за допомогою /ch title." + set: "Назва вашого острова тепер [title]." + cleared: "Ваш остріїв більше не показує назву." + toggled-on: "Назва острова [title] тепер видима." + toggled-off: "Назва острова [title] тепер прихована." + not-earned: "Ваш остріїв не отримав трофей з такою назвою." admin: setcount: parameters: [lifetime] @@ -57,6 +125,45 @@ chunkblock: parameters: description: відобразити перевірку працездатності ймовірностей фази на консолі see-console: 'Дивіться консоль для звіту' + bypass: + description: "перемикати застосування блокування чанків для себе" + "on": "Ви тепер обходите блокування чанків. Візуалізація кордону для вас прихована." + "off": "Блокування чанків знову застосовується." + chunks: + parameters: "<гравець> [скинути]" + description: "перевірити розблоковані чанки гравця або перезаблокувати їх на початок" + info: "[name]: [number]/[max] чанків, [spent] рівнів витрачено, [credit] кредиту." + reset: "Чанки [name] перезаблоковані назад до лише центрального чанку." + phases: + description: "відкрити редактор порядку фаз" + no-index: "Жодна фаза не завантажена, тому фази не можна переупорядкувати" + saved: "Порядок фаз збережено та застосовано" + save-failed: "Не вдалося зберегти порядок фаз! Див. консоль для помилок" + gui: + title: "Порядок Фаз" + info-title: "Як Користуватись" + instructions: |- + Клацніть на фазу, щоб взяти, + потім клацніть, де вона повинна піти. + Щоб перемикнути фазу + вкл/вимк, клацніть правою кнопкою. + repeat: "Після останньої фази лічильник переходить до [number]" + phase-name: "[name]" + start: "Початок: [number]" + length: "Довжина: [number]" + disabled: "Вимкнено" + version-locked: "Потребує Minecraft [version]+" + pick-up: "Клацніть для переміщення" + toggle: "Щоб перемикнути, клацніть правою кнопкою" + set-length: "Shift+ліва кнопка миші для встановлення довжини" + drop-here: "Клацніть для розміщення тут" + drop-at-end: "Розмістити в кінці" + held: "Переміщення: [name]" + put-back: "Клацніть для повернення" + enter-length: "Введіть нову довжину в чат для [name] - зараз це [number] блоків. Введіть cancel щоб залишити як є." + invalid-length: "Довжина повинна бути цілим числом більшим за 0" + length-cancelled: "Довжина не змінена" + cancel-word: "cancel" count: description: показати кількість блоків і фазу info: 'Ви знаходитесь у блоці [number] у фазі [name].' diff --git a/src/main/resources/locales/vi.yml b/src/main/resources/locales/vi.yml index 43d8415..d042708 100644 --- a/src/main/resources/locales/vi.yml +++ b/src/main/resources/locales/vi.yml @@ -26,9 +26,17 @@ protection: Hiển thị trạng thái cho mỗi giai đoạn trên Thanh Hành Động. + CHUNKBLOCK_CLAIM_CHUNKS: + name: Yêu Cầu Khối + description: |- + Cấp bậc có thể sử dụng + tín dụng cấp độ đảo để + yêu cầu những khối mới. + hint: "Cấp bậc của bạn không thể yêu cầu khối cho hòn đảo này!" chunkblock: bossbar: title: Khối còn lại + title-prefix: "[title] | " status: 'Khối pha [done] / [total]' color: RED style: SEGMENTED_20 @@ -36,7 +44,67 @@ chunkblock: actionbar: status: "Giai đoạn: [phase-name] | Khối: [done] / [total] | Tiến độ: [percent-done]" not-active: "Thanh hành động không hoạt động cho hòn đảo này" + trophies: + awarded: "Chiến thắng được trao: [name]!" + title-available: "Hòn đảo của bạn đã kiếm được tiêu đề [title] — bật/tắt nó bằng cách sử dụng /ch title." + chunks: + entry-denied: "Khối đó bị khóa." + locked: "Bạn không thể chạm vào đó — khối bị khóa." + claim-hint: "Đánh vào biên giới để yêu cầu khối này cho [cost] cấp độ! Bạn có [credit] cấp độ tín dụng." + claim-confirm: "Yêu cầu khối này cho [cost] cấp độ? Điều đó để lại cho bạn [after] cấp độ tín dụng. Ngồi xổm và đánh vào biên giới lần nữa trong [seconds]s để xác nhận." + no-credit: "Bạn cần [needed] cấp độ tín dụng hơn để yêu cầu khối này." + beyond-limit: "Khối đó vượt quá khu vực bảo vệ của hòn đảo bạn." + claimed: "Khối được yêu cầu! Hòn đảo của bạn bây giờ [number] khối. Tín dụng còn lại: [credit] cấp độ." + credit: "Bạn có thể yêu cầu [count] khối nữa! Đi đến biên giới của bạn và đánh nó nơi bạn muốn phát triển." + relocked: "Cấp độ hòn đảo của bạn đã giảm — [count] khối được khóa lại, những cái mới nhất trước. Lấy lại các cấp độ để yêu cầu lại!" + ejected: "Khối bạn đang ở bị khóa lại, nên bạn được di chuyển đến an toàn." + max-reached: "Hòn đảo của bạn đã đạt kích thước tối đa [number] khối!" + ring-complete: "Vòng [ring] hoàn thành! Toàn bộ vòng quanh hòn đảo của bạn là của bạn — [chunks] khối tính cả." + ring-broadcast: "Hòn đảo [name] đã đóng vòng [ring] [chunks] khối và vẫn đang phát triển!" + rings: "Vòng hoàn thành: [rings] / [max]." + ring-progress: "Vòng [ring]: [remaining]/[total] khối để đi." + sethome-denied: "Bạn không thể đặt nhà ở khối bị khóa." + info: "Khối: [unlocked]/[max]. Tín dụng: [credit] cấp độ — một khối chi phí [cost]." + map: + title: "Lãnh thổ hòn đảo của bạn ([unlocked]/[max] khối):" + row: "[row]" + legend: "■ của bạn ▣ có thể yêu cầu ([cost] cấp độ mỗi cái) □ khóa ◎ trung tâm ◆ bạn" + you-are-here: "Bạn ở trên khối được đánh dấu." + dialog: + close: "Đóng" + tooltip: + center: "Khối trung tâm — khối ma thuật của bạn ở đây." + owned: "Khối [x], [z] — của bạn." + claimable: "Khối [x], [z] — có thể yêu cầu cho [cost] cấp độ. Đi đến biên giới đó và đánh nó." + no-credit: "Khối [x], [z] — chi phí [cost] cấp độ. Bạn cần [needed] cấp độ tín dụng hơn." + locked: "Khối [x], [z] — khóa. Yêu cầu đường đi đến nó." + you-are-here: "Bạn đang đứng ở đây." commands: + chunks: + description: "hiển thị các khối đã mở khóa và bản đồ lãnh thổ của bạn" + ledger: + description: "hiển thị đóng góp thành viên nhóm" + parameters: "[ngày]" + header: "Sổ Cái Đóng Góp Hòn Đảo ([window])" + all-time: "tất cả thời gian" + last-days: "[days] ngày trước" + row: " - [name]: [blocks] khối, [chunks] khối, [rings] vòng" + total: "Tổng cộng: [blocks] khối, [chunks] khối, [rings] vòng" + no-activity: "Chưa có hoạt động nào được ghi lại." + title: + description: "bật/tắt tiêu đề hòn đảo của bạn, hoặc chọn một" + parameters: "[danh sách | id-chiến thắng | không]" + header: "Chiến thắng hòn đảo của bạn:" + trophy-entry: " - [name]" + title-entry: " - [name] — tiêu đề [title] (/ch title [id])" + none-earned-yet: "Hòn đảo của bạn chưa kiếm được chiến thắng nào." + active: "Tiêu đề hoạt động: [title]" + no-active: "Không có tiêu đề hoạt động. Chọn một với /ch title." + set: "Tiêu đề hòn đảo của bạn bây giờ [title]." + cleared: "Hòn đảo của bạn không còn hiển thị tiêu đề." + toggled-on: "Tiêu đề hòn đảo [title] bây giờ đang hiển thị." + toggled-off: "Tiêu đề hòn đảo [title] bây giờ bị ẩn." + not-earned: "Hòn đảo của bạn chưa kiếm được chiến thắng với tiêu đề đó." admin: setcount: parameters: @@ -59,6 +127,45 @@ chunkblock: hiển thị kiểm tra sự đúng đắn của xác suất giao đoạn lên bảng điều khiển see-console: 'Xem bảng điều khiển cho báo cáo' + bypass: + description: "bật/tắt thực thi khóa khối cho chính bạn" + "on": "Bạn bây giờ bỏ qua khóa khối. Hình ảnh biên giới bị ẩn với bạn." + "off": "Khóa khối áp dụng lại cho bạn." + chunks: + parameters: " [đặt lại]" + description: "kiểm tra các khối đã mở khóa của người chơi hoặc khóa lại chúng trở về lúc bắt đầu" + info: "[name]: [number]/[max] khối, [spent] cấp độ đã sử dụng, [credit] tín dụng." + reset: "Các khối của [name] được khóa lại quay trở về chỉ khối trung tâm." + phases: + description: "mở trình chỉnh sửa thứ tự giai đoạn" + no-index: "Không có chỉ mục giai đoạn được tải, vì vậy không thể sắp xếp lại các giai đoạn" + saved: "Thứ tự giai đoạn được lưu và áp dụng" + save-failed: "Không thể lưu thứ tự giai đoạn! Xem bảng điều khiển để biết lỗi" + gui: + title: "Thứ Tự Giai Đoạn" + info-title: "Cách Sử Dụng" + instructions: |- + Nhấp vào một giai đoạn để nhặt nó, + sau đó nhấp nơi nó sẽ đi. + Nhấp chuột phải để bật/tắt giai đoạn + bật hoặc tắt. + repeat: "Sau giai đoạn cuối cùng bộ đếm nhảy tới [number]" + phase-name: "[name]" + start: "Bắt đầu: [number]" + length: "Độ dài: [number]" + disabled: "Vô Hiệu Hóa" + version-locked: "Cần Minecraft [version]+" + pick-up: "Nhấp để di chuyển" + toggle: "Nhấp chuột phải để bật/tắt" + set-length: "Shift+nhấp chuột trái để đặt độ dài" + drop-here: "Nhấp để thả ở đây" + drop-at-end: "Thả ở cuối" + held: "Di chuyển: [name]" + put-back: "Nhấp để đặt lại" + enter-length: "Nhập độ dài mới trong trò chuyện cho [name] - hiện tại là [number] khối. Nhập cancel để giữ nó." + invalid-length: "Độ dài phải là một số nguyên lớn hơn 0" + length-cancelled: "Độ dài không thay đổi" + cancel-word: "cancel" count: description: hiển thị số khối và giai đoạn info: 'Bạn đang ở trên khối [number] trong giai đoạn [name]' diff --git a/src/main/resources/locales/zh-CN.yml b/src/main/resources/locales/zh-CN.yml index 863c135..37a9d9d 100644 --- a/src/main/resources/locales/zh-CN.yml +++ b/src/main/resources/locales/zh-CN.yml @@ -25,9 +25,17 @@ protection: 在动作栏中 显示每个阶段 的状态。 + CHUNKBLOCK_CLAIM_CHUNKS: + name: 领地块 + description: |- + 可以消耗岛屿的等级 + 信用来领地新块的 + 等级。 + hint: "您的等级无法为此岛屿领地块!" chunkblock: bossbar: title: 剩余的块 + title-prefix: "[title] | " status: '相位块 [done] / [total]' color: RED style: SEGMENTED_20 @@ -35,7 +43,67 @@ chunkblock: actionbar: status: "阶段: [phase-name] | 方块数: [done] / [total] | 进度: [percent-done]" not-active: "该岛屿的动作栏未激活" + trophies: + awarded: "奖杯获得: [name]!" + title-available: "您的岛屿获得了头衔 [title] — 使用 /ch title 来开/关。" + chunks: + entry-denied: "这个块被锁定了。" + locked: "您无法碰触这个 — 块被锁定了。" + claim-hint: "击中边界来领地此块 [cost] 级(别)! 您有 [credit] 级(别)的信用。" + claim-confirm: "领地此块 [cost] 级(别)? 这样您将剩下 [after] 级(别)的信用。 潜行并再次击中边界 [seconds]s 内以确认。" + no-credit: "您需要更多 [needed] 级(别)的信用来领地此块。" + beyond-limit: "这个块超出了您岛屿的保护区。" + claimed: "块已领地! 您的岛屿现在有 [number] 块。剩余信用: [credit] 级(别)。" + credit: "您还可以领地 [count] 块! 去您的边界并击中您想要扩展的地方。" + relocked: "您岛屿的等级下降 — [count] 块被重新锁定,最新的优先。重新获得等级来领地它们!" + ejected: "您所在的块被重新锁定,所以您被传送到安全地点。" + max-reached: "您的岛屿已达到最大大小 [number] 块!" + ring-complete: "环 [ring] 完成! 您岛屿周围的整个环都是您的 — [chunks] 块共计。" + ring-broadcast: "[name] 的岛屿已关闭环 [ring] [chunks] 块并继续增长!" + rings: "完成的环: [rings] / [max]" + ring-progress: "环 [ring]: [remaining]/[total] 块待完成。" + sethome-denied: "您无法在锁定的块中设置家。" + info: "块: [unlocked]/[max]。信用: [credit] 级(别) — 领地一个块花费 [cost]" + map: + title: "您的岛屿领地 ([unlocked]/[max] 块):" + row: "[row]" + legend: "■ 您的 ▣ 可领地 ([cost] 级(别)每个) □ 锁定 ◎ 中心 ◆ 您" + you-are-here: "您在标记的块上。" + dialog: + close: "关闭" + tooltip: + center: "中心块 — 您的魔法块在这里。" + owned: "块 [x], [z] — 您的。" + claimable: "块 [x], [z] — 可以 [cost] 级(别)领地。去那个边界并击中它。" + no-credit: "块 [x], [z] — 花费 [cost] 级(别)。您需要 [needed] 更多级(别)的信用。" + locked: "块 [x], [z] — 锁定。领地您的方式到它。" + you-are-here: "您正站在这里。" commands: + chunks: + description: "显示您已领地的块和您领地的地图" + ledger: + description: "显示团队成员的贡献" + parameters: "[天]" + header: "岛屿贡献分类账 ([window])" + all-time: "所有时间" + last-days: "最后 [days] 天" + row: " - [name]: [blocks] 块, [chunks] 块, [rings]" + total: "总计: [blocks] 块, [chunks] 块, [rings]" + no-activity: "还没有记录任何活动。" + title: + description: "开/关您岛屿的头衔,或选择一个" + parameters: "[列表 | 奖杯-id | 无]" + header: "您岛屿的奖杯:" + trophy-entry: " - [name]" + title-entry: " - [name] — 头衔 [title] (/ch title [id])" + none-earned-yet: "您的岛屿还没有获得任何奖杯。" + active: "活跃头衔: [title]" + no-active: "没有活跃的头衔。用 /ch title 选择一个。" + set: "您岛屿的头衔现在是 [title]" + cleared: "您的岛屿不再显示头衔。" + toggled-on: "岛屿头衔 [title] 现在显示。" + toggled-off: "岛屿头衔 [title] 现在隐藏。" + not-earned: "您的岛屿还没有获得这个头衔的奖杯。" admin: setcount: parameters: <玩家名称> <数量> @@ -56,6 +124,45 @@ chunkblock: parameters: <阶段> description: 在后台生成一份关于各阶段所占百分比的完整报告 see-console: '报告已在后台生成' + bypass: + description: "切换对自己是否应用块锁定执行" + "on": "您现在绕过块锁定。边界视觉效果对您隐藏。" + "off": "块锁定重新应用到您。" + chunks: + parameters: "<玩家> [重置]" + description: "检查玩家的已领地块或将其重新锁定回开始" + info: "[name]: [number]/[max] 块, [spent] 等级已花费, [credit] 信用。" + reset: "[name] 的块已重新锁定回仅中心块。" + phases: + description: "打开阶段顺序编辑器" + no-index: "没有加载阶段索引,所以无法重新排序阶段" + saved: "阶段顺序已保存并应用" + save-failed: "无法保存阶段顺序! 查看控制台以获取错误" + gui: + title: "阶段顺序" + info-title: "如何使用" + instructions: |- + 单击一个阶段以拿起它, + 然后单击应该放置的位置。 + 右键单击以切换阶段 + 打开或关闭。 + repeat: "最后一个阶段后计数跳转到 [number]" + phase-name: "[name]" + start: "开始: [number]" + length: "长度: [number]" + disabled: "禁用" + version-locked: "需要 Minecraft [version]+" + pick-up: "单击以移动" + toggle: "右键单击以切换" + set-length: "Shift+左键单击以设置长度" + drop-here: "单击以放在这里" + drop-at-end: "放在最后" + held: "移动: [name]" + put-back: "单击以放回" + enter-length: "在聊天中为 [name] 输入新长度 - 当前为 [number] 块。输入 cancel 以保持原样。" + invalid-length: "长度必须是大于 0 的整数" + length-cancelled: "长度未更改" + cancel-word: "cancel" count: description: 显示方块数量和阶段 info: '您当前挖掘的方块数量是 [number], 为 [name] 阶段' diff --git a/src/main/resources/locales/zh-TW.yml b/src/main/resources/locales/zh-TW.yml index e442ca9..f2187d1 100644 --- a/src/main/resources/locales/zh-TW.yml +++ b/src/main/resources/locales/zh-TW.yml @@ -43,6 +43,7 @@ protection: chunkblock: bossbar: title: 剩餘的塊 + title-prefix: "[title] | " status: '階段方塊 [done] / [total]' color: RED style: SEGMENTED_20 @@ -50,7 +51,33 @@ chunkblock: actionbar: status: '階段: [phase-name] | 方塊數: [done] / [total] | 進度: [percent-done]' not-active: '該島嶼的動作欄未啟用' + trophies: + awarded: '獲得獎杯: [name]!' + title-available: '你的島嶼獲得了頭銜 [title] — 使用 /ch title 來開啟或關閉。' commands: + ledger: + description: "顯示團隊成員的貢獻" + parameters: "[天]" + header: '島嶼貢獻帳簿 ([window])' + all-time: "全部時間" + last-days: "最後 [days] 天" + row: ' - [name]: [blocks] 個方塊, [chunks] 個區塊, [rings]' + total: '總計: [blocks] 個方塊, [chunks] 個區塊, [rings]' + no-activity: '尚未記錄任何活動。' + title: + description: "開啟或關閉你島嶼的頭銜,或選擇一個" + parameters: "[列表 | 獎杯-id | 無]" + header: '你島嶼的獎杯:' + trophy-entry: ' - [name]' + title-entry: ' - [name] — 頭銜 [title] (/ch title [id])' + none-earned-yet: '你的島嶼還沒有獲得任何獎杯。' + active: '活躍的頭銜: [title]' + no-active: '沒有活躍的頭銜。用 /ch title 選擇一個。' + set: '你的島嶼的頭銜現在是 [title]' + cleared: '你的島嶼不再顯示頭銜。' + toggled-on: '島嶼頭銜 [title] 現在顯示。' + toggled-off: '島嶼頭銜 [title] 現在隱藏。' + not-earned: '你的島嶼還沒有獲得這個頭銜的獎杯。' admin: setcount: parameters: <名稱> <計數> @@ -215,4 +242,5 @@ chunkblock: ring-broadcast: '[name] 的島嶼已完成第 [ring] 圈 — [chunks] 個區塊,而且還在成長!' ring-complete: '第 [ring] 圈完成!島嶼周圍的整圈都是你的了 — 總共 [chunks] 個區塊。' rings: '已完成圈數: [rings] / [max]' + ring-progress: '圈 [ring]: [remaining]/[total] 個區塊待完成。' sethome-denied: '你不能在已鎖定的區塊內設定重生點。' diff --git a/src/main/resources/trophies.yml b/src/main/resources/trophies.yml index 1df9d47..ca087df 100644 --- a/src/main/resources/trophies.yml +++ b/src/main/resources/trophies.yml @@ -39,10 +39,26 @@ trophies: name: "First Ring" description: "Complete the first ring of chunks around your magic block." icon: GOLD_INGOT - title: "Ring Bearer" + title: "The Outpost" criteria: type: RING ring: 1 + second-ring: + name: "Second Ring" + description: "Complete the second ring of chunks." + icon: GOLD_BLOCK + title: "The Stronghold" + criteria: + type: RING + ring: 2 + third-ring: + name: "Third Ring" + description: "Complete the third ring of chunks." + icon: DIAMOND + title: "The Citadel" + criteria: + type: RING + ring: 3 homesteader: name: "Homesteader" description: "Claim ten different chunks for your island." @@ -56,7 +72,7 @@ trophies: name: "Ten Thousand Blocks" description: "Break ten thousand magic blocks as an island." icon: DIAMOND_PICKAXE - title: "Block Breaker" + title: "The Forge" criteria: type: COUNTER counter: MAGIC_BLOCKS diff --git a/src/test/java/world/bentobox/chunkblock/SettingsTest.java b/src/test/java/world/bentobox/chunkblock/SettingsTest.java index 30cf8f1..ede1583 100644 --- a/src/test/java/world/bentobox/chunkblock/SettingsTest.java +++ b/src/test/java/world/bentobox/chunkblock/SettingsTest.java @@ -80,7 +80,7 @@ void testGetIslandDistance() { */ @Test void testGetIslandProtectionRange() { - assertEquals(240, s.getIslandProtectionRange()); + assertEquals(168, s.getIslandProtectionRange()); } /** diff --git a/src/test/java/world/bentobox/chunkblock/chunks/ChunkManagerTest.java b/src/test/java/world/bentobox/chunkblock/chunks/ChunkManagerTest.java index c31659e..8a6680c 100644 --- a/src/test/java/world/bentobox/chunkblock/chunks/ChunkManagerTest.java +++ b/src/test/java/world/bentobox/chunkblock/chunks/ChunkManagerTest.java @@ -280,6 +280,37 @@ private void claimRingOne() { } } + @Test + void testChunksRemainingInRingZero() { + assertEquals(0, cm.chunksRemainingInRing(island, 0)); + } + + @Test + void testChunksRemainingInRingOneFresh() { + assertEquals(8, cm.chunksRemainingInRing(island, 1)); + } + + @Test + void testChunksRemainingInRingOnePartial() { + level = 3; + cm.claim(island, 1, 0); + cm.claim(island, 0, 1); + cm.claim(island, -1, 0); + assertEquals(5, cm.chunksRemainingInRing(island, 1)); + } + + @Test + void testChunksRemainingInRingOneComplete() { + level = 8; + claimRingOne(); + assertEquals(0, cm.chunksRemainingInRing(island, 1)); + } + + @Test + void testChunksRemainingInRingTwo() { + assertEquals(16, cm.chunksRemainingInRing(island, 2)); + } + @Test void testGetUnlockedOffsets() { level = 2; diff --git a/src/test/java/world/bentobox/chunkblock/commands/island/IslandLedgerCommandTest.java b/src/test/java/world/bentobox/chunkblock/commands/island/IslandLedgerCommandTest.java new file mode 100644 index 0000000..97c2f5d --- /dev/null +++ b/src/test/java/world/bentobox/chunkblock/commands/island/IslandLedgerCommandTest.java @@ -0,0 +1,147 @@ +package world.bentobox.chunkblock.commands.island; + +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.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import org.bukkit.Location; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.PlayersManager; +import world.bentobox.chunkblock.ChunkBlock; +import world.bentobox.chunkblock.CommonTestSetup; +import world.bentobox.chunkblock.Settings; +import world.bentobox.chunkblock.activity.ActivityManager; +import world.bentobox.chunkblock.activity.CounterType; +import world.bentobox.chunkblock.chunks.ChunkManager; +import world.bentobox.chunkblock.dataobjects.OneBlockIslands; +import world.bentobox.chunkblock.listeners.BlockListener; + +class IslandLedgerCommandTest extends CommonTestSetup { + + @Mock + private CompositeCommand ac; + @Mock + private User user; + @Mock + private ChunkBlock addon; + @Mock + private ActivityManager activityManager; + @Mock + private Location playerLocation; + @Mock + private PlayersManager playersManager; + + private IslandLedgerCommand command; + private UUID member1; + private UUID member2; + + @Override + @BeforeEach + public void setUp() throws Exception { + super.setUp(); + when(ac.getAddon()).thenReturn(addon); + Settings settings = new Settings(); + when(addon.getSettings()).thenReturn(settings); + OneBlockIslands data = new OneBlockIslands("test"); + when(addon.getOneBlocksIsland(island)).thenReturn(data); + when(addon.getBlockListener()).thenReturn(mock(BlockListener.class)); + when(addon.getActivityManager()).thenReturn(activityManager); + when(addon.getPlayers()).thenReturn(playersManager); + ChunkManager cm = new ChunkManager(addon); + when(addon.getChunkManager()).thenReturn(cm); + + when(island.getCenter()).thenReturn(location); + when(island.getWorld()).thenReturn(world); + when(world.getName()).thenReturn("chunkblock_world"); + when(location.getBlockX()).thenReturn(8); + when(location.getBlockZ()).thenReturn(8); + when(island.getProtectionRange()).thenReturn(240); + + when(playerLocation.getWorld()).thenReturn(world); + when(user.getLocation()).thenReturn(playerLocation); + when(user.getWorld()).thenReturn(world); + when(user.getTranslation(anyString(), any(String[].class))).thenAnswer(inv -> inv.getArgument(0, String.class)); + when(im.getIslandAt(playerLocation)).thenReturn(Optional.of(island)); + + member1 = UUID.randomUUID(); + member2 = UUID.randomUUID(); + when(playersManager.getName(member1)).thenReturn("Alice"); + when(playersManager.getName(member2)).thenReturn("Bob"); + + command = new IslandLedgerCommand(ac, "ledger", new String[] { "ledger" }); + } + + @Test + void testSetup() { + assertEquals("island.ledger", command.getPermission()); + assertEquals("chunkblock.commands.ledger.description", command.getDescription()); + assertTrue(command.isOnlyPlayer()); + } + + @Test + void testExecuteNoIsland() { + when(im.getIslandAt(any())).thenReturn(Optional.empty()); + assertFalse(command.execute(user, "ledger", Collections.emptyList())); + verify(user).sendMessage("general.errors.not-on-island"); + } + + @Test + void testExecuteNoActivity() { + when(activityManager.getContributors(island)).thenReturn(Collections.emptySet()); + assertTrue(command.execute(user, "ledger", Collections.emptyList())); + verify(user).sendMessage(eq("chunkblock.commands.ledger.header"), anyString(), anyString()); + verify(user).sendMessage("chunkblock.commands.ledger.no-activity"); + } + + @Test + void testExecuteWithContributors() { + when(activityManager.getContributors(island)).thenReturn(Set.of(member1, member2)); + when(activityManager.getCount(island, member1, CounterType.MAGIC_BLOCKS, 0)).thenReturn(100L); + when(activityManager.getCount(island, member1, CounterType.CHUNKS_CLAIMED, 0)).thenReturn(3L); + when(activityManager.getCount(island, member1, CounterType.CHUNKS_RECLAIMED, 0)).thenReturn(1L); + when(activityManager.getCount(island, member1, CounterType.RINGS_COMPLETED, 0)).thenReturn(1L); + when(activityManager.getCount(island, member2, CounterType.MAGIC_BLOCKS, 0)).thenReturn(50L); + when(activityManager.getCount(island, member2, CounterType.CHUNKS_CLAIMED, 0)).thenReturn(0L); + when(activityManager.getCount(island, member2, CounterType.CHUNKS_RECLAIMED, 0)).thenReturn(0L); + when(activityManager.getCount(island, member2, CounterType.RINGS_COMPLETED, 0)).thenReturn(0L); + + assertTrue(command.execute(user, "ledger", Collections.emptyList())); + verify(user).sendMessage(eq("chunkblock.commands.ledger.header"), anyString(), anyString()); + verify(user, never()).sendMessage("chunkblock.commands.ledger.no-activity"); + verify(user).sendMessage(eq("chunkblock.commands.ledger.total"), + eq("[blocks]"), eq("150"), + eq("[chunks]"), eq("4"), + eq("[rings]"), eq("1")); + } + + @Test + void testExecuteWithWindowDays() { + when(activityManager.getContributors(island)).thenReturn(Set.of(member1)); + when(activityManager.getCount(island, member1, CounterType.MAGIC_BLOCKS, 7)).thenReturn(20L); + when(activityManager.getCount(island, member1, CounterType.CHUNKS_CLAIMED, 7)).thenReturn(1L); + when(activityManager.getCount(island, member1, CounterType.CHUNKS_RECLAIMED, 7)).thenReturn(0L); + when(activityManager.getCount(island, member1, CounterType.RINGS_COMPLETED, 7)).thenReturn(0L); + + assertTrue(command.execute(user, "ledger", List.of("7"))); + verify(user).sendMessage(eq("chunkblock.commands.ledger.header"), anyString(), anyString()); + } +} diff --git a/src/test/java/world/bentobox/chunkblock/commands/island/IslandTitleCommandTest.java b/src/test/java/world/bentobox/chunkblock/commands/island/IslandTitleCommandTest.java index e0652fd..d1a159f 100644 --- a/src/test/java/world/bentobox/chunkblock/commands/island/IslandTitleCommandTest.java +++ b/src/test/java/world/bentobox/chunkblock/commands/island/IslandTitleCommandTest.java @@ -69,17 +69,35 @@ void testSetup() { } @Test - void testListWithNothingEarned() { + void testToggleOnWhenNothingEarned() { + when(tm.getActiveTitleText(island)).thenReturn(""); when(tm.getEarned(island)).thenReturn(List.of()); - assertTrue(command.execute(user, "title", List.of())); + assertFalse(command.execute(user, "title", List.of())); verify(user).sendMessage("chunkblock.commands.title.none-earned-yet"); } + @Test + void testToggleOffWhenActive() { + when(tm.getActiveTitleText(island)).thenReturn("The Outpost"); + assertTrue(command.execute(user, "title", List.of())); + verify(tm).setActiveTitle(island, null); + verify(user).sendMessage("chunkblock.commands.title.toggled-off", "[title]", "The Outpost"); + } + + @Test + void testToggleOnWhenInactive() { + when(tm.getActiveTitleText(island)).thenReturn(""); + when(tm.getEarned(island)).thenReturn(List.of(TITLED, UNTITLED)); + when(tm.setActiveTitle(island, "first-ring")).thenReturn(true); + assertTrue(command.execute(user, "title", List.of())); + verify(user).sendMessage("chunkblock.commands.title.toggled-on", "[title]", "Ring Bearer"); + } + @Test void testListShowsTrophiesTitlesAndActiveTitle() { when(tm.getEarned(island)).thenReturn(List.of(TITLED, UNTITLED)); when(tm.getActiveTitleText(island)).thenReturn("Ring Bearer"); - assertTrue(command.execute(user, "title", List.of())); + assertTrue(command.execute(user, "title", List.of("list"))); verify(user).sendMessage("chunkblock.commands.title.header"); verify(user).sendMessage("chunkblock.commands.title.title-entry", "[name]", "First Ring", "[title]", "Ring Bearer", "[id]", "first-ring"); @@ -91,7 +109,7 @@ void testListShowsTrophiesTitlesAndActiveTitle() { void testListMentionsWhenNoTitleIsActive() { when(tm.getEarned(island)).thenReturn(List.of(UNTITLED)); when(tm.getActiveTitleText(island)).thenReturn(""); - assertTrue(command.execute(user, "title", List.of())); + assertTrue(command.execute(user, "title", List.of("list"))); verify(user).sendMessage("chunkblock.commands.title.no-active"); } @@ -122,6 +140,7 @@ void testTabCompleteOffersNoneAndTitledTrophies() { when(tm.getEarned(island)).thenReturn(List.of(TITLED, UNTITLED)); Optional> options = command.tabComplete(user, "title", List.of("")); assertTrue(options.isPresent()); + assertTrue(options.get().contains("list")); assertTrue(options.get().contains("none")); assertTrue(options.get().contains("first-ring")); // A trophy with no title is not offered diff --git a/src/test/java/world/bentobox/chunkblock/listeners/LevelListenerTest.java b/src/test/java/world/bentobox/chunkblock/listeners/LevelListenerTest.java index 334ed61..aaab902 100644 --- a/src/test/java/world/bentobox/chunkblock/listeners/LevelListenerTest.java +++ b/src/test/java/world/bentobox/chunkblock/listeners/LevelListenerTest.java @@ -3,6 +3,7 @@ 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.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; @@ -28,6 +29,7 @@ import world.bentobox.chunkblock.events.ChunkRelockEvent; import world.bentobox.chunkblock.events.ChunkUnlockEvent; import world.bentobox.chunkblock.events.RingCompleteEvent; +import world.bentobox.level.events.IslandPreLevelEvent; /** * Tests the credit-announcement and LIFO re-lock flows in {@link LevelListener} and the @@ -216,6 +218,45 @@ void testIslandResetClearsRingRewards() { assertEquals(1, data.getUnlockedChunkCount()); } + @Test + void testPreLevelShrinksProtectionRangeToUnlockedArea() { + when(island.getProtectionRange()).thenReturn(240); + // Only center chunk is unlocked → ring 0 → needed = 8 + IslandPreLevelEvent pre = new IslandPreLevelEvent(uuid, island); + listener.onIslandPreLevel(pre); + verify(island).setProtectionRange(ChunkManager.CHUNK_CENTER); + // Restore scheduled for next tick + verify(sch).runTask(any(), any(Runnable.class)); + } + + @Test + void testPreLevelRangeMatchesCurrentRing() { + when(island.getProtectionRange()).thenReturn(240); + level = 8; + claimRingOne(); + // Ring 1 unlocked → needed = 1 * 16 + 8 = 24 + IslandPreLevelEvent pre = new IslandPreLevelEvent(uuid, island); + listener.onIslandPreLevel(pre); + verify(island).setProtectionRange(24); + } + + @Test + void testPreLevelSkipsWhenRangeAlreadySmallEnough() { + when(island.getProtectionRange()).thenReturn(8); + IslandPreLevelEvent pre = new IslandPreLevelEvent(uuid, island); + listener.onIslandPreLevel(pre); + verify(island, never()).setProtectionRange(anyInt()); + } + + @Test + void testPreLevelIgnoresOtherWorlds() { + when(addon.inWorld(world)).thenReturn(false); + when(island.getProtectionRange()).thenReturn(240); + IslandPreLevelEvent pre = new IslandPreLevelEvent(uuid, island); + listener.onIslandPreLevel(pre); + verify(island, never()).setProtectionRange(anyInt()); + } + /** Claims and celebrates all eight chunks of ring 1, closing it with the last one */ private void claimRingOne() { for (int[] offset : new int[][] { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { -1, 1 },