136 lines
5.5 KiB
Diff
136 lines
5.5 KiB
Diff
|
From a3244fa27146516e44847fe9cbba51338ae4348e Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Fri, 15 Jun 2018 00:30:32 -0400
|
||
|
Subject: [PATCH] Configurable Alternative LootPool Luck Formula
|
||
|
|
||
|
Rewrites the Vanilla luck application formula so that luck can be
|
||
|
applied to items that do not have any quality defined.
|
||
|
|
||
|
See: https://luckformula.emc.gs for data and details
|
||
|
-----------
|
||
|
|
||
|
The rough summary is:
|
||
|
My goal was that in a pool, when luck was applied, the pool
|
||
|
rebalances so the percentages for bigger items is
|
||
|
lowered and smaller items is boosted.
|
||
|
|
||
|
Do this by boosting and then reducing the weight value,
|
||
|
so that larger numbers are penalized more than smaller numbers.
|
||
|
resulting in a larger reduction of entries for more common
|
||
|
items than the reduction on small weights,
|
||
|
giving smaller weights more of a chance
|
||
|
|
||
|
-----------
|
||
|
|
||
|
This work kind of obsoletes quality, but quality would be useful
|
||
|
for 2 items with same weight that you want luck to impact
|
||
|
in varying directions.
|
||
|
|
||
|
Fishing still falls into that as the weights are closer, so luck
|
||
|
will invalidate junk more.
|
||
|
|
||
|
This change will result in some major changes to fishing formulas.
|
||
|
|
||
|
-----------
|
||
|
|
||
|
I would love to see this change in Vanilla, so Mojang please pull :)
|
||
|
|
||
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
||
|
index 7fba61a6d..c8f9c45e5 100644
|
||
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
||
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
||
|
@@ -276,4 +276,12 @@ public class PaperConfig {
|
||
|
"such as inventories, experience points, advancements and the like will not be saved when they log out.");
|
||
|
}
|
||
|
}
|
||
|
+
|
||
|
+ public static boolean useAlternativeLuckFormula = false;
|
||
|
+ private static void useAlternativeLuckFormula() {
|
||
|
+ useAlternativeLuckFormula = getBoolean("settings.use-alternative-luck-formula", false);
|
||
|
+ if (useAlternativeLuckFormula) {
|
||
|
+ Bukkit.getLogger().log(Level.INFO, "Using Aikar's Alternative Luck Formula to apply Luck attribute to all loot pool calculations. See https://luckformula.emc.gs");
|
||
|
+ }
|
||
|
+ }
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/server/LootSelectorEntry.java b/src/main/java/net/minecraft/server/LootSelectorEntry.java
|
||
|
index 929053491..62cac814d 100644
|
||
|
--- a/src/main/java/net/minecraft/server/LootSelectorEntry.java
|
||
|
+++ b/src/main/java/net/minecraft/server/LootSelectorEntry.java
|
||
|
@@ -13,8 +13,8 @@ import org.apache.commons.lang3.ArrayUtils;
|
||
|
|
||
|
public abstract class LootSelectorEntry extends LootEntryAbstract {
|
||
|
|
||
|
- protected final int e;
|
||
|
- protected final int f;
|
||
|
+ protected final int e; public int getWeight() { return e; } // Paper - OBFHELPER
|
||
|
+ protected final int f; public int getQuality() { return f; } // Paper - OBFHELPER
|
||
|
protected final LootItemFunction[] g;
|
||
|
private final BiFunction<ItemStack, LootTableInfo, ItemStack> c;
|
||
|
private final LootEntry h = new LootSelectorEntry.c() {
|
||
|
@@ -127,7 +127,7 @@ public abstract class LootSelectorEntry extends LootEntryAbstract {
|
||
|
@Override
|
||
|
public T b(LootItemFunction.a lootitemfunction_a) {
|
||
|
this.c.add(lootitemfunction_a.b());
|
||
|
- return (LootSelectorEntry.a) this.d();
|
||
|
+ return this.d(); // Paper - decompile fix -- move to mcdev fixes
|
||
|
}
|
||
|
|
||
|
protected LootItemFunction[] a() {
|
||
|
@@ -136,22 +136,49 @@ public abstract class LootSelectorEntry extends LootEntryAbstract {
|
||
|
|
||
|
public T a(int i) {
|
||
|
this.a = i;
|
||
|
- return (LootSelectorEntry.a) this.d();
|
||
|
+ return this.d(); // Paper - decompile fix -- move to mcdev fixes
|
||
|
}
|
||
|
|
||
|
public T b(int i) {
|
||
|
this.b = i;
|
||
|
- return (LootSelectorEntry.a) this.d();
|
||
|
+ return this.d(); // Paper - decompile fix -- MOVE UP
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public abstract class c implements LootEntry {
|
||
|
|
||
|
- protected c() {}
|
||
|
+ protected c() {
|
||
|
+ }
|
||
|
|
||
|
@Override
|
||
|
public int a(float f) {
|
||
|
- return Math.max(MathHelper.d((float) LootSelectorEntry.this.e + (float) LootSelectorEntry.this.f * f), 0);
|
||
|
+ // Paper start - Offer an alternative loot formula to refactor how luck bonus applies
|
||
|
+ // SEE: https://luckformula.emc.gs for details and data
|
||
|
+ if (lastLuck != null && lastLuck == f) {
|
||
|
+ return lastWeight;
|
||
|
+ }
|
||
|
+ // This is vanilla
|
||
|
+ float qualityModifer = (float) getQuality() * f;
|
||
|
+ double baseWeight = (getWeight() + qualityModifer);
|
||
|
+ if (com.destroystokyo.paper.PaperConfig.useAlternativeLuckFormula) {
|
||
|
+ // Random boost to avoid losing precision in the final int cast on return
|
||
|
+ final int weightBoost = 100;
|
||
|
+ baseWeight *= weightBoost;
|
||
|
+ // If we have vanilla 1, bump that down to 0 so nothing is is impacted
|
||
|
+ // vanilla 3 = 300, 200 basis = impact 2%
|
||
|
+ // =($B2*(($B2-100)/100/100))
|
||
|
+ double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100);
|
||
|
+ // =($B$7/100)
|
||
|
+ float luckModifier = Math.min(100, f * 10) / 100;
|
||
|
+ // =B2 - (C2 *($B$7/100))
|
||
|
+ baseWeight = Math.ceil(baseWeight - (impacted * luckModifier));
|
||
|
+ }
|
||
|
+ lastLuck = f;
|
||
|
+ lastWeight = (int) Math.max(0, Math.floor(baseWeight));
|
||
|
+ return lastWeight;
|
||
|
}
|
||
|
}
|
||
|
+ private Float lastLuck = null;
|
||
|
+ private int lastWeight = 0;
|
||
|
+ // Paper end
|
||
|
}
|
||
|
--
|
||
|
2.21.0
|
||
|
|