From 054cddd246363017a60603275fa1db3b69a1a7cf Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 30 Jun 2024 20:07:37 +0200 Subject: [PATCH] finally render fluids --- COPYING | 1 + build.gradle.kts | 3 +- .../environmenttech/client/RenderUtils.java | 31 ++++++----- .../command/EnvironmenttechCommand.java | 19 +++++++ .../level/block/EnvDistributorBlock.java | 10 ++-- .../entity/EnvDistributorBlockEntity.java | 54 +++++++++++++++++-- .../renderer/EnvDistributorRenderer.java | 54 +++++++++++++++---- .../level/fluid/ETFluidTypes.java | 18 +++++-- .../environmenttech/level/fluid/ETFluids.java | 11 +++- 9 files changed, 163 insertions(+), 38 deletions(-) diff --git a/COPYING b/COPYING index f9389e1..04d4f18 100644 --- a/COPYING +++ b/COPYING @@ -11,5 +11,6 @@ Other Licenses: - client - renderer - EnvStorageRenderer.java = Blu's License of Common Sense + - RenderUtils.java = LGPL-3.0 - utils - MouseUtils.java = MIT diff --git a/build.gradle.kts b/build.gradle.kts index 61b2a5c..2de284c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -80,7 +80,8 @@ spotless { // Originally, this was from Kaupenjoe's repo, and was licensed by BluSunrize as the original code was from her, so we exclude it to not add our License Header targetExclude( "src/main/java/robaertschi/environmenttech/client/renderer/EnvStorageRenderer.java", - "src/main/java/robaertschi/environmenttech/utils/MouseUtils.java" + "src/main/java/robaertschi/environmenttech/utils/MouseUtils.java", + "src/main/java/robaertschi/environmenttech/client/RenderUtils.java" ) importOrder("lombok", "java|javax", "", "net.minecraft", "com.mojang", "robaertschi", "\\#") removeUnusedImports() diff --git a/src/main/java/robaertschi/environmenttech/client/RenderUtils.java b/src/main/java/robaertschi/environmenttech/client/RenderUtils.java index a3c28f0..e314a59 100644 --- a/src/main/java/robaertschi/environmenttech/client/RenderUtils.java +++ b/src/main/java/robaertschi/environmenttech/client/RenderUtils.java @@ -7,17 +7,22 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.phys.Vec3; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.fluids.FluidStack; import org.joml.Vector3f; import javax.annotation.ParametersAreNonnullByDefault; +/** + * This file is from here. + * So all credits go to TurtyWurty. The code is under the LGPL-3.0, the conformation you can see here on the mod_license line. + * But the repo does not contain a LICENSE file, so it is not clear. + * @author TurtyWurty + */ public class RenderUtils { + public static void vertex(VertexConsumer consumer, PoseStack stack, float x, float y, float z, @@ -61,13 +66,11 @@ public class RenderUtils { public static void cuboid( VertexConsumer consumer, PoseStack stack, - BlockPos fromPos, Vector3f start, Vector3f end, TextureAtlasSprite sprite, int packedLight, int color ) { - var relativeStart = Vec3.atLowerCornerWithOffset(fromPos, -start.x(), -start.y(), -start.z()); float width = end.x() - start.x(); float height = end.y() - start.y(); @@ -79,7 +82,12 @@ public class RenderUtils { float v1 = sprite.getV1(); stack.pushPose(); - stack.translate(-relativeStart.x(), -relativeStart.y(), -relativeStart.z()); +// log.info("x: {}, y: {}, z: {}", -relativeStart.x(), -relativeStart.y(), -relativeStart.z()); +// stack.translate(-relativeStart.x(), -relativeStart.y(), -relativeStart.z()); +// stack.translate(relativeStart.x(), relativeStart.y(), relativeStart.z()); + +// System.out.println("Width " + width + " height " + height + " depth " + depth); +// System.out.println("start " + start + " end " + end + " relativeStart " + relativeStart); // Front quad(consumer, stack, packedLight, color, 0, 0, 0, width, height, 0, u0, v0, u1, v1); @@ -112,15 +120,15 @@ public class RenderUtils { long amount, long capacity, Vector3f start, - Vector3f end, - BlockPos blockPos + Vector3f end ) { TextureAtlasSprite sprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(stillTexture); VertexConsumer consumer = bufferSource.getBuffer(renderType); float percent = ((float) amount / (float) capacity); - end.y = start.y() + (percent * (end.y() - start.y())); + float newY = start.y() + (percent * (end.y() - start.y())); + Vector3f newEnd = new Vector3f(end.x(), newY, end.z()); - cuboid(consumer, poseStack, blockPos, start, end, sprite, packedLight, tintColor); + cuboid(consumer, poseStack, start, newEnd, sprite, packedLight, tintColor); } public static void renderFluidBox(FluidStack fluidStack, @@ -130,15 +138,14 @@ public class RenderUtils { long amount, long capacity, Vector3f start, - Vector3f end, - BlockPos blockPos + Vector3f end ) { IClientFluidTypeExtensions extensions = IClientFluidTypeExtensions.of(fluidStack.getFluid()); ResourceLocation stillTexture = extensions.getStillTexture(); int tintColor = extensions.getTintColor(fluidStack); RenderType renderType = ItemBlockRenderTypes.getRenderLayer(fluidStack.getFluid().defaultFluidState()); renderFluidBox( - stack, bufferSource, packedLight, renderType, stillTexture, tintColor, amount, capacity, start, end, blockPos + stack, bufferSource, packedLight, renderType, stillTexture, tintColor, amount, capacity, start, end ); } } diff --git a/src/main/java/robaertschi/environmenttech/command/EnvironmenttechCommand.java b/src/main/java/robaertschi/environmenttech/command/EnvironmenttechCommand.java index 8eb0b01..bac8060 100644 --- a/src/main/java/robaertschi/environmenttech/command/EnvironmenttechCommand.java +++ b/src/main/java/robaertschi/environmenttech/command/EnvironmenttechCommand.java @@ -6,7 +6,11 @@ */ package robaertschi.environmenttech.command; +import net.neoforged.neoforge.server.command.EnumArgument; + import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.commands.arguments.coordinates.WorldCoordinates; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; @@ -16,6 +20,8 @@ import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.LongArgumentType; import robaertschi.environmenttech.data.attachments.ETAttachments; +import robaertschi.environmenttech.data.capabilities.ETCapabilities; +import robaertschi.environmenttech.data.capabilities.EnvType; import static net.minecraft.commands.Commands.*; @@ -48,6 +54,19 @@ public class EnvironmenttechCommand { return 1; })) + .then(literal("set_env").then(argument("pos", BlockPosArgument.blockPos()).then(argument("env_type", EnumArgument.enumArgument(EnvType.class)).then(argument("amount", LongArgumentType.longArg(0)).executes( + context -> { + WorldCoordinates pos = context.getArgument("pos", WorldCoordinates.class); + EnvType type = context.getArgument("env_type", EnvType.class); + long amount = context.getArgument("amount", Long.class); + var cap = context.getSource().getPlayerOrException().level().getCapability(ETCapabilities.ENV_STORAGE_BLOCK, pos.getBlockPos(context.getSource()), type); + if (cap != null) { + cap.receiveEnv(amount, false); + } + + return 1; + } + ))))) ); } } diff --git a/src/main/java/robaertschi/environmenttech/level/block/EnvDistributorBlock.java b/src/main/java/robaertschi/environmenttech/level/block/EnvDistributorBlock.java index 9db77cd..ab2c44f 100644 --- a/src/main/java/robaertschi/environmenttech/level/block/EnvDistributorBlock.java +++ b/src/main/java/robaertschi/environmenttech/level/block/EnvDistributorBlock.java @@ -10,18 +10,18 @@ import lombok.extern.slf4j.Slf4j; import javax.annotation.ParametersAreNonnullByDefault; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.phys.shapes.BooleanOp; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.Shapes; -import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.BooleanOp; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; import com.mojang.serialization.MapCodec; diff --git a/src/main/java/robaertschi/environmenttech/level/block/entity/EnvDistributorBlockEntity.java b/src/main/java/robaertschi/environmenttech/level/block/entity/EnvDistributorBlockEntity.java index 5efde14..42a62d5 100644 --- a/src/main/java/robaertschi/environmenttech/level/block/entity/EnvDistributorBlockEntity.java +++ b/src/main/java/robaertschi/environmenttech/level/block/entity/EnvDistributorBlockEntity.java @@ -11,11 +11,16 @@ import lombok.Getter; import javax.annotation.ParametersAreNonnullByDefault; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; @@ -30,6 +35,11 @@ import static robaertschi.environmenttech.ET.MODID; @ParametersAreNonnullByDefault public class EnvDistributorBlockEntity extends BlockEntity implements ITickableBlockEntity { + public static final int TICKS_PER_PROCESS_TICK = 20; // 1 Minute + public static final int REDUCE_PER_PROCESS_TICK = 5; + + private int ticksBetweenProcessTick = 0; + public static final String ENV_TAG = "Env"; private final EnvStorage envStorage = new EnvStorage(EnvType.Chunk, 64) { @Override @@ -37,7 +47,15 @@ public class EnvDistributorBlockEntity extends BlockEntity implements ITickableB EnvDistributorBlockEntity.this.setChanged(); assert level != null; if (!level.isClientSide()) { - level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 3); + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); + } + } + + @Override + public void setEnvStored(long env) { + super.setEnvStored(env); + if (level != null && !level.isClientSide()) { + level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), Block.UPDATE_ALL); } } }; @@ -63,11 +81,39 @@ public class EnvDistributorBlockEntity extends BlockEntity implements ITickableB @Override public void serverTick(ServerLevel level, BlockPos blockPos, BlockState blockState) { + + if (ticksBetweenProcessTick < TICKS_PER_PROCESS_TICK) { + ticksBetweenProcessTick++; + return; + } else { + ticksBetweenProcessTick = 0; + } + if (envStorage.getEnvStored() > 0) { + // ES = 1 + long amount = REDUCE_PER_PROCESS_TICK; + // 1 - 5 = -4 + long result = envStorage.getEnvStored() - amount; + + if ( result < 0 ) { + // -4 + 5 = 1 + amount = result + amount; + } + ChunkAccess chunk = level.getChunk(blockPos); - long value = Math.min(5, envStorage.getEnvStored()); - chunk.setData(ETAttachments.ENV, chunk.getData(ETAttachments.ENV) + value); - envStorage.setEnvStored(envStorage.getEnvStored() - value); + chunk.setData(ETAttachments.ENV, chunk.getData(ETAttachments.ENV) + amount); + envStorage.setEnvStored(envStorage.getEnvStored() - amount); } } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public @NotNull CompoundTag getUpdateTag(HolderLookup.Provider registries) { + return saveWithoutMetadata(registries); + } } diff --git a/src/main/java/robaertschi/environmenttech/level/block/entity/renderer/EnvDistributorRenderer.java b/src/main/java/robaertschi/environmenttech/level/block/entity/renderer/EnvDistributorRenderer.java index b6aca3f..cb39d34 100644 --- a/src/main/java/robaertschi/environmenttech/level/block/entity/renderer/EnvDistributorRenderer.java +++ b/src/main/java/robaertschi/environmenttech/level/block/entity/renderer/EnvDistributorRenderer.java @@ -1,26 +1,62 @@ +/* + * EnvironmentTech Copyright (C) 2024 Robin Bärtschi + * This program comes with ABSOLUTELY NO WARRANTY; for details open the file LICENSE at the root of the source code. + * This is free software, and you are welcome to redistribute it + * under certain conditions; read the LICENSE file at the root of the source code for details. + */ package robaertschi.environmenttech.level.block.entity.renderer; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import robaertschi.environmenttech.level.block.entity.EnvDistributorBlockEntity; +import lombok.extern.slf4j.Slf4j; import javax.annotation.ParametersAreNonnullByDefault; +import net.neoforged.neoforge.fluids.FluidStack; +import org.joml.Vector3f; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.world.phys.Vec3; + +import com.mojang.blaze3d.vertex.PoseStack; + +import robaertschi.environmenttech.client.RenderUtils; +import robaertschi.environmenttech.level.block.entity.EnvDistributorBlockEntity; +import robaertschi.environmenttech.level.fluid.ETFluids; + +@Slf4j @ParametersAreNonnullByDefault public class EnvDistributorRenderer implements BlockEntityRenderer { + private static final FluidStack ENV_STACK = new FluidStack(ETFluids.ENV_STILL, 1); + @SuppressWarnings("unused") - public EnvDistributorRenderer(BlockEntityRendererProvider.Context context) {} + public EnvDistributorRenderer(BlockEntityRendererProvider.Context context) { + } @Override public void render(EnvDistributorBlockEntity blockEntity, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, int packedLight, int packedOverlay) { - poseStack.pushPose(); - poseStack.translate(0, 5, 0); + final float pixel = 1f / 16f; + poseStack.translate(pixel + 0.01f, pixel, pixel + 0.01f); + if (blockEntity.getEnvStorage().getEnvStored() <= 0) { + return; + } - poseStack.popPose(); + RenderUtils.renderFluidBox( + ENV_STACK, poseStack, bufferSource, packedLight, blockEntity.getEnvStorage().getEnvStored(), blockEntity.getEnvStorage().getMaxEnv(), + new Vector3f(0f, 0f, 0f), new Vector3f(pixel * 14 - 0.02f, pixel * 5, pixel * 14 - 0.02f) + ); + } + + @Override + public boolean shouldRender(EnvDistributorBlockEntity blockEntity, Vec3 cameraPos) { + return true; + } + + @Override + public boolean shouldRenderOffScreen(EnvDistributorBlockEntity blockEntity) { + return true; } } diff --git a/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java index 284cbc3..09227af 100644 --- a/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java +++ b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java @@ -1,17 +1,25 @@ +/* + * EnvironmentTech Copyright (C) 2024 Robin Bärtschi + * This program comes with ABSOLUTELY NO WARRANTY; for details open the file LICENSE at the root of the source code. + * This is free software, and you are welcome to redistribute it + * under certain conditions; read the LICENSE file at the root of the source code for details. + */ package robaertschi.environmenttech.level.fluid; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.resources.ResourceLocation; +import java.util.function.Consumer; +import javax.annotation.ParametersAreNonnullByDefault; + import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; import net.neoforged.neoforge.fluids.FluidType; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.NeoForgeRegistries; -import robaertschi.environmenttech.client.renderer.EnvStorageRenderer; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.function.Consumer; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.resources.ResourceLocation; + +import robaertschi.environmenttech.client.renderer.EnvStorageRenderer; import static robaertschi.environmenttech.ET.MODID; diff --git a/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java index 7f30f69..264d6ef 100644 --- a/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java +++ b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java @@ -1,12 +1,19 @@ +/* + * EnvironmentTech Copyright (C) 2024 Robin Bärtschi + * This program comes with ABSOLUTELY NO WARRANTY; for details open the file LICENSE at the root of the source code. + * This is free software, and you are welcome to redistribute it + * under certain conditions; read the LICENSE file at the root of the source code for details. + */ package robaertschi.environmenttech.level.fluid; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.level.material.Fluid; import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.fluids.BaseFlowingFluid; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.material.Fluid; + import static robaertschi.environmenttech.ET.MODID; public class ETFluids {