Added Day and Night alchemy arrays

- Added new alchemy arrays:
	- Two arrays, which changes the current daylight cycle to day and night.

- Fixed the JEI so that it no longer ouputs an error when loading Alchemy Array recipes without a crafting output.
This commit is contained in:
WayofTime 2020-12-30 17:57:33 -05:00
parent a0b756240f
commit dac93b7ec4
23 changed files with 781 additions and 23 deletions

View file

@ -22,7 +22,9 @@ import wayoftime.bloodmagic.BloodMagic;
import wayoftime.bloodmagic.api.compat.IMultiWillTool;
import wayoftime.bloodmagic.client.model.MimicColor;
import wayoftime.bloodmagic.client.render.alchemyarray.BeaconAlchemyCircleRenderer;
import wayoftime.bloodmagic.client.render.alchemyarray.DayAlchemyCircleRenderer;
import wayoftime.bloodmagic.client.render.alchemyarray.LowStaticAlchemyCircleRenderer;
import wayoftime.bloodmagic.client.render.alchemyarray.NightAlchemyCircleRenderer;
import wayoftime.bloodmagic.client.render.alchemyarray.StaticAlchemyCircleRenderer;
import wayoftime.bloodmagic.client.render.block.RenderAlchemyArray;
import wayoftime.bloodmagic.client.render.block.RenderAltar;
@ -106,7 +108,8 @@ public class ClientEvents
AlchemyArrayRendererRegistry.registerRenderer(BloodMagic.rl("array/movement"), new StaticAlchemyCircleRenderer(BloodMagic.rl("textures/models/alchemyarrays/movementarray.png")));
AlchemyArrayRendererRegistry.registerRenderer(BloodMagic.rl("array/updraft"), new BeaconAlchemyCircleRenderer(BloodMagic.rl("textures/models/alchemyarrays/updraftarray.png")));
AlchemyArrayRendererRegistry.registerRenderer(BloodMagic.rl("array/spike"), new LowStaticAlchemyCircleRenderer(BloodMagic.rl("textures/models/alchemyarrays/spikearray.png")));
AlchemyArrayRendererRegistry.registerRenderer(BloodMagic.rl("array/day"), new LowStaticAlchemyCircleRenderer(BloodMagic.rl("textures/models/alchemyarrays/spikearray.png")));
AlchemyArrayRendererRegistry.registerRenderer(BloodMagic.rl("array/day"), new DayAlchemyCircleRenderer(BloodMagic.rl("textures/models/alchemyarrays/sunarray.png"), BloodMagic.rl("textures/models/alchemyarrays/sunarrayspikes.png"), BloodMagic.rl("textures/models/alchemyarrays/sunarraycircle.png")));
AlchemyArrayRendererRegistry.registerRenderer(BloodMagic.rl("array/night"), new NightAlchemyCircleRenderer(BloodMagic.rl("textures/models/alchemyarrays/moonarrayoutside.png"), BloodMagic.rl("textures/models/alchemyarrays/moonarraysymbols.png"), BloodMagic.rl("textures/models/alchemyarrays/moonarrayinside.png")));
}
public static void registerItemModelProperties(FMLClientSetupEvent event)

View file

