diff --git a/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibCommonHelper.java b/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibCommonHelper.java index 1baf6cb..3340afd 100644 --- a/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibCommonHelper.java +++ b/Common/src/main/java/me/hypherionmc/craterlib/platform/services/LibCommonHelper.java @@ -7,9 +7,17 @@ import net.minecraft.network.Connection; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.level.Level; +import org.apache.commons.lang3.function.TriFunction; +import javax.annotation.Nullable; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -30,6 +38,10 @@ public interface LibCommonHelper { public MinecraftServer getMCServer(); + public void openMenu(ServerPlayer player, MenuProvider menu, @Nullable Consumer initialData); + + public MenuType createMenuType(TriFunction constructor); + /* FABRIC ONLY */ public void registerClientReceiver(ResourceLocation channelName, Function> factory); public void registerServerReceiver(ResourceLocation channelName, Function> factory); diff --git a/Fabric/src/main/java/me/hypherionmc/craterlib/common/FabricCommonHelper.java b/Fabric/src/main/java/me/hypherionmc/craterlib/common/FabricCommonHelper.java index 7e90bc3..8bf0d99 100644 --- a/Fabric/src/main/java/me/hypherionmc/craterlib/common/FabricCommonHelper.java +++ b/Fabric/src/main/java/me/hypherionmc/craterlib/common/FabricCommonHelper.java @@ -7,17 +7,27 @@ import me.hypherionmc.craterlib.platform.services.LibCommonHelper; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; import net.fabricmc.fabric.api.networking.v1.PacketSender; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory; +import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.Connection; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.network.ServerGamePacketListenerImpl; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.level.Level; +import org.apache.commons.lang3.function.TriFunction; +import org.jetbrains.annotations.Nullable; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -73,4 +83,32 @@ public class FabricCommonHelper implements LibCommonHelper { server.execute(() -> packet.handle(player, server)); }); } + + @Override + public void openMenu(ServerPlayer player, MenuProvider menu, Consumer initialData) { + ExtendedScreenHandlerFactory factory = new ExtendedScreenHandlerFactory() { + @Override + public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { + initialData.accept(buf); + } + + @Override + public Component getDisplayName() { + return menu.getDisplayName(); + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int i, Inventory inventory, Player player) { + return menu.createMenu(i, inventory, player); + } + }; + + player.openMenu(factory); + } + + @Override + public MenuType createMenuType(TriFunction constructor) { + return new ExtendedScreenHandlerType<>(constructor::apply); + } } diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/common/ForgeCommonHelper.java b/Forge/src/main/java/me/hypherionmc/craterlib/common/ForgeCommonHelper.java index 8a3fc8e..35c0e4f 100644 --- a/Forge/src/main/java/me/hypherionmc/craterlib/common/ForgeCommonHelper.java +++ b/Forge/src/main/java/me/hypherionmc/craterlib/common/ForgeCommonHelper.java @@ -9,11 +9,21 @@ import net.minecraft.network.Connection; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.MenuType; import net.minecraft.world.level.Level; +import net.minecraftforge.common.extensions.IForgeMenuType; +import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.server.ServerLifecycleHooks; +import org.apache.commons.lang3.function.TriFunction; +import org.jetbrains.annotations.Nullable; import java.util.Objects; +import java.util.function.Consumer; import java.util.function.Function; /** @@ -62,4 +72,18 @@ public class ForgeCommonHelper implements LibCommonHelper { public void registerServerReceiver(ResourceLocation channelName, Function> factory) { // UNUSED } + + @Override + public void openMenu(ServerPlayer player, MenuProvider menu, @Nullable Consumer initialData) { + if (initialData != null) { + NetworkHooks.openScreen(player, menu, initialData); + } else { + NetworkHooks.openScreen(player, menu, player.getOnPos()); + } + } + + @Override + public MenuType createMenuType(TriFunction constructor) { + return IForgeMenuType.create(constructor::apply); + } } diff --git a/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java b/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java index ccdf7c7..1f2a968 100644 --- a/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java +++ b/Forge/src/main/java/me/hypherionmc/craterlib/mixin/BlockEntityMixin.java @@ -3,13 +3,16 @@ package me.hypherionmc.craterlib.mixin; import me.hypherionmc.craterlib.api.blockentities.caps.ForgeCapability; import me.hypherionmc.craterlib.api.blockentities.caps.IForgeCapProvider; import me.hypherionmc.craterlib.common.blockentity.CraterBlockEntity; +import me.hypherionmc.craterlib.systems.SimpleInventory; import me.hypherionmc.craterlib.systems.energy.CustomEnergyStorage; import me.hypherionmc.craterlib.systems.energy.ForgeEnergyWrapper; +import me.hypherionmc.craterlib.systems.inventory.ForgeInventoryWrapper; import net.minecraft.core.Direction; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.wrapper.SidedInvWrapper; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; @@ -34,6 +37,13 @@ public class BlockEntityMixin implements ICapabilityProvider { } } + if (cap == ForgeCapabilities.ITEM_HANDLER) { + Optional inventory = capProvider.getForgeCapability(ForgeCapability.ITEM, side); + if (inventory.isPresent()) { + return LazyOptional.of(() -> new SidedInvWrapper(new ForgeInventoryWrapper(inventory.get()), side)).cast(); + } + } + return LazyOptional.empty(); } } diff --git a/README.md b/README.md index 18da2f1..23f2b43 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ A library mod used by HypherionSA's mods. Mostly used by Hyper Lighting 2. * Cross Mod-Loader Events * Cross Mod-Loader Config Screens (Based on [Cloth Config Lite](https://github.com/shedaniel/cloth-config-lite)) * Automatic ModMenu and Forge Config screen registration -* TODO: Built in Cross Mod-Loader Network system +* Built in Cross Mod-Loader Network system * TODO: Various GUI widgets and Utilities * TODO: Cross Mod-Loader Dynamic Lighting * TODO: Texture Utils