diff --git a/.nb-gradle-properties b/.nb-gradle-properties
new file mode 100644
index 0000000..b18f6c4
--- /dev/null
+++ b/.nb-gradle-properties
@@ -0,0 +1,26 @@
+
+
+
+
+
+ debug
+ no
+
+ runClient
+
+
+
+
+
+ run
+ no
+
+ runClient
+
+
+
+ -Dfml.coreMods.load=minetweaker.mc172.transformer.MineTweakerTransformer
+
+
+
+
diff --git a/MineTweaker3-API/src/main/java/minetweaker/MineTweakerAPI.java b/MineTweaker3-API/src/main/java/minetweaker/MineTweakerAPI.java
index f20c64d..ebce36b 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/MineTweakerAPI.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/MineTweakerAPI.java
@@ -1,6 +1,6 @@
package minetweaker;
-import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
import minetweaker.runtime.IMineTweaker;
import minetweaker.runtime.ILogger;
import minetweaker.runtime.Tweaker;
@@ -11,6 +11,10 @@ import minetweaker.runtime.GlobalRegistry;
import stanhebben.zenscript.annotations.ZenClass;
import stanhebben.zenscript.annotations.ZenExpansion;
import stanhebben.zenscript.symbols.IZenSymbol;
+import stanhebben.zenscript.symbols.SymbolJavaStaticField;
+import stanhebben.zenscript.symbols.SymbolJavaStaticGetter;
+import stanhebben.zenscript.symbols.SymbolJavaStaticMethod;
+import stanhebben.zenscript.type.natives.JavaMethod;
/**
* Provides access to the MineTweaker API.
@@ -67,12 +71,12 @@ public class MineTweakerAPI {
* @param annotatedClass
*/
public static void registerClass(Class annotatedClass) {
- for (Annotation annotation : annotatedClass.getAnnotations()) {
- if (annotation instanceof ZenExpansion) {
- GlobalRegistry.registerExpansion(annotatedClass);
- } else if (annotation instanceof ZenClass) {
- GlobalRegistry.registerNativeClass(annotatedClass);
- }
+ if (annotatedClass.isAnnotationPresent(ZenExpansion.class)) {
+ GlobalRegistry.registerExpansion(annotatedClass);
+ }
+
+ if (annotatedClass.isAnnotationPresent(ZenClass.class)) {
+ GlobalRegistry.registerNativeClass(annotatedClass);
}
}
@@ -107,4 +111,63 @@ public class MineTweakerAPI {
public static void registerBracketHandler(IBracketHandler handler) {
GlobalRegistry.registerBracketHandler(handler);
}
+
+ /**
+ * Creates a symbol that refers to a java method.
+ *
+ * @param cls class that contains the method
+ * @param name method name
+ * @param arguments method argument types
+ * @return corresponding symbol
+ */
+ public static IZenSymbol getJavaStaticMethodSymbol(Class cls, String name, Class... arguments) {
+ JavaMethod method = JavaMethod.get(GlobalRegistry.getTypeRegistry(), cls, name, arguments);
+ return new SymbolJavaStaticMethod(method);
+ }
+
+ /**
+ * Creates a symbol that refers to a java getter. The getter must be a method
+ * with no arguments. The given symbol will act as a variable of which the
+ * value can be retrieved but not set.
+ *
+ * @param cls class that contains the getter method
+ * @param name name of the method
+ * @return corresponding symbol
+ */
+ public static IZenSymbol getJavaStaticGetterSymbol(Class cls, String name) {
+ JavaMethod method = JavaMethod.get(GlobalRegistry.getTypeRegistry(), cls, name);
+ return new SymbolJavaStaticGetter(method);
+ }
+
+ /**
+ * Creates a symbol that refers to a static field. The field must be an
+ * existing public field in the given class. The field will act as a
+ * variable that can be retrieved but not set.
+ *
+ * @param cls class that contains the field
+ * @param name field name (must be public)
+ * @return corresponding symbol
+ */
+ public static IZenSymbol getJavaStaticFieldSymbol(Class cls, String name) {
+ try {
+ Field field = cls.getField(name);
+ return new SymbolJavaStaticField(cls, field, GlobalRegistry.getTypeRegistry());
+ } catch (NoSuchFieldException ex) {
+ return null;
+ } catch (SecurityException ex) {
+ return null;
+ }
+ }
+
+ /**
+ * Loads a Java method from an existing class.
+ *
+ * @param cls method class
+ * @param name method name
+ * @param arguments argument types
+ * @return java method
+ */
+ public static JavaMethod getJavaMethod(Class cls, String name, Class... arguments) {
+ return JavaMethod.get(GlobalRegistry.getTypeRegistry(), cls, name, arguments);
+ }
}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/annotations/BracketHandler.java b/MineTweaker3-API/src/main/java/minetweaker/annotations/BracketHandler.java
new file mode 100644
index 0000000..a11697c
--- /dev/null
+++ b/MineTweaker3-API/src/main/java/minetweaker/annotations/BracketHandler.java
@@ -0,0 +1,18 @@
+package minetweaker.annotations;
+
+/**
+ * Marks a bracket handler. Bracket handlers are automatically registered.
+ * The marked class should have an empty constructor.
+ *
+ * @author Stan Hebben
+ */
+public @interface BracketHandler {
+ /**
+ * Indicates priority. A lower value means a higher priority. Only change
+ * if you have issues, default value is 10. Internal minetweaker handlers
+ * have priorities up to 100.
+ *
+ * @return
+ */
+ public int priority() default 10;
+}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IItemStack.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IItemStack.java
index 57c1332..5d77593 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IItemStack.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IItemStack.java
@@ -8,9 +8,11 @@ package minetweaker.minecraft.item;
import minetweaker.minecraft.data.IData;
import minetweaker.minecraft.liquid.ILiquidStack;
+import stanhebben.zenscript.annotations.OperatorType;
import stanhebben.zenscript.annotations.ZenClass;
import stanhebben.zenscript.annotations.ZenGetter;
import stanhebben.zenscript.annotations.ZenMethod;
+import stanhebben.zenscript.annotations.ZenOperator;
/**
*
@@ -39,6 +41,10 @@ public interface IItemStack extends IIngredient {
@ZenGetter("liquid")
public ILiquidStack getLiquid();
+ @ZenOperator(OperatorType.MUL)
+ @ZenMethod
+ public IItemStack amount(int amount);
+
@ZenMethod
public IIngredient anyDamage();
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAny.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAny.java
index dbe5e26..6fb3500 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAny.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAny.java
@@ -7,13 +7,15 @@
package minetweaker.minecraft.item;
import java.util.List;
+import minetweaker.minecraft.util.ArrayUtil;
/**
*
* @author Stan
*/
public class IngredientAny implements IIngredient {
- public static IngredientAny INSTANCE = new IngredientAny();
+ public static final IngredientAny INSTANCE = new IngredientAny();
+
public static Object INTERNAL_ANY = null; // platforms supporting an "any" item should fill it here
private IngredientAny() {}
@@ -40,36 +42,36 @@ public class IngredientAny implements IIngredient {
@Override
public IIngredient transform(IItemTransformer transformer) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return new IngredientAnyAdvanced(null, ArrayUtil.EMPTY_CONDITIONS, new IItemTransformer[] { transformer });
}
@Override
public IIngredient only(IItemCondition condition) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return new IngredientAnyAdvanced(null, new IItemCondition[] { condition }, ArrayUtil.EMPTY_TRANSFORMERS);
}
@Override
public IIngredient marked(String mark) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return new IngredientAnyAdvanced(mark, ArrayUtil.EMPTY_CONDITIONS, ArrayUtil.EMPTY_TRANSFORMERS);
}
@Override
public boolean matches(IItemStack item) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return true;
}
@Override
public boolean contains(IIngredient ingredient) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return true;
}
@Override
public IItemStack applyTransform(IItemStack item) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return item;
}
@Override
public Object getInternal() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return INTERNAL_ANY;
}
}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAnyAdvanced.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAnyAdvanced.java
new file mode 100644
index 0000000..01fcd85
--- /dev/null
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientAnyAdvanced.java
@@ -0,0 +1,96 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.minecraft.item;
+
+import java.util.List;
+import minetweaker.minecraft.util.ArrayUtil;
+
+/**
+ *
+ * @author Stan
+ */
+public class IngredientAnyAdvanced implements IIngredient {
+ private final String mark;
+ private final IItemCondition[] conditions;
+ private final IItemTransformer[] transformers;
+
+ public IngredientAnyAdvanced(String mark, IItemCondition[] conditions, IItemTransformer[] transformers) {
+ this.mark = mark;
+ this.conditions = conditions;
+ this.transformers = transformers;
+ }
+
+ @Override
+ public String getMark() {
+ return mark;
+ }
+
+ @Override
+ public int getAmount() {
+ return 1;
+ }
+
+ @Override
+ public List getItems() {
+ return null;
+ }
+
+ @Override
+ public IIngredient amount(int amount) {
+ return new IngredientStack(this, amount);
+ }
+
+ @Override
+ public IIngredient transform(IItemTransformer transformer) {
+ return new IngredientAnyAdvanced(mark, conditions, ArrayUtil.append(transformers, transformer));
+ }
+
+ @Override
+ public IIngredient only(IItemCondition condition) {
+ return new IngredientAnyAdvanced(mark, ArrayUtil.append(conditions, condition), transformers);
+ }
+
+ @Override
+ public IIngredient marked(String mark) {
+ return new IngredientAnyAdvanced(mark, conditions, transformers);
+ }
+
+ @Override
+ public boolean matches(IItemStack item) {
+ if (!item.matches(item)) return false;
+
+ for (IItemCondition condition : conditions) {
+ if (!condition.matches(item)) return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public boolean contains(IIngredient ingredient) {
+ List iitems = ingredient.getItems();
+ for (IItemStack iitem : iitems) {
+ if (!matches(iitem)) return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public IItemStack applyTransform(IItemStack item) {
+ for (IItemTransformer transform : transformers) {
+ item = transform.transform(item);
+ }
+
+ return item;
+ }
+
+ @Override
+ public Object getInternal() {
+ return IngredientAny.INTERNAL_ANY;
+ }
+}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientItem.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientItem.java
index 6b1b3c0..7bcfcf2 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientItem.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/item/IngredientItem.java
@@ -99,4 +99,13 @@ public class IngredientItem implements IIngredient {
public Object getInternal() {
return item.getInternal();
}
+
+ // #############################
+ // ### Object implementation ###
+ // #############################
+
+ @Override
+ public String toString() {
+ return "(Ingredient) " + item.toString();
+ }
}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidDefinition.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidDefinition.java
index dac6496..1ed30f1 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidDefinition.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidDefinition.java
@@ -21,6 +21,12 @@ public interface ILiquidDefinition {
@ZenOperator(OperatorType.MUL)
public ILiquidStack asStack(int millibuckets);
+ @ZenGetter("name")
+ public String getName();
+
+ @ZenGetter("displayName")
+ public String getDisplayName();
+
@ZenGetter("luminosity")
public int getLuminosity();
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidStack.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidStack.java
index 2aabf47..90d090a 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidStack.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/liquid/ILiquidStack.java
@@ -20,6 +20,12 @@ public interface ILiquidStack {
@ZenGetter("definition")
public ILiquidDefinition getDefinition();
+ @ZenGetter("name")
+ public String getName();
+
+ @ZenGetter("displayName")
+ public String getDisplayName();
+
@ZenGetter("amount")
public int getAmount();
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/player/IPlayer.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/player/IPlayer.java
new file mode 100644
index 0000000..2931462
--- /dev/null
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/player/IPlayer.java
@@ -0,0 +1,28 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.minecraft.player;
+
+import minetweaker.minecraft.data.IData;
+import stanhebben.zenscript.annotations.ZenClass;
+import stanhebben.zenscript.annotations.ZenGetter;
+import stanhebben.zenscript.annotations.ZenMethod;
+
+/**
+ *
+ * @author Stan
+ */
+@ZenClass("minecraft.player.IPlayer")
+public interface IPlayer {
+ @ZenGetter("name")
+ public String getName();
+
+ @ZenGetter("data")
+ public IData getData();
+
+ @ZenMethod
+ public void update(IData data);
+}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ICraftingInventory.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ICraftingInventory.java
index 2a973b6..7fa8ed9 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ICraftingInventory.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ICraftingInventory.java
@@ -26,6 +26,9 @@ public interface ICraftingInventory {
@ZenGetter("height")
public int getHeight();
+ @ZenGetter("stackCount")
+ public int getStackCount();
+
@ZenMethod
public IItemStack getStack(int i);
diff --git a/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ShapedRecipe.java b/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ShapedRecipe.java
index 5fbdd33..39699f9 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ShapedRecipe.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/minecraft/recipes/ShapedRecipe.java
@@ -63,6 +63,12 @@ public class ShapedRecipe {
this.width = width1;
this.height = height1;
this.mirrored = mirrored;
+
+ System.out.println("ShapedRecipe width=" + width + ", height=" + height);
+ System.out.println("Ingredients: ");
+ for (int i = 0; i < ingredients.length; i++) {
+ System.out.println("(" + posx[i] + ", " + posy[i] + "): " + this.ingredients[i]);
+ }
}
public int getWidth() {
@@ -94,19 +100,12 @@ public class ShapedRecipe {
}
public boolean matches(ICraftingInventory inventory) {
- int numItems = 0;
- for (int i = 0; i < inventory.getSize(); i++) {
- if (inventory.getStack(i) != null) {
- numItems++;
- }
- }
-
- if (numItems != ingredients.length) {
+ if (inventory.getStackCount() != ingredients.length) {
return false;
}
- for (int i = 0; i < inventory.getWidth() - width; i++) {
- out: for (int j = 0; j < inventory.getHeight() - height; j++) {
+ for (int i = 0; i <= inventory.getWidth() - width; i++) {
+ out: for (int j = 0; j <= inventory.getHeight() - height; j++) {
for (int k = 0; k < ingredients.length; k++) {
IItemStack item = inventory.getStack(posx[k] + i, posy[k] + j);
if (item == null) continue out;
@@ -119,8 +118,8 @@ public class ShapedRecipe {
}
if (mirrored) {
- for (int i = 0; i < inventory.getWidth() - width; i++) {
- out: for (int j = 0; j < inventory.getHeight() - height; j++) {
+ for (int i = 0; i <= inventory.getWidth() - width; i++) {
+ out: for (int j = 0; j <= inventory.getHeight() - height; j++) {
for (int k = 0; k < ingredients.length; k++) {
IItemStack item = inventory.getStack(inventory.getWidth() - (posx[k] + i), posy[k] + j);
if (item == null) continue out;
@@ -139,8 +138,8 @@ public class ShapedRecipe {
public IItemStack getCraftingResult(ICraftingInventory inventory) {
IItemStack[] stacks = new IItemStack[ingredients.length];
- for (int i = 0; i < inventory.getWidth() - width; i++) {
- out: for (int j = 0; j < inventory.getHeight() - height; j++) {
+ for (int i = 0; i <= inventory.getWidth() - width; i++) {
+ out: for (int j = 0; j <= inventory.getHeight() - height; j++) {
for (int k = 0; k < ingredients.length; k++) {
IItemStack item = inventory.getStack(posx[k] + i, posy[k] + j);
if (item == null) continue out;
@@ -154,8 +153,8 @@ public class ShapedRecipe {
}
if (mirrored) {
- for (int i = 0; i < inventory.getWidth() - width; i++) {
- out: for (int j = 0; j < inventory.getHeight() - height; j++) {
+ for (int i = 0; i <= inventory.getWidth() - width; i++) {
+ out: for (int j = 0; j <= inventory.getHeight() - height; j++) {
for (int k = 0; k < ingredients.length; k++) {
IItemStack item = inventory.getStack(inventory.getWidth() - (posx[k] + i), posy[k] + j);
if (item == null) continue out;
diff --git a/MineTweaker3-API/src/main/java/minetweaker/runtime/GlobalRegistry.java b/MineTweaker3-API/src/main/java/minetweaker/runtime/GlobalRegistry.java
index 04bd411..13d8a75 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/runtime/GlobalRegistry.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/runtime/GlobalRegistry.java
@@ -18,7 +18,21 @@ import java.util.logging.Logger;
import minetweaker.IBracketHandler;
import minetweaker.IRecipeRemover;
import minetweaker.MineTweakerAPI;
+import minetweaker.minecraft.data.IData;
+import minetweaker.minecraft.item.Condition;
import minetweaker.minecraft.item.IIngredient;
+import minetweaker.minecraft.item.IItemCondition;
+import minetweaker.minecraft.item.IItemDefinition;
+import minetweaker.minecraft.item.IItemStack;
+import minetweaker.minecraft.item.IItemTransformer;
+import minetweaker.minecraft.item.Transform;
+import minetweaker.minecraft.liquid.ILiquidDefinition;
+import minetweaker.minecraft.liquid.ILiquidStack;
+import minetweaker.minecraft.oredict.IOreDict;
+import minetweaker.minecraft.oredict.IOreDictEntry;
+import minetweaker.minecraft.recipes.ICraftingInventory;
+import minetweaker.minecraft.recipes.IFurnaceManager;
+import minetweaker.minecraft.recipes.IRecipeFunction;
import stanhebben.zenscript.IZenErrorLogger;
import stanhebben.zenscript.TypeExpansion;
import stanhebben.zenscript.annotations.ZenExpansion;
@@ -27,11 +41,12 @@ import stanhebben.zenscript.compiler.IEnvironmentGlobal;
import stanhebben.zenscript.compiler.TypeRegistry;
import stanhebben.zenscript.expression.partial.IPartialExpression;
import stanhebben.zenscript.parser.Token;
-import stanhebben.zenscript.symbols.IZenCompileEnvironment;
+import stanhebben.zenscript.IZenCompileEnvironment;
import stanhebben.zenscript.symbols.IZenSymbol;
import stanhebben.zenscript.symbols.SymbolJavaStaticField;
import stanhebben.zenscript.symbols.SymbolJavaStaticMethod;
import stanhebben.zenscript.symbols.SymbolPackage;
+import stanhebben.zenscript.symbols.SymbolType;
import stanhebben.zenscript.type.ZenType;
import stanhebben.zenscript.type.ZenTypeNative;
import stanhebben.zenscript.type.natives.JavaMethod;
@@ -46,7 +61,7 @@ public class GlobalRegistry {
private static final List removers = new ArrayList();
private static final List bracketHandlers = new ArrayList();
private static final TypeRegistry types = new TypeRegistry();
- private static final SymbolPackage root = new SymbolPackage();
+ private static final SymbolPackage root = new SymbolPackage("");
private static final IZenErrorLogger errors = new MyErrorLogger();
private static final IZenCompileEnvironment environment = new MyCompileEnvironment();
private static final Map expansions = new HashMap();
@@ -73,7 +88,7 @@ public class GlobalRegistry {
registerExpansion(ExpandShort.class);
registerExpansion(ExpandString.class);*/
- /*registerNativeClass(IData.class);
+ registerNativeClass(IData.class);
registerNativeClass(IIngredient.class);
registerNativeClass(IItemCondition.class);
@@ -91,7 +106,7 @@ public class GlobalRegistry {
registerNativeClass(ICraftingInventory.class);
registerNativeClass(IFurnaceManager.class);
- registerNativeClass(IRecipeFunction.class);*/
+ registerNativeClass(IRecipeFunction.class);
}
private GlobalRegistry() {}
@@ -126,7 +141,7 @@ public class GlobalRegistry {
ZenTypeNative type = new ZenTypeNative(cls);
type.complete(types);
- root.put(type.getName(), root, errors);
+ root.put(type.getName(), new SymbolType(type), errors);
}
public static TypeRegistry getTypeRegistry() {
@@ -285,12 +300,12 @@ public class GlobalRegistry {
@Override
public void error(ZenPosition position, String message) {
- MineTweakerAPI.logger.logError("[" + position.getFile() + ":" + position.getLine() + "] Error: " + message);
+ MineTweakerAPI.logger.logError(position.toString() + " > " + message);
}
@Override
public void warning(ZenPosition position, String message) {
- MineTweakerAPI.logger.logWarning("[" + position.getFile() + ":" + position.getLine() + "] Warning: " + message);
+ MineTweakerAPI.logger.logWarning(position.toString() + " > " + message);
}
}
}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/runtime/ILogger.java b/MineTweaker3-API/src/main/java/minetweaker/runtime/ILogger.java
index afa7841..2d5fcda 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/runtime/ILogger.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/runtime/ILogger.java
@@ -13,6 +13,9 @@ import stanhebben.zenscript.annotations.ZenMethod;
* @author Stan
*/
public interface ILogger {
+ @ZenMethod
+ public void logCommand(String message);
+
@ZenMethod
public void logInfo(String message);
diff --git a/MineTweaker3-API/src/main/java/minetweaker/runtime/IMineTweaker.java b/MineTweaker3-API/src/main/java/minetweaker/runtime/IMineTweaker.java
index c97fefe..65cdf3a 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/runtime/IMineTweaker.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/runtime/IMineTweaker.java
@@ -45,12 +45,22 @@ public interface IMineTweaker {
public List rollback();
/**
- * Registers a script provider.
+ * Sets the script provider.
*
* @param provider
* @return
*/
- public Closeable registerScriptProvider(IScriptProvider provider);
+ public void setScriptProvider(IScriptProvider provider);
+ /**
+ * Executes all scripts provided by the script provider.
+ */
public void load();
+
+ /**
+ * Retrieves the data from the scripts that were loaded last.
+ *
+ * @return scripts data
+ */
+ public byte[] getScriptData();
}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/runtime/Tweaker.java b/MineTweaker3-API/src/main/java/minetweaker/runtime/Tweaker.java
index 06ac5dc..ebc759a 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/runtime/Tweaker.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/runtime/Tweaker.java
@@ -7,7 +7,6 @@
package minetweaker.runtime;
import java.io.BufferedInputStream;
-import java.io.Closeable;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
@@ -21,13 +20,14 @@ import java.util.Set;
import minetweaker.IUndoableAction;
import minetweaker.MineTweakerAPI;
import minetweaker.minecraft.item.IIngredient;
-import minetweaker.minecraft.util.CloseablePriorityList;
+import minetweaker.runtime.providers.ScriptProviderMemory;
import stanhebben.zenscript.ZenModule;
import static stanhebben.zenscript.ZenModule.compileScripts;
import static stanhebben.zenscript.ZenModule.extractClassName;
import stanhebben.zenscript.ZenParsedFile;
import stanhebben.zenscript.ZenTokener;
import stanhebben.zenscript.compiler.IEnvironmentGlobal;
+import stanhebben.zenscript.parser.ParseException;
/**
*
@@ -35,14 +35,17 @@ import stanhebben.zenscript.compiler.IEnvironmentGlobal;
* @author Stan Hebben
*/
public class Tweaker implements IMineTweaker {
- private final CloseablePriorityList scriptProviders = new CloseablePriorityList();
private final List actions = new ArrayList();
private final Set wereStuck = new HashSet();
+ private IScriptProvider scriptProvider;
+ private byte[] scriptData;
+
@Override
public void apply(IUndoableAction action) {
MineTweakerAPI.logger.logInfo(action.describe());
action.apply();
+ actions.add(action);
}
@Override
@@ -68,49 +71,65 @@ public class Tweaker implements IMineTweaker {
}
@Override
- public Closeable registerScriptProvider(IScriptProvider provider) {
- return scriptProviders.add(provider);
+ public void setScriptProvider(IScriptProvider provider) {
+ scriptProvider = provider;
}
@Override
public void load() {
+ scriptData = ScriptProviderMemory.collect(scriptProvider);
Set executed = new HashSet();
-
- for (IScriptProvider provider : scriptProviders) {
- Iterator scripts = provider.getScripts();
- while (scripts.hasNext()) {
- IScriptIterator script = scripts.next();
-
- if (!executed.contains(script.getGroupName())) {
- executed.add(script.getGroupName());
-
- Map classes = new HashMap();
- IEnvironmentGlobal environmentGlobal = GlobalRegistry.makeGlobalEnvironment(classes);
-
- List files = new ArrayList();
-
- while (script.next()) {
- try {
- String filename = script.getName();
-
- String className = extractClassName(filename);
- Reader reader = new InputStreamReader(new BufferedInputStream(script.open()));
- ZenTokener parser = new ZenTokener(reader, environmentGlobal.getEnvironment());
- ZenParsedFile pfile = new ZenParsedFile(filename, className, parser, environmentGlobal);
- files.add(pfile);
- reader.close();
- } catch (IOException ex) {
- MineTweakerAPI.logger.logError("Could not load script " + script.getName() + ": " + ex.getMessage());
- }
+ Iterator scripts = scriptProvider.getScripts();
+ while (scripts.hasNext()) {
+ IScriptIterator script = scripts.next();
+
+ if (!executed.contains(script.getGroupName())) {
+ executed.add(script.getGroupName());
+
+ Map classes = new HashMap();
+ IEnvironmentGlobal environmentGlobal = GlobalRegistry.makeGlobalEnvironment(classes);
+
+ List files = new ArrayList();
+
+ while (script.next()) {
+ Reader reader = null;
+ try {
+ reader = new InputStreamReader(new BufferedInputStream(script.open()));
+
+ String filename = script.getName();
+ String className = extractClassName(filename);
+
+ ZenTokener parser = new ZenTokener(reader, environmentGlobal.getEnvironment());
+ ZenParsedFile pfile = new ZenParsedFile(filename, className, parser, environmentGlobal);
+ files.add(pfile);
+ } catch (IOException ex) {
+ MineTweakerAPI.logger.logError("Could not load script " + script.getName() + ": " + ex.getMessage());
+ } catch (ParseException ex) {
+ MineTweakerAPI.logger.logError("Error parsing " + ex.getFile() + ":" + ex.getLine() + " -- " + ex.getExplanation());
+ } catch (Exception ex) {
+ MineTweakerAPI.logger.logError("Error loading " + script.getName() + ": " + ex.getMessage());
+ ex.printStackTrace();
}
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException ex) {}
+ }
+ }
+
+ try {
String filename = script.getGroupName();
+ System.out.println("MineTweaker: Loading " + filename);
compileScripts(filename, files, environmentGlobal);
-
+
// execute scripts
- ZenModule module = new ZenModule(classes);
+ ZenModule module = new ZenModule(classes, MineTweakerAPI.class.getClassLoader());
module.getMain().run();
+ } catch (Exception ex) {
+ MineTweakerAPI.logger.logError("Error executing " + script.getGroupName() + ": " + ex.getMessage());
+ ex.printStackTrace();
}
}
}
@@ -122,4 +141,9 @@ public class Tweaker implements IMineTweaker {
}
}
}
+
+ @Override
+ public byte[] getScriptData() {
+ return scriptData;
+ }
}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderCascade.java b/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderCascade.java
new file mode 100644
index 0000000..4070bbb
--- /dev/null
+++ b/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderCascade.java
@@ -0,0 +1,74 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.runtime.providers;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import minetweaker.runtime.IScriptIterator;
+import minetweaker.runtime.IScriptProvider;
+
+/**
+ *
+ * @author Stan Hebben
+ */
+public class ScriptProviderCascade implements IScriptProvider {
+ private final IScriptProvider[] providers;
+
+ public ScriptProviderCascade(IScriptProvider... providers) {
+ this.providers = providers;
+ }
+
+ @Override
+ public Iterator getScripts() {
+ return new MyScripterator();
+ }
+
+ private class MyScripterator implements Iterator {
+ private final Set executed = new HashSet();
+
+ private int currentIndex = providers.length - 1;
+ private Iterator current;
+ private IScriptIterator currentValue;
+
+ public MyScripterator() {
+ currentIndex = providers.length - 1;
+ current = providers[currentIndex].getScripts();
+
+ advance();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return currentIndex >= 0;
+ }
+
+ @Override
+ public IScriptIterator next() {
+ IScriptIterator result = currentValue;
+ executed.add(result.getGroupName());
+
+ advance();
+
+ return result;
+ }
+
+ private void advance() {
+ do {
+ while (!current.hasNext()) {
+ currentIndex--;
+ if (currentIndex < 0) return;
+
+ current = providers[currentIndex].getScripts();
+ }
+ if (currentIndex < 0) break;
+
+ currentValue = current.next();
+ } while (executed.contains(currentValue.getGroupName()) && hasNext());
+ }
+ }
+}
diff --git a/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderMemory.java b/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderMemory.java
index 61dda12..5631211 100644
--- a/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderMemory.java
+++ b/MineTweaker3-API/src/main/java/minetweaker/runtime/providers/ScriptProviderMemory.java
@@ -31,33 +31,31 @@ import minetweaker.runtime.IScriptProvider;
* @author Stan
*/
public class ScriptProviderMemory implements IScriptProvider {
- public static byte[] collect(Iterable providers) {
+ public static byte[] collect(IScriptProvider provider) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
try {
DeflaterOutputStream deflater = new DeflaterOutputStream(output);
DataOutputStream deflaterData = new DataOutputStream(deflater);
Set executed = new HashSet();
- for (IScriptProvider provider : providers) {
- Iterator scripts = provider.getScripts();
- while (scripts.hasNext()) {
- IScriptIterator script = scripts.next();
-
- if (!executed.contains(script.getGroupName())) {
- executed.add(script.getGroupName());
-
- deflaterData.writeUTF(script.getGroupName());
-
- while (script.next()) {
- String name = script.getName();
- byte[] data = FileUtil.read(script.open());
- deflaterData.writeUTF(name);
- deflaterData.writeInt(data.length);
- deflaterData.write(data);
- }
-
- deflaterData.writeUTF("");
+ Iterator scripts = provider.getScripts();
+ while (scripts.hasNext()) {
+ IScriptIterator script = scripts.next();
+
+ if (!executed.contains(script.getGroupName())) {
+ executed.add(script.getGroupName());
+
+ deflaterData.writeUTF(script.getGroupName());
+
+ while (script.next()) {
+ String name = script.getName();
+ byte[] data = FileUtil.read(script.open());
+ deflaterData.writeUTF(name);
+ deflaterData.writeInt(data.length);
+ deflaterData.write(data);
}
+
+ deflaterData.writeUTF("");
}
}
diff --git a/MineTweaker3-MC17-Main/build.gradle b/MineTweaker3-MC17-Main/build.gradle
index e3c60b8..abdc042 100644
--- a/MineTweaker3-MC17-Main/build.gradle
+++ b/MineTweaker3-MC17-Main/build.gradle
@@ -26,3 +26,9 @@ dependencies {
compile project(':MineTweaker3-API')
}
}
+
+jar {
+ manifest {
+ attributes 'FMLCorePlugin': 'minetweaker.mc172.transformer.MineTweakerTransformer'
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java
new file mode 100644
index 0000000..9dacaa5
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/FMLEventHandler.java
@@ -0,0 +1,23 @@
+package minetweaker.mc172;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent;
+import minetweaker.MineTweakerAPI;
+import minetweaker.mc172.network.MineTweakerLoadScriptsPacket;
+import net.minecraft.entity.player.EntityPlayerMP;
+
+/**
+ *
+ * @author Stan
+ */
+public class FMLEventHandler {
+ @SubscribeEvent
+ public void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent ev) {
+ if (ev.player instanceof EntityPlayerMP) {
+ EntityPlayerMP player = (EntityPlayerMP) ev.player;
+ MineTweakerMod.NETWORK.sendTo(
+ new MineTweakerLoadScriptsPacket(MineTweakerAPI.tweaker.getScriptData()),
+ player);
+ }
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java
new file mode 100644
index 0000000..fbda5ec
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/ForgeEventHandler.java
@@ -0,0 +1,21 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.common.gameevent.PlayerEvent;
+
+/**
+ *
+ * @author Stan
+ */
+public class ForgeEventHandler {
+ @SubscribeEvent
+ public void onCrafted(PlayerEvent.ItemCraftedEvent ev) {
+
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java
index ad49214..20b6ccd 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerCommand.java
@@ -2,11 +2,20 @@ package minetweaker.mc172;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import minetweaker.MineTweakerAPI;
+import minetweaker.mc172.item.TweakerItemStack;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
import net.minecraft.util.ChatComponentText;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.oredict.OreDictionary;
import stanhebben.zenscript.util.StringUtil;
/**
@@ -43,7 +52,21 @@ public class MineTweakerCommand implements ICommand {
public String getCommandUsage(ICommandSender icommandsender) {
return StringUtil.join(new String[] {
"",
- "minetweaker name [:]",
+ "minetweaker reload",
+ " Reloads all scripts",
+ "minetweaker names",
+ " Outputs a list of all item names in the game to the minetweaker log",
+ "minetweaker liquids",
+ " Outputs a list of all liquid names in the game to the minetweaker log",
+ "minetweaker inventory",
+ " Lists all items in your inventory",
+ "minetweaker hand",
+ " Outputs the name of the item in your hand",
+ "minetweaker oredict",
+ " Outputs all ore dictionary entries in the game to the minetweaker log",
+ "minetweaker oredict ",
+ " Outputs all items in the given ore dictionary entry to the minetweaker log"
+/* "minetweaker name [:]",
" Prints the unlocalized name of the specified item," +
" can be used as item or block name",
"minetweaker liquid [:]",
@@ -66,7 +89,7 @@ public class MineTweakerCommand implements ICommand {
"minetweaker logdamage=off",
" Disables damage logging",
"minetweaker reload",
- " Reloads the server script"
+ " Reloads the server script"*/
}, "\n");
}
@@ -84,6 +107,94 @@ public class MineTweakerCommand implements ICommand {
if (arguments[0].equals("reload")) {
MineTweakerAPI.tweaker.load();
+
+ String message = "Scripts have been reloaded";
+ MineTweakerAPI.logger.logCommand(message);
+ sendChatMessage(icommandsender, message);
+ } else if (arguments[0].equals("names")) {
+ for (Object okey : Item.itemRegistry.getKeys()) {
+ String key = (String) okey;
+ Item item = (Item) Item.itemRegistry.getObject(key);
+
+ String message = "<" + key + "> -- " + new ItemStack(item, 1, 0).getDisplayName();
+ MineTweakerAPI.logger.logCommand(message);
+ }
+ sendChatMessage(icommandsender, "List generated; see minetweaker.log in your minecraft dir");
+ } else if (arguments[0].equals("liquids")) {
+ for (Map.Entry entry : FluidRegistry.getRegisteredFluids().entrySet()) {
+ String message = " -- " + entry.getValue().getLocalizedName();
+ MineTweakerAPI.logger.logCommand(message);
+ sendChatMessage(icommandsender, "List generated; see minetweaker.log in your minecraft dir");
+ }
+ } else if (arguments[0].equals("inventory")) {
+ if (icommandsender instanceof EntityPlayer) {
+ InventoryPlayer inventory = ((EntityPlayer) icommandsender).inventory;
+ for(int i = 0; i < inventory.getSizeInventory(); i++) {
+ ItemStack stack = inventory.getStackInSlot(i);
+ if (stack != null) {
+ StringBuilder description = new StringBuilder();
+ description.append('<');
+ description.append(Item.itemRegistry.getNameForObject(stack.getItem()));
+ if (stack.getItemDamage() > 0) {
+ description.append(':').append(stack.getItemDamage());
+ }
+ description.append('>');
+
+ if (stack.stackSize != 1) {
+ description.append('*').append(stack.stackSize);
+ }
+
+ sendChatMessage(icommandsender, new TweakerItemStack(stack).toString());
+ }
+ }
+ } else {
+ sendChatMessage(icommandsender, "Inventory command can only be executed by players");
+ }
+ } else if (arguments[0].equals("hand")) {
+ if (icommandsender instanceof EntityPlayer) {
+ InventoryPlayer inventory = ((EntityPlayer) icommandsender).inventory;
+ ItemStack stack = inventory.getCurrentItem();
+ if (stack != null) {
+ StringBuilder description = new StringBuilder();
+ description.append('<');
+ description.append(Item.itemRegistry.getNameForObject(stack.getItem()));
+ if (stack.getItemDamage() > 0) {
+ description.append(':').append(stack.getItemDamage());
+ }
+ description.append('>');
+
+ if (stack.stackSize != 1) {
+ description.append('*').append(stack.stackSize);
+ }
+
+ sendChatMessage(icommandsender, new TweakerItemStack(stack).toString());
+ }
+ } else {
+ sendChatMessage(icommandsender, "Hand command can only be executed by players");
+ }
+ } else if (arguments[0].equals("oredict")) {
+ if (arguments.length > 2) {
+ String entryName = arguments[2];
+ List ores = OreDictionary.getOres(entryName);
+ if (ores.isEmpty()) {
+ sendChatMessage(icommandsender, "Entry doesn't exist");
+ return;
+ } else {
+ MineTweakerAPI.logger.logCommand("Ore entries for " + entryName + ":");
+ for (ItemStack ore : ores) {
+ MineTweakerAPI.logger.logCommand(" " + new TweakerItemStack(ore).toString());
+ }
+ }
+ } else {
+ for (String entryName : OreDictionary.getOreNames()) {
+ MineTweakerAPI.logger.logCommand("Ore entries for " + entryName + ":");
+ List ores = OreDictionary.getOres(entryName);
+ for (ItemStack ore : ores) {
+ MineTweakerAPI.logger.logCommand(" " + new TweakerItemStack(ore).toString());
+ }
+ }
+ }
+ sendChatMessage(icommandsender, "List generated; see minetweaker.log in your minecraft dir");
}
/*if (arguments[0].equals("name")) {
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java
new file mode 100644
index 0000000..9df1132
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerLogger.java
@@ -0,0 +1,90 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172;
+
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import minetweaker.runtime.ILogger;
+
+/**
+ *
+ * @author Stan
+ */
+public class MineTweakerLogger implements ILogger {
+ private Writer writer;
+
+ public MineTweakerLogger() {
+ File logFile = new File("minetweaker.log");
+ if (logFile.exists()) logFile.delete();
+
+ try {
+ writer = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(logFile)));
+ } catch (IOException ex) {
+
+ }
+ }
+
+ @Override
+ public void logCommand(String message) {
+ try {
+ writer.append("COMMAND: ");
+ writer.append(message);
+ writer.append('\n');
+ writer.flush();
+ } catch (IOException ex) {
+
+ }
+
+ System.out.println("COMMAND: " + message);
+ }
+
+ @Override
+ public void logInfo(String message) {
+ try {
+ writer.append("INFO: ");
+ writer.append(message);
+ writer.append('\n');
+ writer.flush();
+ } catch (IOException ex) {
+
+ }
+
+ System.out.println("INFO: " + message);
+ }
+
+ @Override
+ public void logWarning(String message) {
+ try {
+ writer.append("WARNING: ");
+ writer.append(message);
+ writer.append('\n');
+ writer.flush();
+ } catch (IOException ex) {
+
+ }
+
+ System.out.println("WARNING: " + message);
+ }
+
+ @Override
+ public void logError(String message) {
+ try {
+ writer.append("ERROR: ");
+ writer.append(message);
+ writer.append('\n');
+ writer.flush();
+ } catch (IOException ex) {
+
+ }
+
+ System.out.println("ERROR: " + message);
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java
index 39f8533..7926dff 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/MineTweakerMod.java
@@ -6,31 +6,63 @@
package minetweaker.mc172;
+import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.Mod.EventHandler;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.event.FMLServerAboutToStartEvent;
+import cpw.mods.fml.common.event.FMLServerStartingEvent;
+import cpw.mods.fml.common.network.NetworkRegistry;
+import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper;
+import cpw.mods.fml.relauncher.Side;
+import java.io.File;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
import java.util.List;
import minetweaker.MineTweakerAPI;
import minetweaker.annotations.ModOnly;
+import minetweaker.mc172.brackets.ItemBracketHandler;
+import minetweaker.mc172.brackets.LiquidBracketHandler;
+import minetweaker.mc172.network.MineTweakerLoadScriptsHandler;
+import minetweaker.mc172.network.MineTweakerLoadScriptsPacket;
import minetweaker.mc172.oredict.OreDict;
import minetweaker.mc172.recipes.MTRecipeManager;
+import minetweaker.mc172.util.MineTweakerHacks;
+import minetweaker.runtime.IScriptProvider;
+import minetweaker.runtime.providers.ScriptProviderCascade;
+import minetweaker.runtime.providers.ScriptProviderDirectory;
+import net.minecraftforge.common.MinecraftForge;
/**
- *
- * @author Stanneke
+ * Main mod class. Performs some general logic, initialization of the API and
+ * FML event handling.
+ *
+ * @author Stan Hebben
*/
@Mod(modid = MineTweakerMod.MODID, version = MineTweakerMod.MCVERSION + "-3.0.0")
public class MineTweakerMod {
public static final String MODID = "MineTweaker";
public static final String MCVERSION = "1.7.2";
+ public static final SimpleNetworkWrapper NETWORK = NetworkRegistry.INSTANCE.newSimpleChannel(MODID);
+
+ static {
+ NETWORK.registerMessage(MineTweakerLoadScriptsHandler.class, MineTweakerLoadScriptsPacket.class, 0, Side.CLIENT);
+ }
+
@Mod.Instance(MODID)
- public static MineTweakerMod instance;
+ public static MineTweakerMod INSTANCE;
+
+ private final IScriptProvider scriptsGlobal;
+
+ private boolean iAmServer = false;
public MineTweakerMod() {
MineTweakerAPI.oreDict = new OreDict();
MineTweakerAPI.recipes = new MTRecipeManager();
+ MineTweakerAPI.logger = new MineTweakerLogger();
List classes = new ArrayList();
MineTweakerRegistry.getClasses(classes);
@@ -47,5 +79,64 @@ public class MineTweakerMod {
MineTweakerAPI.registerClass(cls);
}
+
+ File globalDir = new File("scripts");
+ if (!globalDir.exists()) {
+ globalDir.mkdirs();
+ }
+
+ scriptsGlobal = new ScriptProviderDirectory(globalDir);
+ MineTweakerAPI.tweaker.setScriptProvider(scriptsGlobal);
+ }
+
+ public boolean iAmServer() {
+ return iAmServer;
+ }
+
+ /**
+ * Reloads all scripts.
+ */
+ public void reload() {
+ MineTweakerAPI.tweaker.rollback();
+ MineTweakerAPI.tweaker.load();
+ }
+
+ // ##########################
+ // ### FML Event Handlers ###
+ // ##########################
+
+ @EventHandler
+ public void onLoad(FMLPreInitializationEvent ev) {
+ MinecraftForge.EVENT_BUS.register(new FMLEventHandler());
+ FMLCommonHandler.instance().bus().register(new FMLEventHandler());
+ }
+
+ @EventHandler
+ public void onPostInit(FMLPostInitializationEvent ev) {
+ MineTweakerAPI.registerBracketHandler(new ItemBracketHandler());
+ MineTweakerAPI.registerBracketHandler(new LiquidBracketHandler());
+ }
+
+ @EventHandler
+ public void onServerAboutToStart(FMLServerAboutToStartEvent ev) {
+ // starts before loading worlds
+ // perfect place to start MineTweaker!
+
+ File scriptsDir = new File(MineTweakerHacks.getWorldDirectory(ev.getServer()), "scripts");
+ if (!scriptsDir.exists()) {
+ scriptsDir.mkdir();
+ }
+
+ iAmServer = true;
+
+ IScriptProvider scriptsLocal = new ScriptProviderDirectory(scriptsDir);
+ IScriptProvider cascaded = new ScriptProviderCascade(scriptsGlobal, scriptsLocal);
+ MineTweakerAPI.tweaker.setScriptProvider(cascaded);
+ reload();
+ }
+
+ @EventHandler
+ public void onServerStarting(FMLServerStartingEvent ev) {
+ ev.registerServerCommand(new MineTweakerCommand());
}
}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java
new file mode 100644
index 0000000..6d8b733
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/ItemBracketHandler.java
@@ -0,0 +1,122 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172.brackets;
+
+import java.util.List;
+import minetweaker.IBracketHandler;
+import minetweaker.MineTweakerAPI;
+import minetweaker.annotations.BracketHandler;
+import minetweaker.mc172.item.TweakerItemStack;
+import minetweaker.minecraft.item.IItemStack;
+import minetweaker.minecraft.item.IngredientAny;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.oredict.OreDictionary;
+import stanhebben.zenscript.ZenTokener;
+import stanhebben.zenscript.expression.ExpressionInt;
+import stanhebben.zenscript.expression.ExpressionJavaCallStatic;
+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.ZenType;
+import stanhebben.zenscript.type.natives.JavaMethod;
+import stanhebben.zenscript.util.ZenPosition;
+
+/**
+ *
+ * @author Stan
+ */
+@BracketHandler(priority=100)
+public class ItemBracketHandler implements IBracketHandler {
+ public static IItemStack getItem(String name, int meta) {
+ Item item = (Item) Item.itemRegistry.getObject(name);
+ if (item != null) {
+ return new TweakerItemStack(new ItemStack(item, 1, meta), true);
+ } else {
+ return null;
+ }
+ }
+
+ private final IZenSymbol symbolAny;
+ private final JavaMethod method;
+
+ public ItemBracketHandler() {
+ symbolAny = MineTweakerAPI.getJavaStaticFieldSymbol(IngredientAny.class, "INSTANCE");
+ method = MineTweakerAPI.getJavaMethod(
+ ItemBracketHandler.class,
+ "getItem",
+ String.class, int.class);
+ }
+
+ @Override
+ public IZenSymbol resolve(List tokens) {
+ // any symbol
+ if (tokens.size() == 1 && tokens.get(0).getValue().equals("*")) {
+ return symbolAny;
+ }
+
+ // detect special cases:
+ // item: at the start means item-specific syntax
+ // :xxx with xxx an integer means sub-item syntax
+ // :* means any-subitem-syntax
+ int fromIndex = 0;
+ int toIndex = tokens.size();
+ int meta = 0;
+
+ if (tokens.size() > 2) {
+ if (tokens.get(0).getValue().equals("item") && tokens.get(1).getValue().equals(":")) {
+ fromIndex = 2;
+ }
+ if (tokens.get(tokens.size() - 1).getType() == ZenTokener.T_INTVALUE
+ && tokens.get(tokens.size() - 2).getValue().equals(":")) {
+ toIndex = tokens.size() - 2;
+ meta = Integer.parseInt(tokens.get(tokens.size() - 1).getValue());
+ } else if (tokens.get(tokens.size() - 1).getValue().equals("*")
+ && tokens.get(tokens.size() - 2).getValue().equals(":")) {
+ toIndex = tokens.size() - 2;
+ meta = OreDictionary.WILDCARD_VALUE;
+ }
+ }
+
+ return find(tokens, fromIndex, toIndex, meta);
+ }
+
+ private IZenSymbol find(List tokens, int startIndex, int endIndex, int meta) {
+ StringBuilder valueBuilder = new StringBuilder();
+ for (int i = startIndex; i < endIndex; i++) {
+ Token token = tokens.get(i);
+ valueBuilder.append(token.getValue());
+ }
+
+ Item item = (Item) Item.itemRegistry.getObject(valueBuilder.toString());
+ if (item != null) {
+ return new ItemReferenceSymbol(valueBuilder.toString(), meta);
+ }
+
+ return null;
+ }
+
+ private class ItemReferenceSymbol implements IZenSymbol {
+ private final String name;
+ private final int meta;
+
+ public ItemReferenceSymbol(String name, int meta) {
+ this.name = name;
+ this.meta = meta;
+ }
+
+ @Override
+ public IPartialExpression instance(ZenPosition position) {
+ return new ExpressionJavaCallStatic(
+ position,
+ method,
+ new ExpressionString(position, name),
+ new ExpressionInt(position, meta, ZenType.INT));
+ }
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java
new file mode 100644
index 0000000..6ab4ad7
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/brackets/LiquidBracketHandler.java
@@ -0,0 +1,82 @@
+package minetweaker.mc172.brackets;
+
+import java.util.List;
+import minetweaker.IBracketHandler;
+import minetweaker.annotations.BracketHandler;
+import minetweaker.mc172.liquid.TweakerLiquidStack;
+import minetweaker.minecraft.liquid.ILiquidStack;
+import minetweaker.runtime.GlobalRegistry;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+import stanhebben.zenscript.expression.ExpressionJavaCallStatic;
+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.JavaMethod;
+import stanhebben.zenscript.util.ZenPosition;
+
+/**
+ *
+ * @author Stan
+ */
+@BracketHandler
+public class LiquidBracketHandler implements IBracketHandler {
+ public static ILiquidStack getLiquid(String name) {
+ Fluid fluid = FluidRegistry.getFluid(name);
+ if (fluid != null) {
+ return new TweakerLiquidStack(new FluidStack(fluid, 1));
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public IZenSymbol resolve(List tokens) {
+ if (tokens.size() > 2) {
+ if (tokens.get(0).getValue().equals("liquid") && tokens.get(1).getValue().equals(":")) {
+ return find(tokens, 2, tokens.size());
+ }
+ }
+
+ return null;
+ }
+
+ private IZenSymbol find(List 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());
+ }
+
+ Fluid fluid = FluidRegistry.getFluid(valueBuilder.toString());
+ if (fluid != null) {
+ return new LiquidReferenceSymbol(valueBuilder.toString());
+ }
+
+ return null;
+ }
+
+ private class LiquidReferenceSymbol implements IZenSymbol {
+ private final String name;
+
+ public LiquidReferenceSymbol(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public IPartialExpression instance(ZenPosition position) {
+ JavaMethod method = JavaMethod.get(
+ GlobalRegistry.getTypeRegistry(),
+ LiquidBracketHandler.class,
+ "getLiquid",
+ String.class);
+
+ return new ExpressionJavaCallStatic(
+ position,
+ method,
+ new ExpressionString(position, name));
+ }
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java
index 26564ab..57f9cf3 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTConverter.java
@@ -92,7 +92,12 @@ public class NBTConverter implements IDataConverter {
}
}
- private NBTConverter() {}
+ public static void updateMap(NBTTagCompound nbt, IData data) {
+ NBTUpdater updater = new NBTUpdater(nbt);
+ data.convert(updater);
+ }
+
+ public NBTConverter() {}
@Override
public NBTBase fromBool(boolean value) {
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java
new file mode 100644
index 0000000..299ebd2
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/data/NBTUpdater.java
@@ -0,0 +1,47 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172.data;
+
+import java.util.Map;
+import minetweaker.minecraft.data.IData;
+import minetweaker.minecraft.data.IDataConverter;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+
+/**
+ *
+ * @author Stan
+ */
+public class NBTUpdater extends NBTConverter implements IDataConverter {
+ private final NBTTagCompound nbt;
+
+ public NBTUpdater(NBTTagCompound compound) {
+ this.nbt = compound;
+ }
+
+ @Override
+ public NBTBase fromMap(Map map) {
+ for (Map.Entry entry : map.entrySet()) {
+ if (nbt.hasKey(entry.getKey())) {
+ if (entry.getValue() == null) {
+ nbt.removeTag(entry.getKey());
+ } else {
+ if (nbt.getTag(entry.getKey()).getId() == 10) {
+ NBTTagCompound tag = (NBTTagCompound) nbt.getTag(entry.getKey());
+ nbt.setTag(entry.getKey(), entry.getValue().convert(new NBTUpdater(nbt)));
+ } else {
+ nbt.setTag(entry.getKey(), NBTConverter.from(entry.getValue()));
+ }
+ }
+ } else if (entry.getValue() != null) {
+ nbt.setTag(entry.getKey(), from(entry.getValue()));
+ }
+ }
+
+ return nbt;
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/TweakerItemStack.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/TweakerItemStack.java
index 6fd821b..2a9c402 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/TweakerItemStack.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/item/TweakerItemStack.java
@@ -20,6 +20,7 @@ import minetweaker.minecraft.item.IItemTransformer;
import minetweaker.minecraft.item.IngredientItem;
import minetweaker.minecraft.liquid.ILiquidStack;
import minetweaker.minecraft.util.ArrayUtil;
+import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.FluidContainerRegistry;
@@ -34,13 +35,24 @@ public class TweakerItemStack implements IItemStack {
private final ItemStack stack;
private final List items;
private IData tag = null;
+ private boolean wildcardSize;
public TweakerItemStack(ItemStack itemStack) {
- stack = itemStack;
+ if (itemStack == null) throw new IllegalArgumentException("stack cannot be null");
+
+ stack = itemStack.copy();
items = Collections.singletonList(this);
}
+ public TweakerItemStack(ItemStack itemStack, boolean wildcardSize) {
+ this(itemStack);
+
+ this.wildcardSize = wildcardSize;
+ }
+
private TweakerItemStack(ItemStack itemStack, IData tag) {
+ if (itemStack == null) throw new IllegalArgumentException("stack cannot be null");
+
stack = itemStack;
items = Collections.singletonList(this);
this.tag = tag;
@@ -157,7 +169,7 @@ public class TweakerItemStack implements IItemStack {
}
@Override
- public IIngredient amount(int amount) {
+ public IItemStack amount(int amount) {
return withAmount(amount);
}
@@ -179,8 +191,11 @@ public class TweakerItemStack implements IItemStack {
@Override
public boolean matches(IItemStack item) {
ItemStack internal = (ItemStack) item.getInternal();
+ if (internal == null) {
+ throw new RuntimeException("Invalid item: " + item);
+ }
return internal.getItem() == stack.getItem()
- && internal.stackSize == stack.stackSize
+ && (wildcardSize || internal.stackSize == stack.stackSize)
&& (stack.getItemDamage() == OreDictionary.WILDCARD_VALUE || stack.getItemDamage() == internal.getItemDamage());
}
@@ -200,4 +215,32 @@ public class TweakerItemStack implements IItemStack {
public Object getInternal() {
return stack;
}
+
+ // #############################
+ // ### Object implementation ###
+ // #############################
+
+ @Override
+ public String toString() {
+ StringBuilder result = new StringBuilder();
+ result.append('<');
+ result.append(Item.itemRegistry.getNameForObject(stack.getItem()));
+
+ if (stack.getItemDamage() > 0) {
+ result.append(':').append(stack.getItemDamage());
+ }
+ result.append('>');
+
+ if (stack.getTagCompound() != null) {
+ result.append(".withData(");
+ result.append(stack.stackTagCompound.toString());
+ result.append(")");
+ }
+
+ if (!wildcardSize) {
+ result.append(" * ").append(stack.stackSize);
+ }
+
+ return result.toString();
+ }
}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidDefinition.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidDefinition.java
index b52af13..8ae6050 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidDefinition.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidDefinition.java
@@ -23,6 +23,16 @@ public class TweakerLiquidDefinition implements ILiquidDefinition {
public TweakerLiquidDefinition(Fluid fluid) {
this.fluid = fluid;
}
+
+ @Override
+ public String getName() {
+ return fluid.getName();
+ }
+
+ @Override
+ public String getDisplayName() {
+ return fluid.getLocalizedName();
+ }
@Override
public ILiquidStack asStack(int millibuckets) {
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidStack.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidStack.java
index 0006e9f..4416c4e 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidStack.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/liquid/TweakerLiquidStack.java
@@ -34,6 +34,16 @@ public class TweakerLiquidStack implements ILiquidStack {
public ILiquidDefinition getDefinition() {
return new TweakerLiquidDefinition(stack.getFluid());
}
+
+ @Override
+ public String getName() {
+ return stack.getFluid().getName();
+ }
+
+ @Override
+ public String getDisplayName() {
+ return stack.getFluid().getLocalizedName();
+ }
@Override
public int getAmount() {
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java
new file mode 100644
index 0000000..5e04969
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsHandler.java
@@ -0,0 +1,41 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172.network;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
+import cpw.mods.fml.common.network.simpleimpl.MessageContext;
+import minetweaker.MineTweakerAPI;
+import minetweaker.mc172.MineTweakerMod;
+import minetweaker.runtime.providers.ScriptProviderMemory;
+
+/**
+ *
+ * @author Stan
+ */
+public class MineTweakerLoadScriptsHandler implements IMessageHandler {
+ @Override
+ public IMessage onMessage(MineTweakerLoadScriptsPacket message, MessageContext ctx) {
+ if (!MineTweakerMod.INSTANCE.iAmServer()) {
+ /*IScriptProvider scriptProvider = new ScriptProviderMemory(message.getData());
+ Iterator scripts = scriptProvider.getScripts();
+ while (scripts.hasNext()) {
+ IScriptIterator myGroup = scripts.next();
+ System.out.println("Scripts: " + myGroup.getGroupName());
+
+ while (myGroup.next()) {
+ System.out.println("Script name: " + myGroup.getName());
+ }
+ }*/
+ MineTweakerAPI.tweaker.setScriptProvider(new ScriptProviderMemory(message.getData()));
+ MineTweakerAPI.tweaker.rollback();
+ MineTweakerAPI.tweaker.load();
+ }
+
+ return null;
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java
new file mode 100644
index 0000000..6a67480
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/network/MineTweakerLoadScriptsPacket.java
@@ -0,0 +1,43 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172.network;
+
+import cpw.mods.fml.common.network.simpleimpl.IMessage;
+import io.netty.buffer.ByteBuf;
+
+/**
+ *
+ * @author Stan
+ */
+public class MineTweakerLoadScriptsPacket implements IMessage {
+ private byte[] data;
+
+ public MineTweakerLoadScriptsPacket() {
+ // used for deserialization
+ }
+
+ public MineTweakerLoadScriptsPacket(byte[] data) {
+ this.data = data;
+ }
+
+ public byte[] getData() {
+ return data;
+ }
+
+ @Override
+ public void fromBytes(ByteBuf buf) {
+ int size = buf.readInt();
+ data = new byte[size];
+ buf.readBytes(data);
+ }
+
+ @Override
+ public void toBytes(ByteBuf buf) {
+ buf.writeInt(data.length);
+ buf.writeBytes(data);
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/OreDictEntry.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/OreDictEntry.java
index b62c60a..46e0201 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/OreDictEntry.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/oredict/OreDictEntry.java
@@ -34,6 +34,10 @@ public class OreDictEntry implements IOreDictEntry {
this.id = id;
}
+ public OreDictEntry(String id) {
+ this.id = OreDictionary.getOreID(id);
+ }
+
// ####################################
// ### IOreDictEntry implementation ###
// ####################################
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/player/TweakerPlayer.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/player/TweakerPlayer.java
new file mode 100644
index 0000000..455b030
--- /dev/null
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/player/TweakerPlayer.java
@@ -0,0 +1,39 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package minetweaker.mc172.player;
+
+import minetweaker.mc172.data.NBTConverter;
+import minetweaker.minecraft.data.IData;
+import minetweaker.minecraft.player.IPlayer;
+import net.minecraft.entity.player.EntityPlayer;
+
+/**
+ *
+ * @author Stan
+ */
+public class TweakerPlayer implements IPlayer {
+ private final EntityPlayer player;
+
+ public TweakerPlayer(EntityPlayer player) {
+ this.player = player;
+ }
+
+ @Override
+ public String getName() {
+ return player.getCommandSenderName();
+ }
+
+ @Override
+ public IData getData() {
+ return NBTConverter.from(player.getEntityData(), true);
+ }
+
+ @Override
+ public void update(IData data) {
+ NBTConverter.updateMap(player.getEntityData(), data);
+ }
+}
diff --git a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MTRecipeManager.java b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MTRecipeManager.java
index 51e6bb5..367e274 100644
--- a/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MTRecipeManager.java
+++ b/MineTweaker3-MC17-Main/src/main/java/minetweaker/mc172/recipes/MTRecipeManager.java
@@ -1,9 +1,3 @@
-/*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
-
package minetweaker.mc172.recipes;
import minetweaker.minecraft.recipes.ShapedRecipe;
@@ -13,11 +7,17 @@ import java.util.List;
import minetweaker.IUndoableAction;
import minetweaker.MineTweakerAPI;
import minetweaker.mc172.item.TweakerItemStack;
+import minetweaker.mc172.oredict.OreDictEntry;
import minetweaker.mc172.util.MineTweakerHacks;import minetweaker.minecraft.item.IIngredient;
import minetweaker.minecraft.item.IItemStack;
-;
import minetweaker.minecraft.recipes.IRecipeFunction;
import minetweaker.minecraft.recipes.IRecipeManager;
+import net.minecraft.client.Minecraft;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
import net.minecraft.item.crafting.IRecipe;
import net.minecraft.item.crafting.ShapedRecipes;
import net.minecraft.item.crafting.ShapelessRecipes;
@@ -32,7 +32,7 @@ public class MTRecipeManager implements IRecipeManager {
private final List recipes;
public MTRecipeManager() {
- recipes = MineTweakerHacks.getRecipes();
+ recipes = (List) CraftingManager.getInstance().getRecipeList();
}
@Override
@@ -41,13 +41,17 @@ public class MTRecipeManager implements IRecipeManager {
List removeIndex = new ArrayList();
for (int i = 0; i < recipes.size(); i++) {
IRecipe recipe = recipes.get(i);
-
- if (output.matches(new TweakerItemStack(recipe.getRecipeOutput()))) {
- toRemove.add(recipe);
- removeIndex.add(i);
+
+ // certain special recipes have no predefined output. ignore those
+ // since these cannot be removed with MineTweaker scripts
+ if (recipe.getRecipeOutput() != null) {
+ if (output.matches(new TweakerItemStack(recipe.getRecipeOutput()))) {
+ toRemove.add(recipe);
+ removeIndex.add(i);
+ }
}
}
-
+
MineTweakerAPI.tweaker.apply(new ActionRemoveRecipes(toRemove, removeIndex));
return toRemove.size();
}
@@ -78,21 +82,71 @@ public class MTRecipeManager implements IRecipeManager {
@Override
public int removeShaped(IIngredient output, IIngredient[][] ingredients) {
+ int ingredientsWidth = 0;
+ int ingredientsHeight = 0;
+
+ if (ingredients != null) {
+ ingredientsHeight = ingredients.length;
+
+ for (int i = 0; i < ingredients.length; i++) {
+ ingredientsWidth = Math.max(ingredientsWidth, ingredients[i].length);
+ }
+ }
+
List toRemove = new ArrayList();
List removeIndex = new ArrayList();
- for (int i = 0; i < recipes.size(); i++) {
+ outer: for (int i = 0; i < recipes.size(); i++) {
IRecipe recipe = recipes.get(i);
if (!output.matches(new TweakerItemStack(recipe.getRecipeOutput()))) {
continue;
}
- if (recipe instanceof ShapedRecipes) {
- ShapedRecipes srecipe = (ShapedRecipes) recipe;
- // TODO: check contents
- } else if (recipe instanceof ShapedOreRecipe) {
- ShapedOreRecipe srecipe = (ShapedOreRecipe) recipe;
- // TODO: check contents
+ if (ingredients != null) {
+ if (recipe instanceof ShapedRecipes) {
+ ShapedRecipes srecipe = (ShapedRecipes) recipe;
+ if (ingredientsWidth != srecipe.recipeWidth || ingredientsHeight != srecipe.recipeHeight) {
+ continue;
+ }
+
+ for (int j = 0; j < ingredientsHeight; j++) {
+ IIngredient[] row = ingredients[j];
+ for (int k = 0; k < ingredientsWidth; k++) {
+ IIngredient ingredient = k > row.length ? null : row[k];
+ ItemStack recipeIngredient = srecipe.recipeItems[j * srecipe.recipeWidth + k];
+
+ if (!matches(recipeIngredient, ingredient)) {
+ continue outer;
+ }
+ }
+ }
+ } else if (recipe instanceof ShapedOreRecipe) {
+ ShapedOreRecipe srecipe = (ShapedOreRecipe) recipe;
+ int recipeWidth = MineTweakerHacks.getShapedOreRecipeWidth(srecipe);
+ int recipeHeight = srecipe.getRecipeSize() / recipeWidth;
+ if (ingredientsWidth != recipeWidth || ingredientsHeight != recipeHeight) {
+ continue;
+ }
+
+ for (int j = 0; j < ingredientsHeight; j++) {
+ IIngredient[] row = ingredients[j];
+ for (int k = 0; k < ingredientsWidth; k++) {
+ IIngredient ingredient = k > row.length ? null : row[k];
+ Object input = srecipe.getInput()[j * recipeWidth + k];
+ if (!matches(input, ingredient)) {
+ continue outer;
+ }
+ }
+ }
+ }
+ } else {
+ if (recipe instanceof ShapedRecipe) {
+
+ } else if (recipe instanceof ShapedOreRecipe) {
+
+ } else {
+ continue;
+ }
}
toRemove.add(recipe);
@@ -107,31 +161,60 @@ public class MTRecipeManager implements IRecipeManager {
public int removeShapeless(IIngredient output, IIngredient[] ingredients, boolean wildcard) {
List toRemove = new ArrayList();
List removeIndex = new ArrayList();
- for (int i = 0; i < recipes.size(); i++) {
+ outer: for (int i = 0; i < recipes.size(); i++) {
IRecipe recipe = recipes.get(i);
if (!output.matches(new TweakerItemStack(recipe.getRecipeOutput()))) {
continue;
}
- if (recipe instanceof ShapelessRecipes) {
- ShapelessRecipes srecipe = (ShapelessRecipes) recipe;
- // TODO: check contents
- } else if (recipe instanceof ShapelessOreRecipe) {
- ShapelessOreRecipe srecipe = (ShapelessOreRecipe) recipe;
- ArrayList