From e60faf5ab09102a7e5f93b1d5581d73dcc60cf68 Mon Sep 17 00:00:00 2001 From: AlgorithmX2 Date: Tue, 6 May 2014 00:16:29 -0500 Subject: [PATCH] Remove Meta values from Config. Fixed a number of rendering gltiches with Smart/Covered Cables --- core/Registration.java | 22 +- core/features/AEFeature.java | 2 +- core/features/AEFeatureHandler.java | 10 + ...emMaterial.java => ItemMultiMaterial.java} | 604 +++++++++--------- items/materials/MaterialType.java | 74 ++- .../{ItemPart.java => ItemMultiPart.java} | 449 ++++++------- items/parts/PartType.java | 76 ++- migration/IItemMigrate.java | 10 + migration/OldItemMaterial.java | 321 ++++++++++ migration/OldItemPart.java | 257 ++++++++ migration/OldMaterialType.java | 130 ++++ migration/OldPartType.java | 134 ++++ parts/networking/PartCable.java | 48 +- parts/networking/PartCableCovered.java | 2 +- parts/networking/PartCableSmart.java | 23 +- parts/networking/PartDenseCable.java | 25 +- recipes/AEItemResolver.java | 4 +- recipes/RecipeHandler.java | 12 +- transformer/AppEngCore.java | 2 +- transformer/asm/ASMMigration.java | 153 +++++ transformer/template/ItemStackTemplate.java | 15 + 21 files changed, 1731 insertions(+), 642 deletions(-) rename items/materials/{ItemMaterial.java => ItemMultiMaterial.java} (88%) rename items/parts/{ItemPart.java => ItemMultiPart.java} (86%) create mode 100644 migration/IItemMigrate.java create mode 100644 migration/OldItemMaterial.java create mode 100644 migration/OldItemPart.java create mode 100644 migration/OldMaterialType.java create mode 100644 migration/OldPartType.java create mode 100644 transformer/asm/ASMMigration.java create mode 100644 transformer/template/ItemStackTemplate.java diff --git a/core/Registration.java b/core/Registration.java index 6708eab9d..39871b1d5 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -90,11 +90,11 @@ import appeng.hooks.AETrading; import appeng.hooks.MeteoriteWorldGen; import appeng.hooks.QuartzWorldGen; import appeng.hooks.TickHandler; -import appeng.items.materials.ItemMaterial; +import appeng.items.materials.ItemMultiMaterial; import appeng.items.materials.MaterialType; import appeng.items.misc.ItemCrystalSeed; import appeng.items.parts.ItemFacade; -import appeng.items.parts.ItemPart; +import appeng.items.parts.ItemMultiPart; import appeng.items.parts.PartType; import appeng.items.storage.ItemBasicStorageCell; import appeng.items.storage.ItemCreativeStorageCell; @@ -123,6 +123,8 @@ import appeng.me.cache.SecurityCache; import appeng.me.cache.SpatialPylonCache; import appeng.me.cache.TickManagerCache; import appeng.me.storage.AEExternalHandler; +import appeng.migration.OldItemMaterial; +import appeng.migration.OldItemPart; import appeng.parts.PartPlacement; import appeng.recipes.AEItemResolver; import appeng.recipes.RecipeHandler; @@ -202,7 +204,7 @@ public class Registration Parts parts = appeng.core.Api.instance.parts(); Blocks blocks = appeng.core.Api.instance.blocks(); - AEItemDefinition materialItem = (AEFeatureHandler) addFeature( ItemMaterial.class ); + AEItemDefinition materialItem = (AEFeatureHandler) addFeature( ItemMultiMaterial.class ); Class materialClass = materials.getClass(); for (MaterialType mat : MaterialType.values()) @@ -210,7 +212,7 @@ public class Registration try { Field f = materialClass.getField( "material" + mat.name() ); - ItemStackSrc is = ((ItemMaterial) materialItem.item()).createMaterial( mat ); + ItemStackSrc is = ((ItemMultiMaterial) materialItem.item()).createMaterial( mat ); if ( is != null ) f.set( materials, new DamagedItemDefinition( is ) ); else @@ -223,7 +225,7 @@ public class Registration } } - AEItemDefinition partItem = (AEFeatureHandler) addFeature( ItemPart.class ); + AEItemDefinition partItem = (AEFeatureHandler) addFeature( ItemMultiPart.class ); Class partClass = parts.getClass(); for (PartType type : PartType.values()) @@ -234,7 +236,7 @@ public class Registration Enum varients[] = type.getVarients(); if ( varients == null ) { - ItemStackSrc is = ((ItemPart) partItem.item()).createPart( type, null ); + ItemStackSrc is = ((ItemMultiPart) partItem.item()).createPart( type, null ); if ( is != null ) f.set( parts, new DamagedItemDefinition( is ) ); else @@ -248,7 +250,7 @@ public class Registration for (Enum v : varients) { - ItemStackSrc is = ((ItemPart) partItem.item()).createPart( type, v ); + ItemStackSrc is = ((ItemMultiPart) partItem.item()).createPart( type, v ); if ( is != null ) def.add( (AEColor) v, is ); } @@ -352,6 +354,12 @@ public class Registration items.itemFacade = addFeature( ItemFacade.class ); items.itemCrystalSeed = addFeature( ItemCrystalSeed.class ); + if ( AEConfig.instance.isFeatureEnabled( AEFeature.AlphaMigration ) ) + { + GameRegistry.registerItem( new OldItemMaterial(), "item.ItemMaterial" ); + GameRegistry.registerItem( new OldItemPart(), "item.ItemPart" ); + } + addFeature( ToolEraser.class ); addFeature( ToolMeteoritePlacer.class ); addFeature( ToolDebugCard.class ); diff --git a/core/features/AEFeature.java b/core/features/AEFeature.java index 74529d93b..2579d03a1 100644 --- a/core/features/AEFeature.java +++ b/core/features/AEFeature.java @@ -52,7 +52,7 @@ public enum AEFeature enableFacadeCrafting("Crafting"), inWorldSingularity("Crafting"), inWorldFluix("Crafting"), inWorldPurification("Crafting"), UpdateLogging("Misc", false), - AlphaPass("Rendering"); + AlphaPass("Rendering"), AlphaMigration("Migration", true); String Category; boolean visible = true; diff --git a/core/features/AEFeatureHandler.java b/core/features/AEFeatureHandler.java index f7f915c8f..9376401ae 100644 --- a/core/features/AEFeatureHandler.java +++ b/core/features/AEFeatureHandler.java @@ -49,6 +49,11 @@ public class AEFeatureHandler implements AEItemDefinition { String name = o.getSimpleName(); + if ( name.startsWith( "ItemMultiPart" ) ) + name = name.replace( "ItemMultiPart", "ItemPart" ); + else if ( name.startsWith( "ItemMultiMaterial" ) ) + name = name.replace( "ItemMultiMaterial", "ItemMaterial" ); + if ( subname != null ) { // simple hack to allow me to do get nice names for these without @@ -80,6 +85,11 @@ public class AEFeatureHandler implements AEItemDefinition else i.setCreativeTab( CreativeTab.instance ); + if ( name.equals( "ItemMaterial" ) ) + name = "ItemMultiMaterial"; + else if ( name.equals( "ItemPart" ) ) + name = "ItemMultiPart"; + GameRegistry.registerItem( i, "item." + name ); } diff --git a/items/materials/ItemMaterial.java b/items/materials/ItemMultiMaterial.java similarity index 88% rename from items/materials/ItemMaterial.java rename to items/materials/ItemMultiMaterial.java index d032d0acf..dd11c3428 100644 --- a/items/materials/ItemMaterial.java +++ b/items/materials/ItemMultiMaterial.java @@ -1,298 +1,306 @@ -package appeng.items.materials; - -import java.util.Collections; -import java.util.Comparator; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map.Entry; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.Entity; -import net.minecraft.entity.item.EntityItem; -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.IIcon; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import appeng.api.config.Upgrades; -import appeng.api.implementations.items.IItemGroup; -import appeng.api.implementations.items.IStorageComponent; -import appeng.api.implementations.items.IUpgradeModule; -import appeng.client.texture.MissingIcon; -import appeng.core.AEConfig; -import appeng.core.features.AEFeature; -import appeng.core.features.AEFeatureHandler; -import appeng.core.features.ItemStackSrc; -import appeng.items.AEBaseItem; -import appeng.util.Platform; - -public class ItemMaterial extends AEBaseItem implements IStorageComponent, IUpgradeModule -{ - - HashMap dmgToMaterial = new HashMap(); - - public static ItemMaterial instance; - - public ItemMaterial() { - super( ItemMaterial.class ); - setfeature( EnumSet.of( AEFeature.Core ) ); - setHasSubtypes( true ); - instance = this; - } - - class SlightlyBetterSort implements Comparator - { - - Pattern p; - - public SlightlyBetterSort(Pattern p) { - this.p = p; - } - - @Override - public int compare(String o1, String o2) - { - try - { - Matcher a = p.matcher( o1 ); - Matcher b = p.matcher( o2 ); - if ( a.find() && b.find() ) - { - int ia = Integer.parseInt( a.group( 1 ) ); - int ib = Integer.parseInt( b.group( 1 ) ); - return Integer.compare( ia, ib ); - } - } - catch (Throwable t) - { - // ek! - } - return o1.compareTo( o2 ); - } - } - - @Override - public void addInformation(ItemStack is, EntityPlayer player, List details, boolean moar) - { - super.addInformation( is, player, details, moar ); - - MaterialType mt = getTypeByStack( is ); - if ( mt == null ) - return; - - if ( mt == MaterialType.NamePress ) - { - NBTTagCompound c = Platform.openNbtData( is ); - details.add( c.getString( "InscribeName" ) ); - } - - Upgrades u = getType( is ); - if ( u != null ) - { - List textList = new LinkedList(); - for (Entry j : u.getSupported().entrySet()) - { - String name = null; - - int limit = j.getValue(); - - if ( j.getKey().getItem() instanceof IItemGroup ) - { - IItemGroup ig = (IItemGroup) j.getKey().getItem(); - String str = ig.getUnlocalizedGroupName( j.getKey() ); - if ( str != null ) - name = Platform.gui_localize( str ) + (limit > 1 ? " (" + limit + ")" : ""); - } - - if ( name == null ) - name = j.getKey().getDisplayName() + (limit > 1 ? " (" + limit + ")" : ""); - - if ( !textList.contains( name ) ) - textList.add( name ); - } - - Pattern p = Pattern.compile( "(\\d+)[^\\d]" ); - SlightlyBetterSort s = new SlightlyBetterSort( p ); - Collections.sort( textList, s ); - details.addAll( textList ); - } - } - - public ItemStackSrc createMaterial(MaterialType mat) - { - String name = mat.name(); - - if ( mat.damageValue == -1 ) - { - boolean enabled = true; - for (AEFeature f : mat.getFeature()) - enabled = enabled && AEConfig.instance.isFeatureEnabled( f ); - - if ( enabled ) - { - int newMaterialNum = AEConfig.instance.get( "materials", name, AEConfig.instance.getFreeMaterial( mat.ordinal() ) ).getInt(); - mat.damageValue = newMaterialNum; - ItemStackSrc output = new ItemStackSrc( this, newMaterialNum ); - - dmgToMaterial.put( newMaterialNum, mat ); - - if ( mat.getOreName() != null ) - OreDictionary.registerOre( mat.getOreName(), output.stack( 1 ) ); - - return output; - } - - return null; - } - else - throw new RuntimeException( "Cannot create the same material twice..." ); - } - - public MaterialType getTypeByStack(ItemStack is) - { - if ( dmgToMaterial.containsKey( is.getItemDamage() ) ) - return dmgToMaterial.get( is.getItemDamage() ); - return null; - } - - @Override - public IIcon getIconFromDamage(int dmg) - { - if ( dmgToMaterial.containsKey( dmg ) ) - return dmgToMaterial.get( dmg ).IIcon; - return new MissingIcon( this ); - } - - private String nameOf(ItemStack is) - { - if ( is == null ) - return "null"; - - MaterialType mt = getTypeByStack( is ); - if ( mt == null ) - return "null"; - - return AEFeatureHandler.getName( ItemMaterial.class, mt.name() ); - } - - @Override - public String getUnlocalizedName(ItemStack is) - { - return "item.appliedenergistics2." + nameOf( is ); - } - - @Override - public void registerIcons(IIconRegister icoRegister) - { - for (MaterialType mat : MaterialType.values()) - { - if ( mat.damageValue != -1 ) - { - String tex = "appliedenergistics2:" + nameOf( new ItemStack( this, 1, mat.damageValue ) ); - mat.IIcon = icoRegister.registerIcon( tex ); - } - } - } - - @Override - public boolean hasCustomEntity(ItemStack is) - { - return getTypeByStack( is ).hasCustomEntity(); - } - - @Override - public Entity createEntity(World w, Entity location, ItemStack itemstack) - { - Class droppedEntity = getTypeByStack( itemstack ).getCustomEntityClass(); - Entity eqi; - - try - { - eqi = droppedEntity.getConstructor( World.class, double.class, double.class, double.class, ItemStack.class ).newInstance( w, location.posX, - location.posY, location.posZ, itemstack ); - } - catch (Throwable t) - { - throw new RuntimeException( t ); - } - - eqi.motionX = location.motionX; - eqi.motionY = location.motionY; - eqi.motionZ = location.motionZ; - - if ( location instanceof EntityItem && eqi instanceof EntityItem ) - ((EntityItem) eqi).delayBeforeCanPickup = ((EntityItem) location).delayBeforeCanPickup; - - return eqi; - } - - @Override - public int getBytes(ItemStack is) - { - switch (getTypeByStack( is )) - { - case Cell1kPart: - return 1024; - case Cell4kPart: - return 1024 * 4; - case Cell16kPart: - return 1024 * 16; - case Cell64kPart: - return 1024 * 64; - default: - } - return 0; - } - - @Override - public boolean isStorageComponent(ItemStack is) - { - switch (getTypeByStack( is )) - { - case Cell1kPart: - case Cell4kPart: - case Cell16kPart: - case Cell64kPart: - return true; - default: - } - return false; - } - - @Override - public Upgrades getType(ItemStack itemstack) - { - switch (getTypeByStack( itemstack )) - { - case CardCapacity: - return Upgrades.CAPACITY; - case CardFuzzy: - return Upgrades.FUZZY; - case CardRedstone: - return Upgrades.REDSTONE; - case CardSpeed: - return Upgrades.SPEED; - case CardInverter: - return Upgrades.INVERTER; - default: - return null; - } - } - - @Override - public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List cList) - { - for (MaterialType mat : MaterialType.values()) - { - if ( mat.damageValue >= 0 ) - cList.add( new ItemStack( this, 1, mat.damageValue ) ); - } - } -} +package appeng.items.materials; + +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +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.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import appeng.api.config.Upgrades; +import appeng.api.implementations.items.IItemGroup; +import appeng.api.implementations.items.IStorageComponent; +import appeng.api.implementations.items.IUpgradeModule; +import appeng.client.texture.MissingIcon; +import appeng.core.AEConfig; +import appeng.core.features.AEFeature; +import appeng.core.features.AEFeatureHandler; +import appeng.core.features.ItemStackSrc; +import appeng.items.AEBaseItem; +import appeng.util.Platform; + +public class ItemMultiMaterial extends AEBaseItem implements IStorageComponent, IUpgradeModule +{ + + HashMap dmgToMaterial = new HashMap(); + + public static ItemMultiMaterial instance; + + public ItemMultiMaterial() { + super( ItemMultiMaterial.class ); + setfeature( EnumSet.of( AEFeature.Core ) ); + setHasSubtypes( true ); + instance = this; + } + + class SlightlyBetterSort implements Comparator + { + + Pattern p; + + public SlightlyBetterSort(Pattern p) { + this.p = p; + } + + @Override + public int compare(String o1, String o2) + { + try + { + Matcher a = p.matcher( o1 ); + Matcher b = p.matcher( o2 ); + if ( a.find() && b.find() ) + { + int ia = Integer.parseInt( a.group( 1 ) ); + int ib = Integer.parseInt( b.group( 1 ) ); + return Integer.compare( ia, ib ); + } + } + catch (Throwable t) + { + // ek! + } + return o1.compareTo( o2 ); + } + } + + @Override + public void addInformation(ItemStack is, EntityPlayer player, List details, boolean moar) + { + super.addInformation( is, player, details, moar ); + + MaterialType mt = getTypeByStack( is ); + if ( mt == null ) + return; + + if ( mt == MaterialType.NamePress ) + { + NBTTagCompound c = Platform.openNbtData( is ); + details.add( c.getString( "InscribeName" ) ); + } + + Upgrades u = getType( is ); + if ( u != null ) + { + List textList = new LinkedList(); + for (Entry j : u.getSupported().entrySet()) + { + String name = null; + + int limit = j.getValue(); + + if ( j.getKey().getItem() instanceof IItemGroup ) + { + IItemGroup ig = (IItemGroup) j.getKey().getItem(); + String str = ig.getUnlocalizedGroupName( j.getKey() ); + if ( str != null ) + name = Platform.gui_localize( str ) + (limit > 1 ? " (" + limit + ")" : ""); + } + + if ( name == null ) + name = j.getKey().getDisplayName() + (limit > 1 ? " (" + limit + ")" : ""); + + if ( !textList.contains( name ) ) + textList.add( name ); + } + + Pattern p = Pattern.compile( "(\\d+)[^\\d]" ); + SlightlyBetterSort s = new SlightlyBetterSort( p ); + Collections.sort( textList, s ); + details.addAll( textList ); + } + } + + public ItemStackSrc createMaterial(MaterialType mat) + { + if ( !mat.isRegistered() ) + { + boolean enabled = true; + for (AEFeature f : mat.getFeature()) + enabled = enabled && AEConfig.instance.isFeatureEnabled( f ); + + if ( enabled ) + { + int newMaterialNum = mat.damageValue; + mat.markReady(); + + ItemStackSrc output = new ItemStackSrc( this, newMaterialNum ); + + if ( dmgToMaterial.get( newMaterialNum ) == null ) + dmgToMaterial.put( newMaterialNum, mat ); + else + throw new RuntimeException( "Meta Overlap detected." ); + + if ( mat.getOreName() != null ) + OreDictionary.registerOre( mat.getOreName(), output.stack( 1 ) ); + + return output; + } + + return null; + } + else + throw new RuntimeException( "Cannot create the same material twice..." ); + } + + public ItemStack getStackByType(MaterialType mt) + { + return new ItemStack( this, 1, mt.damageValue ); + } + + public MaterialType getTypeByStack(ItemStack is) + { + if ( dmgToMaterial.containsKey( is.getItemDamage() ) ) + return dmgToMaterial.get( is.getItemDamage() ); + return null; + } + + @Override + public IIcon getIconFromDamage(int dmg) + { + if ( dmgToMaterial.containsKey( dmg ) ) + return dmgToMaterial.get( dmg ).IIcon; + return new MissingIcon( this ); + } + + private String nameOf(ItemStack is) + { + if ( is == null ) + return "null"; + + MaterialType mt = getTypeByStack( is ); + if ( mt == null ) + return "null"; + + return AEFeatureHandler.getName( ItemMultiMaterial.class, mt.name() ); + } + + @Override + public String getUnlocalizedName(ItemStack is) + { + return "item.appliedenergistics2." + nameOf( is ); + } + + @Override + public void registerIcons(IIconRegister icoRegister) + { + for (MaterialType mat : MaterialType.values()) + { + if ( mat.damageValue != -1 ) + { + String tex = "appliedenergistics2:" + nameOf( new ItemStack( this, 1, mat.damageValue ) ); + mat.IIcon = icoRegister.registerIcon( tex ); + } + } + } + + @Override + public boolean hasCustomEntity(ItemStack is) + { + return getTypeByStack( is ).hasCustomEntity(); + } + + @Override + public Entity createEntity(World w, Entity location, ItemStack itemstack) + { + Class droppedEntity = getTypeByStack( itemstack ).getCustomEntityClass(); + Entity eqi; + + try + { + eqi = droppedEntity.getConstructor( World.class, double.class, double.class, double.class, ItemStack.class ).newInstance( w, location.posX, + location.posY, location.posZ, itemstack ); + } + catch (Throwable t) + { + throw new RuntimeException( t ); + } + + eqi.motionX = location.motionX; + eqi.motionY = location.motionY; + eqi.motionZ = location.motionZ; + + if ( location instanceof EntityItem && eqi instanceof EntityItem ) + ((EntityItem) eqi).delayBeforeCanPickup = ((EntityItem) location).delayBeforeCanPickup; + + return eqi; + } + + @Override + public int getBytes(ItemStack is) + { + switch (getTypeByStack( is )) + { + case Cell1kPart: + return 1024; + case Cell4kPart: + return 1024 * 4; + case Cell16kPart: + return 1024 * 16; + case Cell64kPart: + return 1024 * 64; + default: + } + return 0; + } + + @Override + public boolean isStorageComponent(ItemStack is) + { + switch (getTypeByStack( is )) + { + case Cell1kPart: + case Cell4kPart: + case Cell16kPart: + case Cell64kPart: + return true; + default: + } + return false; + } + + @Override + public Upgrades getType(ItemStack itemstack) + { + switch (getTypeByStack( itemstack )) + { + case CardCapacity: + return Upgrades.CAPACITY; + case CardFuzzy: + return Upgrades.FUZZY; + case CardRedstone: + return Upgrades.REDSTONE; + case CardSpeed: + return Upgrades.SPEED; + case CardInverter: + return Upgrades.INVERTER; + default: + return null; + } + } + + @Override + public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List cList) + { + for (MaterialType mat : MaterialType.values()) + { + if ( mat.damageValue >= 0 && mat.isRegistered() ) + cList.add( new ItemStack( this, 1, mat.damageValue ) ); + } + } + +} diff --git a/items/materials/MaterialType.java b/items/materials/MaterialType.java index eb6663c1f..454c659ed 100644 --- a/items/materials/MaterialType.java +++ b/items/materials/MaterialType.java @@ -17,48 +17,48 @@ import cpw.mods.fml.relauncher.SideOnly; public enum MaterialType { - CertusQuartzCrystal(AEFeature.Core, "crystalCertusQuartz"), CertusQuartzCrystalCharged(AEFeature.Core, EntityChargedQuartz.class), + CertusQuartzCrystal(0, AEFeature.Core, "crystalCertusQuartz"), CertusQuartzCrystalCharged(1, AEFeature.Core, EntityChargedQuartz.class), - CertusQuartzDust(AEFeature.Core, "dustCertusQuartz"), NetherQuartzDust(AEFeature.Core, "dustNetherQuartz"), Flour(AEFeature.Flour, "dustWheat"), GoldDust( - AEFeature.Core, "dustGold"), IronDust(AEFeature.Core, "dustIron"), IronNugget(AEFeature.Core, "nuggetIron"), + CertusQuartzDust(2, AEFeature.Core, "dustCertusQuartz"), NetherQuartzDust(3, AEFeature.Core, "dustNetherQuartz"), Flour(4, AEFeature.Flour, "dustWheat"), GoldDust( + 51, AEFeature.Core, "dustGold"), IronDust(49, AEFeature.Core, "dustIron"), IronNugget(50, AEFeature.Core, "nuggetIron"), - Silicon(AEFeature.Core, "itemSilicon"), MatterBall, + Silicon(5, AEFeature.Core, "itemSilicon"), MatterBall(6), - FluixCrystal(AEFeature.Core, "crystalFluix"), FluixDust(AEFeature.Core, "dustFluix"), FluixPearl(AEFeature.Core, "pearlFluix"), + FluixCrystal(7, AEFeature.Core, "crystalFluix"), FluixDust(8, AEFeature.Core, "dustFluix"), FluixPearl(9, AEFeature.Core, "pearlFluix"), - PureifiedCertusQuartzCrystal, PureifiedNetherQuartzCrystal, PureifiedFluixCrystal, + PureifiedCertusQuartzCrystal(10), PureifiedNetherQuartzCrystal(11), PureifiedFluixCrystal(12), - CalcProcessorPress, EngProcessorPress, LogicProcessorPress, + CalcProcessorPress(13), EngProcessorPress(14), LogicProcessorPress(15), - CalcProcessorPrint, EngProcessorPrint, LogicProcessorPrint, + CalcProcessorPrint(16), EngProcessorPrint(17), LogicProcessorPrint(18), - SiliconPress, SiliconPrint, + SiliconPress(19), SiliconPrint(20), - NamePress, + NamePress(21), - LogicProcessor, CalcProcessor, EngProcessor, + LogicProcessor(22), CalcProcessor(23), EngProcessor(24), // Basic Cards - BasicCard, CardRedstone, CardCapacity, + BasicCard(25), CardRedstone(26), CardCapacity(27), // Adv Cards - AdvCard, CardFuzzy, CardSpeed, CardInverter, + AdvCard(28), CardFuzzy(29), CardSpeed(30), CardInverter(31), - Cell2SpatialPart(AEFeature.SpatialIO), Cell16SpatialPart(AEFeature.SpatialIO), Cell128SpatialPart(AEFeature.SpatialIO), + Cell2SpatialPart(32, AEFeature.SpatialIO), Cell16SpatialPart(33, AEFeature.SpatialIO), Cell128SpatialPart(34, AEFeature.SpatialIO), - Cell1kPart(AEFeature.StorageCells), Cell4kPart(AEFeature.StorageCells), Cell16kPart(AEFeature.StorageCells), Cell64kPart(AEFeature.StorageCells), EmptyStorageCell( - AEFeature.StorageCells), + Cell1kPart(35, AEFeature.StorageCells), Cell4kPart(36, AEFeature.StorageCells), Cell16kPart(37, AEFeature.StorageCells), Cell64kPart(38, + AEFeature.StorageCells), EmptyStorageCell(39, AEFeature.StorageCells), - WoodenGear(AEFeature.GrindStone, "gearWood"), + WoodenGear(39, AEFeature.GrindStone, "gearWood"), - Wireless(AEFeature.WirelessAccessTerminal), WirelessBooster(AEFeature.WirelessAccessTerminal), + Wireless(41, AEFeature.WirelessAccessTerminal), WirelessBooster(42, AEFeature.WirelessAccessTerminal), - FormationCore, AnnihilationCore, + FormationCore(43), AnnihilationCore(44), - SkyDust(AEFeature.Core), + SkyDust(45, AEFeature.Core), - EnderDust(AEFeature.QuantumNetworkBridge, "dustEnder", EntitySingularity.class), Singularity(AEFeature.QuantumNetworkBridge, EntitySingularity.class), QESingularity( - AEFeature.QuantumNetworkBridge, EntitySingularity.class); + EnderDust(46, AEFeature.QuantumNetworkBridge, "dustEnder", EntitySingularity.class), Singularity(47, AEFeature.QuantumNetworkBridge, + EntitySingularity.class), QESingularity(48, AEFeature.QuantumNetworkBridge, EntitySingularity.class); private String oreName; private EnumSet features; @@ -67,25 +67,30 @@ public enum MaterialType // IIcon for the material. @SideOnly(Side.CLIENT) public IIcon IIcon; - public int damageValue = -1; + final public int damageValue; + private boolean isRegistered = false; - MaterialType() { + MaterialType(int metaValue) { + damageValue = metaValue; features = EnumSet.of( AEFeature.Core ); } - MaterialType(AEFeature part) { + MaterialType(int metaValue, AEFeature part) { + damageValue = metaValue; features = EnumSet.of( part ); } - MaterialType(AEFeature part, Class c) { + MaterialType(int metaValue, AEFeature part, Class c) { features = EnumSet.of( part ); + damageValue = metaValue; droppedEntity = c; EntityRegistry.registerModEntity( droppedEntity, droppedEntity.getSimpleName(), EntityIds.get( droppedEntity ), AppEng.instance, 16, 4, true ); } - MaterialType(AEFeature part, String oreDictionary, Class c) { + MaterialType(int metaValue, AEFeature part, String oreDictionary, Class c) { features = EnumSet.of( part ); + damageValue = metaValue; oreName = oreDictionary; if ( OreDictionary.getOres( oreDictionary ).size() > 0 ) features.add( AEFeature.DuplicateItems ); @@ -94,8 +99,9 @@ public enum MaterialType EntityRegistry.registerModEntity( droppedEntity, droppedEntity.getSimpleName(), EntityIds.get( droppedEntity ), AppEng.instance, 16, 4, true ); } - MaterialType(AEFeature part, String oreDictionary) { + MaterialType(int metaValue, AEFeature part, String oreDictionary) { features = EnumSet.of( part ); + damageValue = metaValue; oreName = oreDictionary; if ( OreDictionary.getOres( oreDictionary ).size() > 0 ) features.add( AEFeature.DuplicateItems ); @@ -103,7 +109,7 @@ public enum MaterialType public ItemStack stack(int size) { - return new ItemStack( ItemMaterial.instance, size, damageValue ); + return new ItemStack( ItemMultiMaterial.instance, size, damageValue ); } public EnumSet getFeature() @@ -126,4 +132,14 @@ public enum MaterialType return droppedEntity; } + public boolean isRegistered() + { + return isRegistered; + } + + public void markReady() + { + isRegistered = true; + } + } diff --git a/items/parts/ItemPart.java b/items/parts/ItemMultiPart.java similarity index 86% rename from items/parts/ItemPart.java rename to items/parts/ItemMultiPart.java index 9299c542d..823144b80 100644 --- a/items/parts/ItemPart.java +++ b/items/parts/ItemMultiPart.java @@ -1,220 +1,229 @@ -package appeng.items.parts; - -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map.Entry; - -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; -import appeng.api.AEApi; -import appeng.api.implementations.items.IItemGroup; -import appeng.api.parts.IPart; -import appeng.api.parts.IPartItem; -import appeng.core.AEConfig; -import appeng.core.features.AEFeature; -import appeng.core.features.AEFeatureHandler; -import appeng.core.features.ItemStackSrc; -import appeng.core.localization.GuiText; -import appeng.items.AEBaseItem; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class ItemPart extends AEBaseItem implements IPartItem, IItemGroup -{ - - class PartTypeIst - { - - PartType part; - int varient; - - @SideOnly(Side.CLIENT) - IIcon ico; - - }; - - HashMap dmgToPart = new HashMap(); - - public static ItemPart instance; - - public ItemPart() { - super( ItemPart.class ); - setfeature( EnumSet.of( AEFeature.Core ) ); - AEApi.instance().partHelper().setItemBusRenderer( this ); - setHasSubtypes( true ); - instance = this; - } - - public ItemStackSrc createPart(PartType mat, Enum varient) - { - try - { - // I think this still works? - ItemStack is = new ItemStack( this ); - mat.getPart().getConstructor( ItemStack.class ).newInstance( is ); - } - catch (Throwable e) - { - return null; // part not supported.. - } - - String name = varient == null ? mat.name() : mat.name() + "." + varient.name(); - int varID = varient == null ? 0 : varient.ordinal(); - - // verify - for (PartTypeIst p : dmgToPart.values()) - { - if ( p.part == mat && p.varient == varID ) - throw new RuntimeException( "Cannot create the same material twice..." ); - } - - boolean enabled = true; - for (AEFeature f : mat.getFeature()) - enabled = enabled && AEConfig.instance.isFeatureEnabled( f ); - - if ( enabled ) - { - int newPartNum = AEConfig.instance.get( "parts", name, AEConfig.instance.getFreePart( mat.ordinal() * 32 + varID ) ).getInt(); - ItemStackSrc output = new ItemStackSrc( this, newPartNum ); - - PartTypeIst pti = new PartTypeIst(); - pti.part = mat; - pti.varient = varID; - - dmgToPart.put( newPartNum, pti ); - return output; - } - - return null; - } - - public int getDamageByType(PartType t) - { - for (Entry pt : dmgToPart.entrySet()) - { - if ( pt.getValue().part == t ) - return pt.getKey(); - } - return -1; - } - - public PartType getTypeByStack(ItemStack is) - { - if ( is == null ) - return null; - - PartTypeIst pt = dmgToPart.get( is.getItemDamage() ); - if ( pt != null ) - return pt.part; - - return null; - } - - @Override - @SideOnly(Side.CLIENT) - public int getSpriteNumber() - { - return 0; - } - - @Override - public IIcon getIconFromDamage(int dmg) - { - IIcon ico = dmgToPart.get( dmg ).ico; - return ico; - } - - @Override - public String getUnlocalizedName(ItemStack is) - { - return "item.appliedenergistics2." + getname( is ); - } - - public String getname(ItemStack is) - { - return AEFeatureHandler.getName( ItemPart.class, getTypeByStack( is ).name() ); - } - - @Override - public String getItemStackDisplayName(ItemStack is) - { - PartType pt = getTypeByStack( is ); - if ( pt == null ) - return "Unnamed"; - - Enum[] varients = pt.getVarients(); - - if ( varients != null ) - return super.getItemStackDisplayName( is ) + " - " + varients[dmgToPart.get( is.getItemDamage() ).varient].toString(); - - if ( pt.getExtraName() != null ) - return super.getItemStackDisplayName( is ) + " - " + pt.getExtraName().getLocal(); - - return super.getItemStackDisplayName( is ); - } - - @Override - public void registerIcons(IIconRegister par1IconRegister) - { - for (Entry part : dmgToPart.entrySet()) - { - String tex = "appliedenergistics2:" + getname( new ItemStack( this, 1, part.getKey() ) ); - part.getValue().ico = par1IconRegister.registerIcon( tex ); - } - } - - @Override - public boolean onItemUse(ItemStack is, EntityPlayer player, World w, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - return AEApi.instance().partHelper().placeBus( is, x, y, z, side, player, w ); - } - - @Override - public IPart createPartFromItemStack(ItemStack is) - { - try - { - PartType t = getTypeByStack( is ); - if ( t != null ) - return t.getPart().getConstructor( ItemStack.class ).newInstance( is ); - } - catch (Throwable e) - { - throw new RuntimeException( "Unable to construct IBusPart from IBusItem : " + getTypeByStack( is ).getPart().getName() - + " ; Possibly didn't have correct constructor( ItemStack )", e ); - } - return null; - } - - @Override - public void getSubItems(Item number, CreativeTabs tab, List cList) - { - for (Entry part : dmgToPart.entrySet()) - cList.add( new ItemStack( this, 1, part.getKey() ) ); - } - - public int varientOf(int itemDamage) - { - return dmgToPart.get( itemDamage ).varient; - } - - @Override - public String getUnlocalizedGroupName(ItemStack is) - { - switch (getTypeByStack( is )) - { - case ImportBus: - case ExportBus: - return GuiText.IOBuses.getUnlocalized(); - default: - } - return null; - } - -} +package appeng.items.parts; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.api.implementations.items.IItemGroup; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; +import appeng.core.AEConfig; +import appeng.core.features.AEFeature; +import appeng.core.features.AEFeatureHandler; +import appeng.core.features.ItemStackSrc; +import appeng.core.localization.GuiText; +import appeng.items.AEBaseItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemMultiPart extends AEBaseItem implements IPartItem, IItemGroup +{ + + class PartTypeIst + { + + PartType part; + int varient; + + @SideOnly(Side.CLIENT) + IIcon ico; + }; + + HashMap dmgToPart = new HashMap(); + + public static ItemMultiPart instance; + + public ItemMultiPart() { + super( ItemMultiPart.class ); + setfeature( EnumSet.of( AEFeature.Core ) ); + AEApi.instance().partHelper().setItemBusRenderer( this ); + setHasSubtypes( true ); + instance = this; + } + + public ItemStackSrc createPart(PartType mat, Enum varient) + { + try + { + // I think this still works? + ItemStack is = new ItemStack( this ); + mat.getPart().getConstructor( ItemStack.class ).newInstance( is ); + } + catch (Throwable e) + { + return null; // part not supported.. + } + + int varID = varient == null ? 0 : varient.ordinal(); + + // verify + for (PartTypeIst p : dmgToPart.values()) + { + if ( p.part == mat && p.varient == varID ) + throw new RuntimeException( "Cannot create the same material twice..." ); + } + + boolean enabled = true; + for (AEFeature f : mat.getFeature()) + enabled = enabled && AEConfig.instance.isFeatureEnabled( f ); + + if ( enabled ) + { + int newPartNum = mat.baseDamage + varID; + ItemStackSrc output = new ItemStackSrc( this, newPartNum ); + + PartTypeIst pti = new PartTypeIst(); + pti.part = mat; + pti.varient = varID; + + if ( dmgToPart.get( newPartNum ) == null ) + { + dmgToPart.put( newPartNum, pti ); + return output; + } + else + throw new RuntimeException( "Meta Overlap detected." ); + } + + return null; + } + + public int getDamageByType(PartType t) + { + for (Entry pt : dmgToPart.entrySet()) + { + if ( pt.getValue().part == t ) + return pt.getKey(); + } + return -1; + } + + public PartType getTypeByStack(ItemStack is) + { + if ( is == null ) + return null; + + PartTypeIst pt = dmgToPart.get( is.getItemDamage() ); + if ( pt != null ) + return pt.part; + + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public int getSpriteNumber() + { + return 0; + } + + @Override + public IIcon getIconFromDamage(int dmg) + { + IIcon ico = dmgToPart.get( dmg ).ico; + return ico; + } + + @Override + public String getUnlocalizedName(ItemStack is) + { + return "item.appliedenergistics2." + getname( is ); + } + + public String getname(ItemStack is) + { + return AEFeatureHandler.getName( ItemMultiPart.class, getTypeByStack( is ).name() ); + } + + @Override + public String getItemStackDisplayName(ItemStack is) + { + PartType pt = getTypeByStack( is ); + if ( pt == null ) + return "Unnamed"; + + Enum[] varients = pt.getVarients(); + + if ( varients != null ) + return super.getItemStackDisplayName( is ) + " - " + varients[dmgToPart.get( is.getItemDamage() ).varient].toString(); + + if ( pt.getExtraName() != null ) + return super.getItemStackDisplayName( is ) + " - " + pt.getExtraName().getLocal(); + + return super.getItemStackDisplayName( is ); + } + + @Override + public void registerIcons(IIconRegister par1IconRegister) + { + for (Entry part : dmgToPart.entrySet()) + { + String tex = "appliedenergistics2:" + getname( new ItemStack( this, 1, part.getKey() ) ); + part.getValue().ico = par1IconRegister.registerIcon( tex ); + } + } + + @Override + public boolean onItemUse(ItemStack is, EntityPlayer player, World w, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + return AEApi.instance().partHelper().placeBus( is, x, y, z, side, player, w ); + } + + @Override + public IPart createPartFromItemStack(ItemStack is) + { + try + { + PartType t = getTypeByStack( is ); + if ( t != null ) + return t.getPart().getConstructor( ItemStack.class ).newInstance( is ); + } + catch (Throwable e) + { + throw new RuntimeException( "Unable to construct IBusPart from IBusItem : " + getTypeByStack( is ).getPart().getName() + + " ; Possibly didn't have correct constructor( ItemStack )", e ); + } + return null; + } + + @Override + public void getSubItems(Item number, CreativeTabs tab, List cList) + { + for (Entry part : dmgToPart.entrySet()) + cList.add( new ItemStack( this, 1, part.getKey() ) ); + } + + public int varientOf(int itemDamage) + { + if ( dmgToPart.containsKey( itemDamage ) ) + return dmgToPart.get( itemDamage ).varient; + return 0; + } + + @Override + public String getUnlocalizedGroupName(ItemStack is) + { + switch (getTypeByStack( is )) + { + case ImportBus: + case ExportBus: + return GuiText.IOBuses.getUnlocalized(); + default: + } + return null; + } + + public ItemStack getStackFromTypeAndVarient(PartType mt, int varient) + { + return new ItemStack( this, 1, mt.baseDamage + varient ); + } +} diff --git a/items/parts/PartType.java b/items/parts/PartType.java index c48a2344e..5a17dbebd 100644 --- a/items/parts/PartType.java +++ b/items/parts/PartType.java @@ -39,76 +39,82 @@ import appeng.parts.reporting.PartTerminal; public enum PartType { - ToggleBus(AEFeature.Core, PartToggleBus.class), + CableGlass(0, AEFeature.Core, PartCableGlass.class), - InvertedToggleBus(AEFeature.Core, PartInvertedToggleBus.class), + CableCovered(20, AEFeature.Core, PartCableCovered.class), - CableSmart(AEFeature.Core, PartCableSmart.class), CableCovered(AEFeature.Core, PartCableCovered.class), CableGlass(AEFeature.Core, PartCableGlass.class), + CableSmart(40, AEFeature.Core, PartCableSmart.class), - CableDense(AEFeature.DenseCables, PartDenseCable.class), + CableDense(60, AEFeature.DenseCables, PartDenseCable.class), - CableAnchor(AEFeature.Core, PartCableAnchor.class), + ToggleBus(80, AEFeature.Core, PartToggleBus.class), - QuartzFiber(AEFeature.Core, PartQuartzFiber.class), + InvertedToggleBus(100, AEFeature.Core, PartInvertedToggleBus.class), - Monitor(AEFeature.Core, PartMonitor.class), + CableAnchor(120, AEFeature.Core, PartCableAnchor.class), - SemiDarkMonitor(AEFeature.Core, PartSemiDarkMonitor.class), + QuartzFiber(140, AEFeature.Core, PartQuartzFiber.class), - DarkMonitor(AEFeature.Core, PartDarkMonitor.class), + Monitor(160, AEFeature.Core, PartMonitor.class), - StorageBus(AEFeature.StorageBus, PartStorageBus.class), + SemiDarkMonitor(180, AEFeature.Core, PartSemiDarkMonitor.class), - ImportBus(AEFeature.ImportBus, PartImportBus.class), + DarkMonitor(200, AEFeature.Core, PartDarkMonitor.class), - ExportBus(AEFeature.ExportBus, PartExportBus.class), + StorageBus(220, AEFeature.StorageBus, PartStorageBus.class), - LevelEmitter(AEFeature.LevelEmiter, PartLevelEmitter.class), + ImportBus(240, AEFeature.ImportBus, PartImportBus.class), - AnnihilationPlane(AEFeature.AnnihilationPlane, PartAnnihilationPlane.class), + ExportBus(260, AEFeature.ExportBus, PartExportBus.class), - FormationPlane(AEFeature.FormationPlane, PartFormationPlane.class), + LevelEmitter(280, AEFeature.LevelEmiter, PartLevelEmitter.class), - P2PTunnelME(AEFeature.P2PTunnelME, PartP2PTunnelME.class, GuiText.METunnel), + AnnihilationPlane(300, AEFeature.AnnihilationPlane, PartAnnihilationPlane.class), - P2PTunnelRedstone(AEFeature.P2PTunnelRedstone, PartP2PRedstone.class, GuiText.RedstoneTunnel), - - P2PTunnelItems(AEFeature.P2PTunnelItems, PartP2PItems.class, GuiText.ItemTunnel), - - P2PTunnelLiquids(AEFeature.P2PTunnelLiquids, PartP2PLiquids.class, GuiText.FluidTunnel), - - P2PTunnelMJ(AEFeature.P2PTunnelMJ, PartP2PBCPower.class, GuiText.MJTunnel), - - P2PTunnelEU(AEFeature.P2PTunnelEU, PartP2PIC2Power.class, GuiText.EUTunnel), + FormationPlane(320, AEFeature.FormationPlane, PartFormationPlane.class), // CraftingMonitor(AEFeature.Crafting, PartCraftingMonitor.class), - PatternTerminal(AEFeature.CraftingTerminal, PartPatternTerminal.class), + PatternTerminal(340, AEFeature.CraftingTerminal, PartPatternTerminal.class), - CraftingTerminal(AEFeature.CraftingTerminal, PartCraftingTerminal.class), + CraftingTerminal(360, AEFeature.CraftingTerminal, PartCraftingTerminal.class), - Terminal(AEFeature.Core, PartTerminal.class), + Terminal(380, AEFeature.Core, PartTerminal.class), - StorageMonitor(AEFeature.StorageMonitor, PartStorageMonitor.class), + StorageMonitor(400, AEFeature.StorageMonitor, PartStorageMonitor.class), - ConversionMonitor(AEFeature.PartConversionMonitor, PartConversionMonitor.class), + ConversionMonitor(420, AEFeature.PartConversionMonitor, PartConversionMonitor.class), - Interface(AEFeature.Core, PartInterface.class), + Interface(440, AEFeature.Core, PartInterface.class), - P2PTunnelRF(AEFeature.P2PTunnelRF, PartP2PRFPower.class, GuiText.RFTunnel); + P2PTunnelME(460, AEFeature.P2PTunnelME, PartP2PTunnelME.class, GuiText.METunnel), + + P2PTunnelRedstone(461, AEFeature.P2PTunnelRedstone, PartP2PRedstone.class, GuiText.RedstoneTunnel), + + P2PTunnelItems(462, AEFeature.P2PTunnelItems, PartP2PItems.class, GuiText.ItemTunnel), + + P2PTunnelLiquids(463, AEFeature.P2PTunnelLiquids, PartP2PLiquids.class, GuiText.FluidTunnel), + + P2PTunnelMJ(464, AEFeature.P2PTunnelMJ, PartP2PBCPower.class, GuiText.MJTunnel), + + P2PTunnelEU(465, AEFeature.P2PTunnelEU, PartP2PIC2Power.class, GuiText.EUTunnel), + + P2PTunnelRF(466, AEFeature.P2PTunnelRF, PartP2PRFPower.class, GuiText.RFTunnel); private final EnumSet features; private final Class myPart; private final GuiText extraName; + public final int baseDamage; - PartType(AEFeature part, Class c) { - this( part, c, null ); + PartType(int baseMetaValue, AEFeature part, Class c) { + this( baseMetaValue, part, c, null ); } - PartType(AEFeature part, Class c, GuiText en) { + PartType(int baseMetaValue, AEFeature part, Class c, GuiText en) { features = EnumSet.of( part ); myPart = c; extraName = en; + baseDamage = baseMetaValue; } public Enum[] getVarients() diff --git a/migration/IItemMigrate.java b/migration/IItemMigrate.java new file mode 100644 index 000000000..e46963eb7 --- /dev/null +++ b/migration/IItemMigrate.java @@ -0,0 +1,10 @@ +package appeng.migration; + +import net.minecraft.item.ItemStack; + +public interface IItemMigrate +{ + + void modifyItemStack(ItemStack is); + +} diff --git a/migration/OldItemMaterial.java b/migration/OldItemMaterial.java new file mode 100644 index 000000000..ab479acb2 --- /dev/null +++ b/migration/OldItemMaterial.java @@ -0,0 +1,321 @@ +package appeng.migration; + +import java.util.Collections; +import java.util.Comparator; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; +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.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; +import appeng.api.config.Upgrades; +import appeng.api.implementations.items.IItemGroup; +import appeng.api.implementations.items.IStorageComponent; +import appeng.api.implementations.items.IUpgradeModule; +import appeng.client.texture.MissingIcon; +import appeng.core.AEConfig; +import appeng.core.features.AEFeature; +import appeng.core.features.AEFeatureHandler; +import appeng.core.features.ItemStackSrc; +import appeng.items.AEBaseItem; +import appeng.items.materials.ItemMultiMaterial; +import appeng.items.materials.MaterialType; +import appeng.util.Platform; + +public class OldItemMaterial extends AEBaseItem implements IStorageComponent, IUpgradeModule, IItemMigrate +{ + + HashMap dmgToMaterial = new HashMap(); + + public static OldItemMaterial instance; + + public OldItemMaterial() { + super( OldItemMaterial.class ); + setfeature( EnumSet.of( AEFeature.AlphaMigration ) ); + setHasSubtypes( true ); + instance = this; + + for (OldMaterialType omt : OldMaterialType.values()) + { + createMaterial( omt ); + } + } + + class SlightlyBetterSort implements Comparator + { + + Pattern p; + + public SlightlyBetterSort(Pattern p) { + this.p = p; + } + + @Override + public int compare(String o1, String o2) + { + try + { + Matcher a = p.matcher( o1 ); + Matcher b = p.matcher( o2 ); + if ( a.find() && b.find() ) + { + int ia = Integer.parseInt( a.group( 1 ) ); + int ib = Integer.parseInt( b.group( 1 ) ); + return Integer.compare( ia, ib ); + } + } + catch (Throwable t) + { + // ek! + } + return o1.compareTo( o2 ); + } + } + + @Override + public void addInformation(ItemStack is, EntityPlayer player, List details, boolean moar) + { + super.addInformation( is, player, details, moar ); + + OldMaterialType mt = getTypeByStack( is ); + if ( mt == null ) + return; + + if ( mt == OldMaterialType.NamePress ) + { + NBTTagCompound c = Platform.openNbtData( is ); + details.add( c.getString( "InscribeName" ) ); + } + + Upgrades u = getType( is ); + if ( u != null ) + { + List textList = new LinkedList(); + for (Entry j : u.getSupported().entrySet()) + { + String name = null; + + int limit = j.getValue(); + + if ( j.getKey().getItem() instanceof IItemGroup ) + { + IItemGroup ig = (IItemGroup) j.getKey().getItem(); + String str = ig.getUnlocalizedGroupName( j.getKey() ); + if ( str != null ) + name = Platform.gui_localize( str ) + (limit > 1 ? " (" + limit + ")" : ""); + } + + if ( name == null ) + name = j.getKey().getDisplayName() + (limit > 1 ? " (" + limit + ")" : ""); + + if ( !textList.contains( name ) ) + textList.add( name ); + } + + Pattern p = Pattern.compile( "(\\d+)[^\\d]" ); + SlightlyBetterSort s = new SlightlyBetterSort( p ); + Collections.sort( textList, s ); + details.addAll( textList ); + } + } + + public ItemStackSrc createMaterial(OldMaterialType mat) + { + String name = mat.name(); + + if ( mat.damageValue == -1 ) + { + boolean enabled = true; + for (AEFeature f : mat.getFeature()) + enabled = enabled && AEConfig.instance.isFeatureEnabled( f ); + + if ( enabled ) + { + int newMaterialNum = AEConfig.instance.get( "materials", name, AEConfig.instance.getFreeMaterial( mat.ordinal() ) ).getInt(); + mat.damageValue = newMaterialNum; + ItemStackSrc output = new ItemStackSrc( this, newMaterialNum ); + + dmgToMaterial.put( newMaterialNum, mat ); + + if ( mat.getOreName() != null ) + OreDictionary.registerOre( mat.getOreName(), output.stack( 1 ) ); + + return output; + } + + return null; + } + else + throw new RuntimeException( "Cannot create the same material twice..." ); + } + + public OldMaterialType getTypeByStack(ItemStack is) + { + if ( dmgToMaterial.containsKey( is.getItemDamage() ) ) + return dmgToMaterial.get( is.getItemDamage() ); + return null; + } + + @Override + public IIcon getIconFromDamage(int dmg) + { + if ( dmgToMaterial.containsKey( dmg ) ) + return dmgToMaterial.get( dmg ).IIcon; + return new MissingIcon( this ); + } + + private String nameOf(ItemStack is) + { + if ( is == null ) + return "null"; + + OldMaterialType mt = getTypeByStack( is ); + if ( mt == null ) + return "null"; + + return AEFeatureHandler.getName( OldItemMaterial.class, mt.name() ); + } + + @Override + public String getUnlocalizedName(ItemStack is) + { + return "item.appliedenergistics2." + nameOf( is ); + } + + @Override + public void registerIcons(IIconRegister icoRegister) + { + + } + + @Override + public boolean hasCustomEntity(ItemStack is) + { + return getTypeByStack( is ).hasCustomEntity(); + } + + @Override + public Entity createEntity(World w, Entity location, ItemStack itemstack) + { + Class droppedEntity = getTypeByStack( itemstack ).getCustomEntityClass(); + Entity eqi; + + try + { + eqi = droppedEntity.getConstructor( World.class, double.class, double.class, double.class, ItemStack.class ).newInstance( w, location.posX, + location.posY, location.posZ, itemstack ); + } + catch (Throwable t) + { + throw new RuntimeException( t ); + } + + eqi.motionX = location.motionX; + eqi.motionY = location.motionY; + eqi.motionZ = location.motionZ; + + if ( location instanceof EntityItem && eqi instanceof EntityItem ) + ((EntityItem) eqi).delayBeforeCanPickup = ((EntityItem) location).delayBeforeCanPickup; + + return eqi; + } + + @Override + public int getBytes(ItemStack is) + { + switch (getTypeByStack( is )) + { + case Cell1kPart: + return 1024; + case Cell4kPart: + return 1024 * 4; + case Cell16kPart: + return 1024 * 16; + case Cell64kPart: + return 1024 * 64; + default: + } + return 0; + } + + @Override + public boolean isStorageComponent(ItemStack is) + { + switch (getTypeByStack( is )) + { + case Cell1kPart: + case Cell4kPart: + case Cell16kPart: + case Cell64kPart: + return true; + default: + } + return false; + } + + @Override + public Upgrades getType(ItemStack itemstack) + { + switch (getTypeByStack( itemstack )) + { + case CardCapacity: + return Upgrades.CAPACITY; + case CardFuzzy: + return Upgrades.FUZZY; + case CardRedstone: + return Upgrades.REDSTONE; + case CardSpeed: + return Upgrades.SPEED; + case CardInverter: + return Upgrades.INVERTER; + default: + return null; + } + } + + @Override + public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List cList) + { + + } + + @Override + public void modifyItemStack(ItemStack is) + { + if ( is.getItem() == this ) + { + OldMaterialType omt = getTypeByStack( is ); + for (MaterialType mt : MaterialType.values()) + { + if ( omt != null && mt.toString().equals( omt.toString() ) ) + { + ItemStack newStack = ItemMultiMaterial.instance.getStackByType( mt ); + if ( newStack != null ) + { + NBTTagCompound tmp = new NBTTagCompound(); + newStack.stackSize = is.stackSize; + newStack.setTagCompound( is.getTagCompound() ); + + // write then read... + newStack.writeToNBT( tmp ); + is.readFromNBT( tmp ); + return; + } + } + } + } + } +} diff --git a/migration/OldItemPart.java b/migration/OldItemPart.java new file mode 100644 index 000000000..6e3ba8b82 --- /dev/null +++ b/migration/OldItemPart.java @@ -0,0 +1,257 @@ +package appeng.migration; + +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map.Entry; + +import net.minecraft.client.renderer.texture.IIconRegister; +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.IIcon; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.api.implementations.items.IItemGroup; +import appeng.api.parts.IPart; +import appeng.api.parts.IPartItem; +import appeng.core.AEConfig; +import appeng.core.features.AEFeature; +import appeng.core.features.AEFeatureHandler; +import appeng.core.features.ItemStackSrc; +import appeng.core.localization.GuiText; +import appeng.items.AEBaseItem; +import appeng.items.parts.ItemMultiPart; +import appeng.items.parts.PartType; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class OldItemPart extends AEBaseItem implements IPartItem, IItemGroup, IItemMigrate +{ + + class OldPartTypeIst + { + + OldPartType part; + int varient; + + @SideOnly(Side.CLIENT) + IIcon ico; + + }; + + HashMap dmgToPart = new HashMap(); + + public static OldItemPart instance; + + public OldItemPart() { + super( OldItemPart.class ); + setfeature( EnumSet.of( AEFeature.Core ) ); + AEApi.instance().partHelper().setItemBusRenderer( this ); + setHasSubtypes( true ); + instance = this; + + for (OldPartType omt : OldPartType.values()) + { + if ( omt.getVarients() == null ) + createPart( omt, null ); + else + { + for (Enum e : omt.getVarients()) + createPart( omt, e ); + } + } + } + + public ItemStackSrc createPart(OldPartType mat, Enum varient) + { + try + { + // I think this still works? + ItemStack is = new ItemStack( this ); + mat.getPart().getConstructor( ItemStack.class ).newInstance( is ); + } + catch (Throwable e) + { + e.printStackTrace(); + return null; // part not supported.. + } + + String name = varient == null ? mat.name() : mat.name() + "." + varient.name(); + int varID = varient == null ? 0 : varient.ordinal(); + + // verify + for (OldPartTypeIst p : dmgToPart.values()) + { + if ( p.part == mat && p.varient == varID ) + throw new RuntimeException( "Cannot create the same material twice..." ); + } + + boolean enabled = true; + for (AEFeature f : mat.getFeature()) + enabled = enabled && AEConfig.instance.isFeatureEnabled( f ); + + if ( enabled ) + { + int newPartNum = AEConfig.instance.get( "parts", name, AEConfig.instance.getFreePart( mat.ordinal() * 32 + varID ) ).getInt(); + ItemStackSrc output = new ItemStackSrc( this, newPartNum ); + + OldPartTypeIst pti = new OldPartTypeIst(); + pti.part = mat; + pti.varient = varID; + + dmgToPart.put( newPartNum, pti ); + return output; + } + + return null; + } + + public int getDamageByType(OldPartType t) + { + for (Entry pt : dmgToPart.entrySet()) + { + if ( pt.getValue().part == t ) + return pt.getKey(); + } + return -1; + } + + public OldPartType getTypeByStack(ItemStack is) + { + if ( is == null ) + return null; + + OldPartTypeIst pt = dmgToPart.get( is.getItemDamage() ); + if ( pt != null ) + return pt.part; + + return null; + } + + @Override + @SideOnly(Side.CLIENT) + public int getSpriteNumber() + { + return 0; + } + + @Override + public IIcon getIconFromDamage(int dmg) + { + IIcon ico = dmgToPart.get( dmg ).ico; + return ico; + } + + @Override + public String getUnlocalizedName(ItemStack is) + { + return "item.appliedenergistics2." + getname( is ); + } + + public String getname(ItemStack is) + { + return AEFeatureHandler.getName( OldItemPart.class, getTypeByStack( is ).name() ); + } + + @Override + public String getItemStackDisplayName(ItemStack is) + { + OldPartType pt = getTypeByStack( is ); + if ( pt == null ) + return "Unnamed"; + + Enum[] varients = pt.getVarients(); + + if ( varients != null ) + return super.getItemStackDisplayName( is ) + " - " + varients[dmgToPart.get( is.getItemDamage() ).varient].toString(); + + if ( pt.getExtraName() != null ) + return super.getItemStackDisplayName( is ) + " - " + pt.getExtraName().getLocal(); + + return super.getItemStackDisplayName( is ); + } + + @Override + public void registerIcons(IIconRegister par1IconRegister) + { + + } + + @Override + public boolean onItemUse(ItemStack is, EntityPlayer player, World w, int x, int y, int z, int side, float hitX, float hitY, float hitZ) + { + return AEApi.instance().partHelper().placeBus( is, x, y, z, side, player, w ); + } + + @Override + public IPart createPartFromItemStack(ItemStack is) + { + try + { + OldPartType t = getTypeByStack( is ); + if ( t != null ) + return t.getPart().getConstructor( ItemStack.class ).newInstance( is ); + } + catch (Throwable e) + { + throw new RuntimeException( "Unable to construct IBusPart from IBusItem : " + getTypeByStack( is ).getPart().getName() + + " ; Possibly didn't have correct constructor( ItemStack )", e ); + } + return null; + } + + @Override + public void getSubItems(Item number, CreativeTabs tab, List cList) + { + + } + + public int varientOf(int itemDamage) + { + return dmgToPart.get( itemDamage ).varient; + } + + @Override + public String getUnlocalizedGroupName(ItemStack is) + { + switch (getTypeByStack( is )) + { + case ImportBus: + case ExportBus: + return GuiText.IOBuses.getUnlocalized(); + default: + } + return null; + } + + @Override + public void modifyItemStack(ItemStack is) + { + if ( is.getItem() == this ) + { + OldPartTypeIst omt = dmgToPart.get( is.getItemDamage() ); + for (PartType mt : PartType.values()) + { + if ( omt != null && omt.part != null && mt.toString().equals( omt.part.toString() ) ) + { + ItemStack newStack = ItemMultiPart.instance.getStackFromTypeAndVarient( mt, omt.varient ); + if ( newStack != null ) + { + NBTTagCompound tmp = new NBTTagCompound(); + newStack.stackSize = is.stackSize; + newStack.setTagCompound( is.getTagCompound() ); + + // write then read... + newStack.writeToNBT( tmp ); + is.readFromNBT( tmp ); + return; + } + } + } + } + } + +} diff --git a/migration/OldMaterialType.java b/migration/OldMaterialType.java new file mode 100644 index 000000000..7a876a738 --- /dev/null +++ b/migration/OldMaterialType.java @@ -0,0 +1,130 @@ +package appeng.migration; + +import java.util.EnumSet; + +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraftforge.oredict.OreDictionary; +import appeng.core.AppEng; +import appeng.core.features.AEFeature; +import appeng.entity.EntityChargedQuartz; +import appeng.entity.EntityIds; +import appeng.entity.EntitySingularity; +import appeng.items.materials.ItemMultiMaterial; +import cpw.mods.fml.common.registry.EntityRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public enum OldMaterialType +{ + CertusQuartzCrystal(AEFeature.Core, "crystalCertusQuartz"), CertusQuartzCrystalCharged(AEFeature.Core, EntityChargedQuartz.class), + + CertusQuartzDust(AEFeature.Core, "dustCertusQuartz"), NetherQuartzDust(AEFeature.Core, "dustNetherQuartz"), Flour(AEFeature.Flour, "dustWheat"), GoldDust( + AEFeature.Core, "dustGold"), IronDust(AEFeature.Core, "dustIron"), IronNugget(AEFeature.Core, "nuggetIron"), + + Silicon(AEFeature.Core, "itemSilicon"), MatterBall, + + FluixCrystal(AEFeature.Core, "crystalFluix"), FluixDust(AEFeature.Core, "dustFluix"), FluixPearl(AEFeature.Core, "pearlFluix"), + + PureifiedCertusQuartzCrystal, PureifiedNetherQuartzCrystal, PureifiedFluixCrystal, + + CalcProcessorPress, EngProcessorPress, LogicProcessorPress, + + CalcProcessorPrint, EngProcessorPrint, LogicProcessorPrint, + + SiliconPress, SiliconPrint, + + NamePress, + + LogicProcessor, CalcProcessor, EngProcessor, + + // Basic Cards + BasicCard, CardRedstone, CardCapacity, + + // Adv Cards + AdvCard, CardFuzzy, CardSpeed, CardInverter, + + Cell2SpatialPart(AEFeature.SpatialIO), Cell16SpatialPart(AEFeature.SpatialIO), Cell128SpatialPart(AEFeature.SpatialIO), + + Cell1kPart(AEFeature.StorageCells), Cell4kPart(AEFeature.StorageCells), Cell16kPart(AEFeature.StorageCells), Cell64kPart(AEFeature.StorageCells), EmptyStorageCell( + AEFeature.StorageCells), + + WoodenGear(AEFeature.GrindStone, "gearWood"), + + Wireless(AEFeature.WirelessAccessTerminal), WirelessBooster(AEFeature.WirelessAccessTerminal), + + FormationCore, AnnihilationCore, + + SkyDust(AEFeature.Core), + + EnderDust(AEFeature.QuantumNetworkBridge, "dustEnder", EntitySingularity.class), Singularity(AEFeature.QuantumNetworkBridge, EntitySingularity.class), QESingularity( + AEFeature.QuantumNetworkBridge, EntitySingularity.class); + + private String oreName; + private EnumSet features; + private Class droppedEntity; + + // IIcon for the material. + @SideOnly(Side.CLIENT) + public IIcon IIcon; + public int damageValue = -1; + + OldMaterialType() { + features = EnumSet.of( AEFeature.Core ); + } + + OldMaterialType(AEFeature part) { + features = EnumSet.of( part ); + } + + OldMaterialType(AEFeature part, Class c) { + features = EnumSet.of( part ); + droppedEntity = c; + + EntityRegistry.registerModEntity( droppedEntity, droppedEntity.getSimpleName(), EntityIds.get( droppedEntity ), AppEng.instance, 16, 4, true ); + } + + OldMaterialType(AEFeature part, String oreDictionary, Class c) { + features = EnumSet.of( part ); + oreName = oreDictionary; + if ( OreDictionary.getOres( oreDictionary ).size() > 0 ) + features.add( AEFeature.DuplicateItems ); + + droppedEntity = c; + EntityRegistry.registerModEntity( droppedEntity, droppedEntity.getSimpleName(), EntityIds.get( droppedEntity ), AppEng.instance, 16, 4, true ); + } + + OldMaterialType(AEFeature part, String oreDictionary) { + features = EnumSet.of( part ); + oreName = oreDictionary; + if ( OreDictionary.getOres( oreDictionary ).size() > 0 ) + features.add( AEFeature.DuplicateItems ); + } + + public ItemStack stack(int size) + { + return new ItemStack( ItemMultiMaterial.instance, size, damageValue ); + } + + public EnumSet getFeature() + { + return features; + } + + public String getOreName() + { + return oreName; + } + + public boolean hasCustomEntity() + { + return droppedEntity != null; + } + + public Class getCustomEntityClass() + { + return droppedEntity; + } + +} diff --git a/migration/OldPartType.java b/migration/OldPartType.java new file mode 100644 index 000000000..618127fa4 --- /dev/null +++ b/migration/OldPartType.java @@ -0,0 +1,134 @@ +package appeng.migration; + +import java.util.EnumSet; + +import appeng.api.parts.IPart; +import appeng.api.util.AEColor; +import appeng.core.features.AEFeature; +import appeng.core.localization.GuiText; +import appeng.parts.automation.PartAnnihilationPlane; +import appeng.parts.automation.PartExportBus; +import appeng.parts.automation.PartFormationPlane; +import appeng.parts.automation.PartImportBus; +import appeng.parts.automation.PartLevelEmitter; +import appeng.parts.misc.PartCableAnchor; +import appeng.parts.misc.PartInterface; +import appeng.parts.misc.PartInvertedToggleBus; +import appeng.parts.misc.PartStorageBus; +import appeng.parts.misc.PartToggleBus; +import appeng.parts.networking.PartCableCovered; +import appeng.parts.networking.PartCableGlass; +import appeng.parts.networking.PartCableSmart; +import appeng.parts.networking.PartDenseCable; +import appeng.parts.networking.PartQuartzFiber; +import appeng.parts.p2p.PartP2PBCPower; +import appeng.parts.p2p.PartP2PIC2Power; +import appeng.parts.p2p.PartP2PItems; +import appeng.parts.p2p.PartP2PLiquids; +import appeng.parts.p2p.PartP2PRFPower; +import appeng.parts.p2p.PartP2PRedstone; +import appeng.parts.p2p.PartP2PTunnelME; +import appeng.parts.reporting.PartConversionMonitor; +import appeng.parts.reporting.PartCraftingTerminal; +import appeng.parts.reporting.PartDarkMonitor; +import appeng.parts.reporting.PartMonitor; +import appeng.parts.reporting.PartPatternTerminal; +import appeng.parts.reporting.PartSemiDarkMonitor; +import appeng.parts.reporting.PartStorageMonitor; +import appeng.parts.reporting.PartTerminal; + +public enum OldPartType +{ + ToggleBus(AEFeature.Core, PartToggleBus.class), + + InvertedToggleBus(AEFeature.Core, PartInvertedToggleBus.class), + + CableSmart(AEFeature.Core, PartCableSmart.class), CableCovered(AEFeature.Core, PartCableCovered.class), CableGlass(AEFeature.Core, PartCableGlass.class), + + CableDense(AEFeature.DenseCables, PartDenseCable.class), + + CableAnchor(AEFeature.Core, PartCableAnchor.class), + + QuartzFiber(AEFeature.Core, PartQuartzFiber.class), + + Monitor(AEFeature.Core, PartMonitor.class), + + SemiDarkMonitor(AEFeature.Core, PartSemiDarkMonitor.class), + + DarkMonitor(AEFeature.Core, PartDarkMonitor.class), + + StorageBus(AEFeature.StorageBus, PartStorageBus.class), + + ImportBus(AEFeature.ImportBus, PartImportBus.class), + + ExportBus(AEFeature.ExportBus, PartExportBus.class), + + LevelEmitter(AEFeature.LevelEmiter, PartLevelEmitter.class), + + AnnihilationPlane(AEFeature.AnnihilationPlane, PartAnnihilationPlane.class), + + FormationPlane(AEFeature.FormationPlane, PartFormationPlane.class), + + P2PTunnelME(AEFeature.P2PTunnelME, PartP2PTunnelME.class, GuiText.METunnel), + + P2PTunnelRedstone(AEFeature.P2PTunnelRedstone, PartP2PRedstone.class, GuiText.RedstoneTunnel), + + P2PTunnelItems(AEFeature.P2PTunnelItems, PartP2PItems.class, GuiText.ItemTunnel), + + P2PTunnelLiquids(AEFeature.P2PTunnelLiquids, PartP2PLiquids.class, GuiText.FluidTunnel), + + P2PTunnelMJ(AEFeature.P2PTunnelMJ, PartP2PBCPower.class, GuiText.MJTunnel), + + P2PTunnelEU(AEFeature.P2PTunnelEU, PartP2PIC2Power.class, GuiText.EUTunnel), + + // CraftingMonitor(AEFeature.Crafting, PartCraftingMonitor.class), + + PatternTerminal(AEFeature.CraftingTerminal, PartPatternTerminal.class), + + CraftingTerminal(AEFeature.CraftingTerminal, PartCraftingTerminal.class), + + Terminal(AEFeature.Core, PartTerminal.class), + + StorageMonitor(AEFeature.StorageMonitor, PartStorageMonitor.class), + + ConversionMonitor(AEFeature.PartConversionMonitor, PartConversionMonitor.class), + + Interface(AEFeature.Core, PartInterface.class), + + P2PTunnelRF(AEFeature.P2PTunnelRF, PartP2PRFPower.class, GuiText.RFTunnel); + + private final EnumSet features; + private final Class myPart; + private final GuiText extraName; + + OldPartType(AEFeature part, Class c) { + this( part, c, null ); + } + + OldPartType(AEFeature part, Class c, GuiText en) { + features = EnumSet.of( part ); + myPart = c; + extraName = en; + } + + public Enum[] getVarients() + { + return (this == CableSmart || this == CableCovered || this == CableGlass || this == CableDense) ? AEColor.values() : null; + } + + public EnumSet getFeature() + { + return features; + } + + public Class getPart() + { + return myPart; + } + + public GuiText getExtraName() + { + return extraName; + } + +} diff --git a/parts/networking/PartCable.java b/parts/networking/PartCable.java index b1a9265d5..2782d94e7 100644 --- a/parts/networking/PartCable.java +++ b/parts/networking/PartCable.java @@ -34,9 +34,10 @@ import appeng.block.AEBaseBlock; import appeng.client.texture.CableBusTextures; import appeng.client.texture.FlipableIcon; import appeng.client.texture.TaughtIcon; -import appeng.items.parts.ItemPart; +import appeng.items.parts.ItemMultiPart; import appeng.me.GridAccessException; import appeng.me.helpers.AENetworkProxy; +import appeng.migration.OldItemPart; import appeng.parts.AEBasePart; import appeng.util.Platform; import cpw.mods.fml.relauncher.Side; @@ -53,7 +54,10 @@ public class PartCable extends AEBasePart implements IPartCable public PartCable(Class c, ItemStack is) { super( c, is ); proxy.setIdlePowerUsage( 0.0 ); - proxy.myColor = AEColor.values()[((ItemPart) is.getItem()).varientOf( is.getItemDamage() )]; + if ( is.getItem() instanceof OldItemPart ) + proxy.myColor = AEColor.values()[((OldItemPart) is.getItem()).varientOf( is.getItemDamage() )]; + else + proxy.myColor = AEColor.values()[((ItemMultiPart) is.getItem()).varientOf( is.getItemDamage() )]; } @Override @@ -377,6 +381,8 @@ public class PartCable extends AEBasePart implements IPartCable IPartHost ccph = te instanceof IPartHost ? (IPartHost) te : null; IGridHost gh = te instanceof IGridHost ? (IGridHost) te : null; + rh.setFacesToRender( EnumSet.complementOf( EnumSet.of( of, of.getOpposite() ) ) ); + if ( gh != null && ccph != null && gh.getCableConnectionType( of ) == AECableType.GLASS && ccph.getColor() != AEColor.Transparent && ccph.getPart( of.getOpposite() ) == null ) rh.setTexture( getTexture( ccph.getColor() ) ); @@ -407,9 +413,7 @@ public class PartCable extends AEBasePart implements IPartCable return; } - rh.setFacesToRender( EnumSet.complementOf( EnumSet.of( of ) ) ); rh.renderBlock( x, y, z, renderer ); - rh.setTexture( getTexture( getCableColor() ) ); } else @@ -439,7 +443,6 @@ public class PartCable extends AEBasePart implements IPartCable return; } - rh.setFacesToRender( EnumSet.complementOf( EnumSet.of( of, of.getOpposite() ) ) ); rh.renderBlock( x, y, z, renderer ); rh.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); } @@ -561,6 +564,7 @@ public class PartCable extends AEBasePart implements IPartCable } rh.renderBlock( x, y, z, renderer ); + rh.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); if ( isSmart ) { @@ -578,11 +582,11 @@ public class PartCable extends AEBasePart implements IPartCable Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( defa, defa, defa, defa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( defb, defb, defb, defb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; } @@ -651,11 +655,11 @@ public class PartCable extends AEBasePart implements IPartCable Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( myColor.mediumVariant ); rh.setTexture( defa, defa, defa, defa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( myColor.whiteVariant ); rh.setTexture( defb, defb, defb, defb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; } @@ -694,6 +698,7 @@ public class PartCable extends AEBasePart implements IPartCable } rh.renderBlock( x, y, z, renderer ); + rh.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); if ( !isGlass ) { @@ -705,16 +710,15 @@ public class PartCable extends AEBasePart implements IPartCable Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( myColor.mediumVariant ); rh.setTexture( defa, defa, defa, defa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( myColor.whiteVariant ); rh.setTexture( defb, defb, defb, defb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; } - rh.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); } @SideOnly(Side.CLIENT) @@ -754,14 +758,16 @@ public class PartCable extends AEBasePart implements IPartCable } @SideOnly(Side.CLIENT) - protected void renderAllFaces(AEBaseBlock blk, int x, int y, int z, RenderBlocks renderer) + protected void renderAllFaces(AEBaseBlock blk, int x, int y, int z, IPartRenderHelper rh, RenderBlocks renderer) { - renderer.renderFaceXNeg( blk, x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.WEST ) ); - renderer.renderFaceXPos( blk, x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.EAST ) ); - renderer.renderFaceZNeg( blk, x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.NORTH ) ); - renderer.renderFaceZPos( blk, x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.SOUTH ) ); - renderer.renderFaceYNeg( blk, x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.DOWN ) ); - renderer.renderFaceYPos( blk, x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.UP ) ); + rh.setBounds( (float) renderer.renderMinX * 16.0f, (float) renderer.renderMinY * 16.0f, (float) renderer.renderMinZ * 16.0f, + (float) renderer.renderMaxX * 16.0f, (float) renderer.renderMaxY * 16.0f, (float) renderer.renderMaxZ * 16.0f ); + rh.renderFace( x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.WEST ), ForgeDirection.WEST, renderer ); + rh.renderFace( x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.EAST ), ForgeDirection.EAST, renderer ); + rh.renderFace( x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.NORTH ), ForgeDirection.NORTH, renderer ); + rh.renderFace( x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.SOUTH ), ForgeDirection.SOUTH, renderer ); + rh.renderFace( x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.DOWN ), ForgeDirection.DOWN, renderer ); + rh.renderFace( x, y, z, blk.getRendererInstance().getTexture( ForgeDirection.UP ), ForgeDirection.UP, renderer ); } @Override @@ -866,6 +872,7 @@ public class PartCable extends AEBasePart implements IPartCable for (ForgeDirection of : connections) { + rh.setFacesToRender( EnumSet.complementOf( EnumSet.of( of, of.getOpposite() ) ) ); switch (of) { case DOWN: @@ -888,9 +895,10 @@ public class PartCable extends AEBasePart implements IPartCable } } - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); } + rh.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); rh.setTexture( null ); } diff --git a/parts/networking/PartCableCovered.java b/parts/networking/PartCableCovered.java index 33bf5e862..b84b75552 100644 --- a/parts/networking/PartCableCovered.java +++ b/parts/networking/PartCableCovered.java @@ -229,7 +229,7 @@ public class PartCableCovered extends PartCable } } - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); } renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; diff --git a/parts/networking/PartCableSmart.java b/parts/networking/PartCableSmart.java index 4177e94be..2c8b5176d 100644 --- a/parts/networking/PartCableSmart.java +++ b/parts/networking/PartCableSmart.java @@ -216,11 +216,11 @@ public class PartCableSmart extends PartCable Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( defa, defa, defa, defa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( defb, defb, defb, defb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; @@ -266,7 +266,8 @@ public class PartCableSmart extends PartCable case UP: renderer.setRenderBounds( 5 / 16.0, 0, 5 / 16.0, 11 / 16.0, 16 / 16.0, 11 / 16.0 ); rh.setTexture( def, def, off, off, off, off ); - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); + renderer.uvRotateTop = 0; renderer.uvRotateBottom = 0; renderer.uvRotateSouth = 3; @@ -276,11 +277,11 @@ public class PartCableSmart extends PartCable Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( defa, defa, offa, offa, offa, offa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( defb, defb, offb, offb, offb, offb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); break; case EAST: case WEST: @@ -297,17 +298,17 @@ public class PartCableSmart extends PartCable ico.setFlip( false, true ); renderer.setRenderBounds( 0, 5 / 16.0, 5 / 16.0, 16 / 16.0, 11 / 16.0, 11 / 16.0 ); - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( offa, offa, offa, offa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( offb, offb, offb, offb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); break; case NORTH: case SOUTH: @@ -318,17 +319,17 @@ public class PartCableSmart extends PartCable renderer.uvRotateSouth = 2; renderer.uvRotateWest = 1; renderer.setRenderBounds( 5 / 16.0, 5 / 16.0, 0, 11 / 16.0, 11 / 16.0, 16 / 16.0 ); - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( offa, offa, defa, defa, offa, offa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( offb, offb, defb, defb, offb, offb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); break; default: break; diff --git a/parts/networking/PartDenseCable.java b/parts/networking/PartDenseCable.java index 50dcedf54..0ab229395 100644 --- a/parts/networking/PartDenseCable.java +++ b/parts/networking/PartDenseCable.java @@ -258,6 +258,7 @@ public class PartDenseCable extends PartCable * rh.setTexture( getTexture( getCableColor() ) ); } */ + rh.setFacesToRender( EnumSet.complementOf( EnumSet.of( of, of.getOpposite() ) ) ); if ( ghh != null && ccph != null && ghh.getCableConnectionType( of ) != AECableType.GLASS && ccph.getColor() != AEColor.Transparent && ccph.getPart( of.getOpposite() ) == null ) rh.setTexture( getTexture( myColor = ccph.getColor() ) ); @@ -290,6 +291,7 @@ public class PartDenseCable extends PartCable rh.renderBlock( x, y, z, renderer ); + rh.setFacesToRender( EnumSet.allOf( ForgeDirection.class ) ); if ( !isGlass ) { setSmartConnectionRotations( of, renderer ); @@ -300,11 +302,11 @@ public class PartDenseCable extends PartCable Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( myColor.mediumVariant ); rh.setTexture( defa, defa, defa, defa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( myColor.whiteVariant ); rh.setTexture( defb, defb, defb, defb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); renderer.uvRotateBottom = renderer.uvRotateEast = renderer.uvRotateNorth = renderer.uvRotateSouth = renderer.uvRotateTop = renderer.uvRotateWest = 0; } @@ -367,7 +369,8 @@ public class PartDenseCable extends PartCable case UP: renderer.setRenderBounds( 3 / 16.0, 0, 3 / 16.0, 13 / 16.0, 16 / 16.0, 13 / 16.0 ); rh.setTexture( def, def, off, off, off, off ); - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); + renderer.uvRotateTop = 0; renderer.uvRotateBottom = 0; renderer.uvRotateSouth = 3; @@ -377,11 +380,11 @@ public class PartDenseCable extends PartCable Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( defa, defa, offa, offa, offa, offa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( defb, defb, offb, offb, offb, offb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); break; case EAST: case WEST: @@ -398,17 +401,17 @@ public class PartDenseCable extends PartCable ico.setFlip( false, true ); renderer.setRenderBounds( 0, 3 / 16.0, 3 / 16.0, 16 / 16.0, 13 / 16.0, 13 / 16.0 ); - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( offa, offa, offa, offa, defa, defa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( offb, offb, offb, offb, defb, defb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); break; case NORTH: case SOUTH: @@ -419,17 +422,17 @@ public class PartDenseCable extends PartCable renderer.uvRotateSouth = 2; renderer.uvRotateWest = 1; renderer.setRenderBounds( 3 / 16.0, 3 / 16.0, 0, 13 / 16.0, 13 / 16.0, 16 / 16.0 ); - renderer.renderStandardBlock( rh.getBlock(), x, y, z ); + rh.renderBlockCurrentBounds( x, y, z, renderer ); Tessellator.instance.setBrightness( 15 << 20 | 15 << 4 ); Tessellator.instance.setColorOpaque_I( getCableColor().mediumVariant ); rh.setTexture( offa, offa, defa, defa, offa, offa ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); Tessellator.instance.setColorOpaque_I( getCableColor().whiteVariant ); rh.setTexture( offb, offb, defb, defb, offb, offb ); - renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, renderer ); + renderAllFaces( (AEBaseBlock) rh.getBlock(), x, y, z, rh, renderer ); break; default: break; diff --git a/recipes/AEItemResolver.java b/recipes/AEItemResolver.java index e052b3982..68b13d247 100644 --- a/recipes/AEItemResolver.java +++ b/recipes/AEItemResolver.java @@ -10,7 +10,7 @@ import appeng.api.util.AEColoredItemDefinition; import appeng.core.AppEng; import appeng.items.materials.MaterialType; import appeng.items.misc.ItemCrystalSeed; -import appeng.items.parts.ItemPart; +import appeng.items.parts.ItemMultiPart; import appeng.items.parts.PartType; public class AEItemResolver implements ISubItemResolver @@ -88,7 +88,7 @@ public class AEItemResolver implements ISubItemResolver String partName = itemName.substring( itemName.indexOf( "." ) + 1 ); PartType pt = PartType.valueOf( partName ); itemName = itemName.substring( 0, itemName.indexOf( "." ) ); - int dVal = ItemPart.instance.getDamageByType( pt ); + int dVal = ItemMultiPart.instance.getDamageByType( pt ); if ( dVal >= 0 ) return new ResolverResult( itemName, dVal ); } diff --git a/recipes/RecipeHandler.java b/recipes/RecipeHandler.java index 0e1005434..f775bab58 100644 --- a/recipes/RecipeHandler.java +++ b/recipes/RecipeHandler.java @@ -25,9 +25,9 @@ import appeng.core.AEConfig; import appeng.core.AELog; import appeng.core.AppEng; import appeng.core.features.AEFeature; -import appeng.items.materials.ItemMaterial; +import appeng.items.materials.ItemMultiMaterial; import appeng.items.misc.ItemCrystalSeed; -import appeng.items.parts.ItemPart; +import appeng.items.parts.ItemMultiPart; import appeng.recipes.handlers.IWebsiteSeralizer; import appeng.recipes.handlers.OreRegistration; import cpw.mods.fml.common.registry.GameRegistry; @@ -245,10 +245,10 @@ public class RecipeHandler implements IRecipeHandler default: } } - else if ( is.getItem() instanceof ItemMaterial ) - realName += "." + ((ItemMaterial) is.getItem()).getTypeByStack( is ).name(); - else if ( is.getItem() instanceof ItemPart ) - realName += "." + ((ItemPart) is.getItem()).getTypeByStack( is ).name(); + else if ( is.getItem() instanceof ItemMultiMaterial ) + realName += "." + ((ItemMultiMaterial) is.getItem()).getTypeByStack( is ).name(); + else if ( is.getItem() instanceof ItemMultiPart ) + realName += "." + ((ItemMultiPart) is.getItem()).getTypeByStack( is ).name(); else if ( is.getItemDamage() > 0 ) realName += "." + is.getItemDamage(); diff --git a/transformer/AppEngCore.java b/transformer/AppEngCore.java index e70f3b701..562090939 100644 --- a/transformer/AppEngCore.java +++ b/transformer/AppEngCore.java @@ -47,7 +47,7 @@ public class AppEngCore extends DummyModContainer implements IFMLLoadingPlugin @Override public String[] getASMTransformerClass() { - return new String[] { "appeng.transformer.asm.ASMIntegration" }; + return new String[] { "appeng.transformer.asm.ASMIntegration", "appeng.transformer.asm.ASMMigration" }; } @Override diff --git a/transformer/asm/ASMMigration.java b/transformer/asm/ASMMigration.java new file mode 100644 index 000000000..70b8f6d75 --- /dev/null +++ b/transformer/asm/ASMMigration.java @@ -0,0 +1,153 @@ +package appeng.transformer.asm; + +import java.io.InputStream; +import java.util.Iterator; + +import net.minecraft.item.ItemStack; +import net.minecraft.launchwrapper.IClassTransformer; + +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.AbstractInsnNode; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.LabelNode; +import org.objectweb.asm.tree.LineNumberNode; +import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; + +import appeng.migration.IItemMigrate; + +public class ASMMigration implements IClassTransformer +{ + + @Override + public byte[] transform(String name, String transformedName, byte[] basicClass) + { + try + { + + if ( transformedName != null && transformedName.equals( "net.minecraft.item.ItemStack" ) ) + { + ClassNode classNode = new ClassNode(); + ClassReader classReader = new ClassReader( basicClass ); + classReader.accept( classNode, 0 ); + + ClassNode srcNode = new ClassNode(); + InputStream is = getClass().getResourceAsStream( "/appeng/transformer/template/ItemStackTemplate.class" ); + ClassReader srcReader = new ClassReader( is ); + srcReader.accept( srcNode, 0 ); + + // MD: net/minecraft/item/ItemStack/readFromNBT (Lnet/minecraft/nbt/NBTTagCompound;)V + // abp/c (Ldg;)V + for (MethodNode mn : classNode.methods) + { + boolean signatureMatch = mn.desc.equals( "(Ldg;)V" ) || mn.desc.equals( "(Lnet/minecraft/nbt/NBTTagCompound;)V" ); + boolean nameMatch = mn.name.equals( "readFromNBT" ) || mn.name.equals( "c" ) || mn.name.equals( "func_77963_c" ); + + if ( nameMatch && signatureMatch ) + { + for (MethodNode smn : srcNode.methods) + { + if ( smn.name.equals( "readFromNBT" ) ) + handleChunkAddition( classNode, srcNode.name, mn, smn, false ); + } + } + } + + ClassWriter writer = new ClassWriter( ClassWriter.COMPUTE_MAXS ); + classNode.accept( writer ); + return writer.toByteArray(); + } + + } + catch (Throwable t) + { + t.printStackTrace(); + } + + return basicClass; + } + + private void handleChunkAddition(ClassNode classNode, String from, MethodNode tmn, MethodNode mn, boolean atbeginning) + { + Iterator i = mn.instructions.iterator(); + while (i.hasNext()) + { + processNode( i.next(), from, classNode.name ); + } + + Iterator g = mn.instructions.iterator(); + while (g.hasNext()) + { + AbstractInsnNode ain = g.next(); + if ( ain instanceof LineNumberNode ) + g.remove(); + else if ( ain instanceof LabelNode ) + g.remove(); + } + + AbstractInsnNode finalReturn = mn.instructions.getLast(); + while (!isReturn( finalReturn.getOpcode() )) + { + mn.instructions.remove( finalReturn ); + finalReturn = mn.instructions.getLast(); + } + mn.instructions.remove( finalReturn ); + + if ( atbeginning ) + tmn.instructions.insert( mn.instructions ); + else + { + AbstractInsnNode node = tmn.instructions.getLast(); + + while (!isReturn( node.getOpcode() )) + node = node.getPrevious(); + + tmn.instructions.insertBefore( node.getPrevious(), mn.instructions ); + } + } + + private boolean isReturn(int opcode) + { + switch (opcode) + { + case Opcodes.ARETURN: + case Opcodes.DRETURN: + case Opcodes.FRETURN: + case Opcodes.LRETURN: + case Opcodes.IRETURN: + case Opcodes.RETURN: + return true; + } + return false; + } + + private void processNode(AbstractInsnNode next, String from, String nePar) + { + if ( next instanceof FieldInsnNode ) + { + FieldInsnNode min = (FieldInsnNode) next; + if ( min.owner.equals( from ) ) + { + min.owner = nePar; + } + } + if ( next instanceof MethodInsnNode ) + { + MethodInsnNode min = (MethodInsnNode) next; + if ( min.owner.equals( from ) ) + { + min.owner = nePar; + } + } + } + + public static void handleMigration(Object itemStackTemplate) + { + ItemStack is = (ItemStack) itemStackTemplate; + if ( is.getItem() != null && is.getItem() instanceof IItemMigrate ) + ((IItemMigrate) is.getItem()).modifyItemStack( (ItemStack) itemStackTemplate ); + } +} \ No newline at end of file diff --git a/transformer/template/ItemStackTemplate.java b/transformer/template/ItemStackTemplate.java new file mode 100644 index 000000000..3be6d305d --- /dev/null +++ b/transformer/template/ItemStackTemplate.java @@ -0,0 +1,15 @@ +package appeng.transformer.template; + +import net.minecraft.nbt.NBTTagCompound; +import appeng.transformer.asm.ASMMigration; + +public class ItemStackTemplate +{ + + public void readFromNBT(NBTTagCompound par1NBTTagCompound) + { + ASMMigration.handleMigration( this ); + return; + } + +}