ObjectivePluginConfig class

Пакет: com.hypixel.hytale.builtin.adventure.objectives

Файл: com/hypixel/hytale/builtin/adventure/objectives/ObjectivePlugin.java

Поля (2)

МодификаторыТипИмя
public static final BuilderCodec<ObjectivePlugin.ObjectivePluginConfig> CODEC
private DataStoreProvider dataStoreProvider

Методы (1)

МодификаторыВозвратСигнатура
public DataStoreProvider getDataStoreProviderpublic DataStoreProvider getDataStoreProvider()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.objectives;

class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.blockstates.TreasureChestBlock;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.commands.ObjectiveCommand;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.completion.ClearObjectiveItemsCompletion;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.completion.GiveItemsCompletion;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.completion.ObjectiveCompletion;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.components.ObjectiveHistoryComponent;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.ObjectiveAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.ObjectiveLineAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.ObjectiveLocationMarkerAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.completion.ClearObjectiveItemsCompletionAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.completion.GiveItemsCompletionAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.completion.ObjectiveCompletionAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.gameplayconfig.ObjectiveGameplayConfig;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.CraftObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.GatherObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.ObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.ReachLocationTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.TreasureMapObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.UseBlockObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.config.task.UseEntityObjectiveTaskAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.historydata.CommonObjectiveHistoryData;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.historydata.ItemObjectiveRewardHistoryData;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.historydata.ObjectiveHistoryData;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.historydata.ObjectiveLineHistoryData;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.historydata.ObjectiveRewardHistoryData;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.interactions.CanBreakRespawnPointInteraction;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.interactions.DestroyTreasureConditionInteraction;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.interactions.OpenTreasureContainerInteraction;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.interactions.StartObjectiveInteraction;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.ObjectiveMarkerProvider;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.objectivelocation.ObjectiveLocationMarker;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.objectivelocation.ObjectiveLocationMarkerSystems;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.reachlocation.ReachLocationMarker;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.reachlocation.ReachLocationMarkerAsset;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.markers.reachlocation.ReachLocationMarkerSystems;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.systems.ObjectiveInventoryChangeSystem;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.systems.ObjectiveItemEntityRemovalSystem;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.systems.ObjectivePlayerSetupSystem;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.CraftObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.GatherObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.ObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.ReachLocationTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.TreasureMapObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.UseBlockObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.adventure.objectives.task.UseEntityObjectiveTask;
class="kw">import com.hypixel.hytale.builtin.weather.components.WeatherTracker;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.query.AndQuery;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.event.EventRegistry;
class="kw">import com.hypixel.hytale.function.function.TriFunction;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.protocol.packets.assets.TrackOrUpdateObjective;
class="kw">import com.hypixel.hytale.protocol.packets.assets.UntrackObjective;
class="kw">import com.hypixel.hytale.server.core.HytaleServer;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
class="kw">import com.hypixel.hytale.server.core.asset.type.gameplay.GameplayConfig;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.ItemDropList;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.ModelAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.weather.config.Weather;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.data.PlayerConfigData;
class="kw">import com.hypixel.hytale.server.core.event.events.player.PlayerDisconnectEvent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PersistentModel;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPlugin;
class="kw">import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabCopyableComponent;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.datastore.DataStoreProvider;
class="kw">import com.hypixel.hytale.server.core.universe.datastore.DiskDataStoreProvider;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.events.AddWorldEvent;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.Config;
class="kw">import java.util.Arrays;
class="kw">import java.util.HashSet;
class="kw">import java.util.Map;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.function.Function;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;

class="kw">public class ObjectivePlugin class="kw">extends JavaPlugin {
   class="kw">protected class="kw">static ObjectivePlugin instance;
   @Nonnull
   class="kw">public class="kw">static class="kw">final String OBJECTIVE_LOCATION_MARKER_MODEL_ID = "Objective_Location_Marker";
   class="kw">public class="kw">static class="kw">final long SAVE_INTERVAL_MINUTES = 5L;
   @Nonnull
   class="kw">private class="kw">final Map<Class<? class="kw">extends ObjectiveTaskAsset>, TriFunction<ObjectiveTaskAsset, Integer, Integer, ? class="kw">extends ObjectiveTask>> taskGenerators = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">private class="kw">final Map<Class<? class="kw">extends ObjectiveCompletionAsset>, Function<ObjectiveCompletionAsset, ? class="kw">extends ObjectiveCompletion>> completionGenerators = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">private class="kw">final Config<ObjectivePlugin.ObjectivePluginConfig> config = this.withConfig(ObjectivePlugin.ObjectivePluginConfig.CODEC);
   class="kw">private Model objectiveLocationMarkerModel;
   class="kw">private ComponentType<EntityStore, ObjectiveHistoryComponent> objectiveHistoryComponentType;
   class="kw">private ComponentType<EntityStore, ReachLocationMarker> reachLocationMarkerComponentType;
   class="kw">private ComponentType<EntityStore, ObjectiveLocationMarker> objectiveLocationMarkerComponentType;
   class="kw">private ComponentType<ChunkStore, TreasureChestBlock> treasureChestComponentType;
   @Nullable
   class="kw">private ObjectiveDataStore objectiveDataStore;

