package com.hypixel.hytale.builtin.adventure.objectives.task; import com.hypixel.hytale.builtin.adventure.objectives.DialogPage; import com.hypixel.hytale.builtin.adventure.objectives.Objective; import com.hypixel.hytale.builtin.adventure.objectives.ObjectiveDataStore; import com.hypixel.hytale.builtin.adventure.objectives.ObjectivePlugin; import com.hypixel.hytale.builtin.adventure.objectives.config.task.UseEntityObjectiveTaskAsset; import com.hypixel.hytale.builtin.adventure.objectives.transaction.TransactionRecord; import com.hypixel.hytale.builtin.adventure.objectives.transaction.UseEntityTransactionRecord; 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.array.ArrayCodec; import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.component.Store; import com.hypixel.hytale.server.core.Message; import com.hypixel.hytale.server.core.entity.entities.Player; import com.hypixel.hytale.server.core.universe.PlayerRef; import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.UUID; import javax.annotation.Nonnull; public class UseEntityObjectiveTask extends CountObjectiveTask { public static final BuilderCodec CODEC = BuilderCodec.builder( UseEntityObjectiveTask.class, UseEntityObjectiveTask::new, CountObjectiveTask.CODEC ) .append(new KeyedCodec<>("NpcUUIDs", new ArrayCodec<>(Codec.UUID_BINARY, UUID[]::new)), (useEntityObjectiveTask, uuids) -> { useEntityObjectiveTask.npcUUIDs.clear(); Collections.addAll(useEntityObjectiveTask.npcUUIDs, uuids); }, useEntityObjectiveTask -> useEntityObjectiveTask.npcUUIDs.toArray(UUID[]::new)) .add() .build(); @Nonnull protected Set npcUUIDs = new HashSet<>(); public UseEntityObjectiveTask(@Nonnull UseEntityObjectiveTaskAsset asset, int taskSetIndex, int taskIndex) { super(asset, taskSetIndex, taskIndex); } protected UseEntityObjectiveTask() { } @Nonnull public UseEntityObjectiveTaskAsset getAsset() { return (UseEntityObjectiveTaskAsset)super.getAsset(); } @Nonnull @Override protected TransactionRecord[] setup0(@Nonnull Objective objective, @Nonnull World world, @Nonnull Store store) { UUID objectiveUUID = objective.getObjectiveUUID(); ObjectiveDataStore objectiveDataStore = ObjectivePlugin.get().getObjectiveDataStore(); String taskId = this.getAsset().getTaskId(); for (UUID playerUUID : objective.getActivePlayerUUIDs()) { objectiveDataStore.addEntityTaskForPlayer(playerUUID, taskId, objectiveUUID); } return TransactionRecord.appendTransaction(null, new UseEntityTransactionRecord(objectiveUUID, taskId)); } public boolean increaseTaskCompletion( @Nonnull Store store, @Nonnull Ref ref, int qty, @Nonnull Objective objective, @Nonnull PlayerRef playerRef, UUID npcUUID ) { if (!this.npcUUIDs.add(npcUUID)) { playerRef.sendMessage(Message.translation("server.modules.objective.task.alreadyInteractedWithNPC")); return false; } else { super.increaseTaskCompletion(store, ref, qty, objective); if (this.isComplete()) { UseEntityObjectiveTaskAsset.DialogOptions dialogOptions = this.getAsset().getDialogOptions(); if (dialogOptions != null) { Player playerComponent = store.getComponent(ref, Player.getComponentType()); assert playerComponent != null; playerRef.sendMessage( Message.join(Message.translation(dialogOptions.getEntityNameKey()), Message.raw(": "), Message.translation(dialogOptions.getDialogKey())) ); playerComponent.getPageManager().openCustomPage(ref, store, new DialogPage(playerRef, dialogOptions)); } } return true; } } @Nonnull @Override public String toString() { return "UseEntityObjectiveTask{npcUUIDs=" + this.npcUUIDs + "} " + super.toString(); } }