diff --git a/pom.xml b/pom.xml index 58fa508..c351eba 100644 --- a/pom.xml +++ b/pom.xml @@ -46,14 +46,15 @@ 1.8 2.0.2 - 1.16.1-R0.1-SNAPSHOT - 1.14.0-SNAPSHOT - 2.4.0-SNAPSHOT + 1.16.4-R0.1-SNAPSHOT + 1.15.4 + 2.5.0 + 1.4.0-SNAPSHOT 1.7 ${build.version}-SNAPSHOT - 1.13.0 + 1.14.0 -LOCAL @@ -159,6 +160,12 @@ ${level.version} provided + + world.bentobox + Greenhouses + ${greenhouses.version} + provided + net.milkbowl.vault VaultAPI diff --git a/src/main/java/world/bentobox/biomes/BiomesAddon.java b/src/main/java/world/bentobox/biomes/BiomesAddon.java index b1ebd56..152b573 100644 --- a/src/main/java/world/bentobox/biomes/BiomesAddon.java +++ b/src/main/java/world/bentobox/biomes/BiomesAddon.java @@ -22,6 +22,7 @@ import world.bentobox.biomes.handlers.ChangeBiomeRequestHandler; import world.bentobox.biomes.listeners.ChangeOwnerListener; import world.bentobox.biomes.listeners.ChunkLoadListener; +import world.bentobox.greenhouses.Greenhouses; import world.bentobox.level.Level; @@ -64,16 +65,15 @@ public void onEnable() return; } - hookInGameModes(); + this.hookInGameModes(); if (this.hooked) { - setupAddon(); + this.setupAddon(); } else { - this.logError( - "Biomes could not hook into any GameMode so will not do anything!"); + this.logError("Biomes could not hook into any GameMode so will not do anything!"); this.setState(State.DISABLED); } } @@ -87,11 +87,13 @@ private void setupAddon() { this.addonManager = new BiomesAddonManager(this); // Try to find Level addon and if it does not exist, display a warning - findLevelAddon(); + this.findLevelAddon(); + // Try to find Greenhouses addon + this.findGreenhousesAddon(); + // Try to find Economy Plugin + this.findVaultPlugin(); - findVaultPlugin(); - - // Register the reset listener + // Register the reset listener this.registerListener(new ChangeOwnerListener(this)); this.registerListener(new ChunkLoadListener(this)); @@ -108,79 +110,87 @@ private void setupAddon() { if (this.settings.getUpdateTickCounter() > 0) { // This task will force-load chunk every update tick if its biome is not updated. - runChunkUpdatingScheduler(); + this.runChunkUpdatingScheduler(); } - } /** * This task will force-load chunk every update tick if its biome is not updated. */ - private void runChunkUpdatingScheduler() { - Bukkit.getScheduler().runTaskTimer(this.getPlugin(), () -> { - Iterator iterator = + private void runChunkUpdatingScheduler() + { + Bukkit.getScheduler().runTaskTimer(this.getPlugin(), () -> { + Iterator iterator = this.addonManager.getBiomeUpdaterCollection().iterator(); - // if there is nothing to load, then skip. - if (!iterator.hasNext()) - { - return; - } + // if there is nothing to load, then skip. + if (!iterator.hasNext()) + { + return; + } - BiomeChunkUpdateObject updater = iterator.next(); + BiomeChunkUpdateObject updater = iterator.next(); - // if chunk is already force-loaded, then skip. - while (iterator.hasNext() && updater.isForceLoaded()) - { - updater = iterator.next(); - } + // if chunk is already force-loaded, then skip. + while (iterator.hasNext() && updater.isForceLoaded()) + { + updater = iterator.next(); + } - World world = updater.getWorld(); + World world = updater.getWorld(); - // if chunk is loaded then skip. - if (!world.isChunkLoaded(updater.getChunkX(), updater.getChunkZ())) - { - // Set flag as force-loaded. - updater.setForceLoaded(true); + // if chunk is loaded then skip. + if (!world.isChunkLoaded(updater.getChunkX(), updater.getChunkZ())) + { + // Set flag as force-loaded. + updater.setForceLoaded(true); - // force-load chunk asynchronously - Util.getChunkAtAsync(world, + // force-load chunk asynchronously + Util.getChunkAtAsync(world, updater.getChunkX(), updater.getChunkZ()); - } - }, - this.settings.getUpdateTickCounter(), - this.settings.getUpdateTickCounter()); + } + }, + this.settings.getUpdateTickCounter(), + this.settings.getUpdateTickCounter()); } - private void findVaultPlugin() { + /** + * This is silly method that was introduced to reduce main method complexity, and just reports + * if economy is enabled or not. + */ + private void findVaultPlugin() + { Optional vault = this.getPlugin().getVault(); if (!vault.isPresent() || !vault.get().hook()) { this.vaultHook = null; this.logWarning( - "Economy plugin not found so money requirements will be ignored!"); + "Economy plugin not found so money requirements will be ignored!"); } else { - this.economyProvided = true; this.vaultHook = vault.get(); } - } - private void findLevelAddon() { + /** + * This is silly method that was introduced to reduce main method complexity, and just reports + * if level addon is enabled or not. + */ + private void findLevelAddon() + { Optional level = this.getAddonByName("Level"); if (!level.isPresent()) { this.logWarning( - "Level add-on not found so level requirements will be ignored!"); + "Level add-on not found so level requirements will be ignored!"); this.levelAddon = null; this.levelProvided = false; } @@ -192,7 +202,27 @@ private void findLevelAddon() { } - private void hookInGameModes() { + /** + * This is silly method that was introduced to reduce main method complexity, and just reports + * if greenhouses is enabled or not. + */ + private void findGreenhousesAddon() + { + Optional greenhouses = this.getAddonByName("Greenhouses"); + + if (greenhouses.isPresent()) + { + this.greenhousesProvided = true; + this.greenhouses = (Greenhouses) greenhouses.get(); + } + } + + + /** + * This method hooks commands and flags into each GameModeAddon. + */ + private void hookInGameModes() + { this.getPlugin().getAddonsManager().getGameModeAddons().forEach(gameModeAddon -> { if (!this.settings.getDisabledGameModes().contains(gameModeAddon.getDescription().getName())) { @@ -304,7 +334,7 @@ public Settings getSettings() */ public boolean isEconomyProvided() { - return this.economyProvided; + return this.vaultHook != null && this.vaultHook.hook(); } @@ -338,9 +368,29 @@ public boolean isLevelProvided() } - // --------------------------------------------------------------------- - // Section: Variables - // --------------------------------------------------------------------- + /** + * This method returns the Greenhouses value. + * @return the value of Greenhouses. + */ + public Greenhouses getGreenhouses() + { + return this.greenhouses; + } + + + /** + * This method returns the greenhousesProvided value. + * @return the value of greenhousesProvided. + */ + public boolean isGreenhousesProvided() + { + return this.greenhousesProvided; + } + + +// --------------------------------------------------------------------- +// Section: Variables +// --------------------------------------------------------------------- /** @@ -358,11 +408,6 @@ public boolean isLevelProvided() */ private Settings settings; - /** - * This boolean indicate if economy is enabled. - */ - private boolean economyProvided; - /** * VaultHook that process economy. */ @@ -378,6 +423,16 @@ public boolean isLevelProvided() */ private boolean levelProvided; + /** + * Greenhouses addon. + */ + private Greenhouses greenhouses; + + /** + * This indicate if greenhouses addon exists. + */ + private boolean greenhousesProvided; + // --------------------------------------------------------------------- // Section: Flags diff --git a/src/main/java/world/bentobox/biomes/BiomesAddonManager.java b/src/main/java/world/bentobox/biomes/BiomesAddonManager.java index a1b9997..a814b6a 100644 --- a/src/main/java/world/bentobox/biomes/BiomesAddonManager.java +++ b/src/main/java/world/bentobox/biomes/BiomesAddonManager.java @@ -12,6 +12,7 @@ import java.util.TreeMap; import java.util.stream.Collectors; +import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.configuration.ConfigurationSection; @@ -618,6 +619,22 @@ public boolean hasAnyBiome(World world) } + /** + * This method returns true if in given location exit a greenhouse. + * @param world World where greenhouse must be searched. + * @param x X location. + * @param y Y location. + * @param z Z location. + * @return {@code true} if in given location exist a greenhouse, {@code false} otherwise. + */ + public boolean hasGreenhouseInLocation(World world, int x, int y, int z) + { + return this.addon.isGreenhousesProvided() && + this.addon.getGreenhouses().getManager().getMap(). + inGreenhouse(new Location(world, x, y, z)); + } + + // --------------------------------------------------------------------- // Section: Later Biome Updater // --------------------------------------------------------------------- diff --git a/src/main/java/world/bentobox/biomes/events/BiomeChangedEvent.java b/src/main/java/world/bentobox/biomes/events/BiomeChangedEvent.java index ed2fe4f..753b64b 100644 --- a/src/main/java/world/bentobox/biomes/events/BiomeChangedEvent.java +++ b/src/main/java/world/bentobox/biomes/events/BiomeChangedEvent.java @@ -4,6 +4,7 @@ import java.util.UUID; import org.bukkit.block.Biome; +import org.bukkit.event.HandlerList; import world.bentobox.bentobox.api.events.BentoBoxEvent; @@ -14,7 +15,7 @@ */ public class BiomeChangedEvent extends BentoBoxEvent { - /** +/** * Constructor BiomeChangeEvent creates a new BiomeChangeEvent instance. * * @param biomeID of type String that represents biome unique id. May be empty. @@ -243,6 +244,34 @@ public void setMaxY(int maxY) } +// --------------------------------------------------------------------- +// Section: Handler methods +// --------------------------------------------------------------------- + + + /** + * Gets handlers. + * + * @return the handlers + */ + @Override + public HandlerList getHandlers() + { + return BiomeChangedEvent.handlers; + } + + + /** + * Gets handlers. + * + * @return the handlers + */ + public static HandlerList getHandlerList() + { + return BiomeChangedEvent.handlers; + } + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- @@ -292,5 +321,10 @@ public void setMaxY(int maxY) * Maximal Y coordinate of change range. */ private int maxY; + + /** + * Event listener list for current + */ + private static final HandlerList handlers = new HandlerList(); } diff --git a/src/main/java/world/bentobox/biomes/listeners/ChangeOwnerListener.java b/src/main/java/world/bentobox/biomes/listeners/ChangeOwnerListener.java index 2ee3468..ecc32b0 100644 --- a/src/main/java/world/bentobox/biomes/listeners/ChangeOwnerListener.java +++ b/src/main/java/world/bentobox/biomes/listeners/ChangeOwnerListener.java @@ -9,7 +9,7 @@ import org.bukkit.event.Listener; import world.bentobox.bentobox.api.addons.GameModeAddon; -import world.bentobox.bentobox.api.events.team.TeamEvent.TeamSetownerEvent; +import world.bentobox.bentobox.api.events.team.TeamSetownerEvent; import world.bentobox.bentobox.api.user.User; import world.bentobox.biomes.BiomesAddon; import world.bentobox.biomes.config.Settings.UpdateMode; @@ -30,7 +30,7 @@ public ChangeOwnerListener(BiomesAddon addon) } - @EventHandler(priority = EventPriority.LOW) + @EventHandler(priority = EventPriority.MONITOR) public void onTeamSetOwnerEvent(TeamSetownerEvent event) { // Do nothing if biome reset is diabled. diff --git a/src/main/java/world/bentobox/biomes/listeners/ChunkLoadListener.java b/src/main/java/world/bentobox/biomes/listeners/ChunkLoadListener.java index 8ae65ad..0b12016 100644 --- a/src/main/java/world/bentobox/biomes/listeners/ChunkLoadListener.java +++ b/src/main/java/world/bentobox/biomes/listeners/ChunkLoadListener.java @@ -69,8 +69,13 @@ public void onChunkLoad(ChunkLoadEvent event) { for (int y = updateObject.getMinY(); y <= updateObject.getMaxY(); y += 4) { - // Change Biome - updateObject.getWorld().setBiome(x, y, z, updateObject.getBiome()); + // Biome should not be changed in Greenhouses. + if (!this.addon.getAddonManager(). + hasGreenhouseInLocation(updateObject.getWorld(), x, y, z)) + { + // Change Biome + updateObject.getWorld().setBiome(x, y, z, updateObject.getBiome()); + } } } } diff --git a/src/main/java/world/bentobox/biomes/panels/user/UpdateModeGUI.java b/src/main/java/world/bentobox/biomes/panels/user/UpdateModeGUI.java index dbb5a5a..6b00729 100644 --- a/src/main/java/world/bentobox/biomes/panels/user/UpdateModeGUI.java +++ b/src/main/java/world/bentobox/biomes/panels/user/UpdateModeGUI.java @@ -11,12 +11,15 @@ import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.util.heads.HeadCache; +import world.bentobox.bentobox.util.heads.HeadGetter; import world.bentobox.biomes.BiomesAddon; import world.bentobox.biomes.config.Settings.UpdateMode; import world.bentobox.biomes.database.objects.BiomesObject; import world.bentobox.biomes.panels.CommonGUI; import world.bentobox.biomes.panels.GuiUtils; import world.bentobox.biomes.panels.util.NumberGUI; +import world.bentobox.biomes.utils.Utils; /** @@ -60,7 +63,7 @@ public void build() PanelBuilder panelBuilder = new PanelBuilder().user(this.user). name(this.user.getTranslation("biomes.gui.title.mode-choose")); - GuiUtils.fillBorder(panelBuilder, Material.GRAY_STAINED_GLASS_PANE); + GuiUtils.fillBorder(panelBuilder, 4, Material.GRAY_STAINED_GLASS_PANE); // Map at the top of the GUI panelBuilder.item(4, this.createButton(Button.HEADER)); @@ -69,37 +72,39 @@ public void build() if (BiomesAddon.BIOMES_WORLD_PROTECTION.isSetForWorld(this.world)) { // Island mode should be available only if world protection is enabled. - panelBuilder.item(12, this.createButton(Button.ISLAND)); + panelBuilder.item(11, this.createButton(Button.ISLAND)); } - + panelBuilder.item(13, this.createButton(Button.CHUNK)); - panelBuilder.item(14, this.createButton(Button.SQUARE)); - - // Decrease of current value - panelBuilder.item(19, this.createButton(Button.DECREASE, 10)); - panelBuilder.item(20, this.createButton(Button.DECREASE, 5)); - panelBuilder.item(21, this.createButton(Button.DECREASE, 1)); - // Paper that shows current value - panelBuilder.item(22, this.createButton(Button.VALUE)); - // Increase of current value - panelBuilder.item(23, this.createButton(Button.INCREASE, 1)); - panelBuilder.item(24, this.createButton(Button.INCREASE, 5)); - panelBuilder.item(25, this.createButton(Button.INCREASE, 10)); - - // Set values - panelBuilder.item(28, this.createButton(Button.SET, 0)); - panelBuilder.item(29, this.createButton(Button.SET, 2)); - panelBuilder.item(30, this.createButton(Button.SET, 4)); - panelBuilder.item(31, this.createButton(Button.SET, 8)); - panelBuilder.item(32, this.createButton(Button.SET, 16)); - panelBuilder.item(33, this.createButton(Button.SET, 32)); - panelBuilder.item(34, this.createButton(Button.SET, 64)); + panelBuilder.item(15, this.createButton(Button.RANGE)); + + // Show buttons only for non-island update mode. + if (this.updateMode == UpdateMode.CHUNK) + { + // Decrease of current value + panelBuilder.item(21, this.createButton(Button.DECREASE, 1)); + // Paper that shows current value + panelBuilder.item(22, this.createButton(Button.VALUE)); + // Increase of current value + panelBuilder.item(23, this.createButton(Button.INCREASE, 1)); + } + else if (this.updateMode == UpdateMode.RANGE) + { + panelBuilder.item(20, this.createButton(Button.DECREASE, 5)); + // Decrease of current value + panelBuilder.item(21, this.createButton(Button.DECREASE, 1)); + // Paper that shows current value + panelBuilder.item(22, this.createButton(Button.VALUE)); + // Increase of current value + panelBuilder.item(23, this.createButton(Button.INCREASE, 1)); + panelBuilder.item(24, this.createButton(Button.INCREASE, 5)); + } // Bottom buttons - panelBuilder.item(39, this.createButton(Button.DECLINE)); - panelBuilder.item(41, this.createButton(Button.ACCEPT)); + panelBuilder.item(30, this.createButton(Button.DECLINE)); + panelBuilder.item(32, this.createButton(Button.ACCEPT)); - panelBuilder.item(44, this.returnButton); + panelBuilder.item(35, this.returnButton); panelBuilder.build(); } @@ -124,209 +129,202 @@ private PanelItem createButton(Button button) */ private PanelItem createButton(Button button, int number) { - PanelItemBuilder itemBuilder = new PanelItemBuilder(); - + String name; + ItemStack icon; + String description = ""; + PanelItem.ClickHandler clickHandler; + boolean glow = false; + switch (button) { - case VALUE: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.value", - NUMBER, Integer.toString(this.distanceValue))); - itemBuilder.icon(new ItemStack(Material.PAPER, number)); + case HEADER: + { + name = this.user.getTranslation("biomes.gui.buttons.information"); + + description = this.user.getTranslation("biomes.gui.descriptions.information", + "[biome]", this.biome.getFriendlyName(), + "[mode]", this.user.getTranslation("biomes.gui.descriptions.update-mode." + this.updateMode.name().toLowerCase()), + "[range]", Integer.toString(this.distanceValue)); - if (!this.updateMode.equals(UpdateMode.ISLAND)) + icon = new ItemStack(Material.MAP, number); + + clickHandler = null; + break; + } + + case ISLAND: { - itemBuilder.clickHandler((panel, user1, clickType, i) -> { + name = this.user.getTranslation("biomes.gui.descriptions.update-mode.island"); - // On right click open NumberGui for +/- manual input. - if (clickType.isRightClick()) - { - new NumberGUI(this.user, - this.distanceValue, - 0, - this.addon.getSettings().getLoreLineLength(), - (status, value) -> { - if (status) - { - this.distanceValue = value; - } - - UpdateModeGUI.this.build(); - }); - } + icon = new ItemStack(Material.GRASS_BLOCK, number); + clickHandler = ((panel, user1, clickType, i) -> + { + this.updateMode = UpdateMode.ISLAND; + this.build(); return true; }); - } - break; - } - case INCREASE: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.increase", NUMBER, Integer.toString(number))); + glow = this.updateMode.equals(UpdateMode.ISLAND); - if (this.updateMode.equals(UpdateMode.ISLAND)) - { - itemBuilder.icon(new ItemStack(Material.BLACK_STAINED_GLASS_PANE, number)); + break; } - else + case CHUNK: { - itemBuilder.icon(new ItemStack(Material.GREEN_STAINED_GLASS_PANE, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.distanceValue += number; + name = this.user.getTranslation("biomes.gui.descriptions.update-mode.chunk"); - // Several icons will be updated, so need to rebuild all? + icon = new ItemStack(Material.DIRT, number); + clickHandler = ((panel, user1, clickType, i) -> + { + this.updateMode = UpdateMode.CHUNK; this.build(); return true; }); - } - break; - } - case DECREASE: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.decrease", NUMBER, Integer.toString(number))); + glow = this.updateMode.equals(UpdateMode.CHUNK); - if (this.updateMode.equals(UpdateMode.ISLAND)) - { - itemBuilder.icon(new ItemStack(Material.BLACK_STAINED_GLASS_PANE, number)); + break; } - else + case RANGE: { - itemBuilder.icon(new ItemStack(Material.RED_STAINED_GLASS_PANE, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.distanceValue -= number; + name = this.user.getTranslation("biomes.gui.descriptions.update-mode.range"); - if (this.distanceValue < 0) - { - this.distanceValue = 0; - // TODO: Probably need to inform or block - buttons. - } - - // Several icons will be updated, so need to rebuild all? + icon = new ItemStack(Material.GLASS, number); + clickHandler = ((panel, user1, clickType, i) -> + { + this.updateMode = UpdateMode.RANGE; this.build(); return true; }); - } - break; - } - case SET: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.set", NUMBER, Integer.toString(number))); + glow = this.updateMode.equals(UpdateMode.RANGE); + + break; + } - if (this.updateMode.equals(UpdateMode.ISLAND)) + case VALUE: { - itemBuilder.icon(new ItemStack(Material.BLACK_STAINED_GLASS_PANE, number == 0 ? 1 : number)); + name = this.user.getTranslation("biomes.gui.buttons.value", + NUMBER, Integer.toString(this.distanceValue)); + icon = new ItemStack(Material.PAPER, number); + + clickHandler = (panel, user1, clickType, i) -> { + + // On right click open NumberGui for +/- manual input. + if (clickType.isRightClick()) + { + new NumberGUI(this.user, + this.distanceValue, + 0, + this.addon.getSettings().getLoreLineLength(), + (status, value) -> { + if (status) + { + this.distanceValue = value; + } + + UpdateModeGUI.this.build(); + }); + } + return true; + }; + + break; } - else + case INCREASE: { - if (number == 0) - { - itemBuilder.icon(new ItemStack(Material.YELLOW_STAINED_GLASS_PANE, 1)); - } - else - { - itemBuilder.icon(new ItemStack(Material.WHITE_STAINED_GLASS_PANE, number)); - } + name = this.user.getTranslation("biomes.gui.buttons.increase", + NUMBER, Integer.toString(number)); + icon = new ItemStack(Material.GREEN_CARPET); + + clickHandler = (panel, user1, clickType, i) -> { + this.distanceValue += number; - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.distanceValue = number; this.build(); return true; - }); + }; + + break; } + case DECREASE: + { + name = this.user.getTranslation("biomes.gui.buttons.decrease", + NUMBER, Integer.toString(number)); + icon = new ItemStack(Material.RED_CARPET); + + clickHandler = (panel, user1, clickType, i) -> { + this.distanceValue -= number; - break; - } - case ISLAND: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.descriptions.update-mode.island")); - itemBuilder.icon(new ItemStack(Material.GRASS_BLOCK, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.updateMode = UpdateMode.ISLAND; - this.build(); - return true; - }); - itemBuilder.glow(this.updateMode.equals(UpdateMode.ISLAND)); - - break; - } - case CHUNK: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.descriptions.update-mode.chunk")); - itemBuilder.icon(new ItemStack(Material.DIRT, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.updateMode = UpdateMode.CHUNK; - this.build(); - return true; - }); - itemBuilder.glow(this.updateMode.equals(UpdateMode.CHUNK)); - - break; - } - case SQUARE: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.descriptions.update-mode.square")); - itemBuilder.icon(new ItemStack(Material.GLASS, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.updateMode = UpdateMode.RANGE; - this.build(); - return true; - }); - itemBuilder.glow(this.updateMode.equals(UpdateMode.RANGE)); - - break; - } - case ACCEPT: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.accept")); - itemBuilder.icon(new ItemStack(Material.GREEN_STAINED_GLASS_PANE, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - List arguments = new ArrayList<>(4); + if (this.distanceValue < 1) + { + this.distanceValue = 1; + } - if (this.target != null) - { - arguments.add(this.target.getName()); - } + this.build(); + return true; + }; + + break; + } - arguments.add(this.biome.getUniqueId()); - arguments.add(this.updateMode.name()); - arguments.add(Integer.toString(this.distanceValue)); + case ACCEPT: + { + name = this.user.getTranslation("biomes.gui.buttons.accept"); + + if (Utils.hasUserUpdateModePermission(this.user, + this.permissionPrefix, + this.updateMode, + this.biome.getUniqueId())) + { + icon = new ItemStack(Material.GREEN_STAINED_GLASS_PANE, number); + clickHandler = (panel, user1, clickType, i) -> { + List arguments = new ArrayList<>(4); - this.callCommand(SET, arguments); + if (this.target != null) + { + arguments.add(this.target.getName()); + } - return true; - }); + arguments.add(this.biome.getUniqueId()); + arguments.add(this.updateMode.name()); + arguments.add(Integer.toString(this.distanceValue)); - break; - } - case DECLINE: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.decline")); - itemBuilder.icon(new ItemStack(Material.RED_STAINED_GLASS_PANE, number)); - itemBuilder.clickHandler((panel, user1, clickType, i) -> { - this.user.closeInventory(); - return true; - }); - - break; - } - case HEADER: - { - itemBuilder.name(this.user.getTranslation("biomes.gui.buttons.information")); + this.callCommand(SET, arguments); - itemBuilder.description(GuiUtils.stringSplit( - this.user.getTranslation("biomes.gui.descriptions.information", - "[biome]", this.biome.getFriendlyName(), - "[mode]", this.user.getTranslation("biomes.gui.descriptions.update-mode." + this.updateMode.name().toLowerCase()), - "[range]", Integer.toString(this.distanceValue)), - this.addon.getSettings().getLoreLineLength())); + return true; + }; + } + else + { + icon = new ItemStack(Material.BLACK_STAINED_GLASS_PANE, number); + clickHandler = null; + } + + break; + } + case DECLINE: + { + name = this.user.getTranslation("biomes.gui.buttons.decline"); + icon = new ItemStack(Material.RED_STAINED_GLASS_PANE, number); + clickHandler = (panel, user1, clickType, i) -> { + this.user.closeInventory(); + return true; + }; - itemBuilder.icon(new ItemStack(Material.MAP, number)); - } + break; + } + default: + { + return PanelItem.empty(); + } } - return itemBuilder.build(); + return new PanelItemBuilder(). + icon(icon). + name(name). + description(GuiUtils.stringSplit(description, this.addon.getSettings().getLoreLineLength())). + glow(glow). + clickHandler(clickHandler). + build(); } @@ -340,13 +338,12 @@ private PanelItem createButton(Button button, int number) */ private enum Button { - SET, INCREASE, DECREASE, VALUE, ISLAND, CHUNK, - SQUARE, + RANGE, ACCEPT, DECLINE, HEADER @@ -360,12 +357,12 @@ private enum Button /** * Biomes that user can be changed. */ - private BiomesObject biome; + private final BiomesObject biome; /** * Target player. Most of times it will be equal user, but if admin changes, target will be different user. */ - private User target; + private final User target; /** * Integer value that is larger then 0 and provides information about chunk radius or block radius where diff --git a/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateHelper.java b/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateHelper.java index 2592cd5..f284d8a 100644 --- a/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateHelper.java +++ b/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateHelper.java @@ -1,12 +1,15 @@ package world.bentobox.biomes.tasks; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; +import world.bentobox.bentobox.api.events.addon.AddonEvent; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; @@ -81,6 +84,12 @@ public boolean canChangeBiome() return false; } + if (!this.hasPermissionToUpdateMode()) + { + this.callerUser.sendMessage("general.errors.no-permission"); + return false; + } + if (!this.updateMode.equals(UpdateMode.ISLAND) && this.updateNumber <= 0) { // Cannot update negative numbers. @@ -415,7 +424,16 @@ else if (World.Environment.THE_END.equals(this.biome.getEnvironment())) if (this.canWithdraw) { this.addon.getPlugin().getVault().ifPresent( - vaultHook -> vaultHook.withdraw(this.callerUser, this.biome.getRequiredCost())); + vaultHook -> { + vaultHook.withdraw(this.callerUser, this.biome.getRequiredCost()); + + Map keyValues = new HashMap<>(); + keyValues.put("eventName", "BiomeBuyEvent"); + keyValues.put("targetPlayer", this.callerUser.getUniqueId()); + keyValues.put("biome", biome.getFriendlyName()); + + new AddonEvent().builder().addon(addon).keyValues(keyValues).build(); + }); } task.runTaskAsynchronously(this.addon.getPlugin()); @@ -433,6 +451,22 @@ private boolean checkPermissions() } + /** + * This method returns if the caller user have a permission to change biome with a given + * update mode for given biomeObject. + * @return {@code true} if caller has permission to use given update mode on given biomeObject + * {@code false} otherwise. + */ + public boolean hasPermissionToUpdateMode() + { + // TODO: probably passing permission string to helper would be more efficient. + return Utils.hasUserUpdateModePermission(this.callerUser, + this.addon.getPlugin().getIWM().getPermissionPrefix(this.world), + this.updateMode, + this.biome.getUniqueId()); + } + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- diff --git a/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateTask.java b/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateTask.java index 603afe1..68cba49 100644 --- a/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateTask.java +++ b/src/main/java/world/bentobox/biomes/tasks/BiomeUpdateTask.java @@ -100,8 +100,13 @@ public void run() } else { - // Change Biome - updateObject.getWorld().setBiome(x, y, z, this.biome); + // Biome should not be changed in Greenhouses. + if (!this.addon.getAddonManager(). + hasGreenhouseInLocation(updateObject.getWorld(), x, y, z)) + { + // Change Biome + updateObject.getWorld().setBiome(x, y, z, this.biome); + } } } } diff --git a/src/main/java/world/bentobox/biomes/utils/Utils.java b/src/main/java/world/bentobox/biomes/utils/Utils.java index d1626e9..0041b67 100644 --- a/src/main/java/world/bentobox/biomes/utils/Utils.java +++ b/src/main/java/world/bentobox/biomes/utils/Utils.java @@ -8,6 +8,8 @@ import org.bukkit.block.Biome; import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.biomes.config.Settings; /** @@ -15,6 +17,29 @@ */ public class Utils { + /** + * This method returns if given user has a permission to change biome to given biomeId + * with given updateMode. + * @param user User who must be checked for permissions. + * @param permissionPrefix String that represents gamemode permission prefix. + * @param updateMode UpdateMode that will be performed in biome change. + * @param biomeId BiomeObject it that will be applied. + * @return {@code true} if user has permissions to change biome with given ID and + * update mode, {@code false} otherwise. + */ + public static boolean hasUserUpdateModePermission(User user, + String permissionPrefix, + Settings.UpdateMode updateMode, + String biomeId) + { + String updateModePermission = + permissionPrefix + "biomes.set." + updateMode.name().toLowerCase(); + + return user.hasPermission(updateModePermission + ".*") || + user.hasPermission(updateModePermission + "." + biomeId.toLowerCase()); + } + + /** * This method transforms given World into GameMode name. If world is not a GameMode * world then it returns an empty string. diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index d350f79..e4e202b 100644 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -22,6 +22,15 @@ permissions: '[gamemode].biomes.set': description: Player can use biomes set command. default: true + '[gamemode].biomes.set.island.*': + description: Player can change biome on whole island for all biomes. + default: true + '[gamemode].biomes.set.chunk.*': + description: Player can change biome by chunk for all biomes. + default: true + '[gamemode].biomes.set.range.*': + description: Player can change biome by range for all biomes. + default: true '[gamemode].admin.biomes': description: Player can use admin biomes command that opens GUI. diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index cdbf435..1ad5eb0 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -185,7 +185,7 @@ biomes: disabled: "disabled" permission: " - [permission]" - information: "If you accept these changes, we will try to change your island biome to [biome] in update mode [mode] with range [range]." + information: "If you accept these changes, we will try to change your island biome to [biome] in update mode [mode] with range [range]. | Be aware, that biome can be changed only in 4x4x4 blocks." questions: prefix: "&2[SERVER]: " diff --git a/src/main/resources/locales/ru.yml b/src/main/resources/locales/ru.yml new file mode 100644 index 0000000..a55c520 --- /dev/null +++ b/src/main/resources/locales/ru.yml @@ -0,0 +1,318 @@ +--- +biomes: + gui: + title: + admin: + main-gui: "&6 Меню администратора" + edit: "&6 Редактировать [biome]" + settings: "&6 Настройки аддона" + edit-list: "&6 Редактируемый список биомов" + remove-list: "&6 Список съемных биомов" + user-list: "&6 Выберите игрока" + confirm-title: "&6 Подтвердить предыдущее действие" + manage-numbers: "&6 Управление числами" + select-biome: "&6 Выбрать биом" + toggle-environment: "&6 Переключить среду" + edit-text-fields: "&6 Редактировать текстовые поля" + select-block: "&6 Выберите материал" + lore-edit: "&6 Сообщение о знаниях" + lore-add: "&6 Добавить элемент знаний" + lore-remove: "&6 Удалить элемент знаний" + biomes-choose: "&6 Выбрать биом" + mode-choose: "&6 Выберите режим обновления" + buttons: + admin: + settings: Настройки + import: Импортировать + remove: Удалить биом + edit: Редактировать биом + add: Добавить биом + change: Изменить биом пользователя + change-biome: Биом + name: Отображаемое имя + icon: Значок + order: Порядок + description: Описание + deployment: Развертывание + required-permissions: Необходимые разрешения + required-level: Требуемый уровень + required-money: Требуемые деньги + advanced-menu: Расширенное меню + default-mode: Режим обновления по умолчанию + default-size: Размер по умолчанию + visibility-mode: Видимость биомов + line-length: Длина линии знаний + biomes-lore: Биомная история + cooldown: Перезарядка + reset-biomes: Сбросить событие + use-protection-range: Используйте диапазон защиты + toggle-user-list: Переключить список игроков + save: Сохранить + cancel: Отмена + input: Ввод + accept: Принять + set-mode: "=" + increase-mode: "+" + reduce-mode: "-" + multiply-mode: "*" + number: "[number]" + add-string: Добавить строку + clear: Очистить + remove-empty: Удалить пустой + input-mode: Режим ввода + value: Стоимость + add-element: Добавить элемент + remove-element: Удалить элемент + environment: Изменить среду + lush: Показать пышные биомы + dry: Показать сухие биомы + cold: Показать холодные биомы + snowy: Показать снежные биомы + ocean: Показать биомы океана + nether: Показать нижние биомы + the_end: Показать конечные биомы + neutral: Показать нейтральные биомы + unused: Показать неиспользуемые / не включенные в список биомы + value: 'Текущее значение: [number]' + increase: Увеличить на [number] + decrease: Уменьшить на [number] + set: Установите значение [number] + accept: Принять + decline: Отказаться + information: Информация + return: Возвращение + previous: Предыдущий + next: следующий + descriptions: + admin: + settings: Изменить настройки + import: Импортируйте биомы из файла biomes.yml. | Щелкните правой кнопкой + мыши, чтобы включить / выключить режим перезаписи. + remove: Удалить биом из памяти + edit: Изменить свойства биома + add: Добавить новый биом в текущий мир + change: Изменить биом острова игрока + change-biome: Измените, какой биом Minecraft будет использоваться. + required-permissions: Измените необходимые разрешения для этого биома. | Без + этих разрешений игроки не смогут его использовать! + required-level: Изменить минимальный уровень острова. | &c Требуется дополнительный + уровень. + required-money: Измените стоимость биома. | &c Требуется дополнение / плагин + Economy. + name: Измените отображаемое имя для этого биома. + deployment: Отключить / включить возможность игроков использовать этот биом. + icon: Установите значок отображения для этого биома. + description: Измените описание этого биома. + order: Измените порядок размещения этого биома. + advanced-menu: Включение / отключение расширенного меню со всеми параметрами + изменения для игроков. + default-mode: Установить режим обновления биома по умолчанию. | Будет использоваться, + если расширенное меню отключено, и в качестве значений по умолчанию в этом + меню. + default-size: Установить размер обновления биома по умолчанию. | Будет использоваться, + если расширенное меню отключено, и в качестве значений по умолчанию в этом + меню. + visibility-mode: Измените, какие биомы могут видеть игроки. + line-length: Автоматическая установка длины символа строки описания. + biomes-lore: Измените, какие элементы в сообщении истории будут отображаться. + | Проверьте конфигурацию для получения дополнительной информации. + cooldown: Изменение времени восстановления в секундах между игроком может + снова сменить биом. + reset-biomes: Включение / отключение сброса биомов, если игрок с разрешением + на биом покидает остров. + use-protection-range: Включение / отключение обновления биома для ограничения + диапазона защиты острова. Если этот параметр отключен, будет использоваться + весь диапазон островов. + toggle-user-list: Переключите, какие игроки должны отображаться в текущем + меню. + save: Сохранить текущее значение и вернуться в предыдущее меню. + cancel: Вернуться в предыдущее меню без изменений. + input: Напишите номер в чате + set-mode: Переключитесь в режим установки, который установит текущее значение + на выбранное число. + increase-mode: Переключитесь в режим приращения, при котором текущее значение + будет увеличиваться на номер щелчка. + reduce-mode: Переключитесь в режим декремента, который уменьшит текущее значение + на номер щелчка. + multiply-mode: Переключитесь в режим умножения, в котором текущее значение + будет умножаться на нажатое число. + click-to-edit: "&4 Щелкните здесь, чтобы изменить ввод" + edit-text-line: "&6 Редактировать текстовое сообщение!" + add-text-line: "&6 Добавить новое текстовое сообщение!" + environment: Позволяет изменить активную среду для биома. + environment-active: " &2 - [value]" + environment-inactive: " &c - [value]" + lush: Содержит биомы со светло-зеленой травой (за исключением) и голубой водой. + | Любят равнины, лес, пляж и грибные поля. + dry: Содержит биомы с оливковой травой и голубой водой | Как пустыня, саванна + и бесплодные земли. + cold: Содержит биомы с травой цвета морской волны и водой цвета индиго. | + Любят горы и тайгу. + snowy: Содержит биомы с морской травой и фиолетовой водой. | Как снежная тундра + и замерзшая река. + ocean: Содержит большой объем воды. | Как океан. + nether: Содержит все нижние биомы. | Как пустоши преисподней. + the_end: Содержит все конечные биомы. | Как в конце. + neutral: Содержит пустоту и все биомы холмов. | Как пустота. + unused: Содержит неиспользуемые или не включенные в список биомы. + selected: "&6 Материал выбран" + lore: + description: Строка описания. | Определяемый в биомах объект - biomeObject.description. + original_biome: Оригинальная строка Minecraft Biome. | Представляет перевод + для 'biomes.gui.biome-description.biome-name'. + required_level: Обязательная строка уровня острова. | Представляет перевод + для "biomes.gui.biome-description.required-island-level". + required_money: Стоимость смены строки биома. | Представляет перевод для + "biomes.gui.biome-description.required-money". + required_permission: Строка необходимого разрешения. | Представляет перевод + для 'biomes.gui.biome-description.equired-permissions'. + update-mode: + island: Остров + chunk: Кусок + range: Ассортимент + undefined: Неопределенный + visibility-mode: + info: Измените видимые биомы. + all: Все &r- перечислить все биомы + deployed: Развернутые - список развернутых биомов + accessible: Доступный - список доступных биомов + toggleable: Toggleable - переключаемая кнопка в меню биомов + view-mode: + online: В сети + in-world: В этом мире + with-island: С островом + current-value: 'Текущее значение: [значение]' + enabled: включен + disabled: отключен + permission: " - [permission]" + information: Если вы примете эти изменения, мы попытаемся изменить биом вашего + острова на [биом] в режиме обновления [mode] с диапазоном [range]. + questions: + prefix: "&2 [SERVER]:" + admin: + number: Напишите номер в чате и нажмите Enter, чтобы принять его. + name: Напишите понятное имя для данного биома. + uniqueID: Напишите уникальное имя объекта и нажмите Enter. + biomes-description: + biome-name: 'Биом Майнкрафт: [value]' + required-money: 'Стоимость: [value]' + required-island-level: 'Мин. Уровень острова: [value]' + required-permissions: 'Разрешения:' + commands: + admin: + add: + description: добавить новый биом. Он создает пустой объект биома с настройками + по умолчанию. + parameters: "[id]" + edit: + description: изменить данное свойство . Можно редактировать только существующие + свойства. + parameters: " " + help: + description: открывает интерфейс администратора для игроков. + import: + description: импортировать биомы из файла biomes.yml. Добавление перезаписи + перезапишет существующие биомы. + parameters: "[overwrite]" + set: + description: установить биом для острова . [тип] и [размер] не являются + обязательными. + parameters: " [type] [size]" + settings: + description: отредактируйте настройки по умолчанию с помощью простой команды. + Редактировать можно только существующие настройки. + parameters: " " + migrate: + description: перенести текущие данные биомов игрового мира в формат хранения. + user: + help: + description: открывает графический интерфейс изменения биома. + info: + description: отображать информацию о данном биоме. + parameters: "" + set: + description: установить биом острова на . [type] и [size] не являются + обязательными. + parameters: " [type] [size]" + errors: + unique-id: "&c Уникальный идентификатор &d [id] &c недействителен!" + too-many-arguments: "&c Слишком много параметров. Пожалуйста, проверьте справку!" + missing-arguments: "&c Отсутствуют параметры команды. Пожалуйста, проверьте справку!" + unknown-argument: "&c Неизвестные параметры команды. Пожалуйста, проверьте справку!" + incorrect-range: "&c Указанный номер &d '[number]' &c недействителен. Допустимы + только положительные целые числа." + incorrect-mode: "&c Заданное значение &d '[mode]' &c недопустимо. Допустимые значения: + ISLAND, CHUNK или SQUARE." + incorrect-icon: "&c Данный значок &d '[icon]' &c не может быть проанализирован. + Попробуйте что-нибудь другое." + incorrect-biome: "&c Данный биом &d '[biome]' &c не может быть найден в Minecraft. + Используйте правильное название биома." + incorrect-parameter: "&c Данное свойство &d '[property]' &c не определено для + биома." + incorrect-boolean: "&c Заданное значение &d '[boolean]' &c не является логическим. + Допустимые значения: «true» или «false»." + incorrect-visibility: "&c Заданное значение &d '[mode]' &c недопустимо." + incorrect-object: "&c Невозможно найти биом с данным ID &d '[biome]'." + no-biomes: "&c Биомы еще не реализованы в текущем мире!" + no-biomes-admin: "&c Биомы еще не реализованы в текущем мире! Используйте &5 /[command] + &c, чтобы добавить их!" + missing-user: "&c Пользователь не определен." + missing-biome: "&c Биом не определен." + wrong-icon: "&c Данный материал &6 [value] &c не может быть проанализирован в + ItemStack." + no-biomes-for-you: "&c К сожалению, пригодного для использования биома найти не + удалось." + not-valid-integer: "&c Заданное целое число «[value]» недействительно! | Значение + должно быть между [min] и [max]." + not-a-integer: '&c Заданное значение "[value]" не является целым числом!' + not-on-island: "&c Вы не на острове." + not-enough-money: "&c У вас недостаточно денег. Для изменения биома требуется + $[number]" + not-enough-level: "&c Уровень вашего острова слишком мал. Для биома требуется + как минимум уровень [number]" + admin-not-on-island: "&c Вы не на острове [user]." + disabled: "&c В настоящее время этот биом отключен." + missing-permission: "&c Для этого биома требуется &6[permission] &c разрешение. + У тебя нет этого." + no-file: "&c biomes.yml не найден." + no-load: "&c Ошибка при импорте биомов: [message]!" + load-biome: "&c Невозможно загрузить биом «[biome]», поскольку он не определен + в Minecraft. Используйте правильное название биома." + no-rank: "&c У вас недостаточно высокого ранга для этого." + information: + header: 'Биом: [name]' + type: " Тип: [type]" + description: " Описание: [description]" + level: " Уровень: [level]" + cost: " Стоимость: [cost]" + permission: " Разрешение: [permission]" + messages: + admin: + migrate-start: "&2 Начать перенос дополнительных данных о биомах." + migrate-end: "&2 Данные аддона Biomes обновлены до нового формата." + migrate-not: "&2 Все данные действительны." + saved: "&d Биом [biome] сохранен." + biome-created: "&d Новый объект биома создан с уникальным идентификатором: [id]" + saved-config: Обновлены настройки аддона. + biome-removed: Биом с уникальным идентификатором = '[biome]' удален из памяти. + update-start: "&e Обновление биома началось" + update-done: "&6[biome] &r&e успешно установлен на острове." + skipping: Пропуск импорта [biome]. + overwriting: Перезапись [biome]. + imported: "[biome] импортирован." + import-count: Импорт биомов завершен. Импортировано [number] биомов. +protection: + flags: + BIOMES_ISLAND_PROTECTION: + description: |- + &5 &o Переключить, кто может + &5 &o изменить биом острова + name: Контроль биома + BIOMES_WORLD_PROTECTION: + description: |- + &5 &o Включить / отключить + &5 &o требование для игроков + &5 &o быть на их острове, чтобы + &5 &o изменить биом. + name: Ограничение острова Биом + hint: Вы должны быть на своем острове, чтобы изменить биом! diff --git a/src/main/resources/locales/tr.yml b/src/main/resources/locales/tr.yml new file mode 100644 index 0000000..d0f2332 --- /dev/null +++ b/src/main/resources/locales/tr.yml @@ -0,0 +1,282 @@ +--- +biomes: + gui: + title: + admin: + main-gui: "& 6Yönt Menüsü" + edit: "& 6Düzenle [biyom]" + settings: "& 6Ekran Ayarları" + edit-list: "& 6 Düzenlenebilir Biyom Listesi" + remove-list: "& 6 Çıkarılabilir Biyom Listesi" + user-list: "& 6; Oyuncu Seç" + confirm-title: "& 6Önceki İşlemi Onayla" + manage-numbers: "& 6Yönetim Numaraları" + select-biome: "& 6Biyozu Seç" + toggle-environment: "& 6Toggle Ortamı" + edit-text-fields: Metin Alanlarını Düzenleme + select-block: "& 6Bir Malzeme Seç" + lore-edit: "& 6Daha Fazla Mesaj" + lore-add: "& 6 Lore Öğesi Ekle" + lore-remove: "& 6 Lore Öğesini Kaldır" + biomes-choose: "& 6Biyozu Seç" + mode-choose: "& 6Güncelleme Modunu Seç" + buttons: + admin: + settings: Ayarlar + import: İthalat + remove: Biyomu Kaldır + edit: Biyomu Düzenle + add: Biyom Ekle + change: Kullanıcı Biyomunu Değiştir + change-biome: biyom + name: Ekran adı + icon: ikon + order: Sipariş + description: Açıklama + deployment: yayılma + required-permissions: Gerekli İzinler + required-level: Gereken seviye + required-money: Gerekli Para + advanced-menu: Gelişmiş Menü + default-mode: Varsayılan Güncelleme Modu + default-size: Varsayılan Boyut + visibility-mode: Biyom Görünürlüğü + line-length: Lore Çizgi Uzunluğu + biomes-lore: Biome Lore + cooldown: Sakin ol + reset-biomes: Etkinliği Sıfırla + use-protection-range: Koruma Aralığı Kullan + toggle-user-list: Oyuncu Listesini Aç / Kapat + save: Kayıt etmek + cancel: İptal etmek + input: Giriş + accept: Kabul etmek + set-mode: "=" + increase-mode: "+" + reduce-mode: "-" + multiply-mode: "*" + number: "[numara]" + add-string: Dize Ekle + clear: Açık + remove-empty: Boşaltmayı kaldır + input-mode: Giriş Modu + value: değer + add-element: Öğe Ekle + remove-element: Öğeyi Kaldır + value: 'Mevcut Değer: [sayı]' + increase: "[Sayı] kadar artır" + decrease: "[Sayı] kadar azalt" + set: Değeri [sayı] olarak ayarla + accept: Kabul etmek + decline: düşüş + information: Bilgi + return: Dönüş + previous: Önceki + next: Sonraki + descriptions: + admin: + edit-text-line: "& 6 Kısa mesajı düzenle!" + add-text-line: "& 6 Yeni kısa mesaj ekle!" + settings: Ayarları düzenle + import: Biomes.yml dosyasından biyomları içe aktarın. | Sağ tıklatma üzerine + yazma modunu etkinleştirir / devre dışı bırakır. + remove: Biyomu bellekten kaldır + edit: Biyom özelliklerini düzenleme + add: Mevcut dünyaya yeni biyom ekle + change: Oyuncunun ada biyomunu değiştir + change-biome: Hangi Minecraft Biome ürününün kullanılacağını değiştirin. + required-permissions: Bu biyom için gerekli izinleri değiştirin. | Bu izinler + olmadan oyuncular bunu kullanamazlar! + required-level: Minimum ada seviyesini değiştirin. | & CDeviye Eklentisi gerektirir. + required-money: Biyom maliyetini değiştirin. & CEkonomi Eklentisi / Eklentisi + gerektirir. + name: Bu Biyom için görünen adı değiştirin. + deployment: Oyuncuların bu biyomu kullanma yeteneğini devre dışı bırakın / + etkinleştirin. + icon: Bu biyom için ekran simgesini ayarlayın. + description: Bu biyomun tanımını değiştirin. + order: Bu biyomun sipariş yerleşimini değiştirin. + advanced-menu: Oyuncular için tüm değişiklik seçenekleriyle Gelişmiş Menüyü + etkinleştirin / devre dışı bırakın. + default-mode: Varsayılan biyom güncelleme modunu ayarlayın. | Gelişmiş Menü + devre dışı bırakılmışsa ve bu menüde varsayılan değerler olarak kullanılır. + default-size: Varsayılan biyom güncelleme boyutunu ayarlayın. | Gelişmiş Menü + devre dışıysa ve bu menüde varsayılan değerler olarak kullanılır. + visibility-mode: Oyuncuların hangi biyomları görebileceğini değiştirin. + line-length: Açıklama açıklama satırı karakter uzunluğunun otomatik ayarı. + biomes-lore: İrfan mesajında hangi öğelerin görüntüleneceğini değiştirin. + | Daha fazla bilgi için config'i kontrol edin. + cooldown: Oyuncu arasındaki bekleme süresini saniye cinsinden değiştirin, + biyomu tekrar değiştirebilir. + reset-biomes: Biyom izinli oyuncu adadan ayrılırsa biyom sıfırlamayı etkinleştir + / devre dışı bırak. + use-protection-range: Ada koruma aralığı ile sınırlı olmak için biyom güncellemesini + etkinleştirin / devre dışı bırakın. Bu devre dışı bırakılırsa, tüm ada aralığını + kullanır. + toggle-user-list: Geçerli Menü'de hangi oyuncuların görüntülenmesi gerektiğini + değiştirin. + save: Geçerli değeri kaydedin ve önceki Menüye dönün. + cancel: Değişiklik yapmadan önceki Menüye dönün. + input: Sohbete numara yaz + set-mode: Geçerli değeri tıklanan sayıya ayarlayacak moda ayarlama moduna + geçin. + increase-mode: Geçerli değeri tıklanan sayıya göre artıracak artış moduna + geçin. + reduce-mode: Geçerli değeri tıklanan sayı kadar azaltacak olan azaltma moduna + geçin. + multiply-mode: Mevcut değeri tıklanan sayı ile çarpacak çarpma moduna geçin. + click-to-edit: "& 4 Girişi düzenlemek için burayı tıklayın" + selected: "& 6Malzeme seçildi" + lore: + description: Açıklama dizesi. | Biyomlar nesnesinde tanımlanmıştır - biomeObject.description. + original_biome: Orijinal Minecraft Biome dizesi. | 'Biomes.gui.biome-description.biome-name' + için çeviriyi temsil eder. + required_level: Gerekli ada düzeyinde dize. | 'Biomes.gui.biome-description.gerek-ada-seviyesi' + çevirisini temsil eder. + required_money: Biyom dizisini değiştirme maliyeti. | 'Biomes.gui.biome-description.İhtiyaç-para' + çevirisini temsil eder. + required_permission: Gerekli izin dizesi. | 'Biomes.gui.biome-description.equired-permissions' + için çeviriyi temsil eder. + update-mode: + island: ada + chunk: yığın + undefined: Tanımsız + range: Aralık + visibility-mode: + all: Tümü & r- tüm biyomları listele + deployed: Konuşlandırılmış - konuşlandırılmış biyomları listele + accessible: Erişilebilir - erişilebilir biyomları listele + toggleable: Değiştirilebilir - Biomes Menüsü'ndeki değiştirilebilir düğme + info: Görünür biyomları değiştirin. + view-mode: + online: İnternet üzerinden + in-world: Bu dünyada + with-island: Ada ile + current-value: 'Geçerli değer: [değer]' + enabled: etkin + disabled: engelli + permission: " - [izin]" + information: Bu değişiklikleri kabul ederseniz, güncelleme modunda [mod] aralık + [aralık] ile ada biyomunuzu [biyom] olarak değiştirmeye çalışacağız. + questions: + prefix: 'Ve 2 [SERVER]:' + admin: + number: Sohbete bir numara yazın ve kabul etmek için enter tuşuna basın ve + enter tuşuna basın. + name: Verilen biyom için kolay bir isim yazın. + uniqueID: Nesnenin benzersiz adını yazın ve enter tuşuna basın. + biomes-description: + biome-name: 'Minecraft Biome: [değer]' + required-money: Maliyet değeri] + required-island-level: 'Min ada seviyesi: [değer]' + required-permissions: 'İzinler:' + commands: + admin: + add: + parameters: "[İD]" + description: yeni biyom ekleyin. Varsayılan ayarlarla boş biyom nesnesi oluşturur. + edit: + parameters: " " + description: verilen özelliği. Yalnızca mevcut özellikleri düzenleyebilir. + import: + parameters: "[Yazma]" + description: biyomları biomes.yml dosyasından alır. 'Üzerine yazma' eklendiğinde + mevcut biyomların üzerine yazılır. + settings: + parameters: " " + description: basit komut ile varsayılan ayarları düzenleyin. Yalnızca mevcut + ayarlar düzenlenebilir. + help: + description: oyuncular için Yönetici GUI'sini açar. + set: + description: " adası için biyom ayarlayın. [tip] ve [boyut] isteğe + bağlıdır." + parameters: " [tip] [boyut]" + migrate: + description: mevcut oyun dünyası biyomları verilerini depolama biçimine geçirir. + user: + info: + parameters: "" + description: verilen biyom hakkında bilgi görüntüler. + help: + description: biyom değişim GUI'sini açar. + set: + description: ada biyomunu olarak ayarlayın. [tip] ve [boyut] isteğe + bağlıdır. + parameters: " [tip] [boyut]" + errors: + unique-id: "& cBenzersiz id & d [id] & c geçerli değil!" + too-many-arguments: "& cÇok sayıda parametre. Lütfen yardıma bakın!" + missing-arguments: "& cMissing komut parametreleri. Lütfen yardıma bakın!" + unknown-argument: "& cBilinmeyen komut parametreleri. Lütfen yardıma bakın!" + incorrect-mode: "& c Verilen değer & d '[mod]' & c geçerli değil. Geçerli değerler + 'ADA', 'CHUNK' veya 'KARE' şeklindedir." + incorrect-parameter: "& c Verilen özellik & d '[özellik]' & c biyom için tanımlanmamıştır." + incorrect-boolean: "& c Verilen değer & d '[boolean]' & c bir boolean değildir. + Geçerli değerler 'true' veya 'false'." + incorrect-visibility: "& c Verilen değer & d '[mod]' & c geçerli değil." + incorrect-object: "& cVerilen ID & d '[biome]' ile biyom bulamıyor." + missing-user: "& cUser tanımlı değil." + missing-biome: "& cBiome tanımlanmamış." + wrong-icon: "& c Verilen malzeme & 6 [değer] & c, ItemStack ile ayrıştırılamaz." + not-valid-integer: '& cGerilen "[değer]" tamsayısı geçerli değil! | Değer [dak] + ile [maks] arasında olmalıdır.' + not-enough-money: "& c Yeteri kadar paran yok. Biyomu değiştirmek $ [number] gerektirir" + missing-permission: "& cBu biyom & 6 [izin] & c izni gerektirir. Sende yok." + no-file: "& cbiomes.yml bulunamadı." + no-load: "& cBiyomları alırken bir hata oluştu: [mesaj]!" + load-biome: "& c: Minecraft'ta tanımlanmadığı için '[biome]' biyomunu yükleyemiyorum. + Doğru biyom adını kullanın." + incorrect-range: "& c Verilen sayı & d '[sayı]' & c geçerli değil. Yalnızca pozitif + tamsayılar geçerlidir." + incorrect-icon: "& c Verilen simge & d '[simge]' & c ayrıştırılamıyor. Farklı + bir şey deneyin." + incorrect-biome: "& cGenilen biome & d '[biome]' & c Minecraft'ta bulunamıyor. + Doğru bir biyom ismi kullanın." + no-biomes: "& cBiomes henüz mevcut dünyada uygulanmadı!" + no-biomes-admin: "& cBiomes henüz mevcut dünyada uygulanmadı! Bunları eklemek + için & 5 / [komut] & c kullanın!" + no-biomes-for-you: Maalesef, kullanılabilir bir biyom bulunamadı. + not-a-integer: '& c Verilen değer "[değer]" bir tam sayı değil!' + not-on-island: "& cBir adada değilsin." + not-enough-level: "& c Ada seviyeniz çok küçük. Biyom en az seviye [sayı] gerektirir" + admin-not-on-island: "& c [Kullanıcının] adasında değilsiniz." + disabled: "& cŞu anda, bu biyom devre dışıdır." + no-rank: "& cBunu yapacak kadar yüksek bir rütbeniz yok." + information: + header: 'Biyom: [isim]' + type: " Tür: [tür]" + description: " Açıklama: [açıklama]" + level: " Seviye: [seviye]" + cost: " Maliyet maliyeti]" + permission: " İzin: [izin]" + messages: + admin: + migrate-start: "& 2Biyomlar ekleme verilerini taşımaya başlayın." + migrate-end: "& 2Biomes addon verileri yeni formata güncellenir." + migrate-not: "& 2Tüm veriler geçerlidir." + saved: "& dBiome [biome] kaydedilir." + biome-created: "& d uniqueID ile oluşturulan yeni Biome nesnesi: [id]" + update-done: "& 6 [biome] & r & e adada başarıyla kuruldu." + skipping: "[Biyom] ithalini atlıyor." + overwriting: Üzerine yazma [biyom]. + saved-config: Eklenti ayarları güncellendi. + biome-removed: Eşsiz kimliğe sahip biyom = '[biome]' bellekten çıkarıldı. + update-start: "& eBiome güncellemesi başladı" + imported: "[biyom] ithal edildi." + import-count: Biyom ithalatı tamamlandı. İthal [sayı] biyomlar. +protection: + flags: + BIOMES_WORLD_PROTECTION: + name: Biome Island sınırlaması + description: |- + & 5 & oEnable / devre dışı + & 5 & oyuncular için + & 5 & obe adalarında + & 5 & okanj biyomu. + hint: Biyomu değiştirmek için adanızda olmalısınız! + BIOMES_ISLAND_PROTECTION: + description: |- + & 5 & oKimleri yapabilir + & 5 & ada biyomunu değiştir + name: Biyom kontrolü