From c20960c005e0b82db511a19707d5171898918cf2 Mon Sep 17 00:00:00 2001 From: SD Date: Mon, 11 Jan 2021 16:45:52 +0530 Subject: [PATCH] Start making a particle --- .../DimensionalDoorsClientInitializer.java | 10 ++- .../dimdoors/DimensionalDoorsInitializer.java | 2 + .../dimdev/dimdoors/client/MonolithModel.java | 2 +- .../dimdoors/client/MonolithRenderer.java | 3 +- .../dimdoors/entity/MonolithEntity.java | 38 ++++++------ .../mixin/DefaultParticleTypeAccessor.java | 14 +++++ .../dimdoors/particle/ModParticleTypes.java | 25 ++++++++ .../particle/client/MonolithParticle.java | 62 +++++++++++++++++++ src/main/resources/dimdoors.mixins.json | 1 + 9 files changed, 136 insertions(+), 21 deletions(-) create mode 100644 src/main/java/org/dimdev/dimdoors/mixin/DefaultParticleTypeAccessor.java create mode 100644 src/main/java/org/dimdev/dimdoors/particle/ModParticleTypes.java create mode 100644 src/main/java/org/dimdev/dimdoors/particle/client/MonolithParticle.java diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java index 431f8d99..b3aaca85 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsClientInitializer.java @@ -6,11 +6,18 @@ import org.dimdev.dimdoors.client.ModSkyRendering; import org.dimdev.dimdoors.entity.ModEntityTypes; import org.dimdev.dimdoors.entity.MonolithEntity; import org.dimdev.dimdoors.fluid.ModFluids; +import org.dimdev.dimdoors.particle.ModParticleTypes; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.network.PacketByteBuf; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; +import net.fabricmc.fabric.api.networking.v1.PacketSender; @Environment(EnvType.CLIENT) public class DimensionalDoorsClientInitializer implements ClientModInitializer { @@ -21,7 +28,8 @@ public class DimensionalDoorsClientInitializer implements ClientModInitializer { ModFluids.initClient(); ModBlockEntityTypes.initClient(); ModBlocks.initClient(); + ModParticleTypes.initClient(); - ClientSidePacketRegistry.INSTANCE.register(DimensionalDoorsInitializer.MONOLITH_PARTICLE_PACKET, MonolithEntity::spawnParticles); + ClientPlayNetworking.registerReceiver(DimensionalDoorsInitializer.MONOLITH_PARTICLE_PACKET, (client, networkHandler, buf, sender) -> MonolithEntity.spawnParticles(buf, client)); } } diff --git a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java index 2031a39e..aa9d2903 100644 --- a/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java +++ b/src/main/java/org/dimdev/dimdoors/DimensionalDoorsInitializer.java @@ -9,6 +9,7 @@ import org.dimdev.dimdoors.entity.ModEntityTypes; import org.dimdev.dimdoors.entity.stat.ModStats; import org.dimdev.dimdoors.fluid.ModFluids; import org.dimdev.dimdoors.item.ModItems; +import org.dimdev.dimdoors.particle.ModParticleTypes; import org.dimdev.dimdoors.pockets.SchematicHandler; import org.dimdev.dimdoors.pockets.SchematicV2Handler; import org.dimdev.dimdoors.rift.targets.Targets; @@ -71,6 +72,7 @@ public class DimensionalDoorsInitializer implements ModInitializer { ModCommands.init(); ModFluids.init(); ModSoundEvents.init(); + ModParticleTypes.init(); ModConfig.deserialize(); diff --git a/src/main/java/org/dimdev/dimdoors/client/MonolithModel.java b/src/main/java/org/dimdev/dimdoors/client/MonolithModel.java index d50b648c..5d93d311 100644 --- a/src/main/java/org/dimdev/dimdoors/client/MonolithModel.java +++ b/src/main/java/org/dimdev/dimdoors/client/MonolithModel.java @@ -33,4 +33,4 @@ public class MonolithModel extends EntityModel { this.body.yaw = netHeadYaw * 0.017453292F; this.body.pitch = headPitch * 0.017453292F; } -} \ No newline at end of file +} diff --git a/src/main/java/org/dimdev/dimdoors/client/MonolithRenderer.java b/src/main/java/org/dimdev/dimdoors/client/MonolithRenderer.java index 9ed4f726..5d3052a8 100644 --- a/src/main/java/org/dimdev/dimdoors/client/MonolithRenderer.java +++ b/src/main/java/org/dimdev/dimdoors/client/MonolithRenderer.java @@ -2,6 +2,7 @@ package org.dimdev.dimdoors.client; import java.util.List; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.dimdev.dimdoors.entity.MonolithEntity; @@ -12,7 +13,7 @@ import net.minecraft.util.Identifier; import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityRendererRegistry; public class MonolithRenderer extends LivingEntityRenderer { - private static final List MONOLITH_TEXTURES = Lists.newArrayList( + public static final List MONOLITH_TEXTURES = ImmutableList.of( new Identifier("dimdoors:textures/mob/monolith/monolith0.png"), new Identifier("dimdoors:textures/mob/monolith/monolith1.png"), new Identifier("dimdoors:textures/mob/monolith/monolith2.png"), diff --git a/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java b/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java index d4e7d4d1..0896b74c 100644 --- a/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java +++ b/src/main/java/org/dimdev/dimdoors/entity/MonolithEntity.java @@ -8,6 +8,7 @@ import org.dimdev.dimdoors.item.ModItems; import org.dimdev.dimdoors.sound.ModSoundEvents; import org.dimdev.dimdoors.world.ModDimensions; +import net.minecraft.client.MinecraftClient; import net.minecraft.entity.EntityDimensions; import net.minecraft.entity.EntityPose; import net.minecraft.entity.EntityType; @@ -33,6 +34,7 @@ import net.minecraft.world.WorldAccess; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.network.PacketContext; +import net.fabricmc.fabric.api.networking.v1.PacketSender; public class MonolithEntity extends MobEntity { public final EntityDimensions DIMENSIONS = EntityDimensions.fixed(3f, 6f); @@ -231,25 +233,25 @@ public class MonolithEntity extends MobEntity { return EYE_HEIGHT; } - @Environment(EnvType.CLIENT) - public static void spawnParticles(PacketContext context, PacketByteBuf data) { - PlayerEntity player = context.getPlayer(); - int aggro = data.readInt(); + public static void spawnParticles(PacketByteBuf data, MinecraftClient client) { + PlayerEntity player = MinecraftClient.getInstance().player; + int aggro = data.readInt(); - context.getTaskQueue().execute(() -> { - if (aggro < 120) { - return; - } - int count = 10 * aggro / MAX_AGGRO; - for (int i = 1; i < count; ++i) { - player.world.addParticle(ParticleTypes.PORTAL, player.getX() + (random.nextDouble() - 0.5D) * 3.0, - player.getY() + random.nextDouble() * player.getHeight() - 0.75D, - player.getZ() + (random.nextDouble() - 0.5D) * player.getWidth(), - (random.nextDouble() - 0.5D) * 2.0D, -random.nextDouble(), - (random.nextDouble() - 0.5D) * 2.0D); - } - }); - } + client.execute(() -> { + if (aggro < 120) { + return; + } + int count = 10 * aggro / MAX_AGGRO; + for (int i = 1; i < count; ++i) { + //noinspection ConstantConditions + player.world.addParticle(ParticleTypes.PORTAL, player.getX() + (random.nextDouble() - 0.5D) * 3.0, + player.getY() + random.nextDouble() * player.getHeight() - 0.75D, + player.getZ() + (random.nextDouble() - 0.5D) * player.getWidth(), + (random.nextDouble() - 0.5D) * 2.0D, -random.nextDouble(), + (random.nextDouble() - 0.5D) * 2.0D); + } + }); + } public float getAggroProgress() { return (float) this.aggro / MAX_AGGRO; diff --git a/src/main/java/org/dimdev/dimdoors/mixin/DefaultParticleTypeAccessor.java b/src/main/java/org/dimdev/dimdoors/mixin/DefaultParticleTypeAccessor.java new file mode 100644 index 00000000..54b96f5d --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/mixin/DefaultParticleTypeAccessor.java @@ -0,0 +1,14 @@ +package org.dimdev.dimdoors.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.particle.DefaultParticleType; + +@Mixin(DefaultParticleType.class) +public interface DefaultParticleTypeAccessor { + @Invoker("") + static DefaultParticleType createDefaultParticleType(boolean alwaysShow) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/particle/ModParticleTypes.java b/src/main/java/org/dimdev/dimdoors/particle/ModParticleTypes.java new file mode 100644 index 00000000..9b99956f --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/particle/ModParticleTypes.java @@ -0,0 +1,25 @@ +package org.dimdev.dimdoors.particle; + +import org.dimdev.dimdoors.mixin.DefaultParticleTypeAccessor; +import org.dimdev.dimdoors.particle.client.MonolithParticle; + +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; + +public class ModParticleTypes { + public static final DefaultParticleType MONOLITH = DefaultParticleTypeAccessor.createDefaultParticleType(false); + + public static void init() { + Registry.register(Registry.PARTICLE_TYPE, new Identifier("dimdoors", "monolith"), MONOLITH); + } + + @Environment(EnvType.CLIENT) + public static void initClient() { + ParticleFactoryRegistry.getInstance().register(MONOLITH, new MonolithParticle.Factory()); + } +} diff --git a/src/main/java/org/dimdev/dimdoors/particle/client/MonolithParticle.java b/src/main/java/org/dimdev/dimdoors/particle/client/MonolithParticle.java new file mode 100644 index 00000000..a5afbeef --- /dev/null +++ b/src/main/java/org/dimdev/dimdoors/particle/client/MonolithParticle.java @@ -0,0 +1,62 @@ +package org.dimdev.dimdoors.particle.client; + +import org.dimdev.dimdoors.client.MonolithModel; +import org.dimdev.dimdoors.client.MonolithRenderer; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleFactory; +import net.minecraft.client.particle.ParticleTextureSheet; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.client.util.math.Vector3f; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; + +@Environment(EnvType.CLIENT) +public class MonolithParticle extends Particle { + private final MonolithModel model; + private final RenderLayer layer; + + private MonolithParticle(ClientWorld world, double x, double y, double z) { + super(world, x, y, z); + this.maxAge = 30; + this.model = new MonolithModel(); + this.layer = RenderLayer.getEntitySolid(MonolithRenderer.MONOLITH_TEXTURES.get(14)); + } + + @Override + public void buildGeometry(VertexConsumer vertexConsumer, Camera camera, float tickDelta) { + float delta = ((float)this.age + tickDelta) / (float)this.maxAge; + MatrixStack matrices = new MatrixStack(); + matrices.multiply(camera.getRotation()); + matrices.multiply(Vector3f.POSITIVE_X.getDegreesQuaternion(150.0F * delta - 60.0F)); + matrices.scale(-1.0F, -1.0F, 1.0F); + matrices.translate(0.0D, -1.1009999513626099D, 1.5D); + VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); + VertexConsumer vertexConsumer2 = immediate.getBuffer(this.layer); + this.model.render(matrices, vertexConsumer2, 0xf000f0, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + immediate.draw(); + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.CUSTOM; + } + + public static class Factory implements ParticleFactory { + @Nullable + @Override + public Particle createParticle(DefaultParticleType parameters, ClientWorld world, double x, double y, double z, double velocityX, double velocityY, double velocityZ) { + return new MonolithParticle(world, x, y, z); + } + } +} diff --git a/src/main/resources/dimdoors.mixins.json b/src/main/resources/dimdoors.mixins.json index 231dfd23..efa953a9 100644 --- a/src/main/resources/dimdoors.mixins.json +++ b/src/main/resources/dimdoors.mixins.json @@ -7,6 +7,7 @@ "ChunkGeneratorAccessor", "ChunkGeneratorSettingsAccessor", "DefaultBiomeFeaturesMixin", + "DefaultParticleTypeAccessor", "DimensionTypeAccessor", "DirectionAccessor", "GenerationSettingsAccessor",