From 61fc0a557fc0eedececd63d44d43ce6431bc23bb Mon Sep 17 00:00:00 2001 From: Encode42 Date: Wed, 25 May 2022 02:29:16 -0400 Subject: [PATCH] Tick projectile despawn logic (Fixes #978) --- ...e-config-options-per-projectile-type.patch | 32 +++++++++++++++---- ...ows-should-not-reset-despawn-counter.patch | 4 +-- ...iefing-bypass-to-everything-affected.patch | 4 +-- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/patches/server/0099-Despawn-rate-config-options-per-projectile-type.patch b/patches/server/0099-Despawn-rate-config-options-per-projectile-type.patch index 621dc6d9c..79ffcf3e5 100644 --- a/patches/server/0099-Despawn-rate-config-options-per-projectile-type.patch +++ b/patches/server/0099-Despawn-rate-config-options-per-projectile-type.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Despawn rate config options per projectile type Default values of -1 respect vanilla behaviour. diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index 53d0024daf6963ac4dab575666b0d6a74a39a958..2772351085add7d25c39bd9e5537fe354d07e9e1 100644 +index 53d0024daf6963ac4dab575666b0d6a74a39a958..c5cbcf8d6b26bbb7712d3a72f8313f600dfc7c11 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -62,7 +62,7 @@ public abstract class AbstractArrow extends Projectile { @@ -18,7 +18,7 @@ index 53d0024daf6963ac4dab575666b0d6a74a39a958..2772351085add7d25c39bd9e5537fe35 private double baseDamage; public int knockback; private SoundEvent soundEvent; -@@ -333,12 +333,23 @@ public abstract class AbstractArrow extends Projectile { +@@ -333,12 +333,28 @@ public abstract class AbstractArrow extends Projectile { } @@ -33,14 +33,19 @@ index 53d0024daf6963ac4dab575666b0d6a74a39a958..2772351085add7d25c39bd9e5537fe35 + } + if (pickup == Pickup.DISALLOWED) { + return level.paperConfig.nonPlayerArrowDespawnRate; -+ } + } + if (this instanceof ThrownTrident) { + return level.spigotConfig.tridentDespawnRate; - } ++ } + return level.spigotConfig.arrowDespawnRate; + } -+ // Purpur end ++ // Arrow despawn ticking is handled differently ++ protected boolean shouldAlwaysTickDespawn() { ++ return false; ++ }; ++ // Purpur end ++ + protected void tickDespawn() { + tickDespawnCounter(); // Purpur } @@ -127,7 +132,7 @@ index 1a945a32c3d3705a318ebca72a365931a8c001b7..c7fdcfae1ba823046fdfe78aa97b4a7a + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 0c7d31c7ffd603e54fb19010331ad220c7b15627..73d18318afff5eac5966ddaeadf014524d06ec66 100644 +index 0c7d31c7ffd603e54fb19010331ad220c7b15627..878757f6b5034ed54198102cf8d48ace580f856f 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java @@ -33,6 +33,7 @@ public abstract class Projectile extends Entity { @@ -138,7 +143,7 @@ index 0c7d31c7ffd603e54fb19010331ad220c7b15627..73d18318afff5eac5966ddaeadf01452 // CraftBukkit start protected boolean hitCancelled = false; -@@ -72,6 +73,19 @@ public abstract class Projectile extends Entity { +@@ -72,6 +73,23 @@ public abstract class Projectile extends Entity { } // Pufferfish start @@ -153,11 +158,24 @@ index 0c7d31c7ffd603e54fb19010331ad220c7b15627..73d18318afff5eac5966ddaeadf01452 + } + + protected abstract int getPurpurDespawnRate(); ++ ++ protected boolean shouldAlwaysTickDespawn() { ++ return true; ++ }; + // Purpur end + public void setOwner(@Nullable Entity entity) { if (entity != null) { this.ownerUUID = entity.getUUID(); +@@ -148,6 +166,8 @@ public abstract class Projectile extends Entity { + this.leftOwner = this.checkLeftOwner(); + } + ++ if (this.shouldAlwaysTickDespawn()) tickDespawnCounter(); // Purpur ++ + super.tick(); + } + diff --git a/src/main/java/net/minecraft/world/entity/projectile/ShulkerBullet.java b/src/main/java/net/minecraft/world/entity/projectile/ShulkerBullet.java index a4591e4dc1a277a2fd0a323f3b54a107fd6598c8..ca0133bcb82df8112b63c7aef3670a8970676ef9 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ShulkerBullet.java diff --git a/patches/server/0108-Arrows-should-not-reset-despawn-counter.patch b/patches/server/0108-Arrows-should-not-reset-despawn-counter.patch index 9add48974..daa942cab 100644 --- a/patches/server/0108-Arrows-should-not-reset-despawn-counter.patch +++ b/patches/server/0108-Arrows-should-not-reset-despawn-counter.patch @@ -7,7 +7,7 @@ This prevents keeping arrows alive indefinitely (such as when the block the arrow is stuck in gets removed, like a piston head going up/down) diff --git a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java -index 2772351085add7d25c39bd9e5537fe354d07e9e1..59e434c31d1929bdc1d5242ef1f117d998ca46ec 100644 +index c5cbcf8d6b26bbb7712d3a72f8313f600dfc7c11..50b531cdaa26af8e06007552fc18cabddbd5f0de 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java +++ b/src/main/java/net/minecraft/world/entity/projectile/AbstractArrow.java @@ -321,7 +321,7 @@ public abstract class AbstractArrow extends Projectile { @@ -15,7 +15,7 @@ index 2772351085add7d25c39bd9e5537fe354d07e9e1..59e434c31d1929bdc1d5242ef1f117d9 this.setDeltaMovement(vec3d.multiply((double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F), (double) (this.random.nextFloat() * 0.2F))); - this.life = 0; -+ // this.life = 0; // PUrpur - do not reset despawn counter ++ // this.life = 0; // Purpur - do not reset despawn counter } @Override diff --git a/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch b/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch index 0eafefdd1..fb21c7a50 100644 --- a/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch +++ b/patches/server/0132-Add-mobGriefing-bypass-to-everything-affected.patch @@ -290,10 +290,10 @@ index e69213b43c8aa5a7c04add7a87482d531fbf52d2..f51ea103238b4a50439f5162a248cd9a // CraftBukkit start - fire ExplosionPrimeEvent ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); diff --git a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -index 73d18318afff5eac5966ddaeadf014524d06ec66..90f6a355e345f409ad7702ddc2b6c81ef4e7b933 100644 +index 878757f6b5034ed54198102cf8d48ace580f856f..17a9ac588490232e8883d5df1619e1290e260a9b 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Projectile.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Projectile.java -@@ -320,6 +320,6 @@ public abstract class Projectile extends Entity { +@@ -326,6 +326,6 @@ public abstract class Projectile extends Entity { public boolean mayInteract(Level world, BlockPos pos) { Entity entity = this.getOwner();