From 6cedf73c94610cd34231c643bc0e850a27f0e1b7 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 1 Apr 2024 00:21:09 -0400 Subject: [PATCH 1/7] Drop correct amount of items when burned shulker box --- .../rosestacker/listener/EntityListener.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java index 8b83b67f..2dcfe197 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java @@ -30,6 +30,7 @@ import org.bukkit.Statistic; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeInstance; +import org.bukkit.block.ShulkerBox; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Chicken; import org.bukkit.entity.Enderman; @@ -70,6 +71,7 @@ import org.bukkit.event.entity.SpawnerSpawnEvent; import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.util.Vector; public class EntityListener implements Listener { @@ -239,6 +241,32 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent event) { + + if (event.getEntity() instanceof Item item && item.getItemStack().getType().toString().contains("SHULKER_BOX")) { + StackedItem stackedItem = this.stackManager.getStackedItem(item); + if (stackedItem == null) + return; + + final int amount = stackedItem.getStackSize(); + + if (amount > 1 && event.getFinalDamage() >= item.getHealth()) { + final List contents = getContents(item.getItemStack()); + final List totalContents = new ArrayList<>(); + final Location location = item.getLocation(); + + item.remove(); + + for (int i = amount; i > 0; i--) { + totalContents.addAll(contents); + } + + this.stackManager.preStackItems(totalContents, location); + + event.setCancelled(true); + return; + } + } + if (!(event.getEntity() instanceof LivingEntity entity) || event.getEntity().getType() == EntityType.ARMOR_STAND || event.getEntity().getType() == EntityType.PLAYER) return; @@ -276,6 +304,21 @@ public void onEntityDamage(EntityDamageEvent event) { } } + public List getContents(ItemStack item) { + if (!(item.getItemMeta() instanceof BlockStateMeta meta)) return null; + + if (!(meta.getBlockState() instanceof ShulkerBox box)) return null; + + List contents = new ArrayList<>(); + for (ItemStack content : box.getInventory().getContents()) { + if (content == null || content.getType().isAir()) continue; + + contents.add(content); + } + + return contents; + } + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityCombust(EntityCombustEvent event) { Entity entity = event.getEntity(); From 93d865499dcf56a7568a7f5fed9478041da855be Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 8 Apr 2024 02:01:21 -0400 Subject: [PATCH 2/7] Format code & Add toggle to use vanilla method for box unpacking --- .../rosewood/rosestacker/nms/NMSHandler.java | 2 + .../nms/v1_20_R3/NMSHandlerImpl.java | 16 ++++ .../rosestacker/listener/EntityListener.java | 73 +++++++++++-------- .../manager/ConfigurationManager.java | 1 + 4 files changed, 62 insertions(+), 30 deletions(-) diff --git a/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java b/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java index 7c2c9f01..2ec0283e 100644 --- a/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java +++ b/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java @@ -277,4 +277,6 @@ default void setPaperFromMobSpawner(Entity entity) { int getItemDespawnRate(Item item); + List getBoxContents(ItemStack item); + } diff --git a/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java b/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java index b04c2bfb..83440149 100644 --- a/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java +++ b/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java @@ -56,6 +56,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -487,6 +488,21 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(ItemStack item) { + CompoundTag nbttagcompound = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(item)); + + if (nbttagcompound != null && nbttagcompound.contains("Items", 9)) { + return nbttagcompound.getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + return new ArrayList<>(); + } + public void addEntityToWorld(ServerLevel world, Entity entity) throws ReflectiveOperationException { if (field_ServerLevel_entityManager != null) { PersistentEntitySectionManager entityManager = (PersistentEntitySectionManager) field_ServerLevel_entityManager.get(world); diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java index 2dcfe197..949175c8 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java @@ -8,6 +8,8 @@ import dev.rosewood.rosestacker.manager.EntityCacheManager; import dev.rosewood.rosestacker.manager.StackManager; import dev.rosewood.rosestacker.manager.StackSettingManager; +import dev.rosewood.rosestacker.nms.NMSAdapter; +import dev.rosewood.rosestacker.nms.NMSHandler; import dev.rosewood.rosestacker.nms.storage.EntityDataEntry; import dev.rosewood.rosestacker.nms.storage.StackedEntityDataStorageType; import dev.rosewood.rosestacker.stack.StackedEntity; @@ -241,30 +243,9 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent event) { - - if (event.getEntity() instanceof Item item && item.getItemStack().getType().toString().contains("SHULKER_BOX")) { - StackedItem stackedItem = this.stackManager.getStackedItem(item); - if (stackedItem == null) - return; - - final int amount = stackedItem.getStackSize(); - - if (amount > 1 && event.getFinalDamage() >= item.getHealth()) { - final List contents = getContents(item.getItemStack()); - final List totalContents = new ArrayList<>(); - final Location location = item.getLocation(); - - item.remove(); - - for (int i = amount; i > 0; i--) { - totalContents.addAll(contents); - } - - this.stackManager.preStackItems(totalContents, location); - - event.setCancelled(true); - return; - } + if (event.getEntity() instanceof Item item && item.getItemStack().getType().toString().contains("SHULKER_BOX") && unpackShulkerBox(item, event.getFinalDamage())) { + event.setCancelled(true); + return; } if (!(event.getEntity() instanceof LivingEntity entity) || event.getEntity().getType() == EntityType.ARMOR_STAND || event.getEntity().getType() == EntityType.PLAYER) @@ -304,16 +285,48 @@ public void onEntityDamage(EntityDamageEvent event) { } } - public List getContents(ItemStack item) { - if (!(item.getItemMeta() instanceof BlockStateMeta meta)) return null; + private boolean unpackShulkerBox(Item item, double damage) { + StackedItem stackedItem = this.stackManager.getStackedItem(item); + if (stackedItem == null) + return false; - if (!(meta.getBlockState() instanceof ShulkerBox box)) return null; + final int amount = stackedItem.getStackSize(); + if (amount > 1 && damage >= item.getHealth()) { + final List contents = getContents(item.getItemStack()); + final List totalContents = new ArrayList<>(); + final Location location = item.getLocation(); + + item.remove(); + + for (int i = amount; i > 0; i--) { + totalContents.addAll(contents); + } + + this.stackManager.preStackItems(totalContents, location); + + return true; + } + + return false; + } + + private List getContents(ItemStack item) { List contents = new ArrayList<>(); - for (ItemStack content : box.getInventory().getContents()) { - if (content == null || content.getType().isAir()) continue; - contents.add(content); + if (Setting.ITEM_UNPACK_BOX_AS_VANILLA.getBoolean()) { + NMSHandler nmsHandler = NMSAdapter.getHandler(); + contents = nmsHandler.getBoxContents(item); + } else { + if (!(item.getItemMeta() instanceof BlockStateMeta meta)) return contents; + + if (!(meta.getBlockState() instanceof ShulkerBox box)) return contents; + + for (ItemStack content : box.getInventory().getContents()) { + if (content == null || content.getType().isAir()) continue; + + contents.add(content); + } } return contents; diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java index 3c673eab..b71f1eab 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java @@ -90,6 +90,7 @@ public enum Setting implements RoseSetting { ITEM_DISPLAY_DESPAWN_TIMER_PLACEHOLDER("global-item-settings.display-despawn-timer-placeholder", false, "Should the %timer% placeholder be available in item display tags?", "You will need to add the %timer% placeholder to the item display tag in your locale file manually", "Placeholder updates will occur at the same frequency as item-stack-frequency"), ITEM_RESET_DESPAWN_TIMER_ON_MERGE("global-item-settings.reset-despawn-timer-on-merge", true, "Should the item despawn timer be reset when an item is merged into it?"), ITEM_MERGE_INTO_NEWEST("global-item-settings.merge-into-newest", false, "Should items be merged into the newest stack?"), + ITEM_UNPACK_BOX_AS_VANILLA("global-item-settings.unpack-stacked-shulker-box-as-vanilla", false, "Use vanilla method to get item contents stored in box, may allow illegal box inventory amount."), GLOBAL_BLOCK_SETTINGS("global-block-settings", null, "Global block settings", "Changed values in block_settings.yml will override these values"), BLOCK_STACKING_ENABLED("global-block-settings.stacking-enabled", true, "Should block stacking be enabled at all?"), From 12d42bc34320e2d7d2d9d6043574aa16a0d4bba4 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:53:27 -0400 Subject: [PATCH 3/7] Enable drops from shulker box to follow item maxStackSize setting --- .../rosestacker/listener/EntityListener.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java index 949175c8..961b18d8 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java @@ -303,7 +303,18 @@ private boolean unpackShulkerBox(Item item, double damage) { totalContents.addAll(contents); } - this.stackManager.preStackItems(totalContents, location); + final int maxStackSize = Setting.ITEM_MAX_STACK_SIZE.getInt(); + + for (;;) { + if (totalContents.size() > maxStackSize) { + List stack = new ArrayList<>(totalContents.subList(0, maxStackSize)); + totalContents.subList(0, maxStackSize).clear(); + this.stackManager.preStackItems(stack, location); + } else { + this.stackManager.preStackItems(totalContents, location); + break; + } + } return true; } From 4e1c1cc7cf4a4327cd77edcaafc7940489c2717a Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sat, 13 Apr 2024 04:03:41 -0400 Subject: [PATCH 4/7] Correct name --- .../java/dev/rosewood/rosestacker/listener/EntityListener.java | 2 +- .../dev/rosewood/rosestacker/manager/ConfigurationManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java index 961b18d8..39c2a4fe 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java @@ -325,7 +325,7 @@ private boolean unpackShulkerBox(Item item, double damage) { private List getContents(ItemStack item) { List contents = new ArrayList<>(); - if (Setting.ITEM_UNPACK_BOX_AS_VANILLA.getBoolean()) { + if (Setting.ITEM_UNPACK_BOX_LIKE_VANILLA.getBoolean()) { NMSHandler nmsHandler = NMSAdapter.getHandler(); contents = nmsHandler.getBoxContents(item); } else { diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java index b71f1eab..aacf1dd6 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java @@ -90,7 +90,7 @@ public enum Setting implements RoseSetting { ITEM_DISPLAY_DESPAWN_TIMER_PLACEHOLDER("global-item-settings.display-despawn-timer-placeholder", false, "Should the %timer% placeholder be available in item display tags?", "You will need to add the %timer% placeholder to the item display tag in your locale file manually", "Placeholder updates will occur at the same frequency as item-stack-frequency"), ITEM_RESET_DESPAWN_TIMER_ON_MERGE("global-item-settings.reset-despawn-timer-on-merge", true, "Should the item despawn timer be reset when an item is merged into it?"), ITEM_MERGE_INTO_NEWEST("global-item-settings.merge-into-newest", false, "Should items be merged into the newest stack?"), - ITEM_UNPACK_BOX_AS_VANILLA("global-item-settings.unpack-stacked-shulker-box-as-vanilla", false, "Use vanilla method to get item contents stored in box, may allow illegal box inventory amount."), + ITEM_UNPACK_BOX_LIKE_VANILLA("global-item-settings.unpack-stacked-shulker-box-like-vanilla", false, "Use vanilla method to get items stored in box, which may allow unpacking an illegal amount of items from the box."), GLOBAL_BLOCK_SETTINGS("global-block-settings", null, "Global block settings", "Changed values in block_settings.yml will override these values"), BLOCK_STACKING_ENABLED("global-block-settings.stacking-enabled", true, "Should block stacking be enabled at all?"), From 3b4c852217d7da960dc389128ec398fae7ced2fb Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Thu, 2 May 2024 05:27:33 -0400 Subject: [PATCH 5/7] Update to 1.20.6 & Add TODOs for older versions --- .../rosewood/rosestacker/nms/NMSHandler.java | 2 +- .../nms/v1_16_R3/NMSHandlerImpl.java | 8 ++++++++ .../nms/v1_17_R1/NMSHandlerImpl.java | 9 +++++++++ .../nms/v1_18_R2/NMSHandlerImpl.java | 18 ++++++++++++++++++ .../nms/v1_19_R2/NMSHandlerImpl.java | 18 ++++++++++++++++++ .../nms/v1_19_R3/NMSHandlerImpl.java | 18 ++++++++++++++++++ .../nms/v1_20_R1/NMSHandlerImpl.java | 18 ++++++++++++++++++ .../nms/v1_20_R2/NMSHandlerImpl.java | 18 ++++++++++++++++++ .../nms/v1_20_R3/NMSHandlerImpl.java | 9 +++++---- .../nms/v1_20_R4/NMSHandlerImpl.java | 16 ++++++++++++++++ .../rosestacker/listener/EntityListener.java | 7 ++++--- 11 files changed, 133 insertions(+), 8 deletions(-) diff --git a/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java b/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java index 0bfa5b71..a9cb7e45 100644 --- a/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java +++ b/NMS/Wrapper/src/main/java/dev/rosewood/rosestacker/nms/NMSHandler.java @@ -277,6 +277,6 @@ default void setPaperFromMobSpawner(Entity entity) { int getItemDespawnRate(Item item); - List getBoxContents(ItemStack item); + List getBoxContents(Item item); } diff --git a/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java b/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java index 47bfabd0..4c795e96 100644 --- a/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java +++ b/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java @@ -440,6 +440,14 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + + // TODO + return new ArrayList<>(); + } + private SpawnReason toBukkitSpawnReason(EnumMobSpawn mobSpawnType) { return switch (mobSpawnType) { case SPAWN_EGG -> SpawnReason.SPAWNER_EGG; diff --git a/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java b/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java index 9aabb7e6..6969cd34 100644 --- a/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java +++ b/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java @@ -53,6 +53,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -421,6 +422,14 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + + // TODO + return new ArrayList<>(); + } + private SpawnReason toBukkitSpawnReason(MobSpawnType mobSpawnType) { return switch (mobSpawnType) { case SPAWN_EGG -> SpawnReason.SPAWNER_EGG; diff --git a/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java b/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java index f83f62f3..c93e9b47 100644 --- a/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java +++ b/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java @@ -53,6 +53,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -427,6 +428,23 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + CompoundTag contents = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(itemStack)); + + if (contents != null && contents.contains("Items", 9)) { + return contents.getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + // TODO + return new ArrayList<>(); + } + private SpawnReason toBukkitSpawnReason(MobSpawnType mobSpawnType) { return switch (mobSpawnType) { case SPAWN_EGG -> SpawnReason.SPAWNER_EGG; diff --git a/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java b/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java index 845ad56a..af8613a0 100644 --- a/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java +++ b/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java @@ -56,6 +56,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -488,6 +489,23 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + CompoundTag contents = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(itemStack)); + + if (contents != null && contents.contains("Items", 9)) { + return contents.getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + // TODO + return new ArrayList<>(); + } + public void addEntityToWorld(ServerLevel world, Entity entity) throws ReflectiveOperationException { if (field_ServerLevel_entityManager != null) { PersistentEntitySectionManager entityManager = (PersistentEntitySectionManager) field_ServerLevel_entityManager.get(world); diff --git a/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java b/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java index 5339d6b0..12fac875 100644 --- a/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java +++ b/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java @@ -56,6 +56,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -488,6 +489,23 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + CompoundTag contents = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(itemStack)); + + if (contents != null && contents.contains("Items", 9)) { + return contents.getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + // TODO + return new ArrayList<>(); + } + public void addEntityToWorld(ServerLevel world, Entity entity) throws ReflectiveOperationException { if (field_ServerLevel_entityManager != null) { PersistentEntitySectionManager entityManager = (PersistentEntitySectionManager) field_ServerLevel_entityManager.get(world); diff --git a/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java b/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java index d4210cf0..368ccdc1 100644 --- a/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java +++ b/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java @@ -56,6 +56,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -485,6 +486,23 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + CompoundTag contents = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(itemStack)); + + if (contents != null && contents.contains("Items", 9)) { + return contents.getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + // TODO + return new ArrayList<>(); + } + public void addEntityToWorld(ServerLevel world, Entity entity) throws ReflectiveOperationException { if (field_ServerLevel_entityManager != null) { PersistentEntitySectionManager entityManager = (PersistentEntitySectionManager) field_ServerLevel_entityManager.get(world); diff --git a/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java b/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java index 29ed9af2..535702f5 100644 --- a/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java +++ b/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java @@ -56,6 +56,7 @@ import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -485,6 +486,23 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + CompoundTag contents = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(itemStack)); + + if (contents != null && contents.contains("Items", 9)) { + return contents.getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + // TODO + return new ArrayList<>(); + } + public void addEntityToWorld(ServerLevel world, Entity entity) throws ReflectiveOperationException { if (field_ServerLevel_entityManager != null) { PersistentEntitySectionManager entityManager = (PersistentEntitySectionManager) field_ServerLevel_entityManager.get(world); diff --git a/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java b/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java index 8217a64d..998f1083 100644 --- a/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java +++ b/NMS/v1_20_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R3/NMSHandlerImpl.java @@ -489,11 +489,12 @@ public int getItemDespawnRate(Item item) { } @Override - public List getBoxContents(ItemStack item) { - CompoundTag nbttagcompound = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(item)); + public List getBoxContents(Item item) { + ItemStack itemStack = item.getItemStack(); + CompoundTag contents = BlockItem.getBlockEntityData(CraftItemStack.asNMSCopy(itemStack)); - if (nbttagcompound != null && nbttagcompound.contains("Items", 9)) { - return nbttagcompound.getList("Items", 10).stream() + if (contents != null && contents.contains("Items", 9)) { + return contents.getList("Items", 10).stream() .map(CompoundTag.class::cast) .map(net.minecraft.world.item.ItemStack::of) .map(CraftItemStack::asBukkitCopy) diff --git a/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java b/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java index 56095728..1d737248 100644 --- a/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java +++ b/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java @@ -53,11 +53,13 @@ import net.minecraft.world.entity.ai.goal.WrappedGoal; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.animal.Rabbit; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.monster.Spider; import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; import net.minecraft.world.item.component.CustomData; +import net.minecraft.world.item.component.ItemContainerContents; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; @@ -488,6 +490,20 @@ public int getItemDespawnRate(Item item) { } } + @Override + public List getBoxContents(Item item) { + ItemContainerContents contents = ((ItemEntity) item).getItem().set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); + + if (contents != null) { + return contents.stream() + .filter(x -> !x.isEmpty()) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } + + return new ArrayList<>(); + } + public void addEntityToWorld(ServerLevel world, Entity entity) throws ReflectiveOperationException { if (field_ServerLevel_entityManager != null) { PersistentEntitySectionManager entityManager = (PersistentEntitySectionManager) field_ServerLevel_entityManager.get(world); diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java index eb3982b9..fb85cc8d 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java @@ -294,7 +294,7 @@ private boolean unpackShulkerBox(Item item, double damage) { final int amount = stackedItem.getStackSize(); if (amount > 1 && damage >= item.getHealth()) { - final List contents = getContents(item.getItemStack()); + final List contents = getContents(item); final List totalContents = new ArrayList<>(); final Location location = item.getLocation(); @@ -323,14 +323,15 @@ private boolean unpackShulkerBox(Item item, double damage) { return false; } - private List getContents(ItemStack item) { + private List getContents(Item item) { List contents = new ArrayList<>(); if (Setting.ITEM_UNPACK_BOX_LIKE_VANILLA.getBoolean()) { NMSHandler nmsHandler = NMSAdapter.getHandler(); contents = nmsHandler.getBoxContents(item); } else { - if (!(item.getItemMeta() instanceof BlockStateMeta meta)) return contents; + ItemStack itemStack = item.getItemStack(); + if (!(itemStack.getItemMeta() instanceof BlockStateMeta meta)) return contents; if (!(meta.getBlockState() instanceof ShulkerBox box)) return contents; From 61f9ddb0fe07814d52d741f268d932125d0543d6 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Wed, 8 May 2024 22:14:15 -0400 Subject: [PATCH 6/7] Finish TODOs --- .../rosestacker/nms/v1_16_R3/NMSHandlerImpl.java | 4 ---- .../rosestacker/nms/v1_17_R1/NMSHandlerImpl.java | 16 +++++++++++----- .../rosestacker/nms/v1_18_R2/NMSHandlerImpl.java | 1 - .../rosestacker/nms/v1_19_R2/NMSHandlerImpl.java | 1 - .../rosestacker/nms/v1_19_R3/NMSHandlerImpl.java | 1 - .../rosestacker/nms/v1_20_R1/NMSHandlerImpl.java | 1 - .../rosestacker/nms/v1_20_R2/NMSHandlerImpl.java | 1 - .../rosestacker/nms/v1_20_R4/NMSHandlerImpl.java | 3 ++- .../rosestacker/listener/EntityListener.java | 3 ++- 9 files changed, 15 insertions(+), 16 deletions(-) diff --git a/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java b/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java index ad9de34f..9042ef9b 100644 --- a/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java +++ b/NMS/v1_16_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_16_R3/NMSHandlerImpl.java @@ -88,7 +88,6 @@ import org.bukkit.entity.Item; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.inventory.ItemStack; -import org.spigotmc.SpigotWorldConfig; import sun.misc.Unsafe; @SuppressWarnings("unchecked") @@ -431,9 +430,6 @@ public int getItemDespawnRate(Item item) { @Override public List getBoxContents(Item item) { - ItemStack itemStack = item.getItemStack(); - - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java b/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java index fc88e183..e9af1ea7 100644 --- a/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java +++ b/NMS/v1_17_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_17_R1/NMSHandlerImpl.java @@ -49,15 +49,14 @@ import net.minecraft.world.entity.ai.goal.WrappedGoal; import net.minecraft.world.entity.ai.memory.MemoryModuleType; import net.minecraft.world.entity.animal.Rabbit; +import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.monster.Spider; import net.minecraft.world.entity.monster.Strider; import net.minecraft.world.entity.monster.Zombie; import net.minecraft.world.entity.raid.Raider; -import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.trading.MerchantOffers; import net.minecraft.world.level.BaseSpawner; import net.minecraft.world.level.ClipContext; -import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.SpawnerBlockEntity; import net.minecraft.world.level.entity.PersistentEntitySectionManager; @@ -84,7 +83,6 @@ import org.bukkit.entity.Item; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import org.bukkit.inventory.ItemStack; -import org.spigotmc.SpigotWorldConfig; import sun.misc.Unsafe; @SuppressWarnings("unchecked") @@ -413,9 +411,17 @@ public int getItemDespawnRate(Item item) { @Override public List getBoxContents(Item item) { - ItemStack itemStack = item.getItemStack(); + net.minecraft.world.item.ItemStack itemStack = ((ItemEntity) item).getItem(); + CompoundTag contents = itemStack.getTag(); + + if (contents != null) { + return contents.getCompound("BlockEntityTag").getList("Items", 10).stream() + .map(CompoundTag.class::cast) + .map(net.minecraft.world.item.ItemStack::of) + .map(CraftItemStack::asBukkitCopy) + .toList(); + } - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java b/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java index 572053d8..b20c5c78 100644 --- a/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java +++ b/NMS/v1_18_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_18_R2/NMSHandlerImpl.java @@ -428,7 +428,6 @@ public List getBoxContents(Item item) { .toList(); } - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java b/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java index 16a99c08..a1980845 100644 --- a/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java +++ b/NMS/v1_19_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R2/NMSHandlerImpl.java @@ -505,7 +505,6 @@ public List getBoxContents(Item item) { .toList(); } - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java b/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java index 2d33f8c9..d7cf9775 100644 --- a/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java +++ b/NMS/v1_19_R3/src/main/java/dev/rosewood/rosestacker/nms/v1_19_R3/NMSHandlerImpl.java @@ -505,7 +505,6 @@ public List getBoxContents(Item item) { .toList(); } - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java b/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java index c5dc1098..61207c94 100644 --- a/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java +++ b/NMS/v1_20_R1/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R1/NMSHandlerImpl.java @@ -502,7 +502,6 @@ public List getBoxContents(Item item) { .toList(); } - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java b/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java index 279b3534..7fa5a5ea 100644 --- a/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java +++ b/NMS/v1_20_R2/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R2/NMSHandlerImpl.java @@ -502,7 +502,6 @@ public List getBoxContents(Item item) { .toList(); } - // TODO return new ArrayList<>(); } diff --git a/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java b/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java index 7ea3773d..754e7924 100644 --- a/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java +++ b/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java @@ -495,7 +495,8 @@ public int getItemDespawnRate(Item item) { @Override public List getBoxContents(Item item) { - ItemContainerContents contents = ((ItemEntity) item).getItem().set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); + net.minecraft.world.item.ItemStack itemStack = ((ItemEntity) item).getItem(); + ItemContainerContents contents = itemStack.set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); if (contents != null) { return contents.stream() diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java index fb85cc8d..b2be9286 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/listener/EntityListener.java @@ -2,6 +2,7 @@ import dev.rosewood.guiframework.framework.util.GuiUtil; import dev.rosewood.rosegarden.RosePlugin; +import dev.rosewood.rosegarden.utils.NMSUtil; import dev.rosewood.rosestacker.RoseStacker; import dev.rosewood.rosestacker.event.AsyncEntityDeathEvent; import dev.rosewood.rosestacker.manager.ConfigurationManager.Setting; @@ -244,7 +245,7 @@ public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onEntityDamage(EntityDamageEvent event) { - if (event.getEntity() instanceof Item item && item.getItemStack().getType().toString().contains("SHULKER_BOX") && unpackShulkerBox(item, event.getFinalDamage())) { + if (NMSUtil.getVersionNumber() >= 17 && event.getEntity() instanceof Item item && item.getItemStack().getType().toString().contains("SHULKER_BOX") && unpackShulkerBox(item, event.getFinalDamage())) { event.setCancelled(true); return; } From f5099bfcd902f6aae5f3c27fe7f4be82b0e1e3c1 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Sat, 29 Jun 2024 21:38:32 +0800 Subject: [PATCH 7/7] Fix --- .../dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java b/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java index d000829a..46eda66b 100644 --- a/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java +++ b/NMS/v1_20_R4/src/main/java/dev/rosewood/rosestacker/nms/v1_20_R4/NMSHandlerImpl.java @@ -503,7 +503,7 @@ public EntityDeathEvent createAsyncEntityDeathEvent(@NotNull LivingEntity what, @Override public List getBoxContents(Item item) { - net.minecraft.world.item.ItemStack itemStack = ((ItemEntity) item).getItem(); + net.minecraft.world.item.ItemStack itemStack = CraftItemStack.asNMSCopy(item.getItemStack()); ItemContainerContents contents = itemStack.set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); if (contents != null) {