mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-30 16:49:42 +02:00
Upstream has released updates that appear 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: ed7bba95 SPIGOT-6547: Chunk#getEntities() doesn't return all entities immediately after chunk load d99a585c SPIGOT-6719: Add getTileEntities() to LimitedRegion CraftBukkit Changes: 422cec08 Rebuild patch 15f27fc7 SPIGOT-6547: Chunk#getEntities() doesn't return all entities immediately after chunk load cbd747af SPIGOT-6719: Add getTileEntities() to LimitedRegion Spigot Changes: 6c1c1b26 Rebuild patches
60 lines
3.4 KiB
Diff
60 lines
3.4 KiB
Diff
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 e146dad0d90fee216630eb3df6a34e2a0f6441a6..eb30ec087b90835aba281580b0563d020440be0e 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
@@ -361,6 +361,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 09e0b2fface050699872341215c257d4b8f403c2..bb80d9840fd9448bf18df00c205a93a623b45ba9 100644
|
|
--- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
+++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java
|
|
@@ -629,16 +629,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)) {
|