diff --git a/src/main/java/net/krituximon/stalinium/Stalinium.java b/src/main/java/net/krituximon/stalinium/Stalinium.java index 8024f1b..6d3f1e2 100644 --- a/src/main/java/net/krituximon/stalinium/Stalinium.java +++ b/src/main/java/net/krituximon/stalinium/Stalinium.java @@ -2,6 +2,8 @@ package net.krituximon.stalinium; import net.krituximon.stalinium.block.ModBlocks; import net.krituximon.stalinium.item.ModItems; +import net.krituximon.stalinium.particle.BloodParticle; +import net.krituximon.stalinium.particle.ModParticles; import net.krituximon.stalinium.sound.ModSounds; import net.krituximon.stalinium.worldgen.ModFeatures; import net.krituximon.stalinium.worldgen.StaliniumVeinFeature; @@ -9,6 +11,7 @@ import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.neoforged.neoforge.client.event.RegisterParticleProvidersEvent; import org.slf4j.Logger; import com.mojang.logging.LogUtils; @@ -51,6 +54,7 @@ public class Stalinium ModItems.register(modEventBus); ModBlocks.register(modEventBus); ModSounds.register(modEventBus); + ModParticles.register(modEventBus); // Register ourselves for server and other game events we are interested in. // Note that this is necessary if and only if we want *this* class (Stalinium) to respond directly to events. @@ -102,5 +106,10 @@ public class Stalinium LOGGER.info("HELLO FROM CLIENT SETUP"); LOGGER.info("MINECRAFT NAME >> {}", Minecraft.getInstance().getUser().getName()); } + + @SubscribeEvent + public static void registerParticleFactories(RegisterParticleProvidersEvent event) { + event.registerSpriteSet(ModParticles.BLOOD_PARTICLE.get(), BloodParticle.Provider::new); + } } } diff --git a/src/main/java/net/krituximon/stalinium/block/ModBlocks.java b/src/main/java/net/krituximon/stalinium/block/ModBlocks.java index 15888a0..a95a4a5 100644 --- a/src/main/java/net/krituximon/stalinium/block/ModBlocks.java +++ b/src/main/java/net/krituximon/stalinium/block/ModBlocks.java @@ -1,6 +1,7 @@ package net.krituximon.stalinium.block; import net.krituximon.stalinium.Stalinium; +import net.krituximon.stalinium.block.custom.CompressedBedrock; import net.krituximon.stalinium.item.ModItems; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -18,7 +19,7 @@ public class ModBlocks { DeferredRegister.createBlocks(Stalinium.MODID); public static final DeferredBlock COMPRESSED_BEDROCK = registerBlock("compressed_bedrock", - () -> new NetheriteOnlyBlock(BlockBehaviour.Properties.of() + () -> new CompressedBedrock(BlockBehaviour.Properties.of() .strength(120f, 1200f) .requiresCorrectToolForDrops() .sound(SoundType.STONE))); diff --git a/src/main/java/net/krituximon/stalinium/block/custom/CompressedBedrock.java b/src/main/java/net/krituximon/stalinium/block/custom/CompressedBedrock.java new file mode 100644 index 0000000..8b79af0 --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/block/custom/CompressedBedrock.java @@ -0,0 +1,32 @@ +package net.krituximon.stalinium.block.custom; + +import net.krituximon.stalinium.block.NetheriteOnlyBlock; +import net.krituximon.stalinium.particle.ModParticles; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; + +public class CompressedBedrock extends NetheriteOnlyBlock { + public CompressedBedrock(Properties properties) { + super(properties); + } + + public void animateTick(BlockState state, Level level, BlockPos pos, RandomSource random) { + if (random.nextInt(5) == 0) { + Direction direction = Direction.getRandom(random); + if (direction != Direction.UP) { + BlockPos blockpos = pos.relative(direction); + BlockState blockstate = level.getBlockState(blockpos); + if (!state.canOcclude() || !blockstate.isFaceSturdy(level, blockpos, direction.getOpposite())) { + double d0 = direction.getStepX() == 0 ? random.nextDouble() : (double) 0.5F + (double) direction.getStepX() * 0.6; + double d1 = direction.getStepY() == 0 ? random.nextDouble() : (double) 0.5F + (double) direction.getStepY() * 0.6; + double d2 = direction.getStepZ() == 0 ? random.nextDouble() : (double) 0.5F + (double) direction.getStepZ() * 0.6; + level.addParticle(ModParticles.BLOOD_PARTICLE.get(), (double) pos.getX() + d0, (double) pos.getY() + d1, (double) pos.getZ() + d2, (double) 0.0F, (double) 0.0F, (double) 0.0F); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/net/krituximon/stalinium/datagen/ModBlockStateProvider.java b/src/main/java/net/krituximon/stalinium/datagen/ModBlockStateProvider.java index 8b7b60c..a81d8d7 100644 --- a/src/main/java/net/krituximon/stalinium/datagen/ModBlockStateProvider.java +++ b/src/main/java/net/krituximon/stalinium/datagen/ModBlockStateProvider.java @@ -14,12 +14,9 @@ public class ModBlockStateProvider extends BlockStateProvider { @Override protected void registerStatesAndModels() { - simpleBlock(ModBlocks.COMPRESSED_BEDROCK.get(), - models().cubeAll("compressed_bedrock", modLoc("block/compressed_bedrock"))); - simpleBlock(ModBlocks.STALINIUM_ORE.get(), - models().cubeAll("stalinium_ore", modLoc("block/stalinium_ore"))); - simpleBlock(ModBlocks.STALINIUM_BLOCK.get(), - models().cubeAll("stalinium_block", modLoc("block/stalinium_block"))); + blockWithItem(ModBlocks.COMPRESSED_BEDROCK); + blockWithItem(ModBlocks.STALINIUM_BLOCK); + blockWithItem(ModBlocks.STALINIUM_ORE); } diff --git a/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java b/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java index b0b539b..4b3f8eb 100644 --- a/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java +++ b/src/main/java/net/krituximon/stalinium/datagen/ModItemModelProvider.java @@ -13,13 +13,8 @@ public class ModItemModelProvider extends ItemModelProvider { @Override protected void registerModels() { - withExistingParent("compressed_bedrock", modLoc("block/compressed_bedrock")); - withExistingParent("stalinium_ore", modLoc("block/stalinium_ore")); - withExistingParent("stalinium_block", modLoc("block/stalinium_block")); - singleTexture("stalinium_ingot", - mcLoc("item/generated"), - "layer0", - modLoc("item/stalinium_ingot")); - singleTexture("stalinium_nugget", mcLoc("item/generated"), "layer0", modLoc("item/stalinium_nugget")); + basicItem(ModItems.STALINIUM_INGOT.get()); + basicItem(ModItems.SOVIET_ANTHEM_MUSIC_DISC.get()); + basicItem(ModItems.STALINIUM_NUGGET.get()); } } diff --git a/src/main/java/net/krituximon/stalinium/particle/BloodParticle.java b/src/main/java/net/krituximon/stalinium/particle/BloodParticle.java new file mode 100644 index 0000000..a364b7e --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/particle/BloodParticle.java @@ -0,0 +1,40 @@ +package net.krituximon.stalinium.particle; + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.*; +import net.minecraft.core.particles.SimpleParticleType; +import org.jetbrains.annotations.Nullable; + +public class BloodParticle extends TextureSheetParticle { + protected BloodParticle(ClientLevel level, double x, double y, double z, SpriteSet spriteSet, double xSpeed, double ySpeed, double zSpeed) { + super(level, x, y, z, xSpeed, ySpeed, zSpeed); + + this.friction = 0.5f; + + this.lifetime = 80; + this.setSpriteFromAge(spriteSet); + + this.rCol = 1f; + this.gCol = 0f; + this.bCol = 0f; + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + public static class Provider implements ParticleProvider { + private final SpriteSet spriteSet; + + public Provider(SpriteSet spriteSet) { + this.spriteSet = spriteSet; + } + + + @Override + public @Nullable Particle createParticle(SimpleParticleType simpleParticleType, ClientLevel clientLevel, double v, double v1, double v2, double v3, double v4, double v5) { + return new BloodParticle(clientLevel, v, v1, v2, this.spriteSet, v3, v4, v5); + } + } +} diff --git a/src/main/java/net/krituximon/stalinium/particle/ModParticles.java b/src/main/java/net/krituximon/stalinium/particle/ModParticles.java new file mode 100644 index 0000000..b667a6b --- /dev/null +++ b/src/main/java/net/krituximon/stalinium/particle/ModParticles.java @@ -0,0 +1,22 @@ +package net.krituximon.stalinium.particle; + +import net.krituximon.stalinium.Stalinium; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.core.registries.BuiltInRegistries; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.registries.DeferredRegister; + +import java.util.function.Supplier; + +public class ModParticles { + public static final DeferredRegister> PARTICLE_TYPES = + DeferredRegister.create(BuiltInRegistries.PARTICLE_TYPE, Stalinium.MODID); + + public static final Supplier BLOOD_PARTICLE = + PARTICLE_TYPES.register("blood_particle", () -> new SimpleParticleType(true)); + + public static void register(IEventBus eventBus) { + PARTICLE_TYPES.register(eventBus); + } +} diff --git a/src/main/resources/assets/stalinium/particles/blood_particle.json b/src/main/resources/assets/stalinium/particles/blood_particle.json new file mode 100644 index 0000000..1d77d26 --- /dev/null +++ b/src/main/resources/assets/stalinium/particles/blood_particle.json @@ -0,0 +1,5 @@ +{ + "textures": [ + "stalinium:blood_particle" + ] +} diff --git a/src/main/resources/assets/stalinium/textures/particle/blood_particle.png b/src/main/resources/assets/stalinium/textures/particle/blood_particle.png new file mode 100644 index 0000000..f9be970 Binary files /dev/null and b/src/main/resources/assets/stalinium/textures/particle/blood_particle.png differ