60 lines
2.1 KiB
Java
60 lines
2.1 KiB
Java
package dev.loki.item;
|
||
|
||
import org.bukkit.inventory.ItemStack;
|
||
|
||
import java.util.Random;
|
||
import java.util.concurrent.ThreadLocalRandom;
|
||
|
||
/**
|
||
* Генератор случайного лута для сундуков.
|
||
* Может выдать: Медкит (разное количество зарядов), Набор для срезания.
|
||
*/
|
||
public class ChestLoot {
|
||
|
||
private final Random random;
|
||
|
||
// Веса для разных типов лута (из конфига game.yml: loot.*)
|
||
private final int medkitWeight;
|
||
private final int medkitMinCharges;
|
||
private final int medkitMaxCharges;
|
||
private final int hookCutterWeight;
|
||
|
||
/** Config-aware constructor. */
|
||
public ChestLoot(dev.loki.config.GameConfig config) {
|
||
this.random = ThreadLocalRandom.current();
|
||
var cfg = config.getConfig();
|
||
this.medkitWeight = cfg.getInt("loot.medkit.weight", 60);
|
||
this.medkitMinCharges = cfg.getInt("loot.medkit.min-charges", 12);
|
||
this.medkitMaxCharges = cfg.getInt("loot.medkit.max-charges", 16);
|
||
this.hookCutterWeight = cfg.getInt("loot.hook-cutter.weight", 40);
|
||
}
|
||
|
||
/** Fallback — hardcoded defaults. */
|
||
public ChestLoot() {
|
||
this.random = ThreadLocalRandom.current();
|
||
this.medkitWeight = 60;
|
||
this.medkitMinCharges = 12;
|
||
this.medkitMaxCharges = 16;
|
||
this.hookCutterWeight = 40;
|
||
}
|
||
|
||
/**
|
||
* Бросает кубик и возвращает случайный предмет.
|
||
* Никогда не возвращает null.
|
||
*/
|
||
public ItemStack rollLoot() {
|
||
int total = medkitWeight + hookCutterWeight;
|
||
if (total <= 0) {
|
||
return DBDItems.medkit(12);
|
||
}
|
||
|
||
int roll = random.nextInt(total);
|
||
|
||
if (roll < medkitWeight) {
|
||
int charges = medkitMinCharges + random.nextInt(Math.max(1, medkitMaxCharges - medkitMinCharges + 1));
|
||
return DBDItems.medkit(charges);
|
||
} else {
|
||
return DBDItems.hookCutter();
|
||
}
|
||
}
|
||
}
|