From d359e6b46baae81b4cca4d29524c5ee161728dba Mon Sep 17 00:00:00 2001 From: Calclavia Date: Thu, 6 Feb 2014 15:14:17 +0800 Subject: [PATCH] Polished gear placement, grid now renders for gear placing --- .../core/MicroblockHighlightHandler.java | 36 +++++++++++++ .../core/ResonantInduction.java | 3 +- .../mechanical/gear/ItemGear.java | 32 +++++------ .../mechanical/gear/RenderGear.java | 53 ++++++++----------- .../mechanical/network/PartMechanical.java | 2 +- 5 files changed, 73 insertions(+), 53 deletions(-) create mode 100644 src/main/java/resonantinduction/core/MicroblockHighlightHandler.java diff --git a/src/main/java/resonantinduction/core/MicroblockHighlightHandler.java b/src/main/java/resonantinduction/core/MicroblockHighlightHandler.java new file mode 100644 index 00000000..83c986a0 --- /dev/null +++ b/src/main/java/resonantinduction/core/MicroblockHighlightHandler.java @@ -0,0 +1,36 @@ +package resonantinduction.core; + +import net.minecraft.util.EnumMovingObjectType; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; +import net.minecraftforge.event.ForgeSubscribe; + +import org.lwjgl.opengl.GL11; + +import calclavia.lib.render.RenderUtility; +import resonantinduction.mechanical.Mechanical; +import resonantinduction.mechanical.gear.RenderGear; +import codechicken.lib.render.CCRenderState; +import codechicken.lib.render.RenderUtils; +import codechicken.lib.render.TextureUtils; +import codechicken.lib.vec.Vector3; +import codechicken.microblock.FacePlacementGrid$; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class MicroblockHighlightHandler +{ + @ForgeSubscribe + @SideOnly(Side.CLIENT) + public void drawBlockHighlight(DrawBlockHighlightEvent event) + { + if (event.currentItem != null && event.currentItem.getItem() == Mechanical.itemGear && event.target != null && event.target.typeOfHit == EnumMovingObjectType.TILE) + { + GL11.glPushMatrix(); + RenderUtils.translateToWorldCoords(event.player, event.partialTicks); + Vector3 hit = new Vector3(event.target.hitVec); + FacePlacementGrid$.MODULE$.render(hit, event.target.sideHit); + event.setCanceled(true); + GL11.glPopMatrix(); + } + } +} diff --git a/src/main/java/resonantinduction/core/ResonantInduction.java b/src/main/java/resonantinduction/core/ResonantInduction.java index 8d917c54..5078dd65 100644 --- a/src/main/java/resonantinduction/core/ResonantInduction.java +++ b/src/main/java/resonantinduction/core/ResonantInduction.java @@ -96,7 +96,8 @@ public class ResonantInduction // Register Forge Events MinecraftForge.EVENT_BUS.register(ResourceGenerator.INSTANCE); MinecraftForge.EVENT_BUS.register(new TextureHookHandler()); - + MinecraftForge.EVENT_BUS.register(new MicroblockHighlightHandler()); + /** * Melting dusts */ diff --git a/src/main/java/resonantinduction/mechanical/gear/ItemGear.java b/src/main/java/resonantinduction/mechanical/gear/ItemGear.java index 48787e09..60f416c6 100644 --- a/src/main/java/resonantinduction/mechanical/gear/ItemGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/ItemGear.java @@ -8,10 +8,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; -import resonantinduction.core.Settings; import codechicken.lib.vec.BlockCoord; import codechicken.lib.vec.Vector3; -import codechicken.multipart.ControlKeyModifer; +import codechicken.microblock.FacePlacementGrid$; import codechicken.multipart.JItemMultiPart; import codechicken.multipart.MultiPartRegistry; import codechicken.multipart.PartMap; @@ -36,30 +35,23 @@ public class ItemGear extends JItemMultiPart public TMultiPart newPart(ItemStack itemStack, EntityPlayer player, World world, BlockCoord pos, int side, Vector3 hit) { PartGear part = (PartGear) MultiPartRegistry.createPart("resonant_induction_gear", false); + side = FacePlacementGrid$.MODULE$.getHitSlot(hit, side); - if (part != null) + TileEntity tile = world.getBlockTileEntity(pos.x, pos.y, pos.z); + + if (tile instanceof TileMultipart) { - if (ControlKeyModifer.isControlDown(player)) - pos.offset(side ^ 1, -1); - - TileEntity tile = world.getBlockTileEntity(pos.x, pos.y, pos.z); - - if (tile instanceof TileMultipart) + TMultiPart occupyingPart = ((TileMultipart) tile).partMap(side); + TMultiPart centerPart = ((TileMultipart) tile).partMap(PartMap.CENTER.ordinal()); + boolean clickedCenter = hit.mag() < 1; + + if ((clickedCenter && centerPart instanceof PartGearShaft)) { - TMultiPart occupyingPart = ((TileMultipart) tile).partMap(side); - TMultiPart centerPart = ((TileMultipart) tile).partMap(PartMap.CENTER.ordinal()); - - boolean clickedCenter = hit.mag() < 1; - - if ((clickedCenter && centerPart instanceof PartGearShaft)) - { - side = ForgeDirection.getOrientation(side).getOpposite().ordinal(); - } + side ^= 1; } - - part.preparePlacement(side, itemStack.getItemDamage()); } + part.preparePlacement(side, itemStack.getItemDamage()); return part; } diff --git a/src/main/java/resonantinduction/mechanical/gear/RenderGear.java b/src/main/java/resonantinduction/mechanical/gear/RenderGear.java index 39cf3862..e9d61d52 100644 --- a/src/main/java/resonantinduction/mechanical/gear/RenderGear.java +++ b/src/main/java/resonantinduction/mechanical/gear/RenderGear.java @@ -4,6 +4,7 @@ import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; +import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; @@ -18,10 +19,9 @@ public class RenderGear public static final RenderGear INSTANCE = new RenderGear(); public final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "gears.obj"); - public void renderInventory(Block block, int metadata, int modelID, RenderBlocks renderer) + public void renderGear(int side, int tier, boolean isLarge, double angle) { - GL11.glRotatef(90, 1, 0, 0); - switch (metadata) + switch (tier) { default: RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "planks_oak.png"); @@ -33,7 +33,24 @@ public class RenderGear RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "iron_block.png"); break; } - MODEL.renderOnly("SmallGear"); + + RenderUtility.rotateFaceBlockToSide(ForgeDirection.getOrientation(side)); + GL11.glRotated(angle, 0, 1, 0); + + if (isLarge) + { + MODEL.renderOnly("LargeGear"); + } + else + { + MODEL.renderOnly("SmallGear"); + } + } + + public void renderInventory(Block block, int metadata, int modelID, RenderBlocks renderer) + { + GL11.glRotatef(90, 1, 0, 0); + renderGear(-1, metadata, false, 0); } public void renderDynamic(PartGear part, double x, double y, double z, int tier) @@ -44,33 +61,7 @@ public class RenderGear // Center the model first. GL11.glTranslatef((float) x + 0.5f, (float) y + 0.5f, (float) z + 0.5f); GL11.glPushMatrix(); - - RenderUtility.rotateFaceBlockToSide(part.placementSide); - - GL11.glRotatef((float) Math.toDegrees(part.angle), 0, 1, 0); - - switch (tier) - { - default: - RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "planks_oak.png"); - break; - case 1: - RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "cobblestone.png"); - break; - case 2: - RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "iron_block.png"); - break; - } - - if (part.getMultiBlock().isConstructed()) - { - MODEL.renderOnly("LargeGear"); - } - else - { - MODEL.renderOnly("SmallGear"); - } - + renderGear(part.placementSide.ordinal(), part.tier, part.getMultiBlock().isConstructed(), Math.toDegrees(part.angle)); GL11.glPopMatrix(); GL11.glPopMatrix(); } diff --git a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java index dc0447bb..944d5cf4 100644 --- a/src/main/java/resonantinduction/mechanical/network/PartMechanical.java +++ b/src/main/java/resonantinduction/mechanical/network/PartMechanical.java @@ -49,7 +49,7 @@ public abstract class PartMechanical extends JCuboidPart implements JNormalOcclu public void preparePlacement(int side, int itemDamage) { - this.placementSide = ForgeDirection.getOrientation((byte) (side ^ 1)); + this.placementSide = ForgeDirection.getOrientation((byte) (side)); this.tier = itemDamage; }