Skip to content

Commit

Permalink
types for game object handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
brachy84 committed Mar 7, 2024
1 parent 2a9badf commit 7cdee2f
Show file tree
Hide file tree
Showing 13 changed files with 158 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public AppliedEnergistics2() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("appliedenergistics2", "tunnel", IGameObjectHandler.wrapEnum(TunnelType.class, false));
GameObjectHandlerManager.registerGameObjectHandler("appliedenergistics2", "tunnel", TunnelType.class,
IGameObjectHandler.wrapEnum(TunnelType.class, false));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public AstralSorcery() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("astralsorcery", "constellation", (s, args) -> {
GameObjectHandlerManager.registerGameObjectHandler("astralsorcery", "constellation", IConstellation.class, (s, args) -> {
for (IConstellation constellation : ConstellationRegistryAccessor.getConstellationList()) {
if (constellation.getSimpleName().equalsIgnoreCase(s)) {
return Result.some(constellation);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ public static LexiconEntry getEntry(String name) {
@SuppressWarnings("Convert2MethodRef")
@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("botania", "brew", (IGameObjectHandler<vazkii.botania.api.brew.Brew>) IGameObjectHandler.wrapStringGetter(val -> BotaniaAPI.brewMap.get(val), false), (Supplier<vazkii.botania.api.brew.Brew>) () -> BotaniaAPI.fallbackBrew);
GameObjectHandlerManager.registerGameObjectHandler("botania", "brew", vazkii.botania.api.brew.Brew.class,
IGameObjectHandler.wrapStringGetter(val -> BotaniaAPI.brewMap.get(val), false),
(Supplier<vazkii.botania.api.brew.Brew>) () -> BotaniaAPI.fallbackBrew);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public EvilCraft() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("evilcraft", "weather", IGameObjectHandler.wrapStringGetter(WeatherType::valueOf, true));
GameObjectHandlerManager.registerGameObjectHandler("evilcraft", "weather", WeatherType.class,
IGameObjectHandler.wrapStringGetter(WeatherType::valueOf, true));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public Forestry() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("forestry", "species", Forestry::parseSpecies);
GameObjectHandlerManager.registerGameObjectHandler("forestry", "species", AlleleBeeSpecies.class, Forestry::parseSpecies);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import mekanism.api.gas.GasRegistry;
import mekanism.api.gas.GasStack;
import mekanism.api.infuse.InfuseRegistry;
import mekanism.api.infuse.InfuseType;
import net.minecraft.util.text.TextFormatting;
import net.minecraftforge.fml.common.Loader;
import net.minecraftforge.fml.common.Optional;
Expand Down Expand Up @@ -62,11 +63,12 @@ public Mekanism() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("mekanism", "gas", (s, args) -> {
GameObjectHandlerManager.registerGameObjectHandler("mekanism", "gas", GasStack.class, (s, args) -> {
Gas gas = GasRegistry.getGas(s);
return gas == null ? Result.error() : Result.some(new GasStack(gas, 1));
});
GameObjectHandlerManager.registerGameObjectHandler("mekanism", "infusion", IGameObjectHandler.wrapStringGetter(InfuseRegistry::get, true));
GameObjectHandlerManager.registerGameObjectHandler("mekanism", "infusion", InfuseType.class,
IGameObjectHandler.wrapStringGetter(InfuseRegistry::get, true));
}

@Optional.Method(modid = "mekanism")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import com.cleanroommc.groovyscript.compat.mods.ModPropertyContainer;
import com.cleanroommc.groovyscript.gameobjects.GameObjectHandlerManager;
import com.cleanroommc.groovyscript.gameobjects.GameObjectHandlers;
import epicsquid.roots.api.Herb;
import epicsquid.roots.init.HerbRegistry;
import epicsquid.roots.modifiers.CostType;
import epicsquid.roots.modifiers.Modifier;
import epicsquid.roots.modifiers.ModifierRegistry;
import epicsquid.roots.ritual.RitualBase;
import epicsquid.roots.ritual.RitualRegistry;
import epicsquid.roots.spell.SpellBase;
import epicsquid.roots.spell.SpellRegistry;
Expand Down Expand Up @@ -61,11 +63,11 @@ public Roots() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("roots", "ritual", IGameObjectHandler.wrapStringGetter(RitualRegistry::getRitual));
GameObjectHandlerManager.registerGameObjectHandler("roots", "herb", IGameObjectHandler.wrapStringGetter(HerbRegistry::getHerbByName));
GameObjectHandlerManager.registerGameObjectHandler("roots", "cost", IGameObjectHandler.wrapEnum(CostType.class, false));
GameObjectHandlerManager.registerGameObjectHandler("roots", "spell", Roots::getSpell);
GameObjectHandlerManager.registerGameObjectHandler("roots", "modifier", Roots::getModifier);
GameObjectHandlerManager.registerGameObjectHandler("roots", "ritual", RitualBase.class, IGameObjectHandler.wrapStringGetter(RitualRegistry::getRitual));
GameObjectHandlerManager.registerGameObjectHandler("roots", "herb", Herb.class, IGameObjectHandler.wrapStringGetter(HerbRegistry::getHerbByName));
GameObjectHandlerManager.registerGameObjectHandler("roots", "cost", CostType.class, IGameObjectHandler.wrapEnum(CostType.class, false));
GameObjectHandlerManager.registerGameObjectHandler("roots", "spell", SpellBase.class, Roots::getSpell);
GameObjectHandlerManager.registerGameObjectHandler("roots", "modifier", Modifier.class, Roots::getModifier);
}

private static Result<SpellBase> getSpell(String s, Object... args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,10 @@ public Thaumcraft() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("thaumcraft", "aspect", IGameObjectHandler.wrapStringGetter(Thaumcraft::getAspect, AspectStack::new));
GameObjectHandlerManager.registerGameObjectHandler("thaumcraft", "crystal", IGameObjectHandler.wrapStringGetter(Thaumcraft::getAspect, ThaumcraftApiHelper::makeCrystal));
GameObjectHandlerManager.registerGameObjectHandler("thaumcraft", "aspect", AspectStack.class,
IGameObjectHandler.wrapStringGetter(Thaumcraft::getAspect, AspectStack::new));
GameObjectHandlerManager.registerGameObjectHandler("thaumcraft", "crystal",
ItemStack.class, IGameObjectHandler.wrapStringGetter(Thaumcraft::getAspect, ThaumcraftApiHelper::makeCrystal));
ExpansionHelper.mixinClass(ItemStack.class, AspectItemStackExpansion.class);
ExpansionHelper.mixinClass(ItemStack.class, WarpItemStackExpansion.class);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import com.cleanroommc.groovyscript.core.mixin.tconstruct.TinkerRegistryAccessor;
import com.cleanroommc.groovyscript.gameobjects.GameObjectHandlerManager;
import net.minecraftforge.common.MinecraftForge;
import slimeknights.tconstruct.library.materials.Material;
import slimeknights.tconstruct.library.traits.ITrait;

public class TinkersConstruct extends ModPropertyContainer {

Expand All @@ -31,9 +33,12 @@ public TinkersConstruct() {

@Override
public void initialize() {
GameObjectHandlerManager.registerGameObjectHandler("tconstruct", "toolMaterial", IGameObjectHandler.wrapStringGetter(TinkerRegistryAccessor.getMaterials()::get));
GameObjectHandlerManager.registerGameObjectHandler("tconstruct", "toolTrait", IGameObjectHandler.wrapStringGetter(TinkerRegistryAccessor.getTraits()::get));
GameObjectHandlerManager.registerGameObjectHandler("tconstruct", "armorTrait", IGameObjectHandler.wrapStringGetter(s -> TinkerRegistryAccessor.getTraits().get(s + "_armor")));
GameObjectHandlerManager.registerGameObjectHandler("tconstruct", "toolMaterial", Material.class,
IGameObjectHandler.wrapStringGetter(TinkerRegistryAccessor.getMaterials()::get));
GameObjectHandlerManager.registerGameObjectHandler("tconstruct", "toolTrait", ITrait.class,
IGameObjectHandler.wrapStringGetter(TinkerRegistryAccessor.getTraits()::get));
GameObjectHandlerManager.registerGameObjectHandler("tconstruct", "armorTrait", ITrait.class,
IGameObjectHandler.wrapStringGetter(s -> TinkerRegistryAccessor.getTraits().get(s + "_armor")));
}

public static void init() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,76 +2,100 @@

import com.cleanroommc.groovyscript.api.GroovyLog;
import com.cleanroommc.groovyscript.api.IGameObjectHandler;
import com.cleanroommc.groovyscript.api.IIngredient;
import com.cleanroommc.groovyscript.api.Result;
import com.cleanroommc.groovyscript.helper.ingredient.OreDictIngredient;
import com.cleanroommc.groovyscript.helper.ingredient.OreDictWildcardIngredient;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.JsonToNBT;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionType;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.biome.Biome;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.registry.EntityEntry;
import net.minecraftforge.fml.common.registry.ForgeRegistries;
import net.minecraftforge.fml.common.registry.VillagerRegistry;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;

import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.function.Supplier;

public class GameObjectHandlerManager {

private static final Map<String, GameObjectHandler<?>> bracketHandlers = new Object2ObjectOpenHashMap<>();
public static final String EMPTY = "empty", WILDCARD = "*", SPLITTER = ":";

public static <T> void registerGameObjectHandler(@Nullable String mod, String key, IGameObjectHandler<T> handler, Supplier<T> defaultValue) {
public static <T> GameObjectHandler<T> registerGameObjectHandler(@Nullable String mod, String key, Class<T> returnType, IGameObjectHandler<T> handler, Supplier<T> defaultValue) {
if (StringUtils.isEmpty(key) || handler == null || defaultValue == null) throw new NullPointerException();
if (bracketHandlers.containsKey(key)) {
throw new IllegalArgumentException("Bracket handler already exists for key " + key);
}
bracketHandlers.put(key, new GameObjectHandler<>(key, mod, handler, defaultValue));
GameObjectHandler<T> goh = new GameObjectHandler<>(key, mod, handler, defaultValue, returnType);
bracketHandlers.put(key, goh);
return goh;
}

public static <T> void registerGameObjectHandler(@Nullable String mod, String key, IGameObjectHandler<T> handler, T defaultValue) {
registerGameObjectHandler(mod, key, handler, (Supplier<T>) () -> defaultValue);
public static <T> GameObjectHandler<T> registerGameObjectHandler(@Nullable String mod, String key, Class<T> returnType, IGameObjectHandler<T> handler, T defaultValue) {
return registerGameObjectHandler(mod, key, returnType, handler, (Supplier<T>) () -> defaultValue);
}

public static <T> void registerGameObjectHandler(@Nullable String mod, String key, IGameObjectHandler<T> handler) {
registerGameObjectHandler(mod, key, handler, (Supplier<T>) () -> null);
public static <T> GameObjectHandler<T> registerGameObjectHandler(@Nullable String mod, String key, Class<T> returnType, IGameObjectHandler<T> handler) {
return registerGameObjectHandler(mod, key, returnType, handler, (Supplier<T>) () -> null);
}

public static <T> void registerGameObjectHandler(String key, IGameObjectHandler<T> handler, Supplier<T> defaultValue) {
registerGameObjectHandler(null, key, handler, defaultValue);
public static <T> GameObjectHandler<T> registerGameObjectHandler(String key, Class<T> returnType, IGameObjectHandler<T> handler, Supplier<T> defaultValue) {
return registerGameObjectHandler(null, key, returnType, handler, defaultValue);
}

public static <T> void registerGameObjectHandler(String key, IGameObjectHandler<T> handler) {
registerGameObjectHandler(null, key, handler);
public static <T> GameObjectHandler<T> registerGameObjectHandler(String key, Class<T> returnType, IGameObjectHandler<T> handler) {
return registerGameObjectHandler(null, key, returnType, handler);
}

public static boolean hasGameObjectHandler(String key) {
return bracketHandlers.containsKey(key);
}

public static Set<String> getGameObjectHandlers() {
return bracketHandlers.keySet();
public static Collection<GameObjectHandler<?>> getGameObjectHandlers() {
return bracketHandlers.values();
}

public static Class<?> getReturnTypeOf(String name) {
GameObjectHandler<?> goh = bracketHandlers.get(name);
return goh == null ? null : goh.getReturnType();
}

public static void init() {
registerGameObjectHandler("resource", GameObjectHandlers::parseResourceLocation);
registerGameObjectHandler("ore", (s, args) -> s.contains("*") ? Result.some(OreDictWildcardIngredient.of(s)) : Result.some(new OreDictIngredient(s)));
registerGameObjectHandler("item", GameObjectHandlers::parseItemStack, () -> ItemStack.EMPTY);
registerGameObjectHandler("liquid", GameObjectHandlers::parseFluidStack);
registerGameObjectHandler("fluid", GameObjectHandlers::parseFluidStack);
registerGameObjectHandler("block", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.BLOCKS));
registerGameObjectHandler("blockstate", GameObjectHandlers::parseBlockState);
registerGameObjectHandler("enchantment", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.ENCHANTMENTS));
registerGameObjectHandler("potion", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.POTIONS));
registerGameObjectHandler("potionType", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.POTION_TYPES));
registerGameObjectHandler("sound", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.SOUND_EVENTS));
registerGameObjectHandler("entity", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.ENTITIES));
registerGameObjectHandler("biome", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.BIOMES));
registerGameObjectHandler("profession", IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.VILLAGER_PROFESSIONS));
registerGameObjectHandler("creativeTab", GameObjectHandlers::parseCreativeTab);
registerGameObjectHandler("textformat", GameObjectHandlers::parseTextFormatting);
registerGameObjectHandler("nbt", GameObjectHandlers::parseNBT);
registerGameObjectHandler("resource", ResourceLocation.class, GameObjectHandlers::parseResourceLocation)
.withDesc(String.class, String.class);
registerGameObjectHandler("ore", IIngredient.class, (s, args) -> s.contains("*") ? Result.some(OreDictWildcardIngredient.of(s)) : Result.some(new OreDictIngredient(s)));
registerGameObjectHandler("item", ItemStack.class, GameObjectHandlers::parseItemStack, () -> ItemStack.EMPTY)
.withDesc(String.class, int.class);
registerGameObjectHandler("liquid", FluidStack.class, GameObjectHandlers::parseFluidStack);
registerGameObjectHandler("fluid", FluidStack.class, GameObjectHandlers::parseFluidStack);
registerGameObjectHandler("block", Block.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.BLOCKS));
registerGameObjectHandler("blockstate", IBlockState.class, GameObjectHandlers::parseBlockState)
.withDesc(String.class, int.class)
.withDesc(String.class, String[].class);
registerGameObjectHandler("enchantment", Enchantment.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.ENCHANTMENTS));
registerGameObjectHandler("potion", Potion.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.POTIONS));
registerGameObjectHandler("potionType", PotionType.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.POTION_TYPES));
registerGameObjectHandler("sound", SoundEvent.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.SOUND_EVENTS));
registerGameObjectHandler("entity", EntityEntry.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.ENTITIES));
registerGameObjectHandler("biome", Biome.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.BIOMES));
registerGameObjectHandler("profession", VillagerRegistry.VillagerProfession.class, IGameObjectHandler.wrapForgeRegistry(ForgeRegistries.VILLAGER_PROFESSIONS));
registerGameObjectHandler("creativeTab", CreativeTabs.class, GameObjectHandlers::parseCreativeTab);
registerGameObjectHandler("textformat", TextFormatting.class, GameObjectHandlers::parseTextFormatting)
.withDesc(int.class);
registerGameObjectHandler("nbt", NBTTagCompound.class, GameObjectHandlers::parseNBT);
}

/**
Expand All @@ -97,12 +121,16 @@ public static class GameObjectHandler<T> {
private final String mod;
private final IGameObjectHandler<T> handler;
private final Supplier<T> defaultValue;
private final Class<T> returnType;
private final List<Class<?>[]> paramTypes = new ArrayList<>();

private GameObjectHandler(String name, String mod, IGameObjectHandler<T> handler, Supplier<T> defaultValue) {
private GameObjectHandler(String name, String mod, IGameObjectHandler<T> handler, Supplier<T> defaultValue, Class<T> returnType) {
this.name = name;
this.mod = mod;
this.handler = handler;
this.defaultValue = defaultValue;
this.returnType = returnType;
withDesc(String.class);
}

private T invoke(String s, Object... args) {
Expand All @@ -120,5 +148,26 @@ private T invoke(String s, Object... args) {
}
return Objects.requireNonNull(t.getValue(), "Bracket handler result must contain a non-null value!");
}

public String getMod() {
return mod;
}

public String getName() {
return name;
}

public GameObjectHandler<T> withDesc(Class<?>... paramTypes) {
this.paramTypes.add(paramTypes);
return this;
}

public List<Class<?>[]> getParamTypes() {
return this.paramTypes;
}

public Class<T> getReturnType() {
return returnType;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.cleanroommc.groovyscript.sandbox.transformer;

import com.cleanroommc.groovyscript.GroovyScript;
import com.cleanroommc.groovyscript.api.GroovyLog;
import com.cleanroommc.groovyscript.gameobjects.GameObjectHandlerManager;
import org.codehaus.groovy.ast.ClassCodeExpressionTransformer;
import org.codehaus.groovy.ast.ClassHelper;
Expand Down
Loading

0 comments on commit 7cdee2f

Please sign in to comment.