diff --git a/.gitignore b/.gitignore
index bd3743b..e69102e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,6 @@
\.idea
\target
-UltimateStacker.iml
\ No newline at end of file
+UltimateStacker.iml
+.settings/
+.classpath
+.project
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index f296e08..02f455e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
com.songoda
UltimateStacker
4.0.0
- 1.11.6
+ 1.11.7
clean install
UltimateStacker-${project.version}
@@ -93,6 +93,10 @@
private
http://repo.songoda.com/artifactory/private/
+
+ public
+ http://repo.songoda.com/artifactory/public/
+
CodeMC
https://repo.codemc.org/repository/maven-public
diff --git a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
index 2b7ed3e..12a3844 100644
--- a/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
+++ b/src/main/java/com/songoda/ultimatestacker/UltimateStacker.java
@@ -14,12 +14,7 @@ import com.songoda.core.gui.GuiManager;
import com.songoda.core.hooks.HologramManager;
import com.songoda.core.hooks.WorldGuardHook;
import com.songoda.core.utils.TextUtils;
-import com.songoda.ultimatestacker.commands.CommandConvert;
-import com.songoda.ultimatestacker.commands.CommandGiveSpawner;
-import com.songoda.ultimatestacker.commands.CommandReload;
-import com.songoda.ultimatestacker.commands.CommandRemoveAll;
-import com.songoda.ultimatestacker.commands.CommandSettings;
-import com.songoda.ultimatestacker.commands.CommandUltimateStacker;
+import com.songoda.ultimatestacker.commands.*;
import com.songoda.ultimatestacker.database.DataManager;
import com.songoda.ultimatestacker.database.migrations._1_InitialMigration;
import com.songoda.ultimatestacker.entity.EntityStack;
@@ -120,6 +115,7 @@ public class UltimateStacker extends SongodaPlugin {
.addSubCommand(new CommandRemoveAll())
.addSubCommand(new CommandReload())
.addSubCommand(new CommandGiveSpawner())
+ .addSubCommand(new CommandSpawn())
.addSubCommand(new CommandConvert(guiManager));
this.entityUtils = new EntityUtils();
@@ -398,6 +394,9 @@ public class UltimateStacker extends SongodaPlugin {
item.removeMetadata("US_AMT", INSTANCE);
itemStack.setAmount(newAmount);
}
+ // If amount is 0, Minecraft change the type to AIR
+ if (itemStack.getType() == Material.AIR)
+ return;
item.setItemStack(itemStack);
if ((blacklisted && !Settings.ITEM_HOLOGRAM_BLACKLIST.getBoolean())
@@ -419,7 +418,7 @@ public class UltimateStacker extends SongodaPlugin {
public static int getActualItemAmount(Item item) {
ItemStack itemStack = item.getItemStack();
int amount = itemStack.getAmount();
- if (amount >= (itemStack.getMaxStackSize() / 2) && item.hasMetadata("US_AMT")) {
+ if (/*amount >= (itemStack.getMaxStackSize() / 2) && */item.hasMetadata("US_AMT")) {
return item.getMetadata("US_AMT").get(0).asInt();
} else {
return amount;
diff --git a/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java b/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java
new file mode 100644
index 0000000..fc84581
--- /dev/null
+++ b/src/main/java/com/songoda/ultimatestacker/commands/CommandSpawn.java
@@ -0,0 +1,89 @@
+package com.songoda.ultimatestacker.commands;
+
+import com.songoda.core.commands.AbstractCommand;
+import com.songoda.ultimatestacker.UltimateStacker;
+import com.songoda.ultimatestacker.entity.EntityStack;
+import com.songoda.ultimatestacker.utils.Methods;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.EntityType;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.entity.Player;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * The current file has been created by Kiran Hart
+ * Date Created: 3/21/2020
+ * Time Created: 1:02 PM
+ */
+public class CommandSpawn extends AbstractCommand {
+
+ UltimateStacker instance;
+
+ public CommandSpawn() {
+ super(true, "spawn");
+ instance = UltimateStacker.getInstance();
+ }
+
+ @Override
+ protected ReturnType runCommand(CommandSender sender, String... args) {
+ Player p = (Player) sender;
+
+ if (args.length < 2) return ReturnType.SYNTAX_ERROR;
+
+ EntityType type = null;
+ for (EntityType types : EntityType.values()) {
+ String input = args[0].toUpperCase().replace("_", "").replace(" ", "");
+ String compare = types.name().toUpperCase().replace("_", "").replace(" ", "");
+ if (input.equals(compare))
+ type = types;
+ }
+
+ if (type == null) {
+ instance.getLocale().newMessage("&7The entity &6" + args[0] + " &7does not exist. Try one of these:").sendPrefixedMessage(sender);
+ StringBuilder list = new StringBuilder();
+
+ for (EntityType types : EntityType.values()) {
+ if (types.isSpawnable() && types.isAlive() && !types.toString().contains("ARMOR"))
+ list.append(types.name().toUpperCase().replace(" ", "_")).append("&7, &6");
+ }
+ sender.sendMessage(Methods.formatText("&6" + list));
+ } else {
+ Entity entity = p.getWorld().spawnEntity(p.getLocation(), type);
+ EntityStack stack = instance.getEntityStackManager().addStack(entity.getUniqueId(), (Methods.isInt(args[1])) ? Integer.parseInt(args[1]) : 1);
+ instance.getStackingTask().attemptSplit(stack, (LivingEntity) entity);
+ }
+
+ return ReturnType.SUCCESS;
+ }
+
+ @Override
+ protected List onTab(CommandSender sender, String... args) {
+ if (args.length == 1) {
+ return Arrays.stream(EntityType.values())
+ .filter(types -> types.isSpawnable() && types.isAlive() && !types.toString().contains("ARMOR"))
+ .map(Enum::name).collect(Collectors.toList());
+ } else if (args.length == 2) {
+ return Arrays.asList("1", "2", "3", "4", "5");
+ }
+ return null;
+ }
+
+ @Override
+ public String getPermissionNode() {
+ return "ultimatestacker.admin";
+ }
+
+ @Override
+ public String getSyntax() {
+ return "/us spawn ";
+ }
+
+ @Override
+ public String getDescription() {
+ return "Spawns a stack of the specified entity at your location.";
+ }
+}
diff --git a/src/main/java/com/songoda/ultimatestacker/listeners/ItemListeners.java b/src/main/java/com/songoda/ultimatestacker/listeners/ItemListeners.java
index 0c98a43..d97aa09 100644
--- a/src/main/java/com/songoda/ultimatestacker/listeners/ItemListeners.java
+++ b/src/main/java/com/songoda/ultimatestacker/listeners/ItemListeners.java
@@ -17,6 +17,8 @@ import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
+import java.util.List;
+
public class ItemListeners implements Listener {
private final UltimateStacker instance;
@@ -30,6 +32,9 @@ public class ItemListeners implements Listener {
int maxItemStackSize = Settings.MAX_STACK_ITEMS.getInt();
if (!Settings.STACK_ITEMS.getBoolean()) return;
+ List disabledWorlds = Settings.DISABLED_WORLDS.getStringList();
+ if (disabledWorlds.stream().anyMatch(worldStr -> event.getEntity().getWorld().getName().equalsIgnoreCase(worldStr))) return;
+
Item item = event.getTarget();
ItemStack itemStack = item.getItemStack();
@@ -68,6 +73,9 @@ public class ItemListeners implements Listener {
public void onExist(ItemSpawnEvent event) {
if (!Settings.STACK_ITEMS.getBoolean()) return;
+ List disabledWorlds = Settings.DISABLED_WORLDS.getStringList();
+ if (disabledWorlds.stream().anyMatch(worldStr -> event.getEntity().getWorld().getName().equalsIgnoreCase(worldStr))) return;
+
ItemStack itemStack = event.getEntity().getItemStack();
if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasDisplayName() &&
@@ -81,12 +89,18 @@ public class ItemListeners implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPickup(PlayerPickupItemEvent event) {
if (!Settings.STACK_ITEMS.getBoolean()) return;
- if (event.getItem().getItemStack().getAmount() < (event.getItem().getItemStack().getMaxStackSize() / 2)) return;
+ // Amount here is not the total amount of item (32 if more than 32) but the amount of item the player can retrieve
+ // ie there is x64 diamonds blocks (so 32), the player pick 8 items so the amount is 8 and not 32
+ int amount = UltimateStacker.getActualItemAmount(event.getItem());
+ if (/*event.getItem().getItemStack().getAmount()*/amount < (event.getItem().getItemStack().getMaxStackSize() / 2)) {
+ // Update
+ UltimateStacker.updateItemAmount(event.getItem(), event.getRemaining());
+ return;
+ }
event.setCancelled(true);
event.getPlayer().playSound(event.getPlayer().getLocation(), CompatibleSound.ENTITY_ITEM_PICKUP.getSound(), .2f, (float) (1 + Math.random()));
Methods.updateInventory(event.getItem(), event.getPlayer().getInventory());
}
-
}