diff --git a/src/main/java/software/bernie/techarium/Techarium.java b/src/main/java/software/bernie/techarium/Techarium.java index 1b133720..609312d2 100644 --- a/src/main/java/software/bernie/techarium/Techarium.java +++ b/src/main/java/software/bernie/techarium/Techarium.java @@ -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(); diff --git a/src/main/java/software/bernie/techarium/client/ClientUtils.java b/src/main/java/software/bernie/techarium/client/ClientUtils.java index cc3f4a2d..d3f0ad2a 100644 --- a/src/main/java/software/bernie/techarium/client/ClientUtils.java +++ b/src/main/java/software/bernie/techarium/client/ClientUtils.java @@ -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 diff --git a/src/main/java/software/bernie/techarium/client/particles/ArboretumParticles.java b/src/main/java/software/bernie/techarium/client/particles/ArboretumParticles.java new file mode 100644 index 00000000..714ebe3e --- /dev/null +++ b/src/main/java/software/bernie/techarium/client/particles/ArboretumParticles.java @@ -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 { + 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) { + ArboretumParticles particle = new ArboretumParticles(worldIn, x, y, z, xSpeed, ySpeed, zSpeed); + particle.pickSprite(sprites); + return particle; + } + } +} diff --git a/src/main/java/software/bernie/techarium/client/tile/render/ArboretumRenderer.java b/src/main/java/software/bernie/techarium/client/tile/render/arboretum/ArboretumRenderer.java similarity index 62% rename from src/main/java/software/bernie/techarium/client/tile/render/ArboretumRenderer.java rename to src/main/java/software/bernie/techarium/client/tile/render/arboretum/ArboretumRenderer.java index 8ad6e2bb..773c048d 100644 --- a/src/main/java/software/bernie/techarium/client/tile/render/ArboretumRenderer.java +++ b/src/main/java/software/bernie/techarium/client/tile/render/arboretum/ArboretumRenderer.java @@ -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; @@ -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 { + + private float progress = 0; + + private Block log = Blocks.OAK_LOG; + private Block leaf = Blocks.OAK_LEAVES; + private Map cache = new HashMap<>(); + public ArboretumRenderer(TileEntityRendererDispatcher rendererDispatcherIn) { super(rendererDispatcherIn, new ArboretumModel()); } @@ -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 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) { @@ -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) { @@ -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(); @@ -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, diff --git a/src/main/java/software/bernie/techarium/client/tile/render/arboretum/ArboretumTreeRender.java b/src/main/java/software/bernie/techarium/client/tile/render/arboretum/ArboretumTreeRender.java new file mode 100644 index 00000000..0e125697 --- /dev/null +++ b/src/main/java/software/bernie/techarium/client/tile/render/arboretum/ArboretumTreeRender.java @@ -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(); + } + } + } + } + + +} diff --git a/src/main/java/software/bernie/techarium/helper/EventHelper.java b/src/main/java/software/bernie/techarium/helper/EventHelper.java new file mode 100644 index 00000000..74b3a261 --- /dev/null +++ b/src/main/java/software/bernie/techarium/helper/EventHelper.java @@ -0,0 +1,18 @@ +package software.bernie.techarium.helper; + +import java.util.Calendar; + +public class EventHelper { + + public static boolean isChristmas() { + Calendar calendar = Calendar.getInstance(); + if (calendar.get(2) + 1 == 12 && calendar.get(5) >= 24 && calendar.get(5) <= 26) + return true; + + else if (calendar.get(2) + 1 == 1 && calendar.get(5) >= 6 && calendar.get(5) <= 8) + return true; + + return false; + } + +} diff --git a/src/main/java/software/bernie/techarium/registry/ParticlesRegistry.java b/src/main/java/software/bernie/techarium/registry/ParticlesRegistry.java new file mode 100644 index 00000000..cbd9f0d8 --- /dev/null +++ b/src/main/java/software/bernie/techarium/registry/ParticlesRegistry.java @@ -0,0 +1,38 @@ +package software.bernie.techarium.registry; + +import java.util.function.Supplier; + +import net.minecraft.client.Minecraft; +import net.minecraft.particles.BasicParticleType; +import net.minecraft.particles.ParticleType; +import net.minecraftforge.client.event.ParticleFactoryRegisterEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.RegistryObject; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import software.bernie.techarium.Techarium; +import software.bernie.techarium.client.particles.ArboretumParticles; + +public class ParticlesRegistry { + + public static final DeferredRegister> PARTICLES = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, Techarium.MOD_ID); + + public static final RegistryObject ARBORETUM = registerParticleType("arboretum", () -> new BasicParticleType(true)); + + private static > RegistryObject registerParticleType(String name, Supplier particleType) { + RegistryObject reg = PARTICLES.register(name, particleType); + return reg; + } + + public static void register(IEventBus bus){ + PARTICLES.register(bus); + } + + @SubscribeEvent + public static void onRegisterParticleFactory(ParticleFactoryRegisterEvent event) { + Minecraft mc = Minecraft.getInstance(); + mc.particleEngine.register(ARBORETUM.get(), ArboretumParticles.Factory::new); + } + +} diff --git a/src/main/java/software/bernie/techarium/tile/arboretum/ArboretumTile.java b/src/main/java/software/bernie/techarium/tile/arboretum/ArboretumTile.java index 0a289d2f..5a569064 100644 --- a/src/main/java/software/bernie/techarium/tile/arboretum/ArboretumTile.java +++ b/src/main/java/software/bernie/techarium/tile/arboretum/ArboretumTile.java @@ -5,6 +5,8 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.RotatedPillarBlock; +import net.minecraft.block.material.MaterialColor; import net.minecraft.item.crafting.IRecipe; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -17,6 +19,7 @@ import software.bernie.geckolib3.core.manager.AnimationFactory; import software.bernie.techarium.block.base.MachineBlock; import software.bernie.techarium.client.screen.draw.IDrawable; +import software.bernie.techarium.helper.EventHelper; import software.bernie.techarium.item.UpgradeItem; import software.bernie.techarium.machine.addon.fluid.FluidTankAddon; import software.bernie.techarium.machine.addon.inventory.DrawableInventoryAddon; @@ -27,12 +30,16 @@ import software.bernie.techarium.machine.sideness.FaceConfig; import software.bernie.techarium.machine.sideness.Side; import software.bernie.techarium.recipe.recipe.ArboretumRecipe; +import software.bernie.techarium.registry.ParticlesRegistry; import software.bernie.techarium.registry.RecipeRegistry; import software.bernie.techarium.tile.base.MultiblockMasterTile; import software.bernie.techarium.util.Vector2i; +import software.bernie.techarium.util.loot.ChancedItemStack; +import java.util.Calendar; import java.util.EnumMap; import java.util.Map; +import java.util.Random; import static software.bernie.techarium.client.screen.draw.GuiAddonTextures.ARBORETUM_DRAWABLE; import static software.bernie.techarium.client.screen.draw.GuiAddonTextures.ARBORETUM_OUTPUT_SLOT; @@ -79,13 +86,76 @@ public void tick() { prevLightLevel = newLightLevel; level.getLightEngine().checkBlock(worldPosition); } + + if (level.isClientSide()) { + getController().getMultiProgressBar().getProgressBarAddons().forEach(bar -> { + if (bar.getProgress() == bar.getMaxProgress() - 1) + spawnDestroyParticles(); + }); + + if (EventHelper.isChristmas()) + spawnSnowParticles(); + } + } + + private void spawnSnowParticles() { + Random rand = getLevel().getRandom(); + for (int i = 0; i < 5; i++) { + double dx = getBlockPos().getX() + 0.5f + ((rand.nextDouble() - 0.5) / 20f); + double dy = getBlockPos().getY() + 1.8f; + double dz = getBlockPos().getZ() + 0.5f + ((rand.nextDouble() - 0.5) / 20f); + + level.addParticle(ParticlesRegistry.ARBORETUM.get(), dx, dy, dz, 1, 1, 1); + } } + private void spawnDestroyParticles() { + Random rand = getLevel().getRandom(); + Block log = getLogOutput(); + + if (log == null) + return; + + MaterialColor color = log.defaultMaterialColor(); + float red = ((color.col >> 16) & 0xff) / 255f; + float green = ((color.col >> 8) & 0xff) / 255f; + float blue = (color.col & 0xff) / 255f; + + for (int i = 0; i < 100; i++) { + double dx = getBlockPos().getX() + 0.5f + ((rand.nextDouble() - 0.5) / 20f); + double dy = getBlockPos().getY() + 0.5f + rand.nextDouble(); + double dz = getBlockPos().getZ() + 0.5f + ((rand.nextDouble() - 0.5) / 20f); + + level.addParticle(ParticlesRegistry.ARBORETUM.get(), dx, dy, dz, red, green, blue); + } + } + @Override protected MachineController createMachineController() { return machineController(ARBORETUM_DRAWABLE); } + public Block getLogOutput() { + MachineController controler = getController(); + ArboretumRecipe recipe = controler.getCurrentRecipe(); + + if (recipe == null) return null; + if (recipe.getOutput() == null) return null; + + Block log = Blocks.OAK_LOG; + + for (ChancedItemStack itemStack : recipe.getOutput().getStackList()) { + Block block = Block.byItem(itemStack.getStack().getItem()); + + if (block instanceof RotatedPillarBlock) { + log = block; + break; + } + } + + return log; + } + private MachineController machineController(IDrawable background) { MachineController controller = createController(); controller.setBackground(background, SIZE_X, SIZE_Y); diff --git a/src/main/resources/assets/techarium/particles/arboretum.json b/src/main/resources/assets/techarium/particles/arboretum.json new file mode 100644 index 00000000..ecd17c80 --- /dev/null +++ b/src/main/resources/assets/techarium/particles/arboretum.json @@ -0,0 +1,6 @@ +{ + "textures": + [ + "techarium:arboretum" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/techarium/textures/particle/arboretum.png b/src/main/resources/assets/techarium/textures/particle/arboretum.png new file mode 100644 index 00000000..2ab90baf Binary files /dev/null and b/src/main/resources/assets/techarium/textures/particle/arboretum.png differ