Implement a functioning Blood Tank (#969)
Added a search bar to the Upgrade Tomes Creative Tab Updated some Altar fluid code (remove deprecated stuff) Moved Rendering classes into appropriate package Fix the localization errors on the Demon Crystals A few cleanups here and there
This commit is contained in:
parent
d1f4e95a7e
commit
aac2623440
40 changed files with 929 additions and 249 deletions
|
@ -1,4 +1,4 @@
|
|||
package WayofTime.bloodmagic.client.render;
|
||||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import WayofTime.bloodmagic.api.alchemyCrafting.AlchemyCircleRenderer;
|
||||
import WayofTime.bloodmagic.api.registry.AlchemyArrayRecipeRegistry;
|
|
@ -1,4 +1,4 @@
|
|||
package WayofTime.bloodmagic.client.render;
|
||||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import WayofTime.bloodmagic.api.altar.AltarComponent;
|
||||
import WayofTime.bloodmagic.api.altar.EnumAltarTier;
|
||||
|
@ -38,7 +38,8 @@ public class RenderAltar extends TileEntitySpecialRenderer<TileAltar>
|
|||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(x, y, z);
|
||||
this.renderFluid(getWorld(), level);
|
||||
if (level > 0)
|
||||
this.renderFluid(getWorld(), level);
|
||||
this.renderItem(tileAltar.getWorld(), inputStack, partialTicks);
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
|
@ -173,7 +174,7 @@ public class RenderAltar extends TileEntitySpecialRenderer<TileAltar>
|
|||
break;
|
||||
}
|
||||
|
||||
RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ, world);
|
||||
RenderFakeBlocks.drawFakeBlock(texture, minX, minY, minZ);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import WayofTime.bloodmagic.tile.TileBloodTank;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.RenderHelper;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.renderer.texture.TextureMap;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
|
||||
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
import org.lwjgl.opengl.GL11;
|
||||
|
||||
@SideOnly(Side.CLIENT)
|
||||
public class RenderBloodTank extends TileEntitySpecialRenderer<TileBloodTank>
|
||||
{
|
||||
private static final Minecraft mc = Minecraft.getMinecraft();
|
||||
|
||||
@Override
|
||||
public void renderTileEntityAt(TileBloodTank bloodTank, double x, double y, double z, float partialTicks, int destroyStage)
|
||||
{
|
||||
if (bloodTank == null)
|
||||
return;
|
||||
|
||||
Fluid renderFluid = bloodTank.getClientRenderFluid();
|
||||
if (bloodTank.getRenderHeight() == 0 || renderFluid == null)
|
||||
return;
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
|
||||
bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
|
||||
|
||||
renderFluid(bloodTank.getRenderHeight(), renderFluid, x, y, z);
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
|
||||
public void renderFluid(float scale, Fluid renderFluid, double x, double y, double z)
|
||||
{
|
||||
GlStateManager.translate(x, y, z);
|
||||
RenderHelper.disableStandardItemLighting();
|
||||
|
||||
GlStateManager.disableRescaleNormal();
|
||||
GlStateManager.disableBlend();
|
||||
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
VertexBuffer buffer = tessellator.getBuffer();
|
||||
|
||||
TextureAtlasSprite fluid = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(renderFluid.getStill().toString());
|
||||
fluid = fluid == null ? mc.getTextureMapBlocks().getMissingSprite() : fluid;
|
||||
|
||||
buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR);
|
||||
|
||||
final int rgbaColor = renderFluid.getColor();
|
||||
final int rColor = rgbaColor >> 16 & 0xFF;
|
||||
final int gColor = rgbaColor >> 8 & 0xFF;
|
||||
final int bColor = rgbaColor & 0xFF;
|
||||
final int aColor = rgbaColor >> 24 & 0xFF;
|
||||
GlStateManager.enableBlend();
|
||||
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
|
||||
GlStateManager.color(rColor, gColor, bColor, aColor);
|
||||
|
||||
float u1 = fluid.getMinU();
|
||||
float v1 = fluid.getMinV();
|
||||
float u2 = fluid.getMaxU();
|
||||
float v2 = fluid.getMaxV();
|
||||
|
||||
if (scale > 0)
|
||||
{
|
||||
float edge = 0.9375F;
|
||||
float otherEdge = 0.0625F;
|
||||
float offset = 0.002F;
|
||||
|
||||
// Top
|
||||
buffer.pos(0, scale - offset, 0).tex(u1, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, scale - offset, 1).tex(u1, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1, scale - offset, 1).tex(u2, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1, scale - offset, 0).tex(u2, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
|
||||
// Bottom
|
||||
buffer.pos(1, offset, 0).tex(u1, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1, offset, 1).tex(u1, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, offset, 1).tex(u2, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, offset, 0).tex(u2, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
|
||||
if (scale > otherEdge)
|
||||
{
|
||||
if (scale > edge)
|
||||
scale = edge;
|
||||
|
||||
v2 -= (fluid.getMaxV() - fluid.getMinV()) * (1 - scale);
|
||||
|
||||
//NORTH
|
||||
buffer.pos(1, scale, offset).tex(u1, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1, 0, offset).tex(u1, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, 0, offset).tex(u2, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, scale, offset).tex(u2, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
|
||||
//EAST
|
||||
buffer.pos(offset, 0, 1).tex(u1, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(offset, scale, 1).tex(u1, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(offset, scale, 0).tex(u2, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(offset, 0, 0).tex(u2, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
|
||||
//SOUTH
|
||||
buffer.pos(1, 0, 1 - offset).tex(u1, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1, scale, 1 - offset).tex(u1, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, scale, 1 - offset).tex(u2, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(0, 0, 1 - offset).tex(u2, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
|
||||
//WEST
|
||||
buffer.pos(1 - offset, scale, 1).tex(u1, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1 - offset, 0, 1).tex(u1, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1 - offset, 0, 0).tex(u2, v2).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
buffer.pos(1 - offset, scale, 0).tex(u2, v1).color(rColor, gColor, bColor, aColor).endVertex();
|
||||
}
|
||||
}
|
||||
tessellator.draw();
|
||||
|
||||
RenderHelper.enableStandardItemLighting();
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package WayofTime.bloodmagic.client.render;
|
||||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import WayofTime.bloodmagic.tile.TileDemonCrucible;
|
||||
import net.minecraft.client.Minecraft;
|
|
@ -1,4 +1,4 @@
|
|||
package WayofTime.bloodmagic.client.render;
|
||||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
|
@ -11,7 +11,7 @@ import org.lwjgl.opengl.GL11;
|
|||
|
||||
public class RenderFakeBlocks
|
||||
{
|
||||
public static void drawFakeBlock(TextureAtlasSprite texture, double minX, double minY, double minZ, World world)
|
||||
public static void drawFakeBlock(TextureAtlasSprite texture, double minX, double minY, double minZ)
|
||||
{
|
||||
if (texture == null)
|
||||
return;
|
|
@ -1,4 +1,4 @@
|
|||
package WayofTime.bloodmagic.client.render;
|
||||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import WayofTime.bloodmagic.ConfigHandler;
|
||||
import WayofTime.bloodmagic.api.Constants;
|
|
@ -0,0 +1,7 @@
|
|||
@ParametersAreNonnullByDefault
|
||||
@MethodsReturnNonnullByDefault
|
||||
package WayofTime.bloodmagic.client.render.block;
|
||||
|
||||
import mcp.MethodsReturnNonnullByDefault;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
|
@ -0,0 +1,205 @@
|
|||
package WayofTime.bloodmagic.client.render.model;
|
||||
|
||||
import WayofTime.bloodmagic.api.Constants;
|
||||
import WayofTime.bloodmagic.block.BlockBloodTank;
|
||||
import WayofTime.bloodmagic.client.render.block.RenderBloodTank;
|
||||
import WayofTime.bloodmagic.tile.TileBloodTank;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.Minecraft;
|
||||
import net.minecraft.client.renderer.GlStateManager;
|
||||
import net.minecraft.client.renderer.Tessellator;
|
||||
import net.minecraft.client.renderer.VertexBuffer;
|
||||
import net.minecraft.client.renderer.block.model.BakedQuad;
|
||||
import net.minecraft.client.renderer.block.model.IBakedModel;
|
||||
import net.minecraft.client.renderer.block.model.ItemCameraTransforms;
|
||||
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType;
|
||||
import net.minecraft.client.renderer.block.model.ItemOverrideList;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.client.renderer.texture.TextureMap;
|
||||
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
|
||||
import net.minecraft.client.renderer.vertex.VertexFormat;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraftforge.client.model.IPerspectiveAwareModel;
|
||||
import net.minecraftforge.common.model.TRSRTransformation;
|
||||
import net.minecraftforge.fluids.Fluid;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fml.relauncher.ReflectionHelper;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
|
||||
import javax.vecmath.Matrix4f;
|
||||
import javax.vecmath.Vector3f;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Shamelessly taken off of the Mekanism repository written by {@author aidancbrady}
|
||||
* https://github.com/aidancbrady/Mekanism
|
||||
*/
|
||||
public class BakedCustomItemModel implements IPerspectiveAwareModel
|
||||
{
|
||||
private IBakedModel baseModel;
|
||||
private ItemStack stack;
|
||||
|
||||
private TransformType prevTransform;
|
||||
|
||||
private static VertexFormat prevFormat = null;
|
||||
private static int prevMode = -1;
|
||||
|
||||
private static final RenderBloodTank tankRenderer = (RenderBloodTank) TileEntityRendererDispatcher.instance.mapSpecialRenderers.get(TileBloodTank.class);
|
||||
|
||||
public BakedCustomItemModel(IBakedModel model, ItemStack stack)
|
||||
{
|
||||
this.baseModel = model;
|
||||
this.stack = stack;
|
||||
}
|
||||
|
||||
private void doRender(TransformType transformType)
|
||||
{
|
||||
Block block = Block.getBlockFromItem(stack.getItem());
|
||||
|
||||
if (transformType == TransformType.GUI)
|
||||
{
|
||||
GlStateManager.rotate(180F, 0.0F, 1.0F, 0.0F);
|
||||
}
|
||||
|
||||
if (block instanceof BlockBloodTank)
|
||||
{
|
||||
GlStateManager.pushMatrix();
|
||||
|
||||
FluidStack fluid = null;
|
||||
float capacity = TileBloodTank.capacities[stack.getItemDamage()] * Fluid.BUCKET_VOLUME;
|
||||
int amount = 0;
|
||||
if (stack.hasTagCompound() && stack.getTagCompound().hasKey(Constants.NBT.TANK))
|
||||
{
|
||||
NBTTagCompound tag = stack.getTagCompound().getCompoundTag(Constants.NBT.TANK);
|
||||
fluid = FluidStack.loadFluidStackFromNBT(tag);
|
||||
if (fluid != null)
|
||||
amount = tag.getInteger("Amount");
|
||||
}
|
||||
|
||||
if (fluid != null && amount > 0)
|
||||
tankRenderer.renderFluid(amount / capacity, fluid.getFluid(), -0.498, -0.49, -0.498);
|
||||
|
||||
GlStateManager.popMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand)
|
||||
{
|
||||
Tessellator tessellator = Tessellator.getInstance();
|
||||
pauseRenderer(tessellator);
|
||||
|
||||
GlStateManager.pushMatrix();
|
||||
GlStateManager.translate(0.5F, 0.5F, 0.5F);
|
||||
GlStateManager.rotate(180, 0.0F, 1.0F, 0.0F);
|
||||
Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
|
||||
doRender(prevTransform);
|
||||
GlStateManager.enableLighting();
|
||||
GlStateManager.enableLight(0);
|
||||
GlStateManager.enableLight(1);
|
||||
GlStateManager.enableColorMaterial();
|
||||
GlStateManager.colorMaterial(1032, 5634);
|
||||
GlStateManager.enableCull();
|
||||
GlStateManager.popMatrix();
|
||||
|
||||
resumeRenderer(tessellator);
|
||||
|
||||
return baseModel.getQuads(state, side, rand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAmbientOcclusion()
|
||||
{
|
||||
return baseModel.isAmbientOcclusion();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGui3d()
|
||||
{
|
||||
return baseModel.isGui3d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltInRenderer()
|
||||
{
|
||||
return baseModel.isBuiltInRenderer();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TextureAtlasSprite getParticleTexture()
|
||||
{
|
||||
return baseModel.getParticleTexture();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemCameraTransforms getItemCameraTransforms()
|
||||
{
|
||||
return baseModel.getItemCameraTransforms();
|
||||
}
|
||||
|
||||
private static TRSRTransformation get(float tx, float ty, float tz, float ax, float ay, float az, float s)
|
||||
{
|
||||
return new TRSRTransformation(new Vector3f(tx / 16, ty / 16, tz / 16), TRSRTransformation.quatFromXYZDegrees(new Vector3f(ax, ay, az)), new Vector3f(s, s, s), null);
|
||||
}
|
||||
|
||||
public static Map<TransformType, TRSRTransformation> transforms = ImmutableMap.<TransformType, TRSRTransformation>builder()
|
||||
.put(TransformType.GUI, get(0, 0, 0, 30F, 225F, 0, 0.625F))
|
||||
.put(TransformType.THIRD_PERSON_RIGHT_HAND, get(0, 2.5F, 0, 75F, 45F, 0, 0.375F))
|
||||
.put(TransformType.THIRD_PERSON_LEFT_HAND, get(0, 2.5F, 0, 75F, 45F, 0, 0.375F))
|
||||
.put(TransformType.FIRST_PERSON_RIGHT_HAND, get(0, 0, 0, 0, 45F, 0, 0.4f))
|
||||
.put(TransformType.FIRST_PERSON_LEFT_HAND, get(0, 0, 0, 0, 225F, 0, 0.4F))
|
||||
.put(TransformType.GROUND, get(0, 2F, 0, 0, 0, 0, 0.25F))
|
||||
.put(TransformType.HEAD, get(0, 0, 0, 0, 0, 0, 1F))
|
||||
.put(TransformType.FIXED, get(0, 0, 0, 0, 0, 0, 1F))
|
||||
.put(TransformType.NONE, get(0, 0, 0, 0, 0, 0, 0))
|
||||
.build();
|
||||
|
||||
@Override
|
||||
public Pair<? extends IPerspectiveAwareModel, Matrix4f> handlePerspective(ItemCameraTransforms.TransformType cameraTransformType)
|
||||
{
|
||||
prevTransform = cameraTransformType;
|
||||
return Pair.of(this, transforms.get(cameraTransformType).getMatrix());
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemOverrideList getOverrides()
|
||||
{
|
||||
return ItemOverrideList.NONE;
|
||||
}
|
||||
|
||||
public static void pauseRenderer(Tessellator tess)
|
||||
{
|
||||
if (isDrawing(tess))
|
||||
{
|
||||
prevFormat = tess.getBuffer().getVertexFormat();
|
||||
prevMode = tess.getBuffer().getDrawMode();
|
||||
tess.draw();
|
||||
}
|
||||
}
|
||||
|
||||
public static void resumeRenderer(Tessellator tess)
|
||||
{
|
||||
if (prevFormat != null)
|
||||
{
|
||||
tess.getBuffer().begin(prevMode, prevFormat);
|
||||
}
|
||||
|
||||
prevFormat = null;
|
||||
prevMode = -1;
|
||||
}
|
||||
|
||||
public static boolean isDrawing(Tessellator tess)
|
||||
{
|
||||
return isDrawing(tess.getBuffer());
|
||||
}
|
||||
|
||||
public static boolean isDrawing(VertexBuffer buffer)
|
||||
{
|
||||
return (Boolean) ReflectionHelper.getPrivateValue(VertexBuffer.class, buffer, "isDrawing", "field_179010_r");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
package WayofTime.bloodmagic.client.render.model;
|
||||
|
||||
import net.minecraft.block.state.IBlockState;
|
||||
import net.minecraft.client.renderer.block.model.*;
|
||||
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
|
||||
import net.minecraft.entity.EntityLivingBase;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.util.EnumFacing;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CustomModelFactory implements IBakedModel
|
||||
{
|
||||
private IBakedModel baseModel;
|
||||
|
||||
private BlockOverrideList override = new BlockOverrideList();
|
||||
|
||||
public CustomModelFactory(IBakedModel base)
|
||||
{
|
||||
baseModel = base;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemOverrideList getOverrides()
|
||||
{
|
||||
return override;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<BakedQuad> getQuads(IBlockState state, EnumFacing facing, long rand)
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAmbientOcclusion()
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isGui3d()
|
||||
{
|
||||
return baseModel.isGui3d();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBuiltInRenderer()
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public TextureAtlasSprite getParticleTexture()
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemCameraTransforms getItemCameraTransforms()
|
||||
{
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
private class BlockOverrideList extends ItemOverrideList
|
||||
{
|
||||
public BlockOverrideList()
|
||||
{
|
||||
super(new ArrayList<ItemOverride>());
|
||||
}
|
||||
|
||||
@Override
|
||||
public IBakedModel handleItemState(IBakedModel originalModel, ItemStack stack, World world, EntityLivingBase entity)
|
||||
{
|
||||
return new BakedCustomItemModel(baseModel, stack);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue