aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0416-Option-for-maximum-exp-value-when-merging-orbs.patch
blob: 83f1a66288ed43f1e726773c1d8f26a3990d7576 (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
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 c16233c8cabab2efca9846988c5c843aa9441133..fcd5d4e54f339b3435888a2e9842f64aec46170f 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -675,4 +675,10 @@ public class PaperWorldConfig {
         phantomIgnoreCreative = getBoolean("phantoms-do-not-spawn-on-creative-players", phantomIgnoreCreative);
         phantomOnlyAttackInsomniacs = getBoolean("phantoms-only-attack-insomniacs", phantomOnlyAttackInsomniacs);
     }
+
+    public int expMergeMaxValue;
+    private void expMergeMaxValue() {
+        expMergeMaxValue = getInt("experience-merge-max-value", -1);
+        log("Experience Merge Max Value: " + expMergeMaxValue);
+    }
 }
diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 1e16264b533c2205098c0569fadb8e369a032764..fb490fa7d59b1099e34a5adc7993d6dad2f10932 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.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)) {