Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
a83e25e
Add wireless requester terminal support
Mithi83 Jun 17, 2025
ff95de4
Update ae2wtlibVersion
Mithi83 Aug 15, 2025
dd07c62
WRMenuHost implements RequesterTerminalHost as well
Mithi83 Aug 15, 2025
a742d94
Use upgrade panel from ae2wtlib
Mithi83 Aug 15, 2025
955fba7
Handle keypress correctly in all cases
Mithi83 Aug 15, 2025
f4ed52d
Compile fixes
Mithi83 Aug 16, 2025
39350c0
Add singularity slot
Mithi83 Aug 16, 2025
f27dd32
Add keybind translation string
Mithi83 Aug 17, 2025
15406eb
rename dependency gradle property and disable transitivity
rlnt Aug 26, 2025
6e90d0d
add dependency to mods.toml with minimum version range
rlnt Aug 26, 2025
0799943
update ae2 and neoforge required by ae2wtlib
rlnt Aug 26, 2025
8bef3da
jij the api dependency and avoid publishing to POM
rlnt Aug 26, 2025
8f0a13d
publish ae2 to compile time and runtime in POM
rlnt Aug 26, 2025
3e70818
add PR link in changelog
rlnt Aug 26, 2025
2963171
move to compat package and make registration conditional
rlnt Aug 26, 2025
4fb9bc3
move client registration to conditional compat class
rlnt Aug 26, 2025
881bf99
lower visibility for compat classes
rlnt Aug 26, 2025
1635ca0
remove redundant interfaces on terminal menu host
rlnt Aug 26, 2025
9695f51
simplify boolean logic in terminal screen key press check
rlnt Aug 26, 2025
cb4472b
add german translation for wireless terminal
rlnt Aug 26, 2025
75cdf62
rename recipe sub directory
rlnt Aug 26, 2025
e515e84
make wireless terminal recipe conditional
rlnt Aug 26, 2025
0f3e2de
add missing recipe advancement
rlnt Aug 26, 2025
e793f13
add base wireless terminal mod to runtime for testing
rlnt Aug 26, 2025
e915983
fix wireless terminal crafting recipe not parsing correctly
rlnt Aug 26, 2025
5ed1a23
disable implicit menu type registration
rlnt Aug 26, 2025
ad32ada
do not JiJ the api
rlnt Aug 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
All notable changes to this project will be documented in this file.

## Unreleased
- /

