Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions src/main/java/software/bernie/techarium/Techarium.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,15 @@ public Techarium() {
BlockRegistry.register(bus);
ContainerRegistry.register(bus);
RecipeRegistry.register(bus);
ParticlesRegistry.register(bus);
bus.addListener(this::onClientSetup);
bus.addListener(NetworkEvents::onCommonSetup);
bus.addListener(this::gatherData);
bus.addListener(this::enqueueIMC);
bus.addListener(LootRegistry::registerLootPoolEntryTypes);

bus.register(ParticlesRegistry.class);

MinecraftForge.EVENT_BUS.addListener(WorldGen::generateOres);
TechariumConfig.load();
NetworkConnection.registerMessages();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import software.bernie.techarium.Techarium;
import software.bernie.techarium.client.tile.render.*;
import software.bernie.techarium.client.tile.render.arboretum.ArboretumRenderer;
import software.bernie.techarium.registry.BlockRegistry;

@UtilityClass
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package software.bernie.techarium.client.particles;

import com.mojang.blaze3d.vertex.IVertexBuilder;

import net.minecraft.client.particle.IAnimatedSprite;
import net.minecraft.client.particle.IParticleFactory;
import net.minecraft.client.particle.IParticleRenderType;
import net.minecraft.client.particle.Particle;
import net.minecraft.client.particle.SpriteTexturedParticle;
import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.particles.BasicParticleType;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Quaternion;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

public class ArboretumParticles extends SpriteTexturedParticle {

float particleMaxScale = 1;

public ArboretumParticles(ClientWorld world, double posX, double posY, double posZ, double red,
double green, double blue) {
super(world, posX, posY, posZ, red, green, blue);
xd = (random.nextFloat() - 0.5f) / 50f;
yd = random.nextFloat() / 50f;
zd = (random.nextFloat() - 0.5f) / 50f;
particleMaxScale = Math.max(random.nextFloat() / 120f, 0.0085f);
quadSize = particleMaxScale;
bCol = (float) blue;
gCol = (float) green;
rCol = (float) red;
setLifetime(100);
hasPhysics = true;
}

@Override
public void render(IVertexBuilder builder, ActiveRenderInfo renderInfo, float partialTicks) {
if (isAlive()) {
Vector3d vec3d = renderInfo.getPosition();
float f = (float) (MathHelper.lerp((double) partialTicks, this.xo, this.x) - vec3d.x());
float f1 = (float) (MathHelper.lerp((double) partialTicks, this.yo, this.y) - vec3d.y());
float f2 = (float) (MathHelper.lerp((double) partialTicks, this.zo, this.z) - vec3d.z());
Quaternion quaternion;
if (this.roll == 0.0F) {
quaternion = renderInfo.rotation();
} else {
quaternion = new Quaternion(renderInfo.rotation());
float f3 = MathHelper.lerp(partialTicks, this.oRoll, this.roll);
quaternion.mul(Vector3f.ZP.rotation(f3));
}

Vector3f vector3f1 = new Vector3f(-1.0F, -1.0F, 0.0F);
vector3f1.transform(quaternion);
Vector3f[] avector3f = new Vector3f[] { new Vector3f(-1.0F, -1.0F, 0.0F), new Vector3f(-1.0F, 1.0F, 0.0F),
new Vector3f(1.0F, 1.0F, 0.0F), new Vector3f(1.0F, -1.0F, 0.0F) };
float f4 = this.quadSize;

for (int i = 0; i < 4; ++i) {
Vector3f vector3f = avector3f[i];
vector3f.transform(quaternion);
vector3f.mul(f4);
vector3f.add(f, f1, f2);
}

float f7 = this.getU0();
float f8 = this.getU1();
float f5 = this.getV0();
float f6 = this.getV1();
int j = this.getLightColor(partialTicks);
alpha = getGlowBrightness();
builder.vertex((double) avector3f[0].x(), (double) avector3f[0].y(), (double) avector3f[0].z())
.uv(f8, f6).color(this.rCol, this.gCol, this.bCol, this.alpha)
.uv2(j).endVertex();
builder.vertex((double) avector3f[1].x(), (double) avector3f[1].y(), (double) avector3f[1].z())
.uv(f8, f5).color(this.rCol, this.gCol, this.bCol, this.alpha)
.uv2(j).endVertex();
builder.vertex((double) avector3f[2].x(), (double) avector3f[2].y(), (double) avector3f[2].z())
.uv(f7, f5).color(this.rCol, this.gCol, this.bCol, this.alpha)
.uv2(j).endVertex();
builder.vertex((double) avector3f[3].x(), (double) avector3f[3].y(), (double) avector3f[3].z())
.uv(f7, f6).color(this.rCol, this.gCol, this.bCol, this.alpha)
.uv2(j).endVertex();
}
}

@Override
public void tick() {
float percentAge = 1 - (float) age / (float) getLifetime();
quadSize = (float) (particleMaxScale * percentAge);
yd += -0.001f;
super.tick();

}

public float getGlowBrightness() {
return 1 - (float) age / (float) getLifetime();
}

@Override
public IParticleRenderType getRenderType() {
return IParticleRenderType.PARTICLE_SHEET_TRANSLUCENT;
}

@Override
public int getLightColor(float partialTicks) {
int i = super.getLightColor(partialTicks);
int j = 240;
int k = i >> 16 & 255;
return 240 | k << 16;
}

@OnlyIn(Dist.CLIENT)
public static class Factory implements IParticleFactory<BasicParticleType> {
private final IAnimatedSprite sprites;

public Factory(IAnimatedSprite sprite) {
this.sprites = sprite;
}

@Override
public Particle createParticle(BasicParticleType typeIn, ClientWorld worldIn, double x, double y, double z,
double xSpeed, double ySpeed, double zSpeed) {

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Formatting

ArboretumParticles particle = new ArboretumParticles(worldIn, x, y, z, xSpeed, ySpeed, zSpeed);
particle.pickSprite(sprites);
return particle;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package software.bernie.techarium.client.tile.render;
package software.bernie.techarium.client.tile.render.arboretum;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Nullable;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;

import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
Expand All @@ -19,12 +25,22 @@
import net.minecraft.util.math.vector.Quaternion;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.common.Tags;
import net.minecraftforge.registries.ForgeRegistries;
import software.bernie.geckolib3.renderers.geo.GeoBlockRenderer;
import software.bernie.techarium.client.tile.model.ArboretumModel;
import software.bernie.techarium.helper.EventHelper;
import software.bernie.techarium.machine.controller.MachineController;
import software.bernie.techarium.recipe.recipe.ArboretumRecipe;
import software.bernie.techarium.tile.arboretum.ArboretumTile;
import javax.annotation.Nullable;

public class ArboretumRenderer extends GeoBlockRenderer<ArboretumTile> {

private float progress = 0;

private Block log = Blocks.OAK_LOG;
private Block leaf = Blocks.OAK_LEAVES;
private Map<Block, Block> cache = new HashMap<>();

public ArboretumRenderer(TileEntityRendererDispatcher rendererDispatcherIn) {
super(rendererDispatcherIn, new ArboretumModel());
}
Expand All @@ -37,9 +53,65 @@ public void renderEarly(ArboretumTile tile, MatrixStack stack, float ticks, IRen
stack.scale(0.21f, 0.21f, 0.21f);
Minecraft.getInstance().getItemRenderer().renderStatic(tile.getCropInventory().getStackInSlot(0), ItemCameraTransforms.TransformType.NONE, packedLightIn, packedOverlayIn, stack, renderTypeBuffer);
stack.popPose();

renderTile(tile, partialTicks, stack, renderTypeBuffer, packedLightIn, packedOverlayIn);
renderTree(tile, partialTicks, stack, renderTypeBuffer, packedLightIn, packedOverlayIn);

}

private void renderTree(ArboretumTile tile, float partialTicks, MatrixStack stack,
IRenderTypeBuffer renderTypeBuffer, int packedLightIn, int packedOverlayIn) {
MachineController<ArboretumRecipe> controler = tile.getController();

controler.getMultiProgressBar().getProgressBarAddons().forEach(bar -> {
progress = (float) bar.getProgress() / bar.getMaxProgress();
});

log = tile.getLogOutput();

if (log == null)
return;

leaf = Blocks.OAK_LEAVES;

if (cache.containsKey(log)) {
leaf = cache.get(log);
} else {
Ingredient sapling = controler.getCurrentRecipe().getCropType();
Block refBlock = sapling.isEmpty() ? log : Block.byItem(sapling.getItems()[0].getItem());
String toRemove = sapling.isEmpty() ? "log" : "sapling";

String logName = refBlock.getDescriptionId();
String logMod = refBlock.getRegistryName().getNamespace();
String key = removeUnusedChar(logName, logMod).replace(toRemove, "");

ForgeRegistries.BLOCKS.forEach(block -> {
String blockName = block.getDescriptionId();
String blockMod = block.getRegistryName().getNamespace();
String blockKey = removeUnusedChar(blockName, blockMod).replace("leaves", "");

if (key.equals(blockKey)) {
cache.put(log, block);
}
});
}

ArboretumTreeRender treeRender = ArboretumTreeRender.getInstance();
treeRender.setLog(log);
treeRender.setLeaves(leaf);

stack.pushPose();
treeRender.renderTree(stack, renderTypeBuffer, packedLightIn, packedOverlayIn, partialTicks, progress);
stack.popPose();
}

private String removeUnusedChar(String str, String mod) {
return str.replace("block", "")
.replace("_", "")
.replace(".", "")
.replace(mod, "");
}

@Override
public void render(TileEntity tile, float partialTicks, MatrixStack matrixStackIn, IRenderTypeBuffer bufferIn,
int combinedLightIn, int combinedOverlayIn) {
Expand All @@ -52,17 +124,6 @@ public void renderTile(ArboretumTile tile, float partialTicks, MatrixStack matri
matrixStack.scale(0.5f, 0.5f, 0.5f);
Minecraft.getInstance().getBlockRenderer().renderBlock(getRenderSoilBlock(tile), matrixStack, buffer, packedLightIn, combinedOverlayIn, EmptyModelData.INSTANCE);
matrixStack.popPose();

renderCrop(tile, matrixStack, partialTicks, buffer, packedLightIn, combinedOverlayIn);
}

private void renderCrop(ArboretumTile tile, MatrixStack matrixStack, float partialTicks, IRenderTypeBuffer buffer, int packedLightIn, int combinedOverlayIn) {
matrixStack.pushPose();
float age = ((float) tile.getProgressBar().getProgress() / tile.getProgressBar().getMaxProgress()) * 0.75f;
matrixStack.translate(-age/2, 0.825, -age/2);
matrixStack.scale(age, age, age);
Minecraft.getInstance().getBlockRenderer().renderBlock(getRenderTreeBlock(tile), matrixStack, buffer, packedLightIn, combinedOverlayIn, EmptyModelData.INSTANCE);
matrixStack.popPose();
}

private static boolean testALlDirt(Ingredient ingredient) {
Expand All @@ -73,6 +134,8 @@ private static boolean testALlDirt(Ingredient ingredient) {
}

private BlockState getRenderSoilBlock(ArboretumTile tile) {
if (EventHelper.isChristmas()) return Blocks.SNOW_BLOCK.defaultBlockState();

ItemStack soil = tile.getSoilInventory().getStackInSlot(0);
if (soil.isEmpty() || !(soil.getItem() instanceof BlockItem))
return Blocks.AIR.defaultBlockState();
Expand All @@ -85,13 +148,6 @@ private BlockState getRenderSoilBlock(ArboretumTile tile) {
return state;
}

private BlockState getRenderTreeBlock(ArboretumTile tile) {
ItemStack crop = tile.getCropInventory().getStackInSlot(0);
if (crop.isEmpty() || !(crop.getItem() instanceof BlockItem))
return Blocks.AIR.defaultBlockState();
return ((BlockItem) crop.getItem()).getBlock().defaultBlockState();
}

@Override
public RenderType getRenderType(ArboretumTile animatable, float partialTicks, MatrixStack stack,
@Nullable IRenderTypeBuffer renderTypeBuffer,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package software.bernie.techarium.client.tile.render.arboretum;

import com.mojang.blaze3d.matrix.MatrixStack;

import lombok.Getter;
import lombok.Setter;
import net.minecraft.block.Block;
import net.minecraft.block.Blocks;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.client.model.data.EmptyModelData;
import software.bernie.techarium.registry.ParticlesRegistry;
import software.bernie.techarium.tile.arboretum.ArboretumTile;

public class ArboretumTreeRender {

@Getter
private static ArboretumTreeRender instance = new ArboretumTreeRender();

@Getter
@Setter
private Block log = Blocks.OAK_LOG;

@Getter
@Setter
private Block leaves = Blocks.OAK_LEAVES;

private float scale = 0;

public void renderTree(MatrixStack stack, IRenderTypeBuffer renderTypeBuffer, int packedLightIn, int packedOverlayIn, float partialTicks, float craftPercent) {
scale = craftPercent / 10f;
stack.translate(-scale/2f, 0.8, -scale/2f);
stack.scale(scale, scale, scale);

renderLogGrow(stack, renderTypeBuffer, packedLightIn, packedOverlayIn, partialTicks, craftPercent);
renderLeavesGrow(stack, renderTypeBuffer, packedLightIn, packedOverlayIn, partialTicks, craftPercent);
}

private void renderLogGrow(MatrixStack stack, IRenderTypeBuffer renderTypeBuffer, int packedLightIn, int packedOverlayIn, float partialTicks, float craftPercent) {
for (float i = 0; i < (float) 6f * craftPercent; i++) {
stack.pushPose();
stack.translate(0, i, 0);
Minecraft.getInstance().getBlockRenderer().renderBlock(log.defaultBlockState(), stack, renderTypeBuffer, packedLightIn, packedOverlayIn, EmptyModelData.INSTANCE);
stack.popPose();
}
}

private void renderLeavesGrow(MatrixStack stack, IRenderTypeBuffer renderTypeBuffer, int packedLightIn, int packedOverlayIn, float partialTicks, float craftPercent) {
if (craftPercent < 0.25)
return;

for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
for (int k = 0; k < 2; k++) {
if (k == 1) {
if ((i == -1 && j == -1) || (i == 1 && j == -1) || (i == 1 && j == 1) || (i == -1 && j == 1))
continue;
}
stack.pushPose();
stack.translate(i, k + (float) 6f * craftPercent, j);
Minecraft.getInstance().getBlockRenderer().renderBlock(leaves.defaultBlockState(), stack, renderTypeBuffer, packedLightIn, packedOverlayIn, EmptyModelData.INSTANCE);
stack.popPose();
}
}
}

if (craftPercent < 0.5)
return;

int radius = (int) (2.5f * Math.min(1, ((craftPercent * 2f) - 1f) + 0.1f));

for (int i = -radius; i <= radius; i++) {
for (int j = -radius; j <= radius; j++) {
for (int k = -2; k < 0; k++) {
if (i == 0 && j == 0) continue;
stack.pushPose();
stack.translate(i, k + (float) 6f * craftPercent, j);
Minecraft.getInstance().getBlockRenderer().renderBlock(leaves.defaultBlockState(), stack, renderTypeBuffer, packedLightIn, packedOverlayIn, EmptyModelData.INSTANCE);
stack.popPose();
}
}
}
}


}
Loading