From b337cc16ae25e4e920e29d0b655755a1d3d95354 Mon Sep 17 00:00:00 2001 From: Teenkung123 Date: Mon, 24 Jul 2023 07:31:15 +0700 Subject: [PATCH 01/12] Fixed bugs where plugin will throw error when ItemsAdder is installed Fixed bugs where normal block will sometimes replace ItemsAdder's Custom block Updated ItemsAdder API to 3.5.0b --- pom.xml | 2 +- .../aoneblock/listeners/BlockListener.java | 62 +++++++++---------- .../aoneblock/oneblocks/OneBlocksManager.java | 6 +- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 65a2cf7f..38d1486c 100644 --- a/pom.xml +++ b/pom.xml @@ -215,7 +215,7 @@ com.github.LoneDev6 API-ItemsAdder - 3.2.5 + 3.5.0b provided diff --git a/src/main/java/world/bentobox/aoneblock/listeners/BlockListener.java b/src/main/java/world/bentobox/aoneblock/listeners/BlockListener.java index ded058a6..52e29b9b 100644 --- a/src/main/java/world/bentobox/aoneblock/listeners/BlockListener.java +++ b/src/main/java/world/bentobox/aoneblock/listeners/BlockListener.java @@ -404,46 +404,46 @@ else if (player.getLocation().getBlock().equals(block.getRelative(BlockFace.UP)) private void spawnBlock(@NonNull OneBlockObject nextBlock, @NonNull Block block) { if (nextBlock.isCustomBlock()) { nextBlock.getCustomBlock().setBlock(block); - return; } else if (nextBlock.isItemsAdderBlock()) { //Get Custom Block from ItemsAdder and place it CustomBlock cBlock = CustomBlock.getInstance(nextBlock.getItemsAdderBlock()); if (cBlock != null) { + block.getLocation().getBlock().setType(Material.AIR); cBlock.place(block.getLocation()); + } + } else { + @NonNull + Material type = nextBlock.getMaterial(); + // Place new block with no physics + block.setType(type, false); + // Fill the chest + if (type.equals(Material.CHEST) && nextBlock.getChest() != null) { + fillChest(nextBlock, block); return; + } else if (Tag.LEAVES.isTagged(type)) { + Leaves leaves = (Leaves) block.getState().getBlockData(); + leaves.setPersistent(true); + block.setBlockData(leaves); + } else if (block.getState() instanceof BrushableBlock bb) { + LootTable lt = switch(bb.getBlock().getBiome()) { + default -> { + if (random.nextDouble() < 0.8) { + yield LootTables.TRAIL_RUINS_ARCHAEOLOGY_COMMON.getLootTable(); + } else { + // 20% rare + yield LootTables.TRAIL_RUINS_ARCHAEOLOGY_RARE.getLootTable(); + } + } + case DESERT -> LootTables.DESERT_PYRAMID_ARCHAEOLOGY.getLootTable(); + case FROZEN_OCEAN -> LootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY.getLootTable(); + case OCEAN -> LootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY.getLootTable(); + case WARM_OCEAN -> LootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY.getLootTable(); + }; + bb.setLootTable(lt); + bb.update(); } } - @NonNull - Material type = nextBlock.getMaterial(); - // Place new block with no physics - block.setType(type, false); - // Fill the chest - if (type.equals(Material.CHEST) && nextBlock.getChest() != null) { - fillChest(nextBlock, block); - return; - } else if (Tag.LEAVES.isTagged(type)) { - Leaves leaves = (Leaves) block.getState().getBlockData(); - leaves.setPersistent(true); - block.setBlockData(leaves); - } else if (block.getState() instanceof BrushableBlock bb) { - LootTable lt = switch(bb.getBlock().getBiome()) { - default -> { - if (random.nextDouble() < 0.8) { - yield LootTables.TRAIL_RUINS_ARCHAEOLOGY_COMMON.getLootTable(); - } else { - // 20% rare - yield LootTables.TRAIL_RUINS_ARCHAEOLOGY_RARE.getLootTable(); - } - } - case DESERT -> LootTables.DESERT_PYRAMID_ARCHAEOLOGY.getLootTable(); - case FROZEN_OCEAN -> LootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY.getLootTable(); - case OCEAN -> LootTables.OCEAN_RUIN_COLD_ARCHAEOLOGY.getLootTable(); - case WARM_OCEAN -> LootTables.OCEAN_RUIN_WARM_ARCHAEOLOGY.getLootTable(); - }; - bb.setLootTable(lt); - bb.update(); - } } private void spawnEntity(@NonNull OneBlockObject nextBlock, @NonNull Block block) { diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java index 45796faa..6fb5a8cf 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java @@ -415,8 +415,10 @@ void addBlocks(OneBlockPhase obPhase, ConfigurationSection phase) { CustomBlock block = CustomBlock.getInstance(material); if (block != null) { addItemsAdderBlock(obPhase, material, Objects.toString(blocks.get(material))); - } else if (ItemsAdder.getAllItems().size() != 0){ - addon.logError("Bad block material in " + obPhase.getPhaseName() + ": " + material); + } else if (ItemsAdder.getAllItems() != null){ + if (ItemsAdder.getAllItems().size() != 0) { + addon.logError("Bad block material in " + obPhase.getPhaseName() + ": " + material); + } } } else { addon.logError("Bad block material in " + obPhase.getPhaseName() + ": " + material); From cc9b83f09d31f24050f03191d14e531121be2dde Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Aug 2023 16:38:05 -0700 Subject: [PATCH 02/12] Version 1.14.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9526c76d..c3464415 100644 --- a/pom.xml +++ b/pom.xml @@ -67,7 +67,7 @@ -LOCAL - 1.14.1 + 1.14.2 BentoBoxWorld_AOneBlock bentobox-world From 3c72391238625b97621a7f2f789e6ab20085e8c7 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Aug 2023 17:34:47 -0700 Subject: [PATCH 03/12] Fixed issue where requirements were not being parsed correctly. --- .../bentobox/aoneblock/oneblocks/OneBlocksManager.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java index 6fb5a8cf..110340a5 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java @@ -326,7 +326,13 @@ void addRequirements(OneBlockPhase obPhase, ConfigurationSection phase) { for (ReqType key : Requirement.ReqType.values()) { ConfigurationSection reqs = phase.getConfigurationSection(REQUIREMENTS); if (reqs.contains(key.getKey())) { - reqList.add(new Requirement(key, reqs.get(key.getKey()))); + if (key.getClazz().equals(Double.class)) { + reqList.add(new Requirement(key, reqs.getDouble(key.getKey()))); + } else if (key.getClazz().equals(Long.class)) { + reqList.add(new Requirement(key, reqs.getLong(key.getKey()))); + } else { + reqList.add(new Requirement(key, reqs.getString(key.getKey()))); + } } } obPhase.setRequirements(reqList); From 1511e9e4a7de72a6e044f2c5089e65878082e17c Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Aug 2023 17:35:24 -0700 Subject: [PATCH 04/12] Fixed issue where [permission] was shown instead of the perm value. #334 --- .../aoneblock/panels/PhasesPanel.java | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java index d3b8b8f4..6f81647e 100644 --- a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java +++ b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java @@ -26,6 +26,7 @@ import world.bentobox.aoneblock.oneblocks.OneBlockPhase; import world.bentobox.aoneblock.oneblocks.Requirement; import world.bentobox.bank.Bank; +import world.bentobox.bentobox.api.addons.Addon; import world.bentobox.bentobox.api.localization.TextVariables; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.TemplatedPanel; @@ -337,11 +338,23 @@ private PanelItem createPhaseButton(ItemTemplateRecord template, Map.Entry { switch (requirement.getType()) { case ECO -> economyText.append(this.user.getTranslationOrNothing(reference + "economy", - TextVariables.NUMBER, String.valueOf(requirement.getEco()))); - + TextVariables.NUMBER, String.valueOf(requirement.getEco()))); + case BANK -> bankText.append(this.user.getTranslationOrNothing(reference + "bank", - TextVariables.NUMBER, String.valueOf(requirement.getBank()))); - + TextVariables.NUMBER, String.valueOf(requirement.getBank()))); + case LEVEL -> levelText.append(this.user.getTranslationOrNothing(reference + "level", - TextVariables.NUMBER, String.valueOf(requirement.getLevel()))); - + TextVariables.NUMBER, String.valueOf(requirement.getLevel()))); + case PERMISSION -> permissionText.append(this.user.getTranslationOrNothing(reference + "permission", - TextVariables.NUMBER, requirement.getPermission())); - + PERMISSION, requirement.getPermission())); + } }); @@ -522,11 +536,11 @@ private boolean phaseRequirementsFail(OneBlockPhase phase) result = switch (requirement.getType()) { case LEVEL -> - this.addon.getAddonByName("Level").map(a -> + this.addon.getAddonByName("Level").filter(Addon::isEnabled).map(a -> ((Level) a).getIslandLevel(this.world, this.island.getOwner()) < requirement.getLevel()). orElse(false); case BANK -> - this.addon.getAddonByName("Bank").map(a -> + this.addon.getAddonByName("Bank").filter(Addon::isEnabled).map(a -> ((Bank) a).getBankManager().getBalance(this.island).getValue() < requirement.getBank()). orElse(false); case ECO -> @@ -551,17 +565,17 @@ private boolean phaseRequirementsFail(OneBlockPhase phase) private void runCommandCall(String command, OneBlockPhase phase) { // Get first player command label. - this.addon.getPlayerCommand().ifPresent(mainCommand -> - mainCommand.getSubCommand(command).ifPresent(subCommand -> { - // Check if subcommand is setCount command. - if (Arrays.stream(this.addon.getSettings().getSetCountCommand().split(" ")). + this.addon.getPlayerCommand().ifPresent(mainCommand -> + mainCommand.getSubCommand(command).ifPresent(subCommand -> { + // Check if subcommand is setCount command. + if (Arrays.stream(this.addon.getSettings().getSetCountCommand().split(" ")). anyMatch(text -> text.equalsIgnoreCase(subCommand.getLabel()))) - { - this.addon.log(this.user.getName() + " called: `" + mainCommand.getTopLabel() + " " + subCommand.getLabel() + " " + phase.getBlockNumber()); - // Confirmation is done via GUI. Bypass. - this.user.performCommand(mainCommand.getTopLabel() + " " + subCommand.getLabel() + " " + phase.getBlockNumber()); - } - })); + { + this.addon.log(this.user.getName() + " called: `" + mainCommand.getTopLabel() + " " + subCommand.getLabel() + " " + phase.getBlockNumber()); + // Confirmation is done via GUI. Bypass. + this.user.performCommand(mainCommand.getTopLabel() + " " + subCommand.getLabel() + " " + phase.getBlockNumber()); + } + })); // Close inventory this.user.closeInventory(); From bf5dea0ee0d2e86c936d279704f118437171967e Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Aug 2023 17:35:34 -0700 Subject: [PATCH 05/12] Fix English --- src/main/resources/locales/en-US.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 23c42490..cb9e8570 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -42,9 +42,9 @@ aoneblock: set: "&a Count set to [number]." too-high: "&c The maximum you can set is [number]!" respawn-block: - description: "respawns magic block in situations when they disappear" - block-exist: "&a Block exist, do not require respawning. I marked it for you." - block-respawned: "&a Block respawned, please, do not void it again." + description: "respawns magic block in situations when it disappears" + block-exist: "&a Block exists, did not require respawning. I marked it for you." + block-respawned: "&a Block respawned." phase: insufficient-level: "&c Your island level is too low to proceed! It must be [number]." insufficient-funds: "&c Your funds are too low to proceed! They must be [number]." From e773e1b63d63d813c796b31e978f36dcb0e78a27 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Aug 2023 17:35:59 -0700 Subject: [PATCH 06/12] Fix missing colors for Vietnamese --- src/main/resources/locales/vi.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/locales/vi.yml b/src/main/resources/locales/vi.yml index 4635f973..62035374 100644 --- a/src/main/resources/locales/vi.yml +++ b/src/main/resources/locales/vi.yml @@ -6,7 +6,7 @@ aoneblock: parameters: " " description: chỉnh số đếm khối của người chơi set: "&a Số đếm khối của [name] được đặt thành [number]" - set-lifetime: "& bộ đếm thời gian tồn tại của [name] được đặt thành [number]" + set-lifetime: "&a Bộ đếm thời gian tồn tại của [name] được đặt thành [number]" setchest: parameters: " <độ hiếm>" description: thêm rương đang nhìn vào một giai đoạn với độ hiếm được chỉ định @@ -36,7 +36,7 @@ aoneblock: setcount: parameters: "" description: đặt số khối thành giá trị đã hoàn thành trước đó - set: "& Bộ đếm được đặt thành [number]." + set: "&a Bộ đếm được đặt thành [number]." too-high: "&cMức tối đa bạn có thể đặt là[number]!" phase: insufficient-level: Cấp đảo của bạn quá thấp để thực thi! Nó phải là [number]. From 283a952f6582bfabc93e3c275d60f60f94ba2135 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Aug 2023 20:50:26 -0700 Subject: [PATCH 07/12] Work to fix #334 --- .../aoneblock/listeners/CheckPhase.java | 63 +++++++++---------- .../aoneblock/oneblocks/OneBlocksManager.java | 14 +++-- .../aoneblock/panels/PhasesPanel.java | 52 ++++++--------- 3 files changed, 56 insertions(+), 73 deletions(-) diff --git a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java index d5e4f853..7cb0a734 100644 --- a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java +++ b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java @@ -50,51 +50,48 @@ public CheckPhase(AOneBlock addon, BlockListener blockListener) { * @param i - island * @param phase - one block phase * @param world - world - * @return true if the player can proceed to the next phase, false if not or if there is no next phase. + * @return true if the player cannot proceed to the next phase. */ protected boolean phaseRequirementsFail(@Nullable Player player, @NonNull Island i, OneBlockPhase phase, @NonNull World world) { if (phase.getRequirements().isEmpty()) { return false; } // Check requirements + boolean blocked = false; for (Requirement r : phase.getRequirements()) { - switch (r.getType()) { - case LEVEL: - return addon.getAddonByName("Level").map(l -> { - if (((Level) l).getIslandLevel(world, i.getOwner()) < r.getLevel()) { - User.getInstance(player).sendMessage("aoneblock.phase.insufficient-level", TextVariables.NUMBER, String.valueOf(r.getLevel())); - return true; - } - return false; - }).orElse(false); - case BANK: - return addon.getAddonByName("Bank").map(l -> { - if (((Bank) l).getBankManager().getBalance(i).getValue() < r.getBank()) { - User.getInstance(player).sendMessage("aoneblock.phase.insufficient-bank-balance", TextVariables.NUMBER, String.valueOf(r.getBank())); - return true; - } - return false; - }).orElse(false); - case ECO: - return addon.getPlugin().getVault().map(l -> { - if (l.getBalance(User.getInstance(player), world) < r.getEco()) { - User.getInstance(player).sendMessage("aoneblock.phase.insufficient-funds", TextVariables.NUMBER, String.valueOf(r.getEco())); - return true; - } - return false; - }).orElse(false); - case PERMISSION: - if (player != null && !player.hasPermission(r.getPermission())) { - User.getInstance(player).sendMessage("aoneblock.phase.insufficient-permission", TextVariables.NAME, String.valueOf(r.getPermission())); + boolean b = switch (r.getType()) { + case LEVEL -> addon.getAddonByName("Level").map(l -> { + if (((Level) l).getIslandLevel(world, i.getOwner()) < r.getLevel()) { + User.getInstance(player).sendMessage("aoneblock.phase.insufficient-level", TextVariables.NUMBER, String.valueOf(r.getLevel())); return true; } return false; - default: - break; - + }).orElse(false); + case BANK -> addon.getAddonByName("Bank").map(l -> { + if (((Bank) l).getBankManager().getBalance(i).getValue() < r.getBank()) { + User.getInstance(player).sendMessage("aoneblock.phase.insufficient-bank-balance", TextVariables.NUMBER, String.valueOf(r.getBank())); + return true; + } + return false; + }).orElse(false); + case ECO -> addon.getPlugin().getVault().map(l -> { + if (l.getBalance(User.getInstance(player), world) < r.getEco()) { + User.getInstance(player).sendMessage("aoneblock.phase.insufficient-funds", TextVariables.NUMBER, String.valueOf(r.getEco())); + return true; + } + return false; + }).orElse(false); + case PERMISSION -> { + if (player != null && !player.hasPermission(r.getPermission())) { + User.getInstance(player).sendMessage("aoneblock.phase.insufficient-permission", TextVariables.NAME, String.valueOf(r.getPermission())); + yield true; + } + yield false; } + }; + if (b) blocked = true; } - return false; + return blocked; } /** diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java index 110340a5..4f2a6410 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java @@ -18,8 +18,6 @@ import java.util.jar.JarFile; import java.util.stream.Collectors; -import dev.lone.itemsadder.api.CustomBlock; -import dev.lone.itemsadder.api.ItemsAdder; import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Material; import org.bukkit.block.Biome; @@ -33,6 +31,8 @@ import com.google.common.base.Enums; import com.google.common.io.Files; +import dev.lone.itemsadder.api.CustomBlock; +import dev.lone.itemsadder.api.ItemsAdder; import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; import world.bentobox.aoneblock.oneblocks.OneBlockObject.Rarity; @@ -323,16 +323,18 @@ void addRequirements(OneBlockPhase obPhase, ConfigurationSection phase) { if (!phase.isConfigurationSection(REQUIREMENTS)) { return; } + ConfigurationSection reqs = phase.getConfigurationSection(REQUIREMENTS); for (ReqType key : Requirement.ReqType.values()) { - ConfigurationSection reqs = phase.getConfigurationSection(REQUIREMENTS); if (reqs.contains(key.getKey())) { + Requirement r; if (key.getClazz().equals(Double.class)) { - reqList.add(new Requirement(key, reqs.getDouble(key.getKey()))); + r = new Requirement(key, reqs.getDouble(key.getKey())); } else if (key.getClazz().equals(Long.class)) { - reqList.add(new Requirement(key, reqs.getLong(key.getKey()))); + r = new Requirement(key, reqs.getLong(key.getKey())); } else { - reqList.add(new Requirement(key, reqs.getString(key.getKey()))); + r = new Requirement(key, reqs.getString(key.getKey())); } + reqList.add(r); } } obPhase.setRequirements(reqList); diff --git a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java index 6f81647e..398eac4d 100644 --- a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java +++ b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java @@ -387,7 +387,7 @@ private PanelItem createPhaseButton(ItemTemplateRecord template, Map.Entry { switch (requirement.getType()) { @@ -418,6 +418,7 @@ private PanelItem createPhaseButton(ItemTemplateRecord template, Map.Entry - this.addon.getAddonByName("Level").filter(Addon::isEnabled).map(a -> - ((Level) a).getIslandLevel(this.world, this.island.getOwner()) < requirement.getLevel()). - orElse(false); - case BANK -> - this.addon.getAddonByName("Bank").filter(Addon::isEnabled).map(a -> - ((Bank) a).getBankManager().getBalance(this.island).getValue() < requirement.getBank()). - orElse(false); - case ECO -> - this.addon.getPlugin().getVault().map(a -> - a.getBalance(this.user, this.world) < requirement.getEco()). - orElse(false); - case PERMISSION -> - this.user != null && !this.user.hasPermission(requirement.getPermission()); - }; - if (result) { - break; - } - } + if (switch (requirement.getType()) { + case LEVEL -> this.addon.getAddonByName("Level").filter(Addon::isEnabled).map(a -> + ((Level) a).getIslandLevel(this.world, this.island.getOwner()) < requirement.getLevel()).orElse(false); + + case BANK -> this.addon.getAddonByName("Bank").filter(Addon::isEnabled).map(a -> + ((Bank) a).getBankManager().getBalance(this.island).getValue() < requirement.getBank()).orElse(false); + + case ECO -> this.addon.getPlugin().getVault().map(a -> a.getBalance(this.user, this.world) < requirement.getEco()).orElse(false); - return result; + case PERMISSION -> this.user != null && !this.user.hasPermission(requirement.getPermission()); + }) { + return true; + } + } + return false; } From 56ca85935b37997a8ab210f75d9184a939e7f716 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 6 Aug 2023 15:55:06 -0700 Subject: [PATCH 08/12] Make flag private and non-static --- src/main/java/world/bentobox/aoneblock/AOneBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/aoneblock/AOneBlock.java b/src/main/java/world/bentobox/aoneblock/AOneBlock.java index e87660e8..ea491759 100644 --- a/src/main/java/world/bentobox/aoneblock/AOneBlock.java +++ b/src/main/java/world/bentobox/aoneblock/AOneBlock.java @@ -41,7 +41,7 @@ public class AOneBlock extends GameModeAddon { private static final String NETHER = "_nether"; private static final String THE_END = "_the_end"; - public static boolean hasItemsAdder = false; + private boolean hasItemsAdder = false; // Settings private Settings settings; From 21d39ed421e964a83951935d96159d207bd5966f Mon Sep 17 00:00:00 2001 From: Melle Moerkerk Date: Wed, 9 Aug 2023 16:59:22 +0200 Subject: [PATCH 09/12] Remove accidental 'git checkout master' --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c3464415..6154cbe6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ AOneBlock AOneBlock is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like SkyBlock or AcidIsland. - https://github.com/BentoBoxWorlgit checkout masterd/AOneBlock + https://github.com/BentoBoxWorld/AOneBlock 2020 From c3a12bc3173e9c8ef855e6e4a31099e84aa748ca Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 14 Aug 2023 20:27:10 -0700 Subject: [PATCH 10/12] JavaDoc --- .../bentobox/aoneblock/commands/admin/AdminSanityCheck.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/world/bentobox/aoneblock/commands/admin/AdminSanityCheck.java b/src/main/java/world/bentobox/aoneblock/commands/admin/AdminSanityCheck.java index 94965915..8f27cfd4 100644 --- a/src/main/java/world/bentobox/aoneblock/commands/admin/AdminSanityCheck.java +++ b/src/main/java/world/bentobox/aoneblock/commands/admin/AdminSanityCheck.java @@ -8,6 +8,11 @@ import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.user.User; +/** + * Command to run a sanity check + * @author tastybento + * + */ public class AdminSanityCheck extends CompositeCommand { private AOneBlock addon; From 7a6153179d0712a717d7de11b2f78d6a8b2c3eea Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 14 Aug 2023 20:28:28 -0700 Subject: [PATCH 11/12] Added expanded test class (WIP) --- .../aoneblock/oneblocks/OneBlocksManager.java | 11 + .../oneblocks/OneBlocksManagerTest2.java | 446 ++++++++++++++++++ 2 files changed, 457 insertions(+) create mode 100644 src/test/java/world/bentobox/aoneblock/oneblocks/OneBlocksManagerTest2.java diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java index 4f2a6410..ae3fc96c 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java @@ -163,11 +163,19 @@ private void loadPhase(File phaseFile) throws IOException { } } + /** + * Load in the phase's init + * @param blockNumber string representation of this phase's block number + * @param obPhase OneBlockPhase + * @param phase configuration section being read + * @throws IOException if there's an error in the config file + */ void initBlock(String blockNumber, OneBlockPhase obPhase, ConfigurationSection phase) throws IOException { if (phase.contains(NAME, true)) { if (obPhase.getPhaseName() != null) { throw new IOException("Block " + blockNumber + ": Phase name trying to be set to " + phase.getString(NAME) + " but already set to " + obPhase.getPhaseName() + ". Duplicate phase file?"); } + System.out.println("name"); // name obPhase.setPhaseName(phase.getString(NAME, blockNumber)); } @@ -793,6 +801,9 @@ public void getProbs(OneBlockPhase phase) { } } + /** + * Get all the probs for each phases and log to console + */ public void getAllProbs() { blockProbs.values().forEach(this::getProbs); } diff --git a/src/test/java/world/bentobox/aoneblock/oneblocks/OneBlocksManagerTest2.java b/src/test/java/world/bentobox/aoneblock/oneblocks/OneBlocksManagerTest2.java new file mode 100644 index 00000000..b894ef1a --- /dev/null +++ b/src/test/java/world/bentobox/aoneblock/oneblocks/OneBlocksManagerTest2.java @@ -0,0 +1,446 @@ +package world.bentobox.aoneblock.oneblocks; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +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.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.List; +import java.util.NavigableMap; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.UnsafeValues; +import org.bukkit.block.Biome; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.inventory.ItemFactory; +import org.bukkit.inventory.meta.ItemMeta; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.reflect.Whitebox; + +import world.bentobox.aoneblock.AOneBlock; +import world.bentobox.aoneblock.dataobjects.OneBlockIslands; +import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.addons.AddonDescription; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.managers.AddonsManager; + +/** + * @author tastybento + * + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({Bukkit.class, BentoBox.class, User.class}) +public class OneBlocksManagerTest2 { + + private static File jFile; + private static YamlConfiguration oneBlocks; + @Mock + private BentoBox plugin; + private AOneBlock addon; + @Mock + private AddonsManager am; + private OneBlocksManager obm; + private OneBlockPhase obPhase; + @Mock + private @NonNull OneBlockIslands obi; + + @BeforeClass + public static void beforeClass() throws IOException, InvalidConfigurationException { + // Make the addon jar + jFile = new File("addon.jar"); + // Copy over config file from src folder + /* + Path fromPath = Paths.get("src/main/resources/config.yml"); + Path path = Paths.get("config.yml"); + Files.copy(fromPath, path);*/ + // Dummy oneblocks.yml + String oneblocks = + "'0':\n" + + " name: Plains\n" + + " icon: GRASS_BLOCK\n" + + " firstBlock: GRASS_BLOCK\n" + + " biome: PLAINS\n" + + " fixedBlocks:\n" + + " 0: GRASS_BLOCK\n" + + " 1: GRASS_BLOCK\n" + + " holograms:\n" + + " 0: &aGood Luck!\n" + + " blocks:\n" + + " GRASS_BLOCK: 2000\n" + + " BIRCH_LOG: 500\n" + + " mobs:\n" + + " SHEEP: 150\n" + + " VILLAGER: 30\n" + + "'700':\n" + + " name: Underground\n" + + " firstBlock: STONE\n" + + " biome: TAIGA\n" + + " blocks:\n" + + " EMERALD_ORE: 5\n" + + " COBWEB: 250\n" + + " DIRT: 500\n" + + "'11000':\n" + + " gotoBlock: 0"; + oneBlocks = new YamlConfiguration(); + oneBlocks.loadFromString(oneblocks); + // Save + File obFileDir = new File("phases"); + + File obFile = new File(obFileDir, "0_plains.yml"); + obFileDir.mkdirs(); + oneBlocks.save(obFile); + /* + // Copy over block config file from src folder + fromPath = Paths.get("src/main/resources/oneblocks.yml"); + path = Paths.get("oneblocks.yml"); + Files.copy(fromPath, path); + */ + try (JarOutputStream tempJarOutputStream = new JarOutputStream(new FileOutputStream(jFile))) { + //Added the new files to the jar. + try (FileInputStream fis = new FileInputStream(obFile)) { + byte[] buffer = new byte[1024]; + int bytesRead = 0; + JarEntry entry = new JarEntry(obFile.toPath().toString()); + tempJarOutputStream.putNextEntry(entry); + while((bytesRead = fis.read(buffer)) != -1) { + tempJarOutputStream.write(buffer, 0, bytesRead); + } + } + } + } + + /** + * @throws java.lang.Exception + */ + @Before + public void setUp() throws Exception { + // Set up plugin + Whitebox.setInternalState(BentoBox.class, "instance", plugin); + // Addon + addon = new AOneBlock(); + File dataFolder = new File("addons/AOneBlock"); + addon.setDataFolder(dataFolder); + addon.setFile(jFile); + AddonDescription desc = new AddonDescription.Builder("bentobox", "AOneBlock", "1.3").description("test").authors("tastybento").build(); + addon.setDescription(desc); + //addon.setSettings(new Settings()); + // Addons manager + when(plugin.getAddonsManager()).thenReturn(am); + + // Bukkit + PowerMockito.mockStatic(Bukkit.class); + ItemMeta meta = mock(ItemMeta.class); + ItemFactory itemFactory = mock(ItemFactory.class); + when(itemFactory.getItemMeta(any())).thenReturn(meta); + when(Bukkit.getItemFactory()).thenReturn(itemFactory); + UnsafeValues unsafe = mock(UnsafeValues.class); + when(unsafe.getDataVersion()).thenReturn(777); + when(Bukkit.getUnsafe()).thenReturn(unsafe); + + // Phase + obPhase = new OneBlockPhase("0"); + + // Class under test + obm = new OneBlocksManager(addon); + } + + /** + * @throws java.lang.Exception + */ + @After + public void tearDown() throws Exception { + deleteAll(new File("database")); + } + + @AfterClass + public static void cleanUp() throws Exception { + + new File("addon.jar").delete(); + new File("config.yml").delete(); + + deleteAll(new File("addons")); + deleteAll(new File("phases")); + } + + private static void deleteAll(File file) throws IOException { + if (file.exists()) { + Files.walk(file.toPath()) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + } + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#OneBlocksManager(world.bentobox.aoneblock.AOneBlock)}. + * @throws IOException + */ + @Test + public void testOneBlocksManager() throws IOException { + File f = new File("phases", "0_plains.yml"); + assertTrue(f.exists()); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#loadPhases()}. + * @throws InvalidConfigurationException + * @throws IOException + * @throws NumberFormatException + */ + //@Ignore("Cannot deserialize objects right now") + @Test + public void testLoadPhases() throws NumberFormatException, IOException, InvalidConfigurationException { + obm.loadPhases(); + verify(plugin, never()).logError(anyString()); + assertEquals(Material.GRASS_BLOCK, obm.getPhase(0).getFirstBlock().getMaterial()); + assertEquals(Biome.PLAINS, obm.getPhase(0).getPhaseBiome()); + assertEquals("Plains", obm.getPhase(0).getPhaseName()); + assertNull(obm.getPhase(0).getGotoBlock()); + + assertEquals(Material.STONE, obm.getPhase(700).getFirstBlock().getMaterial()); + assertEquals(Biome.TAIGA, obm.getPhase(700).getPhaseBiome()); + assertEquals("Underground", obm.getPhase(700).getPhaseName()); + assertNull(obm.getPhase(700).getGotoBlock()); + + assertEquals(0, (int)obm.getPhase(11000).getGotoBlock()); + + + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getPhaseList()}. + * @throws InvalidConfigurationException + * @throws IOException + * @throws NumberFormatException + */ + @Test + public void testGetPhaseList() throws NumberFormatException, IOException, InvalidConfigurationException { + testLoadPhases(); + List l = obm.getPhaseList(); + assertEquals(2, l.size()); + assertEquals("Plains", l.get(0)); + assertEquals("Underground", l.get(1)); + + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getPhase(java.lang.String)}. + * @throws InvalidConfigurationException + * @throws IOException + * @throws NumberFormatException + */ + @Test + public void testGetPhaseString() throws NumberFormatException, IOException, InvalidConfigurationException { + testLoadPhases(); + assertFalse(obm.getPhase("sdf").isPresent()); + assertTrue(obm.getPhase("Plains").isPresent()); + assertTrue(obm.getPhase("Underground").isPresent()); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#saveOneBlockConfig()}. + * @throws InvalidConfigurationException + * @throws IOException + * @throws NumberFormatException + */ + @Ignore("Not saving") + @Test + public void testSaveOneBlockConfig() throws NumberFormatException, IOException, InvalidConfigurationException { + //testLoadPhases(); + //assertTrue(obm.saveOneBlockConfig()); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getNextPhase(OneBlockPhase)}. + * @throws InvalidConfigurationException + * @throws IOException + * @throws NumberFormatException + */ + @Test + public void testGetNextPhase() throws NumberFormatException, IOException, InvalidConfigurationException { + testLoadPhases(); + OneBlockPhase plains = obm.getPhase("Plains").get(); + OneBlockPhase underground = obm.getPhase("Underground").get(); + OneBlockPhase gotoPhase = obm.getPhase(11000); + assertEquals(underground, obm.getNextPhase(plains)); + assertEquals(gotoPhase, obm.getNextPhase(underground)); + assertNull(obm.getNextPhase(gotoPhase)); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#copyPhasesFromAddonJar(java.io.File)}. + * @throws IOException + */ + @Test + public void testCopyPhasesFromAddonJar() throws IOException { + File dest = new File("dest"); + dest.mkdir(); + obm.copyPhasesFromAddonJar(dest); + File check = new File(dest, "0_plains.yml"); + assertTrue(check.exists()); + // Clean up + deleteAll(dest); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#initBlock(java.lang.String, world.bentobox.aoneblock.oneblocks.OneBlockPhase, org.bukkit.configuration.ConfigurationSection)}. + * @throws IOException + */ + @Test + public void testInitBlock() throws IOException { + System.out.println(oneBlocks); + obm.initBlock("0", obPhase, oneBlocks); + assertEquals("", obPhase.getPhaseName()); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#addFirstBlock(world.bentobox.aoneblock.oneblocks.OneBlockPhase, java.lang.String)}. + */ + @Test + public void testAddFirstBlock() { + obm.addFirstBlock(obPhase, "SPONGE"); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#addCommands(world.bentobox.aoneblock.oneblocks.OneBlockPhase, org.bukkit.configuration.ConfigurationSection)}. + */ + @Test + public void testAddCommands() { + obm.addCommands(obPhase, oneBlocks); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#addRequirements(world.bentobox.aoneblock.oneblocks.OneBlockPhase, org.bukkit.configuration.ConfigurationSection)}. + */ + @Test + public void testAddRequirements() { + obm.addRequirements(obPhase, oneBlocks); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#addChests(world.bentobox.aoneblock.oneblocks.OneBlockPhase, org.bukkit.configuration.ConfigurationSection)}. + */ + @Test + public void testAddChests() throws IOException { + obm.addChests(obPhase, oneBlocks); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#addMobs(world.bentobox.aoneblock.oneblocks.OneBlockPhase, org.bukkit.configuration.ConfigurationSection)}. + */ + @Test + public void testAddMobs() throws IOException { + obm.addMobs(obPhase, oneBlocks); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#addBlocks(world.bentobox.aoneblock.oneblocks.OneBlockPhase, org.bukkit.configuration.ConfigurationSection)}. + */ + @Test + public void testAddBlocks() throws IOException { + obm.addBlocks(obPhase, oneBlocks); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getPhase(int)}. + */ + @Test + public void testGetPhaseInt() { + @Nullable + OneBlockPhase phase = obm.getPhase(1); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getBlockProbs()}. + */ + @Test + public void testGetBlockProbs() { + NavigableMap probs = obm.getBlockProbs(); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#savePhase(world.bentobox.aoneblock.oneblocks.OneBlockPhase)}. + */ + @Test + public void testSavePhase() { + boolean result = obm.savePhase(obPhase); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getNextPhase(world.bentobox.aoneblock.oneblocks.OneBlockPhase)}. + */ + @Test + public void testGetNextPhaseOneBlockPhase() { + @Nullable + OneBlockPhase phase = obm.getNextPhase(obPhase); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getNextPhaseBlocks(world.bentobox.aoneblock.dataobjects.OneBlockIslands)}. + */ + @Test + public void testGetNextPhaseBlocks() { + int phase = obm.getNextPhaseBlocks(obi); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getPercentageDone(world.bentobox.aoneblock.dataobjects.OneBlockIslands)}. + */ + @Test + public void testGetPercentageDone() { + double percent = obm.getPercentageDone(obi); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getProbs(world.bentobox.aoneblock.oneblocks.OneBlockPhase)}. + */ + @Test + public void testGetProbs() { + obm.getProbs(obPhase); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getAllProbs()}. + */ + @Test + public void testGetAllProbs() { + obm.getAllProbs(); + } + + /** + * Test method for {@link world.bentobox.aoneblock.oneblocks.OneBlocksManager#getNextPhase(world.bentobox.aoneblock.dataobjects.OneBlockIslands)}. + */ + @Test + public void testGetNextPhaseOneBlockIslands() { + String phase = obm.getNextPhase(obi); + } + +} From 91765055c30e875d0bda2e854bf4bf591d9ec48f Mon Sep 17 00:00:00 2001 From: tastybento Date: Mon, 14 Aug 2023 20:45:05 -0700 Subject: [PATCH 12/12] Prevent null biomes causing errors. https://github.com/BentoBoxWorld/AOneBlock/issues/337 --- .../bentobox/aoneblock/oneblocks/OneBlocksManager.java | 1 - .../java/world/bentobox/aoneblock/panels/PhasesPanel.java | 6 ++++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java index ae3fc96c..e369b6bb 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/OneBlocksManager.java @@ -175,7 +175,6 @@ void initBlock(String blockNumber, OneBlockPhase obPhase, ConfigurationSection p if (obPhase.getPhaseName() != null) { throw new IOException("Block " + blockNumber + ": Phase name trying to be set to " + phase.getString(NAME) + " but already set to " + obPhase.getPhaseName() + ". Duplicate phase file?"); } - System.out.println("name"); // name obPhase.setPhaseName(phase.getString(NAME, blockNumber)); } diff --git a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java index 398eac4d..2eeb76d9 100644 --- a/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java +++ b/src/main/java/world/bentobox/aoneblock/panels/PhasesPanel.java @@ -408,9 +408,11 @@ private PanelItem createPhaseButton(ItemTemplateRecord template, Map.Entry