Universal gui (#53)

Co-authored-by: Kogepan229 <kogepan25629@gmail.com>
This commit is contained in:
lc-1337andKogepan229 authored and GitHub committed 2025-12-11 18:57:51 +01:00
1 parent 9c72ef81c3
commit 7ce9086b36
13 files changed
+129 -387

No files matched your search

+3 -3
View File
@@ -1,12 +1,12 @@
dependencies {
api("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-687-GTNH:dev")
api("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-754-GTNH:dev")
api("com.github.GTNewHorizons:NotEnoughItems:2.7.87-GTNH:dev")
api('com.github.GTNewHorizons:CodeChickenCore:1.4.7:dev')
implementation("com.github.GTNewHorizons:Baubles-Expanded:2.1.15-GTNH:dev")
implementation("com.github.GTNewHorizons:WirelessCraftingTerminal:1.12.7:dev")
implementation("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.4.114-gtnh:dev")
implementation("com.github.GTNewHorizons:WirelessCraftingTerminal:1.12.10:dev")
implementation("com.github.GTNewHorizons:AE2FluidCraft-Rework:1.5.30-gtnh:dev")
compileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.51.458:dev") { transitive = false }
compileOnly("com.github.GTNewHorizons:Avaritia:1.75:dev") { transitive = false }
@@ -20,11 +20,6 @@ import com.github.vfyjxf.nee.nei.NEETerminalBookmarkContainerHandler;
import com.github.vfyjxf.nee.processor.IRecipeProcessor;
import com.github.vfyjxf.nee.processor.RecipeProcessor;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.client.gui.GuiFluidCraftingWireless;
import com.glodblock.github.client.gui.GuiFluidPatternExWireless;
import com.glodblock.github.client.gui.GuiFluidPatternTerminal;
import com.glodblock.github.client.gui.GuiFluidPatternTerminalEx;
import com.glodblock.github.client.gui.GuiFluidPatternWireless;
import appeng.client.gui.implementations.GuiCraftingTerm;
import appeng.client.gui.implementations.GuiInterface;
@@ -74,8 +69,6 @@ public class NEINeeConfig implements IConfigureNEI {
installWirelessCraftingTermSupport();
installFluidPatternTerminalSupport(new HashSet<>(identifiers));
installThaumicEnergisticsSupport();
installAvaritiaSupport();
@@ -84,43 +77,9 @@ public class NEINeeConfig implements IConfigureNEI {
installPatternTerminalExSupport(new HashSet<>(identifiers));
installFluidPatternTerminalExSupport(new HashSet<>(identifiers));
installlBookmarkContainerHandler();
}
private void installFluidPatternTerminalExSupport(Set<String> identifiers) {
if (Loader.isModLoaded(ModIDs.FC)) {
identifiers.remove("crafting");
identifiers.remove("crafting2x2");
for (String ident : identifiers) {
API.registerGuiOverlay(GuiFluidPatternTerminalEx.class, ident);
API.registerGuiOverlay(GuiFluidPatternExWireless.class, ident);
API.registerGuiOverlayHandler(
GuiFluidPatternTerminalEx.class,
NEEPatternTerminalHandler.instance,
ident);
API.registerGuiOverlayHandler(
GuiFluidPatternExWireless.class,
NEEPatternTerminalHandler.instance,
ident);
}
}
}
private void installFluidPatternTerminalSupport(Set<String> identifiers) {
if (Loader.isModLoaded(ModIDs.FC)) {
for (String ident : identifiers) {
API.registerGuiOverlay(GuiFluidPatternTerminal.class, ident);
API.registerGuiOverlay(GuiFluidPatternWireless.class, ident);
API.registerGuiOverlayHandler(GuiFluidPatternTerminal.class, NEEPatternTerminalHandler.instance, ident);
API.registerGuiOverlayHandler(GuiFluidPatternWireless.class, NEEPatternTerminalHandler.instance, ident);
}
}
}
private void installlBookmarkContainerHandler() {
API.registerBookmarkContainerHandler(GuiPatternTerm.class, NEETerminalBookmarkContainerHandler.instance);
API.registerBookmarkContainerHandler(GuiPatternTermEx.class, NEETerminalBookmarkContainerHandler.instance);
@@ -128,25 +87,6 @@ public class NEINeeConfig implements IConfigureNEI {
API.registerBookmarkContainerHandler(GuiMEMonitorable.class, NEETerminalBookmarkContainerHandler.instance);
API.registerBookmarkContainerHandler(GuiMEPortableCell.class, NEETerminalBookmarkContainerHandler.instance);
if (Loader.isModLoaded(ModIDs.FC)) {
API.registerBookmarkContainerHandler(
GuiFluidPatternWireless.class,
NEETerminalBookmarkContainerHandler.instance);
API.registerBookmarkContainerHandler(
GuiFluidPatternTerminal.class,
NEETerminalBookmarkContainerHandler.instance);
API.registerBookmarkContainerHandler(
GuiFluidPatternTerminalEx.class,
NEETerminalBookmarkContainerHandler.instance);
API.registerBookmarkContainerHandler(
GuiFluidPatternExWireless.class,
NEETerminalBookmarkContainerHandler.instance);
API.registerBookmarkContainerHandler(
GuiFluidCraftingWireless.class,
NEETerminalBookmarkContainerHandler.instance);
}
if (Loader.isModLoaded(ModIDs.WCT)) {
API.registerBookmarkContainerHandler(
GuiWirelessCraftingTerminal.class,
@@ -214,17 +154,6 @@ public class NEINeeConfig implements IConfigureNEI {
API.registerGuiOverlay(GuiCraftingTerm.class, "crafting2x2");
API.registerGuiOverlayHandler(GuiCraftingTerm.class, NEECraftingTerminalHandler.instance, "crafting");
API.registerGuiOverlayHandler(GuiCraftingTerm.class, NEECraftingTerminalHandler.instance, "crafting2x2");
if (Loader.isModLoaded(ModIDs.FC)) {
API.registerGuiOverlayHandler(
GuiFluidCraftingWireless.class,
NEECraftingTerminalHandler.instance,
"crafting");
API.registerGuiOverlayHandler(
GuiFluidCraftingWireless.class,
NEECraftingTerminalHandler.instance,
"crafting2x2");
}
}
private void installWirelessCraftingTermSupport() {
@@ -44,6 +44,7 @@ import appeng.api.networking.ticking.TickRateModulation;
import appeng.api.networking.ticking.TickingRequest;
import appeng.api.storage.IMEMonitor;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IAEStack;
import appeng.api.storage.data.IItemList;
import appeng.api.util.AECableType;
import appeng.api.util.DimensionalCoord;
@@ -434,9 +435,9 @@ public class TilePatternInterface extends AENetworkInvTile
for (ICraftingCPU cpu : cpuSet) {
if (cpu instanceof CraftingCPUCluster cluster) {
final IItemList<IAEItemStack> pendingList = AEApi.instance().storage().createItemList();
cluster.getListOfItem(pendingList, CraftingItemList.PENDING);
for (IAEItemStack pendingStack : pendingList) {
final IItemList<IAEStack<?>> pendingList = AEApi.instance().storage().createAEStackList();
cluster.getModernListOfItem(pendingList, CraftingItemList.PENDING);
for (IAEStack<?> pendingStack : pendingList) {
if (pendingStack.isSameType(result)) {
cluster.cancel();
break;
@@ -667,15 +668,15 @@ public class TilePatternInterface extends AENetworkInvTile
try {
final ICraftingGrid cg = this.getProxy().getCrafting();
final ImmutableSet<ICraftingCPU> cpuSet = cg.getCpus();
final IItemList<IAEItemStack> pendingList = AEApi.instance().storage().createItemList();
final IItemList<IAEStack<?>> pendingList = AEApi.instance().storage().createAEStackList();
for (ICraftingCPU cpu : cpuSet) {
if (cpu instanceof CraftingCPUCluster cluster) {
cluster.getListOfItem(pendingList, CraftingItemList.PENDING);
cluster.getModernListOfItem(pendingList, CraftingItemList.PENDING);
}
}
for (IAEItemStack pendingStack : pendingList) {
for (IAEStack<?> pendingStack : pendingList) {
if (pendingStack.isSameType(stack)) {
return false;
}
@@ -32,16 +32,15 @@ import com.github.vfyjxf.nee.network.NEENetworkHandler;
import com.github.vfyjxf.nee.network.packet.PacketSlotStackChange;
import com.github.vfyjxf.nee.network.packet.PacketStackCountChange;
import com.github.vfyjxf.nee.network.packet.PacketValueConfigServer;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.client.gui.GuiLevelMaintainer;
import com.glodblock.github.client.gui.base.FCGuiEncodeTerminal;
import com.glodblock.github.client.gui.container.base.FCContainerEncodeTerminal;
import appeng.api.events.GuiScrollEvent;
import appeng.api.storage.data.IAEStack;
import appeng.client.gui.AEBaseGui;
import appeng.client.gui.implementations.GuiInterface;
import appeng.client.gui.implementations.GuiPatternTerm;
import appeng.client.gui.slots.VirtualMEPatternSlot;
import appeng.container.AEBaseContainer;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.slot.SlotFake;
@@ -97,10 +96,6 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
private boolean isGuiPatternTerm(GuiScreen guiScreen) {
if (guiScreen instanceof GuiContainer guiContainer) {
if (Loader.isModLoaded(ModIDs.FC) && guiContainer instanceof FCGuiEncodeTerminal) {
return false;
}
return RecipeInfo.getOverlayHandler(guiContainer, "crafting") instanceof NEEPatternTerminalHandler
|| RecipeInfo.getOverlayHandler(guiContainer, "smelting") instanceof NEEPatternTerminalHandler;
}
@@ -179,8 +174,6 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
if (container instanceof ContainerPatternTerm) {
return ((ContainerPatternTerm) container).isCraftingMode();
} else if (Loader.isModLoaded(ModIDs.FC) && container instanceof FCContainerEncodeTerminal) {
return ((FCContainerEncodeTerminal) container).isCraftingMode();
}
return false;
@@ -244,16 +237,15 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
@SubscribeEvent
public boolean handleMouseWheelInput(GuiScrollEvent event) {
Minecraft mc = Minecraft.getMinecraft();
Slot currentSlot = getFakeSlotAtPosition((GuiContainer) mc.currentScreen, event.mouseX, event.mouseY);
if (currentSlot != null) {
// try to change current itemstack to next ingredient;
if (NEIClientConfig.isKeyHashDown("nee.ingredient") && GuiUtils.isCraftingSlot(currentSlot)) {
handleRecipeIngredientChange(event.guiScreen, currentSlot, event.scrollAmount);
if (mc.currentScreen instanceof GuiPatternTerm gpt
&& gpt.getVirtualMESlotUnderMouse() instanceof VirtualMEPatternSlot slot) {
if (NEIClientConfig.isKeyHashDown("nee.ingredient")) {
handleRecipeIngredientChange(gpt, slot, event.scrollAmount);
return true;
} else if (NEIClientConfig.isKeyHashDown("nee.count")) {
NEENetworkHandler.getInstance()
.sendToServer(new PacketStackCountChange(currentSlot.slotNumber, event.scrollAmount));
NEENetworkHandler.getInstance().sendToServer(
new PacketStackCountChange(slot.getSlotIndex(), slot.getStorageName(), event.scrollAmount));
return true;
}
}
@@ -326,46 +318,39 @@ public class GuiEventHandler extends INEIGuiAdapter implements IContainerTooltip
return null;
}
private void handleRecipeIngredientChange(GuiContainer gui, Slot currentSlot, int dWheel) {
private void handleRecipeIngredientChange(GuiPatternTerm gui, VirtualMEPatternSlot currentSlot, int dWheel) {
final int currentSlotIndex = currentSlot.getSlotIndex();
final PositionedStack currentIngredients = NEEPatternTerminalHandler.ingredients
.get(INPUT_KEY + currentSlotIndex);
if (currentIngredients != null && currentIngredients.items.length > 1) {
final IAEStack<?> aes = currentSlot.getAEStack();
if (aes == null) return;
final ItemStack slotStack = aes.getItemStackForNEI();
if (slotStack == null) return;
final List<Integer> craftingSlots = new ArrayList<>();
final List<ItemStack> items = currentIngredients.getFilteredPermutations();
final int currentStackIndex = ItemUtils.getPermutationIndex(currentSlot.getStack(), items);
final int currentStackIndex = ItemUtils.getPermutationIndex(slotStack, items);
final ItemStack nextStack = items.get((items.size() - dWheel + currentStackIndex) % items.size());
final ItemStack currentStack = currentIngredients.item;
if (NEEConfig.allowSynchronousSwitchIngredient) {
for (Slot slot : getCraftingSlots(gui)) {
for (VirtualMEPatternSlot slot : gui.getCraftingSlots()) {
final PositionedStack slotIngredients = NEEPatternTerminalHandler.ingredients
.get(INPUT_KEY + slot.getSlotIndex());
if (slotIngredients != null && slotIngredients.containsWithNBT(nextStack)
&& NEIServerUtils.areStacksSameTypeCraftingWithNBT(slotIngredients.item, currentStack)) {
slotIngredients.setPermutationToRender(nextStack);
craftingSlots.add(slot.slotNumber);
craftingSlots.add(slot.getSlotIndex());
}
}
} else {
currentIngredients.setPermutationToRender(nextStack);
craftingSlots.add(currentSlot.slotNumber);
craftingSlots.add(currentSlot.getSlotIndex());
}
NEENetworkHandler.getInstance().sendToServer(new PacketSlotStackChange(nextStack, craftingSlots));
}
}
@SuppressWarnings("unchecked")
private static List<Slot> getCraftingSlots(GuiContainer gui) {
List<Slot> craftingSlots = new ArrayList<>();
for (Slot slot : (List<Slot>) gui.inventorySlots.inventorySlots) {
if (GuiUtils.isCraftingSlot(slot)) {
craftingSlots.add(slot);
}
}
return craftingSlots;
}
}
@@ -24,8 +24,6 @@ import com.github.vfyjxf.nee.utils.Ingredient;
import com.github.vfyjxf.nee.utils.IngredientTracker;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.client.gui.GuiFluidCraftAmount;
import com.glodblock.github.client.gui.base.FCGuiAmount;
import appeng.api.storage.data.IAEItemStack;
import appeng.client.gui.implementations.GuiAmount;
@@ -153,9 +151,6 @@ public class NEECraftingPreviewHandler {
if (this.modID.equals(ModIDs.ThE)) {
sendToArcaneCraftingerver(aeItemStack);
} else if (this.modID.equals(ModIDs.FC)) {
((AEBaseContainer) firstGui.inventorySlots).setTargetStack(aeItemStack);
sendToFluidCraftingServer();
} else if (this.modID.equals(ModIDs.WCT)) {
((AEBaseContainer) firstGui.inventorySlots).setTargetStack(aeItemStack);
sendToWirelessCraftingServer();
@@ -172,15 +167,6 @@ public class NEECraftingPreviewHandler {
.sendAutoCraft(Minecraft.getMinecraft().thePlayer, aeItemStack);
}
@Optional.Method(modid = ModIDs.FC)
protected void sendToFluidCraftingServer() {
com.glodblock.github.network.CPacketInventoryAction packet = new com.glodblock.github.network.CPacketInventoryAction(
InventoryAction.AUTO_CRAFT,
0,
0L);
com.glodblock.github.FluidCraft.proxy.netHandler.sendToServer(packet);
}
@Optional.Method(modid = ModIDs.WCT)
protected void sendToWirelessCraftingServer() {
net.p455w0rd.wirelesscraftingterminal.core.sync.packets.PacketInventoryAction packet = new net.p455w0rd.wirelesscraftingterminal.core.sync.packets.PacketInventoryAction(
@@ -196,8 +182,7 @@ public class NEECraftingPreviewHandler {
return;
}
if (!this.isRequesting && (event.gui instanceof GuiCraftAmount
|| Loader.isModLoaded(ModIDs.FC) && event.gui instanceof GuiFluidCraftAmount)) {
if (!this.isRequesting && event.gui instanceof GuiCraftAmount) {
this.isRequesting = true;
return;
}
@@ -298,14 +283,7 @@ public class NEECraftingPreviewHandler {
private static int getCraftAmount(GuiContainer screen, GuiButton button) {
try {
if (Loader.isModLoaded(ModIDs.FC) && screen instanceof GuiFluidCraftAmount gui) {
if (ReflectionHelper.getPrivateValue(FCGuiAmount.class, gui, "submit") == button) {
return (int) ReflectionHelper.findMethod(FCGuiAmount.class, gui, new String[] { "getAmount" })
.invoke(gui);
}
} else if (screen instanceof GuiCraftAmount gui) {
if (screen instanceof GuiCraftAmount gui) {
if (ReflectionHelper.getPrivateValue(GuiAmount.class, gui, "nextBtn") == button) {
return (int) ReflectionHelper.findMethod(GuiAmount.class, gui, new String[] { "getAmount" })
@@ -20,12 +20,9 @@ import com.github.vfyjxf.nee.network.NEENetworkHandler;
import com.github.vfyjxf.nee.network.packet.PacketNEIPatternRecipe;
import com.github.vfyjxf.nee.processor.IRecipeProcessor;
import com.github.vfyjxf.nee.processor.RecipeProcessor;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.github.vfyjxf.nee.utils.Ingredient;
import com.github.vfyjxf.nee.utils.IngredientTracker;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.nei.FluidPatternTerminalRecipeTransferHandler;
import appeng.util.Platform;
import codechicken.nei.NEIServerUtils;
@@ -36,8 +33,6 @@ import codechicken.nei.recipe.GuiRecipe;
import codechicken.nei.recipe.GuiRecipeButton;
import codechicken.nei.recipe.IRecipeHandler;
import codechicken.nei.recipe.TemplateRecipeHandler;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
/**
@@ -66,11 +61,6 @@ public class NEEPatternTerminalHandler implements IOverlayHandler {
NEENetworkHandler.getInstance().sendToServer(packRecipe(handler, recipeIndex, multiplier));
if (Loader.isModLoaded(ModIDs.FC)
&& (GuiUtils.isFluidCraftPatternTermEx(gui) || GuiUtils.isFluidCraftPatternTerm(gui))) {
fluidCraftOverlayRecipe(gui, handler, recipeIndex);
}
return 0;
}
@@ -86,11 +76,6 @@ public class NEEPatternTerminalHandler implements IOverlayHandler {
return itemPresenceSlots;
}
@Optional.Method(modid = ModIDs.FC)
private void fluidCraftOverlayRecipe(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex) {
FluidPatternTerminalRecipeTransferHandler.INSTANCE.overlayRecipe(firstGui, recipe, recipeIndex, true);
}
private PacketNEIPatternRecipe packRecipe(IRecipeHandler recipe, int recipeIndex, int multiplier) {
if (isCraftingTableRecipe(recipe)) {
return packCraftingTableRecipe(recipe, recipeIndex);
@@ -1,10 +1,8 @@
package com.github.vfyjxf.nee.nei;
import java.util.List;
import java.util.Map;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.client.resources.I18n;
import org.lwjgl.opengl.GL11;
@@ -20,7 +18,6 @@ import codechicken.nei.recipe.GuiOverlayButton;
import codechicken.nei.recipe.GuiRecipe;
import codechicken.nei.recipe.GuiRecipeButton;
import codechicken.nei.recipe.RecipeHandlerRef;
import codechicken.nei.util.NEIMouseUtils;
public class NEETerminalOverlayButton extends GuiOverlayButton {
@@ -104,38 +101,6 @@ public class NEETerminalOverlayButton extends GuiOverlayButton {
}
}
@Override
public Map<String, String> handleHotkeys(GuiContainer gui, int mousex, int mousey, Map<String, String> hotkeys) {
hotkeys = super.handleHotkeys(gui, mousex, mousey, hotkeys);
if (ingredientsOverlay().stream().allMatch(
state -> state.isPresent()
|| state instanceof NEEItemOverlayState overlayState && showCraftingHotkeys(overlayState))) {
if (NEECraftingPreviewHandler.instance
.canCraftRecipeResult(gui, this.handlerRef.handler, handlerRef.recipeIndex)) {
hotkeys.put(
NEIClientConfig.getKeyName("nee.preview", 0, NEIMouseUtils.MOUSE_BTN_LMB),
I18n.format("neenergistics.gui.tooltip.crafting.preview.result"));
hotkeys.put(
NEIClientConfig.getKeyName("nee.nopreview", 0, NEIMouseUtils.MOUSE_BTN_LMB),
I18n.format("neenergistics.gui.tooltip.crafting.nopreview.result"));
} else {
hotkeys.put(
NEIClientConfig.getKeyName("nee.preview", 0, NEIMouseUtils.MOUSE_BTN_LMB),
I18n.format("neenergistics.gui.tooltip.crafting.preview"));
hotkeys.put(
NEIClientConfig.getKeyName("nee.nopreview", 0, NEIMouseUtils.MOUSE_BTN_LMB),
I18n.format("neenergistics.gui.tooltip.crafting.nopreview"));
}
}
return hotkeys;
}
private static boolean showCraftingHotkeys(NEEItemOverlayState button) {
return button.getIngredient().isCraftable() || !button.getIngredient().requiresToCraft();
}
@@ -1,6 +1,5 @@
package com.github.vfyjxf.nee.network.packet;
import java.util.Objects;
import java.util.concurrent.Future;
import java.util.function.Consumer;
@@ -9,17 +8,10 @@ import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.p455w0rd.wirelesscraftingterminal.common.WCTGuiHandler;
import net.p455w0rd.wirelesscraftingterminal.reference.Reference;
import com.github.vfyjxf.nee.block.tile.TilePatternInterface;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.inventory.InventoryHandler;
import com.glodblock.github.inventory.gui.GuiType;
import com.glodblock.github.inventory.item.IWirelessTerminal;
import com.glodblock.github.util.BlockPos;
import appeng.api.AEApi;
import appeng.api.config.CraftingMode;
@@ -248,10 +240,6 @@ public class PacketCraftingRequest implements IMessage {
} else if (container instanceof AEBaseContainer baseContainer) {
if (Loader.isModLoaded(ModIDs.ThE) && this.modID.equals(ModIDs.ThE)) {
openTHContainerCraftConfirm(grid, requireToCraftStack, (IActionHost) baseContainer.getTarget(), player);
} else if (Loader.isModLoaded(ModIDs.FC) && this.modID.equals(ModIDs.FC)) {
openFCContainerCraftConfirm(baseContainer, grid, requireToCraftStack, player);
} else if (Loader.isModLoaded(ModIDs.WCT) && this.modID.equals(ModIDs.WCT)) {
openWCTContainerCraftConfirm(baseContainer, grid, requireToCraftStack, player);
} else {
openAEContainerCraftConfirm(baseContainer, grid, requireToCraftStack, player);
}
@@ -320,47 +308,4 @@ public class PacketCraftingRequest implements IMessage {
});
}
@Optional.Method(modid = ModIDs.FC)
private void openFCContainerCraftConfirm(AEBaseContainer baseContainer, IGrid grid,
IAEItemStack requireToCraftStack, EntityPlayerMP player) {
openContainerCraftConfirm(grid, requireToCraftStack, player, baseContainer.getActionSource(), job -> {
final ContainerOpenContext openContext = baseContainer.getOpenContext();
final TileEntity tileEntity = openContext.getTile();
if (tileEntity != null) {
InventoryHandler.openGui(
player,
player.worldObj,
new BlockPos(tileEntity),
Objects.requireNonNull(openContext.getSide()),
GuiType.FLUID_CRAFTING_CONFIRM);
} else if (baseContainer.getTarget() instanceof IWirelessTerminal wireless) {
InventoryHandler.openGui(
player,
player.worldObj,
new BlockPos(wireless.getInventorySlot(), 0, 0),
Objects.requireNonNull(openContext.getSide()),
GuiType.FLUID_CRAFTING_CONFIRM_ITEM);
}
});
}
@Optional.Method(modid = ModIDs.WCT)
private void openWCTContainerCraftConfirm(AEBaseContainer baseContainer, IGrid grid,
IAEItemStack requireToCraftStack, EntityPlayerMP player) {
openContainerCraftConfirm(grid, requireToCraftStack, player, baseContainer.getActionSource(), job -> {
final int x = (int) player.posX;
final int y = (int) player.posY;
final int z = (int) player.posZ;
WCTGuiHandler.launchGui(Reference.GUI_CRAFT_CONFIRM, player, player.worldObj, x, y, z);
});
}
}
@@ -7,28 +7,30 @@ import javax.annotation.Nonnull;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.github.vfyjxf.nee.utils.ModIDs;
import com.glodblock.github.client.gui.container.ContainerFluidPatternTerminal;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridNode;
import appeng.api.networking.security.ISecurityGrid;
import appeng.api.networking.storage.IStorageGrid;
import appeng.api.storage.StorageName;
import appeng.api.storage.data.IAEStack;
import appeng.container.AEBaseContainer;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.helpers.IContainerCraftingPacket;
import cpw.mods.fml.common.Loader;
import appeng.util.item.AEFluidStack;
import appeng.util.item.AEItemStack;
import codechicken.nei.recipe.StackInfo;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
public class PacketNEIPatternRecipe implements IMessage {
@@ -70,7 +72,7 @@ public class PacketNEIPatternRecipe implements IMessage {
if (message.input != null && GuiUtils.isPatternContainer(container)
&& container instanceof IContainerCraftingPacket) {
AEBaseContainer baseContainer = (AEBaseContainer) container;
ContainerPatternTerm baseContainer = (ContainerPatternTerm) container;
setCraftingRecipe(baseContainer, message.output == null);
if (message.output == null) {
@@ -86,9 +88,7 @@ public class PacketNEIPatternRecipe implements IMessage {
private void setCraftingRecipe(AEBaseContainer container, boolean craftingMode) {
if (container instanceof ContainerPatternTerm cpt) {
cpt.getPatternTerminal().setCraftingRecipe(craftingMode);
} else if (Loader.isModLoaded(ModIDs.FC) && container instanceof ContainerFluidPatternTerminal cfpt) {
cfpt.getPatternTerminal().setCraftingRecipe(craftingMode);
cpt.setCraftingMode(craftingMode);
}
}
@@ -104,9 +104,8 @@ public class PacketNEIPatternRecipe implements IMessage {
return matrix;
}
private void craftingRecipe(AEBaseContainer container, PacketNEIPatternRecipe message) {
final IContainerCraftingPacket cct = (IContainerCraftingPacket) container;
final IGridNode node = cct.getNetworkNode();
private void craftingRecipe(ContainerPatternTerm container, PacketNEIPatternRecipe message) {
final IGridNode node = container.getNetworkNode();
if (node == null) {
return;
@@ -120,22 +119,22 @@ public class PacketNEIPatternRecipe implements IMessage {
final IStorageGrid inv = grid.getCache(IStorageGrid.class);
final ISecurityGrid security = grid.getCache(ISecurityGrid.class);
final IInventory craftMatrix = cct.getInventoryByName("crafting");
if (inv != null && craftMatrix != null && security != null) {
final ItemStack[] recipeInput = getMatrix(message.input, INPUT_KEY, craftMatrix.getSizeInventory());
if (inv != null && security != null) {
var list = new Int2ObjectOpenHashMap<IAEStack<?>>();
final ItemStack[] recipeInput = getMatrix(message.input, INPUT_KEY, 9);
for (int i = 0; i < recipeInput.length; i++) {
craftMatrix.setInventorySlotContents(i, recipeInput[i]);
IAEStack<?> aes = AEItemStack.create(recipeInput[i]);
list.put(i, aes);
}
container.onCraftMatrixChanged(craftMatrix);
container.receiveSlotStacks(StorageName.CRAFTING_INPUT, list);
}
}
private void processRecipe(AEBaseContainer container, PacketNEIPatternRecipe message) {
final IContainerCraftingPacket cct = (IContainerCraftingPacket) container;
final IGridNode node = cct.getNetworkNode();
private void processRecipe(ContainerPatternTerm container, PacketNEIPatternRecipe message) {
final IGridNode node = container.getNetworkNode();
if (node == null) {
return;
@@ -149,26 +148,54 @@ public class PacketNEIPatternRecipe implements IMessage {
final IStorageGrid inv = grid.getCache(IStorageGrid.class);
final ISecurityGrid security = grid.getCache(ISecurityGrid.class);
final IInventory craftMatrix = cct.getInventoryByName("crafting");
final IInventory outputMatrix = cct.getInventoryByName("output");
if (inv != null && craftMatrix != null && outputMatrix != null && security != null) {
final ItemStack[] recipeInput = getMatrix(message.input, INPUT_KEY, craftMatrix.getSizeInventory());
final ItemStack[] recipeOutput = getMatrix(message.output, OUTPUT_KEY, outputMatrix.getSizeInventory());
if (inv != null && security != null) {
var input = new Int2ObjectOpenHashMap<IAEStack<?>>();
var output = new Int2ObjectOpenHashMap<IAEStack<?>>();
final ItemStack[] recipeInput = getMatrix(
message.input,
INPUT_KEY,
container.getPatternInputsWidth() * container.getPatternInputsHeigh()
* container.getPatternInputPages());
final ItemStack[] recipeOutput = getMatrix(
message.output,
OUTPUT_KEY,
container.getPatternOutputsWidth() * container.getPatternOutputsHeigh()
* container.getPatternOutputPages());
for (int i = 0; i < recipeInput.length; i++) {
craftMatrix.setInventorySlotContents(i, recipeInput[i]);
final ItemStack nextStack = recipeInput[i];
if (nextStack == null) continue;
final IAEStack<?> aes;
if (StackInfo.itemStackToNBT(nextStack).hasKey("gtFluidName")) {
aes = AEFluidStack.create(StackInfo.getFluid(nextStack));
} else {
aes = AEItemStack.create(nextStack);
}
input.put(i, aes);
}
for (int i = 0; i < recipeOutput.length; i++) {
outputMatrix.setInventorySlotContents(i, recipeOutput[i]);
final ItemStack nextStack = recipeOutput[i];
if (nextStack == null) continue;
IAEStack<?> aes;
if (StackInfo.itemStackToNBT(nextStack).hasKey("gtFluidName")) {
aes = AEFluidStack.create(StackInfo.getFluid(nextStack));
} else {
aes = AEItemStack.create(nextStack);
}
output.put(i, aes);
}
container.onCraftMatrixChanged(craftMatrix);
container.onCraftMatrixChanged(outputMatrix);
container.clear();
container.receiveSlotStacks(StorageName.CRAFTING_INPUT, input);
container.receiveSlotStacks(StorageName.CRAFTING_OUTPUT, output);
}
}
}
}
@@ -3,20 +3,21 @@ package com.github.vfyjxf.nee.network.packet;
import java.util.ArrayList;
import java.util.List;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.github.vfyjxf.nee.utils.ItemUtils;
import com.glodblock.github.common.item.ItemFluidPacket;
import codechicken.nei.recipe.StackInfo;
import appeng.api.storage.StorageName;
import appeng.api.storage.data.IAEStack;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.util.item.AEItemStack;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
/**
* @author vfyjxf
@@ -65,21 +66,14 @@ public class PacketSlotStackChange implements IMessage {
@Override
public IMessage onMessage(PacketSlotStackChange message, MessageContext ctx) {
Container container = ctx.getServerHandler().playerEntity.openContainer;
ItemStack nextStack = message.getStack();
if (nextStack != null) {
if (GuiUtils.isFluidCraftPatternContainer(container)
&& StackInfo.itemStackToNBT(nextStack).hasKey("gtFluidName")) {
nextStack = ItemFluidPacket.newStack(StackInfo.getFluid(nextStack));
}
for (Integer craftingSlot : message.getCraftingSlots()) {
Slot currentSlot = container.getSlot(craftingSlot);
if (currentSlot != null) {
currentSlot.putStack(nextStack);
}
final IAEStack<?> nextStack = AEItemStack.create(message.getStack());
if (nextStack != null
&& ctx.getServerHandler().playerEntity.openContainer instanceof ContainerPatternTerm cpt) {
final Int2ObjectMap<IAEStack<?>> temp = new Int2ObjectOpenHashMap<>();
for (int craftingSlot : message.getCraftingSlots()) {
temp.put(craftingSlot, nextStack);
}
cpt.receiveSlotStacks(StorageName.CRAFTING_INPUT, temp);
}
return null;
}
@@ -2,20 +2,16 @@ package com.github.vfyjxf.nee.network.packet;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.glodblock.github.common.item.ItemFluidPacket;
import appeng.container.AEBaseContainer;
import appeng.api.storage.StorageName;
import appeng.api.storage.data.IAEStack;
import appeng.container.implementations.ContainerPatternTerm;
import codechicken.nei.recipe.StackInfo;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
import io.netty.buffer.ByteBuf;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
/**
* @author vfyjxf
@@ -24,12 +20,14 @@ public class PacketStackCountChange implements IMessage {
private int slotIndex;
private int changeCount;
private StorageName sn;
public PacketStackCountChange() {}
public PacketStackCountChange(int slotIndex, int changeCount) {
public PacketStackCountChange(int slotIndex, StorageName sn, int changeCount) {
this.slotIndex = slotIndex;
this.changeCount = changeCount;
this.sn = sn;
}
public int getSlotIndex() {
@@ -40,16 +38,22 @@ public class PacketStackCountChange implements IMessage {
return changeCount;
}
public StorageName getStorageName() {
return sn;
}
@Override
public void fromBytes(ByteBuf buf) {
this.slotIndex = buf.readInt();
this.changeCount = buf.readInt();
this.sn = StorageName.values()[buf.readInt()];
}
@Override
public void toBytes(ByteBuf buf) {
buf.writeInt(this.slotIndex);
buf.writeInt(this.changeCount);
buf.writeInt(this.sn.ordinal());
}
public static final class Handler implements IMessageHandler<PacketStackCountChange, IMessage> {
@@ -58,33 +62,21 @@ public class PacketStackCountChange implements IMessage {
public IMessage onMessage(PacketStackCountChange message, MessageContext ctx) {
EntityPlayerMP player = ctx.getServerHandler().playerEntity;
Container container = player.openContainer;
if (container instanceof AEBaseContainer) {
handleMessage(message, container);
if (container instanceof ContainerPatternTerm cpt && !cpt.isCraftingMode()) {
handleMessage(message, cpt);
}
return null;
}
private void handleMessage(PacketStackCountChange message, Container container) {
if (container instanceof ContainerPatternTerm && ((ContainerPatternTerm) container).isCraftingMode()) {
return;
}
Slot currentSlot = container.getSlot(message.getSlotIndex());
if (currentSlot.getHasStack()) {
ItemStack stack = currentSlot.getStack();
if (GuiUtils.isFluidCraftPatternContainer(container)
&& StackInfo.itemStackToNBT(stack).hasKey("gtFluidName")) {
FluidStack fluid = StackInfo.getFluid(stack);
fluid.amount = Math.max(1, fluid.amount + message.getChangeCount());
currentSlot.putStack(ItemFluidPacket.newStack(fluid));
} else {
stack = stack.copy();
stack.stackSize = Math.max(1, stack.stackSize + message.getChangeCount());
currentSlot.putStack(stack);
}
private void handleMessage(PacketStackCountChange message, ContainerPatternTerm cpt) {
final IAEStack<?> aes = cpt.getPatternTerminal().getAEInventoryByName(message.getStorageName())
.getAEStackInSlot(message.getSlotIndex());
if (aes != null) {
final IAEStack<?> newAes = aes.copy();
final Int2ObjectMap<IAEStack<?>> temp = new Int2ObjectOpenHashMap<>();
newAes.setStackSize(Math.max(1, aes.getStackSize()) + message.getChangeCount());
temp.put(message.getSlotIndex(), newAes);
cpt.receiveSlotStacks(message.getStorageName(), temp);
}
}
}
@@ -9,15 +9,11 @@ import java.util.stream.Collectors;
import javax.annotation.Nonnull;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import com.github.vfyjxf.nee.utils.GuiUtils;
import com.glodblock.github.client.gui.GuiFluidPatternTerminalEx;
import codechicken.nei.PositionedStack;
import codechicken.nei.recipe.IRecipeHandler;
import gregtech.api.enums.ItemList;
@@ -103,39 +99,10 @@ public class GregTech5RecipeProcessor implements IRecipeProcessor {
public List<PositionedStack> getRecipeInput(IRecipeHandler recipe, int recipeIndex, String identifier) {
List<PositionedStack> recipeInputs = new ArrayList<>();
if (canProcessRecipe(recipe)) {
if (GuiUtils.isFluidCraftPatternTermEx(Minecraft.getMinecraft().currentScreen)) {
boolean priority = ((GuiFluidPatternTerminalEx) Minecraft
.getMinecraft().currentScreen).container.prioritize;
if (priority) {
for (PositionedStack ps : recipe.getIngredientStacks(recipeIndex)) {
if (ps != null && getFluidFromDisplayStack(ps.item) != null) {
recipeInputs.add(ps);
}
}
for (PositionedStack ps : recipe.getIngredientStacks(recipeIndex)) {
if (ps != null && getFluidFromDisplayStack(ps.item) == null) {
recipeInputs.add(ps);
}
}
} else {
recipeInputs.addAll(recipe.getIngredientStacks(recipeIndex));
}
} else {
recipeInputs.addAll(recipe.getIngredientStacks(recipeIndex));
recipeInputs.removeIf(
positionedStack -> getFluidFromDisplayStack(positionedStack.items[0]) != null
|| positionedStack.item.stackSize == 0);
}
if (!recipeInputs.isEmpty()) {
ItemStack specialItem = recipeInputs.get(recipeInputs.size() - 1).items[0];
if ((specialItem.isItemEqual(ItemList.Tool_DataStick.get(1))
|| specialItem.isItemEqual(ItemList.Tool_DataOrb.get(1))
&& (recipe.getRecipeName().equals("gt.recipe.scanner")
|| recipe.getRecipeName().equals("gt.recipe.fakeAssemblylineProcess"))))
recipeInputs.remove(recipeInputs.size() - 1);
}
return recipeInputs;
recipeInputs.addAll(recipe.getIngredientStacks(recipeIndex));
recipeInputs.removeIf(positionedStack -> positionedStack.item.stackSize == 0);
}
return recipeInputs;
}
@@ -145,7 +112,6 @@ public class GregTech5RecipeProcessor implements IRecipeProcessor {
List<PositionedStack> recipeOutputs = new ArrayList<>();
if (canProcessRecipe(recipe)) {
recipeOutputs.addAll(recipe.getOtherStacks(recipeIndex));
recipeOutputs.removeIf(positionedStack -> getFluidFromDisplayStack(positionedStack.items[0]) != null);
// remove output if it's chance != 10000
recipeOutputs.removeIf(
stack -> stack instanceof FixedPositionedStack && !(((FixedPositionedStack) stack).mChance == 10000
@@ -12,22 +12,15 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Slot;
import net.minecraftforge.common.util.ForgeDirection;
import com.glodblock.github.client.gui.GuiFluidPatternTerminal;
import com.glodblock.github.client.gui.GuiFluidPatternTerminalEx;
import com.glodblock.github.client.gui.container.ContainerFluidPatternTerminal;
import com.glodblock.github.client.gui.container.ContainerFluidPatternTerminalEx;
import appeng.api.networking.IGrid;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode;
import appeng.api.storage.data.IAEItemStack;
import appeng.api.storage.data.IItemList;
import appeng.client.gui.implementations.GuiPatternTerm;
import appeng.client.gui.implementations.GuiPatternTermEx;
import appeng.client.me.ItemRepo;
import appeng.container.AEBaseContainer;
import appeng.container.implementations.ContainerPatternTerm;
import appeng.container.implementations.ContainerPatternTermEx;
import appeng.helpers.IContainerCraftingPacket;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.relauncher.ReflectionHelper;
@@ -39,8 +32,6 @@ import thaumicenergistics.common.container.ContainerPartArcaneCraftingTerminal;
*/
public class GuiUtils {
private static final boolean isFluidCraftModloaded = Loader.isModLoaded(ModIDs.FC);
public static boolean isCraftingSlot(Slot slot) {
if (slot == null) {
return false;
@@ -54,28 +45,12 @@ public class GuiUtils {
return craftMatrix.equals(slot.inventory);
}
public static boolean isFluidCraftPatternContainer(Container container) {
return isFluidCraftModloaded && (container instanceof ContainerFluidPatternTerminal
|| container instanceof ContainerFluidPatternTerminalEx);
}
public static boolean isPatternContainer(Container container) {
return container instanceof ContainerPatternTerm || container instanceof ContainerPatternTermEx
|| isFluidCraftPatternContainer(container);
}
public static boolean isFluidCraftPatternTermEx(GuiScreen guiScreen) {
return isFluidCraftModloaded && guiScreen instanceof GuiFluidPatternTerminalEx;
}
public static boolean isFluidCraftPatternTerm(GuiScreen guiScreen) {
return isFluidCraftModloaded && guiScreen instanceof GuiFluidPatternTerminal;
return container instanceof ContainerPatternTerm;
}
public static boolean isPatternTerm(GuiScreen guiScreen) {
return guiScreen instanceof GuiPatternTerm || guiScreen instanceof GuiPatternTermEx
|| isFluidCraftModloaded && (guiScreen instanceof GuiFluidPatternTerminal
|| guiScreen instanceof GuiFluidPatternTerminalEx);
return guiScreen instanceof GuiPatternTerm;
}
public static ItemRepo getItemRepo(GuiContainer termGui) {