From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Jason Penilla <11360596+jpenilla@users.noreply.github.com> Date: Mon, 14 Sep 2020 10:09:05 -0700 Subject: [PATCH] |FEAT| |PERF| 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 6636845ea044c3810e1880aad8b679134cd33668..f6fc98ffe49d5af9a69f57f2e53e6010f71d55d9 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 { protected int inGroundTime; public AbstractArrow.Pickup pickup; public int shakeTime; - public int life; + // public int life; // Purpur - moved to Projectile private double baseDamage; public int knockback; private SoundEvent soundEvent; @@ -320,12 +320,23 @@ public abstract class AbstractArrow extends Projectile { } - protected void tickDespawn() { - ++this.life; - if (this.life >= (pickup == Pickup.CREATIVE_ONLY ? level.paperConfig.creativeArrowDespawnRate : (pickup == Pickup.DISALLOWED ? level.paperConfig.nonPlayerArrowDespawnRate : ((this instanceof ThrownTrident) ? level.spigotConfig.tridentDespawnRate : level.spigotConfig.arrowDespawnRate)))) { // Spigot // Paper - TODO: Extract this to init? - this.discard(); + // Purpur start + protected int getPurpurDespawnRate() { + if (pickup == Pickup.CREATIVE_ONLY) { + return level.paperConfig.creativeArrowDespawnRate; + } + if (pickup == Pickup.DISALLOWED) { + return level.paperConfig.nonPlayerArrowDespawnRate; + } + if (this instanceof ThrownTrident) { + return level.spigotConfig.tridentDespawnRate; } + return level.spigotConfig.arrowDespawnRate; + } + // Purpur end + protected void tickDespawn() { + tickDespawnCounter(); // Purpur } private void resetPiercedEntities() { diff --git a/src/main/java/net/minecraft/world/entity/projectile/DragonFireball.java b/src/main/java/net/minecraft/world/entity/projectile/DragonFireball.java index 6afe37e42d88701af38df5793a9ea9d7d2cda5c5..1de27407c92d496715899fcafb3794df9f5ef6cd 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/DragonFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/DragonFireball.java @@ -81,4 +81,11 @@ public class DragonFireball extends AbstractHurtingProjectile { protected boolean shouldBurn() { return false; } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.dragonFireballDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java b/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java index 3ac0d0419cbdacabf647a530a82ddf67ddaa13b7..78111e7c26f5237e9954791cf17037eb6fd111b2 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java +++ b/src/main/java/net/minecraft/world/entity/projectile/FireworkRocketEntity.java @@ -355,4 +355,11 @@ public class FireworkRocketEntity extends Projectile implements ItemSupplier { public boolean isAttackable() { return false; } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.fireworkDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java index 852a4edde291bf368b2396e3c94ab402e3c66622..83b733efa3a4e135870806589ca9733ca6d8775b 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java +++ b/src/main/java/net/minecraft/world/entity/projectile/FishingHook.java @@ -664,4 +664,11 @@ public class FishingHook extends Projectile { private OpenWaterType() {} } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.fishingHookDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java index 5237b699e000b4fed99be39b0a7e2daab9c8bf42..e69213b43c8aa5a7c04add7a87482d531fbf52d2 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/LargeFireball.java @@ -77,4 +77,11 @@ public class LargeFireball extends Fireball { } } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.largeFireballDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java index f1a12b147d55e34d4f8374593640a311598cf1a6..c4bdebd4310035a5cce5a5790f538eb0b8021b30 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java +++ b/src/main/java/net/minecraft/world/entity/projectile/LlamaSpit.java @@ -100,4 +100,11 @@ public class LlamaSpit extends Projectile { this.setDeltaMovement(d0, d1, d2); } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.llamaSpitDespawnRate; + } + // 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 ae6ccfc11a206e64c0cbced7ca692ba7e50aab03..d5d6fde1e375e5cdfc7726edd4c9b202c4cb0171 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 { public Entity cachedOwner; private boolean leftOwner; private boolean hasBeenShot; + public int life; // Purpur - moved from AbstractArrow // CraftBukkit start public boolean hitCancelled = false; // Purpur - private -> public @@ -72,6 +73,19 @@ public abstract class Projectile extends Entity { } // Airplane start + // Purpur start + protected final void tickDespawnCounter() { + if (this.getPurpurDespawnRate() != -1) { + ++this.life; + if (this.life >= this.getPurpurDespawnRate()) { + this.discard(); + } + } + } + + protected abstract int getPurpurDespawnRate(); + // Purpur end + public void setOwner(@Nullable Entity entity) { if (entity != null) { this.ownerUUID = entity.getUUID(); 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 123f9a93b014107c8f609d38a2b8d37261bb5d18..aa91cc06f6411fe83467e43c0df1145cb85aead0 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ShulkerBullet.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ShulkerBullet.java @@ -63,6 +63,13 @@ public class ShulkerBullet extends Projectile { projectileSource = (org.bukkit.entity.LivingEntity) owner.getBukkitEntity(); // CraftBukkit } + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.shulkerBulletDespawnRate; + } + // Purpur end + // CraftBukkit start public Entity getTarget() { return this.finalTarget; diff --git a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java index b77d04ef22711a4f90e274e81faa261f3f6c25af..a6d75f20d6b7679d53c3c081c6632e9c303e2d74 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/SmallFireball.java @@ -99,4 +99,11 @@ public class SmallFireball extends Fireball { public boolean hurt(DamageSource source, float amount) { return false; } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.smallFireballDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java index a725851060f13e734dbd2fbf8c83c9e1af57a8b7..ed2f039c4042861bcfa2e41d8281eefd37daa9fa 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/Snowball.java +++ b/src/main/java/net/minecraft/world/entity/projectile/Snowball.java @@ -67,4 +67,11 @@ public class Snowball extends ThrowableItemProjectile { } } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.snowballDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java index 77941e3981e49cf5662b3e3c86a9c419080b17c8..8c6243aab556c993b43ab52e216bcb0a70d1a686 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEgg.java @@ -107,4 +107,11 @@ public class ThrownEgg extends ThrowableItemProjectile { protected Item getDefaultItem() { return Items.EGG; } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.eggDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java index 1b2ada3663cc0739782ac591f2ee1f6d0fb94841..6599f267e30d15ad179e98d3683273cd9bbc3bd0 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownEnderpearl.java @@ -131,4 +131,11 @@ public class ThrownEnderpearl extends ThrowableItemProjectile { return super.changeDimension(destination); } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.enderPearlDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownExperienceBottle.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownExperienceBottle.java index 11d1db5ef709dfb6fa596ebc4f5fff1415ad4f6d..ef771a190c6a437d4cf741a6d5a3be88070e011d 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownExperienceBottle.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownExperienceBottle.java @@ -56,4 +56,11 @@ public class ThrownExperienceBottle extends ThrowableItemProjectile { } } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.expBottleDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java index 8676796ff65cd0bd3f215dc7edcf3a5b2291ca27..15e7c19093e74a3354a115074449c1f6a830afc9 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java +++ b/src/main/java/net/minecraft/world/entity/projectile/ThrownPotion.java @@ -303,4 +303,11 @@ public class ThrownPotion extends ThrowableItemProjectile implements ItemSupplie } } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.potionDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java index 4a11f7417b438ee5711a720aca3321c88e970b2a..46b74271ce5f614f07754db14d2a552c36f73226 100644 --- a/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java +++ b/src/main/java/net/minecraft/world/entity/projectile/WitherSkull.java @@ -136,4 +136,11 @@ public class WitherSkull extends AbstractHurtingProjectile { protected boolean shouldBurn() { return false; } + + // Purpur start + @Override + protected int getPurpurDespawnRate() { + return this.level.purpurConfig.witherSkullDespawnRate; + } + // Purpur end } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java index 73c2312de3140bb95f5b71817b970b4dbfa79307..ec8d6caa531d53d5f7899c135fc067c3f892286c 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -273,6 +273,35 @@ public class PurpurWorldConfig { totemOfUndyingWorksInInventory = getBoolean("gameplay-mechanics.player.totem-of-undying-works-in-inventory", totemOfUndyingWorksInInventory); } + public int dragonFireballDespawnRate = -1; + public int eggDespawnRate = -1; + public int enderPearlDespawnRate = -1; + public int expBottleDespawnRate = -1; + public int fireworkDespawnRate = -1; + public int fishingHookDespawnRate = -1; + public int largeFireballDespawnRate = -1; + public int llamaSpitDespawnRate = -1; + public int potionDespawnRate = -1; + public int shulkerBulletDespawnRate = -1; + public int smallFireballDespawnRate = -1; + public int snowballDespawnRate = -1; + public int witherSkullDespawnRate = -1; + private void projectileDespawnRateSettings() { + dragonFireballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.dragon_fireball", dragonFireballDespawnRate); + eggDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.egg", eggDespawnRate); + enderPearlDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.ender_pearl", enderPearlDespawnRate); + expBottleDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.experience_bottle", expBottleDespawnRate); + fireworkDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.firework_rocket", fireworkDespawnRate); + fishingHookDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.fishing_bobber", fishingHookDespawnRate); + largeFireballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.fireball", largeFireballDespawnRate); + llamaSpitDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.llama_spit", llamaSpitDespawnRate); + potionDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.potion", potionDespawnRate); + shulkerBulletDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.shulker_bullet", shulkerBulletDespawnRate); + smallFireballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.small_fireball", smallFireballDespawnRate); + snowballDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.snowball", snowballDespawnRate); + witherSkullDespawnRate = getInt("gameplay-mechanics.projectile-despawn-rates.wither_skull", witherSkullDespawnRate); + } + public boolean silkTouchEnabled = false; public String silkTouchSpawnerName = "Spawner"; public List silkTouchSpawnerLore = new ArrayList<>();