diff --git a/src/main/java/com/cleanroommc/groovyscript/helper/ingredient/ModItemsIngredient.java b/src/main/java/com/cleanroommc/groovyscript/helper/ingredient/ModItemsIngredient.java new file mode 100644 index 000000000..4b66067c0 --- /dev/null +++ b/src/main/java/com/cleanroommc/groovyscript/helper/ingredient/ModItemsIngredient.java @@ -0,0 +1,56 @@ +package com.cleanroommc.groovyscript.helper.ingredient; + +import com.cleanroommc.groovyscript.api.IIngredient; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.ItemStack; +import net.minecraft.util.NonNullList; +import net.minecraftforge.fml.common.ModContainer; +import net.minecraftforge.fml.common.registry.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ModItemsIngredient extends ItemsIngredient { + + private static final Map> CACHE = new Object2ObjectOpenHashMap<>(); + + private final String modName; + + public ModItemsIngredient(String modName, List itemStacks) { + super(itemStacks); + this.modName = modName; + } + + public static ModItemsIngredient of(ModContainer mod) { + return of(mod.getModId()); + } + + public static ModItemsIngredient of(String modId) { + return new ModItemsIngredient(modId, CACHE.computeIfAbsent(modId, ModItemsIngredient::itemStacksFromLocation)); + } + + private static List itemStacksFromLocation(String namespace) { + NonNullList stacks = NonNullList.create(); + ForgeRegistries.ITEMS.getEntries() + .stream() + .filter(entry -> entry.getValue() != null) + .filter(entry -> namespace.equals(entry.getKey().getNamespace())) + .forEach(entry -> entry.getValue().getSubItems(CreativeTabs.SEARCH, stacks)); + return new ArrayList<>(stacks); + } + + public String getModName() { + return modName; + } + + @Override + public IIngredient exactCopy() { + var mii = new ModItemsIngredient(this.modName, getItemStacks()); + mii.setAmount(getAmount()); + mii.transformer = transformer; + mii.matchCondition = matchCondition; + return mii; + } +} diff --git a/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMapperManager.java b/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMapperManager.java index 2cb545716..d27220d26 100644 --- a/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMapperManager.java +++ b/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMapperManager.java @@ -32,6 +32,7 @@ import net.minecraft.world.biome.Biome; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.registry.EntityEntry; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.VillagerRegistry; @@ -199,6 +200,10 @@ public static void init() { .defaultValue(NBTTagCompound::new) .docOfType("nbt tag") .register(); + ObjectMapper.builder("mod", ModContainer.class) + .parser(ObjectMappers::parseMod) + .docOfType("mod") + .register(); } /** diff --git a/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMappers.java b/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMappers.java index 2b277726f..2e5f41ef3 100644 --- a/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMappers.java +++ b/src/main/java/com/cleanroommc/groovyscript/mapper/ObjectMappers.java @@ -22,6 +22,8 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.Loader; +import net.minecraftforge.fml.common.ModContainer; import net.minecraftforge.fml.common.registry.ForgeRegistries; import net.minecraftforge.fml.common.registry.VillagerRegistry; import org.jetbrains.annotations.NotNull; @@ -228,4 +230,10 @@ public static Result parseBlockMaterial(String mainArg, Object... args return Result.error("unable to parse provided nbt string"); } } + + public static @NotNull Result parseMod(String mainArg, Object... args) { + ModContainer mod = Loader.instance().getIndexedModList().get(mainArg); + if (mod == null) return Result.error("unable to identify mod with the name", mainArg); + return Result.some(mod); + } }