aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0434-Option-for-maximum-exp-value-when-merging-orbs.patch
blob: 11f4b43a253b30eccf982b6ee64c240f26596421 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@GMail.com>
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/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
index f036c3179f4e7633eac4e1889c029383c291da92..16b4711496ce4cc7b8e53de4614836d2590a5704 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -397,6 +397,12 @@ public class PaperWorldConfig {
         log("Creeper lingering effect: " + disableCreeperLingeringEffect);
     }
 
+    public int expMergeMaxValue;
+    private void expMergeMaxValue() {
+        expMergeMaxValue = getInt("experience-merge-max-value", -1);
+        log("Experience Merge Max Value: " + expMergeMaxValue);
+    }
+
     public double squidMaxSpawnHeight;
     private void squidMaxSpawnHeight() {
         squidMaxSpawnHeight = getDouble("squid-spawn-height.maximum", 0.0D);
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 54aa3a95118176e7f91f4d669253790167fcd958..b07247dda5f7be1186c47ce5cb490ca0a46cc56c 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -630,16 +630,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.expMergeMaxValue;
+                final boolean mergeUnconditionally = world.paperConfig.expMergeMaxValue <= 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)) {