PaperMC/Spigot-Server-Patches/0183-Option-for-maximum-exp-value-when-merging-orbs.patch
Shane Freeder c9fd745840
Updated Upstream (Bukkit/CraftBukkit/Spigot)
Upstream has released updates that appears to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

Bukkit Changes:
ff0672ca SPIGOT-5211: Add Raid API

CraftBukkit Changes:
96bc85f0 SPIGOT-5298: Remove unexplained 0.1 drop chance offset
6ed8a189 SPIGOT-5290: Invulnerable and/or Marker armor stand triggers EntityDamageEvent
631eaeb0 SPIGOT-5297: PlayerBedLeaveEvent.getBed() returns player location
8d4bc541 SPIGOT-5293: Sponge behaviour differs from Vanilla
e91fd75e SPIGOT-5291: Missing event for ravagers trampling crops
cbdd7139 SPIGOT-5211: Add Raid API
edd8fdfb SPIGOT-5287: Fix rare CME generating new chunks
3fc97f08 SPIGOT-5265: FireworkExplodeEvent only fired when rockets explode in air

Spigot Changes:
065a3734 Rebuild patches
a5961826 SPIGOT-5286: tick-inactive-villagers invokes the AI for NoAI villagers
2019-08-31 20:30:44 +01:00

64 lines
3.3 KiB
Diff

From 7b7485a91475522cb0fe168bb65e6ec55c1caab6 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 4d0d4cbe4..b3d8fe9c6 100644
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
@@ -333,4 +333,10 @@ public class PaperWorldConfig {
disableCreeperLingeringEffect = getBoolean("disable-creeper-lingering-effect", false);
log("Creeper lingering effect: " + disableCreeperLingeringEffect);
}
+
+ 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 0202c7662..5257941e9 100644
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
@@ -537,16 +537,32 @@ public class CraftEventFactory {
EntityExperienceOrb xp = (EntityExperienceOrb) 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().grow(radius, radius, radius));
for (Entity e : entities) {
if (e instanceof EntityExperienceOrb) {
EntityExperienceOrb loopItem = (EntityExperienceOrb) e;
- if (!loopItem.dead) {
- xp.value += loopItem.value;
- loopItem.die();
+ // Paper start
+ if (!loopItem.dead && !(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.die();
+ }
+ // Paper end
}
}
}
+
+ } // Paper end - End iteration skip check - All tweaking ends here
}
// Spigot end
} else if (!(entity instanceof EntityPlayer)) {
--
2.23.0