From baa3f501b604578ea4cf4a2ee487e22113df9b7f Mon Sep 17 00:00:00 2001 From: Sen Date: Tue, 8 Jul 2025 22:15:03 +0200 Subject: [PATCH] clean up particles --- .../java/client/network/ClientPlayer.java | 2 +- .../renderer/particle/EffectRenderer.java | 3 +- .../renderer/particle/EntityBubbleFX.java | 56 ------------------ .../main/java/client/world/WorldClient.java | 4 +- .../resources/textures/world/particles.png | Bin 18812 -> 17538 bytes .../src/main/java/common/entity/Entity.java | 4 +- .../java/common/entity/animal/EntityWolf.java | 2 +- .../java/common/entity/item/EntityBoat.java | 4 +- .../java/common/entity/npc/EntityNPC.java | 10 ++-- .../common/entity/projectile/EntityArrow.java | 2 +- .../common/entity/projectile/EntityHook.java | 6 +- .../entity/projectile/EntityProjectile.java | 2 +- .../common/entity/types/EntityThrowable.java | 2 +- .../main/java/common/model/ParticleType.java | 5 +- .../common/packet/SPacketEntityEffect.java | 10 ---- .../main/java/common/potion/PotionEffect.java | 32 ++-------- .../main/java/common/potion/PotionHelper.java | 39 ++++-------- .../common/tileentity/TileEntityBeacon.java | 4 +- .../server/command/CommandEnvironment.java | 1 + .../command/commands/CommandEffect.java | 33 +++++++++++ .../command/commands/CommandPotion.java | 6 +- .../src/main/java/server/network/Player.java | 2 +- 22 files changed, 75 insertions(+), 154 deletions(-) delete mode 100755 client/src/main/java/client/renderer/particle/EntityBubbleFX.java create mode 100644 server/src/main/java/server/command/commands/CommandEffect.java diff --git a/client/src/main/java/client/network/ClientPlayer.java b/client/src/main/java/client/network/ClientPlayer.java index 1c6243ef..27de9633 100755 --- a/client/src/main/java/client/network/ClientPlayer.java +++ b/client/src/main/java/client/network/ClientPlayer.java @@ -1526,7 +1526,7 @@ public class ClientPlayer implements IClientPlayer if (entity instanceof EntityLiving living) { - PotionEffect potioneffect = new PotionEffect(packetIn.getEffectId(), packetIn.getDuration(), packetIn.getAmplifier(), false, packetIn.hasParticles()) + PotionEffect potioneffect = new PotionEffect(packetIn.getEffectId(), packetIn.getDuration(), packetIn.getAmplifier()) .setRemaining(packetIn.getRemaining()); living.addEffect(potioneffect); } diff --git a/client/src/main/java/client/renderer/particle/EffectRenderer.java b/client/src/main/java/client/renderer/particle/EffectRenderer.java index 2d1dfa21..2e76b284 100755 --- a/client/src/main/java/client/renderer/particle/EffectRenderer.java +++ b/client/src/main/java/client/renderer/particle/EffectRenderer.java @@ -60,8 +60,7 @@ public class EffectRenderer private void registerVanillaParticles() { this.register(ParticleType.EXPLOSION_NORMAL, new EntityExplodeFX.Factory()); - this.register(ParticleType.WATER_BUBBLE, new EntityBubbleFX.Factory()); - this.register(ParticleType.WATER_SPLASH, new EntitySplashFX.Factory()); + this.register(ParticleType.SPLASH, new EntitySplashFX.Factory()); this.register(ParticleType.WATER_DROP, new EntityDownfallFX.RainFactory()); this.register(ParticleType.DEPTH, new EntityAuraFX.SuspendFactory()); this.register(ParticleType.CRIT, new EntityCritFX.Factory()); diff --git a/client/src/main/java/client/renderer/particle/EntityBubbleFX.java b/client/src/main/java/client/renderer/particle/EntityBubbleFX.java deleted file mode 100755 index 8441a640..00000000 --- a/client/src/main/java/client/renderer/particle/EntityBubbleFX.java +++ /dev/null @@ -1,56 +0,0 @@ -package client.renderer.particle; - -import common.block.Material; -import common.util.BlockPos; -import common.world.World; - -public class EntityBubbleFX extends EntityFX -{ - protected EntityBubbleFX(World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn) - { - super(worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn); - this.particleRed = 1.0F; - this.particleGreen = 1.0F; - this.particleBlue = 1.0F; - this.setParticleTextureIndex(32); - this.setSize(0.02F, 0.02F); - this.particleScale *= this.rand.floatv() * 0.6F + 0.2F; - this.motionX = xSpeedIn * 0.20000000298023224D + (Math.random() * 2.0D - 1.0D) * 0.019999999552965164D; - this.motionY = ySpeedIn * 0.20000000298023224D + (Math.random() * 2.0D - 1.0D) * 0.019999999552965164D; - this.motionZ = zSpeedIn * 0.20000000298023224D + (Math.random() * 2.0D - 1.0D) * 0.019999999552965164D; - this.particleMaxAge = (int)(8.0D / (Math.random() * 0.8D + 0.2D)); - } - - /** - * Called to update the entity's position/logic. - */ - public void onUpdate() - { - this.prevX = this.posX; - this.prevY = this.posY; - this.prevZ = this.posZ; - this.motionY += 0.002D; - this.moveEntity(this.motionX, this.motionY, this.motionZ); - this.motionX *= 0.8500000238418579D; - this.motionY *= 0.8500000238418579D; - this.motionZ *= 0.8500000238418579D; - - if (this.worldObj.getState(new BlockPos(this)).getBlock().getMaterial() != Material.WATER) - { - this.setDead(); - } - - if (this.particleMaxAge-- <= 0) - { - this.setDead(); - } - } - - public static class Factory implements IParticleFactory - { - public EntityFX getEntityFX(World worldIn, double xCoordIn, double yCoordIn, double zCoordIn, double xSpeedIn, double ySpeedIn, double zSpeedIn, int data) - { - return new EntityBubbleFX(worldIn, xCoordIn, yCoordIn, zCoordIn, xSpeedIn, ySpeedIn, zSpeedIn); - } - } -} diff --git a/client/src/main/java/client/world/WorldClient.java b/client/src/main/java/client/world/WorldClient.java index 1456070f..51df685c 100755 --- a/client/src/main/java/client/world/WorldClient.java +++ b/client/src/main/java/client/world/WorldClient.java @@ -648,7 +648,7 @@ public class WorldClient extends AWorldClient this.spawnEntityFX(ParticleType.ITEM_CRACK, ParticleType.ITEM_CRACK.isUnlimited(), d13, d14, d16, this.rand.gaussian() * 0.15D, this.rand.doublev() * 0.2D, this.rand.gaussian() * 0.15D, ItemRegistry.getId(Items.potion)); } - ParticleType enumparticletypes = ParticleType.WATER_SPLASH; + ParticleType enumparticletypes = ParticleType.SPLASH; float f = 1.0F; float f1 = 1.0F; float f2 = 1.0F; @@ -672,7 +672,7 @@ public class WorldClient extends AWorldClient if (entityfx != null) { - if(enumparticletypes != ParticleType.WATER_SPLASH) { + if(enumparticletypes != ParticleType.SPLASH) { float f3 = 0.75F + this.rand.floatv() * 0.25F; entityfx.setRBGColorF(f * f3, f1 * f3, f2 * f3); } diff --git a/client/src/main/resources/textures/world/particles.png b/client/src/main/resources/textures/world/particles.png index 447156fb930e35da96a1ed1b5c3841d17d96cf2b..6a09061c9526a708e8d7a3d220276638e06e83b5 100755 GIT binary patch delta 13955 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 a2&#_C%X;Y3pZ|O9ffQs^rRyZk!~Y*x_hB*s delta 15381 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 KB private int amplifier; private int duration; private int remaining; - private boolean particles; public SPacketEntityEffect() { @@ -36,8 +35,6 @@ public class SPacketEntityEffect implements Packet this.duration = effect.getDuration(); this.remaining = effect.getRemaining(); // } - - this.particles = effect.getIsShowParticles(); } /** @@ -50,7 +47,6 @@ public class SPacketEntityEffect implements Packet this.amplifier = buf.readVarInt(); this.duration = buf.readVarInt(); this.remaining = buf.readVarInt(); - this.particles = buf.readBoolean(); } /** @@ -63,7 +59,6 @@ public class SPacketEntityEffect implements Packet buf.writeVarInt(this.amplifier); buf.writeVarInt(this.duration); buf.writeVarInt(this.remaining); - buf.writeBoolean(this.particles); } /** @@ -98,9 +93,4 @@ public class SPacketEntityEffect implements Packet { return this.remaining; } - - public boolean hasParticles() - { - return this.particles; - } } diff --git a/common/src/main/java/common/potion/PotionEffect.java b/common/src/main/java/common/potion/PotionEffect.java index 861e0340..5868ba23 100755 --- a/common/src/main/java/common/potion/PotionEffect.java +++ b/common/src/main/java/common/potion/PotionEffect.java @@ -8,30 +8,20 @@ public class PotionEffect { private final Potion potion; private final int duration; private final int amplifier; - private final boolean ambient; - private final boolean particles; private int remaining; private boolean thrown; - - public PotionEffect(Potion id, int duration, int amplifier) { - this(id, duration, amplifier, false, true); - } - public PotionEffect(Potion id, int duration, int amplifier, boolean ambient, boolean showParticles) { + public PotionEffect(Potion id, int duration, int amplifier) { this.potion = id; this.duration = this.remaining = duration; this.amplifier = amplifier; - this.ambient = ambient; - this.particles = showParticles; } public PotionEffect(PotionEffect other) { this.potion = other.potion; this.duration = this.remaining = other.duration; this.amplifier = other.amplifier; - this.ambient = other.ambient; - this.particles = other.particles; } public PotionEffect combine(PotionEffect other) { @@ -40,7 +30,6 @@ public class PotionEffect { int duration = this.duration; int amplifier = this.amplifier; int remaining = this.remaining; - boolean ambient = this.ambient; if(other.amplifier > this.amplifier) { amplifier = other.amplifier; duration = other.duration; @@ -50,10 +39,7 @@ public class PotionEffect { duration = other.duration; remaining = other.remaining; } - else if(!other.ambient && this.ambient) { - ambient = other.ambient; - } - return new PotionEffect(this.potion, duration, amplifier, ambient, other.particles).setRemaining(remaining); + return new PotionEffect(this.potion, duration, amplifier).setRemaining(remaining); } public Potion getPotion() { @@ -86,14 +72,6 @@ public class PotionEffect { return this; } - public boolean isAmbient() { - return this.ambient; - } - - public boolean getIsShowParticles() { - return this.particles; - } - public boolean onUpdate(EntityLiving entityIn) { if(this.isInfinite() && this.remaining < 20 * 60) this.remaining = Integer.MAX_VALUE; @@ -132,7 +110,7 @@ public class PotionEffect { return false; PotionEffect other = (PotionEffect)obj; return this.potion == other.potion && this.amplifier == other.amplifier && this.duration == other.duration - && this.thrown == other.thrown && this.remaining == other.remaining && this.ambient == other.ambient; + && this.thrown == other.thrown && this.remaining == other.remaining; } public TagObject toTags() { @@ -141,14 +119,12 @@ public class PotionEffect { tag.setByte("Amplifier", (byte)this.amplifier); tag.setInt("Duration", this.duration); tag.setInt("Remaining", this.remaining); - tag.setBool("Ambient", this.ambient); - tag.setBool("Particles", this.particles); return tag; } public static PotionEffect fromTags(TagObject tag) { Potion potion = Potion.getByName(tag.getString("Type")); - return potion == null ? null : new PotionEffect(potion, tag.getInt("Duration"), (int)(tag.getByte("Amplifier") & 255), tag.getBool("Ambient"), tag.getBool("Particles")) + return potion == null ? null : new PotionEffect(potion, tag.getInt("Duration"), (int)(tag.getByte("Amplifier") & 255)) .setRemaining(tag.getInt("Remaining")); } } diff --git a/common/src/main/java/common/potion/PotionHelper.java b/common/src/main/java/common/potion/PotionHelper.java index 49ddf552..4691df1b 100755 --- a/common/src/main/java/common/potion/PotionHelper.java +++ b/common/src/main/java/common/potion/PotionHelper.java @@ -81,30 +81,27 @@ public class PotionHelper /** * Given a {@link Collection}<{@link PotionEffect}> will return an Integer color. */ - public static int calcPotionLiquidColor(Collection p_77911_0_) + public static int calcPotionLiquidColor(Collection effects) { int i = 3694022; - if (p_77911_0_ != null && !p_77911_0_.isEmpty()) + if (effects != null && !effects.isEmpty()) { float f = 0.0F; float f1 = 0.0F; float f2 = 0.0F; float f3 = 0.0F; - for (PotionEffect potioneffect : p_77911_0_) + for (PotionEffect potioneffect : effects) { - if (potioneffect.getIsShowParticles()) - { - int j = potioneffect.getPotion().getColor(); + int j = potioneffect.getPotion().getColor(); - for (int k = 0; k <= potioneffect.getAmplifier(); ++k) - { - f += (float)(j >> 16 & 255) / 255.0F; - f1 += (float)(j >> 8 & 255) / 255.0F; - f2 += (float)(j >> 0 & 255) / 255.0F; - ++f3; - } + for (int k = 0; k <= potioneffect.getAmplifier(); ++k) + { + f += (float)(j >> 16 & 255) / 255.0F; + f1 += (float)(j >> 8 & 255) / 255.0F; + f2 += (float)(j >> 0 & 255) / 255.0F; + ++f3; } } @@ -125,22 +122,6 @@ public class PotionHelper return i; } } - - /** - * Check whether a {@link Collection}<{@link PotionEffect}> are all ambient. - */ - public static boolean getAreAmbient(Collection potionEffects) - { - for (PotionEffect potioneffect : potionEffects) - { - if (!potioneffect.isAmbient()) - { - return false; - } - } - - return true; - } public static int getLiquidColor(int meta) { diff --git a/common/src/main/java/common/tileentity/TileEntityBeacon.java b/common/src/main/java/common/tileentity/TileEntityBeacon.java index 340fe827..c6ab3c82 100755 --- a/common/src/main/java/common/tileentity/TileEntityBeacon.java +++ b/common/src/main/java/common/tileentity/TileEntityBeacon.java @@ -68,14 +68,14 @@ public class TileEntityBeacon extends TileEntity implements ITickable for (EntityLiving entityplayer : list) { - entityplayer.addEffect(new PotionEffect(this.primaryEffect, 180, i, true, true)); + entityplayer.addEffect(new PotionEffect(this.primaryEffect, 180, i)); } if (this.levels >= 4 && this.primaryEffect != this.secondaryEffect && this.secondaryEffect != null) { for (EntityLiving entityplayer1 : list) { - entityplayer1.addEffect(new PotionEffect(this.secondaryEffect, 180, 0, true, true)); + entityplayer1.addEffect(new PotionEffect(this.secondaryEffect, 180, 0)); } } } diff --git a/server/src/main/java/server/command/CommandEnvironment.java b/server/src/main/java/server/command/CommandEnvironment.java index 7753be37..4a67f7ba 100644 --- a/server/src/main/java/server/command/CommandEnvironment.java +++ b/server/src/main/java/server/command/CommandEnvironment.java @@ -276,5 +276,6 @@ public class CommandEnvironment { this.registerExecutable(new CommandDelwarp()); this.registerExecutable(new CommandShowwarp()); this.registerExecutable(new CommandTphere()); + this.registerExecutable(new CommandEffect()); } } diff --git a/server/src/main/java/server/command/commands/CommandEffect.java b/server/src/main/java/server/command/commands/CommandEffect.java new file mode 100644 index 00000000..58fa4e50 --- /dev/null +++ b/server/src/main/java/server/command/commands/CommandEffect.java @@ -0,0 +1,33 @@ +package server.command.commands; + +import java.util.List; + +import common.model.ParticleType; +import common.packet.SPacketParticles; +import common.util.Vec3; +import server.command.Command; +import server.command.CommandEnvironment; +import server.command.Executor; +import server.command.UserPolicy; +import server.network.Player; + +public class CommandEffect extends Command { + public CommandEffect() { + super("effect"); + + this.addPlayerList("player", false, UserPolicy.NON_ADMINS_OR_SELF); + this.addEnum("particle", ParticleType.class, ParticleType.values()); + this.addVector("position", true, false); + this.setParamsOptional(); + this.addVector("offset", false, false); + this.addDouble("speed", 0.0f, 100.0f, 0.0f); + this.addInt("count", 0, 1000, 0); + } + + public void exec(CommandEnvironment env, Executor exec, List players, ParticleType type, Vec3 pos, Vec3 offset, double speed, int count) { + offset = offset == null ? new Vec3(0.0, 0.0, 0.0) : offset; + for(Player player : players) { + player.sendPacket(new SPacketParticles(type, true, (float)pos.xCoord, (float)pos.yCoord, (float)pos.zCoord, (float)offset.xCoord, (float)offset.yCoord, (float)offset.zCoord, (float)speed, count, 0)); + } + } +} diff --git a/server/src/main/java/server/command/commands/CommandPotion.java b/server/src/main/java/server/command/commands/CommandPotion.java index 87bf9da1..64f7b5bf 100644 --- a/server/src/main/java/server/command/commands/CommandPotion.java +++ b/server/src/main/java/server/command/commands/CommandPotion.java @@ -20,12 +20,10 @@ public class CommandPotion extends Command { this.addInt("duration", 0, 1000000, 1000000); this.addInt("strength", 1, 256, 1); - this.addFlag("particles", 'p'); - this.addFlag("ambient", 'a'); this.addFlag("keep", 'k'); } - public Object exec(CommandEnvironment env, Executor exec, List entities, Potion type, int duration, int strength, boolean particles, boolean ambient, boolean keep) { + public Object exec(CommandEnvironment env, Executor exec, List entities, Potion type, int duration, int strength, boolean keep) { int done = 0; for(EntityLiving entity : entities) { if(entity.isPotionApplicable(type, strength - 1)) { @@ -33,7 +31,7 @@ public class CommandPotion extends Command { type.onImpact(null, null, entity, strength - 1, 1.0); } else { - PotionEffect effect = new PotionEffect(type, duration == 0 ? Integer.MAX_VALUE : (duration * 20), strength - 1, ambient, particles); + PotionEffect effect = new PotionEffect(type, duration == 0 ? Integer.MAX_VALUE : (duration * 20), strength - 1); if(!keep && entity.hasEffect(type)) entity.removeEffect(type); entity.addEffect(effect); diff --git a/server/src/main/java/server/network/Player.java b/server/src/main/java/server/network/Player.java index a7b2978c..51bc04cc 100755 --- a/server/src/main/java/server/network/Player.java +++ b/server/src/main/java/server/network/Player.java @@ -2687,7 +2687,7 @@ public class Player extends User implements Executor, IPlayer if(this.entity.hasEffect(Potion.SPEED)) this.entity.removeEffect(Potion.SPEED); else - this.entity.addEffect(new PotionEffect(Potion.SPEED, Integer.MAX_VALUE, 19, false, false)); + this.entity.addEffect(new PotionEffect(Potion.SPEED, Integer.MAX_VALUE, 19)); this.addFeed(TextColor.GREEN + "Deine Geschwindigkeit wurde auf %dx geƤndert", (int)(this.entity.getAIMoveSpeed() * 10.0f)); // int speed = this.playerEntity.speed != 1.0f ? 1 : 5; // this.playerEntity.speed = (float)speed;