diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 8ca3695..4509caf 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,7 @@ stages:
variables:
name: "EpicHoppers"
path: "/builds/$CI_PROJECT_PATH"
- version: "3.6.3"
+ version: "4-pre-release-1"
build:
stage: build
@@ -14,7 +14,7 @@ build:
- find $path/ -type f -name "*.yml" -print0 | xargs -0 sed -i -e s/maven-version-number/$version/g
- mvn clean package
- find $path/ -depth -path '*original*' -delete
- - mv $path/$name-Plugin/target/*.jar $path/
+ - mv $path/target/*.jar $path/
artifacts:
name: $name-$version
paths:
diff --git a/EpicHoppers-API/pom.xml b/EpicHoppers-API/pom.xml
deleted file mode 100644
index 143f7cd..0000000
--- a/EpicHoppers-API/pom.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-
- 4.0.0
-
-
- com.songoda
- EpicHoppers-Parent
- maven-version-number
-
- com.songoda
- EpicHoppers-API
-
- clean install
- EpicHoppers-API
-
-
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/EpicHoppers.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/EpicHoppers.java
deleted file mode 100644
index 4bd9b51..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/EpicHoppers.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.songoda.epichoppers.api;
-
-import com.songoda.epichoppers.api.hopper.HopperManager;
-import com.songoda.epichoppers.api.hopper.levels.Level;
-import com.songoda.epichoppers.api.hopper.levels.LevelManager;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.function.Supplier;
-
-/**
- * The main API class for the EpicHoppers plugin. This class will provide various
- * methods to access important features of the plugin's API. For static method
- * wrappers to all methods in this interface, see the {@link EpicHoppersAPI} class
- */
-public interface EpicHoppers {
-
- Level getLevelFromItem(ItemStack item);
-
- ItemStack newHopperItem(Level level);
-
- /**
- * Get an instance of the {@link LevelManager}
- *
- * @return the level manager
- */
- LevelManager getLevelManager();
-
-
- /**
- * Get an instance of the {@link HopperManager}
- *
- * @return the hopper manager
- */
- HopperManager getHopperManager();
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/EpicHoppersAPI.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/EpicHoppersAPI.java
deleted file mode 100644
index eefbdea..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/EpicHoppersAPI.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.songoda.epichoppers.api;
-
-
-import org.bukkit.ChatColor;
-
-/**
- * The access point of the EpicHoppersAPI, a class acting as a bridge between API
- * and plugin implementation. It is from here where developers should access the
- * important and core methods in the API. All static methods in this class will
- * call directly upon the implementation at hand (in most cases this will be the
- * EpicHoppers plugin itself), therefore a call to {@link #getImplementation()} is
- * not required and redundant in most situations. Method calls from this class are
- * preferred the majority of time, though an instance of {@link EpicHoppers} may
- * be passed if absolutely necessary.
- *
- * @see EpicHoppers
- * @since 3.0.0
- */
-public class EpicHoppersAPI {
-
- private static EpicHoppers implementation;
-
- /**
- * Set the EpicHoppers implementation. Once called for the first time, this
- * method will throw an exception on any subsequent invocations. The implementation
- * may only be set a single time, presumably by the EpicHoppers plugin
- *
- * @param implementation the implementation to set
- */
- public static void setImplementation(EpicHoppers implementation) {
- if (EpicHoppersAPI.implementation != null) {
- throw new IllegalArgumentException("Cannot set API implementation twice");
- }
-
- EpicHoppersAPI.implementation = implementation;
- }
-
- /**
- * Get the EpicHoppers implementation. This method may be redundant in most
- * situations as all methods present in {@link EpicHoppers} will be mirrored
- * with static modifiers in the {@link EpicHoppersAPI} class
- *
- * @return the EpicHoppers implementation
- */
- public static EpicHoppers getImplementation() {
- return implementation;
- }
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java
deleted file mode 100644
index 2f04a69..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.songoda.epichoppers.api.hopper;
-
-import org.bukkit.Location;
-import org.bukkit.block.Block;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-
-public interface Filter {
- List getWhiteList();
-
- void setWhiteList(List whiteList);
-
- List getBlackList();
-
- void setBlackList(List blackList);
-
- List getVoidList();
-
- void setVoidList(List voidList);
-
- Location getEndPoint();
-
- void setEndPoint(Location endPoint);
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java
deleted file mode 100644
index 5d4f384..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.songoda.epichoppers.api.hopper;
-
-import com.songoda.epichoppers.api.hopper.levels.Level;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.World;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-
-import java.util.List;
-import java.util.UUID;
-
-public interface Hopper {
-
- /**
- * This will link this hopper with another hopper.
- *
- * @param toSync the block containing the hopper
- * that this hopper will be synchronized
- * with
- * @param filtered whether or not this action is for the
- * filtered link or not
- * @param player the player initializing the synchronization
- */
- void link(Block toSync, boolean filtered, Player player);
-
- /**
- * Get location of the hopper.
- *
- * @return location of spawner
- */
- Location getLocation();
-
- World getWorld();
-
- /**
- * Get the X coordinate for the hopper.
- *
- * @return X coordinate.
- */
- int getX();
-
- /**
- * Get the Y coordinate for the shopper.
- *
- * @return Y coordinate.
- */
- int getY();
-
- /**
- * Get the Z coordinate for the hopper.
- *
- * @return Z coordinate.
- */
- int getZ();
-
- /**
- * Get the {@link Level} associated with this hopper.
- *
- * @return the hoppers level
- */
- Level getLevel();
-
- /**
- * Get the player that placed this hopper.
- *
- * @return the player the placed this hopper.
- */
- UUID getPlacedBy();
-
- /**
- * Get the player that last used this hopper.
- *
- * @return the last player
- */
- UUID getLastPlayer();
-
- /**
- * Set the last player to use this hopper.
- *
- * @param uuid the last player
- */
- void setLastPlayer(UUID uuid);
-
- /**
- * Get the item being automatically crafted.
- *
- * @return item being crafted
- */
- Material getAutoCrafting();
-
- /**
- * Set the Item being automatically crafted.
- *
- * @param autoCrafting item to craft
- */
- void setAutoCrafting(Material autoCrafting);
-
- /**
- * Get the teleport trigger is currently enabled.
- *
- * @return TeleportTrigger
- */
- TeleportTrigger getTeleportTrigger();
-
- /**
- * Set which teleport trigger is currently enabled.
- *
- * @param teleportTrigger TeleportTrigger
- */
- void setTeleportTrigger(TeleportTrigger teleportTrigger);
-
- List getLinkedBlocks();
-
- void addLinkedBlock(Location block);
-
- void clearLinkedBlocks();
-
- /**
- * Get the filter associated with this hopper
- *
- * @return filter associated with this hopper
- */
- Filter getFilter();
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/HopperManager.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/HopperManager.java
deleted file mode 100644
index 7c4e3e0..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/HopperManager.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.songoda.epichoppers.api.hopper;
-
-import org.bukkit.Location;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-
-import java.util.Map;
-
-public interface HopperManager {
-
- void addHopper(Location location, Hopper hopper);
-
- Hopper removeHopper(Location location);
-
- Hopper getHopper(Location location);
-
- Hopper getHopper(Block block);
-
- boolean isHopper(Location location);
-
- Map getHoppers();
-
- Hopper getHopperFromPlayer(Player player);
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/Level.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/Level.java
deleted file mode 100644
index 4b4d1e1..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/Level.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package com.songoda.epichoppers.api.hopper.levels;
-
-import com.songoda.epichoppers.api.hopper.levels.modules.Module;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public interface Level {
-
- /**
- * Get the current level in numerical format.
- *
- * @return level
- */
- int getLevel();
-
- /**
- * Get the range that this Level will allow
- * the applied hopper to remotely connect with
- * another hopper.
- *
- * @return range
- */
- int getRange();
-
- /**
- * Get the amount of items that will transfer
- * between this hopper and the remotely connected
- * hopper at a single time.
- *
- * @return amount
- */
- int getAmount();
-
- /**
- * Whether or not the filter is enabled with this
- * level.
- *
- * @return true if the filter is enabled, false
- * otherwise
- */
- boolean isFilter();
-
- /**
- * Whether or not teleporting through hoppers is
- * enabled with this level.
- *
- * @return true if teleporting is enabled false
- * otherwise
- */
- boolean isTeleport();
-
-
- int getAutoSell();
-
- int getLinkAmount();
-
- /**
- * Get the cost in experience in order to upgrade
- * to this level.
- *
- * @return experience upgrade cost
- */
- int getCostExperience();
-
- /**
- * Get the cost in economy in order to upgrade
- * to this level.
- *
- * @return economy upgrade cost
- */
- int getCostEconomy();
-
- List getDescription();
-
- ArrayList getRegisteredModules();
-
- void addModule(Module module);
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/LevelManager.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/LevelManager.java
deleted file mode 100644
index d668a36..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/LevelManager.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.songoda.epichoppers.api.hopper.levels;
-
-import com.songoda.epichoppers.api.hopper.levels.modules.Module;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-public interface LevelManager {
-
- /**
- * This will add a level to the level manager. These levels can be
- * used when upgrading hoppers or giving hoppers with the built in
- * "give" command.
- *
- * @param level The level of the hopper
- * @param costExperience The cost in experience to upgrade the hopper
- * @param costEconomy The cost in economy to upgrade the hopper
- * @param range The range in which this hopper will need to be in order to link with another hopper
- * @param amount The amount of items this hopper will transfer at a single time
- * @param filter Whether or not access to the filter is allowed.
- * @param teleport Whether or not teleporting through hoppers is allowed.
- */
- void addLevel(int level, int costExperience, int costEconomy, int range, int amount, boolean filter, boolean teleport, int linkAmount, int autoSell, ArrayList modules);
-
- /**
- * Get {@link Level} by corresponding integer value.
- *
- * @param level the integer level
- * @return level object
- */
- Level getLevel(int level);
-
- /**
- * Get the lowest {@link Level} in the LevelManager.
- *
- * @return lowest level
- */
- Level getLowestLevel();
-
-
- /**
- * Get the highest {@link Level} in the LevelManager.
- *
- * @return high level
- */
- Level getHighestLevel();
-
- /**
- * Whether or not this level exists.
- *
- * @param level the integer level
- * @return true if a level, false otherwise
- */
- boolean isLevel(int level);
-
- /**
- * Get a unmodifiable map of the current level registered
- * in the manager.
- *
- * @return map of levels.
- */
- Map getLevels();
-}
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/modules/Module.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/modules/Module.java
deleted file mode 100644
index bde09a7..0000000
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/levels/modules/Module.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.songoda.epichoppers.api.hopper.levels.modules;
-
-import com.songoda.epichoppers.api.hopper.Hopper;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-
-import java.util.List;
-
-public interface Module {
-
- String getName();
-
- void run(Hopper hopper, Inventory hopperInventory);
-
- ItemStack getGUIButton(Hopper hopper);
-
- void runButtonPress(Player player, Hopper hopper);
-
- List getBlockedItems(Hopper hopper);
-
- String getDescription();
-
-}
diff --git a/EpicHoppers-Plugin/pom.xml b/EpicHoppers-Plugin/pom.xml
deleted file mode 100644
index 7f304ac..0000000
--- a/EpicHoppers-Plugin/pom.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-
- 4.0.0
-
-
- com.songoda
- EpicHoppers-Parent
- maven-version-number
-
-
- EpicHoppers-Plugin
-
-
-
- private
- http://repo.songoda.com/artifactory/private
-
-
-
-
- com.songoda
- EpicHoppers-API
- ${project.version}
- compile
-
-
- net.arcaniax
- liquidtanks
- 2.1.0
- provided
-
-
- org
- kingdoms
- 13.0.9
- provided
-
-
- net.milkbowl
- vault
- 1.7.1
- provided
-
-
- me.ryanhamshire
- GriefPrevention
- 16.6
- provided
-
-
- com.sk89q
- worldedit
- 7.0.0
- provided
-
-
- com.sk89q
- worldguard
- 7.0.0
- provided
-
-
- com
- plotsquared
- BREAKING
- provided
-
-
- com.songoda
- fabledskyblock
- 72
- provided
-
-
- com.palmergames.bukkit
- towny
- 0.93.0.0
- provided
-
-
- com.wasteofplastic
- askyblock
- 3.0.6.8
- provided
-
-
- us.talabrek
- ultimateskyblock
- 2.7.2
- provided
-
-
- me.markeh
- factionsframework
- 1.2.0
- provided
-
-
- br.net.fabiozumbi12
- RedProtect
- 7.3.0
- provided
-
-
- com.gmail.nossr50
- mcmmo
- 1.5.09
- provided
-
-
- com.gamingmesh
- jobs
- 4.6.0
- provided
-
-
- me.botsko
- prism
- 2.0.6
- provided
-
-
- de.diddiz
- logblock
- 1.10.0
- provided
-
-
- net
- coreprotect
- 2.14.2
- provided
-
-
- uk.antiperson
- stackmob
- 2.2.6
- provided
-
-
- net.sothatsit
- blockstore
- 1.5.0
- provided
-
-
- org.black_ixx
- playerpoints
- 2.1.4
- provided
-
-
- xyz.wildseries
- wildstacker
- b13
- provided
-
-
- me.clip
- placeholderapi
- 2.5.1
- provided
-
-
-
-
- clean install
- EpicHoppers-${project.version}
-
-
- com.google.code.maven-replacer-plugin
- replacer
- 1.5.3
-
-
- prepare-package
-
- replace
-
-
-
-
- ${project.build.directory}/classes/plugin.yml
- ${project.basedir}/../.gitlab-ci.yml
-
-
- maven-version-number
- ${project.version}
-
-
-
-
-
- org.apache.maven.plugins
- maven-shade-plugin
- 3.2.0
-
-
- package
-
- shade
-
-
- false
-
-
-
-
-
-
-
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/HookManager.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/HookManager.java
deleted file mode 100644
index deb953a..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/HookManager.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.songoda.epichoppers.hook;
-
-import com.songoda.epichoppers.EpicHoppersPlugin;
-import com.songoda.epichoppers.hook.hooks.*;
-import com.songoda.epichoppers.utils.ConfigWrapper;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.PluginManager;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-public class HookManager {
-
- private final EpicHoppersPlugin plugin;
-
- private ConfigWrapper hooksFile;
- private List registeredHooks = new ArrayList<>();
-
- public HookManager(EpicHoppersPlugin plugin) {
- this.plugin = plugin;
- this.hooksFile = new ConfigWrapper(plugin, "", "hooks.yml");
- this.hooksFile.createNewFile("Loading Hooks File", plugin.getDescription().getName() + " Hooks File");
-
- PluginManager pluginManager = Bukkit.getPluginManager();
-
- // Register default hooks
- if (pluginManager.isPluginEnabled("ASkyBlock")) this.register(HookASkyBlock::new);
- if (pluginManager.isPluginEnabled("FactionsFramework")) this.register(HookFactions::new);
- if (pluginManager.isPluginEnabled("GriefPrevention")) this.register(HookGriefPrevention::new);
- if (pluginManager.isPluginEnabled("Kingdoms")) this.register(HookKingdoms::new);
- if (pluginManager.isPluginEnabled("PlotSquared")) this.register(HookPlotSquared::new);
- if (pluginManager.isPluginEnabled("RedProtect")) this.register(HookRedProtect::new);
- if (pluginManager.isPluginEnabled("Towny")) this.register(HookTowny::new);
- if (pluginManager.isPluginEnabled("USkyBlock")) this.register(HookUSkyBlock::new);
- if (pluginManager.isPluginEnabled("SkyBlock")) this.register(HookSkyBlockEarth::new);
- if (pluginManager.isPluginEnabled("WorldGuard")) this.register(HookWorldGuard::new);
- }
-
- public boolean canBuild(Player player, Location location) {
- if (player.hasPermission(EpicHoppersPlugin.getInstance().getDescription().getName() + ".bypass")) return true;
-
- for (ProtectionPluginHook hook : registeredHooks) {
- if (!hook.isInClaim(location)) continue;
-
- if (!hook.canBuild(player, location)) return false;
- }
-
- return true;
- }
-
- public boolean isInClaim(HookType hookType, String name, Location l) {
- List hooks = registeredHooks.stream().filter(hook -> hook.getHookType() == hookType).collect(Collectors.toList());
- for (ProtectionPluginHook hook : hooks) {
- if (hook.isInClaim(l, name)) {
- return true;
- }
- }
- return false;
- }
-
- public String getClaimId(HookType hookType, String name) {
- List hooks = registeredHooks.stream().filter(hook -> hook.getHookType() == hookType).collect(Collectors.toList());
- for (ProtectionPluginHook hook : hooks) {
- return hook.getClaimID(name);
- }
- return null;
- }
-
-
- private ProtectionPluginHook register(Supplier hookSupplier) {
- return this.registerProtectionHook(hookSupplier.get());
- }
-
- public ProtectionPluginHook registerProtectionHook(ProtectionPluginHook hook) {
- if (hook != null && hook.getPlugin() != null) return null;
-
- JavaPlugin hookPlugin = hook.getPlugin();
- for (ProtectionPluginHook existingHook : registeredHooks) {
- if (existingHook.getPlugin().equals(hookPlugin)) {
- throw new IllegalArgumentException("Hook already registered");
- }
- }
-
- this.hooksFile.getConfig().addDefault("hooks." + hookPlugin.getName(), true);
- if (!hooksFile.getConfig().getBoolean("hooks." + hookPlugin.getName(), true)) return null;
- this.hooksFile.getConfig().options().copyDefaults(true);
- this.hooksFile.saveConfig();
-
- this.registeredHooks.add(hook);
- plugin.getLogger().info("Registered protection hook for plugin: " + hook.getPlugin().getName());
- return hook;
- }
-}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/HookType.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/HookType.java
deleted file mode 100644
index f51b98f..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/HookType.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.songoda.epichoppers.hook;
-
-public enum HookType {
-
- FACTION, TOWN, ISLAND, REGULAR
-}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/ProtectionPluginHook.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/ProtectionPluginHook.java
deleted file mode 100644
index 7c25647..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/ProtectionPluginHook.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.songoda.epichoppers.hook;
-
-import org.bukkit.Location;
-import org.bukkit.block.Block;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public interface ProtectionPluginHook {
-
- JavaPlugin getPlugin();
-
- HookType getHookType();
-
- boolean canBuild(Player player, Location location);
-
- default boolean canBuild(Player player, Block block) {
- return block != null && canBuild(player, block.getLocation());
- }
-
- boolean isInClaim(Location location);
-
- boolean isInClaim(Location location, String id);
-
- String getClaimID(String name);
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookASkyBlock.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookASkyBlock.java
deleted file mode 100644
index f99ae2a..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookASkyBlock.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import com.wasteofplastic.askyblock.ASkyBlock;
-import com.wasteofplastic.askyblock.ASkyBlockAPI;
-import com.wasteofplastic.askyblock.Island;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-public class HookASkyBlock implements ProtectionPluginHook {
-
- private final ASkyBlockAPI skyblock;
-
- public HookASkyBlock() {
- this.skyblock = ASkyBlockAPI.getInstance();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return ASkyBlock.getPlugin();
- }
-
- @Override
- public HookType getHookType() {
- return HookType.ISLAND;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- Island island = skyblock.getIslandAt(location);
- if (island == null) return true;
-
- UUID owner = island.getOwner();
- UUID playerUUID = player.getUniqueId();
- if (owner == null || owner.equals(playerUUID)) return true;
-
- List teamMembers = skyblock.getTeamMembers(owner);
- if (teamMembers.contains(playerUUID)) return true;
-
- Set coopIslands = skyblock.getCoopIslands(player);
- for (Location islandLocation : coopIslands) {
- if (skyblock.getIslandAt(islandLocation).getOwner().equals(playerUUID)) {
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return skyblock.getIslandAt(location) != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return skyblock.getOwner(location).toString().equals(id);
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookFactions.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookFactions.java
deleted file mode 100644
index aac5762..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookFactions.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import me.markeh.factionsframework.FactionsFramework;
-import me.markeh.factionsframework.entities.FPlayer;
-import me.markeh.factionsframework.entities.FPlayers;
-import me.markeh.factionsframework.entities.Faction;
-import me.markeh.factionsframework.entities.Factions;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class HookFactions implements ProtectionPluginHook {
-
- private final FactionsFramework factions;
-
- public HookFactions() {
- this.factions = FactionsFramework.get();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return factions;
- }
-
- @Override
- public HookType getHookType() {
- return HookType.FACTION;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- FPlayer fPlayer = FPlayers.getBySender(player);
- Faction faction = Factions.getFactionAt(location);
-
- return faction.isNone() || fPlayer.getFaction().equals(faction);
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return !Factions.getFactionAt(location).isNone();
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return Factions.getFactionAt(location).getId().equals(id);
- }
-
- @Override
- public String getClaimID(String name) {
- Faction faction = Factions.getByName(name, "");
- return (faction != null) ? faction.getId() : null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookGriefPrevention.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookGriefPrevention.java
deleted file mode 100644
index d8e808f..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookGriefPrevention.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import me.ryanhamshire.GriefPrevention.Claim;
-import me.ryanhamshire.GriefPrevention.GriefPrevention;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class HookGriefPrevention implements ProtectionPluginHook {
-
- private final GriefPrevention griefPrevention;
-
- public HookGriefPrevention() {
- this.griefPrevention = GriefPrevention.instance;
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return griefPrevention;
- }
-
- @Override
- public HookType getHookType() {
- return HookType.REGULAR;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- Claim claim = griefPrevention.dataStore.getClaimAt(location, false, null);
- return claim != null && claim.allowBuild(player, Material.HOPPER) == null;
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return griefPrevention.dataStore.getClaimAt(location, false, null) != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return false;
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookKingdoms.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookKingdoms.java
deleted file mode 100644
index b9801d8..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookKingdoms.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-import org.kingdoms.constants.land.Land;
-import org.kingdoms.constants.land.SimpleChunkLocation;
-import org.kingdoms.constants.player.KingdomPlayer;
-import org.kingdoms.main.Kingdoms;
-import org.kingdoms.manager.game.GameManagement;
-
-public class HookKingdoms implements ProtectionPluginHook {
-
- private final Kingdoms kingdoms;
-
- public HookKingdoms() {
- this.kingdoms = Kingdoms.getInstance();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return kingdoms;
- }
-
- @Override
- public HookType getHookType() {
- return HookType.REGULAR;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- KingdomPlayer kPlayer = GameManagement.getPlayerManager().getOfflineKingdomPlayer(player).getKingdomPlayer();
- if (kPlayer.getKingdom() == null) return true;
-
- SimpleChunkLocation chunkLocation = new SimpleChunkLocation(location.getChunk());
- Land land = GameManagement.getLandManager().getOrLoadLand(chunkLocation);
- String owner = land.getOwner();
-
- return owner == null || kPlayer.getKingdom().getKingdomName().equals(owner);
- }
-
- @Override
- public boolean isInClaim(Location location) {
- SimpleChunkLocation chunkLocation = new SimpleChunkLocation(location.getChunk());
- Land land = GameManagement.getLandManager().getOrLoadLand(chunkLocation);
- String owner = land.getOwner();
- return owner != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return false;
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookPlotSquared.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookPlotSquared.java
deleted file mode 100644
index bc3a2e6..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookPlotSquared.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.github.intellectualsites.plotsquared.api.PlotAPI;
-import com.github.intellectualsites.plotsquared.bukkit.BukkitMain;
-import com.github.intellectualsites.plotsquared.plot.object.Plot;
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class HookPlotSquared implements ProtectionPluginHook {
-
- private final PlotAPI plotSquared;
-
- public HookPlotSquared() {
- this.plotSquared = new PlotAPI();
- }
-
- @Override
- public JavaPlugin getPlugin() { // BukkitMain? Really?
- return JavaPlugin.getPlugin(BukkitMain.class);
- }
-
- @Override
- public HookType getHookType() {
- return HookType.REGULAR;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- com.github.intellectualsites.plotsquared.plot.object.Location plotLocation =
- new com.github.intellectualsites.plotsquared.plot.object.Location(location.getWorld().getName(),
- location.getBlockX(), location.getBlockY(), location.getBlockZ());
-
- Plot plot = plotLocation.getPlot();
-
- return plot != null
- && plot.getOwners().contains(player.getUniqueId())
- && plot.getMembers().contains(player.getUniqueId());
- }
-
- @Override
- public boolean isInClaim(Location location) {
- com.github.intellectualsites.plotsquared.plot.object.Location plotLocation =
- new com.github.intellectualsites.plotsquared.plot.object.Location(location.getWorld().getName(),
- location.getBlockX(), location.getBlockY(), location.getBlockZ());
-
- Plot plot = plotLocation.getPlot();
- return plot != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return false;
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookRedProtect.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookRedProtect.java
deleted file mode 100644
index e4399de..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookRedProtect.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import br.net.fabiozumbi12.RedProtect.Bukkit.API.RedProtectAPI;
-import br.net.fabiozumbi12.RedProtect.Bukkit.RedProtect;
-import br.net.fabiozumbi12.RedProtect.Bukkit.Region;
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class HookRedProtect implements ProtectionPluginHook {
-
- private final RedProtect redProtect;
-
- public HookRedProtect() {
- this.redProtect = RedProtect.get();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return redProtect;
- }
-
- @Override
- public HookType getHookType() {
- return HookType.REGULAR;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- RedProtectAPI api = redProtect.getAPI();
- Region region = api.getRegion(location);
-
- return region != null && region.canBuild(player);
- }
-
- @Override
- public boolean isInClaim(Location location) {
- RedProtectAPI api = redProtect.getAPI();
- Region region = api.getRegion(location);
- return region != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return false;
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookSkyBlockEarth.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookSkyBlockEarth.java
deleted file mode 100644
index 8ad5fdf..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookSkyBlockEarth.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import me.goodandevil.skyblock.SkyBlock;
-import me.goodandevil.skyblock.island.Island;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-public class HookSkyBlockEarth implements ProtectionPluginHook {
-
- private final SkyBlock skyblock;
-
- public HookSkyBlockEarth() {
- this.skyblock = SkyBlock.getInstance();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return SkyBlock.getInstance();
- }
-
- @Override
- public HookType getHookType() {
- return HookType.ISLAND;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- Island island = skyblock.getIslandManager().getIslandAtLocation(location);
- if (island == null) return true;
-
- UUID owner = island.getOwnerUUID();
- UUID playerUUID = player.getUniqueId();
- if (owner == null || owner.equals(playerUUID)) return true;
-
- Set teamMembers = island.getCoopPlayers();
- if (teamMembers.contains(playerUUID)) return true;
-
- List coopIslands = skyblock.getIslandManager().getCoopIslands(player);
- for (Island is : coopIslands) {
- if (is.getOwnerUUID().equals(playerUUID)) {
- return true;
- }
- }
-
- return false;
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return skyblock.getIslandManager().getIslandAtLocation(location) != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return skyblock.getIslandManager().getIslandAtLocation(location).getOwnerUUID().toString().equals(id);
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookTowny.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookTowny.java
deleted file mode 100644
index 4cd7232..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookTowny.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.palmergames.bukkit.towny.Towny;
-import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
-import com.palmergames.bukkit.towny.object.Resident;
-import com.palmergames.bukkit.towny.object.TownyUniverse;
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import com.songoda.epichoppers.utils.Debugger;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class HookTowny implements ProtectionPluginHook {
-
- private final Towny towny;
-
- public HookTowny() {
- this.towny = Towny.getPlugin();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return towny;
- }
-
- @Override
- public HookType getHookType() {
- return HookType.TOWN;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- if (TownyUniverse.isWilderness(location.getBlock()) || !TownyUniverse.getTownBlock(location).hasTown())
- return true;
-
- try {
- Resident resident = TownyUniverse.getDataSource().getResident(player.getName());
- return resident.hasTown() && TownyUniverse.getTownName(location).equals(resident.getTown().getName());
- } catch (NotRegisteredException e) {
- Debugger.runReport(e);
- return false;
- }
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return !TownyUniverse.isWilderness(location.getBlock());
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- try {
- return (!TownyUniverse.isWilderness(location.getBlock())) && TownyUniverse.getTownBlock(location).getTown().getUID().toString().equals(id);
- } catch (NotRegisteredException e) {
- Debugger.runReport(e);
- return false;
- }
- }
-
- @Override
- public String getClaimID(String name) {
- try {
- return TownyUniverse.getDataSource().getTown(name).getUID().toString();
- } catch (NotRegisteredException e) {
- Debugger.runReport(e);
- return null;
- }
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookUSkyBlock.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookUSkyBlock.java
deleted file mode 100644
index 32f8fab..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookUSkyBlock.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-import us.talabrek.ultimateskyblock.api.uSkyBlockAPI;
-
-public class HookUSkyBlock implements ProtectionPluginHook {
-
- private final uSkyBlockAPI uSkyblock;
-
- public HookUSkyBlock() {
- this.uSkyblock = (uSkyBlockAPI) Bukkit.getPluginManager().getPlugin("USkyBlock");
- }
-
- @Override
- public JavaPlugin getPlugin() { // uSkyBlockAPI is also an instance of JavaPlugin
- return (JavaPlugin) uSkyblock;
- }
-
- @Override
- public HookType getHookType() {
- return HookType.ISLAND;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- return uSkyblock.getIslandInfo(location).getOnlineMembers().contains(player) || uSkyblock.getIslandInfo(location).isLeader(player);
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return uSkyblock.getIslandInfo(location) != null;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return uSkyblock.getIslandInfo(location).getLeader().equals(id);
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookWorldGuard.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookWorldGuard.java
deleted file mode 100644
index b808072..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hook/hooks/HookWorldGuard.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.songoda.epichoppers.hook.hooks;
-
-import com.sk89q.worldedit.bukkit.BukkitAdapter;
-import com.sk89q.worldguard.WorldGuard;
-import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
-import com.sk89q.worldguard.protection.ApplicableRegionSet;
-import com.sk89q.worldguard.protection.flags.Flags;
-import com.sk89q.worldguard.protection.regions.RegionQuery;
-import com.songoda.epichoppers.hook.HookType;
-import com.songoda.epichoppers.hook.ProtectionPluginHook;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-public class HookWorldGuard implements ProtectionPluginHook {
-
- private final WorldGuard worldGuard;
-
- public HookWorldGuard() {
- this.worldGuard = WorldGuard.getInstance();
- }
-
- @Override
- public JavaPlugin getPlugin() {
- return WorldGuardPlugin.inst();
- }
-
- @Override
- public HookType getHookType() {
- return HookType.REGULAR;
- }
-
- @Override
- public boolean canBuild(Player player, Location location) {
- RegionQuery q = worldGuard.getPlatform().getRegionContainer().createQuery();
- ApplicableRegionSet ars = q.getApplicableRegions(BukkitAdapter.adapt(player.getLocation()));
- return ars.testState(WorldGuardPlugin.inst().wrapPlayer(player), Flags.BUILD);
- }
-
- @Override
- public boolean isInClaim(Location location) {
- return true;
- }
-
- @Override
- public boolean isInClaim(Location location, String id) {
- return false;
- }
-
- @Override
- public String getClaimID(String name) {
- return null;
- }
-
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/tasks/HopTask.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/tasks/HopTask.java
deleted file mode 100644
index d6dc3f2..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/tasks/HopTask.java
+++ /dev/null
@@ -1,403 +0,0 @@
-package com.songoda.epichoppers.tasks;
-
-import com.songoda.epichoppers.EpicHoppersPlugin;
-import com.songoda.epichoppers.api.hopper.levels.modules.Module;
-import com.songoda.epichoppers.boost.BoostData;
-import com.songoda.epichoppers.utils.SettingsManager;
-import me.goodandevil.skyblock.SkyBlock;
-import me.goodandevil.skyblock.stackable.Stackable;
-import me.goodandevil.skyblock.stackable.StackableManager;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.block.Block;
-import org.bukkit.block.BlockState;
-import org.bukkit.block.Hopper;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.minecart.HopperMinecart;
-import org.bukkit.entity.minecart.StorageMinecart;
-import org.bukkit.inventory.*;
-import org.bukkit.scheduler.BukkitRunnable;
-
-import java.util.*;
-
-/**
- * Created by songoda on 3/14/2017.
- */
-public class HopTask extends BukkitRunnable {
-
- // Hop to the bop to the be bop top.
-
- private static EpicHoppersPlugin plugin;
-
- public HopTask(EpicHoppersPlugin plug) {
- plugin = plug;
- runTaskTimer(plugin, 0, SettingsManager.Setting.HOP_TICKS.getInt());
- }
-
- @Override
- public void run() {
- main:
- for (com.songoda.epichoppers.api.hopper.Hopper hopper : new HashMap<>(plugin.getHopperManager().getHoppers()).values()) {
- Location location = hopper.getLocation();
-
- if (location.getWorld() == null || !location.getWorld().isChunkLoaded(location.getBlockX() >> 4, location.getBlockZ() >> 4))
- continue;
-
- Block block = location.getBlock();
-
- if (block.getType() != Material.HOPPER) {
- plugin.getHopperManager().removeHopper(location);
- continue;
- }
-
- if (block.isBlockPowered() || block.isBlockIndirectlyPowered()) continue;
-
- Hopper hopperState = (Hopper) block.getState();
- Inventory hopperInventory = hopperState.getInventory();
-
- List blockedMaterials = new ArrayList<>();
-
- for (Module module : hopper.getLevel().getRegisteredModules()) {
- // Run Module
- module.run(hopper, hopperInventory);
-
- // Add banned materials to list.
- List materials = module.getBlockedItems(hopper);
- if (materials == null || materials.isEmpty()) continue;
- blockedMaterials.addAll(materials);
- }
-
- // Fetch all hopper contents.
- ItemStack[] hopperContents = hopperInventory.getContents();
-
- // Get hopper orientation.
- HopperDirection hopperDirection = HopperDirection.getDirection(hopperState.getRawData());
- Location check = hopperDirection.getLocation(location);
-
- Inventory override = null;
- List linked = hopper.getLinkedBlocks();
-
- if (hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty()) {
-
- linked.add(check);
-
- Collection nearbyEntities = hopper.getLocation().getWorld().getNearbyEntities(check, .5, .5, .5);
-
- for (Entity entity : nearbyEntities) {
- if (entity.getType() == EntityType.MINECART_HOPPER)
- override = ((HopperMinecart) entity).getInventory();
- else if (entity.getType() == EntityType.MINECART_CHEST)
- override = ((StorageMinecart) entity).getInventory();
- }
-
- if (linked.isEmpty()) continue;
- }
-
-
- // Support for FabledSkyBlock stackables.
- if (Bukkit.getPluginManager().isPluginEnabled("FabledSkyBlock")) {
- StackableManager stackableManager = SkyBlock.getInstance().getStackableManager();
- if (stackableManager != null && stackableManager.isStacked(check)) {
- Stackable stackable = stackableManager.getStack(check, check.getBlock().getType());
-
- for (int i = 0; i < 5; i++) {
- if (hopperContents[i] == null) continue;
- ItemStack item = hopperContents[i].clone();
-
- if (item.getType() == stackable.getMaterial()) {
- stackable.addOne();
- if (item.getAmount() == 1) {
- hopperInventory.setItem(i, null);
- } else {
- item.setAmount(item.getAmount() - 1);
- hopperInventory.setItem(i, item);
- }
- return;
- }
- }
- }
- }
-
- for (Location destinationLocation : linked) {
- Block destinationBlock = destinationLocation.getBlock();
- Inventory destinationInventory = override;
- if (override == null) {
-
- if (!destinationLocation.getWorld().isChunkLoaded(destinationLocation.getBlockX() >> 4,
- destinationLocation.getBlockZ() >> 4))
- continue;
-
- destinationBlock = destinationLocation.getBlock();
- BlockState state = destinationBlock.getState();
- if (!(state instanceof InventoryHolder)) {
- hopper.clearLinkedBlocks();
- continue;
- }
- destinationInventory = ((InventoryHolder) state).getInventory();
- }
-
- BoostData boostData = plugin.getBoostManager().getBoost(hopper.getPlacedBy());
-
- int amount = hopper.getLevel().getAmount() * (boostData == null ? 1 : boostData.getMultiplier());
-
- List whiteList = hopper.getFilter().getWhiteList();
- List blackList = hopper.getFilter().getBlackList();
-
- for (int i = 0; i < 5; i++) {
- if (hopperContents[i] == null) continue;
-
- ItemStack item = hopperContents[i].clone();
- item.setAmount(1);
-
- if (hopper.getLocation().getBlock().isBlockPowered()
- || hopperContents[i] != null && blockedMaterials.contains(hopperContents[i].getType())) {
- continue;
- }
-
- int finalIncrement = i;
-
- if (!whiteList.isEmpty()
- && whiteList.stream().noneMatch(itemStack -> itemStack.isSimilar(hopperContents[finalIncrement]))) {
- doBlacklist(hopperInventory, hopper, hopperContents[i].clone(), amount, i);
- continue main;
- }
-
- if (blackList.stream().noneMatch(itemStack -> itemStack.isSimilar(hopperContents[finalIncrement]))) {
- if (addItem(hopperInventory, hopper, destinationInventory, destinationBlock, hopperContents[i], amount, i)) {
- continue main;
- }
- } else {
- doBlacklist(hopperInventory, hopper, hopperContents[i].clone(), amount, i);
- continue main;
- }
- }
- }
- }
- }
-
-
- private void doBlacklist(Inventory hopperInventory, com.songoda.epichoppers.api.hopper.Hopper hopper, ItemStack item, int amt, int place) {
- Location dest = hopper.getFilter().getEndPoint();
- if (hopper.getFilter().getEndPoint() == null) return;
- if (!dest.getWorld().isChunkLoaded(dest.getBlockX() >> 4, dest.getBlockZ() >> 4))
- return;
-
- Block destinationBlock = dest.getBlock();
- BlockState state = destinationBlock.getState();
- if (!(state instanceof InventoryHolder)) {
- hopper.getFilter().setEndPoint(null);
- return;
- }
- Inventory destinationInventory = ((InventoryHolder) state).getInventory();
-
- addItem(hopperInventory, hopper, destinationInventory, destinationBlock, item, amt, place);
- }
-
- private boolean addItem(Inventory hopperInventory, com.songoda.epichoppers.api.hopper.Hopper hopper, Inventory destinationInventory, Block destinationBlock, ItemStack is, int amt, int place) {
- ItemStack it = null;
- if (is != null) {
- it = is.clone();
- it.setAmount(1);
- }
-
- List ovoid = new ArrayList<>(hopper.getFilter().getVoidList());
-
- if (is.getType() == Material.AIR) {
- return true;
- }
- ItemStack item = is;
- ItemStack newItem = is.clone();
-
- if ((item.getAmount() - amt) <= 0) {
- amt = item.getAmount();
- }
- if ((item.getAmount() - amt) >= 1) {
- newItem.setAmount(newItem.getAmount() - amt);
- is = newItem.clone();
- } else {
- is = null;
- }
-
- newItem.setAmount(amt);
-
- if (destinationBlock.getType().equals(Material.ENDER_CHEST)) {
- OfflinePlayer op = Bukkit.getOfflinePlayer(hopper.getPlacedBy());
-
- if (op.isOnline() && canMove(op.getPlayer().getEnderChest(), newItem)) {
- ItemStack finalIt = it;
- if (ovoid.stream().noneMatch(itemStack -> itemStack.isSimilar(finalIt))) {
- op.getPlayer().getEnderChest().addItem(newItem);
- }
- hopperInventory.setItem(place, is);
- }
- return true;
- }
-
- switch (destinationBlock.getType()) {
- case BLACK_SHULKER_BOX:
- case BLUE_SHULKER_BOX:
- case BROWN_SHULKER_BOX:
- case CYAN_SHULKER_BOX:
- case GRAY_SHULKER_BOX:
- case GREEN_SHULKER_BOX:
- case LIGHT_BLUE_SHULKER_BOX:
- case LIGHT_GRAY_SHULKER_BOX:
- case LIME_SHULKER_BOX:
- case MAGENTA_SHULKER_BOX:
- case ORANGE_SHULKER_BOX:
- case PINK_SHULKER_BOX:
- case PURPLE_SHULKER_BOX:
- case RED_SHULKER_BOX:
- case SHULKER_BOX:
- case WHITE_SHULKER_BOX:
- case YELLOW_SHULKER_BOX:
- return false;
- case BREWING_STAND: {
- BrewerInventory brewerInventory = (BrewerInventory) destinationInventory;
-
- int maxSize = newItem.getMaxStackSize();
-
- String typeStr = item.getType().name().toUpperCase();
- boolean isBottle = typeStr.contains("POTION") || typeStr.contains("BOTTLE") || item.getType() == Material.DRAGON_BREATH;
- boolean isLeft = item.getType() == Material.BLAZE_POWDER;
-
- Map output = new HashMap<>();
- if (isBottle) {
- output.put(0, brewerInventory.getItem(0));
- output.put(1, brewerInventory.getItem(1));
- output.put(2, brewerInventory.getItem(2));
- } else if (isLeft) {
- output.put(4, brewerInventory.getItem(4));
- } else {
- output.put(3, brewerInventory.getItem(3));
- }
-
- ItemStack finalIt = it;
- for (Map.Entry entry : output.entrySet()) {
- if (ovoid.stream().noneMatch(itemStack -> itemStack.isSimilar(finalIt))) {
- ItemStack currentOutput = entry.getValue();
- int currentOutputAmount = currentOutput == null ? 0 : currentOutput.getAmount();
- if (currentOutput != null && (!currentOutput.isSimilar(newItem))
- || currentOutputAmount + newItem.getAmount() > maxSize) continue;
-
- if (currentOutput != null) {
- currentOutput.setAmount(currentOutputAmount + newItem.getAmount());
- } else {
- currentOutput = newItem.clone();
- }
-
- brewerInventory.setItem(entry.getKey(), currentOutput);
- }
- hopperInventory.setItem(place, is);
- return true;
- }
- break;
- }
- case FURNACE: {
- FurnaceInventory furnaceInventory = (FurnaceInventory) destinationInventory;
-
- boolean isFuel = item.getType().isFuel() && !item.getType().name().contains("LOG");
- ItemStack output = isFuel ? furnaceInventory.getFuel() : furnaceInventory.getSmelting();
- if (output != null && !output.isSimilar(newItem)) return false;
- int maxSize = newItem.getMaxStackSize();
- int currentOutputAmount = output == null ? 0 : output.getAmount();
-
- if (currentOutputAmount + newItem.getAmount() <= maxSize) {
- ItemStack finalIt = it;
- if (ovoid.stream().noneMatch(itemStack -> itemStack.isSimilar(finalIt))) {
- if (output != null) {
- output.setAmount(currentOutputAmount + newItem.getAmount());
- } else {
- output = newItem.clone();
- }
- if (isFuel) {
- furnaceInventory.setFuel(output);
- } else {
- furnaceInventory.setSmelting(output);
- }
- hopperInventory.setItem(place, is);
- }
- }
- return true;
- }
- }
-
- if (!canMove(destinationInventory, newItem)) return false;
- ItemStack finalIt = it;
- if (ovoid.stream().noneMatch(itemStack -> itemStack.isSimilar(finalIt))) {
- destinationInventory.addItem(newItem);
- }
- hopperInventory.setItem(place, is);
- return true;
- }
-
- private boolean canMove(Inventory inventory, ItemStack item) {
- if (inventory.firstEmpty() != -1) return true;
- for (ItemStack stack : inventory.getContents()) {
- if (stack.isSimilar(item) && (stack.getAmount() + item.getAmount()) - 1 < stack.getMaxStackSize()) {
- return true;
- }
- }
- return false;
- }
-
- public enum HopperDirection {
-
- DOWN(0, 8, 0, -1, 0),
- NORTH(2, 10, 0, 0, -1),
- SOUTH(3, 11, 0, 0, 1),
- WEST(4, 12, -1, 0, 0),
- EAST(5, 13, 1, 0, 0);
-
- private int unpowered;
- private int powered;
-
- private int x;
- private int y;
- private int z;
-
- HopperDirection(int unpowered, int powered, int x, int y, int z) {
- this.unpowered = unpowered;
- this.powered = powered;
-
- this.x = x;
- this.y = y;
- this.z = z;
- }
-
- public static HopperDirection getDirection(int value) {
- for (HopperDirection hopperDirection : HopperDirection.values()) {
- if (hopperDirection.getPowered() == value
- || hopperDirection.getUnpowered() == value) return hopperDirection;
- }
- return null;
- }
-
- public Location getLocation(Location location) {
- return location.add(getX(), getY(), getZ());
- }
-
- public int getX() {
- return x;
- }
-
- public int getY() {
- return y;
- }
-
- public int getZ() {
- return z;
- }
-
- public int getUnpowered() {
- return unpowered;
- }
-
- public int getPowered() {
- return powered;
- }
- }
-}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Debugger.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Debugger.java
deleted file mode 100644
index a5a11ca..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Debugger.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package com.songoda.epichoppers.utils;
-
-import com.songoda.epichoppers.EpicHoppersPlugin;
-
-/**
- * Created by songoda on 3/21/2017.
- */
-public class Debugger {
-
-
- public static void runReport(Exception e) {
- if (isDebug()) {
- System.out.println("==============================================================");
- System.out.println("The following is an error encountered in EpicHoppers.");
- System.out.println("--------------------------------------------------------------");
- e.printStackTrace();
- System.out.println("==============================================================");
- }
- sendReport(e);
- }
-
- public static void sendReport(Exception e) {
-
- }
-
- public static boolean isDebug() {
- EpicHoppersPlugin instance = EpicHoppersPlugin.getInstance();
- return instance.getConfig().getBoolean("System.Debugger Enabled");
- }
-
-}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java
deleted file mode 100644
index 588fc1b..0000000
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/SettingsManager.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package com.songoda.epichoppers.utils;
-
-import com.songoda.epichoppers.EpicHoppersPlugin;
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.Material;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.inventory.InventoryClickEvent;
-import org.bukkit.event.player.AsyncPlayerChatEvent;
-import org.bukkit.inventory.Inventory;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.inventory.meta.ItemMeta;
-
-import java.util.*;
-import java.util.regex.Pattern;
-
-/**
- * Created by songo on 6/4/2017.
- */
-public class SettingsManager implements Listener {
-
- private static final Pattern SETTINGS_PATTERN = Pattern.compile("(.{1,28}(?:\\s|$))|(.{0,28})", Pattern.DOTALL);
- private final EpicHoppersPlugin instance;
- private String pluginName = "EpicHoppers";
- private Map cat = new HashMap<>();
- private Map current = new HashMap<>();
-
- public SettingsManager(EpicHoppersPlugin plugin) {
- this.instance = plugin;
- Bukkit.getPluginManager().registerEvents(this, plugin);
- }
-
- @EventHandler
- public void onInventoryClick(InventoryClickEvent event) {
- ItemStack clickedItem = event.getCurrentItem();
-
- if (event.getInventory() != event.getWhoClicked().getOpenInventory().getTopInventory()
- || clickedItem == null || !clickedItem.hasItemMeta()
- || !clickedItem.getItemMeta().hasDisplayName()) {
- return;
- }
-
- if (event.getView().getTitle().equals(pluginName + " Settings Manager")) {
- event.setCancelled(true);
- if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
-
- String type = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
- this.cat.put((Player) event.getWhoClicked(), type);
- this.openEditor((Player) event.getWhoClicked());
- } else if (event.getView().getTitle().equals(pluginName + " Settings Editor")) {
- event.setCancelled(true);
- if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
-
- Player player = (Player) event.getWhoClicked();
-
- String key = cat.get(player) + "." + ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
-
- if (instance.getConfig().get(key).getClass().getName().equals("java.lang.Boolean")) {
- this.instance.getConfig().set(key, !instance.getConfig().getBoolean(key));
- this.finishEditing(player);
- } else {
- this.editObject(player, key);
- }
- }
- }
-
- @EventHandler
- public void onChat(AsyncPlayerChatEvent event) {
- Player player = event.getPlayer();
- if (!current.containsKey(player)) return;
-
- String value = current.get(player);
- FileConfiguration config = instance.getConfig();
- if (config.isInt(value)) {
- config.set(value, Integer.parseInt(event.getMessage()));
- } else if (config.isDouble(value)) {
- config.set(value, Double.parseDouble(event.getMessage()));
- } else if (config.isString(value)) {
- config.set(value, event.getMessage());
- }
-
- Bukkit.getScheduler().scheduleSyncDelayedTask(EpicHoppersPlugin.getInstance(), () ->
- this.finishEditing(player), 0L);
-
- event.setCancelled(true);
- }
-
- private void finishEditing(Player player) {
- this.current.remove(player);
- this.instance.saveConfig();
- this.openEditor(player);
- }
-
- private void editObject(Player player, String current) {
- this.current.put(player, ChatColor.stripColor(current));
-
- player.closeInventory();
- player.sendMessage("");
- player.sendMessage(Methods.formatText("&7Please enter a value for &6" + current + "&7."));
- if (instance.getConfig().isInt(current) || instance.getConfig().isDouble(current)) {
- player.sendMessage(Methods.formatText("&cUse only numbers."));
- }
- player.sendMessage("");
- }
-
- public void openSettingsManager(Player player) {
- Inventory inventory = Bukkit.createInventory(null, 27, pluginName + " Settings Manager");
- ItemStack glass = Methods.getGlass();
- for (int i = 0; i < inventory.getSize(); i++) {
- inventory.setItem(i, glass);
- }
-
- int slot = 10;
- for (String key : instance.getConfig().getDefaultSection().getKeys(false)) {
- ItemStack item = new ItemStack(Material.WHITE_WOOL, 1, (byte) (slot - 9)); //ToDo: Make this function as it was meant to.
- ItemMeta meta = item.getItemMeta();
- meta.setLore(Collections.singletonList(Methods.formatText("&6Click To Edit This Category.")));
- meta.setDisplayName(Methods.formatText("&f&l" + key));
- item.setItemMeta(meta);
- inventory.setItem(slot, item);
- slot++;
- }
-
- player.openInventory(inventory);
- }
-
- private void openEditor(Player player) {
- Inventory inventory = Bukkit.createInventory(null, 54, pluginName + " Settings Editor");
- FileConfiguration config = instance.getConfig();
-
- int slot = 0;
- for (String key : config.getConfigurationSection(cat.get(player)).getKeys(true)) {
- String fKey = cat.get(player) + "." + key;
- ItemStack item = new ItemStack(Material.DIAMOND_HELMET);
- ItemMeta meta = item.getItemMeta();
- meta.setDisplayName(Methods.formatText("&6" + key));
-
- List lore = new ArrayList<>();
- if (config.isBoolean(fKey)) {
- item.setType(Material.LEVER);
- lore.add(Methods.formatText(config.getBoolean(fKey) ? "&atrue" : "&cfalse"));
- } else if (config.isString(fKey)) {
- item.setType(Material.PAPER);
- lore.add(Methods.formatText("&9" + config.getString(fKey)));
- } else if (config.isInt(fKey)) {
- item.setType(Material.CLOCK);
- lore.add(Methods.formatText("&5" + config.getInt(fKey)));
- }
-
- meta.setLore(lore);
- item.setItemMeta(meta);
-
- inventory.setItem(slot, item);
- slot++;
- }
-
- player.openInventory(inventory);
- }
-
- public void updateSettings() {
- FileConfiguration config = instance.getConfig();
-
- for (Setting setting : Setting.values()) {
- config.addDefault(setting.setting, setting.option);
- }
- }
-
- public enum Setting {
- HOPPER_UPGRADING("Main.Allow hopper Upgrading", true),
- UPGRADE_WITH_ECONOMY("Main.Upgrade With Economy", true),
- UPGRADE_WITH_XP("Main.Upgrade With XP", true),
- TELEPORT("Main.Allow Players To Teleport Through Hoppers", true),
- ENDERCHESTS("Main.Support Enderchests", true),
- PARTICLE_TYPE("Main.Upgrade Particle Type", "SPELL_WITCH"),
- HOP_TICKS("Main.Amount of Ticks Between Hops", 8L),
- AUTOSAVE("Main.Auto Save Interval In Seconds", 15),
- TELEPORT_TICKS("Main.Amount of Ticks Between Teleport", 10L),
- SYNC_TIMEOUT("Main.Timeout When Syncing Hoppers", 300L),
- MAX_CHUNK("Main.Max Hoppers Per Chunk", -1),
- TIPS("Main.Display Helpful Tips For Operators", true),
- SOUNDS("Main.Sounds Enabled", true),
- BLOCKBREAK_PARTICLE("Main.BlockBreak Particle Type", "LAVA"),
- BLACKLIST("Main.BlockBreak Blacklisted Blocks", Arrays.asList("BEDROCK")),
- AUTOSELL_PRICES("Main.AutoSell Prices", Arrays.asList("STONE,0.50", "COBBLESTONE,0.20", "IRON_ORE,0.35", "COAL_ORE,0.20")),
-
- RAINBOW("Interfaces.Replace Glass Type 1 With Rainbow Glass", false),
- ECO_ICON("Interfaces.Economy Icon", "SUNFLOWER"),
- XP_ICON("Interfaces.XP Icon", "EXPERIENCE_BOTTLE"),
- GLASS_TYPE_1("Interfaces.Glass Type 1", 7),
- GLASS_TYPE_2("Interfaces.Glass Type 2", 11),
- GLASS_TYPE_3("Interfaces.Glass Type 3", 3),
-
- DATABASE_SUPPORT("Database.Activate Mysql Support", false),
- DATABASE_IP("Database.IP", "127.0.0.1"),
- DATABASE_PORT("Database.Port", 3306),
- DATABASE_NAME("Database.Database Name", "EpicHoppers"),
- DATABASE_PREFIX("Database.Prefix", "EH-"),
- DATABASE_USERNAME("Database.Username", "PUT_USERNAME_HERE"),
- DATABASE_PASSWORD("Database.Password", "PUT_PASSWORD_HERE"),
-
- DOWNLOAD_FILES("System.Download Needed Data Files", true),
- LANGUGE_MODE("System.Language Mode", "en_US"),
- DEBUGGER("System.Debugger Enabled", false);
-
- private String setting;
- private Object option;
-
- Setting(String setting, Object option) {
- this.setting = setting;
- this.option = option;
- }
-
- public List getStringList() {
- return EpicHoppersPlugin.getInstance().getConfig().getStringList(setting);
- }
-
- public boolean getBoolean() {
- return EpicHoppersPlugin.getInstance().getConfig().getBoolean(setting);
- }
-
- public int getInt() {
- return EpicHoppersPlugin.getInstance().getConfig().getInt(setting);
- }
-
- public String getString() {
- return EpicHoppersPlugin.getInstance().getConfig().getString(setting);
- }
- }
-}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ca6a3ca..3cc849e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,28 +1,11 @@
-
- 4.0.0
-
+
com.songoda
- EpicHoppers-Parent
- pom
+ EpicHoppers
+ 4.0.0
maven-version-number
-
-
- EpicHoppers-API
- EpicHoppers-Plugin
-
-
-
-
- org.spigotmc
- spigot
- 1.14-pre5
- provided
-
-
-
clean install
+ EpicHoppers-${project.version}
org.apache.maven.plugins
@@ -33,6 +16,39 @@
1.8
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.1.0
+
+
+ shaded
+ package
+
+ shade
+
+
+ false
+ false
+
+
+ com.songoda:songodaupdater
+
+
+
+
+ *:*
+
+ META-INF/*.SF
+ META-INF/*.DSA
+ META-INF/*.RSA
+
+
+
+
+
+
+
@@ -41,4 +57,46 @@
http://repo.songoda.com/artifactory/private/
+
+
+ org.spigotmc
+ spigot
+ 1.14.1
+
+
+ com.songoda
+ songodaupdater
+ 1
+
+
+ net.arcaniax
+ liquidtanks
+ 2.1.0
+ provided
+
+
+ xyz.wildseries
+ wildstacker
+ b13
+ provided
+
+
+ net.milkbowl
+ vault
+ 1.7.1
+ provided
+
+
+ org.black_ixx
+ playerpoints
+ 2.1.4
+
+
+ com.songoda
+ fabledskyblock
+ 72
+ provided
+
+
+
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java b/src/main/java/com/songoda/epichoppers/EpicHoppers.java
similarity index 76%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java
rename to src/main/java/com/songoda/epichoppers/EpicHoppers.java
index bc09c09..050942a 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java
+++ b/src/main/java/com/songoda/epichoppers/EpicHoppers.java
@@ -1,39 +1,31 @@
package com.songoda.epichoppers;
-import com.songoda.epichoppers.api.EpicHoppers;
-import com.songoda.epichoppers.api.EpicHoppersAPI;
-import com.songoda.epichoppers.api.hopper.HopperManager;
-import com.songoda.epichoppers.api.hopper.TeleportTrigger;
-import com.songoda.epichoppers.api.hopper.levels.Level;
-import com.songoda.epichoppers.api.hopper.levels.LevelManager;
-import com.songoda.epichoppers.api.hopper.levels.modules.Module;
import com.songoda.epichoppers.boost.BoostData;
import com.songoda.epichoppers.boost.BoostManager;
import com.songoda.epichoppers.command.CommandManager;
+import com.songoda.epichoppers.economy.Economy;
+import com.songoda.epichoppers.economy.PlayerPointsEconomy;
+import com.songoda.epichoppers.economy.VaultEconomy;
import com.songoda.epichoppers.enchantment.Enchantment;
-import com.songoda.epichoppers.tasks.HopTask;
import com.songoda.epichoppers.handlers.TeleportHandler;
-import com.songoda.epichoppers.hook.HookManager;
-import com.songoda.epichoppers.hopper.EFilter;
-import com.songoda.epichoppers.hopper.EHopper;
-import com.songoda.epichoppers.hopper.EHopperManager;
-import com.songoda.epichoppers.hopper.levels.ELevelManager;
-import com.songoda.epichoppers.hopper.levels.modules.ModuleAutoCrafting;
-import com.songoda.epichoppers.hopper.levels.modules.ModuleAutoSell;
-import com.songoda.epichoppers.hopper.levels.modules.ModuleBlockBreak;
-import com.songoda.epichoppers.hopper.levels.modules.ModuleSuction;
+import com.songoda.epichoppers.hopper.Filter;
+import com.songoda.epichoppers.hopper.Hopper;
+import com.songoda.epichoppers.hopper.HopperManager;
+import com.songoda.epichoppers.hopper.levels.Level;
+import com.songoda.epichoppers.hopper.levels.LevelManager;
+import com.songoda.epichoppers.hopper.levels.modules.*;
import com.songoda.epichoppers.listeners.*;
import com.songoda.epichoppers.player.PlayerDataManager;
import com.songoda.epichoppers.storage.Storage;
import com.songoda.epichoppers.storage.StorageRow;
import com.songoda.epichoppers.storage.types.StorageMysql;
import com.songoda.epichoppers.storage.types.StorageYaml;
-import com.songoda.epichoppers.utils.ConfigWrapper;
-import com.songoda.epichoppers.utils.Methods;
-import com.songoda.epichoppers.utils.Metrics;
-import com.songoda.epichoppers.utils.SettingsManager;
+import com.songoda.epichoppers.tasks.HopTask;
+import com.songoda.epichoppers.utils.*;
+import com.songoda.epichoppers.utils.settings.Setting;
+import com.songoda.epichoppers.utils.settings.SettingsManager;
+import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
@@ -46,7 +38,6 @@ import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
-import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
@@ -57,10 +48,13 @@ import java.util.List;
import java.util.UUID;
-public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
+public class EpicHoppers extends JavaPlugin {
private static CommandSender console = Bukkit.getConsoleSender();
- private static EpicHoppersPlugin INSTANCE;
+ private static EpicHoppers INSTANCE;
+
+ private ServerVersion serverVersion = ServerVersion.fromPackageName(Bukkit.getServer().getClass().getPackage().getName());
+
public References references = null;
public Enchantment enchantmentHandler;
private SettingsManager settingsManager;
@@ -72,7 +66,8 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
private LevelManager levelManager;
private BoostManager boostManager;
private PlayerDataManager playerDataManager;
- private HookManager hookManager;
+
+ private Economy economy;
private TeleportHandler teleportHandler;
@@ -80,40 +75,20 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
private boolean liquidtanks = false;
- public static EpicHoppersPlugin getInstance() {
+ public static EpicHoppers getInstance() {
return INSTANCE;
}
- private boolean checkVersion() {
- int workingVersion = 13;
- int currentVersion = Integer.parseInt(Bukkit.getServer().getClass()
- .getPackage().getName().split("\\.")[3].split("_")[1]);
-
- if (currentVersion < workingVersion) {
- Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
- Bukkit.getConsoleSender().sendMessage("");
- Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "You installed the 1." + workingVersion + "+ only version of " + this.getDescription().getName() + " on a 1." + currentVersion + " server. Since you are on the wrong version we disabled the plugin for you. Please install correct version to continue using " + this.getDescription().getName() + ".");
- Bukkit.getConsoleSender().sendMessage("");
- }, 20L);
- return false;
- }
- return true;
- }
-
@Override
public void onEnable() {
INSTANCE = this;
- EpicHoppersAPI.setImplementation(this);
-
- // Check to make sure the Bukkit version is compatible.
- if (!checkVersion()) return;
console.sendMessage(Methods.formatText("&a============================="));
console.sendMessage(Methods.formatText("&7EpicHoppers " + this.getDescription().getVersion() + " by &5Songoda <3&7!"));
console.sendMessage(Methods.formatText("&7Action: &aEnabling&7..."));
this.settingsManager = new SettingsManager(this);
- this.setupConfig();
+ this.settingsManager.setupConfig();
// Setup language
String langMode = getConfig().getString("System.Language Mode");
@@ -125,12 +100,19 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
this.update();
this.enchantmentHandler = new Enchantment();
- this.hopperManager = new EHopperManager();
+ this.hopperManager = new HopperManager();
this.playerDataManager = new PlayerDataManager();
this.boostManager = new BoostManager();
this.references = new References();
this.commandManager = new CommandManager(this);
- this.hookManager = new HookManager(this);
+
+ // Setup Economy
+ if (Setting.VAULT_ECONOMY.getBoolean()
+ && getServer().getPluginManager().getPlugin("Vault") != null)
+ this.economy = new VaultEconomy(this);
+ else if (Setting.PLAYER_POINTS_ECONOMY.getBoolean()
+ && getServer().getPluginManager().getPlugin("PlayerPoints") != null)
+ this.economy = new PlayerPointsEconomy(this);
this.loadLevelManager();
this.checkStorage();
@@ -154,7 +136,7 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
if (pluginManager.isPluginEnabled("LiquidTanks")) liquidtanks = true;
// Start auto save
- int saveInterval = getConfig().getInt("Main.Auto Save Interval In Seconds") * 60 * 20;
+ int saveInterval = Setting.AUTOSAVE.getInt() * 60 * 20;
Bukkit.getScheduler().runTaskTimerAsynchronously(this, this::saveToFile, saveInterval, saveInterval);
// Start Metrics
@@ -208,6 +190,22 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
}
+ public ServerVersion getServerVersion() {
+ return serverVersion;
+ }
+
+ public boolean isServerVersion(ServerVersion version) {
+ return serverVersion == version;
+ }
+
+ public boolean isServerVersion(ServerVersion... versions) {
+ return ArrayUtils.contains(versions, serverVersion);
+ }
+
+ public boolean isServerVersionAtLeast(ServerVersion version) {
+ return serverVersion.ordinal() >= version.ordinal();
+ }
+
private void checkStorage() {
if (getConfig().getBoolean("Database.Activate Mysql Support")) {
this.storage = new StorageMysql(this);
@@ -256,21 +254,25 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
List blackList = row.get("blacklist").asItemStackList();
List voidList = row.get("void").asItemStackList();
- Material autoCrafting = Material.valueOf(row.get("autocrafting").asString() == null ? "AIR" : row.get("autocrafting").asString());
+ String autoCraftingStr = row.get("autocrafting").asString() == null ? "AIR" : row.get("autocrafting").asString();
+
+ String[] autoCraftingParts = autoCraftingStr.split(":");
+
+ ItemStack autoCrafting = new ItemStack(Material.valueOf(autoCraftingParts[0]), 1, Short.parseShort(autoCraftingParts.length == 2 ? autoCraftingParts[1] : "0"));
String blackLoc = row.get("black").asString();
Location black = blackLoc == null ? null : Methods.unserializeLocation(blackLoc);
boolean autoBreak = row.get("autobreak").asBoolean();
- EFilter filter = new EFilter();
+ Filter filter = new Filter();
filter.setWhiteList(whiteList);
filter.setBlackList(blackList);
filter.setVoidList(voidList);
filter.setEndPoint(black);
- EHopper hopper = new EHopper(location, levelManager.getLevel(level), lastPlayer, placedBy, blocks, filter, teleportTrigger, autoCrafting);
+ Hopper hopper = new Hopper(location, levelManager.getLevel(level), lastPlayer, placedBy, blocks, filter, teleportTrigger, autoCrafting);
if (autoBreak) hopper.toggleAutoBreaking();
@@ -302,11 +304,11 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
saveResource("levels.yml", false);
// Load an instance of LevelManager
- levelManager = new ELevelManager();
+ levelManager = new LevelManager();
/*
* Register Levels into LevelManager from configuration.
*/
- ((ELevelManager) levelManager).clear();
+ levelManager.clear();
for (String levelName : levelsFile.getConfig().getKeys(false)) {
int level = Integer.valueOf(levelName.split("-")[1]);
@@ -339,33 +341,15 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
}
}
- private void setupConfig() {
- settingsManager.updateSettings();
- this.getConfig().options().copyDefaults(true);
- this.saveConfig();
- }
-
public void reload() {
String langMode = getConfig().getString("System.Language Mode");
this.locale = Locale.getLocale(getConfig().getString("System.Language Mode", langMode));
this.locale.reloadMessages();
- this.hookManager = new HookManager(this);
references = new References();
- this.setupConfig();
+ this.settingsManager.reloadConfig();
loadLevelManager();
}
- @Override
- public Level getLevelFromItem(ItemStack item) {
- if (item.getItemMeta().getDisplayName().contains(":")) {
- String arr[] = item.getItemMeta().getDisplayName().replace(String.valueOf(ChatColor.COLOR_CHAR), "").split(":");
- return getLevelManager().getLevel(Integer.parseInt(arr[0]));
- } else {
- return getLevelManager().getLowestLevel();
- }
- }
-
- @Override
public ItemStack newHopperItem(Level level) {
ItemStack item = new ItemStack(Material.HOPPER, 1);
ItemMeta itemmeta = item.getItemMeta();
@@ -394,16 +378,10 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
return commandManager;
}
- public HookManager getHookManager() {
- return hookManager;
- }
-
- @Override
public LevelManager getLevelManager() {
return levelManager;
}
- @Override
public HopperManager getHopperManager() {
return hopperManager;
}
@@ -412,6 +390,10 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers {
return settingsManager;
}
+ public Economy getEconomy() {
+ return economy;
+ }
+
public PlayerDataManager getPlayerDataManager() {
return playerDataManager;
}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/Locale.java b/src/main/java/com/songoda/epichoppers/Locale.java
similarity index 99%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/Locale.java
rename to src/main/java/com/songoda/epichoppers/Locale.java
index b71822b..f73ebe6 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/Locale.java
+++ b/src/main/java/com/songoda/epichoppers/Locale.java
@@ -53,7 +53,7 @@ public class Locale {
/**
* Initialize the locale class to generate information and search for localizations.
* This must be called before any other methods in the Locale class can be invoked.
- * Note that this will also call {@link #searchForLocales()}, so there is no need to
+ * Note that this will also call {@link #searchForLocales()}, so there is blacklist need to
* invoke it for yourself after the initialization
*
* @param plugin the plugin instance
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/References.java b/src/main/java/com/songoda/epichoppers/References.java
similarity index 64%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/References.java
rename to src/main/java/com/songoda/epichoppers/References.java
index 21d1b94..ccefa9a 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/References.java
+++ b/src/main/java/com/songoda/epichoppers/References.java
@@ -5,7 +5,7 @@ public class References {
private String prefix;
public References() {
- prefix = EpicHoppersPlugin.getInstance().getLocale().getMessage("general.nametag.prefix") + " ";
+ prefix = EpicHoppers.getInstance().getLocale().getMessage("general.nametag.prefix") + " ";
}
public String getPrefix() {
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/boost/BoostData.java b/src/main/java/com/songoda/epichoppers/boost/BoostData.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/boost/BoostData.java
rename to src/main/java/com/songoda/epichoppers/boost/BoostData.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/boost/BoostManager.java b/src/main/java/com/songoda/epichoppers/boost/BoostManager.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/boost/BoostManager.java
rename to src/main/java/com/songoda/epichoppers/boost/BoostManager.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/AbstractCommand.java b/src/main/java/com/songoda/epichoppers/command/AbstractCommand.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/AbstractCommand.java
rename to src/main/java/com/songoda/epichoppers/command/AbstractCommand.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/CommandManager.java b/src/main/java/com/songoda/epichoppers/command/CommandManager.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/CommandManager.java
rename to src/main/java/com/songoda/epichoppers/command/CommandManager.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/TabManager.java b/src/main/java/com/songoda/epichoppers/command/TabManager.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/TabManager.java
rename to src/main/java/com/songoda/epichoppers/command/TabManager.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandBook.java b/src/main/java/com/songoda/epichoppers/command/commands/CommandBook.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandBook.java
rename to src/main/java/com/songoda/epichoppers/command/commands/CommandBook.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandBoost.java b/src/main/java/com/songoda/epichoppers/command/commands/CommandBoost.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandBoost.java
rename to src/main/java/com/songoda/epichoppers/command/commands/CommandBoost.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandEpicHoppers.java b/src/main/java/com/songoda/epichoppers/command/commands/CommandEpicHoppers.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandEpicHoppers.java
rename to src/main/java/com/songoda/epichoppers/command/commands/CommandEpicHoppers.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandGive.java b/src/main/java/com/songoda/epichoppers/command/commands/CommandGive.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandGive.java
rename to src/main/java/com/songoda/epichoppers/command/commands/CommandGive.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandReload.java b/src/main/java/com/songoda/epichoppers/command/commands/CommandReload.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandReload.java
rename to src/main/java/com/songoda/epichoppers/command/commands/CommandReload.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandSettings.java b/src/main/java/com/songoda/epichoppers/command/commands/CommandSettings.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/command/commands/CommandSettings.java
rename to src/main/java/com/songoda/epichoppers/command/commands/CommandSettings.java
diff --git a/src/main/java/com/songoda/epichoppers/economy/Economy.java b/src/main/java/com/songoda/epichoppers/economy/Economy.java
new file mode 100644
index 0000000..013f732
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/economy/Economy.java
@@ -0,0 +1,10 @@
+package com.songoda.epicspawners.economy;
+
+import org.bukkit.entity.Player;
+
+public interface Economy {
+
+ boolean hasBalance(Player player, double cost);
+
+ boolean withdrawBalance(Player player, double cost);
+}
diff --git a/src/main/java/com/songoda/epichoppers/economy/PlayerPointsEconomy.java b/src/main/java/com/songoda/epichoppers/economy/PlayerPointsEconomy.java
new file mode 100644
index 0000000..ecfd400
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/economy/PlayerPointsEconomy.java
@@ -0,0 +1,36 @@
+package com.songoda.epicspawners.economy;
+
+import com.songoda.epicspawners.EpicSpawners;
+import org.black_ixx.playerpoints.PlayerPoints;
+import org.bukkit.entity.Player;
+
+public class PlayerPointsEconomy implements Economy {
+
+ private final EpicSpawners plugin;
+
+ private final PlayerPoints playerPoints;
+
+ public PlayerPointsEconomy(EpicSpawners plugin) {
+ this.plugin = plugin;
+
+ this.playerPoints = (PlayerPoints) plugin.getServer().getPluginManager().getPlugin("PlayerPoints");
+ }
+
+ private int convertAmount(double amount) {
+ return (int) Math.ceil(amount);
+ }
+
+ @Override
+ public boolean hasBalance(Player player, double cost) {
+ int amount = convertAmount(cost);
+ return playerPoints.getAPI().look(player.getUniqueId()) >= amount;
+
+ }
+
+ @Override
+ public boolean withdrawBalance(Player player, double cost) {
+ int amount = convertAmount(cost);
+ return playerPoints.getAPI().take(player.getUniqueId(), amount);
+
+ }
+}
diff --git a/src/main/java/com/songoda/epichoppers/economy/VaultEconomy.java b/src/main/java/com/songoda/epichoppers/economy/VaultEconomy.java
new file mode 100644
index 0000000..4484fc0
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/economy/VaultEconomy.java
@@ -0,0 +1,28 @@
+package com.songoda.epicspawners.economy;
+
+import com.songoda.epicspawners.EpicSpawners;
+import org.bukkit.entity.Player;
+
+public class VaultEconomy implements Economy {
+
+ private final EpicSpawners plugin;
+
+ private final net.milkbowl.vault.economy.Economy vault;
+
+ public VaultEconomy(EpicSpawners plugin) {
+ this.plugin = plugin;
+
+ this.vault = plugin.getServer().getServicesManager().
+ getRegistration(net.milkbowl.vault.economy.Economy.class).getProvider();
+ }
+
+ @Override
+ public boolean hasBalance(Player player, double cost) {
+ return vault.has(player, cost);
+ }
+
+ @Override
+ public boolean withdrawBalance(Player player, double cost) {
+ return vault.withdrawPlayer(player, cost).transactionSuccess();
+ }
+}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/enchantment/Enchantment.java b/src/main/java/com/songoda/epichoppers/enchantment/Enchantment.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/enchantment/Enchantment.java
rename to src/main/java/com/songoda/epichoppers/enchantment/Enchantment.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/gui/GUICrafting.java b/src/main/java/com/songoda/epichoppers/gui/GUICrafting.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/gui/GUICrafting.java
rename to src/main/java/com/songoda/epichoppers/gui/GUICrafting.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/gui/GUIFilter.java b/src/main/java/com/songoda/epichoppers/gui/GUIFilter.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/gui/GUIFilter.java
rename to src/main/java/com/songoda/epichoppers/gui/GUIFilter.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/gui/GUIOverview.java b/src/main/java/com/songoda/epichoppers/gui/GUIOverview.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/gui/GUIOverview.java
rename to src/main/java/com/songoda/epichoppers/gui/GUIOverview.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java b/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java
rename to src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EFilter.java b/src/main/java/com/songoda/epichoppers/hopper/Filter.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EFilter.java
rename to src/main/java/com/songoda/epichoppers/hopper/Filter.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopper.java b/src/main/java/com/songoda/epichoppers/hopper/Hopper.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopper.java
rename to src/main/java/com/songoda/epichoppers/hopper/Hopper.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopperManager.java b/src/main/java/com/songoda/epichoppers/hopper/HopperManager.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopperManager.java
rename to src/main/java/com/songoda/epichoppers/hopper/HopperManager.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/ELevel.java b/src/main/java/com/songoda/epichoppers/hopper/levels/Level.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/ELevel.java
rename to src/main/java/com/songoda/epichoppers/hopper/levels/Level.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/ELevelManager.java b/src/main/java/com/songoda/epichoppers/hopper/levels/LevelManager.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/ELevelManager.java
rename to src/main/java/com/songoda/epichoppers/hopper/levels/LevelManager.java
diff --git a/src/main/java/com/songoda/epichoppers/hopper/levels/modules/Module.java b/src/main/java/com/songoda/epichoppers/hopper/levels/modules/Module.java
new file mode 100644
index 0000000..54a7896
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/hopper/levels/modules/Module.java
@@ -0,0 +1,4 @@
+package com.songoda.epichoppers.hopper.levels.modules;
+
+public class Module {
+}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoCrafting.java b/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoCrafting.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoCrafting.java
rename to src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoCrafting.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoSell.java b/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoSell.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoSell.java
rename to src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleAutoSell.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleBlockBreak.java b/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleBlockBreak.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleBlockBreak.java
rename to src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleBlockBreak.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleSuction.java b/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleSuction.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleSuction.java
rename to src/main/java/com/songoda/epichoppers/hopper/levels/modules/ModuleSuction.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java b/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java
rename to src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/EntityListeners.java b/src/main/java/com/songoda/epichoppers/listeners/EntityListeners.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/EntityListeners.java
rename to src/main/java/com/songoda/epichoppers/listeners/EntityListeners.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java b/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java
rename to src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/InteractListeners.java b/src/main/java/com/songoda/epichoppers/listeners/InteractListeners.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/InteractListeners.java
rename to src/main/java/com/songoda/epichoppers/listeners/InteractListeners.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/InventoryListeners.java b/src/main/java/com/songoda/epichoppers/listeners/InventoryListeners.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/InventoryListeners.java
rename to src/main/java/com/songoda/epichoppers/listeners/InventoryListeners.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/player/PlayerData.java b/src/main/java/com/songoda/epichoppers/player/PlayerData.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/player/PlayerData.java
rename to src/main/java/com/songoda/epichoppers/player/PlayerData.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/player/PlayerDataManager.java b/src/main/java/com/songoda/epichoppers/player/PlayerDataManager.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/player/PlayerDataManager.java
rename to src/main/java/com/songoda/epichoppers/player/PlayerDataManager.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/player/SyncType.java b/src/main/java/com/songoda/epichoppers/player/SyncType.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/player/SyncType.java
rename to src/main/java/com/songoda/epichoppers/player/SyncType.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/Storage.java b/src/main/java/com/songoda/epichoppers/storage/Storage.java
similarity index 81%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/Storage.java
rename to src/main/java/com/songoda/epichoppers/storage/Storage.java
index e58f931..faca842 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/Storage.java
+++ b/src/main/java/com/songoda/epichoppers/storage/Storage.java
@@ -1,9 +1,8 @@
package com.songoda.epichoppers.storage;
-import com.songoda.epichoppers.EpicHoppersPlugin;
-import com.songoda.epichoppers.api.hopper.Hopper;
+import com.songoda.epichoppers.EpicHoppers;
import com.songoda.epichoppers.boost.BoostData;
-import com.songoda.epichoppers.hopper.EHopper;
+import com.songoda.epichoppers.hopper.Hopper;
import com.songoda.epichoppers.utils.ConfigWrapper;
import com.songoda.epichoppers.utils.Methods;
import org.bukkit.Material;
@@ -13,10 +12,10 @@ import java.util.List;
public abstract class Storage {
- protected final EpicHoppersPlugin instance;
+ protected final EpicHoppers instance;
protected final ConfigWrapper dataFile;
- public Storage(EpicHoppersPlugin instance) {
+ public Storage(EpicHoppers instance) {
this.instance = instance;
this.dataFile = new ConfigWrapper(instance, "", "data.yml");
this.dataFile.createNewFile(null, "EpicHoppers Data File");
@@ -30,7 +29,7 @@ public abstract class Storage {
public abstract void prepareSaveItem(String group, StorageItem... items);
- public void updateData(EpicHoppersPlugin instance) {
+ public void updateData(EpicHoppers instance) {
/*
* Dump HopperManager to file.
*/
@@ -47,11 +46,10 @@ public abstract class Storage {
new StorageItem("player", hopper.getLastPlayer() == null ? null : hopper.getLastPlayer().toString()),
new StorageItem("teleporttrigger", hopper.getTeleportTrigger().toString()),
- new StorageItem("autocrafting", hopper.getAutoCrafting() == null || hopper.getAutoCrafting() == Material.AIR ? null : hopper.getAutoCrafting().name()),
- new StorageItem("whitelist", hopper.getFilter().getWhiteList()),
+ new StorageItem("autocrafting", hopper.getAutoCrafting() == null || hopper.getAutoCrafting().getType() == Material.AIR ? null : hopper.getAutoCrafting().getType().name() + (hopper.getAutoCrafting().getDurability() == 0 ? "" : ":" + hopper.getAutoCrafting().getDurability())), new StorageItem("whitelist", hopper.getFilter().getWhiteList()),
new StorageItem("blacklist", hopper.getFilter().getBlackList()),
new StorageItem("void", hopper.getFilter().getVoidList()),
- new StorageItem("autobreak", ((EHopper)hopper).isAutoBreaking()),
+ new StorageItem("autobreak", hopper.isAutoBreaking()),
new StorageItem("black", hopper.getFilter().getEndPoint() == null ? null : Methods.serializeLocation(hopper.getFilter().getEndPoint())));
}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageItem.java b/src/main/java/com/songoda/epichoppers/storage/StorageItem.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageItem.java
rename to src/main/java/com/songoda/epichoppers/storage/StorageItem.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageRow.java b/src/main/java/com/songoda/epichoppers/storage/StorageRow.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageRow.java
rename to src/main/java/com/songoda/epichoppers/storage/StorageRow.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageMysql.java b/src/main/java/com/songoda/epichoppers/storage/types/StorageMysql.java
similarity index 96%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageMysql.java
rename to src/main/java/com/songoda/epichoppers/storage/types/StorageMysql.java
index 93ca11b..495fc7c 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageMysql.java
+++ b/src/main/java/com/songoda/epichoppers/storage/types/StorageMysql.java
@@ -1,13 +1,10 @@
package com.songoda.epichoppers.storage.types;
-import com.songoda.epichoppers.EpicHoppersPlugin;
-import com.songoda.epichoppers.storage.Storage;
-import com.songoda.epichoppers.storage.StorageItem;
+import com.songoda.epichoppers.EpicHoppers;
import com.songoda.epichoppers.utils.MySQLDatabase;
import com.songoda.epichoppers.storage.Storage;
import com.songoda.epichoppers.storage.StorageItem;
import com.songoda.epichoppers.storage.StorageRow;
-import com.songoda.epichoppers.utils.MySQLDatabase;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
@@ -24,7 +21,7 @@ public class StorageMysql extends Storage {
private static Map lastSave = null;
private MySQLDatabase database;
- public StorageMysql(EpicHoppersPlugin instance) {
+ public StorageMysql(EpicHoppers instance) {
super(instance);
this.database = new MySQLDatabase(instance);
}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java b/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java
similarity index 97%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java
rename to src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java
index 0aeae28..382573f 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java
+++ b/src/main/java/com/songoda/epichoppers/storage/types/StorageYaml.java
@@ -1,6 +1,6 @@
package com.songoda.epichoppers.storage.types;
-import com.songoda.epichoppers.EpicHoppersPlugin;
+import com.songoda.epichoppers.EpicHoppers;
import com.songoda.epichoppers.storage.Storage;
import com.songoda.epichoppers.storage.StorageItem;
import com.songoda.epichoppers.storage.StorageRow;
@@ -15,7 +15,7 @@ public class StorageYaml extends Storage {
private static final Map toSave = new HashMap<>();
private static Map lastSave = null;
- public StorageYaml(EpicHoppersPlugin instance) {
+ public StorageYaml(EpicHoppers instance) {
super(instance);
}
diff --git a/src/main/java/com/songoda/epichoppers/tasks/HopTask.java b/src/main/java/com/songoda/epichoppers/tasks/HopTask.java
new file mode 100644
index 0000000..d370ab9
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/tasks/HopTask.java
@@ -0,0 +1,359 @@
+package com.songoda.epichoppers.tasks;
+
+import com.songoda.epichoppers.EpicHoppers;
+import com.songoda.epichoppers.boost.BoostData;
+import com.songoda.epichoppers.hopper.levels.modules.Module;
+import com.songoda.epichoppers.utils.HopperDirection;
+import com.songoda.epichoppers.utils.Methods;
+import com.songoda.epichoppers.utils.ServerVersion;
+import com.songoda.epichoppers.utils.settings.Setting;
+import org.bukkit.*;
+import org.bukkit.block.Block;
+import org.bukkit.block.BlockState;
+import org.bukkit.block.Hopper;
+import org.bukkit.inventory.*;
+import org.bukkit.scheduler.BukkitRunnable;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by songoda on 3/14/2017.
+ */
+public class HopTask extends BukkitRunnable {
+
+ // Hop to the bop to the be bop top.
+
+ private static EpicHoppers plugin;
+
+ private final List blacklist = new ArrayList<>();
+
+ public HopTask(EpicHoppers plug) {
+ plugin = plug;
+ runTaskTimer(plugin, 0, Setting.HOP_TICKS.getInt());
+ }
+
+ @Override
+ public void run() {
+ main:
+ for (com.songoda.epichoppers.hopper.Hopper hopper : new HashMap<>(plugin.getHopperManager().getHoppers()).values()) {
+ // Get this hoppers location.
+ Location location = hopper.getLocation();
+
+ // Skip is chunk not loaded.
+ if (location.getWorld() == null
+ || !location.getWorld().isChunkLoaded(location.getBlockX() >> 4, location.getBlockZ() >> 4))
+ continue;
+
+ // Get Hopper Block.
+ Block block = location.getBlock();
+
+ // If block is not a hopper remove and continue.
+ if (block.getType() != Material.HOPPER) {
+ plugin.getHopperManager().removeHopper(location);
+ continue;
+ }
+
+ // If hopper block is powered continue.
+ if (block.isBlockPowered() || block.isBlockIndirectlyPowered()) continue;
+
+ // Get hopper state.
+ Hopper hopperState = (Hopper) block.getState();
+
+ // Create list to hold blocked materials.
+ List blockedMaterials = new ArrayList<>();
+
+ // Cycle through modules.
+ for (Module module : hopper.getLevel().getRegisteredModules()) {
+ // Run Module
+ module.run(hopper, hopperState.getInventory());
+
+ // Add banned materials to list.
+ List materials = module.getBlockedItems(hopper);
+ if (materials == null || materials.isEmpty()) continue;
+ blockedMaterials.addAll(materials);
+ }
+
+ // Get remote linked containers.
+ List linkedContainers = hopper.getLinkedBlocks();
+
+ // Add linked container that the hopper is attached to physically.
+ HopperDirection hopperDirection = HopperDirection.getDirection(hopperState.getRawData());
+ linkedContainers.add(hopperDirection.getLocation(location));
+
+ // Amount to be moved.
+ BoostData boostData = plugin.getBoostManager().getBoost(hopper.getPlacedBy());
+ int amount = hopper.getLevel().getAmount() * (boostData == null ? 1 : boostData.getMultiplier());
+
+ // Fetch all hopper contents.
+ ItemStack[] hopperContents = hopperState.getInventory().getContents();
+
+ // Get filter endpoint
+ InventoryHolder filterEndpoint = getFilterEndpoint(hopper);
+
+ // Loop through our container list.
+ for (Location destinationLocation : linkedContainers) {
+
+ // Make sure the destination chunk is loaded.
+ if (!destinationLocation.getWorld().isChunkLoaded(destinationLocation.getBlockX() >> 4,
+ destinationLocation.getBlockZ() >> 4))
+ continue;
+
+ // Get the destination block.
+ Block destinationBlock = destinationLocation.getBlock();
+
+ // Get the destination state.
+ BlockState blockState = destinationBlock.getState();
+
+ // Remove if destination is not a inventoryholder.
+ if (!(blockState instanceof InventoryHolder)) {
+ //ToDO: Have this remove the link all together.
+ continue;
+ }
+
+ // Cast blockState to container
+ InventoryHolder destinationContainer = ((InventoryHolder) blockState);
+
+ // Loop through all of our hoppers item slots.
+ for (int i = 0; i < 5; i++) {
+
+ // Skip if slot empty.
+ if (hopperContents[i] == null) continue;
+
+ // Get potential item to move.
+ ItemStack item = hopperContents[i];
+
+ // Skip if item blacklisted.
+ if (blacklist.contains(item) || blockedMaterials.contains(item))
+ continue;
+
+ // Get amount to move.
+ int amountToMove = item.getAmount() < amount ? item.getAmount() : amount;
+
+ // Create item that will be moved.
+ ItemStack itemToMove = item.clone();
+ itemToMove.setAmount(amountToMove);
+
+ // Process void.
+ if (hopper.getFilter().getVoidList().stream().anyMatch(itemStack -> itemStack.isSimilar(item))) {
+ item.setAmount(item.getAmount() - amountToMove);
+ break main;
+ }
+
+ // Set current destination.
+ InventoryHolder currentDestination = destinationContainer;
+
+ // Process whitelist and blacklist.
+ boolean blocked = (!hopper.getFilter().getWhiteList().isEmpty() && hopper.getFilter().getWhiteList().stream().noneMatch(itemStack -> itemStack.isSimilar(item))
+ || hopper.getFilter().getBlackList().stream().anyMatch(itemStack -> itemStack.isSimilar(item)));
+
+ // If blocked check to see if a movement can be made if blacklist skip to the next slot
+ // otherwise set the current destination to the endpoint.
+ if (blocked) {
+ if (filterEndpoint == null || !canMove(filterEndpoint.getInventory(), itemToMove))
+ break;
+ currentDestination = filterEndpoint;
+ }
+
+ // Add item to container and continue on success.
+ if (addItem(hopper, currentDestination, destinationBlock.getType(), item, itemToMove, amountToMove))
+ continue main;
+ }
+ }
+ }
+ // Empty blacklist in preparation for next cycle.
+ this.blacklist.clear();
+ }
+
+ private boolean addItem(com.songoda.epichoppers.hopper.Hopper hopper, InventoryHolder currentDestination,
+ Material destinationType, ItemStack item, ItemStack itemToMove, int amountToMove) {
+
+ Inventory destinationInventory = currentDestination.getInventory();
+
+ switch (destinationType) {
+ case ENDER_CHEST:
+ OfflinePlayer op = Bukkit.getOfflinePlayer(hopper.getPlacedBy());
+
+ if (op.isOnline())
+ destinationInventory = op.getPlayer().getEnderChest();
+ break;
+ case BLACK_SHULKER_BOX:
+ case BLUE_SHULKER_BOX:
+ case BROWN_SHULKER_BOX:
+ case CYAN_SHULKER_BOX:
+ case GRAY_SHULKER_BOX:
+ case GREEN_SHULKER_BOX:
+ case LIGHT_BLUE_SHULKER_BOX:
+ case LIGHT_GRAY_SHULKER_BOX:
+ case LIME_SHULKER_BOX:
+ case MAGENTA_SHULKER_BOX:
+ case ORANGE_SHULKER_BOX:
+ case PINK_SHULKER_BOX:
+ case PURPLE_SHULKER_BOX:
+ case RED_SHULKER_BOX:
+ case SHULKER_BOX:
+ case WHITE_SHULKER_BOX:
+ case YELLOW_SHULKER_BOX:
+ return false;
+ case BREWING_STAND: {
+ BrewerInventory brewerInventory = (BrewerInventory) destinationInventory;
+
+ int maxSize = itemToMove.getMaxStackSize();
+
+ String typeStr = item.getType().name().toUpperCase();
+ boolean isBottle = typeStr.contains("POTION") || typeStr.contains("BOTTLE");
+ boolean isLeft = item.getType() == Material.BLAZE_POWDER;
+
+ Map output = new HashMap<>();
+ if (isBottle) {
+ output.put(0, brewerInventory.getItem(0));
+ output.put(1, brewerInventory.getItem(1));
+ output.put(2, brewerInventory.getItem(2));
+ } else if (isLeft) {
+ output.put(4, brewerInventory.getItem(4));
+ } else {
+ output.put(3, brewerInventory.getItem(3));
+ }
+
+ for (Map.Entry entry : output.entrySet()) {
+ ItemStack currentOutput = entry.getValue();
+ int currentOutputAmount = currentOutput == null ? 0 : currentOutput.getAmount();
+ if (currentOutput != null && (!currentOutput.isSimilar(itemToMove))
+ || currentOutputAmount + amountToMove > maxSize) continue;
+
+ if (currentOutput != null) {
+ currentOutput.setAmount(currentOutputAmount + amountToMove);
+ } else {
+ currentOutput = itemToMove;
+ }
+
+ brewerInventory.setItem(entry.getKey(), currentOutput);
+ }
+ item.setAmount(item.getAmount() - amountToMove);
+ return true;
+ }
+ case FURNACE: {
+ FurnaceInventory furnaceInventory = (FurnaceInventory) destinationInventory;
+
+ boolean isFuel = (plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? item.getType().isFuel() : Methods.isLegacyFuel(item.getType())) && !item.getType().name().contains("LOG");
+ ItemStack output = isFuel ? furnaceInventory.getFuel() : furnaceInventory.getSmelting();
+ if (output != null && !output.isSimilar(itemToMove)) return false;
+ int maxSize = itemToMove.getMaxStackSize();
+ int currentOutputAmount = output == null ? 0 : output.getAmount();
+
+ if (currentOutputAmount + amountToMove <= maxSize) {
+ if (output != null) {
+ output.setAmount(currentOutputAmount + amountToMove);
+ } else {
+ output = itemToMove;
+ }
+ if (isFuel) {
+ furnaceInventory.setFuel(output);
+ } else {
+ furnaceInventory.setSmelting(output);
+ }
+ item.setAmount(item.getAmount() - amountToMove);
+ }
+ return true;
+ }
+ }
+
+ // Continue if move would fail.
+ if (!canMove(destinationInventory, itemToMove))
+ return false;
+
+ // Move item to destination.
+ destinationInventory.addItem(itemToMove);
+
+ // Debt hopper
+ item.setAmount(item.getAmount() - amountToMove);
+
+ // Update comparators for destination hopper.
+ updateAdjacentComparators(((BlockState) currentDestination).getLocation());
+
+ // Update comparators for current hopper.
+ updateAdjacentComparators(hopper.getLocation());
+
+ // Prevent item from being moved again during this cycle.
+ this.blacklist.add(itemToMove);
+
+ // Continue to next hopper.
+ return true;
+ }
+
+ private InventoryHolder getFilterEndpoint(com.songoda.epichoppers.hopper.Hopper hopper) {
+ // Get endpoint location.
+ Location endPoint = hopper.getFilter().getEndPoint();
+
+ // Check for null.
+ if (hopper.getFilter().getEndPoint() == null) return null;
+
+ // Make sure chunk is loaded.
+ if (!endPoint.getWorld().isChunkLoaded(endPoint.getBlockX() >> 4, endPoint.getBlockZ() >> 4))
+ return null;
+
+ // Cast to state.
+ BlockState state = endPoint.getBlock().getState();
+
+ //Remove if not a container.
+ if (!(state instanceof InventoryHolder)) {
+ hopper.getFilter().setEndPoint(null);
+ return null;
+ }
+
+ // Cast and return as InventoryHolder.
+ return (InventoryHolder) state;
+ }
+
+ private Class> clazzCraftWorld, clazzCraftBlock, clazzBlockPosition;
+ private Method getHandle, updateAdjacentComparators, getNMS, getBlock;
+
+ private void updateAdjacentComparators(Location location) {
+ try {
+ // Cache reflection.
+ if (clazzCraftWorld == null) {
+ String ver = Bukkit.getServer().getClass().getPackage().getName().substring(23);
+ clazzCraftWorld = Class.forName("org.bukkit.craftbukkit." + ver + ".CraftWorld");
+ clazzCraftBlock = Class.forName("org.bukkit.craftbukkit." + ver + ".block.CraftBlock");
+ clazzBlockPosition = Class.forName("net.minecraft.server." + ver + ".BlockPosition");
+ Class> clazzWorld = Class.forName("net.minecraft.server." + ver + ".World");
+ Class> clazzIBlockData = Class.forName("net.minecraft.server." + ver + ".IBlockData");
+ Class> clazzBlock = Class.forName("net.minecraft.server." + ver + ".Block");
+
+ getHandle = clazzCraftWorld.getMethod("getHandle");
+ updateAdjacentComparators = clazzWorld.getMethod("updateAdjacentComparators", clazzBlockPosition, clazzBlock);
+ getNMS = clazzCraftBlock.getMethod("getNMS");
+ getBlock = clazzIBlockData.getMethod("getBlock");
+ }
+
+ // invoke and cast objects.
+ Object craftWorld = clazzCraftWorld.cast(location.getWorld());
+ Object world = getHandle.invoke(craftWorld);
+ Object craftBlock = clazzCraftBlock.cast(location.getBlock());
+ Object iBlockData = getNMS.invoke(craftBlock);
+
+ // Invoke final method.
+ updateAdjacentComparators
+ .invoke(world, clazzBlockPosition.getConstructor(double.class, double.class, double.class)
+ .newInstance(location.getX(), location.getY(), location.getZ()),
+ getBlock.invoke(iBlockData));
+
+ } catch (ReflectiveOperationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private boolean canMove(Inventory inventory, ItemStack item) {
+ if (inventory.firstEmpty() != -1) return true;
+ for (ItemStack stack : inventory.getContents()) {
+ if (stack.isSimilar(item) && (stack.getAmount() + item.getAmount()) - 1 < stack.getMaxStackSize()) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/ConfigWrapper.java b/src/main/java/com/songoda/epichoppers/utils/ConfigWrapper.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/ConfigWrapper.java
rename to src/main/java/com/songoda/epichoppers/utils/ConfigWrapper.java
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/CostType.java b/src/main/java/com/songoda/epichoppers/utils/CostType.java
similarity index 88%
rename from EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/CostType.java
rename to src/main/java/com/songoda/epichoppers/utils/CostType.java
index 55e885f..a615d55 100644
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/CostType.java
+++ b/src/main/java/com/songoda/epichoppers/utils/CostType.java
@@ -1,4 +1,4 @@
-package com.songoda.epichoppers.api;
+package com.songoda.epichoppers.utils;
/**
* Represents a cost type when making a purchase from EpicSpawners
diff --git a/src/main/java/com/songoda/epichoppers/utils/HopperDirection.java b/src/main/java/com/songoda/epichoppers/utils/HopperDirection.java
new file mode 100644
index 0000000..374015c
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/utils/HopperDirection.java
@@ -0,0 +1,60 @@
+package com.songoda.epichoppers.utils;
+
+import org.bukkit.Location;
+
+public enum HopperDirection {
+
+ DOWN(0, 8, 0, -1, 0),
+ NORTH(2, 10, 0, 0, -1),
+ SOUTH(3, 11, 0, 0, 1),
+ WEST(4, 12, -1, 0, 0),
+ EAST(5, 13, 1, 0, 0);
+
+ private int unpowered;
+ private int powered;
+
+ private int x;
+ private int y;
+ private int z;
+
+ HopperDirection(int unpowered, int powered, int x, int y, int z) {
+ this.unpowered = unpowered;
+ this.powered = powered;
+
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ }
+
+ public static HopperDirection getDirection(int value) {
+ for (HopperDirection hopperDirection : HopperDirection.values()) {
+ if (hopperDirection.getPowered() == value
+ || hopperDirection.getUnpowered() == value) return hopperDirection;
+ }
+ return null;
+ }
+
+ public Location getLocation(Location location) {
+ return location.add(getX(), getY(), getZ());
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public int getZ() {
+ return z;
+ }
+
+ public int getUnpowered() {
+ return unpowered;
+ }
+
+ public int getPowered() {
+ return powered;
+ }
+}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Methods.java b/src/main/java/com/songoda/epichoppers/utils/Methods.java
similarity index 69%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Methods.java
rename to src/main/java/com/songoda/epichoppers/utils/Methods.java
index 6354d5a..5d855dd 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Methods.java
+++ b/src/main/java/com/songoda/epichoppers/utils/Methods.java
@@ -1,6 +1,6 @@
package com.songoda.epichoppers.utils;
-import com.songoda.epichoppers.EpicHoppersPlugin;
+import com.songoda.epichoppers.EpicHoppers;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
@@ -22,8 +22,81 @@ public class Methods {
private static Map serializeCache = new HashMap<>();
+ public static boolean isLegacyFuel(Material material) {
+ if (material == null) return false;
+ switch(material.ordinal() + 1) {
+ case 6:
+ case 7:
+ case 18:
+ case 26:
+ case 36:
+ case 48:
+ case 54:
+ case 55:
+ case 59:
+ case 66:
+ case 73:
+ case 85:
+ case 86:
+ case 97:
+ case 100:
+ case 101:
+ case 108:
+ case 127:
+ case 135:
+ case 136:
+ case 137:
+ case 144:
+ case 147:
+ case 152:
+ case 163:
+ case 164:
+ case 165:
+ case 172:
+ case 174:
+ case 184:
+ case 185:
+ case 186:
+ case 187:
+ case 188:
+ case 189:
+ case 190:
+ case 191:
+ case 192:
+ case 193:
+ case 260:
+ case 262:
+ case 267:
+ case 268:
+ case 269:
+ case 270:
+ case 279:
+ case 280:
+ case 289:
+ case 322:
+ case 323:
+ case 326:
+ case 332:
+ case 345:
+ case 368:
+ case 424:
+ case 426:
+ case 427:
+ case 428:
+ case 429:
+ case 430:
+ case 443:
+ case 444:
+ case 445:
+ case 446:
+ case 447:
+ return true;
+ default:
+ return false;
+ }
+ }
+
public static boolean isSync(Player p) {
- try {
if (p.getItemInHand().hasItemMeta()
&& p.getItemInHand().getType() != Material.AIR
&& p.getItemInHand().getType() != Material.ENCHANTED_BOOK
@@ -34,42 +107,31 @@ public class Methods {
}
}
}
- } catch (Exception e) {
- Debugger.runReport(e);
- }
return false;
}
public static ItemStack getGlass() {
- try {
- EpicHoppersPlugin instance = EpicHoppersPlugin.getInstance();
- return Methods.getGlass(instance.getConfig().getBoolean("Interfaces.Replace Glass Type 1 With Rainbow Glass"), instance.getConfig().getInt("Interfaces.Glass Type 1"));
- } catch (Exception e) {
- Debugger.runReport(e);
- }
- return null;
+ EpicHoppers instance = EpicHoppers.getInstance();
+ return Methods.getGlass(instance.getConfig().getBoolean("Interfaces.Replace Glass Type 1 With Rainbow Glass"), instance.getConfig().getInt("Interfaces.Glass Type 1"));
}
public static ItemStack getBackgroundGlass(boolean type) {
- try {
- EpicHoppersPlugin instance = EpicHoppersPlugin.getInstance();
- if (type)
- return getGlass(false, instance.getConfig().getInt("Interfaces.Glass Type 2"));
- else
- return getGlass(false, instance.getConfig().getInt("Interfaces.Glass Type 3"));
- } catch (Exception e) {
- Debugger.runReport(e);
- }
- return null;
+ EpicHoppers instance = EpicHoppers.getInstance();
+ if (type)
+ return getGlass(false, instance.getConfig().getInt("Interfaces.Glass Type 2"));
+ else
+ return getGlass(false, instance.getConfig().getInt("Interfaces.Glass Type 3"));
}
private static ItemStack getGlass(Boolean rainbow, int type) {
int randomNum = 1 + (int) (Math.random() * 6);
ItemStack glass;
if (rainbow) {
- glass = new ItemStack(Material.LEGACY_STAINED_GLASS_PANE, 1, (short) randomNum);
+ glass = new ItemStack(EpicHoppers.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ?
+ Material.LEGACY_STAINED_GLASS_PANE : Material.valueOf("STAINED_GLASS_PANE"), 1, (short) randomNum);
} else {
- glass = new ItemStack(Material.LEGACY_STAINED_GLASS_PANE, 1, (short) type);
+ glass = new ItemStack(EpicHoppers.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ?
+ Material.LEGACY_STAINED_GLASS_PANE : Material.valueOf("STAINED_GLASS_PANE"), 1, (short) type);
}
ItemMeta glassmeta = glass.getItemMeta();
glassmeta.setDisplayName("§l");
@@ -78,8 +140,7 @@ public class Methods {
}
public static String formatName(int level, boolean full) {
- try {
- EpicHoppersPlugin instance = EpicHoppersPlugin.getInstance();
+ EpicHoppers instance = EpicHoppers.getInstance();
String name = instance.getLocale().getMessage("general.nametag.nameformat", level);
String info = "";
@@ -88,22 +149,14 @@ public class Methods {
}
return info + Methods.formatText(name);
- } catch (Exception e) {
- Debugger.runReport(e);
- }
- return null;
}
public static void doParticles(Entity entity, Location location) {
- try {
- EpicHoppersPlugin instance = EpicHoppersPlugin.getInstance();
+ EpicHoppers instance = EpicHoppers.getInstance();
location.setX(location.getX() + .5);
location.setY(location.getY() + .5);
location.setZ(location.getZ() + .5);
entity.getWorld().spawnParticle(org.bukkit.Particle.valueOf(instance.getConfig().getString("Main.Upgrade Particle Type")), location, 200, .5, .5, .5);
- } catch (Exception e) {
- Debugger.runReport(e);
- }
}
/**
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Metrics.java b/src/main/java/com/songoda/epichoppers/utils/Metrics.java
similarity index 99%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Metrics.java
rename to src/main/java/com/songoda/epichoppers/utils/Metrics.java
index 1923ea3..792f0cd 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Metrics.java
+++ b/src/main/java/com/songoda/epichoppers/utils/Metrics.java
@@ -103,7 +103,7 @@ public class Metrics {
config.options().header(
"bStats collects some data for plugin authors like how many servers are using their plugins.\n" +
"To honor their work, you should not disable it.\n" +
- "This has nearly no effect on the server performance!\n" +
+ "This has nearly blacklist effect on the server performance!\n" +
"Check out https://bStats.org/ to learn more :)"
).copyDefaults(true);
try {
@@ -176,7 +176,7 @@ public class Metrics {
}
}, 1000 * 60 * 5, 1000 * 60 * 30);
// Submit the data every 30 minutes, first time after 5 minutes to give other plugins enough time to start
- // WARNING: Changing the frequency has no effect but your plugin WILL be blocked/deleted!
+ // WARNING: Changing the frequency has blacklist effect but your plugin WILL be blocked/deleted!
// WARNING: Just don't do it!
}
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/MySQLDatabase.java b/src/main/java/com/songoda/epichoppers/utils/MySQLDatabase.java
similarity index 93%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/MySQLDatabase.java
rename to src/main/java/com/songoda/epichoppers/utils/MySQLDatabase.java
index c8253f6..fa70851 100644
--- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/MySQLDatabase.java
+++ b/src/main/java/com/songoda/epichoppers/utils/MySQLDatabase.java
@@ -1,6 +1,6 @@
package com.songoda.epichoppers.utils;
-import com.songoda.epichoppers.EpicHoppersPlugin;
+import com.songoda.epichoppers.EpicHoppers;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -8,11 +8,11 @@ import java.sql.SQLException;
public class MySQLDatabase {
- private final EpicHoppersPlugin instance;
+ private final EpicHoppers instance;
private Connection connection;
- public MySQLDatabase(EpicHoppersPlugin instance) {
+ public MySQLDatabase(EpicHoppers instance) {
this.instance = instance;
try {
Class.forName("com.mysql.jdbc.Driver");
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Serializers.java b/src/main/java/com/songoda/epichoppers/utils/Serializers.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/Serializers.java
rename to src/main/java/com/songoda/epichoppers/utils/Serializers.java
diff --git a/src/main/java/com/songoda/epichoppers/utils/ServerVersion.java b/src/main/java/com/songoda/epichoppers/utils/ServerVersion.java
new file mode 100644
index 0000000..34f6ca5
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/utils/ServerVersion.java
@@ -0,0 +1,27 @@
+package com.songoda.epichoppers.utils;
+
+public enum ServerVersion {
+
+ UNKNOWN("unknown_server_version"),
+ V1_7("org.bukkit.craftbukkit.v1_7"),
+ V1_8("org.bukkit.craftbukkit.v1_8"),
+ V1_9("org.bukkit.craftbukkit.v1_9"),
+ V1_10("org.bukkit.craftbukkit.v1_10"),
+ V1_11("org.bukkit.craftbukkit.v1_11"),
+ V1_12("org.bukkit.craftbukkit.v1_12"),
+ V1_13("org.bukkit.craftbukkit.v1_13"),
+ V1_14("org.bukkit.craftbukkit.v1_14");
+
+
+ private final String packagePrefix;
+
+ ServerVersion(String packagePrefix) {
+ this.packagePrefix = packagePrefix;
+ }
+
+ public static ServerVersion fromPackageName(String packageName) {
+ for (ServerVersion version : values())
+ if (packageName.startsWith(version.packagePrefix)) return version;
+ return ServerVersion.UNKNOWN;
+ }
+}
\ No newline at end of file
diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/TeleportTrigger.java b/src/main/java/com/songoda/epichoppers/utils/TeleportTrigger.java
similarity index 61%
rename from EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/TeleportTrigger.java
rename to src/main/java/com/songoda/epichoppers/utils/TeleportTrigger.java
index 60b48cf..f70b0d7 100644
--- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/TeleportTrigger.java
+++ b/src/main/java/com/songoda/epichoppers/utils/TeleportTrigger.java
@@ -1,4 +1,4 @@
-package com.songoda.epichoppers.api.hopper;
+package com.songoda.epichoppers.utils;
public enum TeleportTrigger {
DISABLED,
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java b/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java
rename to src/main/java/com/songoda/epichoppers/utils/gui/AbstractGUI.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/Clickable.java b/src/main/java/com/songoda/epichoppers/utils/gui/Clickable.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/Clickable.java
rename to src/main/java/com/songoda/epichoppers/utils/gui/Clickable.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/OnClose.java b/src/main/java/com/songoda/epichoppers/utils/gui/OnClose.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/OnClose.java
rename to src/main/java/com/songoda/epichoppers/utils/gui/OnClose.java
diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/Range.java b/src/main/java/com/songoda/epichoppers/utils/gui/Range.java
similarity index 100%
rename from EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/utils/gui/Range.java
rename to src/main/java/com/songoda/epichoppers/utils/gui/Range.java
diff --git a/src/main/java/com/songoda/epichoppers/utils/settings/Category.java b/src/main/java/com/songoda/epichoppers/utils/settings/Category.java
new file mode 100644
index 0000000..4fbec92
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/utils/settings/Category.java
@@ -0,0 +1,29 @@
+package com.songoda.epicspawners.utils.settings;
+
+public enum Category {
+
+ ECONOMY("Settings regarding economy.",
+ "Only one economy option can be used at a time. If you enable more than",
+ "one of these the first one will be used."),
+ SPAWNER_BOOSTING("These are settings regarding the boosting of spawners."),
+ SPAWNER_DROPS("These are settings regarding spawner drops."),
+ ENTITY("These are settings regarding entities."),
+ MAIN("General settings and options."),
+ MAIN_EQUATIONS("These are settings relating to equations."),
+ INTERFACES("These settings allow you to alter the way interfaces look.",
+ "They are used in GUI's to make patterns, change them up then open up a",
+ "GUI to see how it works."),
+ DATABASE("Settings regarding the Database."),
+ SYSTEM("System related settings.");
+
+ private String[] comments;
+
+
+ Category(String... comments) {
+ this.comments = comments;
+ }
+
+ public String[] getComments() {
+ return comments;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/songoda/epichoppers/utils/settings/Setting.java b/src/main/java/com/songoda/epichoppers/utils/settings/Setting.java
new file mode 100644
index 0000000..f6d5d32
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/utils/settings/Setting.java
@@ -0,0 +1,300 @@
+package com.songoda.epicspawners.utils.settings;
+
+import com.songoda.epicspawners.EpicSpawners;
+import com.songoda.epicspawners.utils.ServerVersion;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public enum Setting {
+
+ SPAWNERS_MAX("Main.Spawner Max Upgrade", 5,
+ "The maximum level a spawner can be upgraded to."),
+
+ NAME_FORMAT("Main.Spawner Name Format", "&e{TYPE} &fSpawner [&c{AMT}x]",
+ "The text displayed in the hologram positioned above every spawner."),
+
+ FORCE_COMBINE_RADIUS("Main.Force Combine Radius", 0,
+ "Spawners placed next to each other within this radius will automatically",
+ "combine with each other."),
+
+ FORCE_COMBINE_DENY("Main.Deny Place On Force Combine", false,
+ "Prevent spawners from being placed next to each other within the specified radius."),
+
+ SEARCH_RADIUS("Main.Radius To Search Around Spawners", "8x4x8",
+ "The radius checked around a spawner before spawning entities.",
+ "By default this is used to make sure there are no more than 7 entities",
+ "around any single spawner."),
+
+ ALERT_PLACE_BREAK("Main.Alerts On Place And Break", true,
+ "Toggle an alerting chat message after triggered by placing or breaking a spawner."),
+
+ SNEAK_FOR_STACK("Main.Sneak To Receive A Stacked Spawner", true,
+ "Toggle ability to receive a stacked spawner when breaking a spawner while sneaking."),
+
+ SPAWNER_HOLOGRAMS("Main.Spawners Have Holograms", true,
+ "Toggle holograms showing above spawners."),
+
+ ONLY_DROP_PLACED("Main.Only Drop Placed Spawner", false,
+ "Should natural mob spawners drop upon being broken?"),
+
+ ONLY_CHARGE_NATURAL("Main.Only Charge Natural Spawners", false,
+ "Should map generated spawners charge a price in order to be broken?",
+ "You can configure the cost for each spawner type in the Spawners.yml."),
+
+ CUSTOM_SPAWNER_TICK_RATE("Main.Custom Spawner Tick Rate", 10,
+ "The tick rate in which spawners will attempt to spawn.",
+ "Making this smaller or larger will not effect a spawners spawn rate as",
+ "this value only effects the frequency in which a spawn attempt is triggered."),
+
+ RANDOM_LOW_HIGH("Main.Random Amount Added To Each Spawn", "1:4",
+ "Spawners will always spawn a single entity for every level it contains multiplied",
+ "by a random number generated between (by default) 1 and 4.",
+ "For example if the random number 3 is generated then by default",
+ "a level 5 spawner will spawn (5 * 3) entities which would be 15."),
+
+ SOUNDS_ENABLED("Main.Sounds Enabled", true,
+ "Toggles various sound effects used throughout the plugin."),
+
+ DISPLAY_LEVEL_ONE("Main.Display Level In Spawner Title If Level 1", false,
+ "Should a spawners hologram display its level if it's level one?"),
+
+ OMNI_SPAWNERS("Main.OmniSpawners Enabled", true,
+ "Should spawners of different mob types be stackable into a single spawner?"),
+
+ EGGS_CONVERT_SPAWNERS("Main.Convert Spawners With Eggs", true,
+ "Ability to change mob spawner type with spawn eggs."),
+
+ HELPFUL_TIPS_ENABLED("Main.Display Helpful Tips For Operators", true,
+ "Show tips to server operators."),
+
+ UPGRADE_WITH_ECO_ENABLED("Main.Upgrade With Economy", true,
+ "Can spawners be upgraded with money?"),
+
+ UPGRADE_WITH_XP_ENABLED("Main.Upgrade With XP", true,
+ "Can spawners be upgraded with XP levels?"),
+
+ UPGRADE_COST_ECONOMY("Main.Cost To Upgrade With Economy", 10000,
+ "Cost to upgrade a spawners level."),
+
+ UPGRADE_COST_EXPERIANCE("Main.Cost To Upgrade With XP", 50,
+ "Experience cost to upgrade a spawners level."),
+
+ USE_CUSTOM_UPGRADE_EQUATION("Main.Use Custom Equations for Upgrade Costs", false,
+ "Should custom equations be used to generate upgrade costs?"),
+
+ LIQUID_REPEL_RADIUS("Main.Spawner Repel Liquid Radius", 1,
+ "Prevent water from flowing next to or on top of a spawner within the here declared radius.",
+ "Set to 0 to disable."),
+
+ REDSTONE_ACTIVATE("Main.Redstone Power Deactivates Spawners", true,
+ "Does redstone power disable a spawner?"),
+
+ DISPLAY_HELP_BUTTON("Main.Display Help Button In Spawner Overview", true,
+ "should the button be visible in each spawners overview GUI."),
+
+ SPAWNERS_DONT_EXPLODE("Main.Prevent Spawners From Exploding", false,
+ "Should spawners break when blown up?"),
+
+ SPAWNERS_TO_INVENTORY("Main.Add Spawners To Inventory On Drop", false,
+ "Should broken spawners be added directly to the players inventory?",
+ "Alternatively they will drop to the ground?"),
+
+ UPGRADE_PARTICLE_TYPE("Main.Upgrade Particle Type", "SPELL_WITCH",
+ "The name of the particle shown when upgrading a spawner."),
+
+ EXTRA_SPAWN_TICKS("Main.Extra Ticks Added To Each Spawn", 0,
+ "After every spawner successfully spawns, a new delay is added to it.",
+ "That delay is different for every spawner type and can be configured in the Spawners.yml",
+ "The number configured here is then added to that delay."),
+
+ MAX_SPAWNERS("Main.Max Spawners Per Player", -1,
+ "The maximum amount of spawners a player can place. Set to -1 to allow unlimited",
+ "spawner placement."),
+
+ AUTOSAVE("Main.Auto Save Interval In Seconds", 15,
+ "The amount of time in between saving to file.",
+ "This is purely a safety function to prevent against unplanned crashes or",
+ "restarts. With that said it is advised to keep this enabled.",
+ "If however you enjoy living on the edge, feel free to turn it off."),
+
+ NO_AI("Main.Nerf Spawner Mobs", false,
+ "If enabled mobs spawned by spawners will not move or attack."),
+
+ COST_EQUATION_EXPERIANCE("Main.Equations.Calculate XP Upgrade Cost", "{XPCost} * {Level}",
+ "The equation used to calculate the experience upgrade cost."),
+
+ COST_EQUATION_ECONOMY("Main.Equations.Calculate Economy Upgrade Cost", "{ECOCost} * {Level}",
+ "The equation used to calculate the economy upgrade cost."),
+
+ SPAWNER_EQUATION_SPAWNS("Main.Equations.Mobs Spawned Per Spawn", "{MULTI} * {RAND}",
+ "The equation that defines the amount of mobs a spawner will spawn each time it is triggered."),
+
+ NAMED_SPAWNER_TIERS("Main.Named Spawners Tiers", false,
+ "Whether or not spawners will have names rather than numbers."),
+
+ TIER_NAMES("Main.Tier Names", Arrays.asList("&7Common", "&6Uncommon", "&4Rare", "&5Mythic"),
+ "The names of each spawner tier.",
+ "Where one spawner is common, two is uncommon, three is rate, and four and mythic."),
+
+ MAX_PLAYER_BOOST("Spawner Boosting.Max Multiplier For A Spawner Boost", 5,
+ "The highest multiplier a spawner can be boosted to."),
+
+ BOOST_COST("Spawner Boosting.Item Charged For A Boost", "DIAMOND:2",
+ "The cost required when a player boosts their own spawner.",
+ "If you would rather charge experience or economy then enter respectively",
+ "ECO or XP in place of the default DIAMOND."),
+
+ HOSTILE_MOBS_ATTACK_SECOND("entity.Hostile Mobs Attack Second", false,
+ "Should hostile mobs attack only if attacked first?"),
+
+ ONLY_DROP_STACKED("Spawner Drops.Only Drop Stacked Spawners", false,
+ "Should stacked spawners always drop their whole stack when broken?"),
+
+ MOB_KILLING_COUNT("Spawner Drops.Allow Killing Mobs To Drop Spawners", true,
+ "Should spawners drop when enough mobs of that spawners type are killed?"),
+
+ COUNT_UNNATURAL_KILLS("Spawner Drops.Count Unnatural Kills Towards Spawner Drop", false,
+ "Can mobs from spawners count towards the spawner drop count?"),
+
+ KILL_GOAL("Spawner Drops.Kills Needed for Drop", 100,
+ "Amount of mob kills required to drop a spawner."),
+
+ ALERT_INTERVAL("Spawner Drops.Alert Every X Before Drop", 10,
+ "Alert players every x amount of kills before dropping spawner."),
+
+ DROP_ON_CREEPER_EXPLOSION("Spawner Drops.Drop On Creeper Explosion", true,
+ "Should a spawner destroyed by a creeper drop?"),
+
+ DROP_ON_TNT_EXPLOSION("Spawner Drops.Drop On TNT Explosion", true,
+ "Should a spawner destroyed by TNT drop?"),
+
+ EXPLOSION_DROP_CHANCE_TNT("Spawner Drops.Chance On TNT Explosion", "100%",
+ "Chance of a TNT explosion dropping a spawner."),
+
+ EXPLOSION_DROP_CHANCE_CREEPER("Spawner Drops.Chance On Creeper Explosion", "100%",
+ "Chance of a creeper explosion dropping a spawner."),
+
+ SILKTOUCH_SPAWNERS("Spawner Drops.Drop On SilkTouch", true,
+ "Do spawners drop when broken with a pick enchanted with silk touch?"),
+
+ SILKTOUCH_MIN_LEVEL("Spawner Drops.Minimum Required Silktouch Level", 1,
+ "What level of silk touch is required to drop a spawner?"),
+
+ SILKTOUCH_NATURAL_SPAWNER_DROP_CHANCE("Spawner Drops.Chance On Natural Silktouch", "100%",
+ "Chance of a natural spawner dropping with silk touch."),
+
+ SILKTOUCH_PLACED_SPAWNER_DROP_CHANCE("Spawner Drops.Chance On Placed Silktouch", "100%",
+ "Chance of a placed spawner dropping with silk touch."),
+
+ VAULT_ECONOMY("Economy.Use Vault Economy", true,
+ "Should Vault be used?"),
+
+ PLAYER_POINTS_ECONOMY("Economy.Use Player Points Economy", false,
+ "Should PlayerPoints be used?"),
+
+ EXIT_ICON("Interfaces.Exit Icon", EpicSpawners.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "OAK_DOOR" : "WOOD_DOOR",
+ "Item to be displayed as the icon for exiting the interface."),
+
+ BUY_ICON("Interfaces.Buy Icon", "EMERALD",
+ "Item to be displayed as the icon for buying a spawner."),
+
+ ECO_ICON("Interfaces.Economy Icon", EpicSpawners.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "SUNFLOWER" : "DOUBLE_PLANT",
+ "Item to be displayed as the icon for economy upgrades."),
+
+ XP_ICON("Interfaces.XP Icon", EpicSpawners.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "EXPERIENCE_BOTTLE" : "EXP_BOTTLE",
+ "Item to be displayed as the icon for XP upgrades."),
+
+ GLASS_TYPE_1("Interfaces.Glass Type 1", 7),
+ GLASS_TYPE_2("Interfaces.Glass Type 2", 11),
+ GLASS_TYPE_3("Interfaces.Glass Type 3", 3),
+ RAINBOW_GLASS("Interfaces.Replace Glass Type 1 With Rainbow Glass", false),
+
+ DATABASE_SUPPORT("Database.Activate Mysql Support", false,
+ "Should MySQL be used for data storage?"),
+
+ DATABASE_IP("Database.IP", "127.0.0.1",
+ "MySQL IP"),
+
+ DATABASE_PORT("Database.Port", 3306,
+ "MySQL Port"),
+
+ DATABASE_NAME("Database.Database Name", "EpicSpawners",
+ "The database you are inserting data into."),
+
+ DATABASE_PREFIX("Database.Prefix", "ES-",
+ "The prefix for tables inserted into the database."),
+
+ DATABASE_USERNAME("Database.Username", "PUT_USERNAME_HERE",
+ "MySQL Username"),
+
+ DATABASE_PASSWORD("Database.Password", "PUT_PASSWORD_HERE",
+ "MySQL Password"),
+
+ LANGUGE_MODE("System.Language Mode", "en_US",
+ "The enabled language file.",
+ "More language files (if available) can be found in the plugins data folder.");
+
+ private String setting;
+ private Object option;
+ private String[] comments;
+
+ Setting(String setting, Object option, String... comments) {
+ this.setting = setting;
+ this.option = option;
+ this.comments = comments;
+ }
+
+ Setting(String setting, Object option) {
+ this.setting = setting;
+ this.option = option;
+ this.comments = null;
+ }
+
+ public static Setting getSetting(String setting) {
+ List settings = Arrays.stream(values()).filter(setting1 -> setting1.setting.equals(setting)).collect(Collectors.toList());
+ if (settings.isEmpty()) return null;
+ return settings.get(0);
+ }
+
+ public String getSetting() {
+ return setting;
+ }
+
+ public Object getOption() {
+ return option;
+ }
+
+ public String[] getComments() {
+ return comments;
+ }
+
+ public List getStringList() {
+ return EpicSpawners.getInstance().getConfig().getStringList(setting);
+ }
+
+ public boolean getBoolean() {
+ return EpicSpawners.getInstance().getConfig().getBoolean(setting);
+ }
+
+ public int getInt() {
+ return EpicSpawners.getInstance().getConfig().getInt(setting);
+ }
+
+ public long getLong() {
+ return EpicSpawners.getInstance().getConfig().getLong(setting);
+ }
+
+ public String getString() {
+ return EpicSpawners.getInstance().getConfig().getString(setting);
+ }
+
+ public char getChar() {
+ return EpicSpawners.getInstance().getConfig().getString(setting).charAt(0);
+ }
+
+ public double getDouble() {
+ return EpicSpawners.getInstance().getConfig().getDouble(setting);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/songoda/epichoppers/utils/settings/SettingsManager.java b/src/main/java/com/songoda/epichoppers/utils/settings/SettingsManager.java
new file mode 100644
index 0000000..a08c29f
--- /dev/null
+++ b/src/main/java/com/songoda/epichoppers/utils/settings/SettingsManager.java
@@ -0,0 +1,309 @@
+package com.songoda.epicspawners.utils.settings;
+
+import com.songoda.epicspawners.EpicSpawners;
+import com.songoda.epicspawners.utils.Methods;
+import com.songoda.epicspawners.utils.ServerVersion;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.event.player.AsyncPlayerChatEvent;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.io.*;
+import java.util.*;
+
+/**
+ * Created by songoda on 6/4/2017.
+ */
+public class SettingsManager implements Listener {
+
+ private final EpicSpawners plugin;
+ private Map cat = new HashMap<>();
+ private Map current = new HashMap<>();
+
+ public SettingsManager(EpicSpawners plugin) {
+ this.plugin = plugin;
+ Bukkit.getPluginManager().registerEvents(this, plugin);
+ }
+
+ @EventHandler
+ public void onInventoryClick(InventoryClickEvent event) {
+ ItemStack clickedItem = event.getCurrentItem();
+
+ if (event.getInventory() != event.getWhoClicked().getOpenInventory().getTopInventory()
+ || clickedItem == null || !clickedItem.hasItemMeta()
+ || !clickedItem.getItemMeta().hasDisplayName()) {
+ return;
+ }
+
+ if (event.getView().getTitle().equals(plugin.getName() + " Settings Manager")) {
+ event.setCancelled(true);
+ if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
+
+ String type = ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
+ this.cat.put((Player) event.getWhoClicked(), type);
+ this.openEditor((Player) event.getWhoClicked());
+ } else if (event.getView().getTitle().equals(plugin.getName() + " Settings Editor")) {
+ event.setCancelled(true);
+ if (clickedItem.getType().name().contains("STAINED_GLASS")) return;
+
+ Player player = (Player) event.getWhoClicked();
+
+ String key = cat.get(player) + "." + ChatColor.stripColor(clickedItem.getItemMeta().getDisplayName());
+
+ if (plugin.getConfig().get(key).getClass().getName().equals("java.lang.Boolean")) {
+ this.plugin.getConfig().set(key, !plugin.getConfig().getBoolean(key));
+ this.finishEditing(player);
+ } else {
+ this.editObject(player, key);
+ }
+ }
+ }
+
+ @EventHandler
+ public void onChat(AsyncPlayerChatEvent event) {
+ Player player = event.getPlayer();
+ if (!current.containsKey(player)) return;
+
+ String value = current.get(player);
+ FileConfiguration config = plugin.getConfig();
+ if (config.isLong(value)) {
+ config.set(value, Long.parseLong(event.getMessage()));
+ } else if (config.isInt(value)) {
+ config.set(value, Integer.parseInt(event.getMessage()));
+ } else if (config.isDouble(value)) {
+ config.set(value, Double.parseDouble(event.getMessage()));
+ } else if (config.isString(value)) {
+ config.set(value, event.getMessage());
+ }
+
+ Bukkit.getScheduler().scheduleSyncDelayedTask(EpicSpawners.getInstance(), () ->
+ this.finishEditing(player), 0L);
+
+ event.setCancelled(true);
+ }
+
+ private void finishEditing(Player player) {
+ this.current.remove(player);
+ this.saveConfig();
+ this.openEditor(player);
+ }
+
+ private void editObject(Player player, String current) {
+ this.current.put(player, ChatColor.stripColor(current));
+
+ player.closeInventory();
+ player.sendMessage("");
+ player.sendMessage(Methods.formatText("&7Please enter a value for &6" + current + "&7."));
+ if (plugin.getConfig().isInt(current) || plugin.getConfig().isDouble(current)) {
+ player.sendMessage(Methods.formatText("&cUse only numbers."));
+ }
+ player.sendMessage("");
+ }
+
+ public void openSettingsManager(Player player) {
+ Inventory inventory = Bukkit.createInventory(null, 27, plugin.getName() + " Settings Manager");
+ ItemStack glass = Methods.getGlass();
+ for (int i = 0; i < inventory.getSize(); i++) {
+ inventory.setItem(i, glass);
+ }
+
+ int slot = 10;
+ for (String key : plugin.getConfig().getDefaultSection().getKeys(false)) {
+ ItemStack item = new ItemStack(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.LEGACY_WOOL : Material.valueOf("WOOL"), 1, (byte) (slot - 9));
+ ItemMeta meta = item.getItemMeta();
+ meta.setLore(Collections.singletonList(Methods.formatText("&6Click To Edit This Category.")));
+ meta.setDisplayName(Methods.formatText("&f&l" + key));
+ item.setItemMeta(meta);
+ inventory.setItem(slot, item);
+ slot++;
+ }
+
+ player.openInventory(inventory);
+ }
+
+ private void openEditor(Player player) {
+ Inventory inventory = Bukkit.createInventory(null, 54, plugin.getName() + " Settings Editor");
+ FileConfiguration config = plugin.getConfig();
+
+ int slot = 0;
+ for (String key : config.getConfigurationSection(cat.get(player)).getKeys(true)) {
+ String fKey = cat.get(player) + "." + key;
+ ItemStack item = new ItemStack(Material.DIAMOND_HELMET);
+ ItemMeta meta = item.getItemMeta();
+ meta.setDisplayName(Methods.formatText("&6" + key));
+
+ List lore = new ArrayList<>();
+ if (config.isBoolean(fKey)) {
+ item.setType(Material.LEVER);
+ lore.add(Methods.formatText(config.getBoolean(fKey) ? "&atrue" : "&cfalse"));
+ } else if (config.isString(fKey)) {
+ item.setType(Material.PAPER);
+ lore.add(Methods.formatText("&7" + config.getString(fKey)));
+ } else if (config.isInt(fKey)) {
+ item.setType(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
+ lore.add(Methods.formatText("&7" + config.getInt(fKey)));
+ } else if (config.isLong(fKey)) {
+ item.setType(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
+ lore.add(Methods.formatText("&7" + config.getLong(fKey)));
+ } else if (config.isDouble(fKey)) {
+ item.setType(plugin.isServerVersionAtLeast(ServerVersion.V1_13) ? Material.CLOCK : Material.valueOf("WATCH"));
+ lore.add(Methods.formatText("&7" + config.getDouble(fKey)));
+ }
+
+ Setting setting = Setting.getSetting(fKey);
+
+ if (setting != null && setting.getComments() != null) {
+ lore.add("");
+
+ String comment = String.join(" ", setting.getComments());
+
+ int lastIndex = 0;
+ for (int n = 0; n < comment.length(); n++) {
+ if (n - lastIndex < 30)
+ continue;
+
+ if (comment.charAt(n) == ' ') {
+ lore.add(Methods.formatText("&8" + comment.substring(lastIndex, n).trim()));
+ lastIndex = n;
+ }
+ }
+
+ if (lastIndex - comment.length() < 30)
+ lore.add(Methods.formatText("&8" + comment.substring(lastIndex).trim()));
+
+ }
+
+ meta.setLore(lore);
+ item.setItemMeta(meta);
+
+ inventory.setItem(slot, item);
+ slot++;
+ }
+
+ player.openInventory(inventory);
+ }
+
+ public void reloadConfig() {
+ plugin.reloadConfig();
+ this.setupConfig();
+ }
+
+ public void setupConfig() {
+ FileConfiguration config = plugin.getConfig();
+
+ for (Setting setting : Setting.values()) {
+ config.addDefault(setting.getSetting(), setting.getOption());
+ }
+ plugin.getConfig().options().copyDefaults(true);
+ saveConfig();
+ }
+
+ private void saveConfig() {
+ String dump = plugin.getConfig().saveToString();
+
+ StringBuilder config = new StringBuilder();
+
+ BufferedReader bufReader = new BufferedReader(new StringReader(dump));
+
+ try {
+ boolean first = true;
+
+ String line;
+ int currentTab = 0;
+ String category = "";
+
+ while ((line = bufReader.readLine()) != null) {
+ if (line.trim().startsWith("#")) continue;
+
+ int tabChange = line.length() - line.trim().length();
+ if (currentTab != tabChange) {
+ category = category.contains(".") && tabChange != 0 ? category.substring(0, category.indexOf(".")) : "";
+ currentTab = tabChange;
+ }
+
+ if (line.endsWith(":")) {
+ bufReader.mark(1000);
+ String found = bufReader.readLine();
+ bufReader.reset();
+
+ if (!found.trim().startsWith("-")) {
+
+ String newCategory = line.substring(0, line.length() - 1).trim();
+
+ if (category.equals(""))
+ category = newCategory;
+ else
+ category += "." + newCategory;
+
+ currentTab = tabChange + 2;
+
+ if (!first) {
+ config.append("\n\n");
+ } else {
+ first = false;
+ }
+
+ if (!category.contains("."))
+ config.append("#").append("\n");
+ try {
+ Category categoryObj = Category.valueOf(category.toUpperCase()
+ .replace(" ", "_")
+ .replace(".", "_"));
+
+ config.append(new String(new char[tabChange]).replace('\0', ' '));
+ for (String l : categoryObj.getComments())
+ config.append("# ").append(l).append("\n");
+ } catch (IllegalArgumentException e) {
+ config.append("# ").append(category).append("\n");
+ }
+ if (!category.contains("."))
+ config.append("#").append("\n");
+
+ config.append(line).append("\n");
+
+ continue;
+ }
+ }
+
+ if (line.trim().startsWith("-")) {
+ config.append(line).append("\n");
+ continue;
+ }
+
+ String key = category + "." + (line.split(":")[0].trim());
+ for (Setting setting : Setting.values()) {
+ if (!setting.getSetting().equals(key) || setting.getComments() == null) continue;
+ config.append(" ").append("\n");
+ for (String l : setting.getComments()) {
+ config.append(new String(new char[currentTab]).replace('\0', ' '));
+ config.append("# ").append(l).append("\n");
+ }
+ }
+ config.append(line).append("\n");
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ try {
+ if (!plugin.getDataFolder().exists())
+ plugin.getDataFolder().mkdir();
+ BufferedWriter writer =
+ new BufferedWriter(new FileWriter(new File(plugin.getDataFolder() + File.separator + "config.yml")));
+ writer.write(config.toString());
+ writer.flush();
+ writer.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
diff --git a/EpicHoppers-Plugin/src/main/resources/en_US.lang b/src/main/resources/en_US.lang
similarity index 97%
rename from EpicHoppers-Plugin/src/main/resources/en_US.lang
rename to src/main/resources/en_US.lang
index 2eb997f..7fca323 100644
--- a/EpicHoppers-Plugin/src/main/resources/en_US.lang
+++ b/src/main/resources/en_US.lang
@@ -41,7 +41,7 @@ interface.hopper.blocklore = "|&7BlockBreak is set to &6%enabled%&7."
interface.hopper.synchopper = "&6Click to Link This hopper"
interface.hopper.rejectsync = "&6Click to Link Rejected Items"
interface.filter.infotitle = "&aFilter Guide"
-interface.filter.infolore = "&7Items placed in the leftmost column|&7space will be whitelisted.||&7Items placed in the rightmost column|&7will be void.||&7Items placed in the middle column|&7will be blacklisted.||&cUsing the whitelist will disable|&cboth the blacklist and the void."
+interface.filter.infolore = "&7Items placed in the leftmost column|&7space will be whitelisted.||&7Items placed in the rightmost column|&7will be void.||&7Items placed in the middle column|&7will be blacklisted."
interface.filter.whitelist = "&f&lWhite List"
interface.filter.blacklist = "&8&lBlack List"
interface.filter.void = "&c&lVoid"
diff --git a/EpicHoppers-Plugin/src/main/resources/levels.yml b/src/main/resources/levels.yml
similarity index 100%
rename from EpicHoppers-Plugin/src/main/resources/levels.yml
rename to src/main/resources/levels.yml
diff --git a/EpicHoppers-Plugin/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
similarity index 88%
rename from EpicHoppers-Plugin/src/main/resources/plugin.yml
rename to src/main/resources/plugin.yml
index 1771883..848d6ff 100644
--- a/EpicHoppers-Plugin/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -1,6 +1,6 @@
name: EpicHoppers
description: EpicHoppers
-main: com.songoda.epichoppers.EpicHoppersPlugin
+main: com.songoda.epichoppers.EpicHoppers
softdepend: [LiquidTanks, WildStacker, Towny, RedProtect, Kingdoms, PlotsSquared, GriefPrevention, USkyBlock, ASkyBlock, WorldGuard, Factions, Vault]
version: maven-version-number
author: Songoda