diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 427722a..f260067 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -5,7 +5,7 @@ variables:
name: "UltimateStacker"
suffex: "Legacy"
path: "/builds/$CI_PROJECT_PATH"
- version: "1.2.3"
+ version: "1.2.4"
build:
stage: build
diff --git a/pom.xml b/pom.xml
index d7e4cd6..e7bcfa3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,7 +66,7 @@
org.spigotmc
spigot
- 1.12.2
+ 1.14.1
com.songoda
diff --git a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
index 5426aa5..f8efe2e 100644
--- a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
+++ b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
@@ -3,7 +3,7 @@ package com.songoda.ultimatestacker;
import com.songoda.ultimatestacker.command.CommandManager;
import com.songoda.ultimatestacker.entity.EntityStack;
import com.songoda.ultimatestacker.entity.EntityStackManager;
-import com.songoda.ultimatestacker.events.*;
+import com.songoda.ultimatestacker.listeners.*;
import com.songoda.ultimatestacker.hologram.Hologram;
import com.songoda.ultimatestacker.hologram.HologramHolographicDisplays;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
@@ -14,6 +14,7 @@ import com.songoda.ultimatestacker.storage.types.StorageMysql;
import com.songoda.ultimatestacker.storage.types.StorageYaml;
import com.songoda.ultimatestacker.tasks.StackingTask;
import com.songoda.ultimatestacker.utils.*;
+import com.songoda.ultimatestacker.utils.settings.SettingsManager;
import org.apache.commons.lang.ArrayUtils;
import com.songoda.ultimatestacker.utils.updateModules.LocaleModule;
import com.songoda.update.Plugin;
@@ -63,38 +64,19 @@ public class UltimateStacker extends JavaPlugin {
console.sendMessage(Methods.formatText("&a============================="));
}
- private boolean checkVersion() {
- int maxVersion = 12; // also supports 1.8 and higher
- int currentVersion = Integer.parseInt(Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].split("_")[1]);
-
- if (currentVersion > maxVersion) {
- Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
- Bukkit.getConsoleSender().sendMessage("");
- Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "You installed the legacy (1.8 - 1.12) 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;
- // Check to make sure the Bukkit version is compatible.
- if (!checkVersion()) return;
-
ConsoleCommandSender console = Bukkit.getConsoleSender();
console.sendMessage(Methods.formatText("&a============================="));
console.sendMessage(Methods.formatText("&7UltimateStacker " + this.getDescription().getVersion() + " by &5Songoda <3&7!"));
console.sendMessage(Methods.formatText("&7Action: &aEnabling&7..."));
this.settingsManager = new SettingsManager(this);
- this.commandManager = new CommandManager(this);
+ this.settingsManager.setupConfig();
- settingsManager.updateSettings();
+ this.commandManager = new CommandManager(this);
for (EntityType value : EntityType.values()) {
if (value.isSpawnable() && value.isAlive() && !value.toString().contains("ARMOR")) {
@@ -123,9 +105,6 @@ public class UltimateStacker extends JavaPlugin {
spawnerFile.getConfig().options().copyDefaults(true);
spawnerFile.saveConfig();
- getConfig().options().copyDefaults(true);
- saveConfig();
-
String langMode = getConfig().getString("System.Language Mode");
Locale.init(this);
Locale.saveDefaultLocale("en_US");
@@ -183,7 +162,6 @@ public class UltimateStacker extends JavaPlugin {
PluginManager pluginManager = Bukkit.getPluginManager();
if (isServerVersionAtLeast(ServerVersion.V1_10))
Bukkit.getPluginManager().registerEvents(new BreedListeners(this), this);
- Bukkit.getPluginManager().registerEvents(new SpawnerListeners(this), this);
Bukkit.getPluginManager().registerEvents(new BlockListeners(this), this);
Bukkit.getPluginManager().registerEvents(new DeathListeners(this), this);
Bukkit.getPluginManager().registerEvents(new ShearListeners(this), this);
@@ -221,7 +199,6 @@ public class UltimateStacker extends JavaPlugin {
}
public void reload() {
- settingsManager.updateSettings();
String langMode = getConfig().getString("System.Language Mode");
this.locale = Locale.getLocale(getConfig().getString("System.Language Mode", langMode));
this.locale.reloadMessages();
@@ -229,7 +206,7 @@ public class UltimateStacker extends JavaPlugin {
this.itemFile = new ConfigWrapper(this, "", "items.yml");
this.spawnerFile = new ConfigWrapper(this, "", "spawners.yml");
this.references = new References();
- this.reloadConfig();
+ this.settingsManager.reloadConfig();
}
public boolean spawnersEnabled() {
diff --git a/src/main/java/com/songoda/ultimatestacker/entity/EntityStack.java b/src/main/java/com/songoda/ultimatestacker/entity/EntityStack.java
index 51ef9b8..0e8be00 100644
--- a/src/main/java/com/songoda/ultimatestacker/entity/EntityStack.java
+++ b/src/main/java/com/songoda/ultimatestacker/entity/EntityStack.java
@@ -2,8 +2,8 @@ package com.songoda.ultimatestacker.entity;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.utils.Methods;
-import com.songoda.ultimatestacker.utils.SettingsManager;
import com.songoda.ultimatestacker.utils.ServerVersion;
+import com.songoda.ultimatestacker.utils.settings.Setting;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Entity;
@@ -28,7 +28,7 @@ public class EntityStack {
Entity entity = getEntityByUniqueId(this.entity);
if (entity == null) return;
- entity.setCustomNameVisible(!SettingsManager.Settings.HOLOGRAMS_ON_LOOK_ENTITY.getBoolean());
+ entity.setCustomNameVisible(!Setting.HOLOGRAMS_ON_LOOK_ENTITY.getBoolean());
entity.setCustomName(Methods.compileEntityName(entity, amount));
}
diff --git a/src/main/java/com/songoda/ultimatestacker/events/SpawnerListeners.java b/src/main/java/com/songoda/ultimatestacker/events/SpawnerListeners.java
deleted file mode 100644
index 273dd83..0000000
--- a/src/main/java/com/songoda/ultimatestacker/events/SpawnerListeners.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package com.songoda.ultimatestacker.events;
-
-import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStack;
-import com.songoda.ultimatestacker.utils.Methods;
-import org.bukkit.entity.Entity;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.SpawnerSpawnEvent;
-
-import java.util.List;
-
-public class SpawnerListeners implements Listener {
-
- private UltimateStacker instance;
-
- public SpawnerListeners(UltimateStacker instance) {
- this.instance = instance;
- }
-
- @EventHandler
- public void onSpawner(SpawnerSpawnEvent event) {
- /*
- Entity initalEntity = event.getEntity();
-
- if (!instance.getConfig().getBoolean("Main.Stack Entities")) return;
-
- List entityList = Methods.getSimilarEntitesAroundEntity(initalEntity);
-
- if (entityList.size() == 0) return;
-
- int maxEntityStackSize = instance.getConfig().getInt("Entity.Max Stack Size");
- if (instance.getConfig().getInt("Mobs." + initalEntity.getType().name() + ".Max Stack Size") != -1)
- maxEntityStackSize = instance.getConfig().getInt("Mobs." + initalEntity.getType().name() + ".Max Stack Size");
-
- for (Entity entity : entityList) {
- EntityStack stack = instance.getEntityStackManager().getStack(entity);
-
- //If a stack was found add 1 to this stack.
- if (stack != null && stack.getAmount() < maxEntityStackSize) {
- stack.addAmount(1);
- stack.updateStack();
- initalEntity.remove();
- event.setCancelled(true);
- return;
- }
- }
-
- Bukkit.broadcastMessage(entityList.size() + 1 + "");
-
- if ((entityList.size() + 1) >= instance.getConfig().getInt("Entity.Min Stack Amount")) {
-
- EntityStack stack = instance.getEntityStackManager().addStack(new EntityStack(initalEntity, entityList.size() + 1));
- stack.updateStack();
-
- for (Entity entity : entityList) {
- entity.remove();
- }
- entityList.size();
- }
- */
- }
-
-}
diff --git a/src/main/java/com/songoda/ultimatestacker/hologram/Hologram.java b/src/main/java/com/songoda/ultimatestacker/hologram/Hologram.java
index edfe3c0..ce370da 100644
--- a/src/main/java/com/songoda/ultimatestacker/hologram/Hologram.java
+++ b/src/main/java/com/songoda/ultimatestacker/hologram/Hologram.java
@@ -3,6 +3,7 @@ package com.songoda.ultimatestacker.hologram;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
import com.songoda.ultimatestacker.utils.Methods;
+import com.songoda.ultimatestacker.utils.ServerVersion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -41,7 +42,7 @@ public abstract class Hologram {
public void add(SpawnerStack spawner) {
int amount = spawner.getAmount();
- if (spawner.getLocation().getBlock().getType() != Material.MOB_SPAWNER) return;
+ if (spawner.getLocation().getBlock().getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))) return;
CreatureSpawner creatureSpawner = (CreatureSpawner) spawner.getLocation().getBlock().getState();
String name = Methods.compileSpawnerName(creatureSpawner.getSpawnedType(), amount);
@@ -55,7 +56,7 @@ public abstract class Hologram {
public void update(SpawnerStack spawner) {
int amount = spawner.getAmount();
- if (spawner.getLocation().getBlock().getType() != Material.MOB_SPAWNER) return;
+ if (spawner.getLocation().getBlock().getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))) return;
CreatureSpawner creatureSpawner = (CreatureSpawner) spawner.getLocation().getBlock().getState();
String name = Methods.compileSpawnerName(creatureSpawner.getSpawnedType(), amount);
@@ -70,7 +71,7 @@ public abstract class Hologram {
protected abstract void update(Location location, String line);
public void processChange(Block block) {
- if (block.getType() != Material.MOB_SPAWNER) return;
+ if (block.getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))) return;
SpawnerStack spawner = instance.getSpawnerStackManager().getSpawner(block);
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(instance, () ->
diff --git a/src/main/java/com/songoda/ultimatestacker/events/BlockListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/BlockListeners.java
similarity index 87%
rename from src/main/java/com/songoda/ultimatestacker/events/BlockListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/BlockListeners.java
index 0383bbc..f3351c3 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/BlockListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/BlockListeners.java
@@ -1,14 +1,13 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStackManager;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
import com.songoda.ultimatestacker.utils.Methods;
-import com.songoda.ultimatestacker.utils.SettingsManager;
+import com.songoda.ultimatestacker.utils.ServerVersion;
+import com.songoda.ultimatestacker.utils.settings.Setting;
import org.apache.commons.lang.math.NumberUtils;
import org.bukkit.Bukkit;
import org.bukkit.Material;
-import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.enchantments.Enchantment;
@@ -40,9 +39,9 @@ public class BlockListeners implements Listener {
Player player = event.getPlayer();
ItemStack item = event.getPlayer().getInventory().getItemInHand();
- if (block == null || item == null || block.getType() != Material.MOB_SPAWNER || item.getType() != Material.MOB_SPAWNER || event.getAction() == Action.LEFT_CLICK_BLOCK) return;
+ if (block == null || block.getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER")) || item.getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER")) || event.getAction() == Action.LEFT_CLICK_BLOCK) return;
- List disabledWorlds = SettingsManager.Settings.DISABLED_WORLDS.getStringList();
+ List disabledWorlds = Setting.DISABLED_WORLDS.getStringList();
if (disabledWorlds.stream().anyMatch(worldStr -> event.getPlayer().getWorld().getName().equalsIgnoreCase(worldStr))) return;
if (!instance.spawnersEnabled()) return;
@@ -54,7 +53,7 @@ public class BlockListeners implements Listener {
int itemAmount = getSpawnerAmount(item);
int specific = instance.getSpawnerFile().getConfig().getInt("Spawners." + cs.getSpawnedType().name() + ".Max Stack Size");
- int maxStackSize = specific == -1 ? instance.getConfig().getInt("Spawners.Max Stack Size") : specific;
+ int maxStackSize = specific == -1 ? Setting.MAX_STACK_SPAWNERS.getInt() : specific;
cs = (CreatureSpawner) block.getState();
@@ -96,7 +95,7 @@ public class BlockListeners implements Listener {
if (!event.isCancelled()) {
if (block == null
- || block.getType() != Material.MOB_SPAWNER
+ || block.getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))
|| !instance.spawnersEnabled())
return;
@@ -118,7 +117,7 @@ public class BlockListeners implements Listener {
@EventHandler(priority = EventPriority.HIGHEST)
public void onBlockBreak(BlockBreakEvent event) {
Block block = event.getBlock();
- if (block.getType() != Material.MOB_SPAWNER) return;
+ if (block.getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))) return;
if (!instance.spawnersEnabled()) return;
event.setExpToDrop(0);
diff --git a/src/main/java/com/songoda/ultimatestacker/events/BreedListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/BreedListeners.java
similarity index 96%
rename from src/main/java/com/songoda/ultimatestacker/events/BreedListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/BreedListeners.java
index 1fc4215..400260a 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/BreedListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/BreedListeners.java
@@ -1,4 +1,4 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import org.bukkit.Bukkit;
diff --git a/src/main/java/com/songoda/ultimatestacker/events/DeathListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/DeathListeners.java
similarity index 69%
rename from src/main/java/com/songoda/ultimatestacker/events/DeathListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/DeathListeners.java
index fb80b0c..20152d2 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/DeathListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/DeathListeners.java
@@ -1,15 +1,10 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
-import com.songoda.ultimatestacker.entity.EntityStack;
-import com.songoda.ultimatestacker.entity.EntityStackManager;
import com.songoda.ultimatestacker.utils.Methods;
-import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDeathEvent;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.metadata.FixedMetadataValue;
import java.util.ArrayList;
diff --git a/src/main/java/com/songoda/ultimatestacker/events/EntityListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java
similarity index 93%
rename from src/main/java/com/songoda/ultimatestacker/events/EntityListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java
index ff63ec3..8d3109c 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/EntityListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/EntityListeners.java
@@ -1,10 +1,11 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
import com.songoda.ultimatestacker.entity.EntityStackManager;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
import com.songoda.ultimatestacker.utils.Methods;
+import com.songoda.ultimatestacker.utils.ServerVersion;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -14,7 +15,6 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent;
-import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
@@ -41,7 +41,7 @@ public class EntityListeners implements Listener {
List destroyed = event.blockList();
for (Block block : destroyed) {
- if (block.getType() != Material.MOB_SPAWNER) continue;
+ if (block.getType() != (instance.isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER"))) continue;
Location spawnerLocation = block.getLocation();
SpawnerStack stack = instance.getSpawnerStackManager().getSpawner(spawnerLocation);
diff --git a/src/main/java/com/songoda/ultimatestacker/events/InteractListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/InteractListeners.java
similarity index 71%
rename from src/main/java/com/songoda/ultimatestacker/events/InteractListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/InteractListeners.java
index 93c2855..5bb9d3b 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/InteractListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/InteractListeners.java
@@ -1,25 +1,19 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
+import com.songoda.ultimatestacker.utils.ServerVersion;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityBreedEvent;
-import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.event.entity.SheepDyeWoolEvent;
-import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
-import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.util.Vector;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
public class InteractListeners implements Listener {
@@ -117,42 +111,58 @@ public class InteractListeners implements Listener {
}
private boolean correctFood(ItemStack is, Entity entity) {
+ boolean is13 = instance.isServerVersionAtLeast(ServerVersion.V1_13);
Material type = is.getType();
- switch (entity.getType()) {
- case COW:
- case SHEEP:
+ switch (entity.getType().name()) {
+ case "COW":
+ case "SHEEP":
return type == Material.WHEAT;
- case PIG:
- return (type == Material.CARROT || type == Material.BEETROOT || type == Material.POTATO);
- case CHICKEN:
- return type == Material.SEEDS
+ case "PIG":
+ return type == Material.CARROT || type == Material.BEETROOT || type == Material.POTATO;
+ case "CHICKEN":
+ return type == (is13 ? Material.WHEAT_SEEDS : Material.valueOf("SEEDS"))
|| type == Material.MELON_SEEDS
|| type == Material.BEETROOT_SEEDS
|| type == Material.PUMPKIN_SEEDS;
- case HORSE:
+ case "HORSE":
return (type == Material.GOLDEN_APPLE || type == Material.GOLDEN_CARROT) && ((Horse)entity).isTamed();
- case WOLF:
- return (type == Material.RAW_BEEF
- || type == Material.RAW_CHICKEN
+ case "WOLF":
+ return type == (is13 ? Material.BEEF : Material.valueOf("RAW_BEEF"))
+ || type == (is13 ? Material.CHICKEN : Material.valueOf("RAW_CHICKEN"))
+ || (is13 && type == Material.COD)
|| type == Material.MUTTON
- || type == Material.PORK
+ || type == (is13 ? Material.PORKCHOP : Material.valueOf("PORK"))
|| type == Material.RABBIT
- || type == Material.RAW_FISH
+ || (is13 && type == Material.SALMON)
|| type == Material.COOKED_BEEF
|| type == Material.COOKED_CHICKEN
+ || (is13 && type == Material.COOKED_COD)
|| type == Material.COOKED_MUTTON
- || type == Material.GRILLED_PORK
+ || type == (is13 ? Material.COOKED_PORKCHOP : Material.valueOf("GRILLED_PORK"))
|| type == Material.COOKED_RABBIT
- || type == Material.COOKED_FISH)
+ || (is13 && type == Material.COOKED_SALMON)
&& ((Wolf) entity).isTamed();
- case OCELOT:
- return (type == Material.RAW_FISH)
- && ((Ocelot) entity).isTamed();
- case RABBIT:
- return type == Material.CARROT || type == Material.GOLDEN_CARROT || type == Material.YELLOW_FLOWER;
- case LLAMA:
+ case "OCELOT":
+ return (is13 ? type == Material.SALMON
+ || type == Material.COD
+ || type == Material.PUFFERFISH
+ || type == Material.TROPICAL_FISH
+
+ : type == Material.valueOf("RAW_FISH")); // Now broken in 1.13 ((Ocelot) entity).isTamed()
+ case "PANDA":
+ return (type == Material.BAMBOO);
+ case "FOX":
+ return type == Material.SWEET_BERRIES;
+ case "CAT":
+ return (type == Material.COD || type == Material.SALMON) && ((Cat) entity).isTamed();
+ case "RABBIT":
+ return type == Material.CARROT || type == Material.GOLDEN_CARROT || type == Material.DANDELION;
+ case "LLAMA":
return type == Material.HAY_BLOCK;
+ case "TURTLE":
+ return type == Material.SEAGRASS;
}
return false;
}
+
}
diff --git a/src/main/java/com/songoda/ultimatestacker/events/InventoryListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/InventoryListeners.java
similarity index 97%
rename from src/main/java/com/songoda/ultimatestacker/events/InventoryListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/InventoryListeners.java
index 724f56e..dc005bd 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/InventoryListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/InventoryListeners.java
@@ -1,4 +1,4 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import org.bukkit.event.EventHandler;
diff --git a/src/main/java/com/songoda/ultimatestacker/events/ShearListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/ShearListeners.java
similarity index 97%
rename from src/main/java/com/songoda/ultimatestacker/events/ShearListeners.java
rename to src/main/java/com/songoda/ultimatestacker/listeners/ShearListeners.java
index 562ca97..d68d83b 100644
--- a/src/main/java/com/songoda/ultimatestacker/events/ShearListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/ShearListeners.java
@@ -1,4 +1,4 @@
-package com.songoda.ultimatestacker.events;
+package com.songoda.ultimatestacker.listeners;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
diff --git a/src/main/java/com/songoda/ultimatestacker/storage/types/StorageYaml.java b/src/main/java/com/songoda/ultimatestacker/storage/types/StorageYaml.java
index e800ec0..75edd10 100644
--- a/src/main/java/com/songoda/ultimatestacker/storage/types/StorageYaml.java
+++ b/src/main/java/com/songoda/ultimatestacker/storage/types/StorageYaml.java
@@ -4,12 +4,10 @@ import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.storage.Storage;
import com.songoda.ultimatestacker.storage.StorageItem;
import com.songoda.ultimatestacker.storage.StorageRow;
-import org.apache.commons.io.FileUtils;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.MemorySection;
-import java.io.File;
-import java.io.IOException;
+import java.io.*;
import java.util.*;
public class StorageYaml extends Storage {
@@ -110,7 +108,7 @@ public class StorageYaml extends Storage {
File data = new File(instance.getDataFolder(), "data.yml");
File dataClone = new File(instance.getDataFolder(), "data-backup-" + System.currentTimeMillis() + ".yml");
try {
- FileUtils.copyFile(data, dataClone);
+ copyFile(data, dataClone);
} catch (IOException e) {
e.printStackTrace();
}
@@ -129,4 +127,22 @@ public class StorageYaml extends Storage {
public void closeConnection() {
dataFile.saveConfig();
}
+
+
+ private static void copyFile(File source, File dest) throws IOException {
+ InputStream is = null;
+ OutputStream os = null;
+ try {
+ is = new FileInputStream(source);
+ os = new FileOutputStream(dest);
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = is.read(buffer)) > 0) {
+ os.write(buffer, 0, length);
+ }
+ } finally {
+ is.close();
+ os.close();
+ }
+ }
}
diff --git a/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java b/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java
index 5f86efd..d6eb14e 100644
--- a/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java
+++ b/src/main/java/com/songoda/ultimatestacker/tasks/StackingTask.java
@@ -4,7 +4,7 @@ import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
import com.songoda.ultimatestacker.entity.EntityStackManager;
import com.songoda.ultimatestacker.utils.Methods;
-import com.songoda.ultimatestacker.utils.SettingsManager;
+import com.songoda.ultimatestacker.utils.settings.Setting;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.configuration.ConfigurationSection;
@@ -46,16 +46,16 @@ public class StackingTask extends BukkitRunnable {
}
// Start stacking task.
- runTaskTimer(instance, 0, SettingsManager.Settings.STACK_SEARCH_TICK_SPEED.getInt());
+ runTaskTimer(instance, 0, Setting.STACK_SEARCH_TICK_SPEED.getInt());
}
@Override
public void run() {
- int maxItemStackSize = SettingsManager.Settings.MAX_STACK_ITEMS.getInt();
- int maxEntityStackSizeGlobal = SettingsManager.Settings.MAX_STACK_ENTITIES.getInt();
- int minEntityStackAmount = SettingsManager.Settings.MIN_STACK_ENTITIES.getInt();
+ int maxItemStackSize = Setting.MAX_STACK_ITEMS.getInt();
+ int maxEntityStackSizeGlobal = Setting.MAX_STACK_ENTITIES.getInt();
+ int minEntityStackAmount = Setting.MIN_STACK_ENTITIES.getInt();
- List disabledWorlds = SettingsManager.Settings.DISABLED_WORLDS.getStringList();
+ List disabledWorlds = Setting.DISABLED_WORLDS.getStringList();
EntityStackManager stackManager = instance.getEntityStackManager();
for (World world : Bukkit.getWorlds()) {
@@ -70,7 +70,7 @@ public class StackingTask extends BukkitRunnable {
for (Entity entityO : entities) {
if (entityO == null || entityO instanceof Player || !entityO.isValid()) continue;
- if (entityO instanceof Item && SettingsManager.Settings.STACK_ITEMS.getBoolean()) {
+ if (entityO instanceof Item && Setting.STACK_ITEMS.getBoolean()) {
ItemStack item = ((Item) entityO).getItemStack();
if (entityO.hasMetadata("grabbed")
@@ -99,7 +99,7 @@ public class StackingTask extends BukkitRunnable {
continue;
}
- if (!(entityO instanceof LivingEntity) || !SettingsManager.Settings.STACK_ENTITIES.getBoolean())
+ if (!(entityO instanceof LivingEntity) || !Setting.STACK_ENTITIES.getBoolean())
continue;
LivingEntity initalEntity = (LivingEntity) entityO;
diff --git a/src/main/java/com/songoda/ultimatestacker/utils/Methods.java b/src/main/java/com/songoda/ultimatestacker/utils/Methods.java
index ce55dbb..dc88a47 100644
--- a/src/main/java/com/songoda/ultimatestacker/utils/Methods.java
+++ b/src/main/java/com/songoda/ultimatestacker/utils/Methods.java
@@ -3,6 +3,7 @@ package com.songoda.ultimatestacker.utils;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.entity.EntityStack;
import com.songoda.ultimatestacker.entity.EntityStackManager;
+import com.songoda.ultimatestacker.utils.settings.Setting;
import org.bukkit.*;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
@@ -46,7 +47,7 @@ public class Methods {
newEntity.getEquipment().clear();
if (killed.getType() == EntityType.PIG_ZOMBIE)
- newEntity.getEquipment().setItemInHand(new ItemStack(Material.GOLD_SWORD));
+ newEntity.getEquipment().setItemInHand(new ItemStack(instance.isServerVersion(ServerVersion.V1_13) ? Material.GOLDEN_SWORD : Material.valueOf("GOLD_SWORD")));
if (Bukkit.getPluginManager().isPluginEnabled("EpicSpawners"))
if (killed.hasMetadata("ES"))
@@ -76,10 +77,10 @@ public class Methods {
EntityStack stack = stackManager.getStack(killed);
- if (SettingsManager.Settings.KILL_WHOLE_STACK_ON_DEATH.getBoolean() && stack.getAmount() != 1) {
+ if (Setting.KILL_WHOLE_STACK_ON_DEATH.getBoolean() && stack.getAmount() != 1) {
handleWholeStackDeath(killed, stack, items, droppedExp);
- } else if(SettingsManager.Settings.KILL_WHOLE_STACK_ON_SPECIAL_DEATH.getBoolean() && stack.getAmount() != 1) {
- List reasons = SettingsManager.Settings.SPECIAL_DEATH_CAUSE.getStringList();
+ } else if(stack.getAmount() != 1) {
+ List reasons = Setting.SPECIAL_DEATH_CAUSE.getStringList();
EntityDamageEvent lastDamageCause = killed.getLastDamageCause();
if(lastDamageCause != null) {
@@ -111,6 +112,8 @@ public class Methods {
((Slime)newEntity).setSize(((Slime)killed).getSize());
}
+ //ToDo: Mooshroom Color Handling.
+ //ToDO: Ravenger Banner Handling.
newEntity.setFireTicks(killed.getFireTicks());
newEntity.addPotionEffects(killed.getActivePotionEffects());
@@ -119,7 +122,7 @@ public class Methods {
public static List getSimilarEntitesAroundEntity(Entity initalEntity) {
- int searchRadius = SettingsManager.Settings.SEARCH_RADIUS.getInt();
+ int searchRadius = Setting.SEARCH_RADIUS.getInt();
//Create a list of all entities around the initial entity of the same type.
List entityList = initalEntity.getNearbyEntities(searchRadius, searchRadius, searchRadius).stream()
@@ -212,7 +215,7 @@ public class Methods {
}
public static ItemStack getSpawnerItem(EntityType entityType, int amount) {
- ItemStack item = new ItemStack(Material.MOB_SPAWNER, 1);
+ ItemStack item = new ItemStack((UltimateStacker.getInstance().isServerVersion(ServerVersion.V1_13) ? Material.SPAWNER : Material.valueOf("MOB_SPAWNER")), 1);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(Methods.compileSpawnerName(entityType, amount));
CreatureSpawner cs = (CreatureSpawner) ((BlockStateMeta) meta).getBlockState();
@@ -222,6 +225,35 @@ public class Methods {
return item;
}
+ public static ItemStack getGlass() {
+ UltimateStacker instance = UltimateStacker.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) {
+ UltimateStacker instance = UltimateStacker.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(UltimateStacker.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ?
+ Material.LEGACY_STAINED_GLASS_PANE : Material.valueOf("STAINED_GLASS_PANE"), 1, (short) randomNum);
+ } else {
+ glass = new ItemStack(UltimateStacker.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");
+ glass.setItemMeta(glassmeta);
+ return glass;
+ }
+
/**
* Serializes the location of the block specified.
*
diff --git a/src/main/java/com/songoda/ultimatestacker/utils/SettingsManager.java b/src/main/java/com/songoda/ultimatestacker/utils/SettingsManager.java
deleted file mode 100644
index 5c16dbd..0000000
--- a/src/main/java/com/songoda/ultimatestacker/utils/SettingsManager.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package com.songoda.ultimatestacker.utils;
-
-import com.songoda.ultimatestacker.UltimateStacker;
-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.Matcher;
-import java.util.regex.Pattern;
-
-
-public class SettingsManager implements Listener {
-
- private static final Pattern SETTINGS_PATTERN = Pattern.compile("(.{1,28}(?:\\s|$))|(.{0,28})", Pattern.DOTALL);
-
- private final UltimateStacker instance;
- private String pluginName = "UltimateStacker";
- private Map cat = new HashMap<>();
- private Map current = new HashMap<>();
-
- public SettingsManager(UltimateStacker 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.getInventory().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.getInventory().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());
- }
-
- this.finishEditing(player);
- event.setCancelled(true);
- }
-
- public void finishEditing(Player player) {
- this.current.remove(player);
- this.instance.saveConfig();
- this.openEditor(player);
- }
-
-
- public 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");
-
- int slot = 10;
- for (String key : instance.getConfig().getDefaultSection().getKeys(false)) {
- ItemStack item = new ItemStack(Material.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);
- }
-
- public 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.WATCH);
- 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() {
- for (Settings s : Settings.values()) {
- instance.getConfig().addDefault(s.setting, s.option);
- }
- }
-
- public enum Settings {
- STACK_ITEMS("Main.Stack Items", true),
- STACK_ENTITIES("Main.Stack Entities", true),
- STACK_SPAWNERS("Main.Stack Spawners", true),
- STACK_SEARCH_TICK_SPEED("Main.Stack Search Tick Speed", 5),
- DISABLED_WORLDS("Main.DISABLED Worlds", Arrays.asList("World1", "World2", "World3")),
- MAX_STACK_ENTITIES("Entity.Max Stack Size", 15),
- MIN_STACK_ENTITIES("Entity.Min Stack Amount", 5),
- HOLOGRAMS_ON_LOOK_ENTITY("Entity.Only Show Holograms On Look", false),
- KILL_WHOLE_STACK_ON_DEATH("Entity.Kill Whole Stack On Death", false),
- KILL_WHOLE_STACK_ON_SPECIAL_DEATH("Entity.Kill Whole Stack On Special Death Cause", true),
- SPECIAL_DEATH_CAUSE("Entity.Special Death Cause", Arrays.asList("FALL", "DROWNING", "LAVA", "VOID")),
- NAME_FORMAT_ENTITY("Entity.Name Format", "&f{TYPE} &6{AMT}x"),
- SEARCH_RADIUS("Entity.Search Radius", 5),
- MAX_STACK_ITEMS("Item.Max Stack Size", 120),
- NAME_FORMAT_ITEM("Item.Name Format", "&f{TYPE} &6{AMT}x"),
- o7("Spawners.Holograms Enabled", true),
- o8("Spawners.Max Stack Size", 5),
- NAME_FORMAT_SPAWNER("Spawners.Name Format", "&f{TYPE} Spawner &6{AMT}x"),
-
- 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", "UltimateStacker"),
- DATABASE_PREFIX("Database.Prefix", "US-"),
- DATABASE_USERNAME("Database.Username", "PUT_USERNAME_HERE"),
- DATABASE_PASSWORD("Database.Password", "PUT_PASSWORD_HERE"),
-
- LANGUGE_MODE("System.Language Mode", "en_US");
-
- private String setting;
- private Object option;
-
- Settings(String setting, Object option) {
- this.setting = setting;
- this.option = option;
- }
-
- public List getStringList() {
- return UltimateStacker.getInstance().getConfig().getStringList(setting);
- }
-
- public boolean getBoolean() {
- return UltimateStacker.getInstance().getConfig().getBoolean(setting);
- }
-
- public int getInt() {
- return UltimateStacker.getInstance().getConfig().getInt(setting);
- }
-
- public String getString() {
- return UltimateStacker.getInstance().getConfig().getString(setting);
- }
-
-
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/songoda/ultimatestacker/utils/settings/Category.java b/src/main/java/com/songoda/ultimatestacker/utils/settings/Category.java
new file mode 100644
index 0000000..d72cfdf
--- /dev/null
+++ b/src/main/java/com/songoda/ultimatestacker/utils/settings/Category.java
@@ -0,0 +1,29 @@
+package com.songoda.epicheads.utils.settings;
+
+public enum Category {
+
+ MAIN("General settings and options."),
+
+ INTERFACES("These settings allow you to alter the way interfaces look.",
+ "They are used in GUI's to make paterns, change them up then open up a",
+ "GUI to see how it works."),
+
+ 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."),
+
+ ECONOMY_ITEM("Item token options."),
+
+ 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/ultimatestacker/utils/settings/Setting.java b/src/main/java/com/songoda/ultimatestacker/utils/settings/Setting.java
new file mode 100644
index 0000000..40fd033
--- /dev/null
+++ b/src/main/java/com/songoda/ultimatestacker/utils/settings/Setting.java
@@ -0,0 +1,143 @@
+package com.songoda.epicheads.utils.settings;
+
+import com.songoda.epicheads.EpicHeads;
+import com.songoda.epicheads.utils.ServerVersion;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public enum Setting {
+
+ 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."),
+
+ DISCORD("Main.Show Discord Button", true,
+ "This is the discord button displayed in the main GUI",
+ "Clicking this button will bring you to a discord where you can",
+ "add or remove heads to the global library this plugin uses.",
+ "AS well as get updates on future releases and features."),
+
+ FREE_IN_CREATIVE("Main.Heads Free In Creative Mode", false,
+ "Enabling this will make it so that a player can get all heads",
+ "for free as long as they are in the creative game mode."),
+
+ DROP_MOB_HEADS("Main.Drop Mob Heads", true,
+ "Should heads drop after a monster is killed?"),
+
+ DROP_PLAYER_HEADS("Main.Drop Player Heads", true,
+ "Should a players drop their head on death?"),
+
+ DROP_CHANCE("Main.Head Drop Chance", "25%",
+ "When a player or monster is killed what should be",
+ "the chance that their head drops?"),
+
+ DISABLED_HEADS("Main.Disabled Global Heads", Arrays.asList(34567, 34568, 34569),
+ "These are head ID's from the global database that are disabled.",
+ "By default this is filled with non existent ID's."),
+
+ GLASS_TYPE_1("Interfaces.Glass Type 1", 7),
+ GLASS_TYPE_2("Interfaces.Glass Type 2", 11),
+ GLASS_TYPE_3("Interfaces.Glass Type 3", 3),
+
+ HEAD_COST("Economy.Head Cost", 24.99,
+ "The cost the of the head. If you wan't to use PlayerPoints",
+ "or item tokens you need to use whole numbers."),
+
+ VAULT_ECONOMY("Economy.Use Vault Economy", true,
+ "Should Vault be used?"),
+
+ PLAYER_POINTS_ECONOMY("Economy.Use Player Points Economy", false,
+ "Should PlayerPoints be used?"),
+
+ ITEM_ECONOMY("Economy.Use Item Economy", false,
+ "Should item tokens be used?"),
+
+ ITEM_TOKEN_TYPE("Economy.Item.Type", EpicHeads.getInstance().isServerVersionAtLeast(ServerVersion.V1_13) ? "PLAYER_HEAD" : "SKULL_ITEM",
+ "Which item material type should be used?",
+ "You can use any of the materials from the following link:",
+ "https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html"),
+
+ ITEM_TOKEN_ID("Economy.Item.Head ID", 14395,
+ "If a player head is used as the token which head ID should be used?",
+ "This can be any head from the global database."),
+
+ ITEM_TOKEN_NAME("Economy.Item.Name", "&6Player Head Token",
+ "What should the token be named?"),
+
+ ITEM_TOKEN_LORE("Economy.Item.Lore", Arrays.asList("&8Use in /Heads!"),
+ "What should the tokens lore be?"),
+
+ 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 getIntegerList() {
+ return EpicHeads.getInstance().getConfig().getIntegerList(setting);
+ }
+
+ public List getStringList() {
+ return EpicHeads.getInstance().getConfig().getStringList(setting);
+ }
+
+ public boolean getBoolean() {
+ return EpicHeads.getInstance().getConfig().getBoolean(setting);
+ }
+
+ public int getInt() {
+ return EpicHeads.getInstance().getConfig().getInt(setting);
+ }
+
+ public long getLong() {
+ return EpicHeads.getInstance().getConfig().getLong(setting);
+ }
+
+ public String getString() {
+ return EpicHeads.getInstance().getConfig().getString(setting);
+ }
+
+ public char getChar() {
+ return EpicHeads.getInstance().getConfig().getString(setting).charAt(0);
+ }
+
+ public double getDouble() {
+ return EpicHeads.getInstance().getConfig().getDouble(setting);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/songoda/ultimatestacker/utils/settings/SettingsManager.java b/src/main/java/com/songoda/ultimatestacker/utils/settings/SettingsManager.java
new file mode 100644
index 0000000..663b7e3
--- /dev/null
+++ b/src/main/java/com/songoda/ultimatestacker/utils/settings/SettingsManager.java
@@ -0,0 +1,326 @@
+package com.songoda.epicheads.utils.settings;
+
+import com.songoda.epicheads.EpicHeads;
+import com.songoda.epicheads.utils.Methods;
+import com.songoda.epicheads.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 EpicHeads plugin;
+ private Map cat = new HashMap<>();
+ private Map current = new HashMap<>();
+
+ public SettingsManager(EpicHeads 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(EpicHeads.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 {
+ BufferedWriter writer =
+ new BufferedWriter(new FileWriter(new File(plugin.getDataFolder() + "\\config.yml")));
+ writer.write(config.toString());
+ writer.flush();
+ writer.close();
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void add(LinkedHashMap map, int index, K key, V value) {
+ assert (map != null);
+ assert !map.containsKey(key);
+ assert (index >= 0) && (index < map.size());
+
+ int i = 0;
+ List> rest = new ArrayList<>();
+ for (Map.Entry entry : map.entrySet()) {
+ if (i++ >= index) {
+ rest.add(entry);
+ }
+ }
+ map.put(key, value);
+ for (Map.Entry entry : rest) {
+ map.remove(entry.getKey());
+ map.put(entry.getKey(), entry.getValue());
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index f734d80..acf0c86 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -4,6 +4,7 @@ version: maven-version-number
softdepend: [Arconix, HolographicDisplays, WorldGuard, EpicSpawners]
main: com.songoda.ultimatestacker.UltimateStacker
author: songoda
+api-version: 1.13
commands:
UltimateStacker:
description: I have no idea.
diff --git a/target/classes/com/songoda/ultimatestacker/command/commands/CommandSettings.class b/target/classes/com/songoda/ultimatestacker/command/commands/CommandSettings.class
index be18bd1..888cc50 100644
Binary files a/target/classes/com/songoda/ultimatestacker/command/commands/CommandSettings.class and b/target/classes/com/songoda/ultimatestacker/command/commands/CommandSettings.class differ