Update To New Screen Handler API
All checks were successful
Twine/pipeline/head This commit looks good
All checks were successful
Twine/pipeline/head This commit looks good
This commit is contained in:
parent
e4b4ee0765
commit
4d14fe7487
@ -7,16 +7,17 @@ import com.thebrokenrail.twine.block.GlowingObsidianBlock;
|
||||
import com.thebrokenrail.twine.item.BackpackItem;
|
||||
import com.thebrokenrail.twine.item.DivinerItem;
|
||||
import com.thebrokenrail.twine.mixin.CriteriaHook;
|
||||
import com.thebrokenrail.twine.util.BackpackScreenHandler;
|
||||
import net.fabricmc.api.ModInitializer;
|
||||
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder;
|
||||
import net.fabricmc.fabric.api.container.ContainerProviderRegistry;
|
||||
import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry;
|
||||
import net.fabricmc.fabric.api.tag.TagRegistry;
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.item.*;
|
||||
import net.minecraft.screen.GenericContainerScreenHandler;
|
||||
import net.minecraft.screen.ScreenHandler;
|
||||
import net.minecraft.screen.ScreenHandlerType;
|
||||
import net.minecraft.tag.Tag;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.registry.Registry;
|
||||
|
||||
@ -29,7 +30,7 @@ public class Twine implements ModInitializer {
|
||||
|
||||
public static final ItemGroup ITEM_GROUP = FabricItemGroupBuilder.build(new Identifier(NAMESPACE, "item_group"), () -> new ItemStack(GLOWING_OBSIDIAN));
|
||||
|
||||
public static final Identifier BACKPACK_SCREEN = new Identifier(NAMESPACE, "backpack");
|
||||
private static final Identifier BACKPACK_SCREEN = new Identifier(NAMESPACE, "backpack");
|
||||
public static final Item SMALL_BACKPACK = new BackpackItem(false);
|
||||
public static final Item LARGE_BACKPACK = new BackpackItem(true);
|
||||
|
||||
@ -40,18 +41,15 @@ public class Twine implements ModInitializer {
|
||||
public static final int STAGE_COUNT = 6;
|
||||
public static final int STAGE_TIME = 24000;
|
||||
|
||||
public static ScreenHandlerType<? extends GenericContainerScreenHandler> BACKPACK_SCREEN_TYPE;
|
||||
|
||||
public static ChestBoatCriterion CHEST_BOAT_CRITERION = CriteriaHook.callRegister(new ChestBoatCriterion());
|
||||
public static EnderChestBoatCriterion ENDER_CHEST_BOAT_CRITERION = CriteriaHook.callRegister(new EnderChestBoatCriterion());
|
||||
|
||||
@Override
|
||||
public void onInitialize() {
|
||||
ContainerProviderRegistry.INSTANCE.registerFactory(BACKPACK_SCREEN, (i, identifier, playerEntity, buf) -> {
|
||||
boolean large = buf.readBoolean();
|
||||
Hand hand = buf.readEnumConstant(Hand.class);
|
||||
int rows = large ? 6 : 3;
|
||||
ItemStack stack = playerEntity.getStackInHand(hand);
|
||||
return new GenericContainerScreenHandler(ScreenHandlerType.STONECUTTER, i, playerEntity.inventory, new BackpackItem.ItemInventory(9 * rows, stack, hand), rows);
|
||||
});
|
||||
BACKPACK_SCREEN_TYPE = ScreenHandlerRegistry.registerExtended(BACKPACK_SCREEN, BackpackScreenHandler::new);
|
||||
|
||||
Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "small_backpack"), SMALL_BACKPACK);
|
||||
Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "large_backpack"), LARGE_BACKPACK);
|
||||
|
||||
|
@ -1,27 +1,19 @@
|
||||
package com.thebrokenrail.twine.client;
|
||||
|
||||
import com.thebrokenrail.twine.Twine;
|
||||
import com.thebrokenrail.twine.item.BackpackItem;
|
||||
import net.fabricmc.api.ClientModInitializer;
|
||||
import net.fabricmc.api.EnvType;
|
||||
import net.fabricmc.api.Environment;
|
||||
import net.fabricmc.fabric.api.client.rendering.v1.ColorProviderRegistry;
|
||||
import net.fabricmc.fabric.api.client.screen.ScreenProviderRegistry;
|
||||
import net.minecraft.client.MinecraftClient;
|
||||
import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry;
|
||||
import net.minecraft.client.gui.screen.ingame.GenericContainerScreen;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.DyeableItem;
|
||||
import net.minecraft.screen.GenericContainerScreenHandler;
|
||||
|
||||
@Environment(EnvType.CLIENT)
|
||||
public class TwineClient implements ClientModInitializer {
|
||||
@Override
|
||||
public void onInitializeClient() {
|
||||
ScreenProviderRegistry.INSTANCE.registerFactory(Twine.BACKPACK_SCREEN, screenHandler -> {
|
||||
PlayerEntity player = MinecraftClient.getInstance().player;
|
||||
assert player != null;
|
||||
return new GenericContainerScreen((GenericContainerScreenHandler) screenHandler, player.inventory, ((BackpackItem.ItemInventory) ((GenericContainerScreenHandler) screenHandler).getInventory()).getHolder().getName());
|
||||
});
|
||||
ScreenRegistry.register(Twine.BACKPACK_SCREEN_TYPE, GenericContainerScreen::new);
|
||||
ColorProviderRegistry.ITEM.register((stack, tintIndex) -> tintIndex > 0 ? -1 : ((DyeableItem) stack.getItem()).getColor(stack), Twine.SMALL_BACKPACK, Twine.LARGE_BACKPACK);
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,19 @@
|
||||
package com.thebrokenrail.twine.item;
|
||||
|
||||
import com.thebrokenrail.twine.Twine;
|
||||
import net.fabricmc.fabric.api.container.ContainerProviderRegistry;
|
||||
import com.thebrokenrail.twine.util.BackpackScreenHandler;
|
||||
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.inventory.Inventories;
|
||||
import net.minecraft.inventory.Inventory;
|
||||
import net.minecraft.item.DyeableItem;
|
||||
import net.minecraft.item.Item;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.screen.ScreenHandler;
|
||||
import net.minecraft.server.network.ServerPlayerEntity;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.ActionResult;
|
||||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.TypedActionResult;
|
||||
@ -21,17 +27,13 @@ public class BackpackItem extends Item implements DyeableItem {
|
||||
private final Hand hand;
|
||||
private final DefaultedList<ItemStack> inv;
|
||||
|
||||
public ItemInventory(int size, ItemStack stack, Hand hand) {
|
||||
public ItemInventory(int size, PlayerEntity player, Hand hand) {
|
||||
this.size = size;
|
||||
this.stack = stack;
|
||||
this.stack = player.getStackInHand(hand);
|
||||
this.hand = hand;
|
||||
inv = getInv();
|
||||
}
|
||||
|
||||
public ItemStack getHolder() {
|
||||
return stack;
|
||||
}
|
||||
|
||||
private DefaultedList<ItemStack> getInv() {
|
||||
DefaultedList<ItemStack> list = DefaultedList.ofSize(size, ItemStack.EMPTY);
|
||||
Inventories.fromTag(stack.getOrCreateTag(), list);
|
||||
@ -107,9 +109,22 @@ public class BackpackItem extends Item implements DyeableItem {
|
||||
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
|
||||
ItemStack stack = user.getStackInHand(hand);
|
||||
if (!world.isClient()) {
|
||||
ContainerProviderRegistry.INSTANCE.openContainer(Twine.BACKPACK_SCREEN, user, buf -> {
|
||||
user.openHandledScreen(new ExtendedScreenHandlerFactory() {
|
||||
@Override
|
||||
public void writeScreenOpeningData(ServerPlayerEntity serverPlayerEntity, PacketByteBuf buf) {
|
||||
buf.writeBoolean(large);
|
||||
buf.writeEnumConstant(hand);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Text getDisplayName() {
|
||||
return stack.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ScreenHandler createMenu(int syncId, PlayerInventory inv, PlayerEntity player) {
|
||||
return new BackpackScreenHandler(syncId, inv, large, hand);
|
||||
}
|
||||
});
|
||||
}
|
||||
return new TypedActionResult<>(ActionResult.CONSUME, stack);
|
||||
|
@ -0,0 +1,24 @@
|
||||
package com.thebrokenrail.twine.util;
|
||||
|
||||
import com.thebrokenrail.twine.Twine;
|
||||
import com.thebrokenrail.twine.item.BackpackItem;
|
||||
import net.minecraft.entity.player.PlayerInventory;
|
||||
import net.minecraft.inventory.Inventory;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.screen.GenericContainerScreenHandler;
|
||||
import net.minecraft.screen.ScreenHandlerType;
|
||||
import net.minecraft.util.Hand;
|
||||
|
||||
public class BackpackScreenHandler extends GenericContainerScreenHandler {
|
||||
public BackpackScreenHandler(int i, PlayerInventory playerInventory, PacketByteBuf buf) {
|
||||
this(i, playerInventory, buf.readBoolean(), buf.readEnumConstant(Hand.class));
|
||||
}
|
||||
|
||||
public BackpackScreenHandler(int i, PlayerInventory playerInventory, boolean large, Hand hand) {
|
||||
this(Twine.BACKPACK_SCREEN_TYPE, i, playerInventory, new BackpackItem.ItemInventory(9 * (large ? 6 : 3), playerInventory.player, hand));
|
||||
}
|
||||
|
||||
public BackpackScreenHandler(ScreenHandlerType<?> type, int syncId, PlayerInventory playerInventory, Inventory inventory) {
|
||||
super(type, syncId, playerInventory, inventory, inventory.size() / 9);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user