From 2a2d257f01c5107dbcfca62626d786836dd3fd77 Mon Sep 17 00:00:00 2001 From: Robin Date: Sun, 30 Jun 2024 16:51:37 +0200 Subject: [PATCH] add env fluid with unused textures as they look like shit --- build.gradle.kts | 2 +- gradle.properties | 2 +- .../environmenttech/EnvironmentTech.java | 4 + .../environmenttech/client/ETClient.java | 2 + .../environmenttech/client/RenderUtils.java | 144 ++++++++++++++++++ .../renderer/EnvDistributorRenderer.java | 26 ++++ .../level/fluid/ETFluidTypes.java | 56 +++++++ .../environmenttech/level/fluid/ETFluids.java | 26 ++++ .../textures/block/env_flow.png | Bin 0 -> 1377 bytes .../textures/block/env_flow.png.mcmeta | 3 + .../textures/block/env_still.png | Bin 0 -> 7138 bytes .../textures/block/env_still.png.mcmeta | 5 + 12 files changed, 268 insertions(+), 2 deletions(-) create mode 100644 src/main/java/robaertschi/environmenttech/client/RenderUtils.java create mode 100644 src/main/java/robaertschi/environmenttech/level/block/entity/renderer/EnvDistributorRenderer.java create mode 100644 src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java create mode 100644 src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java create mode 100644 src/main/resources/assets/environmenttech/textures/block/env_flow.png create mode 100644 src/main/resources/assets/environmenttech/textures/block/env_flow.png.mcmeta create mode 100644 src/main/resources/assets/environmenttech/textures/block/env_still.png create mode 100644 src/main/resources/assets/environmenttech/textures/block/env_still.png.mcmeta diff --git a/build.gradle.kts b/build.gradle.kts index c98ed9f..61b2a5c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { idea `maven-publish` id("io.freefair.lombok") version "8.6" - id ("net.neoforged.gradle.userdev") version ("7.0.151") + id ("net.neoforged.gradle.userdev") version ("7.0.152") id("com.diffplug.spotless") version "7.0.0.BETA1" } diff --git a/gradle.properties b/gradle.properties index c4d917c..8f383b7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ minecraftVersion=1.21.0 # as they do not follow standard versioning conventions. minecraftVersionRange=[1.21.0,1.22) # The Neo version must agree with the Minecraft version to get a valid artifact -neoVersion=21.0.37-beta +neoVersion=21.0.42-beta # The Neo version range can use any version of Neo as bounds neoVersionRange=[21,) # The loader version range can only use the major version of FML as bounds diff --git a/src/main/java/robaertschi/environmenttech/EnvironmentTech.java b/src/main/java/robaertschi/environmenttech/EnvironmentTech.java index 0ea0cf3..a1db8ea 100644 --- a/src/main/java/robaertschi/environmenttech/EnvironmentTech.java +++ b/src/main/java/robaertschi/environmenttech/EnvironmentTech.java @@ -25,6 +25,8 @@ import robaertschi.environmenttech.data.components.ETComponents; import robaertschi.environmenttech.data.recipes.ETRecipes; import robaertschi.environmenttech.level.block.ETBlocks; import robaertschi.environmenttech.level.block.entity.ETBlockEntities; +import robaertschi.environmenttech.level.fluid.ETFluidTypes; +import robaertschi.environmenttech.level.fluid.ETFluids; import robaertschi.environmenttech.level.item.ETItems; import robaertschi.environmenttech.level.particle.ETParticles; import robaertschi.environmenttech.menu.ETMenus; @@ -54,6 +56,8 @@ public class EnvironmentTech ETMenus.init(modEventBus); ETParticles.init(modEventBus); ETComponents.init(modEventBus); + ETFluids.init(modEventBus); + ETFluidTypes.init(modEventBus); ETCompat.init(modEventBus); NeoForge.EVENT_BUS.register(this); diff --git a/src/main/java/robaertschi/environmenttech/client/ETClient.java b/src/main/java/robaertschi/environmenttech/client/ETClient.java index 6552367..a10cd2c 100644 --- a/src/main/java/robaertschi/environmenttech/client/ETClient.java +++ b/src/main/java/robaertschi/environmenttech/client/ETClient.java @@ -20,6 +20,7 @@ import robaertschi.environmenttech.data.components.ETComponents; import robaertschi.environmenttech.data.components.FilledComponent; import robaertschi.environmenttech.level.block.entity.ETBlockEntities; import robaertschi.environmenttech.level.block.entity.renderer.EnvCollectorRenderer; +import robaertschi.environmenttech.level.block.entity.renderer.EnvDistributorRenderer; import robaertschi.environmenttech.level.item.ETItems; import robaertschi.environmenttech.level.particle.ETParticles; import robaertschi.environmenttech.menu.ETMenus; @@ -44,6 +45,7 @@ public class ETClient { @SubscribeEvent public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) { event.registerBlockEntityRenderer(ETBlockEntities.ENV_COLLECTOR_BLOCK_ENTITY.get(), EnvCollectorRenderer::new); + event.registerBlockEntityRenderer(ETBlockEntities.ENV_DISTRIBUTOR_BLOCK_ENTITY.get(), EnvDistributorRenderer::new); } @SubscribeEvent diff --git a/src/main/java/robaertschi/environmenttech/client/RenderUtils.java b/src/main/java/robaertschi/environmenttech/client/RenderUtils.java new file mode 100644 index 0000000..a3c28f0 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/client/RenderUtils.java @@ -0,0 +1,144 @@ +package robaertschi.environmenttech.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +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; + +public class RenderUtils { + public static void vertex(VertexConsumer consumer, + PoseStack stack, + float x, float y, float z, + float u, float v, + int packedLight, + int color) { + consumer.addVertex(stack.last().pose(), x, y, z) + .setColor(color) + .setUv(u, v) + .setLight(packedLight) + .setNormal(1, 0, 0); + } + + public static void quad(VertexConsumer consumer, + PoseStack stack, + int packedLight, int color, + float x0, float y0, float z0, + float x1, float y1, float z1, + float u0, float v0, float u1, float v1 + ) { + vertex(consumer, stack, x0, y0, z0, u0, v0, packedLight, color); + vertex(consumer, stack, x0, y1, z1, u0, v1, packedLight, color); + vertex(consumer, stack, x1, y1, z1, u1, v1, packedLight, color); + vertex(consumer, stack, x1, y0, z0, u1, v0, packedLight, color); + } + + + public static void quadReversed(VertexConsumer consumer, + PoseStack stack, + int packedLight, int color, + float x0, float y0, float z0, + float x1, float y1, float z1, + float u0, float v0, float u1, float v1 + ) { + vertex(consumer, stack, x0, y0, z0, u0, v0, packedLight, color); + vertex(consumer, stack, x1, y0, z1, u1, v0, packedLight, color); + vertex(consumer, stack, x1, y1, z1, u1, v1, packedLight, color); + vertex(consumer, stack, x0, y1, z0, u0, v1, packedLight, color); + } + + 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(); + float depth = end.z() - start.z(); + + float u0 = sprite.getU0(); + float v0 = sprite.getV0(); + float u1 = sprite.getU1(); + float v1 = sprite.getV1(); + + stack.pushPose(); + stack.translate(-relativeStart.x(), -relativeStart.y(), -relativeStart.z()); + + // Front + quad(consumer, stack, packedLight, color, 0, 0, 0, width, height, 0, u0, v0, u1, v1); + + // Back + quad(consumer, stack, packedLight, color, width, 0, depth, 0, height, depth, u0, v0, u1, v1); + + // Top + quad(consumer, stack, packedLight, color, 0, height, 0, width, height, depth, u0, v0, u1, v1); + + // Bottom + quad(consumer, stack, packedLight, color, 0, 0, depth, width, 0, 0, u0, v0, u1, v1); + + // Right + quadReversed(consumer, stack, packedLight, color, 0, 0, 0, 0, height, depth, u0, v0, u1, v1); + + // Left + quadReversed(consumer, stack, packedLight, color, width, 0, depth, width, height, 0, u0, v0, u1, v1); + + stack.popPose(); + } + + @ParametersAreNonnullByDefault + public static void renderFluidBox(PoseStack poseStack, + MultiBufferSource bufferSource, + int packedLight, + RenderType renderType, + ResourceLocation stillTexture, + int tintColor, + long amount, + long capacity, + Vector3f start, + Vector3f end, + BlockPos blockPos + ) { + 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())); + + cuboid(consumer, poseStack, blockPos, start, end, sprite, packedLight, tintColor); + } + + public static void renderFluidBox(FluidStack fluidStack, + PoseStack stack, + MultiBufferSource bufferSource, + int packedLight, + long amount, + long capacity, + Vector3f start, + Vector3f end, + BlockPos blockPos + ) { + 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 + ); + } +} 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 new file mode 100644 index 0000000..b6aca3f --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/level/block/entity/renderer/EnvDistributorRenderer.java @@ -0,0 +1,26 @@ +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 javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class EnvDistributorRenderer implements BlockEntityRenderer { + @SuppressWarnings("unused") + 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); + + + + + poseStack.popPose(); + } +} diff --git a/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java new file mode 100644 index 0000000..284cbc3 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluidTypes.java @@ -0,0 +1,56 @@ +package robaertschi.environmenttech.level.fluid; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.resources.ResourceLocation; +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 static robaertschi.environmenttech.ET.MODID; + +public class ETFluidTypes { + + public static final ResourceLocation WATER_STILL_RL = ResourceLocation.withDefaultNamespace("block/water_still"); + public static final ResourceLocation WATER_FLOWING_RL = ResourceLocation.withDefaultNamespace("block/water_flow"); + + public static final DeferredRegister FLUID_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.FLUID_TYPES, MODID); + + public static final DeferredHolder ENV = FLUID_TYPES.register("env", + resourceLocation -> new FluidType( + FluidType.Properties.create().density(15).viscosity(5) + ) { + @Override + @MethodsReturnNonnullByDefault + @ParametersAreNonnullByDefault + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public int getTintColor() { + return EnvStorageRenderer.to; + } + + @Override + public ResourceLocation getFlowingTexture() { + return WATER_FLOWING_RL; + } + + @Override + public ResourceLocation getStillTexture() { + return WATER_STILL_RL; + } + }); + } + } + ); + + public static void init(IEventBus modEventBus) { + FLUID_TYPES.register(modEventBus); + } +} diff --git a/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java new file mode 100644 index 0000000..7f30f69 --- /dev/null +++ b/src/main/java/robaertschi/environmenttech/level/fluid/ETFluids.java @@ -0,0 +1,26 @@ +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 static robaertschi.environmenttech.ET.MODID; + +public class ETFluids { + + public static final DeferredRegister FLUIDS = DeferredRegister.create(BuiltInRegistries.FLUID, MODID); + + + public static final DeferredHolder ENV_FLOWING = FLUIDS.register("env_flowing", resourceLocation -> new BaseFlowingFluid.Flowing(ETFluids.ENV_PROPERTIES)); + public static final DeferredHolder ENV_STILL = FLUIDS.register("env", resourceLocation -> new BaseFlowingFluid.Source(ETFluids.ENV_PROPERTIES)); + public static final BaseFlowingFluid.Properties ENV_PROPERTIES = new BaseFlowingFluid.Properties(ETFluidTypes.ENV, ENV_STILL, ENV_FLOWING) + .slopeFindDistance(2).levelDecreasePerBlock(2); + + + public static void init(IEventBus modEventBus) { + FLUIDS.register(modEventBus); + } +} diff --git a/src/main/resources/assets/environmenttech/textures/block/env_flow.png b/src/main/resources/assets/environmenttech/textures/block/env_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..b0816810274822e5b42bec89f82575c159d7ef06 GIT binary patch literal 1377 zcmeAS@N?(olHy`uVBq!ia0vp^3JeTP3><7g)??4S*FcJ~ILO_JVcj{ImkbQ7(w;7k zAr*7p-m%VmY#`9^urpz|?_+5Wt0r!_g#MY)OKvl72zY<&0`HX_y|Z;E39b-~pVmBe z;vZ(6IVVIcXm4D#tj)}Zwz@-!5>FmKP7Z4no&Qh7 z`rZt;n<`1o&+RsL+LaZkD_wjo@2w=WrNl3Hx7wTxB_Z9*a|7?T7r*-~lp*x+NrZIl z_0X>ilg+*z2w$_RNmpv&$Wr6V7bFVfmzUAjF==bWFT!i5A z2>FS2|Bu|u596~tJMlwNX8fkg%|rEJ@R zd9CHI#ko~03$2W3+IX_!Jj>P4r*kGx|NQgMy8J6OT)#WSJnhx9CgphX7B$QBwI5Bk zy6XPwN0Lz8^{Dl4H}BvIT3F4p+kc1oBF>CsOVj@v@EkqpEt;FPEmF#KvPr2o|Ki-+ zFXI=p?^Eua#qu`7_Z6@7Lt#U+3wxVibIp3!vUBU3IkV@!+1t-2al5JV{qiI2i5=kz z<`ci9oVBpordFa8>*)LPblbmm>PK#MJW-#UyMA@LMB7gzpR)niF*_RV~mNwzPuU$Vn?M=OVMdxZWm8ebY zUc0zFDcY%XYPZ=kt{I>FXHU8@$vEE5?_hS8ak0_*(=2Ds#OIhC{;{ed_qO*gt-Y18 zY8x_H-|V_BDRaB-=8-LLE&6J+uCg5eef|3N$VD8SPE8XOR4}MbJ168!a)@|&R=Yt^ z5mOqh=cJyEfM?391+T4M?(*C7eKVu+?|(<*6wJ!Etv|5dT&aac(a}Rd2!o1T({$zB zvXI6*@2+o~zqaYDwm|le-8~$ND=irn1;IL&*a=L!@_wZQlJ1mZ#hF4J|Nkv0*89c7 zQQvpBEBoKEg}wNk=lSvW#@-muY_$!tuPwC#CLifH#p$L_HGwtX-<(_}vs1(O&0CUM@bY!t ze*W8MwHCbHw%#FgiG02bMr=Z(c+(D+jk=+4p1UhmaT+W#ZSGP~`Dtbf_9tdC(AhVy z{^%;N8~V$amThJ+TkjyT|9pqQq!*6%7y?{Z(qrY5-yOGk;Zu>PorvW@b7(6nm@aquVHX&!ImCD cKKRezd+YYZ2V0IQ0?SMWPgg&ebxsLQ08+|H%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/environmenttech/textures/block/env_flow.png.mcmeta b/src/main/resources/assets/environmenttech/textures/block/env_flow.png.mcmeta new file mode 100644 index 0000000..4f0718a --- /dev/null +++ b/src/main/resources/assets/environmenttech/textures/block/env_flow.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": {} +} \ No newline at end of file diff --git a/src/main/resources/assets/environmenttech/textures/block/env_still.png b/src/main/resources/assets/environmenttech/textures/block/env_still.png new file mode 100644 index 0000000000000000000000000000000000000000..434df7d8da3b931755ff3b3be1ce91693ea71abe GIT binary patch literal 7138 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/environmenttech/textures/block/env_still.png.mcmeta b/src/main/resources/assets/environmenttech/textures/block/env_still.png.mcmeta new file mode 100644 index 0000000..0645f48 --- /dev/null +++ b/src/main/resources/assets/environmenttech/textures/block/env_still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +}