diff --git a/.gitignore b/.gitignore index c836fce..a581609 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* /target/ +/.DS_Store +/.classpath +/.project diff --git a/pom.xml b/pom.xml index c01cbfb..f583b0f 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ world.bentobox caveblock - 0.1.0 + ${revision} CaveBlock CaveBlock is an add-on for BentoBox, an expandable Minecraft Bukkit plugin for island-type games like SkyBlock or AcidIsland. @@ -44,9 +44,45 @@ UTF-8 UTF-8 1.8 - 1.7.4 + + 1.13.2-R0.1-SNAPSHOT + 1.3.0 + + ${build.version} + + 1.3.0 + + + develop + + + env.BUILD_NUMBER + + + + + ${build.version}-SNAPSHOT #${env.BUILD_NUMBER} + + + + + master + + + env.GIT_BRANCH + origin/master + + + + + ${build.version} + + + + + spigot-repo @@ -62,31 +98,13 @@ org.spigotmc spigot-api - 1.13.2-R0.1-SNAPSHOT + ${spigot.version} provided - - org.mockito - mockito-all - 1.10.19 - test - - - org.powermock - powermock-module-junit4 - ${powermock.version} - test - - - org.powermock - powermock-api-mockito - ${powermock.version} - test - world.bentobox bentobox - 1.2.0 + ${bentobox.version} provided @@ -199,28 +217,6 @@ maven-deploy-plugin 2.8.2 - - org.jacoco - jacoco-maven-plugin - 0.8.1 - - true - - - - pre-unit-test - - prepare-agent - - - - post-unit-test - - report - - - - \ No newline at end of file diff --git a/src/main/java/world/bentobox/caveblock/CaveBlock.java b/src/main/java/world/bentobox/caveblock/CaveBlock.java index c170de6..bc1acf7 100644 --- a/src/main/java/world/bentobox/caveblock/CaveBlock.java +++ b/src/main/java/world/bentobox/caveblock/CaveBlock.java @@ -13,7 +13,6 @@ import world.bentobox.bentobox.api.configuration.WorldSettings; import world.bentobox.caveblock.commands.AdminCommand; import world.bentobox.caveblock.commands.IslandCommand; import world.bentobox.caveblock.generators.ChunkGeneratorWorld; -import world.bentobox.caveblock.listeners.BeaconEnabler; import world.bentobox.caveblock.listeners.CustomHeightLimitations; @@ -165,7 +164,6 @@ public class CaveBlock extends GameModeAddon } this.getServer().getPluginManager().registerEvents(new CustomHeightLimitations(this), this.getPlugin()); - this.getServer().getPluginManager().registerEvents(new BeaconEnabler(this), this.getPlugin()); } diff --git a/src/main/java/world/bentobox/caveblock/Settings.java b/src/main/java/world/bentobox/caveblock/Settings.java index a1571bd..9f0e7c3 100644 --- a/src/main/java/world/bentobox/caveblock/Settings.java +++ b/src/main/java/world/bentobox/caveblock/Settings.java @@ -412,16 +412,6 @@ public class Settings implements DataObject, WorldSettings } - /** - * This method returns the resetConfirmation object. - * @return the resetConfirmation object. - */ - public boolean isResetConfirmation() - { - return resetConfirmation; - } - - /** * This method returns the leaversLoseReset object. * @return the leaversLoseReset object. @@ -508,16 +498,6 @@ public class Settings implements DataObject, WorldSettings } - /** - * This method returns the respawnOnIsland object. - * @return the respawnOnIsland object. - */ - public boolean isRespawnOnIsland() - { - return respawnOnIsland; - } - - /** * This method returns the allowSetHomeInNether object. * @return the allowSetHomeInNether object. @@ -627,16 +607,6 @@ public class Settings implements DataObject, WorldSettings } - /** - * This method returns the closePanelOnClickOutside object. - * @return the closePanelOnClickOutside object. - */ - public boolean isClosePanelOnClickOutside() - { - return closePanelOnClickOutside; - } - - /** * @return the permission prefix */ @@ -828,7 +798,27 @@ public class Settings implements DataObject, WorldSettings } - // --------------------------------------------------------------------- + /** + * This method returns the islandCommand value. + * @return the value of islandCommand. + */ + public String getIslandCommand() + { + return islandCommand; + } + + + /** + * This method returns the adminCommand value. + * @return the value of adminCommand. + */ + public String getAdminCommand() + { + return adminCommand; + } + + + // --------------------------------------------------------------------- // Section: Setters // --------------------------------------------------------------------- @@ -1195,17 +1185,6 @@ public class Settings implements DataObject, WorldSettings } - /** - * This method sets the resetConfirmation object value. - * @param resetConfirmation the resetConfirmation object new value. - * - */ - public void setResetConfirmation(boolean resetConfirmation) - { - this.resetConfirmation = resetConfirmation; - } - - /** * This method sets the leaversLoseReset object value. * @param leaversLoseReset the leaversLoseReset object new value. @@ -1294,17 +1273,6 @@ public class Settings implements DataObject, WorldSettings } - /** - * This method sets the respawnOnIsland object value. - * @param respawnOnIsland the respawnOnIsland object new value. - * - */ - public void setRespawnOnIsland(boolean respawnOnIsland) - { - this.respawnOnIsland = respawnOnIsland; - } - - /** * This method sets the allowSetHomeInNether object value. * @param allowSetHomeInNether the allowSetHomeInNether object new value. @@ -1414,18 +1382,6 @@ public class Settings implements DataObject, WorldSettings this.ivSettings = ivSettings; } - - /** - * This method sets the closePanelOnClickOutside object value. - * @param closePanelOnClickOutside the closePanelOnClickOutside object new value. - * - */ - public void setClosePanelOnClickOutside(boolean closePanelOnClickOutside) - { - this.closePanelOnClickOutside = closePanelOnClickOutside; - } - - /** * This method sets the resetEpoch object value. * @param resetEpoch the resetEpoch object new value. @@ -1629,10 +1585,45 @@ public class Settings implements DataObject, WorldSettings this.debug = debug; } - // --------------------------------------------------------------------- + + /** + * This method sets the islandCommand value. + * @param islandCommand the islandCommand new value. + * + */ + public void setIslandCommand(String islandCommand) + { + this.islandCommand = islandCommand; + } + + + /** + * This method sets the adminCommand value. + * @param adminCommand the adminCommand new value. + * + */ + public void setAdminCommand(String adminCommand) + { + this.adminCommand = adminCommand; + } + + + // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- + + /* Commands */ + @ConfigComment("Cave Command. What command users will run to access their cave.") + @ConfigComment("To define alias, just separate commands with white space.") + @ConfigEntry(path = "cave.command.island") + private String islandCommand = "cave cb"; + + @ConfigComment("The Cave admin command.") + @ConfigComment("To define alias, just separate commands with white space.") + @ConfigEntry(path = "cave.command.admin") + private String adminCommand = "cbadmin cba"; + /* WORLD */ @ConfigComment("Friendly name for this world. Used in admin commands. Must be a single word") @ConfigEntry(path = "world.friendly-name") @@ -1895,9 +1886,6 @@ public class Settings implements DataObject, WorldSettings @ConfigEntry(path = "island.reset.reset-limit") private int resetLimit = -1; - @ConfigEntry(path = "island.require-confirmation.reset") - private boolean resetConfirmation = true; - @ConfigComment("Kicked or leaving players lose resets") @ConfigComment("Players who leave a team will lose an island reset chance") @ConfigComment("If a player has zero resets left and leaves a team, they cannot make a new") @@ -1946,10 +1934,6 @@ public class Settings implements DataObject, WorldSettings @ConfigEntry(path = "island.reset.on-leave.ender-chest") private boolean onLeaveResetEnderChest = false; - @ConfigComment("Have player's respawn on their island if they die") - @ConfigEntry(path = "island.respawn-on-island") - private boolean respawnOnIsland = true; - // Sethome @ConfigEntry(path = "island.sethome.nether.allow") private boolean allowSetHomeInNether = true; @@ -1993,12 +1977,6 @@ public class Settings implements DataObject, WorldSettings @ConfigEntry(path = "protection.invincible-visitors") private List ivSettings = new ArrayList<>(); - //---------------------------------------------------------------------------------------/ - - @ConfigComment("Whether GUIs should be closed when the player clicks outside.") - @ConfigEntry(path = "panel.close-on-click-outside") - private boolean closePanelOnClickOutside = true; - //---------------------------------------------------------------------------------------/ @ConfigComment("These settings should not be edited") @ConfigEntry(path = "do-not-edit-these-settings.reset-epoch") diff --git a/src/main/java/world/bentobox/caveblock/commands/AdminCommand.java b/src/main/java/world/bentobox/caveblock/commands/AdminCommand.java index 30a8df1..4b88eee 100644 --- a/src/main/java/world/bentobox/caveblock/commands/AdminCommand.java +++ b/src/main/java/world/bentobox/caveblock/commands/AdminCommand.java @@ -21,7 +21,9 @@ import world.bentobox.caveblock.CaveBlock; public class AdminCommand extends CompositeCommand { public AdminCommand(CaveBlock addon) { - super(addon, "cbadmin", "cba"); + super(addon, + addon.getSettings().getAdminCommand().split(" ")[0], + addon.getSettings().getAdminCommand().split(" ")); } @Override @@ -62,6 +64,12 @@ public class AdminCommand extends CompositeCommand { new AdminReloadCommand(this); // Spawn new AdminSetspawnCommand(this); + // Reset flags + new AdminResetFlagsCommand(this); + // Trash + new AdminTrashCommand(this); + new AdminEmptyTrashCommand(this); + new AdminSwitchtoCommand(this); } @Override diff --git a/src/main/java/world/bentobox/caveblock/commands/IslandCommand.java b/src/main/java/world/bentobox/caveblock/commands/IslandCommand.java index 971dd77..df73586 100644 --- a/src/main/java/world/bentobox/caveblock/commands/IslandCommand.java +++ b/src/main/java/world/bentobox/caveblock/commands/IslandCommand.java @@ -15,7 +15,9 @@ import world.bentobox.caveblock.CaveBlock; public class IslandCommand extends CompositeCommand { public IslandCommand(CaveBlock addon) { - super(addon, "cave", "cb"); + super(addon, + addon.getSettings().getIslandCommand().split(" ")[0], + addon.getSettings().getIslandCommand().split(" ")); } /* (non-Javadoc) diff --git a/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java b/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java index c8bb8a5..5c3d0ff 100644 --- a/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java +++ b/src/main/java/world/bentobox/caveblock/generators/populators/MaterialPopulator.java @@ -146,11 +146,13 @@ public class MaterialPopulator extends BlockPopulator filter(splitString -> splitString.length == 4). forEach(splitString -> { Material material = Material.getMaterial(splitString[1]); - - if (material != null) + // Material must be a block otherwise the chunk cannot be populated + if (material != null && material.isBlock()) { materialMap.put(material, new Pair<>(Double.parseDouble(splitString[2]), Integer.parseInt(splitString[3]))); + } else { + addon.logError("Could not parse MATERIAL in config.yml: " + splitString[1] + " is not a valid block."); } }); diff --git a/src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java b/src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java deleted file mode 100644 index 61a8f4f..0000000 --- a/src/main/java/world/bentobox/caveblock/listeners/BeaconEnabler.java +++ /dev/null @@ -1,203 +0,0 @@ -package world.bentobox.caveblock.listeners; - - -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockDamageEvent; -import org.bukkit.event.block.BlockExplodeEvent; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntityExplodeEvent; - -import world.bentobox.bentobox.util.Util; -import world.bentobox.caveblock.CaveBlock; -import world.bentobox.caveblock.Settings; - - -/** - * This class allows to enable beacon in CaveBlock, if cave roof is made of bedrock. - * It will replace Bedrock with black glass. - */ -public class BeaconEnabler implements Listener -{ - /** - * Constructor BeaconEnabler creates a new BeaconEnabler instance. - * - * @param addon of type CaveBlock - */ - public BeaconEnabler(CaveBlock addon) - { - this.addon = addon; - this.settings = addon.getSettings(); - } - - - /** - * Method onBlockPlacement detects if beacon is placed and replace roof bedrock with black glass. - * - * @param event of type BlockPlaceEvent - */ - @EventHandler(priority = EventPriority.LOWEST) - public void onBlockPlacement(BlockPlaceEvent event) - { - World world = event.getPlayer().getWorld(); - - if (!Util.sameWorld(this.addon.getOverWorld(), world) || - !this.settings.isBeaconAllowed() || - !this.isRoofEnabled(world) || - !event.getBlock().getType().equals(Material.BEACON)) - { - // This should work only if it is cave block world or world has roof from bedrock. Otherwise, - // players can dig till top themself. - return; - } - - - Block roofBlock = world.getBlockAt(event.getBlock().getX(), this.settings.getWorldDepth() - 1, event.getBlock().getZ()); - - if (roofBlock.getType().equals(Material.BEDROCK)) - { - // Replace only bedrock. - roofBlock.setType(Material.BLACK_STAINED_GLASS); - } - } - - - /** - * Method onBlockBreak detects if beacon is destroyed and replace roof black glass with bedrock. - * - * @param event of type BlockBreakEvent - */ - @EventHandler(priority = EventPriority.LOWEST) - public void onBlockBreak(BlockBreakEvent event) - { - World world = event.getPlayer().getWorld(); - - if (!Util.sameWorld(this.addon.getOverWorld(), world) || - !this.isRoofEnabled(world) || - !this.settings.isBeaconAllowed() || - !event.getBlock().getType().equals(Material.BEACON)) - { - // This should work only if it is cave block world or world has roof from bedrock. - return; - } - - Block roofBlock = world.getBlockAt(event.getBlock().getX(), this.settings.getWorldDepth() - 1, event.getBlock().getZ()); - - if (roofBlock.getType().equals(Material.BLACK_STAINED_GLASS)) - { - // Replace only black glass. - roofBlock.setType(Material.BEDROCK); - } - } - - - /** - * Method onBlockDamage detects if user tries to destroy black glass on roof and disable it. - * - * @param event of type BlockDamageEvent - */ - @EventHandler(priority = EventPriority.LOWEST) - public void onBlockDamage(BlockDamageEvent event) - { - World world = event.getPlayer().getWorld(); - - if (!Util.sameWorld(this.addon.getOverWorld(), world) || - !this.isRoofEnabled(world) || - !this.settings.isBeaconAllowed() || - event.getBlock().getY() != this.settings.getWorldDepth() - 1) - { - // This should work only if it is cave block world or world has roof from bedrock. - return; - } - - // Cancel break event if it is black glass. - event.setCancelled(event.getBlock().getType().equals(Material.BLACK_STAINED_GLASS)); - } - - - /** - * Method onBlockExplode detects if explosion tries to destroy black glass on roof and disable it. - * - * @param event of type BlockExplodeEvent - */ - @EventHandler(priority = EventPriority.LOWEST) - public void onBlockExplode(BlockExplodeEvent event) - { - World world = event.getBlock().getWorld(); - - if (!Util.sameWorld(this.addon.getOverWorld(), world) || - !this.isRoofEnabled(world) || - !this.settings.isBeaconAllowed() || - event.getBlock().getY() < this.settings.getWorldDepth() - 9) - { - // This should work only if it is cave block world or world has roof from bedrock. - return; - } - - final int blockY = this.settings.getWorldDepth() - 1; - - // Remove all black stained glass from explosion block list if it is on the roof. - event.blockList().removeIf(block -> - block.getY() == blockY && block.getType().equals(Material.BLACK_STAINED_GLASS)); - } - - - /** - * Method onEntityExplode detects if explosion tries to destroy black glass on roof and disable it. - * - * @param event of type EntityExplodeEvent - */ - @EventHandler(priority = EventPriority.LOWEST) - public void onEntityExplode(EntityExplodeEvent event) - { - World world = event.getLocation().getWorld(); - - if (!Util.sameWorld(this.addon.getOverWorld(), world) || - !this.isRoofEnabled(world) || - !this.settings.isBeaconAllowed() || - event.getLocation().getY() < this.settings.getWorldDepth() - 9) - { - // This should work only if it is cave block world or world has roof from bedrock. - return; - } - - final int blockY = this.settings.getWorldDepth() - 1; - - // Remove all black stained glass from explosion block list if it is on the roof. - event.blockList().removeIf(block -> - block.getY() == blockY && block.getType().equals(Material.BLACK_STAINED_GLASS)); - } - - - /** - * This method checks if in given world bedrock roof is enabled. - * @param world World that must be checked. - * @return true - bedrock roof is enabled, otherwise false - */ - private boolean isRoofEnabled(World world) - { - return world.getEnvironment().equals(World.Environment.NORMAL) && this.settings.isNormalRoof() || - world.getEnvironment().equals(World.Environment.NETHER) && this.settings.isNetherRoof() || - world.getEnvironment().equals(World.Environment.THE_END) && this.settings.isEndRoof(); - } - - -// --------------------------------------------------------------------- -// Section: Variables -// --------------------------------------------------------------------- - - /** - * CaveBlock addon. - */ - private CaveBlock addon; - - /** - * Addon settings. - */ - private Settings settings; -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index dd5a831..a6fb763 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -2,6 +2,14 @@ # This config file is dynamic and saved when the server is shutdown. # If you edit it while the server is running use /cbadmin reload # otherwise your settings will be lost. +caveblock: + command: + # Cave Command. What command users will run to access their cave. + # To define alias, just separate commands with white space. + island: cave cb + # The Cave admin command. + # To define alias, just separate commands with white space. + admin: cbadmin cba world: # Friendly name for this world. Used in admin commands. Must be a single word friendly-name: CaveBlock @@ -133,11 +141,11 @@ world: # MATERIAL:DIAMOND_ORE:100:5 - means there is 100% chace of spawing diamonds # where max amount in pack are 5 per each subchunk! blocks: - - MATERIAL:QUARTZ_ORE:30:5 + - MATERIAL:NETHER_QUARTZ_ORE:30:5 - MATERIAL:SOUL_SAND:40:10 - MATERIAL:MAGMA_BLOCK:10:3 - MATERIAL:GLOWSTONE:20:8 - - MATERIAL:NETHER_BRICK:10:5 + - MATERIAL:NETHER_BRICKS:10:5 - MATERIAL:LAVA:10:1 - ENTITY:MAGMA_CUBE:0.5:1 - ENTITY:GHAST:0.1:1 @@ -166,7 +174,7 @@ world: blocks: - ENTITY:SHULKER:0.2:1 - MATERIAL:OBSIDIAN:1:1 - - MATERIAL:CHORUS_FRUIT:1:3 + - MATERIAL:CHORUS_PLANT:1:3 # Mob white list - these mobs will NOT be removed when logging in or doing /cave remove-mobs-whitelist: - WITHER @@ -311,10 +319,6 @@ island: inventory: false # Reset Ender Chest - if true, the player's Ender Chest will be cleared. ender-chest: false - require-confirmation: - reset: true - # Have player's respawn on their island if they die - respawn-on-island: false sethome: nether: allow: true @@ -364,9 +368,6 @@ protection: - HOT_FLOOR - CRAMMING - VOID -panel: - # Whether GUIs should be closed when the player clicks outside. - close-on-click-outside: true do-not-edit-these-settings: # These settings should not be edited reset-epoch: 0 diff --git a/src/main/resources/schems/island.schem b/src/main/resources/schems/island.schem index 8d861e2..aa706fc 100644 Binary files a/src/main/resources/schems/island.schem and b/src/main/resources/schems/island.schem differ