From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: BillyGalbreath Date: Mon, 10 Jan 2022 10:04:31 -0600 Subject: [PATCH] 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. diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java index 0813151ba9d1dcf1aa40fb4c7f259510adc326da..0c0f422ef0c20477295cea0b6b3c4b2d0a7db265 100644 --- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java @@ -306,7 +306,7 @@ public class ExperienceOrb extends Entity { public void playerTouch(Player player) { if (!this.level.isClientSide) { if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((net.minecraft.server.level.ServerPlayer) player).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, 2, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; + player.takeXpDelay = CraftEventFactory.callPlayerXpCooldownEvent(player, this.level.purpurConfig.playerExpPickupDelay, PlayerExpCooldownChangeEvent.ChangeReason.PICKUP_ORB).getNewCooldown(); // CraftBukkit - entityhuman.takeXpDelay = 2; // Purpur player.take(this, 1); int i = this.repairPlayerItems(player, this.value); diff --git a/src/main/java/net/minecraft/world/entity/player/Player.java b/src/main/java/net/minecraft/world/entity/player/Player.java index 74c660bcc77c18241c6ccc0450174a15b0ac4d1f..d055cfc257cc7282170ba67c848af3e6c5f2ec1f 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -630,7 +630,7 @@ public abstract class Player extends LivingEntity { for (int i = 0; i < list.size(); ++i) { Entity entity = (Entity) list.get(i); - if (entity.getType() == EntityType.EXPERIENCE_ORB) { + if (entity.getType() == EntityType.EXPERIENCE_ORB && entity.level.purpurConfig.playerExpPickupDelay >= 0) { // Purpur list1.add(entity); } else if (!entity.isRemoved()) { this.touch(entity); diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index e4394fbe3d7ff9b9424772014c0b528407a13081..8abdc8df16a56988f9fe799773fc82bc7bffa16e 100644 --- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -424,6 +424,7 @@ public class PurpurWorldConfig { public boolean playerRidableInWater = false; public boolean playerRemoveBindingWithWeakness = false; public int shiftRightClickRepairsMendingPoints = 0; + public int playerExpPickupDelay = 2; private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); @@ -451,6 +452,7 @@ public class PurpurWorldConfig { playerRidableInWater = getBoolean("gameplay-mechanics.player.ridable-in-water", playerRidableInWater); playerRemoveBindingWithWeakness = getBoolean("gameplay-mechanics.player.curse-of-binding.remove-with-weakness", playerRemoveBindingWithWeakness); shiftRightClickRepairsMendingPoints = getInt("gameplay-mechanics.player.shift-right-click-repairs-mending-points", shiftRightClickRepairsMendingPoints); + playerExpPickupDelay = getInt("gameplay-mechanics.player.exp-pickup-delay-ticks", playerExpPickupDelay); } private static boolean projectileDespawnRateSettingsMigrated = false;