109 lines
4.5 KiB
Diff
109 lines
4.5 KiB
Diff
From 0bd14e1218f146e26524a3c799209482a53e99e0 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 b602bbf12..62bce1806 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
@@ -291,4 +291,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/LotoSelectorEntry.java b/src/main/java/net/minecraft/server/LotoSelectorEntry.java
|
|
index add618866..9f8e17b9d 100644
|
|
--- a/src/main/java/net/minecraft/server/LotoSelectorEntry.java
|
|
+++ b/src/main/java/net/minecraft/server/LotoSelectorEntry.java
|
|
@@ -14,8 +14,8 @@ import java.util.Random;
|
|
|
|
public abstract class LotoSelectorEntry {
|
|
|
|
- protected final int c;
|
|
- protected final int d;
|
|
+ protected final int c; public int getWeight() { return c; } // Paper - OBFHELPER
|
|
+ protected final int d; public int getQuality() { return d; } // Paper - OBFHELPER
|
|
protected final LootItemCondition[] e;
|
|
|
|
protected LotoSelectorEntry(int i, int j, LootItemCondition[] alootitemcondition) {
|
|
@@ -25,8 +25,34 @@ public abstract class LotoSelectorEntry {
|
|
}
|
|
|
|
public int a(float f) {
|
|
- return Math.max(MathHelper.d((float) this.c + (float) this.d * 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) this.getQuality() * f;
|
|
+ double baseWeight = (this.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
|
|
|
|
public abstract void a(Collection<ItemStack> collection, Random random, LootTableInfo loottableinfo);
|
|
|
|
--
|
|
2.18.0
|
|
|