summaryrefslogtreecommitdiffhomepage
path: root/patches/server/0412-Option-for-maximum-exp-value-when-merging-orbs.patch
diff options
context:
space:
mode:
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.patch42
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)) {