hytale-server/com/hypixel/hytale/builtin/adventure/npcobjectives/NPCObjectivesPlugin.java

165 lines
7.9 KiB
Java

package com.hypixel.hytale.builtin.adventure.npcobjectives;
import com.hypixel.hytale.assetstore.AssetRegistry;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.BountyObjectiveTaskAsset;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.KillObjectiveTaskAsset;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.KillSpawnBeaconObjectiveTaskAsset;
import com.hypixel.hytale.builtin.adventure.npcobjectives.assets.KillSpawnMarkerObjectiveTaskAsset;
import com.hypixel.hytale.builtin.adventure.npcobjectives.npc.builders.BuilderActionCompleteTask;
import com.hypixel.hytale.builtin.adventure.npcobjectives.npc.builders.BuilderActionStartObjective;
import com.hypixel.hytale.builtin.adventure.npcobjectives.npc.builders.BuilderSensorHasTask;
import com.hypixel.hytale.builtin.adventure.npcobjectives.resources.KillTrackerResource;
import com.hypixel.hytale.builtin.adventure.npcobjectives.systems.KillTrackerSystem;
import com.hypixel.hytale.builtin.adventure.npcobjectives.systems.SpawnBeaconCheckRemovalSystem;
import com.hypixel.hytale.builtin.adventure.npcobjectives.task.BountyObjectiveTask;
import com.hypixel.hytale.builtin.adventure.npcobjectives.task.KillNPCObjectiveTask;
import com.hypixel.hytale.builtin.adventure.npcobjectives.task.KillSpawnBeaconObjectiveTask;
import com.hypixel.hytale.builtin.adventure.npcobjectives.task.KillSpawnMarkerObjectiveTask;
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.ObjectiveAsset;
import com.hypixel.hytale.builtin.adventure.objectives.config.task.UseEntityObjectiveTaskAsset;
import com.hypixel.hytale.builtin.adventure.objectives.task.ObjectiveTask;
import com.hypixel.hytale.builtin.adventure.objectives.task.UseEntityObjectiveTask;
import com.hypixel.hytale.builtin.tagset.config.NPCGroup;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.component.ResourceType;
import com.hypixel.hytale.component.Store;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.server.core.plugin.JavaPlugin;
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
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 com.hypixel.hytale.server.npc.NPCPlugin;
import com.hypixel.hytale.server.spawning.assets.spawnmarker.config.SpawnMarker;
import com.hypixel.hytale.server.spawning.assets.spawns.config.BeaconNPCSpawn;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class NPCObjectivesPlugin extends JavaPlugin {
protected static NPCObjectivesPlugin instance;
private ResourceType<EntityStore, KillTrackerResource> killTrackerResourceType;
public static NPCObjectivesPlugin get() {
return instance;
}
public NPCObjectivesPlugin(@Nonnull JavaPluginInit init) {
super(init);
}
@Override
protected void setup() {
instance = this;
ObjectivePlugin.get()
.registerTask(
"KillSpawnBeacon",
KillSpawnBeaconObjectiveTaskAsset.class,
KillSpawnBeaconObjectiveTaskAsset.CODEC,
KillSpawnBeaconObjectiveTask.class,
KillSpawnBeaconObjectiveTask.CODEC,
KillSpawnBeaconObjectiveTask::new
);
ObjectivePlugin.get()
.registerTask(
"KillSpawnMarker",
KillSpawnMarkerObjectiveTaskAsset.class,
KillSpawnMarkerObjectiveTaskAsset.CODEC,
KillSpawnMarkerObjectiveTask.class,
KillSpawnMarkerObjectiveTask.CODEC,
KillSpawnMarkerObjectiveTask::new
);
ObjectivePlugin.get()
.registerTask(
"Bounty",
BountyObjectiveTaskAsset.class,
BountyObjectiveTaskAsset.CODEC,
BountyObjectiveTask.class,
BountyObjectiveTask.CODEC,
BountyObjectiveTask::new
);
ObjectivePlugin.get()
.registerTask(
"KillNPC",
KillObjectiveTaskAsset.class,
KillObjectiveTaskAsset.CODEC,
KillNPCObjectiveTask.class,
KillNPCObjectiveTask.CODEC,
KillNPCObjectiveTask::new
);
this.getEntityStoreRegistry().registerSystem(new SpawnBeaconCheckRemovalSystem());
this.killTrackerResourceType = this.getEntityStoreRegistry().registerResource(KillTrackerResource.class, KillTrackerResource::new);
this.getEntityStoreRegistry().registerSystem(new KillTrackerSystem());
NPCPlugin.get()
.registerCoreComponentType("CompleteTask", BuilderActionCompleteTask::new)
.registerCoreComponentType("StartObjective", BuilderActionStartObjective::new)
.registerCoreComponentType("HasTask", BuilderSensorHasTask::new);
AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(SpawnMarker.class);
AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(BeaconNPCSpawn.class);
AssetRegistry.getAssetStore(ObjectiveAsset.class).injectLoadsAfter(NPCGroup.class);
}
public static boolean hasTask(@Nonnull UUID playerUUID, @Nonnull UUID npcId, @Nonnull String taskId) {
Map<String, Set<UUID>> entityObjectives = ObjectivePlugin.get().getObjectiveDataStore().getEntityTasksForPlayer(playerUUID);
return entityObjectives == null ? false : entityObjectives.get(taskId) != null;
}
@Nullable
public static String updateTaskCompletion(
@Nonnull Store<EntityStore> store, @Nonnull Ref<EntityStore> ref, @Nonnull PlayerRef playerRef, @Nonnull UUID npcId, @Nonnull String taskId
) {
UUIDComponent uuidComponent = store.getComponent(ref, UUIDComponent.getComponentType());
assert uuidComponent != null;
ObjectiveDataStore objectiveDataStore = ObjectivePlugin.get().getObjectiveDataStore();
Map<String, Set<UUID>> entityObjectiveUUIDs = objectiveDataStore.getEntityTasksForPlayer(uuidComponent.getUuid());
if (entityObjectiveUUIDs == null) {
return null;
} else {
Set<UUID> objectiveUUIDsForTaskId = entityObjectiveUUIDs.get(taskId);
if (objectiveUUIDsForTaskId == null) {
return null;
} else {
for (UUID objectiveUUID : objectiveUUIDsForTaskId) {
Objective objective = objectiveDataStore.getObjective(objectiveUUID);
if (objective != null) {
for (ObjectiveTask task : objective.getCurrentTasks()) {
if (task instanceof UseEntityObjectiveTask useEntityTask) {
UseEntityObjectiveTaskAsset taskAsset = useEntityTask.getAsset();
if (taskAsset.getTaskId().equals(taskId)) {
if (!useEntityTask.increaseTaskCompletion(store, ref, 1, objective, playerRef, npcId)) {
return null;
}
return taskAsset.getAnimationIdToPlay();
}
}
}
}
}
return null;
}
}
}
public static void startObjective(@Nonnull Ref<EntityStore> playerReference, @Nonnull String taskId, @Nonnull Store<EntityStore> store) {
UUIDComponent uuidComponent = store.getComponent(playerReference, UUIDComponent.getComponentType());
assert uuidComponent != null;
World world = store.getExternalData().getWorld();
ObjectivePlugin.get().startObjective(taskId, Set.of(uuidComponent.getUuid()), world.getWorldConfig().getUuid(), null, store);
}
public ResourceType<EntityStore, KillTrackerResource> getKillTrackerResourceType() {
return this.killTrackerResourceType;
}
}