Another issue:
My loot modifier won't load, the log just says it can't parse it, as well as a NullPointerException error. Do I have to specify that my class should be used to parse it somewhere?
All related files below:
data/forge/loot_modifiers/global_loot_modifiers.json
{
"replace": false,
"entries": [
"calebsmod:golden_touch"
]
}
data/calebsmod/loot_modifiers/golden_touch.json
{
"conditions": [
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"effects": {
"calebsmod:golden_touch": {}
}
}
}
],
"chance_per_level": 0.2,
"drop": {
"min": 1,
"max": 3,
"item": "minecraft:gold"
}
}
LootModification
public class LootModification extends LootModifier {
private final int minDrop;
private final int maxDrop;
private final Item replacementItem;
private final float chancePerLvl;
public LootModification(ILootCondition[] conditionsIn, int minDrop, int maxDrop, Item itemDrop, float chancePerLvl) {
super(conditionsIn);
this.minDrop = minDrop;
this.maxDrop = maxDrop;
this.replacementItem = itemDrop;
this.chancePerLvl = chancePerLvl;
}
@Nonnull
@Override
public List<ItemStack> doApply(List<ItemStack> generatedLoot, LootContext context) {
LivingEntity entity = (LivingEntity)context.getParamOrNull(LootParameters.THIS_ENTITY);
Random random = new Random();
if (entity.getEffect(ModEffects.GOLDEN_TOUCH.get()).getAmplifier() * chancePerLvl > random.nextFloat()) {
generatedLoot.removeAll(generatedLoot);
generatedLoot.add(new ItemStack(replacementItem, minDrop + random.nextInt(maxDrop - minDrop)));
}
return generatedLoot;
}
public static class Serializer extends GlobalLootModifierSerializer<LootModification> {
@Override
public LootModification read(ResourceLocation name, JsonObject object, ILootCondition[] conditionsIn) {
float chance = JSONUtils.getAsFloat(object, "chance_per_level");
int max = JSONUtils.getAsInt(object, "drop.max");
int min = JSONUtils.getAsInt(object, "drop.min");
Item drop = ForgeRegistries.ITEMS.getValue(new ResourceLocation((JSONUtils.getAsString(object, "drop.item"))));
return new LootModification(conditionsIn, min, max, drop, chance);
}
@Override
public JsonObject write(LootModification instance) {
JsonObject json = makeConditions(instance.conditions);
json.addProperty("chance_per_level", instance.chancePerLvl);
json.addProperty("drop.min", instance.minDrop);
json.addProperty("drop.max", instance.maxDrop);
json.addProperty("drop.item", ForgeRegistries.ITEMS.getKey(instance.replacementItem).toString());
return json;
}
}
}