diff --git a/dependencies.gradle b/dependencies.gradle index 519e7df..67f995e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -22,11 +22,12 @@ * For more details, see https://docs.gradle.org/8.0.1/userguide/java_library_plugin.html#sec:java_library_configurations_graph */ dependencies { + implementation files('libs/Fluid Craft for AE2-2.6.6-r.jar') implementation rfg.deobf("curse.maven:ae2-extended-life-570458:6302098") - implementation rfg.deobf("curse.maven:ae2-fluid-crafting-rework-623955:5751930") +// implementation rfg.deobf("curse.maven:ae2-fluid-crafting-rework-623955:5751930") compileOnlyApi rfg.deobf("curse.maven:baubles-227083:2518667") compileOnlyApi rfg.deobf("curse.maven:jei-238222:4538010") - compileOnlyApi rfg.deobf("curse.maven:gregtechceu-557242:5519022") + implementation rfg.deobf("curse.maven:gregtechceu-557242:4951281") implementation rfg.deobf("curse.maven:actually-additions-228404:3117927") implementation rfg.deobf("curse.maven:codechicken-lib-1-8-242818:2779848") implementation rfg.deobf("curse.maven:mekanism-energistics-1027681:5408319") diff --git a/libs/Fluid Craft for AE2-2.6.6-r.jar b/libs/Fluid Craft for AE2-2.6.6-r.jar new file mode 100644 index 0000000..00dbe61 Binary files /dev/null and b/libs/Fluid Craft for AE2-2.6.6-r.jar differ diff --git a/src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java b/src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java new file mode 100644 index 0000000..89d6af1 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java @@ -0,0 +1,11 @@ +package co.neeve.nae2.common.api.config; + +public enum WirelessTerminalType { + ITEM, + FLUID, + GAS, + CRAFTING, + PATTERN, + INTERFACE, + FLUID_PATTERN, +} diff --git a/src/main/java/co/neeve/nae2/common/containers/ContainerPatternMultiTool.java b/src/main/java/co/neeve/nae2/common/containers/ContainerPatternMultiTool.java index 2572dab..e489722 100644 --- a/src/main/java/co/neeve/nae2/common/containers/ContainerPatternMultiTool.java +++ b/src/main/java/co/neeve/nae2/common/containers/ContainerPatternMultiTool.java @@ -264,7 +264,7 @@ public void onSlotChange(Slot s) { } } - if (!dropList.isEmpty()) { + if (dropList.size() > 0) { var tileEntity = this.iface.getTileEntity(); var world = tileEntity.getWorld(); var blockPos = tileEntity.getPos(); @@ -282,7 +282,7 @@ public void onSlotChange(Slot s) { var itemA = srInv.getStackInSlot(0); var itemB = srInv.getStackInSlot(1); - if (itemA.isEmpty()) return; + if (itemA.isEmpty() || itemB.isEmpty()) return; var itemBData = ItemStackHelper.stackToNBT(itemB); var crafting = new InventoryCrafting(new ContainerNull(), 3, 3); @@ -310,7 +310,8 @@ public void onSlotChange(Slot s) { if (!isCrafting) lists.add(tagOut); var fluidStackIn = FluidUtil.getFluidContained(itemA); - var fluidReplacement = ae2fc && fluidStackIn != null; + var fluidStackOut = FluidUtil.getFluidContained(itemB); + var fluidReplacement = ae2fc && fluidStackIn != null && fluidStackOut != null; for (var list : lists) { var idx = 0; @@ -328,10 +329,10 @@ public void onSlotChange(Slot s) { list.set(idx, data); } else continue; } else if (fluidReplacement && stack.getItem() instanceof ItemFluidDrop) { - FluidStack fluidStack = FakeItemRegister.getStack(stack); + var fluidStack = FakeItemRegister.getStack(stack); // This should never be a crafting pattern. - if (fluidStackIn.isFluidEqual(fluidStack)) { + if (fluidStackIn.isFluidEqual(((FluidStack) fluidStack))) { result = ValidatonResult.OK; } } diff --git a/src/main/java/co/neeve/nae2/common/features/Features.java b/src/main/java/co/neeve/nae2/common/features/Features.java index 03de78d..24d52b2 100644 --- a/src/main/java/co/neeve/nae2/common/features/Features.java +++ b/src/main/java/co/neeve/nae2/common/features/Features.java @@ -41,7 +41,8 @@ public boolean isEnabled() { }, DENSE_CPU_COPROCESSORS("dense.coprocessor"), DENSE_FLUID_CELLS(), - EXPOSER(); + EXPOSER(), + UNIVERSAL_TERMINAL("universalterminal"); private String[] mixins; private EnumSet subFeatures = null; diff --git a/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java new file mode 100644 index 0000000..bcee680 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java @@ -0,0 +1,294 @@ +package co.neeve.nae2.common.helpers; + +import appeng.api.AEApi; +import appeng.util.Platform; +import co.neeve.nae2.common.api.config.WirelessTerminalType; +import com.glodblock.github.loader.FCItems; +import com.mekeng.github.common.ItemAndBlocks; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.fml.common.registry.GameRegistry; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.List; + +public class UniversalTerminalHelper { + public static final List wirelessTerminals = new ArrayList<>(); + public static final List terminals = new ArrayList<>(); + public static final List WIRELESS_TERMINAL_TYPE_LIST = Arrays.asList(WirelessTerminalType.values()); + + private static final boolean isMekEngLoaded = Platform.isModLoaded("mekeng"); + private static final boolean isAE2FCLoaded = Platform.isModLoaded("ae2fc"); + private static Item wireless_gas_terminal = ForgeRegistries.ITEMS.getValue(new ResourceLocation("mekeng", "wireless_gas_terminal")); + private static Item gas_terminal = ForgeRegistries.ITEMS.getValue(new ResourceLocation("mekeng", "gas_terminal")); + private static Item wireless_fluid_pattern_terminal = ForgeRegistries.ITEMS.getValue(new ResourceLocation("ae2fc", "wireless_fluid_pattern_terminal")); + private static Item part_fluid_pattern_terminal = ForgeRegistries.ITEMS.getValue(new ResourceLocation("ae2fc", "part_fluid_pattern_terminal")); + + static { + wirelessTerminals.add(AEApi.instance().definitions().items().wirelessTerminal().maybeStack(1).orElse(null)); + wirelessTerminals.add(AEApi.instance().definitions().items().wirelessFluidTerminal().maybeStack(1).orElse(null)); + wirelessTerminals.add(AEApi.instance().definitions().items().wirelessCraftingTerminal().maybeStack(1).orElse(null)); + wirelessTerminals.add(AEApi.instance().definitions().items().wirelessPatternTerminal().maybeStack(1).orElse(null)); + + terminals.add(AEApi.instance().definitions().parts().terminal().maybeStack(1).orElse(null)); + terminals.add(AEApi.instance().definitions().parts().craftingTerminal().maybeStack(1).orElse(null)); + terminals.add(AEApi.instance().definitions().parts().patternTerminal().maybeStack(1).orElse(null)); + terminals.add(AEApi.instance().definitions().parts().fluidTerminal().maybeStack(1).orElse(null)); + + if (isMekEngLoaded) { + if (wireless_gas_terminal != null) { + wirelessTerminals.add(new ItemStack(wireless_gas_terminal)); + } + if (gas_terminal != null) { + terminals.add(new ItemStack(gas_terminal)); + } + } + + if (isAE2FCLoaded) { + if (wireless_fluid_pattern_terminal != null) { + wirelessTerminals.add(new ItemStack(wireless_fluid_pattern_terminal)); + } + if (part_fluid_pattern_terminal != null) { + terminals.add(new ItemStack(part_fluid_pattern_terminal)); + } + } + } + + public static boolean isWirelessTerminal(ItemStack stack) { + if (stack == ItemStack.EMPTY) return false; + + int itemDamage = stack.getItemDamage(); + Item item = stack.getItem(); + + ItemStack wirelessTerminal = AEApi.instance().definitions().items().wirelessTerminal().maybeStack(1).orElse(null); + if (wirelessTerminal != null && wirelessTerminal.getItem() == item && wirelessTerminal.getItemDamage() == itemDamage) + return true; + + ItemStack wirelessFluidTerminal = AEApi.instance().definitions().items().wirelessFluidTerminal().maybeStack(1).orElse(null); + if (wirelessFluidTerminal != null && wirelessFluidTerminal.getItem() == item && wirelessFluidTerminal.getItemDamage() == itemDamage) + return true; + + if (isMekEngLoaded) { + ItemStack wirelessGasTerminal = new ItemStack(wireless_gas_terminal); + if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.getItemDamage() == itemDamage) return true; + } + + if (isAE2FCLoaded) { + ItemStack fluidPatternWirelessTerminal = new ItemStack(wireless_fluid_pattern_terminal); + if (fluidPatternWirelessTerminal.getItem() == item && fluidPatternWirelessTerminal.getItemDamage() == itemDamage) return true; + } + + ItemStack wirelessCraftingTerminal = AEApi.instance().definitions().items().wirelessCraftingTerminal().maybeStack(1).orElse(null); + if (wirelessCraftingTerminal != null && wirelessCraftingTerminal.getItem() == item && wirelessCraftingTerminal.getItemDamage() == itemDamage) + return true; + + ItemStack wirelessPatternTerminal = AEApi.instance().definitions().items().wirelessPatternTerminal().maybeStack(1).orElse(null); + if (wirelessPatternTerminal != null && wirelessPatternTerminal.getItem() == item && wirelessPatternTerminal.getItemDamage() == itemDamage) + return true; + + return false; + } + + public static boolean isTerminal(ItemStack stack) { + if (stack == ItemStack.EMPTY) return false; + + Item item = stack.getItem(); + int itemDamage = stack.getItemDamage(); + + ItemStack terminal = AEApi.instance().definitions().parts().terminal().maybeStack(1).orElse(null); + if (terminal != null && terminal.getItem() == item && terminal.getItemDamage() == itemDamage) return true; + + ItemStack fluidTerminal = AEApi.instance().definitions().parts().fluidTerminal().maybeStack(1).orElse(null); + if (fluidTerminal != null && fluidTerminal.getItem() == item && fluidTerminal.getItemDamage() == itemDamage) + return true; + + if (isMekEngLoaded) { + ItemStack gasTerminal = new ItemStack(gas_terminal); + if (gasTerminal.getItem() == item && gasTerminal.getItemDamage() == itemDamage) return true; + } + + if (isAE2FCLoaded) { + ItemStack fluidPatternTerminal = new ItemStack(part_fluid_pattern_terminal); + if (fluidPatternTerminal.getItem() == item && fluidPatternTerminal.getItemDamage() == itemDamage) return true; + } + + ItemStack craftingTerminal = AEApi.instance().definitions().parts().craftingTerminal().maybeStack(1).orElse(null); + if (craftingTerminal != null && craftingTerminal.getItem() == item && craftingTerminal.getItemDamage() == itemDamage) + return true; + + ItemStack patternTerminal = AEApi.instance().definitions().parts().patternTerminal().maybeStack(1).orElse(null); + if (patternTerminal != null && patternTerminal.getItem() == item && patternTerminal.getItemDamage() == itemDamage) + return true; + + ItemStack interfaceTerminal = AEApi.instance().definitions().parts().interfaceTerminal().maybeStack(1).orElse(null); + if (interfaceTerminal != null && interfaceTerminal.getItem() == item && interfaceTerminal.getItemDamage() == itemDamage) + return true; + + return false; + } + + public static WirelessTerminalType getTerminalType(ItemStack stack) { + if (stack == ItemStack.EMPTY) return null; + + Item item = stack.getItem(); + int itemDamage = stack.getItemDamage(); + + ItemStack terminal = AEApi.instance().definitions().parts().terminal().maybeStack(1).orElse(null); + if (terminal != null && terminal.getItem() == item && terminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.ITEM; + } + + ItemStack fluidTerminal = AEApi.instance().definitions().parts().fluidTerminal().maybeStack(1).orElse(null); + if (fluidTerminal != null && fluidTerminal.getItem() == item && fluidTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.FLUID; + } + + ItemStack craftingTerminal = AEApi.instance().definitions().parts().craftingTerminal().maybeStack(1).orElse(null); + if (craftingTerminal != null && fluidTerminal.getItem() == item && craftingTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.CRAFTING; + } + + ItemStack patternTerminal = AEApi.instance().definitions().parts().patternTerminal().maybeStack(1).orElse(null); + if (patternTerminal != null && patternTerminal.getItem() == item && patternTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.PATTERN; + } + + ItemStack interfaceTerminal = AEApi.instance().definitions().parts().interfaceTerminal().maybeStack(1).orElse(null); + if (interfaceTerminal != null && interfaceTerminal.getItem() == item && interfaceTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.INTERFACE; + } + + //Wireless Terminal + + ItemStack wirelessTerminal = AEApi.instance().definitions().items().wirelessTerminal().maybeStack(1).orElse(null); + if (wirelessTerminal != null && wirelessTerminal.getItem() == item && wirelessTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.ITEM; + } + + ItemStack wirelessFluidTerminal = AEApi.instance().definitions().items().wirelessFluidTerminal().maybeStack(1).orElse(null); + if (wirelessFluidTerminal != null && wirelessFluidTerminal.getItem() == item && wirelessFluidTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.FLUID; + } + + ItemStack wirelessCraftingTerminal = AEApi.instance().definitions().items().wirelessCraftingTerminal().maybeStack(1).orElse(null); + if (wirelessCraftingTerminal != null && wirelessCraftingTerminal.getItem() == item && wirelessCraftingTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.CRAFTING; + } + + ItemStack wirelessPatternTerminal = AEApi.instance().definitions().items().wirelessPatternTerminal().maybeStack(1).orElse(null); + if (wirelessPatternTerminal != null && wirelessPatternTerminal.getItem() == item && wirelessPatternTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.PATTERN; + } + + ItemStack wirelessInterfaceTerminal = AEApi.instance().definitions().items().wirelessInterfaceTerminal().maybeStack(1).orElse(null); + if (wirelessInterfaceTerminal != null && wirelessInterfaceTerminal.getItem() == item && wirelessInterfaceTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.INTERFACE; + } + + //MekEng Integration + if (isMekEngLoaded) { + ItemStack gasTerminal = new ItemStack(gas_terminal); + if (gasTerminal.getItem() == item && gasTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.GAS; + } + + ItemStack wirelessGasTerminal = new ItemStack(wireless_gas_terminal); + if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.GAS; + } + } + + if (isAE2FCLoaded) { + ItemStack fluidPatternTerminal = new ItemStack(part_fluid_pattern_terminal); + if (fluidPatternTerminal.getItem() == item && fluidPatternTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.FLUID_PATTERN; + } + + ItemStack fluidPatternWirelessTerminal = new ItemStack(wireless_fluid_pattern_terminal); + if (fluidPatternWirelessTerminal.getItem() == item && fluidPatternWirelessTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.FLUID_PATTERN; + } + } + + return null; + } + + public static boolean isModuleValid(WirelessTerminalType type) { + return switch (type) { + case FLUID_PATTERN -> Platform.isModLoaded("ae2fc"); + case GAS -> Platform.isModLoaded("mekeng"); + default -> true; + }; + } + + + public static ItemStack changeMode(ItemStack itemStack, EntityPlayer player, NBTTagCompound tag) { + EnumSet installedModules = getInstalledModules(itemStack); + int type = tag.getInteger("type"); + WirelessTerminalType terminalType; + do { + type = (type + 1) % WIRELESS_TERMINAL_TYPE_LIST.size(); + terminalType = WIRELESS_TERMINAL_TYPE_LIST.get(type); + + } while (!isModuleValid(terminalType) || !installedModules.contains(terminalType)); + + tag.setInteger("type", type); + + return itemStack; + } + + public static EnumSet getInstalledModules(ItemStack itemStack) { + if (itemStack == ItemStack.EMPTY || itemStack.getItem() == ItemStack.EMPTY.getItem()) { + return EnumSet.noneOf(WirelessTerminalType.class); + } + + NBTTagCompound tag = Platform.openNbtData(itemStack); + int installed = tag.hasKey("modules") ? tag.getInteger("modules") : 0; + + EnumSet set = EnumSet.noneOf(WirelessTerminalType.class); + + for (WirelessTerminalType x : WirelessTerminalType.values()) { + if ((installed >> x.ordinal()) % 2 == 1) { + set.add(x); + } + } + + return set; + } + + public static boolean isInstalled(ItemStack itemStack, WirelessTerminalType module) { + if (itemStack == ItemStack.EMPTY || itemStack.getItem() == ItemStack.EMPTY.getItem()) { + return false; + } + + NBTTagCompound tag = Platform.openNbtData(itemStack); + int installed = tag.hasKey("modules") ? tag.getInteger("modules") : 0; + + return 1 == (installed >>> module.ordinal()) % 2; + } + + public static void installModule(ItemStack itemStack, WirelessTerminalType module) { + if (isInstalled(itemStack, module) || itemStack == ItemStack.EMPTY) { + return; + } + + int install = 1 << module.ordinal(); + + NBTTagCompound tag = Platform.openNbtData(itemStack); + + int installed; + if (tag.hasKey("modules")) { + installed = tag.getInteger("modules") + install; + } else { + installed = install; + } + + tag.setInteger("modules", installed); + } +} diff --git a/src/main/java/co/neeve/nae2/common/integration/jei/NAEJEIPlugin.java b/src/main/java/co/neeve/nae2/common/integration/jei/NAEJEIPlugin.java index 6bbeb09..6596384 100644 --- a/src/main/java/co/neeve/nae2/common/integration/jei/NAEJEIPlugin.java +++ b/src/main/java/co/neeve/nae2/common/integration/jei/NAEJEIPlugin.java @@ -2,6 +2,7 @@ import appeng.api.definitions.IItemDefinition; import appeng.api.implementations.items.IStorageCell; +import co.neeve.nae2.common.features.Features; import co.neeve.nae2.common.features.subfeatures.JEIFeatures; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; @@ -16,6 +17,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -108,5 +110,13 @@ public void register(@NotNull IModRegistry registry) { for (var blacklistEntry : ingredientBlacklist) { blacklistEntry.maybeStack(1).ifPresent(blacklist::addIngredientToBlacklist); } + + if (Features.UNIVERSAL_TERMINAL.isEnabled()) { + List recipeWrappers = new ArrayList<>(); + recipeWrappers.add(new UniversalTerminalRecipeWrapper(true)); + recipeWrappers.add(new UniversalTerminalRecipeWrapper(false)); + + registry.addRecipes(recipeWrappers,VanillaRecipeCategoryUid.CRAFTING); + } } } diff --git a/src/main/java/co/neeve/nae2/common/integration/jei/UniversalTerminalRecipeWrapper.java b/src/main/java/co/neeve/nae2/common/integration/jei/UniversalTerminalRecipeWrapper.java new file mode 100644 index 0000000..b5121ce --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/integration/jei/UniversalTerminalRecipeWrapper.java @@ -0,0 +1,44 @@ +package co.neeve.nae2.common.integration.jei; + +import co.neeve.nae2.NAE2; +import co.neeve.nae2.common.helpers.UniversalTerminalHelper; +import mezz.jei.api.ingredients.IIngredients; +import mezz.jei.api.ingredients.VanillaTypes; +import mezz.jei.api.recipe.IRecipeWrapper; +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class UniversalTerminalRecipeWrapper implements IRecipeWrapper { + public UniversalTerminalRecipeWrapper(boolean isUniversalTerminal) { + this.isUniversalTerminal = isUniversalTerminal; + } + + private final boolean isUniversalTerminal; + + + @Override + public void getIngredients(IIngredients iIngredients) { + List> inputList = new ArrayList<>(); + + if (isUniversalTerminal) { + List input = new ArrayList<>(); + ItemStack itemStack = NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).orElse(null); + if (itemStack != ItemStack.EMPTY) { + input.add(itemStack); + } + + inputList.add(input); + } else { + inputList.add(UniversalTerminalHelper.wirelessTerminals); + } + + inputList.add(UniversalTerminalHelper.terminals); + + iIngredients.setInputLists(VanillaTypes.ITEM, inputList); + if (NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).isPresent()){ + iIngredients.setOutput(VanillaTypes.ITEM,NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).get()); + } + } +} diff --git a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java new file mode 100644 index 0000000..313d1fa --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java @@ -0,0 +1,141 @@ +package co.neeve.nae2.common.items; + +import appeng.api.AEApi; +import appeng.api.config.Actionable; +import appeng.core.sync.GuiBridge; +import appeng.core.sync.GuiWrapper; +import appeng.items.tools.powered.ToolWirelessTerminal; +import appeng.util.Platform; +import co.neeve.nae2.NAE2; +import co.neeve.nae2.common.api.config.WirelessTerminalType; +import co.neeve.nae2.common.helpers.UniversalTerminalHelper; +import com.glodblock.github.handler.AEGuiBridgeHandler; +import com.mekeng.github.common.container.handler.AEGuiBridge; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ActionResult; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumHand; +import net.minecraft.util.NonNullList; +import net.minecraft.util.text.translation.I18n; +import net.minecraft.world.World; +import net.minecraftforge.fml.common.network.IGuiHandler; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + + +import java.util.List; + +import static co.neeve.nae2.common.helpers.UniversalTerminalHelper.*; + +public class WirelessTerminalUniversal extends ToolWirelessTerminal { + @Override + public IGuiHandler getGuiHandler(ItemStack is) { + return switch (WIRELESS_TERMINAL_TYPE_LIST.get(Platform.openNbtData(is).getInteger("type"))) { + case ITEM -> GuiBridge.GUI_WIRELESS_TERM; + case FLUID -> GuiBridge.GUI_WIRELESS_FLUID_TERMINAL; + case GAS -> GuiWrapper.INSTANCE.wrap(AEGuiBridge.WIRELESS_GAS_TERM); + case CRAFTING -> GuiBridge.GUI_WIRELESS_CRAFTING_TERMINAL; + case PATTERN -> GuiBridge.GUI_WIRELESS_PATTERN_TERMINAL; + case INTERFACE -> GuiBridge.GUI_WIRELESS_INTERFACE_TERMINAL; + case FLUID_PATTERN -> GuiWrapper.INSTANCE.wrap(AEGuiBridgeHandler.WIRELESS_FLUID_PATTERN_TERMINAL); + default -> GuiBridge.GUI_WIRELESS_TERM; + }; + } + + @Override + public boolean canHandle(ItemStack is) { + return is.getItem() == NAE2.definitions().items().universalWirelessTerminal().maybeItem().orElse(null); + } + + @Override + public ActionResult onItemRightClick(World w, EntityPlayer player, EnumHand hand) { + ItemStack stack = player.getHeldItem(hand); + NBTTagCompound tagCompound = Platform.openNbtData(stack); + if (w.isRemote) { + if (player.isSneaking()) { + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + if (!tagCompound.hasKey("type")) { + tagCompound.setInteger("type", 0); + } + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + + if (!tagCompound.hasKey("type")) { + tagCompound.setInteger("type", 0); + } + if (player.isSneaking()) { + if (stack == ItemStack.EMPTY) { + return new ActionResult(EnumActionResult.FAIL, stack); + } + return new ActionResult(EnumActionResult.SUCCESS, changeMode(stack, player, tagCompound)); + } + + AEApi.instance().registries().wireless().openWirelessTerminalGui(stack, w, player); + + return new ActionResult(EnumActionResult.SUCCESS, stack); + } + + @Override + @SideOnly(Side.CLIENT) + public void addCheckedInformation(ItemStack stack, World world, List lines, ITooltipFlag advancedTooltips) { + NBTTagCompound tag = Platform.openNbtData(stack); + if (!tag.hasKey("type")) { + tag.setInteger("type", 0); + } + + lines.add( + I18n.translateToLocal("nae2.tooltip.universal_wireless_terminal.mode") + ": " + I18n.translateToLocal( + "nae2.tooltip.universal_wireless_terminal." + WirelessTerminalType.values()[tag.getInteger( + "type" + )].toString().toLowerCase() + ) + ); + + lines.add(I18n.translateToLocal("nae2.tooltip.universal_wireless_terminal.installed")); + for (WirelessTerminalType wirelessTerminalType : getInstalledModules(stack)) { + lines.add("- " + I18n.translateToLocal("nae2.tooltip.universal_wireless_terminal." + wirelessTerminalType.name().toLowerCase())); + } + + super.addCheckedInformation(stack, world, lines, advancedTooltips); + } + + @Override + protected void getCheckedSubItems(CreativeTabs creativeTab, NonNullList itemStacks) { + if (!isInCreativeTab(creativeTab)) { + return; + } + int modulesValue = 0; + for (WirelessTerminalType type : WirelessTerminalType.values()) { + if (UniversalTerminalHelper.isModuleValid(type)) { + modulesValue |= (1 << type.ordinal()); + } + } + + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("modules", modulesValue); + ItemStack itemStack = new ItemStack(this); + itemStack.setTagCompound(tag); + itemStacks.add(itemStack.copy()); + injectAEPower(itemStack, getAEMaxPower(itemStack), Actionable.MODULATE); + itemStacks.add(itemStack); + } + + @Override + public String getHighlightTip(ItemStack item, String displayName) { + NBTTagCompound tag = Platform.openNbtData(item); + if (!tag.hasKey("type")) { + tag.setInteger("type", 0); + } + + return displayName + " - " + I18n.translateToLocal( + "nae2.tooltip.universal_wireless_terminal." + WirelessTerminalType.values()[tag.getInteger( + "type" + )].toString().toLowerCase() + ); + } +} diff --git a/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java b/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java index 37c3b35..2d4d979 100644 --- a/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java +++ b/src/main/java/co/neeve/nae2/common/items/cells/DenseGasCell.java @@ -2,6 +2,7 @@ import appeng.core.Api; import co.neeve.nae2.common.registration.definitions.Materials; +import com.mekeng.github.common.ItemAndBlocks; import com.mekeng.github.common.me.data.IAEGasStack; import com.mekeng.github.common.me.storage.IGasStorageChannel; import net.minecraft.item.ItemStack; @@ -22,4 +23,11 @@ public IGasStorageChannel getChannel() { public int getTotalTypes(@NotNull ItemStack cellItem) { return 15; } + + /** + * Seperated out from the main Items registration class to prevent loading of MekEng classes + */ + public static ItemStack getBaseCell() { + return new ItemStack(ItemAndBlocks.GAS_CELL_1k); + } } diff --git a/src/main/java/co/neeve/nae2/common/net/messages/PatternMultiToolPacket.java b/src/main/java/co/neeve/nae2/common/net/messages/PatternMultiToolPacket.java index 3c68a02..f321208 100644 --- a/src/main/java/co/neeve/nae2/common/net/messages/PatternMultiToolPacket.java +++ b/src/main/java/co/neeve/nae2/common/net/messages/PatternMultiToolPacket.java @@ -143,7 +143,7 @@ private void searchAndReplace(IContainerPatternMultiTool host, EntityPlayerMP pl var itemA = srInv.getStackInSlot(0); var itemB = srInv.getStackInSlot(1); - if (itemA.isEmpty()) return; + if (itemA.isEmpty() || itemB.isEmpty()) return; var itemBData = ItemStackHelper.stackToNBT(itemB); var crafting = new InventoryCrafting(new ContainerNull(), 3, 3); @@ -165,7 +165,7 @@ private void searchAndReplace(IContainerPatternMultiTool host, EntityPlayerMP pl var fluidStackIn = FluidUtil.getFluidContained(itemA); var fluidStackOut = FluidUtil.getFluidContained(itemB); - var fluidReplacement = ae2fc && fluidStackIn != null; + var fluidReplacement = ae2fc && fluidStackIn != null && fluidStackOut != null; var lists = new NBTTagList[]{ tagIn, tagOut }; for (var list : lists) { @@ -174,26 +174,14 @@ private void searchAndReplace(IContainerPatternMultiTool host, EntityPlayerMP pl var compound = (NBTTagCompound) tag; var stack = ItemStackHelper.stackFromNBT(compound); if (itemA.isItemEqual(stack)) { - if (itemB.isEmpty()) { - list.removeTag(idx); - continue; - } - var count = compound.getTag(countTag).copy(); var data = itemBData.copy(); data.setTag(countTag, count); list.set(idx, data); - idx--; - } else if (fluidReplacement && stack.getItem() instanceof ItemFluidDrop) { // ¯\_(ツ)_/¯ - FluidStack fluidStack = FakeItemRegister.getStack(stack); - if (fluidStackIn.isFluidEqual(fluidStack)) { - if (itemB.isEmpty()) { - list.removeTag(idx); - continue; - } - + var fluidStack = FakeItemRegister.getStack(stack); + if (fluidStackIn.isFluidEqual(((FluidStack) fluidStack))) { var ifd = FakeFluids.packFluid2Drops(fluidStackOut); NBTTagCompound ifdCompound; if (ifd == null || (ifdCompound = ifd.getTagCompound()) == null) continue; @@ -201,14 +189,12 @@ private void searchAndReplace(IContainerPatternMultiTool host, EntityPlayerMP pl var data = compound.copy(); data.setTag("tag", ifdCompound); list.set(idx, data); - } } idx++; } } - // Validate if (nbt.getBoolean("crafting")) { try { diff --git a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java new file mode 100644 index 0000000..1bff9df --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java @@ -0,0 +1,169 @@ +package co.neeve.nae2.common.recipes; + +import appeng.api.config.Actionable; +import appeng.api.features.INetworkEncodable; +import appeng.api.implementations.items.IAEItemPowerStorage; +import appeng.util.Platform; +import co.neeve.nae2.NAE2; +import co.neeve.nae2.common.api.config.WirelessTerminalType; +import co.neeve.nae2.common.helpers.UniversalTerminalHelper; +import co.neeve.nae2.common.items.WirelessTerminalUniversal; +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.registries.IForgeRegistryEntry; + +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +public class UniversalTerminalRecipe extends IForgeRegistryEntry.Impl implements IRecipe { + + @Override + public boolean matches(InventoryCrafting inv, World worldIn) { + boolean hasWireless = false; + boolean isUniversal = false; + boolean hasTerminal = false; + EnumSet terminals = EnumSet.noneOf(WirelessTerminalType.class); + ItemStack terminal = ItemStack.EMPTY; + int size = inv.getSizeInventory(); + for (int i = 0; i < size; i++) { + ItemStack stack = inv.getStackInSlot(i); + if (!stack.isEmpty()) { + Item item = stack.getItem(); + if (item == NAE2.definitions().items().universalWirelessTerminal().maybeItem().orElse(null)) { + hasWireless = true; + isUniversal = true; + terminal = stack; + } + + if (UniversalTerminalHelper.isWirelessTerminal(stack)) { + if (hasWireless) { + return false; + } + hasWireless = true; + terminal = stack; + } else if (UniversalTerminalHelper.isTerminal(stack)) { + hasTerminal = true; + + WirelessTerminalType terminalType = UniversalTerminalHelper.getTerminalType(stack); + + if (terminals.contains(terminalType)) { + return false; + } + + if (terminalType != null) { + terminals.add(terminalType); + } + } + } + } + + if (!(hasTerminal && hasWireless)) { + return false; + } + + if (isUniversal) { + for (WirelessTerminalType terminalType : terminals) { + if (UniversalTerminalHelper.isInstalled(terminal, terminalType)) { + return false; + } + } + + return true; + } + + WirelessTerminalType terminalType = UniversalTerminalHelper.getTerminalType(terminal); + + for (WirelessTerminalType wirelessTerminalType : terminals) { + if (wirelessTerminalType == terminalType) { + return false; + } + } + + return true; + + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) { + boolean isUniversal = false; + EnumSet terminals = EnumSet.noneOf(WirelessTerminalType.class); + ItemStack terminal = ItemStack.EMPTY; + for (int i = 0; i < inv.getSizeInventory(); i++) { + ItemStack stack = inv.getStackInSlot(i); + if (!stack.isEmpty()) { + Item item = stack.getItem(); + Item universalTerminalItem = NAE2.definitions().items().universalWirelessTerminal().maybeItem().orElse(null); + if (item == universalTerminalItem) { + isUniversal = true; + terminal = stack.copy(); + } else if (UniversalTerminalHelper.isWirelessTerminal(stack)) { + terminal = stack.copy(); + } else if (UniversalTerminalHelper.isTerminal(stack)) { + WirelessTerminalType terminalType = UniversalTerminalHelper.getTerminalType(stack); + if (terminalType != null) { + terminals.add(terminalType); + } + } + } + } + + if (isUniversal) { + for (WirelessTerminalType terminalType : terminals) { + UniversalTerminalHelper.installModule(terminal, terminalType); + } + } else { + WirelessTerminalType terminalType = UniversalTerminalHelper.getTerminalType(terminal); + ItemStack universalTerminal = NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).orElse(ItemStack.EMPTY); + + universalTerminal.setTagCompound(terminal.getTagCompound()); + + if (terminalType != null) { + UniversalTerminalHelper.installModule(universalTerminal, terminalType); + Platform.openNbtData(universalTerminal).setInteger("type", terminalType.ordinal()); + } + + if (terminalType == WirelessTerminalType.PATTERN) { + NBTTagCompound compound = Platform.openNbtData(universalTerminal); + compound.setTag("craftingGridPattern",compound.getTag("craftingGrid")); + compound.removeTag("craftingGrid"); + } + + terminal = universalTerminal; + for (WirelessTerminalType x : terminals) { + UniversalTerminalHelper.installModule(terminal, x); + } + } + + return terminal; + } + + @Override + public boolean canFit(int width, int height) { + return (width >= 1 && height >= 2) || (width >= 2 && height >= 1); + } + + @Override + public ItemStack getRecipeOutput() { + if (NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).isPresent()) { + ItemStack itemStack = NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).get(); + itemStack.setItemDamage(1); + + return itemStack; + } + + return ItemStack.EMPTY; + } + + @Override + public NonNullList getRemainingItems(InventoryCrafting inv) { + return ForgeHooks.defaultRecipeGetRemainingItems(inv); + } +} diff --git a/src/main/java/co/neeve/nae2/common/registration/Registration.java b/src/main/java/co/neeve/nae2/common/registration/Registration.java index 0794048..3fd68ef 100644 --- a/src/main/java/co/neeve/nae2/common/registration/Registration.java +++ b/src/main/java/co/neeve/nae2/common/registration/Registration.java @@ -5,7 +5,9 @@ import appeng.core.AEConfig; import appeng.core.features.AEFeature; import appeng.util.Platform; +import co.neeve.nae2.common.features.Features; import co.neeve.nae2.common.integration.ae2fc.AE2FC; +import co.neeve.nae2.common.recipes.UniversalTerminalRecipe; import co.neeve.nae2.common.recipes.handlers.DisassembleRecipe; import co.neeve.nae2.common.registration.definitions.*; import co.neeve.nae2.common.registration.registry.Registry; @@ -83,6 +85,10 @@ public void registerRecipes(RegistryEvent.Register event) { registry.register(new DisassembleRecipe().setRegistryName("disassemble")); } + if (Features.UNIVERSAL_TERMINAL.isEnabled()) { + registry.register(new UniversalTerminalRecipe().setRegistryName("universal_terminal")); + } + this.registry.getBootstrapComponents(IRecipeRegistrationComponent.class) .forEachRemaining(b -> b.recipeRegistration(side, registry)); } diff --git a/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java b/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java index 1b46900..6857b6c 100644 --- a/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java +++ b/src/main/java/co/neeve/nae2/common/registration/definitions/Items.java @@ -3,6 +3,8 @@ import appeng.api.AEApi; import appeng.api.config.Upgrades; import appeng.api.definitions.IItemDefinition; +import appeng.api.features.IWirelessTermHandler; +import appeng.bootstrap.components.IInitComponent; import appeng.bootstrap.components.IPostInitComponent; import appeng.bootstrap.components.IRecipeRegistrationComponent; import appeng.core.features.ItemDefinition; @@ -11,6 +13,7 @@ import co.neeve.nae2.common.features.Features; import co.neeve.nae2.common.features.subfeatures.VoidCellFeatures; import co.neeve.nae2.common.items.VirtualPattern; +import co.neeve.nae2.common.items.WirelessTerminalUniversal; import co.neeve.nae2.common.items.cells.DenseFluidCell; import co.neeve.nae2.common.items.cells.DenseGasCell; import co.neeve.nae2.common.items.cells.DenseItemCell; @@ -57,6 +60,7 @@ public class Items implements Definitions { private final IItemDefinition storageCellGas4096K; private final IItemDefinition storageCellGas16384K; private final IItemDefinition virtualPattern; + private final IItemDefinition universalWirelessTerminal; public Items(Registry registry) { this.virtualPattern = this.registerById(registry.item("virtual_pattern", VirtualPattern::new) @@ -86,10 +90,14 @@ public Items(Registry registry) { .features(Features.VOID_CELLS) .build()); - this.gasStorageCellVoid = this.registerById( - registry.item("gas_storage_cell_void", VoidGasCell::new) - .features(Features.VOID_CELLS, Features.DENSE_GAS_CELLS) - .build()); + if (Features.DENSE_GAS_CELLS.isEnabled()) { + this.gasStorageCellVoid = this.registerById( + registry.item("gas_storage_cell_void", VoidGasCell::new) + .features(Features.VOID_CELLS) + .build()); + } else { + this.gasStorageCellVoid = new ItemDefinition("gas_storage_cell_void", null); + } var voidCells = new Object2ObjectArrayMap(); if (this.storageCellVoid.isEnabled()) voidCells.put("item", this.storageCellVoid); @@ -168,29 +176,44 @@ public Items(Registry registry) { .features(Features.DENSE_FLUID_CELLS) .build()); - this.storageCellGas256K = this.registerById(registry.item("storage_cell_gas_256k", () -> - new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_256K, - (int) Math.pow(2, 8))) - .features(Features.DENSE_GAS_CELLS) - .build()); - - this.storageCellGas1024K = this.registerById(registry.item("storage_cell_gas_1024k", () -> - new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_1024K, - (int) Math.pow(2, 10))) - .features(Features.DENSE_GAS_CELLS) - .build()); - - this.storageCellGas4096K = this.registerById(registry.item("storage_cell_gas_4096k", () -> - new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_4096K, - (int) Math.pow(2, 12))) - .features(Features.DENSE_GAS_CELLS) - .build()); - - this.storageCellGas16384K = this.registerById(registry.item("storage_cell_gas_16384k", () -> - new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_16384K, - (int) Math.pow(2, 14))) - .features(Features.DENSE_GAS_CELLS) - .build()); + if (Features.DENSE_GAS_CELLS.isEnabled()) { + this.storageCellGas256K = this.registerById(registry.item("storage_cell_gas_256k", () -> + new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_256K, + (int) Math.pow(2, 8))) + .features(Features.DENSE_GAS_CELLS) + .build()); + + this.storageCellGas1024K = this.registerById(registry.item("storage_cell_gas_1024k", () -> + new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_1024K, + (int) Math.pow(2, 10))) + .features(Features.DENSE_GAS_CELLS) + .build()); + + this.storageCellGas4096K = this.registerById(registry.item("storage_cell_gas_4096k", () -> + new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_4096K, + (int) Math.pow(2, 12))) + .features(Features.DENSE_GAS_CELLS) + .build()); + + this.storageCellGas16384K = this.registerById(registry.item("storage_cell_gas_16384k", () -> + new DenseGasCell(Materials.MaterialType.CELL_GAS_PART_16384K, + (int) Math.pow(2, 14))) + .features(Features.DENSE_GAS_CELLS) + .build()); + } else { + this.storageCellGas256K = new ItemDefinition("storage_cell_gas_256k", null); + this.storageCellGas1024K = new ItemDefinition("storage_cell_gas_1024k", null); + this.storageCellGas4096K = new ItemDefinition("storage_cell_gas_4096k", null); + this.storageCellGas16384K = new ItemDefinition("storage_cell_gas_16384k", null); + } + + this.universalWirelessTerminal = this.registerById(registry.item("universal_wireless_terminal", WirelessTerminalUniversal::new) + .features(Features.UNIVERSAL_TERMINAL) + .bootstrap((item) -> (IInitComponent) r -> { + AEApi.instance().registries().wireless().registerWirelessHandler((IWirelessTermHandler) item); + Upgrades.MAGNET.registerItem(new ItemStack(item),1); + }) + .build()); registry.addBootstrapComponent((IPostInitComponent) r -> { var items = AEApi.instance().definitions().items(); @@ -217,12 +240,12 @@ public Items(Registry registry) { } if (Features.DENSE_GAS_CELLS.isEnabled()) { - mirrorCellUpgrades(new ItemStack(ItemAndBlocks.GAS_CELL_1k), new IItemDefinition[]{ + mirrorCellUpgrades(DenseGasCell.getBaseCell(), new IItemDefinition[]{ this.storageCellGas256K, this.storageCellGas1024K, this.storageCellGas4096K, this.storageCellGas16384K, - this.storageCellVoid + this.gasStorageCellVoid }); } }); @@ -328,4 +351,6 @@ public IItemDefinition storageCellGas4096K() { public IItemDefinition storageCellGas16384K() { return this.storageCellGas16384K; } + + public IItemDefinition universalWirelessTerminal() {return this.universalWirelessTerminal;} } diff --git a/src/main/java/co/neeve/nae2/common/registration/registry/builders/NAEItemDefinitionBuilder.java b/src/main/java/co/neeve/nae2/common/registration/registry/builders/NAEItemDefinitionBuilder.java index 0110882..c8d0940 100644 --- a/src/main/java/co/neeve/nae2/common/registration/registry/builders/NAEItemDefinitionBuilder.java +++ b/src/main/java/co/neeve/nae2/common/registration/registry/builders/NAEItemDefinitionBuilder.java @@ -99,7 +99,7 @@ public INAEItemBuilder hide() { @Override public ItemDefinition build() { - if (this.features != null && Arrays.stream(this.features).noneMatch(IFeature::isEnabled)) { + if (this.features != null && !Arrays.stream(this.features).allMatch(IFeature::isEnabled)) { return new ItemDefinition(this.registryName, null); } diff --git a/src/main/java/co/neeve/nae2/mixin/patternmultitool/client/pmthosts/MixinGuiInterfaceTerminal.java b/src/main/java/co/neeve/nae2/mixin/patternmultitool/client/pmthosts/MixinGuiInterfaceTerminal.java index 0008d7f..b419025 100644 --- a/src/main/java/co/neeve/nae2/mixin/patternmultitool/client/pmthosts/MixinGuiInterfaceTerminal.java +++ b/src/main/java/co/neeve/nae2/mixin/patternmultitool/client/pmthosts/MixinGuiInterfaceTerminal.java @@ -80,16 +80,16 @@ public int getPMTOffsetY() { at = @At( value = "INVOKE", target = "Ljava/util/List;clear()V", - shift = At.Shift.AFTER - ), remap = false - ) + shift = At.Shift.AFTER, + remap = false + )) public void injectDrawScreen(CallbackInfo ci) { if (this.patternMultiToolButtons != null) { this.buttonList.addAll(this.patternMultiToolButtons); } } - @Inject(method = "initGui", at = @At("RETURN"), remap = false) + @Inject(method = "initGui", at = @At("RETURN")) private void injectButtons(CallbackInfo ci) { this.initializePatternMultiTool(); } diff --git a/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java b/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java new file mode 100644 index 0000000..b5669d1 --- /dev/null +++ b/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java @@ -0,0 +1,45 @@ +package co.neeve.nae2.mixin.universalterminal; + +import appeng.container.implementations.ContainerWirelessPatternTerminal; +import appeng.helpers.WirelessTerminalGuiObject; +import appeng.tile.inventory.AppEngInternalInventory; +import co.neeve.nae2.NAE2; +import net.minecraft.nbt.NBTTagCompound; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = ContainerWirelessPatternTerminal.class, remap = false) +public abstract class MixinContainerWirelessPatternTerminal { + + @Shadow + @Final + private WirelessTerminalGuiObject wirelessTerminalGUIObject; + + @Redirect( + method = "loadFromNBT", + at = @At(value = "INVOKE", target = "Lappeng/tile/inventory/AppEngInternalInventory;readFromNBT(Lnet/minecraft/nbt/NBTTagCompound;Ljava/lang/String;)V", ordinal = 0) + ) + private void loadFromNBT(AppEngInternalInventory instance, NBTTagCompound data, String name) { + if (NAE2.definitions().items().universalWirelessTerminal().isSameAs(wirelessTerminalGUIObject.getItemStack())) { + instance.readFromNBT(data, "craftingGridPattern"); + } else { + instance.readFromNBT(data, name); + } + } + + @Redirect( + method = "saveChanges", + at = @At(value = "INVOKE", target = "Lappeng/tile/inventory/AppEngInternalInventory;writeToNBT(Lnet/minecraft/nbt/NBTTagCompound;Ljava/lang/String;)V", ordinal = 0) + ) + public void saveChanges(AppEngInternalInventory instance, NBTTagCompound data, String name) { + if (NAE2.definitions().items().universalWirelessTerminal().isSameAs(wirelessTerminalGUIObject.getItemStack())) { + instance.writeToNBT(data, "craftingGridPattern"); + } else { + instance.writeToNBT(data, name); + } + + } +} diff --git a/src/main/resources/assets/nae2/lang/en_us.lang b/src/main/resources/assets/nae2/lang/en_us.lang index a1c83da..f265bfa 100644 --- a/src/main/resources/assets/nae2/lang/en_us.lang +++ b/src/main/resources/assets/nae2/lang/en_us.lang @@ -6,6 +6,7 @@ itemGroup.nae2=Neeve's AE2:EL Additions # Items item.nae2.invalid.name=Invalid or Disabled Item item.nae2.pattern_multiplier.name=Pattern Multi-Tool +item.nae2.universal_wireless_terminal.name=Universal Wireless Terminal # Cells item.nae2.storage_cell_void.name=ME Void Storage Cell @@ -108,3 +109,18 @@ nae2.jei.cellview.keybind=Press %s to view contents nae2.exposer.tooltip=Exposes the network contents as capabilities. The cooler ME Interface. nae2.exposer.noneregistered=No handlers registered. nae2.exposer.registered=Registered handlers: + +# Universal Wireless Terminal +nae2.tooltip.universal_wireless_terminal.mode=Mode +nae2.tooltip.universal_wireless_terminal.installed=Installed +nae2.tooltip.universal_wireless_terminal.item=Item +nae2.tooltip.universal_wireless_terminal.fluid=Fluid +nae2.tooltip.universal_wireless_terminal.gas=Gas +nae2.tooltip.universal_wireless_terminal.crafting=Crafting +nae2.tooltip.universal_wireless_terminal.pattern=Pattern +nae2.tooltip.universal_wireless_terminal.interface=Interface +nae2.tooltip.universal_wireless_terminal.fluid_pattern=Fluid Pattern + + + + diff --git a/src/main/resources/assets/nae2/lang/zh_cn.lang b/src/main/resources/assets/nae2/lang/zh_cn.lang index 3dc412a..669f4fe 100644 --- a/src/main/resources/assets/nae2/lang/zh_cn.lang +++ b/src/main/resources/assets/nae2/lang/zh_cn.lang @@ -6,10 +6,12 @@ itemGroup.nae2=Neeve的AE2:EL附加工具 # Items item.nae2.invalid.name=无效或禁用的物品 item.nae2.pattern_multiplier.name=多功能样板工具 +item.nae2.universal_wireless_terminal.name=通用无线终端 # Cells item.nae2.storage_cell_void.name=ME虚空存储元件 item.nae2.fluid_storage_cell_void.name=ME流体虚空存储元件 +item.nae2.gas_storage_cell_void.name=ME气体虚空存储元件 item.nae2.storage_cell_256k.name=§c256k§r-ME存储元件 item.nae2.storage_cell_1024k.name=§61024k§r-ME存储元件 item.nae2.storage_cell_4096k.name=§e4096k§r-ME存储元件 @@ -18,6 +20,10 @@ item.nae2.storage_cell_fluid_256k.name=§c256k§r-ME流体存储元件 item.nae2.storage_cell_fluid_1024k.name=§61024k§r-ME流体存储元件 item.nae2.storage_cell_fluid_4096k.name=§e4096k§r-ME流体存储元件 item.nae2.storage_cell_fluid_16384k.name=§a16384k§r-ME流体存储元件 +item.nae2.storage_cell_gas_256k.name=§c256k§r-ME气体存储元件 +item.nae2.storage_cell_gas_1024k.name=§61024k§r-ME气体存储元件 +item.nae2.storage_cell_gas_4096k.name=§e4096k§r-ME气体存储元件 +item.nae2.storage_cell_gas_16384k.name=§a16384k§r-ME气体存储元件 # Materials item.nae2.material.cell_part_void.name=ME虚空存储组件 @@ -29,14 +35,21 @@ item.nae2.material.cell_part_fluid_256k.name=§c256k§r-ME流体存储组件 item.nae2.material.cell_part_fluid_1024k.name=§61024k§r-ME流体存储组件 item.nae2.material.cell_part_fluid_4096k.name=§e4096k§r-ME流体存储组件 item.nae2.material.cell_part_fluid_16384k.name=§a16384k§r-ME流体存储组件 +item.nae2.material.cell_part_gas_256k.name=§c256k§r-ME气体存储组件 +item.nae2.material.cell_part_gas_1024k.name=§61024k§r-ME气体存储组件 +item.nae2.material.cell_part_gas_4096k.name=§e4096k§r-ME气体存储组件 +item.nae2.material.cell_part_gas_16384k.name=§a16384k§r-ME气体存储组件 # Parts item.nae2.part.beam_former.name=ME光束成型器 +item.nae2.part.exposer.name=ME存储暴露器 # Upgrades item.nae2.upgrade.hyper_acceleration.name=超速卡 item.nae2.upgrade.auto_complete.name=工作自动完成卡 item.nae2.upgrade.auto_complete.desc=自动完成作业,无需等待输出。 +item.nae2.upgrade.gregtech_circuit.name=编程电路卡 +item.nae2.upgrade.gregtech_circuit.desc=自动在机器和总线上设置编程电路。\n需要在编码样板中放置相关的电路。\n不要忘记启用阻塞模式!\n\n对不起,Seni. # Tiles tile.nae2.reconstruction_chamber.name=原子再构室 @@ -48,6 +61,7 @@ tile.nae2.storage_crafting_256k.name=§c256k§r合成存储器 tile.nae2.storage_crafting_1024k.name=§61024k§r合成存储器 tile.nae2.storage_crafting_4096k.name=§e4096k§r合成存储器 tile.nae2.storage_crafting_16384k.name=§a16384k§r合成存储器 +tile.nae2.exposer.name=ME存储暴露器 # Pattern Multi-Tool GUI nae2.pattern_multiplier.unencode=清除 @@ -70,11 +84,11 @@ nae2.storage_cell_void.count=已存储%s %s能量。 nae2.jei.missing.craft.1=[NAE2] 所有缺失物品均可合成。 nae2.jei.missing.craft.2=按住 Ctrl 来批量请求合成。 -nae2.jei.missing.partialcraft.1=[NAE2] Some items found craftable. -nae2.jei.missing.partialcraft.2=Hold Ctrl to bypass and mass-order missing items. +nae2.jei.missing.partialcraft.1=[NAE2] 发现部分物品可合成。 +nae2.jei.missing.partialcraft.2=按住 Ctrl 跳过并批量订购缺失的物品。 -nae2.jei.missing.bypasscraft.1=[NAE2] No items found craftable. -nae2.jei.missing.bypasscraft.2=Hold Ctrl to bypass and fill the grid as much as possible. +nae2.jei.missing.bypasscraft.1=[NAE2] 未发现可合成的物品。 +nae2.jei.missing.bypasscraft.2=按住 Ctrl 跳过并尽可能填充网格。 nae2.jei.cellview.items=物品 nae2.jei.cellview.buckets=桶 @@ -90,3 +104,20 @@ nae2.jei.cellview.hover.1=已占用 %s 种类型。 nae2.jei.cellview.hover.2=每种占用类型均会损耗容量。 nae2.jei.cellview.hover.3=%s 字节/类型 * %s = %s 字节损耗。 nae2.jei.cellview.keybind=按下 %s 来浏览内容 + +# Exposer +nae2.exposer.tooltip=将网络内容作为能力暴露出来。更酷的 ME 接口。 +nae2.exposer.noneregistered=未注册任何处理程序。 +nae2.exposer.registered=已注册的处理程序: + +# Universal Wireless Terminal +nae2.tooltip.universal_wireless_terminal.mode=模式 +nae2.tooltip.universal_wireless_terminal.installed=已安装 +nae2.tooltip.universal_wireless_terminal.item=物品 +nae2.tooltip.universal_wireless_terminal.fluid=流体 +nae2.tooltip.universal_wireless_terminal.gas=气体 +nae2.tooltip.universal_wireless_terminal.crafting=合成 +nae2.tooltip.universal_wireless_terminal.pattern=样板 +nae2.tooltip.universal_wireless_terminal.interface=接口 +nae2.tooltip.universal_wireless_terminal.fluid_pattern=流体样板 + diff --git a/src/main/resources/assets/nae2/models/item/universal_wireless_terminal.json b/src/main/resources/assets/nae2/models/item/universal_wireless_terminal.json new file mode 100644 index 0000000..d86af72 --- /dev/null +++ b/src/main/resources/assets/nae2/models/item/universal_wireless_terminal.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "nae2:item/universal_wireless_terminal" + } +} diff --git a/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_1024k.json b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_1024k.json new file mode 100644 index 0000000..19559db --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_1024k.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "appliedenergistics2:material_exists", + "material": "material.empty_storage_cell" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_1024k" + } + ] + } + ], + "result": { + "item": "nae2:storage_cell_gas_1024k" + }, + "type": "forge:ore_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "material.empty_storage_cell" + }, + { + "type": "nae2:material", + "name": "cell_part_gas_1024k" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_16384k.json b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_16384k.json new file mode 100644 index 0000000..f664040 --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_16384k.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "appliedenergistics2:material_exists", + "material": "material.empty_storage_cell" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_16384k" + } + ] + } + ], + "result": { + "item": "nae2:storage_cell_gas_16384k" + }, + "type": "forge:ore_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "material.empty_storage_cell" + }, + { + "type": "nae2:material", + "name": "cell_part_gas_16384k" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_256k.json b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_256k.json new file mode 100644 index 0000000..438a57f --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_256k.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "appliedenergistics2:material_exists", + "material": "material.empty_storage_cell" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_256k" + } + ] + } + ], + "result": { + "item": "nae2:storage_cell_gas_256k" + }, + "type": "forge:ore_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "material.empty_storage_cell" + }, + { + "type": "nae2:material", + "name": "cell_part_gas_256k" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_4096k.json b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_4096k.json new file mode 100644 index 0000000..e35dfd8 --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/cell/storage_cell_gas_4096k.json @@ -0,0 +1,31 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "appliedenergistics2:material_exists", + "material": "material.empty_storage_cell" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_4096k" + } + ] + } + ], + "result": { + "item": "nae2:storage_cell_gas_4096k" + }, + "type": "forge:ore_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "material.empty_storage_cell" + }, + { + "type": "nae2:material", + "name": "cell_part_gas_4096k" + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_1024k.json b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_1024k.json new file mode 100644 index 0000000..f2bd65e --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_1024k.json @@ -0,0 +1,52 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "minecraft:item_exists", + "item": "appliedenergistics2:quartz_glass" + }, + { + "type": "appliedenergistics2:material_exists", + "material": "material.calculation_processor" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_256k" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_1024k" + } + ] + } + ], + "result": { + "type": "material", + "name": "cell_part_gas_1024k" + }, + "type": "nae2:shaped_recipe", + "pattern": [ + "aba", + "cdc", + "aca" + ], + "key": { + "b": { + "type": "appliedenergistics2:part", + "part": "material.calculation_processor" + }, + "c": { + "type": "nae2:material", + "name": "cell_part_gas_256k" + }, + "d": { + "item": "appliedenergistics2:quartz_glass" + }, + "a": { + "type": "forge:ore_dict", + "ore": "dustRefinedObsidian" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_16384k.json b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_16384k.json new file mode 100644 index 0000000..6cddd6c --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_16384k.json @@ -0,0 +1,52 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "minecraft:item_exists", + "item": "appliedenergistics2:quartz_glass" + }, + { + "type": "appliedenergistics2:material_exists", + "material": "material.calculation_processor" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_4096k" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_16384k" + } + ] + } + ], + "result": { + "type": "material", + "name": "cell_part_gas_16384k" + }, + "type": "nae2:shaped_recipe", + "pattern": [ + "aba", + "cdc", + "aca" + ], + "key": { + "b": { + "type": "appliedenergistics2:part", + "part": "material.calculation_processor" + }, + "c": { + "type": "nae2:material", + "name": "cell_part_gas_4096k" + }, + "d": { + "item": "appliedenergistics2:quartz_glass" + }, + "a": { + "type": "forge:ore_dict", + "ore": "dustRefinedObsidian" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_256k.json b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_256k.json new file mode 100644 index 0000000..b91423f --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_256k.json @@ -0,0 +1,51 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "minecraft:item_exists", + "item": "appliedenergistics2:quartz_glass" + }, + { + "type": "appliedenergistics2:material_exists", + "material": "material.calculation_processor" + }, + { + "type": "minecraft:item_exists", + "item": "mekeng:gas_core_64k" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_256k" + } + ] + } + ], + "result": { + "type": "material", + "name": "cell_part_gas_256k" + }, + "type": "nae2:shaped_recipe", + "pattern": [ + "aba", + "cdc", + "aca" + ], + "key": { + "b": { + "type": "appliedenergistics2:part", + "part": "material.calculation_processor" + }, + "c": { + "item": "mekeng:gas_core_64k" + }, + "d": { + "item": "appliedenergistics2:quartz_glass" + }, + "a": { + "type": "forge:ore_dict", + "ore": "dustRefinedObsidian" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_4096k.json b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_4096k.json new file mode 100644 index 0000000..8acc523 --- /dev/null +++ b/src/main/resources/assets/nae2/recipes/item/material/storage/cell_part_gas_4096k.json @@ -0,0 +1,52 @@ +{ + "conditions": [ + { + "type": "forge:and", + "values": [ + { + "type": "minecraft:item_exists", + "item": "appliedenergistics2:quartz_glass" + }, + { + "type": "appliedenergistics2:material_exists", + "material": "material.calculation_processor" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_1024k" + }, + { + "type": "nae2:material_exists", + "name": "cell_part_gas_4096k" + } + ] + } + ], + "result": { + "type": "material", + "name": "cell_part_gas_4096k" + }, + "type": "nae2:shaped_recipe", + "pattern": [ + "aba", + "cdc", + "aca" + ], + "key": { + "b": { + "type": "appliedenergistics2:part", + "part": "material.calculation_processor" + }, + "c": { + "type": "nae2:material", + "name": "cell_part_gas_1024k" + }, + "d": { + "item": "appliedenergistics2:quartz_glass" + }, + "a": { + "type": "forge:ore_dict", + "ore": "dustRefinedObsidian" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/nae2/textures/item/universal_wireless_terminal.png b/src/main/resources/assets/nae2/textures/item/universal_wireless_terminal.png new file mode 100644 index 0000000..fd514aa Binary files /dev/null and b/src/main/resources/assets/nae2/textures/item/universal_wireless_terminal.png differ diff --git a/src/main/resources/mixins.nae2.universalterminal.json b/src/main/resources/mixins.nae2.universalterminal.json new file mode 100644 index 0000000..747c5c5 --- /dev/null +++ b/src/main/resources/mixins.nae2.universalterminal.json @@ -0,0 +1,11 @@ +{ + "package": "co.neeve.nae2.mixin", + "required": true, + "refmap": "mixins.nae2.refmap.json", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "universalterminal.MixinContainerWirelessPatternTerminal" + ] +} \ No newline at end of file