package net.minecraft.client.gui.screens.dialog.body; import com.mojang.logging.LogUtils; import com.mojang.serialization.MapCodec; import java.util.HashMap; import java.util.Map; import java.util.Optional; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.FocusableTextWidget; import net.minecraft.client.gui.components.ItemDisplayWidget; import net.minecraft.client.gui.layouts.LayoutElement; import net.minecraft.client.gui.layouts.LinearLayout; import net.minecraft.client.gui.screens.dialog.DialogScreen; import net.minecraft.network.chat.ClickEvent; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Style; import net.minecraft.server.dialog.body.DialogBody; import net.minecraft.server.dialog.body.ItemBody; import net.minecraft.server.dialog.body.PlainMessage; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; @Environment(EnvType.CLIENT) public class DialogBodyHandlers { private static final Logger LOGGER = LogUtils.getLogger(); private static final Map, DialogBodyHandler> HANDLERS = new HashMap(); private static void register(MapCodec codec, DialogBodyHandler handler) { HANDLERS.put(codec, handler); } @Nullable private static DialogBodyHandler getHandler(B body) { return (DialogBodyHandler)HANDLERS.get(body.mapCodec()); } @Nullable public static LayoutElement createBodyElement(DialogScreen screen, B body) { DialogBodyHandler dialogBodyHandler = getHandler(body); if (dialogBodyHandler == null) { LOGGER.warn("Unrecognized dialog body {}", body); return null; } else { return dialogBodyHandler.createControls(screen, body); } } public static void bootstrap() { register(PlainMessage.MAP_CODEC, new DialogBodyHandlers.PlainMessageHandler()); register(ItemBody.MAP_CODEC, new DialogBodyHandlers.ItemHandler()); } static void runActionOnParent(DialogScreen screen, @Nullable Style style) { if (style != null) { ClickEvent clickEvent = style.getClickEvent(); if (clickEvent != null) { screen.runAction(Optional.of(clickEvent)); } } } @Environment(EnvType.CLIENT) static class ItemHandler implements DialogBodyHandler { public LayoutElement createControls(DialogScreen dialogScreen, ItemBody itemBody) { if (itemBody.description().isPresent()) { PlainMessage plainMessage = (PlainMessage)itemBody.description().get(); LinearLayout linearLayout = LinearLayout.horizontal().spacing(2); linearLayout.defaultCellSetting().alignVerticallyMiddle(); ItemDisplayWidget itemDisplayWidget = new ItemDisplayWidget( Minecraft.getInstance(), 0, 0, itemBody.width(), itemBody.height(), CommonComponents.EMPTY, itemBody.item(), itemBody.showDecorations(), itemBody.showTooltip() ); linearLayout.addChild(itemDisplayWidget); linearLayout.addChild( new FocusableTextWidget(plainMessage.width(), plainMessage.contents(), dialogScreen.getFont(), false, false, 4) .configureStyleHandling(true, style -> DialogBodyHandlers.runActionOnParent(dialogScreen, style)) ); return linearLayout; } else { return new ItemDisplayWidget( Minecraft.getInstance(), 0, 0, itemBody.width(), itemBody.height(), itemBody.item().getHoverName(), itemBody.item(), itemBody.showDecorations(), itemBody.showTooltip() ); } } } @Environment(EnvType.CLIENT) static class PlainMessageHandler implements DialogBodyHandler { public LayoutElement createControls(DialogScreen dialogScreen, PlainMessage plainMessage) { return new FocusableTextWidget(plainMessage.width(), plainMessage.contents(), dialogScreen.getFont(), false, false, 4) .configureStyleHandling(true, style -> DialogBodyHandlers.runActionOnParent(dialogScreen, style)) .setCentered(true); } } }