From 1c61c0e3cc27d60b11ce912392e79807e2b6ba17 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 21 Jun 2023 01:39:48 +0200 Subject: [PATCH] [Feature] Accesor to generate colorable particles --- .../bclib/interfaces/ClientLevelAccess.java | 21 ++++++++ .../bclib/interfaces/LevelRendererAccess.java | 19 +++++++ .../bclib/mixin/client/ClientLevelMixin.java | 53 +++++++++++++++++++ .../mixin/client/LevelRendererMixin.java | 39 +++++++++++--- src/main/resources/bclib.mixins.client.json | 1 + 5 files changed, 126 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/betterx/bclib/interfaces/ClientLevelAccess.java create mode 100644 src/main/java/org/betterx/bclib/interfaces/LevelRendererAccess.java create mode 100644 src/main/java/org/betterx/bclib/mixin/client/ClientLevelMixin.java diff --git a/src/main/java/org/betterx/bclib/interfaces/ClientLevelAccess.java b/src/main/java/org/betterx/bclib/interfaces/ClientLevelAccess.java new file mode 100644 index 00000000..9e790cdb --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/ClientLevelAccess.java @@ -0,0 +1,21 @@ +package org.betterx.bclib.interfaces; + +import net.minecraft.client.particle.Particle; +import net.minecraft.core.particles.ParticleOptions; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +import org.jetbrains.annotations.Nullable; + +@Environment(EnvType.CLIENT) +public interface ClientLevelAccess { + @Nullable + LevelRendererAccess bcl_getLevelRenderer(); + @Nullable + Particle bcl_addParticle( + ParticleOptions particleOptions, + double x, double y, double z, + double vx, double vy, double vz + ); +} diff --git a/src/main/java/org/betterx/bclib/interfaces/LevelRendererAccess.java b/src/main/java/org/betterx/bclib/interfaces/LevelRendererAccess.java new file mode 100644 index 00000000..316b2d57 --- /dev/null +++ b/src/main/java/org/betterx/bclib/interfaces/LevelRendererAccess.java @@ -0,0 +1,19 @@ +package org.betterx.bclib.interfaces; + + +import net.minecraft.client.particle.Particle; +import net.minecraft.core.particles.ParticleOptions; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +import org.jetbrains.annotations.Nullable; + +@Environment(EnvType.CLIENT) +public interface LevelRendererAccess { + @Nullable Particle bcl_addParticle( + ParticleOptions particleOptions, + double x, double y, double z, + double vx, double vy, double vz + ); +} diff --git a/src/main/java/org/betterx/bclib/mixin/client/ClientLevelMixin.java b/src/main/java/org/betterx/bclib/mixin/client/ClientLevelMixin.java new file mode 100644 index 00000000..75e08f49 --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/client/ClientLevelMixin.java @@ -0,0 +1,53 @@ +package org.betterx.bclib.mixin.client; + +import org.betterx.bclib.interfaces.ClientLevelAccess; +import org.betterx.bclib.interfaces.LevelRendererAccess; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.core.particles.ParticleOptions; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import org.jetbrains.annotations.Nullable; + +@Mixin(ClientLevel.class) +@Environment(EnvType.CLIENT) +public class ClientLevelMixin implements ClientLevelAccess { + @Shadow + @Final + private LevelRenderer levelRenderer; + + @Override + @Nullable + public LevelRendererAccess bcl_getLevelRenderer() { + if (this.levelRenderer instanceof LevelRendererAccess a) { + return a; + } + return null; + } + + @Override + @Nullable + public Particle bcl_addParticle( + ParticleOptions particleOptions, + double x, + double y, + double z, + double vx, + double vy, + double vz + ) { + var renderer = this.bcl_getLevelRenderer(); + if (renderer != null) { + return renderer.bcl_addParticle(particleOptions, x, y, z, vx, vy, vz); + } + return null; + } +} diff --git a/src/main/java/org/betterx/bclib/mixin/client/LevelRendererMixin.java b/src/main/java/org/betterx/bclib/mixin/client/LevelRendererMixin.java index 90dc2b1c..02b5516d 100644 --- a/src/main/java/org/betterx/bclib/mixin/client/LevelRendererMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/client/LevelRendererMixin.java @@ -2,13 +2,16 @@ package org.betterx.bclib.mixin.client; import org.betterx.bclib.BCLib; import org.betterx.bclib.interfaces.AirSelectionItem; +import org.betterx.bclib.interfaces.LevelRendererAccess; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.Particle; import net.minecraft.client.renderer.*; import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleOptions; import net.minecraft.util.FastColor; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; @@ -19,6 +22,9 @@ import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -27,8 +33,11 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.jetbrains.annotations.Nullable; + @Mixin(LevelRenderer.class) -public abstract class LevelRendererMixin { +@Environment(EnvType.CLIENT) +public abstract class LevelRendererMixin implements LevelRendererAccess { @Final @Shadow private Minecraft minecraft; @@ -36,20 +45,36 @@ public abstract class LevelRendererMixin { @Final private RenderBuffers renderBuffers; + public Particle bcl_addParticle( + ParticleOptions particleOptions, + double x, double y, double z, + double vx, double vy, double vz + ) { + return this.addParticleInternal(particleOptions, false, x, y, z, vx, vy, vz); + } + @Shadow protected static void renderShape( PoseStack poseStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, + double x, double y, double z, + float r, float g, float b, float a + ) { + } + + @Shadow + @Nullable + protected abstract Particle addParticleInternal( + ParticleOptions particleOptions, + boolean bl, double d, double e, double f, - float g, - float h, - float i, - float j - ) { - } + double g, + double h, + double i + ); @Inject(method = "renderLevel", at = @At( value = "INVOKE", diff --git a/src/main/resources/bclib.mixins.client.json b/src/main/resources/bclib.mixins.client.json index 25c8491d..d4d075f0 100644 --- a/src/main/resources/bclib.mixins.client.json +++ b/src/main/resources/bclib.mixins.client.json @@ -7,6 +7,7 @@ "AnvilScreenMixin", "AtlasSetMixin", "BlockMixin", + "ClientLevelMixin", "ClientPacketListenerMixin", "ClientRecipeBookMixin", "FogRendererMixin",