- added ae2wtlib integration ([Mithi83](https://github.com/Mithi83),[Mari023](https://github.com/Mari023)@[#48](https://github.com/AlmostReliable/merequester/pull/48))

## [1.2.0] - 2025-04-18

Expand Down
5 changes: 4 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,14 @@ neoForge {

repositories {
mavenCentral()
maven("https://modmaven.dev")
mavenLocal()
}

dependencies {
implementation("org.appliedenergistics:appliedenergistics2:${almostgradle.getProperty("aeVersion")}")
api("org.appliedenergistics:appliedenergistics2:${almostgradle.getProperty("aeVersion")}")
compileOnly("de.mari_023:ae2wtlib_api:${almostgradle.getProperty("wtlibVersion")}") { isTransitive = false }
localRuntime("de.mari_023:ae2wtlib:${almostgradle.getProperty("wtlibVersion")}") { isTransitive = false }
}

tasks.withType<Jar> {
Expand Down
5 changes: 3 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ modId = merequester
modName = ME Requester
modVersion = 1.2.0
minecraftVersion = 1.21.1
neoforgeVersion = 21.1.113
neoforgeVersion = 21.1.169

# replacement properties
modAuthor = Almost Reliable
Expand All @@ -14,7 +14,8 @@ githubUser = AlmostReliable
githubRepo = merequester

# mod dependencies
aeVersion = 19.2.7
aeVersion = 19.2.13
wtlibVersion = 19.2.5

# settings
neoForge.parchment.minecraftVersion = 1.21.1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.almostreliable.merequester.client.RequesterScreen;
import com.almostreliable.merequester.client.RequesterTerminalScreen;
import com.almostreliable.merequester.compat.wtlib.WirelessTerminalCompat;
import com.almostreliable.merequester.core.Registration;
import com.almostreliable.merequester.requester.RequesterMenu;
import com.almostreliable.merequester.terminal.RequesterTerminalMenu;
Expand Down Expand Up @@ -35,6 +36,7 @@ InitScreens.<RequesterTerminalMenu, RequesterTerminalScreen<RequesterTerminalMen
RequesterTerminalScreen::new,
String.format("/screens/%s.json", MERequester.TERMINAL_ID)
);
WirelessTerminalCompat.INSTANCE.initClient(event);
}

private void registerColors(RegisterColorHandlersEvent.Item event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ public abstract class AbstractRequesterScreen<M extends AbstractRequesterMenu> e
protected static final int GUI_WIDTH = 195;
private static final int GUI_PADDING_X = 8;
private static final int GUI_PADDING_Y = 6;
protected static final int GUI_HEADER_HEIGHT = 19;
protected static final int GUI_FOOTER_HEIGHT = 100;
protected static final int GUI_HEADER_HEIGHT = 20;
protected static final int GUI_FOOTER_HEIGHT = 99;

private static final int TEXT_MARGIN_X = 2;
private static final int TEXT_MAX_WIDTH = 156;
Expand All @@ -62,7 +62,7 @@ public abstract class AbstractRequesterScreen<M extends AbstractRequesterMenu> e

private static final Rect2i HEADER_BBOX = new Rect2i(0, 0, GUI_WIDTH, GUI_HEADER_HEIGHT);

private static final Rect2i TEXT_BBOX = new Rect2i(0, 19, GUI_WIDTH, ROW_HEIGHT);
private static final Rect2i TEXT_BBOX = new Rect2i(0, 60, GUI_WIDTH, ROW_HEIGHT);
private static final Rect2i REQUEST_BBOX = new Rect2i(0, 38, GUI_WIDTH, ROW_HEIGHT);

private final ResourceLocation texture;
Expand Down Expand Up @@ -134,14 +134,14 @@ public void updateFromMenu(boolean clearData, long requesterId, CompoundTag data
@Override
@MustBeInvokedByOverriders
protected void init() {
imageHeight = GUI_HEADER_HEIGHT + GUI_FOOTER_HEIGHT + rowAmount * ROW_HEIGHT;
imageHeight = GUI_HEADER_HEIGHT + GUI_FOOTER_HEIGHT + rowAmount * ROW_HEIGHT + 1;

requestWidgets.forEach(w -> w.preInit(Utils.cast(widgets, WidgetContainerMixin.class).merequester$getWidgets()));
super.init();
// clear old widgets because init() is recalled when the terminal resizes
requestWidgets.clear();
for (var i = 0; i < rowAmount; i++) {
var requestWidget = new RequestWidget(this, i, GUI_PADDING_X, (i + 1) * ROW_HEIGHT, style);
var requestWidget = new RequestWidget(this, i, GUI_PADDING_X, (i + 1) * ROW_HEIGHT + 1, style);
requestWidget.postInit();
requestWidgets.add(requestWidget);
}
Expand Down Expand Up @@ -306,7 +306,7 @@ private RequestSlot createSlot(int index, Request request) {
(RequesterReference) request.getRequesterReference(),
request.getIndex(),
ROW_HEIGHT + GUI_PADDING_X,
(index + 1) * ROW_HEIGHT + 1
(index + 1) * ROW_HEIGHT + 2
);
slot.setHideAmount(true);
slot.setLocked(request.getClientStatus().locksRequest());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.almostreliable.merequester.compat.wtlib;

import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.MenuType;

import appeng.menu.locator.ItemMenuHostLocator;
import de.mari_023.ae2wtlib.api.terminal.ItemWT;

class ReqWirelessTerminalItem extends ItemWT {

@Override
public MenuType<?> getMenuType(ItemMenuHostLocator itemMenuHostLocator, Player player) {
return ReqWirelessTerminalMenu.TYPE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.almostreliable.merequester.compat.wtlib;

import com.almostreliable.merequester.Utils;
import com.almostreliable.merequester.terminal.RequesterTerminalMenu;

import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType;

import appeng.api.storage.ITerminalHost;
import appeng.api.upgrades.IUpgradeInventory;
import appeng.menu.SlotSemantics;
import appeng.menu.ToolboxMenu;
import appeng.menu.implementations.MenuTypeBuilder;
import appeng.menu.slot.RestrictedInputSlot;
import de.mari_023.ae2wtlib.api.gui.AE2wtlibSlotSemantics;
import de.mari_023.ae2wtlib.api.terminal.ItemWUT;
import de.mari_023.ae2wtlib.api.terminal.WTMenuHost;

final class ReqWirelessTerminalMenu extends RequesterTerminalMenu {

static final MenuType<ReqWirelessTerminalMenu> TYPE = MenuTypeBuilder
.create(ReqWirelessTerminalMenu::new, ReqWirelessTerminalMenuHost.class)
.build(Utils.getRL(WirelessTerminalCompat.TERMINAL_ID));

private final ReqWirelessTerminalMenuHost wrMenuHost;
private final ToolboxMenu toolboxMenu;

private ReqWirelessTerminalMenu(int id, Inventory playerInventory, ReqWirelessTerminalMenuHost host) {
super(TYPE, id, playerInventory, host);
wrMenuHost = host;
toolboxMenu = new ToolboxMenu(this);

IUpgradeInventory upgrades = wrMenuHost.getUpgrades();
for (int i = 0; i < upgrades.size(); i++) {
var slot = new RestrictedInputSlot(RestrictedInputSlot.PlacableItemType.UPGRADES, upgrades, i);
slot.setNotDraggable();
addSlot(slot, SlotSemantics.UPGRADE);
}
addSlot(
new RestrictedInputSlot(
RestrictedInputSlot.PlacableItemType.QE_SINGULARITY,
wrMenuHost.getSubInventory(WTMenuHost.INV_SINGULARITY),
0
), AE2wtlibSlotSemantics.SINGULARITY
);
}

@Override
public void broadcastChanges() {
toolboxMenu.tick();
super.broadcastChanges();
}

boolean isWUT() {
return wrMenuHost.getItemStack().getItem() instanceof ItemWUT;
}

ITerminalHost getHost() {
return wrMenuHost;
}

ToolboxMenu getToolbox() {
return toolboxMenu;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.almostreliable.merequester.compat.wtlib;

import net.minecraft.world.entity.player.Player;

import appeng.menu.ISubMenu;
import appeng.menu.locator.ItemMenuHostLocator;
import de.mari_023.ae2wtlib.api.terminal.ItemWT;
import de.mari_023.ae2wtlib.api.terminal.WTMenuHost;

import java.util.function.BiConsumer;

class ReqWirelessTerminalMenuHost extends WTMenuHost {

ReqWirelessTerminalMenuHost(
ItemWT item, Player player, ItemMenuHostLocator locator, BiConsumer<Player, ISubMenu> returnToMainMenu) {
super(item, player, locator, returnToMainMenu);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.almostreliable.merequester.compat.wtlib;

import com.almostreliable.merequester.client.RequesterTerminalScreen;

import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;

import appeng.client.gui.style.ScreenStyle;
import appeng.client.gui.widgets.ToolboxPanel;
import de.mari_023.ae2wtlib.api.gui.ScrollingUpgradesPanel;
import de.mari_023.ae2wtlib.api.terminal.IUniversalTerminalCapable;
import de.mari_023.ae2wtlib.api.terminal.WTMenuHost;

class ReqWirelessTerminalScreen extends RequesterTerminalScreen<ReqWirelessTerminalMenu> implements IUniversalTerminalCapable {

private final ScrollingUpgradesPanel upgradesPanel;

ReqWirelessTerminalScreen(ReqWirelessTerminalMenu menu, Inventory playerInventory, Component name, ScreenStyle style) {
super(menu, playerInventory, name, style);
if (getMenu().isWUT()) {
addToLeftToolbar(cycleTerminalButton());
}

upgradesPanel = addUpgradePanel(widgets, getMenu());
if (getMenu().getToolbox().isPresent()) {
widgets.add("toolbox", new ToolboxPanel(style, getMenu().getToolbox().getName()));
}
}

@Override
public void init() {
super.init();
upgradesPanel.setMaxRows(Math.max(2, rowAmount));
}

@Override
public WTMenuHost getHost() {
return (WTMenuHost) getMenu().getHost();
}

@Override
public void storeState() {}

@Override
public boolean keyPressed(int keyCode, int scanCode, int keyPressed) {
return super.keyPressed(keyCode, scanCode, keyPressed) || checkForTerminalKeys(keyCode, scanCode);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package com.almostreliable.merequester.compat.wtlib;

import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.level.ItemLike;
import net.neoforged.fml.ModList;
import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.registries.DeferredRegister;

import appeng.api.features.GridLinkables;
import appeng.init.client.InitScreens;
import de.mari_023.ae2wtlib.api.gui.Icon;
import de.mari_023.ae2wtlib.api.registration.AddTerminalEvent;

import org.jetbrains.annotations.Nullable;

import java.util.List;

@SuppressWarnings({"NonConstantFieldWithUpperCaseName", "StaticVariableMayNotBeInitialized"})
public final class WirelessTerminalCompat {

public static final WirelessTerminalCompat INSTANCE = new WirelessTerminalCompat();
static final String TERMINAL_ID = "wireless_requester_terminal";

public void init(DeferredRegister.Items itemRegistry, DeferredRegister<MenuType<?>> menuRegistry) {
if (isLoaded()) {
Guard.init(itemRegistry, menuRegistry);
}
}

public void initClient(RegisterMenuScreensEvent event) {
if (isLoaded()) {
GuardClient.init(event);
}
}

public void registerCapabilities() {
if (isLoaded()) {
Guard.registerCapabilities();
}
}

public Iterable<ItemLike> collectItems() {
if (!isLoaded()) {
return List.of();
}

return Guard.collectItems();
}

private boolean isLoaded() {
return ModList.get().isLoaded("ae2wtlib");
}

private WirelessTerminalCompat() {}

@SuppressWarnings("StaticVariableUsedBeforeInitialization")
static final class Guard {

@Nullable
static DeferredItem<ReqWirelessTerminalItem> WIRELESS_REQUESTER_TERMINAL;
@Nullable
static DeferredHolder<MenuType<?>, MenuType<ReqWirelessTerminalMenu>> WIRELESS_REQUESTER_TERMINAL_MENU;

private static void init(DeferredRegister.Items itemRegistry, DeferredRegister<MenuType<?>> menuRegistry) {

WIRELESS_REQUESTER_TERMINAL = itemRegistry.registerItem(
TERMINAL_ID,
properties -> new ReqWirelessTerminalItem()
);
WIRELESS_REQUESTER_TERMINAL_MENU = menuRegistry.register(
TERMINAL_ID,
() -> ReqWirelessTerminalMenu.TYPE
);

AddTerminalEvent.register(event -> event.builder(
"requester", ReqWirelessTerminalMenuHost::new, ReqWirelessTerminalMenu.TYPE, WIRELESS_REQUESTER_TERMINAL.get(),
Icon.PATTERN_ACCESS
)
.addTerminal());
}

private static void registerCapabilities() {
assert WIRELESS_REQUESTER_TERMINAL != null;
GridLinkables.register(WIRELESS_REQUESTER_TERMINAL, appeng.items.tools.powered.WirelessTerminalItem.LINKABLE_HANDLER);
}

private static Iterable<ItemLike> collectItems() {
assert WIRELESS_REQUESTER_TERMINAL != null;
return List.of(WIRELESS_REQUESTER_TERMINAL.get());
}

private Guard() {}
}

private static final class GuardClient {

private static void init(RegisterMenuScreensEvent event) {
InitScreens.register(
event,
ReqWirelessTerminalMenu.TYPE,
ReqWirelessTerminalScreen::new,
String.format("/screens/%s.json", TERMINAL_ID)
);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NonnullDefault
package com.almostreliable.merequester.compat.wtlib;

import org.lwjgl.system.NonnullDefault;
Loading