Polished gear placement, grid now renders for gear placing

This commit is contained in:
Calclavia 2014-02-06 15:14:17 +08:00
parent 506e3bbeba
commit d359e6b46b
5 changed files with 73 additions and 53 deletions

View file

@ -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();
}
}
}

View file

@ -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
*/

View file

@ -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;
}

View file

@ -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();
}

View file

@ -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;
}