From 2c5781efd2150fafc3d250ea8230d24b45662259 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Fri, 4 Oct 2024 20:14:41 +0800 Subject: [PATCH 01/11] Add universal wireless terminal,and start adding OpenComputer Upgrade Port from EC2/AEAdditions --- .../api/config/WirelessTerminalType.java | 10 + .../neeve/nae2/common/features/Features.java | 9 +- .../helpers/UniversalTerminalHelper.java | 282 ++++++++++++++++++ .../common/integration/jei/NAEJEIPlugin.java | 10 + .../jei/UniversalTerminalRecipeWrapper.java | 44 +++ .../opencomputer/NetworkControl.java | 232 ++++++++++++++ .../integration/opencomputer/OCUtils.java | 88 ++++++ .../integration/opencomputer/UpgradeAE.java | 57 ++++ .../WirelessHandlerUpgradeAE.java | 144 +++++++++ .../co/neeve/nae2/common/items/OCUpgrade.java | 108 +++++++ .../items/WirelessTerminalUniversal.java | 140 +++++++++ .../recipes/UniversalTerminalRecipe.java | 183 ++++++++++++ .../common/registration/Registration.java | 6 + .../registration/definitions/Items.java | 24 +- .../resources/assets/nae2/lang/en_us.lang | 15 + .../resources/assets/nae2/lang/zh_cn.lang | 11 + .../item/universal_wireless_terminal.json | 6 + .../item/universal_wireless_terminal.png | Bin 0 -> 292 bytes 18 files changed, 1366 insertions(+), 3 deletions(-) create mode 100644 src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java create mode 100644 src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java create mode 100644 src/main/java/co/neeve/nae2/common/integration/jei/UniversalTerminalRecipeWrapper.java create mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java create mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java create mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java create mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java create mode 100644 src/main/java/co/neeve/nae2/common/items/OCUpgrade.java create mode 100644 src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java create mode 100644 src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java create mode 100644 src/main/resources/assets/nae2/models/item/universal_wireless_terminal.json create mode 100644 src/main/resources/assets/nae2/textures/item/universal_wireless_terminal.png 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..22ad60f --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java @@ -0,0 +1,10 @@ +package co.neeve.nae2.common.api.config; + +public enum WirelessTerminalType { + ITEM, + FLUID, + GAS, + CRAFTING, + PATTERN, + INTERFACE +} 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..bb11e3f 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,14 @@ public boolean isEnabled() { }, DENSE_CPU_COPROCESSORS("dense.coprocessor"), DENSE_FLUID_CELLS(), - EXPOSER(); + EXPOSER(), + UNIVERSAL_TERMINAL(), + OPEN_COMPUTER_UPGRADE() { + @Override + public boolean isEnabled() { + return Platform.isModLoaded("opencomputers") && super.isEnabled(); + } + }; 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..d61bc69 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java @@ -0,0 +1,282 @@ +package co.neeve.nae2.common.helpers; + +import appeng.api.AEApi; +import appeng.util.Platform; +import co.neeve.nae2.common.api.config.WirelessTerminalType; +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 java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + +public class UniversalTerminalHelper { + private final static boolean isMekELoaded = Platform.isModLoaded("mekeng"); + public static final List wirelessTerminals = new ArrayList<>(); + public static final List terminals = new ArrayList<>(); + + private static final boolean isMekEngLoaded = Platform.isModLoaded("mekeng"); + 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 (Platform.isModLoaded("mekeng")){ + wirelessTerminals.add(new ItemStack(ItemAndBlocks.WIRELESS_GAS_TERMINAL)); + terminals.add(new ItemStack(ItemAndBlocks.GAS_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(ItemAndBlocks.WIRELESS_GAS_TERMINAL); + if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.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(ItemAndBlocks.GAS_TERMINAL); + if (gasTerminal.getItem() == item && gasTerminal.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 wirelessInterfaceTerminal = AEApi.instance().definitions().parts().interfaceTerminal().maybeStack(1).orElse(null); + if (wirelessInterfaceTerminal != null && wirelessInterfaceTerminal.getItem() == item && wirelessInterfaceTerminal.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; + } + + //MekEng Integration + if (isMekEngLoaded) { + ItemStack gasTerminal = new ItemStack(ItemAndBlocks.GAS_TERMINAL); + if (gasTerminal.getItem() == item && gasTerminal.getItemDamage() == itemDamage){ + return WirelessTerminalType.GAS; + } + + ItemStack wirelessGasTerminal = new ItemStack(ItemAndBlocks.WIRELESS_GAS_TERMINAL); + if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.getItemDamage() == itemDamage){ + return WirelessTerminalType.GAS; + } + } + + return null; + } + + public static ItemStack changeMode(ItemStack itemStack, EntityPlayer player, NBTTagCompound tag) { + EnumSet installed = getInstalledModules(itemStack); + + switch (tag.getInteger("type")) { + case 0 -> { + if (installed.contains(WirelessTerminalType.FLUID)) { + tag.setInteger("type", 1); + } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { + tag.setInteger("type", 2); + } else if (installed.contains(WirelessTerminalType.CRAFTING)) { + tag.setInteger("type", 3); + } + } + + case 1 -> { + if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { + tag.setInteger("type", 2); + } else if (installed.contains(WirelessTerminalType.CRAFTING)) { + tag.setInteger("type", 3); + } else if (installed.contains(WirelessTerminalType.ITEM)) { + tag.setInteger("type", 0); + } + } + + case 2 -> { + if (installed.contains(WirelessTerminalType.CRAFTING)) { + tag.setInteger("type", 3); + } else if (installed.contains(WirelessTerminalType.ITEM)) { + tag.setInteger("type", 0); + } else if (installed.contains(WirelessTerminalType.FLUID)) { + tag.setInteger("type", 1); + } + } + + case 3 -> { + if (installed.contains(WirelessTerminalType.PATTERN)) { + tag.setInteger("type", 4); + } else if (installed.contains(WirelessTerminalType.ITEM)) { + tag.setInteger("type", 0); + } else if (installed.contains(WirelessTerminalType.FLUID)) { + tag.setInteger("type", 1); + } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { + tag.setInteger("type", 2); + } + } + + case 4 -> { + if (installed.contains(WirelessTerminalType.ITEM)) { + tag.setInteger("type", 0); + } else if (installed.contains(WirelessTerminalType.FLUID)) { + tag.setInteger("type", 1); + } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { + tag.setInteger("type", 2); + } + } + default -> { + if (installed.contains(WirelessTerminalType.ITEM)) { + tag.setInteger("type", 0); + } else if (installed.contains(WirelessTerminalType.FLUID)) { + tag.setInteger("type", 1); + } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { + tag.setInteger("type", 2); + } else if (installed.contains(WirelessTerminalType.CRAFTING)) { + tag.setInteger("type", 3); + } else if (installed.contains(WirelessTerminalType.PATTERN)) { + tag.setInteger("type", 4); + } + } + } + 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/integration/opencomputer/NetworkControl.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java new file mode 100644 index 0000000..b68173b --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java @@ -0,0 +1,232 @@ +package co.neeve.nae2.common.integration.opencomputer; + +import appeng.api.AEApi; +import appeng.api.implementations.tiles.IWirelessAccessPoint; +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridBlock; +import appeng.api.networking.IGridHost; +import appeng.api.networking.IGridNode; +import appeng.api.networking.security.IActionHost; +import appeng.api.networking.storage.IStorageGrid; +import appeng.api.storage.IMEMonitor; +import appeng.api.storage.data.IAEFluidStack; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.util.AEPartLocation; +import appeng.api.util.DimensionalCoord; +import appeng.api.util.WorldCoord; +import co.neeve.nae2.NAE2; +import li.cil.oc.api.internal.Agent; +import li.cil.oc.api.internal.Drone; +import li.cil.oc.api.internal.Robot; +import li.cil.oc.api.network.EnvironmentHost; +import li.cil.oc.api.prefab.AbstractManagedEnvironment; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +import java.util.Iterator; + +public abstract class NetworkControl extends AbstractManagedEnvironment { + abstract T tile(); + + abstract EnvironmentHost host(); + +// private Robot robot; +// private Drone drone; +// private Agent agent; + private boolean isActive = false; + + public Robot getRobot() { + if (host() instanceof Robot) { + return (Robot) host(); + } + return null; + } + + public Drone getDrone() { + if (host() instanceof Drone) { + return (Drone) host(); + } + return null; + } + + public Agent getAgent() { + if (host() instanceof Agent) { + return (Agent) host(); + } + return null; + } + + public boolean isActive() { + return isActive; + } + + public void setActive(boolean active) { + isActive = active; + } + + public ItemStack getComponent() { + Robot robot = getRobot(); + Drone drone = getDrone(); + if (robot != null) { + return robot.getStackInSlot(robot.componentSlot(node().address())); + } else if (drone != null) { + Iterator iterator = drone.internalComponents().iterator(); + + while (iterator.hasNext()) { + ItemStack item = iterator.next(); + if (item != null && item.getItem() == NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) { + return item; + } + } + } + + return null; + } + + public IGridHost getSecurity() { + if (host().world().isRemote) { + return null; + } + + ItemStack component = getComponent(); + if (component == null) { + return null; + } + IGridHost security = (IGridHost) AEApi.instance().registries().locatable().getLocatableBy(getAEKey(component)); + + if (checkRange(component, security)) { + return security; + } + + return null; + } + + public boolean checkRange(ItemStack itemStack, IGridHost security) { + if (itemStack == null || security == null) { + return false; + } + + IGridNode gridNode = security.getGridNode(AEPartLocation.INTERNAL); + if (gridNode == null) { + return false; + } + + IGrid grid = gridNode.getGrid(); + if (grid == null) { + return false; + } + + switch (itemStack.getItemDamage()) { + case 0: { + Class wirelessAccessPoint = AEApi.instance().definitions().blocks().wirelessAccessPoint().maybeEntity().get(); + + return grid.getMachines((Class) wirelessAccessPoint).iterator().hasNext(); + } + case 1: { + IGridBlock gridBlock = gridNode.getGridBlock(); + if (gridBlock == null) { + return false; + } + + DimensionalCoord location = gridBlock.getLocation(); + if (location == null) { + return false; + } + + Class accessPoints = AEApi.instance().definitions().blocks().wirelessAccessPoint().maybeEntity().get(); + + for (IGridNode node : grid.getMachines((Class) accessPoints)) { + Agent agent = getAgent(); + IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node; + + WorldCoord distance = accessPoint.getLocation().subtract((int) agent.xPosition(), ((int) agent.yPosition()), ((int) agent.zPosition())); + double squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; + + double range = accessPoint.getRange(); + + if (squaredDistance <= range * range) { + return true; + } + } + + return false; + } + default: { + IGridBlock gridBlock = gridNode.getGridBlock(); + if (gridBlock == null) { + return false; + } + + DimensionalCoord location = gridBlock.getLocation(); + if (location == null) { + return false; + } + + Class accessPoints = AEApi.instance().definitions().blocks().wirelessAccessPoint().maybeEntity().get(); + + for (IGridNode node : grid.getMachines((Class) accessPoints)) { + Agent agent = getAgent(); + IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node; + + WorldCoord distance = accessPoint.getLocation().subtract(((int) agent.xPosition()), ((int) agent.yPosition()), ((int) agent.zPosition())); + double squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; + + double range = accessPoint.getRange() / 2; + + if (squaredDistance <= range * range) { + return true; + } + } + + return false; + } + } + } + + public IGrid getGrid() { + if (host().world().isRemote) { + return null; + } + + IGridHost security = getSecurity(); + if (security == null) { + return null; + } + + IGridNode gridNode = security.getGridNode(AEPartLocation.INTERNAL); + if (gridNode == null) { + return null; + } + + return gridNode.getGrid(); + } + + public long getAEKey(ItemStack itemStack) { + try { + return Long.parseLong(WirelessHandlerUpgradeAE.instance.getEncryptionKey(itemStack)); + } catch (Throwable e) { + // Do nothing + } + + return 0L; + } + + public IMEMonitor getFluidInventory() { + IGrid grid = getGrid(); + if (grid == null) { + return null; + } + + return grid.getCache(IStorageGrid.class); + } + + public IMEMonitor getItemInventory() { + IGrid grid = getGrid(); + if (grid == null) { + return null; + } + + return grid.getCache(IStorageGrid.class); + } + +} diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java new file mode 100644 index 0000000..88f26c9 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java @@ -0,0 +1,88 @@ +package co.neeve.nae2.common.integration.opencomputer; + +import appeng.api.parts.IPart; +import appeng.api.parts.IPartHost; +import appeng.api.util.AEPartLocation; +import li.cil.oc.api.API; +import li.cil.oc.api.detail.ItemInfo; +import li.cil.oc.common.item.data.DroneData; +import li.cil.oc.common.item.data.RobotData; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class OCUtils { + public static

P getPart(World world, BlockPos pos, AEPartLocation location, Class clazz) { + if (world == null || pos == null) { + return null; + } + + TileEntity tile = world.getTileEntity(pos); + + if (!(tile instanceof IPartHost)) { + return null; + } + + if (location == null || location == AEPartLocation.INTERNAL) { + for (AEPartLocation side : AEPartLocation.SIDE_LOCATIONS) { + IPart part = ((IPartHost) tile).getPart(side); + + if (clazz.isInstance(part)) { + return (P) part; + } + } + + return null; + } + + IPart part = ((IPartHost) tile).getPart(location); + + if (!clazz.isInstance(part)) { + return null; + } + + return (P) part; + } + + public static boolean isRobot(ItemStack itemStack) { + ItemInfo item = API.items.get(itemStack); + + return item != null && "robot".equals(item.name()); + } + + public static boolean isDrone(ItemStack itemStack) { + ItemInfo item = API.items.get(itemStack); + + return item != null && "drone".equals(item.name()); + } + + public static ItemStack getComponent(RobotData robot, Item item, int meta) { + for (ItemStack component : robot.components()) { + if (component != null && component.getItem() == item) { + return component; + } + } + + return null; + } + + public static ItemStack getComponent(RobotData robot, Item item) { + return getComponent(robot, item, 0); + } + + public static ItemStack getComponent(DroneData drone, Item item, int meta) { + for (ItemStack component : drone.components()) { + if (component != null && component.getItem() == item) { + return component; + } + } + + return null; + } + + public static ItemStack getComponent(DroneData drone, Item item) { + return getComponent(drone, item, 0); + } +} diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java new file mode 100644 index 0000000..daec750 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java @@ -0,0 +1,57 @@ +package co.neeve.nae2.common.integration.opencomputer; + +import appeng.api.networking.IGridBlock; +import appeng.api.networking.IGridNode; +import appeng.api.util.AEPartLocation; +import appeng.api.util.DimensionalCoord; +import appeng.tile.misc.TileSecurityStation; +import li.cil.oc.api.Network; +import li.cil.oc.api.network.EnvironmentHost; +import li.cil.oc.api.network.Visibility; + +public class UpgradeAE extends NetworkControl { + private final EnvironmentHost host; + + public UpgradeAE(EnvironmentHost envHost) { + this.host = envHost; + setNode(Network.newNode(this, Visibility.Network) + .withConnector() + .withComponent("upgrade_me", Visibility.Network) + .create()); + } + + @Override + public TileSecurityStation tile() throws SecurityException { + TileSecurityStation security = (TileSecurityStation) getSecurity(); + if (security == null) { + throw new SecurityException("No Security Station"); + } + + IGridNode node = security.getGridNode(AEPartLocation.INTERNAL); + if (node == null) { + throw new SecurityException("No Security Station"); + } + + IGridBlock gridBlock = node.getGridBlock(); + if (gridBlock == null) { + throw new SecurityException("No Security Station"); + } + + DimensionalCoord location = gridBlock.getLocation(); + if (location == null) { + throw new SecurityException("No Security Station"); + } + + TileSecurityStation tileSecurity = (TileSecurityStation) location.getWorld().getTileEntity(location.getPos()); + if (tileSecurity == null) { + throw new SecurityException("No Security Station"); + } + + return tileSecurity; + } + + @Override + public EnvironmentHost host() { + return host; + } +} diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java new file mode 100644 index 0000000..93ae037 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java @@ -0,0 +1,144 @@ +package co.neeve.nae2.common.integration.opencomputer; + +import appeng.api.features.IWirelessTermHandler; +import appeng.api.util.IConfigManager; +import appeng.core.sync.GuiBridge; +import co.neeve.nae2.NAE2; +import li.cil.oc.common.item.data.DroneData; +import li.cil.oc.common.item.data.RobotData; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fml.common.network.IGuiHandler; + +public class WirelessHandlerUpgradeAE implements IWirelessTermHandler { + + public final static WirelessHandlerUpgradeAE instance = new WirelessHandlerUpgradeAE(); + + @Override + public String getEncryptionKey(ItemStack itemStack) { + if (itemStack == ItemStack.EMPTY) { + return ""; + } + + if (OCUtils.isRobot(itemStack)) { + return getEncryptionKeyForRobot(itemStack); + } + if (OCUtils.isDrone(itemStack)) { + return getEncryptionKeyForDrone(itemStack); + } + + if (!itemStack.hasTagCompound()) { + itemStack.setTagCompound(new NBTTagCompound()); + } + + return itemStack.getTagCompound().getString("key"); + } + + private String getEncryptionKeyForRobot(ItemStack itemStack) { + RobotData robotData = new RobotData(itemStack); + + ItemStack component = OCUtils.getComponent(robotData, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); + if (component == null) { + return ""; + } + + return getEncryptionKey(component); + } + + private String getEncryptionKeyForDrone(ItemStack itemStack) { + DroneData droneData = new DroneData(itemStack); + + ItemStack component = OCUtils.getComponent(droneData, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); + if (component == null) { + return ""; + } + + return getEncryptionKey(component); + } + + @Override + public void setEncryptionKey(ItemStack itemStack, String encryptionKey, String name) { + if (itemStack == null) { + return; + } + if (OCUtils.isRobot(itemStack)) { + setEncryptionKeyForRobot(itemStack, encryptionKey, name); + return; + } + if (OCUtils.isDrone(itemStack)) { + setEncryptionKeyForDrone(itemStack, encryptionKey, name); + return; + } + + if (!itemStack.hasTagCompound()) { + itemStack.setTagCompound(new NBTTagCompound()); + } + + itemStack.getTagCompound().setString("key", encryptionKey); + } + + private void setEncryptionKeyForRobot(ItemStack itemStack, String encryptionKey, String name) { + RobotData robot = new RobotData(itemStack); + ItemStack component = OCUtils.getComponent(robot, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); + + if (component != null) { + setEncryptionKey(component, encryptionKey, name); + } + + robot.save(itemStack); + } + + private void setEncryptionKeyForDrone(ItemStack itemStack, String encryptionKey, String name) { + DroneData drone = new DroneData(itemStack); + ItemStack component = OCUtils.getComponent(drone, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); + + if (component != null) { + setEncryptionKey(component, encryptionKey, name); + } + + drone.save(itemStack); + } + + @Override + public boolean canHandle(ItemStack itemStack) { + if (itemStack == null) { + return false; + } + + Item item = itemStack.getItem(); + + if (item == NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) { + return true; + } + + boolean robotCheck = OCUtils.isRobot(itemStack) && OCUtils.getComponent(new RobotData(itemStack), NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) != null; + boolean droneCheck = OCUtils.isDrone(itemStack) && OCUtils.getComponent(new DroneData(itemStack), NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) != null; + + return robotCheck || droneCheck; + } + + @Override + public boolean usePower(EntityPlayer entityPlayer, double v, ItemStack itemStack) { + return false; + } + + @Override + public boolean hasPower(EntityPlayer entityPlayer, double v, ItemStack itemStack) { + return true; + } + + @Override + public IConfigManager getConfigManager(ItemStack itemStack) { + return null; + } + + @Override + public IGuiHandler getGuiHandler(ItemStack p0) { + // TODO: Not yet implemented + return GuiBridge.GUI_WIRELESS_TERM; + } +} + diff --git a/src/main/java/co/neeve/nae2/common/items/OCUpgrade.java b/src/main/java/co/neeve/nae2/common/items/OCUpgrade.java new file mode 100644 index 0000000..af7c8dc --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/items/OCUpgrade.java @@ -0,0 +1,108 @@ +package co.neeve.nae2.common.items; + +import co.neeve.nae2.NAE2; +import co.neeve.nae2.common.integration.opencomputer.UpgradeAE; +import li.cil.oc.api.driver.EnvironmentProvider; +import li.cil.oc.api.driver.item.HostAware; +import li.cil.oc.api.driver.item.Slot; +import li.cil.oc.api.internal.Drone; +import li.cil.oc.api.internal.Robot; +import li.cil.oc.api.network.EnvironmentHost; +import li.cil.oc.api.network.ManagedEnvironment; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.NonNullList; +import net.minecraftforge.fml.common.Optional; + +@Optional.InterfaceList(value = { + @Optional.Interface(iface = "li.cil.oc.api.driver.item.HostAware", modid = "opencomputers", striprefs = true), + @Optional.Interface(iface = "li.cil.oc.api.driver.EnvironmentProvider", modid = "opencomputers", striprefs = true) +}) +public class OCUpgrade extends Item implements HostAware, EnvironmentProvider { + public OCUpgrade() { + setHasSubtypes(true); + } + + @Optional.Method(modid = "opencomputers") + @Override + public boolean worksWith(ItemStack itemStack, Class host) { + return worksWith(itemStack) && host != null && (Robot.class.isAssignableFrom(host) || Drone.class.isAssignableFrom(host)); + } + + @Optional.Method(modid = "opencomputers") + @Override + public boolean worksWith(ItemStack itemStack) { + return itemStack != ItemStack.EMPTY && itemStack.getItem() == this; + } + + @Optional.Method(modid = "opencomputers") + @Override + public ManagedEnvironment createEnvironment(ItemStack itemStack, EnvironmentHost environmentHost) { + if (environmentHost == null) { + return null; + } + if (itemStack != ItemStack.EMPTY && itemStack.getItem() == this && worksWith(itemStack, environmentHost.getClass())) { + return new UpgradeAE(environmentHost); + } + + return null; + } + + @Override + public String slot(ItemStack itemStack) { + return Slot.Upgrade; + } + + @Override + public int tier(ItemStack itemStack) { + return switch (itemStack.getItemDamage()) { + case 0 -> 2; + case 1 -> 1; + default -> 0; + }; + } + + @Override + public NBTTagCompound dataTag(ItemStack itemStack) { + if (!itemStack.hasTagCompound()) { + itemStack.setTagCompound(new NBTTagCompound()); + } + + final NBTTagCompound nbt = itemStack.getTagCompound(); + + if (!nbt.hasKey("oc:data")) { + nbt.setTag("oc:data", new NBTTagCompound()); + } + + return nbt.getCompoundTag("oc:data"); + } + + @Override + public Class getEnvironment(ItemStack itemStack) { + if (itemStack != ItemStack.EMPTY && itemStack.getItem() == this) { + return UpgradeAE.class; + } + + return null; + } + + @Override + public void getSubItems(CreativeTabs tab, NonNullList items) { + if (!this.isInCreativeTab(tab)) { + return; + } + + items.add(new ItemStack(this, 1, 2)); + items.add(new ItemStack(this, 1, 1)); + items.add(new ItemStack(this, 1, 0)); + } + + @Override + public String getItemStackDisplayName(ItemStack stack) { + int itemDamage = stack.getItemDamage(); + + return super.getItemStackDisplayName(stack) + String.format("(Tier %d )", itemDamage+1); + } +} 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..e776c0c --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java @@ -0,0 +1,140 @@ +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 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.EnumSet; +import java.util.Iterator; +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 (Platform.openNbtData(is).getInteger("type")) { + case 0 -> GuiBridge.GUI_WIRELESS_TERM; + case 1 -> GuiBridge.GUI_WIRELESS_FLUID_TERMINAL; + case 2 -> GuiWrapper.INSTANCE.wrap(AEGuiBridge.WIRELESS_GAS_TERM); + case 3 -> GuiBridge.GUI_WIRELESS_CRAFTING_TERMINAL; + case 4 -> GuiBridge.GUI_WIRELESS_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 + public String getItemStackDisplayName(ItemStack stack) { + NBTTagCompound tag = Platform.openNbtData(stack); + if (!tag.hasKey("type")) { + tag.setInteger("type", 0); + } + + return super.getItemStackDisplayName(stack) + " - " + I18n.translateToLocal( + "nae2.tooltip.universal_wireless_terminal." + WirelessTerminalType.values()[tag.getInteger( + "type" + )].toString().toLowerCase() + ); + } + + @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()) { + 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); + } + + +} 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..2220165 --- /dev/null +++ b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java @@ -0,0 +1,183 @@ +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.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 { + private final WirelessTerminalUniversal wirelessTerminalUniversal = ((WirelessTerminalUniversal) NAE2.definitions().items().universalWirelessTerminal().maybeItem().orElse(null)); + + @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); + Item itemTerminal = terminal.getItem(); + ItemStack t = new ItemStack(wirelessTerminalUniversal); + if (itemTerminal instanceof INetworkEncodable) { + String key = ((INetworkEncodable) itemTerminal).getEncryptionKey(terminal); + if (!key.isEmpty()) { + String name = Platform.openNbtData(terminal).getString("name"); + wirelessTerminalUniversal.setEncryptionKey(t, key, name); + } + } + if (itemTerminal instanceof IAEItemPowerStorage) { + double power = ((IAEItemPowerStorage) itemTerminal).getAECurrentPower(terminal); + wirelessTerminalUniversal.injectAEPower(t, power, Actionable.MODULATE); + } + if (terminal.hasTagCompound()) { + NBTTagCompound nbt = terminal.getTagCompound(); + if (!t.hasTagCompound()) { + t.setTagCompound(new NBTTagCompound()); + } + if (nbt.hasKey("BoosterSlot")) { + t.getTagCompound().setTag("BoosterSlot", nbt.getTag("BoosterSlot")); + } + if (nbt.hasKey("MagnetSlot")) { + t.getTagCompound().setTag("MagnetSlot", nbt.getTag("MagnetSlot")); + } + } + UniversalTerminalHelper.installModule(t, terminalType); + if (terminalType != null) { + t.getTagCompound().setInteger("type", terminalType.ordinal()); + } + terminal = t; + 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..ed4cacc 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; @@ -10,7 +12,9 @@ import co.neeve.nae2.client.gui.PatternMultiToolButtonHandler; import co.neeve.nae2.common.features.Features; import co.neeve.nae2.common.features.subfeatures.VoidCellFeatures; +import co.neeve.nae2.common.items.OCUpgrade; 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 +61,8 @@ public class Items implements Definitions { private final IItemDefinition storageCellGas4096K; private final IItemDefinition storageCellGas16384K; private final IItemDefinition virtualPattern; + private final IItemDefinition universalWirelessTerminal; + private final IItemDefinition openComputerUpgrade; public Items(Registry registry) { this.virtualPattern = this.registerById(registry.item("virtual_pattern", VirtualPattern::new) @@ -168,8 +174,7 @@ 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, + 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()); @@ -192,6 +197,17 @@ public Items(Registry registry) { .features(Features.DENSE_GAS_CELLS) .build()); + 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()); + this.openComputerUpgrade = this.registerById(registry.item("opencomputer_upgrade", OCUpgrade::new) + .features(Features.OPEN_COMPUTER_UPGRADE) + .build()); + registry.addBootstrapComponent((IPostInitComponent) r -> { var items = AEApi.instance().definitions().items(); var cellDef = items.cell1k(); @@ -328,4 +344,8 @@ public IItemDefinition storageCellGas4096K() { public IItemDefinition storageCellGas16384K() { return this.storageCellGas16384K; } + + public IItemDefinition universalWirelessTerminal() {return this.universalWirelessTerminal;} + + public IItemDefinition openComputerUpgrade() {return this.openComputerUpgrade;} } diff --git a/src/main/resources/assets/nae2/lang/en_us.lang b/src/main/resources/assets/nae2/lang/en_us.lang index a1c83da..425232b 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,17 @@ 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 + + + + diff --git a/src/main/resources/assets/nae2/lang/zh_cn.lang b/src/main/resources/assets/nae2/lang/zh_cn.lang index 3dc412a..de4f33c 100644 --- a/src/main/resources/assets/nae2/lang/zh_cn.lang +++ b/src/main/resources/assets/nae2/lang/zh_cn.lang @@ -6,6 +6,7 @@ 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虚空存储元件 @@ -90,3 +91,13 @@ nae2.jei.cellview.hover.1=已占用 %s 种类型。 nae2.jei.cellview.hover.2=每种占用类型均会损耗容量。 nae2.jei.cellview.hover.3=%s 字节/类型 * %s = %s 字节损耗。 nae2.jei.cellview.keybind=按下 %s 来浏览内容 + +# 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=接口 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/textures/item/universal_wireless_terminal.png b/src/main/resources/assets/nae2/textures/item/universal_wireless_terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..fd514aacfa80ef6a4fe1a503819053f17b1e54c1 GIT binary patch literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEf zOCDIQ)6$STG`V8oJeNh%3&S^vIodcJ>vcLZ%d9T#d%`^fV|~VdjJaN=PiHNA`t{ue zl}}Tf-6FE>`zLU<9WF7tmSEAO=peM~cfx^HtCY9>p46MweMhTpk;axY^B=3a7MyEb z_I)4oq_^Ue`lsHA+xNYTqr_sKVGl=1hd?cR&>g2~srqy3EUql)TK$tpuBCB7yD}%! i1J@Y+=lB2JkrurZBPn-m!dsx@89ZJ6T-G@yGywn>A8-l) literal 0 HcmV?d00001 From 3287718a51f0f13005ca787b2225a9e890955169 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Fri, 4 Oct 2024 21:44:10 +0800 Subject: [PATCH 02/11] Remove Opencomputer Upgrade --- .../neeve/nae2/common/features/Features.java | 8 +- .../opencomputer/NetworkControl.java | 232 ------------------ .../integration/opencomputer/OCUtils.java | 88 ------- .../integration/opencomputer/UpgradeAE.java | 57 ----- .../WirelessHandlerUpgradeAE.java | 144 ----------- .../co/neeve/nae2/common/items/OCUpgrade.java | 108 -------- .../registration/definitions/Items.java | 7 - 7 files changed, 1 insertion(+), 643 deletions(-) delete mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java delete mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java delete mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java delete mode 100644 src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java delete mode 100644 src/main/java/co/neeve/nae2/common/items/OCUpgrade.java 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 bb11e3f..cacb8db 100644 --- a/src/main/java/co/neeve/nae2/common/features/Features.java +++ b/src/main/java/co/neeve/nae2/common/features/Features.java @@ -42,13 +42,7 @@ public boolean isEnabled() { DENSE_CPU_COPROCESSORS("dense.coprocessor"), DENSE_FLUID_CELLS(), EXPOSER(), - UNIVERSAL_TERMINAL(), - OPEN_COMPUTER_UPGRADE() { - @Override - public boolean isEnabled() { - return Platform.isModLoaded("opencomputers") && super.isEnabled(); - } - }; + UNIVERSAL_TERMINAL(); private String[] mixins; private EnumSet subFeatures = null; diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java deleted file mode 100644 index b68173b..0000000 --- a/src/main/java/co/neeve/nae2/common/integration/opencomputer/NetworkControl.java +++ /dev/null @@ -1,232 +0,0 @@ -package co.neeve.nae2.common.integration.opencomputer; - -import appeng.api.AEApi; -import appeng.api.implementations.tiles.IWirelessAccessPoint; -import appeng.api.networking.IGrid; -import appeng.api.networking.IGridBlock; -import appeng.api.networking.IGridHost; -import appeng.api.networking.IGridNode; -import appeng.api.networking.security.IActionHost; -import appeng.api.networking.storage.IStorageGrid; -import appeng.api.storage.IMEMonitor; -import appeng.api.storage.data.IAEFluidStack; -import appeng.api.storage.data.IAEItemStack; -import appeng.api.util.AEPartLocation; -import appeng.api.util.DimensionalCoord; -import appeng.api.util.WorldCoord; -import co.neeve.nae2.NAE2; -import li.cil.oc.api.internal.Agent; -import li.cil.oc.api.internal.Drone; -import li.cil.oc.api.internal.Robot; -import li.cil.oc.api.network.EnvironmentHost; -import li.cil.oc.api.prefab.AbstractManagedEnvironment; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; - -import java.util.Iterator; - -public abstract class NetworkControl extends AbstractManagedEnvironment { - abstract T tile(); - - abstract EnvironmentHost host(); - -// private Robot robot; -// private Drone drone; -// private Agent agent; - private boolean isActive = false; - - public Robot getRobot() { - if (host() instanceof Robot) { - return (Robot) host(); - } - return null; - } - - public Drone getDrone() { - if (host() instanceof Drone) { - return (Drone) host(); - } - return null; - } - - public Agent getAgent() { - if (host() instanceof Agent) { - return (Agent) host(); - } - return null; - } - - public boolean isActive() { - return isActive; - } - - public void setActive(boolean active) { - isActive = active; - } - - public ItemStack getComponent() { - Robot robot = getRobot(); - Drone drone = getDrone(); - if (robot != null) { - return robot.getStackInSlot(robot.componentSlot(node().address())); - } else if (drone != null) { - Iterator iterator = drone.internalComponents().iterator(); - - while (iterator.hasNext()) { - ItemStack item = iterator.next(); - if (item != null && item.getItem() == NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) { - return item; - } - } - } - - return null; - } - - public IGridHost getSecurity() { - if (host().world().isRemote) { - return null; - } - - ItemStack component = getComponent(); - if (component == null) { - return null; - } - IGridHost security = (IGridHost) AEApi.instance().registries().locatable().getLocatableBy(getAEKey(component)); - - if (checkRange(component, security)) { - return security; - } - - return null; - } - - public boolean checkRange(ItemStack itemStack, IGridHost security) { - if (itemStack == null || security == null) { - return false; - } - - IGridNode gridNode = security.getGridNode(AEPartLocation.INTERNAL); - if (gridNode == null) { - return false; - } - - IGrid grid = gridNode.getGrid(); - if (grid == null) { - return false; - } - - switch (itemStack.getItemDamage()) { - case 0: { - Class wirelessAccessPoint = AEApi.instance().definitions().blocks().wirelessAccessPoint().maybeEntity().get(); - - return grid.getMachines((Class) wirelessAccessPoint).iterator().hasNext(); - } - case 1: { - IGridBlock gridBlock = gridNode.getGridBlock(); - if (gridBlock == null) { - return false; - } - - DimensionalCoord location = gridBlock.getLocation(); - if (location == null) { - return false; - } - - Class accessPoints = AEApi.instance().definitions().blocks().wirelessAccessPoint().maybeEntity().get(); - - for (IGridNode node : grid.getMachines((Class) accessPoints)) { - Agent agent = getAgent(); - IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node; - - WorldCoord distance = accessPoint.getLocation().subtract((int) agent.xPosition(), ((int) agent.yPosition()), ((int) agent.zPosition())); - double squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; - - double range = accessPoint.getRange(); - - if (squaredDistance <= range * range) { - return true; - } - } - - return false; - } - default: { - IGridBlock gridBlock = gridNode.getGridBlock(); - if (gridBlock == null) { - return false; - } - - DimensionalCoord location = gridBlock.getLocation(); - if (location == null) { - return false; - } - - Class accessPoints = AEApi.instance().definitions().blocks().wirelessAccessPoint().maybeEntity().get(); - - for (IGridNode node : grid.getMachines((Class) accessPoints)) { - Agent agent = getAgent(); - IWirelessAccessPoint accessPoint = (IWirelessAccessPoint) node; - - WorldCoord distance = accessPoint.getLocation().subtract(((int) agent.xPosition()), ((int) agent.yPosition()), ((int) agent.zPosition())); - double squaredDistance = distance.x * distance.x + distance.y * distance.y + distance.z * distance.z; - - double range = accessPoint.getRange() / 2; - - if (squaredDistance <= range * range) { - return true; - } - } - - return false; - } - } - } - - public IGrid getGrid() { - if (host().world().isRemote) { - return null; - } - - IGridHost security = getSecurity(); - if (security == null) { - return null; - } - - IGridNode gridNode = security.getGridNode(AEPartLocation.INTERNAL); - if (gridNode == null) { - return null; - } - - return gridNode.getGrid(); - } - - public long getAEKey(ItemStack itemStack) { - try { - return Long.parseLong(WirelessHandlerUpgradeAE.instance.getEncryptionKey(itemStack)); - } catch (Throwable e) { - // Do nothing - } - - return 0L; - } - - public IMEMonitor getFluidInventory() { - IGrid grid = getGrid(); - if (grid == null) { - return null; - } - - return grid.getCache(IStorageGrid.class); - } - - public IMEMonitor getItemInventory() { - IGrid grid = getGrid(); - if (grid == null) { - return null; - } - - return grid.getCache(IStorageGrid.class); - } - -} diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java deleted file mode 100644 index 88f26c9..0000000 --- a/src/main/java/co/neeve/nae2/common/integration/opencomputer/OCUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -package co.neeve.nae2.common.integration.opencomputer; - -import appeng.api.parts.IPart; -import appeng.api.parts.IPartHost; -import appeng.api.util.AEPartLocation; -import li.cil.oc.api.API; -import li.cil.oc.api.detail.ItemInfo; -import li.cil.oc.common.item.data.DroneData; -import li.cil.oc.common.item.data.RobotData; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; - -public class OCUtils { - public static

P getPart(World world, BlockPos pos, AEPartLocation location, Class clazz) { - if (world == null || pos == null) { - return null; - } - - TileEntity tile = world.getTileEntity(pos); - - if (!(tile instanceof IPartHost)) { - return null; - } - - if (location == null || location == AEPartLocation.INTERNAL) { - for (AEPartLocation side : AEPartLocation.SIDE_LOCATIONS) { - IPart part = ((IPartHost) tile).getPart(side); - - if (clazz.isInstance(part)) { - return (P) part; - } - } - - return null; - } - - IPart part = ((IPartHost) tile).getPart(location); - - if (!clazz.isInstance(part)) { - return null; - } - - return (P) part; - } - - public static boolean isRobot(ItemStack itemStack) { - ItemInfo item = API.items.get(itemStack); - - return item != null && "robot".equals(item.name()); - } - - public static boolean isDrone(ItemStack itemStack) { - ItemInfo item = API.items.get(itemStack); - - return item != null && "drone".equals(item.name()); - } - - public static ItemStack getComponent(RobotData robot, Item item, int meta) { - for (ItemStack component : robot.components()) { - if (component != null && component.getItem() == item) { - return component; - } - } - - return null; - } - - public static ItemStack getComponent(RobotData robot, Item item) { - return getComponent(robot, item, 0); - } - - public static ItemStack getComponent(DroneData drone, Item item, int meta) { - for (ItemStack component : drone.components()) { - if (component != null && component.getItem() == item) { - return component; - } - } - - return null; - } - - public static ItemStack getComponent(DroneData drone, Item item) { - return getComponent(drone, item, 0); - } -} diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java deleted file mode 100644 index daec750..0000000 --- a/src/main/java/co/neeve/nae2/common/integration/opencomputer/UpgradeAE.java +++ /dev/null @@ -1,57 +0,0 @@ -package co.neeve.nae2.common.integration.opencomputer; - -import appeng.api.networking.IGridBlock; -import appeng.api.networking.IGridNode; -import appeng.api.util.AEPartLocation; -import appeng.api.util.DimensionalCoord; -import appeng.tile.misc.TileSecurityStation; -import li.cil.oc.api.Network; -import li.cil.oc.api.network.EnvironmentHost; -import li.cil.oc.api.network.Visibility; - -public class UpgradeAE extends NetworkControl { - private final EnvironmentHost host; - - public UpgradeAE(EnvironmentHost envHost) { - this.host = envHost; - setNode(Network.newNode(this, Visibility.Network) - .withConnector() - .withComponent("upgrade_me", Visibility.Network) - .create()); - } - - @Override - public TileSecurityStation tile() throws SecurityException { - TileSecurityStation security = (TileSecurityStation) getSecurity(); - if (security == null) { - throw new SecurityException("No Security Station"); - } - - IGridNode node = security.getGridNode(AEPartLocation.INTERNAL); - if (node == null) { - throw new SecurityException("No Security Station"); - } - - IGridBlock gridBlock = node.getGridBlock(); - if (gridBlock == null) { - throw new SecurityException("No Security Station"); - } - - DimensionalCoord location = gridBlock.getLocation(); - if (location == null) { - throw new SecurityException("No Security Station"); - } - - TileSecurityStation tileSecurity = (TileSecurityStation) location.getWorld().getTileEntity(location.getPos()); - if (tileSecurity == null) { - throw new SecurityException("No Security Station"); - } - - return tileSecurity; - } - - @Override - public EnvironmentHost host() { - return host; - } -} diff --git a/src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java b/src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java deleted file mode 100644 index 93ae037..0000000 --- a/src/main/java/co/neeve/nae2/common/integration/opencomputer/WirelessHandlerUpgradeAE.java +++ /dev/null @@ -1,144 +0,0 @@ -package co.neeve.nae2.common.integration.opencomputer; - -import appeng.api.features.IWirelessTermHandler; -import appeng.api.util.IConfigManager; -import appeng.core.sync.GuiBridge; -import co.neeve.nae2.NAE2; -import li.cil.oc.common.item.data.DroneData; -import li.cil.oc.common.item.data.RobotData; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Items; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.common.network.IGuiHandler; - -public class WirelessHandlerUpgradeAE implements IWirelessTermHandler { - - public final static WirelessHandlerUpgradeAE instance = new WirelessHandlerUpgradeAE(); - - @Override - public String getEncryptionKey(ItemStack itemStack) { - if (itemStack == ItemStack.EMPTY) { - return ""; - } - - if (OCUtils.isRobot(itemStack)) { - return getEncryptionKeyForRobot(itemStack); - } - if (OCUtils.isDrone(itemStack)) { - return getEncryptionKeyForDrone(itemStack); - } - - if (!itemStack.hasTagCompound()) { - itemStack.setTagCompound(new NBTTagCompound()); - } - - return itemStack.getTagCompound().getString("key"); - } - - private String getEncryptionKeyForRobot(ItemStack itemStack) { - RobotData robotData = new RobotData(itemStack); - - ItemStack component = OCUtils.getComponent(robotData, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); - if (component == null) { - return ""; - } - - return getEncryptionKey(component); - } - - private String getEncryptionKeyForDrone(ItemStack itemStack) { - DroneData droneData = new DroneData(itemStack); - - ItemStack component = OCUtils.getComponent(droneData, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); - if (component == null) { - return ""; - } - - return getEncryptionKey(component); - } - - @Override - public void setEncryptionKey(ItemStack itemStack, String encryptionKey, String name) { - if (itemStack == null) { - return; - } - if (OCUtils.isRobot(itemStack)) { - setEncryptionKeyForRobot(itemStack, encryptionKey, name); - return; - } - if (OCUtils.isDrone(itemStack)) { - setEncryptionKeyForDrone(itemStack, encryptionKey, name); - return; - } - - if (!itemStack.hasTagCompound()) { - itemStack.setTagCompound(new NBTTagCompound()); - } - - itemStack.getTagCompound().setString("key", encryptionKey); - } - - private void setEncryptionKeyForRobot(ItemStack itemStack, String encryptionKey, String name) { - RobotData robot = new RobotData(itemStack); - ItemStack component = OCUtils.getComponent(robot, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); - - if (component != null) { - setEncryptionKey(component, encryptionKey, name); - } - - robot.save(itemStack); - } - - private void setEncryptionKeyForDrone(ItemStack itemStack, String encryptionKey, String name) { - DroneData drone = new DroneData(itemStack); - ItemStack component = OCUtils.getComponent(drone, NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)); - - if (component != null) { - setEncryptionKey(component, encryptionKey, name); - } - - drone.save(itemStack); - } - - @Override - public boolean canHandle(ItemStack itemStack) { - if (itemStack == null) { - return false; - } - - Item item = itemStack.getItem(); - - if (item == NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) { - return true; - } - - boolean robotCheck = OCUtils.isRobot(itemStack) && OCUtils.getComponent(new RobotData(itemStack), NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) != null; - boolean droneCheck = OCUtils.isDrone(itemStack) && OCUtils.getComponent(new DroneData(itemStack), NAE2.definitions().items().openComputerUpgrade().maybeItem().orElse(null)) != null; - - return robotCheck || droneCheck; - } - - @Override - public boolean usePower(EntityPlayer entityPlayer, double v, ItemStack itemStack) { - return false; - } - - @Override - public boolean hasPower(EntityPlayer entityPlayer, double v, ItemStack itemStack) { - return true; - } - - @Override - public IConfigManager getConfigManager(ItemStack itemStack) { - return null; - } - - @Override - public IGuiHandler getGuiHandler(ItemStack p0) { - // TODO: Not yet implemented - return GuiBridge.GUI_WIRELESS_TERM; - } -} - diff --git a/src/main/java/co/neeve/nae2/common/items/OCUpgrade.java b/src/main/java/co/neeve/nae2/common/items/OCUpgrade.java deleted file mode 100644 index af7c8dc..0000000 --- a/src/main/java/co/neeve/nae2/common/items/OCUpgrade.java +++ /dev/null @@ -1,108 +0,0 @@ -package co.neeve.nae2.common.items; - -import co.neeve.nae2.NAE2; -import co.neeve.nae2.common.integration.opencomputer.UpgradeAE; -import li.cil.oc.api.driver.EnvironmentProvider; -import li.cil.oc.api.driver.item.HostAware; -import li.cil.oc.api.driver.item.Slot; -import li.cil.oc.api.internal.Drone; -import li.cil.oc.api.internal.Robot; -import li.cil.oc.api.network.EnvironmentHost; -import li.cil.oc.api.network.ManagedEnvironment; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.NonNullList; -import net.minecraftforge.fml.common.Optional; - -@Optional.InterfaceList(value = { - @Optional.Interface(iface = "li.cil.oc.api.driver.item.HostAware", modid = "opencomputers", striprefs = true), - @Optional.Interface(iface = "li.cil.oc.api.driver.EnvironmentProvider", modid = "opencomputers", striprefs = true) -}) -public class OCUpgrade extends Item implements HostAware, EnvironmentProvider { - public OCUpgrade() { - setHasSubtypes(true); - } - - @Optional.Method(modid = "opencomputers") - @Override - public boolean worksWith(ItemStack itemStack, Class host) { - return worksWith(itemStack) && host != null && (Robot.class.isAssignableFrom(host) || Drone.class.isAssignableFrom(host)); - } - - @Optional.Method(modid = "opencomputers") - @Override - public boolean worksWith(ItemStack itemStack) { - return itemStack != ItemStack.EMPTY && itemStack.getItem() == this; - } - - @Optional.Method(modid = "opencomputers") - @Override - public ManagedEnvironment createEnvironment(ItemStack itemStack, EnvironmentHost environmentHost) { - if (environmentHost == null) { - return null; - } - if (itemStack != ItemStack.EMPTY && itemStack.getItem() == this && worksWith(itemStack, environmentHost.getClass())) { - return new UpgradeAE(environmentHost); - } - - return null; - } - - @Override - public String slot(ItemStack itemStack) { - return Slot.Upgrade; - } - - @Override - public int tier(ItemStack itemStack) { - return switch (itemStack.getItemDamage()) { - case 0 -> 2; - case 1 -> 1; - default -> 0; - }; - } - - @Override - public NBTTagCompound dataTag(ItemStack itemStack) { - if (!itemStack.hasTagCompound()) { - itemStack.setTagCompound(new NBTTagCompound()); - } - - final NBTTagCompound nbt = itemStack.getTagCompound(); - - if (!nbt.hasKey("oc:data")) { - nbt.setTag("oc:data", new NBTTagCompound()); - } - - return nbt.getCompoundTag("oc:data"); - } - - @Override - public Class getEnvironment(ItemStack itemStack) { - if (itemStack != ItemStack.EMPTY && itemStack.getItem() == this) { - return UpgradeAE.class; - } - - return null; - } - - @Override - public void getSubItems(CreativeTabs tab, NonNullList items) { - if (!this.isInCreativeTab(tab)) { - return; - } - - items.add(new ItemStack(this, 1, 2)); - items.add(new ItemStack(this, 1, 1)); - items.add(new ItemStack(this, 1, 0)); - } - - @Override - public String getItemStackDisplayName(ItemStack stack) { - int itemDamage = stack.getItemDamage(); - - return super.getItemStackDisplayName(stack) + String.format("(Tier %d )", itemDamage+1); - } -} 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 ed4cacc..2f17ef6 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 @@ -12,7 +12,6 @@ import co.neeve.nae2.client.gui.PatternMultiToolButtonHandler; import co.neeve.nae2.common.features.Features; import co.neeve.nae2.common.features.subfeatures.VoidCellFeatures; -import co.neeve.nae2.common.items.OCUpgrade; import co.neeve.nae2.common.items.VirtualPattern; import co.neeve.nae2.common.items.WirelessTerminalUniversal; import co.neeve.nae2.common.items.cells.DenseFluidCell; @@ -62,7 +61,6 @@ public class Items implements Definitions { private final IItemDefinition storageCellGas16384K; private final IItemDefinition virtualPattern; private final IItemDefinition universalWirelessTerminal; - private final IItemDefinition openComputerUpgrade; public Items(Registry registry) { this.virtualPattern = this.registerById(registry.item("virtual_pattern", VirtualPattern::new) @@ -204,9 +202,6 @@ public Items(Registry registry) { Upgrades.MAGNET.registerItem(new ItemStack(item),1); }) .build()); - this.openComputerUpgrade = this.registerById(registry.item("opencomputer_upgrade", OCUpgrade::new) - .features(Features.OPEN_COMPUTER_UPGRADE) - .build()); registry.addBootstrapComponent((IPostInitComponent) r -> { var items = AEApi.instance().definitions().items(); @@ -346,6 +341,4 @@ public IItemDefinition storageCellGas16384K() { } public IItemDefinition universalWirelessTerminal() {return this.universalWirelessTerminal;} - - public IItemDefinition openComputerUpgrade() {return this.openComputerUpgrade;} } From 0b5ee2e92de1119ead6db038267679bce0f74c79 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Mon, 7 Oct 2024 17:03:08 +0800 Subject: [PATCH 03/11] Optimizing the code --- .../helpers/UniversalTerminalHelper.java | 130 ++++++------------ .../items/WirelessTerminalUniversal.java | 15 +- 2 files changed, 51 insertions(+), 94 deletions(-) diff --git a/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java index d61bc69..73f95df 100644 --- a/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java +++ b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java @@ -10,6 +10,7 @@ import net.minecraft.nbt.NBTTagCompound; import java.util.ArrayList; +import java.util.Arrays; import java.util.EnumSet; import java.util.List; @@ -17,8 +18,10 @@ public class UniversalTerminalHelper { private final static boolean isMekELoaded = Platform.isModLoaded("mekeng"); 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"); + static { wirelessTerminals.add(AEApi.instance().definitions().items().wirelessTerminal().maybeStack(1).orElse(null)); wirelessTerminals.add(AEApi.instance().definitions().items().wirelessFluidTerminal().maybeStack(1).orElse(null)); @@ -30,11 +33,12 @@ public class UniversalTerminalHelper { terminals.add(AEApi.instance().definitions().parts().patternTerminal().maybeStack(1).orElse(null)); terminals.add(AEApi.instance().definitions().parts().fluidTerminal().maybeStack(1).orElse(null)); - if (Platform.isModLoaded("mekeng")){ + if (Platform.isModLoaded("mekeng")) { wirelessTerminals.add(new ItemStack(ItemAndBlocks.WIRELESS_GAS_TERMINAL)); terminals.add(new ItemStack(ItemAndBlocks.GAS_TERMINAL)); } } + public static boolean isWirelessTerminal(ItemStack stack) { if (stack == ItemStack.EMPTY) return false; @@ -42,10 +46,12 @@ public static boolean isWirelessTerminal(ItemStack stack) { 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; + 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 (wirelessFluidTerminal != null && wirelessFluidTerminal.getItem() == item && wirelessFluidTerminal.getItemDamage() == itemDamage) + return true; if (isMekEngLoaded) { ItemStack wirelessGasTerminal = new ItemStack(ItemAndBlocks.WIRELESS_GAS_TERMINAL); @@ -53,10 +59,12 @@ public static boolean isWirelessTerminal(ItemStack stack) { } ItemStack wirelessCraftingTerminal = AEApi.instance().definitions().items().wirelessCraftingTerminal().maybeStack(1).orElse(null); - if (wirelessCraftingTerminal != null && wirelessCraftingTerminal.getItem() == item && wirelessCraftingTerminal.getItemDamage() == itemDamage) return true; + 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; + if (wirelessPatternTerminal != null && wirelessPatternTerminal.getItem() == item && wirelessPatternTerminal.getItemDamage() == itemDamage) + return true; return false; } @@ -71,21 +79,25 @@ public static boolean isTerminal(ItemStack stack) { 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 (fluidTerminal != null && fluidTerminal.getItem() == item && fluidTerminal.getItemDamage() == itemDamage) + return true; - if (isMekEngLoaded){ + if (isMekEngLoaded) { ItemStack gasTerminal = new ItemStack(ItemAndBlocks.GAS_TERMINAL); if (gasTerminal.getItem() == item && gasTerminal.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; + 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; + 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; + if (interfaceTerminal != null && interfaceTerminal.getItem() == item && interfaceTerminal.getItemDamage() == itemDamage) + return true; return false; } @@ -97,61 +109,61 @@ public static WirelessTerminalType getTerminalType(ItemStack stack) { int itemDamage = stack.getItemDamage(); ItemStack terminal = AEApi.instance().definitions().parts().terminal().maybeStack(1).orElse(null); - if (terminal != null && terminal.getItem() == item && terminal.getItemDamage() == itemDamage){ + 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){ + 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){ + 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){ + if (patternTerminal != null && patternTerminal.getItem() == item && patternTerminal.getItemDamage() == itemDamage) { return WirelessTerminalType.PATTERN; } ItemStack wirelessInterfaceTerminal = AEApi.instance().definitions().parts().interfaceTerminal().maybeStack(1).orElse(null); - if (wirelessInterfaceTerminal != null && wirelessInterfaceTerminal.getItem() == item && wirelessInterfaceTerminal.getItemDamage() == itemDamage){ + if (wirelessInterfaceTerminal != null && wirelessInterfaceTerminal.getItem() == item && wirelessInterfaceTerminal.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){ + 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){ + 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){ + 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){ + if (wirelessPatternTerminal != null && wirelessPatternTerminal.getItem() == item && wirelessPatternTerminal.getItemDamage() == itemDamage) { return WirelessTerminalType.PATTERN; } //MekEng Integration if (isMekEngLoaded) { ItemStack gasTerminal = new ItemStack(ItemAndBlocks.GAS_TERMINAL); - if (gasTerminal.getItem() == item && gasTerminal.getItemDamage() == itemDamage){ + if (gasTerminal.getItem() == item && gasTerminal.getItemDamage() == itemDamage) { return WirelessTerminalType.GAS; } ItemStack wirelessGasTerminal = new ItemStack(ItemAndBlocks.WIRELESS_GAS_TERMINAL); - if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.getItemDamage() == itemDamage){ + if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.getItemDamage() == itemDamage) { return WirelessTerminalType.GAS; } } @@ -159,75 +171,21 @@ public static WirelessTerminalType getTerminalType(ItemStack stack) { return null; } - public static ItemStack changeMode(ItemStack itemStack, EntityPlayer player, NBTTagCompound tag) { - EnumSet installed = getInstalledModules(itemStack); - - switch (tag.getInteger("type")) { - case 0 -> { - if (installed.contains(WirelessTerminalType.FLUID)) { - tag.setInteger("type", 1); - } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { - tag.setInteger("type", 2); - } else if (installed.contains(WirelessTerminalType.CRAFTING)) { - tag.setInteger("type", 3); - } - } - - case 1 -> { - if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { - tag.setInteger("type", 2); - } else if (installed.contains(WirelessTerminalType.CRAFTING)) { - tag.setInteger("type", 3); - } else if (installed.contains(WirelessTerminalType.ITEM)) { - tag.setInteger("type", 0); - } - } - case 2 -> { - if (installed.contains(WirelessTerminalType.CRAFTING)) { - tag.setInteger("type", 3); - } else if (installed.contains(WirelessTerminalType.ITEM)) { - tag.setInteger("type", 0); - } else if (installed.contains(WirelessTerminalType.FLUID)) { - tag.setInteger("type", 1); - } + public static ItemStack changeMode(ItemStack itemStack, EntityPlayer player, NBTTagCompound tag) { + EnumSet installedModules = getInstalledModules(itemStack); + int type = tag.getInteger("type"); + boolean installed; + do { + type = (type + 1) % WIRELESS_TERMINAL_TYPE_LIST.size(); + installed = installedModules.contains(WIRELESS_TERMINAL_TYPE_LIST.get(type)); + if (WIRELESS_TERMINAL_TYPE_LIST.get(type) == WirelessTerminalType.GAS && !isMekELoaded) { + installed = false; } + } while (!installed); - case 3 -> { - if (installed.contains(WirelessTerminalType.PATTERN)) { - tag.setInteger("type", 4); - } else if (installed.contains(WirelessTerminalType.ITEM)) { - tag.setInteger("type", 0); - } else if (installed.contains(WirelessTerminalType.FLUID)) { - tag.setInteger("type", 1); - } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { - tag.setInteger("type", 2); - } - } + tag.setInteger("type", type); - case 4 -> { - if (installed.contains(WirelessTerminalType.ITEM)) { - tag.setInteger("type", 0); - } else if (installed.contains(WirelessTerminalType.FLUID)) { - tag.setInteger("type", 1); - } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { - tag.setInteger("type", 2); - } - } - default -> { - if (installed.contains(WirelessTerminalType.ITEM)) { - tag.setInteger("type", 0); - } else if (installed.contains(WirelessTerminalType.FLUID)) { - tag.setInteger("type", 1); - } else if (isMekELoaded && installed.contains(WirelessTerminalType.GAS)) { - tag.setInteger("type", 2); - } else if (installed.contains(WirelessTerminalType.CRAFTING)) { - tag.setInteger("type", 3); - } else if (installed.contains(WirelessTerminalType.PATTERN)) { - tag.setInteger("type", 4); - } - } - } return itemStack; } diff --git a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java index e776c0c..051fc8d 100644 --- a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java +++ b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java @@ -31,16 +31,15 @@ import static co.neeve.nae2.common.helpers.UniversalTerminalHelper.*; public class WirelessTerminalUniversal extends ToolWirelessTerminal { - @Override public IGuiHandler getGuiHandler(ItemStack is) { - return switch (Platform.openNbtData(is).getInteger("type")) { - case 0 -> GuiBridge.GUI_WIRELESS_TERM; - case 1 -> GuiBridge.GUI_WIRELESS_FLUID_TERMINAL; - case 2 -> GuiWrapper.INSTANCE.wrap(AEGuiBridge.WIRELESS_GAS_TERM); - case 3 -> GuiBridge.GUI_WIRELESS_CRAFTING_TERMINAL; - case 4 -> GuiBridge.GUI_WIRELESS_PATTERN_TERMINAL; - default -> GuiBridge.GUI_WIRELESS_TERM; + 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; }; } From 332d5256a737b36cee96e8db3b2870bc28239035 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:15:31 +0800 Subject: [PATCH 04/11] PatternMultiTool Fixes AE2FC dependence update --- .../common/containers/ContainerPatternMultiTool.java | 6 ++++-- .../nae2/common/net/messages/PatternMultiToolPacket.java | 9 ++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) 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 001f0be..e489722 100644 --- a/src/main/java/co/neeve/nae2/common/containers/ContainerPatternMultiTool.java +++ b/src/main/java/co/neeve/nae2/common/containers/ContainerPatternMultiTool.java @@ -29,6 +29,7 @@ import co.neeve.nae2.common.slots.SlotPatternMultiToolUpgrade; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidEncodedPattern; +import com.glodblock.github.common.item.fake.FakeItemRegister; import com.google.common.collect.Lists; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.InventoryPlayer; @@ -40,6 +41,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; @@ -327,10 +329,10 @@ public void onSlotChange(Slot s) { list.set(idx, data); } else continue; } else if (fluidReplacement && stack.getItem() instanceof ItemFluidDrop) { - var fluidStack = ItemFluidDrop.getFluidStack(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/net/messages/PatternMultiToolPacket.java b/src/main/java/co/neeve/nae2/common/net/messages/PatternMultiToolPacket.java index c33db68..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 @@ -16,6 +16,8 @@ import co.neeve.nae2.common.net.INAEMessage; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidEncodedPattern; +import com.glodblock.github.common.item.fake.FakeFluids; +import com.glodblock.github.common.item.fake.FakeItemRegister; import io.netty.buffer.ByteBuf; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.InventoryCrafting; @@ -23,6 +25,7 @@ import net.minecraft.item.crafting.CraftingManager; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; @@ -177,9 +180,9 @@ private void searchAndReplace(IContainerPatternMultiTool host, EntityPlayerMP pl list.set(idx, data); } else if (fluidReplacement && stack.getItem() instanceof ItemFluidDrop) { // ¯\_(ツ)_/¯ - var fluidStack = ItemFluidDrop.getFluidStack(stack); - if (fluidStackIn.isFluidEqual(fluidStack)) { - var ifd = ItemFluidDrop.newStack(fluidStackOut); + 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; From 06ca99776632e3e6bd4746d34f4dca64b7819595 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Mon, 14 Oct 2024 20:17:09 +0800 Subject: [PATCH 05/11] Add Fluid Pattern Module support for Universal Terminal --- .../api/config/WirelessTerminalType.java | 3 +- .../helpers/UniversalTerminalHelper.java | 58 ++++++++++++++++--- .../items/WirelessTerminalUniversal.java | 19 +++++- .../resources/assets/nae2/lang/en_us.lang | 1 + .../resources/assets/nae2/lang/zh_cn.lang | 2 + 5 files changed, 71 insertions(+), 12 deletions(-) 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 index 22ad60f..89d6af1 100644 --- a/src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java +++ b/src/main/java/co/neeve/nae2/common/api/config/WirelessTerminalType.java @@ -6,5 +6,6 @@ public enum WirelessTerminalType { GAS, CRAFTING, PATTERN, - INTERFACE + INTERFACE, + FLUID_PATTERN, } diff --git a/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java index 73f95df..dd84903 100644 --- a/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java +++ b/src/main/java/co/neeve/nae2/common/helpers/UniversalTerminalHelper.java @@ -3,6 +3,7 @@ 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; @@ -21,6 +22,7 @@ public class UniversalTerminalHelper { 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"); static { wirelessTerminals.add(AEApi.instance().definitions().items().wirelessTerminal().maybeStack(1).orElse(null)); @@ -33,10 +35,15 @@ public class UniversalTerminalHelper { terminals.add(AEApi.instance().definitions().parts().patternTerminal().maybeStack(1).orElse(null)); terminals.add(AEApi.instance().definitions().parts().fluidTerminal().maybeStack(1).orElse(null)); - if (Platform.isModLoaded("mekeng")) { + if (isMekEngLoaded) { wirelessTerminals.add(new ItemStack(ItemAndBlocks.WIRELESS_GAS_TERMINAL)); terminals.add(new ItemStack(ItemAndBlocks.GAS_TERMINAL)); } + + if (isAE2FCLoaded) { + wirelessTerminals.add(new ItemStack(FCItems.WIRELESS_FLUID_PATTERN_TERMINAL)); + terminals.add(new ItemStack(FCItems.PART_FLUID_PATTERN_TERMINAL)); + } } public static boolean isWirelessTerminal(ItemStack stack) { @@ -58,6 +65,11 @@ public static boolean isWirelessTerminal(ItemStack stack) { if (wirelessGasTerminal.getItem() == item && wirelessGasTerminal.getItemDamage() == itemDamage) return true; } + if (isAE2FCLoaded) { + ItemStack fluidPatternWirelessTerminal = new ItemStack(FCItems.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; @@ -87,6 +99,11 @@ public static boolean isTerminal(ItemStack stack) { if (gasTerminal.getItem() == item && gasTerminal.getItemDamage() == itemDamage) return true; } + if (isAE2FCLoaded) { + ItemStack fluidPatternTerminal = new ItemStack(FCItems.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; @@ -128,8 +145,8 @@ public static WirelessTerminalType getTerminalType(ItemStack stack) { return WirelessTerminalType.PATTERN; } - ItemStack wirelessInterfaceTerminal = AEApi.instance().definitions().parts().interfaceTerminal().maybeStack(1).orElse(null); - if (wirelessInterfaceTerminal != null && wirelessInterfaceTerminal.getItem() == item && wirelessInterfaceTerminal.getItemDamage() == itemDamage) { + ItemStack interfaceTerminal = AEApi.instance().definitions().parts().interfaceTerminal().maybeStack(1).orElse(null); + if (interfaceTerminal != null && interfaceTerminal.getItem() == item && interfaceTerminal.getItemDamage() == itemDamage) { return WirelessTerminalType.INTERFACE; } @@ -155,6 +172,11 @@ public static WirelessTerminalType getTerminalType(ItemStack stack) { 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(ItemAndBlocks.GAS_TERMINAL); @@ -168,21 +190,39 @@ public static WirelessTerminalType getTerminalType(ItemStack stack) { } } + if (isAE2FCLoaded) { + ItemStack fluidPatternTerminal = new ItemStack(FCItems.PART_FLUID_PATTERN_TERMINAL); + if (fluidPatternTerminal.getItem() == item && fluidPatternTerminal.getItemDamage() == itemDamage) { + return WirelessTerminalType.FLUID_PATTERN; + } + + ItemStack fluidPatternWirelessTerminal = new ItemStack(FCItems.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"); - boolean installed; + WirelessTerminalType terminalType; do { type = (type + 1) % WIRELESS_TERMINAL_TYPE_LIST.size(); - installed = installedModules.contains(WIRELESS_TERMINAL_TYPE_LIST.get(type)); - if (WIRELESS_TERMINAL_TYPE_LIST.get(type) == WirelessTerminalType.GAS && !isMekELoaded) { - installed = false; - } - } while (!installed); + terminalType = WIRELESS_TERMINAL_TYPE_LIST.get(type); + + } while (!isModuleValid(terminalType) || !installedModules.contains(terminalType)); tag.setInteger("type", type); diff --git a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java index 051fc8d..b4fa2e3 100644 --- a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java +++ b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java @@ -8,6 +8,10 @@ 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.common.item.ItemWirelessFluidPatternTerminal; +import com.glodblock.github.inventory.GuiType; +import com.glodblock.github.util.Util; import com.mekeng.github.common.container.handler.AEGuiBridge; import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; @@ -40,6 +44,7 @@ public IGuiHandler getGuiHandler(ItemStack is) { case CRAFTING -> GuiBridge.GUI_WIRELESS_CRAFTING_TERMINAL; case PATTERN -> GuiBridge.GUI_WIRELESS_PATTERN_TERMINAL; case INTERFACE -> GuiBridge.GUI_WIRELESS_INTERFACE_TERMINAL; + default -> GuiBridge.GUI_WIRELESS_TERM; }; } @@ -71,7 +76,15 @@ public ActionResult onItemRightClick(World w, EntityPlayer player, En } return new ActionResult(EnumActionResult.SUCCESS, changeMode(stack, player, tagCompound)); } - AEApi.instance().registries().wireless().openWirelessTerminalGui(stack, w, player); + + switch (WIRELESS_TERMINAL_TYPE_LIST.get(Platform.openNbtData(stack).getInteger("type"))) { + case FLUID_PATTERN -> { + if (UniversalTerminalHelper.isModuleValid(WirelessTerminalType.FLUID_PATTERN)) { + Util.openWirelessTerminal(player.getHeldItem(hand), hand == EnumHand.MAIN_HAND ? player.inventory.currentItem : 40, false, w, player, GuiType.WIRELESS_FLUID_PATTERN_TERMINAL); + } + } + default -> AEApi.instance().registries().wireless().openWirelessTerminalGui(stack, w, player); + } return new ActionResult(EnumActionResult.SUCCESS, stack); } @@ -123,7 +136,9 @@ protected void getCheckedSubItems(CreativeTabs creativeTab, NonNullList Date: Sat, 19 Oct 2024 21:06:04 +0800 Subject: [PATCH 06/11] fix build.yml --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c7103f7..7dc4a37 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,16 +6,16 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Set up OpenJDK 17 - uses: actions/setup-java@v2 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'adopt' # You can choose other OpenJDK distributions. - name: Build with Gradle run: ./gradlew build # Ensure your gradlew script is executable - name: Upload Artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: NAE2 path: build/libs/*.jar # Make sure this path matches the location of your build artifacts \ No newline at end of file From 097efc7fcd89fdbb11b210747faf43a447b1e909 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Thu, 5 Dec 2024 20:30:22 +0800 Subject: [PATCH 07/11] Fix NBT Conflict --- .../neeve/nae2/common/features/Features.java | 2 +- ...MixinContainerWirelessPatternTerminal.java | 28 +++++++++++++++++++ .../mixins.nae2.universalterminal.json | 11 ++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java create mode 100644 src/main/resources/mixins.nae2.universalterminal.json 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 cacb8db..28b52d6 100644 --- a/src/main/java/co/neeve/nae2/common/features/Features.java +++ b/src/main/java/co/neeve/nae2/common/features/Features.java @@ -42,7 +42,7 @@ public boolean isEnabled() { DENSE_CPU_COPROCESSORS("dense.coprocessor"), DENSE_FLUID_CELLS(), EXPOSER(), - UNIVERSAL_TERMINAL(); + UNIVERSAL_TERMINAL("universalterminal"),; private String[] mixins; private EnumSet subFeatures = null; 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..d0d9f46 --- /dev/null +++ b/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java @@ -0,0 +1,28 @@ +package co.neeve.nae2.mixin.universalterminal; + +import appeng.container.implementations.ContainerWirelessPatternTerminal; +import appeng.tile.inventory.AppEngInternalInventory; +import net.minecraft.nbt.NBTTagCompound; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = ContainerWirelessPatternTerminal.class, remap = false) +public abstract class MixinContainerWirelessPatternTerminal { + + @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) { + instance.readFromNBT(data, "craftingGridPattern"); + } + + @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) { + instance.writeToNBT(data, "craftingGridPattern"); + } +} 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 From a1382cbd9fdda28b699520131083ceb7b90bb256 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Fri, 6 Dec 2024 23:40:28 +0800 Subject: [PATCH 08/11] Keep ItemStack in crafting terminal --- .../recipes/UniversalTerminalRecipe.java | 25 ++++++++----------- ...MixinContainerWirelessPatternTerminal.java | 21 ++++++++++++++-- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java index 2220165..d3fa498 100644 --- a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java +++ b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java @@ -12,7 +12,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.IRecipe; -import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTBase; import net.minecraft.util.NonNullList; import net.minecraft.world.World; import net.minecraftforge.common.ForgeHooks; @@ -134,22 +134,17 @@ public ItemStack getCraftingResult(InventoryCrafting inv) { double power = ((IAEItemPowerStorage) itemTerminal).getAECurrentPower(terminal); wirelessTerminalUniversal.injectAEPower(t, power, Actionable.MODULATE); } - if (terminal.hasTagCompound()) { - NBTTagCompound nbt = terminal.getTagCompound(); - if (!t.hasTagCompound()) { - t.setTagCompound(new NBTTagCompound()); - } - if (nbt.hasKey("BoosterSlot")) { - t.getTagCompound().setTag("BoosterSlot", nbt.getTag("BoosterSlot")); - } - if (nbt.hasKey("MagnetSlot")) { - t.getTagCompound().setTag("MagnetSlot", nbt.getTag("MagnetSlot")); - } - } - UniversalTerminalHelper.installModule(t, terminalType); + if (terminalType != null) { - t.getTagCompound().setInteger("type", terminalType.ordinal()); + Platform.openNbtData(t).setInteger("type", terminalType.ordinal()); + UniversalTerminalHelper.installModule(t, terminalType); + } + + if (terminalType == WirelessTerminalType.CRAFTING) { + NBTBase craftingGrid = Platform.openNbtData(terminal).getTag("craftingGrid"); + Platform.openNbtData(t).setTag("craftingGrid", craftingGrid); } + terminal = t; for (WirelessTerminalType x : terminals) { UniversalTerminalHelper.installModule(terminal, x); diff --git a/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java b/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java index d0d9f46..b5669d1 100644 --- a/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java +++ b/src/main/java/co/neeve/nae2/mixin/universalterminal/MixinContainerWirelessPatternTerminal.java @@ -1,21 +1,33 @@ 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) { - instance.readFromNBT(data, "craftingGridPattern"); + if (NAE2.definitions().items().universalWirelessTerminal().isSameAs(wirelessTerminalGUIObject.getItemStack())) { + instance.readFromNBT(data, "craftingGridPattern"); + } else { + instance.readFromNBT(data, name); + } } @Redirect( @@ -23,6 +35,11 @@ private void loadFromNBT(AppEngInternalInventory instance, NBTTagCompound data, 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) { - instance.writeToNBT(data, "craftingGridPattern"); + if (NAE2.definitions().items().universalWirelessTerminal().isSameAs(wirelessTerminalGUIObject.getItemStack())) { + instance.writeToNBT(data, "craftingGridPattern"); + } else { + instance.writeToNBT(data, name); + } + } } From a02d36d358ed8e6e242365889e9e1e36ff14b90c Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Sat, 7 Dec 2024 00:26:58 +0800 Subject: [PATCH 09/11] minor change --- .../items/WirelessTerminalUniversal.java | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java index b4fa2e3..5b397b4 100644 --- a/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java +++ b/src/main/java/co/neeve/nae2/common/items/WirelessTerminalUniversal.java @@ -9,7 +9,6 @@ import co.neeve.nae2.NAE2; import co.neeve.nae2.common.api.config.WirelessTerminalType; import co.neeve.nae2.common.helpers.UniversalTerminalHelper; -import com.glodblock.github.common.item.ItemWirelessFluidPatternTerminal; import com.glodblock.github.inventory.GuiType; import com.glodblock.github.util.Util; import com.mekeng.github.common.container.handler.AEGuiBridge; @@ -28,8 +27,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import java.util.EnumSet; -import java.util.Iterator; + import java.util.List; import static co.neeve.nae2.common.helpers.UniversalTerminalHelper.*; @@ -89,22 +87,6 @@ public ActionResult onItemRightClick(World w, EntityPlayer player, En return new ActionResult(EnumActionResult.SUCCESS, stack); } - - - @Override - public String getItemStackDisplayName(ItemStack stack) { - NBTTagCompound tag = Platform.openNbtData(stack); - if (!tag.hasKey("type")) { - tag.setInteger("type", 0); - } - - return super.getItemStackDisplayName(stack) + " - " + I18n.translateToLocal( - "nae2.tooltip.universal_wireless_terminal." + WirelessTerminalType.values()[tag.getInteger( - "type" - )].toString().toLowerCase() - ); - } - @Override @SideOnly(Side.CLIENT) public void addCheckedInformation(ItemStack stack, World world, List lines, ITooltipFlag advancedTooltips) { @@ -150,5 +132,17 @@ protected void getCheckedSubItems(CreativeTabs creativeTab, NonNullList Date: Sat, 7 Dec 2024 12:55:21 +0800 Subject: [PATCH 10/11] NBT Keep --- .../nae2/common/recipes/UniversalTerminalRecipe.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java index d3fa498..e88762f 100644 --- a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java +++ b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java @@ -145,6 +145,14 @@ public ItemStack getCraftingResult(InventoryCrafting inv) { Platform.openNbtData(t).setTag("craftingGrid", craftingGrid); } + if (terminalType == WirelessTerminalType.PATTERN) { + NBTBase patterns = Platform.openNbtData(terminal).getTag("patterns"); + Platform.openNbtData(t).setTag("patterns", patterns); + } + + NBTBase upgrades = Platform.openNbtData(terminal).getTag("upgrades"); + Platform.openNbtData(t).setTag("upgrades", upgrades); + terminal = t; for (WirelessTerminalType x : terminals) { UniversalTerminalHelper.installModule(terminal, x); From c1909c6ec5db0c7fa6494bb29fa186c8d03ed707 Mon Sep 17 00:00:00 2001 From: zeng-git <95841646+zeng-github01@users.noreply.github.com> Date: Sat, 7 Dec 2024 15:21:04 +0800 Subject: [PATCH 11/11] When making a universal terminal, transfer the original NBT to the new wireless terminal --- .../recipes/UniversalTerminalRecipe.java | 37 +++++-------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java index e88762f..1bff9df 100644 --- a/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java +++ b/src/main/java/co/neeve/nae2/common/recipes/UniversalTerminalRecipe.java @@ -13,6 +13,7 @@ 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; @@ -23,7 +24,6 @@ import java.util.List; public class UniversalTerminalRecipe extends IForgeRegistryEntry.Impl implements IRecipe { - private final WirelessTerminalUniversal wirelessTerminalUniversal = ((WirelessTerminalUniversal) NAE2.definitions().items().universalWirelessTerminal().maybeItem().orElse(null)); @Override public boolean matches(InventoryCrafting inv, World worldIn) { @@ -121,39 +121,22 @@ public ItemStack getCraftingResult(InventoryCrafting inv) { } } else { WirelessTerminalType terminalType = UniversalTerminalHelper.getTerminalType(terminal); - Item itemTerminal = terminal.getItem(); - ItemStack t = new ItemStack(wirelessTerminalUniversal); - if (itemTerminal instanceof INetworkEncodable) { - String key = ((INetworkEncodable) itemTerminal).getEncryptionKey(terminal); - if (!key.isEmpty()) { - String name = Platform.openNbtData(terminal).getString("name"); - wirelessTerminalUniversal.setEncryptionKey(t, key, name); - } - } - if (itemTerminal instanceof IAEItemPowerStorage) { - double power = ((IAEItemPowerStorage) itemTerminal).getAECurrentPower(terminal); - wirelessTerminalUniversal.injectAEPower(t, power, Actionable.MODULATE); - } + ItemStack universalTerminal = NAE2.definitions().items().universalWirelessTerminal().maybeStack(1).orElse(ItemStack.EMPTY); - if (terminalType != null) { - Platform.openNbtData(t).setInteger("type", terminalType.ordinal()); - UniversalTerminalHelper.installModule(t, terminalType); - } + universalTerminal.setTagCompound(terminal.getTagCompound()); - if (terminalType == WirelessTerminalType.CRAFTING) { - NBTBase craftingGrid = Platform.openNbtData(terminal).getTag("craftingGrid"); - Platform.openNbtData(t).setTag("craftingGrid", craftingGrid); + if (terminalType != null) { + UniversalTerminalHelper.installModule(universalTerminal, terminalType); + Platform.openNbtData(universalTerminal).setInteger("type", terminalType.ordinal()); } if (terminalType == WirelessTerminalType.PATTERN) { - NBTBase patterns = Platform.openNbtData(terminal).getTag("patterns"); - Platform.openNbtData(t).setTag("patterns", patterns); + NBTTagCompound compound = Platform.openNbtData(universalTerminal); + compound.setTag("craftingGridPattern",compound.getTag("craftingGrid")); + compound.removeTag("craftingGrid"); } - NBTBase upgrades = Platform.openNbtData(terminal).getTag("upgrades"); - Platform.openNbtData(t).setTag("upgrades", upgrades); - - terminal = t; + terminal = universalTerminal; for (WirelessTerminalType x : terminals) { UniversalTerminalHelper.installModule(terminal, x); }