From 400942b6f8b1d89b1ea89bb632dd88e2c4ff6152 Mon Sep 17 00:00:00 2001 From: Jenny Date: Tue, 21 Jan 2025 16:59:40 +0100 Subject: [PATCH] more entity rendering & fix correct tnt on chain explosion --- .../jenny/compressedtnt/Compressedtnt.java | 13 +--- .../compressedtnt/blocks/ClusterTNTBlock.java | 28 ++++++--- .../compressedtnt/blocks/homingTNTBlock.java | 13 +++- .../blocks/strongerTNTBlock.java | 14 ++++- .../entities/ClusterPrimedTNT.java | 20 +++---- .../entities/StrongerPrimedTNT.java | 21 +++---- ...{BasePrimedTNT.java => basePrimedTNT.java} | 28 ++++++--- .../entities/client/BaseTNTRenderer.java | 18 +++--- .../entities/client/clusterTNTRenderer.java | 53 +++++++++++++++++ .../entities/client/strongerTNTRenderer.java | 59 +++++++++++++++++++ .../compressedtnt/entities/entities.java | 23 +++++++- .../entities/homingPrimedTNT.java | 17 +----- .../compressedtnt/blockstates/tnt_homing.json | 7 +++ .../compressedtnt/recipes/tnt_homing.json | 15 +++++ 14 files changed, 251 insertions(+), 78 deletions(-) rename src/main/java/com/jenny/compressedtnt/entities/{BasePrimedTNT.java => basePrimedTNT.java} (82%) create mode 100644 src/main/java/com/jenny/compressedtnt/entities/client/clusterTNTRenderer.java create mode 100644 src/main/java/com/jenny/compressedtnt/entities/client/strongerTNTRenderer.java create mode 100644 src/main/resources/assets/compressedtnt/blockstates/tnt_homing.json create mode 100644 src/main/resources/data/compressedtnt/recipes/tnt_homing.json diff --git a/src/main/java/com/jenny/compressedtnt/Compressedtnt.java b/src/main/java/com/jenny/compressedtnt/Compressedtnt.java index 2ae7aae..9ecc41f 100644 --- a/src/main/java/com/jenny/compressedtnt/Compressedtnt.java +++ b/src/main/java/com/jenny/compressedtnt/Compressedtnt.java @@ -1,13 +1,10 @@ package com.jenny.compressedtnt; import com.jenny.compressedtnt.blocks.blocks; -import com.jenny.compressedtnt.entities.client.BaseTNTRenderer; import com.jenny.compressedtnt.entities.entities; import com.mojang.logging.LogUtils; -import net.minecraft.client.renderer.entity.EntityRenderers; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.event.server.ServerStartingEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -37,20 +34,12 @@ public class Compressedtnt { // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); - - // Register the item to a creative tab - modEventBus.addListener(this::addCreative); } private void commonSetup(final FMLCommonSetupEvent event) { } - // Add the example block item to the building blocks tab - private void addCreative(BuildCreativeModeTabContentsEvent event) { - - } - // You can use SubscribeEvent and let the Event Bus discover methods to call @SubscribeEvent public void onServerStarting(ServerStartingEvent event) { @@ -63,7 +52,7 @@ public class Compressedtnt { @SubscribeEvent public static void onClientSetup(FMLClientSetupEvent event) { - EntityRenderers.register(entities.TNT_HOMING.get(), pContext -> new BaseTNTRenderer(pContext, blocks.TNT_HOMING.get())); + entities.registerRenderers(); } } } \ No newline at end of file diff --git a/src/main/java/com/jenny/compressedtnt/blocks/ClusterTNTBlock.java b/src/main/java/com/jenny/compressedtnt/blocks/ClusterTNTBlock.java index eeec61a..2ef8705 100644 --- a/src/main/java/com/jenny/compressedtnt/blocks/ClusterTNTBlock.java +++ b/src/main/java/com/jenny/compressedtnt/blocks/ClusterTNTBlock.java @@ -8,6 +8,7 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.TntBlock; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -32,7 +33,7 @@ public class ClusterTNTBlock extends TntBlock { this.childRange = childRange; } - + @Override public void onCaughtFire(@NotNull BlockState state, @NotNull Level world, @NotNull BlockPos pos, @Nullable Direction face, @Nullable LivingEntity igniter) { explode(world, pos, igniter, this.pRadius, this.fuseTime, this.childCount, this.childRange); } @@ -42,20 +43,33 @@ public class ClusterTNTBlock extends TntBlock { explode(p_57434_, p_57435_, (LivingEntity)null, pRadius, fuseTime, childCount, childRange); } + public static Vec3 getMove(Level level, int childRange) { + RandomSource rng = level.getRandom(); + float offsetX = (float) rng.nextInt(- childRange, childRange + 1) / 15; + float offsetZ = (float) rng.nextInt(- childRange, childRange + 1) / 15; + return new Vec3(offsetX, 0, offsetZ); + } + @Deprecated private static void explode(Level level, BlockPos blockPos, @Nullable LivingEntity entity, float pRadius, int fuseTime, int childCount, int childRange) { - RandomSource rng = level.getRandom(); - float offsetX, offsetZ; if (!level.isClientSide) { for (int i = 0; i < childCount; i++) { - offsetX = (float) rng.nextInt(- childRange, childRange + 1) / 15; - offsetZ = (float) rng.nextInt(- childRange, childRange + 1) / 15; - Vec3 move = new Vec3(offsetX, 0, offsetZ); - ClusterPrimedTNT primedtnt = new ClusterPrimedTNT(level, (double) blockPos.getX() + (double) 0.5F, (double) blockPos.getY(), (double) blockPos.getZ() + (double) 0.5F, entity, pRadius, fuseTime, move); + ClusterPrimedTNT primedtnt = new ClusterPrimedTNT(level, (double) blockPos.getX() + (double) 0.5F, (double) blockPos.getY(), (double) blockPos.getZ() + (double) 0.5F, entity, pRadius, fuseTime, getMove(level, childRange)); level.addFreshEntity(primedtnt); level.gameEvent(entity, GameEvent.PRIME_FUSE, blockPos); } level.playSound((Player) null, blockPos.getX(), blockPos.getY(), blockPos.getZ(), SoundEvents.TNT_PRIMED, SoundSource.BLOCKS, 1.0F, 1.0F); } } + + @Override + public void wasExploded(Level level, BlockPos blockPos, Explosion pExplosion) { + if (!level.isClientSide) { + for (int i = 0; i < childCount; i++) { + int ft = (short) (level.random.nextInt(fuseTime / 4) + fuseTime / 8); + ClusterPrimedTNT primedtnt = new ClusterPrimedTNT(level, (double) blockPos.getX() + (double) 0.5F, (double) blockPos.getY(), (double) blockPos.getZ() + (double) 0.5F, pExplosion.getIndirectSourceEntity(), pRadius, ft, getMove(level, childRange)); + level.addFreshEntity(primedtnt); + } + } + } } diff --git a/src/main/java/com/jenny/compressedtnt/blocks/homingTNTBlock.java b/src/main/java/com/jenny/compressedtnt/blocks/homingTNTBlock.java index f098a5b..dba1d8c 100644 --- a/src/main/java/com/jenny/compressedtnt/blocks/homingTNTBlock.java +++ b/src/main/java/com/jenny/compressedtnt/blocks/homingTNTBlock.java @@ -7,6 +7,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.TntBlock; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -27,7 +28,7 @@ public class homingTNTBlock extends TntBlock { this.speed = speed; } - + @Override public void onCaughtFire(@NotNull BlockState state, @NotNull Level world, @NotNull BlockPos pos, @Nullable Direction face, @Nullable LivingEntity igniter) { explode(world, pos, igniter, this.pRadius, this.fuseTime, this.speed); } @@ -46,4 +47,14 @@ public class homingTNTBlock extends TntBlock { level.gameEvent(entity, GameEvent.PRIME_FUSE, blockPos); } } + + @Override + public void wasExploded(Level level, BlockPos blockPos, Explosion pExplosion) { + if (!level.isClientSide) { + homingPrimedTNT primedtnt = new homingPrimedTNT(level, (double) blockPos.getX() + (double) 0.5F, (double) blockPos.getY(), (double) blockPos.getZ() + (double) 0.5F, pExplosion.getIndirectSourceEntity(), pRadius, fuseTime, speed); + int i = primedtnt.getFuse(); + primedtnt.setFuse((short) (level.random.nextInt(i / 4) + i / 8)); + level.addFreshEntity(primedtnt); + } + } } diff --git a/src/main/java/com/jenny/compressedtnt/blocks/strongerTNTBlock.java b/src/main/java/com/jenny/compressedtnt/blocks/strongerTNTBlock.java index 7709e65..6fa515e 100644 --- a/src/main/java/com/jenny/compressedtnt/blocks/strongerTNTBlock.java +++ b/src/main/java/com/jenny/compressedtnt/blocks/strongerTNTBlock.java @@ -7,6 +7,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.TntBlock; import net.minecraft.world.level.block.state.BlockBehaviour; @@ -25,7 +26,7 @@ public class strongerTNTBlock extends TntBlock { this.fuseTime = fuseTime; } - + @Override public void onCaughtFire(BlockState state, Level world, BlockPos pos, @Nullable Direction face, @Nullable LivingEntity igniter) { explode(world, pos, igniter, this.pRadius, this.fuseTime); } @@ -45,4 +46,15 @@ public class strongerTNTBlock extends TntBlock { } } + + @Override + public void wasExploded(Level level, BlockPos blockPos, Explosion pExplosion) { + if (!level.isClientSide) { + int ft = (short) (level.random.nextInt(fuseTime / 4) + fuseTime / 8); + StrongerPrimedTNT primedtnt = new StrongerPrimedTNT(level, (double) blockPos.getX() + (double) 0.5F, (double) blockPos.getY(), (double) blockPos.getZ() + (double) 0.5F, pExplosion.getIndirectSourceEntity(), pRadius, ft); + int i = primedtnt.getFuse(); + primedtnt.setFuse((short) (level.random.nextInt(i / 4) + i / 8)); + level.addFreshEntity(primedtnt); + } + } } diff --git a/src/main/java/com/jenny/compressedtnt/entities/ClusterPrimedTNT.java b/src/main/java/com/jenny/compressedtnt/entities/ClusterPrimedTNT.java index c82cebc..5e88ebc 100644 --- a/src/main/java/com/jenny/compressedtnt/entities/ClusterPrimedTNT.java +++ b/src/main/java/com/jenny/compressedtnt/entities/ClusterPrimedTNT.java @@ -1,25 +1,23 @@ package com.jenny.compressedtnt.entities; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.item.PrimedTnt; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import javax.annotation.Nullable; -public class ClusterPrimedTNT extends PrimedTnt { - final float pRadius; +public class ClusterPrimedTNT extends basePrimedTNT { - public ClusterPrimedTNT (Level pLevel, double pX, double pY, double pZ, @Nullable LivingEntity pOwner, float pRadius, int fuseTime, Vec3 move) { - super(pLevel, pX, pY, pZ, pOwner); - this.pRadius = pRadius; - this.setFuse(fuseTime); + public ClusterPrimedTNT (Level pLevel, double pX, double pY, double pZ, @Nullable LivingEntity pOwner, float power, int fuse, Vec3 move) { + super(entities.TNT_CLUSTER.get(), pLevel, pOwner); + this.setPos(pX, pY, pZ); + this.setFuse(fuse); + this.setPower(power); this.addDeltaMovement(move); } - @Override - protected void explode() { - float $$0 = pRadius; - this.level().explode(this, this.getX(), this.getY((double)0.0625F), this.getZ(), pRadius, Level.ExplosionInteraction.TNT); + public ClusterPrimedTNT(EntityType entityType, Level level) { + super(entityType, level, null); } } diff --git a/src/main/java/com/jenny/compressedtnt/entities/StrongerPrimedTNT.java b/src/main/java/com/jenny/compressedtnt/entities/StrongerPrimedTNT.java index 37cd7ec..3e2f997 100644 --- a/src/main/java/com/jenny/compressedtnt/entities/StrongerPrimedTNT.java +++ b/src/main/java/com/jenny/compressedtnt/entities/StrongerPrimedTNT.java @@ -1,23 +1,20 @@ package com.jenny.compressedtnt.entities; +import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.item.PrimedTnt; import net.minecraft.world.level.Level; import javax.annotation.Nullable; -public class StrongerPrimedTNT extends PrimedTnt { - final float pRadius; - - public StrongerPrimedTNT (Level pLevel, double pX, double pY, double pZ, @Nullable LivingEntity pOwner, float pRadius, int fuseTime) { - super(pLevel, pX, pY, pZ, pOwner); - this.pRadius = pRadius; - this.setFuse(fuseTime); +public class StrongerPrimedTNT extends basePrimedTNT { + public StrongerPrimedTNT (Level pLevel, double pX, double pY, double pZ, @Nullable LivingEntity pOwner, float power, int fuse) { + super(entities.TNT_STRONGER.get(), pLevel, pOwner); + this.setPos(pX, pY, pZ); + this.setFuse(fuse); + this.setPower(power); } - @Override - protected void explode() { - float $$0 = pRadius; - this.level().explode(this, this.getX(), this.getY((double)0.0625F), this.getZ(), pRadius, Level.ExplosionInteraction.TNT); + public StrongerPrimedTNT(EntityType entityType, Level level) { + super(entityType, level, null); } } diff --git a/src/main/java/com/jenny/compressedtnt/entities/BasePrimedTNT.java b/src/main/java/com/jenny/compressedtnt/entities/basePrimedTNT.java similarity index 82% rename from src/main/java/com/jenny/compressedtnt/entities/BasePrimedTNT.java rename to src/main/java/com/jenny/compressedtnt/entities/basePrimedTNT.java index 4503b26..876a040 100644 --- a/src/main/java/com/jenny/compressedtnt/entities/BasePrimedTNT.java +++ b/src/main/java/com/jenny/compressedtnt/entities/basePrimedTNT.java @@ -5,21 +5,24 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.MoverType; -import net.minecraft.world.entity.TraceableEntity; +import net.minecraft.world.entity.*; import net.minecraft.world.level.Level; -public abstract class BasePrimedTNT extends Entity implements TraceableEntity { - private static final EntityDataAccessor DATA_FUSE_ID = SynchedEntityData.defineId(BasePrimedTNT.class, EntityDataSerializers.INT); - private static final EntityDataAccessor DATA_POWER_ID = SynchedEntityData.defineId(BasePrimedTNT.class, EntityDataSerializers.FLOAT); +import javax.annotation.Nullable; - public BasePrimedTNT(EntityType pEntityType, Level pLevel) { +public abstract class basePrimedTNT extends Entity implements TraceableEntity { + private static final EntityDataAccessor DATA_FUSE_ID = SynchedEntityData.defineId(basePrimedTNT.class, EntityDataSerializers.INT); + private static final EntityDataAccessor DATA_POWER_ID = SynchedEntityData.defineId(basePrimedTNT.class, EntityDataSerializers.FLOAT); + + @Nullable + private LivingEntity owner; + + public basePrimedTNT(EntityType pEntityType, Level pLevel, @Nullable LivingEntity owner) { super(pEntityType, pLevel); double d0 = pLevel.random.nextDouble() * (double)((float)Math.PI * 2F); this.setDeltaMovement(-Math.sin(d0) * 0.02D, (double)0.2F, -Math.cos(d0) * 0.02D); this.blocksBuilding = true; + this.owner = owner; } protected void explode() { @@ -91,4 +94,13 @@ public abstract class BasePrimedTNT extends Entity implements TraceableEntity { this.setFuse(pCompound.getShort("Fuse")); this.setPower(pCompound.getFloat("Power")); } + + @Nullable + public LivingEntity getOwner() { + return this.owner; + } + + public void setOwner(LivingEntity owner) { + this.owner = owner; + } } diff --git a/src/main/java/com/jenny/compressedtnt/entities/client/BaseTNTRenderer.java b/src/main/java/com/jenny/compressedtnt/entities/client/BaseTNTRenderer.java index d58051b..65b2656 100644 --- a/src/main/java/com/jenny/compressedtnt/entities/client/BaseTNTRenderer.java +++ b/src/main/java/com/jenny/compressedtnt/entities/client/BaseTNTRenderer.java @@ -1,7 +1,6 @@ package com.jenny.compressedtnt.entities.client; -import com.jenny.compressedtnt.blocks.blocks; -import com.jenny.compressedtnt.entities.BasePrimedTNT; +import com.jenny.compressedtnt.entities.basePrimedTNT; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import net.minecraft.client.renderer.MultiBufferSource; @@ -14,16 +13,18 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.level.block.Block; -public class BaseTNTRenderer extends EntityRenderer { - private final BlockRenderDispatcher blockRenderer; +public class BaseTNTRenderer extends EntityRenderer { + private BlockRenderDispatcher blockRenderer; + private final Block block; public BaseTNTRenderer(EntityRendererProvider.Context pContext, Block block) { super(pContext); this.shadowRadius = 0.5F; this.blockRenderer = pContext.getBlockRenderDispatcher(); + this.block = block; } - public void render(BasePrimedTNT pEntity, float pEntityYaw, float pPartialTicks, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight) { + public void render(basePrimedTNT pEntity, float pEntityYaw, float pPartialTicks, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight) { pPoseStack.pushPose(); pPoseStack.translate(0.0F, 0.5F, 0.0F); int i = pEntity.getFuse(); @@ -39,15 +40,12 @@ public class BaseTNTRenderer extends EntityRenderer { pPoseStack.mulPose(Axis.YP.rotationDegrees(-90.0F)); pPoseStack.translate(-0.5F, -0.5F, 0.5F); pPoseStack.mulPose(Axis.YP.rotationDegrees(90.0F)); - TntMinecartRenderer.renderWhiteSolidBlock(this.blockRenderer, blocks.TNT_HOMING.get().defaultBlockState(), pPoseStack, pBuffer, pPackedLight, i / 5 % 2 == 0); + TntMinecartRenderer.renderWhiteSolidBlock(this.blockRenderer, block.defaultBlockState(), pPoseStack, pBuffer, pPackedLight, i / 5 % 2 == 0); pPoseStack.popPose(); super.render(pEntity, pEntityYaw, pPartialTicks, pPoseStack, pBuffer, pPackedLight); } - /** - * Returns the location of an entity's texture. - */ - public ResourceLocation getTextureLocation(BasePrimedTNT pEntity) { + public ResourceLocation getTextureLocation(basePrimedTNT pEntity) { return TextureAtlas.LOCATION_BLOCKS; } } diff --git a/src/main/java/com/jenny/compressedtnt/entities/client/clusterTNTRenderer.java b/src/main/java/com/jenny/compressedtnt/entities/client/clusterTNTRenderer.java new file mode 100644 index 0000000..4eee825 --- /dev/null +++ b/src/main/java/com/jenny/compressedtnt/entities/client/clusterTNTRenderer.java @@ -0,0 +1,53 @@ +package com.jenny.compressedtnt.entities.client; + +import com.jenny.compressedtnt.blocks.blocks; +import com.jenny.compressedtnt.entities.ClusterPrimedTNT; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.TntMinecartRenderer; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import org.jetbrains.annotations.NotNull; + +public class clusterTNTRenderer extends EntityRenderer { + private final BlockRenderDispatcher blockRenderer; + + public clusterTNTRenderer(EntityRendererProvider.Context pContext) { + super(pContext); + this.shadowRadius = 0.5F; + this.blockRenderer = pContext.getBlockRenderDispatcher(); + } + + public void render(ClusterPrimedTNT pEntity, float pEntityYaw, float pPartialTicks, PoseStack pPoseStack, @NotNull MultiBufferSource pBuffer, int pPackedLight) { + pPoseStack.pushPose(); + pPoseStack.translate(0.0F, 0.5F, 0.0F); + int i = pEntity.getFuse(); + if ((float)i - pPartialTicks + 1.0F < 10.0F) { + float f = 1.0F - ((float)i - pPartialTicks + 1.0F) / 10.0F; + f = Mth.clamp(f, 0.0F, 1.0F); + f *= f; + f *= f; + float f1 = 0.5f + f * 0.3F; + pPoseStack.scale(f1, f1, f1); + } + else { + pPoseStack.scale(0.5f, 0.5f, 0.5f); + } + + pPoseStack.mulPose(Axis.YP.rotationDegrees(-90.0F)); + pPoseStack.translate(-0.5F, -0.5F, 0.5F); + pPoseStack.mulPose(Axis.YP.rotationDegrees(90.0F)); + TntMinecartRenderer.renderWhiteSolidBlock(this.blockRenderer, blocks.TNT_CLUSTER_2.get().defaultBlockState(), pPoseStack, pBuffer, pPackedLight, i / 5 % 2 == 0); + pPoseStack.popPose(); + super.render(pEntity, pEntityYaw, pPartialTicks, pPoseStack, pBuffer, pPackedLight); + } + + public @NotNull ResourceLocation getTextureLocation(@NotNull ClusterPrimedTNT pEntity) { + return TextureAtlas.LOCATION_BLOCKS; + } +} diff --git a/src/main/java/com/jenny/compressedtnt/entities/client/strongerTNTRenderer.java b/src/main/java/com/jenny/compressedtnt/entities/client/strongerTNTRenderer.java new file mode 100644 index 0000000..9dc8fe4 --- /dev/null +++ b/src/main/java/com/jenny/compressedtnt/entities/client/strongerTNTRenderer.java @@ -0,0 +1,59 @@ +package com.jenny.compressedtnt.entities.client; + +import com.jenny.compressedtnt.blocks.blocks; +import com.jenny.compressedtnt.entities.StrongerPrimedTNT; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.TntMinecartRenderer; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.level.block.Block; +import org.jetbrains.annotations.NotNull; + +public class strongerTNTRenderer extends EntityRenderer { + private final BlockRenderDispatcher blockRenderer; + + public strongerTNTRenderer(EntityRendererProvider.Context pContext) { + super(pContext); + this.shadowRadius = 0.5F; + this.blockRenderer = pContext.getBlockRenderDispatcher(); + } + + public void render(StrongerPrimedTNT pEntity, float pEntityYaw, float pPartialTicks, PoseStack pPoseStack, @NotNull MultiBufferSource pBuffer, int pPackedLight) { + pPoseStack.pushPose(); + pPoseStack.translate(0.0F, 0.5F, 0.0F); + int i = pEntity.getFuse(); + if ((float)i - pPartialTicks + 1.0F < 10.0F) { + float f = 1.0F - ((float)i - pPartialTicks + 1.0F) / 10.0F; + f = Mth.clamp(f, 0.0F, 1.0F); + f *= f; + f *= f; + float f1 = 1.0F + f * 0.3F; + pPoseStack.scale(f1, f1, f1); + } + Block block = switch ((int) pEntity.getPower()) { + case 8 -> blocks.TNT_8.get(); + case 16 -> blocks.TNT_16.get(); + case 32 -> blocks.TNT_32.get(); + case 64 -> blocks.TNT_64.get(); + case 128 -> blocks.TNT_128.get(); + default -> blocks.TNT_HOMING.get(); + }; + + pPoseStack.mulPose(Axis.YP.rotationDegrees(-90.0F)); + pPoseStack.translate(-0.5F, -0.5F, 0.5F); + pPoseStack.mulPose(Axis.YP.rotationDegrees(90.0F)); + TntMinecartRenderer.renderWhiteSolidBlock(this.blockRenderer, block.defaultBlockState(), pPoseStack, pBuffer, pPackedLight, i / 5 % 2 == 0); + pPoseStack.popPose(); + super.render(pEntity, pEntityYaw, pPartialTicks, pPoseStack, pBuffer, pPackedLight); + } + + public @NotNull ResourceLocation getTextureLocation(@NotNull StrongerPrimedTNT pEntity) { + return TextureAtlas.LOCATION_BLOCKS; + } +} diff --git a/src/main/java/com/jenny/compressedtnt/entities/entities.java b/src/main/java/com/jenny/compressedtnt/entities/entities.java index c8a3637..9b6eebf 100644 --- a/src/main/java/com/jenny/compressedtnt/entities/entities.java +++ b/src/main/java/com/jenny/compressedtnt/entities/entities.java @@ -1,5 +1,8 @@ package com.jenny.compressedtnt.entities; +import com.jenny.compressedtnt.blocks.blocks; +import com.jenny.compressedtnt.entities.client.*; +import net.minecraft.client.renderer.entity.EntityRenderers; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraftforge.eventbus.api.IEventBus; @@ -15,9 +18,25 @@ public class entities { public static final RegistryObject> TNT_HOMING = ENTITY_TYPES.register("tnt_homing", () -> EntityType.Builder.of(homingPrimedTNT::new, MobCategory.MISC) - .sized(2.5f, 2.5f).build("tnt_homing")); + .sized(0.98F, 0.7F).fireImmune().clientTrackingRange(8).build("tnt_homing")); + + public static final RegistryObject> TNT_STRONGER = + ENTITY_TYPES.register("tnt_stronger", () -> EntityType.Builder.of(StrongerPrimedTNT::new, MobCategory.MISC) + .sized(0.98F, 0.7F).fireImmune().clientTrackingRange(8).build("tnt_stronger")); + + public static final RegistryObject> TNT_CLUSTER = + ENTITY_TYPES.register("tnt_cluster", () -> EntityType.Builder.of(ClusterPrimedTNT::new, MobCategory.MISC) + .sized(0.48F, 0.48F).fireImmune().clientTrackingRange(8).build("tnt_cluster")); public static void register(IEventBus eventBus) { ENTITY_TYPES.register(eventBus); } -} + + public static void registerRenderers () { + EntityRenderers.register(TNT_STRONGER.get(), strongerTNTRenderer::new); + EntityRenderers.register(TNT_CLUSTER.get(), clusterTNTRenderer::new); + EntityRenderers.register(TNT_HOMING.get(), pContext -> new BaseTNTRenderer(pContext, blocks.TNT_HOMING.get())); + + + } +} \ No newline at end of file diff --git a/src/main/java/com/jenny/compressedtnt/entities/homingPrimedTNT.java b/src/main/java/com/jenny/compressedtnt/entities/homingPrimedTNT.java index 7b06527..b3bce8d 100644 --- a/src/main/java/com/jenny/compressedtnt/entities/homingPrimedTNT.java +++ b/src/main/java/com/jenny/compressedtnt/entities/homingPrimedTNT.java @@ -9,19 +9,14 @@ import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; -public class homingPrimedTNT extends BasePrimedTNT { - float pRadius = 0; +public class homingPrimedTNT extends basePrimedTNT { float speed = 0; Entity target; - @Nullable - private LivingEntity owner; - public homingPrimedTNT (Level pLevel, double pX, double pY, double pZ, @Nullable LivingEntity pOwner, float power, int fuse, float speed) { this(entities.TNT_HOMING.get(), pLevel); this.setPos(pX, pY, pZ); - this.owner = pOwner; - this.pRadius = power; + this.setOwner(pOwner); this.speed = speed; this.target = null; this.setPower(power); @@ -29,7 +24,7 @@ public class homingPrimedTNT extends BasePrimedTNT { } public homingPrimedTNT(EntityType entityType, Level level) { - super(entityType, level); + super(entityType, level, null); } private Vec3 targetVector() { @@ -68,12 +63,6 @@ public class homingPrimedTNT extends BasePrimedTNT { super.tick(); } - - @Nullable - public LivingEntity getOwner() { - return this.owner; - } - protected float getEyeHeight(@NotNull Pose pPose, @NotNull EntityDimensions pSize) { return 0.15F; } diff --git a/src/main/resources/assets/compressedtnt/blockstates/tnt_homing.json b/src/main/resources/assets/compressedtnt/blockstates/tnt_homing.json new file mode 100644 index 0000000..cb874f1 --- /dev/null +++ b/src/main/resources/assets/compressedtnt/blockstates/tnt_homing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "compressedtnt:block/tnt_homing" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/compressedtnt/recipes/tnt_homing.json b/src/main/resources/data/compressedtnt/recipes/tnt_homing.json new file mode 100644 index 0000000..f06d4b5 --- /dev/null +++ b/src/main/resources/data/compressedtnt/recipes/tnt_homing.json @@ -0,0 +1,15 @@ +{ + "type": "minecraft:crafting_shapeless", + "category": "redstone", + "ingredients":[ + { + "item": "minecraft:tnt" + }, + { + "item": "minecraft:ender_eye" + } + ], + "result": { + "item": "compressedtnt:tnt_homing" + } +} \ No newline at end of file