aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/net/glease/ggfab/BlockIcons.java45
-rw-r--r--src/main/java/net/glease/ggfab/ComponentRecipeLoader.java46
-rw-r--r--src/main/java/net/glease/ggfab/ConfigurationHandler.java51
-rw-r--r--src/main/java/net/glease/ggfab/GGConstants.java15
-rw-r--r--src/main/java/net/glease/ggfab/GGItemList.java197
-rw-r--r--src/main/java/net/glease/ggfab/GigaGramFab.java169
-rw-r--r--src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java99
-rw-r--r--src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java55
-rw-r--r--src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java30
-rw-r--r--src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java153
-rw-r--r--src/main/java/net/glease/ggfab/mte/MTE_AdvAssLine.java1109
-rw-r--r--src/main/java/net/glease/ggfab/mte/MTE_LinkedInputBus.java616
-rw-r--r--src/main/java/net/glease/ggfab/mui/ClickableTextWidget.java55
-rw-r--r--src/main/java/net/glease/ggfab/util/GGUtils.java75
-rw-r--r--src/main/java/net/glease/ggfab/util/OverclockHelper.java75
15 files changed, 2790 insertions, 0 deletions
diff --git a/src/main/java/net/glease/ggfab/BlockIcons.java b/src/main/java/net/glease/ggfab/BlockIcons.java
new file mode 100644
index 0000000000..638b206f44
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/BlockIcons.java
@@ -0,0 +1,45 @@
+package net.glease.ggfab;
+
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.util.IIcon;
+import net.minecraft.util.ResourceLocation;
+
+import gregtech.api.GregTech_API;
+import gregtech.api.interfaces.IIconContainer;
+
+public enum BlockIcons implements IIconContainer, Runnable {
+
+ OVERLAY_FRONT_ADV_ASSLINE_ACTIVE,
+ OVERLAY_FRONT_ADV_ASSLINE_ACTIVE_GLOW,
+ OVERLAY_FRONT_ADV_ASSLINE_STUCK,
+ OVERLAY_FRONT_ADV_ASSLINE_STUCK_GLOW,
+ OVERLAY_FRONT_ADV_ASSLINE,
+ OVERLAY_FRONT_ADV_ASSLINE_GLOW,;
+
+ public static final String RES_PATH = GGConstants.MODID + ":";
+ private IIcon mIcon;
+
+ BlockIcons() {
+ GregTech_API.sGTBlockIconload.add(this);
+ }
+
+ @Override
+ public IIcon getIcon() {
+ return mIcon;
+ }
+
+ @Override
+ public IIcon getOverlayIcon() {
+ return null;
+ }
+
+ @Override
+ public ResourceLocation getTextureFile() {
+ return TextureMap.locationBlocksTexture;
+ }
+
+ @Override
+ public void run() {
+ mIcon = GregTech_API.sBlockIcons.registerIcon(RES_PATH + "iconsets/" + this);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/ComponentRecipeLoader.java b/src/main/java/net/glease/ggfab/ComponentRecipeLoader.java
new file mode 100644
index 0000000000..088ad86025
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/ComponentRecipeLoader.java
@@ -0,0 +1,46 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.GT_Values.RA;
+
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.Fluid;
+import net.minecraftforge.fluids.FluidRegistry;
+import net.minecraftforge.fluids.FluidStack;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+class ComponentRecipeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ Fluid solderIndalloy = FluidRegistry.getFluid("molten.indalloy140") != null
+ ? FluidRegistry.getFluid("molten.indalloy140")
+ : FluidRegistry.getFluid("molten.solderingalloy");
+ RA.addAssemblylineRecipe(
+ ItemList.Machine_Multi_Assemblyline.get(1L),
+ 96000,
+ new Object[] { ItemList.Machine_Multi_Assemblyline.get(1L),
+ new Object[] { OrePrefixes.circuit.get(Materials.Master), 2 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Elite), 4 },
+ new Object[] { OrePrefixes.circuit.get(Materials.Data), 8 },
+ ItemList.Automation_ChestBuffer_LuV.get(1L), },
+ new FluidStack[] { new FluidStack(solderIndalloy, 1296), Materials.Lubricant.getFluid(2000) },
+ GGItemList.AdvAssLine.get(1L),
+ 1200,
+ 6000);
+ RA.addAssemblerRecipe(
+ new ItemStack[] { ItemList.Hatch_Input_Bus_IV.get(1L), ItemList.Emitter_IV.get(1L),
+ ItemList.Sensor_IV.get(1L),
+ GT_OreDictUnificator.get(OrePrefixes.plateDense, Materials.Enderium, 1L),
+ GT_Utility.getIntegratedCircuit(12), },
+ Materials.Polybenzimidazole.getMolten(144L),
+ GGItemList.LinkedInputBus.get(1L),
+ 600,
+ (int) GT_Values.VP[5]);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/ConfigurationHandler.java b/src/main/java/net/glease/ggfab/ConfigurationHandler.java
new file mode 100644
index 0000000000..249bb16da8
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/ConfigurationHandler.java
@@ -0,0 +1,51 @@
+package net.glease.ggfab;
+
+import java.io.File;
+import java.util.Map;
+
+import net.minecraftforge.common.config.ConfigCategory;
+import net.minecraftforge.common.config.Configuration;
+import net.minecraftforge.common.config.Property;
+
+public enum ConfigurationHandler {
+
+ INSTANCE;
+
+ private Configuration config;
+ private float laserOCPenaltyFactor;
+
+ void init(File f) {
+ config = new Configuration(f);
+ loadConfig();
+ setLanguageKeys();
+ }
+
+ private void setLanguageKeys() {
+ for (String categoryName : config.getCategoryNames()) {
+ ConfigCategory category = config.getCategory(categoryName);
+ category.setLanguageKey("ggfab.config." + categoryName);
+ for (Map.Entry<String, Property> entry : category.entrySet()) {
+ entry.getValue().setLanguageKey(String.format("%s.%s", category.getLanguagekey(), entry.getKey()));
+ }
+ }
+ }
+
+ private void loadConfig() {
+ laserOCPenaltyFactor = config.getFloat(
+ "advasslinePenaltyFactor",
+ "common.balancing",
+ 0.3f,
+ 0f,
+ 10f,
+ "Laser overclock penalty factor. This will incredibly change the game balance. Even a small step from 0.2 to 0.3 can have very significant impact. Tweak with caution!");
+ config.save();
+ }
+
+ public Configuration getConfig() {
+ return config;
+ }
+
+ public float getLaserOCPenaltyFactor() {
+ return laserOCPenaltyFactor;
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/GGConstants.java b/src/main/java/net/glease/ggfab/GGConstants.java
new file mode 100644
index 0000000000..5a07a3f6c2
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGConstants.java
@@ -0,0 +1,15 @@
+package net.glease.ggfab;
+
+import gregtech.GT_Version;
+import net.minecraft.util.EnumChatFormatting;
+
+public class GGConstants {
+
+ public static final String MODID = "ggfab";
+ public static final String RES_PATH_ITEM = MODID + ":";
+ public static final String MODNAME = "GigaGramFab";
+ public static final String VERSION = GT_Version.VERSION;
+
+ public static final String GGMARK = EnumChatFormatting.GOLD + "GigaGram" + EnumChatFormatting.RESET + "Fab";
+ public static final String GGMARK_TOOLTIP = "Added by " + GGMARK;
+}
diff --git a/src/main/java/net/glease/ggfab/GGItemList.java b/src/main/java/net/glease/ggfab/GGItemList.java
new file mode 100644
index 0000000000..d77d3854e1
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GGItemList.java
@@ -0,0 +1,197 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.GT_Values.W;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+public enum GGItemList implements IItemContainer {
+
+ LinkedInputBus,
+ AdvAssLine,
+ // region single use tool
+ ToolCast_MV,
+ ToolCast_HV,
+ ToolCast_EV,
+ // order matters, do not insert randomly like a n00b
+ One_Use_craftingToolFile,
+ One_Use_craftingToolWrench,
+ One_Use_craftingToolCrowbar,
+ One_Use_craftingToolWireCutter,
+ One_Use_craftingToolHardHammer,
+ One_Use_craftingToolSoftHammer,
+ One_Use_craftingToolScrewdriver,
+ Shape_One_Use_craftingToolFile,
+ Shape_One_Use_craftingToolWrench,
+ Shape_One_Use_craftingToolCrowbar,
+ Shape_One_Use_craftingToolWireCutter,
+ Shape_One_Use_craftingToolHardHammer,
+ Shape_One_Use_craftingToolSoftHammer,
+ Shape_One_Use_craftingToolScrewdriver,
+ // ordered section ends
+ // endregion
+ //
+ ;
+
+ private ItemStack mStack;
+ private boolean mHasNotBeenSet = true;
+
+ @Override
+ public IItemContainer set(Item aItem) {
+ mHasNotBeenSet = false;
+ if (aItem == null) {
+ return this;
+ }
+ ItemStack aStack = new ItemStack(aItem, 1, 0);
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public IItemContainer set(ItemStack aStack) {
+ mHasNotBeenSet = false;
+ mStack = GT_Utility.copyAmount(1, aStack);
+ return this;
+ }
+
+ @Override
+ public Item getItem() {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return null;
+ }
+ return mStack.getItem();
+ }
+
+ @Override
+ public Block getBlock() {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ return GT_Utility.getBlockFromStack(new ItemStack(getItem()));
+ }
+
+ @Override
+ public final boolean hasBeenSet() {
+ return !mHasNotBeenSet;
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack) {
+ return isStackEqual(aStack, false, false);
+ }
+
+ @Override
+ public boolean isStackEqual(Object aStack, boolean aWildcard, boolean aIgnoreNBT) {
+ if (GT_Utility.isStackInvalid(aStack)) {
+ return false;
+ }
+ return GT_Utility.areUnificationsEqual((ItemStack) aStack, aWildcard ? getWildcard(1) : get(1), aIgnoreNBT);
+ }
+
+ @Override
+ public ItemStack get(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmount(aAmount, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWildcard(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, W, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getUndamaged(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, 0, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getAlmostBroken(long aAmount, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, mStack.getMaxDamage() - 1, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public ItemStack getWithName(long aAmount, String aDisplayName, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ rStack.setStackDisplayName(aDisplayName);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithCharge(long aAmount, int aEnergy, Object... aReplacements) {
+ ItemStack rStack = get(1, aReplacements);
+ if (GT_Utility.isStackInvalid(rStack)) {
+ return null;
+ }
+ GT_ModHandler.chargeElectricItem(rStack, aEnergy, Integer.MAX_VALUE, true, false);
+ return GT_Utility.copyAmount(aAmount, rStack);
+ }
+
+ @Override
+ public ItemStack getWithDamage(long aAmount, long aMetaValue, Object... aReplacements) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ if (GT_Utility.isStackInvalid(mStack)) {
+ return GT_Utility.copyAmount(aAmount, aReplacements);
+ }
+ return GT_Utility.copyAmountAndMetaData(aAmount, aMetaValue, GT_OreDictUnificator.get(mStack));
+ }
+
+ @Override
+ public IItemContainer registerOre(Object... aOreNames) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ for (Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, get(1));
+ }
+ return this;
+ }
+
+ @Override
+ public IItemContainer registerWildcardAsOre(Object... aOreNames) {
+ if (mHasNotBeenSet) {
+ throw new IllegalAccessError("The Enum '" + name() + "' has not been set to an Item at this time!");
+ }
+ for (Object tOreName : aOreNames) {
+ GT_OreDictUnificator.registerOre(tOreName, getWildcard(1));
+ }
+ return this;
+ }
+
+}
diff --git a/src/main/java/net/glease/ggfab/GigaGramFab.java b/src/main/java/net/glease/ggfab/GigaGramFab.java
new file mode 100644
index 0000000000..52fd51a13a
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/GigaGramFab.java
@@ -0,0 +1,169 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.ToolDictNames.*;
+import static gregtech.common.items.GT_MetaGenerated_Tool_01.*;
+import static net.glease.ggfab.api.GGFabRecipeMaps.toolCastRecipes;
+
+import net.glease.ggfab.api.GigaGramFabAPI;
+import net.glease.ggfab.items.GGMetaItem_DumbItems;
+import net.glease.ggfab.mte.MTE_AdvAssLine;
+import net.glease.ggfab.mte.MTE_LinkedInputBus;
+import net.glease.ggfab.util.GGUtils;
+import net.minecraft.item.ItemStack;
+
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.OrePrefixes;
+import gregtech.api.enums.SoundResource;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine_GT_Recipe;
+import gregtech.api.util.GT_ProcessingArray_Manager;
+
+@Mod(
+ modid = GGConstants.MODID,
+ version = GGConstants.VERSION,
+ name = GGConstants.MODNAME,
+ acceptedMinecraftVersions = "[1.7.10]",
+ dependencies = "required-after:IC2;required-before:gregtech")
+public class GigaGramFab {
+
+ public GigaGramFab() {
+ // initialize the textures
+ // noinspection ResultOfMethodCallIgnored
+ BlockIcons.OVERLAY_FRONT_ADV_ASSLINE.name();
+ }
+
+ @Mod.EventHandler
+ public void preInit(FMLPreInitializationEvent event) {
+ GregTech_API.sAfterGTPreload.add(() -> {
+ GGItemList.AdvAssLine.set(
+ new MTE_AdvAssLine(13532, "ggfab.machine.adv_assline", "Advanced Assembly Line").getStackForm(1));
+ GGItemList.LinkedInputBus.set(
+ new MTE_LinkedInputBus(13533, "ggfab.machine.linked_input_bus", "Linked Input Bus", 5)
+ .getStackForm(1));
+ GGItemList.ToolCast_MV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 13534,
+ "ggfab.toolcast.tier.mv",
+ "Basic Tool Casting Machine",
+ 2,
+ "Cheap Crafting Tool for you!",
+ toolCastRecipes,
+ 1,
+ 4,
+ 32000,
+ SoundResource.NONE,
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS,
+ "TOOL_CAST",
+ new Object[] { "PGP", "WMW", "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B',
+ ItemList.Shape_Empty.get(1L) }).getStackForm(1L));
+ GGItemList.ToolCast_HV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 13535,
+ "ggfab.toolcast.tier.hv",
+ "Advanced Tool Casting Machine",
+ 3,
+ "Cheap Crafting Tool for you!",
+ toolCastRecipes,
+ 1,
+ 4,
+ 64000,
+ SoundResource.NONE,
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS,
+ "TOOL_CAST",
+ new Object[] { "PGP", "WMW", "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B',
+ ItemList.Shape_Empty.get(1L) }).getStackForm(1L));
+ GGItemList.ToolCast_EV.set(
+ new GT_MetaTileEntity_BasicMachine_GT_Recipe(
+ 13536,
+ "ggfab.toolcast.tier.ev",
+ "Master Tool Casting Machine",
+ 4,
+ "Cheap Crafting Tool for you!",
+ toolCastRecipes,
+ 1,
+ 4,
+ 128000,
+ SoundResource.NONE,
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.SpecialEffects.MAIN_RANDOM_SPARKS,
+ "TOOL_CAST",
+ new Object[] { "PGP", "WMW", "CBC", 'M', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.HULL,
+ 'P', GT_MetaTileEntity_BasicMachine_GT_Recipe.X.PUMP, 'C',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.CIRCUIT, 'W',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.WIRE, 'G',
+ GT_MetaTileEntity_BasicMachine_GT_Recipe.X.GLASS, 'B',
+ ItemList.Shape_Empty.get(1L) }).getStackForm(1L));
+ long plate = OrePrefixes.plate.mMaterialAmount, ingot = OrePrefixes.ingot.mMaterialAmount,
+ screw = OrePrefixes.screw.mMaterialAmount, rod = OrePrefixes.stick.mMaterialAmount;
+ GigaGramFabAPI.addSingleUseToolType(craftingToolFile, INSTANCE.mToolStats.get(FILE), 2 * plate);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolWrench, INSTANCE.mToolStats.get(WRENCH), 6 * ingot);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolCrowbar, INSTANCE.mToolStats.get(CROWBAR), 3 * rod);
+ GigaGramFabAPI.addSingleUseToolType(
+ craftingToolWireCutter,
+ INSTANCE.mToolStats.get(WIRECUTTER),
+ 3 * plate + 2 * rod + screw);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolHardHammer, INSTANCE.mToolStats.get(HARDHAMMER), 6 * ingot);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolSoftHammer, INSTANCE.mToolStats.get(SOFTMALLET), 6 * ingot);
+ GigaGramFabAPI.addSingleUseToolType(craftingToolScrewdriver, INSTANCE.mToolStats.get(SCREWDRIVER), 2 * rod);
+ GT_ProcessingArray_Manager.addRecipeMapToPA("ggfab.toolcast", toolCastRecipes);
+ });
+ GregTech_API.sBeforeGTPostload.add(new ComponentRecipeLoader());
+ GregTech_API.sBeforeGTPostload.add(new SingleUseToolRecipeLoader());
+ ConfigurationHandler.INSTANCE.init(event.getSuggestedConfigurationFile());
+
+ initDumbItem1();
+ }
+
+ @Mod.EventHandler
+ public void init(FMLInitializationEvent event) {}
+
+ @Mod.EventHandler
+ public void postInit(FMLPostInitializationEvent event) {}
+
+ private void initDumbItem1() {
+ GGMetaItem_DumbItems i1 = new GGMetaItem_DumbItems("ggfab.d1");
+ int id = 0;
+ {
+ int idShape = 30;
+ final int budget = idShape;
+ String prefix = "One_Use_craftingTool";
+ String prefix2 = "Shape_One_Use_craftingTool";
+ for (GGItemList i : GGItemList.values()) {
+ ItemStack stack = null;
+ if (i.name().startsWith(prefix)) {
+ stack = i1.addItem(
+ id++,
+ "Single Use "
+ + GGUtils.processSentence(i.name().substring(prefix.length()), ' ', true, true),
+ null,
+ i,
+ i.name().substring("One_Use_".length()));
+ } else if (i.name().startsWith(prefix2)) {
+ stack = i1.addItem(
+ idShape++,
+ "Tool Casting Mold ("
+ + GGUtils.processSentence(i.name().substring(prefix2.length()), ' ', true, true)
+ + ")",
+ null,
+ i);
+ }
+ if (stack != null) {
+ i.set(stack);
+ }
+ }
+ if (id >= budget || idShape >= 2 * budget || idShape - id != budget) throw new AssertionError();
+ id = budget * 2;
+ }
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java b/src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java
new file mode 100644
index 0000000000..8fc78b7486
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/SingleUseToolRecipeLoader.java
@@ -0,0 +1,99 @@
+package net.glease.ggfab;
+
+import static gregtech.api.enums.ToolDictNames.*;
+import static gregtech.api.util.GT_RecipeBuilder.SECONDS;
+
+import net.glease.ggfab.api.GGFabRecipeMaps;
+import net.glease.ggfab.api.GigaGramFabAPI;
+
+import gregtech.api.enums.GT_Values;
+import gregtech.api.enums.ItemList;
+import gregtech.api.enums.Materials;
+import gregtech.api.enums.TierEU;
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.interfaces.IToolStats;
+import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_Utility;
+
+class SingleUseToolRecipeLoader implements Runnable {
+
+ @Override
+ public void run() {
+ ToolDictNames[] hardTools = new ToolDictNames[] { craftingToolHardHammer, craftingToolScrewdriver,
+ craftingToolWrench, craftingToolCrowbar, craftingToolWireCutter, craftingToolFile };
+ ToolDictNames[] softTools = new ToolDictNames[] { craftingToolSoftHammer };
+ addSingleUseToolRecipe(Materials.Steel, hardTools);
+ addSingleUseToolRecipe(Materials.Silver, 5000, hardTools);
+ addSingleUseToolRecipe(Materials.VanadiumSteel, hardTools);
+ addSingleUseToolRecipe(Materials.TungstenSteel, hardTools);
+ addSingleUseToolRecipe(Materials.HSSG, hardTools);
+ addSingleUseToolRecipe(Materials.Rubber, softTools);
+ addSingleUseToolRecipe(Materials.StyreneButadieneRubber, softTools);
+ addSingleUseToolRecipe(Materials.Polybenzimidazole, softTools);
+
+ String prefix = "Shape_One_Use_";
+ for (GGItemList value : GGItemList.values()) {
+ if (!value.name().startsWith(prefix)) {
+ continue;
+ }
+ ToolDictNames type = ToolDictNames.valueOf(value.name().substring(prefix.length()));
+ GT_ModHandler.addCraftingRecipe(
+ value.get(1L),
+ new Object[] { "h", "P", "I", 'P', ItemList.Shape_Empty, 'I', type });
+ }
+ }
+
+ private void addSingleUseToolRecipe(Materials material, ToolDictNames... types) {
+ addSingleUseToolRecipe(material, 10000, types);
+ }
+
+ private static long findNiceFactor(long fluids, long count) {
+ long end = Math.min(fluids, count);
+ for (long i = count / 256; i < end; i++) {
+ if (fluids % i == 0 && count % i == 0 && count / i < 256) return i;
+ }
+ return -1;
+ }
+
+ private void addSingleUseToolRecipe(Materials material, int outputModifier, ToolDictNames... types) {
+ if (material.mStandardMoltenFluid == null) {
+ throw new IllegalArgumentException("material does not have molten fluid form");
+ }
+ for (ToolDictNames type : types) {
+ IToolStats stats = GigaGramFabAPI.SINGLE_USE_TOOLS.get(type);
+ Long cost = GigaGramFabAPI.COST_SINGLE_USE_TOOLS.get(type);
+ if (stats == null || cost == null) {
+ throw new IllegalArgumentException(type + " not registered");
+ }
+ long fluids = cost * GT_Values.L / GT_Values.M, duration = 6 * SECONDS;
+ long count = (long) (material.mDurability * stats.getMaxDurabilityMultiplier()
+ * outputModifier
+ * 100
+ / stats.getToolDamagePerContainerCraft()
+ / 10000);
+ if (count > 64 * 4) {
+ long niceFactor = findNiceFactor(fluids, count);
+ if (niceFactor < 0) {
+ double mod = (double) count / (64 * 4L);
+ fluids = Math.max((long) (fluids / mod), 1L);
+ duration = Math.max((long) (duration / mod), 1L);
+ count = 64 * 4;
+ } else {
+ fluids /= niceFactor;
+ duration = Math.max(duration / niceFactor, 1);
+ count /= niceFactor;
+ }
+ } else if (count < 128) {
+ long mod = GT_Utility.ceilDiv(128, count);
+ fluids *= mod;
+ duration *= mod;
+ count *= mod;
+ }
+ GT_Values.RA.stdBuilder().fluidInputs(material.getMolten(fluids)) //
+ .metadata(GGFabRecipeMaps.OUTPUT_TYPE, type) //
+ .metadata(GGFabRecipeMaps.OUTPUT_COUNT, (int) count) //
+ .eut(TierEU.RECIPE_MV).duration(duration) //
+ .addTo(GGFabRecipeMaps.toolCastRecipes);
+ }
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java b/src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java
new file mode 100644
index 0000000000..088e9a7782
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/api/GGFabRecipeMaps.java
@@ -0,0 +1,55 @@
+package net.glease.ggfab.api;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import net.glease.ggfab.GGItemList;
+import net.minecraft.item.ItemStack;
+
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapBackend;
+import gregtech.api.recipe.RecipeMapBuilder;
+import gregtech.api.recipe.RecipeMetadataKey;
+import gregtech.api.recipe.metadata.SimpleRecipeMetadataKey;
+import gregtech.api.util.GT_Recipe;
+
+public class GGFabRecipeMaps {
+
+ public static final RecipeMetadataKey<ToolDictNames> OUTPUT_TYPE = SimpleRecipeMetadataKey
+ .create(ToolDictNames.class, "output_type");
+ public static final RecipeMetadataKey<Integer> OUTPUT_COUNT = SimpleRecipeMetadataKey
+ .create(Integer.class, "output_count");
+ public static final RecipeMap<RecipeMapBackend> toolCastRecipes = RecipeMapBuilder.of("ggfab.recipe.toolcast")
+ .maxIO(1, 4, 1, 0).minInputs(1, 1).progressBar(GT_UITextures.PROGRESSBAR_ARROW, ProgressBar.Direction.RIGHT)
+ .recipeEmitter(b -> {
+ Optional<GT_Recipe> rr = b.noOptimize().validateNoInput().validateInputFluidCount(0, 1)
+ .validateNoOutput().validateNoOutputFluid().build();
+ if (!rr.isPresent()) return Collections.emptyList();
+ ToolDictNames outputType = b.getMetadata(OUTPUT_TYPE);
+ GT_Recipe r = rr.get();
+ int outputSize = b.getMetadataOrDefault(OUTPUT_COUNT, 0);
+ if (outputSize > 64 * 4 || outputSize <= 0) return Collections.emptyList();
+ ItemStack shape, output;
+ try {
+ shape = GGItemList.valueOf("Shape_One_Use_" + outputType).get(0L);
+ output = GGItemList.valueOf("One_Use_" + outputType).get(outputSize);
+ } catch (IllegalArgumentException ex) {
+ // this looks like python not java, but I don't have better way around this
+ return Collections.emptyList();
+ }
+ output.stackSize = outputSize;
+ List<ItemStack> outputs = new ArrayList<>();
+ int maxStackSize = output.getMaxStackSize();
+ while (output.stackSize > maxStackSize) outputs.add(output.splitStack(maxStackSize));
+ outputs.add(output);
+ r.mInputs = new ItemStack[] { shape };
+ r.mOutputs = outputs.toArray(new ItemStack[0]);
+ return Collections.singletonList(r);
+ }).build();
+}
diff --git a/src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java b/src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java
new file mode 100644
index 0000000000..7797d037c3
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/api/GigaGramFabAPI.java
@@ -0,0 +1,30 @@
+package net.glease.ggfab.api;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import gregtech.api.enums.ToolDictNames;
+import gregtech.api.interfaces.IToolStats;
+
+public class GigaGramFabAPI {
+
+ private static final Logger apiLogger = LogManager.getLogger("GigaGramFabAPI");
+
+ private static final Map<ToolDictNames, IToolStats> SINGLE_USE_TOOLS_STORE = new HashMap<>();
+ public static final Map<ToolDictNames, IToolStats> SINGLE_USE_TOOLS = Collections
+ .unmodifiableMap(SINGLE_USE_TOOLS_STORE);
+
+ private static final Map<ToolDictNames, Long> COST_SINGLE_USE_TOOLS_STORE = new HashMap<>();
+ public static final Map<ToolDictNames, Long> COST_SINGLE_USE_TOOLS = Collections
+ .unmodifiableMap(COST_SINGLE_USE_TOOLS_STORE);
+
+ public static void addSingleUseToolType(ToolDictNames type, IToolStats stat, long materialCost) {
+ if (SINGLE_USE_TOOLS_STORE.put(type, stat) != null)
+ apiLogger.warn("Replacing stat of single use tool {}", type);
+ COST_SINGLE_USE_TOOLS_STORE.put(type, materialCost);
+ }
+}
diff --git a/src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java b/src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java
new file mode 100644
index 0000000000..20a81a5abb
--- /dev/null
+++ b/src/main/java/net/glease/ggfab/items/GGMetaItem_DumbItems.java
@@ -0,0 +1,153 @@
+package net.glease.ggfab.items;
+
+import static gregtech.api.enums.GT_Values.D1;
+
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.List;
+
+import net.glease.ggfab.GGConstants;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.IIcon;
+
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gnu.trove.map.TIntObjectMap;
+import gnu.trove.map.hash.TIntObjectHashMap;
+import gregtech.api.GregTech_API;
+import gregtech.api.enums.SubTag;
+import gregtech.api.enums.TC_Aspects;
+import gregtech.api.interfaces.IItemBehaviour;
+import gregtech.api.interfaces.IItemContainer;
+import gregtech.api.items.GT_MetaBase_Item;
+import gregtech.api.objects.ItemData;
+import gregtech.api.util.GT_LanguageManager;
+import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_Utility;
+
+// mostly stolen from gt5 itself.
+public class GGMetaItem_DumbItems extends GT_MetaBase_Item {
+
+ public static final int MAX_ID = 32766;
+ private final BitSet mEnabledItems = new BitSet();
+ private final BitSet mVisibleItems = new BitSet();
+ private final ArrayList<IIcon> mIconList = new ArrayList<>();
+ private final TIntObjectMap<IItemContainer> mIconOverride = new TIntObjectHashMap<>();
+
+ public GGMetaItem_DumbItems(String aUnlocalized) {
+ super(aUnlocalized);
+ }
+
+ /**
+ * This adds a Custom Item to the ending Range.
+ *
+ * @param aID The Id of the assigned Item [0 - mItemAmount] (The MetaData gets auto-shifted by +mOffset)
+ * @param aEnglish The Default Localized Name of the created Item
+ * @param aToolTip The Default ToolTip of the created Item, you can also insert null for having no ToolTip
+ * @param aRandomData The OreDict Names you want to give the Item. Also used for TC Aspects and some other things.
+ * @return An ItemStack containing the newly created Item.
+ */
+ public final ItemStack addItem(int aID, String aEn