@ -0,0 +1,229 @@
package wayoftime.bloodmagic.client.render.alchemyarray;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Quaternion;
import wayoftime.bloodmagic.client.render.BloodMagicRenderer;
import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model2D;
import wayoftime.bloodmagic.client.render.RenderResizableQuadrilateral;
import wayoftime.bloodmagic.tile.TileAlchemyArray;
public class DayAlchemyCircleRenderer extends AlchemyArrayRenderer
{
private final ResourceLocation spikesResource;
private final ResourceLocation circleResource;
public DayAlchemyCircleRenderer(ResourceLocation arrayResource, ResourceLocation spikesResource, ResourceLocation circleResource)
{
super(arrayResource);
this.spikesResource = spikesResource;
this.circleResource = circleResource;
}
@Override
public float getRotation(float craftTime)
{
return 0;
}
public float getSecondaryRotation(float craftTime)
{
float offset = 2;
if (craftTime >= offset)
{
float modifier = (craftTime - offset) * (craftTime - offset) * 0.05f;
return modifier * 1f;
}
return 0;
}
public float getVerticalOffset(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 100)
{
return (float) (-0.4 + (0.4) * Math.pow((craftTime - 40) / 60f, 3));
} else
{
return 0;
}
}
return -0.4f;
}
public float getSizeModifier(float craftTime)
{
return 1.0f;
}
public float getSecondarySizeModifier(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 160)
{
return (float) ((2f) * Math.pow((craftTime - 40) / 120f, 3));
} else
{
return 2;
}
}
return 0;
}
public float getTertiarySizeModifier(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 100)
{
return (float) ((1f) * Math.pow((craftTime - 40) / 60f, 3));
} else
{
return 1;
}
}
return 0;
}
public float getSpikeVerticalOffset(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 100)
{
return (float) (-0.4 + (0.4) * Math.pow((craftTime - 40) / 60f, 3));
} else if (craftTime <= 140)
{
return -0.01f * (craftTime - 100);
} else
{
return -0.4f;
}
}
return -0.4f;
}
public float getCentralCircleOffset(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 100)
{
return (float) (-0.4 + (0.4) * Math.pow((craftTime - 40) / 60f, 3));
} else if (craftTime <= 140)
{
return 0.01f * (craftTime - 100);
} else
{
return 0.4f;
}
}
return -0.4f;
}
public void renderAt(TileAlchemyArray tileArray, double x, double y, double z, float craftTime, MatrixStack matrixStack, IRenderTypeBuffer renderer, int combinedLightIn, int combinedOverlayIn)
{
matrixStack.push();
matrixStack.translate(0.5, 0.5, 0.5);
float rot = getRotation(craftTime);
float secondaryRot = getSecondaryRotation(craftTime);
float size = 1.0F * getSizeModifier(craftTime);
Direction rotation = tileArray.getRotation();
matrixStack.push();
matrixStack.translate(0, getVerticalOffset(craftTime), 0);
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
matrixStack.push();
matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), rot, true));
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), secondaryRot, true));
// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
IVertexBuilder twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(arrayResource));
Model2D arrayModel = new BloodMagicRenderer.Model2D();
arrayModel.minX = -0.5;
arrayModel.maxX = +0.5;
arrayModel.minY = -0.5;
arrayModel.maxY = +0.5;
arrayModel.resource = arrayResource;
matrixStack.scale(size, size, size);
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, 0xFFFFFFFF, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();
matrixStack.push();
matrixStack.translate(0, getSpikeVerticalOffset(craftTime), 0);
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
matrixStack.push();
matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), rot, true));
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -secondaryRot, true));
// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(spikesResource));
arrayModel = new BloodMagicRenderer.Model2D();
arrayModel.minX = -0.5;
arrayModel.maxX = +0.5;
arrayModel.minY = -0.5;
arrayModel.maxY = +0.5;
arrayModel.resource = spikesResource;
float secondarySize = 1.0F * getSecondarySizeModifier(craftTime);
matrixStack.scale(secondarySize, secondarySize, secondarySize);
int colorWanted = 0xFFFFFFFF;
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, colorWanted, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();
matrixStack.push();
matrixStack.translate(0, getCentralCircleOffset(craftTime), 0);
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
matrixStack.push();
matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), rot, true));
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -secondaryRot, true));
// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(circleResource));
arrayModel = new BloodMagicRenderer.Model2D();
arrayModel.minX = -0.5;
arrayModel.maxX = +0.5;
arrayModel.minY = -0.5;
arrayModel.maxY = +0.5;
arrayModel.resource = circleResource;
float tertiarySize = 1.0F * getTertiarySizeModifier(craftTime);
matrixStack.scale(tertiarySize, tertiarySize, tertiarySize);
colorWanted = 0xFFFFFFFF;
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, colorWanted, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();
matrixStack.pop();
}
}

View file

