diff --git a/UltimateStacker-API/pom.xml b/UltimateStacker-API/pom.xml
index c24721b..f4e6e5b 100644
--- a/UltimateStacker-API/pom.xml
+++ b/UltimateStacker-API/pom.xml
@@ -7,7 +7,7 @@
com.craftaro
UltimateStacker-Parent
- 3.1.4
+ 3.1.5
UltimateStacker-API
1.0.0-SNAPSHOT
diff --git a/UltimateStacker-Plugin/pom.xml b/UltimateStacker-Plugin/pom.xml
index effe227..9e7997f 100644
--- a/UltimateStacker-Plugin/pom.xml
+++ b/UltimateStacker-Plugin/pom.xml
@@ -7,7 +7,7 @@
com.craftaro
UltimateStacker-Parent
- 3.1.4
+ 3.1.5
UltimateStacker-Plugin
diff --git a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/listeners/BlockListeners.java b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/listeners/BlockListeners.java
index dd9c33a..7c78174 100644
--- a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/listeners/BlockListeners.java
+++ b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/listeners/BlockListeners.java
@@ -181,7 +181,41 @@ public class BlockListeners implements Listener {
if (itemType == blockType) {
SpawnerStack stack = UltimateStackerApi.getSpawnerStackManager().getSpawner(block);
if (stack == null) return;
- if (player.isSneaking()) return;
+ if (player.isSneaking()) {
+ //Add all to stack from hand
+ if (Settings.SNEAK_TO_ADD_ALL.getBoolean()) {
+
+ //Redo this logic, if we have 10 items in hand and each item is 5 stack size, we need to take into consideration that what happens if we can only add 2 stack total in a stack? We have to remove one extra item and add one spawner with 3 stack back
+ int amountToAdd = Math.min(maxStackSize - stack.getAmount(), itemAmount * inHand.getAmount()); //Multiply by inHand.getAmount() to get the total amount of items in hand
+ int remaining = itemAmount * inHand.getAmount() - amountToAdd; //Calculate the remaining amount of items in hand
+ stack.setAmount(stack.getAmount() + amountToAdd);
+ plugin.updateHologram(stack);
+ plugin.getDataManager().save(stack);
+ if (remaining % itemAmount == 0) { //We don't have to worry about leftovers
+ if (player.getGameMode() != GameMode.CREATIVE) {
+ hand.takeItem(player, amountToAdd / itemAmount);
+ }
+ } else {
+ int fullStacks = amountToAdd / itemAmount;
+ int overflow = remaining % itemAmount;
+ //remove fullstacks-1 and add back overflow as a new item stack
+ if (player.getGameMode() != GameMode.CREATIVE) {
+ if (overflow > 0) {
+ hand.takeItem(player, fullStacks+1);
+ ItemStack overflowItem = Methods.getSpawnerItem(blockType, overflow);
+ if (player.getInventory().firstEmpty() == -1) {
+ block.getWorld().dropItemNaturally(block.getLocation().add(.5, 0, .5), overflowItem);
+ } else {
+ player.getInventory().addItem(overflowItem);
+ }
+ } else {
+ hand.takeItem(player, fullStacks);
+ }
+ }
+ }
+ }
+ return;
+ }
if (player.hasPermission("ultimatestacker.spawner.nostack") && !player.isOp()) {
event.setCancelled(false);
return;
@@ -261,12 +295,16 @@ public class BlockListeners implements Listener {
CreatureSpawner cs = (CreatureSpawner) block.getState();
- EntityType blockType = cs.getSpawnedType();
+ EntityType spawnedEntityType = cs.getSpawnedType();
+
+ //Empty spawners return null?? It is annotated as @NotNull
+ if (spawnedEntityType == null) return;
Player player = event.getPlayer();
ItemStack item = player.getInventory().getItemInHand();
SpawnerStack stack = UltimateStackerApi.getSpawnerStackManager().getSpawner(block);
+ if (stack == null) return;
event.setCancelled(true);
@@ -280,7 +318,7 @@ public class BlockListeners implements Listener {
remove = true;
}
- SpawnerBreakEvent breakEvent = new SpawnerBreakEvent(player, block, blockType, amt);
+ SpawnerBreakEvent breakEvent = new SpawnerBreakEvent(player, block, spawnedEntityType, amt);
Bukkit.getPluginManager().callEvent(breakEvent);
if (breakEvent.isCancelled())
return;
@@ -297,7 +335,7 @@ public class BlockListeners implements Listener {
}
if (player.hasPermission("ultimatestacker.spawner.nosilkdrop") || item.getEnchantments().containsKey(Enchantment.SILK_TOUCH) && player.hasPermission("ultimatestacker.spawner.silktouch")) {
- ItemStack spawner = Methods.getSpawnerItem(blockType, amt);
+ ItemStack spawner = Methods.getSpawnerItem(spawnedEntityType, amt);
if (player.getInventory().firstEmpty() == -1 || !Settings.SPAWNERS_TO_INVENTORY.getBoolean())
block.getWorld().dropItemNaturally(block.getLocation().add(.5, 0, .5), spawner);
else
diff --git a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/settings/Settings.java b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/settings/Settings.java
index 58cf8b5..eccf5f8 100644
--- a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/settings/Settings.java
+++ b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/settings/Settings.java
@@ -239,6 +239,9 @@ public class Settings implements com.craftaro.ultimatestacker.api.Settings {
public static final ConfigSetting SNEAK_FOR_STACK = new ConfigSetting(config, "Spawners.Sneak To Receive A Stacked Spawner", true,
"Toggle ability to receive a stacked spawner when breaking a spawner while sneaking.");
+ public static final ConfigSetting SNEAK_TO_ADD_ALL = new ConfigSetting(config, "Spawners.Sneak To Add All", true,
+ "Should the player be able to add all spawners to the stack if they are sneaking?");
+
public static final ConfigSetting SPAWNERS_DONT_EXPLODE = new ConfigSetting(config, "Spawners.Prevent Spawners From Exploding", false,
"Should spawners not break when blown up?");
diff --git a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/BreedingTask.java b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/BreedingTask.java
index e30d6b8..861a46f 100644
--- a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/BreedingTask.java
+++ b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/BreedingTask.java
@@ -1,6 +1,6 @@
package com.craftaro.ultimatestacker.tasks;
-import com.craftaro.core.task.TaskScheduler;
+import com.craftaro.core.thread.TaskScheduler;
import com.craftaro.ultimatestacker.UltimateStacker;
import org.bukkit.entity.LivingEntity;
diff --git a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/StackingTask.java b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/StackingTask.java
index 04270f2..3c42abe 100644
--- a/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/StackingTask.java
+++ b/UltimateStacker-Plugin/src/main/java/com.craftaro.ultimatestacker/tasks/StackingTask.java
@@ -89,12 +89,15 @@ public class StackingTask extends BukkitRunnable {
//Filter non-stackable entities to improve performance on main thread
entities.removeIf(this::isEntityNotStackable);
- for (LivingEntity entity : entities) {
+ List remove = new ArrayList<>();
+ for (LivingEntity entity : entities) { //Q: What can cause current modification exception here?
// Check our WorldGuard flag.
Boolean flag = WorldGuardHook.isEnabled() ? WorldGuardHook.getBooleanFlag(entity.getLocation(), "mob-stacking") : null; //Does this work async?
- if (flag != null && !flag)
- entities.removeIf(entity1 -> entity1.getUniqueId().equals(entity.getUniqueId()));
+ if (flag != null && !flag) {
+ remove.add(entity);
+ }
}
+ entities.removeAll(remove);
Bukkit.getScheduler().runTask(plugin, () -> {
// Loop through the entities.
diff --git a/pom.xml b/pom.xml
index bfdc25b..92b56b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
com.craftaro
UltimateStacker-Parent
pom
- 3.1.4
+ 3.1.5
UltimateStacker-API