Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2c5781e
Add universal wireless terminal,and start adding OpenComputer Upgrade
zeng-github01 Oct 4, 2024
3287718
Remove Opencomputer Upgrade
zeng-github01 Oct 4, 2024
0b5ee2e
Optimizing the code
zeng-github01 Oct 7, 2024
332d525
PatternMultiTool Fixes
zeng-github01 Oct 14, 2024
06ca997
Add Fluid Pattern Module support for Universal Terminal
zeng-github01 Oct 14, 2024
56b8b6a
fix build.yml
zeng-github01 Oct 19, 2024
097efc7
Fix NBT Conflict
zeng-github01 Dec 5, 2024
a1382cb
Keep ItemStack in crafting terminal
zeng-github01 Dec 6, 2024
a02d36d
minor change
zeng-github01 Dec 6, 2024
4d324e6
NBT Keep
zeng-github01 Dec 7, 2024
c1909c6
When making a universal terminal, transfer the original NBT to the ne…
zeng-github01 Dec 7, 2024
1d7f183
Add universal wireless terminal,and start adding OpenComputer Upgrade
zeng-github01 Oct 4, 2024
c8e6b76
Remove Opencomputer Upgrade
zeng-github01 Oct 4, 2024
3e10536
Optimizing the code
zeng-github01 Oct 7, 2024
a9dd3bb
Add Fluid Pattern Module support for Universal Terminal
zeng-github01 Oct 14, 2024
fb434cc
Fix NBT Conflict
zeng-github01 Dec 5, 2024
6408fd3
Keep ItemStack in crafting terminal
zeng-github01 Dec 6, 2024
9bd7174
minor change
zeng-github01 Dec 6, 2024
31aa6d6
NBT Keep
zeng-github01 Dec 7, 2024
642da5b
When making a universal terminal, transfer the original NBT to the ne…
zeng-github01 Dec 7, 2024
88a3003
Merge remote-tracking branch 'origin/rework-ec2-port' into rework-ec2…
zeng-github01 Mar 19, 2025
dda3eb2
logical update
zeng-github01 Mar 22, 2025
f134d47
add temp lib
zeng-github01 Mar 22, 2025
b7348f8
update gradle script
zeng-github01 Mar 22, 2025
948a969
Add missing recipe
zeng-github01 Mar 23, 2025
60bb4cc
Add missing localization
zeng-github01 Mar 23, 2025
b27c2ea
Fix PMT Buttons Missing in Interface Term in Obf Env
IntegerLimit Apr 20, 2025
eb79acd
Fix Hard Dependency on MekEng
IntegerLimit Apr 21, 2025
2e3c53e
Merge remote-tracking branch 'IntegerLimit/mek-eng-crash'
zeng-github01 Dec 7, 2025
337673d
Merge remote-tracking branch 'origin/fix-gas-cell-recipe'
zeng-github01 Dec 7, 2025
70f2fe9
Merge remote-tracking branch 'origin/rework-ec2-port'
zeng-github01 Dec 7, 2025
c5aa7de
Fix Hard Dependency on MekEng and AE2FC
zeng-github01 Dec 7, 2025
da0a353
Update zh_cn.lang
zeng-github01 Dec 7, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Binary file added libs/Fluid Craft for AE2-2.6.6-r.jar
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package co.neeve.nae2.common.api.config;

public enum WirelessTerminalType {
ITEM,
FLUID,
GAS,
CRAFTING,
PATTERN,
INTERFACE,
FLUID_PATTERN,
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/co/neeve/nae2/common/features/Features.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<? extends ISubFeature> subFeatures = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<ItemStack> wirelessTerminals = new ArrayList<>();
public static final List<ItemStack> terminals = new ArrayList<>();
public static final List<WirelessTerminalType> 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<WirelessTerminalType> 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<WirelessTerminalType> 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<WirelessTerminalType> 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);
}
}
Loading