From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: William Blake Galbreath Date: Thu, 26 Dec 2019 22:08:37 -0600 Subject: [PATCH] |FEAT| Player death exp control {EXPLANATION} $-----------------------------$ gameplay-mechanics: player: exp-dropped-on-death: equation: default: "expLevel * 7" description: |- How much exp to drop on death. Available NMS variables are `expLevel`, `expTotal`, and `exp` maximum: default: 100 description: |- Maximum amount of exp value to drop on death $-----------------------------$ 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 9ffe8832ef9b74ed3794243965d0cc3d3fbc4ef5..c557bee52a3f136696bb55853622b03220735109 100644 --- a/src/main/java/net/minecraft/world/entity/player/Player.java +++ b/src/main/java/net/minecraft/world/entity/player/Player.java @@ -1907,9 +1907,18 @@ public abstract class Player extends LivingEntity { @Override protected int getExperienceReward(Player player) { if (!this.level.getGameRules().getBoolean(GameRules.RULE_KEEPINVENTORY) && !this.isSpectator()) { - int i = this.experienceLevel * 7; - - return i > 100 ? 100 : i; + // Purpur start + int toDrop; + try { + scriptEngine.eval("expLevel = " + experienceLevel); + scriptEngine.eval("expTotal = " + totalExperience); + scriptEngine.eval("exp = " + experienceProgress); + toDrop = (int) Math.round((Double) scriptEngine.eval(level.purpurConfig.playerDeathExpDropEquation)); + } catch (Exception ignore) { + toDrop = experienceLevel * 7; + } + return Math.min(toDrop, level.purpurConfig.playerDeathExpDropMax); + // Purpur end } else { return 0; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java index 23d5d959e40b496fe54d0fe6b7434a090afdc0fb..54f802449b8be8913c6d357ba7f6cfe50c09fb03 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -168,6 +168,8 @@ public class PurpurWorldConfig { public boolean idleTimeoutTargetPlayer = true; public int playerSpawnInvulnerableTicks = 60; public boolean playerInvulnerableWhileAcceptingResourcePack = false; + public String playerDeathExpDropEquation = "expLevel * 7"; + public int playerDeathExpDropMax = 100; private void playerSettings() { if (PurpurConfig.version < 19) { boolean oldVal = getBoolean("gameplay-mechanics.player.idle-timeout.mods-target", idleTimeoutTargetPlayer); @@ -181,6 +183,8 @@ public class PurpurWorldConfig { idleTimeoutTargetPlayer = getBoolean("gameplay-mechanics.player.idle-timeout.mobs-target", idleTimeoutTargetPlayer); playerSpawnInvulnerableTicks = getInt("gameplay-mechanics.player.spawn-invulnerable-ticks", playerSpawnInvulnerableTicks); playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack); + playerDeathExpDropEquation = getString("gameplay-mechanics.player.exp-dropped-on-death.equation", playerDeathExpDropEquation); + playerDeathExpDropMax = getInt("gameplay-mechanics.player.exp-dropped-on-death.maximum", playerDeathExpDropMax); } public boolean silkTouchEnabled = false;