I would like to have a BoP sapling drop from my block if it is also installed. I think I have done everything and I cannot pinpoint the problem, which is the error in the logs that appears when joining a world:
[Worker-Main-11/ERROR] [ne.mi.co.ForgeHooks/]: Couldn't parse element loot_tables:grasses:blocks/leaves_block
com.google.gson.JsonSyntaxException: Expected name to be an item, was unknown string 'biomesoplenty:magic_sapling'
My code:
LootItemConditions.CONDITIONS.register(modEventBus);
public class LootItemConditions {
public static final DeferredRegister<LootItemConditionType> CONDITIONS =
DeferredRegister.create(Registries.LOOT_CONDITION_TYPE, Grasses.MOD_ID);
public static final RegistryObject<LootItemConditionType> IS_MOD_LOADED =
CONDITIONS.register("is_mod_loaded", () -> new LootItemConditionType(new IsModLoaded.ConditionSerializer()));
}
public class IsModLoaded implements LootItemCondition {
private final boolean exists;
private final String modID;
public IsModLoaded(String modID) {
this.exists = ModList.get().isLoaded(modID);
this.modID = modID;
}
@Override
public LootItemConditionType getType() {
return LootItemConditions.IS_MOD_LOADED.get();
}
@Override
public boolean test(LootContext context) {
return this.exists;
}
public static LootItemCondition.Builder builder(String modid) {
return () -> new IsModLoaded(modid);
}
public static class ConditionSerializer implements Serializer<IsModLoaded> {
@Override
public void serialize(JsonObject json, IsModLoaded instance, JsonSerializationContext ctx) {
json.addProperty("modid", instance.modID);
}
@Override
public IsModLoaded deserialize(JsonObject json, JsonDeserializationContext ctx) {
return new IsModLoaded(GsonHelper.getAsString(json, "modid"));
}
}
}
protected LootTable.Builder createLeavesDropsWithModIDCheck(Block selfBlock, Item sapling, Property<?>[] properties, String modIDToCheck, float... chances) {
CopyBlockState.Builder blockStateCopyBuilder = CopyBlockState.copyState(selfBlock);
for(Property<?> property : properties) {
blockStateCopyBuilder.copy(property);
}
return LootTable.lootTable()
.withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F))
.add(LootItem.lootTableItem(selfBlock)
.when(HAS_SHEARS_OR_SILK_TOUCH)
.apply(blockStateCopyBuilder)))
.withPool(LootPool.lootPool().setRolls(ConstantValue.exactly(1.0F))
.add(this.applyExplosionCondition(selfBlock, LootItem.lootTableItem(sapling))
.when(IsModLoaded.builder(modIDToCheck)))
.when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, chances))
.when(HAS_NO_SHEARS_OR_SILK_TOUCH))
.withPool(LootPool.lootPool().name("sticks").setRolls(ConstantValue.exactly(1.0F))
.add(this.applyExplosionDecay(selfBlock, LootItem.lootTableItem(Items.STICK).
apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F))))
.when(BonusLevelTableCondition.bonusLevelFlatChance(Enchantments.BLOCK_FORTUNE, NORMAL_LEAVES_STICK_CHANCES))
.when(HAS_NO_SHEARS_OR_SILK_TOUCH)));
}
I don't know. Am I making a mistake somewhere? Am I forgetting something? Should there be something else?