Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ run
# Files from Forge MDK
forge*changelog.txt
*.DS_Store
settings.gradle

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.

???

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lol

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