From 721c5c6acac95c00a67d65c866b10974f9bcaa5c Mon Sep 17 00:00:00 2001 From: Maya <10861407+serenibyss@users.noreply.github.com> Date: Sun, 15 Dec 2024 17:18:48 -0600 Subject: [PATCH] Migrate Research Completer to GT5u (#88) --- src/main/java/emt/EMT.java | 4 - .../common/loader/EMT_GT_Loader.java | 11 - src/main/java/emt/init/EMTRecipes.java | 14 - src/main/java/emt/init/EMTResearches.java | 4 - .../init/EMT_GTNH_Recipes_And_Researches.java | 234 ----------- src/main/java/emt/init/Registry.java | 3 - src/main/java/emt/network/PacketNodeInfo.java | 70 ---- .../GT_MetaTileEntity_ResearchCompleter.java | 382 ------------------ .../java/emt/util/EMTCraftingAspects.java | 4 - .../java/emt/util/EMTResearchAspects.java | 2 - src/main/resources/assets/emt/lang/en_US.lang | 4 - src/main/resources/assets/emt/lang/ru_RU.lang | 10 +- src/main/resources/assets/emt/lang/zh_CN.lang | 4 - 13 files changed, 3 insertions(+), 743 deletions(-) delete mode 100644 src/main/java/emt/init/EMT_GTNH_Recipes_And_Researches.java delete mode 100644 src/main/java/emt/network/PacketNodeInfo.java delete mode 100644 src/main/java/emt/tile/GT_MetaTileEntity_ResearchCompleter.java diff --git a/src/main/java/emt/EMT.java b/src/main/java/emt/EMT.java index 479532c..04691fc 100644 --- a/src/main/java/emt/EMT.java +++ b/src/main/java/emt/EMT.java @@ -21,7 +21,6 @@ import emt.command.CommandOutputs; import emt.init.EMTEntities; import emt.init.Registry; import emt.network.PacketEMTKeys; -import emt.network.PacketNodeInfo; import emt.proxy.CommonProxy; import emt.tile.solar.Solars; import emt.util.EMTClientEventHandler; @@ -115,8 +114,5 @@ public class EMT { public void registerPackets() { INSTANCE.registerMessage(PacketEMTKeys.class, PacketEMTKeys.class, 0, Side.SERVER); - if (Registry.enableGTCompat) { - INSTANCE.registerMessage(PacketNodeInfo.class, PacketNodeInfo.class, 1, Side.CLIENT); - } } } diff --git a/src/main/java/emt/gthandler/common/loader/EMT_GT_Loader.java b/src/main/java/emt/gthandler/common/loader/EMT_GT_Loader.java index 2191e67..87d9eca 100644 --- a/src/main/java/emt/gthandler/common/loader/EMT_GT_Loader.java +++ b/src/main/java/emt/gthandler/common/loader/EMT_GT_Loader.java @@ -8,11 +8,8 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; -import emt.tile.GT_MetaTileEntity_ResearchCompleter; import gregtech.api.enums.GTValues; -import gregtech.api.enums.ItemList; import gregtech.api.enums.Materials; -import gregtech.api.enums.MetaTileEntityIDs; import gregtech.api.enums.OrePrefixes; import gregtech.api.enums.TierEU; import gregtech.api.util.GTOreDictUnificator; @@ -20,14 +17,6 @@ import thaumcraft.common.config.ConfigItems; public class EMT_GT_Loader { - public static void run() { - ItemList.ResearchCompleter.set( - new GT_MetaTileEntity_ResearchCompleter( - MetaTileEntityIDs.ResearchCompleter.ID, - "Research Completer", - "Research Completer").getStackForm(1L)); - } - public static void runlate() { GTValues.RA.stdBuilder() .itemInputs( diff --git a/src/main/java/emt/init/EMTRecipes.java b/src/main/java/emt/init/EMTRecipes.java index 6a44b5a..bd7ed0d 100644 --- a/src/main/java/emt/init/EMTRecipes.java +++ b/src/main/java/emt/init/EMTRecipes.java @@ -103,8 +103,6 @@ public class EMTRecipes { public static ShapedArcaneRecipe electricScribingTools; public static ShapedArcaneRecipe thaumiumWing; public static ShapedArcaneRecipe thaumiumWings; - public static ShapedArcaneRecipe researchCompleter; - public static ShapedArcaneRecipe magicalMachineCasing; public static CrucibleRecipe ignisGenerator; public static CrucibleRecipe auramGenerator; public static CrucibleRecipe arborGenerator; @@ -930,18 +928,6 @@ public class EMTRecipes { 'X', new ItemStack(EMTItems.itemEMTItems, 1, 14)); - // magicalMachineCasing = addArcaneCraftingRecipe("ResearchCompleter", new - // ItemStack(GregTech_API.sBlockCasings8, 1, 6), EMTCraftingAspects.magicalMachineCasing, "XYX", "XZX", "XYX", - // 'X', GTOreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1), 'Y', new - // ItemStack(ConfigItems.itemResource, 1, 14) , 'Z', GTOreDictUnificator.get(OrePrefixes.frameGt, - // Materials.Thaumium, 1)); - - // researchCompleter = addArcaneCraftingRecipe("ResearchCompleter", new ItemStack(GregTech_API.sBlockMachines, - // 1, 13001), EMTCraftingAspects.researchCompleter, "XYX", "YZY", "XAX", 'X', - // GTOreDictUnificator.get(OrePrefixes.circuit.get(Materials.Good), 1L), 'Y', new - // ItemStack(ConfigBlocks.blockCosmeticOpaque, 1, 2), 'Z', new ItemStack(GregTech_API.sBlockCasings8, 1, 6), - // 'A', new ItemStack(ConfigBlocks.blockStoneDevice, 1, 5)); - if (Registry.enableGTCompat) { /** Crucible Recipes **/ ignisGenerator = addCrucibleRecipe( diff --git a/src/main/java/emt/init/EMTResearches.java b/src/main/java/emt/init/EMTResearches.java index da97851..dc82e56 100644 --- a/src/main/java/emt/init/EMTResearches.java +++ b/src/main/java/emt/init/EMTResearches.java @@ -54,10 +54,6 @@ public class EMTResearches { new ResearchPage(EMTRecipes.cardboard), new ResearchPage(EMTRecipes.featherWing), new ResearchPage(EMTRecipes.featherWings)); - // new EMTResearchItem("ResearchCompleter", EMTResearchAspects.researchCompleter, -4, -2, 0, new - // ItemStack(GregTech_API.sBlockMachines, 1, 13001)).setParents("Electric Magic - // Tools").setParentsHidden("WANDPED", "WARDEDARCANA").registerResearchItem().setPages(new ResearchPage(""), new - // ResearchPage(EMTRecipes.magicalMachineCasing), new ResearchPage(EMTRecipes.researchCompleter)); /*************************************/ /** Research that can be disabled **/ diff --git a/src/main/java/emt/init/EMT_GTNH_Recipes_And_Researches.java b/src/main/java/emt/init/EMT_GTNH_Recipes_And_Researches.java deleted file mode 100644 index 93bfc6d..0000000 --- a/src/main/java/emt/init/EMT_GTNH_Recipes_And_Researches.java +++ /dev/null @@ -1,234 +0,0 @@ -package emt.init; - -import static thaumcraft.api.aspects.Aspect.*; - -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedHashMap; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.util.ResourceLocation; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; - -import emt.EMT; -import emt.util.EMTResearchItem; -import gregtech.api.enums.ItemList; -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.util.GTOreDictUnificator; -import gregtech.api.util.GTUtility; -import thaumcraft.api.ThaumcraftApi; -import thaumcraft.api.ThaumcraftApiHelper; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.crafting.IArcaneRecipe; -import thaumcraft.api.crafting.ShapedArcaneRecipe; -import thaumcraft.api.research.ResearchItem; -import thaumcraft.api.research.ResearchPage; - -public class EMT_GTNH_Recipes_And_Researches implements Runnable { - - private static LinkedHashMap arcaneRecipeLinkedHashMap = new LinkedHashMap<>(); - - private static AspectList getPrimals(int amount) { - return new AspectList().add(ORDER, amount).add(ENTROPY, amount).add(AIR, amount).add(EARTH, amount) - .add(WATER, amount).add(FIRE, amount); - } - - @Override - public void run() { - - EMTResearches.addResearchTab(); - runArcaneRecipes(); - runResreaches(); - } - - @SuppressWarnings("unchecked") - private void runArcaneRecipes() { - arcaneRecipeLinkedHashMap.put( - "DiamondChainsaw", - new ShapedArcaneRecipe( - "DiamondChainsaw", - new ItemStack(EMTItems.diamondChainsaw), - getPrimals(35), - "sts", - "pmp", - "pbp", - 's', - GTOreDictUnificator.get(OrePrefixes.screw, Materials.Diamond, 1), - 'p', - GTOreDictUnificator.get(OrePrefixes.plate, Materials.Diamond, 1), - 't', - GTOreDictUnificator.get(OrePrefixes.toolHeadChainsaw, Materials.Thaumium, 1), - 'b', - ItemList.Battery_RE_LV_Sodium.get(1), - 'm', - ItemList.Electric_Motor_MV.get(1))); - arcaneRecipeLinkedHashMap.put( - "ThaumiumChainsaw", - new ShapedArcaneRecipe( - "ThaumiumChainsaw", - new ItemStack(EMTItems.thaumiumChainsaw), - getPrimals(35), - "sps", - "pmp", - "ppp", - 's', - GTOreDictUnificator.get(OrePrefixes.screw, Materials.Thaumium, 1), - 'p', - GTOreDictUnificator.get(OrePrefixes.plate, Materials.Thaumium, 1), - 'b', - ItemList.Battery_RE_LV_Sodium.get(1), - 'm', - new ItemStack(EMTItems.diamondChainsaw))); - - for (IArcaneRecipe recipe : arcaneRecipeLinkedHashMap.values()) { - ThaumcraftApi.getCraftingRecipes().add(recipe); - } - } - - private void runResreaches() { - HashSet researches = new HashSet<>(); - researches.add( - new EMTResearchItem( - "ElectricMagicTools", - 0, - 0, - 0, - new ResourceLocation(EMT.TEXTURE_PATH, "textures/misc/emt.png")).setSpecial().setAutoUnlock() - .setPages(new ResearchPage(""))); - researches.add( - new EMTResearchItem( - "DiamondChainsaw", - new AspectList().add(GREED, 12).add(FIRE, 9).add(METAL, 6).add(EARTH, 3), - 0, - -2, - 2, - new ItemStack(EMTItems.diamondChainsaw)) - .setPages(new ResearchPage(arcaneRecipeLinkedHashMap.get("DiamondChainsaw"))).setRound() - .setParentsHidden("ElectricMagicTools")); - // researches.add(new EMTResearchItem("DiamondChainsaw",new - // AspectList().add(GREED,12).add(FIRE,9).add(METAL,6).add(EARTH,3),0,-2,2,new - // ItemStack(EMTItems.diamondChainsaw)).setRound()); - researches.forEach(ResearchItem::registerResearchItem); - } - - class ShapedArcaneRecipeIgnoresNBT extends ShapedArcaneRecipe { - - protected String research; - protected ItemStack result; - protected AspectList aspects; - protected Object[] recipe; - protected LinkedHashMap translation = new LinkedHashMap<>(); - int[] rowcolm; - - public ShapedArcaneRecipeIgnoresNBT(String research, ItemStack result, AspectList aspects, Object... recipe) { - super(research, result, aspects, recipe); - this.research = research; - this.result = result; - this.aspects = aspects; - this.recipe = recipe; - int rows = 0; - int colums = 0; - if (!(recipe[0] instanceof String)) throw new UnsupportedOperationException( - "The Recipe must start with at least one String for the first row!"); - int i = 0; - rowcolm = new int[3]; - do { - rows++; - colums = Math.max(colums, ((String) recipe[i]).length()); - rowcolm[i] = colums; - i = rows; - } while (recipe[i] instanceof String); - if (rows > 3 || colums > 3) - throw new UnsupportedOperationException("The Recipe must fit in a 3x3 crafting field!"); - rowcolm = Arrays.copyOf(rowcolm, rows); - - for (int j = i; j < recipe.length; j += 2) { - if (recipe[j] instanceof Character) translation.put((Character) recipe[j], recipe[j + 1]); - } - } - - @Override - public boolean matches(IInventory inv, World world, EntityPlayer player) { - if (this.research.length() > 0 - && !ThaumcraftApiHelper.isResearchComplete(player.getCommandSenderName(), this.research)) - return false; - else { - for (int y = 0; y < rowcolm.length; y++) { - String rowAsString = ((String) recipe[y]); - for (int x = 0; x < rowcolm[y]; x++) { - Object itemReplacement = translation.get(rowAsString.toCharArray()[x]); - ItemStack slot = ThaumcraftApiHelper.getStackInRowAndColumn(inv, x, y); - if (itemReplacement != null && slot == null) { - return false; - } else if (itemReplacement instanceof String) { - if (!GTUtility.areStacksEqual( - GTOreDictUnificator.getFirstOre(itemReplacement, 1), - GTOreDictUnificator.get(slot), - true)) - if (!OreDictionary.getOres((String) itemReplacement).contains(slot)) return false; - } else if (itemReplacement instanceof ItemStack) { - if (!GTUtility.isStackValid((ItemStack) itemReplacement)) { - return false; - } - if (!GTUtility.areStacksEqual((ItemStack) itemReplacement, slot, true)) - if (!GTUtility.areUnificationsEqual((ItemStack) itemReplacement, slot, true)) - if (!(((ItemStack) itemReplacement).getItem().equals(slot.getItem()) - && ((ItemStack) itemReplacement).getItemDamage() - == OreDictionary.WILDCARD_VALUE)) - return false; - } else if (itemReplacement instanceof Collection) { - boolean hit = false; - for (Object o : (Collection) itemReplacement) { - if (GTUtility.areStacksEqual((ItemStack) o, slot, true) - || GTUtility.areUnificationsEqual((ItemStack) o, slot, true) - || (((ItemStack) o).getItem().equals(slot.getItem()) - && ((ItemStack) itemReplacement).getItemDamage() - == OreDictionary.WILDCARD_VALUE)) - hit = true; - } - if (!hit) { - return false; - } - } - } - } - return true; - } - } - - @Override - public ItemStack getCraftingResult(IInventory iInventory) { - return result; - } - - @Override - public int getRecipeSize() { - return recipe.length; - } - - @Override - public ItemStack getRecipeOutput() { - return result; - } - - @Override - public AspectList getAspects() { - return aspects; - } - - @Override - public AspectList getAspects(IInventory iInventory) { - return aspects; - } - - @Override - public String getResearch() { - return research; - } - } -} diff --git a/src/main/java/emt/init/Registry.java b/src/main/java/emt/init/Registry.java index 9101962..4219328 100644 --- a/src/main/java/emt/init/Registry.java +++ b/src/main/java/emt/init/Registry.java @@ -17,9 +17,6 @@ public class Registry { } public static void registerInit() { - if (enableGTCompat) { - EMT_GT_Loader.run(); - } EMTRecipes.registerEarlyRecipes(); } diff --git a/src/main/java/emt/network/PacketNodeInfo.java b/src/main/java/emt/network/PacketNodeInfo.java deleted file mode 100644 index c23287e..0000000 --- a/src/main/java/emt/network/PacketNodeInfo.java +++ /dev/null @@ -1,70 +0,0 @@ -package emt.network; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.WorldClient; -import net.minecraft.tileentity.TileEntity; - -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 cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import emt.tile.GT_MetaTileEntity_ResearchCompleter; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import io.netty.buffer.ByteBuf; - -public class PacketNodeInfo implements IMessage, IMessageHandler { - - private int mBlockX, mBlockY, mBlockZ, mDim, nodeDistance, nodeColor; - - public PacketNodeInfo() {} - - public PacketNodeInfo(int mBlockX, int mBlockY, int mBlockZ, int mDim, int nodeDistance, int nodeColor) { - this.mBlockX = mBlockX; - this.mBlockY = mBlockY; - this.mBlockZ = mBlockZ; - this.mDim = mDim; - this.nodeDistance = nodeDistance; - this.nodeColor = nodeColor; - } - - @Override - public void fromBytes(ByteBuf buf) { - mBlockX = buf.readInt(); - mBlockY = buf.readInt(); - mBlockZ = buf.readInt(); - mDim = buf.readInt(); - nodeDistance = buf.readInt(); - nodeColor = buf.readInt(); - } - - @Override - public void toBytes(ByteBuf buf) { - buf.writeInt(mBlockX); - buf.writeInt(mBlockY); - buf.writeInt(mBlockZ); - buf.writeInt(mDim); - buf.writeInt(nodeDistance); - buf.writeInt(nodeColor); - } - - @Override - @SideOnly(Side.CLIENT) - public IMessage onMessage(PacketNodeInfo message, MessageContext ctx) { - WorldClient world = Minecraft.getMinecraft().theWorld; - if (world != null) { - if (world.blockExists(message.mBlockX, message.mBlockY, message.mBlockZ)) { - TileEntity tileEntity = world.getTileEntity(message.mBlockX, message.mBlockY, message.mBlockZ); - if (tileEntity instanceof IGregTechTileEntity) { - IGregTechTileEntity gtTile = (IGregTechTileEntity) tileEntity; - if (gtTile.getMetaTileEntity() instanceof GT_MetaTileEntity_ResearchCompleter) { - GT_MetaTileEntity_ResearchCompleter researchCompleter = (GT_MetaTileEntity_ResearchCompleter) gtTile - .getMetaTileEntity(); - researchCompleter.setNodeValues(message.nodeDistance, message.nodeColor); - } - } - } - } - return null; - } -} diff --git a/src/main/java/emt/tile/GT_MetaTileEntity_ResearchCompleter.java b/src/main/java/emt/tile/GT_MetaTileEntity_ResearchCompleter.java deleted file mode 100644 index 9a2c3e2..0000000 --- a/src/main/java/emt/tile/GT_MetaTileEntity_ResearchCompleter.java +++ /dev/null @@ -1,382 +0,0 @@ -package emt.tile; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.Textures.BlockIcons.*; -import static gregtech.api.util.GTStructureUtility.ofHatchAdder; - -import java.util.ArrayList; - -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; - -import cpw.mods.fml.common.network.NetworkRegistry; -import emt.EMT; -import emt.network.PacketNodeInfo; -import gregtech.api.GregTechAPI; -import gregtech.api.enums.Textures; -import gregtech.api.interfaces.ITexture; -import gregtech.api.interfaces.metatileentity.IMetaTileEntity; -import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.MTEEnhancedMultiBlockBase; -import gregtech.api.render.TextureFactory; -import gregtech.api.util.GTUtility; -import gregtech.api.util.MultiblockTooltipBuilder; -import gregtech.api.util.shutdown.ShutDownReasonRegistry; -import thaumcraft.api.aspects.Aspect; -import thaumcraft.api.aspects.AspectList; -import thaumcraft.api.research.ResearchCategories; -import thaumcraft.api.research.ResearchItem; -import thaumcraft.common.Thaumcraft; -import thaumcraft.common.config.ConfigBlocks; -import thaumcraft.common.config.ConfigItems; -import thaumcraft.common.lib.research.ResearchManager; -import thaumcraft.common.lib.research.ResearchNoteData; -import thaumcraft.common.tiles.TileNode; - -public class GT_MetaTileEntity_ResearchCompleter - extends MTEEnhancedMultiBlockBase { - - private static final int CASING_INDEX = 184; - private static final int MAX_LENGTH = 13; - private static final int RECIPE_LENGTH = 1200; - private static final int RECIPE_EUT = 120; - private static final float NODE_COST_MULTIPLIER = 1.0f; - - private int recipeAspectCost; - private int aspectsAbsorbed; - - protected int mLength; - protected int mCasing; - protected boolean endFound; - - // For displaying beam - private int lastNodeDistance; - private int lastNodeColor; - private int syncTimer; - - private static final String STRUCTURE_PIECE_FIRST = "first"; - private static final String STRUCTURE_PIECE_LATER = "later"; - private static final String STRUCTURE_PIECE_LAST = "last"; - private static final String STRUCTURE_PIECE_LATER_HINT = "laterHint"; - private static final IStructureDefinition STRUCTURE_DEFINITION = StructureDefinition - .builder() - .addShape(STRUCTURE_PIECE_FIRST, transpose(new String[][] { { "ccc" }, { "g~g" }, { "ccc" }, })) - .addShape(STRUCTURE_PIECE_LATER, transpose(new String[][] { { "c c" }, { "gxg" }, { "c c" }, })) - .addShape(STRUCTURE_PIECE_LAST, transpose(new String[][] { { "c" }, { "g" }, { "c" }, })) - .addShape(STRUCTURE_PIECE_LATER_HINT, transpose(new String[][] { { "c c" }, { "g g" }, { "c c" }, })) - .addElement( - 'c', - ofChain( // Magical machine casing or hatch - ofHatchAdder( - GT_MetaTileEntity_ResearchCompleter::addEnergyInputToMachineList, - CASING_INDEX, - 1), - ofHatchAdder(GT_MetaTileEntity_ResearchCompleter::addInputToMachineList, CASING_INDEX, 1), - ofHatchAdder(GT_MetaTileEntity_ResearchCompleter::addOutputToMachineList, CASING_INDEX, 1), - ofHatchAdder( - GT_MetaTileEntity_ResearchCompleter::addMaintenanceToMachineList, - CASING_INDEX, - 1), - onElementPass( - GT_MetaTileEntity_ResearchCompleter::onCasingFound, - ofBlock(GregTechAPI.sBlockCasings8, 8)))) - .addElement( - 'x', - ofChain( // Check for the end but otherwise treat as a skipped spot - onElementPass( - GT_MetaTileEntity_ResearchCompleter::onEndFound, - ofBlock(ConfigBlocks.blockCosmeticOpaque, 2)), - isAir(), // Forgive me - notAir())) - .addElement('g', ofBlock(ConfigBlocks.blockCosmeticOpaque, 2)) // Warded glass - .build(); - - public GT_MetaTileEntity_ResearchCompleter(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ResearchCompleter(String aName) { - super(aName); - } - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - aNBT.setInteger("recipeAspectCost", recipeAspectCost); - aNBT.setInteger("aspectsAbsorbed", aspectsAbsorbed); - aNBT.setInteger("mLength", mLength); - - super.saveNBTData(aNBT); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - recipeAspectCost = aNBT.getInteger("recipeAspectCost"); - aspectsAbsorbed = aNBT.getInteger("aspectsAbsorbed"); - mLength = aNBT.getInteger("mLength"); - - super.loadNBTData(aNBT); - } - - // For client beam animation - public void setNodeValues(int nodeDistance, int nodeColor) { - this.lastNodeDistance = nodeDistance; - this.lastNodeColor = nodeColor; - } - - @Override - public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { - if (aBaseMetaTileEntity.isClientSide()) { - if (aBaseMetaTileEntity.isActive()) { - int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; - int yDir = aBaseMetaTileEntity.getBackFacing().offsetY; - int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; - double xCoord = aBaseMetaTileEntity.getXCoord() + 0.5; - double yCoord = aBaseMetaTileEntity.getYCoord() + 0.5; - double zCoord = aBaseMetaTileEntity.getZCoord() + 0.5; - Thaumcraft.proxy.beam( - aBaseMetaTileEntity.getWorld(), - xCoord + 0.5 * xDir, - yCoord + 0.5 * yDir, - zCoord + 0.5 * zDir, - xCoord + xDir * lastNodeDistance, - yCoord + yDir * lastNodeDistance, - zCoord + zDir * lastNodeDistance, - 3, - lastNodeColor, - true, - 2, - 1); - } else { - lastNodeDistance = 0; - lastNodeColor = 0; - } - } - - super.onPostTick(aBaseMetaTileEntity, aTick); - } - - @Override - public boolean onRunningTick(ItemStack aStack) { - float progressAmount = ((float) this.mProgresstime) / this.mMaxProgresstime; - int requiredVis = (int) Math.ceil(progressAmount * recipeAspectCost - aspectsAbsorbed); - syncTimer--; - - IGregTechTileEntity aBaseMetaTileEntity = this.getBaseMetaTileEntity(); - int xDir = aBaseMetaTileEntity.getBackFacing().offsetX; - int yDir = aBaseMetaTileEntity.getBackFacing().offsetY; - int zDir = aBaseMetaTileEntity.getBackFacing().offsetZ; - int i = 1; - - // Loop through node spaces and drain them from front to back - while (i < this.mLength - 1 && requiredVis > 0) { - int nodeX = aBaseMetaTileEntity.getXCoord() + xDir * i; - int nodeY = aBaseMetaTileEntity.getYCoord() + yDir * i; - int nodeZ = aBaseMetaTileEntity.getZCoord() + zDir * i; - TileEntity tileEntity = aBaseMetaTileEntity.getWorld().getTileEntity(nodeX, nodeY, nodeZ); - - if (tileEntity instanceof TileNode) { - TileNode aNode = (TileNode) tileEntity; - AspectList aspectsBase = aNode.getAspectsBase(); - - for (Aspect aspect : aspectsBase.getAspects()) { - int aspectAmount = aspectsBase.getAmount(aspect); - int drainAmount = Math.min(requiredVis, aspectAmount); - aNode.setNodeVisBase(aspect, (short) (aspectAmount - drainAmount)); - aNode.takeFromContainer(aspect, drainAmount); - requiredVis -= drainAmount; - aspectsAbsorbed += drainAmount; - - if (requiredVis <= 0) { - if (i != lastNodeDistance || aspect.getColor() != lastNodeColor) - sendClientAnimationUpdate(aBaseMetaTileEntity, i, aspect.getColor()); - - break; - } - } - - if (aspectsBase.visSize() <= 0) aBaseMetaTileEntity.getWorld().setBlockToAir(nodeX, nodeY, nodeZ); - else { - aNode.markDirty(); - aBaseMetaTileEntity.getWorld().markBlockForUpdate(nodeX, nodeY, nodeZ); - } - } - i++; - } - - if (syncTimer <= 0) sendClientAnimationUpdate(aBaseMetaTileEntity, lastNodeDistance, lastNodeColor); - - if (requiredVis > 0) this.stopMachine(ShutDownReasonRegistry.CRITICAL_NONE); - - return super.onRunningTick(aStack); - } - - private void sendClientAnimationUpdate(IGregTechTileEntity aBaseMetaTileEntity, int nodeDistance, int nodeColor) { - int xCoord = aBaseMetaTileEntity.getXCoord(); - int yCoord = aBaseMetaTileEntity.getYCoord(); - int zCoord = aBaseMetaTileEntity.getZCoord(); - int dim = aBaseMetaTileEntity.getWorld().provider.dimensionId; - - PacketNodeInfo packet = new PacketNodeInfo(xCoord, yCoord, zCoord, dim, nodeDistance, nodeColor); - EMT.INSTANCE.sendToAllAround(packet, new NetworkRegistry.TargetPoint(dim, xCoord, yCoord, zCoord, 128)); - - lastNodeDistance = nodeDistance; - lastNodeColor = nodeColor; - syncTimer = 100; - } - - @Override - public boolean isCorrectMachinePart(ItemStack itemStack) { - return true; - } - - @Override - public boolean checkRecipe(ItemStack itemStack) { - ArrayList tInputList = this.getStoredInputs(); - - for (ItemStack stack : tInputList) { - if (GTUtility.isStackValid(stack) && stack.stackSize > 0) { - if (stack.getItem() == ConfigItems.itemResearchNotes - && !stack.stackTagCompound.getBoolean("complete")) { - ResearchNoteData noteData = ResearchManager.getData(stack); - if (noteData == null) continue; - ResearchItem researchItem = ResearchCategories.getResearch(noteData.key); - if (researchItem == null) continue; - - this.mEfficiency = 10000 - (this.getIdealStatus() - this.getRepairStatus()) * 1000; - this.mEfficiencyIncrease = 10000; - this.calculateOverclockedNessMultiInternal( - RECIPE_EUT, - RECIPE_LENGTH, - 1, - this.getMaxInputVoltage(), - false); - if (this.mMaxProgresstime == 2147483646 && this.mEUt == 2147483646) { - return false; - } - if (this.mEUt > 0) { - this.mEUt = -this.mEUt; - } - - // Create a completed version of the note to output - this.mOutputItems = new ItemStack[] { GTUtility.copyAmount(1, stack) }; - this.mOutputItems[0].stackTagCompound.setBoolean("complete", true); - this.mOutputItems[0].setItemDamage(64); - stack.stackSize -= 1; - this.aspectsAbsorbed = 0; - this.recipeAspectCost = (int) Math.ceil(researchItem.tags.visSize() * NODE_COST_MULTIPLIER); - - this.lastNodeDistance = 0; - this.lastNodeColor = 0; - - this.sendLoopStart((byte) 20); - this.updateSlots(); - return true; - } - } - } - - return false; - } - - @Override - public boolean checkMachine(IGregTechTileEntity iGregTechTileEntity, ItemStack itemStack) { - mLength = 1; - mCasing = 0; - endFound = false; - - // check front - if (!checkPiece(STRUCTURE_PIECE_FIRST, 1, 1, 0)) return false; - - // check middle pieces - while (!endFound && mLength++ < MAX_LENGTH) { - if (!checkPiece(STRUCTURE_PIECE_LATER, 1, 1, -(mLength - 1))) return false; - } - - return endFound && mLength >= 3 - && checkPiece(STRUCTURE_PIECE_LAST, 0, 1, -(mLength - 1)) - && mCasing >= mLength * 3; - } - - @Override - public int getMaxEfficiency(ItemStack itemStack) { - return 10000; - } - - @Override - public int getPollutionPerTick(ItemStack itemStack) { - return 0; - } - - @Override - public int getDamageToComponent(ItemStack itemStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack itemStack) { - return false; - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity iGregTechTileEntity) { - return new GT_MetaTileEntity_ResearchCompleter(this.mName); - } - - protected void onCasingFound() { - mCasing++; - } - - protected void onEndFound() { - endFound = true; - } - - @Override - public ITexture[] getTexture(IGregTechTileEntity aBaseMetaTileEntity, ForgeDirection side, ForgeDirection facing, - int ColorIndex, boolean aActive, boolean aRedstone) { - if (side == facing) { - if (aActive) return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), - TextureFactory.builder().addIcon(OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE).extFacing().build(), - TextureFactory.builder().addIcon(OVERLAY_FRONT_RESEARCH_COMPLETER_ACTIVE_GLOW).extFacing().glow() - .build() }; - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), - TextureFactory.builder().addIcon(OVERLAY_FRONT_RESEARCH_COMPLETER).extFacing().build(), - TextureFactory.builder().addIcon(OVERLAY_FRONT_RESEARCH_COMPLETER_GLOW).extFacing().glow() - .build() }; - } - return new ITexture[] { Textures.BlockIcons.getCasingTextureForId(CASING_INDEX) }; - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected MultiblockTooltipBuilder createTooltip() { - MultiblockTooltipBuilder tt = new MultiblockTooltipBuilder(); - tt.addMachineType("Research Completer") - .addInfo("Completes Thaumcraft research notes using EU and Thaumcraft nodes") - .addInfo("Place nodes in the center row").beginVariableStructureBlock(3, 3, 3, 3, 3, MAX_LENGTH, true) - .addController("Front center") - .addOtherStructurePart("Magical machine casing", "Top and bottom layers outside. 3 x L minimum") - .addOtherStructurePart("Warded glass", "Middle layer outside").addEnergyHatch("Any casing") - .addMaintenanceHatch("Any casing").addInputBus("Any casing").addOutputBus("Any casing") - .toolTipFinisher(); - return tt; - } - - @Override - public void construct(ItemStack stackSize, boolean hintsOnly) { - buildPiece(STRUCTURE_PIECE_FIRST, stackSize, hintsOnly, 1, 1, 0); - int tTotalLength = Math.min(MAX_LENGTH, stackSize.stackSize + 2); - for (int i = 1; i < tTotalLength; i++) { - buildPiece(STRUCTURE_PIECE_LATER_HINT, stackSize, hintsOnly, 1, 1, -i); - } - buildPiece(STRUCTURE_PIECE_LAST, stackSize, hintsOnly, 0, 1, -(tTotalLength - 1)); - } -} diff --git a/src/main/java/emt/util/EMTCraftingAspects.java b/src/main/java/emt/util/EMTCraftingAspects.java index 32ef750..541d8a9 100644 --- a/src/main/java/emt/util/EMTCraftingAspects.java +++ b/src/main/java/emt/util/EMTCraftingAspects.java @@ -98,8 +98,4 @@ public class EMTCraftingAspects { public static AspectList aerGenerator = new AspectList().add(Aspect.EXCHANGE, 16).add(Aspect.AIR, 8); public static AspectList uuMatterCrystal = new AspectList().add(Aspect.CRYSTAL, 8).add(Aspect.COLD, 8) .add(Aspect.MAGIC, 8); - public static AspectList researchCompleter = new AspectList().add(Aspect.FIRE, 50).add(Aspect.WATER, 50) - .add(Aspect.AIR, 50).add(Aspect.EARTH, 50).add(Aspect.ORDER, 50).add(Aspect.ENTROPY, 50); - public static AspectList magicalMachineCasing = new AspectList().add(Aspect.FIRE, 8).add(Aspect.AIR, 8) - .add(Aspect.ORDER, 8); } diff --git a/src/main/java/emt/util/EMTResearchAspects.java b/src/main/java/emt/util/EMTResearchAspects.java index 7f04da4..dd473c5 100644 --- a/src/main/java/emt/util/EMTResearchAspects.java +++ b/src/main/java/emt/util/EMTResearchAspects.java @@ -94,6 +94,4 @@ public class EMTResearchAspects { public static AspectList quantumWing = new AspectList().add(Aspect.FLIGHT, 5).add(Aspect.AIR, 5) .add(Aspect.MECHANISM, 8).add(Aspect.ENERGY, 4); public static AspectList aerGenerator = new AspectList().add(Aspect.EXCHANGE, 4).add(Aspect.AIR, 3); - public static AspectList researchCompleter = new AspectList().add(Aspect.MIND, 8).add(Aspect.MECHANISM, 5) - .add(Aspect.EXCHANGE, 5).add(Aspect.AURA, 4); } diff --git a/src/main/resources/assets/emt/lang/en_US.lang b/src/main/resources/assets/emt/lang/en_US.lang index 3211c68..c04f835 100644 --- a/src/main/resources/assets/emt/lang/en_US.lang +++ b/src/main/resources/assets/emt/lang/en_US.lang @@ -416,7 +416,3 @@ emt.text.Quantum Wings=After exploring all the possibilities of nanotechnologies emt.rsname.Infused Quantum Armor=Infused Quantum Сhestplate. emt.tag.Infused Quantum Armor=The last step is here... emt.text.Infused Quantum Armor=You had been nothing to do and you decided to do something useful. You had an idea in your head of making armor which you can fasten the wings or backpack for being protected in flight. Take the wings or backpack in your hands and sit down to put their on armor. To remove them, hold Shift + "Unequip"(see in options). - -emt.rsname.ResearchCompleter=Automated Research -emt.tag.ResearchCompleter=No more ordo spam -emt.text.ResearchCompleter=It was fun at first, but you've decided it's time to find a better way to handle all this research. By mixing technology and magic you have come up with a multiblock that can complete a research note by itself.

To function, it needs nodes to be placed in the center of the structure and will slowly destroy them while running. Node stabilizers are optional but recommended for keeping so many nodes close together without them destroying each other. diff --git a/src/main/resources/assets/emt/lang/ru_RU.lang b/src/main/resources/assets/emt/lang/ru_RU.lang index 6812767..35ff603 100644 --- a/src/main/resources/assets/emt/lang/ru_RU.lang +++ b/src/main/resources/assets/emt/lang/ru_RU.lang @@ -12,10 +12,10 @@ gui.EMT.inventory=Инвентарь gui.EMT.book.aspect.output.eu.title=Книга выхода эссенции gui.EMT.book.aspect.output.essentia.eu=Выход EU за эссенцию gui.EMT.key.unequip=Снять -emt.Output=Выход: -emt.Storage=Хранилище: +emt.Output=Выход: +emt.Storage=Хранилище: emt.PressShift=<Нажмите SHIFT> -emt.Generating=Генерирует: +emt.Generating=Генерирует: emt.Fuel=горючее #=============Tooltips============= @@ -411,7 +411,3 @@ emt.text.Quantum Wings=После исследования всех возмож emt.rsname.Infused Quantum Armor=Наполненный квантовый нагрудник. emt.tag.Infused Quantum Armor=Последний шаг... emt.text.Infused Quantum Armor=Вам было нечего делать, и Вы решили заняться хоть чем-то полезным. Вам в голову пришла идея создания брони, на которую можно нацепить крылья или ранец, чтобы быть защищёнными в полёте. Возмите в руку крылья или ранец, и присядьте чтобы надеть их на броню. Чтобы снять их, зажмите Shift + "Снять"(Смотрите в настройках). - -emt.rsname.ResearchCompleter=Автоматизированное исследование -emt.tag.ResearchCompleter=Больше никакого спама -emt.text.ResearchCompleter=Поначалу это было весело, но вы решили, что пришло время найти лучший способ провести все эти исследования. Смешав технологию и магию, вы создали мультиблок, который может самостоятельно завершить исследовательскую заметку.

Для работы ему необходимо, чтобы узлы были размещены в центре конструкции, и он будет медленно разрушать их во время работы. Стабилизаторы узлов не являются обязательными, но рекомендуются для удержания большого количества узлов близко друг к другу, не разрушая друг друга. diff --git a/src/main/resources/assets/emt/lang/zh_CN.lang b/src/main/resources/assets/emt/lang/zh_CN.lang index 70daba6..91741af 100644 --- a/src/main/resources/assets/emt/lang/zh_CN.lang +++ b/src/main/resources/assets/emt/lang/zh_CN.lang @@ -406,7 +406,3 @@ emt.text.Quantum Wings=在探索完纳米科技所有的可能性后,你决定 emt.rsname.Infused Quantum Armor=注魔量子胸甲 emt.tag.Infused Quantum Armor=最后的一步... emt.text.Infused Quantum Armor=你已经无事可做,但是你决定做一些有用的东西.你的脑海中浮现出一个想法,在制作盔甲时可以把羽翼或者背包系在一起以保证飞行的安全.持有羽翼或者背包时在潜行状态下右击可以将它们系在盔甲上.要将它们拿下来时只需要按住Shift + [卸下装备]键(详见[选项]-[控制]). - -emt.rsname.ResearchCompleter=自动化研究 -emt.tag.ResearchCompleter=再也不用担心秩序危机了 -emt.text.ResearchCompleter=连连看一开始很有趣,但你已经决定寻找一种更好的方法解决所有的研究.最终,你结合科技与魔法,制造出了一台多方块机器,可以自动完成研究笔记.

需要将灵气节点放在机器内部才能使其正常运行,而且在运行过程中,机器会缓慢摧毁这些节点.节点稳定器不是必须品,但为了让这么多节点不互相打架,我们还是推荐使用节点稳定器.