From aebf450c73c40bc2f5400414f5ad2be261fdf727 Mon Sep 17 00:00:00 2001 From: Joey De Pauw Date: Sun, 11 Jun 2023 11:04:06 +0200 Subject: [PATCH 1/7] modify particle of bohr blueprint (WIP) --- .../be/minelabs/client/MinelabsClient.java | 2 + .../minelabs/client/particle/Particles.java | 17 ++++++ src/main/java/be/minelabs/Minelabs.java | 10 +--- .../minelabs/entity/BohrBlueprintEntity.java | 4 +- .../be/minelabs/particle/ParticleTypes.java | 22 ++++++++ .../java/be/minelabs/particle/Particles.java | 22 -------- .../assets/minelabs/particles/bohrplate.json | 49 ++++++++++++++++++ .../textures/particle/bohr/bohrparticle.png | Bin 0 -> 225 bytes 8 files changed, 94 insertions(+), 32 deletions(-) create mode 100644 src/client/java/be/minelabs/client/particle/Particles.java create mode 100644 src/main/java/be/minelabs/particle/ParticleTypes.java delete mode 100644 src/main/java/be/minelabs/particle/Particles.java create mode 100644 src/main/resources/assets/minelabs/particles/bohrplate.json create mode 100644 src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png diff --git a/src/client/java/be/minelabs/client/MinelabsClient.java b/src/client/java/be/minelabs/client/MinelabsClient.java index 741231425..9d6676762 100644 --- a/src/client/java/be/minelabs/client/MinelabsClient.java +++ b/src/client/java/be/minelabs/client/MinelabsClient.java @@ -5,6 +5,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; @@ -29,6 +30,7 @@ public void onInitializeClient() { BlockEntityRenderers.onInitializeClient(); Screens.onInitializeClient(); + Particles.onInitializeClient(); ModelLoadingRegistry.INSTANCE.registerResourceProvider(ModelProvider::new); 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..5cea02527 --- /dev/null +++ b/src/client/java/be/minelabs/client/particle/Particles.java @@ -0,0 +1,17 @@ +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; +import net.minecraft.client.particle.FlameParticle; + +@Environment(EnvType.CLIENT) +public class Particles { + + + public static void onInitializeClient() { + + ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, FlameParticle.Factory::new); + } +} diff --git a/src/main/java/be/minelabs/Minelabs.java b/src/main/java/be/minelabs/Minelabs.java index 1300fc8f9..de1858a45 100644 --- a/src/main/java/be/minelabs/Minelabs.java +++ b/src/main/java/be/minelabs/Minelabs.java @@ -2,24 +2,18 @@ import be.minelabs.advancement.criterion.Criteria; import be.minelabs.block.Blocks; -import be.minelabs.block.ExtraDispenserBehavior; -import be.minelabs.block.entity.BlockEntities; import be.minelabs.recipe.CraftingRecipes; import be.minelabs.world.dimension.ModDimensions; -import be.minelabs.entity.effect.Effects; import be.minelabs.entity.Entities; import be.minelabs.village.Villagers; import be.minelabs.event.ServerModEvents; import be.minelabs.fluid.Fluids; -import be.minelabs.item.ItemGroups; import be.minelabs.item.Items; -import be.minelabs.entity.decoration.painting.Paintings; -import be.minelabs.particle.Particles; +import be.minelabs.particle.ParticleTypes; import be.minelabs.screen.ScreenHandlers; import be.minelabs.sound.SoundEvents; import be.minelabs.util.NucleusStabilityTable; import be.minelabs.world.gen.WorldGeneration; -import be.minelabs.world.gen.VillageAdditions; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.minecraft.resource.ResourceType; @@ -44,7 +38,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 867a96753..10fb222e3 100644 --- a/src/main/java/be/minelabs/entity/BohrBlueprintEntity.java +++ b/src/main/java/be/minelabs/entity/BohrBlueprintEntity.java @@ -9,6 +9,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 net.minecraft.block.BlockState; import net.minecraft.block.piston.PistonBehavior; @@ -26,7 +27,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; @@ -102,7 +102,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..0fd89f685 --- /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..4767034e5 --- /dev/null +++ b/src/main/resources/assets/minelabs/particles/bohrplate.json @@ -0,0 +1,49 @@ +{ + "format_version": "1.10.0", + "textures": ["minelabs:bohr/bohrparticle"], + "particle_effect": { + "description": { + "identifier": "minelabs:bohrplate", + "basic_render_parameters": { + "material": "particles_alpha", + "texture": "minelabs:bohr/bohrparticle" + } + }, + "components": { + "minecraft:emitter_rate_steady": { + "spawn_rate": 20, + "max_particles": 50 + }, + "minecraft:emitter_lifetime_once": { + "active_time": 1 + }, + "minecraft:emitter_shape_sphere": { + "radius": 1, + "surface_only": true, + "direction": "inwards" + }, + "minecraft:particle_lifetime_expression": { + "max_lifetime": 1 + }, + "minecraft:particle_initial_spin": { + "rotation_rate": 80 + }, + "minecraft:particle_initial_speed": 1, + "minecraft:particle_motion_dynamic": { + "linear_drag_coefficient": 1, + "rotation_acceleration": 60, + "rotation_drag_coefficient": 1 + }, + "minecraft:particle_appearance_billboard": { + "size": [0.1, 0.1], + "facing_camera_mode": "rotate_xyz", + "uv": { + "texture_width": 16, + "texture_height": 16, + "uv": [0, 0], + "uv_size": [16, 16] + } + } + } + } +} 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 0000000000000000000000000000000000000000..847d89c8763cbcc7c9a63d253c135656e1c85d98 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|W_!9ghFJ6_ zCoE7EFxUF0pBM5+e!i4j&8&$(_0NAz3O(K8FKn;R&J4tH;fo{~HnYy&Jn`s+n-b@m zJQv;m^YJskh_?ZcgPG{EoeDQ+HUdH7p*wpu+7zT)9;Kv2C(cS_NaNU*9dM{Y#z9tJ zfjNkIB4@0!596lX9VW@8jGGz_!fXEgY2GoVgU_z+U*jVor=Lu#wLPx6XfZHY Date: Sun, 11 Jun 2023 12:00:37 +0200 Subject: [PATCH 2/7] bohr plate particle WIP --- .../minelabs/client/particle/Particles.java | 48 ++++++++++++++++++- .../be/minelabs/particle/ParticleTypes.java | 2 +- .../assets/minelabs/particles/bohrplate.json | 48 +------------------ 3 files changed, 48 insertions(+), 50 deletions(-) diff --git a/src/client/java/be/minelabs/client/particle/Particles.java b/src/client/java/be/minelabs/client/particle/Particles.java index 5cea02527..843ede3dd 100644 --- a/src/client/java/be/minelabs/client/particle/Particles.java +++ b/src/client/java/be/minelabs/client/particle/Particles.java @@ -4,7 +4,12 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; -import net.minecraft.client.particle.FlameParticle; +import net.minecraft.client.particle.*; +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.Vector3f; @Environment(EnvType.CLIENT) public class Particles { @@ -12,6 +17,45 @@ public class Particles { public static void onInitializeClient() { - ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, FlameParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, BohrParticle.Factory::new); + + } + + private static class BohrParticle extends SpriteBillboardParticle { + protected BohrParticle(ClientWorld clientWorld, double x, double y, double z, double vx, double vy, double vz) { + 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; + maxAge = 14; + scale *= 0.5f; + } + + @Override + public ParticleTextureSheet getType() { + return ParticleTextureSheet.PARTICLE_SHEET_OPAQUE; + } + + private 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 = Random.create(); + Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.35f); + Vector3f velocity = new Vector3f(offset).mul(-0.05f); + BohrParticle particle = new BohrParticle(world, x + offset.x, y + offset.y, z + offset.z, vx + velocity.x, vy + velocity.y, vz + velocity.z); + particle.setSprite(this.spriteProvider); + return particle; + } + } + } } diff --git a/src/main/java/be/minelabs/particle/ParticleTypes.java b/src/main/java/be/minelabs/particle/ParticleTypes.java index 0fd89f685..e838ce42f 100644 --- a/src/main/java/be/minelabs/particle/ParticleTypes.java +++ b/src/main/java/be/minelabs/particle/ParticleTypes.java @@ -12,7 +12,7 @@ public class ParticleTypes { public static final DefaultParticleType BOHR_PLATE_PARTICLE = register(FabricParticleTypes.simple(), "bohrplate"); - private static DefaultParticleType register(DefaultParticleType particle, String path){ + private static DefaultParticleType register(DefaultParticleType particle, String path){ return Registry.register(Registries.PARTICLE_TYPE, new Identifier(Minelabs.MOD_ID, path), particle); } diff --git a/src/main/resources/assets/minelabs/particles/bohrplate.json b/src/main/resources/assets/minelabs/particles/bohrplate.json index 4767034e5..9fdc74841 100644 --- a/src/main/resources/assets/minelabs/particles/bohrplate.json +++ b/src/main/resources/assets/minelabs/particles/bohrplate.json @@ -1,49 +1,3 @@ { - "format_version": "1.10.0", - "textures": ["minelabs:bohr/bohrparticle"], - "particle_effect": { - "description": { - "identifier": "minelabs:bohrplate", - "basic_render_parameters": { - "material": "particles_alpha", - "texture": "minelabs:bohr/bohrparticle" - } - }, - "components": { - "minecraft:emitter_rate_steady": { - "spawn_rate": 20, - "max_particles": 50 - }, - "minecraft:emitter_lifetime_once": { - "active_time": 1 - }, - "minecraft:emitter_shape_sphere": { - "radius": 1, - "surface_only": true, - "direction": "inwards" - }, - "minecraft:particle_lifetime_expression": { - "max_lifetime": 1 - }, - "minecraft:particle_initial_spin": { - "rotation_rate": 80 - }, - "minecraft:particle_initial_speed": 1, - "minecraft:particle_motion_dynamic": { - "linear_drag_coefficient": 1, - "rotation_acceleration": 60, - "rotation_drag_coefficient": 1 - }, - "minecraft:particle_appearance_billboard": { - "size": [0.1, 0.1], - "facing_camera_mode": "rotate_xyz", - "uv": { - "texture_width": 16, - "texture_height": 16, - "uv": [0, 0], - "uv_size": [16, 16] - } - } - } - } + "textures": ["minelabs:bohr/bohrparticle"] } From caad21d821e759d586e916b29574f3401e15ec01 Mon Sep 17 00:00:00 2001 From: Joey De Pauw Date: Sun, 18 Jun 2023 12:06:40 +0200 Subject: [PATCH 3/7] progress on bohr particle --- .../client/particle/BohrPlateParticle.java | 50 ++++++++++++++++++ .../minelabs/client/particle/Particles.java | 45 +--------------- .../textures/particle/bohr/bohrparticle.png | Bin 225 -> 5059 bytes 3 files changed, 51 insertions(+), 44 deletions(-) create mode 100644 src/client/java/be/minelabs/client/particle/BohrPlateParticle.java 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..7a713c11f --- /dev/null +++ b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java @@ -0,0 +1,50 @@ +package be.minelabs.client.particle; + +import net.minecraft.client.particle.*; +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.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; + setAlpha(0.15f); + maxAge = 14; + scale *= 0.5f; + } + + @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 = Random.create(); + Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.35f); + Vector3f velocity = new Vector3f(offset).mul(-0.05f); + float angle = (float) (random.nextFloat() * 2 * Math.PI); + 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 index 843ede3dd..73b4a5efa 100644 --- a/src/client/java/be/minelabs/client/particle/Particles.java +++ b/src/client/java/be/minelabs/client/particle/Particles.java @@ -4,12 +4,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.particle.v1.ParticleFactoryRegistry; -import net.minecraft.client.particle.*; -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.Vector3f; @Environment(EnvType.CLIENT) public class Particles { @@ -17,45 +11,8 @@ public class Particles { public static void onInitializeClient() { - ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, BohrParticle.Factory::new); + ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, BohrPlateParticle.Factory::new); } - private static class BohrParticle extends SpriteBillboardParticle { - protected BohrParticle(ClientWorld clientWorld, double x, double y, double z, double vx, double vy, double vz) { - 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; - maxAge = 14; - scale *= 0.5f; - } - - @Override - public ParticleTextureSheet getType() { - return ParticleTextureSheet.PARTICLE_SHEET_OPAQUE; - } - - private 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 = Random.create(); - Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.35f); - Vector3f velocity = new Vector3f(offset).mul(-0.05f); - BohrParticle particle = new BohrParticle(world, x + offset.x, y + offset.y, z + offset.z, vx + velocity.x, vy + velocity.y, vz + velocity.z); - particle.setSprite(this.spriteProvider); - return particle; - } - } - - } } diff --git a/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png b/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png index 847d89c8763cbcc7c9a63d253c135656e1c85d98..3b5bdd8e025ce2b1729e6b13dd07c1c8bf2b3fd8 100644 GIT binary patch literal 5059 zcmeHKYg7~077hhO0c}-4iXb6Kr58iqVG;@NM}j7D0V8Nym`o;NfILhB35XA{q96iV z6|gE=K#F2%1q77h3l$YmdbLzVQ4s+_!BVRr=$!;qT(^H*>-L|s)@06{v-h|6{`Nk5 za?*o&fzwTGOfeYDbPn4u1bu#{yQfY;f9;1}gBXlaL{eC|It0{U6-v1niG#7~LC!5Qwz3MhLWgNVd<<&cNew|6r)STy)acrA{lHieDk4dv{dr}Cza(G>B zwpV%LgP9Lq=UXk`R*1>>ByB%nB;Z(N8Ff~M3-%T{T4NG7{wML&mCT4kt9#X8*R`Ii z+wC`$$u*7BA1E&6CiuRhV^sAgde3UUpd=*1@CH z7nVhNrPudYuFo@I73B;q0W81zs@1fazf!>uYS7&bF+f;TrQIj z`SAqsAKec*8w%$m-`}lpy}5TV!t6-pMSjK6FUfAHF0)gctzNvK7I+ZP3rzj^OUr`i z3>nRZmppuEDU15%yuqPJjAzSBQlcfXXTc>^`h3jFgw6MRFYvHiqEiYtwa4ZN7kz@k z75(L$W@NseHfw20oG8l=6XG2l(7Q0p%o;mTdw`vQGiZ-;a-hviuN2&%G)+l}6Gxqa z&iO08oxfpWxBJKfrvIlf;ZEYfhU~A`{J~%=PH*~5nD?D9Yu4U$k2LGT^A;5u%x5;# zLovVZ0jANp1wI*^&>)7RB;Y}23B^|FDk!SC&zHCDH6UFWQum zJbbRU^F|+-e{&D-6Xnh`y?WK1Q4!SgR3uZ1XCL!?nu!~GP}V9kH$TqnH(}LK>OSAw zG-f6L;<%Z7^l(!?=k}(iHC>M_W2N$M-{@_XRnhe>#vys2lxGDENeAQEO zf3SFan-*+?4?D)^9~Lhcbu@Py)*5mS6#B&*Mmhy5ra0ABpZ+AlTiVp6v2$E>eH*g?;fD=Iki%%MEVn#m@BsJeQqPDL=&S z+`QVdzRt(TdrM+?x2kpq)K)*ir`oEbduA?5rMx^gDnV~pPQkC{g?5C2|$>EG6 z8G|=fNlOKV9qGmAo35mH1Q|L_xj~7gJG45kXs-mPoirR+Z_?A`7+~dVCW6@E*A{OU?bw|8_e^*4M zaQz&o)jw!7G9-Ft-|1DJcW$q4|Hbf|m~9CEmi7MLWBHjE8q{Kc^SbX1*Yx-p`I0L# zBRE0(yIvgMlwGd*_rB{R?FEH_%`40Y(;FyFMCtwb`=#7lck7ng3XLP2JQmEO^`_3lU+{P5SuWYC-42w+FuTl<>}4%0_f!e|v~GHI zd9k2`kqKD+G<6!zV#m)ZxHv!LI_Kw{qOowZ*Zcc&8;f&d4KrnkDPveS5wWG z3ELN&o?rjhoD0L&2A`bpI&vTAxR4dP$YAu!shxKQa}S;Rb3yOUG%Jr!lB!d-^rao_ zH^^Od>eROm-yL-sMoepM2iFF4>@XOSr#x9!UOnQ$vtMr!zq7_*#*7s9zN2j`>P}SD zRPp1>Ymo#p&chVzt`v!xA$|c95a=5V z7p+z+m;{1GqjA+xT;)m$fy7`i2t+c0Ova-UcvYfI4QlZ+m7@+~9K#P*K}tlSM&vTA z4igm0D%4@U$M;5b-{imFhnr1wk)a=5{7HFOk65UE11 zg_8ZAq#6;wBkMiibSwIBCOd+vzr}q|`c3S5VN{CCW%|jXc%6G3KNe1BpDB_upg1y>8k9k>4hjW#MNk}ySOf|I zh8Rzy!gM^9P7~n)h%CaxLJ|=mk^wh>2uy-lszlJL1mh-qrGpZoP&79Ri3WfSJSYTF zC?XZW12jO02k0acl`Nu(A<;OL2x11vl~NE*Cn5zUFhL=c=xyi-XL<*7SU9pP@!d>t z9H8}ow-AO%;ZQZGV^hZf5g=2k3<^MDP-yRj_^?uiR-z7*M0BN$;Z@^r z<69sO(Jx`K`m$w$(6|v5m;j6PhETonB`6w{Nnmt;PZZRfdE{@BMP@)`7|`)b5rJsF z(X;_nDjg4tL}G{tfMPN<9{5{ym0YaWfJ)d~f<}r)gBFlJ8mzOP$}ivdMH3C{cp{Q1 zcp@E70>VgSCXvXbGF*td0gf;cFhRGg-$d+A_#aN(^#YUH0ID}Whqf2ATM^#2s|n6@ zH2#CvL@xe83n=tQBOk=?N4h@J^+61LknqRq`bgIYG4MgcAFJ#CMwjWk0}m`i{{?B# z?l!>e-eZkUny5Kkf0OPhvrI9h zCz-M{=oFRX=N$%IhN7&EEerz$vtFZDcIa$JM@PQlAaVwt>gdqicPx#n@L1LR5*=eV4x)sH!A)wZdCjqpBhGd znvwZ0&-G$e%Y;u8KQ9LZKQ9MfSE3jIvjv;8k;RbN7|w!8qTBrO^A8kDFbqI86{fi$ z*_nZXfq`Md+`TA Date: Sun, 12 Nov 2023 16:37:03 +0100 Subject: [PATCH 4/7] bohr particle good enough --- .../client/particle/BohrPlateParticle.java | 15 +++++++++++---- .../textures/particle/bohr/bohrparticle.png | Bin 5059 -> 185 bytes 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java index 7a713c11f..4c6dc7ec3 100644 --- a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java +++ b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java @@ -16,8 +16,8 @@ protected BohrPlateParticle(ClientWorld clientWorld, double x, double y, double this.velocityZ = velocityZ * 0.01f + vz; this.angle = angle; this.prevAngle = angle; - setAlpha(0.15f); - maxAge = 14; + setAlpha(0.4f); + maxAge = 15; scale *= 0.5f; } @@ -38,9 +38,16 @@ public Factory(SpriteProvider spriteProvider) { 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 = Random.create(); - Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.35f); + Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.3f); Vector3f velocity = new Vector3f(offset).mul(-0.05f); - float angle = (float) (random.nextFloat() * 2 * Math.PI); + + // random angles +// float angle = (float) (random.nextFloat() * 2 * Math.PI); + + // Heuristic to have the particle face the center + float offsetX = Math.abs(offset.x) > Math.abs(offset.y) ? offset.x : offset.y; + float angle = (float) (-Math.atan2(offsetX, offset.y)); + 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/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png b/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png index 3b5bdd8e025ce2b1729e6b13dd07c1c8bf2b3fd8..299f18e7ca0fe0bf6622d3938e763c7ec19588ca 100644 GIT binary patch delta 140 zcmX@CzLRl+^5j5avHCzy7sn8b-sC_3|JyUGHgqc8Z9dn)rlH0Xa3!&r(azc6NyG(} zi;I^q_O5Hc)N_NU!Sj!M5C`+uj4S~eo0kl+O@gzPO2h@OH1M&7TS=^BV_@j9;Fnvo n>BT|@1_r*=2+uTMUj{88n*)eJ;8O5p5asFW=d#Wzfw2hyiE}Pm literal 5059 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 Date: Tue, 14 Nov 2023 11:37:09 +0100 Subject: [PATCH 5/7] get random from world --- .../java/be/minelabs/client/particle/BohrPlateParticle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java index 4c6dc7ec3..29e7c07e6 100644 --- a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java +++ b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java @@ -37,7 +37,7 @@ public Factory(SpriteProvider spriteProvider) { @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 = Random.create(); + Random random = world.getRandom(); Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.3f); Vector3f velocity = new Vector3f(offset).mul(-0.05f); From a79ad2da48a1ea06dc0fc72eb9886b3e5ed47250 Mon Sep 17 00:00:00 2001 From: Joey De Pauw Date: Tue, 14 Nov 2023 14:01:53 +0100 Subject: [PATCH 6/7] rotate particles correctly and apply fade in and out transition --- .../client/particle/BohrPlateParticle.java | 36 +++++++++++++------ .../minelabs/client/particle/Particles.java | 3 -- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java index 29e7c07e6..368ce1a06 100644 --- a/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java +++ b/src/client/java/be/minelabs/client/particle/BohrPlateParticle.java @@ -1,10 +1,14 @@ 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 { @@ -16,9 +20,19 @@ protected BohrPlateParticle(ClientWorld clientWorld, double x, double y, double this.velocityZ = velocityZ * 0.01f + vz; this.angle = angle; this.prevAngle = angle; - setAlpha(0.4f); - maxAge = 15; - scale *= 0.5f; + 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 @@ -38,15 +52,17 @@ public Factory(SpriteProvider spriteProvider) { 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(); - Vector3f offset = new Vector3f(random.nextFloat() - 0.5f, random.nextFloat() - 0.5f, random.nextFloat() - 0.5f).normalize().mul(0.3f); - Vector3f velocity = new Vector3f(offset).mul(-0.05f); - // random angles -// float angle = (float) (random.nextFloat() * 2 * Math.PI); + // 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); - // Heuristic to have the particle face the center - float offsetX = Math.abs(offset.x) > Math.abs(offset.y) ? offset.x : offset.y; - float angle = (float) (-Math.atan2(offsetX, offset.y)); + // 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); diff --git a/src/client/java/be/minelabs/client/particle/Particles.java b/src/client/java/be/minelabs/client/particle/Particles.java index 73b4a5efa..0ae82e256 100644 --- a/src/client/java/be/minelabs/client/particle/Particles.java +++ b/src/client/java/be/minelabs/client/particle/Particles.java @@ -8,11 +8,8 @@ @Environment(EnvType.CLIENT) public class Particles { - public static void onInitializeClient() { - ParticleFactoryRegistry.getInstance().register(ParticleTypes.BOHR_PLATE_PARTICLE, BohrPlateParticle.Factory::new); - } } From cd650fa6d78715660a450d7e6baaab007cd64bbb Mon Sep 17 00:00:00 2001 From: Joey De Pauw Date: Wed, 15 Nov 2023 21:14:52 +0100 Subject: [PATCH 7/7] updated bohr particle sprite (Ine) --- .../textures/particle/bohr/bohrparticle.png | Bin 185 -> 269 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png b/src/main/resources/assets/minelabs/textures/particle/bohr/bohrparticle.png index 299f18e7ca0fe0bf6622d3938e763c7ec19588ca..fccde6f6340b37adbe142aee0f1cade3019208bd 100644 GIT binary patch delta 185 zcmV;q07n100gVEXIe(=|L_t(Ijn&ekSvjW&WHR@N4Ff-m7qYh^O^xY6g+3% z#~7Q^+QKpkC+u;-A$!9Vj#`{IDAgKYu)sUEIA(o-Ddt$?^)Fiy5p}F0VjU5?_`xn~ ntD0Zmpp8ksQ_kn(H_|PGyU?wV^iK`G09}Sy@7&oF|X~