minecraft-src/net/minecraft/client/gui/screens/dialog/body/DialogBodyHandlers.java
2025-09-18 12:27:44 +00:00

112 lines
4 KiB
Java

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<MapCodec<? extends DialogBody>, DialogBodyHandler<?>> HANDLERS = new HashMap();
private static <B extends DialogBody> void register(MapCodec<B> codec, DialogBodyHandler<? super B> handler) {
HANDLERS.put(codec, handler);
}
@Nullable
private static <B extends DialogBody> DialogBodyHandler<B> getHandler(B body) {
return (DialogBodyHandler<B>)HANDLERS.get(body.mapCodec());
}
@Nullable
public static <B extends DialogBody> LayoutElement createBodyElement(DialogScreen<?> screen, B body) {
DialogBodyHandler<B> 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<ItemBody> {
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<PlainMessage> {
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);
}
}
}