From 270cb26460d64f1b6a0d5378815a56151e117c64 Mon Sep 17 00:00:00 2001 From: Kam Date: Tue, 10 Mar 2026 03:47:07 -0400 Subject: [PATCH] Better Copy Handling --- .../npcs/controllers/AbilityController.java | 36 ++++++++++ .../data/ability/data/ChainedAbility.java | 1 - .../kamkeel/npcs/network/PacketHandler.java | 8 +++ .../npcs/network/enums/EnumRequestPacket.java | 5 ++ .../ability/ChainedAbilityClonePacket.java | 71 +++++++++++++++++++ .../ability/CustomAbilityClonePacket.java | 71 +++++++++++++++++++ .../request/effects/EffectClonePacket.java | 69 ++++++++++++++++++ .../request/linked/LinkedItemClonePacket.java | 69 ++++++++++++++++++ .../gui/global/GuiAbilityDirectory.java | 21 ++---- .../client/gui/global/GuiEffectDirectory.java | 8 +-- .../gui/global/GuiLinkedItemDirectory.java | 8 +-- .../gui/global/GuiNPCManageEffects.java | 8 +-- .../client/gui/global/GuiNPCManageLinked.java | 9 +-- .../controllers/CustomEffectController.java | 25 +++++-- .../controllers/LinkedItemController.java | 25 +++++-- 15 files changed, 382 insertions(+), 52 deletions(-) create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/ability/ChainedAbilityClonePacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/ability/CustomAbilityClonePacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/effects/EffectClonePacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/linked/LinkedItemClonePacket.java diff --git a/src/main/java/kamkeel/npcs/controllers/AbilityController.java b/src/main/java/kamkeel/npcs/controllers/AbilityController.java index 44445da04..003f58fca 100644 --- a/src/main/java/kamkeel/npcs/controllers/AbilityController.java +++ b/src/main/java/kamkeel/npcs/controllers/AbilityController.java @@ -401,6 +401,24 @@ public class AbilityController implements IAbilityHandler { } } + public Ability cloneCustomAbility(String originalName) { + Ability original = customAbilities.get(originalName); + if (original == null || original.isBuiltIn()) return null; + + NBTTagCompound nbt = original.writeNBT(true); + nbt.setString("id", UUID.randomUUID().toString()); + + Ability clone = fromNBT(nbt); + if (clone == null) return null; + + String name = clone.getName(); + while (customAbilities.containsKey(name)) name += "_"; + clone.setName(name); + + saveCustomAbility(clone); + return clone; + } + public boolean deleteCustomAbility(String name) { if (name == null || name.isEmpty()) return false; @@ -748,6 +766,24 @@ public class AbilityController implements IAbilityHandler { } } + public ChainedAbility cloneChainedAbility(String originalName) { + ChainedAbility original = chainedAbilities.get(originalName); + if (original == null) return null; + + NBTTagCompound nbt = original.writeNBT(true); + nbt.setString("Id", UUID.randomUUID().toString()); + + ChainedAbility clone = new ChainedAbility(); + clone.readNBT(nbt); + + String name = clone.getName(); + while (chainedAbilities.containsKey(name)) name += "_"; + clone.setName(name); + + saveChainedAbility(clone); + return clone; + } + public boolean deleteChainedAbility(String name) { if (name == null || name.isEmpty()) return false; diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/data/ChainedAbility.java b/src/main/java/kamkeel/npcs/controllers/data/ability/data/ChainedAbility.java index fea8005d3..bdf95508f 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/data/ChainedAbility.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/data/ChainedAbility.java @@ -15,7 +15,6 @@ import kamkeel.npcs.util.FileNameHelper; import java.util.ArrayList; import java.util.List; -import java.util.UUID; /** * A chained ability is an ordered sequence of ability references that execute diff --git a/src/main/java/kamkeel/npcs/network/PacketHandler.java b/src/main/java/kamkeel/npcs/network/PacketHandler.java index e9521b86e..c0616e89c 100644 --- a/src/main/java/kamkeel/npcs/network/PacketHandler.java +++ b/src/main/java/kamkeel/npcs/network/PacketHandler.java @@ -90,6 +90,7 @@ import kamkeel.npcs.network.packets.request.ability.AbilitiesNpcGetPacket; import kamkeel.npcs.network.packets.request.ability.AbilitiesNpcSavePacket; import kamkeel.npcs.network.packets.request.ability.BuiltInAbilityGetPacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilitiesGetPacket; +import kamkeel.npcs.network.packets.request.ability.ChainedAbilityClonePacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilityGetPacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilityRemovePacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilitySavePacket; @@ -100,6 +101,7 @@ import kamkeel.npcs.network.packets.request.category.CategoryListRequestPacket; import kamkeel.npcs.network.packets.request.category.CategoryMoveItemPacket; import kamkeel.npcs.network.packets.request.category.CategoryRemovePacket; import kamkeel.npcs.network.packets.request.category.CategorySavePacket; +import kamkeel.npcs.network.packets.request.ability.CustomAbilityClonePacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilityGetPacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilityRemovePacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilitySavePacket; @@ -136,6 +138,7 @@ import kamkeel.npcs.network.packets.request.dialog.DialogNpcSetPacket; import kamkeel.npcs.network.packets.request.dialog.DialogRemovePacket; import kamkeel.npcs.network.packets.request.dialog.DialogSavePacket; import kamkeel.npcs.network.packets.request.dialog.DialogsGetPacket; +import kamkeel.npcs.network.packets.request.effects.EffectClonePacket; import kamkeel.npcs.network.packets.request.effects.EffectGetPacket; import kamkeel.npcs.network.packets.request.effects.EffectRemovePacket; import kamkeel.npcs.network.packets.request.effects.EffectSavePacket; @@ -156,6 +159,7 @@ import kamkeel.npcs.network.packets.request.jobs.JobSpawnerRemovePacket; import kamkeel.npcs.network.packets.request.linked.LinkedGetAllPacket; import kamkeel.npcs.network.packets.request.linked.LinkedGetPacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemBuildPacket; +import kamkeel.npcs.network.packets.request.linked.LinkedItemClonePacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemRemovePacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemSavePacket; import kamkeel.npcs.network.packets.request.linked.LinkedNPCAddPacket; @@ -353,6 +357,7 @@ public class PacketHandler { REQUEST_PACKET.registerPacket(new LinkedItemSavePacket()); REQUEST_PACKET.registerPacket(new LinkedItemRemovePacket()); REQUEST_PACKET.registerPacket(new LinkedItemBuildPacket()); + REQUEST_PACKET.registerPacket(new LinkedItemClonePacket()); // Bank Packets @@ -509,6 +514,7 @@ public class PacketHandler { REQUEST_PACKET.registerPacket(new EffectsGetPacket()); REQUEST_PACKET.registerPacket(new EffectSavePacket()); REQUEST_PACKET.registerPacket(new EffectRemovePacket()); + REQUEST_PACKET.registerPacket(new EffectClonePacket()); // Magic Packets REQUEST_PACKET.registerPacket(new MagicCycleRemovePacket()); @@ -533,6 +539,8 @@ public class PacketHandler { REQUEST_PACKET.registerPacket(new ChainedAbilityGetPacket()); REQUEST_PACKET.registerPacket(new ChainedAbilitySavePacket()); REQUEST_PACKET.registerPacket(new ChainedAbilityRemovePacket()); + REQUEST_PACKET.registerPacket(new CustomAbilityClonePacket()); + REQUEST_PACKET.registerPacket(new ChainedAbilityClonePacket()); // Category Packets REQUEST_PACKET.registerPacket(new CategorySavePacket()); diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java index 11b330762..c76e5adb9 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java @@ -223,4 +223,9 @@ public enum EnumRequestPacket { CategoryListRequest, CategoryItemsRequest, AbilityCategoryMoveItem, + + CustomAbilityClone, + ChainedAbilityClone, + LinkedItemClone, + EffectClone, } diff --git a/src/main/java/kamkeel/npcs/network/packets/request/ability/ChainedAbilityClonePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/ability/ChainedAbilityClonePacket.java new file mode 100644 index 000000000..07ab7d3d1 --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/ability/ChainedAbilityClonePacket.java @@ -0,0 +1,71 @@ +package kamkeel.npcs.network.packets.request.ability; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.controllers.AbilityController; +import kamkeel.npcs.controllers.data.ability.data.ChainedAbility; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.PacketUtil; +import kamkeel.npcs.network.enums.EnumItemPacketType; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.network.packets.data.large.GuiDataPacket; +import kamkeel.npcs.util.ByteBufUtils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.NoppesUtilServer; + +import java.io.IOException; + +public final class ChainedAbilityClonePacket extends AbstractPacket { + public static String packetName = "Request|ChainedAbilityClone"; + + private String name; + + public ChainedAbilityClonePacket() { + } + + public ChainedAbilityClonePacket(String name) { + this.name = name; + } + + @Override + public Enum getType() { + return EnumRequestPacket.ChainedAbilityClone; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.GLOBAL_ABILITY; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + ByteBufUtils.writeString(out, name); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + if (!PacketUtil.verifyItemPacket(packetName, EnumItemPacketType.WAND, player)) + return; + + String chainName = ByteBufUtils.readString(in); + ChainedAbility clone = AbilityController.Instance.cloneChainedAbility(chainName); + if (clone != null) { + NoppesUtilServer.sendChainedAbilitiesData((EntityPlayerMP) player); + GuiDataPacket.sendGuiData((EntityPlayerMP) player, clone.writeNBT(false)); + } + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/ability/CustomAbilityClonePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/ability/CustomAbilityClonePacket.java new file mode 100644 index 000000000..03045a25f --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/ability/CustomAbilityClonePacket.java @@ -0,0 +1,71 @@ +package kamkeel.npcs.network.packets.request.ability; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.controllers.AbilityController; +import kamkeel.npcs.controllers.data.ability.Ability; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.PacketUtil; +import kamkeel.npcs.network.enums.EnumItemPacketType; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.network.packets.data.large.GuiDataPacket; +import kamkeel.npcs.util.ByteBufUtils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.NoppesUtilServer; + +import java.io.IOException; + +public final class CustomAbilityClonePacket extends AbstractPacket { + public static String packetName = "Request|CustomAbilityClone"; + + private String name; + + public CustomAbilityClonePacket() { + } + + public CustomAbilityClonePacket(String name) { + this.name = name; + } + + @Override + public Enum getType() { + return EnumRequestPacket.CustomAbilityClone; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.GLOBAL_ABILITY; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + ByteBufUtils.writeString(out, name); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + if (!PacketUtil.verifyItemPacket(packetName, EnumItemPacketType.WAND, player)) + return; + + String abilityName = ByteBufUtils.readString(in); + Ability clone = AbilityController.Instance.cloneCustomAbility(abilityName); + if (clone != null) { + NoppesUtilServer.sendCustomAbilitiesData((EntityPlayerMP) player); + GuiDataPacket.sendGuiData((EntityPlayerMP) player, clone.writeNBT(false)); + } + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/effects/EffectClonePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/effects/EffectClonePacket.java new file mode 100644 index 000000000..b946e0f0f --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/effects/EffectClonePacket.java @@ -0,0 +1,69 @@ +package kamkeel.npcs.network.packets.request.effects; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.PacketUtil; +import kamkeel.npcs.network.enums.EnumItemPacketType; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.network.packets.data.large.GuiDataPacket; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.controllers.CustomEffectController; +import noppes.npcs.controllers.data.CustomEffect; + +import java.io.IOException; + +public final class EffectClonePacket extends AbstractPacket { + public static String packetName = "Request|EffectClone"; + + private int id; + + public EffectClonePacket() { + } + + public EffectClonePacket(int id) { + this.id = id; + } + + @Override + public Enum getType() { + return EnumRequestPacket.EffectClone; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.GLOBAL_EFFECT; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + out.writeInt(this.id); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + if (!PacketUtil.verifyItemPacket(packetName, EnumItemPacketType.WAND, player)) + return; + + int effectId = in.readInt(); + CustomEffect clone = CustomEffectController.getInstance().cloneEffect(effectId); + if (clone != null) { + NoppesUtilServer.sendCustomEffectDataAll((EntityPlayerMP) player); + GuiDataPacket.sendGuiData((EntityPlayerMP) player, clone.writeToNBT(false)); + } + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/linked/LinkedItemClonePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/linked/LinkedItemClonePacket.java new file mode 100644 index 000000000..5eda0f5d0 --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/linked/LinkedItemClonePacket.java @@ -0,0 +1,69 @@ +package kamkeel.npcs.network.packets.request.linked; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.PacketUtil; +import kamkeel.npcs.network.enums.EnumItemPacketType; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.network.packets.data.large.GuiDataPacket; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.NoppesUtilServer; +import noppes.npcs.controllers.LinkedItemController; +import noppes.npcs.controllers.data.LinkedItem; + +import java.io.IOException; + +public final class LinkedItemClonePacket extends AbstractPacket { + public static String packetName = "Request|LinkedItemClone"; + + private int id; + + public LinkedItemClonePacket() { + } + + public LinkedItemClonePacket(int id) { + this.id = id; + } + + @Override + public Enum getType() { + return EnumRequestPacket.LinkedItemClone; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public CustomNpcsPermissions.Permission getPermission() { + return CustomNpcsPermissions.GLOBAL_LINKED; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + out.writeInt(this.id); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + if (!PacketUtil.verifyItemPacket(packetName, EnumItemPacketType.WAND, player)) + return; + + int linkedId = in.readInt(); + LinkedItem clone = LinkedItemController.getInstance().cloneLinkedItem(linkedId); + if (clone != null) { + NoppesUtilServer.sendLinkedItemDataAll((EntityPlayerMP) player); + GuiDataPacket.sendGuiData((EntityPlayerMP) player, clone.writeToNBT(false)); + } + } +} diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiAbilityDirectory.java b/src/main/java/noppes/npcs/client/gui/global/GuiAbilityDirectory.java index b16bccd81..8985c80da 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiAbilityDirectory.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiAbilityDirectory.java @@ -11,10 +11,12 @@ import kamkeel.npcs.controllers.data.telegraph.TelegraphInstance; import kamkeel.npcs.network.PacketClient; import kamkeel.npcs.network.packets.request.ability.BuiltInAbilityGetPacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilityGetPacket; +import kamkeel.npcs.network.packets.request.ability.ChainedAbilityClonePacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilityRemovePacket; import kamkeel.npcs.network.packets.request.ability.ChainedAbilitySavePacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilitiesGetPacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilityGetPacket; +import kamkeel.npcs.network.packets.request.ability.CustomAbilityClonePacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilityRemovePacket; import kamkeel.npcs.network.packets.request.ability.CustomAbilitySavePacket; import kamkeel.npcs.network.packets.request.category.AbilityCategoryMovePacket; @@ -271,24 +273,11 @@ public class GuiAbilityDirectory extends GuiDirectoryCategorized protected void onCloneItem() { if (currentIsBuiltIn) return; if (isChainedMode() && selectedChain != null) { - ChainedAbility clone = new ChainedAbility(); - NBTTagCompound chainNbt = selectedChain.writeNBT(true); - chainNbt.setString("Id", UUID.randomUUID().toString()); - clone.readNBT(chainNbt); - String cloneName = selectedChain.getName() + "_copy"; - clone.setName(cloneName); - PacketClient.sendClient(new ChainedAbilitySavePacket(clone.writeNBT(true))); + PacketClient.sendClient(new ChainedAbilityClonePacket(selectedChain.getName())); if (selectedCatId >= 0) requestItemsInCategory(selectedCatId); } else if (selectedAbility != null) { - NBTTagCompound abilityNbt = selectedAbility.writeNBT(true); - abilityNbt.setString("id", UUID.randomUUID().toString()); - Ability clone = AbilityController.Instance.fromNBT(abilityNbt); - if (clone != null) { - String cloneName = selectedAbility.getName() + "_copy"; - clone.setName(cloneName); - PacketClient.sendClient(new CustomAbilitySavePacket(clone.writeNBT(true))); - if (selectedCatId >= 0 && isCustomMode()) requestItemsInCategory(selectedCatId); - } + PacketClient.sendClient(new CustomAbilityClonePacket(selectedAbility.getName())); + if (selectedCatId >= 0 && isCustomMode()) requestItemsInCategory(selectedCatId); } } diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiEffectDirectory.java b/src/main/java/noppes/npcs/client/gui/global/GuiEffectDirectory.java index 5fa69021b..4133082d0 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiEffectDirectory.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiEffectDirectory.java @@ -8,6 +8,7 @@ import kamkeel.npcs.network.packets.request.category.CategoryRemovePacket; import kamkeel.npcs.network.packets.request.category.CategorySavePacket; import kamkeel.npcs.network.packets.request.effects.EffectGetPacket; import kamkeel.npcs.network.packets.request.effects.EffectRemovePacket; +import kamkeel.npcs.network.packets.request.effects.EffectClonePacket; import kamkeel.npcs.network.packets.request.effects.EffectSavePacket; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.texture.TextureManager; @@ -89,12 +90,7 @@ public class GuiEffectDirectory extends GuiDirectoryCategorized { @Override protected void onCloneItem() { if (effect != null && effect.id >= 0) { - NBTTagCompound cloneNbt = effect.writeToNBT(true); - cloneNbt.setInteger("ID", -1); - String name = cloneNbt.getString("name"); - while (itemData.containsKey(name)) name += "_"; - cloneNbt.setString("name", name); - PacketClient.sendClient(new EffectSavePacket(cloneNbt, "")); + PacketClient.sendClient(new EffectClonePacket(effect.id)); } } diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiLinkedItemDirectory.java b/src/main/java/noppes/npcs/client/gui/global/GuiLinkedItemDirectory.java index 117cb60c6..20f92a51f 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiLinkedItemDirectory.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiLinkedItemDirectory.java @@ -9,6 +9,7 @@ import kamkeel.npcs.network.packets.request.category.CategorySavePacket; import kamkeel.npcs.network.packets.request.linked.LinkedGetPacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemBuildPacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemRemovePacket; +import kamkeel.npcs.network.packets.request.linked.LinkedItemClonePacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemSavePacket; import kamkeel.npcs.util.ColorUtil; import net.minecraft.client.gui.GuiScreen; @@ -90,12 +91,7 @@ public class GuiLinkedItemDirectory extends GuiDirectoryCategorized { @Override protected void onCloneItem() { if (linkedItem != null && linkedItem.id >= 0) { - NBTTagCompound cloneNbt = linkedItem.writeToNBT(true); - cloneNbt.setInteger("Id", -1); - String name = cloneNbt.getString("Name"); - while (itemData.containsKey(name)) name += "_"; - cloneNbt.setString("Name", name); - PacketClient.sendClient(new LinkedItemSavePacket(cloneNbt, "")); + PacketClient.sendClient(new LinkedItemClonePacket(linkedItem.id)); } } diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageEffects.java b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageEffects.java index 741b7d2d8..80fe7b943 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageEffects.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageEffects.java @@ -3,6 +3,7 @@ package noppes.npcs.client.gui.global; import kamkeel.npcs.network.PacketClient; import kamkeel.npcs.network.packets.request.effects.EffectGetPacket; import kamkeel.npcs.network.packets.request.effects.EffectRemovePacket; +import kamkeel.npcs.network.packets.request.effects.EffectClonePacket; import kamkeel.npcs.network.packets.request.effects.EffectSavePacket; import kamkeel.npcs.network.packets.request.effects.EffectsGetPacket; import net.minecraft.client.gui.GuiButton; @@ -106,10 +107,9 @@ public class GuiNPCManageEffects extends GuiNPCInterface2 implements ICustomScro displayGuiScreen(guiyesno); } } else if (button.id == 2) { - CustomEffect effect = this.effect.cloneEffect(); - while (data.containsKey(effect.name)) - effect.name += "_"; - PacketClient.sendClient(new EffectSavePacket(effect.writeToNBT(false), "")); + if (effect != null && effect.id >= 0) { + PacketClient.sendClient(new EffectClonePacket(effect.id)); + } } if (button.id == 66) { diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java index eeeb69a77..ea200e7e3 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java @@ -5,6 +5,7 @@ import kamkeel.npcs.network.packets.request.linked.LinkedGetAllPacket; import kamkeel.npcs.network.packets.request.linked.LinkedGetPacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemBuildPacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemRemovePacket; +import kamkeel.npcs.network.packets.request.linked.LinkedItemClonePacket; import kamkeel.npcs.network.packets.request.linked.LinkedItemSavePacket; import kamkeel.npcs.network.packets.request.linked.LinkedNPCAddPacket; import kamkeel.npcs.network.packets.request.linked.LinkedNPCRemovePacket; @@ -288,13 +289,7 @@ public class GuiNPCManageLinked extends GuiNPCInterface2 implements IScrollData, } if (button.id == 4) { if (data.containsKey(scroll.getSelected()) && linkedItem != null && linkedItem.id >= 0) { - String name = linkedItem.name; - while (data.containsKey(name)) - name += "_"; - LinkedItem linkedItemClone = this.linkedItem.clone(); - linkedItemClone.name = name; - linkedItemClone.id = -1; - PacketClient.sendClient(new LinkedItemSavePacket(linkedItemClone.writeToNBT(false), "")); + PacketClient.sendClient(new LinkedItemClonePacket(this.linkedItem.id)); } } if (button.id == 5) { diff --git a/src/main/java/noppes/npcs/controllers/CustomEffectController.java b/src/main/java/noppes/npcs/controllers/CustomEffectController.java index c5f083788..bff6b64bd 100644 --- a/src/main/java/noppes/npcs/controllers/CustomEffectController.java +++ b/src/main/java/noppes/npcs/controllers/CustomEffectController.java @@ -673,13 +673,7 @@ public class CustomEffectController implements ICustomEffectHandler { @Override public ICustomEffect saveEffect(ICustomEffect customEffect) { if (customEffect.getID() < 0) { - int oldId = customEffect.getID(); customEffect.setID(getUnusedId()); - // Move script handler from old ID to new ID (e.g. during clone) - EffectScript handler = customEffectScriptHandlers.remove(oldId); - if (handler != null) { - customEffectScriptHandlers.put(customEffect.getID(), handler); - } while (has(customEffect.getName())) customEffect.setName(customEffect.getName() + "_"); } @@ -714,4 +708,23 @@ public class CustomEffectController implements ICustomEffectHandler { return getCustomEffects().get(customEffect.getID()); } + public CustomEffect cloneEffect(int originalId) { + CustomEffect original = getCustomEffects().get(originalId); + if (original == null) return null; + + NBTTagCompound nbt = original.writeToNBT(true); + int newId = getUnusedId(); + nbt.setInteger("ID", newId); + + CustomEffect clone = new CustomEffect(); + clone.readFromNBT(nbt); + + String name = clone.getName(); + while (has(name)) name += "_"; + clone.name = name; + + saveEffect(clone); + return clone; + } + } diff --git a/src/main/java/noppes/npcs/controllers/LinkedItemController.java b/src/main/java/noppes/npcs/controllers/LinkedItemController.java index 1820a21ac..e0aeccb71 100644 --- a/src/main/java/noppes/npcs/controllers/LinkedItemController.java +++ b/src/main/java/noppes/npcs/controllers/LinkedItemController.java @@ -209,13 +209,7 @@ public class LinkedItemController implements ILinkedItemHandler { public ILinkedItem saveLinkedItem(ILinkedItem linkedItem) { if (linkedItem.getId() < 0) { - int oldId = linkedItem.getId(); linkedItem.setId(getUnusedId()); - // Move script handler from old ID to new ID (e.g. during clone) - LinkedItemScript handler = linkedItemsScripts.remove(oldId); - if (handler != null) { - linkedItemsScripts.put(linkedItem.getId(), handler); - } while (hasName(linkedItem.getName())) linkedItem.setName(linkedItem.getName() + "_"); } @@ -247,6 +241,25 @@ public class LinkedItemController implements ILinkedItemHandler { return linkedItems.get(linkedItem.getId()); } + public LinkedItem cloneLinkedItem(int originalId) { + LinkedItem original = linkedItems.get(originalId); + if (original == null) return null; + + NBTTagCompound nbt = original.writeToNBT(true); + int newId = getUnusedId(); + nbt.setInteger("Id", newId); + + LinkedItem clone = new LinkedItem(); + clone.readFromNBT(nbt); + + String name = clone.getName(); + while (hasName(name)) name += "_"; + clone.name = name; + + saveLinkedItem(clone); + return clone; + } + private boolean hasOther(String name, int id) { for (LinkedItem linkedItem : linkedItems.values()) { if (linkedItem.getId() != id && linkedItem.getName().equalsIgnoreCase(name))