diff options
Diffstat (limited to 'patches/server/0412-Option-for-maximum-exp-value-when-merging-orbs.patch')
-rw-r--r-- | patches/server/0412-Option-for-maximum-exp-value-when-merging-orbs.patch | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/patches/server/0412-Option-for-maximum-exp-value-when-merging-orbs.patch b/patches/server/0412-Option-for-maximum-exp-value-when-merging-orbs.patch new file mode 100644 index 0000000000..4239e066f4 --- /dev/null +++ b/patches/server/0412-Option-for-maximum-exp-value-when-merging-orbs.patch @@ -0,0 +1,42 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: BillyGalbreath <[email protected]> +Date: Fri, 10 Nov 2017 23:03:12 -0500 +Subject: [PATCH] Option for maximum exp value when merging orbs + + +diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +index 22da112f45ddb20d113550eae67ac08eb2fcb727..f80bdb38cf377684382bb817fedbeb8d5aae4704 100644 +--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +@@ -640,16 +640,30 @@ public class CraftEventFactory { + net.minecraft.world.entity.ExperienceOrb xp = (net.minecraft.world.entity.ExperienceOrb) entity; + double radius = world.spigotConfig.expMerge; + if (radius > 0) { ++ // Paper start - Maximum exp value when merging - Whole section has been tweaked, see comments for specifics ++ final int maxValue = world.paperConfig().entities.behavior.experienceMergeMaxValue; ++ final boolean mergeUnconditionally = world.paperConfig().entities.behavior.experienceMergeMaxValue <= 0; ++ if (mergeUnconditionally || xp.value < maxValue) { // Paper - Skip iteration if unnecessary ++ + List<Entity> entities = world.getEntities(entity, entity.getBoundingBox().inflate(radius, radius, radius)); + for (Entity e : entities) { + if (e instanceof net.minecraft.world.entity.ExperienceOrb) { + net.minecraft.world.entity.ExperienceOrb loopItem = (net.minecraft.world.entity.ExperienceOrb) e; +- if (!loopItem.isRemoved()) { ++ // Paper start ++ if (!loopItem.isRemoved() && !(maxValue > 0 && loopItem.value >= maxValue)) { ++ long newTotal = (long)xp.value + (long)loopItem.value; ++ if ((int) newTotal < 0) continue; // Overflow ++ if (maxValue > 0 && newTotal > (long)maxValue) { ++ loopItem.value = (int) (newTotal - maxValue); ++ xp.value = maxValue; ++ } else { + xp.value += loopItem.value; + loopItem.discard(); ++ } // Paper end + } + } + } ++ } // Paper end - End iteration skip check - All tweaking ends here + } + // Spigot end + } else if (!(entity instanceof ServerPlayer)) { |