Update item amounts correctly when entities pick up items.

This commit is contained in:
Brianna 2020-07-10 21:42:56 -05:00
parent 5e19c254b2
commit e820f80dfa
4 changed files with 100 additions and 29 deletions

View File

@ -22,6 +22,9 @@ import com.songoda.ultimatestacker.entity.EntityStackManager;
import com.songoda.ultimatestacker.hook.StackerHook;
import com.songoda.ultimatestacker.hook.hooks.JobsHook;
import com.songoda.ultimatestacker.listeners.*;
import com.songoda.ultimatestacker.listeners.item.ItemCurrentListener;
import com.songoda.ultimatestacker.listeners.item.ItemLegacyListener;
import com.songoda.ultimatestacker.listeners.item.ItemListeners;
import com.songoda.ultimatestacker.lootables.LootablesManager;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.spawner.SpawnerStack;
@ -163,6 +166,12 @@ public class UltimateStacker extends SongodaPlugin {
pluginManager.registerEvents(new InteractListeners(this), this);
pluginManager.registerEvents(new EntityListeners(this), this);
pluginManager.registerEvents(new ItemListeners(this), this);
if (ServerVersion.isServerVersionAtLeast(ServerVersion.V1_12))
pluginManager.registerEvents(new ItemCurrentListener(), this);
else
pluginManager.registerEvents(new ItemLegacyListener(), this);
pluginManager.registerEvents(new TameListeners(this), this);
pluginManager.registerEvents(new SpawnerListeners(this), this);
pluginManager.registerEvents(new SheepDyeListeners(this), this);
@ -384,6 +393,21 @@ public class UltimateStacker extends SongodaPlugin {
* @param newAmount number of items this item represents
*/
public static void updateItemAmount(Item item, ItemStack itemStack, int newAmount) {
boolean blacklisted = isMaterialBlacklisted(itemStack);
if (newAmount > (itemStack.getMaxStackSize() / 2) && !blacklisted)
itemStack.setAmount(Math.max(1, itemStack.getMaxStackSize() / 2));
else
itemStack.setAmount(newAmount);
// If amount is 0, Minecraft change the type to AIR
if (itemStack.getType() == Material.AIR)
return;
updateItemMeta(item, itemStack, newAmount);
}
public static void updateItemMeta(Item item, ItemStack itemStack, int newAmount) {
Material material = itemStack.getType();
String name = TextUtils.convertToInvisibleString("IS") + Methods.compileItemName(itemStack, newAmount);
@ -391,14 +415,9 @@ public class UltimateStacker extends SongodaPlugin {
if (newAmount > (itemStack.getMaxStackSize() / 2) && !blacklisted) {
item.setMetadata("US_AMT", new FixedMetadataValue(INSTANCE, newAmount));
itemStack.setAmount(Math.max(1, itemStack.getMaxStackSize() / 2));
} else {
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())

View File

@ -0,0 +1,37 @@
package com.songoda.ultimatestacker.listeners.item;
import com.songoda.core.compatibility.CompatibleSound;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.utils.Methods;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPickupItemEvent;
import org.bukkit.inventory.ItemStack;
public class ItemCurrentListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPickup(EntityPickupItemEvent event) {
if (!Settings.STACK_ITEMS.getBoolean() || event.getItem() instanceof Arrow) 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
Item item = event.getItem();
ItemStack stack = item.getItemStack();
int amount = UltimateStacker.getActualItemAmount(item);
if (event.getEntity() instanceof Player) {
if (amount < (stack.getMaxStackSize() / 2)) return;
event.setCancelled(true);
Player player = (Player) event.getEntity();
player.playSound(player.getLocation(), CompatibleSound.ENTITY_ITEM_PICKUP.getSound(), .2f, (float) (1 + Math.random()));
Methods.updateInventory(event.getItem(), player.getInventory());
} else {
UltimateStacker.updateItemMeta(item, stack, amount - 1);
}
}
}

View File

@ -0,0 +1,33 @@
package com.songoda.ultimatestacker.listeners.item;
import com.songoda.core.compatibility.CompatibleSound;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.utils.Methods;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
public class ItemLegacyListener implements Listener {
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPickup(PlayerPickupItemEvent event) {
if (!Settings.STACK_ITEMS.getBoolean() || event.getItem() instanceof Arrow) 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
Item item = event.getItem();
ItemStack stack = item.getItemStack();
int amount = UltimateStacker.getActualItemAmount(item);
if (amount < (stack.getMaxStackSize() / 2)) 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());
}
}

View File

@ -1,13 +1,11 @@
package com.songoda.ultimatestacker.listeners;
package com.songoda.ultimatestacker.listeners.item;
import com.songoda.core.compatibility.CompatibleSound;
import com.songoda.core.utils.BlockUtils;
import com.songoda.ultimatestacker.UltimateStacker;
import com.songoda.ultimatestacker.settings.Settings;
import com.songoda.ultimatestacker.utils.Methods;
import org.apache.commons.lang.StringUtils;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Item;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -15,7 +13,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.entity.ItemMergeEvent;
import org.bukkit.event.entity.ItemSpawnEvent;
import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.inventory.ItemStack;
import java.util.List;
@ -34,7 +31,8 @@ public class ItemListeners implements Listener {
if (!Settings.STACK_ITEMS.getBoolean()) return;
List<String> disabledWorlds = Settings.DISABLED_WORLDS.getStringList();
if (disabledWorlds.stream().anyMatch(worldStr -> event.getEntity().getWorld().getName().equalsIgnoreCase(worldStr))) return;
if (disabledWorlds.stream().anyMatch(worldStr -> event.getEntity().getWorld().getName().equalsIgnoreCase(worldStr)))
return;
Item item = event.getTarget();
ItemStack itemStack = item.getItemStack();
@ -67,7 +65,7 @@ public class ItemListeners implements Listener {
Methods.updateInventory(event.getItem(), event.getInventory());
if (event.getInventory().getHolder() instanceof BlockState)
BlockUtils.updateAdjacentComparators(((BlockState)event.getInventory().getHolder()).getLocation());
BlockUtils.updateAdjacentComparators(((BlockState) event.getInventory().getHolder()).getLocation());
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
@ -75,7 +73,8 @@ public class ItemListeners implements Listener {
if (!Settings.STACK_ITEMS.getBoolean()) return;
List<String> disabledWorlds = Settings.DISABLED_WORLDS.getStringList();
if (disabledWorlds.stream().anyMatch(worldStr -> event.getEntity().getWorld().getName().equalsIgnoreCase(worldStr))) return;
if (disabledWorlds.stream().anyMatch(worldStr -> event.getEntity().getWorld().getName().equalsIgnoreCase(worldStr)))
return;
ItemStack itemStack = event.getEntity().getItemStack();
@ -86,21 +85,4 @@ public class ItemListeners implements Listener {
UltimateStacker.updateItemAmount(event.getEntity(), itemStack, itemStack.getAmount());
}
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
public void onPickup(PlayerPickupItemEvent event) {
if (!Settings.STACK_ITEMS.getBoolean() || event.getItem() instanceof Arrow) 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
Item item = event.getItem();
ItemStack stack = item.getItemStack();
int amount = UltimateStacker.getActualItemAmount(item);
if (amount < (stack.getMaxStackSize() / 2)) 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());
}
}