111 lines
4.9 KiB
Diff
111 lines
4.9 KiB
Diff
From 0000000000000000000000000000000000000000 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 05a5abb951abe37f30a719cb75376d2d43c0d252..77a03abd59db4a43f6f2d59d4c7ef176e782f205 100644
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java
|
|
@@ -288,4 +288,12 @@ public class PaperConfig {
|
|
SpigotConfig.save();
|
|
}
|
|
}
|
|
+
|
|
+ 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/world/level/storage/loot/entries/LootSelectorEntry.java b/src/main/java/net/minecraft/world/level/storage/loot/entries/LootSelectorEntry.java
|
|
index ceb9a1e1b1d55a0a8cd74189450f356b9ad4c46c..632002c4db01ca3f3c19aa583226cf36f17afe7f 100644
|
|
--- a/src/main/java/net/minecraft/world/level/storage/loot/entries/LootSelectorEntry.java
|
|
+++ b/src/main/java/net/minecraft/world/level/storage/loot/entries/LootSelectorEntry.java
|
|
@@ -20,8 +20,8 @@ import org.apache.commons.lang3.ArrayUtils;
|
|
|
|
public abstract class LootSelectorEntry extends LootEntryAbstract {
|
|
|
|
- protected final int c;
|
|
- protected final int e;
|
|
+ protected final int c; public int getWeight() { return c; } // Paper - OBFHELPER
|
|
+ protected final int e; public int getQuality() { return e; } // Paper - OBFHELPER
|
|
protected final LootItemFunction[] f;
|
|
private final BiFunction<ItemStack, LootTableInfo, ItemStack> g;
|
|
private final LootEntry h = new LootSelectorEntry.c() {
|
|
@@ -152,11 +152,38 @@ public abstract class LootSelectorEntry extends LootEntryAbstract {
|
|
|
|
public abstract class c implements LootEntry {
|
|
|
|
- protected c() {}
|
|
+ protected c() {
|
|
+ }
|
|
|
|
@Override
|
|
public int a(float f) {
|
|
- return Math.max(MathHelper.d((float) LootSelectorEntry.this.c + (float) LootSelectorEntry.this.e * 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
|
|
}
|