Skip to content

Commit bf6a8d5

Browse files
committed
block entity screen
1 parent d677a5a commit bf6a8d5

File tree

8 files changed

+162
-1
lines changed

8 files changed

+162
-1
lines changed

src/main/java/net/kaupenjoe/tutorialmod/TutorialMod.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import net.kaupenjoe.tutorialmod.item.ModItems;
2020
import net.kaupenjoe.tutorialmod.particle.ModParticles;
2121
import net.kaupenjoe.tutorialmod.potion.ModPotions;
22+
import net.kaupenjoe.tutorialmod.screen.ModScreenHandlers;
2223
import net.kaupenjoe.tutorialmod.sound.ModSounds;
2324
import net.kaupenjoe.tutorialmod.util.HammerUsageEvent;
2425
import net.kaupenjoe.tutorialmod.util.ModLootTableModifiers;
@@ -66,6 +67,7 @@ public void onInitialize() {
6667
ModLootTableModifiers.modifyLootTables();
6768

6869
ModBlockEntities.registerBlockEntities();
70+
ModScreenHandlers.registerScreenHandlers();
6971

7072
FuelRegistry.INSTANCE.add(ModItems.STARLIGHT_ASHES, 600);
7173

src/main/java/net/kaupenjoe/tutorialmod/TutorialModClient.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
import net.kaupenjoe.tutorialmod.entity.client.*;
1313
import net.kaupenjoe.tutorialmod.particle.ModParticles;
1414
import net.kaupenjoe.tutorialmod.particle.PinkGarnetParticle;
15+
import net.kaupenjoe.tutorialmod.screen.ModScreenHandlers;
16+
import net.kaupenjoe.tutorialmod.screen.custom.PedestalScreen;
1517
import net.kaupenjoe.tutorialmod.util.ModModelPredicates;
18+
import net.minecraft.client.gui.screen.ingame.HandledScreen;
19+
import net.minecraft.client.gui.screen.ingame.HandledScreens;
1620
import net.minecraft.client.render.RenderLayer;
1721
import net.minecraft.client.render.block.entity.BlockEntityRendererFactories;
1822
import net.minecraft.client.render.block.entity.BlockEntityRendererFactory;
@@ -41,5 +45,6 @@ public void onInitializeClient() {
4145
ParticleFactoryRegistry.getInstance().register(ModParticles.PINK_GARNET_PARTICLE, PinkGarnetParticle.Factory::new);
4246

4347
BlockEntityRendererFactories.register(ModBlockEntities.PEDESTAL_BE, PedestalBlockEntityRenderer::new);
48+
HandledScreens.register(ModScreenHandlers.PEDESTAL_SCREEN_HANDLER, PedestalScreen::new);
4449
}
4550
}

src/main/java/net/kaupenjoe/tutorialmod/block/custom/PedestalBlock.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ protected ItemActionResult onUseWithItem(ItemStack stack, BlockState state, Worl
7979

8080
pedestalBlockEntity.markDirty();
8181
world.updateListeners(pos, state, state, 0);
82+
} else if(player.isSneaking() && !world.isClient()) {
83+
player.openHandledScreen(pedestalBlockEntity);
8284
}
8385
}
8486

src/main/java/net/kaupenjoe/tutorialmod/block/entity/custom/PedestalBlockEntity.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,28 @@
11
package net.kaupenjoe.tutorialmod.block.entity.custom;
22

