From 66db6e6aee42f7371a93753c81e03e59e422a652 Mon Sep 17 00:00:00 2001 From: Samsuik Date: Thu, 14 Nov 2024 19:45:56 +0000 Subject: [PATCH] Fix explosion player velocity The player velocity was not being talied correctly, and velocity was not sent when explosion effects were disabled in fps settings. --- .../0005-Visibility-API-and-Command.patch | 24 +++++++++++++----- .../server/0019-Specialised-Explosions.patch | 25 ++++++++++++++----- .../0029-Explosion-Durable-Blocks.patch | 4 +-- ...-Configure-cannon-physics-by-version.patch | 10 ++++---- ...Add-explosions-dropping-items-config.patch | 4 +-- ...0075-Set-entity-impulse-on-explosion.patch | 6 ++--- 6 files changed, 49 insertions(+), 24 deletions(-) diff --git a/patches/server/0005-Visibility-API-and-Command.patch b/patches/server/0005-Visibility-API-and-Command.patch index 71ad7ac..ac45ca2 100644 --- a/patches/server/0005-Visibility-API-and-Command.patch +++ b/patches/server/0005-Visibility-API-and-Command.patch @@ -321,18 +321,30 @@ index af8cb316ac169aa8d98a88765b85bb013b9ba961..7e77a384855904a36c717c311db7cf24 // CraftBukkit start - respect vanish API if (flag && !player.getBukkitEntity().canSee(this.entity.getBukkitEntity())) { // Paper - only consider hits diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 1a0819301e0ce05c60b6cb961202a5c60697f6c1..94b130f9fd12ad077e66e5aa1c7b143ad97d96e5 100644 +index 1a0819301e0ce05c60b6cb961202a5c60697f6c1..274404085e685e58bfa1cd0ff85ec966fd948538 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java -@@ -1793,7 +1793,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. - while (iterator.hasNext()) { +@@ -1794,7 +1794,19 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. ServerPlayer entityplayer = (ServerPlayer) iterator.next(); -- if (entityplayer.distanceToSqr(x, y, z) < 4096.0D) { -+ if (entityplayer.distanceToSqr(x, y, z) < 4096.0D && !entityplayer.visibility.isToggled(me.samsuik.sakura.player.visibility.Visibility.Setting.EXPLOSIONS)) { // Sakura - visibility api - entityplayer.connection.send(new ClientboundExplodePacket(x, y, z, power, explosion.getToBlow(), (Vec3) explosion.getHitPlayers().get(entityplayer), explosion.getBlockInteraction(), explosion.getSmallExplosionParticles(), explosion.getLargeExplosionParticles(), explosion.getExplosionSound())); + if (entityplayer.distanceToSqr(x, y, z) < 4096.0D) { +- entityplayer.connection.send(new ClientboundExplodePacket(x, y, z, power, explosion.getToBlow(), (Vec3) explosion.getHitPlayers().get(entityplayer), explosion.getBlockInteraction(), explosion.getSmallExplosionParticles(), explosion.getLargeExplosionParticles(), explosion.getExplosionSound())); ++ // Sakura start - visibility api; let players toggle explosion particles ++ ParticleOptions smallParticle = explosion.getSmallExplosionParticles(); ++ ParticleOptions largeParticle = explosion.getLargeExplosionParticles(); ++ Vec3 position = new Vec3(x, y, z); ++ // In 1.22 and later this should be replaced with sending the motion through a PlayerPositionPacket. ++ // The problem here is SetEntityMotion is capped to 3.9 b/pt and the only other alternate mean was ++ // implemented in 1.21.3. I believe it's best to just wait on this issue and deal with this hack. ++ if (entityplayer.visibility.isToggled(me.samsuik.sakura.player.visibility.Visibility.Setting.EXPLOSIONS)) { ++ position = new Vec3(0.0, -1024.0, 0.0); ++ smallParticle = largeParticle = net.minecraft.core.particles.ParticleTypes.SMOKE; ++ } ++ entityplayer.connection.send(new ClientboundExplodePacket(position.x(), position.y(), position.z(), power, explosion.getToBlow(), (Vec3) explosion.getHitPlayers().get(entityplayer), explosion.getBlockInteraction(), smallParticle, largeParticle, explosion.getExplosionSound())); ++ // Sakura end - visibility api; let players toggle explosion particles } } + diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java index c396580a9cfd86ff261bed439bb4662ae88010b5..007bc568d3fb23f08790044aa3171727996927dc 100644 --- a/src/main/java/net/minecraft/server/level/ServerPlayer.java diff --git a/patches/server/0019-Specialised-Explosions.patch b/patches/server/0019-Specialised-Explosions.patch index 494ee07..7966eb0 100644 --- a/patches/server/0019-Specialised-Explosions.patch +++ b/patches/server/0019-Specialised-Explosions.patch @@ -23,10 +23,10 @@ index c21e00812f1aaa1279834a0562d360d6b89e146c..1e1329adde1457898a3002279b53b1bb if (index >= 0) { diff --git a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java new file mode 100644 -index 0000000000000000000000000000000000000000..86a4b9502df49b1614fc76920b164e1148244643 +index 0000000000000000000000000000000000000000..99388d6e1d536f195d7602341313e73d6797d9db --- /dev/null +++ b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -@@ -0,0 +1,222 @@ +@@ -0,0 +1,223 @@ +package me.samsuik.sakura.explosion.special; + +import ca.spottedleaf.moonrise.common.util.WorldUtil; @@ -118,6 +118,7 @@ index 0000000000000000000000000000000000000000..86a4b9502df49b1614fc76920b164e11 + + if (!this.wasCanceled) { + this.level.notifyPlayersOfExplosion(this.x, this.y, this.z, this.radius(), this); ++ this.getHitPlayers().clear(); + } + + this.getToBlow().clear(); @@ -463,7 +464,7 @@ index 0000000000000000000000000000000000000000..a5d13c6b0d8765e4a65b43f5835fd907 + } +} diff --git a/src/main/java/net/minecraft/server/level/ServerLevel.java b/src/main/java/net/minecraft/server/level/ServerLevel.java -index 0a29ad6409226ece40c03c6eba699592c7f0aa11..9e059ca44d19da96ff5fbe84a716e747036025d3 100644 +index c245760718be113128739101b8038471b7144272..d03c700fffb7b854b3aae08d50419ae406c2ea70 100644 --- a/src/main/java/net/minecraft/server/level/ServerLevel.java +++ b/src/main/java/net/minecraft/server/level/ServerLevel.java @@ -1798,6 +1798,12 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. @@ -479,7 +480,7 @@ index 0a29ad6409226ece40c03c6eba699592c7f0aa11..9e059ca44d19da96ff5fbe84a716e747 Iterator iterator = this.players.iterator(); while (iterator.hasNext()) { -@@ -1808,7 +1814,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. +@@ -1820,7 +1826,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ca.spottedleaf. } } @@ -515,7 +516,7 @@ index a8e540c8a27135336fb2d6e37aec13d598b2000e..e64c85bf8fbd3ad0d7e8a6e4a34aed81 // Sakura end - merge cannon entities diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 220d97947df493d1ab825e6637ca648e0b186d18..5cac17def6b49316ae8fb994d4f3d80154074fe0 100644 +index 220d97947df493d1ab825e6637ca648e0b186d18..ceedd8ab94f2f3e2f61b3caf84121dfef4e73bbe 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -57,9 +57,11 @@ public class Explosion { @@ -602,7 +603,19 @@ index 220d97947df493d1ab825e6637ca648e0b186d18..5cac17def6b49316ae8fb994d4f3d801 // use initial cache value that is most likely to be used: the source position final ca.spottedleaf.moonrise.patches.collisions.ExplosionBlockCache initialCache; { -@@ -964,7 +979,7 @@ public class Explosion { +@@ -724,7 +739,10 @@ public class Explosion { + Player entityhuman = (Player) entity; + + if (!entityhuman.isSpectator() && (!entityhuman.isCreative() || !entityhuman.getAbilities().flying) && !level.paperConfig().environment.disableExplosionKnockback) { // Paper - Option to disable explosion knockback +- this.hitPlayers.put(entityhuman, vec3d1); ++ // Sakura start - specialised explosions; tally player velocity ++ final Vec3 explosionImpact = vec3d1; ++ this.hitPlayers.compute(entityhuman, (p, v) -> v != null ? v.add(explosionImpact) : explosionImpact); ++ // Sakura end - specialised explosions; tally player velocity + } + } + +@@ -964,7 +982,7 @@ public class Explosion { private BlockInteraction() {} } // Paper start - Optimize explosions diff --git a/patches/server/0029-Explosion-Durable-Blocks.patch b/patches/server/0029-Explosion-Durable-Blocks.patch index 0b9241c..b91a239 100644 --- a/patches/server/0029-Explosion-Durable-Blocks.patch +++ b/patches/server/0029-Explosion-Durable-Blocks.patch @@ -104,7 +104,7 @@ index a8008c7550488be34b51f4280f5569170b1ebd1d..ccc0e211648a77bb396b8b0e9d3b3984 public String getDescriptionId() { return this.getOrCreateDescriptionId(); diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index 5cac17def6b49316ae8fb994d4f3d80154074fe0..407154670acbec704ef6804a33c320ab9246c16d 100644 +index 4571eca1a595c36791bca12ee1a65e55a4c693ac..ce61d1167c0a956cf461509b7c520c15bae56b0a 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -145,7 +145,7 @@ public class Explosion { @@ -138,7 +138,7 @@ index 5cac17def6b49316ae8fb994d4f3d80154074fe0..407154670acbec704ef6804a33c320ab private boolean clipsAnything(final Vec3 from, final Vec3 to, final ca.spottedleaf.moonrise.patches.collisions.CollisionUtil.LazyEntityCollisionContext context, final ca.spottedleaf.moonrise.patches.collisions.ExplosionBlockCache[] blockCache, -@@ -832,6 +847,16 @@ public class Explosion { +@@ -835,6 +850,16 @@ public class Explosion { // CraftBukkit start - TNTPrimeEvent BlockState iblockdata = this.level.getBlockState(blockposition); Block block = iblockdata.getBlock(); diff --git a/patches/server/0038-Configure-cannon-physics-by-version.patch b/patches/server/0038-Configure-cannon-physics-by-version.patch index 412dfc5..3f8c752 100644 --- a/patches/server/0038-Configure-cannon-physics-by-version.patch +++ b/patches/server/0038-Configure-cannon-physics-by-version.patch @@ -67,10 +67,10 @@ index ea6e252053b8910141aacd5bb82108d6abf3fb96..aa23d2665d5804e31b7c1b7021377010 if (xSmaller && z != 0.0) { z = performAABBCollisionsZ(axisalignedbb, z, aabbs); diff --git a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -index 86a4b9502df49b1614fc76920b164e1148244643..8db362721860fe8d5eb497a766e6d1b7879cb455 100644 +index 99388d6e1d536f195d7602341313e73d6797d9db..289e935a2e6dfa5d45b9c913b8ed320e1a170f93 100644 --- a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java +++ b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -@@ -180,9 +180,15 @@ public abstract class SpecialisedExplosion extends Explosion { +@@ -181,9 +181,15 @@ public abstract class SpecialisedExplosion extends Explosion { if (distanceFromBottom <= 1.0) { double x = entity.getX() - pos.x; @@ -475,7 +475,7 @@ index 4d0cfa1f96a04713cb1d51c7aaaf91374a0d6c17..96c43df6834e20a9e04eb095f36a644e // Paper end - Option to prevent TNT from moving in water } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index fa142719b1c4f6434466141128c475ef945edbb7..cfeacded13f5ebbc3ef66163387c7a40622d7b74 100644 +index bf39d7aa21c3f0dc9cf1b31224cce3a114e8ea86..016ab8ff4be6a8f7e96bce34452180cefa43c44a 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -78,6 +78,7 @@ public class Explosion { @@ -540,7 +540,7 @@ index fa142719b1c4f6434466141128c475ef945edbb7..cfeacded13f5ebbc3ef66163387c7a40 if (d11 != 0.0D) { d8 /= d11; -@@ -1015,7 +1035,7 @@ public class Explosion { +@@ -1018,7 +1038,7 @@ public class Explosion { // Sakura start - replace density cache float blockDensity = this.level.densityCache.getDensity(vec3d, entity); if (blockDensity == me.samsuik.sakura.explosion.density.BlockDensityCache.UNKNOWN_DENSITY) { @@ -549,7 +549,7 @@ index fa142719b1c4f6434466141128c475ef945edbb7..cfeacded13f5ebbc3ef66163387c7a40 this.level.densityCache.putDensity(vec3d, entity, blockDensity); // Sakura end - replace density cache } -@@ -1023,6 +1043,17 @@ public class Explosion { +@@ -1026,6 +1046,17 @@ public class Explosion { return blockDensity; } diff --git a/patches/server/0054-Add-explosions-dropping-items-config.patch b/patches/server/0054-Add-explosions-dropping-items-config.patch index b0b9629..87ece1d 100644 --- a/patches/server/0054-Add-explosions-dropping-items-config.patch +++ b/patches/server/0054-Add-explosions-dropping-items-config.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Add explosions dropping items config diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index f39507dd7e0890446c9c16e6ae45d96302577253..98df890c88c6635566b5702080753f5cb0c20598 100644 +index 7ee530df4c57e400766056e664622e2847f3fe5a..c3987012b1686354c68ef3e49d465a97e121db1e 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java -@@ -909,6 +909,11 @@ public class Explosion { +@@ -912,6 +912,11 @@ public class Explosion { this.level.densityCache.invalidate(); } // Sakura end - explosion density cache diff --git a/patches/server/0075-Set-entity-impulse-on-explosion.patch b/patches/server/0075-Set-entity-impulse-on-explosion.patch index 25dbacd..8c850ea 100644 --- a/patches/server/0075-Set-entity-impulse-on-explosion.patch +++ b/patches/server/0075-Set-entity-impulse-on-explosion.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Set entity impulse on explosion diff --git a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -index 8db362721860fe8d5eb497a766e6d1b7879cb455..911d1d8bef53b549f5f77ca1ed1e5b2e5102ba54 100644 +index 289e935a2e6dfa5d45b9c913b8ed320e1a170f93..5920491a3857f3e75d02a33a1c3eae8907dc5241 100644 --- a/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java +++ b/src/main/java/me/samsuik/sakura/explosion/special/SpecialisedExplosion.java -@@ -223,6 +223,7 @@ public abstract class SpecialisedExplosion extends Explosion { +@@ -224,6 +224,7 @@ public abstract class SpecialisedExplosion extends Explosion { moveZ += z; } @@ -17,7 +17,7 @@ index 8db362721860fe8d5eb497a766e6d1b7879cb455..911d1d8bef53b549f5f77ca1ed1e5b2e } } diff --git a/src/main/java/net/minecraft/world/level/Explosion.java b/src/main/java/net/minecraft/world/level/Explosion.java -index d7278a4f2a186532a9b4a57af8dad47b86660068..60267afc1d0ca0ed2daeff27c804e544f7704700 100644 +index f248d8a3e63bb6f33001518e3481c7e7c75cac1b..10260736ac47e15cb55f43c4dd720cbbe7fe4e15 100644 --- a/src/main/java/net/minecraft/world/level/Explosion.java +++ b/src/main/java/net/minecraft/world/level/Explosion.java @@ -786,6 +786,7 @@ public class Explosion {