diff --git a/pom.xml b/pom.xml index c1e1ddda..56216899 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,10 @@ vault-repo http://nexus.hc.to/content/repositories/pub_releases + + minebench-repo + https://repo.minebench.de/ + @@ -245,6 +249,19 @@ + + se.eris + notnull-instrumenter-maven-plugin + 0.6.8 + + + + instrument + tests-instrument + + + + @@ -350,6 +367,13 @@ 1.3.8 + + org.jetbrains + annotations + 16.0.2 + jar + compile + junit @@ -383,6 +407,11 @@ 3.4 test + + de.themoep.idconverter + mappings + 1.2-SNAPSHOT + diff --git a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java index ce8770cd..4007352a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MVWorld.java @@ -24,6 +24,7 @@ import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.WorldType; @@ -33,6 +34,7 @@ import org.bukkit.entity.Player; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; import org.bukkit.util.Vector; +import org.jetbrains.annotations.Nullable; import org.json.simple.JSONObject; import java.util.Collections; @@ -943,7 +945,7 @@ public class MVWorld implements MultiverseWorld { * {@inheritDoc} */ @Override - public int getCurrency() { + public Material getCurrency() { return this.props.getCurrency(); } @@ -951,7 +953,7 @@ public class MVWorld implements MultiverseWorld { * {@inheritDoc} */ @Override - public void setCurrency(int currency) { + public void setCurrency(@Nullable Material currency) { this.props.setCurrency(currency); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java index 3bbbeb05..2c181408 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -84,12 +84,14 @@ import com.onarandombox.MultiverseCore.utils.UnsafeCallWrapper; import com.onarandombox.MultiverseCore.utils.VaultHandler; import com.onarandombox.MultiverseCore.utils.WorldManager; import com.pneumaticraft.commandhandler.CommandHandler; +import de.themoep.idconverter.IdMappings; import me.main__.util.SerializationConfig.NoSuchPropertyException; import me.main__.util.SerializationConfig.SerializationConfig; import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.Server; import org.bukkit.World.Environment; import org.bukkit.command.Command; @@ -637,8 +639,15 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { // migrate entryfee if (section.isConfigurationSection("entryfee")) { ConfigurationSection feeSection = section.getConfigurationSection("entryfee"); - if (feeSection.isInt("currency")) - world.setCurrency(feeSection.getInt("currency")); + if (feeSection.isInt("currency")) { + int oldCurrencyItemId = feeSection.getInt("currency", -1); + if (oldCurrencyItemId >= 0) { + String flatteningType = IdMappings.getById(Integer.toString(oldCurrencyItemId)) + .getFlatteningType(); + world.setCurrency(Material.matchMaterial(flatteningType)); + } + world.setCurrency(null); + } if (feeSection.isDouble("amount")) world.setPrice(feeSection.getDouble("amount")); @@ -884,17 +893,6 @@ public class MultiverseCore extends JavaPlugin implements MVPlugin, Core { } } - /** - * {@inheritDoc} - * - * @deprecated This is deprecated. - */ - @Override - @Deprecated - public com.onarandombox.MultiverseCore.utils.SafeTTeleporter getTeleporter() { - return new com.onarandombox.MultiverseCore.utils.SafeTTeleporter(this); - } - /** * {@inheritDoc} */ diff --git a/src/main/java/com/onarandombox/MultiverseCore/WorldProperties.java b/src/main/java/com/onarandombox/MultiverseCore/WorldProperties.java index 89ad4e81..1e882c71 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/WorldProperties.java +++ b/src/main/java/com/onarandombox/MultiverseCore/WorldProperties.java @@ -8,6 +8,7 @@ import com.onarandombox.MultiverseCore.configuration.WorldPropertyValidator; import com.onarandombox.MultiverseCore.enums.AllowedPortalType; import com.onarandombox.MultiverseCore.enums.EnglishChatColor; import com.onarandombox.MultiverseCore.enums.EnglishChatStyle; +import de.themoep.idconverter.IdMappings; import me.main__.util.SerializationConfig.IllegalPropertyValueException; import me.main__.util.SerializationConfig.Property; import me.main__.util.SerializationConfig.SerializationConfig; @@ -18,8 +19,10 @@ import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World.Environment; import org.bukkit.configuration.serialization.SerializableAs; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -261,7 +264,7 @@ public class WorldProperties extends SerializationConfig { @Property(description = "Sorry, 'animals' must either be: true or false.") private volatile SpawnSettings spawning; @Property - private volatile EntryFee entryfee; + volatile EntryFee entryfee; @Property(description = "Sorry, 'hunger' must either be: true or false.") private volatile boolean hunger; @Property(description = "Sorry, 'autoheal' must either be: true or false.") @@ -496,11 +499,11 @@ public class WorldProperties extends SerializationConfig { return this.setPropertyValueUnchecked("respawnWorld", respawnToWorld); } - public int getCurrency() { + public Material getCurrency() { return this.entryfee.getCurrency(); } - public void setCurrency(int currency) { + public void setCurrency(@Nullable Material currency) { this.setPropertyValueUnchecked("entryfee.currency", currency); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/Core.java b/src/main/java/com/onarandombox/MultiverseCore/api/Core.java index 907d033b..ff8513d4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/Core.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/Core.java @@ -70,17 +70,6 @@ public interface Core { */ MVPlayerSession getPlayerSession(Player player); - /** - * Gets the instantiated Safe-T-Teleporter for performing - * safe teleports. - * - * @return A non-null {@link SafeTTeleporter}. - * - * @deprecated Use {@link #getSafeTTeleporter()} instead. - */ - @Deprecated - com.onarandombox.MultiverseCore.utils.SafeTTeleporter getTeleporter(); - /** * Multiverse uses an advanced permissions setup, this object * simplifies getting/setting permissions. diff --git a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java index 5ddffafb..3561f49e 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java +++ b/src/main/java/com/onarandombox/MultiverseCore/api/MultiverseWorld.java @@ -13,10 +13,12 @@ import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.WorldType; import org.bukkit.command.CommandSender; import org.bukkit.permissions.Permission; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -511,19 +513,21 @@ public interface MultiverseWorld { void setPrice(double price); /** - * Gets the Type of currency that will be used when users enter this world. + * Gets the type of currency that will be used when users enter this world. A value of null indicates a non-item + * based currency is used. * - * @return The Type of currency that will be used when users enter this world. + * @return The type of currency that will be used when users enter this world. */ - int getCurrency(); + @Nullable + Material getCurrency(); /** * Sets the type of item that will be required given the price is not 0. - * Use -1 to use an AllPay economy, or any valid itemid + * Use a value of null to specify a non-item based currency. * * @param item The Type of currency that will be used when users enter this world. */ - void setCurrency(int item); + void setCurrency(@Nullable Material item); /** * Gets the world players will respawn in if they die in this one. diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java index 944d8029..485cc370 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/CoordCommand.java @@ -62,7 +62,7 @@ public class CoordCommand extends MultiverseCommand { df.setMaximumFractionDigits(2); p.sendMessage(ChatColor.AQUA + "Coordinates: " + ChatColor.WHITE + plugin.getLocationManipulation().strCoords(p.getLocation())); p.sendMessage(ChatColor.AQUA + "Direction: " + ChatColor.WHITE + plugin.getLocationManipulation().getDirection(p.getLocation())); - p.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + Material.getMaterial(world.getBlockTypeIdAt(p.getLocation()))); + p.sendMessage(ChatColor.AQUA + "Block: " + ChatColor.WHITE + world.getBlockAt(p.getLocation()).getType()); } else { sender.sendMessage("This command needs to be used from a Player."); } diff --git a/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java b/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java index e754e682..42a1d4c3 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java +++ b/src/main/java/com/onarandombox/MultiverseCore/configuration/EntryFee.java @@ -2,10 +2,15 @@ package com.onarandombox.MultiverseCore.configuration; import java.util.Map; +import de.themoep.idconverter.IdMappings; +import me.main__.util.SerializationConfig.IllegalPropertyValueException; import me.main__.util.SerializationConfig.Property; import me.main__.util.SerializationConfig.SerializationConfig; +import me.main__.util.SerializationConfig.Serializor; +import org.bukkit.Material; import org.bukkit.configuration.serialization.SerializableAs; +import org.jetbrains.annotations.Nullable; /** * Entryfee-settings. @@ -14,8 +19,9 @@ import org.bukkit.configuration.serialization.SerializableAs; public class EntryFee extends SerializationConfig { @Property private double amount; - @Property - private int currency; + @Property(serializor = EntryFeeCurrencySerializor.class) + @Nullable + private Material currency; public EntryFee() { super(); @@ -31,7 +37,7 @@ public class EntryFee extends SerializationConfig { @Override protected void setDefaults() { amount = 0D; - currency = -1; + currency = null; } /** @@ -44,7 +50,8 @@ public class EntryFee extends SerializationConfig { /** * @return the currency */ - public int getCurrency() { + @Nullable + public Material getCurrency() { return currency; } @@ -60,7 +67,23 @@ public class EntryFee extends SerializationConfig { * Sets the currency. * @param currency The new value. */ - public void setCurrency(int currency) { + public void setCurrency(@Nullable Material currency) { this.currency = currency; } + + public static final class EntryFeeCurrencySerializor implements Serializor { + @Override + public String serialize(Material material) { + return material.toString(); + } + + @Override + public Material deserialize(Object o, Class aClass) throws IllegalPropertyValueException { + IdMappings.Mapping mapping = IdMappings.getById(o.toString()); + if (mapping != null) { + return Material.matchMaterial(mapping.getFlatteningType()); + } + return Material.matchMaterial(o.toString()); + } + } } diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/BlockSafety.java b/src/main/java/com/onarandombox/MultiverseCore/utils/BlockSafety.java deleted file mode 100644 index 562e70d0..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/BlockSafety.java +++ /dev/null @@ -1,281 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.utils; - -import com.dumptruckman.minecraft.util.Logging; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Minecart; -import org.bukkit.entity.Vehicle; - -/** - * Used to determine block/location-related facts. - * - * @deprecated Use instead: {@link com.onarandombox.MultiverseCore.api.BlockSafety} and {@link SimpleBlockSafety}. - */ -@Deprecated -public class BlockSafety { - - /** - * This function checks whether the block at the given coordinates are above air or not. - * @param l The {@link Location} of the block. - * @return True if the block at that {@link Location} is above air. - */ - public boolean isBlockAboveAir(Location l) { - Location downOne = l.clone(); - downOne.setY(downOne.getY() - 1); - return (downOne.getBlock().getType() == Material.AIR); - } - - // TODO maybe remove this? - private boolean blockIsNotSafe(World world, double x, double y, double z) { - return !playerCanSpawnHereSafely(world, x, y, z); - } - - /** - * Checks if a player can spawn safely at the given coordinates. - * @param world The {@link World}. - * @param x The x-coordinate. - * @param y The y-coordinate. - * @param z The z-coordinate. - * @return True if a player can spawn safely at the given coordinates. - */ - public boolean playerCanSpawnHereSafely(World world, double x, double y, double z) { - Location l = new Location(world, x, y, z); - return playerCanSpawnHereSafely(l); - } - - /** - * This function checks whether the block at the coordinates given is safe or not by checking for Lava/Fire/Air - * etc. This also ensures there is enough space for a player to spawn! - * - * @param l The {@link Location} - * @return Whether the player can spawn safely at the given {@link Location} - */ - public boolean playerCanSpawnHereSafely(Location l) { - if (l == null) { - // Can't safely spawn at a null location! - return false; - } - - World world = l.getWorld(); - Location actual = l.clone(); - Location upOne = l.clone(); - Location downOne = l.clone(); - upOne.setY(upOne.getY() + 1); - downOne.setY(downOne.getY() - 1); - - if (this.isSolidBlock(world.getBlockAt(actual).getType()) - || this.isSolidBlock(upOne.getBlock().getType())) { - Logging.finest("Error Here (Actual)? (%s)[%s]", actual.getBlock().getType(), - this.isSolidBlock(actual.getBlock().getType())); - Logging.finest("Error Here (upOne)? (%s)[%s]", upOne.getBlock().getType(), - this.isSolidBlock(upOne.getBlock().getType())); - return false; - } - - if (downOne.getBlock().getType() == Material.LAVA || downOne.getBlock().getType() == Material.STATIONARY_LAVA) { - Logging.finest("Error Here (downOne)? (%s)[%s]", downOne.getBlock().getType(), - this.isSolidBlock(downOne.getBlock().getType())); - return false; - } - - if (downOne.getBlock().getType() == Material.FIRE) { - Logging.finest("There's fire below! (%s)[%s]", actual.getBlock().getType(), - this.isSolidBlock(actual.getBlock().getType())); - return false; - } - - if (isBlockAboveAir(actual)) { - Logging.finest("Is block above air [%s]", isBlockAboveAir(actual)); - Logging.finest("Has 2 blocks of water below [%s]", this.hasTwoBlocksofWaterBelow(actual)); - return this.hasTwoBlocksofWaterBelow(actual); - } - return true; - } - - /** - * Gets the location of the top block at the specified {@link Location}. - * @param l Any {@link Location}. - * @return The {@link Location} of the top-block. - */ - public Location getTopBlock(Location l) { - Location check = l.clone(); - check.setY(127); // SUPPRESS CHECKSTYLE: MagicNumberCheck - while (check.getY() > 0) { - if (this.playerCanSpawnHereSafely(check)) { - return check; - } - check.setY(check.getY() - 1); - } - return null; - } - - /** - * Gets the location of the top block at the specified {@link Location}. - * @param l Any {@link Location}. - * @return The {@link Location} of the top-block. - */ - public Location getBottomBlock(Location l) { - Location check = l.clone(); - check.setY(0); - while (check.getY() < 127) { // SUPPRESS CHECKSTYLE: MagicNumberCheck - if (this.playerCanSpawnHereSafely(check)) { - return check; - } - check.setY(check.getY() + 1); - } - return null; - } - - /* - * If someone has a better way of this... Please either tell us, or submit a pull request! - */ - private boolean isSolidBlock(Material type) { - switch (type) { - case AIR: - return false; - case SNOW: - return false; - case TRAP_DOOR: - return false; - case TORCH: - return false; - case YELLOW_FLOWER: - return false; - case RED_ROSE: - return false; - case RED_MUSHROOM: - return false; - case BROWN_MUSHROOM: - return false; - case REDSTONE: - return false; - case REDSTONE_WIRE: - return false; - case RAILS: - return false; - case POWERED_RAIL: - return false; - case REDSTONE_TORCH_ON: - return false; - case REDSTONE_TORCH_OFF: - return false; - case DEAD_BUSH: - return false; - case SAPLING: - return false; - case STONE_BUTTON: - return false; - case LEVER: - return false; - case LONG_GRASS: - return false; - case PORTAL: - return false; - case STONE_PLATE: - return false; - case WOOD_PLATE: - return false; - case SEEDS: - return false; - case SUGAR_CANE_BLOCK: - return false; - case WALL_SIGN: - return false; - case SIGN_POST: - return false; - case WOODEN_DOOR: - return false; - case STATIONARY_WATER: - return false; - case WATER: - return false; - default: - return true; - } - } - - /** - * Checks if an entity would be on track at the specified {@link Location}. - * @param l The {@link Location}. - * @return True if an entity would be on tracks at the specified {@link Location}. - */ - public boolean isEntitiyOnTrack(Location l) { - Material currentBlock = l.getBlock().getType(); - return (currentBlock == Material.POWERED_RAIL || currentBlock == Material.DETECTOR_RAIL || currentBlock == Material.RAILS); - } - - // TODO maybe remove this? - private void showDangers(Location l) { - Location actual = new Location(l.getWorld(), l.getX(), l.getY(), l.getZ()); - Location upOne = new Location(l.getWorld(), l.getX(), l.getY(), l.getZ()); - Location downOne = new Location(l.getWorld(), l.getX(), l.getY(), l.getZ()); - upOne.setY(upOne.getY() + 1); - downOne.setY(downOne.getY() - 1); - - System.out.print("Location Up: " + upOne.getBlock().getType()); - System.out.print(" " + upOne); - System.out.print("Location: " + actual.getBlock().getType()); - System.out.print(" " + actual); - System.out.print("Location Down: " + downOne.getBlock().getType()); - System.out.print(" " + downOne); - } - - /** - * Checks recursively below a {@link Location} for 2 blocks of water. - * - * @param l The {@link Location} - * @return Whether there are 2 blocks of water - */ - private boolean hasTwoBlocksofWaterBelow(Location l) { - if (l.getBlockY() < 0) { - return false; - } - Location oneBelow = l.clone(); - oneBelow.subtract(0, 1, 0); - if (oneBelow.getBlock().getType() == Material.WATER || oneBelow.getBlock().getType() == Material.STATIONARY_WATER) { - Location twoBelow = oneBelow.clone(); - twoBelow.subtract(0, 1, 0); - return (oneBelow.getBlock().getType() == Material.WATER || oneBelow.getBlock().getType() == Material.STATIONARY_WATER); - } - if (oneBelow.getBlock().getType() != Material.AIR) { - return false; - } - return hasTwoBlocksofWaterBelow(oneBelow); - } - - /** - * Checks if the specified {@link Minecart} can spawn safely. - * @param cart The {@link Minecart}. - * @return True if the minecart can spawn safely. - */ - public boolean canSpawnCartSafely(Minecart cart) { - if (this.isBlockAboveAir(cart.getLocation())) { - return true; - } - if (this.isEntitiyOnTrack(LocationManipulation.getNextBlock(cart))) { - return true; - } - return false; - } - - /** - * Checks if the specified {@link Vehicle} can spawn safely. - * @param vehicle The {@link Vehicle}. - * @return True if the vehicle can spawn safely. - */ - public boolean canSpawnVehicleSafely(Vehicle vehicle) { - if (this.isBlockAboveAir(vehicle.getLocation())) { - return true; - } - return false; - } - -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/MVEconomist.java b/src/main/java/com/onarandombox/MultiverseCore/utils/MVEconomist.java index 702428e1..04353649 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/MVEconomist.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/MVEconomist.java @@ -1,284 +1,285 @@ -package com.onarandombox.MultiverseCore.utils; - -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; - -import java.util.HashMap; - -/** - * Multiverse's Friendly Economist. This is used to deal with external economies and also item costs for stuff in MV. - */ -public class MVEconomist { - - private final VaultHandler vaultHandler; - - public MVEconomist(Plugin plugin) { - vaultHandler = new VaultHandler(plugin); - } - - private boolean isUsingVault(int currency) { - return !isItemCurrency(currency) && getVaultHandler().hasEconomy(); - } - - /** - * Checks if an economy plugin is in use. - * - * @return true if an economy plugin is detected by Vault. - */ - public boolean isUsingEconomyPlugin() { - return getVaultHandler().hasEconomy(); - } - - /** - * Formats the amount to a human readable currency string. - * - * @param amount the amount of currency. - * @param currency the type of currency. A value greater than -1 indicates the material type used for currency. - * @return the human readable currency string. - */ - public String formatPrice(double amount, int currency) { - if (isUsingVault(currency)) { - return getVaultHandler().getEconomy().format(amount); - } else { - return ItemEconomy.getFormattedPrice(amount, currency); - } - } - - /** - * Returns the name of the economy in use. - * - * @return the name of the economy in use. - */ - public String getEconomyName() { - if (getVaultHandler().hasEconomy()) { - return getVaultHandler().getEconomy().getName(); - } else { - return ItemEconomy.getName(); - } - } - - /** - * Determines if a player has enough of a given currency. - * @param player the player to check for currency. - * @param amount the amount of currency. - * @param currency the type of currency. A value greater than -1 indicates the material type used for currency. - * @return true if the player has enough of the given currency or the amount is 0 or less. - */ - public boolean isPlayerWealthyEnough(Player player, double amount, int currency) { - if (amount <= 0D) { - return true; - } else if (isUsingVault(currency)) { - return getVaultHandler().getEconomy().has(player, amount); - } else { - return ItemEconomy.hasEnough(player, amount, currency); - } - } - - /** - * Formats a message for a player indicating they don't have enough currency. - * - * @param currency the type of currency. A value greater than -1 indicates the material type used for currency. - * @param message The more specific message to append to the generic message of not having enough. - * @return the formatted insufficient funds message. - */ - public String getNSFMessage(int currency, String message) { - return "Sorry, you don't have enough " + (isItemCurrency(currency) ? "items" : "funds") + ". " + message; - } - - /** - * Deposits a given amount of currency either into the player's economy account or inventory if the currency - * represents an item. - * - * @param player the player to give currency to. - * @param amount the amount to give. - * @param currency the type of currency. A value greater than -1 indicates the material type used for currency. - */ - public void deposit(Player player, double amount, int currency) { - if (isUsingVault(currency)) { - getVaultHandler().getEconomy().depositPlayer(player, amount); - } else { - ItemEconomy.deposit(player, amount, currency); - } - } - - /** - * Withdraws a given amount of currency either from the player's economy account or inventory if the currency - * represents an item. - * - * @param player the player to take currency from. - * @param amount the amount to take. - * @param currency the type of currency. A value greater than -1 indicates the material type used for currency. - */ - public void withdraw(Player player, double amount, int currency) { - if (isUsingVault(currency)) { - getVaultHandler().getEconomy().withdrawPlayer(player, amount); - } else { - ItemEconomy.withdraw(player, amount, currency); - } - } - - /** - * Returns the economy balance of the given player. - * - * @param player the player to get the balance for. - * @return the economy balance of the given player. - * @throws IllegalStateException thrown if this is used when no economy plugin is available. - */ - public double getBalance(Player player) throws IllegalStateException { - return getBalance(player, null); - } - - /** - * Returns the economy balance of the given player in the given world. If the economy plugin does not have world - * specific balances then the global balance will be returned. - * - * @param player the player to get the balance for. - * @param world the world to get the balance for. - * @return the economy balance of the given player in the given world. - * @throws IllegalStateException thrown if this is used when no economy plugin is available. - */ - public double getBalance(Player player, World world) throws IllegalStateException { - if (!isUsingEconomyPlugin()) { - throw new IllegalStateException("getBalance is only available when using an economy plugin with Vault"); - } - if (world != null) { - return getVaultHandler().getEconomy().getBalance(player, world.getName()); - } else { - return getVaultHandler().getEconomy().getBalance(player); - } - } - - /** - * Sets the economy balance for the given player. - * - * @param player the player to set the balance for. - * @param amount the amount to set the player's balance to. - * @throws IllegalStateException thrown if this is used when no economy plugin is available. - */ - public void setBalance(Player player, double amount) throws IllegalStateException { - setBalance(player, null, amount); - } - - /** - * Sets the economy balance for the given player in the given world. If the economy plugin does not have world - * specific balances then the global balance will be set. - * - * @param player the player to set the balance for. - * @param world the world to get the balance for. - * @param amount the amount to set the player's balance to. - * @throws IllegalStateException thrown if this is used when no economy plugin is available. - */ - public void setBalance(Player player, World world, double amount) throws IllegalStateException { - if (!isUsingEconomyPlugin()) { - throw new IllegalStateException("getBalance is only available when using an economy plugin with Vault"); - } - if (world != null) { - getVaultHandler().getEconomy().withdrawPlayer(player, world.getName(), getBalance(player, world)); - getVaultHandler().getEconomy().depositPlayer(player, world.getName(), amount); - } else { - getVaultHandler().getEconomy().withdrawPlayer(player, getBalance(player)); - getVaultHandler().getEconomy().depositPlayer(player, amount); - } - } - - /** - * This method is public for backwards compatibility. - * - * @return the old VaultHandler. - * @deprecated just use the other methods in this class for economy stuff. - */ - // TODO make private - @Deprecated - public VaultHandler getVaultHandler() { - return vaultHandler; - } - - /** - * Determines if the currency type given represents an item currency. - * - * @param currency the type of currency. A value greater than -1 indicates the material type used for currency. - * @return true if currency is greater than -1. - */ - public static boolean isItemCurrency(int currency) { - return currency >= 0; - } - - private static class ItemEconomy { - - private static final String ECONOMY_NAME = "Simple Item Economy"; - - private static String getFormattedPrice(double amount, int currency) { - if (isItemCurrency(currency)) { - Material m = Material.getMaterial(currency); - return m != null ? amount + " " + m.toString() : "NO ITEM FOUND"; - } else { - return ""; - } - } - - private static String getName() { - return ECONOMY_NAME; - } - - private static boolean hasEnough(Player player, double amount, int currency) { - if (isItemCurrency(currency)) { - return player.getInventory().contains(currency, (int) amount); - } else { - return true; - } - } - - private static void deposit(Player player, double amount, int currency) { - if (isItemCurrency(currency)) { - giveItem(player, amount, currency); - } - } - - private static void withdraw(Player player, double amount, int currency) { - if (isItemCurrency(currency)) { - takeItem(player, amount, currency); - } - } - - private static void giveItem(Player player, double amount, int type) { - ItemStack item = new ItemStack(type, (int) amount); - player.getInventory().addItem(item); - showReceipt(player, (amount * -1), type); - } - - private static void takeItem(Player player, double amount, int type) { - int removed = 0; - HashMap items = (HashMap) player.getInventory().all(type); - for (int i : items.keySet()) { - if (removed >= amount) { - break; - } - int diff = (int) (amount - removed); - int amt = player.getInventory().getItem(i).getAmount(); - if (amt - diff > 0) { - player.getInventory().getItem(i).setAmount(amt - diff); - break; - } else { - removed += amt; - player.getInventory().clear(i); - } - } - showReceipt(player, amount, type); - } - - private static void showReceipt(Player player, double price, int item) { - if (price > 0D) { - player.sendMessage(String.format("%s%s%s %s", - ChatColor.WHITE, "You have been charged", ChatColor.GREEN, getFormattedPrice(price, item))); - } else if (price < 0D) { - player.sendMessage(String.format("%s%s%s %s", - ChatColor.DARK_GREEN, getFormattedPrice((price * -1), item), - ChatColor.WHITE, "has been added to your inventory.")); - } - } - } -} +package com.onarandombox.MultiverseCore.utils; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; + +/** + * Multiverse's Friendly Economist. This is used to deal with external economies and also item costs for stuff in MV. + */ +public class MVEconomist { + + private final VaultHandler vaultHandler; + + public MVEconomist(Plugin plugin) { + vaultHandler = new VaultHandler(plugin); + } + + private boolean isUsingVault(Material currency) { + return !isItemCurrency(currency) && getVaultHandler().hasEconomy(); + } + + /** + * Checks if an economy plugin is in use. + * + * @return true if an economy plugin is detected by Vault. + */ + public boolean isUsingEconomyPlugin() { + return getVaultHandler().hasEconomy(); + } + + /** + * Formats the amount to a human readable currency string. + * + * @param amount the amount of currency. + * @param currency the type of currency. Null indicates a non-item currency is used. + * @return the human readable currency string. + */ + public String formatPrice(double amount, @Nullable Material currency) { + if (isUsingVault(currency)) { + return getVaultHandler().getEconomy().format(amount); + } else { + return ItemEconomy.getFormattedPrice(amount, currency); + } + } + + /** + * Returns the name of the economy in use. + * + * @return the name of the economy in use. + */ + public String getEconomyName() { + if (getVaultHandler().hasEconomy()) { + return getVaultHandler().getEconomy().getName(); + } else { + return ItemEconomy.getName(); + } + } + + /** + * Determines if a player has enough of a given currency. + * + * @param player the player to check for currency. + * @param amount the amount of currency. + * @param currency the type of currency. Null indicates non-item currency is used. + * @return true if the player has enough of the given currency or the amount is 0 or less. + */ + public boolean isPlayerWealthyEnough(Player player, double amount, Material currency) { + if (amount <= 0D) { + return true; + } else if (isUsingVault(currency)) { + return getVaultHandler().getEconomy().has(player, amount); + } else { + return ItemEconomy.hasEnough(player, amount, currency); + } + } + + /** + * Formats a message for a player indicating they don't have enough currency. + * + * @param currency the type of currency. Null indicates a non-item currency is used. + * @param message The more specific message to append to the generic message of not having enough. + * @return the formatted insufficient funds message. + */ + public String getNSFMessage(Material currency, String message) { + return "Sorry, you don't have enough " + (isItemCurrency(currency) ? "items" : "funds") + ". " + message; + } + + /** + * Deposits a given amount of currency either into the player's economy account or inventory if the currency + * is not null. + * + * @param player the player to give currency to. + * @param amount the amount to give. + * @param currency the type of currency. + */ + public void deposit(Player player, double amount, @Nullable Material currency) { + if (isUsingVault(currency)) { + getVaultHandler().getEconomy().depositPlayer(player, amount); + } else { + ItemEconomy.deposit(player, amount, currency); + } + } + + /** + * Withdraws a given amount of currency either from the player's economy account or inventory if the currency + * is not null. + * + * @param player the player to take currency from. + * @param amount the amount to take. + * @param currency the type of currency. + */ + public void withdraw(Player player, double amount, @Nullable Material currency) { + if (isUsingVault(currency)) { + getVaultHandler().getEconomy().withdrawPlayer(player, amount); + } else { + ItemEconomy.withdraw(player, amount, currency); + } + } + + /** + * Returns the economy balance of the given player. + * + * @param player the player to get the balance for. + * @return the economy balance of the given player. + * @throws IllegalStateException thrown if this is used when no economy plugin is available. + */ + public double getBalance(Player player) throws IllegalStateException { + return getBalance(player, null); + } + + /** + * Returns the economy balance of the given player in the given world. If the economy plugin does not have world + * specific balances then the global balance will be returned. + * + * @param player the player to get the balance for. + * @param world the world to get the balance for. + * @return the economy balance of the given player in the given world. + * @throws IllegalStateException thrown if this is used when no economy plugin is available. + */ + public double getBalance(Player player, World world) throws IllegalStateException { + if (!isUsingEconomyPlugin()) { + throw new IllegalStateException("getBalance is only available when using an economy plugin with Vault"); + } + if (world != null) { + return getVaultHandler().getEconomy().getBalance(player, world.getName()); + } else { + return getVaultHandler().getEconomy().getBalance(player); + } + } + + /** + * Sets the economy balance for the given player. + * + * @param player the player to set the balance for. + * @param amount the amount to set the player's balance to. + * @throws IllegalStateException thrown if this is used when no economy plugin is available. + */ + public void setBalance(Player player, double amount) throws IllegalStateException { + setBalance(player, null, amount); + } + + /** + * Sets the economy balance for the given player in the given world. If the economy plugin does not have world + * specific balances then the global balance will be set. + * + * @param player the player to set the balance for. + * @param world the world to get the balance for. + * @param amount the amount to set the player's balance to. + * @throws IllegalStateException thrown if this is used when no economy plugin is available. + */ + public void setBalance(Player player, World world, double amount) throws IllegalStateException { + if (!isUsingEconomyPlugin()) { + throw new IllegalStateException("getBalance is only available when using an economy plugin with Vault"); + } + if (world != null) { + getVaultHandler().getEconomy().withdrawPlayer(player, world.getName(), getBalance(player, world)); + getVaultHandler().getEconomy().depositPlayer(player, world.getName(), amount); + } else { + getVaultHandler().getEconomy().withdrawPlayer(player, getBalance(player)); + getVaultHandler().getEconomy().depositPlayer(player, amount); + } + } + + /** + * This method is public for backwards compatibility. + * + * @return the old VaultHandler. + * @deprecated just use the other methods in this class for economy stuff. + */ + // TODO make private + @Deprecated + public VaultHandler getVaultHandler() { + return vaultHandler; + } + + /** + * Determines if the currency type string given represents an item currency. + * + * @param currency the type of currency. + * @return true if currency string matches a valid material. + */ + public static boolean isItemCurrency(Material currency) { + return currency != null; + } + + private static class ItemEconomy { + + private static final String ECONOMY_NAME = "Simple Item Economy"; + + private static String getFormattedPrice(double amount, Material currency) { + if (isItemCurrency(currency)) { + return amount + " " + currency.toString(); + } else { + return ""; + } + } + + private static String getName() { + return ECONOMY_NAME; + } + + private static boolean hasEnough(Player player, double amount, Material currency) { + if (currency != null) { + return player.getInventory().contains(currency, (int) amount); + } else { + return true; + } + } + + private static void deposit(Player player, double amount, Material currency) { + if (isItemCurrency(currency)) { + giveItem(player, amount, currency); + } + } + + private static void withdraw(Player player, double amount, Material currency) { + if (isItemCurrency(currency)) { + takeItem(player, amount, currency); + } + } + + private static void giveItem(Player player, double amount, Material type) { + ItemStack item = new ItemStack(type, (int) amount); + player.getInventory().addItem(item); + showReceipt(player, (amount * -1), type); + } + + private static void takeItem(Player player, double amount, Material type) { + int removed = 0; + HashMap items = (HashMap) player.getInventory().all(type); + for (int i : items.keySet()) { + if (removed >= amount) { + break; + } + int diff = (int) (amount - removed); + int amt = player.getInventory().getItem(i).getAmount(); + if (amt - diff > 0) { + player.getInventory().getItem(i).setAmount(amt - diff); + break; + } else { + removed += amt; + player.getInventory().clear(i); + } + } + showReceipt(player, amount, type); + } + + private static void showReceipt(Player player, double price, Material item) { + if (price > 0D) { + player.sendMessage(String.format("%s%s%s %s", + ChatColor.WHITE, "You have been charged", ChatColor.GREEN, getFormattedPrice(price, item))); + } else if (price < 0D) { + player.sendMessage(String.format("%s%s%s %s", + ChatColor.DARK_GREEN, getFormattedPrice((price * -1), item), + ChatColor.WHITE, "has been added to your inventory.")); + } + } + } +} diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/PermissionTools.java b/src/main/java/com/onarandombox/MultiverseCore/utils/PermissionTools.java index 119d02cf..a6e98820 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/PermissionTools.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/PermissionTools.java @@ -9,6 +9,7 @@ package com.onarandombox.MultiverseCore.utils; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.Material; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Player; @@ -145,7 +146,7 @@ public class PermissionTools { } final MVEconomist economist = plugin.getEconomist(); - final int currency = toWorld.getCurrency(); + final Material currency = toWorld.getCurrency(); final String formattedAmount = economist.formatPrice(price, currency); if (economist.isPlayerWealthyEnough(teleporterPlayer, price, currency)) { @@ -171,7 +172,7 @@ public class PermissionTools { return true; } - private void sendTeleportPaymentMessage (MVEconomist economist, Player teleporterPlayer, Player teleportee, String toWorld, double price, int currency) { + private void sendTeleportPaymentMessage (MVEconomist economist, Player teleporterPlayer, Player teleportee, String toWorld, double price, Material currency) { price = Math.abs(price); if (teleporterPlayer.equals(teleportee)) { teleporterPlayer.sendMessage("You were " + (price > 0D ? "charged " : "given ") + economist.formatPrice(price, currency) + " for teleporting to " + toWorld); diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/SafeTTeleporter.java b/src/main/java/com/onarandombox/MultiverseCore/utils/SafeTTeleporter.java deleted file mode 100644 index 0984c437..00000000 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/SafeTTeleporter.java +++ /dev/null @@ -1,358 +0,0 @@ -/****************************************************************************** - * Multiverse 2 Copyright (c) the Multiverse Team 2011. * - * Multiverse 2 is licensed under the BSD License. * - * For more information please check the README.md file included * - * with this project. * - ******************************************************************************/ - -package com.onarandombox.MultiverseCore.utils; - -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.BlockSafety; -import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.destination.InvalidDestination; -import com.onarandombox.MultiverseCore.enums.TeleportResult; - -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Minecart; -import org.bukkit.entity.Player; -import org.bukkit.entity.Vehicle; -import org.bukkit.util.Vector; - -import java.util.logging.Level; - -/** - * The {@link SafeTTeleporter}. - * - * @deprecated Use instead: {@link com.onarandombox.MultiverseCore.api.SafeTTeleporter} and {@link SimpleSafeTTeleporter}. - */ -@Deprecated -public class SafeTTeleporter { - - private MultiverseCore plugin; - private BlockSafety bs; - - public SafeTTeleporter(MultiverseCore plugin) { - this.plugin = plugin; - this.bs = plugin.getBlockSafety(); - } - - private static final int DEFAULT_TOLERANCE = 6; - private static final int DEFAULT_RADIUS = 9; - - /** - * Gets the next safe location around the given location. - * @param l A {@link Location}. - * @return A safe {@link Location}. - */ - public Location getSafeLocation(Location l) { - return this.getSafeLocation(l, DEFAULT_TOLERANCE, DEFAULT_RADIUS); - } - - /** - * Gets the next safe location around the given location. - * @param l A {@link Location}. - * @param tolerance The tolerance. - * @param radius The radius. - * @return A safe {@link Location}. - */ - public Location getSafeLocation(Location l, int tolerance, int radius) { - // Check around the player first in a configurable radius: - Location safe = checkAboveAndBelowLocation(l, tolerance, radius); - if (safe != null) { - safe.setX(safe.getBlockX() + .5); // SUPPRESS CHECKSTYLE: MagicNumberCheck - safe.setZ(safe.getBlockZ() + .5); // SUPPRESS CHECKSTYLE: MagicNumberCheck - this.plugin.log(Level.FINE, "Hey! I found one: " + plugin.getLocationManipulation().strCoordsRaw(safe)); - } else { - this.plugin.log(Level.FINE, "Uh oh! No safe place found!"); - } - return safe; - } - - private Location checkAboveAndBelowLocation(Location l, int tolerance, int radius) { - // Tolerance must be an even number: - if (tolerance % 2 != 0) { - tolerance += 1; - } - // We want half of it, so we can go up and down - tolerance /= 2; - this.plugin.log(Level.FINER, "Given Location of: " + plugin.getLocationManipulation().strCoordsRaw(l)); - this.plugin.log(Level.FINER, "Checking +-" + tolerance + " with a radius of " + radius); - - // For now this will just do a straight up block. - Location locToCheck = l.clone(); - // Check the main level - Location safe = this.checkAroundLocation(locToCheck, radius); - if (safe != null) { - return safe; - } - // We've already checked zero right above this. - int currentLevel = 1; - while (currentLevel <= tolerance) { - // Check above - locToCheck = l.clone(); - locToCheck.add(0, currentLevel, 0); - safe = this.checkAroundLocation(locToCheck, radius); - if (safe != null) { - return safe; - } - - // Check below - locToCheck = l.clone(); - locToCheck.subtract(0, currentLevel, 0); - safe = this.checkAroundLocation(locToCheck, radius); - if (safe != null) { - return safe; - } - currentLevel++; - } - - return null; - } - - /* - * For my crappy algorithm, radius MUST be odd. - */ - private Location checkAroundLocation(Location l, int diameter) { - if (diameter % 2 == 0) { - diameter += 1; - } - Location checkLoc = l.clone(); - - // Start at 3, the min diameter around a block - int loopcounter = 3; - while (loopcounter <= diameter) { - boolean foundSafeArea = checkAroundSpecificDiameter(checkLoc, loopcounter); - // If a safe area was found: - if (foundSafeArea) { - // Return the checkLoc, it is the safe location. - return checkLoc; - } - // Otherwise, let's reset our location - checkLoc = l.clone(); - // And increment the radius - loopcounter += 2; - } - return null; - } - - private boolean checkAroundSpecificDiameter(Location checkLoc, int circle) { - // Adjust the circle to get how many blocks to step out. - // A radius of 3 makes the block step 1 - // A radius of 5 makes the block step 2 - // A radius of 7 makes the block step 3 - // ... - int adjustedCircle = ((circle - 1) / 2); - checkLoc.add(adjustedCircle, 0, 0); - if (this.bs.playerCanSpawnHereSafely(checkLoc)) { - return true; - } - // Now we go to the right that adjustedCircle many - for (int i = 0; i < adjustedCircle; i++) { - checkLoc.add(0, 0, 1); - if (this.bs.playerCanSpawnHereSafely(checkLoc)) { - return true; - } - } - - // Then down adjustedCircle *2 - for (int i = 0; i < adjustedCircle * 2; i++) { - checkLoc.add(-1, 0, 0); - if (this.bs.playerCanSpawnHereSafely(checkLoc)) { - return true; - } - } - - // Then left adjustedCircle *2 - for (int i = 0; i < adjustedCircle * 2; i++) { - checkLoc.add(0, 0, -1); - if (this.bs.playerCanSpawnHereSafely(checkLoc)) { - return true; - } - } - - // Then up Then left adjustedCircle *2 - for (int i = 0; i < adjustedCircle * 2; i++) { - checkLoc.add(1, 0, 0); - if (this.bs.playerCanSpawnHereSafely(checkLoc)) { - return true; - } - } - - // Then finish up by doing adjustedCircle - 1 - for (int i = 0; i < adjustedCircle - 1; i++) { - checkLoc.add(0, 0, 1); - if (this.bs.playerCanSpawnHereSafely(checkLoc)) { - return true; - } - } - return false; - } - - /** - * Safely teleport the entity to the MVDestination. This will perform checks to see if the place is safe, and if - * it's not, will adjust the final destination accordingly. - * - * @param teleporter Person who performed the teleport command. - * @param teleportee Entity to teleport - * @param d Destination to teleport them to - * @return true for success, false for failure - */ - public TeleportResult safelyTeleport(CommandSender teleporter, Entity teleportee, MVDestination d) { - if (d instanceof InvalidDestination) { - this.plugin.log(Level.FINER, "Entity tried to teleport to an invalid destination"); - return TeleportResult.FAIL_INVALID; - } - Player teleporteePlayer = null; - if (teleportee instanceof Player) { - teleporteePlayer = ((Player) teleportee); - } else if (teleportee.getPassenger() instanceof Player) { - teleporteePlayer = ((Player) teleportee.getPassenger()); - } - - if (teleporteePlayer == null) { - return TeleportResult.FAIL_INVALID; - } - MultiverseCore.addPlayerToTeleportQueue(teleporter.getName(), teleporteePlayer.getName()); - - Location safeLoc = d.getLocation(teleportee); - if (d.useSafeTeleporter()) { - safeLoc = this.getSafeLocation(teleportee, d); - } - - if (safeLoc != null) { - if (teleportee.teleport(safeLoc)) { - if (!d.getVelocity().equals(new Vector(0, 0, 0))) { - teleportee.setVelocity(d.getVelocity()); - } - return TeleportResult.SUCCESS; - } - return TeleportResult.FAIL_OTHER; - } - return TeleportResult.FAIL_UNSAFE; - } - - /** - * Safely teleport the entity to the Location. This may perform checks to - * see if the place is safe, and if - * it's not, will adjust the final destination accordingly. - * - * @param teleporter Person who issued the teleport command. - * @param teleportee Entity to teleport. - * @param location Location to teleport them to. - * @param safely Should the destination be checked for safety before teleport? - * @return true for success, false for failure. - */ - public TeleportResult safelyTeleport(CommandSender teleporter, Entity teleportee, Location location, boolean safely) { - if (safely) { - location = this.getSafeLocation(location); - } - - if (location != null) { - if (teleportee.teleport(location)) { - return TeleportResult.SUCCESS; - } - return TeleportResult.FAIL_OTHER; - } - return TeleportResult.FAIL_UNSAFE; - } - - /** - * Returns a safe location for the entity to spawn at. - * - * @param e The entity to spawn - * @param d The MVDestination to take the entity to. - * @return A new location to spawn the entity at. - */ - public Location getSafeLocation(Entity e, MVDestination d) { - Location l = d.getLocation(e); - if (this.bs.playerCanSpawnHereSafely(l)) { - plugin.log(Level.FINE, "The first location you gave me was safe."); - return l; - } - if (e instanceof Minecart) { - Minecart m = (Minecart) e; - if (!this.bs.canSpawnCartSafely(m)) { - return null; - } - } else if (e instanceof Vehicle) { - Vehicle v = (Vehicle) e; - if (!this.bs.canSpawnVehicleSafely(v)) { - return null; - } - } - Location safeLocation = this.getSafeLocation(l); - if (safeLocation != null) { - // Add offset to account for a vehicle on dry land! - if (e instanceof Minecart && !this.bs.isEntitiyOnTrack(safeLocation)) { - safeLocation.setY(safeLocation.getBlockY() + .5); - this.plugin.log(Level.FINER, "Player was inside a minecart. Offsetting Y location."); - } - this.plugin.log(Level.FINE, "Had to look for a bit, but I found a safe place for ya!"); - return safeLocation; - } - if (e instanceof Player) { - Player p = (Player) e; - this.plugin.getMessaging().sendMessage(p, "No safe locations found!", false); - this.plugin.log(Level.FINER, "No safe location found for " + p.getName()); - } else if (e.getPassenger() instanceof Player) { - Player p = (Player) e.getPassenger(); - this.plugin.getMessaging().sendMessage(p, "No safe locations found!", false); - this.plugin.log(Level.FINER, "No safe location found for " + p.getName()); - } - this.plugin.log(Level.FINE, "Sorry champ, you're basically trying to teleport into a minefield. I should just kill you now."); - return null; - } - - /** - * Finds a portal-block next to the specified {@link Location}. - * @param l The {@link Location} - * @return The next portal-block's {@link Location}. - */ - public static Location findPortalBlockNextTo(Location l) { - Block b = l.getWorld().getBlockAt(l); - Location foundLocation = null; - if (b.getType() == Material.PORTAL) { - return l; - } - if (b.getRelative(BlockFace.NORTH).getType() == Material.PORTAL) { - foundLocation = getCloserBlock(l, b.getRelative(BlockFace.NORTH).getLocation(), foundLocation); - } - if (b.getRelative(BlockFace.SOUTH).getType() == Material.PORTAL) { - foundLocation = getCloserBlock(l, b.getRelative(BlockFace.SOUTH).getLocation(), foundLocation); - } - if (b.getRelative(BlockFace.EAST).getType() == Material.PORTAL) { - foundLocation = getCloserBlock(l, b.getRelative(BlockFace.EAST).getLocation(), foundLocation); - } - if (b.getRelative(BlockFace.WEST).getType() == Material.PORTAL) { - foundLocation = getCloserBlock(l, b.getRelative(BlockFace.WEST).getLocation(), foundLocation); - } - return foundLocation; - } - - private static Location getCloserBlock(Location source, Location blockA, Location blockB) { - // If B wasn't given, return a. - if (blockB == null) { - return blockA; - } - // Center our calculations - blockA.add(.5, 0, .5); - blockB.add(.5, 0, .5); - - // Retrieve the distance to the normalized blocks - double testA = source.distance(blockA); - double testB = source.distance(blockB); - - // Compare and return - if (testA <= testB) { - return blockA; - } - return blockB; - } - -} diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleBlockSafety.java b/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleBlockSafety.java index a7567380..153972f4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleBlockSafety.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleBlockSafety.java @@ -89,7 +89,7 @@ public class SimpleBlockSafety implements BlockSafety { return false; } - if (downOne.getBlock().getType() == Material.LAVA || downOne.getBlock().getType() == Material.STATIONARY_LAVA) { + if (downOne.getBlock().getType() == Material.LAVA) { Logging.finer("Error Here (downOne)? (%s)[%s]", downOne.getBlock().getType(), isSolidBlock(downOne.getBlock().getType())); return false; } @@ -199,69 +199,8 @@ public class SimpleBlockSafety implements BlockSafety { /* * If someone has a better way of this... Please either tell us, or submit a pull request! */ - private static boolean isSolidBlock(Material type) { - switch (type) { - case AIR: - return false; - case SNOW: - return false; - case TRAP_DOOR: - return false; - case TORCH: - return false; - case YELLOW_FLOWER: - return false; - case RED_ROSE: - return false; - case RED_MUSHROOM: - return false; - case BROWN_MUSHROOM: - return false; - case REDSTONE: - return false; - case REDSTONE_WIRE: - return false; - case RAILS: - return false; - case POWERED_RAIL: - return false; - case REDSTONE_TORCH_ON: - return false; - case REDSTONE_TORCH_OFF: - return false; - case DEAD_BUSH: - return false; - case SAPLING: - return false; - case STONE_BUTTON: - return false; - case LEVER: - return false; - case LONG_GRASS: - return false; - case PORTAL: - return false; - case STONE_PLATE: - return false; - case WOOD_PLATE: - return false; - case SEEDS: - return false; - case SUGAR_CANE_BLOCK: - return false; - case WALL_SIGN: - return false; - case SIGN_POST: - return false; - case WOODEN_DOOR: - return false; - case STATIONARY_WATER: - return false; - case WATER: - return false; - default: - return true; - } + public static boolean isSolidBlock(Material type) { + return type.isSolid(); } /** @@ -285,10 +224,10 @@ public class SimpleBlockSafety implements BlockSafety { } Location oneBelow = l.clone(); oneBelow.subtract(0, 1, 0); - if (oneBelow.getBlock().getType() == Material.WATER || oneBelow.getBlock().getType() == Material.STATIONARY_WATER) { + if (oneBelow.getBlock().getType() == Material.WATER) { Location twoBelow = oneBelow.clone(); twoBelow.subtract(0, 1, 0); - return (oneBelow.getBlock().getType() == Material.WATER || oneBelow.getBlock().getType() == Material.STATIONARY_WATER); + return (oneBelow.getBlock().getType() == Material.WATER); } if (oneBelow.getBlock().getType() != Material.AIR) { return false; diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java b/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java new file mode 100644 index 00000000..b11bbdfa --- /dev/null +++ b/src/test/java/com/onarandombox/MultiverseCore/TestEntryFeeConversion.java @@ -0,0 +1,63 @@ +package com.onarandombox.MultiverseCore; + +import com.onarandombox.MultiverseCore.utils.TestInstanceCreator; +import org.bukkit.Material; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPluginLoader; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.util.HashMap; +import java.util.Map; + +import static org.junit.Assert.*; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ MultiverseCore.class, PluginDescriptionFile.class, JavaPluginLoader.class}) +public class TestEntryFeeConversion { + + private TestInstanceCreator creator; + private MultiverseCore core; + Map config; + Map entryFee; + + @Before + public void setUp() { + creator = new TestInstanceCreator(); + assertTrue(creator.setUp()); + core = creator.getCore(); + + config = new HashMap<>(); + entryFee = new HashMap<>(); + config.put("entryfee", entryFee); + entryFee.put("==", "MVEntryFee"); + } + + @After + public void tearDown() { + creator.tearDown(); + } + + @Test + public void testConvertIntegerCurrencyToMaterialCurrency() { + entryFee.put("currency", -1); + WorldProperties props = new WorldProperties(config); + assertNull(props.entryfee.getCurrency()); + + entryFee.put("currency", 1); + props = new WorldProperties(config); + assertEquals(Material.STONE, props.entryfee.getCurrency()); + + entryFee.put("currency", "1"); + props = new WorldProperties(config); + assertEquals(Material.STONE, props.entryfee.getCurrency()); + + entryFee.put("currency", "stone"); + props = new WorldProperties(config); + assertEquals(Material.STONE, props.entryfee.getCurrency()); + } +} diff --git a/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java b/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java index 751ad97c..aa114fb6 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java +++ b/src/test/java/com/onarandombox/MultiverseCore/TestWorldProperties.java @@ -18,6 +18,7 @@ import org.bukkit.ChatColor; import org.bukkit.Difficulty; import org.bukkit.GameMode; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.WorldType; import org.bukkit.command.Command; @@ -151,7 +152,7 @@ public class TestWorldProperties { assertEquals(Difficulty.NORMAL, mvWorld.getDifficulty()); assertTrue(mvWorld.canAnimalsSpawn()); assertTrue(mvWorld.canMonstersSpawn()); - assertEquals(-1, mvWorld.getCurrency()); + assertNull(mvWorld.getCurrency()); assertEquals(0, mvWorld.getPrice(), 0); assertTrue(mvWorld.getHunger()); assertTrue(mvWorld.getAutoHeal()); @@ -233,8 +234,8 @@ public class TestWorldProperties { assertEquals(false, mvWorld.canAnimalsSpawn()); mvWorld.setAllowMonsterSpawn(false); assertEquals(false, mvWorld.canMonstersSpawn()); - mvWorld.setCurrency(1); - assertEquals(1, mvWorld.getCurrency()); + mvWorld.setCurrency(Material.STONE); + assertEquals(Material.STONE, mvWorld.getCurrency()); mvWorld.setPrice(1D); assertEquals(1D, mvWorld.getPrice(), 0); mvWorld.setHunger(false); @@ -332,7 +333,7 @@ public class TestWorldProperties { assertEquals(Difficulty.PEACEFUL, mvWorld.getDifficulty()); assertEquals(false, mvWorld.canAnimalsSpawn()); assertEquals(false, mvWorld.canMonstersSpawn()); - assertEquals(1, mvWorld.getCurrency()); + assertEquals(Material.STONE, mvWorld.getCurrency()); assertEquals(1D, mvWorld.getPrice(), 0); assertEquals(false, mvWorld.getHunger()); assertEquals(false, mvWorld.getAutoHeal()); diff --git a/src/test/java/com/onarandombox/MultiverseCore/utils/MockWorldFactory.java b/src/test/java/com/onarandombox/MultiverseCore/utils/MockWorldFactory.java index c5b68069..ffe0e668 100644 --- a/src/test/java/com/onarandombox/MultiverseCore/utils/MockWorldFactory.java +++ b/src/test/java/com/onarandombox/MultiverseCore/utils/MockWorldFactory.java @@ -126,7 +126,6 @@ public class MockWorldFactory { } when(mockBlock.getType()).thenReturn(blockType); - when(mockBlock.getTypeId()).thenReturn(blockType.getId()); when(mockBlock.getWorld()).thenReturn(loc.getWorld()); when(mockBlock.getX()).thenReturn(loc.getBlockX()); when(mockBlock.getY()).thenReturn(loc.getBlockY()); @@ -170,7 +169,6 @@ public class MockWorldFactory { Material blockType = Material.AIR; when(mockBlock.getType()).thenReturn(blockType); - when(mockBlock.getTypeId()).thenReturn(blockType.getId()); when(mockBlock.getWorld()).thenReturn(loc.getWorld()); when(mockBlock.getX()).thenReturn(loc.getBlockX()); when(mockBlock.getY()).thenReturn(loc.getBlockY());