Skip to content
This repository was archived by the owner on Apr 13, 2025. It is now read-only.

Commit 3eedb5c

Browse files
BillyGalbreathgranny
authored andcommitted
Configurable player pickup exp delay
Default vanilla value is to delay 2 ticks between picking up exp orbs. Players only pick up 1 orb at a time, so even with setting this to 0 players still only pick up one orb every tick. However, setting this to any negative number will pick up all orbs instantly.
1 parent 17faace commit 3eedb5c

4 files changed

Lines changed: 20 additions & 56 deletions

File tree

patches/server/0225-Configurable-player-pickup-exp-delay.patch

Lines changed: 0 additions & 56 deletions
This file was deleted.

purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ExperienceOrb.java.patch

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
--- a/net/minecraft/world/entity/ExperienceOrb.java
22
+++ b/net/minecraft/world/entity/ExperienceOrb.java
3+
@@ -323,7 +_,7 @@
4+
public void playerTouch(Player entity) {
5+
if (entity instanceof ServerPlayer serverPlayer) {
6+
if (entity.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent
7+
- entity.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(entity, 2, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2;
8+
+ entity.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(entity, this.level().purpurConfig.playerExpPickupDelay, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; // Purpur - Configurable player pickup exp delay
9+
entity.take(this, 1);
10+
int i = this.repairPlayerItems(serverPlayer, this.value);
11+
if (i > 0) {
312
@@ -339,7 +_,7 @@
413
}
514

purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@
5252
this.cooldowns.tick();
5353
this.updatePlayerPose();
5454
if (this.currentImpulseContextResetGraceTime > 0) {
55+
@@ -610,7 +_,7 @@
56+
List<Entity> list = Lists.newArrayList();
57+
58+
for (Entity entity : entities) {
59+
- if (entity.getType() == EntityType.EXPERIENCE_ORB) {
60+
+ if (entity.getType() == EntityType.EXPERIENCE_ORB && entity.level().purpurConfig.playerExpPickupDelay >= 0) { // Purpur - Configurable player pickup exp delay
61+
list.add(entity);
62+
} else if (!entity.isRemoved()) {
63+
this.touch(entity);
5564
@@ -1264,7 +_,7 @@
5665
flag2 = flag2 && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits
5766
if (flag2) {

purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,7 @@ private void playerNetheriteFireResistance() {
422422
public boolean playerRidableInWater = false;
423423
public boolean playerRemoveBindingWithWeakness = false;
424424
public int shiftRightClickRepairsMendingPoints = 0;
425+
public int playerExpPickupDelay = 2;
425426
private void playerSettings() {
426427
if (PurpurConfig.version < 19) {
427428
boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer);
@@ -447,6 +448,7 @@ private void playerSettings() {
447448
playerRidableInWater = getBoolean("gameplay-mechanics.player.ridable-in-water", playerRidableInWater);
448449
playerRemoveBindingWithWeakness = getBoolean("gameplay-mechanics.player.curse-of-binding.remove-with-weakness", playerRemoveBindingWithWeakness);
449450
shiftRightClickRepairsMendingPoints = getInt("gameplay-mechanics.player.shift-right-click-repairs-mending-points", shiftRightClickRepairsMendingPoints);
451+
playerExpPickupDelay = getInt("gameplay-mechanics.player.exp-pickup-delay-ticks", playerExpPickupDelay);
450452
}
451453

452454
public boolean silkTouchEnabled = false;

0 commit comments

Comments
 (0)