package modtweaker.brackets; import minetweaker.IBracketHandler; import minetweaker.MineTweakerAPI; import minetweaker.annotations.BracketHandler; import minetweaker.api.item.IngredientAny; import modtweaker.brackets.util.IMaterial; import modtweaker.brackets.util.MCMaterial; import slimeknights.tconstruct.library.TinkerRegistry; import stanhebben.zenscript.compiler.IEnvironmentGlobal; import stanhebben.zenscript.expression.ExpressionCallStatic; import stanhebben.zenscript.expression.ExpressionString; import stanhebben.zenscript.expression.partial.IPartialExpression; import stanhebben.zenscript.parser.Token; import stanhebben.zenscript.symbols.IZenSymbol; import stanhebben.zenscript.type.natives.IJavaMethod; import stanhebben.zenscript.util.ZenPosition; import java.util.List; /** * Created by Jared on 6/16/2016. */ @BracketHandler(priority = 100) public class MaterialBracketHandler implements IBracketHandler { public static IMaterial getMaterial(String name) { return new MCMaterial(TinkerRegistry.getMaterial(name)); } private final IZenSymbol symbolAny; private final IJavaMethod method; public MaterialBracketHandler() { symbolAny = MineTweakerAPI.getJavaStaticFieldSymbol(IngredientAny.class, "INSTANCE"); method = MineTweakerAPI.getJavaMethod(MaterialBracketHandler.class, "getMaterial", String.class); } @Override public IZenSymbol resolve(IEnvironmentGlobal environment, List<Token> tokens) { // any symbol if (tokens.size() == 1 && tokens.get(0).getValue().equals("*")) { return symbolAny; } if (tokens.size() > 2) { if (tokens.get(0).getValue().equals("material") && tokens.get(1).getValue().equals(":")) { return find(environment, tokens, 2, tokens.size()); } } return null; } private IZenSymbol find(IEnvironmentGlobal environment, List<Token> tokens, int startIndex, int endIndex) { StringBuilder valueBuilder = new StringBuilder(); for (int i = startIndex; i < endIndex; i++) { Token token = tokens.get(i); valueBuilder.append(token.getValue()); } IMaterial material = getMaterial(valueBuilder.toString()); if (!material.getName().equals("unknown")) { MineTweakerAPI.logInfo("Material wasn't null"); return new MaterialReferenceSymbol(environment, valueBuilder.toString()); } MineTweakerAPI.logInfo("Material was null"); return null; } private class MaterialReferenceSymbol implements IZenSymbol { private final IEnvironmentGlobal environment; private final String name; public MaterialReferenceSymbol(IEnvironmentGlobal environment, String name) { this.environment = environment; this.name = name; } @Override public IPartialExpression instance(ZenPosition position) { return new ExpressionCallStatic(position, environment, method, new ExpressionString(position, name)); } } }