From 4628858d64e75dd921d3489cd437173d7ecf8186 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 10 May 2022 16:24:04 +0200 Subject: [PATCH] no more template shifting --- .../inventory/recipes/AssemblerRecipes.java | 17 +- .../items/machine/ItemAssemblyTemplate.java | 466 +++++++++--------- .../java/com/hbm/packet/ItemFolderPacket.java | 11 + .../textures/gui/processing/gui_assemfac.png | Bin 0 -> 4252 bytes 4 files changed, 263 insertions(+), 231 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/gui/processing/gui_assemfac.png diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 7b3af0c45..277967664 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -95,6 +95,14 @@ public class AssemblerRecipes { if(stack != null && stack.getItem() instanceof ItemAssemblyTemplate) { + ComparableStack comp = ItemAssemblyTemplate.readType(stack); + + //NEW + if(comp != null) { + return comp.toStack(); + } + + //LEGACY int i = stack.getItemDamage(); if(i >= 0 && i < recipeList.size()) { return recipeList.get(i).toStack(); @@ -108,8 +116,15 @@ public class AssemblerRecipes { if(stack != null && stack.getItem() instanceof ItemAssemblyTemplate) { - int i = stack.getItemDamage(); + //NEW + ComparableStack compStack = ItemAssemblyTemplate.readType(stack); + if(compStack != null) { + AStack[] ret = recipes.get(compStack); + return Arrays.asList(ret); + } + //LEGACY + int i = stack.getItemDamage(); if(i >= 0 && i < recipeList.size()) { ItemStack out = recipeList.get(i).toStack(); diff --git a/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java b/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java index e1e97e33f..10ebdf66a 100644 --- a/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java +++ b/src/main/java/com/hbm/items/machine/ItemAssemblyTemplate.java @@ -8,7 +8,6 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.recipes.AssemblerRecipes; import com.hbm.items.ModItems; -import com.hbm.lib.RefStrings; import com.hbm.util.I18nUtil; import cpw.mods.fml.relauncher.Side; @@ -18,263 +17,270 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; public class ItemAssemblyTemplate extends Item { - - @SideOnly(Side.CLIENT) - protected IIcon hiddenIcon; - public ItemAssemblyTemplate() - { - this.setHasSubtypes(true); - this.setMaxDamage(0); - } - - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamage(int meta) { - - ComparableStack stack = AssemblerRecipes.recipeList.get(meta); - - if(AssemblerRecipes.hidden.get(stack) != null) - return this.hiddenIcon; - - return this.itemIcon; - } - - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister reg) { - super.registerIcons(reg); - this.hiddenIcon = reg.registerIcon(this.iconString + "_secret"); - } - - public String getItemStackDisplayName(ItemStack stack) - { - String s = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); - ItemStack out = stack.getItemDamage() < AssemblerRecipes.recipeList.size() ? AssemblerRecipes.recipeList.get(stack.getItemDamage()).toStack() : null; - String s1 = ("" + StatCollector.translateToLocal((out != null ? out.getUnlocalizedName() : "") + ".name")).trim(); - - if (s1 != null) - { - s = s + " " + s1; - } - - return s; - } - - @Override @SideOnly(Side.CLIENT) - public void getSubItems(Item item, CreativeTabs tabs, List list) { - - int count = AssemblerRecipes.recipeList.size(); - - for(int i = 0; i < count; i++) { - list.add(new ItemStack(item, 1, i)); - } - } - - public static int getProcessTime(ItemStack stack) { - - if(!(stack.getItem() instanceof ItemAssemblyTemplate)) - return 100; - - int i = stack.getItemDamage(); - - if(i < 0 || i >= AssemblerRecipes.recipeList.size()) - return 100; - - ComparableStack out = AssemblerRecipes.recipeList.get(i); - Integer time = AssemblerRecipes.time.get(out); - - if(time != null) - return time; - else - return 100; - } + protected IIcon hiddenIcon; + + public ItemAssemblyTemplate() { + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @SideOnly(Side.CLIENT) + public IIcon getIconFromDamage(int meta) { + + ComparableStack stack = AssemblerRecipes.recipeList.get(meta); + + if(AssemblerRecipes.hidden.get(stack) != null) + return this.hiddenIcon; + + return this.itemIcon; + } + + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister reg) { + super.registerIcons(reg); + this.hiddenIcon = reg.registerIcon(this.iconString + "_secret"); + } + public static void writeType(ItemStack stack, ComparableStack comp) { + if(!stack.hasTagCompound()) + stack.stackTagCompound = new NBTTagCompound(); + + stack.stackTagCompound.setInteger("id", Item.getIdFromItem(comp.item)); + stack.stackTagCompound.setByte("count", (byte)comp.stacksize); + stack.stackTagCompound.setShort("meta", (short)comp.meta); + } + + public static ComparableStack readType(ItemStack stack) { + if(!stack.hasTagCompound()) + return null; + + if(!stack.stackTagCompound.hasKey("id")) + return null; + + int id = stack.stackTagCompound.getInteger("id"); + int count = stack.stackTagCompound.getByte("count"); + int meta = stack.stackTagCompound.getShort("meta"); + + return new ComparableStack(Item.getItemById(id), count, meta); + } + + public String getItemStackDisplayName(ItemStack stack) { + String s = ("" + StatCollector.translateToLocal(this.getUnlocalizedName() + ".name")).trim(); + ItemStack out = stack.getItemDamage() < AssemblerRecipes.recipeList.size() ? AssemblerRecipes.recipeList.get(stack.getItemDamage()).toStack() : null; + String s1 = ("" + StatCollector.translateToLocal((out != null ? out.getUnlocalizedName() : "") + ".name")).trim(); + + if(s1 != null) { + s = s + " " + s1; + } + + return s; + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list) { + + int count = AssemblerRecipes.recipeList.size(); + + for(int i = 0; i < count; i++) { + list.add(new ItemStack(item, 1, i)); + } + } + + public static int getProcessTime(ItemStack stack) { + + if(!(stack.getItem() instanceof ItemAssemblyTemplate)) + return 100; + + int i = stack.getItemDamage(); + + if(i < 0 || i >= AssemblerRecipes.recipeList.size()) + return 100; + + //NEW + ComparableStack out = readType(stack); + //LEGACY + if(out == null) out = AssemblerRecipes.recipeList.get(i); + Integer time = AssemblerRecipes.time.get(out); + + if(time != null) + return time; + else + return 100; + } + @Override public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean bool) { - - if(!(stack.getItem() instanceof ItemAssemblyTemplate)) - return; - - int i = stack.getItemDamage(); - - if(i < 0 || i >= AssemblerRecipes.recipeList.size()) { - list.add("I AM ERROR"); - return; - } - - ComparableStack out = AssemblerRecipes.recipeList.get(i); - - HashSet folders = AssemblerRecipes.hidden.get(out); - - if(folders == null) - folders = new HashSet() {{ add(ModItems.template_folder); }}; - - String[] names = new String[folders.size()]; - - int a = 0; - for(Item folder : folders) { - names[a] = I18nUtil.resolveKey(folder.getUnlocalizedName() + ".name"); - a++; - } - + + if(!(stack.getItem() instanceof ItemAssemblyTemplate)) + return; + + int i = stack.getItemDamage(); + + if(i < 0 || i >= AssemblerRecipes.recipeList.size()) { + list.add("I AM ERROR"); + return; + } + + boolean nbtType = true; + + //NEW + ComparableStack out = readType(stack); + //LEGACY + if(out == null) { + out = AssemblerRecipes.recipeList.get(i); + nbtType = false; + } + Integer time = AssemblerRecipes.time.get(out); + + HashSet folders = AssemblerRecipes.hidden.get(out); + + if(folders == null) + folders = new HashSet() { + { + add(ModItems.template_folder); + } + }; + + String[] names = new String[folders.size()]; + + int a = 0; + for(Item folder : folders) { + names[a] = I18nUtil.resolveKey(folder.getUnlocalizedName() + ".name"); + a++; + } + list.add(EnumChatFormatting.YELLOW + I18nUtil.resolveKey("info.templatefolder", String.join(" / ", names))); + + if(nbtType) { + list.add(EnumChatFormatting.GREEN + "Persistent template"); + } else { + list.add(EnumChatFormatting.RED + "Volatile template"); + } + list.add(""); - - if(out == null) { - list.add("I AM ERROR"); - return; - } - - Object[] in = AssemblerRecipes.recipes.get(out); - - if(in == null) { - list.add("I AM ERROR"); - return; - } - - ItemStack output = out.toStack(); - + + if(out == null) { + list.add("I AM ERROR"); + return; + } + + Object[] in = AssemblerRecipes.recipes.get(out); + + if(in == null) { + list.add("I AM ERROR"); + return; + } + + ItemStack output = out.toStack(); + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_out")); list.add(output.stackSize + "x " + output.getDisplayName()); list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_in_p")); - + for(Object o : in) { - - if(o instanceof ComparableStack) { - ItemStack input = ((ComparableStack)o).toStack(); - list.add(input.stackSize + "x " + input.getDisplayName()); - - } else if(o instanceof OreDictStack) { + + if(o instanceof ComparableStack) { + ItemStack input = ((ComparableStack) o).toStack(); + list.add(input.stackSize + "x " + input.getDisplayName()); + + } else if(o instanceof OreDictStack) { OreDictStack input = (OreDictStack) o; ArrayList ores = OreDictionary.getOres(input.name); - + if(ores.size() > 0) { ItemStack inStack = ores.get((int) (Math.abs(System.currentTimeMillis() / 1000) % ores.size())); - list.add(input.stacksize + "x " + inStack.getDisplayName()); + list.add(input.stacksize + "x " + inStack.getDisplayName()); } else { - list.add("I AM ERROR"); + list.add("I AM ERROR"); } } } - + list.add(EnumChatFormatting.BOLD + I18nUtil.resolveKey("info.template_time")); - list.add(Math.floor((float)(getProcessTime(stack)) / 20 * 100) / 100 + " " + I18nUtil.resolveKey("info.template_seconds")); + list.add(Math.floor((float) (getProcessTime(stack)) / 20 * 100) / 100 + " " + I18nUtil.resolveKey("info.template_seconds")); } - /*@Override - @SideOnly(Side.CLIENT) - public boolean requiresMultipleRenderPasses() - { - return true; - } - - public int getRenderPasses(int metadata) - { - return 8; - } - - IIcon[] overlays; + /* + * @Override + * + * @SideOnly(Side.CLIENT) public boolean requiresMultipleRenderPasses() { + * return true; } + * + * public int getRenderPasses(int metadata) { return 8; } + * + * IIcon[] overlays; + * + * @Override + * + * @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister + * p_94581_1_) { super.registerIcons(p_94581_1_); + * + * this.overlays = new IIcon[7]; + * + * for(int i = 0; i < 7; i++) overlays[i] = + * p_94581_1_.registerIcon("hbm:assembly_template_" + i); } + * + * @Override + * + * @SideOnly(Side.CLIENT) public IIcon getIconFromDamageForRenderPass(int a, + * int b) { return b < 7 ? overlays[b] : + * super.getIconFromDamageForRenderPass(a, b); } + * + * @Override + * + * @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack stack, + * int layer) { if (layer == 7) { return 0xFFFFFF; } else if(layer < 7) { + * int j = colorFromSeed(getSeedFromMeta(stack.getItemDamage(), layer)); + * + * if (j < 0) { j = 0xFFFFFF; } + * + * return j; } + * + * return 0; } + * + * private int getSeedFromMeta(int i, int count) { Random rand = new + * Random(i); + * + * int cap = 11; + * + * for(int j = 0; j < count - 1; j++) rand.nextInt(cap); + * + * return rand.nextInt(cap); } + * + * private int colorFromSeed(int i) { switch(i) { case 0: return 0x334077; + * case 1: return 0x6A298F; case 2: return 0xDF3795; case 3: return + * 0xFF0000; case 4: return 0x00FF00; case 5: return 0x0000FF; case 6: + * return 0xFFFF00; case 7: return 0x00FFFF; case 8: return 0x888888; case + * 9: return 0xFFFFFF; case 10: return 0x000000; default: return 0xFFFFFF; } + * } + */ - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IIconRegister p_94581_1_) - { - super.registerIcons(p_94581_1_); - - this.overlays = new IIcon[7]; - - for(int i = 0; i < 7; i++) - overlays[i] = p_94581_1_.registerIcon("hbm:assembly_template_" + i); - } - - @Override - @SideOnly(Side.CLIENT) - public IIcon getIconFromDamageForRenderPass(int a, int b) - { - return b < 7 ? overlays[b] : super.getIconFromDamageForRenderPass(a, b); - } - - @Override - @SideOnly(Side.CLIENT) - public int getColorFromItemStack(ItemStack stack, int layer) - { - if (layer == 7) - { - return 0xFFFFFF; - } - else if(layer < 7) - { - int j = colorFromSeed(getSeedFromMeta(stack.getItemDamage(), layer)); - - if (j < 0) - { - j = 0xFFFFFF; - } - - return j; - } - - return 0; - } - - private int getSeedFromMeta(int i, int count) { - Random rand = new Random(i); - - int cap = 11; - - for(int j = 0; j < count - 1; j++) - rand.nextInt(cap); - - return rand.nextInt(cap); - } - - private int colorFromSeed(int i) { - switch(i) { - case 0: return 0x334077; - case 1: return 0x6A298F; - case 2: return 0xDF3795; - case 3: return 0xFF0000; - case 4: return 0x00FF00; - case 5: return 0x0000FF; - case 6: return 0xFFFF00; - case 7: return 0x00FFFF; - case 8: return 0x888888; - case 9: return 0xFFFFFF; - case 10: return 0x000000; - default: return 0xFFFFFF; - } - }*/ - - /*public Motif getColorMotifFromTemplate(EnumAssemblyTemplate temp) { - - //using deprecated value operator, will remove soon - if(temp.getValue() > 0) { - Motif scheme = new Motif(temp.getValue, null); - scheme.setTextureSize(16, 16); - //scheme.applyUniversalScheme(); - scheme.colorCount = 4; - //universal scheme configuration for testing - //todo: get textures properly baked, display color for shield - scheme.addColor(0x334077); - scheme.addColor(0x6A298F); - scheme.addColor(0xDF3795); - scheme.addColor(0x334077); - - //different test config; prpl, lprpl, cyn, prpl - - scheme.unify(); - return scheme; - - } else { - //return null; - return Motif.defaultInstance; - } - }*/ + /* + * public Motif getColorMotifFromTemplate(EnumAssemblyTemplate temp) { + * + * //using deprecated value operator, will remove soon if(temp.getValue() > + * 0) { Motif scheme = new Motif(temp.getValue, null); + * scheme.setTextureSize(16, 16); //scheme.applyUniversalScheme(); + * scheme.colorCount = 4; //universal scheme configuration for testing + * //todo: get textures properly baked, display color for shield + * scheme.addColor(0x334077); scheme.addColor(0x6A298F); + * scheme.addColor(0xDF3795); scheme.addColor(0x334077); + * + * //different test config; prpl, lprpl, cyn, prpl + * + * scheme.unify(); return scheme; + * + * } else { //return null; return Motif.defaultInstance; } } + */ } diff --git a/src/main/java/com/hbm/packet/ItemFolderPacket.java b/src/main/java/com/hbm/packet/ItemFolderPacket.java index 28d7db25c..bcd8bf693 100644 --- a/src/main/java/com/hbm/packet/ItemFolderPacket.java +++ b/src/main/java/com/hbm/packet/ItemFolderPacket.java @@ -1,5 +1,7 @@ package com.hbm.packet; +import com.hbm.inventory.RecipesCommon.ComparableStack; +import com.hbm.inventory.recipes.AssemblerRecipes; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemCassette; @@ -146,6 +148,15 @@ public class ItemFolderPacket implements IMessage { } } + if(output.getItem() == ModItems.assembly_template) { + ComparableStack out = AssemblerRecipes.recipeList.get(output.getItemDamage()); + + if(out != null) { + out.meta = 0; + ItemAssemblyTemplate.writeType(output, out); + } + } + if(!player.inventory.addItemStackToInventory(output)) player.dropPlayerItemWithRandomChoice(output, true); } diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_assemfac.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_assemfac.png new file mode 100644 index 0000000000000000000000000000000000000000..37ddb48f48fe0f3c5189f11398a51eeabd85725d GIT binary patch literal 4252 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 Jp@moCe*u{qy;uMM literal 0 HcmV?d00001