aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0369-Option-for-maximum-exp-value-when-merging-orbs.patch
blob: 76f51653021d88f90d3a09137c6e443b90de4bad (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
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/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
index 8866f1d4f19c935edb7eb3c9265a2b65383e5595..608829fa99a197a58505b1e7ca9898e8d6d19aa4 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -704,16 +704,30 @@ public class CraftEventFactory {
         if (entity instanceof net.minecraft.world.entity.ExperienceOrb xp) {
             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 loopItem) {
-                        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(null); // Add Bukkit remove cause
+                            } // Paper end - Maximum exp value when merging
                         }
                     }
                 }
             }
+            } // Paper end - End iteration skip check - All tweaking ends here
         }
         // Spigot end