   class="kw">public class="kw">static ObjectivePlugin get() {
      class="kw">return instance;
   }

   class="kw">public ObjectivePlugin(@Nonnull JavaPluginInit var1) {
      super(var1);
   }

   class="kw">public ComponentType<EntityStore, ObjectiveHistoryComponent> getObjectiveHistoryComponentType() {
      class="kw">return this.objectiveHistoryComponentType;
   }

   class="kw">public Model getObjectiveLocationMarkerModel() {
      class="kw">return this.objectiveLocationMarkerModel;
   }

   @Nullable
   class="kw">public ObjectiveDataStore getObjectiveDataStore() {
      class="kw">return this.objectiveDataStore;
   }

   @Override
   class="kw">protected void setup() {
      instance = this;
      EventRegistry var1 = this.getEventRegistry();
      ComponentRegistryProxy var2 = this.getEntityStoreRegistry();
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ObjectiveAsset.class, new DefaultAssetMap()
                        )
                        .setPath("Objective/Objectives"))
                     .setCodec(ObjectiveAsset.CODEC))
                  .setKeyFunction(ObjectiveAsset::getId))
               .loadsAfter(ItemDropList.class, Item.class, BlockType.class, ReachLocationMarkerAsset.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ObjectiveLineAsset.class, new DefaultAssetMap()
                           )
                           .setPath("Objective/ObjectiveLines"))
                        .setCodec(ObjectiveLineAsset.CODEC))
                     .setKeyFunction(ObjectiveLineAsset::getId))
                  .loadsAfter(ObjectiveAsset.class))
               .loadsBefore(GameplayConfig.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           ObjectiveLocationMarkerAsset.class, new DefaultAssetMap()
                        )
                        .setPath("Objective/ObjectiveLocationMarkers"))
                     .setCodec(ObjectiveLocationMarkerAsset.CODEC))
                  .setKeyFunction(ObjectiveLocationMarkerAsset::getId))
               .loadsAfter(ObjectiveAsset.class, Environment.class, Weather.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                        ReachLocationMarkerAsset.class, new DefaultAssetMap()
                     )
                     .setPath("Objective/ReachLocationMarkers"))
                  .setCodec(ReachLocationMarkerAsset.CODEC))
               .setKeyFunction(ReachLocationMarkerAsset::getId))
            .build()
      );
      this.objectiveDataStore = new ObjectiveDataStore(this.config.get().getDataStoreProvider().create(Objective.CODEC));
      this.reachLocationMarkerComponentType = var2.registerComponent(ReachLocationMarker.class, "ReachLocationMarker", ReachLocationMarker.CODEC);
      this.objectiveLocationMarkerComponentType = var2.registerComponent(ObjectiveLocationMarker.class, "ObjectiveLocation", ObjectiveLocationMarker.CODEC);
      this.registerTask(
         "Craft", CraftObjectiveTaskAsset.class, CraftObjectiveTaskAsset.CODEC, CraftObjectiveTask.class, CraftObjectiveTask.CODEC, CraftObjectiveTask::new
      );
      this.registerTask(
         "Gather",
         GatherObjectiveTaskAsset.class,
         GatherObjectiveTaskAsset.CODEC,
         GatherObjectiveTask.class,
         GatherObjectiveTask.CODEC,
         GatherObjectiveTask::new
      );
      this.registerTask(
         "UseBlock",
         UseBlockObjectiveTaskAsset.class,
         UseBlockObjectiveTaskAsset.CODEC,
         UseBlockObjectiveTask.class,
         UseBlockObjectiveTask.CODEC,
         UseBlockObjectiveTask::new
      );
      this.registerTask(
         "UseEntity",
         UseEntityObjectiveTaskAsset.class,
         UseEntityObjectiveTaskAsset.CODEC,
         UseEntityObjectiveTask.class,
         UseEntityObjectiveTask.CODEC,
         UseEntityObjectiveTask::new
      );
      this.registerTask(
         "TreasureMap",
         TreasureMapObjectiveTaskAsset.class,
         TreasureMapObjectiveTaskAsset.CODEC,
         TreasureMapObjectiveTask.class,
         TreasureMapObjectiveTask.CODEC,
         TreasureMapObjectiveTask::new
      );
      this.registerTask(
         "ReachLocation", ReachLocationTaskAsset.class, ReachLocationTaskAsset.CODEC, ReachLocationTask.class, ReachLocationTask.CODEC, ReachLocationTask::new
      );
      this.registerCompletion("GiveItems", GiveItemsCompletionAsset.class, GiveItemsCompletionAsset.CODEC, GiveItemsCompletion::new);
      this.registerCompletion(
         "ClearObjectiveItems", ClearObjectiveItemsCompletionAsset.class, ClearObjectiveItemsCompletionAsset.CODEC, ClearObjectiveItemsCompletion::new
      );
      var1.register(LoadedAssetsEvent.class, ObjectiveLineAsset.class, this::onObjectiveLineAssetLoaded);
      var1.register(LoadedAssetsEvent.class, ObjectiveAsset.class, this::onObjectiveAssetLoaded);
      var1.register(PlayerDisconnectEvent.class, this::onPlayerDisconnect);
      var1.register(LoadedAssetsEvent.class, ObjectiveLocationMarkerAsset.class, ObjectivePlugin::onObjectiveLocationMarkerChange);
      var1.register(LoadedAssetsEvent.class, ModelAsset.class, this::onModelAssetChange);
      var1.registerGlobal(AddWorldEvent.class, this::onWorldAdded);
      this.getCommandRegistry().registerCommand(new ObjectiveCommand());
      EntityModule var3 = EntityModule.get();
      ComponentType var4 = PlayerRef.getComponentType();
      ResourceType var5 = var3.getPlayerSpatialResourceType();
      ComponentType var6 = NetworkId.getComponentType();
      ComponentType var7 = TransformComponent.getComponentType();
      ComponentType var8 = UUIDComponent.getComponentType();
      ComponentType var9 = WeatherTracker.getComponentType();
      ComponentType var10 = ModelComponent.getComponentType();
      ComponentType var11 = PrefabCopyableComponent.getComponentType();
      var2.registerSystem(new ReachLocationMarkerSystems.EntityAdded(this.reachLocationMarkerComponentType, var7));
      var2.registerSystem(new ReachLocationMarkerSystems.EnsureNetworkSendable(this.reachLocationMarkerComponentType, var6));
      var2.registerSystem(new ReachLocationMarkerSystems.Ticking(this.reachLocationMarkerComponentType, var5, var7, var8));
      var2.registerSystem(new ObjectiveLocationMarkerSystems.EnsureNetworkSendableSystem(this.objectiveLocationMarkerComponentType, var6));
      var2.registerSystem(new ObjectiveLocationMarkerSystems.InitSystem(this.objectiveLocationMarkerComponentType, var10, var7, var11));
      var2.registerSystem(new ObjectiveLocationMarkerSystems.TickingSystem(this.objectiveLocationMarkerComponentType, var4, var5, var7, var9, var8));
      CommonObjectiveHistoryData.CODEC.register("Objective", ObjectiveHistoryData.class, ObjectiveHistoryData.CODEC);
      CommonObjectiveHistoryData.CODEC.register("ObjectiveLine", ObjectiveLineHistoryData.class, ObjectiveLineHistoryData.CODEC);
      ObjectiveRewardHistoryData.CODEC.register("Item", ItemObjectiveRewardHistoryData.class, ItemObjectiveRewardHistoryData.CODEC);
      this.objectiveHistoryComponentType = var2.registerComponent(ObjectiveHistoryComponent.class, "ObjectiveHistory", ObjectiveHistoryComponent.CODEC);
      var2.registerSystem(new ObjectivePlayerSetupSystem(this.objectiveHistoryComponentType, Player.getComponentType()));
      var2.registerSystem(new ObjectiveItemEntityRemovalSystem());
      var2.registerSystem(new ObjectiveInventoryChangeSystem());
      this.getCodecRegistry(Interaction.CODEC).register("StartObjective", StartObjectiveInteraction.class, StartObjectiveInteraction.CODEC);
      this.getCodecRegistry(Interaction.CODEC).register("CanBreakRespawnPoint", CanBreakRespawnPointInteraction.class, CanBreakRespawnPointInteraction.CODEC);
      this.getCodecRegistry(Interaction.CODEC)
         .register("DestroyTreasureCondition", DestroyTreasureConditionInteraction.class, DestroyTreasureConditionInteraction.CODEC);
      this.getCodecRegistry(Interaction.CODEC)
         .register("OpenTreasureContainer", OpenTreasureContainerInteraction.class, OpenTreasureContainerInteraction.CODEC);
      this.treasureChestComponentType = this.getChunkStoreRegistry().registerComponent(TreasureChestBlock.class, "TreasureChest", TreasureChestBlock.CODEC);
      this.getCodecRegistry(GameplayConfig.PLUGIN_CODEC).register(ObjectiveGameplayConfig.class, "Objective", ObjectiveGameplayConfig.CODEC);
   }

   @Override
   class="kw">protected void start() {
      ModelAsset var1 = ModelAsset.getAssetMap().getAsset("Objective_Location_Marker");
      if (var1 == null) {
         throw new IllegalStateException(String.format("Default objective location marker model '%s' not found", "Objective_Location_Marker"));
      }

      this.objectiveLocationMarkerModel = Model.createUnitScaleModel(var1);
      if (this.objectiveDataStore != null) {
         HytaleServer.SCHEDULED_EXECUTOR.scheduleWithFixedDelay(() -> this.objectiveDataStore.saveToDiskAllObjectives(), 5L, 5L, TimeUnit.MINUTES);
      }
   }

   @Override
   class="kw">protected void shutdown() {
      if (this.objectiveDataStore != null) {
         this.objectiveDataStore.saveToDiskAllObjectives();
      }
   }

   class="kw">public ComponentType<EntityStore, ReachLocationMarker> getReachLocationMarkerComponentType() {
      class="kw">return this.reachLocationMarkerComponentType;
   }

   class="kw">public ComponentType<EntityStore, ObjectiveLocationMarker> getObjectiveLocationMarkerComponentType() {
      class="kw">return this.objectiveLocationMarkerComponentType;
   }

   class="kw">public ComponentType<ChunkStore, TreasureChestBlock> getTreasureChestComponentType() {
      class="kw">return this.treasureChestComponentType;
   }

   class="kw">public <T class="kw">extends ObjectiveTaskAsset, U class="kw">extends ObjectiveTask> void registerTask(
      String var1, Class<T> var2, Codec<T> var3, Class<U> var4, Codec<U> var5, TriFunction<T, Integer, Integer, U> var6
   ) {
      if (this.objectiveDataStore != null) {
         ObjectiveTaskAsset.CODEC.register(var1, var2, var3);
         ObjectiveTask.CODEC.register(var1, var4, var5);
         this.taskGenerators.put(var2, var6);
         this.objectiveDataStore.registerTaskRef(var4);
      }
   }

   class="kw">public <T class="kw">extends ObjectiveCompletionAsset, U class="kw">extends ObjectiveCompletion> void registerCompletion(
      String var1, Class<T> var2, Codec<T> var3, Function<T, U> var4
   ) {
      ObjectiveCompletionAsset.CODEC.register(var1, var2, var3);
      this.completionGenerators.put(var2, var4);
   }

   class="kw">public ObjectiveTask createTask(@Nonnull ObjectiveTaskAsset var1, int var2, int var3) {
      class="kw">return this.taskGenerators.get(var1.getClass()).apply(var1, var2, var3);
   }

   class="kw">public ObjectiveCompletion createCompletion(@Nonnull ObjectiveCompletionAsset var1) {
      class="kw">return this.completionGenerators.get(var1.getClass()).apply(var1);
   }

   @Nullable
   class="kw">public Objective startObjective(@Nonnull String var1, @Nonnull Set<UUID> var2, @Nonnull UUID var3, @Nullable UUID var4, @Nonnull Store<EntityStore> var5) {
      class="kw">return this.startObjective(var1, null, var2, var3, var4, var5);
   }

   @Nullable
   class="kw">public Objective startObjective(
      @Nonnull String var1, @Nullable UUID var2, @Nonnull Set<UUID> var3, @Nonnull UUID var4, @Nullable UUID var5, @Nonnull Store<EntityStore> var6
   ) {
      if (this.objectiveDataStore == null) {
         class="kw">return null;
      }

      ObjectiveAsset var7 = ObjectiveAsset.getAssetMap().getAsset(var1);
      if (var7 == null) {
         this.getLogger().at(Level.WARNING).log("Failed to find objective asset '%s'", var1);
         class="kw">return null;
      }

      if (var5 == null && !var7.isValidForPlayer()) {
         this.getLogger().at(Level.WARNING).log("Objective %s can't be used for Player", var7.getId());
         class="kw">return null;
      }

      Objective var8 = new Objective(var7, var2, var3, var4, var5);
      boolean var9 = var8.setup(var6);
      Message var10 = Message.translation(var7.getTitleKey());
      if (!var9 || !this.objectiveDataStore.addObjective(var8.getObjectiveUUID(), var8)) {
         this.getLogger().at(Level.WARNING).log("Failed to start objective %s", var7.getId());
         if (var8.getPlayerUUIDs() == null) {
            class="kw">return null;
         }

         var8.forEachParticipant(var2x -> {
            PlayerRef var3 = var6.getComponent(var2x, PlayerRef.getComponentType());
            if (var3 != null) {
               var3.sendMessage(Message.translation("server.modules.objective.start.failed").param("title", var10));
            }
         });
         class="kw">return null;
      } else {
         if (var8.getPlayerUUIDs() == null) {
            class="kw">return var8;
         }

         TrackOrUpdateObjective var11 = new TrackOrUpdateObjective(var8.toPacket());
         String var12 = var7.getId();
         var8.forEachParticipant(var6x -> {
            Player var7 = var6.getComponent(var6x, Player.getComponentType());
            if (var7 != null) {
               PlayerRef var8 = var6.getComponent(var6x, PlayerRef.getComponentType());
               assert var8 != null;
               if (!this.canPlayerDoObjective(var7, var12)) {
                  var8.sendMessage(Message.translation("server.modules.objective.playerAlreadyDoingObjective").param("title", var10));
               } else {
                  UUIDComponent var9 = var6.getComponent(var6x, UUIDComponent.getComponentType());
                  assert var9 != null;
                  var8.addActivePlayerUUID(var9.getUuid());
                  PlayerConfigData var10 = var7.getPlayerConfigData();
                  HashSet var11 = new HashSet<>(var10.getActiveObjectiveUUIDs());
                  var11.add(var8.getObjectiveUUID());
                  var10.setActiveObjectiveUUIDs(var11);
                  var8.sendMessage(Message.translation("server.modules.objective.start.success").param("title", var10));
                  var8.getPacketHandler().writeNoCache(var11);
               }
            }
         });
         var8.markDirty();
         class="kw">return var8;
      }
   }

   class="kw">public boolean canPlayerDoObjective(@Nonnull Player var1, @Nonnull String var2) {
      if (this.objectiveDataStore == null) {
         class="kw">return false;
      }

      Set var3 = var1.getPlayerConfigData().getActiveObjectiveUUIDs();
      if (var3 == null) {
         class="kw">return true;
      }

      for (UUID var5 : var3) {
         Objective var6 = this.objectiveDataStore.getObjective(var5);
         if (var6 != null && var6.getObjectiveId().equals(var2)) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   @Nullable
   class="kw">public Objective startObjectiveLine(@Nonnull Store<EntityStore> var1, @Nonnull String var2, @Nonnull Set<UUID> var3, @Nonnull UUID var4, @Nullable UUID var5) {
      ObjectiveLineAsset var6 = ObjectiveLineAsset.getAssetMap().getAsset(var2);
      if (var6 == null) {
         class="kw">return null;
      }

      String[] var7 = var6.getObjectiveIds();
      if (var7 != null && var7.length != 0) {
         Universe var8 = Universe.get();
         HashSet var9 = new HashSet<>();

         for (UUID var11 : var3) {
            PlayerRef var12 = var8.getPlayer(var11);
            if (var12 != null) {
               Ref var13 = var12.getReference();
               if (var13 != null && var13.isValid()) {
                  Player var14 = var1.getComponent(var13, Player.getComponentType());
                  assert var14 != null;
                  if (this.canPlayerDoObjectiveLine(var14, var2)) {
                     var9.add(var11);
                  } else {
                     Message var15 = Message.translation(var2);
                     var12.sendMessage(Message.translation("server.modules.objective.playerAlreadyDoingObjectiveLine").param("id", var15));
                  }
               }
            }
         }

         Objective var16 = this.startObjective(var6.getObjectiveIds()[0], var9, var4, var5, var1);
         if (var16 == null) {
            class="kw">return null;
         }

         var16.setObjectiveLineHistoryData(new ObjectiveLineHistoryData(var2, var6.getCategory(), var6.getNextObjectiveLineIds()));
         var16.checkTaskSetCompletion(var1);
         class="kw">return var16;
      } else {
         class="kw">return null;
      }
   }

   class="kw">public boolean canPlayerDoObjectiveLine(@Nonnull Player var1, @Nonnull String var2) {
      if (this.objectiveDataStore == null) {
         class="kw">return false;
      }

      Set var3 = var1.getPlayerConfigData().getActiveObjectiveUUIDs();
      if (var3 == null) {
         class="kw">return true;
      }

      for (UUID var5 : var3) {
         Objective var6 = this.objectiveDataStore.getObjective(var5);
         if (var6 != null) {
            ObjectiveLineHistoryData var7 = var6.getObjectiveLineHistoryData();
            if (var7 != null && var2.equals(var7.getId())) {
               class="kw">return false;
            }
         }
      }

      class="kw">return true;
   }

   class="kw">public void objectiveCompleted(@Nonnull Objective var1, @Nonnull Store<EntityStore> var2) {
      if (this.objectiveDataStore != null) {
         for (UUID var4 : var1.getPlayerUUIDs()) {
            this.untrackObjectiveForPlayer(var1, var4);
         }

         UUID var12 = var1.getObjectiveUUID();
         this.objectiveDataStore.removeObjective(var12);
         if (this.objectiveDataStore.removeFromDisk(var12.toString())) {
            ObjectiveLineAsset var13 = var1.getObjectiveLineAsset();
            if (var13 == null) {
               this.storeObjectiveHistoryData(var1);
            } else {
               ObjectiveLineHistoryData var5 = var1.getObjectiveLineHistoryData();
               assert var5 != null;
               var5.addObjectiveHistoryData(var1.getObjectiveHistoryData());
               String var6 = var13.getNextObjectiveId(var1.getObjectiveId());
               if (var6 != null) {
                  Objective var14 = this.startObjective(var6, var12, var1.getPlayerUUIDs(), var1.getWorldUUID(), var1.getMarkerUUID(), var2);
                  if (var14 != null) {
                     var14.setObjectiveLineHistoryData(var5);
                     var14.checkTaskSetCompletion(var2);
                  }
               } else {
                  this.storeObjectiveLineHistoryData(var5, var1.getPlayerUUIDs());
                  String[] var7 = var5.getNextObjectiveLineIds();
                  if (var7 != null) {
                     for (String var11 : var7) {
                        this.startObjectiveLine(var2, var11, var1.getPlayerUUIDs(), var1.getWorldUUID(), var1.getMarkerUUID());
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">public void storeObjectiveHistoryData(@Nonnull Objective var1) {
      String var2 = var1.getObjectiveId();
      Universe var3 = Universe.get();

      for (UUID var5 : var1.getPlayerUUIDs()) {
         PlayerRef var6 = var3.getPlayer(var5);
         if (var6 != null && var6.isValid()) {
            Ref var7 = var6.getReference();
            if (var7 != null && var7.isValid()) {
               Store var8 = var7.getStore();
               World var9 = var8.getExternalData().getWorld();
               var9.execute(() -> {
                  ObjectiveHistoryComponent var6 = var8.getComponent(var7, this.objectiveHistoryComponentType);
                  assert var6 != null;
                  Map var7 = var6.getObjectiveHistoryMap();
                  ObjectiveHistoryData var8 = var7.get(var2);
                  if (var8 != null) {
                     var8.completed(var5, var1.getObjectiveHistoryData());
                  } else {
                     var7.put(var2, var1.getObjectiveHistoryData().cloneForPlayer(var5));
                  }
               });
            }
         }
      }
   }

   class="kw">public void storeObjectiveLineHistoryData(@Nonnull ObjectiveLineHistoryData var1, @Nonnull Set<UUID> var2) {
      Map var3 = var1.cloneForPlayers(var2);
      String var4 = var1.getId();
      Universe var5 = Universe.get();

      for (Entry var7 : var3.entrySet()) {
         UUID var8 = var7.getKey();
         PlayerRef var9 = var5.getPlayer(var8);
         if (var9 != null && var9.isValid()) {
            Ref var10 = var9.getReference();
            if (var10 != null && var10.isValid()) {
               Store var11 = var10.getStore();
               World var12 = var11.getExternalData().getWorld();
               var12.execute(() -> {
                  ObjectiveHistoryComponent var6 = var11.getComponent(var10, this.objectiveHistoryComponentType);
                  assert var6 != null;
                  Map var7 = var6.getObjectiveLineHistoryMap();
                  ObjectiveLineHistoryData var8 = var7.get(var4);
                  if (var8 != null) {
                     var8.completed(var8, var7.getValue());
                  } else {
                     var7.put(var4, var7.getValue());
                  }
               });
            }
         }
      }
   }

   class="kw">public void cancelObjective(@Nonnull UUID var1, @Nonnull Store<EntityStore> var2) {
      if (this.objectiveDataStore != null) {
         Objective var3 = this.objectiveDataStore.loadObjective(var1, var2);
         if (var3 != null) {
            var3.cancel();

            for (UUID var5 : var3.getPlayerUUIDs()) {
               this.untrackObjectiveForPlayer(var3, var5);
            }

            this.objectiveDataStore.removeObjective(var1);
            this.objectiveDataStore.removeFromDisk(var1.toString());
         }
      }
   }

   class="kw">public void untrackObjectiveForPlayer(@Nonnull Objective var1, @Nonnull UUID var2) {
      if (this.objectiveDataStore != null) {
         UUID var3 = var1.getObjectiveUUID();
         ObjectiveTask[] var4 = var1.getCurrentTasks();

         for (ObjectiveTask var8 : var4) {
            if (var8 class="kw">instanceof UseEntityObjectiveTask var9) {
               this.objectiveDataStore.removeEntityTaskForPlayer(var3, var9.getAsset().getTaskId(), var2);
            }
         }

         PlayerRef var10 = Universe.get().getPlayer(var2);
         if (var10 != null) {
            Player var11 = var10.getComponent(Player.getComponentType());
            HashSet var12 = new HashSet<>(var11.getPlayerConfigData().getActiveObjectiveUUIDs());
            var12.remove(var3);
            var11.getPlayerConfigData().setActiveObjectiveUUIDs(var12);
            var10.getPacketHandler().writeNoCache(new UntrackObjective(var3));
         }
      }
   }

   class="kw">public void addPlayerToExistingObjective(@Nonnull Store<EntityStore> var1, @Nonnull UUID var2, @Nonnull UUID var3) {
      if (this.objectiveDataStore != null) {
         Objective var4 = this.objectiveDataStore.loadObjective(var3, var1);
         if (var4 != null) {
            var4.addActivePlayerUUID(var2);
            ObjectiveDataStore var5 = get().getObjectiveDataStore();
            ObjectiveTask[] var6 = var4.getCurrentTasks();

            for (ObjectiveTask var10 : var6) {
               if (var10 class="kw">instanceof UseEntityObjectiveTask) {
                  var5.addEntityTaskForPlayer(var2, ((UseEntityObjectiveTask)var10).getAsset().getTaskId(), var3);
               }
            }

            PlayerRef var11 = Universe.get().getPlayer(var2);
            if (var11 != null && var11.isValid()) {
               Ref var12 = var11.getReference();
               if (var12 != null && var12.isValid()) {
                  Player var13 = var1.getComponent(var12, Player.getComponentType());
                  assert var13 != null;
                  HashSet var14 = new HashSet<>(var13.getPlayerConfigData().getActiveObjectiveUUIDs());
                  var14.add(var3);
                  var13.getPlayerConfigData().setActiveObjectiveUUIDs(var14);
                  var11.getPacketHandler().writeNoCache(new TrackOrUpdateObjective(var4.toPacket()));
               }
            }
         }
      }
   }

   class="kw">public void removePlayerFromExistingObjective(@Nonnull Store<EntityStore> var1, @Nonnull UUID var2, @Nonnull UUID var3) {
      if (this.objectiveDataStore != null) {
         Objective var4 = this.objectiveDataStore.loadObjective(var3, var1);
         if (var4 != null) {
            var4.removeActivePlayerUUID(var2);
            if (var4.getActivePlayerUUIDs().isEmpty()) {
               this.objectiveDataStore.saveToDisk(var3.toString(), var4);
               this.objectiveDataStore.unloadObjective(var3);
            }

            this.untrackObjectiveForPlayer(var4, var2);
         }
      }
   }

   class="kw">private void onPlayerDisconnect(@Nonnull PlayerDisconnectEvent var1) {
      if (this.objectiveDataStore != null) {
         PlayerRef var2 = var1.getPlayerRef();
         Ref var3 = var2.getReference();
         if (var3 != null) {
            Store var4 = var3.getStore();
            World var5 = var4.getExternalData().getWorld();
            var5.execute(() -> {
               if (var3.isValid()) {
                  UUID var4 = var2.getUuid();
                  this.getLogger().at(Level.INFO).log("Checking objectives for disconnecting player '%s' (%s)", var2.getUsername(), var4);
                  Player var5 = var4.getComponent(var3, Player.getComponentType());
                  if (var5 != null) {
                     Set var6 = var5.getPlayerConfigData().getActiveObjectiveUUIDs();
                     if (var6 == null) {
                        this.getLogger().at(Level.INFO).log("No active objectives found for player '%s' (%s)", var2.getUsername(), var4);
                     } else {
                        this.getLogger().at(Level.INFO).log("Processing %d active objectives for '%s' (%s)", var6.size(), var2.getUsername(), var4);

                        for (UUID var8 : var6) {
                           Objective var9 = this.objectiveDataStore.getObjective(var8);
                           if (var9 != null) {
                              var9.removeActivePlayerUUID(var4);
                              if (var9.getActivePlayerUUIDs().isEmpty()) {
                                 this.objectiveDataStore.saveToDisk(var8.toString(), var9);
                                 this.objectiveDataStore.unloadObjective(var8);
                              }
                           }
                        }
                     }
                  }
               }
            });
         }
      }
   }

   class="kw">private void onObjectiveLineAssetLoaded(@Nonnull LoadedAssetsEvent<String, ObjectiveLineAsset, DefaultAssetMap<String, ObjectiveLineAsset>> var1) {
      if (this.objectiveDataStore != null) {
         for (Entry var3 : var1.getLoadedAssets().entrySet()) {
            String var4 = var3.getKey();
            String[] var5 = var3.getValue().getObjectiveIds();

            for (Objective var7 : this.objectiveDataStore.getObjectiveCollection()) {
               ObjectiveLineHistoryData var8 = var7.getObjectiveLineHistoryData();
               if (var8 != null && var4.equals(var8.getId()) && !ArrayUtil.contains(var5, var7.getObjectiveId())) {
                  World var9 = Universe.get().getWorld(var7.worldUUID);
                  if (var9 != null) {
                     var9.execute(() -> {
                        Store var3 = var9.getEntityStore().getStore();
                        this.cancelObjective(var7.getObjectiveUUID(), var3);
                     });
                  }
                  break;
               }
            }
         }
      }
   }

   class="kw">private void onObjectiveAssetLoaded(@Nonnull LoadedAssetsEvent<String, ObjectiveAsset, DefaultAssetMap<String, ObjectiveAsset>> var1) {
      if (this.objectiveDataStore != null) {
         for (Objective var3 : this.objectiveDataStore.getObjectiveCollection()) {
            var3.reloadObjectiveAsset(var1.getLoadedAssets());
         }
      }
   }

   class="kw">private class="kw">static void onObjectiveLocationMarkerChange(
      @Nonnull LoadedAssetsEvent<String, ObjectiveLocationMarkerAsset, DefaultAssetMap<String, ObjectiveLocationMarkerAsset>> var0
   ) {
      Map var1 = var0.getLoadedAssets();
      AndQuery var2 = Query.and(ObjectiveLocationMarker.getComponentType(), ModelComponent.getComponentType(), TransformComponent.getComponentType());
      Universe.get()
         .getWorlds()
         .forEach(
            (var2x, var3) -> var3.execute(
               () -> {
                  World var3 = var3.getEntityStore().getStore();
                  var3.forEachChunk(
                     var2,
                     (var2xx, var3x) -> {
                        for (int var4 = 0; var4 < var2xx.size(); var4++) {
                           ObjectiveLocationMarker var5 = var2xx.getComponent(var4, ObjectiveLocationMarker.getComponentType());
                           assert var5 != null;
                           ObjectiveLocationMarkerAsset var6 = var1.get(var5.getObjectiveLocationMarkerId());
                           if (var6 != null) {
                              TransformComponent var7 = var2xx.getComponent(var4, TransformComponent.getComponentType());
                              assert var7 != null;
                              Rotation3f var8 = var7.getRotation();
                              var5.updateLocationMarkerValues(var6, var8.yaw(), var3);
                              ModelComponent var9 = var2xx.getComponent(var4, ModelComponent.getComponentType());
                              assert var9 != null;
                              Model var10 = var9.getModel();
                              PersistentModel var11 = var2xx.getComponent(var4, PersistentModel.getComponentType());
                              assert var11 != null;
                              Model var12 = new Model(
                                 var10.getModelAssetId(),
                                 var10.getScale(),
                                 var10.getRandomAttachmentIds(),
                                 var10.getAttachments(),
                                 var5.getArea().getBoxForEntryArea(),
                                 var10.getModel(),
                                 var10.getTexture(),
                                 var10.getGradientSet(),
                                 var10.getGradientId(),
                                 var10.getEyeHeight(),
                                 var10.getCrouchOffset(),
                                 var10.getSittingOffset(),
                                 var10.getSleepingOffset(),
                                 var10.getAnimationSetMap(),
                                 var10.getCamera(),
                                 var10.getLight(),
                                 var10.getParticles(),
                                 var10.getTrails(),
                                 var10.getPhysicsValues(),
                                 var10.getDetailBoxes(),
                                 var10.getPhobia(),
                                 var10.getPhobiaModelAssetId()
                              );
                              var11.setModelReference(var12.toReference());
                              var3x.putComponent(var2xx.getReferenceTo(var4), ModelComponent.getComponentType(), new ModelComponent(var12));
                           }
                        }
                     }
                  );
               }
            )
         );
   }

   class="kw">private void onModelAssetChange(@Nonnull LoadedAssetsEvent<String, ModelAsset, DefaultAssetMap<String, ModelAsset>> var1) {
      Map var2 = var1.getLoadedAssets();
      ModelAsset var3 = var2.get("Objective_Location_Marker");
      if (var3 != null) {
         this.objectiveLocationMarkerModel = Model.createUnitScaleModel(var3);
      }
   }

   class="kw">private void onWorldAdded(@Nonnull AddWorldEvent var1) {
      var1.getWorld().getWorldMapManager().addMarkerProvider("objectives", ObjectiveMarkerProvider.INSTANCE);
   }

   @Nonnull
   class="kw">public String getObjectiveDataDump() {
      StringBuilder var1 = new StringBuilder("Objective Data\n");
      if (this.objectiveDataStore != null) {
         for (Objective var3 : this.objectiveDataStore.getObjectiveCollection()) {
            var1.append("Objective ID: ")
               .append(var3.getObjectiveId())
               .append("\n\t")
               .append("UUID: ")
               .append(var3.getObjectiveUUID())
               .append("\n\t")
               .append("Players: ")
               .append(Arrays.toString(var3.getPlayerUUIDs().toArray()))
               .append("\n\t")
               .append("Active players: ")
               .append(Arrays.toString(var3.getActivePlayerUUIDs().toArray()))
               .append("\n\n");
         }
      } else {
         var1.append("Objective data store is not initialized.\n");
      }

      class="kw">return var1.toString();
   }

   class="kw">public class="kw">static class ObjectivePluginConfig {
      @Nonnull
      class="kw">public class="kw">static class="kw">final BuilderCodec<ObjectivePlugin.ObjectivePluginConfig> CODEC = BuilderCodec.builder(
            ObjectivePlugin.ObjectivePluginConfig.class, ObjectivePlugin.ObjectivePluginConfig::new
         )
         .append(new KeyedCodec<>("DataStore", DataStoreProvider.CODEC), (var0, var1) -> var0.dataStoreProvider = var1, var0 -> var0.dataStoreProvider)
         .add()
         .build();
      class="kw">private DataStoreProvider dataStoreProvider = new DiskDataStoreProvider("objectives");

      class="kw">public ObjectivePluginConfig() {
      }

      class="kw">public DataStoreProvider getDataStoreProvider() {
         class="kw">return this.dataStoreProvider;
      }
   }
}