@ -0,0 +1,327 @@
package wayoftime.bloodmagic.client.render.alchemyarray;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Quaternion;
import wayoftime.bloodmagic.client.render.BloodMagicRenderer;
import wayoftime.bloodmagic.client.render.BloodMagicRenderer.Model2D;
import wayoftime.bloodmagic.client.render.RenderResizableQuadrilateral;
import wayoftime.bloodmagic.tile.TileAlchemyArray;
public class NightAlchemyCircleRenderer extends AlchemyArrayRenderer
{
private final ResourceLocation symbolResource;
private final ResourceLocation circleResource;
public NightAlchemyCircleRenderer(ResourceLocation arrayResource, ResourceLocation symbolResource, ResourceLocation circleResource)
{
super(arrayResource);
this.symbolResource = symbolResource;
this.circleResource = circleResource;
}
@Override
public float getRotation(float craftTime)
{
return 0;
}
public float getSecondaryRotation(float craftTime)
{
float offset = 2;
if (craftTime >= offset)
{
float modifier = (craftTime - offset) * (craftTime - offset) * 0.05f;
return modifier * 1f;
}
return 0;
}
public float getTertiaryRotation(float craftTime)
{
float offset = 60;
if (craftTime >= offset)
{
float modifier = (craftTime - offset) * (craftTime - offset) * 0.15f;
return modifier * 1f;
}
return 0;
}
public float getVerticalOffset(float craftTime)
{
// if (craftTime >= 40)
// {
// if (craftTime <= 100)
// {
// return (float) (-0.4 + (0.4) * Math.pow((craftTime - 40) / 60f, 3));
// } else
// {
// return 0;
// }
// }
return -0.4f;
}
public float getSizeModifier(float craftTime)
{
return 1.0f;
}
public float getSecondarySizeModifier(float craftTime)
{
if (craftTime >= 100)
{
if (craftTime <= 160)
{
return (float) ((1f) * Math.pow((craftTime - 100) / 60f, 3)) + 1f;
} else
{
return 2;
}
}
return 1.0f;
}
public float getTertiarySizeModifier(float craftTime)
{
return 1;
}
public float getSymbolVerticaloffset(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 100)
{
return (float) (-0.4 + (0.4) * Math.pow((craftTime - 40) / 60f, 3));
} else if (craftTime <= 140)
{
return 0.01f * (craftTime - 100);
} else
{
return 0.4f;
}
}
return -0.4f;
}
public float getCentralCircleOffset(float craftTime)
{
if (craftTime >= 40)
{
if (craftTime <= 100)
{
return (float) (-0.4 + (0.4) * Math.pow((craftTime - 40) / 60f, 3));
} else
{
return 0;
}
}
return -0.4f;
}
public float getSymbolPitch(float craftTime)
{
if (craftTime > 70)
{
if (craftTime <= 100)
{
return 90 * (craftTime - 70) / 30f;
} else
{
return 90;
}
}
return 0;
}
public float getCentralCirclePitch(float craftTime)
{
if (craftTime > 70)
{
if (craftTime <= 150)
{
return 360 * (craftTime - 70) / 80f;
} else
{
return 360;
}
}
return 0;
}
public float moonDisplacement(float craftTime)
{
if (craftTime > 40)
{
if (craftTime <= 100)
{
return (float) (2 * Math.pow((craftTime - 40) / 60f, 3));
} else
{
return 2;
}
}
return 0;
}
public float moonArc(float craftTime)
{
if (craftTime > 100)
{
if (craftTime <= 200)
{
return 180 * (craftTime - 100) / 100f;
} else
{
return 180;
}
}
return 0;
}
public void renderAt(TileAlchemyArray tileArray, double x, double y, double z, float craftTime, MatrixStack matrixStack, IRenderTypeBuffer renderer, int combinedLightIn, int combinedOverlayIn)
{
matrixStack.push();
matrixStack.translate(0.5, 0.5, 0.5);
float rot = getRotation(craftTime);
float secondaryRot = getSecondaryRotation(craftTime);
float tertiaryRot = getTertiaryRotation(craftTime);
float size = 1.0F * getSizeModifier(craftTime);
Direction rotation = tileArray.getRotation();
matrixStack.push();
matrixStack.translate(0, getVerticalOffset(craftTime), 0);
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
matrixStack.push();
matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), rot, true));
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), secondaryRot, true));
// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
IVertexBuilder twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(arrayResource));
Model2D arrayModel = new BloodMagicRenderer.Model2D();
arrayModel.minX = -0.5;
arrayModel.maxX = +0.5;
arrayModel.minY = -0.5;
arrayModel.maxY = +0.5;
arrayModel.resource = arrayResource;
matrixStack.scale(size, size, size);
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, 0xFFFFFFFF, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();
// matrixStack.push();
// matrixStack.translate(0, getSymbolVerticaloffset(craftTime), 0);
// matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
//
// matrixStack.push();
//
float pitch = getSymbolPitch(craftTime);
// matrixStack.rotate(new Quaternion(Direction.WEST.toVector3f(), pitch, true));
// matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), tertiaryRot, true));
//// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
//
// twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(symbolResource));
// arrayModel = new BloodMagicRenderer.Model2D();
// arrayModel.minX = -0.5;
// arrayModel.maxX = +0.5;
// arrayModel.minY = -0.5;
// arrayModel.maxY = +0.5;
// arrayModel.resource = symbolResource;
//
float secondarySize = 1.0F * getSecondarySizeModifier(craftTime);
//
// matrixStack.scale(secondarySize, secondarySize, secondarySize);
//
int colorWanted = 0xFFFFFFFF;
//
// RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, colorWanted, 0x00F000F0, combinedOverlayIn);
//
// matrixStack.pop();
// matrixStack.pop();
matrixStack.push();
matrixStack.translate(0, getCentralCircleOffset(craftTime), 0);
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
matrixStack.push();
pitch = getCentralCirclePitch(craftTime);
matrixStack.rotate(new Quaternion(Direction.WEST.toVector3f(), pitch, true));
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -secondaryRot, true));
// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(circleResource));
arrayModel = new BloodMagicRenderer.Model2D();
arrayModel.minX = -0.5;
arrayModel.maxX = +0.5;
arrayModel.minY = -0.5;
arrayModel.maxY = +0.5;
arrayModel.resource = circleResource;
float tertiarySize = 1.0F * getTertiarySizeModifier(craftTime);
matrixStack.scale(tertiarySize, tertiarySize, tertiarySize);
colorWanted = 0xFFFFFFFF;
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, colorWanted, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();
// Moon going over the array
matrixStack.push();
matrixStack.translate(0, getCentralCircleOffset(craftTime), 0);
matrixStack.rotate(new Quaternion(Direction.UP.toVector3f(), -rotation.getHorizontalAngle(), true));
matrixStack.rotate(new Quaternion(Direction.SOUTH.toVector3f(), moonArc(craftTime), true));
matrixStack.translate(moonDisplacement(craftTime), 0, 0);
matrixStack.push();
pitch = getSymbolPitch(craftTime);
matrixStack.rotate(new Quaternion(Direction.WEST.toVector3f(), pitch, true));
matrixStack.rotate(new Quaternion(Direction.NORTH.toVector3f(), tertiaryRot, true));
// matrixStack.rotate(new Quaternion(Direction.EAST.toVector3f(), secondaryRot * 0.45812f, true));
twoDBuffer = renderer.getBuffer(RenderType.getEntityTranslucent(symbolResource));
arrayModel = new BloodMagicRenderer.Model2D();
arrayModel.minX = -0.5;
arrayModel.maxX = +0.5;
arrayModel.minY = -0.5;
arrayModel.maxY = +0.5;
arrayModel.resource = symbolResource;
secondarySize = 1.0F;
matrixStack.scale(secondarySize, secondarySize, secondarySize);
colorWanted = 0xFFFFFFFF;
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, colorWanted, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();
matrixStack.pop();
}
}

View file

@ -5,7 +5,6 @@ import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Quaternion;
@ -75,7 +74,7 @@ public class SingleAlchemyCircleRenderer extends AlchemyArrayRenderer
matrixStack.scale(size, size, size);
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, 0xFFFFFFFF, 0x00F000F0, OverlayTexture.NO_OVERLAY);
RenderResizableQuadrilateral.INSTANCE.renderSquare(arrayModel, matrixStack, twoDBuffer, 0xFFFFFFFF, 0x00F000F0, combinedOverlayIn);
matrixStack.pop();
matrixStack.pop();