package com.hypixel.hytale.builtin.buildertools.prefablist; import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin; import com.hypixel.hytale.codec.Codec; import com.hypixel.hytale.codec.KeyedCodec; import com.hypixel.hytale.codec.builder.BuilderCodec; import com.hypixel.hytale.codec.codecs.EnumCodec; import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.component.Store; import com.hypixel.hytale.protocol.packets.interface_.CustomPageLifetime; import com.hypixel.hytale.protocol.packets.interface_.CustomUIEventBindingType; import com.hypixel.hytale.protocol.packets.interface_.Page; import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.entity.entities.Player; import com.hypixel.hytale.server.core.entity.entities.player.pages.InteractiveCustomUIPage; import com.hypixel.hytale.server.core.ui.builder.EventData; import com.hypixel.hytale.server.core.ui.builder.UICommandBuilder; import com.hypixel.hytale.server.core.ui.builder.UIEventBuilder; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import javax.annotation.Nonnull; public class PrefabSavePage extends InteractiveCustomUIPage { @Nonnull private static final Message MESSAGE_SERVER_BUILDER_TOOLS_PREFAB_SAVE_NAME_REQUIRED = Message.translation("server.builderTools.prefabSave.nameRequired"); public PrefabSavePage(@Nonnull PlayerRef playerRef) { super(playerRef, CustomPageLifetime.CanDismissOrCloseThroughInteraction, PrefabSavePage.PageData.CODEC); } @Override public void build( @Nonnull Ref ref, @Nonnull UICommandBuilder commandBuilder, @Nonnull UIEventBuilder eventBuilder, @Nonnull Store store ) { commandBuilder.append("Pages/PrefabSavePage.ui"); commandBuilder.set("#Entities #CheckBox.Value", true); commandBuilder.set("#Empty #CheckBox.Value", false); commandBuilder.set("#Overwrite #CheckBox.Value", false); commandBuilder.set("#FromClipboard #CheckBox.Value", false); eventBuilder.addEventBinding( CustomUIEventBindingType.Activating, "#SaveButton", new EventData() .append("Action", PrefabSavePage.Action.Save.name()) .append("@Name", "#NameInput.Value") .append("@Entities", "#Entities #CheckBox.Value") .append("@Empty", "#Empty #CheckBox.Value") .append("@Overwrite", "#Overwrite #CheckBox.Value") .append("@FromClipboard", "#FromClipboard #CheckBox.Value") ); eventBuilder.addEventBinding(CustomUIEventBindingType.Activating, "#CancelButton", new EventData().append("Action", PrefabSavePage.Action.Cancel.name())); } public void handleDataEvent(@Nonnull Ref ref, @Nonnull Store store, @Nonnull PrefabSavePage.PageData data) { Player playerComponent = store.getComponent(ref, Player.getComponentType()); assert playerComponent != null; switch (data.action) { case Save: if (data.name == null || data.name.isBlank()) { this.playerRef.sendMessage(MESSAGE_SERVER_BUILDER_TOOLS_PREFAB_SAVE_NAME_REQUIRED); this.sendUpdate(); return; } playerComponent.getPageManager().setPage(ref, store, Page.None); BuilderToolsPlugin.addToQueue(playerComponent, this.playerRef, (r, s, componentAccessor) -> { if (data.fromClipboard) { s.save(r, data.name, true, data.overwrite, componentAccessor); } else { s.saveFromSelection(r, data.name, true, data.overwrite, data.entities, data.empty, componentAccessor); } }); break; case Cancel: playerComponent.getPageManager().setPage(ref, store, Page.None); } } public static enum Action { Save, Cancel; } protected static class PageData { public static final String NAME = "@Name"; public static final String ENTITIES = "@Entities"; public static final String EMPTY = "@Empty"; public static final String OVERWRITE = "@Overwrite"; public static final String FROM_CLIPBOARD = "@FromClipboard"; public static final BuilderCodec CODEC = BuilderCodec.builder(PrefabSavePage.PageData.class, PrefabSavePage.PageData::new) .append( new KeyedCodec<>("Action", new EnumCodec<>(PrefabSavePage.Action.class, EnumCodec.EnumStyle.LEGACY)), (o, action) -> o.action = action, o -> o.action ) .add() .append(new KeyedCodec<>("@Name", Codec.STRING), (o, name) -> o.name = name, o -> o.name) .add() .append(new KeyedCodec<>("@Entities", Codec.BOOLEAN), (o, entities) -> o.entities = entities, o -> o.entities) .add() .append(new KeyedCodec<>("@Empty", Codec.BOOLEAN), (o, empty) -> o.empty = empty, o -> o.empty) .add() .append(new KeyedCodec<>("@Overwrite", Codec.BOOLEAN), (o, overwrite) -> o.overwrite = overwrite, o -> o.overwrite) .add() .append(new KeyedCodec<>("@FromClipboard", Codec.BOOLEAN), (o, fromClipboard) -> o.fromClipboard = fromClipboard, o -> o.fromClipboard) .add() .build(); public PrefabSavePage.Action action; public String name; public boolean entities = true; public boolean empty = false; public boolean overwrite = false; public boolean fromClipboard = false; public PageData() { } } }