diff --git a/src/client/java/be/minelabs/client/MinelabsClient.java b/src/client/java/be/minelabs/client/MinelabsClient.java index 20e680036..c898a170c 100644 --- a/src/client/java/be/minelabs/client/MinelabsClient.java +++ b/src/client/java/be/minelabs/client/MinelabsClient.java @@ -6,6 +6,7 @@ import be.minelabs.client.gui.screen.Screens; import be.minelabs.client.item.ItemModels; import be.minelabs.client.network.ClientNetworking; +import be.minelabs.client.particle.Particles; import be.minelabs.client.renderer.block.entity.BlockEntityRenderers; import be.minelabs.client.renderer.entity.EntityRenderers; import be.minelabs.client.renderer.entity.model.EntityModelLayers; @@ -31,6 +32,7 @@ public void onInitializeClient() { BlockEntityRenderers.onInitializeClient(); Screens.onInitializeClient(); + Particles.onInitializeClient(); ModelLoadingRegistry.INSTANCE.registerModelProvider(new ModelProvider.Requester()); ModelLoadingRegistry.INSTANCE.registerResourceProvider(ModelProvider::new); diff --git a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java new file mode 100644 index 000000000..368ce1a06 --- /dev/null +++ b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java @@ -0,0 +1,73 @@ +package be.minelabs.client.particle; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.particle.*; +import net.minecraft.client.render.Camera; +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.util.math.random.Random; +import org.jetbrains.annotations.Nullable; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +class BohrPlateParticle extends SpriteBillboardParticle { + protected BohrPlateParticle(ClientWorld clientWorld, double x, double y, double z, double vx, double vy, double vz, float angle) { + super(clientWorld, x, y, z, vx, vy, vz); + this.velocityMultiplier = 0.94f; + this.velocityX = velocityX * 0.01f + vx; + this.velocityY = velocityY * 0.01f + vy; + this.velocityZ = velocityZ * 0.01f + vz; + this.angle = angle; + this.prevAngle = angle; + maxAge = 17; + scale *= 0.45f; + updateAlpha(); + } + + private void updateAlpha(){ + alpha = 0.8f * (float) Math.exp(-Math.pow((age-7f)/6f, 2)); + } + + @Override + public void tick() { + super.tick(); + updateAlpha(); + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_TRANSLUCENT; + } + + public static class Factory implements ParticleFactory { + private final SpriteProvider spriteProvider; + + public Factory(SpriteProvider spriteProvider) { + this.spriteProvider = spriteProvider; + } + + @Nullable + @Override + public Particle createParticle(DefaultParticleType parameters, ClientWorld world, double x, double y, double z, double vx, double vy, double vz) { + // Note: usually vx, vy and vz should be kept at zero and this factory provides the correct velocity. + Random random = world.getRandom(); + + // Offset is random position in projected plane around camera + Vector3f offset = new Vector3f(0, 0.25f, 0); + Camera camera = MinecraftClient.getInstance().gameRenderer.getCamera(); + Quaternionf rotation = new Quaternionf(camera.getRotation()); + float angle = (float) (random.nextFloat() * 2 * Math.PI); + rotation.rotateZ(angle); + offset.rotate(rotation); + + // Move towards center + Vector3f velocity = new Vector3f(offset).mul(-0.06f); + + BohrPlateParticle particle = new BohrPlateParticle(world, x + offset.x, y + offset.y, z + offset.z, vx + velocity.x, vy + velocity.y, vz + velocity.z, angle); + particle.setSprite(this.spriteProvider); + return particle; + } + } + +} diff --git a/src/client/java/be/minelabs/client/particle/Particles.java b/src/client/java/be/minelabs/client/particle/Particles.java new file mode 100644 index 000000000..0ae82e256 --- /dev/null +++ b/src/client/java/be/minelabs/client/particle/Particles.java @@ -0,0 +1,15 @@ +package be.minelabs.client.particle; + +import be.minelabs.particle.ParticleTypes; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; + +@Environment(EnvType.CLIENT) +public class Particles { + + public static void onInitializeClient() { + ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, BohrPlateParticle.Factory::new); + } + +} diff --git a/src/main/java/be/minelabs/Minelabs.java b/src/main/java/be/minelabs/Minelabs.java index 45db8cd99..da1bab324 100644 --- a/src/main/java/be/minelabs/Minelabs.java +++ b/src/main/java/be/minelabs/Minelabs.java @@ -2,20 +2,19 @@ import be.minelabs.advancement.criterion.Criteria; import be.minelabs.block.Blocks; -import be.minelabs.recipe.CraftingRecipes; -import be.minelabs.world.MinelabsGameRules; -import be.minelabs.science.coulomb.CoulombResource; -import be.minelabs.world.MinelabsGameRules; -import be.minelabs.world.dimension.ModDimensions; import be.minelabs.entity.Entities; -import be.minelabs.village.Villagers; import be.minelabs.event.ServerModEvents; import be.minelabs.fluid.Fluids; import be.minelabs.item.Items; -import be.minelabs.particle.Particles; +import be.minelabs.particle.ParticleTypes; +import be.minelabs.recipe.CraftingRecipes; +import be.minelabs.science.coulomb.CoulombResource; import be.minelabs.screen.ScreenHandlers; import be.minelabs.sound.SoundEvents; import be.minelabs.util.NucleusStabilityTable; +import be.minelabs.village.Villagers; +import be.minelabs.world.MinelabsGameRules; +import be.minelabs.world.dimension.ModDimensions; import be.minelabs.world.gen.WorldGeneration; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; @@ -42,7 +41,7 @@ public void onInitialize() { Entities.onInitialize(); SoundEvents.onInitialize(); - Particles.onInitialize(); + ParticleTypes.onInitialize(); ScreenHandlers.onInitialize(); WorldGeneration.onInitialize(); diff --git a/src/main/java/be/minelabs/entity/BohrBlueprintEntity.java b/src/main/java/be/minelabs/entity/BohrBlueprintEntity.java index b5d857ae2..4b0c31b10 100644 --- a/src/main/java/be/minelabs/entity/BohrBlueprintEntity.java +++ b/src/main/java/be/minelabs/entity/BohrBlueprintEntity.java @@ -10,6 +10,7 @@ import be.minelabs.item.items.AtomItem; import be.minelabs.item.Items; import be.minelabs.mixin.FishingBobberEntityAccessor; +import be.minelabs.particle.ParticleTypes; import be.minelabs.util.AtomConfiguration; import be.minelabs.world.MinelabsGameRules; import net.minecraft.block.BlockState; @@ -28,7 +29,6 @@ import net.minecraft.network.listener.ClientPlayPacketListener; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; -import net.minecraft.particle.ParticleTypes; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -105,7 +105,7 @@ public void tick() { */ private void clientTick() { if (getProtons() == 0 && getNeutrons() == 0) { - this.world.addParticle(ParticleTypes.ELECTRIC_SPARK, this.getX(), this.getY() + 0.5f * getHeight(), this.getZ(), 0, 0, 0); + this.world.addParticle(ParticleTypes.BOHR_PLATE_PARTICLE, this.getX(), this.getY() + 0.5f * getHeight(), this.getZ(), 0, 0, 0); } } diff --git a/src/main/java/be/minelabs/particle/ParticleTypes.java b/src/main/java/be/minelabs/particle/ParticleTypes.java new file mode 100644 index 000000000..e838ce42f --- /dev/null +++ b/src/main/java/be/minelabs/particle/ParticleTypes.java @@ -0,0 +1,22 @@ +package be.minelabs.particle; + +import be.minelabs.Minelabs; +import net.fabricmc.fabric.api.particle.v1.FabricParticleTypes; +import net.minecraft.particle.DefaultParticleType; +import net.minecraft.registry.Registries; +import net.minecraft.registry.Registry; +import net.minecraft.util.Identifier; + + +public class ParticleTypes { + + public static final DefaultParticleType BOHR_PLATE_PARTICLE = register(FabricParticleTypes.simple(), "bohrplate"); + + private static DefaultParticleType register(DefaultParticleType particle, String path){ + return Registry.register(Registries.PARTICLE_TYPE, new Identifier(Minelabs.MOD_ID, path), particle); + } + + + public static void onInitialize() { + } +} \ No newline at end of file diff --git a/src/main/java/be/minelabs/particle/Particles.java b/src/main/java/be/minelabs/particle/Particles.java deleted file mode 100644 index 6d36290ee..000000000 --- a/src/main/java/be/minelabs/particle/Particles.java +++ /dev/null @@ -1,22 +0,0 @@ -package be.minelabs.particle; - -import be.minelabs.Minelabs; - - -public class Particles { - -// public static final DefaultParticleType GAS; - - -// private static DefaultParticleType register(String name, boolean alwaysShow) { -// return (DefaultParticleType) Registry.register(Registry.PARTICLE_TYPE, name); -// } - -// static { -// GAS = register("gas", true); -// } - - public static void onInitialize() { - Minelabs.LOGGER.info("registering particles"); - } -} \ No newline at end of file diff --git a/src/main/resources/assets/minelabs/particles/bohrplate.json b/src/main/resources/assets/minelabs/particles/bohrplate.json new file mode 100644 index 000000000..9fdc74841 --- /dev/null +++ b/src/main/resources/assets/minelabs/particles/bohrplate.json @@ -0,0 +1,3 @@ +{ + "textures": ["minelabs:bohr/bohrparticle"] +} diff --git a/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png b/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png new file mode 100644 index 000000000..fccde6f63 Binary files /dev/null and b/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png differ