From 63dd035c852793cc6c1961c51cc51ef4c134d1fd Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Mon, 10 Oct 2022 19:48:24 -0300 Subject: [PATCH 1/5] works --- .../java/appeng/api/definitions/IParts.java | 105 ++-- ...uiFluidInterfaceConfigurationTerminal.java | 495 ++++++++++++++++++ .../client/me/ClientDCInternalFluidInv.java | 72 +++ ...erFluidInterfaceConfigurationTerminal.java | 302 +++++++++++ .../appeng/core/api/definitions/ApiParts.java | 12 + src/main/java/appeng/core/sync/GuiBridge.java | 1 + .../sync/packets/PacketCompressedNBT.java | 3 + .../sync/packets/PacketTargetFluidStack.java | 3 + .../client/gui/widgets/GuiFluidTank.java | 4 +- .../fluids/helper/DualityFluidInterface.java | 112 +++- .../java/appeng/items/parts/PartType.java | 4 +- ...rtFluidInterfaceConfigurationTerminal.java | 69 +++ 12 files changed, 1127 insertions(+), 55 deletions(-) create mode 100644 src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java create mode 100644 src/main/java/appeng/client/me/ClientDCInternalFluidInv.java create mode 100644 src/main/java/appeng/container/implementations/ContainerFluidInterfaceConfigurationTerminal.java create mode 100644 src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java diff --git a/src/api/java/appeng/api/definitions/IParts.java b/src/api/java/appeng/api/definitions/IParts.java index 3ecab0c2d..a3d2638ce 100644 --- a/src/api/java/appeng/api/definitions/IParts.java +++ b/src/api/java/appeng/api/definitions/IParts.java @@ -30,103 +30,106 @@ import appeng.api.util.AEColoredItemDefinition; /** * A list of all parts in AE */ -public interface IParts -{ - AEColoredItemDefinition cableSmart(); +public interface IParts { + AEColoredItemDefinition cableSmart(); - AEColoredItemDefinition cableCovered(); + AEColoredItemDefinition cableCovered(); - AEColoredItemDefinition cableGlass(); + AEColoredItemDefinition cableGlass(); - AEColoredItemDefinition cableDenseCovered(); + AEColoredItemDefinition cableDenseCovered(); - AEColoredItemDefinition cableDenseSmart(); + AEColoredItemDefinition cableDenseSmart(); - AEColoredItemDefinition lumenCableSmart(); + AEColoredItemDefinition lumenCableSmart(); - AEColoredItemDefinition lumenCableCovered(); + AEColoredItemDefinition lumenCableCovered(); - AEColoredItemDefinition lumenCableGlass(); + AEColoredItemDefinition lumenCableGlass(); - AEColoredItemDefinition lumenDenseCableSmart(); + AEColoredItemDefinition lumenDenseCableSmart(); - IItemDefinition quartzFiber(); + IItemDefinition quartzFiber(); - IItemDefinition toggleBus(); + IItemDefinition toggleBus(); - IItemDefinition invertedToggleBus(); + IItemDefinition invertedToggleBus(); - IItemDefinition storageBus(); + IItemDefinition storageBus(); - IItemDefinition oreDictStorageBus(); + IItemDefinition oreDictStorageBus(); - IItemDefinition importBus(); + IItemDefinition importBus(); - IItemDefinition exportBus(); + IItemDefinition exportBus(); - IItemDefinition iface(); + IItemDefinition iface(); - IItemDefinition fluidIface(); + IItemDefinition fluidIface(); - IItemDefinition levelEmitter(); + IItemDefinition levelEmitter(); - IItemDefinition annihilationPlane(); + IItemDefinition annihilationPlane(); - IItemDefinition identityAnnihilationPlane(); + IItemDefinition identityAnnihilationPlane(); - IItemDefinition formationPlane(); + IItemDefinition formationPlane(); - IItemDefinition p2PTunnelME(); + IItemDefinition p2PTunnelME(); - IItemDefinition p2PTunnelRedstone(); + IItemDefinition p2PTunnelRedstone(); - IItemDefinition p2PTunnelItems(); + IItemDefinition p2PTunnelItems(); - IItemDefinition p2PTunnelFluids(); + IItemDefinition p2PTunnelFluids(); - IItemDefinition p2PTunnelEU(); + IItemDefinition p2PTunnelEU(); - IItemDefinition p2PTunnelFE(); + IItemDefinition p2PTunnelFE(); - IItemDefinition p2PTunnelGTEU(); + IItemDefinition p2PTunnelGTEU(); - IItemDefinition p2PTunnelLight(); + IItemDefinition p2PTunnelLight(); - // IItemDefinition p2PTunnelOpenComputers(); + // IItemDefinition p2PTunnelOpenComputers(); - IItemDefinition cableAnchor(); + IItemDefinition cableAnchor(); - IItemDefinition monitor(); + IItemDefinition monitor(); - IItemDefinition semiDarkMonitor(); + IItemDefinition semiDarkMonitor(); - IItemDefinition darkMonitor(); + IItemDefinition darkMonitor(); - IItemDefinition interfaceTerminal(); + IItemDefinition interfaceTerminal(); - IItemDefinition patternTerminal(); + IItemDefinition patternTerminal(); - IItemDefinition expandedProcessingPatternTerminal(); + IItemDefinition expandedProcessingPatternTerminal(); - IItemDefinition craftingTerminal(); + IItemDefinition interfaceConfigurationTerminal(); - IItemDefinition terminal(); + IItemDefinition fluidInterfaceConfigurationTerminal(); - IItemDefinition storageMonitor(); + IItemDefinition craftingTerminal(); - IItemDefinition conversionMonitor(); + IItemDefinition terminal(); - IItemDefinition fluidTerminal(); + IItemDefinition storageMonitor(); - IItemDefinition fluidImportBus(); + IItemDefinition conversionMonitor(); - IItemDefinition fluidExportBus(); + IItemDefinition fluidTerminal(); - IItemDefinition fluidStorageBus(); + IItemDefinition fluidImportBus(); - IItemDefinition fluidLevelEmitter(); + IItemDefinition fluidExportBus(); - IItemDefinition fluidAnnihilationPlane(); + IItemDefinition fluidStorageBus(); - IItemDefinition fluidFormationnPlane(); + IItemDefinition fluidLevelEmitter(); + + IItemDefinition fluidAnnihilationPlane(); + + IItemDefinition fluidFormationnPlane(); } diff --git a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java new file mode 100644 index 000000000..963818b82 --- /dev/null +++ b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java @@ -0,0 +1,495 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.client.gui.implementations; + + +import appeng.api.AEApi; +import appeng.api.config.ActionItems; +import appeng.api.config.Settings; +import appeng.api.storage.channels.IItemStorageChannel; +import appeng.api.storage.data.IAEFluidStack; +import appeng.client.gui.AEBaseGui; +import appeng.client.gui.widgets.GuiCustomSlot; +import appeng.client.gui.widgets.GuiImgButton; +import appeng.client.gui.widgets.GuiScrollbar; +import appeng.client.gui.widgets.MEGuiTextField; +import appeng.client.me.ClientDCInternalFluidInv; +import appeng.client.me.SlotDisconnected; +import appeng.container.implementations.ContainerFluidInterfaceConfigurationTerminal; +import appeng.container.interfaces.IJEIGhostIngredients; +import appeng.core.localization.GuiText; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketInventoryAction; +import appeng.fluids.client.gui.widgets.GuiFluidSlot; +import appeng.fluids.client.gui.widgets.GuiFluidTank; +import appeng.fluids.container.IFluidSyncContainer; +import appeng.fluids.util.AEFluidStack; +import appeng.helpers.InventoryAction; +import appeng.parts.reporting.PartFluidInterfaceConfigurationTerminal; +import appeng.util.BlockPosUtils; +import appeng.util.Platform; +import appeng.util.item.AEItemStack; +import com.google.common.collect.HashMultimap; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import mezz.jei.api.gui.IGhostIngredientHandler; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.text.TextComponentString; +import net.minecraftforge.common.DimensionManager; +import org.lwjgl.input.Mouse; + +import java.awt.*; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.WeakHashMap; + +import static appeng.client.render.BlockPosHighlighter.hilightBlock; + + +public class GuiFluidInterfaceConfigurationTerminal extends AEBaseGui implements IJEIGhostIngredients { + + private static final int LINES_ON_PAGE = 6; + + // TODO: copied from GuiMEMonitorable. It looks not changed, maybe unneeded? + private final int offsetX = 21; + + private final HashMap byId = new HashMap<>(); + private final HashMultimap byName = HashMultimap.create(); + private final HashMap blockPosHashMap = new HashMap<>(); + private final HashMap guiButtonHashMap = new HashMap<>(); + + private final Map guiFluidTankClientDCInternalFluidInvMap = new Object2ObjectOpenHashMap<>(); + private final Map numUpgradesMap = new HashMap<>(); + private final ArrayList names = new ArrayList<>(); + private final ArrayList lines = new ArrayList<>(); + private final Set matchedStacks = new HashSet<>(); + + private final Map> cachedSearches = new WeakHashMap<>(); + + private boolean refreshList = false; + private MEGuiTextField searchFieldInputs; + private final PartFluidInterfaceConfigurationTerminal partInterfaceTerminal; + private final HashMap dimHashMap = new HashMap<>(); + public Map, Object> mapTargetSlot = new HashMap<>(); + + public GuiFluidInterfaceConfigurationTerminal(final InventoryPlayer inventoryPlayer, final PartFluidInterfaceConfigurationTerminal te) { + super(new ContainerFluidInterfaceConfigurationTerminal(inventoryPlayer, te)); + + this.partInterfaceTerminal = te; + final GuiScrollbar scrollbar = new GuiScrollbar(); + this.setScrollBar(scrollbar); + this.xSize = 208; + this.ySize = 235; + } + + @Override + public void initGui() { + super.initGui(); + + this.getScrollBar().setLeft(189); + this.getScrollBar().setHeight(106); + this.getScrollBar().setTop(31); + + this.searchFieldInputs = new MEGuiTextField(this.fontRenderer, this.guiLeft + Math.max(32, this.offsetX), this.guiTop + 17, 65, 12); + this.searchFieldInputs.setEnableBackgroundDrawing(false); + this.searchFieldInputs.setMaxStringLength(25); + this.searchFieldInputs.setTextColor(0xFFFFFF); + this.searchFieldInputs.setVisible(true); + this.searchFieldInputs.setFocused(false); + + this.searchFieldInputs.setText(partInterfaceTerminal.in); + } + + @Override + public void onGuiClosed() { + partInterfaceTerminal.saveSearchStrings(this.searchFieldInputs.getText().toLowerCase()); + super.onGuiClosed(); + } + + @Override + public void drawFG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) { + this.buttonList.clear(); + + this.fontRenderer.drawString(this.getGuiDisplayName(GuiText.InterfaceConfigurationTerminal.getLocal()), 8, 6, 4210752); + this.fontRenderer.drawString(GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752); + + final int currentScroll = this.getScrollBar().getCurrentScroll(); + + this.guiSlots.removeIf(slot -> slot instanceof GuiFluidTank); + + int offset = 30; + int linesDraw = 0; + for (int x = 0; x < LINES_ON_PAGE && linesDraw < LINES_ON_PAGE && currentScroll + x < this.lines.size(); x++) { + final Object lineObj = this.lines.get(currentScroll + x); + if (lineObj instanceof ClientDCInternalFluidInv) { + final ClientDCInternalFluidInv inv = (ClientDCInternalFluidInv) lineObj; + + GuiButton guiButton = new GuiImgButton(guiLeft + 4, guiTop + offset, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE); + guiButtonHashMap.put(guiButton, inv); + this.buttonList.add(guiButton); + int extraLines = numUpgradesMap.get(inv); + + for (int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row) { + for (int z = 0; z < 5; z++) { + GuiFluidTank tankSlot = new GuiFluidTank(inv.getInventory(), z + (row * 5), z + (row * 5), (z * 18 + 22), offset, 16, 16); + this.guiSlots.add(tankSlot); + guiFluidTankClientDCInternalFluidInvMap.put(tankSlot, inv); + if (this.matchedStacks.contains(inv.getInventory().getFluidInSlot(z + (row * 5)))) { + drawRect(z * 18 + 22, offset, z * 18 + 22 + 16, offset + 16, 0x2A00FF00); + } + } + linesDraw++; + offset += 18; + } + } else if (lineObj instanceof String) { + String name = (String) lineObj; + final int rows = this.byName.get(name).size(); + if (rows > 1) { + name = name + " (" + rows + ')'; + } + + while (name.length() > 2 && this.fontRenderer.getStringWidth(name) > 155) { + name = name.substring(0, name.length() - 1); + } + this.fontRenderer.drawString(name, this.offsetX + 2, 5 + offset, 4210752); + linesDraw++; + offset += 18; + } + } + + if (searchFieldInputs.isMouseIn(mouseX, mouseY)) { + drawTooltip(Mouse.getEventX() * this.width / this.mc.displayWidth - offsetX, mouseY - guiTop, "Inputs OR names"); + } + } + + @Override + protected void mouseClicked(final int xCoord, final int yCoord, final int btn) throws IOException { + this.searchFieldInputs.mouseClicked(xCoord, yCoord, btn); + + if (btn == 1 && this.searchFieldInputs.isMouseIn(xCoord, yCoord)) { + this.searchFieldInputs.setText(""); + this.refreshList(); + } + + for (GuiCustomSlot slot : this.guiSlots) { + if (slot instanceof GuiFluidTank) { + if (this.isPointInRegion(slot.xPos(), slot.yPos(), slot.getWidth(), slot.getHeight(), xCoord, yCoord) && slot.canClick(this.mc.player)) { + NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.PICKUP_OR_SET_DOWN, slot.getId(), guiFluidTankClientDCInternalFluidInvMap.get(slot).getId())); + + return; + } + } + } + + super.mouseClicked(xCoord, yCoord, btn); + } + + @Override + protected void actionPerformed(final GuiButton btn) throws IOException { + if (guiButtonHashMap.containsKey(btn)) { + BlockPos blockPos = blockPosHashMap.get(guiButtonHashMap.get(this.selectedButton)); + BlockPos blockPos2 = mc.player.getPosition(); + int playerDim = mc.world.provider.getDimension(); + int interfaceDim = dimHashMap.get(guiButtonHashMap.get(this.selectedButton)); + if (playerDim != interfaceDim) { + try { + mc.player.sendStatusMessage(new TextComponentString("Interface located at dimension: " + interfaceDim + " [" + DimensionManager.getWorld(interfaceDim).provider.getDimensionType().getName() + "] and cant be highlighted"), false); + } catch (Exception e) { + mc.player.sendStatusMessage(new TextComponentString("Interface is located in another dimension and cannot be highlighted"), false); + } + } else { + hilightBlock(blockPos, System.currentTimeMillis() + 500 * BlockPosUtils.getDistance(blockPos, blockPos2), playerDim); + mc.player.sendStatusMessage(new TextComponentString("The interface is now highlighted at " + "X: " + blockPos.getX() + " Y: " + blockPos.getY() + " Z: " + blockPos.getZ()), false); + } + mc.player.closeScreen(); + } + } + + @Override + public void drawBG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) { + this.bindTexture("guis/interfaceconfigurationterminal.png"); + this.drawTexturedModalRect(offsetX, offsetY, 0, 0, this.xSize, this.ySize); + + int offset = 29; + final int ex = this.getScrollBar().getCurrentScroll(); + int linesDraw = 0; + for (int x = 0; x < LINES_ON_PAGE && linesDraw < LINES_ON_PAGE && ex + x < this.lines.size(); x++) { + final Object lineObj = this.lines.get(ex + x); + if (lineObj instanceof ClientDCInternalFluidInv) { + GlStateManager.color(1, 1, 1, 1); + final int width = 9 * 18; + + int extraLines = numUpgradesMap.get(lineObj); + + for (int row = 0; row < 1 + extraLines && linesDraw < LINES_ON_PAGE; ++row) { + this.drawTexturedModalRect(offsetX + 20, offsetY + offset, 20, 170, width, 18); + offset += 18; + linesDraw++; + } + } else { + offset += 18; + linesDraw++; + } + } + + if (this.searchFieldInputs != null) { + this.searchFieldInputs.drawTextBox(); + } + } + + @Override + protected void keyTyped(final char character, final int key) throws IOException { + if (!this.checkHotbarKeys(key)) { + if (character == ' ' && this.searchFieldInputs.getText().isEmpty() && this.searchFieldInputs.isFocused()) { + return; + } + + if (this.searchFieldInputs.textboxKeyTyped(character, key)) { + this.refreshList(); + } else { + super.keyTyped(character, key); + } + } + } + + public void postUpdate(final NBTTagCompound in) { + if (in.getBoolean("clear")) { + this.byId.clear(); + this.refreshList = true; + } + + for (final Object oKey : in.getKeySet()) { + final String key = (String) oKey; + if (key.startsWith("=")) { + try { + final long id = Long.parseLong(key.substring(1), Character.MAX_RADIX); + final NBTTagCompound invData = in.getCompoundTag(key); + final ClientDCInternalFluidInv current = this.getById(id, invData.getLong("sortBy"), invData.getString("un")); + blockPosHashMap.put(current, NBTUtil.getPosFromTag(invData.getCompoundTag("pos"))); + dimHashMap.put(current, invData.getInteger("dim")); + numUpgradesMap.put(current, invData.getInteger("numUpgrades")); + + for (int x = 0; x < current.getInventory().getSlots(); x++) { + final String which = Integer.toString(x); + if (invData.hasKey(which)) { + current.getInventory().setFluidInSlot(x, AEFluidStack.fromNBT(invData.getCompoundTag(which))); + } + } + } catch (final NumberFormatException ignored) { + } + } + } + + if (this.refreshList) { + this.refreshList = false; + // invalid caches on refresh + this.cachedSearches.clear(); + this.refreshList(); + } + } + + /** + * Rebuilds the list of interfaces. + *

+ * Respects a search term if present (ignores case) and adding only matching patterns. + */ + private void refreshList() { + this.byName.clear(); + this.buttonList.clear(); + this.matchedStacks.clear(); + + final String searchFieldInputs = this.searchFieldInputs.getText().toLowerCase(); + + final Set cachedSearch = this.getCacheForSearchTerm(searchFieldInputs); + final boolean rebuild = cachedSearch.isEmpty(); + + for (final ClientDCInternalFluidInv entry : this.byId.values()) { + // ignore inventory if not doing a full rebuild and cache already marks it as miss. + if (!rebuild && !cachedSearch.contains(entry)) { + continue; + } + + // Shortcut to skip any filter if search term is ""/empty + + boolean found = searchFieldInputs.isEmpty(); + + // Search if the current inventory holds a pattern containing the search term. + if (!found) { + int slot = 0; + for (int i = 0; i < entry.getInventory().getSlots(); i++) { + if (slot > 8 + numUpgradesMap.get(entry) * 9) { + break; + } + IAEFluidStack fs = entry.getInventory().getFluidInSlot(i); + if (this.fluidStackMatchesSearchTerm(fs, searchFieldInputs)) { + found = true; + matchedStacks.add(fs); + } + slot++; + } + } + // if found, filter skipped or machine name matching the search term, add it + if (found || entry.getName().toLowerCase().contains(searchFieldInputs)) { + this.byName.put(entry.getName(), entry); + cachedSearch.add(entry); + } else { + cachedSearch.remove(entry); + } + } + + this.names.clear(); + this.names.addAll(this.byName.keySet()); + + Collections.sort(this.names); + + this.lines.clear(); + this.lines.ensureCapacity(this.getMaxRows()); + + for (final String n : this.names) { + this.lines.add(n); + + final ArrayList clientInventories = new ArrayList<>(); + clientInventories.addAll(this.byName.get(n)); + + Collections.sort(clientInventories); + this.lines.addAll(clientInventories); + } + + this.getScrollBar().setRange(0, this.lines.size() - 1, 1); + } + + private boolean fluidStackMatchesSearchTerm(final IAEFluidStack iaeFluidStack, final String searchTerm) { + if (iaeFluidStack == null) { + return false; + } + + boolean foundMatchingItemStack = false; + + final String displayName = Platform + .getItemDisplayName(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(iaeFluidStack)) + .toLowerCase(); + + for (String term : searchTerm.split(" ")) { + if (term.length() > 1 && (term.startsWith("-") || term.startsWith("!"))) { + term = term.substring(1); + if (displayName.contains(term)) { + return false; + } + } else if (displayName.contains(term)) { + foundMatchingItemStack = true; + } + } + return foundMatchingItemStack; + } + + /** + * Tries to retrieve a cache for a with search term as keyword. + *

+ * If this cache should be empty, it will populate it with an earlier cache if available or at least the cache for + * the empty string. + * + * @param searchTerm the corresponding search + * @return a Set matching a superset of the search term + */ + private Set getCacheForSearchTerm(final String searchTerm) { + if (!this.cachedSearches.containsKey(searchTerm)) { + this.cachedSearches.put(searchTerm, new HashSet<>()); + } + + final Set cache = this.cachedSearches.get(searchTerm); + + if (cache.isEmpty() && searchTerm.length() > 1) { + cache.addAll(this.getCacheForSearchTerm(searchTerm.substring(0, searchTerm.length() - 1))); + return cache; + } + + return cache; + } + + /** + * The max amount of unique names and each inv row. Not affected by the filtering. + * + * @return max amount of unique names and each inv row + */ + private int getMaxRows() { + return this.names.size() + this.byId.size(); + } + + private ClientDCInternalFluidInv getById(final long id, final long sortBy, final String string) { + ClientDCInternalFluidInv o = this.byId.get(id); + + if (o == null) { + this.byId.put(id, o = new ClientDCInternalFluidInv(5, id, sortBy, string, 64)); + this.refreshList = true; + } + + return o; + } + + @Override + public List> getPhantomTargets(Object ingredient) { + if (!(ingredient instanceof ItemStack)) { + return Collections.emptyList(); + } + List> targets = new ArrayList<>(); + for (Slot slot : this.inventorySlots.inventorySlots) { + if (slot instanceof SlotDisconnected) { + ItemStack itemStack = (ItemStack) ingredient; + IGhostIngredientHandler.Target target = new IGhostIngredientHandler.Target() { + @Override + public Rectangle getArea() { + return new Rectangle(getGuiLeft() + slot.xPos, getGuiTop() + slot.yPos, 16, 16); + } + + @Override + public void accept(Object ingredient) { + final PacketInventoryAction p; + try { + p = new PacketInventoryAction(InventoryAction.PLACE_JEI_GHOST_ITEM, (SlotDisconnected) slot, AEItemStack.fromItemStack(itemStack)); + NetworkHandler.instance().sendToServer(p); + + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + targets.add(target); + mapTargetSlot.putIfAbsent(target, slot); + } + } + return targets; + } + + @Override + public Map, Object> getFakeSlotTargetMap() { + return IJEIGhostIngredients.super.getFakeSlotTargetMap(); + } +} diff --git a/src/main/java/appeng/client/me/ClientDCInternalFluidInv.java b/src/main/java/appeng/client/me/ClientDCInternalFluidInv.java new file mode 100644 index 000000000..f129a6263 --- /dev/null +++ b/src/main/java/appeng/client/me/ClientDCInternalFluidInv.java @@ -0,0 +1,72 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.client.me; + + +import appeng.fluids.util.AEFluidInventory; +import appeng.fluids.util.IAEFluidTank; +import appeng.tile.inventory.AppEngInternalInventory; +import net.minecraft.util.text.translation.I18n; + +import javax.annotation.Nonnull; + + +public class ClientDCInternalFluidInv implements Comparable { + + private final String unlocalizedName; + private final IAEFluidTank inventory; + + private final long id; + private final long sortBy; + + public ClientDCInternalFluidInv(final int size, final long id, final long sortBy, final String unlocalizedName) { + this.inventory = new AEFluidInventory(null, size, 1); + this.unlocalizedName = unlocalizedName; + this.id = id; + this.sortBy = sortBy; + } + + public ClientDCInternalFluidInv(final int size, final long id, final long sortBy, final String unlocalizedName, int stackSize) { + this.inventory = new AEFluidInventory(null, size, stackSize); + this.unlocalizedName = unlocalizedName; + this.id = id; + this.sortBy = sortBy; + } + + public String getName() { + final String s = I18n.translateToLocal(this.unlocalizedName + ".name"); + if (s.equals(this.unlocalizedName + ".name")) { + return I18n.translateToLocal(this.unlocalizedName); + } + return s; + } + + @Override + public int compareTo(@Nonnull final ClientDCInternalFluidInv o) { + return Long.compare(this.sortBy, o.sortBy); + } + + public IAEFluidTank getInventory() { + return this.inventory; + } + + public long getId() { + return this.id; + } +} diff --git a/src/main/java/appeng/container/implementations/ContainerFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/container/implementations/ContainerFluidInterfaceConfigurationTerminal.java new file mode 100644 index 000000000..971f5cb62 --- /dev/null +++ b/src/main/java/appeng/container/implementations/ContainerFluidInterfaceConfigurationTerminal.java @@ -0,0 +1,302 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.container.implementations; + + +import appeng.api.config.Settings; +import appeng.api.config.YesNo; +import appeng.api.networking.IGrid; +import appeng.api.networking.IGridNode; +import appeng.api.networking.security.IActionHost; +import appeng.api.storage.data.IAEFluidStack; +import appeng.container.AEBaseContainer; +import appeng.core.sync.network.NetworkHandler; +import appeng.core.sync.packets.PacketCompressedNBT; +import appeng.core.sync.packets.PacketTargetFluidStack; +import appeng.fluids.helper.DualityFluidInterface; +import appeng.fluids.helper.IFluidInterfaceHost; +import appeng.fluids.parts.PartFluidInterface; +import appeng.fluids.tile.TileFluidInterface; +import appeng.fluids.util.AEFluidInventory; +import appeng.fluids.util.AEFluidStack; +import appeng.fluids.util.IAEFluidTank; +import appeng.helpers.InventoryAction; +import appeng.parts.misc.PartInterface; +import appeng.parts.reporting.PartFluidInterfaceConfigurationTerminal; +import appeng.tile.misc.TileInterface; +import appeng.util.Platform; +import appeng.util.helpers.ItemHandlerUtil; +import appeng.util.inv.WrapperRangeItemHandler; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import net.minecraftforge.items.IItemHandler; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + + +public final class ContainerFluidInterfaceConfigurationTerminal extends AEBaseContainer { + + /** + * this stuff is all server side.. + */ + + private static long autoBase = Long.MIN_VALUE; + private final Map diList = new HashMap<>(); + private final Map byId = new HashMap<>(); + private IGrid grid; + private NBTTagCompound data = new NBTTagCompound(); + private IAEFluidStack clientRequestedTargetFluid; + + public ContainerFluidInterfaceConfigurationTerminal(final InventoryPlayer ip, final PartFluidInterfaceConfigurationTerminal anchor) { + super(ip, anchor); + + if (Platform.isServer()) { + this.grid = anchor.getActionableNode().getGrid(); + } + + this.bindPlayerInventory(ip, 14, 235 - /* height of player inventory */82); + } + + @Override + public void detectAndSendChanges() { + if (Platform.isClient()) { + return; + } + + super.detectAndSendChanges(); + + if (this.grid == null) { + return; + } + + int total = 0; + boolean missing = false; + + final IActionHost host = this.getActionHost(); + if (host != null) { + final IGridNode agn = host.getActionableNode(); + if (agn != null && agn.isActive()) { + for (final IGridNode gn : this.grid.getMachines(TileFluidInterface.class)) { + if (gn.isActive()) { + final IFluidInterfaceHost ih = (IFluidInterfaceHost) gn.getMachine(); + if (ih.getDualityFluidInterface().getConfigManager().getSetting(Settings.INTERFACE_TERMINAL) == YesNo.NO) { + continue; + } + + final FluidConfigTracker t = this.diList.get(ih); + + if (t == null) { + missing = true; + } else { + final DualityFluidInterface dual = ih.getDualityFluidInterface(); + if (!t.unlocalizedName.equals(dual.getTermName())) { + missing = true; + } + } + + total++; + } + } + + for (final IGridNode gn : this.grid.getMachines(PartFluidInterface.class)) { + if (gn.isActive()) { + final IFluidInterfaceHost ih = (IFluidInterfaceHost) gn.getMachine(); + if (ih.getDualityFluidInterface().getConfigManager().getSetting(Settings.INTERFACE_TERMINAL) == YesNo.NO) { + continue; + } + + final FluidConfigTracker t = this.diList.get(ih); + + if (t == null) { + missing = true; + } else { + final DualityFluidInterface dual = ih.getDualityFluidInterface(); + if (!t.unlocalizedName.equals(dual.getTermName())) { + missing = true; + } + } + + total++; + } + } + } + } + + if (total != this.diList.size() || missing) { + this.regenList(this.data); + } else { + for (final Entry en : this.diList.entrySet()) { + final FluidConfigTracker inv = en.getValue(); + for (int x = 0; x < inv.server.getSlots(); x++) { + if ((inv.server.getFluidInSlot(x) == null && inv.client.getFluidInSlot(x) != null) || + (inv.server.getFluidInSlot(x) != null && !inv.server.getFluidInSlot(x).equals(inv.client.getFluidInSlot(x)))) { + this.addFluids(this.data, inv, x, 1); + } + } + } + } + + if (!this.data.hasNoTags()) { + try { + NetworkHandler.instance().sendTo(new PacketCompressedNBT(this.data), (EntityPlayerMP) this.getPlayerInv().player); + } catch (final IOException e) { + // :P + } + + this.data = new NBTTagCompound(); + } + } + + public FluidConfigTracker getSlotByID(long id) { + return this.byId.get(id); + } + + @Override + public void doAction(final EntityPlayerMP player, final InventoryAction action, final int slot, final long id) { + final FluidConfigTracker inv = this.byId.get(id); + if (inv != null) { + ItemStack itemInHand = player.inventory.getItemStack(); + IFluidHandlerItem c = itemInHand.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (c != null) { + FluidStack fs = c.drain(Integer.MAX_VALUE, false); + if (fs != null) { + inv.server.setFluidInSlot(slot, AEFluidStack.fromFluidStack(fs)); + return; + } + return; + } + inv.server.setFluidInSlot(slot, null); + + this.updateHeld(player); + } + } + + public void setTargetStack(final IAEFluidStack stack) { + if (Platform.isClient()) { + if (stack == null && this.clientRequestedTargetFluid == null) { + return; + } + if (stack != null && this.clientRequestedTargetFluid != null && stack.getFluidStack().isFluidEqual(this.clientRequestedTargetFluid.getFluidStack())) { + return; + } + NetworkHandler.instance().sendToServer(new PacketTargetFluidStack((AEFluidStack) stack)); + } + + this.clientRequestedTargetFluid = stack == null ? null : stack.copy(); + } + + private void regenList(final NBTTagCompound data) { + this.byId.clear(); + this.diList.clear(); + + final IActionHost host = this.getActionHost(); + if (host != null) { + final IGridNode agn = host.getActionableNode(); + if (agn != null && agn.isActive()) { + for (final IGridNode gn : this.grid.getMachines(TileFluidInterface.class)) { + final IFluidInterfaceHost ih = (IFluidInterfaceHost) gn.getMachine(); + final DualityFluidInterface dual = ih.getDualityFluidInterface(); + if (gn.isActive() && dual.getConfigManager().getSetting(Settings.INTERFACE_TERMINAL) == YesNo.YES) { + this.diList.put(ih, new FluidConfigTracker(dual, (AEFluidInventory) dual.getConfig(), dual.getTermName())); + } + } + + for (final IGridNode gn : this.grid.getMachines(PartFluidInterface.class)) { + final IFluidInterfaceHost ih = (IFluidInterfaceHost) gn.getMachine(); + final DualityFluidInterface dual = ih.getDualityFluidInterface(); + if (gn.isActive() && dual.getConfigManager().getSetting(Settings.INTERFACE_TERMINAL) == YesNo.YES) { + this.diList.put(ih, new FluidConfigTracker(dual, (AEFluidInventory) dual.getConfig(), dual.getTermName())); + } + } + } + } + + data.setBoolean("clear", true); + + for (final Entry en : this.diList.entrySet()) { + final FluidConfigTracker inv = en.getValue(); + this.byId.put(inv.which, inv); + this.addFluids(data, inv, 0, inv.server.getSlots()); + } + } + + private void addFluids(final NBTTagCompound data, final FluidConfigTracker inv, final int offset, final int length) { + final String name = '=' + Long.toString(inv.which, Character.MAX_RADIX); + final NBTTagCompound tag = data.getCompoundTag(name); + + if (tag.hasNoTags()) { + tag.setLong("sortBy", inv.sortBy); + tag.setString("un", inv.unlocalizedName); + tag.setTag("pos", NBTUtil.createPosTag(inv.pos)); + tag.setInteger("dim", inv.dim); + } + + for (int x = 0; x < length; x++) { + final NBTTagCompound fluidNBT = new NBTTagCompound(); + + final IAEFluidStack iaeFluidStack = inv.server.getFluidInSlot(x + offset); + + // "update" client side. + inv.client.setFluidInSlot(x + offset, iaeFluidStack == null ? null : iaeFluidStack.copy()); + + if (iaeFluidStack != null) { + iaeFluidStack.writeToNBT(fluidNBT); + } + + tag.setTag(Integer.toString(x + offset), fluidNBT); + } + + data.setTag(name, tag); + } + + public static class FluidConfigTracker { + + private final long sortBy; + private final long which = autoBase++; + private final String unlocalizedName; + private final IAEFluidTank client; + private final IAEFluidTank server; + private final BlockPos pos; + private final int dim; + + public FluidConfigTracker(final DualityFluidInterface dual, final AEFluidInventory configSlots, final String unlocalizedName) { + this.server = configSlots; + this.client = new AEFluidInventory(null, this.server.getSlots()); + this.unlocalizedName = unlocalizedName; + this.sortBy = dual.getSortValue(); + this.pos = dual.getLocation().getPos(); + this.dim = dual.getLocation().getWorld().provider.getDimension(); + } + + public IAEFluidTank getServer() { + return server; + } + } +} diff --git a/src/main/java/appeng/core/api/definitions/ApiParts.java b/src/main/java/appeng/core/api/definitions/ApiParts.java index 626232226..d146716ab 100644 --- a/src/main/java/appeng/core/api/definitions/ApiParts.java +++ b/src/main/java/appeng/core/api/definitions/ApiParts.java @@ -80,6 +80,7 @@ public final class ApiParts implements IParts { private final IItemDefinition patternTerminal; private final IItemDefinition expandedProcessingPatternTerminal; private final IItemDefinition interfaceConfigurationTerminal; + private final IItemDefinition fluidInterfaceConfigurationTerminal; private final IItemDefinition craftingTerminal; private final IItemDefinition terminal; private final IItemDefinition storageMonitor; @@ -141,6 +142,7 @@ public final class ApiParts implements IParts { this.patternTerminal = new DamagedItemDefinition("part.terminal.pattern", itemPart.createPart(PartType.PATTERN_TERMINAL)); this.expandedProcessingPatternTerminal = new DamagedItemDefinition("part.terminal.expanded_processing_pattern", itemPart.createPart(PartType.EXPANDED_PROCESSING_PATTERN_TERMINAL)); this.interfaceConfigurationTerminal = new DamagedItemDefinition("part.terminal.interface_configuration_terminal", itemPart.createPart(PartType.INTERFACE_CONFIGURATION_TERMINAL)); + this.fluidInterfaceConfigurationTerminal = new DamagedItemDefinition("part.terminal.fluid_interface_configuration_terminal", itemPart.createPart(PartType.FLUID_INTERFACE_CONFIGURATION_TERMINAL)); this.craftingTerminal = new DamagedItemDefinition("part.terminal.crafting", itemPart.createPart(PartType.CRAFTING_TERMINAL)); this.terminal = new DamagedItemDefinition("part.terminal", itemPart.createPart(PartType.TERMINAL)); this.storageMonitor = new DamagedItemDefinition("part.monitor.storage", itemPart.createPart(PartType.STORAGE_MONITOR)); @@ -359,6 +361,16 @@ public final class ApiParts implements IParts { return this.expandedProcessingPatternTerminal; } + @Override + public IItemDefinition interfaceConfigurationTerminal() { + return this.interfaceConfigurationTerminal; + } + + @Override + public IItemDefinition fluidInterfaceConfigurationTerminal() { + return this.fluidInterfaceConfigurationTerminal; + } + @Override public IItemDefinition craftingTerminal() { return this.craftingTerminal; diff --git a/src/main/java/appeng/core/sync/GuiBridge.java b/src/main/java/appeng/core/sync/GuiBridge.java index 64fcb6c26..48fd3bdad 100644 --- a/src/main/java/appeng/core/sync/GuiBridge.java +++ b/src/main/java/appeng/core/sync/GuiBridge.java @@ -170,6 +170,7 @@ public enum GuiBridge implements IGuiHandler { GUI_CRAFTING_STATUS(ContainerCraftingStatus.class, ITerminalHost.class, GuiHostType.ITEM_OR_WORLD, SecurityPermissions.CRAFT), GUI_INTERFACE_CONFIGURATION_TERMINAL(ContainerInterfaceConfigurationTerminal.class, PartInterfaceConfigurationTerminal.class, GuiHostType.WORLD, SecurityPermissions.BUILD), + GUI_FLUID_INTERFACE_CONFIGURATION_TERMINAL(ContainerFluidInterfaceConfigurationTerminal.class, PartFluidInterfaceConfigurationTerminal.class, GuiHostType.WORLD, SecurityPermissions.BUILD), GUI_RENAMER(ContainerRenamer.class, ICustomNameObject.class, GuiHostType.WORLD, SecurityPermissions.BUILD); diff --git a/src/main/java/appeng/core/sync/packets/PacketCompressedNBT.java b/src/main/java/appeng/core/sync/packets/PacketCompressedNBT.java index 9bdec09ad..1fc735578 100644 --- a/src/main/java/appeng/core/sync/packets/PacketCompressedNBT.java +++ b/src/main/java/appeng/core/sync/packets/PacketCompressedNBT.java @@ -19,6 +19,7 @@ package appeng.core.sync.packets; +import appeng.client.gui.implementations.GuiFluidInterfaceConfigurationTerminal; import appeng.client.gui.implementations.GuiInterfaceConfigurationTerminal; import appeng.client.gui.implementations.GuiInterfaceTerminal; import appeng.core.sync.AppEngPacket; @@ -99,6 +100,8 @@ public class PacketCompressedNBT extends AppEngPacket { ((GuiInterfaceTerminal) gs).postUpdate(this.in); } else if (gs instanceof GuiInterfaceConfigurationTerminal) { ((GuiInterfaceConfigurationTerminal) gs).postUpdate(this.in); + } else if (gs instanceof GuiFluidInterfaceConfigurationTerminal) { + ((GuiFluidInterfaceConfigurationTerminal) gs).postUpdate(this.in); } } } diff --git a/src/main/java/appeng/core/sync/packets/PacketTargetFluidStack.java b/src/main/java/appeng/core/sync/packets/PacketTargetFluidStack.java index d978b4c52..35d888226 100644 --- a/src/main/java/appeng/core/sync/packets/PacketTargetFluidStack.java +++ b/src/main/java/appeng/core/sync/packets/PacketTargetFluidStack.java @@ -19,6 +19,7 @@ package appeng.core.sync.packets; +import appeng.container.implementations.ContainerFluidInterfaceConfigurationTerminal; import appeng.core.AELog; import appeng.core.sync.AppEngPacket; import appeng.core.sync.network.INetworkInfo; @@ -75,6 +76,8 @@ public class PacketTargetFluidStack extends AppEngPacket { ((ContainerFluidTerminal) player.openContainer).setTargetStack(this.stack); } else if (player.openContainer instanceof ContainerFluidInterface) { ((ContainerFluidInterface) player.openContainer).setTargetStack(this.stack); + } else if (player.openContainer instanceof ContainerFluidInterfaceConfigurationTerminal) { + ((ContainerFluidInterfaceConfigurationTerminal) player.openContainer).setTargetStack(this.stack); } } } diff --git a/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java b/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java index 6590babc8..de37ef87f 100644 --- a/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java +++ b/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java @@ -127,9 +127,9 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip { public void slotClicked(ItemStack clickStack, final int mouseButton) { if (getFluidStack() != null) { - NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.FILL_ITEM, slot, 0)); + NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.FILL_ITEM, slot, id)); } else { - NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.EMPTY_ITEM, slot, 0)); + NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.EMPTY_ITEM, slot, id)); } } diff --git a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java index 8ca574498..17e8e4491 100644 --- a/src/main/java/appeng/fluids/helper/DualityFluidInterface.java +++ b/src/main/java/appeng/fluids/helper/DualityFluidInterface.java @@ -21,9 +21,13 @@ package appeng.fluids.helper; import appeng.api.AEApi; import appeng.api.config.Actionable; +import appeng.api.config.Settings; import appeng.api.config.Upgrades; +import appeng.api.config.YesNo; import appeng.api.implementations.IUpgradeableHost; +import appeng.api.implementations.tiles.ICraftingMachine; import appeng.api.networking.GridFlags; +import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.security.IActionHost; @@ -46,7 +50,10 @@ import appeng.core.settings.TickRates; import appeng.fluids.util.AEFluidInventory; import appeng.fluids.util.IAEFluidInventory; import appeng.fluids.util.IAEFluidTank; +import appeng.helpers.ICustomNameObject; +import appeng.helpers.IInterfaceHost; import appeng.me.GridAccessException; +import appeng.me.GridNodeCollection; import appeng.me.helpers.AENetworkProxy; import appeng.me.helpers.MachineSource; import appeng.me.storage.MEMonitorIFluidHandler; @@ -54,24 +61,40 @@ import appeng.me.storage.MEMonitorPassThrough; import appeng.me.storage.NullInventory; import appeng.util.ConfigManager; import appeng.util.IConfigManagerHost; +import appeng.util.InventoryAdaptor; import appeng.util.Platform; +import gregtech.api.block.machines.BlockMachine; +import gregtech.api.metatileentity.MetaTileEntity; +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Items; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.items.IItemHandler; +import java.util.Collection; +import java.util.EnumSet; +import java.util.HashSet; import java.util.Optional; public class DualityFluidInterface implements IGridTickable, IStorageMonitorable, IAEFluidInventory, IUpgradeableHost, IConfigManagerHost, IConfigurableFluidInventory { public static final int NUMBER_OF_TANKS = 6; public static final int TANK_CAPACITY = Fluid.BUCKET_VOLUME * 4; - + private static final Collection BAD_BLOCKS = new HashSet<>(100); private final ConfigManager cm = new ConfigManager(this); private final AENetworkProxy gridProxy; private final IFluidInterfaceHost iHost; @@ -93,6 +116,9 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable public DualityFluidInterface(final AENetworkProxy networkProxy, final IFluidInterfaceHost ih) { this.gridProxy = networkProxy; this.gridProxy.setFlags(GridFlags.REQUIRE_CHANNEL); + + this.cm.registerSetting(Settings.INTERFACE_TERMINAL, YesNo.YES); + this.iHost = ih; this.mySource = new MachineSource(this.iHost); @@ -192,6 +218,90 @@ public class DualityFluidInterface implements IGridTickable, IStorageMonitorable return new DimensionalCoord(this.iHost.getTileEntity()); } + private boolean sameGrid(final IGrid grid) throws GridAccessException { + return grid == this.gridProxy.getGrid(); + } + + public String getTermName() { + final TileEntity hostTile = this.iHost.getTileEntity(); + final World hostWorld = hostTile.getWorld(); + + if (((ICustomNameObject) this.iHost).hasCustomInventoryName()) { + return ((ICustomNameObject) this.iHost).getCustomInventoryName(); + } + + final EnumSet possibleDirections = this.iHost.getTargets(); + for (final EnumFacing direction : possibleDirections) { + final BlockPos targ = hostTile.getPos().offset(direction); + final TileEntity directedTile = hostWorld.getTileEntity(targ); + + if (directedTile == null) { + continue; + } + + if (directedTile instanceof IFluidInterfaceHost) { + try { + if (((IFluidInterfaceHost) directedTile).getDualityFluidInterface().sameGrid(this.gridProxy.getGrid())) { + continue; + } + } catch (final GridAccessException e) { + continue; + } + } + + final InventoryAdaptor adaptor = InventoryAdaptor.getAdaptor(directedTile, direction.getOpposite()); + if (directedTile instanceof ICraftingMachine || adaptor != null) { + if (adaptor != null && !adaptor.hasSlots()) { + continue; + } + + final IBlockState directedBlockState = hostWorld.getBlockState(targ); + final Block directedBlock = directedBlockState.getBlock(); + ItemStack what = new ItemStack(directedBlock, 1, directedBlock.getMetaFromState(directedBlockState)); + + if (Loader.isModLoaded("gregtech") && directedBlock instanceof BlockMachine) { + MetaTileEntity metaTileEntity = Platform.getMetaTileEntity(directedTile.getWorld(), directedTile.getPos()); + if (metaTileEntity != null) { + return metaTileEntity.getMetaFullName(); + } + } + + try { + Vec3d from = new Vec3d(hostTile.getPos().getX() + 0.5, hostTile.getPos().getY() + 0.5, hostTile.getPos().getZ() + 0.5); + from = from.addVector(direction.getFrontOffsetX() * 0.501, direction.getFrontOffsetY() * 0.501, direction.getFrontOffsetZ() * 0.501); + final Vec3d to = from.addVector(direction.getFrontOffsetX(), direction.getFrontOffsetY(), direction.getFrontOffsetZ()); + final RayTraceResult mop = hostWorld.rayTraceBlocks(from, to, true); + if (mop != null && !BAD_BLOCKS.contains(directedBlock)) { + if (mop.getBlockPos().equals(directedTile.getPos())) { + final ItemStack g = directedBlock.getPickBlock(directedBlockState, mop, hostWorld, directedTile.getPos(), null); + if (!g.isEmpty()) { + what = g; + } + } + } + } catch (final Throwable t) { + BAD_BLOCKS.add(directedBlock); // nope! + } + + if (what.getItem() != Items.AIR) { + return what.getItem().getItemStackDisplayName(what); + } + + final Item item = Item.getItemFromBlock(directedBlock); + if (item == Items.AIR) { + return directedBlock.getUnlocalizedName(); + } + } + } + + return "Nothing"; + } + + public long getSortValue() { + final TileEntity te = this.iHost.getTileEntity(); + return (te.getPos().getZ() << 24) ^ (te.getPos().getX() << 8) ^ te.getPos().getY(); + } + public boolean hasCapability(Capability capabilityClass, EnumFacing facing) { return capabilityClass == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || capabilityClass == Capabilities.STORAGE_MONITORABLE_ACCESSOR; } diff --git a/src/main/java/appeng/items/parts/PartType.java b/src/main/java/appeng/items/parts/PartType.java index 4645103c6..3e54527fe 100644 --- a/src/main/java/appeng/items/parts/PartType.java +++ b/src/main/java/appeng/items/parts/PartType.java @@ -229,7 +229,9 @@ public enum PartType { INTERFACE_TERMINAL(480, "interface_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartInterfaceTerminal.class), FLUID_TERMINAL(520, "fluid_terminal", EnumSet.of(AEFeature.FLUID_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartFluidTerminal.class), - INTERFACE_CONFIGURATION_TERMINAL(521, "interface_configuration_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartInterfaceConfigurationTerminal.class); + INTERFACE_CONFIGURATION_TERMINAL(521, "interface_configuration_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartInterfaceConfigurationTerminal.class), + FLUID_INTERFACE_CONFIGURATION_TERMINAL(522, "interface_configuration_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartFluidInterfaceConfigurationTerminal.class); + private final int baseDamage; private final Set features; diff --git a/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java new file mode 100644 index 000000000..3c081cc5d --- /dev/null +++ b/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java @@ -0,0 +1,69 @@ +/* + * This file is part of Applied Energistics 2. + * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. + * + * Applied Energistics 2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Applied Energistics 2 is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Applied Energistics 2. If not, see . + */ + +package appeng.parts.reporting; + + +import appeng.api.parts.IPartModel; +import appeng.core.AppEng; +import appeng.core.sync.GuiBridge; +import appeng.items.parts.PartModels; +import appeng.parts.PartModel; +import appeng.util.Platform; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumHand; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.Vec3d; + + +public class PartFluidInterfaceConfigurationTerminal extends AbstractPartDisplay { + + @PartModels + public static final ResourceLocation MODEL_OFF = new ResourceLocation(AppEng.MOD_ID, "part/interface_configuration_terminal_off"); + @PartModels + public static final ResourceLocation MODEL_ON = new ResourceLocation(AppEng.MOD_ID, "part/interface_configuration_terminal_on"); + + public static final IPartModel MODELS_OFF = new PartModel(MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF); + public static final IPartModel MODELS_ON = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_ON); + public static final IPartModel MODELS_HAS_CHANNEL = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL); + public String in = ""; + + public PartFluidInterfaceConfigurationTerminal(final ItemStack is) { + super(is); + } + + @Override + public boolean onPartActivate(final EntityPlayer player, final EnumHand hand, final Vec3d pos) { + if (!super.onPartActivate(player, hand, pos)) { + if (Platform.isServer()) { + Platform.openGUI(player, this.getHost().getTile(), this.getSide(), GuiBridge.GUI_FLUID_INTERFACE_CONFIGURATION_TERMINAL); + } + } + return true; + } + + @Override + public IPartModel getStaticModels() { + return this.selectModel(MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL); + } + + public void saveSearchStrings(String in) { + this.in = in; + } +} From 024b5c6503ac54535e7214c56cf36c9edcf258aa Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Mon, 10 Oct 2022 20:02:22 -0300 Subject: [PATCH 2/5] fix fluid slots offsets --- .../GuiFluidInterfaceConfigurationTerminal.java | 1 - .../java/appeng/fluids/client/gui/GuiFluidInterface.java | 2 +- .../appeng/fluids/client/gui/widgets/GuiFluidTank.java | 8 +++----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java index 963818b82..bf6de2d0c 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java @@ -203,7 +203,6 @@ public class GuiFluidInterfaceConfigurationTerminal extends AEBaseGui implements if (slot instanceof GuiFluidTank) { if (this.isPointInRegion(slot.xPos(), slot.yPos(), slot.getWidth(), slot.getHeight(), xCoord, yCoord) && slot.canClick(this.mc.player)) { NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.PICKUP_OR_SET_DOWN, slot.getId(), guiFluidTankClientDCInternalFluidInvMap.get(slot).getId())); - return; } } diff --git a/src/main/java/appeng/fluids/client/gui/GuiFluidInterface.java b/src/main/java/appeng/fluids/client/gui/GuiFluidInterface.java index 0fef98912..682d421de 100644 --- a/src/main/java/appeng/fluids/client/gui/GuiFluidInterface.java +++ b/src/main/java/appeng/fluids/client/gui/GuiFluidInterface.java @@ -63,7 +63,7 @@ public class GuiFluidInterface extends GuiUpgradeable implements IConfigManagerH final IAEFluidTank fluidTank = this.host.getDualityFluidInterface().getTanks(); for (int i = 0; i < DualityFluidInterface.NUMBER_OF_TANKS; ++i) { - this.guiSlots.add(new GuiFluidTank(fluidTank, i, DualityFluidInterface.NUMBER_OF_TANKS + i, 36 + 18 * i, 57, 16, 64)); + this.guiSlots.add(new GuiFluidTank(fluidTank, i, DualityFluidInterface.NUMBER_OF_TANKS + i, 35 + 18 * i, 53, 16, 68)); this.guiSlots.add(new GuiFluidSlot(configFluids, i, i, 35 + 18 * i, 35)); } diff --git a/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java b/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java index de37ef87f..8a4b1689a 100644 --- a/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java +++ b/src/main/java/appeng/fluids/client/gui/widgets/GuiFluidTank.java @@ -96,12 +96,12 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip { @Override public int xPos() { - return this.x - 1; + return this.x; } @Override public int yPos() { - return this.y - 4; + return this.y; } @Override @@ -111,7 +111,7 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip { @Override public int getHeight() { - return this.height + 4; + return this.height; } @Override @@ -125,13 +125,11 @@ public class GuiFluidTank extends GuiCustomSlot implements ITooltip { @Override public void slotClicked(ItemStack clickStack, final int mouseButton) { - if (getFluidStack() != null) { NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.FILL_ITEM, slot, id)); } else { NetworkHandler.instance().sendToServer(new PacketInventoryAction(InventoryAction.EMPTY_ITEM, slot, id)); } - } } From 19747ba1f1ce48335a3533078f64466f3d41e21f Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Mon, 10 Oct 2022 22:25:28 -0300 Subject: [PATCH 3/5] lang, models, textures --- ...uiFluidInterfaceConfigurationTerminal.java | 6 +- .../appeng/core/localization/GuiText.java | 1 + .../java/appeng/items/parts/PartType.java | 2 +- ...rtFluidInterfaceConfigurationTerminal.java | 4 +- .../appliedenergistics2/lang/en_us.lang | 2 + ...luid_interface_configuration_terminal.json | 9 +++ ..._interface_configuration_terminal_off.json | 8 ++ ...d_interface_configuration_terminal_on.json | 76 ++++++++++++++++++ ...nterface_configuration_terminal_bright.png | Bin 0 -> 5370 bytes ..._interface_configuration_terminal_dark.png | Bin 0 -> 205 bytes ...nterface_configuration_terminal_medium.png | Bin 0 -> 5322 bytes 11 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/appliedenergistics2/models/item/part/fluid_interface_configuration_terminal.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_off.json create mode 100644 src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_on.json create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/fluid_interface_configuration_terminal_bright.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/fluid_interface_configuration_terminal_dark.png create mode 100644 src/main/resources/assets/appliedenergistics2/textures/parts/fluid_interface_configuration_terminal_medium.png diff --git a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java index bf6de2d0c..b0e7e3c28 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java @@ -36,9 +36,7 @@ import appeng.container.interfaces.IJEIGhostIngredients; import appeng.core.localization.GuiText; import appeng.core.sync.network.NetworkHandler; import appeng.core.sync.packets.PacketInventoryAction; -import appeng.fluids.client.gui.widgets.GuiFluidSlot; import appeng.fluids.client.gui.widgets.GuiFluidTank; -import appeng.fluids.container.IFluidSyncContainer; import appeng.fluids.util.AEFluidStack; import appeng.helpers.InventoryAction; import appeng.parts.reporting.PartFluidInterfaceConfigurationTerminal; @@ -138,7 +136,7 @@ public class GuiFluidInterfaceConfigurationTerminal extends AEBaseGui implements public void drawFG(final int offsetX, final int offsetY, final int mouseX, final int mouseY) { this.buttonList.clear(); - this.fontRenderer.drawString(this.getGuiDisplayName(GuiText.InterfaceConfigurationTerminal.getLocal()), 8, 6, 4210752); + this.fontRenderer.drawString(this.getGuiDisplayName(GuiText.FluidInterfaceConfigurationTerminal.getLocal()), 8, 6, 4210752); this.fontRenderer.drawString(GuiText.inventory.getLocal(), this.offsetX + 2, this.ySize - 96 + 3, 4210752); final int currentScroll = this.getScrollBar().getCurrentScroll(); @@ -244,7 +242,7 @@ public class GuiFluidInterfaceConfigurationTerminal extends AEBaseGui implements final Object lineObj = this.lines.get(ex + x); if (lineObj instanceof ClientDCInternalFluidInv) { GlStateManager.color(1, 1, 1, 1); - final int width = 9 * 18; + final int width = 5 * 18; int extraLines = numUpgradesMap.get(lineObj); diff --git a/src/main/java/appeng/core/localization/GuiText.java b/src/main/java/appeng/core/localization/GuiText.java index 6b0f5e78a..56cc91c8a 100644 --- a/src/main/java/appeng/core/localization/GuiText.java +++ b/src/main/java/appeng/core/localization/GuiText.java @@ -174,6 +174,7 @@ public enum GuiText { InterfaceTerminal, InterfaceConfigurationTerminal, + FluidInterfaceConfigurationTerminal, NoCraftingCPUs, Clean, InvalidPattern, diff --git a/src/main/java/appeng/items/parts/PartType.java b/src/main/java/appeng/items/parts/PartType.java index 3e54527fe..3eddfffa0 100644 --- a/src/main/java/appeng/items/parts/PartType.java +++ b/src/main/java/appeng/items/parts/PartType.java @@ -230,7 +230,7 @@ public enum PartType { FLUID_TERMINAL(520, "fluid_terminal", EnumSet.of(AEFeature.FLUID_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartFluidTerminal.class), INTERFACE_CONFIGURATION_TERMINAL(521, "interface_configuration_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartInterfaceConfigurationTerminal.class), - FLUID_INTERFACE_CONFIGURATION_TERMINAL(522, "interface_configuration_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartFluidInterfaceConfigurationTerminal.class); + FLUID_INTERFACE_CONFIGURATION_TERMINAL(522, "fluid_interface_configuration_terminal", EnumSet.of(AEFeature.INTERFACE_TERMINAL), EnumSet.noneOf(IntegrationType.class), PartFluidInterfaceConfigurationTerminal.class); private final int baseDamage; diff --git a/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java index 3c081cc5d..319153af7 100644 --- a/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java +++ b/src/main/java/appeng/parts/reporting/PartFluidInterfaceConfigurationTerminal.java @@ -35,9 +35,9 @@ import net.minecraft.util.math.Vec3d; public class PartFluidInterfaceConfigurationTerminal extends AbstractPartDisplay { @PartModels - public static final ResourceLocation MODEL_OFF = new ResourceLocation(AppEng.MOD_ID, "part/interface_configuration_terminal_off"); + public static final ResourceLocation MODEL_OFF = new ResourceLocation(AppEng.MOD_ID, "part/fluid_interface_configuration_terminal_off"); @PartModels - public static final ResourceLocation MODEL_ON = new ResourceLocation(AppEng.MOD_ID, "part/interface_configuration_terminal_on"); + public static final ResourceLocation MODEL_ON = new ResourceLocation(AppEng.MOD_ID, "part/fluid_interface_configuration_terminal_on"); public static final IPartModel MODELS_OFF = new PartModel(MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF); public static final IPartModel MODELS_ON = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_ON); diff --git a/src/main/resources/assets/appliedenergistics2/lang/en_us.lang b/src/main/resources/assets/appliedenergistics2/lang/en_us.lang index 0948fdd0c..6c31088c4 100644 --- a/src/main/resources/assets/appliedenergistics2/lang/en_us.lang +++ b/src/main/resources/assets/appliedenergistics2/lang/en_us.lang @@ -169,6 +169,7 @@ gui.appliedenergistics2.Terminal=Terminal gui.appliedenergistics2.InterfaceTerminal=Interface Terminal gui.appliedenergistics2.InterfaceTerminalHint=Show Or Hide on Interface Terminal. gui.appliedenergistics2.InterfaceConfigurationTerminal=Interface Configuration Terminal +gui.appliedenergistics2.FluidInterfaceConfigurationTerminal=Fluid Interface Configuration Terminal gui.appliedenergistics2.FormationPlane=Formation Plane gui.appliedenergistics2.FluidFormationPlane=Fluid Formation Plane gui.appliedenergistics2.VibrationChamber=Vibration Chamber @@ -551,6 +552,7 @@ item.appliedenergistics2.multi_part.toggle_bus.name=ME Toggle Bus item.appliedenergistics2.multi_part.crafting_monitor.name=ME Crafting Monitor item.appliedenergistics2.multi_part.interface_terminal.name=ME Interface Terminal item.appliedenergistics2.multi_part.interface_configuration_terminal.name=ME Configuration Interface Terminal +item.appliedenergistics2.multi_part.fluid_interface_configuration_terminal.name=ME Configuration Fluid Interface Terminal item.appliedenergistics2.multi_part.fluid_terminal.name=ME Fluid Terminal item.appliedenergistics2.multi_part.invalid_type.name=Disabled Item diff --git a/src/main/resources/assets/appliedenergistics2/models/item/part/fluid_interface_configuration_terminal.json b/src/main/resources/assets/appliedenergistics2/models/item/part/fluid_interface_configuration_terminal.json new file mode 100644 index 000000000..7267aea3a --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/item/part/fluid_interface_configuration_terminal.json @@ -0,0 +1,9 @@ +{ + "parent": "appliedenergistics2:item/part/display", + "textures": { + "front": "appliedenergistics2:items/part/interface_terminal", + "front_bright": "appliedenergistics2:parts/fluid_interface_configuration_terminal_bright", + "front_medium": "appliedenergistics2:parts/fluid_interface_configuration_terminal_medium", + "front_dark": "appliedenergistics2:parts/fluid_interface_configuration_terminal_dark" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_off.json b/src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_off.json new file mode 100644 index 000000000..e4abc56e1 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_off.json @@ -0,0 +1,8 @@ +{ + "parent": "appliedenergistics2:part/display_off", + "textures": { + "lightsBright": "appliedenergistics2:parts/fluid_interface_configuration_terminal_bright", + "lightsMedium": "appliedenergistics2:parts/fluid_interface_configuration_terminal_medium", + "lightsDark": "appliedenergistics2:parts/fluid_interface_configuration_terminal_dark" + } +} diff --git a/src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_on.json b/src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_on.json new file mode 100644 index 000000000..fbea7d5f2 --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/models/part/fluid_interface_configuration_terminal_on.json @@ -0,0 +1,76 @@ +{ + "ae2_uvl_marker": true, + "textures": { + "lightsBright": "appliedenergistics2:parts/fluid_interface_configuration_terminal_bright", + "lightsMedium": "appliedenergistics2:parts/fluid_interface_configuration_terminal_medium", + "lightsDark": "appliedenergistics2:parts/fluid_interface_configuration_terminal_dark" + }, + "elements": [ + { + "from": [ + 2, + 2, + 0 + ], + "to": [ + 14, + 14, + 2 + ], + "faces": { + "north": { + "texture": "#lightsBright", + "tintindex": 3, + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + } + } + }, + { + "from": [ + 2, + 2, + 0 + ], + "to": [ + 14, + 14, + 2 + ], + "faces": { + "north": { + "texture": "#lightsMedium", + "tintindex": 2, + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + } + } + }, + { + "from": [ + 2, + 2, + 0 + ], + "to": [ + 14, + 14, + 2 + ], + "faces": { + "north": { + "texture": "#lightsDark", + "tintindex": 1, + "uvlightmap": { + "sky": 0.007, + "block": 0.007 + } + } + } + } + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/textures/parts/fluid_interface_configuration_terminal_bright.png b/src/main/resources/assets/appliedenergistics2/textures/parts/fluid_interface_configuration_terminal_bright.png new file mode 100644 index 0000000000000000000000000000000000000000..695cbf048b1cdb89a7d8380a7e932b708cb2eb3c GIT binary patch literal 5370 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 JF6*2UngHg6pD_Rc literal 0 HcmV?d00001 From de674f72bdddc370d6da674a5abe42f968eba0df Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Tue, 11 Oct 2022 21:38:18 -0300 Subject: [PATCH 4/5] fix fluid search by name --- .../GuiFluidInterfaceConfigurationTerminal.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java index b0e7e3c28..78a506ec1 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java @@ -390,9 +390,7 @@ public class GuiFluidInterfaceConfigurationTerminal extends AEBaseGui implements boolean foundMatchingItemStack = false; - final String displayName = Platform - .getItemDisplayName(AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createStack(iaeFluidStack)) - .toLowerCase(); + final String displayName = Platform.getFluidDisplayName(iaeFluidStack).toLowerCase(); for (String term : searchTerm.split(" ")) { if (term.length() > 1 && (term.startsWith("-") || term.startsWith("!"))) { From 770db2777738ec08086463dc4fb45f4f1853a5bf Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Tue, 11 Oct 2022 22:30:54 -0300 Subject: [PATCH 5/5] add recipes --- ...uiFluidInterfaceConfigurationTerminal.java | 9 ++++---- ...rminals_fluid_interface_configuration.json | 22 +++++++++++++++++++ ..._fluid_interface_configuration_revert.json | 19 ++++++++++++++++ 3 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration.json create mode 100644 src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration_revert.json diff --git a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java index 78a506ec1..891d0ef27 100644 --- a/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java +++ b/src/main/java/appeng/client/gui/implementations/GuiFluidInterfaceConfigurationTerminal.java @@ -283,12 +283,11 @@ public class GuiFluidInterfaceConfigurationTerminal extends AEBaseGui implements this.refreshList = true; } - for (final Object oKey : in.getKeySet()) { - final String key = (String) oKey; - if (key.startsWith("=")) { + for (final String oKey : in.getKeySet()) { + if (oKey.startsWith("=")) { try { - final long id = Long.parseLong(key.substring(1), Character.MAX_RADIX); - final NBTTagCompound invData = in.getCompoundTag(key); + final long id = Long.parseLong(oKey.substring(1), Character.MAX_RADIX); + final NBTTagCompound invData = in.getCompoundTag(oKey); final ClientDCInternalFluidInv current = this.getById(id, invData.getLong("sortBy"), invData.getString("un")); blockPosHashMap.put(current, NBTUtil.getPosFromTag(invData.getCompoundTag("pos"))); dimHashMap.put(current, invData.getInteger("dim")); diff --git a/src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration.json b/src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration.json new file mode 100644 index 000000000..6426b71ac --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration.json @@ -0,0 +1,22 @@ +{ + "conditions": [ + { + "type": "minecraft:item_exists", + "item": "appliedenergistics2:interface" + } + ], + "result": { + "type": "appliedenergistics2:part", + "part": "part.fluid_interface_configuration_terminal" + }, + "type": "appliedenergistics2:part_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "part.interface_terminal" + }, + { + "item": "minecraft:bucket" + } + ] +} diff --git a/src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration_revert.json b/src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration_revert.json new file mode 100644 index 000000000..4ccc9cd4a --- /dev/null +++ b/src/main/resources/assets/appliedenergistics2/recipes/network/parts/terminals_fluid_interface_configuration_revert.json @@ -0,0 +1,19 @@ +{ + "conditions": [ + { + "type": "minecraft:item_exists", + "item": "appliedenergistics2:interface" + } + ], + "result": { + "type": "appliedenergistics2:part", + "part": "part.interface_terminal" + }, + "type": "appliedenergistics2:part_shapeless", + "ingredients": [ + { + "type": "appliedenergistics2:part", + "part": "part.fluid_interface_configuration_terminal" + } + ] +}