mirror of
https://github.com/XevianLight/Aphelion.git
synced 2026-05-11 01:50:56 +01:00
108 lines
4.9 KiB
Java
108 lines
4.9 KiB
Java
package net.xevianlight.aphelion.screen;
|
|
|
|
import net.minecraft.network.FriendlyByteBuf;
|
|
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.Slot;
|
|
import net.minecraft.world.item.ItemStack;
|
|
import net.minecraft.world.level.Level;
|
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
|
import net.neoforged.neoforge.items.SlotItemHandler;
|
|
import net.xevianlight.aphelion.block.entity.custom.TestBlockEntity;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
public class TestBlockMenu extends AbstractContainerMenu {
|
|
public final TestBlockEntity blockEntity;
|
|
private final Level level;
|
|
|
|
public TestBlockMenu(int i, Inventory inventory, FriendlyByteBuf extraData) {
|
|
this(i, inventory, inventory.player.level().getBlockEntity(extraData.readBlockPos()));
|
|
}
|
|
|
|
public TestBlockMenu(int i, Inventory inventory, BlockEntity blockEntity) {
|
|
super(ModMenuTypes.TEST_BLOCK_MENU.get(), i);
|
|
this.blockEntity = ((TestBlockEntity) blockEntity);
|
|
this.level = inventory.player.level();
|
|
|
|
addPlayerInventory(inventory);
|
|
addPlayerHotbar(inventory);
|
|
|
|
this.addSlot(new SlotItemHandler(this.blockEntity.inventory, 0, 80, 35));
|
|
}
|
|
|
|
@Override
|
|
public boolean stillValid(Player player) {
|
|
return true;
|
|
}
|
|
|
|
// CREDIT GOES TO: diesieben07 | https://github.com/diesieben07/SevenCommons
|
|
// must assign a slot number to each of the slots used by the GUI.
|
|
// For this container, we can see both the tile inventory's slots as well as the player inventory slots and the hotbar.
|
|
// Each time we add a Slot to the container, it automatically increases the slotIndex, which means
|
|
// 0 - 8 = hotbar slots (which will map to the InventoryPlayer slot numbers 0 - 8)
|
|
// 9 - 35 = player inventory slots (which map to the InventoryPlayer slot numbers 9 - 35)
|
|
// 36 - 44 = TileInventory slots, which map to our TileEntity slot numbers 0 - 8)
|
|
private static final int HOTBAR_SLOT_COUNT = 9;
|
|
private static final int PLAYER_INVENTORY_ROW_COUNT = 3;
|
|
private static final int PLAYER_INVENTORY_COLUMN_COUNT = 9;
|
|
private static final int PLAYER_INVENTORY_SLOT_COUNT = PLAYER_INVENTORY_COLUMN_COUNT * PLAYER_INVENTORY_ROW_COUNT;
|
|
private static final int VANILLA_SLOT_COUNT = HOTBAR_SLOT_COUNT + PLAYER_INVENTORY_SLOT_COUNT;
|
|
private static final int VANILLA_FIRST_SLOT_INDEX = 0;
|
|
private static final int TE_INVENTORY_FIRST_SLOT_INDEX = VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT;
|
|
|
|
// THIS YOU HAVE TO DEFINE!
|
|
private static final int TE_INVENTORY_SLOT_COUNT = 1; // must be the number of slots you have!
|
|
@Override
|
|
public @NotNull ItemStack quickMoveStack(Player playerIn, int pIndex) {
|
|
Slot sourceSlot = slots.get(pIndex);
|
|
if (sourceSlot == null || !sourceSlot.hasItem()) return ItemStack.EMPTY; //EMPTY_ITEM
|
|
ItemStack sourceStack = sourceSlot.getItem();
|
|
ItemStack copyOfSourceStack = sourceStack.copy();
|
|
|
|
// Check if the slot clicked is one of the vanilla container slots
|
|
if (pIndex < VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT) {
|
|
// This is a vanilla container slot so merge the stack into the tile inventory
|
|
if (!moveItemStackTo(sourceStack, TE_INVENTORY_FIRST_SLOT_INDEX, TE_INVENTORY_FIRST_SLOT_INDEX
|
|
+ TE_INVENTORY_SLOT_COUNT, false)) {
|
|
blockEntity.sendUpdate();
|
|
return ItemStack.EMPTY; // EMPTY_ITEM
|
|
}
|
|
} else if (pIndex < TE_INVENTORY_FIRST_SLOT_INDEX + TE_INVENTORY_SLOT_COUNT) {
|
|
// This is a TE slot so merge the stack into the players inventory
|
|
if (!moveItemStackTo(sourceStack, VANILLA_FIRST_SLOT_INDEX, VANILLA_FIRST_SLOT_INDEX + VANILLA_SLOT_COUNT, false)) {
|
|
blockEntity.sendUpdate();
|
|
return ItemStack.EMPTY;
|
|
}
|
|
} else {
|
|
System.out.println("Invalid slotIndex:" + pIndex);
|
|
return ItemStack.EMPTY;
|
|
}
|
|
// If stack size == 0 (the entire stack was moved) set slot contents to null
|
|
if (sourceStack.getCount() == 0) {
|
|
sourceSlot.set(ItemStack.EMPTY);
|
|
blockEntity.sendUpdate();
|
|
} else {
|
|
blockEntity.sendUpdate();
|
|
sourceSlot.setChanged();
|
|
}
|
|
sourceSlot.onTake(playerIn, sourceStack);
|
|
blockEntity.sendUpdate();
|
|
return copyOfSourceStack;
|
|
}
|
|
|
|
private void addPlayerInventory(Inventory playerInventory) {
|
|
for (int i = 0; i < 3; ++i) {
|
|
for (int l = 0; l < 9; ++l) {
|
|
this.addSlot(new Slot(playerInventory, l + i * 9 + 9, 8 + l * 18, 84 + i * 18));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void addPlayerHotbar(Inventory playerInventory) {
|
|
for (int i = 0; i < 9; ++i) {
|
|
this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142));
|
|
}
|
|
}
|
|
}
|