Better Copy Handling

This commit is contained in:
Kam committed 2026-03-10 03:47:07 -04:00
1 parent 18d788974a
commit 270cb26460
15 files changed
+382 -52

No files matched your search

@@ -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;
@@ -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
@@ -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());
@@ -223,4 +223,9 @@ public enum EnumRequestPacket {
CategoryListRequest,
CategoryItemsRequest,
AbilityCategoryMoveItem,
CustomAbilityClone,
ChainedAbilityClone,
LinkedItemClone,
EffectClone,
}
@@ -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));
}
}
}
@@ -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));
}
}
}
@@ -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));
}
}
}
@@ -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));
}
}
}
@@ -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);
}
}
@@ -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));
}
}
@@ -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));
}
}
@@ -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) {
@@ -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) {
@@ -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;
}
}
@@ -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))