package net.glowstone.util.loot; import lombok.Data; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Random; @Data public class ProbableValue<T> { private final Map<T, Double> possibilities = new HashMap<>(); public ProbableValue(JSONObject json, String type) { Object o = json.get(type); if (o instanceof JSONArray) { JSONArray array = (JSONArray) o; for (int i = 0; i < array.size(); i++) { JSONObject object = (JSONObject) array.get(i); Double chance = (Double) object.get("chance"); T val = (T) object.get("value"); possibilities.put(val, chance); } } else { possibilities.put((T) o, 1.0); } } public T generate(Random random) { if (possibilities.size() == 1 && (Double) Arrays.asList(possibilities.values().toArray()).get(0) == 1.0) { return (T) Arrays.asList(possibilities.keySet().toArray()).get(0); } double rand = random.nextDouble(); double cur = 0; for (Map.Entry<T, Double> entry : possibilities.entrySet()) { cur += entry.getValue(); if (rand < cur) { return entry.getKey(); } } return null; } }