diff --git a/src/main/java/world/bentobox/caveblock/CaveBlock.java b/src/main/java/world/bentobox/caveblock/CaveBlock.java index 3f813b7..b5ea33b 100644 --- a/src/main/java/world/bentobox/caveblock/CaveBlock.java +++ b/src/main/java/world/bentobox/caveblock/CaveBlock.java @@ -16,6 +16,7 @@ import world.bentobox.bentobox.api.configuration.Config; import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.bentobox.api.flags.Flag; +import world.bentobox.caveblock.commands.AdminReloadConfirmCommand; import world.bentobox.caveblock.commands.IslandAboutCommand; import world.bentobox.caveblock.generators.ChunkGeneratorWorld; import world.bentobox.caveblock.listeners.CustomHeightLimitations; @@ -53,7 +54,16 @@ public void setup() }; // Admin command. - this.adminCommand = new DefaultAdminCommand(this) {}; + this.adminCommand = new DefaultAdminCommand(this) + { + @Override + public void setup() + { + super.setup(); + // Replaces the default "reload" sub-command so the admin gets feedback + new AdminReloadConfirmCommand(this); + } + }; } diff --git a/src/main/java/world/bentobox/caveblock/commands/AdminReloadConfirmCommand.java b/src/main/java/world/bentobox/caveblock/commands/AdminReloadConfirmCommand.java new file mode 100644 index 0000000..5735c9d --- /dev/null +++ b/src/main/java/world/bentobox/caveblock/commands/AdminReloadConfirmCommand.java @@ -0,0 +1,31 @@ +package world.bentobox.caveblock.commands; + +import java.util.List; + +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.commands.admin.AdminReloadCommand; +import world.bentobox.bentobox.api.user.User; + + +/** + * Replaces BentoBox's default admin reload command, which reloads silently, + * so that the admin gets confirmation that config.yml was reloaded. + */ +public class AdminReloadConfirmCommand extends AdminReloadCommand { + + /** + * Reload + * @param adminCommand - parent command + */ + public AdminReloadConfirmCommand(CompositeCommand adminCommand) { + super(adminCommand); + } + + @Override + public boolean execute(User user, String label, List args) { + super.execute(user, label, args); + user.sendMessage("caveblock.commands.admin.reload.reloaded"); + return true; + } + +} diff --git a/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java b/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java index 9b357ac..1347230 100644 --- a/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java +++ b/src/main/java/world/bentobox/caveblock/listeners/CustomHeightLimitations.java @@ -28,7 +28,6 @@ public class CustomHeightLimitations implements Listener public CustomHeightLimitations(CaveBlock addon) { this.addon = addon; - this.worldHeight = addon.getSettings().getWorldDepth() - 1; } /** @@ -51,7 +50,7 @@ public void onPlayerMove(PlayerMoveEvent event) // Prevent to get over world height - if (nextY >= this.worldHeight) + if (nextY >= this.getWorldHeight()) { User.getInstance(player).sendMessage("caveblock.general.errors.cave-limit-reached"); event.setCancelled(true); @@ -77,7 +76,7 @@ public void onPlayerTeleport(PlayerTeleportEvent event) } // Prevent to get over world height - if (nextY >= this.worldHeight) + if (nextY >= this.getWorldHeight()) { User.getInstance(player).sendMessage("caveblock.general.errors.cave-limit-reached"); event.setCancelled(true); @@ -96,7 +95,7 @@ public void onPlayerTeleport(PlayerTeleportEvent event) */ private boolean shouldNotBeCancelled(double nextY, Player player, Location from, Location to) { - return nextY < this.worldHeight || + return nextY < this.getWorldHeight() || from == to || from.getY() >= nextY && from.getBlockX() == to.getBlockX() && @@ -112,6 +111,17 @@ private boolean shouldNotBeCancelled(double nextY, Player player, Location from, } + /** + * Read from the live settings each time so that changing world depth and running + * the admin reload command takes effect without a server restart. + * @return the Y level players cannot go above. + */ + private int getWorldHeight() + { + return this.addon.getSettings().getWorldDepth() - 1; + } + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- @@ -121,9 +131,4 @@ private boolean shouldNotBeCancelled(double nextY, Player player, Location from, * CaveBlock addon */ private final CaveBlock addon; - - /** - * This variable store world height. - */ - private final int worldHeight; } diff --git a/src/main/resources/locales/cs.yml b/src/main/resources/locales/cs.yml index 21c5705..9bef1c1 100644 --- a/src/main/resources/locales/cs.yml +++ b/src/main/resources/locales/cs.yml @@ -32,6 +32,7 @@ caveblock: already-have-island: "Již máš svou jeskyni!" no-safe-location-found: "Nelze najít bezpečné místo pro teleportaci do tvé jeskyně." not-owner: "Nejsi vlastník této jeskyně!" + cave-limit-reached: " Dosáhl jsi stropu své jeskyně. Výš už se dostat nemůžeš!" commands: # Parameters in <> are required, parameters in [] are optional admin: @@ -108,6 +109,8 @@ caveblock: description: "odstraní jeskyni hráče" cannot-delete-owner: "Všichni členové jeskyně musí být vykopnuti z jeskyně, než jej bude možné smazat." deleted-island: "Jeskyně na [xyz] byla úspěšně smazána." + reload: + reloaded: "Konfigurace CaveBlock byla znovu načtena. Změny se projeví v nově generovaných chuncích. Název světa, dimenze a aliasy příkazů vyžadují restart serveru." island: go: description: "teleportuje tě do tvé jeskyně" diff --git a/src/main/resources/locales/de.yml b/src/main/resources/locales/de.yml index 7cb338c..0314a80 100644 --- a/src/main/resources/locales/de.yml +++ b/src/main/resources/locales/de.yml @@ -110,6 +110,8 @@ caveblock: cannot-delete-owner: "Alle Höhlenmitglieder müssen vor dem Löschen aus der Höhle geworfen werden." deleted-island: "Höhle bei [xyz] wurde erfolgreich gelöscht." + reload: + reloaded: "CaveBlock-Konfiguration neu geladen. Änderungen gelten für neu generierte Chunks. Weltname, Dimensionen und Befehls-Aliase erfordern einen Serverneustart." island: go: description: teleportiere dich zu deiner Höhle diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 9954f0d..83a123a 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -32,6 +32,8 @@ caveblock: commands: admin: + reload: + reloaded: "CaveBlock config reloaded. Changes apply to newly generated chunks. World name, dimensions and command aliases need a server restart." info: no-island: "You are not in a cave right now..." # The BentoBox defaults below use the literal word "islands", not a prefix diff --git a/src/main/resources/locales/es.yml b/src/main/resources/locales/es.yml index 14f007f..bc5cf90 100644 --- a/src/main/resources/locales/es.yml +++ b/src/main/resources/locales/es.yml @@ -24,6 +24,7 @@ caveblock: no-safe-location-found: "No encontramos un lugar seguro para teletransportarte a la cueva." not-owner: "¡No eres el propietario de la cueva!" + cave-limit-reached: " Has alcanzado el techo de tu cueva. ¡No puedes subir más!" commands: admin: team: @@ -108,6 +109,8 @@ caveblock: cannot-delete-owner: "Todos los miembros de la cueva deben ser expulsados antes de eliminarla." deleted-island: "Cueva de [xyz] eliminada correctamente." + reload: + reloaded: "Configuración de CaveBlock recargada. Los cambios se aplican a los chunks generados a partir de ahora. El nombre del mundo, las dimensiones y los alias de comandos requieren reiniciar el servidor." island: go: description: teletransportar a tu cueva diff --git a/src/main/resources/locales/id.yml b/src/main/resources/locales/id.yml index 8b13789..ea6002b 100644 --- a/src/main/resources/locales/id.yml +++ b/src/main/resources/locales/id.yml @@ -1 +1,85 @@ +########################################################################################### +# This is a YML file. Be careful when editing. Check your edits in a YAML checker like # +# the one at http://yaml-online-parser.appspot.com # +########################################################################################### +caveblock: + prefixes: + island: gua + Island: Gua + Islands: Gua + an-island: sebuah gua + islands: gua + + sign: + line0: "CaveBlock" + line1: "Selamat datang!" + line2: "[name]" + line3: "Mulai menggali! <3" + + informational: + to-nether: "Sial sekali, kamu jatuh ke nether." + to-the-end: "Kamu telah mencapai The End." + to-normal: "Kembali ke guamu." + + general: + errors: + cave-limit-reached: " Kamu telah mencapai puncak guamu. Kamu tidak bisa naik lebih tinggi lagi!" + + commands: + admin: + reload: + reloaded: "Konfigurasi CaveBlock dimuat ulang. Perubahan berlaku untuk chunk yang baru dibuat. Nama dunia, dimensi, dan alias perintah memerlukan restart server." + info: + no-island: "Kamu tidak sedang berada di gua saat ini..." + islands-in-trash: "Pemain memiliki gua di tempat sampah." + trash: + no-unowned-in-trash: "Tidak ada gua tanpa pemilik di tempat sampah" + no-islands-in-trash: "Pemain tidak memiliki gua di tempat sampah" + description: "tampilkan gua tanpa pemilik atau gua pemain di tempat sampah" + title: "=========== Gua di Tempat Sampah ===========" + emptytrash: + description: "Kosongkan tempat sampah untuk pemain, atau semua gua tanpa pemilik di tempat sampah" + island: + team: + invite: + accept: + confirmation: |- + Apakah kamu yakin ingin menerima undangan ini? + Kamu akan KEHILANGAN guamu saat ini! + + ranks: + owner: "Raja Kurcaci" + sub-owner: "Ksatria Kurcaci" + member: "Kurcaci" + trusted: "Tepercaya" + coop: "Coop" + visitor: "Manusia" + banned: "Orc" + + protection: + flags: + ISLAND_RESPAWN: + description: |- + Pemain bangkit kembali + di gua mereka + OFFLINE_GROWTH: + description: |- + Jika dinonaktifkan, tanaman + tidak akan tumbuh di gua + yang semua anggotanya offline. + Dapat membantu mengurangi lag. + OFFLINE_REDSTONE: + description: |- + Jika dinonaktifkan, redstone + tidak akan berfungsi di gua + yang semua anggotanya offline. + Dapat membantu mengurangi lag. + Tidak memengaruhi gua spawn. + +protection: + flags: + SKY_WALKER_FLAG: + description: "Aktifkan/nonaktifkan\n kemampuan untuk berjalan di\n atas dunia gua\n tanpa izin tambahan." + name: "Sky Walker" + hint: "Memungkinkan berjalan di atap gua." diff --git a/src/main/resources/locales/ja.yml b/src/main/resources/locales/ja.yml index 2ad95d3..86e3a90 100644 --- a/src/main/resources/locales/ja.yml +++ b/src/main/resources/locales/ja.yml @@ -23,6 +23,7 @@ caveblock: already-have-island: "あなたはすでに洞窟を持っています!" no-safe-location-found: "洞窟でテレポートする安全な場所が見つかりませんでした。" not-owner: "あなたは洞窟の所有者ではありません!" + cave-limit-reached: " 洞窟の天井に到達しました。これ以上高くは行けません!" commands: admin: team: @@ -96,6 +97,8 @@ caveblock: description: プレイヤーの洞窟を削除します cannot-delete-owner: "すべての洞窟のメンバーは、削除する前に洞窟から追い出されなければなりません。" deleted-island: " [xyz]の洞窟は正常に削除されました。" + reload: + reloaded: "CaveBlockの設定を再読み込みしました。変更は新しく生成されるチャンクに適用されます。ワールド名、ディメンション、コマンドのエイリアスの変更にはサーバーの再起動が必要です。" island: go: description: 洞窟にテレポートする diff --git a/src/main/resources/locales/lv.yml b/src/main/resources/locales/lv.yml index 03e4fbf..659c019 100644 --- a/src/main/resources/locales/lv.yml +++ b/src/main/resources/locales/lv.yml @@ -36,6 +36,7 @@ caveblock: command-cancelled: "Komanda atcleta." use-in-game: "Šī komanda ir pieejama tikai spēlē." unknown-player: "[name] ir nezināms spēlētājs!" + cave-limit-reached: " Tu esi sasniedzis savas alas griestus. Augstāk tikt nevari!" success: "Darīts!" tips: changing-obsidian-to-lava: Pārveido obsidiānu uz lavu. Esi uzmanīgāks! @@ -339,6 +340,8 @@ caveblock: description: Pārvaldīt pasaules iestatījumus help: description: admin komanda + reload: + reloaded: "CaveBlock konfigurācija pārlādēta. Izmaiņas attiecas uz jauni ģenerētajiem čankiem. Pasaules nosaukuma, dimensiju un komandu aizstājvārdu maiņai nepieciešama servera restartēšana." island: go: description: pārvieto tevi uz tavu salu diff --git a/src/main/resources/locales/pl.yml b/src/main/resources/locales/pl.yml index 45ed58a..bbb7631 100644 --- a/src/main/resources/locales/pl.yml +++ b/src/main/resources/locales/pl.yml @@ -24,6 +24,7 @@ caveblock: no-safe-location-found: "Nie można znaleźć bezpiecznego miejsca dla teleportu do jaskini." not-owner: "To nie twoja jaskinia!" + cave-limit-reached: " Osiągnąłeś szczyt swojej jaskini. Nie możesz wejść wyżej!" commands: admin: team: @@ -105,6 +106,8 @@ caveblock: cannot-delete-owner: "Wszyscy członkowie jaskini muszą zostać wyrzuceni z jaskini przed jej usunięciem." deleted-island: "Wyspa w [xyz] została pomyślnie usunięta." + reload: + reloaded: "Konfiguracja CaveBlock została przeładowana. Zmiany dotyczą nowo generowanych chunków. Nazwa świata, wymiary i aliasy komend wymagają restartu serwera." island: go: description: teleportować cię do swojej jaskini diff --git a/src/main/resources/locales/ro.yml b/src/main/resources/locales/ro.yml index 8b13789..789002c 100644 --- a/src/main/resources/locales/ro.yml +++ b/src/main/resources/locales/ro.yml @@ -1 +1,85 @@ +########################################################################################### +# This is a YML file. Be careful when editing. Check your edits in a YAML checker like # +# the one at http://yaml-online-parser.appspot.com # +########################################################################################### +caveblock: + prefixes: + island: peșteră + Island: Peșteră + Islands: Peșteri + an-island: o peșteră + islands: peșteri + + sign: + line0: "CaveBlock" + line1: "Bun venit!" + line2: "[name]" + line3: "Începe să sapi! <3" + + informational: + to-nether: "Ce ghinion să cazi în Nether." + to-the-end: "Ai ajuns în End." + to-normal: "Înapoi în peștera ta." + + general: + errors: + cave-limit-reached: " Ai ajuns în vârful peșterii tale. Nu poți urca mai sus!" + + commands: + admin: + reload: + reloaded: "Configurația CaveBlock a fost reîncărcată. Modificările se aplică chunk-urilor generate de acum înainte. Numele lumii, dimensiunile și aliasurile comenzilor necesită repornirea serverului." + info: + no-island: "Nu te afli într-o peșteră acum..." + islands-in-trash: "Jucătorul are peșteri în coșul de gunoi." + trash: + no-unowned-in-trash: "Nu există peșteri fără proprietar în coșul de gunoi" + no-islands-in-trash: "Jucătorul nu are peșteri în coșul de gunoi" + description: "arată peșterile fără proprietar sau peșterile jucătorului din coșul de gunoi" + title: "=========== Peșteri în coșul de gunoi ===========" + emptytrash: + description: "Golește coșul de gunoi pentru un jucător sau toate peșterile fără proprietar din coș" + island: + team: + invite: + accept: + confirmation: |- + Sigur vrei să accepți această invitație? + Îți vei PIERDE peștera actuală! + + ranks: + owner: "Rege Pitic" + sub-owner: "Cavaler Pitic" + member: "Pitic" + trusted: "De încredere" + coop: "Coop" + visitor: "Om" + banned: "Orc" + + protection: + flags: + ISLAND_RESPAWN: + description: |- + Jucătorii reapar + în peștera lor + OFFLINE_GROWTH: + description: |- + Când este dezactivat, plantele + nu vor crește în peșterile + în care toți membrii sunt offline. + Poate ajuta la reducerea lag-ului. + OFFLINE_REDSTONE: + description: |- + Când este dezactivat, redstone-ul + nu va funcționa în peșterile + în care toți membrii sunt offline. + Poate ajuta la reducerea lag-ului. + Nu afectează peștera de spawn. + +protection: + flags: + SKY_WALKER_FLAG: + description: "Activează/dezactivează\n abilitatea de a merge pe\n partea de sus a lumii peșterilor\n fără permisiuni suplimentare." + name: "Sky Walker" + hint: "Permite mersul pe acoperișul peșterii." diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml index 56440e6..028d55a 100644 --- a/src/main/resources/locales/ru.yml +++ b/src/main/resources/locales/ru.yml @@ -108,6 +108,8 @@ caveblock: cannot-delete-owner: "Все члены пещеры должны быть выгнаны из пещеры перед удалением." deleted-island: "Остров на [xyz] был успешно удален." + reload: + reloaded: "Конфигурация CaveBlock перезагружена. Изменения применяются к новым генерируемым чанкам. Для изменения названия мира, измерений и псевдонимов команд нужен перезапуск сервера." island: go: description: телепортировать вас в вашу пещеру diff --git a/src/main/resources/locales/tr.yml b/src/main/resources/locales/tr.yml index b8e5232..49d11ef 100644 --- a/src/main/resources/locales/tr.yml +++ b/src/main/resources/locales/tr.yml @@ -107,6 +107,8 @@ caveblock: cannot-delete-owner: "Mağara silinmeden önce tüm mağara üyelerinin mağaradan atılması gerekir." deleted-island: "[xyz] koordinatlı mağara başarıyla silindi." + reload: + reloaded: "CaveBlock yapılandırması yeniden yüklendi. Değişiklikler yeni oluşturulan chunk'lara uygulanır. Dünya adı, boyutlar ve komut takma adları için sunucunun yeniden başlatılması gerekir." island: go: description: Mağarana ışınlan diff --git a/src/main/resources/locales/vi.yml b/src/main/resources/locales/vi.yml index 6ab4e85..f296a08 100644 --- a/src/main/resources/locales/vi.yml +++ b/src/main/resources/locales/vi.yml @@ -30,6 +30,7 @@ caveblock: already-have-island: "Bạn đã có hang!" no-safe-location-found: "Không thể tìm thấy vị trí an toàn trong hang." not-owner: "Bạn không phải chủ hang!" + cave-limit-reached: " Bạn đã chạm tới đỉnh hang của mình. Bạn không thể lên cao hơn nữa!" commands: # Parameters in <> are required, parameters in [] are optional admin: @@ -106,6 +107,8 @@ caveblock: description: "xoá hang của người chơi" cannot-delete-owner: "Thành viên của hang phải bị đuổi trước khi xoá." deleted-island: "Đảo [xyz] đã được xoá thành công." + reload: + reloaded: "Đã tải lại cấu hình CaveBlock. Thay đổi chỉ áp dụng cho các chunk mới được tạo. Tên thế giới, các chiều không gian và bí danh lệnh cần khởi động lại máy chủ." island: go: description: "dịch chuyển đến hang của bạn" diff --git a/src/main/resources/locales/zh-CN.yml b/src/main/resources/locales/zh-CN.yml index 168b4db..330f3f2 100644 --- a/src/main/resources/locales/zh-CN.yml +++ b/src/main/resources/locales/zh-CN.yml @@ -23,6 +23,7 @@ caveblock: already-have-island: "您已经拥有洞穴!" no-safe-location-found: "无法将您传送到洞穴中, 因为没有找到安全的位置." not-owner: "您不是您洞穴的主人!" + cave-limit-reached: " 您已到达洞穴顶部, 无法再往上了!" commands: admin: team: @@ -98,6 +99,8 @@ caveblock: description: "删除一名玩家的洞穴" cannot-delete-owner: "在删除此洞穴之前, 必须移出此洞穴中的所有成员." deleted-island: "成功删除位于 [xyz] 处的洞穴." + reload: + reloaded: "CaveBlock 配置已重新加载. 更改仅适用于新生成的区块. 世界名称、维度和命令别名需要重启服务器才能生效." island: go: description: "传送到您的洞穴" diff --git a/src/test/java/world/bentobox/caveblock/listeners/CustomHeightLimitationsTest.java b/src/test/java/world/bentobox/caveblock/listeners/CustomHeightLimitationsTest.java index 82ed3d5..3c521fd 100644 --- a/src/test/java/world/bentobox/caveblock/listeners/CustomHeightLimitationsTest.java +++ b/src/test/java/world/bentobox/caveblock/listeners/CustomHeightLimitationsTest.java @@ -160,6 +160,15 @@ void testMoveAboveLimitIsCancelled() { assertTrue(event.isCancelled(), "Move above world depth limit should be cancelled"); } + @Test + void testMoveUsesReloadedWorldDepth() { + // Simulate /cba reload raising the world depth after the listener was created + when(settings.getWorldDepth()).thenReturn(WORLD_DEPTH + 10); + PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); + listener.onPlayerMove(event); + assertFalse(event.isCancelled(), "Ceiling should follow the reloaded world depth"); + } + @Test void testMoveBelowLimitIsNotCancelled() { Location safeFrom = buildLocation(0, BELOW_LIMIT - 10, 0);