From 9ddc520652b99b7bf988410798252fe82b83d9bf Mon Sep 17 00:00:00 2001 From: reidbhuntley Date: Sat, 26 Jun 2021 12:05:00 -0400 Subject: [PATCH] Curses - Added the Peculiar Bell and the Cursed Bell --- .../loot_tables/blocks/cursed_bell.json | 19 ++ .../loot_tables/blocks/peculiar_bell.json | 19 ++ .../data/create/tags/blocks/brittle.json | 2 + .../java/com/simibubi/create/AllBlocks.java | 19 +- .../com/simibubi/create/AllParticleTypes.java | 7 +- .../com/simibubi/create/AllTileEntities.java | 13 ++ .../curiosities/bell/AbstractBellBlock.java | 70 +++++++ .../bell/AbstractBellTileEntity.java | 25 +++ .../curiosities/bell/CursedBellBlock.java | 30 +++ .../bell/CursedBellTileEntity.java | 177 ++++++++++++++++++ .../bell/CustomRotationParticle.java | 57 ++++++ .../curiosities/bell/PeculiarBellBlock.java | 29 +++ .../bell/PeculiarBellTileEntity.java | 19 ++ .../curiosities/bell/SoulBaseParticle.java | 52 +++++ .../curiosities/bell/SoulParticle.java | 51 +++++ .../foundation/data/BasicParticleData.java | 71 +++++++ .../assets/create/particles/soul.json | 20 ++ .../assets/create/particles/soul_base.json | 12 ++ .../create/textures/particle/soul_base_0.png | Bin 0 -> 102 bytes .../create/textures/particle/soul_base_1.png | Bin 0 -> 142 bytes .../create/textures/particle/soul_base_2.png | Bin 0 -> 174 bytes .../create/textures/particle/soul_base_3.png | Bin 0 -> 203 bytes .../create/textures/particle/soul_base_4.png | Bin 0 -> 250 bytes .../create/textures/particle/soul_base_5.png | Bin 0 -> 249 bytes .../create/textures/particle/soul_base_6.png | Bin 0 -> 143 bytes .../create/textures/particle/soul_base_7.png | Bin 0 -> 88 bytes .../textures/particle/soul_particle_0.png | Bin 0 -> 298 bytes .../textures/particle/soul_particle_1.png | Bin 0 -> 310 bytes .../textures/particle/soul_particle_10.png | Bin 0 -> 323 bytes .../textures/particle/soul_particle_11.png | Bin 0 -> 351 bytes .../textures/particle/soul_particle_12.png | Bin 0 -> 367 bytes .../textures/particle/soul_particle_13.png | Bin 0 -> 376 bytes .../textures/particle/soul_particle_14.png | Bin 0 -> 331 bytes .../textures/particle/soul_particle_15.png | Bin 0 -> 311 bytes .../textures/particle/soul_particle_2.png | Bin 0 -> 294 bytes .../textures/particle/soul_particle_3.png | Bin 0 -> 320 bytes .../textures/particle/soul_particle_4.png | Bin 0 -> 316 bytes .../textures/particle/soul_particle_5.png | Bin 0 -> 305 bytes .../textures/particle/soul_particle_6.png | Bin 0 -> 316 bytes .../textures/particle/soul_particle_7.png | Bin 0 -> 327 bytes .../textures/particle/soul_particle_8.png | Bin 0 -> 307 bytes .../textures/particle/soul_particle_9.png | Bin 0 -> 323 bytes 42 files changed, 689 insertions(+), 3 deletions(-) create mode 100644 src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/peculiar_bell.json create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellTileEntity.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java create mode 100644 src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java create mode 100644 src/main/java/com/simibubi/create/foundation/data/BasicParticleData.java create mode 100644 src/main/resources/assets/create/particles/soul.json create mode 100644 src/main/resources/assets/create/particles/soul_base.json create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_0.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_1.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_2.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_3.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_4.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_5.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_6.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_base_7.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_0.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_1.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_10.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_11.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_12.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_13.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_14.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_15.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_2.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_3.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_4.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_5.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_6.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_7.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_8.png create mode 100644 src/main/resources/assets/create/textures/particle/soul_particle_9.png diff --git a/src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json b/src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json new file mode 100644 index 000000000..ce719523e --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/cursed_bell.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:cursed_bell" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/peculiar_bell.json b/src/generated/resources/data/create/loot_tables/blocks/peculiar_bell.json new file mode 100644 index 000000000..fd37d00df --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/peculiar_bell.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:peculiar_bell" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/tags/blocks/brittle.json b/src/generated/resources/data/create/tags/blocks/brittle.json index 7970c3bf9..9372a9a4f 100644 --- a/src/generated/resources/data/create/tags/blocks/brittle.json +++ b/src/generated/resources/data/create/tags/blocks/brittle.json @@ -24,6 +24,8 @@ "create:pulley_magnet", "create:furnace_engine", "create:redstone_link", + "create:peculiar_bell", + "create:cursed_bell", "#minecraft:doors", "#minecraft:beds", "minecraft:flower_pot", diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 13af7d571..82b2af2e2 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -114,7 +114,8 @@ import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; import com.simibubi.create.content.curiosities.armor.CopperBacktankBlock; -import com.simibubi.create.content.curiosities.projector.ChromaticProjectorBlock; +import com.simibubi.create.content.curiosities.bell.CursedBellBlock; +import com.simibubi.create.content.curiosities.bell.PeculiarBellBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelCTBehaviour; @@ -1301,6 +1302,22 @@ public class AllBlocks { }) .register(); + public static final BlockEntry PECULIAR_BELL = + REGISTRATE.block("peculiar_bell", PeculiarBellBlock::new) + .initialProperties(SharedProperties::softMetal) + .tag(AllBlockTags.BRITTLE.tag) + .item() + .build() + .register(); + + public static final BlockEntry CURSED_BELL = + REGISTRATE.block("cursed_bell", CursedBellBlock::new) + .initialProperties(() -> PECULIAR_BELL.get()) + .tag(AllBlockTags.BRITTLE.tag) + .item() + .build() + .register(); + // Materials static { diff --git a/src/main/java/com/simibubi/create/AllParticleTypes.java b/src/main/java/com/simibubi/create/AllParticleTypes.java index 03726b2ef..23b3fdf0a 100644 --- a/src/main/java/com/simibubi/create/AllParticleTypes.java +++ b/src/main/java/com/simibubi/create/AllParticleTypes.java @@ -9,6 +9,8 @@ import com.simibubi.create.content.contraptions.particle.CubeParticleData; import com.simibubi.create.content.contraptions.particle.HeaterParticleData; import com.simibubi.create.content.contraptions.particle.ICustomParticleData; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; +import com.simibubi.create.content.curiosities.bell.SoulBaseParticle; +import com.simibubi.create.content.curiosities.bell.SoulParticle; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.client.Minecraft; @@ -31,8 +33,9 @@ public enum AllParticleTypes { CUBE(CubeParticleData::new), FLUID_PARTICLE(FluidParticleData::new), BASIN_FLUID(FluidParticleData::new), - FLUID_DRIP(FluidParticleData::new) - + FLUID_DRIP(FluidParticleData::new), + SOUL(SoulParticle.Data::new), + SOUL_BASE(SoulBaseParticle.Data::new) ; private ParticleEntry entry; diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index e0455c9c2..6037cb86c 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -119,6 +119,8 @@ import com.simibubi.create.content.contraptions.relays.gearbox.GearshiftTileEnti import com.simibubi.create.content.curiosities.armor.CopperBacktankInstance; import com.simibubi.create.content.curiosities.armor.CopperBacktankRenderer; import com.simibubi.create.content.curiosities.armor.CopperBacktankTileEntity; +import com.simibubi.create.content.curiosities.bell.CursedBellTileEntity; +import com.simibubi.create.content.curiosities.bell.PeculiarBellTileEntity; import com.simibubi.create.content.curiosities.projector.ChromaticProjectorInstance; import com.simibubi.create.content.curiosities.projector.ChromaticProjectorTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelInstance; @@ -658,6 +660,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.ADJUSTABLE_PULSE_REPEATER) .renderer(() -> AdjustableRepeaterRenderer::new) .register(); + public static final TileEntityEntry COPPER_BACKTANK = Create.registrate() .tileEntity("copper_backtank", CopperBacktankTileEntity::new) .instance(() -> CopperBacktankInstance::new) @@ -665,5 +668,15 @@ public class AllTileEntities { .renderer(() -> CopperBacktankRenderer::new) .register(); + public static final TileEntityEntry PECULIAR_BELL = Create.registrate() + .tileEntity("peculiar_bell", PeculiarBellTileEntity::new) + .validBlocks(AllBlocks.PECULIAR_BELL) + .register(); + + public static final TileEntityEntry CURSED_BELL = Create.registrate() + .tileEntity("cursed_bell", CursedBellTileEntity::new) + .validBlocks(AllBlocks.CURSED_BELL) + .register(); + public static void register() {} } diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java new file mode 100644 index 000000000..f9ff5c0c3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellBlock.java @@ -0,0 +1,70 @@ +package com.simibubi.create.content.curiosities.bell; + +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.block.ITE; + +import net.minecraft.block.BellBlock; +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public abstract class AbstractBellBlock extends BellBlock implements ITE { + + public AbstractBellBlock(Properties properties) { + super(properties); + } + + @Override + @Nullable + public TileEntity createNewTileEntity(IBlockReader block) { + return null; + } + + protected VoxelShape getShape(BlockState state) { + return VoxelShapes.fullCube(); + } + + @Override + public VoxelShape getCollisionShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext selection) { + return this.getShape(state); + } + + @Override + public VoxelShape getShape(BlockState state, IBlockReader reader, BlockPos pos, ISelectionContext selection) { + return this.getShape(state); + } + + @Override + public boolean ring(World world, BlockPos pos, @Nullable Direction direction) { + if (direction == null) { + direction = world.getBlockState(pos).get(field_220133_a); + } + + if (!ringInner(world, pos, direction)) + return false; + + if (world.isRemote) + return false; + + playSound(world, pos, direction); + return true; + } + + public static void playSound(World world, BlockPos pos, Direction direction) { + world.playSound(null, pos, SoundEvents.BLOCK_BELL_USE, SoundCategory.BLOCKS, 2.0F, 1.0F); + } + + protected boolean ringInner(World world, BlockPos pos, Direction direction) { + TE te = getTileEntity(world, pos); + return te != null && te.ring(world, pos, direction); + } +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java new file mode 100644 index 000000000..d024d395f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/AbstractBellTileEntity.java @@ -0,0 +1,25 @@ +package com.simibubi.create.content.curiosities.bell; + +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; + +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; + +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import java.util.List; + +public abstract class AbstractBellTileEntity extends SmartTileEntity { + + public AbstractBellTileEntity(TileEntityType type) { + super(type); + } + + @Override + public void addBehaviours(List behaviours) { } + + public abstract boolean ring(World world, BlockPos pos, Direction direction); + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java b/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java new file mode 100644 index 000000000..9fbede200 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellBlock.java @@ -0,0 +1,30 @@ +package com.simibubi.create.content.curiosities.bell; + +import com.simibubi.create.AllTileEntities; + +import com.simibubi.create.foundation.block.ITE; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public class CursedBellBlock extends AbstractBellBlock { + + public CursedBellBlock(Properties properties) { + super(properties); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.CURSED_BELL.create(); + } + + @Override + public Class getTileEntityClass() { + return CursedBellTileEntity.class; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java new file mode 100644 index 000000000..e9523da48 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/CursedBellTileEntity.java @@ -0,0 +1,177 @@ +package com.simibubi.create.content.curiosities.bell; + +import java.util.ArrayList; +import java.util.List; + +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.NBTHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.entity.EntitySpawnPlacementRegistry; +import net.minecraft.entity.EntityType; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import net.minecraft.world.spawner.WorldEntitySpawner; + +public class CursedBellTileEntity extends AbstractBellTileEntity { + + public static final int MAX_DISTANCE = 6; + private static final List> LAYERS = genLayers(); + + public enum Mode { + RUNNING, RECHARGING + } + + public static final int RECHARGE_TICKS = 16; + public static final int TICKS_PER_LAYER = 3; + public int ticks; + public Mode mode = Mode.RECHARGING; + + public CursedBellTileEntity(TileEntityType type) { + super(type); + } + + @Override + public void addBehaviours(List behaviours) { } + + @Override + protected void fromTag(BlockState state, CompoundNBT compound, boolean clientPacket) { + ticks = compound.getInt("Ticks"); + mode = NBTHelper.readEnum(compound, "Mode", Mode.class); + } + + @Override + public void write(CompoundNBT compound, boolean clientPacket) { + compound.putInt("Ticks", ticks); + NBTHelper.writeEnum(compound, "Mode", mode); + } + + @Override + public void tick() { + super.tick(); + + switch (mode) { + case RECHARGING: + if (ticks > 0) + ticks--; + break; + + case RUNNING: + if (ticks <= 0) + break; + + ticks--; + if (ticks % TICKS_PER_LAYER == 0) { + while (!trySpawnSouls(world, pos, MAX_DISTANCE - ticks / TICKS_PER_LAYER - 1) + && ticks > 0) { + ticks -= TICKS_PER_LAYER; + } + + if (ticks == 0) { + ticks = RECHARGE_TICKS; + mode = Mode.RECHARGING; + } + } + + break; + } + } + + public boolean tryStart() { + if (mode != Mode.RECHARGING || ticks > 0) + return false; + + ticks = TICKS_PER_LAYER*MAX_DISTANCE; + mode = Mode.RUNNING; + if (!world.isRemote) + sendData(); + + return true; + } + + @Override + public boolean ring(World world, BlockPos pos, Direction direction) { + return tryStart(); + } + + public static boolean trySpawnSouls(World world, BlockPos at, int layerIdx) { + if (world == null) + return false; + + boolean spawnedAny = false; + List layer = LAYERS.get(layerIdx); + for (BlockPos candidate : layer) { + candidate = candidate.add(at); + + if (!WorldEntitySpawner.canCreatureTypeSpawnAtLocation( + EntitySpawnPlacementRegistry.PlacementType.ON_GROUND, + world, candidate, EntityType.ZOMBIE)) + continue; + + if (world.getLightLevel(LightType.BLOCK, candidate) >= 8) + continue; + + if (!world.isRemote) + return true; + spawnedAny = true; + spawnParticles(world, candidate); + } + return spawnedAny; + } + + public static void spawnParticles(World world, BlockPos at) { + if (world == null || !world.isRemote) + return; + + Vector3d p = Vector3d.of(at); + world.addParticle(new SoulParticle.Data(), p.x + 0.5, p.y + 0.5, p.z + 0.5, 0, 0, 0); + world.addParticle(new SoulBaseParticle.Data(), p.x + 0.5, p.y + 0.01, p.z + 0.5, 0, 0, 0); + } + + private static List> genLayers() { + List> layers = new ArrayList<>(); + for (int i = 0; i < MAX_DISTANCE; i++) + layers.add(new ArrayList<>()); + + for (int x = 0; x < MAX_DISTANCE; x++) { + for (int y = 0; y < MAX_DISTANCE; y++) { + for (int z = 0; z < MAX_DISTANCE; z++) { + BlockPos candidate = new BlockPos(x,y,z); + int dist = 1 + (int)Math.sqrt(candidate.distanceSq(0,0,0,false)); + if (dist == 0 || dist > MAX_DISTANCE) + continue; + + List layer = layers.get(dist - 1); + int start = layer.size(), end = start + 1; + layer.add(candidate); + + if (candidate.getX() != 0) { + layer.add(new BlockPos(-candidate.getX(), candidate.getY(), candidate.getZ())); + end += 1; + } + if (candidate.getY() != 0) { + for (int i = start; i < end; i++) { + BlockPos prev = layer.get(i); + layer.add(new BlockPos(prev.getX(), -prev.getY(), prev.getZ())); + } + end += end - start; + } + if (candidate.getZ() != 0) { + for (int i = start; i < end; i++) { + BlockPos prev = layer.get(i); + layer.add(new BlockPos(prev.getX(), prev.getY(), -prev.getZ())); + } + } + } + } + } + + return layers; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java b/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java new file mode 100644 index 000000000..224c1f3a6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/CustomRotationParticle.java @@ -0,0 +1,57 @@ +package com.simibubi.create.content.curiosities.bell; + +import com.mojang.blaze3d.vertex.IVertexBuilder; + +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.particle.SimpleAnimatedParticle; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.vector.Quaternion; +import net.minecraft.util.math.vector.Vector3d; +import net.minecraft.util.math.vector.Vector3f; + +public class CustomRotationParticle extends SimpleAnimatedParticle { + + public CustomRotationParticle(ClientWorld worldIn, double x, double y, double z, IAnimatedSprite spriteSet, float yAccel) { + super(worldIn, x, y, z, spriteSet, yAccel); + } + + public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) { + Quaternion quaternion = new Quaternion(camera.getRotation()); + if (this.particleAngle != 0.0F) { + float angle = MathHelper.lerp(partialTicks, this.prevParticleAngle, this.particleAngle); + quaternion.multiply(Vector3f.POSITIVE_Z.getRadialQuaternion(angle)); + } + return quaternion; + } + + @Override + public void buildGeometry(IVertexBuilder builder, ActiveRenderInfo camera, float partialTicks) { + Vector3d cameraPos = camera.getProjectedView(); + float originX = (float)(MathHelper.lerp(partialTicks, this.prevPosX, this.posX) - cameraPos.getX()); + float originY = (float)(MathHelper.lerp(partialTicks, this.prevPosY, this.posY) - cameraPos.getY()); + float originZ = (float)(MathHelper.lerp(partialTicks, this.prevPosZ, this.posZ) - cameraPos.getZ()); + + Vector3f[] vertices = new Vector3f[]{new Vector3f(-1.0F, -1.0F, 0.0F), new Vector3f(-1.0F, 1.0F, 0.0F), new Vector3f(1.0F, 1.0F, 0.0F), new Vector3f(1.0F, -1.0F, 0.0F)}; + float scale = this.getScale(partialTicks); + + Quaternion rotation = getCustomRotation(camera, partialTicks); + for(int i = 0; i < 4; ++i) { + Vector3f vertex = vertices[i]; + vertex.func_214905_a(rotation); + vertex.mul(scale); + vertex.add(originX, originY, originZ); + } + + float minU = this.getMinU(); + float maxU = this.getMaxU(); + float minV = this.getMinV(); + float maxV = this.getMaxV(); + int brightness = this.getBrightnessForRender(partialTicks); + builder.vertex(vertices[0].getX(), vertices[0].getY(), vertices[0].getZ()).texture(maxU, maxV).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha).light(brightness).endVertex(); + builder.vertex(vertices[1].getX(), vertices[1].getY(), vertices[1].getZ()).texture(maxU, minV).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha).light(brightness).endVertex(); + builder.vertex(vertices[2].getX(), vertices[2].getY(), vertices[2].getZ()).texture(minU, minV).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha).light(brightness).endVertex(); + builder.vertex(vertices[3].getX(), vertices[3].getY(), vertices[3].getZ()).texture(minU, maxV).color(this.particleRed, this.particleGreen, this.particleBlue, this.particleAlpha).light(brightness).endVertex(); + } +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java b/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java new file mode 100644 index 000000000..0c79bad5a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellBlock.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.curiosities.bell; + +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; + +import net.minecraft.block.BlockState; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.util.math.shapes.VoxelShapes; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; + +public class PeculiarBellBlock extends AbstractBellBlock { + + public PeculiarBellBlock(Properties properties) { + super(properties); + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.PECULIAR_BELL.create(); + } + + @Override + public Class getTileEntityClass() { return PeculiarBellTileEntity.class; } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellTileEntity.java b/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellTileEntity.java new file mode 100644 index 000000000..fa0a16e3e --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/PeculiarBellTileEntity.java @@ -0,0 +1,19 @@ +package com.simibubi.create.content.curiosities.bell; + +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class PeculiarBellTileEntity extends AbstractBellTileEntity { + + public PeculiarBellTileEntity(TileEntityType type) { + super(type); + } + + @Override + public boolean ring(World world, BlockPos pos, Direction direction) { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java new file mode 100644 index 000000000..cddc02b44 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulBaseParticle.java @@ -0,0 +1,52 @@ +package com.simibubi.create.content.curiosities.bell; + +import com.simibubi.create.AllParticleTypes; +import com.simibubi.create.foundation.data.BasicParticleData; + +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particles.ParticleType; +import net.minecraft.util.math.vector.Quaternion; +import net.minecraft.util.math.vector.Vector3f; + +public class SoulBaseParticle extends CustomRotationParticle { + + private final IAnimatedSprite animatedSprite; + + public SoulBaseParticle(ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz, + IAnimatedSprite spriteSet) { + super(worldIn, x, y, z, spriteSet, 0); + this.animatedSprite = spriteSet; + this.particleScale = 0.5f; + this.setSize(this.particleScale,this.particleScale); + this.maxAge = (int)(16.0F / (this.rand.nextFloat() * 0.36F + 0.64F)); + this.selectSpriteWithAge(animatedSprite); + this.field_21507 = true; // disable movement + } + + @Override + public void tick() { + if (this.age++ >= this.maxAge) { + this.setExpired(); + } else { + this.selectSpriteWithAge(animatedSprite); + } + } + + @Override + public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) { + return Vector3f.POSITIVE_X.getDegreesQuaternion(90); + } + + public static class Data extends BasicParticleData { + @Override + public IBasicParticleFactory getBasicFactory() { + return SoulBaseParticle::new; + } + @Override + public ParticleType getType() { + return AllParticleTypes.SOUL_BASE.get(); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java new file mode 100644 index 000000000..9d2a1a017 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/curiosities/bell/SoulParticle.java @@ -0,0 +1,51 @@ +package com.simibubi.create.content.curiosities.bell; + +import com.simibubi.create.AllParticleTypes; +import com.simibubi.create.foundation.data.BasicParticleData; + +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.particles.ParticleType; +import net.minecraft.util.math.vector.Quaternion; + +public class SoulParticle extends CustomRotationParticle { + + private final IAnimatedSprite animatedSprite; + + public SoulParticle(ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz, + IAnimatedSprite spriteSet) { + super(worldIn, x, y, z, spriteSet, 0); + this.animatedSprite = spriteSet; + this.particleScale = 0.5f; + this.setSize(this.particleScale,this.particleScale); + this.maxAge = (int)(16.0F / (this.rand.nextFloat() * 0.36F + 0.64F)); + this.selectSpriteWithAge(animatedSprite); + this.field_21507 = true; // disable movement + } + + @Override + public void tick() { + if (this.age++ >= this.maxAge) { + this.setExpired(); + } else { + this.selectSpriteWithAge(animatedSprite); + } + } + + @Override + public Quaternion getCustomRotation(ActiveRenderInfo camera, float partialTicks) { + return new Quaternion(0, -camera.getYaw(), 0, true); + } + + public static class Data extends BasicParticleData { + @Override + public IBasicParticleFactory getBasicFactory() { + return SoulParticle::new; + } + @Override + public ParticleType getType() { + return AllParticleTypes.SOUL.get(); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/data/BasicParticleData.java b/src/main/java/com/simibubi/create/foundation/data/BasicParticleData.java new file mode 100644 index 000000000..7cb0ff2fc --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/BasicParticleData.java @@ -0,0 +1,71 @@ +package com.simibubi.create.foundation.data; + +import javax.annotation.ParametersAreNonnullByDefault; + +import com.mojang.brigadier.StringReader; +import com.mojang.serialization.Codec; +import com.simibubi.create.content.contraptions.particle.ICustomParticleDataWithSprite; + +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.client.particle.IAnimatedSprite; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.PacketBuffer; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleType; +import net.minecraft.util.registry.Registry; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import java.util.Map; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public abstract class BasicParticleData implements IParticleData, ICustomParticleDataWithSprite> { + + public BasicParticleData() { } + + @Override + public IDeserializer> getDeserializer() { + BasicParticleData data = this; + return new IParticleData.IDeserializer>() { + @Override + public BasicParticleData deserialize(ParticleType> arg0, StringReader reader) { + return data; + } + @Override + public BasicParticleData read(ParticleType> type, PacketBuffer buffer) { + return data; + } + }; + } + + @Override + public Codec> getCodec(ParticleType> type) { + return Codec.unit(this); + } + + public interface IBasicParticleFactory { + U makeParticle(ClientWorld worldIn, double x, double y, double z, double vx, double vy, double vz, IAnimatedSprite sprite); + } + + @OnlyIn(Dist.CLIENT) + public abstract IBasicParticleFactory getBasicFactory(); + + @Override + @OnlyIn(Dist.CLIENT) + public ParticleManager.IParticleMetaFactory> getMetaFactory() { + return animatedSprite -> (data, worldIn, x, y, z, vx, vy, vz) -> + getBasicFactory().makeParticle(worldIn, x, y, z, vx, vy, vz, animatedSprite); + } + + @Override + public String getParameters() { + return Registry.PARTICLE_TYPE.getKey(getType()).toString(); + } + + @Override + public void write(PacketBuffer buffer) { } +} diff --git a/src/main/resources/assets/create/particles/soul.json b/src/main/resources/assets/create/particles/soul.json new file mode 100644 index 000000000..a0d30c4f8 --- /dev/null +++ b/src/main/resources/assets/create/particles/soul.json @@ -0,0 +1,20 @@ +{ + "textures": [ + "create:soul_particle_0", + "create:soul_particle_1", + "create:soul_particle_2", + "create:soul_particle_3", + "create:soul_particle_4", + "create:soul_particle_5", + "create:soul_particle_6", + "create:soul_particle_7", + "create:soul_particle_8", + "create:soul_particle_9", + "create:soul_particle_10", + "create:soul_particle_11", + "create:soul_particle_12", + "create:soul_particle_13", + "create:soul_particle_14", + "create:soul_particle_15" + ] +} diff --git a/src/main/resources/assets/create/particles/soul_base.json b/src/main/resources/assets/create/particles/soul_base.json new file mode 100644 index 000000000..92b9f65be --- /dev/null +++ b/src/main/resources/assets/create/particles/soul_base.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "create:soul_base_0", + "create:soul_base_1", + "create:soul_base_2", + "create:soul_base_3", + "create:soul_base_4", + "create:soul_base_5", + "create:soul_base_6", + "create:soul_base_7" + ] +} diff --git a/src/main/resources/assets/create/textures/particle/soul_base_0.png b/src/main/resources/assets/create/textures/particle/soul_base_0.png new file mode 100644 index 0000000000000000000000000000000000000000..9f5053af5800113f931a7b306e91a45c6ba98430 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|6g*uVLo9le y6C_v<%NBg`|8@SN{Y!g0Q=czIXEY?PFffFqvjorPs%QYJW$<+Mb6Mw<&;$V0c^q#5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_base_1.png b/src/main/resources/assets/create/textures/particle/soul_base_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5e00fff621ff8b01b68434eda59f604733f4fbed GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|JUm?-Lo9le z6C_xf`6UWH3%>aOI=^pbjhhCfiKYq-O-A83+7wd)xlYabq nV0Y))dj5C8S?4ttXfiOAJ`q0iU-bGapqUJwu6{1-oD!Mb$@ohbi<)lVyhQ?YE1rbzo-86hpz`~*+3wV)s>CWF>y`Xh6hCl zud{!btP^?WX!6DXm%f5VPpGW09&-n)MeKpK3r-xkVE@v7PA_wSOvmB|kbBCcmz_QE RNfgLp@O1TaS?83{1OP^CJRAT3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_base_3.png b/src/main/resources/assets/create/textures/particle/soul_base_3.png new file mode 100644 index 0000000000000000000000000000000000000000..8f36415b3c2b1599e42da8bb14912bd49a6e958e GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|T0LDHLo9mV zPBi2@WWeJpzb4XQr$bQuqNGR1WUCr|0`(?t5qH>7!Y909RkX^Lt@Snk{!PoZD7mHO z(Xn+ZTf-FYpLNk+*Ew-++&7PZSs}v#i}O#j%$-9vzx}oA$+p+4TUPw2fFelvYv5ltq(Q^61@6!ASr8%4}oSz<6nFn+bgQu&X%Q~loCIHn$ BPc#4k literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_base_4.png b/src/main/resources/assets/create/textures/particle/soul_base_4.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf7bef26757939ccb4e77ad2e517f7bc0e1385f GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|ws^WYhFJ98 z4YKAtWWZCa(B>8C5E(Jy(i0&;;qMOurdF{(6qH>mt{_+5B4Ko;ZWAvJ4FygkJNuipVU#Yj(Tj zT};SU{-29h?ajE=(ciW5Qlwz0l~JS}ThNEfHzLdS9j?{)Z1(?Px#vq?ljR5*>rl06CnF%X5{ZWXY}k_)K0gjjhG?;v=RKrUk81yU`!M1H`=MzmS5 z8!H#ZBrBxYSI+ll<}nN~x0)P~rl*Zu0|2b^aJy~N`%{#rr^o$`)E zrZidS)3EA@0Khv@Ou>{U-ifbT^&?fk^89)M@TpvlqfN@m00000NkvXXu0mjfz=dV^ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_base_6.png b/src/main/resources/assets/create/textures/particle/soul_base_6.png new file mode 100644 index 0000000000000000000000000000000000000000..04e3e0b7463b761d3c7164c0c7e92636ce16f438 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|JUv|;Lo9le z6BY;dA9$vC!bT4#i>%WRKTa$T_oAJ`5Y qJaCLjbDe^g>7+?hR?eU4!OC!IUuIs(K}n7>tD{y z970q$i7PHum`(A`k|Q3Az@7yQy!(TP41j5De|+@ zQ0I_A!qMsZJm2l>(ssN~ING7t?k&TdaGIM%c>0H5XIX@OzC0F}SSj*OrthEU|DB>D sk}NE(k`h2*x2OK}2eS*)Cr*%INLQcHZj`z_6X;(CPgg&ebxsLQ0Ki#*jQ{`u literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_1.png b/src/main/resources/assets/create/textures/particle/soul_particle_1.png new file mode 100644 index 0000000000000000000000000000000000000000..475f70e60916ac1acb962b7a01efffef5d6ec452 GIT binary patch literal 310 zcmV-60m=S}P)Px#@JU2LR5*>DQacWUKolH^1u+^mG&UB7))MbvV_|2)Rk#BI&tPI_!3C&@2cT68 z8yf@nF}v0pZ~`*&xYtEgJcrv<4U8ZZ2%6&&gXVb6A`FaZUvjEe@V+Hgp8jg* zm|bDIE12#I%T8P1aRSvl*zFGhfc0otu6A>~mvJeq)0t#*FoKYbApH5r1o2ve%=sI% z*dtA1!G-m&Z+)7XQ*Is%WkBEh)F0@ALz={3@id7MFXo)c1Db`9*2RfS6951J07*qo IM6N<$f)5yd%m4rY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_10.png b/src/main/resources/assets/create/textures/particle/soul_particle_10.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5974c1dd9e6d73842eeeb1399418ace1bf1869 GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|{(8DNhFJ6_ zCrGds1blw^y1wX(p^<@sfs1|J$M}i!#q}!wKTdC3x=E<#MBDZcg~mx2`7fTiX#dil zr{IhKuXv!2|1XZ~|5ILl@bwoU;{n^1nqR;EpR(uR4PIRHK*EnXLIMc1mL8R~Q1?ko z0D>QJ6HXV1`u>b%*M4&@9VoEt|3~Al16Tj^@M!O=Nsg#{r{otN|MR8hyRYB*O;}@Re#g!nG^nIEL?M> z;L$tVIbDeik-Wk^ji*n(V0#qYZN963QDkz<_53#J4`vspYgjU@=jhtDwp;crFd!H_ MUHx3vIVCg!0KmG6A^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_11.png b/src/main/resources/assets/create/textures/particle/soul_particle_11.png new file mode 100644 index 0000000000000000000000000000000000000000..e169d4364b9b9281b3719743d450ea4e6a2b936c GIT binary patch literal 351 zcmV-l0igbgP)Px$8A(JzR5*>@QM-!5KomVA7J=ZZa4KCQVSIk*#vKSY~!+O|r1%9=LEHbI#lc@PFWCIsJvlgyWZ$Ch+!TYBe=}fL~T* z1R)6+K}f1#XLo*CQBo86WhDi?EY}3w&GvTz@v{+xl+<4$9ivP1(#sV9@UA?MZg<4| z&`L^blCS$QKOh7;dO(e3`-0iRCTa<@l%xx%y^jK-Em{&^h$5M66< zH`~U!n{w(>`@%V&3dH%y<8__O%W@K?=6h=J;y$;Mo#6n&R1w*VwOZ3?Y~g$= xP|Rn{2txXJT`+64CIG08DNNge>KF4F`vg#NwXK#65orJb002ovPDHLkV1gbjoAm$y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_12.png b/src/main/resources/assets/create/textures/particle/soul_particle_12.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f992fef7257a44694c227a4f929ed31d6c8b8e GIT binary patch literal 367 zcmV-#0g(QQP)Px$DM>^@R5*>zQax*fP!v5%2SNIUOO}8(f1-5iAL!88zv5WvDEJ>jvSrB9u~Ts< zfq)&=fE4T?iJF(u+o9aYvziEcG#3&G!dMFl`56oFKlx>-{*Ds{_DvJkn;XHRk&ROxwZLwI#*s zWEg2#cO&e!1!k)?0JNM{GUHe@Sc_%HZD<0mjBb__FHaxTIK7K?%1s?L?@6Zv71m-& z#p8pNS}a4yf~ds@~A;{<2NL}HW5``xy{%XPx$GD$>1R5*>Tl09z1KoCZsQ3?Wbenb-qMGE2sNK~nEffT8oqtFp4C6RN6NOUQ3 z0V?DJgwi;YQ#geMwz10$1?*uh)8|pYDjl7-4AfWNM{z=>}C~JR#Q&r+y-E1H#mKHWoS1Js#*hrBm-c! z%{i05v$C0$X@KX?8LtWenl~NBs{+rT?*y1&4OlK>f+SdFPo5jC`SGduAy6QK*P`&d zT;Aoxx^~tips`C>)v8_y3s2D4CTt`io6y2&wc~Zd(T=|*Ui6q?r?P#R5Dz% XpKYf%@3A>BbQnBc{an^LB{Ts5CTf## literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_15.png b/src/main/resources/assets/create/textures/particle/soul_particle_15.png new file mode 100644 index 0000000000000000000000000000000000000000..ac95537af05ec033549edfecbba8d45613ee6736 GIT binary patch literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|K6<)1hFJ6_ zCnzu#eDVL~-(&TvVU~aV|LZlsyyo?q&foX%KL}|5|M$PY?oX43^Nb0W-|g$tc6haz zJ!L*#uzJ^xBy{^WV8!Ay&p z2U8xUu({U7vCUyy^WzimIzdaDgrqxMT|B4H#~yi`6T|8G^T5XchhCcpPdhP%U*>Q= z!_Jcua%=|n$=$^@+Ya;o`0!8H`Rwxb|KHdDIkVx>Y4eJPYc;=q{XhJByG87QrZbJL pA8vh4msrB<`yeNe)pZWg*BuG-S;DHK{eXUD@O1TaS?83{1ORUOf?NOq literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_3.png b/src/main/resources/assets/create/textures/particle/soul_particle_3.png new file mode 100644 index 0000000000000000000000000000000000000000..0f98b122b6b5851eac7ec7b506cd81b90745687b GIT binary patch literal 320 zcmV-G0l)rPx#`bk7VR5*>zQauj=K@=RK5Z|IuXoylF#E&8OOC(oHlo$L68og2_S6qnX+B?NX zatgt+%6qEYEQcdem~QvInfG>P0SSuZ68;WhTSetVb-oBR>z4g?K;+X+RK|sPFO&S3 zC&+PaNTx>=*M{$nHa#MhagryhjFaNHWO_u8p2QvnCYLKVr}N$2=5$84R77hqLaEWZ zs|5u7_sNFpmW@6TAb*8t3H=tbY0nV)&HV{H1Gh>fjzJTe<5Rq+H29o8<%MEVZ=zrTT Sp&*$60000 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_4.png b/src/main/resources/assets/create/textures/particle/soul_particle_4.png new file mode 100644 index 0000000000000000000000000000000000000000..21862c96eae15c4767bfed17cb48d85ae71a9211 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|zInPhhFJ6_ zCoC`xuq$|Df3eH*m-@rdn9nb@Kei=au6cU@|No2q@e3plwfKIVTL1sQaJF<9b6CyK zV+H>or;BXlkkf1Xwp_o{m?75q%!Q?!gnHE9-BUi6sM7ZD0Ymt|zv`z?>KGjB(!c+p z>BgcBt^KnF*E4RIu>R+luk|ea;>PfRhkzLm z5C7iI!_;($2L$Br?N3brf(q#ur%xPUI9X!P^;tqvLPCOJV`SEydv*`b0YiYn)78&q Iol`;+0A`+tO#lD@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_5.png b/src/main/resources/assets/create/textures/particle/soul_particle_5.png new file mode 100644 index 0000000000000000000000000000000000000000..af675b7917cb1e85c6192a953fde189f1758f473 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|UVFMYhFJ6_ zCnzvj{8Im`zN9Uq;OYJU|4rxbTO@J9rHfH}Urq9k{~wJDyDsK-)%|HQS^wbDf|>^s zg=~Ur3nUt~|Noo(G+j(0`RMfgf`c!P>;KdK^x4P&2=4sD-`?P*?auLxdR6jax)GE{FW3_yVRz}^VUD!XwHsm{&jv8f1mx&XRehr32=YiY4A2KyNd6y85}Sb4q9e0ASFH A82|tP literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_6.png b/src/main/resources/assets/create/textures/particle/soul_particle_6.png new file mode 100644 index 0000000000000000000000000000000000000000..2aec0598658f417b5da948e3b066550234aff6a8 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|zInPhhFJ6_ zCnyNI*w=lWA7Z2hepmnJ3{dj*e-1gl79DPx$0ZBwbR5*>*kTFZcKpe$?CmGZlGdLKKfWfa&mo9d6S6n)F7MCssM|Z7$hJc%h zegG%Q;Mk6rD`d%1+8E>5>ktytHY&KN4-Ve{?s)(A9{gFXUS8|p_VDk}pXwi#CUSEA znram%xRwckiW5A?7Wv!7W=&KH80De6v;8q_tV0-S&#{Gyldo;G!bmToKg~`njP%~q z^QZAv09?yt?dqnuEOP+aY*gAW1OSeXPZ($zXy~-t-#X5@0a;ZV;8=|)B0+0?Bz6|hXz+^mP>+WH$#B`_% ZJ_COxa5mLfnHK;6002ovPDHLkV1o1sjt~F< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_8.png b/src/main/resources/assets/create/textures/particle/soul_particle_8.png new file mode 100644 index 0000000000000000000000000000000000000000..90f219c142e303d37c5ee40bb3298fee81794378 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|-g>$?hFJ6_ zCrGe1bHx1o{@>p6mqcREi{twLv_E||G5~@*|9{L(T)BoNX5F*P*Z=F*-06whS- zL=F0({DBRRPMfz0m%o2# z!Vt-SIVh6z*tg~Sk~>62HfkMsR-bZsrUVd7JLP3iHDiWRfwqRx4|%I|2Y?`9;hG~0 zY98G9&;R~@(hi159@V_o>-oo|3i6q23zso6FzI&Wmoc0<3iLRGr>mdKI;Vst00D%8 AQvd(} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/particle/soul_particle_9.png b/src/main/resources/assets/create/textures/particle/soul_particle_9.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e51c1462e801519ffe44646add577ebfbc5eb5 GIT binary patch literal 323 zcmV-J0lfZ+P)Px#{YgYYR5*=eU>F6|16Th2|4)uSMi?Xd@r(b8{Jabd3=9nSKYnIdDk}k(tNHZx ze+wTsBNqJ(EHDKTJX~