Update item amounts correctly when entities pick up items.
This commit is contained in:
parent
5e19c254b2
commit
e820f80dfa
|
@ -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())
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -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());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue