diff --git a/common/mekanism/client/ClientProxy.java b/common/mekanism/client/ClientProxy.java index 2f490cbe2..b3458e34e 100644 --- a/common/mekanism/client/ClientProxy.java +++ b/common/mekanism/client/ClientProxy.java @@ -338,6 +338,7 @@ public class ClientProxy extends CommonProxy MinecraftForgeClient.registerItemRenderer(Mekanism.GasMask.itemID, handler); MinecraftForgeClient.registerItemRenderer(Mekanism.ScubaTank.itemID, handler); MinecraftForgeClient.registerItemRenderer(Mekanism.Balloon.itemID, handler); + MinecraftForgeClient.registerItemRenderer(Mekanism.FrictionBoots.itemID, handler); //Register block handlers RenderingRegistry.registerBlockHandler(new MachineRenderingHandler()); diff --git a/common/mekanism/client/model/ModelFrictionBoots.java b/common/mekanism/client/model/ModelFrictionBoots.java index 631877ecf..92d533399 100644 --- a/common/mekanism/client/model/ModelFrictionBoots.java +++ b/common/mekanism/client/model/ModelFrictionBoots.java @@ -24,7 +24,6 @@ public class ModelFrictionBoots extends ModelBase SpringL.setTextureSize(64, 32); SpringL.mirror = true; setRotation(SpringL, 0.1047198F, 0F, 0F); - SpringR.mirror = true; SpringR = new ModelRenderer(this, 8, 0); SpringR.addBox(-2.5F, 18F, 0F, 1, 6, 1); SpringR.setRotationPoint(0F, 0F, 0F); @@ -50,7 +49,6 @@ public class ModelFrictionBoots extends ModelBase SupportL.setTextureSize(64, 32); SupportL.mirror = true; setRotation(SupportL, 0.296706F, 0F, 0F); - SupportR.mirror = true; SupportR = new ModelRenderer(this, 0, 0); SupportR.addBox(-3F, 16.5F, -4.2F, 2, 4, 2); SupportR.setRotationPoint(0F, 0F, 0F); @@ -69,6 +67,20 @@ public class ModelFrictionBoots extends ModelBase SupportL.render(size); SupportR.render(size); } + + public void renderLeft(float size) + { + SpringL.render(size); + BraceL.render(size); + SupportL.render(size); + } + + public void renderRight(float size) + { + SpringR.render(size); + BraceR.render(size); + SupportR.render(size); + } private void setRotation(ModelRenderer model, float x, float y, float z) { diff --git a/common/mekanism/client/render/ModelCustomArmor.java b/common/mekanism/client/render/ModelCustomArmor.java index f9bacd4d1..abffedf77 100644 --- a/common/mekanism/client/render/ModelCustomArmor.java +++ b/common/mekanism/client/render/ModelCustomArmor.java @@ -1,5 +1,6 @@ package mekanism.client.render; +import mekanism.client.model.ModelFrictionBoots; import mekanism.client.model.ModelGasMask; import mekanism.client.model.ModelJetpack; import mekanism.client.model.ModelScubaTank; @@ -35,8 +36,8 @@ public class ModelCustomArmor extends ModelBiped resetPart(bipedBody, 0, 0, 0); resetPart(bipedRightArm, 5, 2, 0); resetPart(bipedLeftArm, -5, 2, 0); - resetPart(bipedRightLeg, 2, 12, 0); - resetPart(bipedLeftLeg, -2, 12, 0); + resetPart(bipedRightLeg, 0, 0, 0); + resetPart(bipedLeftLeg, 0, 0, 0); bipedHeadwear.cubeList.clear(); bipedEars.cubeList.clear(); @@ -64,6 +65,13 @@ public class ModelCustomArmor extends ModelBiped bipedBody.isHidden = false; bipedBody.showModel = true; } + else if(modelType.armorSlot == 3) + { + bipedLeftLeg.isHidden = false; + bipedLeftLeg.showModel = true; + bipedRightLeg.isHidden = false; + bipedRightLeg.showModel = true; + } setRotationAngles(f, f1, f2, f3, f4, size, entity); } @@ -137,6 +145,21 @@ public class ModelCustomArmor extends ModelBiped GL11.glTranslatef(0, 0, -0.05F); ArmorModel.gasMaskModel.render(0.0625F); } + else if(biped.modelType == ArmorModel.FRICTIONBOOTS) + { + GL11.glScalef(0.99F, 0.99F, 0.99F); + + if(partRender == biped.bipedLeftLeg) + { + GL11.glTranslatef(-0.1375F, -0.75F, 0); + ArmorModel.frictionBootsModel.renderLeft(0.0625F); + } + else if(partRender == biped.bipedRightLeg) + { + GL11.glTranslatef(0.1375F, -0.75F, 0); + ArmorModel.frictionBootsModel.renderRight(0.0625F); + } + } } GL11.glPopMatrix(); @@ -161,6 +184,10 @@ public class ModelCustomArmor extends ModelBiped { return partRender == biped.bipedBody; } + else if(type.armorSlot == 3) + { + return partRender == biped.bipedLeftLeg || partRender == biped.bipedRightLeg; + } return false; } @@ -169,7 +196,8 @@ public class ModelCustomArmor extends ModelBiped { JETPACK(1, MekanismUtils.getResource(ResourceType.RENDER, "Jetpack.png")), SCUBATANK(1, MekanismUtils.getResource(ResourceType.RENDER, "ScubaSet.png")), - GASMASK(0, MekanismUtils.getResource(ResourceType.RENDER, "ScubaSet.png")); + GASMASK(0, MekanismUtils.getResource(ResourceType.RENDER, "ScubaSet.png")), + FRICTIONBOOTS(3, MekanismUtils.getResource(ResourceType.RENDER, "FrictionBoots.png")); public int armorSlot; public ResourceLocation resource; @@ -177,6 +205,7 @@ public class ModelCustomArmor extends ModelBiped public static ModelJetpack jetpackModel = new ModelJetpack(); public static ModelGasMask gasMaskModel = new ModelGasMask(); public static ModelScubaTank scubaTankModel = new ModelScubaTank(); + public static ModelFrictionBoots frictionBootsModel = new ModelFrictionBoots(); private ArmorModel(int i, ResourceLocation r) { diff --git a/common/mekanism/client/render/item/ItemRenderingHandler.java b/common/mekanism/client/render/item/ItemRenderingHandler.java index 97664a46d..0252d1d4f 100644 --- a/common/mekanism/client/render/item/ItemRenderingHandler.java +++ b/common/mekanism/client/render/item/ItemRenderingHandler.java @@ -6,6 +6,7 @@ import mekanism.client.ClientProxy; import mekanism.client.MekanismClient; import mekanism.client.model.ModelEnergyCube; import mekanism.client.model.ModelEnergyCube.ModelEnergyCore; +import mekanism.client.model.ModelFrictionBoots; import mekanism.client.model.ModelGasMask; import mekanism.client.model.ModelGasTank; import mekanism.client.model.ModelJetpack; @@ -25,6 +26,7 @@ import mekanism.common.inventory.InventoryBin; import mekanism.common.item.ItemBalloon; import mekanism.common.item.ItemBlockBasic; import mekanism.common.item.ItemBlockMachine; +import mekanism.common.item.ItemFrictionBoots; import mekanism.common.item.ItemGasMask; import mekanism.common.item.ItemJetpack; import mekanism.common.item.ItemRobit; @@ -69,9 +71,10 @@ public class ItemRenderingHandler implements IItemRenderer public ModelJetpack jetpack = new ModelJetpack(); public ModelGasMask gasMask = new ModelGasMask(); public ModelScubaTank scubaTank = new ModelScubaTank(); + public ModelFrictionBoots frictionBoots = new ModelFrictionBoots(); - public RenderBalloon balloonRenderer = new RenderBalloon(); - public RenderBin binRenderer = (RenderBin)TileEntityRenderer.instance.specialRendererMap.get(TileEntityBin.class); + private final RenderBalloon balloonRenderer = new RenderBalloon(); + private final RenderBin binRenderer = (RenderBin)TileEntityRenderer.instance.specialRendererMap.get(TileEntityBin.class); private final RenderItem renderItem = (RenderItem)RenderManager.instance.getEntityClassRenderObject(EntityItem.class); @Override @@ -343,6 +346,15 @@ public class ItemRenderingHandler implements IItemRenderer Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "ScubaSet.png")); scubaTank.render(0.0625F); } + else if(item.getItem() instanceof ItemFrictionBoots) + { + GL11.glRotatef(180, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(90, 0.0F, -1.0F, 0.0F); + GL11.glScalef(2.0F, 2.0F, 2.0F); + GL11.glTranslatef(0.2F, -1.43F, 0.12F); + Minecraft.getMinecraft().renderEngine.bindTexture(MekanismUtils.getResource(ResourceType.RENDER, "FrictionBoots.png")); + frictionBoots.render(0.0625F); + } else if(item.getItem() instanceof ItemBalloon) { if(type == ItemRenderType.EQUIPPED || type == ItemRenderType.EQUIPPED_FIRST_PERSON) @@ -362,7 +374,6 @@ public class ItemRenderingHandler implements IItemRenderer GL11.glDisable(GL11.GL_CULL_FACE); RenderPartTransmitter.getInstance().renderItem(TransmitterType.values()[item.getItemDamage()]); GL11.glEnable(GL11.GL_CULL_FACE); - } else { if(item.getItem() instanceof ItemBlockMachine) diff --git a/common/mekanism/common/Mekanism.java b/common/mekanism/common/Mekanism.java index 90ef1a281..f6fa42b5b 100644 --- a/common/mekanism/common/Mekanism.java +++ b/common/mekanism/common/Mekanism.java @@ -65,6 +65,7 @@ import mekanism.common.item.ItemDirtyDust; import mekanism.common.item.ItemDust; import mekanism.common.item.ItemElectricBow; import mekanism.common.item.ItemEnergized; +import mekanism.common.item.ItemFrictionBoots; import mekanism.common.item.ItemGasMask; import mekanism.common.item.ItemIngot; import mekanism.common.item.ItemJetpack; @@ -253,6 +254,7 @@ public class Mekanism public static Item Sawdust; public static Item Salt; public static Item BrineBucket; + public static Item FrictionBoots; //Blocks public static Block BasicBlock; @@ -556,6 +558,9 @@ public class Mekanism CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(MachineBlock2, 1, 8), new Object[] { "CGC", "ASA", "CGC", Character.valueOf('G'), MekanismUtils.getEmptyGasTank(), Character.valueOf('C'), "circuitBasic", Character.valueOf('A'), AtomicCore, Character.valueOf('S'), new ItemStack(BasicBlock, 1, 8) })); + CraftingManager.getInstance().getRecipeList().add(new MekanismRecipe(new ItemStack(FrictionBoots), new Object[] { + "C C", "A A", "T T", Character.valueOf('C'), "circuitBasic", Character.valueOf('A'), EnrichedAlloy, Character.valueOf('T'), EnergyTablet.getUnchargedItem() + })); for(RecipeType type : RecipeType.values()) { @@ -782,6 +787,7 @@ public class Mekanism Salt = new ItemMekanism(configuration.getItem("Salt", 11231).getInt()).setUnlocalizedName("Salt"); BrineBucket = new ItemMekanism(configuration.getItem("BrineBucket", 11232).getInt()).setMaxStackSize(1).setUnlocalizedName("BrineBucket"); Crystal = new ItemCrystal(configuration.getItem("Crystal", 11233).getInt()); + FrictionBoots = new ItemFrictionBoots(configuration.getItem("FrictionBoots", 11234).getInt()).setUnlocalizedName("FrictionBoots"); configuration.save(); @@ -822,6 +828,7 @@ public class Mekanism GameRegistry.registerItem(Salt, "Salt"); GameRegistry.registerItem(BrineBucket, "BrineBucket"); GameRegistry.registerItem(Crystal, "Crystal"); + GameRegistry.registerItem(FrictionBoots, "FrictionBoots"); } /** diff --git a/common/mekanism/common/item/ItemEnergized.java b/common/mekanism/common/item/ItemEnergized.java index 48063a6bc..a1a0c2124 100644 --- a/common/mekanism/common/item/ItemEnergized.java +++ b/common/mekanism/common/item/ItemEnergized.java @@ -38,12 +38,6 @@ public class ItemEnergized extends ItemMekanism implements IEnergizedItem, ISpec list.add(EnumColor.AQUA + "Stored Energy: " + EnumColor.GREY + MekanismUtils.getEnergyDisplay(getEnergy(itemstack))); } - @Override - public void onCreated(ItemStack itemstack, World world, EntityPlayer entityplayer) - { - itemstack = getUnchargedItem(); - } - public ItemStack getUnchargedItem() { ItemStack charged = new ItemStack(this); diff --git a/common/mekanism/common/item/ItemFrictionBoots.java b/common/mekanism/common/item/ItemFrictionBoots.java new file mode 100644 index 000000000..e7e150b42 --- /dev/null +++ b/common/mekanism/common/item/ItemFrictionBoots.java @@ -0,0 +1,262 @@ +package mekanism.common.item; + +import ic2.api.item.IElectricItemManager; +import ic2.api.item.ISpecialElectricItem; + +import java.util.List; + +import cofh.api.energy.IEnergyContainerItem; +import mekanism.api.EnumColor; +import mekanism.api.energy.IEnergizedItem; +import mekanism.client.render.ModelCustomArmor; +import mekanism.client.render.ModelCustomArmor.ArmorModel; +import mekanism.common.Mekanism; +import mekanism.common.integration.IC2ItemManager; +import mekanism.common.util.MekanismUtils; +import net.minecraft.client.model.ModelBiped; +import net.minecraft.client.renderer.texture.IconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.DamageSource; +import net.minecraft.world.World; +import net.minecraftforge.common.EnumHelper; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.ForgeSubscribe; +import net.minecraftforge.event.entity.living.LivingAttackEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemFrictionBoots extends ItemArmor implements IEnergizedItem, ISpecialElectricItem, IEnergyContainerItem +{ + /** The maximum amount of energy this item can hold. */ + public double MAX_ELECTRICITY = 12000; + + public ItemFrictionBoots(int id) + { + super(id, EnumHelper.addArmorMaterial("FRICTIONBOOTS", 0, new int[] {0, 0, 0, 0}, 0), 0, 3); + setMaxStackSize(1); + setMaxDamage(100); + setNoRepair(); + setCreativeTab(Mekanism.tabMekanism); + MinecraftForge.EVENT_BUS.register(this); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister register) {} + + @Override + public boolean isValidArmor(ItemStack stack, int armorType, Entity entity) + { + return armorType == 3; + } + + @Override + public String getArmorTexture(ItemStack stack, Entity entity, int slot, String type) + { + return "mekanism:render/NullArmor.png"; + } + + @Override + @SideOnly(Side.CLIENT) + public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, int armorSlot) + { + ModelCustomArmor model = ModelCustomArmor.INSTANCE; + model.modelType = ArmorModel.FRICTIONBOOTS; + return model; + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) + { + list.add(EnumColor.AQUA + "Stored Energy: " + EnumColor.GREY + MekanismUtils.getEnergyDisplay(getEnergy(itemstack))); + } + + public ItemStack getUnchargedItem() + { + ItemStack charged = new ItemStack(this); + charged.setItemDamage(100); + return charged; + } + + @Override + public void getSubItems(int i, CreativeTabs tabs, List list) + { + ItemStack discharged = new ItemStack(this); + discharged.setItemDamage(100); + list.add(discharged); + ItemStack charged = new ItemStack(this); + setEnergy(charged, ((IEnergizedItem)charged.getItem()).getMaxEnergy(charged)); + list.add(charged); + } + + @Override + public boolean canProvideEnergy(ItemStack itemStack) + { + return canSend(itemStack); + } + + @Override + public int getChargedItemId(ItemStack itemStack) + { + return itemID; + } + + @Override + public int getEmptyItemId(ItemStack itemStack) + { + return itemID; + } + + @Override + public int getMaxCharge(ItemStack itemStack) + { + return 0; + } + + @Override + public int getTier(ItemStack itemStack) + { + return 4; + } + + @Override + public int getTransferLimit(ItemStack itemStack) + { + return 0; + } + + @Override + public double getEnergy(ItemStack itemStack) + { + if(itemStack.stackTagCompound == null) + { + return 0; + } + + double electricityStored = itemStack.stackTagCompound.getDouble("electricity"); + itemStack.setItemDamage((int)Math.max(1, (Math.abs(((electricityStored/getMaxEnergy(itemStack))*100)-100)))); + + return electricityStored; + } + + @Override + public void setEnergy(ItemStack itemStack, double amount) + { + if(itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + + double electricityStored = Math.max(Math.min(amount, getMaxEnergy(itemStack)), 0); + itemStack.stackTagCompound.setDouble("electricity", electricityStored); + itemStack.setItemDamage((int)Math.max(1, (Math.abs(((electricityStored/getMaxEnergy(itemStack))*100)-100)))); + } + + @Override + public double getMaxEnergy(ItemStack itemStack) + { + return MAX_ELECTRICITY; + } + + @Override + public double getMaxTransfer(ItemStack itemStack) + { + return getMaxEnergy(itemStack)*0.005; + } + + @Override + public boolean canReceive(ItemStack itemStack) + { + return getMaxEnergy(itemStack)-getEnergy(itemStack) > 0; + } + + @Override + public boolean canSend(ItemStack itemStack) + { + return false; + } + + @Override + public int receiveEnergy(ItemStack theItem, int energy, boolean simulate) + { + if(canReceive(theItem)) + { + double energyNeeded = getMaxEnergy(theItem)-getEnergy(theItem); + double toReceive = Math.min(energy*Mekanism.FROM_TE, energyNeeded); + + if(!simulate) + { + setEnergy(theItem, getEnergy(theItem) + toReceive); + } + + return (int)Math.round(toReceive*Mekanism.TO_TE); + } + + return 0; + } + + @Override + public int extractEnergy(ItemStack theItem, int energy, boolean simulate) + { + if(canSend(theItem)) + { + double energyRemaining = getEnergy(theItem); + double toSend = Math.min((energy*Mekanism.FROM_TE), energyRemaining); + + if(!simulate) + { + setEnergy(theItem, getEnergy(theItem) - toSend); + } + + return (int)Math.round(toSend*Mekanism.TO_TE); + } + + return 0; + } + + @Override + public int getEnergyStored(ItemStack theItem) + { + return (int)Math.round(getEnergy(theItem)*Mekanism.TO_TE); + } + + @Override + public int getMaxEnergyStored(ItemStack theItem) + { + return (int)Math.round(getMaxEnergy(theItem)*Mekanism.TO_TE); + } + + @Override + public boolean isMetadataSpecific() + { + return false; + } + + @Override + public IElectricItemManager getManager(ItemStack itemStack) + { + return IC2ItemManager.getManager(this); + } + + @ForgeSubscribe + public void onEntityAttacked(LivingAttackEvent event) + { + EntityLivingBase base = event.entityLiving; + + if(base.getCurrentItemOrArmor(1) != null && base.getCurrentItemOrArmor(1).getItem() instanceof ItemFrictionBoots) + { + ItemFrictionBoots boots = (ItemFrictionBoots)base.getCurrentItemOrArmor(1).getItem(); + + if(event.source == DamageSource.fall) + { + event.setCanceled(true); + } + } + } +} diff --git a/resources/assets/mekanism/lang/en_US.lang b/resources/assets/mekanism/lang/en_US.lang index 5b95c6c97..affd73b65 100644 --- a/resources/assets/mekanism/lang/en_US.lang +++ b/resources/assets/mekanism/lang/en_US.lang @@ -31,6 +31,7 @@ item.CompressedRedstone.name=Compressed Redstone item.Sawdust.name=Sawdust item.Salt.name=Salt item.BrineBucket.name=Brine Bucket +item.FrictionBoots.name=Friction Boots //Gas Tank tile.GasTank.GasTank.name=Gas Tank @@ -380,6 +381,9 @@ tooltip.RotaryCondensentrator=A machine capable of converting gasses into !nthei tooltip.ChemicalInjectionChamber=An elite machine capable of processing !nores into four shards, serving as the initial !nstage of 400% ore processing. tooltip.ElectrolyticSeparator=A machine that uses the process of !nelectrolysis to split apart a certain !ngas into two different gasses. tooltip.PrecisionSawmill=A machine used to process logs and other !nwood-based items more efficiently, as well !nas to obtain sawdust. +tooltip.ChemicalDissolutionChamber=An ultimate machine used to !nchemically dissolve all impurities of an !nore, leaving an unprocessed slurry !nbehind. +tooltip.ChemicalWasher=An ultimate machine that cleans unprocessed !nslurry and prepares it for crystallization. +tooltip.ChemicalCrystalizer=An ultimate machine used to crystalize !npurified ore slurry into ore crystals. tooltip.OsmiumOre=A strong mineral that can be found !nat nearly any height in the world. !nIt is known to have many uses in !nthe construction of machinery. tooltip.CopperOre=A common, conductive material that !ncan be used in the production of !nwires. It's ability to withstand !nhigh heats also makes it essential !nto advanced machinery. diff --git a/resources/assets/mekanism/render/ChemicalWasher.png b/resources/assets/mekanism/render/ChemicalWasher.png index 7f518d815..93c84aa42 100644 Binary files a/resources/assets/mekanism/render/ChemicalWasher.png and b/resources/assets/mekanism/render/ChemicalWasher.png differ