diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 87844da..aa8cae0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: push: branches: - - "1.21.1" + - "26.1" tags-ignore: - "**" paths: @@ -15,7 +15,7 @@ on: - "**/build.yml" pull_request: branches: - - "1.21.1" + - "26.1" paths: - "gradle/**" - "**.java" @@ -32,4 +32,4 @@ jobs: uses: AlmostReliable/.github/.github/workflows/build.yml@main with: java-distribution: "microsoft" - java-version: "21" + java-version: "25" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 73bb299..00c7f2d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,7 +38,7 @@ jobs: secrets: inherit with: java-distribution: "microsoft" - java-version: "21" + java-version: "25" mod_name: "MERequester" curseforge_id: "688367" modrinth_id: "E6BFl96N" diff --git a/build.gradle.kts b/build.gradle.kts index 7a5d310..0d81ab8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,18 +1,22 @@ plugins { - id("net.neoforged.moddev") version "2.0.141" - id("com.almostreliable.almostgradle") version "1.5.2" + id("net.neoforged.moddev") version "2.0.143" + id("com.almostreliable.almostgradle") version "2.3.2" } almostgradle.setup { withSourcesJar = false + downloadSources = true + downloadJavadoc = true } neoForge { runs { configureEach { - systemProperties = mapOf( - "guideme.ae2.guide.sources" to file("guidebook").absolutePath, - "guideme.ae2.guide.sourcesNamespace" to almostgradle.modId, + systemProperties.putAll( + mapOf( + "guideme.ae2.guide.sources" to file("guidebook").absolutePath, + "guideme.ae2.guide.sourcesNamespace" to almostgradle.modId, + ) ) } @@ -26,7 +30,6 @@ neoForge { repositories { mavenCentral() maven("https://modmaven.dev") - mavenLocal() } dependencies { diff --git a/gradle.properties b/gradle.properties index 0d92e3a..120ebae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ group = com.almostreliable modId = merequester modName = ME Requester modVersion = 1.4.3 -minecraftVersion = 1.21.1 -neoforgeVersion = 21.1.169 +minecraftVersion = 26.1.2 +neoforgeVersion = 26.1.2.81 # replacement properties modAuthor = Almost Reliable @@ -14,17 +14,14 @@ githubUser = AlmostReliable githubRepo = merequester # mod dependencies -aeVersion = 19.2.13 -wtlibVersion = 19.2.5 +aeVersion = 26.1.10-beta +wtlibVersion = 26.1.1-beta # settings -neoForge.parchment.minecraftVersion = 1.21.1 -neoForge.parchment.mappingsVersion = 2024.11.17 -almostgradle.buildconfig.name = ModConstants +almostgradle.buildconfig = ModConstants almostgradle.launchArgs.autoWorldJoin = true -almostgradle.recipeViewers.emi.runConfig = true -almostgradle.recipeViewers.emi.version = 1.1.21 -almostgradle.recipeViewers.emi.minecraftVersion = 1.21.1 +almostgradle.recipeViewers.jei.runConfig = true +almostgradle.recipeViewers.jei.version = 29.21.0.66 # gradle org.gradle.vfs.watch = true diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9..d997cfc 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index accaf1a..4d8a80c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase = GRADLE_USER_HOME distributionPath = wrapper/dists -distributionUrl = https\://services.gradle.org/distributions/gradle-8.12.1-bin.zip +distributionUrl = https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout = 10000 validateDistributionUrl = true zipStoreBase = GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f3b75f3..739907d 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -57,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -205,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a21..c4bdd3a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/com/almostreliable/merequester/MERequester.java b/src/main/java/com/almostreliable/merequester/MERequester.java index d1aa378..e8a81db 100644 --- a/src/main/java/com/almostreliable/merequester/MERequester.java +++ b/src/main/java/com/almostreliable/merequester/MERequester.java @@ -1,7 +1,7 @@ package com.almostreliable.merequester; import com.almostreliable.merequester.core.Config; -import com.almostreliable.merequester.core.Registration; +import com.almostreliable.merequester.core.ModRegistration; import com.almostreliable.merequester.network.PacketHandler; import net.neoforged.bus.api.IEventBus; @@ -19,7 +19,7 @@ public final class MERequester { public static final String TERMINAL_ID = "requester_terminal"; public MERequester(IEventBus modEventBus, ModContainer modContainer) { - Registration.init(modEventBus); + ModRegistration.init(modEventBus); PacketHandler.init(modEventBus); Config.init(modContainer); } diff --git a/src/main/java/com/almostreliable/merequester/MERequesterClient.java b/src/main/java/com/almostreliable/merequester/MERequesterClient.java index 3e68ee3..9294bdd 100644 --- a/src/main/java/com/almostreliable/merequester/MERequesterClient.java +++ b/src/main/java/com/almostreliable/merequester/MERequesterClient.java @@ -3,28 +3,21 @@ 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; -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.util.FastColor; import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.common.Mod; -import net.neoforged.neoforge.client.event.RegisterColorHandlersEvent; import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; -import appeng.api.util.AEColor; -import appeng.client.render.StaticItemColor; -import appeng.init.client.InitScreens; +import appeng.client.InitScreens; @Mod(value = ModConstants.MOD_ID, dist = Dist.CLIENT) public final class MERequesterClient { public MERequesterClient(IEventBus modEventBus) { modEventBus.addListener(this::registerScreens); - modEventBus.addListener(this::registerColors); } @SuppressWarnings("RedundantTypeArguments") @@ -39,11 +32,4 @@ InitScreens. FastColor.ARGB32.opaque(itemColor.getColor(stack, tintIndex)); - } } diff --git a/src/main/java/com/almostreliable/merequester/Utils.java b/src/main/java/com/almostreliable/merequester/Utils.java index b29c54e..326f8ce 100644 --- a/src/main/java/com/almostreliable/merequester/Utils.java +++ b/src/main/java/com/almostreliable/merequester/Utils.java @@ -3,7 +3,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import com.mojang.blaze3d.platform.InputConstants; @@ -13,8 +13,8 @@ public final class Utils { private Utils() {} - public static ResourceLocation getRL(String path) { - return ResourceLocation.fromNamespaceAndPath(ModConstants.MOD_ID, path); + public static Identifier getRL(String path) { + return Identifier.fromNamespaceAndPath(ModConstants.MOD_ID, path); } public static MutableComponent translate(String type, String key, Object... args) { diff --git a/src/main/java/com/almostreliable/merequester/client/RequestSlot.java b/src/main/java/com/almostreliable/merequester/client/RequestSlot.java index f203a14..6589d3a 100644 --- a/src/main/java/com/almostreliable/merequester/client/RequestSlot.java +++ b/src/main/java/com/almostreliable/merequester/client/RequestSlot.java @@ -9,11 +9,11 @@ import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import appeng.menu.slot.FakeSlot; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -27,7 +27,7 @@ public class RequestSlot extends FakeSlot { private boolean isLocked; public RequestSlot(RequestDisplay host, RequesterReference requesterReference, int slot, int x, int y) { - super(requesterReference.getRequestManager(), slot); + super(requesterReference.getRequestManager().getConfigInventory(), slot); this.host = host; this.requesterReference = requesterReference; this.slot = slot; @@ -82,6 +82,11 @@ public void setLocked(boolean locked) { @Override public void setFilterTo(ItemStack itemStack) { - PacketDistributor.sendToServer(new DragAndDropPacket(getRequesterReference().getRequesterId(), getSlot(), itemStack)); + ClientPacketDistributor.sendToServer(new DragAndDropPacket(getRequesterReference().getRequesterId(), getSlot(), itemStack)); + } + + @Override + public boolean canSetFilterTo(ItemStack stack) { + return !isLocked && super.canSetFilterTo(stack); } } diff --git a/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java b/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java index 28f9052..4a8aee1 100644 --- a/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java +++ b/src/main/java/com/almostreliable/merequester/client/RequesterScreen.java @@ -9,20 +9,20 @@ import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Inventory; import appeng.client.gui.style.ScreenStyle; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Collections; import java.util.Set; public class RequesterScreen extends AbstractRequesterScreen { - private static final ResourceLocation TEXTURE = Utils.getRL(String.format("textures/gui/%s.png", MERequester.REQUESTER_ID)); + private static final Identifier TEXTURE = Utils.getRL(String.format("textures/gui/%s.png", MERequester.REQUESTER_ID)); private static final Rect2i FOOTER_BBOX = new Rect2i(0, 114, GUI_WIDTH, GUI_FOOTER_HEIGHT + 2); private static final int MAX_ROW_COUNT = 10; diff --git a/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java b/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java index b3f0908..9d58908 100644 --- a/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java +++ b/src/main/java/com/almostreliable/merequester/client/RequesterTerminalScreen.java @@ -8,9 +8,11 @@ import com.almostreliable.merequester.requester.Request; import com.almostreliable.merequester.terminal.RequesterTerminalMenu; +import net.minecraft.client.input.CharacterEvent; +import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; import appeng.api.config.Settings; @@ -23,7 +25,7 @@ import appeng.core.localization.GuiText; import com.google.common.collect.HashMultimap; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -36,7 +38,7 @@ public class RequesterTerminalScreen extends AbstractRequesterScreen { - private static final ResourceLocation TEXTURE = Utils.getRL(String.format("textures/gui/%s.png", MERequester.TERMINAL_ID)); + private static final Identifier TEXTURE = Utils.getRL(String.format("textures/gui/%s.png", MERequester.TERMINAL_ID)); private static final Rect2i FOOTER_BBOX = new Rect2i(0, 133, GUI_WIDTH, GUI_FOOTER_HEIGHT + 2); private final HashMap byId = new HashMap<>(); @@ -63,16 +65,16 @@ public RequesterTerminalScreen( } @Override - public boolean mouseClicked(double mX, double mY, int button) { - if (button == 1 && searchField.isMouseOver(mX, mY)) { + public boolean mouseClicked(MouseButtonEvent event, boolean doubleClick) { + if (event.button() == 1 && searchField.isMouseOver(event.x(), event.y())) { searchField.setValue(""); } - return super.mouseClicked(mX, mY, button); + return super.mouseClicked(event, doubleClick); } @Override - public boolean charTyped(char character, int key) { - return character == ' ' && searchField.getValue().isEmpty() || super.charTyped(character, key); + public boolean charTyped(CharacterEvent event) { + return event.codepointAsString().equals(" ") && searchField.getValue().isEmpty() || super.charTyped(event); } @Override diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java b/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java index 2c15f4d..104a89c 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/AbstractRequesterScreen.java @@ -5,20 +5,21 @@ import com.almostreliable.merequester.client.RequestSlot; import com.almostreliable.merequester.client.widgets.RequestWidget; import com.almostreliable.merequester.mixin.accessors.WidgetContainerMixin; +import com.almostreliable.merequester.network.RequesterSyncPacket; import com.almostreliable.merequester.requester.Request; import com.almostreliable.merequester.requester.abstraction.AbstractRequesterMenu; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.renderer.Rect2i; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Inventory; -import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.inventory.ContainerInput; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import appeng.api.behaviors.ContainerItemStrategies; import appeng.api.behaviors.EmptyingAction; @@ -35,7 +36,7 @@ import com.mojang.blaze3d.platform.InputConstants; import org.jetbrains.annotations.MustBeInvokedByOverriders; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -65,7 +66,7 @@ public abstract class AbstractRequesterScreen e 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; + private final Identifier texture; protected final ArrayList lines = new ArrayList<>(); private final Scrollbar scrollbar; @@ -76,7 +77,7 @@ public abstract class AbstractRequesterScreen e @SuppressWarnings("AssignmentToSuperclassField") protected AbstractRequesterScreen( - M menu, Inventory playerInventory, Component name, ScreenStyle style, ResourceLocation texture + M menu, Inventory playerInventory, Component name, ScreenStyle style, Identifier texture ) { super(menu, playerInventory, name, style); this.texture = texture; @@ -110,22 +111,18 @@ public List getEmptyingTooltip(RequestSlot slot, ItemStack carried) { return Tooltips.getEmptyingTooltip(ButtonToolTips.SetAction, carried, emptyingAction); } - public void updateFromMenu(boolean clearData, long requesterId, CompoundTag data) { + public void updateFromMenu(boolean clearData, long requesterId, RequesterSyncPacket.Payload data) { if (clearData) { clear(); refreshList(); return; } - var name = data.getString(AbstractRequesterMenu.UNIQUE_NAME_ID); - var sortBy = data.getLong(AbstractRequesterMenu.SORT_BY_ID); - var requests = getById(requesterId, name, sortBy).getRequestManager(); - - for (var i = 0; i < requests.size(); i++) { - var requestIndex = String.valueOf(i); - if (data.contains(requestIndex)) { - requests.get(i).deserializeNBT(menu.getPlayer().registryAccess(), data.getCompound(requestIndex)); - } + var requests = getById(requesterId, data.name(), data.sortBy()).getRequestManager(); + for (var update : data.updates()) { + var index = update.index(); + if (index < 0 || index >= requests.size()) continue; + requests.get(index).fromComponent(update.component()); } if (refreshList) refreshList(); @@ -165,7 +162,7 @@ protected EmptyingAction getEmptyingAction(Slot slot, ItemStack carried) { } @Override - public void drawFG(GuiGraphics guiGraphics, int pX, int pY, int mX, int mY) { + public void drawFG(GuiGraphicsExtractor guiGraphics, int pX, int pY, int mX, int mY) { menu.slots.removeIf(RequestSlot.class::isInstance); int textColor = style.getColor(PaletteColor.DEFAULT_TEXT_COLOR).toARGB(); @@ -173,7 +170,7 @@ public void drawFG(GuiGraphics guiGraphics, int pX, int pY, int mX, int mY) { if (lines.isEmpty()) { var text = Utils.translate("gui", "no_requesters").getString(); var textWidth = font.width(text); - guiGraphics.drawString( + guiGraphics.text( font, text, (int) ((GUI_WIDTH - textWidth) / 2f - 10), @@ -203,7 +200,7 @@ public void drawFG(GuiGraphics guiGraphics, int pX, int pY, int mX, int mY) { if (rows > 1) text = String.format("%s (%s)", text, rows); text = font.plainSubstrByWidth(text, TEXT_MAX_WIDTH, true); - guiGraphics.drawString( + guiGraphics.text( font, text, GUI_PADDING_X + TEXT_MARGIN_X, @@ -219,9 +216,9 @@ public void drawFG(GuiGraphics guiGraphics, int pX, int pY, int mX, int mY) { } @Override - protected void slotClicked(@Nullable Slot slot, int slotIndex, int mouseButton, ClickType clickType) { + protected void slotClicked(@Nullable Slot slot, int slotIndex, int mouseButton, ContainerInput containerInput) { if (!(slot instanceof RequestSlot requestSlot)) { - super.slotClicked(slot, slotIndex, mouseButton, clickType); + super.slotClicked(slot, slotIndex, mouseButton, containerInput); return; } @@ -234,12 +231,12 @@ protected void slotClicked(@Nullable Slot slot, int slotIndex, int mouseButton, requestSlot.getSlot(), requestSlot.getRequesterReference().getRequesterId() ); - PacketDistributor.sendToServer(packet); + ClientPacketDistributor.sendToServer(packet); return; } InventoryAction action = null; - switch (clickType) { + switch (containerInput) { case PICKUP -> action = mouseButton == 1 ? InventoryAction.SPLIT_OR_PLACE_SINGLE : InventoryAction.PICKUP_OR_SET_DOWN; case QUICK_MOVE -> action = mouseButton == 1 ? InventoryAction.PICKUP_SINGLE : InventoryAction.SHIFT_CLICK; case CLONE -> { @@ -257,12 +254,12 @@ protected void slotClicked(@Nullable Slot slot, int slotIndex, int mouseButton, requestSlot.getSlot(), requestSlot.getRequesterReference().getRequesterId() ); - PacketDistributor.sendToServer(packet); + ClientPacketDistributor.sendToServer(packet); } } @Override - public void drawBG(GuiGraphics guiGraphics, int pX, int pY, int mX, int mY, float partial) { + public void drawBG(GuiGraphicsExtractor guiGraphics, int pX, int pY, int mX, int mY, float partial) { blit(guiGraphics, pX, pY, HEADER_BBOX); int scrollLevel = scrollbar.getCurrentScroll(); @@ -296,8 +293,19 @@ protected void resetScrollbar() { protected abstract RequesterReference getById(long requesterId, String name, long sortBy); - private void blit(GuiGraphics guiGraphics, int pX, int pY, Rect2i srcRect) { - guiGraphics.blit(texture, pX, pY, srcRect.getX(), srcRect.getY(), srcRect.getWidth(), srcRect.getHeight()); + private void blit(GuiGraphicsExtractor guiGraphics, int pX, int pY, Rect2i srcRect) { + guiGraphics.blit( + RenderPipelines.GUI_TEXTURED, + texture, + pX, + pY, + srcRect.getX(), + srcRect.getY(), + srcRect.getWidth(), + srcRect.getHeight(), + 256, + 256 + ); } private RequestSlot createSlot(int index, Request request) { diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java b/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java index de87cf8..a12464f 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/RequestDisplay.java @@ -7,7 +7,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java b/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java index 6609012..2896885 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/RequesterReference.java @@ -4,15 +4,12 @@ import com.almostreliable.merequester.requester.abstraction.RequestHost; import net.minecraft.network.chat.Component; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; /** * yoinked from AE2's legacy {@code PatternProviderRecord} *

* Note: this class has a natural ordering that is inconsistent with equals. */ -@OnlyIn(Dist.CLIENT) public class RequesterReference implements RequestHost, Comparable { private final long requesterId; diff --git a/src/main/java/com/almostreliable/merequester/client/abstraction/package-info.java b/src/main/java/com/almostreliable/merequester/client/abstraction/package-info.java index e31a1e8..3f98e39 100644 --- a/src/main/java/com/almostreliable/merequester/client/abstraction/package-info.java +++ b/src/main/java/com/almostreliable/merequester/client/abstraction/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.client.abstraction; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/client/package-info.java b/src/main/java/com/almostreliable/merequester/client/package-info.java index 6ff2fbb..3d51447 100644 --- a/src/main/java/com/almostreliable/merequester/client/package-info.java +++ b/src/main/java/com/almostreliable/merequester/client/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.client; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java b/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java index 46758af..342c593 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/NumberField.java @@ -5,7 +5,7 @@ import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.network.chat.Component; import appeng.api.stacks.AEFluidKey; @@ -18,7 +18,7 @@ import appeng.core.localization.GuiText; import com.mojang.blaze3d.platform.InputConstants; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.math.BigDecimal; import java.math.MathContext; @@ -41,8 +41,9 @@ public class NumberField extends ConfirmableTextField { private static final int WIDTH = 52; private static final int HEIGHT = 12; - private static final int TEXT_COLOR = 0xFF_FFFF; - private static final int ERROR_COLOR = 0xFF_0000; + private static final int TEXT_COLOR = 0xFFFF_FFFF; + private static final int ERROR_COLOR = 0xFFFF_0000; + private static final int B_COLOR = 0xFF54_5454; private static final int MIN_VALUE = 0; @@ -75,10 +76,10 @@ public class NumberField extends ConfirmableTextField { } @Override - public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { - super.renderWidget(guiGraphics, mouseX, mouseY, partial); + public void extractWidgetRenderState(GuiGraphicsExtractor guiGraphics, int mouseX, int mouseY, float partial) { + super.extractWidgetRenderState(guiGraphics, mouseX, mouseY, partial); if (!isFluid) return; - guiGraphics.drawString(Minecraft.getInstance().font, "B", getX() + WIDTH - PADDING, getY(), 0x54_5454, false); + guiGraphics.text(Minecraft.getInstance().font, "B", getX() + WIDTH - PADDING, getY(), B_COLOR, false); } private void validate() { diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java b/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java index bfb8e71..789897b 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/RequestWidget.java @@ -6,18 +6,15 @@ import com.almostreliable.merequester.requester.Request; import net.minecraft.client.gui.components.AbstractWidget; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.client.network.ClientPacketDistributor; import appeng.client.gui.style.ScreenStyle; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.Map; -@OnlyIn(Dist.CLIENT) public class RequestWidget { private final RequestDisplay host; @@ -107,7 +104,7 @@ private void stateBoxChanged(@Nullable Request request) { var newState = stateBox.isSelected(); request.updateState(newState); // prevent jittery animation before server information is received var requesterId = ((RequesterReference) request.getRequesterReference()).getRequesterId(); - PacketDistributor.sendToServer(new RequestUpdatePacket(requesterId, request.getIndex(), newState)); + ClientPacketDistributor.sendToServer(new RequestUpdatePacket(requesterId, request.getIndex(), newState)); } private void amountFieldSubmitted(@Nullable Request request, long amount) { @@ -137,7 +134,7 @@ private void submitButtonClicked(@Nullable Request request) { long amount = amountField.getLongValue().orElse(0); long batch = batchField.getLongValue().orElse(1); var requesterId = ((RequesterReference) request.getRequesterReference()).getRequesterId(); - PacketDistributor.sendToServer(new RequestUpdatePacket(requesterId, request.getIndex(), amount, batch)); + ClientPacketDistributor.sendToServer(new RequestUpdatePacket(requesterId, request.getIndex(), amount, batch)); } private boolean isInactive(@Nullable Request request) { diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java b/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java index a3c4968..1023c08 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/StateBox.java @@ -2,7 +2,7 @@ import com.almostreliable.merequester.Utils; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -30,7 +30,7 @@ public class StateBox extends AECheckbox implements ITooltip { } @Override - public void renderWidget(GuiGraphics guiGraphics, int mX, int mY, float partial) { + public void extractContents(GuiGraphicsExtractor guiGraphics, int mX, int mY, float partial) { Blitter icon; if (isMouseOver(mX, mY) && !isFocused()) { icon = isSelected() ? CHECKED_FOCUS : UNCHECKED_FOCUS; diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java b/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java index 97e6574..c670acc 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/StatusDisplay.java @@ -4,10 +4,11 @@ import com.almostreliable.merequester.requester.status.RequestStatus; import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarrationElementOutput; -import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.MouseButtonInfo; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -38,12 +39,12 @@ public void updateWidgetNarration(NarrationElementOutput narrationElementOutput) @SuppressWarnings("DataFlowIssue") @Override - public void renderWidget(GuiGraphics guiGraphics, int mX, int mY, float partialTick) { + public void extractWidgetRenderState(GuiGraphicsExtractor guiGraphics, int mX, int mY, float partialTick) { guiGraphics.fill(getX(), getY(), getX() + width, getY() + height, 0xFF << 3 * 8 | getStatusColor().getColor()); } @Override - protected boolean isValidClickButton(int button) { + protected boolean isValidClickButton(MouseButtonInfo buttonInfo) { return false; } @@ -62,7 +63,7 @@ private ChatFormatting getStatusColor(RequestStatus requestStatus) { public List getTooltipMessage() { List tooltip = new ArrayList<>(); tooltip.add(Utils.translate("tooltip", "status")); - if (Screen.hasShiftDown()) { + if (Minecraft.getInstance().hasShiftDown()) { tooltip.addAll(List.of( Component.literal(" "), Utils.translate("tooltip", RequestStatus.IDLE.toString().toLowerCase()).withStyle(getStatusColor(RequestStatus.IDLE)), diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java b/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java index 56e261f..61dd636 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/SubmitButton.java @@ -2,7 +2,7 @@ import com.almostreliable.merequester.Utils; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.renderer.Rect2i; import net.minecraft.network.chat.Component; @@ -27,7 +27,7 @@ public class SubmitButton extends AECheckbox implements ITooltip { } @Override - public void renderWidget(GuiGraphics guiGraphics, int mX, int mY, float partial) { + public void extractContents(GuiGraphicsExtractor guiGraphics, int mX, int mY, float partial) { Blitter icon = isFocused() || isMouseOver(mX, mY) ? FOCUSED : UNFOCUSED; if (!isMouseOver(mX, mY)) { setFocused(false); diff --git a/src/main/java/com/almostreliable/merequester/client/widgets/package-info.java b/src/main/java/com/almostreliable/merequester/client/widgets/package-info.java index f23b522..253617f 100644 --- a/src/main/java/com/almostreliable/merequester/client/widgets/package-info.java +++ b/src/main/java/com/almostreliable/merequester/client/widgets/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.client.widgets; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalItem.java b/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalItem.java index 3636c2a..b714507 100644 --- a/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalItem.java +++ b/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalItem.java @@ -8,8 +8,12 @@ class ReqWirelessTerminalItem extends ItemWT { + ReqWirelessTerminalItem(Properties p) { + super(p); + } + @Override public MenuType getMenuType(ItemMenuHostLocator itemMenuHostLocator, Player player) { return ReqWirelessTerminalMenu.TYPE; } -} \ No newline at end of file +} diff --git a/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalScreen.java b/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalScreen.java index 32a23cc..5322df4 100644 --- a/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalScreen.java +++ b/src/main/java/com/almostreliable/merequester/compat/wtlib/ReqWirelessTerminalScreen.java @@ -2,6 +2,7 @@ import com.almostreliable.merequester.client.RequesterTerminalScreen; +import net.minecraft.client.input.KeyEvent; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; @@ -18,7 +19,7 @@ class ReqWirelessTerminalScreen extends RequesterTerminalScreen collectItems() { } private boolean isLoaded() { - return LoadingModList.get().getModFileById("ae2wtlib") != null; + return ModList.get().getModFileById("ae2wtlib") != null; } private WirelessTerminalCompat() {} @SuppressWarnings("StaticVariableUsedBeforeInitialization") - static final class Guard { + private static final class Guard { @Nullable - static ReqWirelessTerminalItem WIRELESS_REQUESTER_TERMINAL; - @Nullable - static DeferredHolder, MenuType> WIRELESS_REQUESTER_TERMINAL_MENU; + private static ReqWirelessTerminalItem WIRELESS_REQUESTER_TERMINAL; private static void init(DeferredRegister> menuRegistry) { - WIRELESS_REQUESTER_TERMINAL_MENU = menuRegistry.register( - TERMINAL_ID, - () -> ReqWirelessTerminalMenu.TYPE - ); + menuRegistry.register(TERMINAL_ID, () -> ReqWirelessTerminalMenu.TYPE); } - public static void registerWirelessTerminal(Registry registry) { - WIRELESS_REQUESTER_TERMINAL = new ReqWirelessTerminalItem(); - Registry.register(registry, Utils.getRL(TERMINAL_ID), WIRELESS_REQUESTER_TERMINAL); + private static void registerWirelessTerminal(Registry registry) { + var terminalId = Utils.getRL(TERMINAL_ID); + var terminalKey = ResourceKey.create(Registries.ITEM, terminalId); + var terminalItem = new ReqWirelessTerminalItem(new Item.Properties().setId(terminalKey)); + + Registry.register(registry, terminalId, terminalItem); AddTerminalEvent.register(event -> event.builder( - "requester", ReqWirelessTerminalMenuHost::new, ReqWirelessTerminalMenu.TYPE, WIRELESS_REQUESTER_TERMINAL, - Icon.PATTERN_ACCESS + "requester", + ReqWirelessTerminalMenuHost::new, + ReqWirelessTerminalMenu.TYPE, + terminalItem, + Icon.PATTERN_ACCESS // TODO: replace this with a custom icon ) .addTerminal()); + + WIRELESS_REQUESTER_TERMINAL = terminalItem; } private static void registerCapabilities(RegisterCapabilitiesEvent event) { assert WIRELESS_REQUESTER_TERMINAL != null; + GridLinkables.register(WIRELESS_REQUESTER_TERMINAL, WirelessTerminalItem.LINKABLE_HANDLER); event.registerItem( - Capabilities.EnergyStorage.ITEM, - (stack, context) -> new PoweredItemCapabilities(stack, WIRELESS_REQUESTER_TERMINAL), + Capabilities.Energy.ITEM, + (_, context) -> new PoweredItemCapabilities(context, WIRELESS_REQUESTER_TERMINAL, WIRELESS_REQUESTER_TERMINAL), WIRELESS_REQUESTER_TERMINAL ); } @@ -107,8 +111,6 @@ private static Iterable collectItems() { assert WIRELESS_REQUESTER_TERMINAL != null; return List.of(WIRELESS_REQUESTER_TERMINAL); } - - private Guard() {} } private static final class GuardClient { diff --git a/src/main/java/com/almostreliable/merequester/compat/wtlib/package-info.java b/src/main/java/com/almostreliable/merequester/compat/wtlib/package-info.java index c17aa3b..0f1da05 100644 --- a/src/main/java/com/almostreliable/merequester/compat/wtlib/package-info.java +++ b/src/main/java/com/almostreliable/merequester/compat/wtlib/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.compat.wtlib; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/core/Registration.java b/src/main/java/com/almostreliable/merequester/core/ModRegistration.java similarity index 84% rename from src/main/java/com/almostreliable/merequester/core/Registration.java rename to src/main/java/com/almostreliable/merequester/core/ModRegistration.java index a39f506..5e9e1f2 100644 --- a/src/main/java/com/almostreliable/merequester/core/Registration.java +++ b/src/main/java/com/almostreliable/merequester/core/ModRegistration.java @@ -6,6 +6,7 @@ import com.almostreliable.merequester.requester.Request; import com.almostreliable.merequester.requester.RequesterBlock; import com.almostreliable.merequester.requester.RequesterBlockEntity; +import com.almostreliable.merequester.requester.RequesterBlockItem; import com.almostreliable.merequester.requester.RequesterMenu; import com.almostreliable.merequester.terminal.RequesterTerminalMenu; import com.almostreliable.merequester.terminal.RequesterTerminalPart; @@ -16,7 +17,6 @@ import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.resources.ResourceKey; import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.level.ItemLike; @@ -32,18 +32,15 @@ import net.neoforged.neoforge.registries.RegisterEvent; import appeng.api.AECapabilities; -import appeng.api.parts.PartModels; -import appeng.block.AEBaseBlock; import appeng.blockentity.AEBaseBlockEntity; import appeng.items.parts.PartItem; -import appeng.items.parts.PartModelsHelper; import java.util.List; import static com.almostreliable.merequester.MERequester.REQUESTER_ID; import static com.almostreliable.merequester.MERequester.TERMINAL_ID; -public final class Registration { +public final class ModRegistration { private static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(ModConstants.MOD_ID); private static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(ModConstants.MOD_ID); @@ -62,21 +59,17 @@ public final class Registration { public static final DeferredBlock REQUESTER_BLOCK = BLOCKS.registerBlock( REQUESTER_ID, - RequesterBlock::new, - AEBaseBlock.metalProps() + RequesterBlock::new ); - public static final DeferredItem REQUESTER_ITEM = ITEMS.registerSimpleBlockItem( + public static final DeferredItem REQUESTER_ITEM = ITEMS.registerItem( REQUESTER_ID, - REQUESTER_BLOCK, - new Item.Properties() + properties -> new RequesterBlockItem(REQUESTER_BLOCK.get(), properties), + Item.Properties::useBlockDescriptionPrefix ); public static final DeferredHolder, BlockEntityType> REQUESTER_ENTITY = BLOCK_ENTITIES.register( REQUESTER_ID, () -> { - // noinspection DataFlowIssue - var type = BlockEntityType.Builder - .of(RequesterBlockEntity::new, REQUESTER_BLOCK.get()) - .build(null); + var type = new BlockEntityType<>(RequesterBlockEntity::new, REQUESTER_BLOCK.get()); AEBaseBlockEntity.registerBlockEntityItem(type, REQUESTER_BLOCK.asItem()); REQUESTER_BLOCK.get().setBlockEntity(RequesterBlockEntity.class, type, null, null); return type; @@ -89,15 +82,11 @@ public final class Registration { public static final DeferredItem> REQUESTER_TERMINAL = ITEMS.registerItem( TERMINAL_ID, - properties -> { - PartModels.registerModels(PartModelsHelper.createModels(RequesterTerminalPart.class)); - - return new PartItem<>( - properties, - RequesterTerminalPart.class, - RequesterTerminalPart::new - ); - } + properties -> new PartItem<>( + properties, + RequesterTerminalPart.class, + RequesterTerminalPart::new + ) ); public static final DeferredHolder, MenuType> REQUESTER_TERMINAL_MENU = MENUS.register( TERMINAL_ID, @@ -113,12 +102,12 @@ public final class Registration { .build() ); - private Registration() {} + private ModRegistration() {} public static void init(IEventBus modEventBus) { // High priority due to AE2WTLib closes it's registration in the registry event - modEventBus.addListener(EventPriority.HIGH, Registration::registerContents); - modEventBus.addListener(Registration::registerCapabilities); + modEventBus.addListener(EventPriority.HIGH, ModRegistration::registerContents); + modEventBus.addListener(ModRegistration::registerCapabilities); modEventBus.addListener(Tab::initContents); WirelessTerminalCompat.INSTANCE.init(MENUS); @@ -145,7 +134,7 @@ private static void registerCapabilities(RegisterCapabilitiesEvent event) { event.registerBlockEntity( AECapabilities.IN_WORLD_GRID_NODE_HOST, REQUESTER_ENTITY.get(), - (requester, ctx) -> requester + (requester, _) -> requester ); WirelessTerminalCompat.INSTANCE.registerCapabilities(event); @@ -173,7 +162,7 @@ private static void initContents(BuildCreativeModeTabContentsEvent event) { } private static void registerTab(RegisterEvent registerEvent) { - registerEvent.register(Registries.CREATIVE_MODE_TAB, TAB_KEY.location(), () -> TAB); + registerEvent.register(Registries.CREATIVE_MODE_TAB, TAB_KEY.identifier(), () -> TAB); } } } diff --git a/src/main/java/com/almostreliable/merequester/core/package-info.java b/src/main/java/com/almostreliable/merequester/core/package-info.java index d0e6f59..176f9a4 100644 --- a/src/main/java/com/almostreliable/merequester/core/package-info.java +++ b/src/main/java/com/almostreliable/merequester/core/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.core; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java b/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java index 9d26bfd..a719f89 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java +++ b/src/main/java/com/almostreliable/merequester/mixin/accessors/SlotMixin.java @@ -2,15 +2,19 @@ import net.minecraft.world.inventory.Slot; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; @Mixin(Slot.class) public interface SlotMixin { @Accessor("x") + @Mutable void merequester$setX(int x); @Accessor("y") + @Mutable void merequester$setY(int y); } diff --git a/src/main/java/com/almostreliable/merequester/mixin/accessors/package-info.java b/src/main/java/com/almostreliable/merequester/mixin/accessors/package-info.java index 9068dc5..6222eff 100644 --- a/src/main/java/com/almostreliable/merequester/mixin/accessors/package-info.java +++ b/src/main/java/com/almostreliable/merequester/mixin/accessors/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.mixin.accessors; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java b/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java index 89a71eb..1430ba6 100644 --- a/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java +++ b/src/main/java/com/almostreliable/merequester/network/RequesterSyncPacket.java @@ -2,36 +2,36 @@ import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.client.abstraction.AbstractRequesterScreen; +import com.almostreliable.merequester.requester.Request; import net.minecraft.client.Minecraft; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; import net.neoforged.neoforge.network.handling.IPayloadContext; -import io.netty.buffer.ByteBuf; +import java.util.List; -public record RequesterSyncPacket( - boolean clearData, long requesterId, - CompoundTag data -) implements CustomPacketPayload { +public record RequesterSyncPacket(boolean clearData, long requesterId, Payload data) implements CustomPacketPayload { + + private static final Payload EMPTY_PAYLOAD = new Payload("", 0L, List.of()); static final Type TYPE = new Type<>(Utils.getRL("requester_sync")); - static final StreamCodec STREAM_CODEC = StreamCodec.composite( + static final StreamCodec STREAM_CODEC = StreamCodec.composite( ByteBufCodecs.BOOL, RequesterSyncPacket::clearData, ByteBufCodecs.VAR_LONG, RequesterSyncPacket::requesterId, - ByteBufCodecs.COMPOUND_TAG, RequesterSyncPacket::data, + Payload.PAYLOAD_STREAM_CODEC, RequesterSyncPacket::data, RequesterSyncPacket::new ); public static RequesterSyncPacket createClearData() { - return new RequesterSyncPacket(true, -1, new CompoundTag()); + return new RequesterSyncPacket(true, -1, EMPTY_PAYLOAD); } - public static RequesterSyncPacket createInventory(long requesterId, CompoundTag data) { - return new RequesterSyncPacket(false, requesterId, data); + public static RequesterSyncPacket createInventory(long requesterId, String name, long sortBy, List updates) { + return new RequesterSyncPacket(false, requesterId, new Payload(name, sortBy, updates)); } @Override @@ -39,9 +39,28 @@ public Type type() { return TYPE; } - public static void handle(RequesterSyncPacket payload, IPayloadContext context) { + public static void handle(RequesterSyncPacket payload, IPayloadContext ignoredContext) { if (Minecraft.getInstance().screen instanceof AbstractRequesterScreen screen) { screen.updateFromMenu(payload.clearData, payload.requesterId, payload.data); } } + + public record Payload(String name, long sortBy, List updates) { + + private static final StreamCodec PAYLOAD_STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, Payload::name, + ByteBufCodecs.VAR_LONG, Payload::sortBy, + IndexedRequest.REQUEST_STREAM_CODEC.apply(ByteBufCodecs.list()), Payload::updates, + Payload::new + ); + } + + public record IndexedRequest(int index, Request.Component component) { + + private static final StreamCodec REQUEST_STREAM_CODEC = StreamCodec.composite( + ByteBufCodecs.VAR_INT, IndexedRequest::index, + Request.Component.STREAM_CODEC, IndexedRequest::component, + IndexedRequest::new + ); + } } diff --git a/src/main/java/com/almostreliable/merequester/network/package-info.java b/src/main/java/com/almostreliable/merequester/network/package-info.java index ed46cb6..d8b46cb 100644 --- a/src/main/java/com/almostreliable/merequester/network/package-info.java +++ b/src/main/java/com/almostreliable/merequester/network/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.network; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/package-info.java b/src/main/java/com/almostreliable/merequester/package-info.java index 2c6d2d3..3af68fd 100644 --- a/src/main/java/com/almostreliable/merequester/package-info.java +++ b/src/main/java/com/almostreliable/merequester/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/requester/Request.java b/src/main/java/com/almostreliable/merequester/requester/Request.java index ebf4444..1dbb6d1 100644 --- a/src/main/java/com/almostreliable/merequester/requester/Request.java +++ b/src/main/java/com/almostreliable/merequester/requester/Request.java @@ -3,27 +3,26 @@ import com.almostreliable.merequester.requester.abstraction.RequestHost; import com.almostreliable.merequester.requester.status.RequestStatus; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.Mth; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; -import net.neoforged.neoforge.common.util.INBTSerializable; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; + +import net.neoforged.neoforge.common.util.ValueIOSerializable; import appeng.api.stacks.AEKey; import appeng.api.stacks.GenericStack; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Objects; import java.util.Optional; -public final class Request implements INBTSerializable { +public final class Request implements ValueIOSerializable { // serialization IDs private static final String STATE_ID = "state"; @@ -52,14 +51,12 @@ public final class Request implements INBTSerializable { } @Override - public CompoundTag serializeNBT(HolderLookup.Provider registries) { - var tag = new CompoundTag(); - tag.putBoolean(STATE_ID, state); - if (key != null) tag.put(KEY_ID, key.toTagGeneric(registries)); - tag.putLong(AMOUNT_ID, amount); - tag.putLong(BATCH_ID, batch); - tag.putInt(STATUS_ID, clientStatus.ordinal()); - return tag; + public void serialize(ValueOutput data) { + data.putBoolean(STATE_ID, state); + if (key != null) key.toTagGeneric(data.child(KEY_ID)); + data.putLong(AMOUNT_ID, amount); + data.putLong(BATCH_ID, batch); + data.putInt(STATUS_ID, clientStatus.ordinal()); } public Component toComponent() { @@ -73,12 +70,17 @@ public Component toComponent() { } @Override - public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { - state = tag.getBoolean(STATE_ID); - key = tag.contains(KEY_ID) ? AEKey.fromTagGeneric(registries, tag.getCompound(KEY_ID)) : null; - amount = tag.getLong(AMOUNT_ID); - batch = tag.getLong(BATCH_ID); - clientStatus = RequestStatus.values()[tag.getInt(STATUS_ID)]; + public void deserialize(ValueInput data) { + state = data.getBooleanOr(STATE_ID, state); + var childKey = data.child(KEY_ID); + if (childKey.isPresent()) { + key = AEKey.fromTagGeneric(childKey.orElseThrow()); + } else { + key = null; + } + amount = data.getLongOr(AMOUNT_ID, amount); + batch = data.getLongOr(BATCH_ID, batch); + clientStatus = RequestStatus.values()[data.getIntOr(STATUS_ID, clientStatus.ordinal())]; } public void fromComponent(Component request) { @@ -151,11 +153,6 @@ void updateKey(@Nullable GenericStack stack) { keyChanged(); } - void setClientKey(AEKey key, long amount) { - this.key = key; - this.amount = amount; - } - private void keyChanged() { if (host != null) host.requestChanged(index); } @@ -189,7 +186,6 @@ public long getBatch() { return batch; } - @OnlyIn(Dist.CLIENT) public RequestHost getRequesterReference() { assert host != null; return host; diff --git a/src/main/java/com/almostreliable/merequester/requester/RequestManager.java b/src/main/java/com/almostreliable/merequester/requester/RequestManager.java index ccb1d14..aa58959 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequestManager.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequestManager.java @@ -3,49 +3,33 @@ import com.almostreliable.merequester.core.Config; import com.almostreliable.merequester.requester.abstraction.RequestHost; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.common.util.INBTSerializable; - -import appeng.api.behaviors.GenericInternalInventory; -import appeng.api.config.Actionable; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; + +import net.neoforged.neoforge.common.util.ValueIOSerializable; + import appeng.api.inventories.InternalInventory; -import appeng.api.stacks.AEItemKey; import appeng.api.stacks.AEKey; -import appeng.api.stacks.AEKeyType; import appeng.api.stacks.GenericStack; -import appeng.api.storage.MEStorage; -import appeng.helpers.externalstorage.GenericStackInv; -import com.google.common.primitives.Ints; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.List; -/** - * Uses the same approach as {@link GenericStackInv} to track items and fluids. - *

- * Automatically provides a menu wrapper by implementing {@link InternalInventory}. - */ -@SuppressWarnings("UnstableApiUsage") -public class RequestManager implements MEStorage, GenericInternalInventory, InternalInventory, INBTSerializable { +public class RequestManager implements ValueIOSerializable { - // if null, the inventory is client-side and doesn't need saving - @Nullable - private final RequestHost host; private final Request[] requests; private final int size; + private final RequesterConfigInventory configInventory; public RequestManager(@Nullable RequestHost host) { - this.host = host; this.size = Config.COMMON.requests.get(); - requests = new Request[size]; + this.requests = new Request[size]; for (var i = 0; i < requests.length; i++) { requests[i] = new Request(host, i); } + this.configInventory = new RequesterConfigInventory(this); } public RequestManager() { @@ -56,97 +40,43 @@ public Request get(int index) { return requests[index]; } - @Override public int size() { return size; } @Nullable - @Override public GenericStack getStack(int index) { return get(index).toGenericStack(); } @Nullable - @Override public AEKey getKey(int index) { return get(index).getKey(); } - @Override public long getAmount(int index) { return get(index).getAmount(); } - @Override - public long getMaxAmount(AEKey key) { - return 1; - } - - @Override - public long getCapacity(AEKeyType keyType) { - return 1; - } - - @Override - public boolean canInsert() { - return true; - } - - @Override - public boolean canExtract() { - return false; - } - - @Override - public void setStack(int index, @Nullable GenericStack stack) { + void setStack(int index, @Nullable GenericStack stack) { get(index).updateKey(stack); } - @Override - public boolean isSupportedType(AEKeyType type) { - return true; - } - - @Override - public boolean isAllowedIn(int slot, AEKey what) { - return true; - } - - @Override - public long insert(int index, AEKey key, long amount, Actionable mode) { - if (mode == Actionable.SIMULATE) return amount; - if (host == null || host.isClientSide()) { - get(index).setClientKey(key, amount); - } else { - get(index).updateKey(new GenericStack(key, amount)); - } - return amount; - } - - @Override - public long extract(int index, AEKey key, long amount, Actionable mode) { - throw new UnsupportedOperationException(); - } - - @Override - public void onChange() { - if (host != null) host.saveChanges(); + public InternalInventory getConfigInventory() { + return configInventory; } @Override - public CompoundTag serializeNBT(HolderLookup.Provider registries) { - var tag = new CompoundTag(); + public void serialize(ValueOutput data) { for (var i = 0; i < size(); i++) { - tag.put(String.valueOf(i), get(i).serializeNBT(registries)); + get(i).serialize(data.child(String.valueOf(i))); } - return tag; } @Override - public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { + public void deserialize(ValueInput data) { for (var i = 0; i < size(); i++) { - get(i).deserializeNBT(registries, tag.getCompound(String.valueOf(i))); + get(i).deserialize(data.childOrEmpty(String.valueOf(i))); } } @@ -155,7 +85,7 @@ public void fromComponent(List exportedRequests) { if (i < exportedRequests.size()) { get(i).fromComponent(exportedRequests.get(i)); } else { - setItemDirect(i, ItemStack.EMPTY); + setStack(i, null); } } } @@ -174,70 +104,4 @@ public int firstAvailableIndex() { } return -1; } - - @Override - public Component getDescription() { - if (host == null) return net.minecraft.network.chat.Component.empty(); - return host.getTerminalName(); - } - - // - @Override - public void beginBatch() {} - - @Override - public void endBatch() {} - - @Override - public void endBatchSuppressed() {} - // - - // - @Override - public boolean isItemValid(int slot, ItemStack stack) { - return stack.isEmpty() || convertToSuitableStack(stack) != null; - } - - @Override - public int getSlotLimit(int slot) { - return 1; - } - - @Override - public ItemStack getStackInSlot(int slot) { - var genericStack = getStack(slot); - if (genericStack != null && genericStack.what() instanceof AEItemKey itemKey) { - return itemKey.toStack(); - } - return GenericStack.wrapInItemStack(genericStack); - } - - @Override - public void setItemDirect(int slot, ItemStack stack) { - if (stack.isEmpty()) { - setStack(slot, null); - } else { - var converted = convertToSuitableStack(stack); - if (converted != null) setStack(slot, converted); - } - } - - @Nullable - private GenericStack convertToSuitableStack(ItemStack stack) { - if (stack.isEmpty()) return null; - - var unwrappedStack = GenericStack.unwrapItemStack(stack); - ItemStack returnStack = stack; - if (unwrappedStack != null) { - if (unwrappedStack.what() instanceof AEItemKey itemKey) { - returnStack = itemKey.toStack(Math.max(1, Ints.saturatedCast(unwrappedStack.amount()))); - } else { - return unwrappedStack; - } - } - - var itemKey = AEItemKey.of(returnStack); - return itemKey != null ? new GenericStack(itemKey, returnStack.getCount()) : null; - } - // } diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java b/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java index 927ea8a..f4d38f1 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterBlock.java @@ -1,17 +1,8 @@ package com.almostreliable.merequester.requester; -import com.almostreliable.merequester.MERequester; -import com.almostreliable.merequester.Utils; - -import net.minecraft.ChatFormatting; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -25,15 +16,13 @@ import appeng.menu.locator.MenuLocators; import appeng.util.InteractionUtil; -import java.util.List; - public class RequesterBlock extends AEBaseEntityBlock { private static final IOrientationStrategy ORIENTATION_STRATEGY = new FacingWithVerticalSpin(); private static final BooleanProperty ACTIVE = BooleanProperty.create("active"); - public RequesterBlock(Properties properties) { - super(properties); + public RequesterBlock(Properties p) { + super(metalProps(p)); registerDefaultState(defaultBlockState().setValue(ACTIVE, false)); } @@ -45,7 +34,7 @@ protected InteractionResult useWithoutItem(BlockState state, Level level, BlockP if (!level.isClientSide()) { MenuOpener.open(RequesterMenu.TYPE, player, MenuLocators.forBlockEntity(entity)); } - return InteractionResult.sidedSuccess(level.isClientSide()); + return level.isClientSide() ? InteractionResult.SUCCESS : InteractionResult.SUCCESS_SERVER; } @Override @@ -63,14 +52,4 @@ protected void createBlockStateDefinition(StateDefinition.Builder tooltip, TooltipFlag tooltipFlag) { - if (Screen.hasShiftDown()) { - tooltip.add(Component.literal(" ")); - tooltip.add(Utils.translate("tooltip", String.format("%s_desc", MERequester.REQUESTER_ID)).withStyle(ChatFormatting.AQUA)); - } else { - Utils.addShiftInfoTooltip(tooltip); - } - } } diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java b/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java index 698a0ae..98c4178 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterBlockEntity.java @@ -3,7 +3,7 @@ import com.almostreliable.merequester.MERequester; import com.almostreliable.merequester.Utils; import com.almostreliable.merequester.core.Config; -import com.almostreliable.merequester.core.Registration; +import com.almostreliable.merequester.core.ModRegistration; import com.almostreliable.merequester.requester.abstraction.RequestHost; import com.almostreliable.merequester.requester.status.LinkState; import com.almostreliable.merequester.requester.status.RequestStatus; @@ -11,15 +11,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.HolderLookup; import net.minecraft.core.component.DataComponentMap; -import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; import appeng.api.config.Actionable; import appeng.api.networking.GridFlags; @@ -40,7 +40,7 @@ import appeng.util.SettingsFrom; import com.google.common.collect.ImmutableSet; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Arrays; import java.util.EnumSet; @@ -63,7 +63,7 @@ public class RequesterBlockEntity extends AENetworkedBlockEntity implements Requ private TickRateModulation currentTickRate = TickRateModulation.IDLE; public RequesterBlockEntity(BlockPos pos, BlockState blockState) { - this(Registration.REQUESTER_ENTITY.get(), pos, blockState); + this(ModRegistration.REQUESTER_ENTITY.get(), pos, blockState); } public RequesterBlockEntity(BlockEntityType blockEntityType, BlockPos pos, BlockState blockState) { @@ -85,28 +85,26 @@ public RequesterBlockEntity(BlockEntityType blockEntityType, BlockPos pos, Bl } @Override - public void loadTag(CompoundTag tag, HolderLookup.Provider registries) { - super.loadTag(tag, registries); - if (tag.contains(REQUESTS_ID)) requestManager.deserializeNBT(registries, tag.getCompound(REQUESTS_ID)); - if (tag.contains(REQUEST_STATUS_ID)) deserializeStatus(tag.getCompound(REQUEST_STATUS_ID)); - if (tag.contains(STORAGE_MANAGER_ID)) { - storageManager.deserializeNBT(registries, tag.getCompound(STORAGE_MANAGER_ID)); - } + public void loadTag(ValueInput data) { + super.loadTag(data); + requestManager.deserialize(data.childOrEmpty(REQUESTS_ID)); + deserializeStatus(data.childOrEmpty(REQUEST_STATUS_ID)); + storageManager.deserialize(data.childOrEmpty(STORAGE_MANAGER_ID)); } @Override - public void saveAdditional(CompoundTag tag, HolderLookup.Provider registries) { - super.saveAdditional(tag, registries); - tag.put(REQUESTS_ID, requestManager.serializeNBT(registries)); - tag.put(REQUEST_STATUS_ID, serializeStatus()); - tag.put(STORAGE_MANAGER_ID, storageManager.serializeNBT(registries)); + public void saveAdditional(ValueOutput data) { + super.saveAdditional(data); + requestManager.serialize(data.child(REQUESTS_ID)); + serializeStatus(data.child(REQUEST_STATUS_ID)); + storageManager.serialize(data.child(STORAGE_MANAGER_ID)); } @Override public void importSettings(SettingsFrom mode, DataComponentMap input, @Nullable Player player) { super.importSettings(mode, input, player); if (mode == SettingsFrom.MEMORY_CARD) { - var exportedRequests = input.get(Registration.EXPORTED_REQUESTS.get()); + var exportedRequests = input.get(ModRegistration.EXPORTED_REQUESTS.get()); if (exportedRequests != null) { requestManager.fromComponent(exportedRequests); } @@ -117,7 +115,7 @@ public void importSettings(SettingsFrom mode, DataComponentMap input, @Nullable public void exportSettings(SettingsFrom mode, DataComponentMap.Builder builder, @Nullable Player player) { super.exportSettings(mode, builder, player); if (mode == SettingsFrom.MEMORY_CARD) { - builder.set(Registration.EXPORTED_REQUESTS.get(), requestManager.toComponent()); + builder.set(ModRegistration.EXPORTED_REQUESTS.get(), requestManager.toComponent()); } } @@ -134,7 +132,7 @@ public TickingRequest getTickingRequest(IGridNode node) { @Override public TickRateModulation tickingRequest(IGridNode node, int ticksSinceLastCall) { - if (level == null || level.isClientSide || !getMainNode().isActive()) return TickRateModulation.IDLE; + if (level == null || level.isClientSide() || !getMainNode().isActive()) return TickRateModulation.IDLE; if (handleRequests()) setChanged(); return currentTickRate; } @@ -172,27 +170,23 @@ public void addAdditionalDrops(Level level, BlockPos pos, List drops) storageManager.addDrops(drops); } - private void deserializeStatus(CompoundTag tag) { + private void deserializeStatus(ValueInput data) { for (var i = 0; i < requestStatus.length; i++) { - if (tag.contains(String.valueOf(i))) { - var stateTag = tag.getCompound(String.valueOf(i)); - var link = StorageHelper.loadCraftingLink(stateTag, this); + var child = data.child(String.valueOf(i)); + if (child.isPresent()) { + var link = StorageHelper.loadCraftingLink(child.orElseThrow(), this); requestStatus[i] = new LinkState(link); } } } - private CompoundTag serializeStatus() { - var tag = new CompoundTag(); + private void serializeStatus(ValueOutput data) { for (var i = 0; i < requestStatus.length; i++) { var state = requestStatus[i]; if (state instanceof LinkState cls) { - var stateTag = new CompoundTag(); - cls.link().writeToNBT(stateTag); - tag.put(String.valueOf(i), stateTag); + cls.link().writeToNBT(data.child(String.valueOf(i))); } } - return tag; } private boolean handleRequests() { diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterBlockItem.java b/src/main/java/com/almostreliable/merequester/requester/RequesterBlockItem.java new file mode 100644 index 0000000..6d69e16 --- /dev/null +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterBlockItem.java @@ -0,0 +1,42 @@ +package com.almostreliable.merequester.requester; + +import com.almostreliable.merequester.MERequester; +import com.almostreliable.merequester.Utils; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.component.TooltipDisplay; +import net.minecraft.world.level.block.Block; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class RequesterBlockItem extends BlockItem { + + public RequesterBlockItem(Block block, Properties properties) { + super(block, properties); + } + + @SuppressWarnings("deprecation") + @Override + public void appendHoverText( + ItemStack stack, Item.TooltipContext context, TooltipDisplay display, Consumer builder, TooltipFlag tooltipFlag + ) { + super.appendHoverText(stack, context, display, builder, tooltipFlag); + + if (Minecraft.getInstance().hasShiftDown()) { + builder.accept(Component.literal(" ")); + builder.accept(Utils.translate("tooltip", String.format("%s_desc", MERequester.REQUESTER_ID)).withStyle(ChatFormatting.AQUA)); + } else { + List tooltip = new ArrayList<>(); + Utils.addShiftInfoTooltip(tooltip); + tooltip.forEach(builder); + } + } +} diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterConfigInventory.java b/src/main/java/com/almostreliable/merequester/requester/RequesterConfigInventory.java new file mode 100644 index 0000000..df32d06 --- /dev/null +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterConfigInventory.java @@ -0,0 +1,79 @@ +package com.almostreliable.merequester.requester; + +import net.minecraft.world.item.ItemStack; + +import net.neoforged.neoforge.transfer.ResourceHandler; +import net.neoforged.neoforge.transfer.item.ItemResource; + +import appeng.api.inventories.InternalInventory; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.GenericStack; +import com.google.common.primitives.Ints; + +import org.jspecify.annotations.Nullable; + +final class RequesterConfigInventory implements InternalInventory { + + private final RequestManager manager; + + RequesterConfigInventory(RequestManager manager) { + this.manager = manager; + } + + @Override + public ResourceHandler toResourceHandler() { + throw new UnsupportedOperationException("requester config inventory is not resource storage"); + } + + @Override + public int size() { + return manager.size(); + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return stack.isEmpty() || convertToSuitableStack(stack) != null; + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + + @Override + public ItemStack getStackInSlot(int slot) { + var genericStack = manager.getStack(slot); + if (genericStack != null && genericStack.what() instanceof AEItemKey itemKey) { + return itemKey.toStack(); + } + return GenericStack.wrapInItemStack(genericStack); + } + + @Override + public void setItemDirect(int slot, ItemStack stack) { + if (stack.isEmpty()) { + manager.setStack(slot, null); + } else { + var converted = convertToSuitableStack(stack); + if (converted != null) manager.setStack(slot, converted); + } + } + + @Nullable + private GenericStack convertToSuitableStack(ItemStack stack) { + if (stack.isEmpty()) return null; + + var unwrappedStack = GenericStack.unwrapItemStack(stack); + ItemStack returnStack = stack; + if (unwrappedStack != null) { + if (unwrappedStack.what() instanceof AEItemKey itemKey) { + returnStack = itemKey.toStack(Math.max(1, Ints.saturatedCast(unwrappedStack.amount()))); + } else { + return unwrappedStack; + } + } + + var itemKey = AEItemKey.of(returnStack); + return itemKey != null ? new GenericStack(itemKey, returnStack.getCount()) : null; + } +} diff --git a/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java b/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java index cd6e44e..deb30cb 100644 --- a/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java +++ b/src/main/java/com/almostreliable/merequester/requester/RequesterMenu.java @@ -15,7 +15,7 @@ import appeng.api.networking.IGrid; import appeng.menu.implementations.MenuTypeBuilder; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class RequesterMenu extends AbstractRequesterMenu { @@ -46,7 +46,7 @@ protected int transferStackToMenu(ItemStack stack) { assert requestTracker != null; var firstAvailable = requestTracker.getServer().firstAvailableIndex(); if (firstAvailable != -1) { - requestTracker.getServer().insertItem(firstAvailable, stack, false); + requestTracker.getServer().getConfigInventory().insertItem(firstAvailable, stack, false); } return 0; } diff --git a/src/main/java/com/almostreliable/merequester/requester/StorageManager.java b/src/main/java/com/almostreliable/merequester/requester/StorageManager.java index 58b4414..83f2d71 100644 --- a/src/main/java/com/almostreliable/merequester/requester/StorageManager.java +++ b/src/main/java/com/almostreliable/merequester/requester/StorageManager.java @@ -2,21 +2,22 @@ import com.almostreliable.merequester.core.Config; -import net.minecraft.core.HolderLookup; -import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.common.util.INBTSerializable; +import net.minecraft.world.level.storage.ValueInput; +import net.minecraft.world.level.storage.ValueOutput; + +import net.neoforged.neoforge.common.util.ValueIOSerializable; import appeng.api.config.FuzzyMode; import appeng.api.networking.IStackWatcher; import appeng.api.networking.storage.IStorageWatcherNode; import appeng.api.stacks.AEKey; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; -public class StorageManager implements IStorageWatcherNode, INBTSerializable { +public class StorageManager implements IStorageWatcherNode, ValueIOSerializable { private final RequesterBlockEntity host; private final Storage[] storages; @@ -66,18 +67,16 @@ public long computeAmountToCraft(int slot) { } @Override - public CompoundTag serializeNBT(HolderLookup.Provider registries) { - var tag = new CompoundTag(); + public void serialize(ValueOutput data) { for (var i = 0; i < storages.length; i++) { - tag.put(String.valueOf(i), get(i).serializeNBT(registries)); + get(i).serialize(data.child(String.valueOf(i))); } - return tag; } @Override - public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { + public void deserialize(ValueInput data) { for (var i = 0; i < storages.length; i++) { - get(i).deserializeNBT(registries, tag.getCompound(String.valueOf(i))); + get(i).deserialize(data.childOrEmpty(String.valueOf(i))); } } @@ -115,7 +114,7 @@ private void computeKnownAmount(int slot) { get(slot).knownAmount = host.getMainNodeGrid().getStorageService().getInventory().getAvailableStacks().get(key); } - public static class Storage implements INBTSerializable { + public static class Storage implements ValueIOSerializable { // serialization IDs private static final String KEY_ID = "key"; @@ -131,21 +130,23 @@ public static class Storage implements INBTSerializable { private long knownAmount = -1; // the known amount stored in the system @Override - public CompoundTag serializeNBT(HolderLookup.Provider registries) { - var tag = new CompoundTag(); - if (key != null) tag.put(KEY_ID, key.toTagGeneric(registries)); - tag.putLong(BUFFER_AMOUNT_ID, bufferAmount); - tag.putLong(PENDING_AMOUNT_ID, pendingAmount); - tag.putLong(KNOWN_AMOUNT_ID, knownAmount); - return tag; + public void serialize(ValueOutput data) { + if (key != null) key.toTagGeneric(data.child(KEY_ID)); + data.putLong(BUFFER_AMOUNT_ID, bufferAmount); + data.putLong(PENDING_AMOUNT_ID, pendingAmount); + data.putLong(KNOWN_AMOUNT_ID, knownAmount); } @Override - public void deserializeNBT(HolderLookup.Provider registries, CompoundTag tag) { - key = tag.contains(KEY_ID) ? AEKey.fromTagGeneric(registries, tag.getCompound(KEY_ID)) : null; - bufferAmount = tag.getLong(BUFFER_AMOUNT_ID); - pendingAmount = tag.getLong(PENDING_AMOUNT_ID); - knownAmount = tag.getLong(KNOWN_AMOUNT_ID); + public void deserialize(ValueInput data) { + var childKey = data.child(KEY_ID); + if (childKey.isPresent()) + key = AEKey.fromTagGeneric(childKey.orElseThrow()); + else + key = null; + bufferAmount = data.getLongOr(BUFFER_AMOUNT_ID, bufferAmount); + pendingAmount = data.getLongOr(PENDING_AMOUNT_ID, pendingAmount); + knownAmount = data.getLongOr(KNOWN_AMOUNT_ID, knownAmount); } /** diff --git a/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java b/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java index 95f36ae..39a65f9 100644 --- a/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java +++ b/src/main/java/com/almostreliable/merequester/requester/abstraction/AbstractRequesterMenu.java @@ -4,7 +4,6 @@ import com.almostreliable.merequester.network.RequesterSyncPacket; import com.almostreliable.merequester.requester.RequesterBlockEntity; -import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; @@ -17,12 +16,12 @@ import appeng.helpers.InventoryAction; import appeng.menu.AEBaseMenu; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; -public abstract class AbstractRequesterMenu extends AEBaseMenu { +import java.util.ArrayList; +import java.util.List; - public static final String SORT_BY_ID = "sort_by"; - public static final String UNIQUE_NAME_ID = "unique_name"; +public abstract class AbstractRequesterMenu extends AEBaseMenu { // used to give requesters unique IDs private long idSerial = Long.MIN_VALUE; @@ -43,7 +42,7 @@ public void doAction(ServerPlayer player, InventoryAction action, int slot, long return; } - var requestSlot = requestTracker.getServer().getSlotInv(slot); + var requestSlot = requestTracker.getServer().getConfigInventory().getSlotInv(slot); var requestStack = requestSlot.getStackInSlot(0); var carriedStack = getCarried(); @@ -111,49 +110,52 @@ protected void syncRequestTrackerFull(RequestTracker requestTracker) { var server = requestTracker.getServer(); var client = requestTracker.getClient(); - // get the requests from the server - var tag = server.serializeNBT(getPlayer().registryAccess()); - // store the information in the client tracker to - // check for differences on partial updates later - // tag serialization is used to avoid references to the original data - client.deserializeNBT(getPlayer().registryAccess(), tag); - - // send relevant data to the client - tag.putString(UNIQUE_NAME_ID, requestTracker.getName()); - tag.putLong(SORT_BY_ID, requestTracker.getSortBy()); - if (getPlayer() instanceof ServerPlayer serverPlayer) { - PacketDistributor.sendToPlayer(serverPlayer, RequesterSyncPacket.createInventory(requestTracker.getId(), tag)); + var updates = new ArrayList(server.size()); + for (var i = 0; i < server.size(); i++) { + var component = server.get(i).toComponent(); + client.get(i).fromComponent(component); + updates.add(new RequesterSyncPacket.IndexedRequest(i, component)); } + + sendInventorySync(requestTracker, updates); } protected void syncRequestTrackerPartial(RequestTracker requestTracker) { var server = requestTracker.getServer(); var client = requestTracker.getClient(); - CompoundTag tag = null; - // iterate through the server data and check for differences + List updates = null; for (var i = 0; i < server.size(); i++) { var serverRequest = server.get(i); var clientRequest = client.get(i); if (serverRequest.isDifferent(clientRequest)) { - // write initial data as soon as something is different - if (tag == null) { - tag = new CompoundTag(); - tag.putString(UNIQUE_NAME_ID, requestTracker.getName()); - tag.putLong(SORT_BY_ID, requestTracker.getSortBy()); + if (updates == null) { + updates = new ArrayList<>(); } - var serverData = serverRequest.serializeNBT(getPlayer().registryAccess()); - tag.put(String.valueOf(i), serverData); - // update the client information for future difference checks - clientRequest.deserializeNBT(getPlayer().registryAccess(), serverData); + var component = serverRequest.toComponent(); + clientRequest.fromComponent(component); + updates.add(new RequesterSyncPacket.IndexedRequest(i, component)); } } - // only send an update if something changed - if (tag != null && getPlayer() instanceof ServerPlayer serverPlayer) { - PacketDistributor.sendToPlayer(serverPlayer, RequesterSyncPacket.createInventory(requestTracker.getId(), tag)); + if (updates != null) { + sendInventorySync(requestTracker, updates); + } + } + + private void sendInventorySync(RequestTracker requestTracker, List updates) { + if (getPlayer() instanceof ServerPlayer serverPlayer) { + PacketDistributor.sendToPlayer( + serverPlayer, + RequesterSyncPacket.createInventory( + requestTracker.getId(), + requestTracker.getName(), + requestTracker.getSortBy(), + updates + ) + ); } } diff --git a/src/main/java/com/almostreliable/merequester/requester/abstraction/package-info.java b/src/main/java/com/almostreliable/merequester/requester/abstraction/package-info.java index 820dfb9..f5f939e 100644 --- a/src/main/java/com/almostreliable/merequester/requester/abstraction/package-info.java +++ b/src/main/java/com/almostreliable/merequester/requester/abstraction/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.requester.abstraction; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/requester/package-info.java b/src/main/java/com/almostreliable/merequester/requester/package-info.java index 565fbfd..dd57a74 100644 --- a/src/main/java/com/almostreliable/merequester/requester/package-info.java +++ b/src/main/java/com/almostreliable/merequester/requester/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.requester; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/requester/status/BlockingState.java b/src/main/java/com/almostreliable/merequester/requester/status/BlockingState.java index 2a9d05d..83bb9fd 100644 --- a/src/main/java/com/almostreliable/merequester/requester/status/BlockingState.java +++ b/src/main/java/com/almostreliable/merequester/requester/status/BlockingState.java @@ -4,7 +4,7 @@ import appeng.api.networking.ticking.TickRateModulation; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public abstract class BlockingState implements StatusState { diff --git a/src/main/java/com/almostreliable/merequester/requester/status/package-info.java b/src/main/java/com/almostreliable/merequester/requester/status/package-info.java index 866c82e..9e6c185 100644 --- a/src/main/java/com/almostreliable/merequester/requester/status/package-info.java +++ b/src/main/java/com/almostreliable/merequester/requester/status/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.requester.status; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java index 57a10a3..5ff8f02 100644 --- a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java +++ b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalMenu.java @@ -20,7 +20,7 @@ import appeng.menu.implementations.PatternAccessTermMenu; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.Comparator; import java.util.IdentityHashMap; @@ -67,7 +67,7 @@ protected int transferStackToMenu(ItemStack stack) { for (var requester : requesters) { var targetSlot = requester.getRequestManager().firstAvailableIndex(); if (targetSlot == -1) continue; - byRequester.get(requester).getServer().insertItem(targetSlot, stack, false); + byRequester.get(requester).getServer().getConfigInventory().insertItem(targetSlot, stack, false); break; } diff --git a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java index 207ffad..1de4dd7 100644 --- a/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java +++ b/src/main/java/com/almostreliable/merequester/terminal/RequesterTerminalPart.java @@ -1,18 +1,11 @@ package com.almostreliable.merequester.terminal; -import com.almostreliable.merequester.MERequester; -import com.almostreliable.merequester.Utils; - -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import appeng.api.parts.IPartItem; -import appeng.api.parts.IPartModel; -import appeng.items.parts.PartModels; import appeng.menu.MenuOpener; import appeng.menu.locator.MenuLocators; -import appeng.parts.PartModel; import appeng.parts.reporting.AbstractDisplayPart; import appeng.parts.reporting.PatternAccessTerminalPart; @@ -20,16 +13,6 @@ * yoinked from {@link PatternAccessTerminalPart} */ public class RequesterTerminalPart extends AbstractDisplayPart implements RequesterTerminalHost { - - @PartModels - private static final ResourceLocation MODEL_OFF = Utils.getRL(String.format("part/%s_off", MERequester.TERMINAL_ID)); - @PartModels - private static final ResourceLocation MODEL_ON = Utils.getRL(String.format("part/%s_on", MERequester.TERMINAL_ID)); - - private static final IPartModel MODELS_OFF = new PartModel(MODEL_BASE, MODEL_OFF, MODEL_STATUS_OFF); - private static final IPartModel MODELS_ON = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_ON); - private static final IPartModel MODELS_HAS_CHANNEL = new PartModel(MODEL_BASE, MODEL_ON, MODEL_STATUS_HAS_CHANNEL); - public RequesterTerminalPart(IPartItem partItem) { super(partItem, true); } @@ -41,9 +24,4 @@ public boolean onUseWithoutItem(Player player, Vec3 pos) { } return true; } - - @Override - public IPartModel getStaticModels() { - return selectModel(MODELS_OFF, MODELS_ON, MODELS_HAS_CHANNEL); - } } diff --git a/src/main/java/com/almostreliable/merequester/terminal/package-info.java b/src/main/java/com/almostreliable/merequester/terminal/package-info.java index e54711b..20a35bb 100644 --- a/src/main/java/com/almostreliable/merequester/terminal/package-info.java +++ b/src/main/java/com/almostreliable/merequester/terminal/package-info.java @@ -1,4 +1,4 @@ -@NonnullDefault +@NullMarked package com.almostreliable.merequester.terminal; -import org.lwjgl.system.NonnullDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..0fa0a72 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,3 @@ +# GUI rendering +protected-f net.minecraft.client.gui.screens.inventory.AbstractContainerScreen imageWidth +protected-f net.minecraft.client.gui.screens.inventory.AbstractContainerScreen imageHeight \ No newline at end of file diff --git a/src/main/resources/META-INF/neoforge.mods.toml b/src/main/resources/META-INF/neoforge.mods.toml index 6cb6d07..066f372 100644 --- a/src/main/resources/META-INF/neoforge.mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,5 +1,5 @@ modLoader = "javafml" -loaderVersion = "[2,)" +loaderVersion = "[11,)" issueTrackerURL = "https://github.com/${githubUser}/${githubRepo}/issues" license = "${license}" logoFile = "logo.png" diff --git a/src/main/resources/assets/merequester/ae2/parts/requester_terminal.json b/src/main/resources/assets/merequester/ae2/parts/requester_terminal.json new file mode 100644 index 0000000..295cead --- /dev/null +++ b/src/main/resources/assets/merequester/ae2/parts/requester_terminal.json @@ -0,0 +1,23 @@ +{ + "model": { + "type": "ae2:composite", + "models": [ + { + "type": "ae2:model", + "model": "ae2:part/display_base" + }, + { + "type": "ae2:status_indicator", + "active": "merequester:part/requester_terminal_on", + "powered": "merequester:part/requester_terminal_on", + "unpowered": "merequester:part/requester_terminal_off" + }, + { + "type": "ae2:status_indicator", + "active": "ae2:part/display_status_has_channel", + "powered": "ae2:part/display_status_on", + "unpowered": "ae2:part/display_status_off" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/merequester/items/requester.json b/src/main/resources/assets/merequester/items/requester.json new file mode 100644 index 0000000..07f21a0 --- /dev/null +++ b/src/main/resources/assets/merequester/items/requester.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "merequester:item/requester" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/merequester/items/requester_terminal.json b/src/main/resources/assets/merequester/items/requester_terminal.json new file mode 100644 index 0000000..77ef0e7 --- /dev/null +++ b/src/main/resources/assets/merequester/items/requester_terminal.json @@ -0,0 +1,32 @@ +{ + "model": { + "type": "minecraft:model", + "model": "merequester:item/requester_terminal", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "ae2:color", + "color": "fluix", + "variant": "dark" + }, + { + "type": "ae2:color", + "color": "fluix", + "variant": "medium" + }, + { + "type": "ae2:color", + "color": "fluix", + "variant": "bright" + }, + { + "type": "ae2:color", + "color": "fluix", + "variant": "medium_bright" + } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/merequester/items/wireless_requester_terminal.json b/src/main/resources/assets/merequester/items/wireless_requester_terminal.json new file mode 100644 index 0000000..191cd27 --- /dev/null +++ b/src/main/resources/assets/merequester/items/wireless_requester_terminal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "merequester:item/wireless_requester_terminal" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/merequester/models/block/requester.json b/src/main/resources/assets/merequester/models/block/requester.json index 589e84d..81a1ed6 100644 --- a/src/main/resources/assets/merequester/models/block/requester.json +++ b/src/main/resources/assets/merequester/models/block/requester.json @@ -2,7 +2,7 @@ "credit": "Made with Blockbench by Almost Reliable", "parent": "block/orientable", "textures": { - "face": "merequester:block/requester", + "front": "merequester:block/requester", "top": "ae2:block/generics/top", "back": "ae2:block/generics/back", "bottom": "ae2:block/generics/bottom", @@ -26,39 +26,39 @@ "from": [0, 0, 0], "to": [16, 4, 1], "faces": { - "north": {"uv": [0, 12, 16, 16], "texture": "#face"}, - "up": {"uv": [16, 12, 0, 13], "texture": "#face"} + "north": {"uv": [0, 12, 16, 16], "texture": "#front"}, + "up": {"uv": [16, 12, 0, 13], "texture": "#front"} } }, { "from": [3, 3, 1], "to": [13, 13, 2], "faces": { - "north": {"uv": [3, 3, 13, 13], "texture": "#face"} + "north": {"uv": [3, 3, 13, 13], "texture": "#front"} } }, { "from": [0, 4, 0], "to": [4, 16, 1], "faces": { - "north": {"uv": [12, 0, 16, 12], "texture": "#face"}, - "east": {"uv": [12, 0, 13, 12], "texture": "#face"} + "north": {"uv": [12, 0, 16, 12], "texture": "#front"}, + "east": {"uv": [12, 0, 13, 12], "texture": "#front"} } }, { "from": [12, 4, 0], "to": [16, 16, 1], "faces": { - "north": {"uv": [0, 0, 4, 12], "texture": "#face"}, - "west": {"uv": [3, 0, 4, 12], "texture": "#face"} + "north": {"uv": [0, 0, 4, 12], "texture": "#front"}, + "west": {"uv": [3, 0, 4, 12], "texture": "#front"} } }, { "from": [4, 12, 0], "to": [12, 16, 1], "faces": { - "north": {"uv": [4, 0, 12, 4], "texture": "#face"}, - "down": {"uv": [12, 3, 4, 4], "texture": "#face"} + "north": {"uv": [4, 0, 12, 4], "texture": "#front"}, + "down": {"uv": [12, 3, 4, 4], "texture": "#front"} } } ], diff --git a/src/main/resources/assets/merequester/models/block/requester_active.json b/src/main/resources/assets/merequester/models/block/requester_active.json index 7c70b31..88c46cb 100644 --- a/src/main/resources/assets/merequester/models/block/requester_active.json +++ b/src/main/resources/assets/merequester/models/block/requester_active.json @@ -1,6 +1,6 @@ { "parent": "merequester:block/requester", "textures": { - "face": "merequester:block/requester_active" + "front": "merequester:block/requester_active" } } diff --git a/src/main/resources/assets/merequester/models/part/requester_terminal_on.json b/src/main/resources/assets/merequester/models/part/requester_terminal_on.json index b5ad780..b4d4806 100644 --- a/src/main/resources/assets/merequester/models/part/requester_terminal_on.json +++ b/src/main/resources/assets/merequester/models/part/requester_terminal_on.json @@ -2,7 +2,8 @@ "textures": { "lightsBright": "merequester:part/requester_terminal_bright", "lightsMedium": "merequester:part/requester_terminal_medium", - "lightsDark": "merequester:part/requester_terminal_dark" + "lightsDark": "merequester:part/requester_terminal_dark", + "particle": "#lightsMedium" }, "elements": [ { diff --git a/src/main/resources/data/merequester/recipe/requester.json b/src/main/resources/data/merequester/recipe/requester.json index 1849fd6..3186c3c 100644 --- a/src/main/resources/data/merequester/recipe/requester.json +++ b/src/main/resources/data/merequester/recipe/requester.json @@ -1,29 +1,18 @@ { "type": "minecraft:crafting_shaped", + "category": "misc", "pattern": [ "eie", "apa", "csc" ], "key": { - "e": { - "tag": "c:ingots/iron" - }, - "i": { - "tag": "ae2:interface" - }, - "a": { - "item": "ae2:crafting_accelerator" - }, - "p": { - "item": "ae2:engineering_processor" - }, - "c": { - "tag": "c:ingots/copper" - }, - "s": { - "item": "minecraft:amethyst_shard" - } + "e": "#c:ingots/iron", + "i": "#ae2:interface", + "a": "ae2:crafting_accelerator", + "p": "ae2:engineering_processor", + "c": "#c:ingots/copper", + "s": "minecraft:amethyst_shard" }, "result": { "id": "merequester:requester" diff --git a/src/main/resources/data/merequester/recipe/requester_terminal.json b/src/main/resources/data/merequester/recipe/requester_terminal.json index 414b1e5..c90fdb9 100644 --- a/src/main/resources/data/merequester/recipe/requester_terminal.json +++ b/src/main/resources/data/merequester/recipe/requester_terminal.json @@ -1,15 +1,9 @@ { "type": "minecraft:crafting_shapeless", "ingredients": [ - { - "tag": "ae2:illuminated_panel" - }, - { - "item": "ae2:logic_processor" - }, - { - "item": "merequester:requester" - } + "#ae2:illuminated_panel", + "ae2:logic_processor", + "merequester:requester" ], "result": { "id": "merequester:requester_terminal" diff --git a/src/main/resources/data/merequester/recipe/wireless/combine_access.json b/src/main/resources/data/merequester/recipe/wireless/combine_access.json index 4a70d44..ce9b4ea 100644 --- a/src/main/resources/data/merequester/recipe/wireless/combine_access.json +++ b/src/main/resources/data/merequester/recipe/wireless/combine_access.json @@ -6,12 +6,8 @@ } ], "type": "ae2wtlib:combine", - "terminalA": { - "item": "merequester:wireless_requester_terminal" - }, - "terminalB": { - "item": "ae2wtlib:wireless_pattern_access_terminal" - }, + "terminalA": "merequester:wireless_requester_terminal", + "terminalB": "ae2wtlib:wireless_pattern_access_terminal", "terminalAName": "requester", "terminalBName": "pattern_access" } \ No newline at end of file diff --git a/src/main/resources/data/merequester/recipe/wireless/combine_crafting.json b/src/main/resources/data/merequester/recipe/wireless/combine_crafting.json index e004086..80a4a5d 100644 --- a/src/main/resources/data/merequester/recipe/wireless/combine_crafting.json +++ b/src/main/resources/data/merequester/recipe/wireless/combine_crafting.json @@ -6,12 +6,8 @@ } ], "type": "ae2wtlib:combine", - "terminalA": { - "item": "merequester:wireless_requester_terminal" - }, - "terminalB": { - "item": "ae2:wireless_crafting_terminal" - }, + "terminalA": "merequester:wireless_requester_terminal", + "terminalB": "ae2:wireless_crafting_terminal", "terminalAName": "requester", "terminalBName": "crafting" } \ No newline at end of file diff --git a/src/main/resources/data/merequester/recipe/wireless/combine_encoding.json b/src/main/resources/data/merequester/recipe/wireless/combine_encoding.json index b4b3344..7637ab9 100644 --- a/src/main/resources/data/merequester/recipe/wireless/combine_encoding.json +++ b/src/main/resources/data/merequester/recipe/wireless/combine_encoding.json @@ -6,12 +6,8 @@ } ], "type": "ae2wtlib:combine", - "terminalA": { - "item": "merequester:wireless_requester_terminal" - }, - "terminalB": { - "item": "ae2wtlib:wireless_pattern_encoding_terminal" - }, + "terminalA": "merequester:wireless_requester_terminal", + "terminalB": "ae2wtlib:wireless_pattern_encoding_terminal", "terminalAName": "requester", "terminalBName": "pattern_encoding" } \ No newline at end of file diff --git a/src/main/resources/data/merequester/recipe/wireless/upgrade_requester.json b/src/main/resources/data/merequester/recipe/wireless/upgrade_requester.json index 66906bd..8cbead8 100644 --- a/src/main/resources/data/merequester/recipe/wireless/upgrade_requester.json +++ b/src/main/resources/data/merequester/recipe/wireless/upgrade_requester.json @@ -6,8 +6,6 @@ } ], "type": "ae2wtlib:upgrade", - "terminal": { - "item": "merequester:wireless_requester_terminal" - }, + "terminal": "merequester:wireless_requester_terminal", "terminalName": "requester" } \ No newline at end of file diff --git a/src/main/resources/data/merequester/recipe/wireless/wireless_requester_terminal.json b/src/main/resources/data/merequester/recipe/wireless/wireless_requester_terminal.json index 4b92915..08d2e8c 100644 --- a/src/main/resources/data/merequester/recipe/wireless/wireless_requester_terminal.json +++ b/src/main/resources/data/merequester/recipe/wireless/wireless_requester_terminal.json @@ -6,21 +6,16 @@ } ], "type": "minecraft:crafting_shaped", + "category": "misc", "pattern": [ "a", "b", "c" ], "key": { - "a": { - "item": "ae2:wireless_receiver" - }, - "b": { - "item": "merequester:requester_terminal" - }, - "c": { - "item": "ae2:dense_energy_cell" - } + "a": "ae2:wireless_receiver", + "b": "merequester:requester_terminal", + "c": "ae2:dense_energy_cell" }, "result": { "id": "merequester:wireless_requester_terminal" diff --git a/src/main/resources/merequester.mixins.json b/src/main/resources/merequester.mixins.json index e3773d9..6c8e84f 100644 --- a/src/main/resources/merequester.mixins.json +++ b/src/main/resources/merequester.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8.5", "package": "com.almostreliable.merequester.mixin", - "compatibilityLevel": "JAVA_21", + "compatibilityLevel": "JAVA_25", "client": [ "accessors.EditBoxMixin", "accessors.SlotMixin",