User Tools

Site Tools


tutorial:extendedscreenhandler

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
tutorial:extendedscreenhandler [2020/08/14 16:20] – [Our new ExtendedScreenHandler] manymoney2tutorial:extendedscreenhandler [2020/08/14 17:42] – [Result] manymoney2
Line 62: Line 62:
 ====== Our new ExtendedScreenHandler ====== ====== Our new ExtendedScreenHandler ======
  
-<code java [enable_line_numbers="true"BoxScrenHandler.java>+<code java [enable_line_numbers="true"BoxScreenHandler.java>
 public class BoxScreenHandler extends ScreenHandler { 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     //We save the blockPos we got from the Server and provide a getter for it so the BoxScreen can read that information
Line 109: Line 109:
 } }
 </code> </code>
 +
 +====== Using the Information of the ExtendedScreenHandler in our Screen ======
 +
 +<code java [enable_line_numbers="true"] BoxScreen.java>
 +
 +public class BoxScreen extends HandledScreen<ScreenHandler> {
 +    private static final Identifier TEXTURE = new Identifier("minecraft", "textures/gui/container/dispenser.png");
 +
 +    public BoxScreen(ScreenHandler handler, PlayerInventory inventory, Text title) {
 +        super(handler, inventory, getPositionText(handler).orElse(title));
 +        //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, as ScreenRendering only happens on the client we
 +    //get the ScreenHandler instance here which has the correct BlockPos in it!
 +    private static Optional<Text> getPositionText(ScreenHandler handler) {
 +        if (handler instanceof BoxScreenHandler) {
 +            BlockPos pos = ((BoxScreenHandler) handler).getPos();
 +            return pos != null ? Optional.of(new LiteralText("(" + pos.toShortString() + ")")) : Optional.empty();
 +        } 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() { [...] }
 +}
 +
 +</code>
 +
 +====== Registering our ScreenHandler ======
 +
 +<code java [enable_line_numbers="true"] ExampleMod.java>
 +public class ExampleMod implements ModInitializer {
 +
 +    [...]
 +    public static final ScreenHandlerType<BoxScreenHandler> BOX_SCREEN_HANDLER;
 +
 +    static {
 +        [...]
 +       
 +        //we now use registerExtended as our screenHandler now accepts a packetByteBuf in its Constructor
 +        BOX_SCREEN_HANDLER = ScreenHandlerRegistry.registerExtended(BOX, BoxScreenHandler::new);
 +    }
 +
 +    @Override
 +    public void onInitialize() {
 +
 +    }
 +}
 +</code>
 +
 +====== 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.
 +
 +You might wonder: Can i transfer this data again even after the Screen was opened? 
 +This is possible by sending custom Packets (see: [[tutorial:networking|Networking Tutorial]]) after the Screen has been opened. \\ 
 +You might also want to have a look at the BlockEntityClientSerializable Interface from the Fabric API.
 +
 +If you only want to sync integer values you can use PropertyDelegates SEE MY NEXT TUTROIAL
 +
 +{{:tutorial:bildschirmfoto_vom_2020-08-14_18-37-51.png?nolink&400|}}
 +
  
tutorial/extendedscreenhandler.txt · Last modified: 2022/12/17 15:38 by miir