tutorial:extendedscreenhandler
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revisionNext revisionBoth sides next revision | ||
tutorial:extendedscreenhandler [2020/08/14 16:13] – created manymoney2 | tutorial:extendedscreenhandler [2020/08/14 16:38] – [Registering our ScreenHandler] manymoney2 | ||
---|---|---|---|
Line 9: | Line 9: | ||
====== BlockEntity ====== | ====== BlockEntity ====== | ||
As the Block class does not need to be changed at all we leave it out here. | As the Block class does not need to be changed at all we leave it out here. | ||
+ | |||
+ | Our blockEntity now implements ExtendedScreenHandlerFactory, | ||
<code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
Line 57: | Line 59: | ||
</ | </ | ||
+ | |||
+ | ====== Our new ExtendedScreenHandler ====== | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public class BoxScreenHandler extends ScreenHandler { | ||
+ | //We save the blockPos we got from the Server and provide a getter for it so the BoxScreen can read that information | ||
+ | private BlockPos pos; | ||
+ | private final Inventory inventory; | ||
+ | |||
+ | //This constructor gets called on the client when the server wants it to open the screenHandler, | ||
+ | //The client will call the super constructor with an empty Inventory and the screenHandler will automatically | ||
+ | //sync this empty inventory with the inventory on the server | ||
+ | |||
+ | //NEW: The constructor of the client now gets the PacketByteBuf we filled in the BlockEntity | ||
+ | public BoxScreenHandler(int syncId, PlayerInventory playerInventory, | ||
+ | this(syncId, | ||
+ | pos = buf.readBlockPos(); | ||
+ | } | ||
+ | |||
+ | //This constructor gets called from the BlockEntity on the server, the server knows the inventory of the container | ||
+ | //and can therefore directly provide it as an argument. This inventory will then be synced to the Client | ||
+ | public BoxScreenHandler(int syncId, PlayerInventory playerInventory, | ||
+ | //[...] | ||
+ | // See first Screenhandler Tutorial for the rest of the code | ||
+ | | ||
+ | //Why do we use BlockPos.ORIGIN here? | ||
+ | //This is because the packetByteBuf with our blockPosition is only availible on the Client, so we need a placeholder | ||
+ | //value here. This is not a problem however, as the Server version of the ScreenHandler does not really need this | ||
+ | // | ||
+ | pos = BlockPos.ORIGIN; | ||
+ | |||
+ | [...] | ||
+ | } | ||
+ | |||
+ | //this getter will be used by our Screen class | ||
+ | public BlockPos getPos() { | ||
+ | return pos; | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public boolean canUse(PlayerEntity player) { | ||
+ | return this.inventory.canPlayerUse(player); | ||
+ | } | ||
+ | |||
+ | // See Screenhandler Tutorial | ||
+ | // Shift + Player Inv Slot | ||
+ | @Override | ||
+ | public ItemStack transferSlot(PlayerEntity player, int invSlot); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== Using the Information of the ExtendedScreenHandler in our Screen ====== | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | |||
+ | public class BoxScreen extends HandledScreen< | ||
+ | private static final Identifier TEXTURE = new Identifier(" | ||
+ | |||
+ | public BoxScreen(ScreenHandler handler, PlayerInventory inventory, Text title) { | ||
+ | super(handler, | ||
+ | //We try to get the block position to use it as our title, if that fails for some reason we will use the default title | ||
+ | } | ||
+ | |||
+ | //This method will try to get the Position from the ScreenHandler, | ||
+ | //get the ScreenHandler instance here which has the correct BlockPos in it! | ||
+ | private static Optional< | ||
+ | if (handler instanceof BoxScreenHandler) { | ||
+ | BlockPos pos = ((BoxScreenHandler) handler).getPos(); | ||
+ | return pos != null ? Optional.of(new LiteralText(" | ||
+ | } else { | ||
+ | return Optional.empty(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | |||
+ | @Override | ||
+ | protected void drawBackground(MatrixStack matrices, float delta, int mouseX, int mouseY) { [...] } | ||
+ | |||
+ | @Override | ||
+ | public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { [...] } | ||
+ | |||
+ | @Override | ||
+ | protected void init() { [...] } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ====== Registering our ScreenHandler ====== | ||
+ | |||
+ | <code java [enable_line_numbers=" | ||
+ | public class ExampleMod implements ModInitializer { | ||
+ | |||
+ | [...] | ||
+ | public static final ScreenHandlerType< | ||
+ | |||
+ | static { | ||
+ | [...] | ||
+ | |||
+ | //we now use registerExtended as our screenHandler now accepts a packetByteBuf in its Constructor | ||
+ | BOX_SCREEN_HANDLER = ScreenHandlerRegistry.registerExtended(BOX, | ||
+ | } | ||
+ | |||
+ | @Override | ||
+ | public void onInitialize() { | ||
+ | |||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ====== Result ====== | ||
+ | You have now seen how to transfer data when the ScreenHandler is opened. In the image you can see the result: The Blocks title is now the block position. Do note that this is just a demonstration, | ||
+ | Setting the position as the title would be possible alot easier. | ||
+ | |||
+ | {{: | ||
+ | |||
+ |
tutorial/extendedscreenhandler.txt · Last modified: 2022/12/17 15:38 by miir