summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/lance5057/tDefense/Reference.java4
-rw-r--r--src/main/java/lance5057/tDefense/core/blocks/TDMetalBlock.java76
-rw-r--r--src/main/java/lance5057/tDefense/core/blocks/TDMetalItemBlock.java3
-rw-r--r--src/main/java/lance5057/tDefense/core/events/ArmorRenderEvent.java237
-rw-r--r--src/main/java/lance5057/tDefense/core/events/TDEvents.java2
-rw-r--r--src/main/java/lance5057/tDefense/core/materials/TDMaterials.java16
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/TDTools.java85
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersHood.java74
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersRobe.java70
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShawl.java77
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShoes.java70
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersBreastplate.java76
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersGrieves.java57
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersHelm.java80
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersSabatons.java73
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/light/TinkersBoots.java126
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/renderers/ArmorRenderer.java70
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDArmor.java131
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDBipedArmor.java68
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStraps.java167
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStrapsInv.java63
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsContainer.java95
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsGui.java54
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/bases/ArmorBase.java516
-rw-r--r--src/main/java/lance5057/tDefense/core/tools/bases/ArmorCore.java132
-rw-r--r--src/main/java/lance5057/tDefense/proxy/ClientProxy.java91
-rw-r--r--src/main/java/lance5057/tDefense/proxy/CommonProxy.java15
-rw-r--r--src/main/java/lance5057/tDefense/util/ArmorBuildGuiInfo.java48
-rw-r--r--src/main/java/lance5057/tDefense/util/ArmorBuilder.java596
-rw-r--r--src/main/java/lance5057/tDefense/util/ArmorEvent.java65
-rw-r--r--src/main/java/lance5057/tDefense/util/TDClientRegistry.java48
-rw-r--r--src/main/java/lance5057/tDefense/util/TDModelLoader.java204
-rw-r--r--src/main/java/lance5057/tDefense/util/TDModelRegistar.java62
-rw-r--r--src/main/java/lance5057/tDefense/util/TDRegistry.java58
-rw-r--r--src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_chain.pngbin279 -> 291 bytes
-rw-r--r--src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_top.pngbin537 -> 555 bytes
-rw-r--r--src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_visor.pngbin607 -> 625 bytes
-rw-r--r--src/main/resources/assets/tinkersdefense/textures/armor/helm/_helm_plate.pngbin1087 -> 1120 bytes
38 files changed, 2617 insertions, 992 deletions
diff --git a/src/main/java/lance5057/tDefense/Reference.java b/src/main/java/lance5057/tDefense/Reference.java
index 8f94aed..2908cf5 100644
--- a/src/main/java/lance5057/tDefense/Reference.java
+++ b/src/main/java/lance5057/tDefense/Reference.java
@@ -3,8 +3,8 @@ package lance5057.tDefense;
public class Reference
{
- public static final String MOD_ID = "tinkersdefense";
+ public static final String MOD_ID = "tinkerscompendium";
public static final String VERSION = "1.4.2.8a";
- public static final String MOD_NAME = "Tinkers' Defense";
+ public static final String MOD_NAME = "Tinkers' Compendium";
}
diff --git a/src/main/java/lance5057/tDefense/core/blocks/TDMetalBlock.java b/src/main/java/lance5057/tDefense/core/blocks/TDMetalBlock.java
index 89856c3..0f267ad 100644
--- a/src/main/java/lance5057/tDefense/core/blocks/TDMetalBlock.java
+++ b/src/main/java/lance5057/tDefense/core/blocks/TDMetalBlock.java
@@ -5,6 +5,7 @@ import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.block.properties.IProperty;
import net.minecraft.block.properties.PropertyEnum;
+import net.minecraft.block.properties.PropertyInteger;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
@@ -13,14 +14,17 @@ import net.minecraft.util.IStringSerializable;
import net.minecraft.util.NonNullList;
public class TDMetalBlock extends Block {
- public static final PropertyEnum METAL = PropertyEnum.create("metal", TDMetalBlock.EnumMetal.class);
+ public static PropertyInteger METAL;
+ public int maxmeta;
- public TDMetalBlock() {
+ public TDMetalBlock(int max) {
super(Material.IRON);
+ maxmeta = max;
this.setCreativeTab(TinkersDefense.tab);
this.setHardness(5);
this.setResistance(30);
- this.setDefaultState(this.blockState.getBaseState().withProperty(METAL, EnumMetal.AEONSTEEL));
+ METAL = PropertyInteger.create("metal", 0, max);
+ this.setDefaultState(this.blockState.getBaseState().withProperty(METAL, 0));
}
@Override
@@ -30,14 +34,13 @@ public class TDMetalBlock extends Block {
@Override
public IBlockState getStateFromMeta(int meta) {
- EnumMetal colour = EnumMetal.byMetadata(meta);
- return this.getDefaultState().withProperty(METAL, colour);
+ return this.getDefaultState().withProperty(METAL, meta);
}
@Override
public int getMetaFromState(IBlockState state) {
- EnumMetal type = (EnumMetal) state.getValue(METAL);
- return type.getID();
+ int type = state.getValue(METAL);
+ return type;
}
@Override
@@ -47,64 +50,9 @@ public class TDMetalBlock extends Block {
@Override
public void getSubBlocks(CreativeTabs itemIn, NonNullList<ItemStack> tab) {
- EnumMetal[] all = EnumMetal.values();
- for (EnumMetal block : all) {
- tab.add(new ItemStack(this, 1, block.getID()));
+ for (int i = 0; i < maxmeta; i++) {
+ tab.add(new ItemStack(this, 1, i));
}
}
- public enum EnumMetal implements IStringSerializable {
- AEONSTEEL(0, "aeonsteel"),
- QUEENSGOLD(1, "queensgold"),
- DOGBEARIUM(2, "dogbearium"),
- REDCANDY(3, "redcandy"),
- GREENCANDY(4, "greencandy"),
- SINISTERIUM(5, "sinisterium"),
- NIHILITE(6, "nihilite"),
- ORICHALCUM(7, "orichalcum"),
- PANDORIUM(8, "pandorium"),
- ROSEGOLD(9, "rosegold"),
- PLATINUM(10, "platinum"),
- BRASS(11, "brass"),
- SILVER(12, "silver"),
- CHEESE(13, "cheese");
-
- private int ID;
- private String name;
-
- private EnumMetal(int ID, String name) {
- this.ID = ID;
- this.name = name;
- }
-
- @Override
- public String getName() {
- return name;
- }
-
- public int getID() {
- return ID;
- }
-
- @Override
- public String toString() {
- return getName();
- }
-
- public static EnumMetal byMetadata(int meta) {
- if (meta < 0 || meta >= META_LOOKUP.length) {
- meta = 0;
- }
-
- return META_LOOKUP[meta];
- }
-
- private static final EnumMetal[] META_LOOKUP = new EnumMetal[values().length];
-
- static {
- for (EnumMetal colour : values()) {
- META_LOOKUP[colour.getID()] = colour;
- }
- }
- }
}
diff --git a/src/main/java/lance5057/tDefense/core/blocks/TDMetalItemBlock.java b/src/main/java/lance5057/tDefense/core/blocks/TDMetalItemBlock.java
index 3ed79b8..d752553 100644
--- a/src/main/java/lance5057/tDefense/core/blocks/TDMetalItemBlock.java
+++ b/src/main/java/lance5057/tDefense/core/blocks/TDMetalItemBlock.java
@@ -22,7 +22,6 @@ public class TDMetalItemBlock extends ItemBlock {
@Override
public String getUnlocalizedName(ItemStack stack)
{
- TDMetalBlock.EnumMetal metal = TDMetalBlock.EnumMetal.byMetadata(stack.getMetadata());
- return super.getUnlocalizedName() + "." + metal.toString();
+ return super.getUnlocalizedName() + "." + stack.getMetadata();
}
}
diff --git a/src/main/java/lance5057/tDefense/core/events/ArmorRenderEvent.java b/src/main/java/lance5057/tDefense/core/events/ArmorRenderEvent.java
index f746a82..fdcb564 100644
--- a/src/main/java/lance5057/tDefense/core/events/ArmorRenderEvent.java
+++ b/src/main/java/lance5057/tDefense/core/events/ArmorRenderEvent.java
@@ -1,100 +1,137 @@
-package lance5057.tDefense.core.events;
-
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.model.ModelBiped;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.item.EnumAction;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagList;
-import net.minecraft.util.EnumHand;
-import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.client.event.RenderPlayerEvent;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
-import slimeknights.tconstruct.library.utils.TagUtil;
-
-public class ArmorRenderEvent {
-
- @SideOnly(Side.CLIENT)
- @SubscribeEvent
- public static void renderArmorEvent(RenderPlayerEvent.Post event) {
- Iterable<ItemStack> armor = event.getEntityPlayer().getArmorInventoryList();
- for (ItemStack i : armor)
- renderArmor(i);
- }
-
- private static void renderArmor(ItemStack stack) {
- NBTTagList list = TagUtil.getBaseMaterialsTagList(stack);
- Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation(""));
- }
-
- private void TrimArmor(ModelBiped armorModel, RenderPlayerEvent.Post event) {
- if (armorModel != null) {
- armorModel.isSneak = event.getEntityPlayer().isSneaking();
- armorModel.isRiding = event.getEntityPlayer().isRiding();
- armorModel.isChild = event.getEntityPlayer().isChild();
-
- armorModel.swingProgress = event.getEntityPlayer().getSwingProgress(event.getPartialRenderTick());
-
- if (event.getEntityPlayer() instanceof EntityPlayer) {
- final ItemStack itemstack = event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND);
- final ItemStack itemstackoff = event.getEntityPlayer().getHeldItem(EnumHand.OFF_HAND);
- // armorModel.heldItemRight = 0;
- // armorModel.aimedBow = false;
- if (itemstack != null) // main hand
- {
- if (event.getEntityPlayer().getItemInUseCount() > 0) {
- final EnumAction enumaction = itemstack.getItemUseAction();
-
- if (enumaction == EnumAction.BLOCK) {
- armorModel.rightArmPose = ModelBiped.ArmPose.BLOCK;
- } else if (enumaction == EnumAction.BOW) {
-
- armorModel.rightArmPose = ModelBiped.ArmPose.BOW_AND_ARROW;
- }
- } else {
- armorModel.rightArmPose = event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND) != null
- ? ModelBiped.ArmPose.ITEM
- : ModelBiped.ArmPose.EMPTY;
- }
- }
-
- if (itemstack != null) // off hand
- {
- if (event.getEntityPlayer().getItemInUseCount() > 0) {
- final EnumAction enumaction = itemstack.getItemUseAction();
-
- if (enumaction == EnumAction.BLOCK) {
- armorModel.leftArmPose = ModelBiped.ArmPose.BLOCK;
- } else if (enumaction == EnumAction.BOW) {
-
- armorModel.leftArmPose = ModelBiped.ArmPose.BOW_AND_ARROW;
- }
- } else {
- armorModel.leftArmPose = event.getEntityPlayer().getHeldItem(EnumHand.OFF_HAND) != null
- ? ModelBiped.ArmPose.ITEM
- : ModelBiped.ArmPose.EMPTY;
- }
- }
- }
-
- final float yaw = event.getEntityPlayer().prevRotationYawHead
- + (event.getEntityPlayer().rotationYawHead - event.getEntityPlayer().prevRotationYawHead)
- * event.getPartialRenderTick();
- final float yawOffset = event.getEntityPlayer().prevRenderYawOffset
- + (event.getEntityPlayer().renderYawOffset - event.getEntityPlayer().prevRenderYawOffset)
- * event.getPartialRenderTick();
- final float limbs = event.getEntityPlayer().prevLimbSwingAmount
- + (event.getEntityPlayer().limbSwingAmount - event.getEntityPlayer().prevLimbSwingAmount)
- * event.getPartialRenderTick();
- final float limbSwing = event.getEntityPlayer().limbSwing
- - event.getEntityPlayer().limbSwingAmount * (1.0F - event.getPartialRenderTick());
-
- armorModel.setRotationAngles(limbSwing, limbs, event.getEntityPlayer().ticksExisted, yaw - yawOffset,
- event.getEntityPlayer().rotationPitch, 0.1f, event.getEntityPlayer());
- armorModel.render(event.getEntityPlayer(), limbSwing, limbs, event.getEntityPlayer().ticksExisted,
- yaw - yawOffset, event.getEntityPlayer().rotationPitch, 0.1f);
- }
- }
-}
+//package lance5057.tDefense.core.events;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+//import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
+//import lance5057.tDefense.core.tools.bases.ArmorCore;
+//import net.minecraft.client.Minecraft;
+//import net.minecraft.client.model.ModelBase;
+//import net.minecraft.client.model.ModelBiped;
+//import net.minecraft.item.ItemStack;
+//import net.minecraft.nbt.NBTTagList;
+//import net.minecraft.util.ResourceLocation;
+//import net.minecraftforge.client.event.RenderPlayerEvent;
+//import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+//import net.minecraftforge.fml.relauncher.Side;
+//import net.minecraftforge.fml.relauncher.SideOnly;
+//import slimeknights.tconstruct.library.utils.TagUtil;
+//
+//public class ArmorRenderEvent {
+//
+// @SideOnly(Side.CLIENT)
+// @SubscribeEvent
+// public static void renderArmorEvent(RenderPlayerEvent.Post event) {
+// Iterable<ItemStack> armor = event.getEntityPlayer().getArmorInventoryList();
+// for (ItemStack i : armor)
+// renderArmor(event, i);
+// }
+//
+// private static void renderArmor(RenderPlayerEvent.Post event, ItemStack stack) {
+// if (stack.getItem() instanceof ArmorCore) {
+// ArmorCore ac = (ArmorCore) stack.getItem();
+//
+// NBTTagList list = TagUtil.getBaseMaterialsTagList(stack);
+// ArmorRenderer mb = ac.getArmorModel(event.getEntityLiving(), stack);
+// List<String> textures = ac.getArmorTexture(stack);
+// List<String> textures2 = new ArrayList();
+// for (int i = 0; i < textures.size(); i++) {
+// textures2.add(textures.get(i) + "_" + list.getStringTagAt(i) + ".png");
+// }
+//
+// TrimArmor(mb, textures2, event);
+// }
+// }
+//
+// private static void TrimArmor(ModelBiped armorModel, List<String> textures, RenderPlayerEvent.Post event) {
+// if (armorModel != null) {
+// ModelBase.copyModelAngles(event.getRenderer().getMainModel().bipedBody, armorModel.bipedBody);
+// ModelBase.copyModelAngles(event.getRenderer().getMainModel().bipedHead, armorModel.bipedHead);
+// ModelBase.copyModelAngles(event.getRenderer().getMainModel().bipedLeftArm, armorModel.bipedLeftArm);
+// ModelBase.copyModelAngles(event.getRenderer().getMainModel().bipedLeftLeg, armorModel.bipedLeftLeg);
+// ModelBase.copyModelAngles(event.getRenderer().getMainModel().bipedRightArm, armorModel.bipedRightArm);
+// ModelBase.copyModelAngles(event.getRenderer().getMainModel().bipedRightLeg, armorModel.bipedRightLeg);
+//
+// // armorModel.isSneak = event.getEntityPlayer().isSneaking();
+// // armorModel.isRiding = event.getEntityPlayer().isRiding();
+// // armorModel.isChild = event.getEntityPlayer().isChild();
+// //
+// // armorModel.swingProgress =
+// // event.getEntityPlayer().getSwingProgress(event.getPartialRenderTick());
+// //
+// // if (event.getEntityPlayer() instanceof EntityPlayer) {
+// // final ItemStack itemstack =
+// // event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND);
+// // final ItemStack itemstackoff =
+// // event.getEntityPlayer().getHeldItem(EnumHand.OFF_HAND);
+// // // armorModel.heldItemRight = 0;
+// // // armorModel.aimedBow = false;
+// // if (itemstack != null) // main hand
+// // {
+// // if (event.getEntityPlayer().getItemInUseCount() > 0) {
+// // final EnumAction enumaction = itemstack.getItemUseAction();
+// //
+// // if (enumaction == EnumAction.BLOCK) {
+// // armorModel.rightArmPose = ModelBiped.ArmPose.BLOCK;
+// // } else if (enumaction == EnumAction.BOW) {
+// //
+// // armorModel.rightArmPose = ModelBiped.ArmPose.BOW_AND_ARROW;
+// // }
+// // } else {
+// // armorModel.rightArmPose =
+// // event.getEntityPlayer().getHeldItem(EnumHand.MAIN_HAND) != null
+// // ? ModelBiped.ArmPose.ITEM
+// // : ModelBiped.ArmPose.EMPTY;
+// // }
+// // }
+// //
+// // if (itemstack != null) // off hand
+// // {
+// // if (event.getEntityPlayer().getItemInUseCount() > 0) {
+// // final EnumAction enumaction = itemstack.getItemUseAction();
+// //
+// // if (enumaction == EnumAction.BLOCK) {
+// // armorModel.leftArmPose = ModelBiped.ArmPose.BLOCK;
+// // } else if (enumaction == EnumAction.BOW) {
+// //
+// // armorModel.leftArmPose = ModelBiped.ArmPose.BOW_AND_ARROW;
+// // }
+// // } else {
+// // armorModel.leftArmPose =
+// // event.getEntityPlayer().getHeldItem(EnumHand.OFF_HAND) != null
+// // ? ModelBiped.ArmPose.ITEM
+// // : ModelBiped.ArmPose.EMPTY;
+// // }
+// // }
+// // }
+//
+// // final float yaw = event.getEntityPlayer().prevRotationYawHead
+// // + (event.getEntityPlayer().rotationYawHead -
+// // event.getEntityPlayer().prevRotationYawHead)
+// // * event.getPartialRenderTick();
+// // final float yawOffset = event.getEntityPlayer().prevRenderYawOffset
+// // + (event.getEntityPlayer().renderYawOffset -
+// // event.getEntityPlayer().prevRenderYawOffset)
+// // * event.getPartialRenderTick();
+// // final float limbs = event.getEntityPlayer().prevLimbSwingAmount
+// // + (event.getEntityPlayer().limbSwingAmount -
+// // event.getEntityPlayer().prevLimbSwingAmount)
+// // * event.getPartialRenderTick();
+// // final float limbSwing = event.getEntityPlayer().limbSwing
+// // - event.getEntityPlayer().limbSwingAmount * (1.0F -
+// // event.getPartialRenderTick());
+// //
+//
+// // armorModel.setRotationAngles(limbSwing, limbs,
+// // event.getEntityPlayer().ticksExisted, yaw - yawOffset,
+// // event.getEntityPlayer().rotationPitch, 0.1f, event.getEntityPlayer());
+//
+// // GL11.glRotatef(180, 1.0f, 0, 0);
+//
+// for (String t : textures) {
+// Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation(t));
+// armorModel.render(event.getEntityPlayer(), 0, 0, 0, 0, 0, 0.15f);
+// }
+// }
+// }
+//}
diff --git a/src/main/java/lance5057/tDefense/core/events/TDEvents.java b/src/main/java/lance5057/tDefense/core/events/TDEvents.java
index e12e1e6..a574831 100644
--- a/src/main/java/lance5057/tDefense/core/events/TDEvents.java
+++ b/src/main/java/lance5057/tDefense/core/events/TDEvents.java
@@ -4,7 +4,7 @@ import net.minecraftforge.common.MinecraftForge;
public class TDEvents {
public void preInit() {
- MinecraftForge.EVENT_BUS.register(ArmorRenderEvent.class);
+ //MinecraftForge.EVENT_BUS.register(ArmorRenderEvent.class);
}
public void init() {
diff --git a/src/main/java/lance5057/tDefense/core/materials/TDMaterials.java b/src/main/java/lance5057/tDefense/core/materials/TDMaterials.java
index 9652aa8..47afb76 100644
--- a/src/main/java/lance5057/tDefense/core/materials/TDMaterials.java
+++ b/src/main/java/lance5057/tDefense/core/materials/TDMaterials.java
@@ -358,14 +358,14 @@ public class TDMaterials {
if (TinkersDefense.config.materials.enableBaseMaterials)
this.materials_master.addAll(materials_base);
- if (TinkersDefense.config.materials.enableJokeMaterials)
- this.materials_master.addAll(this.materials_joke);
- if (TinkersDefense.config.materials.enableHolidayMaterials)
- this.materials_master.addAll(materials_xmas);
- if (TinkersDefense.config.materials.enableGemMaterials)
- this.materials_master.addAll(materials_gems);
- if (TinkersDefense.config.materials.enableCornucopiaMaterials)
- this.materials_master.addAll(materials_cornucopia);
+// if (TinkersDefense.config.materials.enableJokeMaterials)
+// this.materials_master.addAll(this.materials_joke);
+// if (TinkersDefense.config.materials.enableHolidayMaterials)
+// this.materials_master.addAll(materials_xmas);
+// if (TinkersDefense.config.materials.enableGemMaterials)
+// this.materials_master.addAll(materials_gems);
+// if (TinkersDefense.config.materials.enableCornucopiaMaterials)
+// this.materials_master.addAll(materials_cornucopia);
// if (TinkersDefense.config.materials.enableTwilightForestMaterials)
// this.materials_master.addAll(materials_tf);
// if (TinkersDefense.config.materials.enableBloodMagicMaterials)
diff --git a/src/main/java/lance5057/tDefense/core/tools/TDTools.java b/src/main/java/lance5057/tDefense/core/tools/TDTools.java
index bfb9091..bfa650c 100644
--- a/src/main/java/lance5057/tDefense/core/tools/TDTools.java
+++ b/src/main/java/lance5057/tDefense/core/tools/TDTools.java
@@ -14,8 +14,7 @@ import lance5057.tDefense.core.tools.armor.heavy.TinkersBreastplate;
import lance5057.tDefense.core.tools.armor.heavy.TinkersGrieves;
import lance5057.tDefense.core.tools.armor.heavy.TinkersHelm;
import lance5057.tDefense.core.tools.armor.heavy.TinkersSabatons;
-import lance5057.tDefense.core.tools.armor.light.TinkersBoots;
-import lance5057.tDefense.core.tools.armor.straps.ItemStraps;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.core.tools.basic.FishingRod;
import lance5057.tDefense.core.tools.basic.HeaterShield;
import lance5057.tDefense.core.tools.basic.RoundShield;
@@ -25,7 +24,7 @@ import lance5057.tDefense.core.tools.basic.Zweihander;
import lance5057.tDefense.core.tools.baubles.Amulet;
import lance5057.tDefense.core.tools.baubles.Ring;
import lance5057.tDefense.core.tools.baubles.Sheathe;
-import net.minecraft.inventory.EntityEquipmentSlot;
+import lance5057.tDefense.util.TDRegistry;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.MinecraftForge;
@@ -53,20 +52,20 @@ public class TDTools {
public static ToolCore shears;
public static ToolCore fishingRod;
- public static ToolCore hood;
- public static ToolCore shawl;
- public static ToolCore robe;
- public static ToolCore shoes;
-
- public static ToolCore coif;
- public static ToolCore hauberk;
- public static ToolCore chausses;
- public static ToolCore boots;
-
- public static ToolCore helm;
- public static ToolCore breastplate;
- public static ToolCore grieves;
- public static ToolCore sabatons;
+ public static ArmorCore hood;
+ public static ArmorCore shawl;
+ public static ArmorCore robe;
+ public static ArmorCore shoes;
+
+ public static ArmorCore coif;
+ public static ArmorCore hauberk;
+ public static ArmorCore chausses;
+ //public static ToolCore boots;
+
+ public static ArmorCore helm;
+ public static ArmorCore breastplate;
+ public static ArmorCore grieves;
+ public static ArmorCore sabatons;
//baubles
public static ToolCore sheathe;
@@ -114,7 +113,7 @@ public class TDTools {
// coif = new TinkersCoif();
// hauberk = new TinkersHauberk();
// chausses = new TinkersChausses();
- boots = new TinkersBoots();
+ //boots = new TinkersBoots();
helm = new TinkersHelm();
breastplate = new TinkersBreastplate();
@@ -132,23 +131,25 @@ public class TDTools {
regTool(shears, "shears", event);
regTool(fishingRod, "fishingRod", event);
- regTool(hood, "hood", event);
- regTool(shawl, "shawl", event);
- regTool(robe, "robe", event);
- regTool(shoes, "shoes", event);
+ regArmor(hood, "hood", event);
+ regArmor(shawl, "shawl", event);
+ regArmor(robe, "robe", event);
+ regArmor(shoes, "shoes", event);
- regTool(boots, "boots", event);
-
- regTool(helm, "helm", event);
- regTool(breastplate, "breastplate", event);
- regTool(grieves, "grieves", event);
- regTool(sabatons, "sabatons", event);
+ //regTool(boots, "boots", event);
+ regArmor(helm, "helm", event);
+ regArmor(breastplate, "breastplate", event);
+ regArmor(grieves, "grieves", event);
+ regArmor(sabatons, "sabatons", event);
+
+// CustomTextureCreator.registerTexture(new ResourceLocation("tinkersdefense", "items/battleaxe/_halbard_accessory"));
+
CustomTextureCreator.registerTexture(new ResourceLocation("tinkersdefense", "armor/helm/_helm_chain"));
CustomTextureCreator.registerTexture(new ResourceLocation("tinkersdefense", "armor/helm/_helm_plate"));
CustomTextureCreator.registerTexture(new ResourceLocation("tinkersdefense", "armor/helm/_helm_top"));
CustomTextureCreator.registerTexture(new ResourceLocation("tinkersdefense", "armor/helm/_helm_visor"));
-
+//
regTool(sheathe, "sheathe", event);
regTool(ring, "ring", event);
regTool(amulet, "amulet", event);
@@ -167,6 +168,14 @@ public class TDTools {
//itemList.add(tool);
}
+ private static void regArmor(ArmorCore armor, String name, RegistryEvent.Register<Item> event) {
+ armor.setRegistryName(new ResourceLocation("tinkersdefense:" + name));
+ event.getRegistry().register(armor);
+ TDRegistry.registerTool(armor);
+ TinkersDefense.proxy.registerArmorModel(armor);
+ //itemList.add(tool);
+ }
+
private void registerModifiers() {
}
@@ -196,17 +205,17 @@ public class TDTools {
TinkerRegistry.registerToolCrafting(shears);
TinkerRegistry.registerToolCrafting(fishingRod);
- TinkerRegistry.registerToolCrafting(hood);
- TinkerRegistry.registerToolCrafting(shawl);
- TinkerRegistry.registerToolCrafting(robe);
- TinkerRegistry.registerToolCrafting(shoes);
+ TDRegistry.registerArmorCrafting(hood);
+ TDRegistry.registerArmorCrafting(shawl);
+ TDRegistry.registerArmorCrafting(robe);
+ TDRegistry.registerArmorCrafting(shoes);
- TinkerRegistry.registerToolCrafting(boots);
+ //TinkerRegistry.registerToolCrafting(boots);
- TinkerRegistry.registerToolForgeCrafting(helm);
- TinkerRegistry.registerToolForgeCrafting(breastplate);
- TinkerRegistry.registerToolForgeCrafting(grieves);
- TinkerRegistry.registerToolForgeCrafting(sabatons);
+ TDRegistry.registerArmorForgeCrafting(helm);
+ TDRegistry.registerArmorForgeCrafting(breastplate);
+ TDRegistry.registerArmorForgeCrafting(grieves);
+ TDRegistry.registerArmorForgeCrafting(sabatons);
TinkerRegistry.registerToolCrafting(sheathe);
TinkerRegistry.registerToolCrafting(ring);
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersHood.java b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersHood.java
index f891770..482055b 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersHood.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersHood.java
@@ -1,19 +1,22 @@
package lance5057.tDefense.core.tools.armor.cloth;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
import lance5057.tDefense.core.materials.ArmorMaterialStats.HelmMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.cloth.ModelTinkersHood;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
-import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -24,7 +27,7 @@ public class TinkersHood extends ArmorCore {
int induceDamage = 0;
public TinkersHood() {
- super(new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
+ super(EntityEquipmentSlot.HEAD, new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE), PartMaterialType.extra(TDParts.rivets));
setUnlocalizedName("tinkerhood");
}
@@ -35,40 +38,20 @@ public class TinkersHood extends ArmorCore {
}
- @Override
- public float damagePotential() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public double attackSpeed() {
- // TODO Auto-generated method stub
- return 0;
- }
-
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer) {
- String s = "";
- switch (layer) {
- case 0:
- s = "textures/armor/hood/_hood_cloth.png";
- break;
- case 1:
- s = "textures/armor/hood/_hood_trim.png";
- break;
- case 2:
- s = "textures/armor/hood/_hood_metal.png";
- break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/hood/_hood_cloth.png");
+ textures.add("textures/armor/hood/_hood_trim.png");
+ textures.add("textures/armor/hood/_hood_metal.png");
+
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default) {
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack) {
return new ModelTinkersHood(itemStack);
}
@@ -82,4 +65,35 @@ public class TinkersHood extends ArmorCore {
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.HEAD;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersRobe.java b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersRobe.java
index ec85a86..6703fd6 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersRobe.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersRobe.java
@@ -1,19 +1,22 @@
package lance5057.tDefense.core.tools.armor.cloth;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
import lance5057.tDefense.core.materials.ArmorMaterialStats.LegsMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.cloth.ModelTinkersRobe;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
-import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -27,7 +30,7 @@ public class TinkersRobe extends ArmorCore
public TinkersRobe()
{
- super(new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
+ super(EntityEquipmentSlot.CHEST,new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
PartMaterialType.extra(TDParts.clasp));
setUnlocalizedName("tinkerrobe");
@@ -40,36 +43,20 @@ public class TinkersRobe extends ArmorCore
}
- @Override
- public float damagePotential() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public double attackSpeed() {
- // TODO Auto-generated method stub
- return 0;
- }
-
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/robe/_robe_cloth.png"; break;
- case 1: s = "textures/armor/robe/_robe_trim.png"; break;
- case 2: s = "textures/armor/robe/_robe_metal.png"; break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/robe/_robe_cloth.png");
+ textures.add("textures/armor/robe/_robe_trim.png");
+ textures.add("textures/armor/robe/_robe_metal.png");
+
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack)
{
return new ModelTinkersRobe(itemStack);
}
@@ -84,4 +71,35 @@ public class TinkersRobe extends ArmorCore
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.LEGS;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShawl.java b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShawl.java
index 2156515..825d5e4 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShawl.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShawl.java
@@ -1,19 +1,23 @@
package lance5057.tDefense.core.tools.armor.cloth;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ChestMaterialStats;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.cloth.ModelTinkersShawl;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -26,7 +30,7 @@ public class TinkersShawl extends ArmorCore
public TinkersShawl()
{
- super(new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE), new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE), PartMaterialType.extra(TDParts.armorPlate));
+ super(EntityEquipmentSlot.LEGS,new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE), new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE), PartMaterialType.extra(TDParts.armorPlate));
setUnlocalizedName("tinkershawl");
}
@@ -37,44 +41,20 @@ public class TinkersShawl extends ArmorCore
}
- @Override
- public float damagePotential()
- {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public double attackSpeed()
- {
- // TODO Auto-generated method stub
- return 0;
- }
-
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch (layer)
- {
- case 0:
- s = "textures/armor/shawl/_shawl_cloth.png";
- break;
- case 1:
- s = "textures/armor/shawl/_shawl_trim.png";
- break;
- case 2:
- s = "textures/armor/shawl/_shawl_metal.png";
- break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/shawl/_shawl_cloth.png");
+ textures.add("textures/armor/shawl/_shawl_trim.png");
+ textures.add("textures/armor/shawl/_shawl_metal.png");
+
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack)
{
return new ModelTinkersShawl(itemStack);
}
@@ -89,4 +69,35 @@ public class TinkersShawl extends ArmorCore
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.CHEST;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShoes.java b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShoes.java
index 9af6934..c7c8606 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShoes.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/cloth/TinkersShoes.java
@@ -1,19 +1,23 @@
package lance5057.tDefense.core.tools.armor.cloth;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
import lance5057.tDefense.core.materials.ArmorMaterialStats.FeetMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.cloth.ModelTinkersShoes;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@@ -28,7 +32,7 @@ public class TinkersShoes extends ArmorCore
public TinkersShoes()
{
- super(new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
+ super(EntityEquipmentSlot.FEET,new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
PartMaterialType.extra(TDParts.rivets),
new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
PartMaterialType.bowstring(TinkerTools.bowString));
@@ -42,37 +46,20 @@ public class TinkersShoes extends ArmorCore
}
- @Override
- public float damagePotential() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- @Override
- public double attackSpeed() {
- // TODO Auto-generated method stub
- return 0;
- }
-
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/shoes/_shoes_cloth.png"; break;
- case 2: s = "textures/armor/shoes/_shoes_trim.png"; break;
- case 1: s = "textures/armor/shoes/_shoes_metal.png"; break;
- case 3: s = "textures/armor/shoes/_shoes_string.png"; break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/shoes/_shoes_cloth.png");
+ textures.add("textures/armor/shoes/_shoes_trim.png");
+ textures.add("textures/armor/shoes/_shoes_metal.png");
+
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack)
{
return new ModelTinkersShoes(itemStack);
}
@@ -87,4 +74,35 @@ public class TinkersShoes extends ArmorCore
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.FEET;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersBreastplate.java b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersBreastplate.java
index 5ee2393..a7df0f0 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersBreastplate.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersBreastplate.java
@@ -1,65 +1,91 @@
package lance5057.tDefense.core.tools.armor.heavy;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ChestMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.heavy.ModelTinkersBreastplate;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.tconstruct.library.materials.Material;
import slimeknights.tconstruct.library.tinkering.PartMaterialType;
import slimeknights.tconstruct.tools.TinkerTools;
-public class TinkersBreastplate extends ArmorCore
-{
- public TinkersBreastplate()
- {
- super(new PartMaterialType(TinkerTools.largePlate, ChestMaterialStats.TYPE),
- new PartMaterialType(TDParts.armorPlate, ChestMaterialStats.TYPE),
- PartMaterialType.handle(TDParts.filigree),
- PartMaterialType.extra(TDParts.chainmail));
+public class TinkersBreastplate extends ArmorCore {
+ public TinkersBreastplate() {
+ super(EntityEquipmentSlot.CHEST, new PartMaterialType(TinkerTools.largePlate, ChestMaterialStats.TYPE),
+ new PartMaterialType(TDParts.armorPlate, ChestMaterialStats.TYPE),
+ PartMaterialType.handle(TDParts.filigree), PartMaterialType.extra(TDParts.chainmail));
setUnlocalizedName("tinkersbreastplate");
}
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/breastplate/_breastplate_plate.png"; break;
- case 1: s = "textures/armor/breastplate/_breastplate_smallplate.png"; break;
- case 2: s = "textures/armor/breastplate/_breastplate_trim.png"; break;
- case 3: s = "textures/armor/breastplate/_breastplate_chain.png"; break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/breastplate/_breastplate_plate.png");
+ textures.add("textures/armor/breastplate/_breastplate_smallplate.png");
+ textures.add("textures/armor/breastplate/_breastplate_trim.png");
+ textures.add("textures/armor/breastplate/_breastplate_chain.png");
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
- {
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack) {
return new ModelTinkersBreastplate(itemStack);
}
-
+
@Override
public NBTTagCompound buildTag(List<Material> materials) {
ArmorNBT data = buildDefaultArmorTag(materials, ChestMaterialStats.TYPE);
- return data.get();
+ return data.get();
}
-
+
@Override
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.CHEST;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersGrieves.java b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersGrieves.java
index 3d264f1..ccefbf7 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersGrieves.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersGrieves.java
@@ -1,18 +1,22 @@
package lance5057.tDefense.core.tools.armor.heavy;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
import lance5057.tDefense.core.materials.ArmorMaterialStats.LegsMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.heavy.ModelTinkersGrieves;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.tconstruct.library.materials.Material;
@@ -22,7 +26,7 @@ public class TinkersGrieves extends ArmorCore
{
public TinkersGrieves()
{
- super(new PartMaterialType(TDParts.armorPlate, LegsMaterialStats.TYPE),
+ super(EntityEquipmentSlot.LEGS,new PartMaterialType(TDParts.armorPlate, LegsMaterialStats.TYPE),
new PartMaterialType(TDParts.chainmail, LegsMaterialStats.TYPE),
PartMaterialType.handle(TDParts.filigree),
new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE));
@@ -31,23 +35,19 @@ public class TinkersGrieves extends ArmorCore
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
+ public List<String> getArmorTexture(ItemStack stack)
{
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/grieves/_grieves_plate.png"; break;
- case 1: s = "textures/armor/grieves/_grieves_chain.png"; break;
- case 2: s = "textures/armor/grieves/_grieves_trim.png"; break;
- case 3: s = "textures/armor/grieves/_grieves_cloth.png"; break;
- }
- return s;
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/grieves/_grieves_plate.png");
+ textures.add("textures/armor/grieves/_grieves_chain.png");
+ textures.add("textures/armor/grieves/_grieves_trim.png");
+ textures.add("textures/armor/grieves/_grieves_cloth.png");
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack)
{
return new ModelTinkersGrieves(itemStack);
}
@@ -62,4 +62,35 @@ public class TinkersGrieves extends ArmorCore
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.LEGS;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersHelm.java b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersHelm.java
index 0dadb93..3b1973d 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersHelm.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersHelm.java
@@ -1,65 +1,93 @@
package lance5057.tDefense.core.tools.armor.heavy;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.HelmMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.heavy.ModelTinkersHelm;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
-import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.DamageSource;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.tconstruct.library.materials.Material;
import slimeknights.tconstruct.library.tinkering.PartMaterialType;
+import slimeknights.tconstruct.library.utils.TagUtil;
import slimeknights.tconstruct.tools.TinkerTools;
-public class TinkersHelm extends ArmorCore
-{
- public TinkersHelm()
- {
- super(new PartMaterialType(TinkerTools.panHead, HelmMaterialStats.TYPE),
- new PartMaterialType(TDParts.armorPlate, HelmMaterialStats.TYPE),
- PartMaterialType.handle(TDParts.filigree),
- PartMaterialType.extra(TDParts.chainmail));
+public class TinkersHelm extends ArmorCore {
+ public TinkersHelm() {
+ super(EntityEquipmentSlot.HEAD,new PartMaterialType(TinkerTools.panHead, HelmMaterialStats.TYPE),
+ new PartMaterialType(TDParts.armorPlate, HelmMaterialStats.TYPE),
+ PartMaterialType.handle(TDParts.filigree), PartMaterialType.extra(TDParts.chainmail));
setUnlocalizedName("tinkershelm");
}
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/helm/_helm_top.png"; break;
- case 1: s = "textures/armor/helm/_helm_plate.png"; break;
- case 2: s = "textures/armor/helm/_helm_visor.png"; break;
- case 3: s = "textures/armor/helm/_helm_chain.png"; break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ NBTTagList t = TagUtil.getBaseMaterialsTagList(stack);
+ textures.add("textures/armor/helm/_helm_top_" + t.getStringTagAt(0));
+ textures.add("textures/armor/helm/_helm_plate_" + t.getStringTagAt(1));
+ textures.add("textures/armor/helm/_helm_visor_" + t.getStringTagAt(2));
+ textures.add("textures/armor/helm/_helm_chain_" + t.getStringTagAt(3));
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
- {
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack) {
return new ModelTinkersHelm(itemStack);
}
-
+
@Override
public NBTTagCompound buildTag(List<Material> materials) {
ArmorNBT data = buildDefaultArmorTag(materials, HelmMaterialStats.TYPE);
- return data.get();
+ return data.get();
}
-
+
@Override
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.HEAD;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersSabatons.java b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersSabatons.java
index 4f8adef..7172492 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersSabatons.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/heavy/TinkersSabatons.java
@@ -1,29 +1,31 @@
package lance5057.tDefense.core.tools.armor.heavy;
+import java.util.ArrayList;
import java.util.List;
import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
import lance5057.tDefense.core.materials.ArmorMaterialStats.FeetMaterialStats;
import lance5057.tDefense.core.parts.TDParts;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.core.tools.armor.renderers.heavy.ModelTinkersSabatons;
import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.util.ArmorNBT;
import net.minecraft.client.model.ModelBiped;
import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.DamageSource;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.tconstruct.library.materials.Material;
import slimeknights.tconstruct.library.tinkering.PartMaterialType;
-public class TinkersSabatons extends ArmorCore
-{
- public TinkersSabatons()
- {
- super(new PartMaterialType(TDParts.armorPlate, FeetMaterialStats.TYPE),
- new PartMaterialType(TDParts.armorPlate, FeetMaterialStats.TYPE),
+public class TinkersSabatons extends ArmorCore {
+ public TinkersSabatons() {
+ super(EntityEquipmentSlot.FEET,new PartMaterialType(TDParts.armorPlate, FeetMaterialStats.TYPE),
+ new PartMaterialType(TDParts.armorPlate, FeetMaterialStats.TYPE),
PartMaterialType.handle(TDParts.filigree),
new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE));
setUnlocalizedName("tinkerssabatons");
@@ -31,35 +33,60 @@ public class TinkersSabatons extends ArmorCore
@SideOnly(Side.CLIENT)
@Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/sabatons/_sabatons_plates.png"; break;
- case 1: s = "textures/armor/sabatons/_sabatons_caps.png"; break;
- case 2: s = "textures/armor/sabatons/_sabatons_trim.png"; break;
- case 3: s = "textures/armor/sabatons/_sabatons_soles.png"; break;
- }
- return s;
+ public List<String> getArmorTexture(ItemStack stack) {
+ List<String> textures = new ArrayList();
+ textures.add("textures/armor/sabatons/_sabatons_plates.png");
+ textures.add("textures/armor/sabatons/_sabatons_caps.png");
+ textures.add("textures/armor/sabatons/_sabatons_trim.png");
+ textures.add("textures/armor/sabatons/_sabatons_soles.png");
+ return textures;
}
@SideOnly(Side.CLIENT)
@Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
- {
+ public ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack) {
return new ModelTinkersSabatons(itemStack);
}
-
+
@Override
public NBTTagCompound buildTag(List<Material> materials) {
ArmorNBT data = buildDefaultArmorTag(materials, FeetMaterialStats.TYPE);
- return data.get();
+ return data.get();
}
-
+
@Override
public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
return EntityEquipmentSlot.FEET;
}
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage,
+ int slot) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot) {
+ // TODO Auto-generated method stub
+
+ }
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/light/TinkersBoots.java b/src/main/java/lance5057/tDefense/core/tools/armor/light/TinkersBoots.java
index a43e6be..308302d 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/light/TinkersBoots.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/light/TinkersBoots.java
@@ -1,63 +1,63 @@
-package lance5057.tDefense.core.tools.armor.light;
-
-import java.util.List;
-
-import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
-import lance5057.tDefense.core.materials.ArmorMaterialStats.FeetMaterialStats;
-import lance5057.tDefense.core.parts.TDParts;
-import lance5057.tDefense.core.tools.armor.renderers.light.ModelTinkersBoots;
-import lance5057.tDefense.core.tools.bases.ArmorCore;
-import lance5057.tDefense.util.ArmorNBT;
-import net.minecraft.client.model.ModelBiped;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.inventory.EntityEquipmentSlot;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
-import slimeknights.tconstruct.library.materials.Material;
-import slimeknights.tconstruct.library.tinkering.PartMaterialType;
-
-public class TinkersBoots extends ArmorCore
-{
- public TinkersBoots()
- {
- super(new PartMaterialType(TDParts.chainmail, FeetMaterialStats.TYPE),
- new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
- PartMaterialType.handle(TDParts.rivets));
- setUnlocalizedName("tinkersboots");
- }
-
- @SideOnly(Side.CLIENT)
- @Override
- public String getArmorTexture(ItemStack stack, int layer)
- {
- String s = "";
- switch(layer)
- {
- case 0: s = "textures/armor/boots/_boots_chain.png"; break;
- case 1: s = "textures/armor/boots/_boots_cloth.png"; break;
- case 2: s = "textures/armor/boots/_boots_rivet.png"; break;
- }
- return s;
- }
-
- @SideOnly(Side.CLIENT)
- @Override
- public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
- EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
- {
- return new ModelTinkersBoots(itemStack);
- }
-
- @Override
- public NBTTagCompound buildTag(List<Material> materials) {
- ArmorNBT data = buildDefaultArmorTag(materials, FeetMaterialStats.TYPE);
- return data.get();
- }
-
- @Override
- public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
- return EntityEquipmentSlot.FEET;
- }
-}
+//package lance5057.tDefense.core.tools.armor.light;
+//
+//import java.util.List;
+//
+//import lance5057.tDefense.core.materials.ArmorMaterialStats.ClothMaterialStats;
+//import lance5057.tDefense.core.materials.ArmorMaterialStats.FeetMaterialStats;
+//import lance5057.tDefense.core.parts.TDParts;
+//import lance5057.tDefense.core.tools.armor.renderers.light.ModelTinkersBoots;
+//import lance5057.tDefense.core.tools.bases.ArmorCore;
+//import lance5057.tDefense.util.ArmorNBT;
+//import net.minecraft.client.model.ModelBiped;
+//import net.minecraft.entity.EntityLivingBase;
+//import net.minecraft.inventory.EntityEquipmentSlot;
+//import net.minecraft.item.ItemStack;
+//import net.minecraft.nbt.NBTTagCompound;
+//import net.minecraftforge.fml.relauncher.Side;
+//import net.minecraftforge.fml.relauncher.SideOnly;
+//import slimeknights.tconstruct.library.materials.Material;
+//import slimeknights.tconstruct.library.tinkering.PartMaterialType;
+//
+//public class TinkersBoots extends ArmorCore
+//{
+// public TinkersBoots()
+// {
+// super(new PartMaterialType(TDParts.chainmail, FeetMaterialStats.TYPE),
+// new PartMaterialType(TDParts.cloth, ClothMaterialStats.TYPE),
+// PartMaterialType.handle(TDParts.rivets));
+// setUnlocalizedName("tinkersboots");
+// }
+//
+// @SideOnly(Side.CLIENT)
+// @Override
+// public String getArmorTexture(ItemStack stack, int layer)
+// {
+// String s = "";
+// switch(layer)
+// {
+// case 0: s = "textures/armor/boots/_boots_chain.png"; break;
+// case 1: s = "textures/armor/boots/_boots_cloth.png"; break;
+// case 2: s = "textures/armor/boots/_boots_rivet.png"; break;
+// }
+// return s;
+// }
+//
+// @SideOnly(Side.CLIENT)
+// @Override
+// public ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack,
+// EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
+// {
+// return new ModelTinkersBoots(itemStack);
+// }
+//
+// @Override
+// public NBTTagCompound buildTag(List<Material> materials) {
+// ArmorNBT data = buildDefaultArmorTag(materials, FeetMaterialStats.TYPE);
+// return data.get();
+// }
+//
+// @Override
+// public EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType) {
+// return EntityEquipmentSlot.FEET;
+// }
+//}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/renderers/ArmorRenderer.java b/src/main/java/lance5057/tDefense/core/tools/armor/renderers/ArmorRenderer.java
index 558cad2..217873f 100644
--- a/src/main/java/lance5057/tDefense/core/tools/armor/renderers/ArmorRenderer.java
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/renderers/ArmorRenderer.java
@@ -1,27 +1,13 @@
package lance5057.tDefense.core.tools.armor.renderers;
-import java.awt.image.BufferedImage;
-import java.util.List;
-
-import org.lwjgl.opengl.GL11;
-
-import lance5057.tDefense.Reference;
-import lance5057.tDefense.core.tools.armor.renderers.shaders.ArmorShader;
-import lance5057.tDefense.core.tools.bases.ArmorCore;
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.model.ModelBiped;
+import net.minecraft.client.model.ModelPlayer;
import net.minecraft.client.renderer.texture.DynamicTexture;
import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityArmorStand;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ResourceLocation;
-import slimeknights.tconstruct.library.materials.Material;
-import slimeknights.tconstruct.library.utils.TagUtil;
-import slimeknights.tconstruct.library.utils.TinkerUtil;
-public class ArmorRenderer extends ModelBiped {
+public class ArmorRenderer extends ModelPlayer {
// public String[] partNames;
public ItemStack stack;
@@ -33,47 +19,17 @@ public class ArmorRenderer extends ModelBiped {
public NBTTagCompound defaultTags = new NBTTagCompound();
public ArmorRenderer(float a, float b, int c, int d, ItemStack stack) {
- super(a, b, c, d);
-
- this.stack = stack;
-
- initTexture();
- }
-
- public void initTexture() {
- BufferedImage buffImg = new BufferedImage(this.textureWidth, this.textureHeight, BufferedImage.TYPE_INT_ARGB);
-
- for (int i = 0; i < TinkerUtil.getMaterialsFromTagList(TagUtil.getBaseMaterialsTagList(stack)).size(); i++) {
- String s = stack.getItem().getRegistryName().getResourceDomain();
- List<Material> mats = TinkerUtil.getMaterialsFromTagList(TagUtil.getBaseMaterialsTagList(stack));
+ super(a, false);
- String o = mats.get(i).renderInfo.getTextureSuffix();
-
- ArmorShader.selectRenderer(buffImg, mats.get(i).renderInfo,
- new ResourceLocation(Reference.MOD_ID, ((ArmorCore) stack.getItem()).getArmorTexture(stack, i)));
- }
+ this.stack = stack;
- texture = new DynamicTexture(buffImg);
- }
+ this.bipedBodyWear.isHidden = true;
+ this.bipedHeadwear.isHidden = true;
+ this.bipedLeftArmwear.isHidden = true;
+ this.bipedLeftLegwear.isHidden = true;
+ this.bipedRightArmwear.isHidden = true;
+ this.bipedRightLegwear.isHidden = true;
- @Override
- public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) {
- GL11.glPushMatrix();
-
- EntityLivingBase e = (EntityLivingBase) entity;
- if (texture != null) {
- Minecraft.getMinecraft().getTextureManager()
- .bindTexture(Minecraft.getMinecraft().getTextureManager().getDynamicTextureLocation("tdarmor", texture));
- }
- else
- {
- initTexture();
- }
-
- super.render(entity, f, f1, f2, f3, f4, f5);
-
- GL11.glPopMatrix();
- GL11.glColor3d(1.0, 1.0, 1.0);
}
// Mojang plz
@@ -104,8 +60,8 @@ public class ArmorRenderer extends ModelBiped {
this.bipedRightLeg.rotateAngleZ = 0.017453292F * entityarmorstand.getRightLegRotation().getZ();
this.bipedRightLeg.setRotationPoint(-1.9F, 11.0F, 0.0F);
copyModelAngles(this.bipedHead, this.bipedHeadwear);
- } else
- super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor,
- entityIn);
+ } else {
+ super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scaleFactor, entityIn);
+ }
}
}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDArmor.java b/src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDArmor.java
new file mode 100644
index 0000000..14c3fc1
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDArmor.java
@@ -0,0 +1,131 @@
+package lance5057.tDefense.core.tools.armor.renderers.layers;
+
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+
+import lance5057.tDefense.Reference;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.model.ModelBase;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.entity.RenderLivingBase;
+import net.minecraft.client.renderer.entity.layers.LayerRenderer;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import slimeknights.tconstruct.library.client.CustomTextureCreator;
+
+@SideOnly(Side.CLIENT)
+public abstract class LayerTDArmor<T extends ModelBase> implements LayerRenderer<EntityLivingBase> {
+
+ protected static final ResourceLocation ENCHANTED_ITEM_GLINT_RES = new ResourceLocation(
+ "textures/misc/enchanted_item_glint.png");
+ private final RenderLivingBase<?> renderer;
+ private float alpha = 1.0F;
+ private float colorR = 1.0F;
+ private float colorG = 1.0F;
+ private float colorB = 1.0F;
+ private boolean skipRenderGlint;
+ private static final Map<String, ResourceLocation> ARMOR_TEXTURE_RES_MAP = Maps
+ .<String, ResourceLocation>newHashMap();
+
+ public LayerTDArmor(RenderLivingBase<?> rendererIn) {
+ this.renderer = rendererIn;
+ this.initArmor();
+ }
+
+ protected abstract void initArmor();
+
+ protected abstract void setModelSlotVisible(T p_188359_1_, EntityEquipmentSlot slotIn);
+
+ @Override
+ public abstract void doRenderLayer(EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount,
+ float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale);
+
+ @Override
+ public boolean shouldCombineTextures() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ protected void renderArmorLayer(EntityLivingBase entityLivingBaseIn, float limbSwing, float limbSwingAmount,
+ float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale,
+ EntityEquipmentSlot slotIn) {
+ ItemStack itemstack = entityLivingBaseIn.getItemStackFromSlot(slotIn);
+
+ if (itemstack != null && itemstack.getItem() instanceof ArmorCore) {
+ ArmorCore itemarmor = (ArmorCore) itemstack.getItem();
+
+ if (itemarmor.getArmorSlot(itemstack, null) == slotIn) {
+ T t = this.getModelFromSlot(entityLivingBaseIn, slotIn);
+ if (t != null) {
+ t.setModelAttributes(this.renderer.getMainModel());
+ t.setLivingAnimations(entityLivingBaseIn, limbSwing, limbSwingAmount, partialTicks);
+ this.setModelSlotVisible(t, slotIn);
+ Map<String, TextureAtlasSprite> sprites = CustomTextureCreator.sprites.get("tinkersdefense:armor/helm/_helm_visor");
+ List<String> textures = getArmorResource(entityLivingBaseIn, itemstack, slotIn, null);
+ for (String s : textures) {
+ CustomTextureCreator.sprites.get(s);
+ this.renderer.bindTexture(new ResourceLocation(Reference.MOD_ID, s + ".png"));
+ t.render(entityLivingBaseIn, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch,
+ scale);
+ }
+
+ if (!this.skipRenderGlint && itemstack.hasEffect()) {
+ renderEnchantedGlint(this.renderer, entityLivingBaseIn, t, limbSwing, limbSwingAmount,
+ partialTicks, ageInTicks, netHeadYaw, headPitch, scale);
+ }
+ }
+ }
+ }
+ }
+
+ public abstract T getModelFromSlot(EntityLivingBase ent, EntityEquipmentSlot slotIn);
+
+ public abstract List<String> getArmorResource(net.minecraft.entity.Entity entity, ItemStack stack,
+ EntityEquipmentSlot slot, String type);
+
+ public static void renderEnchantedGlint(RenderLivingBase<?> p_188364_0_, EntityLivingBase p_188364_1_,
+ ModelBase model, float p_188364_3_, float p_188364_4_, float p_188364_5_, float p_188364_6_,
+ float p_188364_7_, float p_188364_8_, float p_188364_9_) {
+ float f = (float) p_188364_1_.ticksExisted + p_188364_5_;
+ p_188364_0_.bindTexture(ENCHANTED_ITEM_GLINT_RES);
+ Minecraft.getMinecraft().entityRenderer.setupFogColor(true);
+ GlStateManager.enableBlend();
+ GlStateManager.depthFunc(514);
+ GlStateManager.depthMask(false);
+ float f1 = 0.5F;
+ GlStateManager.color(0.5F, 0.5F, 0.5F, 1.0F);
+
+ for (int i = 0; i < 2; ++i) {
+ GlStateManager.disableLighting();
+ GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_COLOR, GlStateManager.DestFactor.ONE);
+ float f2 = 0.76F;
+ GlStateManager.color(0.38F, 0.19F, 0.608F, 1.0F);
+ GlStateManager.matrixMode(5890);
+ GlStateManager.loadIdentity();
+ float f3 = 0.33333334F;
+ GlStateManager.scale(0.33333334F, 0.33333334F, 0.33333334F);
+ GlStateManager.rotate(30.0F - (float) i * 60.0F, 0.0F, 0.0F, 1.0F);
+ GlStateManager.translate(0.0F, f * (0.001F + (float) i * 0.003F) * 20.0F, 0.0F);
+ GlStateManager.matrixMode(5888);
+ model.render(p_188364_1_, p_188364_3_, p_188364_4_, p_188364_6_, p_188364_7_, p_188364_8_, p_188364_9_);
+ GlStateManager.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
+ }
+
+ GlStateManager.matrixMode(5890);
+ GlStateManager.loadIdentity();
+ GlStateManager.matrixMode(5888);
+ GlStateManager.enableLighting();
+ GlStateManager.depthMask(true);
+ GlStateManager.depthFunc(515);
+ GlStateManager.disableBlend();
+ Minecraft.getMinecraft().entityRenderer.setupFogColor(false);
+ }
+}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDBipedArmor.java b/src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDBipedArmor.java
new file mode 100644
index 0000000..890ba1f
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/core/tools/armor/renderers/layers/LayerTDBipedArmor.java
@@ -0,0 +1,68 @@
+package lance5057.tDefense.core.tools.armor.renderers.layers;
+
+import java.util.List;
+
+import lance5057.tDefense.core.tools.bases.ArmorCore;
+import net.minecraft.client.model.ModelBiped;
+import net.minecraft.client.renderer.entity.RenderLivingBase;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+
+public class LayerTDBipedArmor extends LayerTDArmor<ModelBiped> {
+
+ public LayerTDBipedArmor(RenderLivingBase<?> rendererIn) {
+ super(rendererIn);
+ }
+
+ @Override
+ protected void initArmor() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ protected void setModelSlotVisible(ModelBiped p_188359_1_, EntityEquipmentSlot slotIn) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void doRenderLayer(EntityLivingBase entitylivingbaseIn, float limbSwing, float limbSwingAmount,
+ float partialTicks, float ageInTicks, float netHeadYaw, float headPitch, float scale) {
+ this.renderArmorLayer(entitylivingbaseIn, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw,
+ headPitch, scale, EntityEquipmentSlot.CHEST);
+ this.renderArmorLayer(entitylivingbaseIn, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw,
+ headPitch, scale, EntityEquipmentSlot.LEGS);
+ this.renderArmorLayer(entitylivingbaseIn, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw,
+ headPitch, scale, EntityEquipmentSlot.FEET);
+ this.renderArmorLayer(entitylivingbaseIn, limbSwing, limbSwingAmount, partialTicks, ageInTicks, netHeadYaw,
+ headPitch, scale, EntityEquipmentSlot.HEAD);
+ }
+
+ @Override
+ public ModelBiped getModelFromSlot(EntityLivingBase ent, EntityEquipmentSlot slotIn) {
+ if (ent instanceof EntityPlayer) {
+ EntityPlayer p = (EntityPlayer) ent;
+ ItemStack armor = p.inventory.armorItemInSlot(slotIn.getIndex());
+ ModelBiped b = ((ArmorCore)armor.getItem()).getArmorModel(ent, armor);
+ return b;
+ }
+ return null;
+ }
+
+ @Override
+ public List<String> getArmorResource(Entity entity, ItemStack stack, EntityEquipmentSlot slot, String type) {
+ if (entity instanceof EntityPlayer) {
+ EntityPlayer p = (EntityPlayer) entity;
+ ItemStack armor = p.inventory.armorItemInSlot(slot.getIndex());
+ List<String> l = ((ArmorCore)armor.getItem()).getArmorTexture(armor);
+ return l;
+ }
+ return null;
+ }
+
+}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStraps.java b/src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStraps.java
deleted file mode 100644
index 2822d1a..0000000
--- a/src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStraps.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package lance5057.tDefense.core.tools.armor.straps;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-import lance5057.tDefense.TinkersDefense;
-import lance5057.tDefense.core.tools.bases.ArmorCore;
-import net.minecraft.client.model.ModelBiped;
-import net.minecraft.entity.Entity;
-import net.minecraft.entity.EntityLivingBase;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.inventory.EntityEquipmentSlot;
-import net.minecraft.item.ItemArmor;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.NBTBase;
-import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ActionResult;
-import net.minecraft.util.DamageSource;
-import net.minecraft.util.EnumActionResult;
-import net.minecraft.util.EnumFacing;
-import net.minecraft.util.EnumHand;
-import net.minecraft.world.World;
-import net.minecraftforge.common.ISpecialArmor;
-import net.minecraftforge.common.capabilities.Capability;
-import net.minecraftforge.common.capabilities.ICapabilityProvider;
-import net.minecraftforge.common.capabilities.ICapabilitySerializable;
-import net.minecraftforge.common.util.EnumHelper;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
-import net.minecraftforge.items.CapabilityItemHandler;
-import net.minecraftforge.items.IItemHandler;
-import net.minecraftforge.items.ItemStackHandler;
-
-public class ItemStraps extends ItemArmor implements ISpecialArmor
-{
- public static ArmorMaterial ARMOR = EnumHelper.addArmorMaterial("NAME", "blank", 0, new int[] {0, 0, 0, 0}, 0, null, 0);
-
- public EntityEquipmentSlot equipSlot;
-
- @SideOnly(Side.CLIENT)
- private ModelBiped model;
-
- private ItemStack stack;
-
- public ItemStraps(EntityEquipmentSlot slot)
- {
- super(ARMOR, 0, slot);
- // ItemStacks that store an NBT Tag Compound are limited to stack size
- // of 1
- setMaxStackSize(1);
- // you'll want to set a creative tab as well, so you can get your item
- setCreativeTab(TinkersDefense.tab);
- this.setRegistryName("straps" + slot.getName()).setUnlocalizedName("straps" + slot.getName());
- }
-
- @Override
- @Nullable
- @SideOnly(Side.CLIENT)
- public final String getArmorTexture(ItemStack stack, Entity entity, EntityEquipmentSlot slot, String type)
- {
-// ItemStack in = stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).getStackInSlot(0);
-// if(in.getItem() instanceof ArmorCore)
-// {
-// return ((ArmorCore)in.getItem()).getArmorTexture(stack, 0);
-// }
- return null;
- }
-
- @Override
- @SideOnly(Side.CLIENT)
- @Nullable
- public net.minecraft.client.model.ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default)
- {
- ItemStack in = itemStack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).getStackInSlot(0);
- if(in.getItem() instanceof ArmorCore)
- {
- if(model == null || stack == null || !stack.equals(in))
- {
- //model = ((ArmorCore)in.getItem()).getArmorModel(in);
- stack = in;
- }
- return model;
- }
- return null;
- }
-
- @Nonnull
- @Override
- public ICapabilityProvider initCapabilities(ItemStack stack, NBTTagCompound oldCapNbt)
- {
- return new InvProvider();
- }
-
- private static class InvProvider implements ICapabilitySerializable<NBTBase> {
-
- private final IItemHandler inv = new ItemStackHandler(1);
-
- @Override
- public boolean hasCapability(@Nonnull Capability<?> capability, @Nullable EnumFacing facing) {
- return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY;
- }
-
- @Override
- public <T> T getCapability(@Nonnull Capability<T> capability, @Nullable EnumFacing facing) {
- if(capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
- return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(inv);
- else return null;
- }
-
- @Override
- public NBTBase serializeNBT() {
- return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.writeNBT(inv, null);
- }
-
- @Override
- public void deserializeNBT(NBTBase nbt) {
- CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.readNBT(inv, null, nbt);
- }
- }
-
- // Without this method, your inventory will NOT work!!!
- @Override
- public int getMaxItemUseDuration(ItemStack stack)
- {
- return 1; // return any value greater than zero
- }
-
- @Override
- public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn)
- {
- if (!worldIn.isRemote)
- {
- // If player not sneaking, open the inventory gui
- if (!playerIn.isSneaking())
- {
- playerIn.openGui(TinkersDefense.instance, TinkersDefense.GUI_STRAPS_INV, worldIn, 0, 0, 0);
- }
- }
-
- return new ActionResult(EnumActionResult.PASS, playerIn.getHeldItem(handIn));
- }
-
- @Override
- public ArmorProperties getProperties(EntityLivingBase player, ItemStack armor, DamageSource source, double damage, int slot)
- {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot)
- {
- ItemStack in = armor.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).getStackInSlot(0);
- if(in.getItem() instanceof ArmorCore)
- {
- int i = ((ArmorCore)in.getItem()).getArmorDisplay(in);
- return i;
- }
- return 0;
- }
-
- @Override
- public void damageArmor(EntityLivingBase entity, ItemStack stack, DamageSource source, int damage, int slot)
- {
- stack.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).getStackInSlot(0).damageItem(damage, entity);
- }
-} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStrapsInv.java b/src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStrapsInv.java
deleted file mode 100644
index 8929e93..0000000
--- a/src/main/java/lance5057/tDefense/core/tools/armor/straps/ItemStrapsInv.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package lance5057.tDefense.core.tools.armor.straps;
-
-import javax.annotation.Nonnull;
-
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.items.CapabilityItemHandler;
-import net.minecraftforge.items.IItemHandlerModifiable;
-import net.minecraftforge.items.ItemStackHandler;
-
-public class ItemStrapsInv implements IItemHandlerModifiable
-{
-
- private ItemStack invItem = ItemStack.EMPTY;
- public static final int INVSIZE = 1;
- private final String name = "ArmorHolder";
-
- private final IItemHandlerModifiable inventory;
-
- public ItemStrapsInv(ItemStack stack)
- {
- invItem = stack;
- inventory = (ItemStackHandler) invItem.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
- }
-
- @Override
- public void setStackInSlot(int slot, @Nonnull ItemStack stack)
- {
- inventory.setStackInSlot(slot, stack);
- }
-
- @Override
- public int getSlots()
- {
- return inventory.getSlots();
- }
-
- @Nonnull
- @Override
- public ItemStack getStackInSlot(int slot)
- {
- return inventory.getStackInSlot(slot);
- }
-
- @Nonnull
- @Override
- public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate)
- {
- return inventory.insertItem(slot, stack, simulate);
- }
-
- @Nonnull
- @Override
- public ItemStack extractItem(int slot, int amount, boolean simulate)
- {
- return inventory.extractItem(slot, amount, simulate);
- }
-
- @Override
- public int getSlotLimit(int slot)
- {
- return inventory.getSlotLimit(slot);
- }
-}
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsContainer.java b/src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsContainer.java
deleted file mode 100644
index dda3b5f..0000000
--- a/src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsContainer.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package lance5057.tDefense.core.tools.armor.straps;
-
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.InventoryPlayer;
-import net.minecraft.inventory.Container;
-import net.minecraft.inventory.Slot;
-import net.minecraft.item.ItemStack;
-import net.minecraftforge.items.SlotItemHandler;
-
-public class StrapsContainer extends Container
-{
- public final ItemStrapsInv inventory;
-
- private static final int INV_START = ItemStrapsInv.INVSIZE, INV_END = INV_START+26,
- HOTBAR_START = INV_END+1, HOTBAR_END = HOTBAR_START+8;
-
-
- public StrapsContainer(EntityPlayer par1Player, InventoryPlayer inventoryPlayer, ItemStrapsInv inventoryItem)
- {
- this.inventory = inventoryItem;
-
- int i;
-
- this.addSlotToContainer(new SlotItemHandler(this.inventory, 0, 80, 8+23));
-
- for (i = 0; i < 3; ++i)
- {
- for (int j = 0; j < 9; ++j)
- {
- this.addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
- }
- }
-
- for (i = 0; i < 9; ++i)
- {
- this.addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 142));
- }
- }
-
- @Override
- public boolean canInteractWith(EntityPlayer entityplayer)
- {
- return true;
- }
-
- public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int index)
- {
- ItemStack itemstack = ItemStack.EMPTY;
- Slot slot = (Slot) this.inventorySlots.get(index);
-
- if (slot != null && slot.getHasStack())
- {
- ItemStack itemstack1 = slot.getStack();
- itemstack = itemstack1.copy();
-
- if (index < INV_START)
- {
- if (!this.mergeItemStack(itemstack1, INV_START, HOTBAR_END+1, true))
- {
- return ItemStack.EMPTY;
- }
-
- slot.onSlotChange(itemstack1, itemstack);
- }
- else
- {
- if (index >= INV_START)
- {
- if (!this.mergeItemStack(itemstack1, 0, INV_START, false))
- {
- return ItemStack.EMPTY;
- }
- }
- }
-
- if (itemstack1.getItemDamage() == 0)
- {
- slot.putStack(ItemStack.EMPTY);
- }
- else
- {
- slot.onSlotChanged();
- }
-
- if (itemstack1.getItemDamage() == itemstack.getItemDamage())
- {
- return ItemStack.EMPTY;
- }
-
- slot.onTake(par1EntityPlayer, itemstack1);
- }
-
- return itemstack;
- }
-} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsGui.java b/src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsGui.java
deleted file mode 100644
index 97423dc..0000000
--- a/src/main/java/lance5057/tDefense/core/tools/armor/straps/StrapsGui.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package lance5057.tDefense.core.tools.armor.straps;
-
-import java.util.List;
-
-import lance5057.tDefense.Reference;
-import net.minecraft.client.gui.inventory.GuiContainer;
-import net.minecraft.client.renderer.GlStateManager;
-import net.minecraft.client.renderer.RenderHelper;
-import net.minecraft.client.resources.I18n;
-import net.minecraft.inventory.Slot;
-import net.minecraft.item.ItemStack;
-import net.minecraft.util.ResourceLocation;
-import net.minecraftforge.items.SlotItemHandler;
-
-public class StrapsGui extends GuiContainer {
-
- private static final ResourceLocation texture = new ResourceLocation(Reference.MOD_ID,
- "textures/gui/straps_helm.png");
-
- public StrapsGui(StrapsContainer containerItem) {
- super(containerItem);
- }
-
- /**
- * Draws the screen and all the components in it.
- */
- public void drawScreen(int mouseX, int mouseY, float partialTicks) {
- this.drawDefaultBackground();
- super.drawScreen(mouseX, mouseY, partialTicks);
- this.renderHoveredToolTip(mouseX, mouseY);
- }
-
- @Override
- protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) {
- String s = I18n.format("straps");
- fontRenderer.drawString(s, xSize / 2 - fontRenderer.getStringWidth(s) / 2, 6, 4210752);
- fontRenderer.drawString(I18n.format("container.inventory"), 8, ySize - 96 + 2, 4210752);
- }
-
- @Override
- protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) {
- GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
- mc.getTextureManager().bindTexture(texture);
- int k = (width - xSize) / 2;
- int l = (height - ySize) / 2;
- drawTexturedModalRect(k, l, 0, 0, xSize, ySize);
-
- List<Slot> slotList = inventorySlots.inventorySlots;
- for (Slot slot : slotList)
- if (slot instanceof SlotItemHandler) {
- SlotItemHandler slotf = (SlotItemHandler) slot;
- }
- }
-} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/core/tools/bases/ArmorBase.java b/src/main/java/lance5057/tDefense/core/tools/bases/ArmorBase.java
new file mode 100644
index 0000000..4c3d876
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/core/tools/bases/ArmorBase.java
@@ -0,0 +1,516 @@
+package lance5057.tDefense.core.tools.bases;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+
+import gnu.trove.set.hash.THashSet;
+import lance5057.tDefense.util.ArmorBuilder;
+import lance5057.tDefense.util.ArmorEvent;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.inventory.EntityEquipmentSlot;
+import net.minecraft.item.EnumRarity;
+import net.minecraft.item.ItemArmor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.util.NonNullList;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraft.util.text.translation.I18n;
+import net.minecraft.world.World;
+import net.minecraftforge.common.ISpecialArmor;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import slimeknights.mantle.util.RecipeMatch;
+import slimeknights.tconstruct.common.ClientProxy;
+import slimeknights.tconstruct.common.config.Config;
+import slimeknights.tconstruct.library.Util;
+import slimeknights.tconstruct.library.events.TinkerEvent;
+import slimeknights.tconstruct.library.materials.HeadMaterialStats;
+import slimeknights.tconstruct.library.materials.Material;
+import slimeknights.tconstruct.library.materials.MaterialTypes;
+import slimeknights.tconstruct.library.modifiers.TinkerGuiException;
+import slimeknights.tconstruct.library.tinkering.Category;
+import slimeknights.tconstruct.library.tinkering.IModifyable;
+import slimeknights.tconstruct.library.tinkering.IRepairable;
+import slimeknights.tconstruct.library.tinkering.ITinkerable;
+import slimeknights.tconstruct.library.tinkering.IndestructibleEntityItem;
+import slimeknights.tconstruct.library.tinkering.PartMaterialType;
+import slimeknights.tconstruct.library.traits.ITrait;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.Tags;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+import slimeknights.tconstruct.library.utils.ToolBuilder;
+import slimeknights.tconstruct.library.utils.ToolHelper;
+import slimeknights.tconstruct.library.utils.TooltipBuilder;
+
+public abstract class ArmorBase extends ItemArmor implements ITinkerable, IModifyable, IRepairable, ISpecialArmor{
+ protected final PartMaterialType[] requiredComponents;
+ // used to classify what the thing can do
+ protected final Set<Category> categories = new THashSet<>();
+
+ public ArmorBase(EntityEquipmentSlot slot, PartMaterialType... requiredComponents) {
+ super(ItemArmor.ArmorMaterial.LEATHER, 0, slot);
+ this.requiredComponents = requiredComponents;
+
+ this.setMaxStackSize(1);
+ //this.setHasSubtypes(true);
+ }
+
+ /* Tool Information */
+ public List<PartMaterialType> getRequiredComponents() {
+ return ImmutableList.copyOf(requiredComponents);
+ }
+
+ public List<PartMaterialType> getToolBuildComponents() {
+ return getRequiredComponents();
+ }
+
+ protected void addCategory(Category... categories) {
+ Collections.addAll(this.categories, categories);
+ }
+
+ public boolean hasCategory(Category category) {
+ return categories.contains(category);
+ }
+
+ protected Category[] getCategories() {
+ Category[] out = new Category[categories.size()];
+ int i = 0;
+ for(Category category : categories) {
+ out[i++] = category;
+ }
+
+ return out;
+ }
+
+ /* INDESTRUCTIBLE */
+
+ @Override
+ public boolean hasCustomEntity(ItemStack stack) {
+ return true;
+ }
+
+ @Nonnull
+ @Override
+ public Entity createEntity(World world, Entity location, ItemStack itemstack) {
+ EntityItem entity = new IndestructibleEntityItem(world, location.posX, location.posY, location.posZ, itemstack);
+ if(location instanceof EntityItem) {
+ // workaround for private access on that field >_>
+ NBTTagCompound tag = new NBTTagCompound();
+ location.writeToNBT(tag);
+ entity.setPickupDelay(tag.getShort("PickupDelay"));
+ }
+ entity.motionX = location.motionX;
+ entity.motionY = location.motionY;
+ entity.motionZ = location.motionZ;
+ return entity;
+ }
+
+ /* Building the Item */
+ public boolean validComponent(int slot, ItemStack stack) {
+ if(slot > requiredComponents.length || slot < 0) {
+ return false;
+ }
+
+ return requiredComponents[slot].isValid(stack);
+ }
+
+ /**
+ * Builds an Itemstack of this tool with the given materials, if applicable.
+ *
+ * @param stacks Items to build with. Have to be in the correct order and have exact length. No nulls!
+ * @return The built item or null if invalid input.
+ */
+ @Nonnull
+ public ItemStack buildItemFromStacks(NonNullList<ItemStack> stacks) {
+ long itemCount = stacks.stream().filter(stack -> !stack.isEmpty()).count();
+ List<Material> materials = new ArrayList<>(stacks.size());
+
+ if(itemCount != requiredComponents.length) {
+ return ItemStack.EMPTY;
+ }
+
+ // not a valid part arrangement for this tool
+ for(int i = 0; i < itemCount; i++) {
+ if(!validComponent(i, stacks.get(i))) {
+ return ItemStack.EMPTY;
+ }
+
+ materials.add(TinkerUtil.getMaterialFromStack(stacks.get(i)));
+ }
+
+ return buildItem(materials);
+ }
+
+ /**
+ * Builds an Itemstack of this tool with the given materials.
+ *
+ * @param materials Materials to build with. Have to be in the correct order. No nulls!
+ * @return The built item or null if invalid input.
+ */
+ @Nonnull
+ public ItemStack buildItem(List<Material> materials) {
+ ItemStack tool = new ItemStack(this);
+ tool.setTagCompound(buildItemNBT(materials));
+
+ return tool;
+ }
+
+ /**
+ * Builds the NBT for a new tinker item with the given data.
+ *
+ * @param materials Materials to build with. Have to be in the correct order. No nulls!
+ * @return The built nbt
+ */
+ public NBTTagCompound buildItemNBT(List<Material> materials) {
+ NBTTagCompound basetag = new NBTTagCompound();
+ NBTTagCompound toolTag = buildTag(materials);
+ NBTTagCompound dataTag = buildData(materials);
+
+ basetag.setTag(Tags.BASE_DATA, dataTag);
+ basetag.setTag(Tags.TOOL_DATA, toolTag);
+ // copy of the original tool data
+ basetag.setTag(Tags.TOOL_DATA_ORIG, toolTag.copy());
+
+ // save categories on the tool
+ TagUtil.setCategories(basetag, getCategories());
+
+ // add traits
+ addMaterialTraits(basetag, materials);
+
+ // fire toolbuilding event
+ ArmorEvent.OnItemBuilding.fireEvent(basetag, ImmutableList.copyOf(materials), this);
+
+ return basetag;
+ }
+
+ /**
+ * Creates an NBT Tag with the materials that were used to build the item.
+ */
+ private NBTTagCompound buildData(List<Material> materials) {
+ NBTTagCompound base = new NBTTagCompound();
+ NBTTagList materialList = new NBTTagList();
+
+ for(Material material : materials) {
+ materialList.appendTag(new NBTTagString(material.identifier));
+ }
+
+ // pre-type base-modifier list
+ NBTTagList modifierList = new NBTTagList();
+ // we cannot set the type directly, but it gets typed by adding a tag, so we add and remove one
+ modifierList.appendTag(new NBTTagString());
+ modifierList.removeTag(0);
+
+ base.setTag(Tags.BASE_MATERIALS, materialList);
+ base.setTag(Tags.BASE_MODIFIERS, modifierList);
+
+ return base;
+ }
+
+ /**
+ * Builds an unusable tool that only has the rendering info
+ */
+ @Nonnull
+ public ItemStack buildItemForRendering(List<Material> materials) {
+ ItemStack tool = new ItemStack(this);
+ NBTTagCompound base = new NBTTagCompound();
+ base.setTag(Tags.BASE_DATA, buildData(materials));
+ tool.setTagCompound(base);
+
+ return tool;
+ }
+
+ @Nonnull
+ public ItemStack buildItemForRenderingInGui() {
+ List<Material> materials = IntStream.range(0, getRequiredComponents().size())
+ .mapToObj(this::getMaterialForPartForGuiRendering)
+ .collect(Collectors.toList());
+
+ return buildItemForRendering(materials);
+ }
+
+ @SideOnly(Side.CLIENT)
+ public Material getMaterialForPartForGuiRendering(int index) {
+ return ClientProxy.RenderMaterials[index % ClientProxy.RenderMaterials.length];
+ }
+
+ public abstract NBTTagCompound buildTag(List<Material> materials);
+
+ /** Checks whether an Item built from materials has only valid materials. Uses the standard NBT to determine materials. */
+ public boolean hasValidMaterials(ItemStack stack) {
+ // checks if the materials used support all stats needed
+ NBTTagList list = TagUtil.getBaseMaterialsTagList(stack);
+ List<Material> materials = TinkerUtil.getMaterialsFromTagList(list);
+
+ // something went wrooooong
+ if(materials.size() != requiredComponents.length) {
+ return false;
+ }
+
+ // check if all materials used have the stats needed
+ for(int i = 0; i < materials.size(); i++) {
+ Material material = materials.get(i);
+ PartMaterialType required = requiredComponents[i];
+ if(!required.isValidMaterial(material)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public void addMaterialTraits(NBTTagCompound root, List<Material> materials) {
+ int size = requiredComponents.length;
+ // safety
+ if(materials.size() < size) {
+ size = materials.size();
+ }
+ // add corresponding traits per material usage
+ for(int i = 0; i < size; i++) {
+ PartMaterialType required = requiredComponents[i];
+ Material material = materials.get(i);
+ for(ITrait trait : required.getApplicableTraitsForMaterial(material)) {
+ ToolBuilder.addTrait(root, trait, material.materialTextColor);
+ }
+ }
+ }
+
+ /* Repairing */
+
+ /** Returns indices of the parts that are used for repairing */
+ public int[] getRepairParts() {
+ return new int[] { 1 }; // index 1 usually is the head. 0 is handle.
+ }
+
+ public float getRepairModifierForPart(int index) {
+ return 1f;
+ }
+
+ @Nonnull
+ @Override
+ public ItemStack repair(ItemStack repairable, NonNullList<ItemStack> repairItems) {
+ if(repairable.getItemDamage() == 0 && !ToolHelper.isBroken(repairable)) {
+ // undamaged and not broken - no need to repair
+ return ItemStack.EMPTY;
+ }
+
+ // we assume the first required part exclusively determines repair material
+ List<Material> materials = TinkerUtil.getMaterialsFromTagList(TagUtil.getBaseMaterialsTagList(repairable));
+ if(materials.isEmpty()) {
+ return ItemStack.EMPTY;
+ }
+
+ // ensure the items only contain valid items
+ NonNullList<ItemStack> items = Util.deepCopyFixedNonNullList(repairItems);
+ boolean foundMatch = false;
+ for(int index : getRepairParts()) {
+ Material material = materials.get(index);
+
+ if(repairCustom(material, items) > 0) {
+ foundMatch = true;
+ }
+
+ Optional<RecipeMatch.Match> match = material.matches(items);
+
+ // not a single match -> nothing to repair with
+ if(!match.isPresent()) {
+ continue;
+ }
+ foundMatch = true;
+
+ while((match = material.matches(items)).isPresent()) {
+ RecipeMatch.removeMatch(items, match.get());
+ }
+ }
+
+ if(!foundMatch) {
+ return ItemStack.EMPTY;
+ }
+
+ // check if all items were used
+ for(int i = 0; i < repairItems.size(); i++) {
+ // was non-null and did not get modified (stacksize changed or null now, usually)
+ if(!repairItems.get(i).isEmpty() && ItemStack.areItemStacksEqual(repairItems.get(i), items.get(i))) {
+ // found an item that was not touched
+ return ItemStack.EMPTY;
+ }
+ }
+
+ // now do it all over again with the real items, to actually repair \o/
+ ItemStack item = repairable.copy();
+
+ while(item.getItemDamage() > 0) {
+ int amount = calculateRepairAmount(materials, repairItems);
+
+ // nothing to repair with, we're therefore done
+ if(amount <= 0) {
+ break;
+ }
+
+ ToolHelper.repairTool(item, calculateRepair(item, amount));
+ // save that we repaired it :I
+ NBTTagCompound tag = TagUtil.getExtraTag(item);
+ tag.setInteger(Tags.REPAIR_COUNT, tag.getInteger(Tags.REPAIR_COUNT) + 1);
+ TagUtil.setExtraTag(item, tag);
+ }
+
+ return item;
+ }
+
+ /** Allows for custom repair items. Remove used items from the array. */
+ protected int repairCustom(Material material, NonNullList<ItemStack> repairItems) {
+ return 0;
+ }
+
+ protected int calculateRepairAmount(List<Material> materials, NonNullList<ItemStack> repairItems) {
+ Set<Material> materialsMatched = Sets.newHashSet();
+ float durability = 0f;
+ // try to match each material once
+ for(int index : getRepairParts()) {
+ Material material = materials.get(index);
+
+ if(materialsMatched.contains(material)) {
+ continue;
+ }
+
+ // custom repairing
+ durability += repairCustom(material, repairItems) * getRepairModifierForPart(index);
+
+ Optional<RecipeMatch.Match> matchOptional = material.matches(repairItems);
+ if(matchOptional.isPresent()) {
+ RecipeMatch.Match match = matchOptional.get();
+ HeadMaterialStats stats = material.getStats(MaterialTypes.HEAD);
+ if(stats != null) {
+ materialsMatched.add(material);
+ durability += ((float) stats.durability * (float) match.amount * getRepairModifierForPart(index)) / 144f;
+ RecipeMatch.removeMatch(repairItems, match);
+ }
+ }
+ }
+
+ durability *= 1f + ((float) materialsMatched.size() - 1) / 9f;
+
+ return (int) durability;
+ }
+
+ protected int calculateRepair(ItemStack tool, int amount) {
+ float origDur = TagUtil.getOriginalToolStats(tool).durability;
+ float actualDur = ToolHelper.getDurabilityStat(tool);
+
+ // calculate in modifiers that change the total durability of a tool, like diamond
+ // they should not punish the player with higher repair costs
+ float durabilityFactor = actualDur / origDur;
+ float increase = amount * Math.min(10f, durabilityFactor);
+
+ increase = Math.max(increase, actualDur / 64f);
+ //increase = Math.max(50, increase);
+
+ int modifiersUsed = TagUtil.getBaseModifiersUsed(tool.getTagCompound());
+ float mods = 1.0f;
+ if(modifiersUsed == 1) {
+ mods = 0.95f;
+ }
+ else if(modifiersUsed == 2) {
+ mods = 0.9f;
+ }
+ else if(modifiersUsed >= 3) {
+ mods = 0.85f;
+ }
+
+ increase *= mods;
+
+ NBTTagCompound tag = TagUtil.getExtraTag(tool);
+ int repair = tag.getInteger(Tags.REPAIR_COUNT);
+ float repairDimishingReturns = (100 - repair / 2) / 100f;
+ if(repairDimishingReturns < 0.5f) {
+ repairDimishingReturns = 0.5f;
+ }
+ increase *= repairDimishingReturns;
+
+ return (int) Math.ceil(increase);
+ }
+
+ /* Information */
+
+ @Override
+ @SideOnly(Side.CLIENT)
+ public void addInformation(ItemStack stack, @Nullable World worldIn, List<String> tooltip, ITooltipFlag flagIn) {
+ boolean shift = Util.isShiftKeyDown();
+ boolean ctrl = Util.isCtrlKeyDown();
+ // modifiers
+ if(!shift && !ctrl) {
+ getTooltip(stack, tooltip);
+
+ tooltip.add("");
+ // info tooltip for detailed and componend info
+ tooltip.add(Util.translate("tooltip.tool.holdShift"));
+ tooltip.add(Util.translate("tooltip.tool.holdCtrl"));
+
+// if(worldIn != null) {
+// tooltip.add(TextFormatting.BLUE +
+// I18n.translateToLocalFormatted("attribute.modifier.plus.0",
+// Util.df.format(ToolHelper.getActualDamage(stack, Minecraft.getMinecraft().player)),
+// I18n.translateToLocal("attribute.name.generic.attackDamage")));
+// }
+ }
+ // detailed data
+ else if(Config.extraTooltips && shift) {
+ getTooltipDetailed(stack, tooltip);
+ }
+ // component data
+ else if(Config.extraTooltips && ctrl) {
+ getTooltipComponents(stack, tooltip);
+ }
+ }
+
+ @Override
+ public void getTooltip(ItemStack stack, List<String> tooltips) {
+ // Default tooltip: modifiers
+ TooltipBuilder.addModifierTooltips(stack, tooltips);
+ }
+
+ @Nonnull
+ @Override
+ public EnumRarity getRarity(ItemStack stack) {
+ // prevents enchanted items to have a different name color
+ return EnumRarity.COMMON;
+ }
+
+ @Override
+ public boolean isBookEnchantable(ItemStack stack, ItemStack book) {
+ return false;
+ }
+
+ /* NBT loading */
+
+ @Override
+ public boolean updateItemStackNBT(NBTTagCompound nbt) {
+ // when the itemstack is loaded from NBT we recalculate all the data
+ if(nbt.hasKey(Tags.BASE_DATA)) {
+ try {
+ ArmorBuilder.rebuildArmor(nbt, this);
+ }
+ catch(TinkerGuiException e) {
+ // nothing to do
+ }
+ }
+
+ // return value shouldn't matter since it's never checked
+ return true;
+ }
+}
diff --git a/src/main/java/lance5057/tDefense/core/tools/bases/ArmorCore.java b/src/main/java/lance5057/tDefense/core/tools/bases/ArmorCore.java
index 1c1acc0..44ca576 100644
--- a/src/main/java/lance5057/tDefense/core/tools/bases/ArmorCore.java
+++ b/src/main/java/lance5057/tDefense/core/tools/bases/ArmorCore.java
@@ -1,34 +1,42 @@
package lance5057.tDefense.core.tools.bases;
-import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import javax.annotation.Nullable;
-import lance5057.tDefense.Reference;
+import com.google.common.collect.Sets;
+
import lance5057.tDefense.core.materials.ArmorMaterialStats;
+import lance5057.tDefense.core.tools.armor.renderers.ArmorRenderer;
import lance5057.tDefense.util.ArmorNBT;
-import net.minecraft.client.model.ModelBiped;
-import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
-import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
+import slimeknights.tconstruct.library.Util;
import slimeknights.tconstruct.library.materials.ExtraMaterialStats;
import slimeknights.tconstruct.library.materials.HandleMaterialStats;
+import slimeknights.tconstruct.library.materials.IMaterialStats;
import slimeknights.tconstruct.library.materials.Material;
import slimeknights.tconstruct.library.materials.MaterialTypes;
+import slimeknights.tconstruct.library.tinkering.Category;
import slimeknights.tconstruct.library.tinkering.PartMaterialType;
-import slimeknights.tconstruct.library.tools.ToolCore;
+import slimeknights.tconstruct.library.tools.IToolPart;
+import slimeknights.tconstruct.library.traits.ITrait;
import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+import slimeknights.tconstruct.library.utils.ToolHelper;
+import slimeknights.tconstruct.library.utils.TooltipBuilder;
-public abstract class ArmorCore extends ToolCore {
- public ArmorCore(PartMaterialType... requiredComponents) {
- super(requiredComponents);
+public abstract class ArmorCore extends ArmorBase {
+ public ArmorCore(EntityEquipmentSlot slot, PartMaterialType... requiredComponents) {
+ super(slot, requiredComponents);
}
protected String getHarvestType() {
@@ -36,16 +44,6 @@ public abstract class ArmorCore extends ToolCore {
}
@Override
- public float damagePotential() {
- return 0.0f;
- }
-
- @Override
- public double attackSpeed() {
- return 0;
- }
-
- @Override
public abstract NBTTagCompound buildTag(List<slimeknights.tconstruct.library.materials.Material> materials);
public int getArmorDisplay(ItemStack stack) {
@@ -53,12 +51,11 @@ public abstract class ArmorCore extends ToolCore {
}
@SideOnly(Side.CLIENT)
- public abstract String getArmorTexture(ItemStack stack, int layer);
+ public abstract List<String> getArmorTexture(ItemStack stack);
@SideOnly(Side.CLIENT)
- @Override
- @Nullable
- public abstract ModelBiped getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack, EntityEquipmentSlot armorSlot, net.minecraft.client.model.ModelBiped _default);
+ @Nullable
+ public abstract ArmorRenderer getArmorModel(EntityLivingBase entityLiving, ItemStack itemStack);
public ArmorNBT buildDefaultArmorTag(List<Material> materials, String type) {
ArmorNBT data = new ArmorNBT();
@@ -69,7 +66,7 @@ public abstract class ArmorCore extends ToolCore {
// start with head
data.head(head);
- // add in accessoires if present
+ // add in accessories if present
if (materials.size() >= 3) {
ExtraMaterialStats binding = materials.get(2).getStatsOrUnknown(MaterialTypes.EXTRA);
data.extra(binding);
@@ -92,4 +89,91 @@ public abstract class ArmorCore extends ToolCore {
}
public abstract EntityEquipmentSlot getArmorSlot(ItemStack stack, EntityEquipmentSlot armorType);
+
+ @Override
+ public void getTooltip(ItemStack stack, List<String> tooltips) {
+ if(ToolHelper.isBroken(stack)) {
+ tooltips.add("" + TextFormatting.DARK_RED + TextFormatting.BOLD + getBrokenTooltip(stack));
+ }
+ super.getTooltip(stack, tooltips);
+ }
+
+ protected String getBrokenTooltip(ItemStack itemStack) {
+ return Util.translate(TooltipBuilder.LOC_Broken);
+ }
+
+ @Override
+ public void getTooltipDetailed(ItemStack stack, List<String> tooltips) {
+ tooltips.addAll(getInformation(stack, false));
+ }
+
+ public List<String> getInformation(ItemStack stack, boolean detailed) {
+ TooltipBuilder info = new TooltipBuilder(stack);
+
+ info.addDurability(!detailed);
+ if(hasCategory(Category.HARVEST)) {
+ info.addHarvestLevel();
+ info.addMiningSpeed();
+ }
+ if(hasCategory(Category.LAUNCHER)) {
+ info.addDrawSpeed();
+ info.addRange();
+ info.addProjectileBonusDamage();
+ }
+ info.addAttack();
+
+ if(ToolHelper.getFreeModifiers(stack) > 0) {
+ info.addFreeModifiers();
+ }
+
+ if(detailed) {
+ info.addModifierInfo();
+ }
+
+ return info.getTooltip();
+ }
+
+ @Override
+ public void getTooltipComponents(ItemStack stack, List<String> tooltips) {
+ List<Material> materials = TinkerUtil.getMaterialsFromTagList(TagUtil.getBaseMaterialsTagList(stack));
+ List<PartMaterialType> component = getRequiredComponents();
+
+ if(materials.size() < component.size()) {
+ return;
+ }
+
+ for(int i = 0; i < component.size(); i++) {
+ PartMaterialType pmt = component.get(i);
+ Material material = materials.get(i);
+
+ // get (one possible) toolpart used to craft the thing
+ Iterator<IToolPart> partIter = pmt.getPossibleParts().iterator();
+ if(!partIter.hasNext()) {
+ continue;
+ }
+
+ IToolPart part = partIter.next();
+ ItemStack partStack = part.getItemstackWithMaterial(material);
+ if(partStack != null) {
+ // we have the part, add it
+ tooltips.add(material.getTextColor() + TextFormatting.UNDERLINE + partStack.getDisplayName());
+
+ Set<ITrait> usedTraits = Sets.newHashSet();
+ // find out which stats and traits it contributes and add it to the tooltip
+ for(IMaterialStats stats : material.getAllStats()) {
+ if(pmt.usesStat(stats.getIdentifier())) {
+ tooltips.addAll(stats.getLocalizedInfo());
+ for(ITrait trait : pmt.getApplicableTraitsForMaterial(material)) {
+ if(!usedTraits.contains(trait)) {
+ tooltips.add(material.getTextColor() + trait.getLocalizedName());
+ usedTraits.add(trait);
+ }
+ }
+ }
+ }
+ tooltips.add("");
+ }
+ }
+ }
+
}
diff --git a/src/main/java/lance5057/tDefense/proxy/ClientProxy.java b/src/main/java/lance5057/tDefense/proxy/ClientProxy.java
index 651865a..5b697ae 100644
--- a/src/main/java/lance5057/tDefense/proxy/ClientProxy.java
+++ b/src/main/java/lance5057/tDefense/proxy/ClientProxy.java
@@ -6,7 +6,6 @@ import javax.annotation.Nonnull;
import com.google.common.collect.ImmutableList;
-import jline.internal.Log;
import lance5057.tDefense.Reference;
import lance5057.tDefense.TD_Commands;
import lance5057.tDefense.TinkersDefense;
@@ -16,7 +15,12 @@ import lance5057.tDefense.core.parts.TDParts;
import lance5057.tDefense.core.renderers.BaubleRenderer;
import lance5057.tDefense.core.renderers.SheatheModel;
import lance5057.tDefense.core.tools.TDTools;
+import lance5057.tDefense.core.tools.armor.renderers.layers.LayerTDBipedArmor;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
import lance5057.tDefense.renderers.deserializers.AlphaColorTextureDeserializer;
+import lance5057.tDefense.util.ArmorBuildGuiInfo;
+import lance5057.tDefense.util.TDClientRegistry;
+import lance5057.tDefense.util.TDModelRegistar;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.Minecraft;
@@ -31,13 +35,9 @@ import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.ClientCommandHandler;
-import net.minecraftforge.client.event.RenderPlayerEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fml.common.Mod;
-import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
-import net.minecraftforge.fml.relauncher.Side;
-import net.minecraftforge.fml.relauncher.SideOnly;
import slimeknights.tconstruct.common.ModelRegisterUtil;
import slimeknights.tconstruct.library.TinkerRegistry;
import slimeknights.tconstruct.library.TinkerRegistryClient;
@@ -63,20 +63,20 @@ public class ClientProxy extends CommonProxy {
ToolBuildGuiInfo shearsGUI;
ToolBuildGuiInfo fishingRodGUI;
- ToolBuildGuiInfo hoodGUI;
- ToolBuildGuiInfo shawlGUI;
- ToolBuildGuiInfo robeGUI;
- ToolBuildGuiInfo shoesGUI;
+ ArmorBuildGuiInfo hoodGUI;
+ ArmorBuildGuiInfo shawlGUI;
+ ArmorBuildGuiInfo robeGUI;
+ ArmorBuildGuiInfo shoesGUI;
- ToolBuildGuiInfo coifGUI;
- ToolBuildGuiInfo hauberkGUI;
- ToolBuildGuiInfo chaussesGUI;
- ToolBuildGuiInfo bootsGUI;
+ ArmorBuildGuiInfo coifGUI;
+ ArmorBuildGuiInfo hauberkGUI;
+ ArmorBuildGuiInfo chaussesGUI;
+ //ToolBuildGuiInfo bootsGUI;
- ToolBuildGuiInfo helmGUI;
- ToolBuildGuiInfo breastplateGUI;
- ToolBuildGuiInfo grievesGUI;
- ToolBuildGuiInfo sabatonsGUI;
+ ArmorBuildGuiInfo helmGUI;
+ ArmorBuildGuiInfo breastplateGUI;
+ ArmorBuildGuiInfo grievesGUI;
+ ArmorBuildGuiInfo sabatonsGUI;
ToolBuildGuiInfo sheatheGUI;
ToolBuildGuiInfo ringGUI;
@@ -101,9 +101,11 @@ public class ClientProxy extends CommonProxy {
RenderPlayer render;
render = skinMap.get("default");
render.addLayer(new BaubleRenderer());
+ render.addLayer(new LayerTDBipedArmor(render));
render = skinMap.get("slim");
render.addLayer(new BaubleRenderer());
+ render.addLayer(new LayerTDBipedArmor(render));
createToolGuis();
setToolGuis();
@@ -142,6 +144,11 @@ public class ClientProxy extends CommonProxy {
public void registerToolModel(ToolCore tool) {
ModelRegisterUtil.registerToolModel(tool);
}
+
+ @Override
+ public void registerArmorModel(ArmorCore tool) {
+ TDModelRegistar.registerToolModel(tool);
+ }
@Override
public void registerPartModel(ToolPart part) {
@@ -161,17 +168,17 @@ public class ClientProxy extends CommonProxy {
shearsGUI = new ToolBuildGuiInfo(TDTools.shears);
fishingRodGUI = new ToolBuildGuiInfo(TDTools.fishingRod);
- hoodGUI = new ToolBuildGuiInfo(TDTools.hood);
- shawlGUI = new ToolBuildGuiInfo(TDTools.shawl);
- robeGUI = new ToolBuildGuiInfo(TDTools.robe);
- shoesGUI = new ToolBuildGuiInfo(TDTools.shoes);
+ hoodGUI = new ArmorBuildGuiInfo(TDTools.hood);
+ shawlGUI = new ArmorBuildGuiInfo(TDTools.shawl);
+ robeGUI = new ArmorBuildGuiInfo(TDTools.robe);
+ shoesGUI = new ArmorBuildGuiInfo(TDTools.shoes);
- bootsGUI = new ToolBuildGuiInfo(TDTools.boots);
+ //bootsGUI = new ToolBuildGuiInfo(TDTools.boots);
- helmGUI = new ToolBuildGuiInfo(TDTools.helm);
- breastplateGUI = new ToolBuildGuiInfo(TDTools.breastplate);
- grievesGUI = new ToolBuildGuiInfo(TDTools.grieves);
- sabatonsGUI = new ToolBuildGuiInfo(TDTools.sabatons);
+ helmGUI = new ArmorBuildGuiInfo(TDTools.helm);
+ breastplateGUI = new ArmorBuildGuiInfo(TDTools.breastplate);
+ grievesGUI = new ArmorBuildGuiInfo(TDTools.grieves);
+ sabatonsGUI = new ArmorBuildGuiInfo(TDTools.sabatons);
sheatheGUI = new ToolBuildGuiInfo(TDTools.sheathe);
ringGUI = new ToolBuildGuiInfo(TDTools.ring);
@@ -216,9 +223,9 @@ public class ClientProxy extends CommonProxy {
shoesGUI.addSlotPosition(43, 51 + 8);
shoesGUI.addSlotPosition(34, 51 + 8);
- bootsGUI.addSlotPosition(34, 15 + 8);
- bootsGUI.addSlotPosition(43, 33 + 8);
- bootsGUI.addSlotPosition(34, 51 + 8);
+// bootsGUI.addSlotPosition(34, 15 + 8);
+// bootsGUI.addSlotPosition(43, 33 + 8);
+// bootsGUI.addSlotPosition(34, 51 + 8);
shearsGUI.addSlotPosition(34, 15 + 8);
shearsGUI.addSlotPosition(43, 33 + 8);
@@ -247,21 +254,21 @@ public class ClientProxy extends CommonProxy {
TinkerRegistryClient.addToolBuilding(shearsGUI);
TinkerRegistryClient.addToolBuilding(fishingRodGUI);
- TinkerRegistryClient.addToolBuilding(hoodGUI);
- TinkerRegistryClient.addToolBuilding(shawlGUI);
- TinkerRegistryClient.addToolBuilding(robeGUI);
- TinkerRegistryClient.addToolBuilding(shoesGUI);
+ TDClientRegistry.addArmorBuilding(hoodGUI);
+ TDClientRegistry.addArmorBuilding(shawlGUI);
+ TDClientRegistry.addArmorBuilding(robeGUI);
+ TDClientRegistry.addArmorBuilding(shoesGUI);
- TinkerRegistryClient.addToolBuilding(bootsGUI);
+ //TinkerRegistryClient.addToolBuilding(bootsGUI);
TinkerRegistryClient.addToolBuilding(sheatheGUI);
TinkerRegistryClient.addToolBuilding(ringGUI);
TinkerRegistryClient.addToolBuilding(amuletGUI);
- TinkerRegistryClient.addToolBuilding(helmGUI);
- TinkerRegistryClient.addToolBuilding(breastplateGUI);
- TinkerRegistryClient.addToolBuilding(grievesGUI);
- TinkerRegistryClient.addToolBuilding(sabatonsGUI);
+ TDClientRegistry.addArmorBuilding(helmGUI);
+ TDClientRegistry.addArmorBuilding(breastplateGUI);
+ TDClientRegistry.addArmorBuilding(grievesGUI);
+ TDClientRegistry.addArmorBuilding(sabatonsGUI);
}
public void registerPartModels() {
@@ -326,10 +333,10 @@ public class ClientProxy extends CommonProxy {
shoesGUI.addSlotPosition(43, 51 + 8);
shoesGUI.addSlotPosition(34, 51 + 8);
- bootsGUI.positions.clear();
- bootsGUI.addSlotPosition(34, 15 + 8);
- bootsGUI.addSlotPosition(43, 33 + 8);
- bootsGUI.addSlotPosition(34, 51 + 8);
+// bootsGUI.positions.clear();
+// bootsGUI.addSlotPosition(34, 15 + 8);
+// bootsGUI.addSlotPosition(43, 33 + 8);
+// bootsGUI.addSlotPosition(34, 51 + 8);
breastplateGUI.positions.clear();
breastplateGUI.addSlotPosition(34, 15 + 8);
diff --git a/src/main/java/lance5057/tDefense/proxy/CommonProxy.java b/src/main/java/lance5057/tDefense/proxy/CommonProxy.java
index 1830593..dde7d7a 100644
--- a/src/main/java/lance5057/tDefense/proxy/CommonProxy.java
+++ b/src/main/java/lance5057/tDefense/proxy/CommonProxy.java
@@ -2,13 +2,10 @@ package lance5057.tDefense.proxy;
import lance5057.tDefense.Reference;
import lance5057.tDefense.TinkersDefense;
-import lance5057.tDefense.core.tools.armor.straps.ItemStrapsInv;
-import lance5057.tDefense.core.tools.armor.straps.StrapsContainer;
-import lance5057.tDefense.core.tools.armor.straps.StrapsGui;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
-import net.minecraft.util.EnumHand;
import net.minecraft.world.World;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fluids.Fluid;
@@ -46,6 +43,10 @@ public class CommonProxy implements IGuiHandler {
public void registerToolModel(ToolCore tool) {
}
+
+ public void registerArmorModel(ArmorCore tool) {
+
+ }
public void registerPartModel(ToolPart part) {
@@ -63,9 +64,6 @@ public class CommonProxy implements IGuiHandler {
// if(ID == TinkersDefense.GUI_ANVIL_INV)
// return new Container_FinishingAnvil(player.inventory,
// (TileEntity_FinishingAnvil) world.getTileEntity(x, y, z));
- if (ID == TinkersDefense.GUI_STRAPS_INV)
- return new StrapsContainer(player, player.inventory,
- new ItemStrapsInv(player.getHeldItem(EnumHand.MAIN_HAND)));
return null;
}
@@ -78,9 +76,6 @@ public class CommonProxy implements IGuiHandler {
// if(ID == TinkersDefense.GUI_ANVIL_INV)
// return new Gui_FinishingAnvil(player.inventory,
// (TileEntity_FinishingAnvil) world.getTileEntity(x, y, z));
- if (ID == TinkersDefense.GUI_STRAPS_INV)
- return new StrapsGui((StrapsContainer) new StrapsContainer(player, player.inventory,
- new ItemStrapsInv(player.getHeldItem(EnumHand.MAIN_HAND))));
return null;
}
diff --git a/src/main/java/lance5057/tDefense/util/ArmorBuildGuiInfo.java b/src/main/java/lance5057/tDefense/util/ArmorBuildGuiInfo.java
new file mode 100644
index 0000000..a72b9ab
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/ArmorBuildGuiInfo.java
@@ -0,0 +1,48 @@
+package lance5057.tDefense.util;
+
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+import org.lwjgl.util.Point;
+
+import com.google.common.collect.Lists;
+
+import lance5057.tDefense.core.tools.bases.ArmorBase;
+import net.minecraft.item.ItemStack;
+
+public class ArmorBuildGuiInfo {
+
+ @Nonnull
+ public final ItemStack armor;
+ // the positions where the slots are located
+ public final List<Point> positions = Lists.newArrayList();
+
+ public ArmorBuildGuiInfo() {
+ // for repairing
+ this.armor = ItemStack.EMPTY;
+ }
+
+ public ArmorBuildGuiInfo(@Nonnull ArmorBase tool) {
+ this.armor = tool.buildItemForRenderingInGui();
+ }
+
+ public static ArmorBuildGuiInfo default3Part(@Nonnull ArmorBase tool) {
+ ArmorBuildGuiInfo info = new ArmorBuildGuiInfo(tool);
+ info.addSlotPosition(33 - 20, 42 + 20);
+ info.addSlotPosition(33 + 20, 42 - 20);
+ info.addSlotPosition(33, 42);
+ return info;
+ }
+
+ /**
+ * Add another slot at the specified position for the tool.
+ * The positions are usually located between:
+ * X: 7 - 69
+ * Y: 18 - 64
+ */
+ public void addSlotPosition(int x, int y) {
+ positions.add(new Point(x, y));
+ }
+
+} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/util/ArmorBuilder.java b/src/main/java/lance5057/tDefense/util/ArmorBuilder.java
new file mode 100644
index 0000000..94014a6
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/ArmorBuilder.java
@@ -0,0 +1,596 @@
+package lance5057.tDefense.util;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+import org.apache.logging.log4j.Logger;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
+
+import gnu.trove.map.TIntIntMap;
+import gnu.trove.map.hash.TIntIntHashMap;
+import lance5057.tDefense.core.tools.bases.ArmorBase;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
+import net.minecraft.enchantment.Enchantment;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.nbt.NBTTagString;
+import net.minecraft.util.NonNullList;
+import net.minecraft.util.text.translation.I18n;
+import slimeknights.mantle.util.ItemStackList;
+import slimeknights.mantle.util.RecipeMatch;
+import slimeknights.tconstruct.library.TinkerRegistry;
+import slimeknights.tconstruct.library.Util;
+import slimeknights.tconstruct.library.events.TinkerEvent;
+import slimeknights.tconstruct.library.materials.Material;
+import slimeknights.tconstruct.library.modifiers.IModifier;
+import slimeknights.tconstruct.library.modifiers.TinkerGuiException;
+import slimeknights.tconstruct.library.tinkering.IRepairable;
+import slimeknights.tconstruct.library.tinkering.MaterialItem;
+import slimeknights.tconstruct.library.tinkering.PartMaterialType;
+import slimeknights.tconstruct.library.tools.IToolPart;
+import slimeknights.tconstruct.library.tools.Pattern;
+import slimeknights.tconstruct.library.tools.ToolCore;
+import slimeknights.tconstruct.library.traits.AbstractTrait;
+import slimeknights.tconstruct.library.traits.ITrait;
+import slimeknights.tconstruct.library.utils.ListUtil;
+import slimeknights.tconstruct.library.utils.TagUtil;
+import slimeknights.tconstruct.library.utils.Tags;
+import slimeknights.tconstruct.library.utils.TinkerUtil;
+
+public final class ArmorBuilder {
+
+ private static Logger log = Util.getLogger("ArmorBuilder");
+
+ private ArmorBuilder() {
+ }
+
+ @Nonnull
+ public static ItemStack tryBuildTool(NonNullList<ItemStack> stacks, String name) {
+ return tryBuildArmor(stacks, name, TDRegistry.getArmor());
+ }
+
+ /**
+ * Takes an array of Itemstacks and tries to build a tool with it. Amount of itemstacks has to match exactly.
+ *
+ * @param stacks Input.
+ * @return The built tool or null if none could be built.
+ */
+ @Nonnull
+ public static ItemStack tryBuildArmor(NonNullList<ItemStack> stacks, String name, Collection<ArmorCore> possibleTools) {
+ int length = -1;
+ NonNullList<ItemStack> input;
+ // remove trailing empty slots
+ for(int i = 0; i < stacks.size(); i++) {
+ if(stacks.get(i).isEmpty()) {
+ if(length < 0) {
+ length = i;
+ }
+ }
+ else if(length >= 0) {
+ // incorrect input. gap with null in the stacks passed
+ return ItemStack.EMPTY;
+ }
+ }
+
+ if(length < 0) {
+ return ItemStack.EMPTY;
+ }
+
+ input = ItemStackList.of(stacks);
+
+ for(Item item : possibleTools) {
+ if(!(item instanceof ToolCore)) {
+ continue;
+ }
+ ItemStack output = ((ToolCore) item).buildItemFromStacks(input);
+ if(!output.isEmpty()) {
+ // name the item
+ if(name != null && !name.isEmpty()) {
+ output.setStackDisplayName(name);
+ }
+
+ return output;
+ }
+ }
+
+ return ItemStack.EMPTY;
+ }
+
+ /**
+ * Adds the trait to the tag, taking max-count and already existing traits into account.
+ *
+ * @param rootCompound The root compound of the item
+ * @param trait The trait to add.
+ * @param color The color used on the tooltip. Will not be used if the trait already exists on the tool.
+ */
+ public static void addTrait(NBTTagCompound rootCompound, ITrait trait, int color) {
+ // only registered traits allowed
+ if(TinkerRegistry.getTrait(trait.getIdentifier()) == null) {
+ log.error("addTrait: Trying to apply unregistered Trait {}", trait.getIdentifier());
+ return;
+ }
+
+ IModifier modifier = TinkerRegistry.getModifier(trait.getIdentifier());
+
+ if(modifier == null || !(modifier instanceof AbstractTrait)) {
+ log.error("addTrait: No matching modifier for the Trait {} present", trait.getIdentifier());
+ return;
+ }
+
+ AbstractTrait traitModifier = (AbstractTrait) modifier;
+
+ NBTTagCompound tag = new NBTTagCompound();
+ NBTTagList tagList = TagUtil.getModifiersTagList(rootCompound);
+ int index = TinkerUtil.getIndexInList(tagList, traitModifier.getModifierIdentifier());
+ if(index < 0) {
+ traitModifier.updateNBTforTrait(tag, color);
+ tagList.appendTag(tag);
+ TagUtil.setModifiersTagList(rootCompound, tagList);
+ }
+ else {
+ tag = tagList.getCompoundTagAt(index);
+ }
+
+ traitModifier.applyEffect(rootCompound, tag);
+ }
+
+ @Nonnull
+ public static ItemStack tryRepairTool(NonNullList<ItemStack> stacks, ItemStack toolStack, boolean removeItems) {
+ if(toolStack == null || !(toolStack.getItem() instanceof IRepairable)) {
+ return ItemStack.EMPTY;
+ }
+
+ // obtain a working copy of the items if the originals shouldn't be modified
+ if(!removeItems) {
+ stacks = Util.deepCopyFixedNonNullList(stacks);
+ }
+
+ return ((IRepairable) toolStack.getItem()).repair(toolStack, stacks);
+ }
+
+ /**
+ * Takes a tool and an array of itemstacks and tries to modify the tool with those.
+ * If removeItems is true, the items used in the process will be removed from the array.
+ *
+ * @param input Items to modify the tool with
+ * @param toolStack The tool
+ * @param removeItems If true the applied items will be removed from the array
+ * @return The modified tool or null if something went wrong or no modifier applied.
+ * @throws TinkerGuiException Thrown when not matching modifiers could be applied. Contains extra-information why the process failed.
+ */
+ @Nonnull
+ public static ItemStack tryModifyTool(NonNullList<ItemStack> input, ItemStack toolStack, boolean removeItems)
+ throws TinkerGuiException {
+ ItemStack copy = toolStack.copy();
+
+ // obtain a working copy of the items if the originals shouldn't be modified
+ NonNullList<ItemStack> stacks = Util.deepCopyFixedNonNullList(input);
+ NonNullList<ItemStack> usedStacks = Util.deepCopyFixedNonNullList(input);
+
+ Set<IModifier> appliedModifiers = Sets.newHashSet();
+ for(IModifier modifier : TinkerRegistry.getAllModifiers()) {
+ Optional<RecipeMatch.Match> matchOptional;
+ do {
+ matchOptional = modifier.matches(stacks);
+ ItemStack backup = copy.copy();
+
+ // found a modifier that is applicable. Try to apply the match
+ if(matchOptional.isPresent()) {
+ RecipeMatch.Match match = matchOptional.get();
+ // we need to apply the whole match
+ while(match.amount > 0) {
+ TinkerGuiException caughtException = null;
+ boolean canApply = false;
+ try {
+ canApply = modifier.canApply(copy, toolStack);
+ } catch(TinkerGuiException e) {
+ caughtException = e;
+ }
+
+ // but can it be applied?
+ if(canApply) {
+ modifier.apply(copy);
+
+ appliedModifiers.add(modifier);
+ match.amount--;
+ }
+ else {
+ // materials would allow another application, but modifier doesn't
+ // if we have already applied another modifier we cancel the whole thing to prevent situations where
+ // only a part of the modifiers gets applied. either all or none.
+ // if we have a reason, rather tell the player that
+ if(caughtException != null && !appliedModifiers.contains(modifier)) {
+ throw caughtException;
+ }
+
+ copy = backup;
+ RecipeMatch.removeMatch(stacks, match);
+ break;
+ }
+ }
+
+ if(match.amount == 0) {
+ RecipeMatch.removeMatch(stacks, match);
+ RecipeMatch.removeMatch(usedStacks, match);
+ }
+ }
+ } while(matchOptional.isPresent());
+ }
+
+ // check if all itemstacks were touched - otherwise there's an invalid item in the input
+ for(int i = 0; i < input.size(); i++) {
+ if(!input.get(i).isEmpty() && ItemStack.areItemStacksEqual(input.get(i), stacks.get(i))) {
+ if(!appliedModifiers.isEmpty()) {
+ String error = I18n.translateToLocalFormatted("gui.error.no_modifier_for_item", input.get(i).getDisplayName());
+ throw new TinkerGuiException(error);
+ }
+ return ItemStack.EMPTY;
+ }
+ }
+
+ // update output itemstacks
+ if(removeItems) {
+ for(int i = 0; i < input.size(); i++) {
+ // stacks might be null because stacksize got 0 during processing, we have to reflect that in the input
+ // so the caller can identify that
+ if(usedStacks.get(i).isEmpty()) {
+ input.get(i).setCount(0);
+ }
+ else {
+ input.get(i).setCount(usedStacks.get(i).getCount());
+ }
+ }
+ }
+
+ if(!appliedModifiers.isEmpty()) {
+ // always rebuild tinkers items to ensure consistency and find problems earlier
+ if(copy.getItem() instanceof ArmorBase) {
+ NBTTagCompound root = TagUtil.getTagSafe(copy);
+ rebuildArmor(root, (ArmorBase) copy.getItem());
+ copy.setTagCompound(root);
+ }
+ return copy;
+ }
+
+ return ItemStack.EMPTY;
+ }
+
+ /**
+ * Takes a tool and toolparts and replaces the parts inside the tool with the given ones.
+ * Toolparts have to be applicable to the tool. Toolparts must not be duplicates of currently used parts.
+ *
+ * @param toolStack The tool to replace the parts in
+ * @param toolPartsIn The toolparts.
+ * @param removeItems If true the applied items will be removed from the array
+ * @return The tool with the replaced parts or null if the conditions have not been met.
+ */
+ @Nonnull
+ public static ItemStack tryReplaceToolParts(ItemStack toolStack, final NonNullList<ItemStack> toolPartsIn, final boolean removeItems)
+ throws TinkerGuiException {
+ if(toolStack == null || !(toolStack.getItem() instanceof ArmorBase)) {
+ return ItemStack.EMPTY;
+ }
+
+ // we never modify the original. Caller can remove all of them if we return a result
+ NonNullList<ItemStack> inputItems = ItemStackList.of(Util.deepCopyFixedNonNullList(toolPartsIn));
+ if(!TinkerEvent.OnToolPartReplacement.fireEvent(inputItems, toolStack)) {
+ // event cancelled
+ return ItemStack.EMPTY;
+ }
+ // technically we don't need a deep copy here, but meh. less code.
+ final NonNullList<ItemStack> toolParts = Util.deepCopyFixedNonNullList(inputItems);
+
+ TIntIntMap assigned = new TIntIntHashMap();
+ ArmorBase tool = (ArmorBase) toolStack.getItem();
+ // materiallist has to be copied because it affects the actual NBT on the tool if it's changed
+ final NBTTagList materialList = TagUtil.getBaseMaterialsTagList(toolStack).copy();
+
+ // assing each toolpart to a slot in the tool
+ for(int i = 0; i < toolParts.size(); i++) {
+ ItemStack part = toolParts.get(i);
+ if(part.isEmpty()) {
+ continue;
+ }
+ if(!(part.getItem() instanceof IToolPart)) {
+ // invalid item for toolpart replacement
+ return ItemStack.EMPTY;
+ }
+
+ int candidate = -1;
+ // find an applicable slot in the tool structure corresponding to the toolparts position
+ List<PartMaterialType> pms = tool.getRequiredComponents();
+ for(int j = 0; j < pms.size(); j++) {
+ PartMaterialType pmt = pms.get(j);
+ String partMat = ((IToolPart) part.getItem()).getMaterial(part).getIdentifier();
+ String currentMat = materialList.getStringTagAt(j);
+ // is valid and not the same material?
+ if(pmt.isValid(part) && !partMat.equals(currentMat)) {
+ // part not taken up by previous part already?
+ if(!assigned.valueCollection().contains(j)) {
+ candidate = j;
+ // if a tool has multiple of the same parts we may want to replace another one as the currently selected
+ // for that purpose we only allow to overwrite the current selection if the input slot is a later one than the current one
+ if(i <= j) {
+ break;
+ }
+ }
+ }
+ }
+
+ // no assignment found for a part. Invalid input.
+ if(candidate < 0) {
+ return ItemStack.EMPTY;
+ }
+ assigned.put(i, candidate);
+ }
+
+ // did we assign nothing?
+ if(assigned.isEmpty()) {
+ return ItemStack.EMPTY;
+ }
+
+ // We now know which parts to replace with which inputs. Yay. Now we only have to do so.
+ // to do so we simply switch out the materials used and rebuild the tool
+ assigned.forEachEntry((i, j) -> {
+ String mat = ((IToolPart) toolParts.get(i).getItem()).getMaterial(toolParts.get(i)).getIdentifier();
+ materialList.set(j, new NBTTagString(mat));
+ if(removeItems) {
+ if(i < toolPartsIn.size() && !toolPartsIn.get(i).isEmpty()) {
+ toolPartsIn.get(i).shrink(1);
+ }
+ }
+ return true;
+ });
+
+ // check that each material is still compatible with each modifier
+ ArmorBase ArmorBase = (ArmorBase) toolStack.getItem();
+ ItemStack copyToCheck = ArmorBase.buildItem(TinkerUtil.getMaterialsFromTagList(materialList));
+ // this includes traits
+ NBTTagList modifiers = TagUtil.getBaseModifiersTagList(toolStack);
+ for(int i = 0; i < modifiers.tagCount(); i++) {
+ String id = modifiers.getStringTagAt(i);
+ IModifier mod = TinkerRegistry.getModifier(id);
+
+ // will throw an exception if it can't apply
+ if(mod != null && !mod.canApply(copyToCheck, copyToCheck)) {
+ throw new TinkerGuiException();
+ }
+ }
+
+ ItemStack output = toolStack.copy();
+ TagUtil.setBaseMaterialsTagList(output, materialList);
+ NBTTagCompound tag = TagUtil.getTagSafe(output);
+ rebuildArmor(tag, (ArmorBase) output.getItem());
+ output.setTagCompound(tag);
+
+ // check if the output has enough durability. we only allow it if the result would not be broken
+ if(output.getItemDamage() > output.getMaxDamage()) {
+ String error = I18n.translateToLocalFormatted("gui.error.not_enough_durability", output.getItemDamage() - output.getMaxDamage());
+ throw new TinkerGuiException(error);
+ }
+
+ return output;
+ }
+
+ /**
+ * Takes a pattern and itemstacks and crafts the materialitem of the pattern out of it.
+ * The output consists of an ItemStack[2] array that contains the part in the first slot and eventual leftover output in the 2nd one.
+ * The itemstacks have to match at least 1 material.
+ * If multiple materials match, matches with multiple items are preferred.
+ * Otherwise the first match will be taken.
+ *
+ * @param pattern Input-pattern. Has to be a Pattern.
+ * @param materialItems The Itemstacks to craft the item out of
+ * @param removeItems If true the match will be removed from the passed items
+ * @return ItemStack[2] Array containing the built item in the first slot and eventual secondary output in the second one. Null if no item could be built.
+ */
+ public static NonNullList<ItemStack> tryBuildToolPart(ItemStack pattern, NonNullList<ItemStack> materialItems, boolean removeItems)
+ throws TinkerGuiException {
+ Item itemPart = Pattern.getPartFromTag(pattern);
+ if(itemPart == null || !(itemPart instanceof MaterialItem) || !(itemPart instanceof IToolPart)) {
+ String error = I18n.translateToLocalFormatted("gui.error.invalid_pattern");
+ throw new TinkerGuiException(error);
+ }
+
+ IToolPart part = (IToolPart) itemPart;
+
+ if(!removeItems) {
+ materialItems = Util.deepCopyFixedNonNullList(materialItems);
+ }
+
+ // find the material from the input
+ Optional<RecipeMatch.Match> match = Optional.empty();
+ Material foundMaterial = null;
+ for(Material material : TinkerRegistry.getAllMaterials()) {
+ // craftable?
+ if(!material.isCraftable()) {
+ continue;
+ }
+ Optional<RecipeMatch.Match> newMatch = material.matches(materialItems, part.getCost());
+ if(!newMatch.isPresent()) {
+ continue;
+ }
+
+ // we found a match, yay
+ if(!match.isPresent()) {
+ match = newMatch;
+ foundMaterial = material;
+ // is it more complex than the old one?
+ }
+ }
+
+ // nope, no material
+ if(!match.isPresent()) {
+ return null;
+ }
+
+ ItemStack output = ((MaterialItem) itemPart).getItemstackWithMaterial(foundMaterial);
+ if(output.isEmpty()) {
+ return null;
+ }
+ if(output.getItem() instanceof IToolPart && !((IToolPart) output.getItem()).canUseMaterial(foundMaterial)) {
+ return null;
+ }
+
+ RecipeMatch.removeMatch(materialItems, match.get());
+
+ // check if we have secondary output
+ ItemStack secondary = ItemStack.EMPTY;
+ int leftover = (match.get().amount - part.getCost()) / Material.VALUE_Shard;
+ if(leftover > 0) {
+ secondary = TinkerRegistry.getShard(foundMaterial);
+ secondary.setCount(leftover);
+ }
+
+ // build an item with this
+ return ListUtil.getListFrom(output, secondary);
+ }
+
+ /**
+ * Rebuilds a tool from its raw data, material info and applied modifiers
+ *
+ * @param rootNBT The root NBT tag compound of the tool to to rebuild. The NBT will be modified, overwriting old
+ * data.
+ */
+ public static void rebuildArmor(NBTTagCompound rootNBT, ArmorBase armor) throws TinkerGuiException {
+ boolean broken = TagUtil.getToolTag(rootNBT).getBoolean(Tags.BROKEN);
+ // Recalculate tool base stats from material stats
+ NBTTagList materialTag = TagUtil.getBaseMaterialsTagList(rootNBT);
+ List<Material> materials = TinkerUtil.getMaterialsFromTagList(materialTag);
+ List<PartMaterialType> pms = armor.getRequiredComponents();
+
+ // ensure all needed Stats are present
+ while(materials.size() < pms.size()) {
+ materials.add(Material.UNKNOWN);
+ }
+ for(int i = 0; i < pms.size(); i++) {
+ if(!pms.get(i).isValidMaterial(materials.get(i))) {
+ materials.set(i, Material.UNKNOWN);
+ }
+ }
+
+ // the base stats of the tool
+ NBTTagCompound toolTag = armor.buildTag(materials);
+ TagUtil.setToolTag(rootNBT, toolTag);
+ // and its copy for reference
+ rootNBT.setTag(Tags.TOOL_DATA_ORIG, toolTag.copy());
+
+ // save the old modifiers list and clean up all tags that get set by modifiers/traits
+ NBTTagList modifiersTagOld = TagUtil.getModifiersTagList(rootNBT);
+ rootNBT.removeTag(Tags.TOOL_MODIFIERS); // the active-modifiers tag
+ rootNBT.setTag(Tags.TOOL_MODIFIERS, new NBTTagList());
+ rootNBT.removeTag("ench"); // and the enchantments tag
+ rootNBT.removeTag(Tags.ENCHANT_EFFECT); // enchant effect too, will be readded by a trait either way
+
+ // clean up traits
+ rootNBT.removeTag(Tags.TOOL_TRAITS);
+ armor.addMaterialTraits(rootNBT, materials);
+
+ // fire event
+ ArmorEvent.OnItemBuilding.fireEvent(rootNBT, ImmutableList.copyOf(materials), armor);
+
+ // reapply modifiers
+ NBTTagList modifiers = TagUtil.getBaseModifiersTagList(rootNBT);
+ NBTTagList modifiersTag = TagUtil.getModifiersTagList(rootNBT);
+ // copy over and reapply all relevant modifiers
+ for(int i = 0; i < modifiers.tagCount(); i++) {
+ String identifier = modifiers.getStringTagAt(i);
+ IModifier modifier = TinkerRegistry.getModifier(identifier);
+ if(modifier == null) {
+ log.debug("Missing modifier: {}", identifier);
+ continue;
+ }
+
+ NBTTagCompound tag;
+ int index = TinkerUtil.getIndexInList(modifiersTagOld, modifier.getIdentifier());
+
+ if(index >= 0) {
+ tag = modifiersTagOld.getCompoundTagAt(index);
+ }
+ else {
+ tag = new NBTTagCompound();
+ }
+
+ modifier.applyEffect(rootNBT, tag);
+ if(!tag.hasNoTags()) {
+ int indexNew = TinkerUtil.getIndexInList(modifiersTag, modifier.getIdentifier());
+ if(indexNew >= 0) {
+ modifiersTag.set(indexNew, tag);
+ }
+ else {
+ modifiersTag.appendTag(tag);
+ }
+ }
+ }
+
+ // remaining info, get updated toolTag
+ toolTag = TagUtil.getToolTag(rootNBT);
+ // adjust free modifiers
+ int freeModifiers = toolTag.getInteger(Tags.FREE_MODIFIERS);
+ freeModifiers -= TagUtil.getBaseModifiersUsed(rootNBT);
+ toolTag.setInteger(Tags.FREE_MODIFIERS, Math.max(0, freeModifiers));
+
+ // broken?
+ if(broken) {
+ toolTag.setBoolean(Tags.BROKEN, true);
+ }
+
+ TagUtil.setToolTag(rootNBT, toolTag);
+
+ if(freeModifiers < 0) {
+ throw new TinkerGuiException(Util.translateFormatted("gui.error.not_enough_modifiers", -freeModifiers));
+ }
+ }
+
+ public static short getEnchantmentLevel(NBTTagCompound rootTag, Enchantment enchantment) {
+ NBTTagList enchantments = rootTag.getTagList("ench", 10);
+
+ int id = Enchantment.getEnchantmentID(enchantment);
+
+ for(int i = 0; i < enchantments.tagCount(); i++) {
+ if(enchantments.getCompoundTagAt(i).getShort("id") == id) {
+ return enchantments.getCompoundTagAt(i).getShort("lvl");
+ }
+ }
+
+ return 0;
+ }
+
+ public static void addEnchantment(NBTTagCompound rootTag, Enchantment enchantment) {
+ NBTTagList enchantments = rootTag.getTagList("ench", 10);
+
+ NBTTagCompound enchTag = new NBTTagCompound();
+ int enchId = Enchantment.getEnchantmentID(enchantment);
+
+ int id = -1;
+ for(int i = 0; i < enchantments.tagCount(); i++) {
+ if(enchantments.getCompoundTagAt(i).getShort("id") == enchId) {
+ enchTag = enchantments.getCompoundTagAt(i);
+ id = i;
+ break;
+ }
+ }
+
+ int level = enchTag.getShort("lvl") + 1;
+ level = Math.min(level, enchantment.getMaxLevel());
+ enchTag.setShort("id", (short) enchId);
+ enchTag.setShort("lvl", (short) level);
+
+ if(id < 0) {
+ enchantments.appendTag(enchTag);
+ }
+ else {
+ enchantments.set(id, enchTag);
+ }
+
+ rootTag.setTag("ench", enchantments);
+ }
+} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/util/ArmorEvent.java b/src/main/java/lance5057/tDefense/util/ArmorEvent.java
new file mode 100644
index 0000000..d83a930
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/ArmorEvent.java
@@ -0,0 +1,65 @@
+package lance5057.tDefense.util;
+
+import com.google.common.collect.ImmutableList;
+
+import lance5057.tDefense.core.tools.bases.ArmorBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.NonNullList;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.fml.common.eventhandler.Cancelable;
+import net.minecraftforge.fml.common.eventhandler.Event;
+import slimeknights.tconstruct.library.materials.Material;
+
+/**
+ * Base class for all tinkers events
+ */
+public abstract class ArmorEvent extends Event {
+
+ /**
+ * Fired when a tool is built.
+ * This happens every time a tool is loaded as well as when the player actually builds the tool.
+ * You can make changes to the tag compound and it'll land on the resulting tool, but its itemstack is not available.
+ */
+ public static class OnItemBuilding extends ArmorEvent {
+
+ public NBTTagCompound tag;
+ public final ImmutableList<Material> materials;
+ public final ArmorBase tool;
+
+ public OnItemBuilding(NBTTagCompound tag, ImmutableList<Material> materials, ArmorBase tool) {
+ this.tag = tag;
+ this.materials = materials;
+ this.tool = tool;
+ }
+
+ public static OnItemBuilding fireEvent(NBTTagCompound tag, ImmutableList<Material> materials, ArmorBase tool) {
+ OnItemBuilding event = new OnItemBuilding(tag, materials, tool);
+ MinecraftForge.EVENT_BUS.post(event);
+ return event;
+ }
+ }
+
+ /**
+ * Fired when the player tries to replace a toolpart.
+ * You can modify the input items to achieve different results, this will not modify the actual items in the game.
+ * If you're modifying the list itself, make sure to put new items into originally empty indices to prevent the usage of other items in the input. Just append to the list.
+ * You can not modify the tool that's getting modified
+ */
+ @Cancelable
+ public static class OnToolPartReplacement extends ArmorEvent {
+
+ /** The items in the tool station. Can be manipulated. */
+ public NonNullList<ItemStack> replacementParts;
+ public ItemStack toolStack;
+
+ public OnToolPartReplacement(NonNullList<ItemStack> replacementParts, ItemStack toolStack) {
+ this.replacementParts = replacementParts;
+ this.toolStack = toolStack.copy();
+ }
+
+ public static boolean fireEvent(NonNullList<ItemStack> replacementParts, ItemStack toolStack) {
+ return !MinecraftForge.EVENT_BUS.post(new OnToolPartReplacement(replacementParts, toolStack));
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/util/TDClientRegistry.java b/src/main/java/lance5057/tDefense/util/TDClientRegistry.java
new file mode 100644
index 0000000..8fd47a1
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/TDClientRegistry.java
@@ -0,0 +1,48 @@
+package lance5057.tDefense.util;
+
+import com.google.common.collect.Maps;
+
+import net.minecraft.item.Item;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+import org.apache.logging.log4j.Logger;
+
+import java.util.Map;
+
+import slimeknights.tconstruct.library.Util;
+import slimeknights.tconstruct.library.client.ToolBuildGuiInfo;
+import slimeknights.tconstruct.library.client.texture.AbstractColoredTexture;
+
+@SideOnly(Side.CLIENT)
+public final class TDClientRegistry {
+
+ // the logger for the library
+ public static final Logger log = Util.getLogger("API-Client");
+
+ private TDClientRegistry() {
+ }
+
+ /*---------------------------------------------------------------------------
+ | GUI & CRAFTING |
+ ---------------------------------------------------------------------------*/
+ private static final Map<Item, ArmorBuildGuiInfo> armorBuildInfo = Maps.newLinkedHashMap();
+
+ public static void addArmorBuilding(ArmorBuildGuiInfo info) {
+ armorBuildInfo.put(info.armor.getItem(), info);
+ }
+
+ public static ArmorBuildGuiInfo getArmorBuildInfoForArmor(Item armor) {
+ return armorBuildInfo.get(armor);
+ }
+
+ public static void clear() {
+ armorBuildInfo.clear();
+ }
+
+ /*---------------------------------------------------------------------------
+ | MATERIAL TEXTURE CREATION |
+ ---------------------------------------------------------------------------*/
+ private static final Map<String, AbstractColoredTexture> textureProcessors = Maps.newHashMap();
+
+} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/util/TDModelLoader.java b/src/main/java/lance5057/tDefense/util/TDModelLoader.java
new file mode 100644
index 0000000..5ecdacf
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/TDModelLoader.java
@@ -0,0 +1,204 @@
+package lance5057.tDefense.util;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Nonnull;
+
+import org.apache.commons.io.FilenameUtils;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
+import gnu.trove.map.hash.TIntObjectHashMap;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
+import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
+import net.minecraft.client.resources.IResourceManager;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.ICustomModelLoader;
+import net.minecraftforge.client.model.IModel;
+import net.minecraftforge.client.model.ModelLoaderRegistry;
+import net.minecraftforge.common.model.TRSRTransformation;
+import slimeknights.tconstruct.library.TinkerRegistry;
+import slimeknights.tconstruct.library.client.CustomTextureCreator;
+import slimeknights.tconstruct.library.client.model.MaterialModel;
+import slimeknights.tconstruct.library.client.model.MaterialModelLoader;
+import slimeknights.tconstruct.library.client.model.ModelHelper;
+import slimeknights.tconstruct.library.client.model.ModifierModel;
+import slimeknights.tconstruct.library.client.model.ModifierModelLoader;
+import slimeknights.tconstruct.library.client.model.ToolModel;
+import slimeknights.tconstruct.library.client.model.format.AmmoPosition;
+import slimeknights.tconstruct.library.client.model.format.ToolModelOverride;
+import slimeknights.tconstruct.library.tools.IToolPart;
+
+public class TDModelLoader implements ICustomModelLoader {
+
+ public static String EXTENSION = ".td";
+
+ // used to create only actually needed textures in the texturegenerator instead of ALL materials for all parts
+ private static final Map<ResourceLocation, ArmorCore> modelItemMap = Maps.newHashMap();
+
+ public static void addPartMapping(ResourceLocation resourceLocation, ArmorCore tool) {
+ modelItemMap.put(resourceLocation, tool);
+ }
+
+ @Override
+ public boolean accepts(ResourceLocation modelLocation) {
+ return modelLocation.getResourcePath().endsWith(EXTENSION); // tinkertoolmodel extension. Foo.tcon.json
+ }
+
+ @Override
+ public IModel loadModel(ResourceLocation modelLocation) {
+ try {
+ // Modelblock is used since our format is compatible to the vanilla format
+ // and we don't have to write our own json deserializer
+ // it also provides us with the textures
+ Map<String, String> textures = ModelHelper.loadTexturesFromJson(modelLocation);
+ ImmutableMap<ItemCameraTransforms.TransformType, TRSRTransformation> transforms = ModelHelper.loadTransformFromJson(modelLocation);
+ ImmutableList<ToolModelOverride> overrides = ModelHelper.loadToolModelOverridesFromJson(modelLocation);
+ AmmoPosition ammoPosition = ModelHelper.loadAmmoPositionFromJson(modelLocation);
+ Float[] rotations = ModelHelper.loadLayerRotations(modelLocation);
+
+ if(rotations.length > 0 && textures.size() != rotations.length) {
+ TinkerRegistry.log.error("Toolmodel {} has invalid layerrotation entry: Size should be {} but is {}; Skipping rotations.", modelLocation, textures.size(), rotations.length);
+ rotations = new Float[0];
+ }
+
+ ImmutableList.Builder<ResourceLocation> defaultTextureListBuilder = ImmutableList.builder();
+ List<MaterialModel> parts = Lists.newArrayList();
+ List<MaterialModel> brokenParts = Lists.newArrayList();
+
+ ArmorCore ArmorCore = modelItemMap.get(MaterialModelLoader.getReducedPath(modelLocation));
+
+ for(Map.Entry<String, String> entry : textures.entrySet()) {
+ String name = entry.getKey();
+ try {
+ int i;
+ List<MaterialModel> listToAdd;
+
+ if(name.startsWith("layer")) {
+ i = Integer.valueOf(name.substring(5));
+ listToAdd = parts;
+ }
+ else if(name.startsWith("broken")) {
+ i = Integer.valueOf(name.substring(6));
+ listToAdd = brokenParts;
+ }
+ // invalid entry, ignore
+ else {
+ TinkerRegistry.log.warn("Toolmodel {} has invalid texture entry {}; Skipping layer.", modelLocation, name);
+ continue;
+ }
+
+ ResourceLocation location = new ResourceLocation(entry.getValue());
+ MaterialModel partModel = new MaterialModel(ImmutableList.of(location));
+ while(listToAdd.size() <= i) {
+ listToAdd.add(null);
+ }
+ listToAdd.set(i, partModel);
+
+ defaultTextureListBuilder.add(location);
+ registerCustomTextures(i, location, ArmorCore);
+ } catch(NumberFormatException e) {
+ TinkerRegistry.log.error("Toolmodel {} has invalid texture entry {}; Skipping layer.", modelLocation, name);
+ }
+ }
+
+ // create overrides
+ for(ToolModelOverride override : overrides) {
+ for(Map.Entry<String, String> entry : override.textures.entrySet()) {
+ String name = entry.getKey();
+ try {
+ int i;
+ TIntObjectHashMap<MaterialModel> mapToAdd;
+
+ if(name.startsWith("layer")) {
+ i = Integer.valueOf(name.substring(5));
+ mapToAdd = override.partModelReplacement;
+ }
+ else if(name.startsWith("broken")) {
+ i = Integer.valueOf(name.substring(6));
+ mapToAdd = override.brokenPartModelReplacement;
+ }
+ // invalid entry, ignore
+ else {
+ TinkerRegistry.log.warn("Toolmodel {} has invalid texture override entry {}; Skipping layer.", modelLocation, name);
+ continue;
+ }
+
+ ResourceLocation location = new ResourceLocation(entry.getValue());
+ MaterialModel partModel = new MaterialModel(ImmutableList.of(location));
+ mapToAdd.put(i, partModel);
+
+ registerCustomTextures(i, location, ArmorCore);
+ } catch(NumberFormatException e) {
+ TinkerRegistry.log.error("Toolmodel {} has invalid texture entry {}; Skipping layer.", modelLocation, name);
+ }
+ }
+ }
+
+ // remove models/item/ and .tcon
+ String toolName = FilenameUtils.removeExtension(modelLocation.getResourcePath().substring(12));
+ IModel mods;
+ ModifierModel modifiers = null;
+ try {
+ mods = ModelLoaderRegistry.getModel(ModifierModelLoader.getLocationForToolModifiers(modelLocation.getResourceDomain(), toolName));
+
+ if(mods == null || !(mods instanceof ModifierModel)) {
+ TinkerRegistry.log.trace(
+ "Toolmodel {} does not have any modifiers associated with it. Be sure that the Tools internal name, the Toolmodels filename and the name used inside the Modifier Model Definition match!",
+ modelLocation);
+ }
+ else {
+ modifiers = (ModifierModel) mods;
+
+ for(ToolModelOverride toolModelOverride : overrides) {
+ if(toolModelOverride.modifierSuffix != null) {
+ String modifierName = toolName + toolModelOverride.modifierSuffix;
+ IModel extraModel = ModelLoaderRegistry.getModel(ModifierModelLoader.getLocationForToolModifiers(modelLocation.getResourceDomain(), modifierName));
+ if(extraModel instanceof ModifierModel) {
+ ModifierModel overriddenModifierModel = new ModifierModel();
+ // fill in non-overridden modifiers
+ for(Map.Entry<String, String> entry : modifiers.getModels().entrySet()) {
+ overriddenModifierModel.addModelForModifier(entry.getKey(), entry.getValue());
+ }
+ // overwrite overridden modifiers
+ for(Map.Entry<String, String> entry : ((ModifierModel) extraModel).getModels().entrySet()) {
+ overriddenModifierModel.addModelForModifier(entry.getKey(), entry.getValue());
+ }
+ toolModelOverride.overrideModifierModel = overriddenModifierModel;
+ }
+ }
+ }
+ }
+ } catch(Exception e) {
+ TinkerRegistry.log.error(e);
+ modifiers = null;
+ }
+
+ return new ToolModel(defaultTextureListBuilder.build(), parts, brokenParts, rotations, modifiers, transforms, overrides, ammoPosition);
+ } catch(IOException e) {
+ TinkerRegistry.log.error("Could not load multimodel {}", modelLocation.toString());
+ }
+ return ModelLoaderRegistry.getMissingModel();
+ }
+
+ private void registerCustomTextures(int i, ResourceLocation resourceLocation, ArmorCore ArmorCore) {
+ if(ArmorCore == null) {
+ CustomTextureCreator.registerTexture(resourceLocation);
+ }
+ else {
+ for(IToolPart part : ArmorCore.getRequiredComponents().get(i).getPossibleParts()) {
+ CustomTextureCreator.registerTextureForPart(resourceLocation, part);
+ }
+ }
+ }
+
+ @Override
+ public void onResourceManagerReload(@Nonnull IResourceManager resourceManager) {
+
+ }
+} \ No newline at end of file
diff --git a/src/main/java/lance5057/tDefense/util/TDModelRegistar.java b/src/main/java/lance5057/tDefense/util/TDModelRegistar.java
new file mode 100644
index 0000000..ad628b0
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/TDModelRegistar.java
@@ -0,0 +1,62 @@
+package lance5057.tDefense.util;
+
+import javax.annotation.Nonnull;
+
+import lance5057.tDefense.core.tools.bases.ArmorCore;
+import net.minecraft.client.renderer.ItemMeshDefinition;
+import net.minecraft.client.renderer.block.model.ModelResourceLocation;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.ModelLoader;
+import slimeknights.tconstruct.TConstruct;
+import slimeknights.tconstruct.library.client.model.ToolModelLoader;
+import slimeknights.tconstruct.library.tools.ToolCore;
+
+public class TDModelRegistar {
+ public static ResourceLocation registerToolModel(ArmorCore armor) {
+ if (armor == null || armor.getRegistryName() == null) {
+ return null;
+ }
+ ResourceLocation itemLocation = armor.getRegistryName();
+ String path = "tools/" + itemLocation.getResourcePath() + ToolModelLoader.EXTENSION;
+
+ ResourceLocation location = new ResourceLocation(itemLocation.getResourceDomain(), path);
+ TDModelLoader.addPartMapping(location, armor);
+
+ return registerToolModel(armor, location);
+ }
+
+ /**
+ * Manual registration of a tool model. You probably shouldn't be using this.
+ */
+ public static ResourceLocation registerToolModel(Item item, final ResourceLocation location) {
+ if (!location.getResourcePath().endsWith(ToolModelLoader.EXTENSION)) {
+ TConstruct.log.error("The material-model " + location.toString() + " does not end with '"
+ + ToolModelLoader.EXTENSION + "' and will therefore not be loaded by the custom model loader!");
+ }
+
+ return registerIt(item, location);
+ }
+
+ private static ResourceLocation registerIt(Item item, final ResourceLocation location) {
+ // plop it in.
+ // This here is needed for the model to be found ingame when the game looks for
+ // a model to render an Itemstack
+ // we use an ItemMeshDefinition because it allows us to do it no matter what
+ // metadata we use
+ ModelLoader.setCustomMeshDefinition(item, new ItemMeshDefinition() {
+ @Nonnull
+ @Override
+ public ModelResourceLocation getModelLocation(@Nonnull ItemStack stack) {
+ return new ModelResourceLocation(location, "inventory");
+ }
+ });
+
+ // We have to readd the default variant if we have custom variants, since it
+ // wont be added otherwise and therefore not loaded
+ ModelLoader.registerItemVariants(item, location);
+
+ return location;
+ }
+}
diff --git a/src/main/java/lance5057/tDefense/util/TDRegistry.java b/src/main/java/lance5057/tDefense/util/TDRegistry.java
new file mode 100644
index 0000000..87fed5b
--- /dev/null
+++ b/src/main/java/lance5057/tDefense/util/TDRegistry.java
@@ -0,0 +1,58 @@
+package lance5057.tDefense.util;
+
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+
+import gnu.trove.set.hash.TLinkedHashSet;
+import lance5057.tDefense.core.tools.bases.ArmorCore;
+import slimeknights.tconstruct.library.TinkerRegistry;
+import slimeknights.tconstruct.library.tinkering.PartMaterialType;
+import slimeknights.tconstruct.library.tools.IToolPart;
+import slimeknights.tconstruct.library.tools.ToolCore;
+
+public class TDRegistry {
+ private static final Set<ArmorCore> armor = new TLinkedHashSet<>();
+ private static final Set<IToolPart> armorParts = new TLinkedHashSet<>();
+ private static final Set<ArmorCore> armorStationCrafting = Sets.newLinkedHashSet();
+ private static final Set<ArmorCore> armorForgeCrafting = Sets.newLinkedHashSet();
+
+ public static void registerTool(ArmorCore tool) {
+ armor.add(tool);
+
+ for(PartMaterialType pmt : tool.getRequiredComponents()) {
+ for(IToolPart tp : pmt.getPossibleParts()) {
+ TinkerRegistry.registerToolPart(tp);
+ }
+ }
+ }
+
+ /** Adds a armor to the Crafting UI of both the armor Station as well as the armor Forge */
+ public static void registerArmorCrafting(ArmorCore armor) {
+ registerArmorStationCrafting(armor);
+ registerArmorForgeCrafting(armor);
+ }
+
+ /** Adds a armor to the Crafting UI of the armor Station */
+ public static void registerArmorStationCrafting(ArmorCore armor) {
+ armorStationCrafting.add(armor);
+ }
+
+ public static ImmutableSet<ArmorCore> getArmorStationCrafting() {
+ return ImmutableSet.copyOf(armorStationCrafting);
+ }
+
+ /** Adds a armor to the Crafting UI of the armor Forge */
+ public static void registerArmorForgeCrafting(ArmorCore armor) {
+ armorForgeCrafting.add(armor);
+ }
+
+ public static ImmutableSet<ArmorCore> getArmorForgeCrafting() {
+ return ImmutableSet.copyOf(armorForgeCrafting);
+ }
+
+ public static Set<ArmorCore> getArmor() {
+ return ImmutableSet.copyOf(armor);
+ }
+}
diff --git a/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_chain.png b/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_chain.png
index 15fe2bb..38b7dd9 100644
--- a/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_chain.png
+++ b/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_chain.png
Binary files differ
diff --git a/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_top.png b/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_top.png
index 1cf7bb2..2b7bac6 100644
--- a/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_top.png
+++ b/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_top.png
Binary files differ
diff --git a/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_visor.png b/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_visor.png
index fed10d6..a3db328 100644
--- a/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_visor.png
+++ b/src/main/resources/assets/tinkersdefense/textures/armor/Helm/_helm_visor.png
Binary files differ
diff --git a/src/main/resources/assets/tinkersdefense/textures/armor/helm/_helm_plate.png b/src/main/resources/assets/tinkersdefense/textures/armor/helm/_helm_plate.png
index f29fea3..f8ee03f 100644
--- a/src/main/resources/assets/tinkersdefense/textures/armor/helm/_helm_plate.png
+++ b/src/main/resources/assets/tinkersdefense/textures/armor/helm/_helm_plate.png
Binary files differ