From fdd47691aeca73d7fcf49249fabccda6ce9b418f Mon Sep 17 00:00:00 2001 From: Kam Date: Tue, 18 Feb 2025 02:15:06 -0500 Subject: [PATCH] Fix Linked Item Duplication Bug --- src/api | 2 +- .../npcs/controllers/data/LinkedItem.java | 4 +- .../java/noppes/npcs/items/ItemLinked.java | 46 +++++++++++++++++++ .../java/noppes/npcs/scripted/NpcAPI.java | 23 +++------- .../npcs/scripted/item/ScriptLinkedItem.java | 2 + 5 files changed, 57 insertions(+), 20 deletions(-) diff --git a/src/api b/src/api index 3f0171aaf..0d9abd56f 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 3f0171aafece7c36c89a0e3448747a9918791574 +Subproject commit 0d9abd56f6f1ab8bdc7d5ce844a668df86f20bf3 diff --git a/src/main/java/noppes/npcs/controllers/data/LinkedItem.java b/src/main/java/noppes/npcs/controllers/data/LinkedItem.java index 48465b35b..9acf2be16 100644 --- a/src/main/java/noppes/npcs/controllers/data/LinkedItem.java +++ b/src/main/java/noppes/npcs/controllers/data/LinkedItem.java @@ -2,13 +2,11 @@ package noppes.npcs.controllers.data; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagInt; import net.minecraftforge.common.util.Constants; import noppes.npcs.CustomItems; import noppes.npcs.EventHooks; import noppes.npcs.api.handler.data.ILinkedItem; import noppes.npcs.api.item.IItemStack; -import noppes.npcs.controllers.CustomEffectController; import noppes.npcs.controllers.LinkedItemController; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.item.ScriptLinkedItem; @@ -102,6 +100,7 @@ public class LinkedItem implements ILinkedItem { } } + @Override public ILinkedItem save() { return LinkedItemController.getInstance().saveLinkedItem(this); } @@ -110,6 +109,7 @@ public class LinkedItem implements ILinkedItem { LinkedItemController.getInstance().linkedItemsScripts.put(this.id, handler); } + @Override public IItemStack createStack() { LinkedItem copy = this.clone(); ItemStack stack = new ItemStack(CustomItems.linked_item, 1); diff --git a/src/main/java/noppes/npcs/items/ItemLinked.java b/src/main/java/noppes/npcs/items/ItemLinked.java index cc7b31b35..ed9cdeddc 100644 --- a/src/main/java/noppes/npcs/items/ItemLinked.java +++ b/src/main/java/noppes/npcs/items/ItemLinked.java @@ -1,6 +1,17 @@ package noppes.npcs.items; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; import noppes.npcs.CustomNpcs; +import noppes.npcs.EventHooks; +import noppes.npcs.api.item.IItemStack; +import noppes.npcs.controllers.LinkedItemController; +import noppes.npcs.controllers.data.LinkedItem; +import noppes.npcs.scripted.NpcAPI; +import noppes.npcs.scripted.item.ScriptLinkedItem; public class ItemLinked extends ItemCustomizable { @@ -9,4 +20,39 @@ public class ItemLinked extends ItemCustomizable { CustomNpcs.proxy.registerItem(this); setHasSubtypes(true); } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int itemSlot, boolean isSelected) { + if (world.isRemote) + return; + + if(world.getTotalWorldTime() % 10 != 0) + return; + + IItemStack itemStack = NpcAPI.Instance().getIItemStack(stack); + if(itemStack instanceof ScriptLinkedItem){ + ScriptLinkedItem scriptLinkedItem = (ScriptLinkedItem) itemStack; + LinkedItem linkedItem = LinkedItemController.getInstance().get(scriptLinkedItem.linkedItem.getId()); + int prevVersion = scriptLinkedItem.linkedVersion; + if(linkedItem != null && scriptLinkedItem.linkedVersion != linkedItem.version){ + scriptLinkedItem.linkedItem = linkedItem.clone(); + scriptLinkedItem.linkedVersion = linkedItem.version; + scriptLinkedItem.saveItemData(); + + // Send Version Change Event + EventHooks.onLinkedItemVersionChange(scriptLinkedItem, linkedItem.version, prevVersion); + } else if (linkedItem == null){ + if (entity instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) entity; + player.inventory.setInventorySlotContents(itemSlot, null); // Remove the item + player.inventory.markDirty(); // Ensure inventory updates + + // Sync inventory with client + if (player instanceof EntityPlayerMP) { + ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); + } + } + } + } + } } diff --git a/src/main/java/noppes/npcs/scripted/NpcAPI.java b/src/main/java/noppes/npcs/scripted/NpcAPI.java index f49cdb840..e68dde801 100644 --- a/src/main/java/noppes/npcs/scripted/NpcAPI.java +++ b/src/main/java/noppes/npcs/scripted/NpcAPI.java @@ -488,23 +488,12 @@ public class NpcAPI extends AbstractNpcAPI { } // Version Check Linked Item - if(scriptStack instanceof ScriptLinkedItem && CustomNpcs.side() == Side.SERVER){ - ScriptLinkedItem scriptLinkedItem = (ScriptLinkedItem) scriptStack; - LinkedItem linkedItem = LinkedItemController.getInstance().get(scriptLinkedItem.linkedItem.getId()); - - int prevVersion = scriptLinkedItem.linkedVersion; - if(linkedItem != null && scriptLinkedItem.linkedVersion != linkedItem.version){ - scriptLinkedItem.linkedItem = linkedItem.clone(); - scriptLinkedItem.linkedVersion = linkedItem.version; - scriptLinkedItem.saveItemData(); - - // Send Version Change Event - EventHooks.onLinkedItemVersionChange(scriptLinkedItem, linkedItem.version, prevVersion); - } else if (linkedItem == null){ - // Destroy Linked Item - scriptStack.item.stackSize = 0; - } - } +// if(scriptStack instanceof ScriptLinkedItem && CustomNpcs.side() == Side.SERVER){ +// ScriptLinkedItem scriptLinkedItem = (ScriptLinkedItem) scriptStack; +// LinkedItem linkedItem = LinkedItemController.getInstance().get(scriptLinkedItem.linkedItem.getId()); +// +// +// } return scriptStack; } } diff --git a/src/main/java/noppes/npcs/scripted/item/ScriptLinkedItem.java b/src/main/java/noppes/npcs/scripted/item/ScriptLinkedItem.java index 4dcaab574..41c63da15 100644 --- a/src/main/java/noppes/npcs/scripted/item/ScriptLinkedItem.java +++ b/src/main/java/noppes/npcs/scripted/item/ScriptLinkedItem.java @@ -51,6 +51,8 @@ public class ScriptLinkedItem extends ScriptCustomizableItem implements IItemLin @Override public INpcScriptHandler getScriptHandler() { + if(this.getLinkedItem() == null) + return null; return this.getLinkedItem().getScriptHandler(); }