3+
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory;
34
import net.kaupenjoe.tutorialmod.block.entity.ImplementedInventory;
45
import net.kaupenjoe.tutorialmod.block.entity.ModBlockEntities;
6+
import net.kaupenjoe.tutorialmod.screen.custom.PedestalScreenHandler;
57
import net.minecraft.block.BlockState;
68
import net.minecraft.block.entity.BlockEntity;
9+
import net.minecraft.entity.player.PlayerEntity;
10+
import net.minecraft.entity.player.PlayerInventory;
711
import net.minecraft.inventory.Inventories;
812
import net.minecraft.item.ItemStack;
913
import net.minecraft.nbt.NbtCompound;
1014
import net.minecraft.network.listener.ClientPlayPacketListener;
1115
import net.minecraft.network.packet.Packet;
1216
import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket;
1317
import net.minecraft.registry.RegistryWrapper;
18+
import net.minecraft.screen.ScreenHandler;
19+
import net.minecraft.server.network.ServerPlayerEntity;
20+
import net.minecraft.text.Text;
1421
import net.minecraft.util.collection.DefaultedList;
1522
import net.minecraft.util.math.BlockPos;
1623
import org.jetbrains.annotations.Nullable;
1724

18-
public class PedestalBlockEntity extends BlockEntity implements ImplementedInventory {
25+
public class PedestalBlockEntity extends BlockEntity implements ImplementedInventory, ExtendedScreenHandlerFactory<BlockPos> {
1926
private final DefaultedList<ItemStack> inventory = DefaultedList.ofSize(1, ItemStack.EMPTY);
2027
private float rotation = 0;
2128

@@ -48,6 +55,23 @@ protected void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLo
4855
Inventories.readNbt(nbt, inventory, registryLookup);
4956
}
5057

58+
@Override
59+
public BlockPos getScreenOpeningData(ServerPlayerEntity player) {
60+
return this.pos;
61+
}
62+
63+
@Override
64+
public Text getDisplayName() {
65+
return Text.literal("Pedestal");
66+
}
67+
68+
@Nullable
69+
@Override
70+
public ScreenHandler createMenu(int syncId, PlayerInventory playerInventory, PlayerEntity player) {
71+
return new PedestalScreenHandler(syncId, playerInventory, this.pos);
72+
}
73+
74+
5175
@Nullable
5276
@Override
5377
public Packet<ClientPlayPacketListener> toUpdatePacket() {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package net.kaupenjoe.tutorialmod.screen;
2+
3+
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerType;
4+
import net.kaupenjoe.tutorialmod.TutorialMod;
5+
import net.kaupenjoe.tutorialmod.screen.custom.PedestalScreenHandler;
6+
import net.minecraft.registry.Registries;
7+
import net.minecraft.registry.Registry;
8+
import net.minecraft.screen.ScreenHandlerType;
9+
import net.minecraft.util.Identifier;
10+
import net.minecraft.util.math.BlockPos;
11+
12+
public class ModScreenHandlers {
13+
public static final ScreenHandlerType<PedestalScreenHandler> PEDESTAL_SCREEN_HANDLER =
14+
Registry.register(Registries.SCREEN_HANDLER, Identifier.of(TutorialMod.MOD_ID, "pedestal_screen_handler"),
15+
new ExtendedScreenHandlerType<>(PedestalScreenHandler::new, BlockPos.PACKET_CODEC));
16+
17+
public static void registerScreenHandlers() {
18+
TutorialMod.LOGGER.info("Registering Screen Handlers for " + TutorialMod.MOD_ID);
19+
}
20+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package net.kaupenjoe.tutorialmod.screen.custom;
2+
3+
import com.mojang.blaze3d.systems.RenderSystem;
4+
import net.kaupenjoe.tutorialmod.TutorialMod;
5+
import net.minecraft.client.gui.DrawContext;
6+
import net.minecraft.client.gui.screen.ingame.HandledScreen;
7+
import net.minecraft.client.render.GameRenderer;
8+
import net.minecraft.entity.player.PlayerInventory;
9+
import net.minecraft.text.Text;
10+
import net.minecraft.util.Identifier;
11+
12+
public class PedestalScreen extends HandledScreen<PedestalScreenHandler> {
13+
public static final Identifier GUI_TEXTURE =
14+
Identifier.of(TutorialMod.MOD_ID, "textures/gui/pedestal/pedestal_gui.png");
15+
16+
public PedestalScreen(PedestalScreenHandler handler, PlayerInventory inventory, Text title) {
17+
super(handler, inventory, title);
18+
}
19+
20+
@Override
21+
protected void drawBackground(DrawContext context, float delta, int mouseX, int mouseY) {
22+
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
23+
RenderSystem.setShaderColor(1f, 1f, 1f, 1f);
24+
RenderSystem.setShaderTexture(0, GUI_TEXTURE);
25+
26+
int x = (width - backgroundWidth) / 2;
27+
int y = (height - backgroundHeight) / 2;
28+
29+
context.drawTexture(GUI_TEXTURE, x, y, 0, 0, backgroundWidth, backgroundHeight);
30+
}
31+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
package net.kaupenjoe.tutorialmod.screen.custom;
2+
3+
import net.kaupenjoe.tutorialmod.screen.ModScreenHandlers;
4+
import net.minecraft.block.entity.BlockEntity;
5+
import net.minecraft.entity.player.PlayerEntity;
6+
import net.minecraft.entity.player.PlayerInventory;
7+
import net.minecraft.inventory.Inventory;
8+
import net.minecraft.item.ItemStack;
9+
import net.minecraft.screen.ScreenHandler;
10+
import net.minecraft.screen.slot.Slot;
11+
import net.minecraft.util.math.BlockPos;
12+
13+
public class PedestalScreenHandler extends ScreenHandler {
14+
private final Inventory inventory;
15+
16+
public PedestalScreenHandler(int syncId, PlayerInventory playerInventory, BlockPos pos) {
17+
this(syncId, playerInventory, playerInventory.player.getWorld().getBlockEntity(pos));
18+
}
19+
20+
public PedestalScreenHandler(int syncId, PlayerInventory playerInventory, BlockEntity blockEntity) {
21+
super(ModScreenHandlers.PEDESTAL_SCREEN_HANDLER, syncId);
22+
this.inventory = ((Inventory) blockEntity);
23+
24+
this.addSlot(new Slot(inventory, 0, 80, 35) {
25+
@Override
26+
public int getMaxItemCount() {
27+
return 1;
28+
}
29+
});
30+
31+
addPlayerInventory(playerInventory);
32+
addPlayerHotbar(playerInventory);
33+
}
34+
35+
@Override
36+
public ItemStack quickMove(PlayerEntity player, int invSlot) {
37+
ItemStack newStack = ItemStack.EMPTY;
38+
Slot slot = this.slots.get(invSlot);
39+
if (slot != null && slot.hasStack()) {
40+
ItemStack originalStack = slot.getStack();
41+
newStack = originalStack.copy();
42+
if (invSlot < this.inventory.size()) {
43+
if (!this.insertItem(originalStack, this.inventory.size(), this.slots.size(), true)) {
44+
return ItemStack.EMPTY;
45+
}
46+
} else if (!this.insertItem(originalStack, 0, this.inventory.size(), false)) {
47+
return ItemStack.EMPTY;
48+
}
49+
50+
if (originalStack.isEmpty()) {
51+
slot.setStack(ItemStack.EMPTY);
52+
} else {
53+
slot.markDirty();
54+
}
55+
}
56+
return newStack;
57+
}
58+
59+
@Override
60+
public boolean canUse(PlayerEntity player) {
61+
return this.inventory.canPlayerUse(player);
62+
}
63+
64+
private void addPlayerInventory(PlayerInventory playerInventory) {
65+
for (int i = 0; i < 3; ++i) {
66+
for (int l = 0; l < 9; ++l) {
67+
this.addSlot(new Slot(playerInventory, l + i * 9 + 9, 8 + l * 18, 84 + i * 18));
68+
}
69+
}
70+
}
71+
72+
private void addPlayerHotbar(PlayerInventory playerInventory) {
73+
for (int i = 0; i < 9; ++i) {
74+
this.addSlot(new Slot(playerInventory, i, 8 + i * 18, 142));
75+
}
76+
}
77+
}
1.19 KB
Loading

0 commit comments

Comments
 (0)