minecraft-src/net/minecraft/server/dialog/CommonDialogData.java
2025-09-18 12:27:44 +00:00

43 lines
1.9 KiB
Java

package net.minecraft.server.dialog;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.List;
import java.util.Optional;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentSerialization;
import net.minecraft.server.dialog.body.DialogBody;
public record CommonDialogData(
Component title,
Optional<Component> externalTitle,
boolean canCloseWithEscape,
boolean pause,
DialogAction afterAction,
List<DialogBody> body,
List<Input> inputs
) {
public static final MapCodec<CommonDialogData> MAP_CODEC = RecordCodecBuilder.<CommonDialogData>mapCodec(
instance -> instance.group(
ComponentSerialization.CODEC.fieldOf("title").forGetter(CommonDialogData::title),
ComponentSerialization.CODEC.optionalFieldOf("external_title").forGetter(CommonDialogData::externalTitle),
Codec.BOOL.optionalFieldOf("can_close_with_escape", true).forGetter(CommonDialogData::canCloseWithEscape),
Codec.BOOL.optionalFieldOf("pause", true).forGetter(CommonDialogData::pause),
DialogAction.CODEC.optionalFieldOf("after_action", DialogAction.CLOSE).forGetter(CommonDialogData::afterAction),
DialogBody.COMPACT_LIST_CODEC.optionalFieldOf("body", List.of()).forGetter(CommonDialogData::body),
Input.CODEC.listOf().optionalFieldOf("inputs", List.of()).forGetter(CommonDialogData::inputs)
)
.apply(instance, CommonDialogData::new)
)
.validate(
commonDialogData -> commonDialogData.pause && !commonDialogData.afterAction.willUnpause()
? DataResult.error(() -> "Dialogs that pause the game must use after_action values that unpause it after user action!")
: DataResult.success(commonDialogData)
);
public Component computeExternalTitle() {
return (Component)this.externalTitle.orElse(this.title);
}
}