Implement Screen and Container registration helpers
This commit is contained in:
@@ -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<FriendlyByteBuf> initialData);
|
||||
|
||||
public <T extends AbstractContainerMenu> MenuType<T> createMenuType(TriFunction<Integer, Inventory, FriendlyByteBuf, T> constructor);
|
||||
|
||||
/* FABRIC ONLY */
|
||||
public void registerClientReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory);
|
||||
public void registerServerReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory);
|
||||
|
@@ -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<FriendlyByteBuf> 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 <T extends AbstractContainerMenu> MenuType<T> createMenuType(TriFunction<Integer, Inventory, FriendlyByteBuf, T> constructor) {
|
||||
return new ExtendedScreenHandlerType<>(constructor::apply);
|
||||
}
|
||||
}
|
||||
|
@@ -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<FriendlyByteBuf, CraterPacket<?>> factory) {
|
||||
// UNUSED
|
||||
}
|
||||
|
||||
@Override
|
||||
public void openMenu(ServerPlayer player, MenuProvider menu, @Nullable Consumer<FriendlyByteBuf> initialData) {
|
||||
if (initialData != null) {
|
||||
NetworkHooks.openScreen(player, menu, initialData);
|
||||
} else {
|
||||
NetworkHooks.openScreen(player, menu, player.getOnPos());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends AbstractContainerMenu> MenuType<T> createMenuType(TriFunction<Integer, Inventory, FriendlyByteBuf, T> constructor) {
|
||||
return IForgeMenuType.create(constructor::apply);
|
||||
}
|
||||
}
|
||||
|
@@ -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<SimpleInventory> inventory = capProvider.getForgeCapability(ForgeCapability.ITEM, side);
|
||||
if (inventory.isPresent()) {
|
||||
return LazyOptional.of(() -> new SidedInvWrapper(new ForgeInventoryWrapper(inventory.get()), side)).cast();
|
||||
}
|
||||
}
|
||||
|
||||
return LazyOptional.empty();
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user