NPCConfig class

Пакет: com.hypixel.hytale.server.npc

Файл: com/hypixel/hytale/server/npc/NPCPlugin.java

Поля (8)

МодификаторыТипИмя
public static final BuilderCodec<NPCPlugin.NPCConfig> CODEC
private boolean autoReload
private boolean generateDescriptors
private boolean generateDescriptorsFile
private boolean logFailingTestErrors
private int maxBlackboardBlockType
private String[] presetCoverageTestNPCs
private boolean validateBuilder

Методы (7)

МодификаторыВозвратСигнатура
public int getMaxBlackboardBlockTypepublic int getMaxBlackboardBlockType()
public String[] getPresetCoverageTestNPCspublic String[] getPresetCoverageTestNPCs()
public boolean isAutoReloadpublic boolean isAutoReload()
public boolean isGenerateDescriptorspublic boolean isGenerateDescriptors()
public boolean isGenerateDescriptorsFilepublic boolean isGenerateDescriptorsFile()
public boolean isLogFailingTestErrorspublic boolean isLogFailingTestErrors()
public boolean isValidateBuilderpublic boolean isValidateBuilder()

Исходный код

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

class="kw">import com.hypixel.hytale.assetstore.AssetMap;
class="kw">import com.hypixel.hytale.assetstore.AssetPack;
class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.event.LoadedAssetsEvent;
class="kw">import com.hypixel.hytale.assetstore.event.RemovedAssetsEvent;
class="kw">import com.hypixel.hytale.assetstore.map.DefaultAssetMap;
class="kw">import com.hypixel.hytale.assetstore.map.IndexedLookupTableAssetMap;
class="kw">import com.hypixel.hytale.builtin.path.path.TransientPathDefinition;
class="kw">import com.hypixel.hytale.builtin.path.waypoint.RelativeWaypointDefinition;
class="kw">import com.hypixel.hytale.builtin.tagset.TagSetPlugin;
class="kw">import com.hypixel.hytale.builtin.tagset.config.NPCGroup;
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.codec.codecs.EnumCodec;
class="kw">import com.hypixel.hytale.codec.codecs.set.SetCodec;
class="kw">import com.hypixel.hytale.codec.schema.config.Schema;
class="kw">import com.hypixel.hytale.common.benchmark.TimeDistributionRecorder;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.ComponentRegistryProxy;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.Order;
class="kw">import com.hypixel.hytale.component.dependency.SystemDependency;
class="kw">import com.hypixel.hytale.component.spatial.KDTree;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.event.EventRegistry;
class="kw">import com.hypixel.hytale.function.consumer.TriConsumer;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Rotation3fc;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.Options;
class="kw">import com.hypixel.hytale.server.core.asset.AssetModule;
class="kw">import com.hypixel.hytale.server.core.asset.AssetPackRegisterEvent;
class="kw">import com.hypixel.hytale.server.core.asset.AssetPackUnregisterEvent;
class="kw">import com.hypixel.hytale.server.core.asset.HytaleAssetStore;
class="kw">import com.hypixel.hytale.server.core.asset.LoadAssetEvent;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockset.config.BlockSet;
class="kw">import com.hypixel.hytale.server.core.asset.type.entityeffect.config.EntityEffect;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
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.responsecurve.config.ResponseCurve;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelRotateBoundingBoxComponent;
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.entitystats.EntityStatMap;
class="kw">import com.hypixel.hytale.server.core.modules.entitystats.EntityStatsSystems;
class="kw">import com.hypixel.hytale.server.core.modules.entitystats.asset.EntityStatType;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.time.WorldTimeResource;
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.schema.SchemaGenerator;
class="kw">import com.hypixel.hytale.server.core.universe.Universe;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.npc.INonPlayerCharacter;
class="kw">import com.hypixel.hytale.server.core.universe.world.path.WorldPathChangedEvent;
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 com.hypixel.hytale.server.flock.FlockPlugin;
class="kw">import com.hypixel.hytale.server.flock.config.FlockAsset;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.Builder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderDescriptor;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderFactory;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderInfo;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderManager;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.blackboard.Blackboard;
class="kw">import com.hypixel.hytale.server.npc.blackboard.BlackboardSubscription;
class="kw">import com.hypixel.hytale.server.npc.blackboard.view.attitude.AttitudeMap;
class="kw">import com.hypixel.hytale.server.npc.blackboard.view.attitude.ItemAttitudeMap;
class="kw">import com.hypixel.hytale.server.npc.blackboard.view.combat.CombatViewSystems;
class="kw">import com.hypixel.hytale.server.npc.commands.NPCCommand;
class="kw">import com.hypixel.hytale.server.npc.commands.NPCRunTestsCommand;
class="kw">import com.hypixel.hytale.server.npc.components.FailedSpawnComponent;
class="kw">import com.hypixel.hytale.server.npc.components.SortBufferProviderResource;
class="kw">import com.hypixel.hytale.server.npc.components.StepComponent;
class="kw">import com.hypixel.hytale.server.npc.components.Timers;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.BeaconReceiverProvider;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.BeaconSupport;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.NPCBlockEventSupport;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.NPCEntityEventSupport;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.PlayerBlockEventSupport;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.PlayerEntityEventSupport;
class="kw">import com.hypixel.hytale.server.npc.config.AttitudeGroup;
class="kw">import com.hypixel.hytale.server.npc.config.ItemAttitudeGroup;
class="kw">import com.hypixel.hytale.server.npc.config.balancing.BalanceAsset;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.IEntityFilter;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.ISensorEntityCollector;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.ISensorEntityPrioritiser;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.WeightedAction;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderActionAppearance;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderActionDisplayName;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderActionModelAttachment;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderActionPlayAnimation;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderActionPlaySound;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderActionSpawnParticles;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.audiovisual.builders.BuilderSensorAnimation;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.builders.BuilderWeightedAction;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderActionApplyEntityEffect;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderActionAttack;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderActionBlockHitInteraction;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderActionEntityHitInteraction;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderBodyMotionAimCharge;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderBodyMotionCharge;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderHeadMotionAim;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderSensorChargeBlockCollisions;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderSensorChargeEntityCollisions;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderSensorChargeState;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderSensorDamage;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderSensorIsBackingAway;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.debug.builders.BuilderActionLog;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.debug.builders.BuilderActionTest;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.debug.builders.BuilderBodyMotionTestProbe;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionBeacon;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionIgnoreForAvoidance;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionNotify;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionOverrideAttitude;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionReleaseTarget;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionSetHealthRegen;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionSetInvulnerable;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionSetMarkedTarget;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderActionSetStat;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderHeadMotionWatch;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorBeacon;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorCount;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorEntity;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorKill;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorPlayer;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorSelf;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.builders.BuilderSensorTarget;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterAltitude;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterAnd;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterAttitude;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterCombat;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterDeath;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterEntityEffect;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterExecutingInteraction;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterHeightDifference;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterInsideBlock;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterInventory;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterItemInHand;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterLineOfSight;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterMovementState;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterNPCGroup;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterNot;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterOr;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterSpotsMe;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterStandingOnBlock;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterStat;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.filters.builders.BuilderEntityFilterViewSector;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.entity.prioritisers.builders.BuilderSensorEntityPrioritiserAttitude;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.interaction.builders.BuilderActionLockOnInteractionTarget;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.interaction.builders.BuilderActionSetInteractable;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.interaction.builders.BuilderActionSpawnInteraction;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.interaction.builders.BuilderSensorCanInteract;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.interaction.builders.BuilderSensorHasInteracted;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.interaction.builders.BuilderSensorInteractionContext;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.items.builders.BuilderActionDropItem;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.items.builders.BuilderActionInventory;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.items.builders.BuilderActionPickUpItem;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.items.builders.BuilderSensorDroppedItem;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionDelayDespawn;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionDespawn;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionDie;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionRemove;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionRole;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionSpawn;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderSensorAge;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderActionCrouch;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderActionOverrideAltitude;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderActionRecomputePath;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionFind;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionLand;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionLeave;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionMaintainDistance;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionMatchLook;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionMoveAway;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionTakeOff;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionTeleport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionWander;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionWanderInCircle;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionWanderInRect;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderSensorInAir;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderSensorMotionController;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderSensorNav;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderSensorOnGround;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.statemachine.builders.BuilderActionParentState;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.statemachine.builders.BuilderActionState;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.statemachine.builders.BuilderActionToggleStateEvaluator;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.statemachine.builders.BuilderSensorIsBusy;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.statemachine.builders.BuilderSensorState;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionSetAlarm;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionTimerContinue;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionTimerModify;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionTimerPause;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionTimerRestart;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionTimerStart;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderActionTimerStop;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderBodyMotionTimer;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderHeadMotionTimer;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderSensorAlarm;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.timer.builders.BuilderSensorTimer;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionAdjustPosition;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionForEach;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionNothing;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionProjectToGround;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionRandom;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionResetInstructions;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionSequence;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionSetFlag;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderActionTimeout;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderBodyMotionNothing;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderBodyMotionSequence;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderHeadMotionNothing;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderHeadMotionRotate;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderHeadMotionSequence;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorAdjustPosition;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorAnd;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorAny;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorEval;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorFlag;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorNot;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorOr;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorProjectToGround;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorRandom;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorSwitch;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderSensorValueProviderWrapper;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.utility.builders.BuilderValueToParameterMapping;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionMakePath;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionPlaceBlock;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionResetBlockSensors;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionResetPath;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionResetSearchRays;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionSetBlockToPlace;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionSetLeashPosition;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionStorePosition;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderActionTriggerSpawners;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderBodyMotionPath;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderHeadMotionObserve;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorBlock;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorBlockChange;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorBlockType;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorCanPlace;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorEntityEvent;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorInWater;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorLeash;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorLight;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorPath;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorPoints;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorReadPosition;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorSearchRay;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorTime;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorWeather;
class="kw">import com.hypixel.hytale.server.npc.decisionmaker.core.conditions.base.Condition;
class="kw">import com.hypixel.hytale.server.npc.decisionmaker.stateevaluator.StateEvaluator;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.instructions.Action;
class="kw">import com.hypixel.hytale.server.npc.instructions.ActionList;
class="kw">import com.hypixel.hytale.server.npc.instructions.BodyMotion;
class="kw">import com.hypixel.hytale.server.npc.instructions.HeadMotion;
class="kw">import com.hypixel.hytale.server.npc.instructions.Instruction;
class="kw">import com.hypixel.hytale.server.npc.instructions.Sensor;
class="kw">import com.hypixel.hytale.server.npc.instructions.builders.BuilderActionList;
class="kw">import com.hypixel.hytale.server.npc.instructions.builders.BuilderInstruction;
class="kw">import com.hypixel.hytale.server.npc.instructions.builders.BuilderInstructionRandomized;
class="kw">import com.hypixel.hytale.server.npc.instructions.builders.BuilderInstructionReference;
class="kw">import com.hypixel.hytale.server.npc.interactions.ContextualUseNPCInteraction;
class="kw">import com.hypixel.hytale.server.npc.interactions.SendBeaconInteraction;
class="kw">import com.hypixel.hytale.server.npc.interactions.SpawnNPCInteraction;
class="kw">import com.hypixel.hytale.server.npc.interactions.SpawnNPCInteractionFailureTracker;
class="kw">import com.hypixel.hytale.server.npc.interactions.UseNPCInteraction;
class="kw">import com.hypixel.hytale.server.npc.movement.MovementMode;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.BuilderMotionControllerMapUtil;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.MotionController;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerDive;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerFly;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerMap;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerWalk;
class="kw">import com.hypixel.hytale.server.npc.navigation.AStarNodePoolProviderSimple;
class="kw">import com.hypixel.hytale.server.npc.path.builders.BuilderRelativeWaypointDefinition;
class="kw">import com.hypixel.hytale.server.npc.path.builders.BuilderTransientPathDefinition;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.builders.BuilderRole;
class="kw">import com.hypixel.hytale.server.npc.role.builders.BuilderRoleAbstract;
class="kw">import com.hypixel.hytale.server.npc.role.builders.BuilderRoleVariant;
class="kw">import com.hypixel.hytale.server.npc.role.builders.RoleBuilder;
class="kw">import com.hypixel.hytale.server.npc.role.support.CombatSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.DebugSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.DisplayNameSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.EntitySupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.FlagsComponent;
class="kw">import com.hypixel.hytale.server.npc.role.support.MarkedEntitySupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.MotionContextSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.PlayerTaskSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.PositionCache;
class="kw">import com.hypixel.hytale.server.npc.role.support.StateSupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.WorldSupport;
class="kw">import com.hypixel.hytale.server.npc.statetransition.StateTransitionController;
class="kw">import com.hypixel.hytale.server.npc.storage.AlarmStore;
class="kw">import com.hypixel.hytale.server.npc.systems.AvoidanceSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.BalancingInitialisationSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.BlackboardSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.ComputeVelocitySystem;
class="kw">import com.hypixel.hytale.server.npc.systems.FailedSpawnSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.MessageSupportSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.MovementStatesSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCDamageSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCDeathSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCInteractionSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCPreTickSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCSpatialSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.NPCVelocityInstructionSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.NewSpawnStartTickingSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.PositionCacheSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.RoleBuilderSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.RoleChangeSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.RoleSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.SpawnNPCInteractionFailureTrackerSystems;
class="kw">import com.hypixel.hytale.server.npc.systems.StateEvaluatorSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.SteeringSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.StepCleanupSystem;
class="kw">import com.hypixel.hytale.server.npc.systems.TimerSystem;
class="kw">import com.hypixel.hytale.server.npc.util.SensorSupportBenchmark;
class="kw">import com.hypixel.hytale.server.npc.util.expression.StdScope;
class="kw">import com.hypixel.hytale.server.npc.valuestore.ValueStore;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnableWithModel;
class="kw">import com.hypixel.hytale.server.spawning.SpawnLineage;
class="kw">import com.hypixel.hytale.server.spawning.SpawnTestResult;
class="kw">import com.hypixel.hytale.server.spawning.SpawningContext;
class="kw">import it.unimi.dsi.fastutil.Pair;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.nio.file.Path;
class="kw">import java.util.EnumSet;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Set;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.concurrent.atomic.AtomicInteger;
class="kw">import java.util.concurrent.locks.Lock;
class="kw">import java.util.concurrent.locks.ReentrantLock;
class="kw">import java.util.function.Consumer;
class="kw">import java.util.function.Supplier;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;

class="kw">public class NPCPlugin class="kw">extends JavaPlugin {
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_ROLE = "Role";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_BODY_MOTION = "BodyMotion";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_HEAD_MOTION = "HeadMotion";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_ACTION = "Action";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_SENSOR = "Sensor";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_INSTRUCTION = "Instruction";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_TRANSIENT_PATH = "Path";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String FACTORY_CLASS_ACTION_LIST = "ActionList";
   @Nonnull
   class="kw">public class="kw">static class="kw">final String ROLE_ASSETS_PATH = "Server/NPC/Roles";
   @Nonnull
   class="kw">public class="kw">static class="kw">final EnumCodec<MovementMode> MOVEMENT_MODE_CODEC = new EnumCodec<>(MovementMode.class);
   @Nonnull
   class="kw">public class="kw">static class="kw">final SetCodec<MovementMode, EnumSet<MovementMode>> MOVEMENT_MODE_SET_CODEC = new SetCodec<>(
      MOVEMENT_MODE_CODEC, () -> EnumSet.noneOf(MovementMode.class), true
   );
   class="kw">private class="kw">static NPCPlugin instance;
   class="kw">protected List<BuilderDescriptor> builderDescriptors;
   class="kw">protected class="kw">final BuilderManager builderManager = new BuilderManager();
   class="kw">protected boolean validateBuilder;
   class="kw">protected int maxBlackboardBlockCountPerType = 20;
   class="kw">protected boolean logFailingTestErrors;
   class="kw">protected String[] presetCoverageTestNPCs;
   @Nonnull
   class="kw">protected AtomicInteger pathChangeRevision = new AtomicInteger(0);
   @Nonnull
   class="kw">protected Lock benchmarkLock = new ReentrantLock();
   @Nullable
   class="kw">protected Int2ObjectMap<TimeDistributionRecorder> roleTickDistribution;
   @Nullable
   class="kw">protected Int2ObjectMap<SensorSupportBenchmark> roleSensorSupportDistribution;
   @Nullable
   class="kw">protected TimeDistributionRecorder roleTickDistributionAll;
   @Nullable
   class="kw">protected SensorSupportBenchmark roleSensorSupportDistributionAll;
   class="kw">protected boolean autoReload;
   class="kw">private AttitudeMap attitudeMap;
   class="kw">private ItemAttitudeMap itemAttitudeMap;
   class="kw">private class="kw">static class="kw">final Rotation3f NULL_ROTATION = new Rotation3f(0.0F, 0.0F, 0.0F);
   class="kw">public class="kw">static class="kw">final short PRIORITY_LOAD_NPC = -8;
   class="kw">public class="kw">static class="kw">final short PRIORITY_SPAWN_VALIDATION = -7;
   class="kw">private class="kw">final Config<NPCPlugin.NPCConfig> config = this.withConfig("NPCModule", NPCPlugin.NPCConfig.CODEC);
   class="kw">private ResourceType<EntityStore, Blackboard> blackboardResourceType;
   class="kw">private ResourceType<EntityStore, CombatViewSystems.CombatDataPool> combatDataPoolResourceType;
   class="kw">private ResourceType<EntityStore, RoleChangeSystem.RoleChangeQueue> roleChangeQueueResourceType;
   class="kw">private ResourceType<EntityStore, NewSpawnStartTickingSystem.QueueResource> newSpawnStartTickingQueueResourceType;
   class="kw">private ResourceType<EntityStore, SortBufferProviderResource> sortBufferProviderResourceResourceType;
   class="kw">private ResourceType<EntityStore, AStarNodePoolProviderSimple> aStarNodePoolProviderSimpleResourceType;
   class="kw">private ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> npcSpatialResource;
   class="kw">private ResourceType<EntityStore, SpawnNPCInteractionFailureTracker> spawnNPCInteractionFailureTrackerResourceType;
   class="kw">private class="kw">final List<BeaconReceiverProvider> beaconReceiverProviders = new ObjectArrayList();
   class="kw">private ComponentType<EntityStore, CombatViewSystems.CombatData> combatDataComponentType;
   class="kw">private ComponentType<EntityStore, NPCRunTestsCommand.NPCTestData> npcTestDataComponentType;
   class="kw">private ComponentType<EntityStore, BeaconSupport> beaconSupportComponentType;
   class="kw">private ComponentType<EntityStore, BlackboardSubscription> blackboardSubscriptionComponentType;
   class="kw">private ComponentType<EntityStore, NPCBlockEventSupport> npcBlockEventSupportComponentType;
   class="kw">private ComponentType<EntityStore, PlayerBlockEventSupport> playerBlockEventSupportComponentType;
   class="kw">private ComponentType<EntityStore, NPCEntityEventSupport> npcEntityEventSupportComponentType;
   class="kw">private ComponentType<EntityStore, PlayerEntityEventSupport> playerEntityEventSupportComponentType;
   class="kw">private ComponentType<EntityStore, StepComponent> stepComponentType;
   class="kw">private ComponentType<EntityStore, FailedSpawnComponent> failedSpawnComponentType;
   class="kw">private ComponentType<EntityStore, Timers> timersComponentType;
   class="kw">private ComponentType<EntityStore, StateEvaluator> stateEvaluatorComponentType;
   class="kw">private ComponentType<EntityStore, ValueStore> valueStoreComponentType;
   class="kw">private ComponentType<EntityStore, CombatSupport> combatSupportComponentType;
   class="kw">private ComponentType<EntityStore, StateSupport> stateSupportComponentType;
   class="kw">private ComponentType<EntityStore, MarkedEntitySupport> markedEntitySupportComponentType;
   class="kw">private ComponentType<EntityStore, WorldSupport> worldSupportComponentType;
   class="kw">private ComponentType<EntityStore, EntitySupport> entitySupportComponentType;
   class="kw">private ComponentType<EntityStore, MotionContextSupport> motionContextSupportComponentType;
   class="kw">private ComponentType<EntityStore, DisplayNameSupport> displayNameSupportComponentType;
   class="kw">private ComponentType<EntityStore, PlayerTaskSupport> playerTaskSupportComponentType;
   class="kw">private ComponentType<EntityStore, PositionCache> positionCacheComponentType;
   class="kw">private ComponentType<EntityStore, DebugSupport> debugSupportComponentType;
   class="kw">private ComponentType<EntityStore, FlagsComponent> flagsComponentType;
   class="kw">private ComponentType<EntityStore, AlarmStore> alarmStoreComponentType;
   class="kw">private ComponentType<EntityStore, SpawnLineage> spawnLineageComponentType;

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

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

   @Override
   class="kw">protected void setup() {
      instance = this;
      ComponentRegistryProxy var1 = this.getEntityStoreRegistry();
      EventRegistry var2 = this.getEventRegistry();
      this.getCommandRegistry().registerCommand(new NPCCommand());
      var2.register(LoadedAssetsEvent.class, ModelAsset.class, this::onModelsChanged);
      var2.register(LoadedAssetsEvent.class, NPCGroup.class, this::onNPCGroupsLoaded);
      var2.register(RemovedAssetsEvent.class, NPCGroup.class, this::onNPCGroupsRemoved);
      var2.register(LoadedAssetsEvent.class, AttitudeGroup.class, this::onAttitudeGroupsLoaded);
      var2.register(RemovedAssetsEvent.class, AttitudeGroup.class, this::onAttitudeGroupsRemoved);
      var2.register(LoadedAssetsEvent.class, ItemAttitudeGroup.class, this::onItemAttitudeGroupsLoaded);
      var2.register(RemovedAssetsEvent.class, ItemAttitudeGroup.class, this::onItemAttitudeGroupsRemoved);
      var2.register(LoadedAssetsEvent.class, BlockSet.class, this::onBlockSetsLoaded);
      var2.register(LoadedAssetsEvent.class, BalanceAsset.class, NPCPlugin::onBalanceAssetsChanged);
      var2.register(RemovedAssetsEvent.class, BalanceAsset.class, NPCPlugin::onBalanceAssetsRemoved);
      var2.register(WorldPathChangedEvent.class, this::onPathChange);
      var2.register(AllNPCsLoadedEvent.class, this::onNPCsLoaded);
      var2.register(
         (short)-8,
         LoadAssetEvent.class,
         var1x -> {
            HytaleLogger.getLogger().at(Level.INFO).log("Loading NPC assets phase...");
            long var2 = System.nanoTime();
            this.builderManager.setAutoReload(this.autoReload);
            boolean var4 = Options.getOptionSet().has(Options.VALIDATE_ASSETS);
            List var5 = AssetModule.get().getAssetPacks();

            for (int var6 = 0; var6 < var5.size(); var6++) {
               boolean var7 = var6 == 0;
               boolean var8 = this.builderManager.loadBuilders(var5.get(var6), var7);
               if (!var8) {
                  var1x.failed(var4, "failed to validate npc's");
               }
            }

            HytaleLogger.getLogger()
               .at(Level.INFO)
               .log(
                  "Loading NPC assets phase completed! Boot time %s, Took %s",
                  FormatUtil.nanosToString(System.nanoTime() - var1x.getBootStart()),
                  FormatUtil.nanosToString(System.nanoTime() - var2)
               );
         }
      );
      var2.register(AssetPackRegisterEvent.class, var1x -> this.builderManager.loadBuilders(var1x.getAssetPack(), false));
      var2.register(AssetPackUnregisterEvent.class, var1x -> this.builderManager.unloadBuilders(var1x.getAssetPack()));
      SchemaGenerator.registerAssetSchema("NPCRole.json", var1x -> {
         Schema var2 = this.builderManager.generateSchema(var1x);
         var2.setId("NPCRole.json");
         var2.setTitle("NPCRole");
         Schema.HytaleMetadata var3 = var2.getHytale();
         var3.setPath("NPC/Roles");
         var3.setExtension(".json");
         class="kw">return var2;
      }, List.of("NPC/Roles/*.json", "NPC/Roles/**/*.json"), null);
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              AttitudeGroup.class, new IndexedLookupTableAssetMap<>(AttitudeGroup[]::new)
                           )
                           .setPath("NPC/Attitude/Roles"))
                        .setCodec(AttitudeGroup.CODEC))
                     .setKeyFunction(AttitudeGroup::getId))
                  .setReplaceOnRemove(AttitudeGroup::new))
               .loadsAfter(NPCGroup.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              ItemAttitudeGroup.class, new IndexedLookupTableAssetMap<>(ItemAttitudeGroup[]::new)
                           )
                           .setPath("NPC/Attitude/Items"))
                        .setCodec(ItemAttitudeGroup.CODEC))
                     .setKeyFunction(ItemAttitudeGroup::getId))
                  .setReplaceOnRemove(ItemAttitudeGroup::new))
               .loadsAfter(Item.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                           BalanceAsset.class, new DefaultAssetMap()
                        )
                        .setPath("NPC/Balancing"))
                     .setCodec(BalanceAsset.CODEC))
                  .setKeyFunction(BalanceAsset::getId))
               .loadsAfter(Condition.class))
            .build()
      );
      AssetRegistry.register(
         ((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)((HytaleAssetStore.Builder)HytaleAssetStore.builder(
                              Condition.class, new IndexedLookupTableAssetMap<>(Condition[]::new)
                           )
                           .setPath("NPC/DecisionMaking/Conditions"))
                        .setCodec(Condition.CODEC))
                     .setKeyFunction(Condition::getId))
                  .setReplaceOnRemove(Condition::getAlwaysTrueFor))
               .loadsAfter(ResponseCurve.class, NPCGroup.class, EntityStatType.class, EntityEffect.class))
            .build()
      );
      this.getEntityRegistry().registerEntity("NPC", NPCEntity.class, NPCEntity::new, NPCEntity.CODEC);
      Interaction.CODEC.register("ContextualUseNPC", ContextualUseNPCInteraction.class, ContextualUseNPCInteraction.CODEC);
      Interaction.CODEC.register("UseNPC", UseNPCInteraction.class, UseNPCInteraction.CODEC);
      Interaction.CODEC.register("SpawnNPC", SpawnNPCInteraction.class, SpawnNPCInteraction.CODEC);
      Interaction.CODEC.register("SendBeacon", SendBeaconInteraction.class, SendBeaconInteraction.CODEC);
      Interaction.getAssetStore().loadAssets("Hytale:Hytale", List.of(new UseNPCInteraction("*UseNPC")));
      RootInteraction.getAssetStore().loadAssets("Hytale:Hytale", List.of(UseNPCInteraction.DEFAULT_ROOT));
      this.setupNPCLoading();
      this.blackboardResourceType = var1.registerResource(Blackboard.class, Blackboard::new);
      this.combatDataPoolResourceType = var1.registerResource(CombatViewSystems.CombatDataPool.class, CombatViewSystems.CombatDataPool::new);
      this.roleChangeQueueResourceType = var1.registerResource(RoleChangeSystem.RoleChangeQueue.class, RoleChangeSystem.RoleChangeQueue::new);
      this.newSpawnStartTickingQueueResourceType = var1.registerResource(
         NewSpawnStartTickingSystem.QueueResource.class, NewSpawnStartTickingSystem.QueueResource::new
      );
      this.sortBufferProviderResourceResourceType = var1.registerResource(SortBufferProviderResource.class, SortBufferProviderResource::new);
      this.aStarNodePoolProviderSimpleResourceType = var1.registerResource(AStarNodePoolProviderSimple.class, AStarNodePoolProviderSimple::new);
      this.npcSpatialResource = var1.registerSpatialResource(() -> new KDTree<>(Ref::isValid));
      this.spawnNPCInteractionFailureTrackerResourceType = var1.registerResource(
         SpawnNPCInteractionFailureTracker.class, SpawnNPCInteractionFailureTracker::new
      );
      this.combatDataComponentType = var1.registerComponent(CombatViewSystems.CombatData.class, CombatViewSystems.CombatData::new);
      this.npcTestDataComponentType = var1.registerComponent(NPCRunTestsCommand.NPCTestData.class, NPCRunTestsCommand.NPCTestData::new);
      this.beaconSupportComponentType = var1.registerComponent(BeaconSupport.class, BeaconSupport::new);
      this.npcBlockEventSupportComponentType = var1.registerComponent(NPCBlockEventSupport.class, NPCBlockEventSupport::new);
      this.playerBlockEventSupportComponentType = var1.registerComponent(PlayerBlockEventSupport.class, PlayerBlockEventSupport::new);
      this.npcEntityEventSupportComponentType = var1.registerComponent(NPCEntityEventSupport.class, NPCEntityEventSupport::new);
      this.playerEntityEventSupportComponentType = var1.registerComponent(PlayerEntityEventSupport.class, PlayerEntityEventSupport::new);
      this.blackboardSubscriptionComponentType = var1.registerComponent(BlackboardSubscription.class, BlackboardSubscription::new);
      this.stepComponentType = var1.registerComponent(StepComponent.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.failedSpawnComponentType = var1.registerComponent(FailedSpawnComponent.class, FailedSpawnComponent::new);
      this.timersComponentType = var1.registerComponent(Timers.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.stateEvaluatorComponentType = var1.registerComponent(StateEvaluator.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.valueStoreComponentType = var1.registerComponent(ValueStore.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.combatSupportComponentType = var1.registerComponent(CombatSupport.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.stateSupportComponentType = var1.registerComponent(StateSupport.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.markedEntitySupportComponentType = var1.registerComponent(MarkedEntitySupport.class, "MarkedEntitySupport", MarkedEntitySupport.CODEC);
      this.worldSupportComponentType = var1.registerComponent(WorldSupport.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.entitySupportComponentType = var1.registerComponent(EntitySupport.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.motionContextSupportComponentType = var1.registerComponent(MotionContextSupport.class, MotionContextSupport::new);
      this.displayNameSupportComponentType = var1.registerComponent(DisplayNameSupport.class, DisplayNameSupport::new);
      this.playerTaskSupportComponentType = var1.registerComponent(PlayerTaskSupport.class, PlayerTaskSupport::new);
      this.positionCacheComponentType = var1.registerComponent(PositionCache.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.debugSupportComponentType = var1.registerComponent(DebugSupport.class, () -> {
         throw new UnsupportedOperationException("Not implemented");
      });
      this.flagsComponentType = var1.registerComponent(FlagsComponent.class, FlagsComponent::new);
      this.alarmStoreComponentType = var1.registerComponent(AlarmStore.class, "AlarmStore", AlarmStore.CODEC);
      this.spawnLineageComponentType = var1.registerComponent(SpawnLineage.class, "SpawnLineage", SpawnLineage.CODEC);
      ComponentType var3 = NPCEntity.getComponentType();
      var1.registerSystem(new BlackboardSystems.InitSystem(this.blackboardResourceType));
      var1.registerSystem(new BlackboardSystems.TickingSystem(this.blackboardResourceType));
      var1.registerSystem(new BlackboardSystems.DamageBlockEventSystem());
      var1.registerSystem(new BlackboardSystems.BreakBlockEventSystem());
      var1.registerSystem(new BlackboardSystems.UseBlockEventSystem());
      var1.registerSystem(new BlackboardSystems.UseEntityEventSystem());
      var1.registerSystem(new SpawnNPCInteractionFailureTrackerSystems.BreakBlockClearSystem(this.spawnNPCInteractionFailureTrackerResourceType));
      var1.registerSystem(new CombatViewSystems.Ensure(this.combatDataComponentType));
      var1.registerSystem(new CombatViewSystems.EntityRemoved(this.combatDataComponentType, this.combatDataPoolResourceType));
      var1.registerSystem(new CombatViewSystems.Ticking(this.combatDataComponentType, this.combatDataPoolResourceType));
      var1.registerSystem(new NPCSystems.ModelChangeSystem());
      var1.registerSystem(new NPCSystems.OnNPCAdded());
      var1.registerSystem(new RoleBuilderSystem());
      var1.registerSystem(new BalancingInitialisationSystem());
      var1.registerSystem(new RoleSystems.RoleActivateSystem(var3));
      var1.registerSystem(new PositionCacheSystems.RoleActivateSystem(var3, this.stateEvaluatorComponentType));
      var1.registerSystem(new BlackboardSystems.SubscriptionLifecycleSystem(this.blackboardSubscriptionComponentType));
      var1.registerSystem(new NPCInteractionSystems.AddSimulationManagerSystem(var3));
      var1.registerSystem(new NPCInteractionSystems.TickHeldInteractionsSystem(var3));
      var1.registerSystem(new FailedSpawnSystem());
      var1.registerSystem(new NPCSystems.AddedSystem(var3));
      var1.registerSystem(new NPCSystems.AddedFromExternalSystem(var3));
      var1.registerSystem(new NPCSystems.AddedFromWorldGenSystem());
      var1.registerSystem(new NPCSystems.AddSpawnEntityEffectSystem(var3));
      var1.registerSystem(new RoleSystems.BehaviourTickSystem(var3, this.stepComponentType));
      var1.registerSystem(new RoleSystems.PreBehaviourSupportTickSystem(var3));
      var1.registerSystem(new RoleSystems.MarkedTargetRebindSystem(this.markedEntitySupportComponentType));
      var1.registerSystem(new StateEvaluatorSystem(this.stateEvaluatorComponentType, var3));
      var1.registerSystem(new PositionCacheSystems.UpdateSystem(this.npcSpatialResource));
      var1.registerSystem(new NPCPreTickSystem(var3));
      Set var4 = Set.of(new SystemDependency<>(Order.AFTER, RoleSystems.PostBehaviourSupportTickSystem.class));
      var1.registerSystem(new AvoidanceSystem(var3));
      var1.registerSystem(new SteeringSystem(var3));
      var1.registerSystem(new RoleSystems.PostBehaviourSupportTickSystem(var3));
      var1.registerSystem(new RoleSystems.WorldSupportTickSystem(this.worldSupportComponentType));
      var1.registerSystem(new RoleSystems.EntitySupportTickSystem(this.entitySupportComponentType));
      var1.registerSystem(new RoleSystems.PositionCacheClearSystem(this.positionCacheComponentType));
      var1.registerSystem(new RoleSystems.StateSupportUpdateSystem(this.stateSupportComponentType));
      var1.registerSystem(new RoleSystems.MarkedEntitySupportPostSystem(this.markedEntitySupportComponentType));
      var1.registerSystem(new RoleSystems.RoleDebugSystem(var3, var4));
      var1.registerSystem(new TimerSystem(this.timersComponentType, var4));
      var1.registerSystem(new ComputeVelocitySystem(var3, EntityModule.get().getVelocityComponentType(), var4));
      var1.registerSystem(new MovementStatesSystem(var3, EntityModule.get().getVelocityComponentType(), EntityModule.get().getMovementStatesComponentType()));
      var1.registerSystem(new MessageSupportSystem.BeaconSystem(this.beaconSupportComponentType, var4));
      var1.registerSystem(new MessageSupportSystem.NPCBlockEventSystem(this.npcBlockEventSupportComponentType, var4));
      var1.registerSystem(new MessageSupportSystem.PlayerBlockEventSystem(this.playerBlockEventSupportComponentType, var4));
      var1.registerSystem(new MessageSupportSystem.NPCEntityEventSystem(this.npcEntityEventSupportComponentType, var4));
      var1.registerSystem(new MessageSupportSystem.PlayerEntityEventSystem(this.playerEntityEventSupportComponentType, var4));
      var1.registerSystem(new StepCleanupSystem(this.stepComponentType));
      var1.registerSystem(new NewSpawnStartTickingSystem(this.newSpawnStartTickingQueueResourceType));
      var1.registerSystem(
         new RoleChangeSystem(
            this.roleChangeQueueResourceType,
            this.beaconSupportComponentType,
            this.playerBlockEventSupportComponentType,
            this.npcBlockEventSupportComponentType,
            this.playerEntityEventSupportComponentType,
            this.npcEntityEventSupportComponentType,
            this.timersComponentType,
            this.stateEvaluatorComponentType,
            this.valueStoreComponentType
         )
      );
      var1.registerSystem(new NPCSpatialSystem(this.npcSpatialResource));
      var1.registerSystem(new NPCDeathSystems.NPCKillsEntitySystem());
      var1.registerSystem(new NPCDeathSystems.EntityViewSystem());
      var1.registerSystem(new NPCDamageSystems.FilterDamageSystem());
      var1.registerSystem(new NPCDamageSystems.DamageReceivedSystem());
      var1.registerSystem(new NPCDamageSystems.DamageDealtSystem());
      var1.registerSystem(new NPCDamageSystems.DamageReceivedEventViewSystem());
      var1.registerSystem(new NPCDamageSystems.DropDeathItems());
      var1.registerSystem(new NPCSystems.OnTeleportSystem());
      var1.registerSystem(new NPCSystems.OnDeathSystem());
      var1.registerSystem(new NPCSystems.LegacyWorldGenId());
      var1.registerSystem(new NPCSystems.KillFeedKillerEventSystem());
      var1.registerSystem(new NPCSystems.KillFeedDecedentEventSystem());
      var1.registerSystem(new NPCSystems.PrefabPlaceEntityEventSystem());
      var1.registerSystem(new NPCSystems.BreathingCheckEventSystem());
      var1.registerSystem(new NPCVelocityInstructionSystem());
      var1.registerSystem(new NPCPlugin.NPCEntityRegenerateStatsSystem());
   }

   @Override
   class="kw">protected void start() {
      NPCPlugin.NPCConfig var1 = this.config.get();
      if (var1.isGenerateDescriptors()) {
         this.generateDescriptors();
         if (var1.isGenerateDescriptorsFile()) {
            this.saveDescriptors();
         }
      }
   }

   class="kw">public ResourceType<EntityStore, Blackboard> getBlackboardResourceType() {
      class="kw">return this.blackboardResourceType;
   }

   @Nonnull
   class="kw">public ComponentType<EntityStore, BlackboardSubscription> getBlackboardSubscriptionComponentType() {
      class="kw">return this.blackboardSubscriptionComponentType;
   }

   class="kw">public ResourceType<EntityStore, CombatViewSystems.CombatDataPool> getCombatDataPoolResourceType() {
      class="kw">return this.combatDataPoolResourceType;
   }

   class="kw">public ResourceType<EntityStore, RoleChangeSystem.RoleChangeQueue> getRoleChangeQueueResourceType() {
      class="kw">return this.roleChangeQueueResourceType;
   }

   class="kw">public ResourceType<EntityStore, NewSpawnStartTickingSystem.QueueResource> getNewSpawnStartTickingQueueResourceType() {
      class="kw">return this.newSpawnStartTickingQueueResourceType;
   }

   class="kw">public ResourceType<EntityStore, SortBufferProviderResource> getSortBufferProviderResourceResourceType() {
      class="kw">return this.sortBufferProviderResourceResourceType;
   }

   class="kw">public ResourceType<EntityStore, AStarNodePoolProviderSimple> getAStarNodePoolProviderSimpleResourceType() {
      class="kw">return this.aStarNodePoolProviderSimpleResourceType;
   }

   class="kw">public ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> getNpcSpatialResource() {
      class="kw">return this.npcSpatialResource;
   }

   class="kw">public void registerBeaconReceiverProvider(@Nonnull BeaconReceiverProvider var1) {
      this.beaconReceiverProviders.add(var1);
   }

   @Nonnull
   class="kw">public List<BeaconReceiverProvider> getBeaconReceiverProviders() {
      class="kw">return this.beaconReceiverProviders;
   }

   class="kw">public ResourceType<EntityStore, SpawnNPCInteractionFailureTracker> getSpawnNPCInteractionFailureTrackerResourceType() {
      class="kw">return this.spawnNPCInteractionFailureTrackerResourceType;
   }

   class="kw">public ComponentType<EntityStore, CombatViewSystems.CombatData> getCombatDataComponentType() {
      class="kw">return this.combatDataComponentType;
   }

   class="kw">public ComponentType<EntityStore, NPCRunTestsCommand.NPCTestData> getNpcTestDataComponentType() {
      class="kw">return this.npcTestDataComponentType;
   }

   class="kw">public ComponentType<EntityStore, BeaconSupport> getBeaconSupportComponentType() {
      class="kw">return this.beaconSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, NPCBlockEventSupport> getNpcBlockEventSupportComponentType() {
      class="kw">return this.npcBlockEventSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, PlayerBlockEventSupport> getPlayerBlockEventSupportComponentType() {
      class="kw">return this.playerBlockEventSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, NPCEntityEventSupport> getNpcEntityEventSupportComponentType() {
      class="kw">return this.npcEntityEventSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, PlayerEntityEventSupport> getPlayerEntityEventSupportComponentType() {
      class="kw">return this.playerEntityEventSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, CombatSupport> getCombatSupportComponentType() {
      class="kw">return this.combatSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, StateSupport> getStateSupportComponentType() {
      class="kw">return this.stateSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, MarkedEntitySupport> getMarkedEntitySupportComponentType() {
      class="kw">return this.markedEntitySupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, WorldSupport> getWorldSupportComponentType() {
      class="kw">return this.worldSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, EntitySupport> getEntitySupportComponentType() {
      class="kw">return this.entitySupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, MotionContextSupport> getMotionContextSupportComponentType() {
      class="kw">return this.motionContextSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, DisplayNameSupport> getDisplayNameSupportComponentType() {
      class="kw">return this.displayNameSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, PlayerTaskSupport> getPlayerTaskSupportComponentType() {
      class="kw">return this.playerTaskSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, PositionCache> getPositionCacheComponentType() {
      class="kw">return this.positionCacheComponentType;
   }

   class="kw">public ComponentType<EntityStore, DebugSupport> getDebugSupportComponentType() {
      class="kw">return this.debugSupportComponentType;
   }

   class="kw">public ComponentType<EntityStore, AlarmStore> getAlarmStoreComponentType() {
      class="kw">return this.alarmStoreComponentType;
   }

   class="kw">public ComponentType<EntityStore, SpawnLineage> getSpawnLineageComponentType() {
      class="kw">return this.spawnLineageComponentType;
   }

   class="kw">public ComponentType<EntityStore, FlagsComponent> getFlagsComponentType() {
      class="kw">return this.flagsComponentType;
   }

   class="kw">public ComponentType<EntityStore, StepComponent> getStepComponentType() {
      class="kw">return this.stepComponentType;
   }

   class="kw">public ComponentType<EntityStore, FailedSpawnComponent> getFailedSpawnComponentType() {
      class="kw">return this.failedSpawnComponentType;
   }

   class="kw">public ComponentType<EntityStore, Timers> getTimersComponentType() {
      class="kw">return this.timersComponentType;
   }

   class="kw">public ComponentType<EntityStore, StateEvaluator> getStateEvaluatorComponentType() {
      class="kw">return this.stateEvaluatorComponentType;
   }

   class="kw">public ComponentType<EntityStore, ValueStore> getValueStoreComponentType() {
      class="kw">return this.valueStoreComponentType;
   }

   class="kw">public void setupNPCLoading() {
      this.builderManager.addCategory("Role", Role.class);
      this.builderManager.addCategory("BodyMotion", BodyMotion.class);
      this.builderManager.addCategory("HeadMotion", HeadMotion.class);
      this.builderManager.addCategory("Action", Action.class);
      this.builderManager.addCategory("Sensor", Sensor.class);
      this.builderManager.addCategory("Instruction", Instruction.class);
      this.builderManager.addCategory("Path", TransientPathDefinition.class);
      this.builderManager.addCategory("ActionList", ActionList.class);
      this.registerCoreFactories();
      this.registerCoreComponentType("Nothing", BuilderBodyMotionNothing::new)
         .registerCoreComponentType("Wander", BuilderBodyMotionWander::new)
         .registerCoreComponentType("WanderInCircle", BuilderBodyMotionWanderInCircle::new)
         .registerCoreComponentType("WanderInRect", BuilderBodyMotionWanderInRect::new)
         .registerCoreComponentType("Timer", BuilderBodyMotionTimer::new)
         .registerCoreComponentType("Sequence", BuilderBodyMotionSequence::new)
         .registerCoreComponentType("Flee", BuilderBodyMotionMoveAway::new)
         .registerCoreComponentType("Seek", BuilderBodyMotionFind::new)
         .registerCoreComponentType("Leave", BuilderBodyMotionLeave::new)
         .registerCoreComponentType("Path", BuilderBodyMotionPath::new)
         .registerCoreComponentType("TakeOff", BuilderBodyMotionTakeOff::new)
         .registerCoreComponentType("TestProbe", BuilderBodyMotionTestProbe::new)
         .registerCoreComponentType("Teleport", BuilderBodyMotionTeleport::new)
         .registerCoreComponentType("Land", BuilderBodyMotionLand::new)
         .registerCoreComponentType("MatchLook", BuilderBodyMotionMatchLook::new)
         .registerCoreComponentType("MaintainDistance", BuilderBodyMotionMaintainDistance::new)
         .registerCoreComponentType("AimCharge", BuilderBodyMotionAimCharge::new)
         .registerCoreComponentType("Charge", BuilderBodyMotionCharge::new);
      this.registerCoreComponentType("Aim", BuilderHeadMotionAim::new)
         .registerCoreComponentType("Watch", BuilderHeadMotionWatch::new)
         .registerCoreComponentType("Observe", BuilderHeadMotionObserve::new)
         .registerCoreComponentType("Rotate", BuilderHeadMotionRotate::new)
         .registerCoreComponentType("Sequence", BuilderHeadMotionSequence::new)
         .registerCoreComponentType("Timer", BuilderHeadMotionTimer::new)
         .registerCoreComponentType("Nothing", BuilderHeadMotionNothing::new);
      this.registerCoreComponentType("Appearance", BuilderActionAppearance::new)
         .registerCoreComponentType("Timeout", BuilderActionTimeout::new)
         .registerCoreComponentType("Spawn", BuilderActionSpawn::new)
         .registerCoreComponentType("Nothing", BuilderActionNothing::new)
         .registerCoreComponentType("Attack", BuilderActionAttack::new)
         .registerCoreComponentType("State", BuilderActionState::new)
         .registerCoreComponentType("ReleaseTarget", BuilderActionReleaseTarget::new)
         .registerCoreComponentType("SetMarkedTarget", BuilderActionSetMarkedTarget::new)
         .registerCoreComponentType("Inventory", BuilderActionInventory::new)
         .registerCoreComponentType("DisplayName", BuilderActionDisplayName::new)
         .registerCoreComponentType("Sequence", BuilderActionSequence::new)
         .registerCoreComponentType("Random", BuilderActionRandom::new)
         .registerCoreComponentType("ForEach", BuilderActionForEach::new)
         .registerCoreComponentType("AdjustPosition", BuilderActionAdjustPosition::new)
         .registerCoreComponentType("ProjectToGround", BuilderActionProjectToGround::new)
         .registerCoreComponentType("Beacon", BuilderActionBeacon::new)
         .registerCoreComponentType("SetLeashPosition", BuilderActionSetLeashPosition::new)
         .registerCoreComponentType("PlaySound", BuilderActionPlaySound::new)
         .registerCoreComponentType("Despawn", BuilderActionDespawn::new)
         .registerCoreComponentType("PlayAnimation", BuilderActionPlayAnimation::new)
         .registerCoreComponentType("DelayDespawn", BuilderActionDelayDespawn::new)
         .registerCoreComponentType("SpawnParticles", BuilderActionSpawnParticles::new)
         .registerCoreComponentType("Crouch", BuilderActionCrouch::new)
         .registerCoreComponentType("TimerStart", BuilderActionTimerStart::new)
         .registerCoreComponentType("TimerContinue", BuilderActionTimerContinue::new)
         .registerCoreComponentType("TimerPause", BuilderActionTimerPause::new)
         .registerCoreComponentType("TimerModify", BuilderActionTimerModify::new)
         .registerCoreComponentType("TimerStop", BuilderActionTimerStop::new)
         .registerCoreComponentType("TimerRestart", BuilderActionTimerRestart::new)
         .registerCoreComponentType("Test", BuilderActionTest::new)
         .registerCoreComponentType("Log", BuilderActionLog::new)
         .registerCoreComponentType("Role", BuilderActionRole::new)
         .registerCoreComponentType("SetFlag", BuilderActionSetFlag::new)
         .registerCoreComponentType("DropItem", BuilderActionDropItem::new)
         .registerCoreComponentType("PickUpItem", BuilderActionPickUpItem::new)
         .registerCoreComponentType("ResetInstructions", BuilderActionResetInstructions::new)
         .registerCoreComponentType("ParentState", BuilderActionParentState::new)
         .registerCoreComponentType("Notify", BuilderActionNotify::new)
         .registerCoreComponentType("TriggerSpawners", BuilderActionTriggerSpawners::new)
         .registerCoreComponentType("ResetBlockSensors", BuilderActionResetBlockSensors::new)
         .registerCoreComponentType("MakePath", BuilderActionMakePath::new)
         .registerCoreComponentType("OverrideAttitude", BuilderActionOverrideAttitude::new)
         .registerCoreComponentType("SetInteractable", BuilderActionSetInteractable::new)
         .registerCoreComponentType("LockOnInteractionTarget", BuilderActionLockOnInteractionTarget::new)
         .registerCoreComponentType("StorePosition", BuilderActionStorePosition::new)
         .registerCoreComponentType("SetBlockToPlace", BuilderActionSetBlockToPlace::new)
         .registerCoreComponentType("PlaceBlock", BuilderActionPlaceBlock::new)
         .registerCoreComponentType("RecomputePath", BuilderActionRecomputePath::new)
         .registerCoreComponentType("IgnoreForAvoidance", BuilderActionIgnoreForAvoidance::new)
         .registerCoreComponentType("ModelAttachment", BuilderActionModelAttachment::new)
         .registerCoreComponentType("SetAlarm", BuilderActionSetAlarm::new)
         .registerCoreComponentType("ToggleStateEvaluator", BuilderActionToggleStateEvaluator::new)
         .registerCoreComponentType("OverrideAltitude", BuilderActionOverrideAltitude::new)
         .registerCoreComponentType("ResetSearchRays", BuilderActionResetSearchRays::new)
         .registerCoreComponentType("Die", BuilderActionDie::new)
         .registerCoreComponentType("Remove", BuilderActionRemove::new)
         .registerCoreComponentType("ApplyEntityEffect", BuilderActionApplyEntityEffect::new)
         .registerCoreComponentType("ResetPath", BuilderActionResetPath::new)
         .registerCoreComponentType("SetStat", BuilderActionSetStat::new)
         .registerCoreComponentType("BlockHitInteraction", BuilderActionBlockHitInteraction::new)
         .registerCoreComponentType("EntityHitInteraction", BuilderActionEntityHitInteraction::new)
         .registerCoreComponentType("SpawnInteraction", BuilderActionSpawnInteraction::new)
         .registerCoreComponentType("SetHealthRegen", BuilderActionSetHealthRegen::new)
         .registerCoreComponentType("SetInvulnerable", BuilderActionSetInvulnerable::new);
      this.registerCoreComponentType("Any", BuilderSensorAny::new)
         .registerCoreComponentType("And", BuilderSensorAnd::new)
         .registerCoreComponentType("Or", BuilderSensorOr::new)
         .registerCoreComponentType("Not", BuilderSensorNot::new)
         .registerCoreComponentType("Player", BuilderSensorPlayer::new)
         .registerCoreComponentType("Mob", BuilderSensorEntity::new)
         .registerCoreComponentType("State", BuilderSensorState::new)
         .registerCoreComponentType("InAir", BuilderSensorInAir::new)
         .registerCoreComponentType("OnGround", BuilderSensorOnGround::new)
         .registerCoreComponentType("Eval", BuilderSensorEval::new)
         .registerCoreComponentType("Damage", BuilderSensorDamage::new)
         .registerCoreComponentType("ChargeState", BuilderSensorChargeState::new)
         .registerCoreComponentType("ChargeBlockCollisions", BuilderSensorChargeBlockCollisions::new)
         .registerCoreComponentType("ChargeEntityCollisions", BuilderSensorChargeEntityCollisions::new)
         .registerCoreComponentType("IsBackingAway", BuilderSensorIsBackingAway::new)
         .registerCoreComponentType("Kill", BuilderSensorKill::new)
         .registerCoreComponentType("Beacon", BuilderSensorBeacon::new)
         .registerCoreComponentType("MotionController", BuilderSensorMotionController::new)
         .registerCoreComponentType("Leash", BuilderSensorLeash::new)
         .registerCoreComponentType("Time", BuilderSensorTime::new)
         .registerCoreComponentType("Count", BuilderSensorCount::new)
         .registerCoreComponentType("Target", BuilderSensorTarget::new)
         .registerCoreComponentType("Timer", BuilderSensorTimer::new)
         .registerCoreComponentType("Switch", BuilderSensorSwitch::new)
         .registerCoreComponentType("Light", BuilderSensorLight::new)
         .registerCoreComponentType("Age", BuilderSensorAge::new)
         .registerCoreComponentType("Flag", BuilderSensorFlag::new)
         .registerCoreComponentType("DroppedItem", BuilderSensorDroppedItem::new)
         .registerCoreComponentType("Path", BuilderSensorPath::new)
         .registerCoreComponentType("Weather", BuilderSensorWeather::new)
         .registerCoreComponentType("Block", BuilderSensorBlock::new)
         .registerCoreComponentType("BlockChange", BuilderSensorBlockChange::new)
         .registerCoreComponentType("EntityEvent", BuilderSensorEntityEvent::new)
         .registerCoreComponentType("Random", BuilderSensorRandom::new)
         .registerCoreComponentType("CanInteract", BuilderSensorCanInteract::new)
         .registerCoreComponentType("HasInteracted", BuilderSensorHasInteracted::new)
         .registerCoreComponentType("ReadPosition", BuilderSensorReadPosition::new)
         .registerCoreComponentType("Points", BuilderSensorPoints::new)
         .registerCoreComponentType("Animation", BuilderSensorAnimation::new)
         .registerCoreComponentType("CanPlaceBlock", BuilderSensorCanPlace::new)
         .registerCoreComponentType("Nav", BuilderSensorNav::new)
         .registerCoreComponentType("InWater", BuilderSensorInWater::new)
         .registerCoreComponentType("IsBusy", BuilderSensorIsBusy::new)
         .registerCoreComponentType("InteractionContext", BuilderSensorInteractionContext::new)
         .registerCoreComponentType("Alarm", BuilderSensorAlarm::new)
         .registerCoreComponentType("AdjustPosition", BuilderSensorAdjustPosition::new)
         .registerCoreComponentType("ProjectToGround", BuilderSensorProjectToGround::new)
         .registerCoreComponentType("SearchRay", BuilderSensorSearchRay::new)
         .registerCoreComponentType("BlockType", BuilderSensorBlockType::new)
         .registerCoreComponentType("Self", BuilderSensorSelf::new)
         .registerCoreComponentType("ValueProviderWrapper", BuilderSensorValueProviderWrapper::new);
      this.registerCoreComponentType("Attitude", BuilderEntityFilterAttitude::new)
         .registerCoreComponentType("LineOfSight", BuilderEntityFilterLineOfSight::new)
         .registerCoreComponentType("HeightDifference", BuilderEntityFilterHeightDifference::new)
         .registerCoreComponentType("ViewSector", BuilderEntityFilterViewSector::new)
         .registerCoreComponentType("Combat", BuilderEntityFilterCombat::new)
         .registerCoreComponentType("ItemInHand", BuilderEntityFilterItemInHand::new)
         .registerCoreComponentType("NPCGroup", BuilderEntityFilterNPCGroup::new)
         .registerCoreComponentType("MovementState", BuilderEntityFilterMovementState::new)
         .registerCoreComponentType("SpotsMe", BuilderEntityFilterSpotsMe::new)
         .registerCoreComponentType("StandingOnBlock", BuilderEntityFilterStandingOnBlock::new)
         .registerCoreComponentType("Stat", BuilderEntityFilterStat::new)
         .registerCoreComponentType("Inventory", BuilderEntityFilterInventory::new)
         .registerCoreComponentType("Not", BuilderEntityFilterNot::new)
         .registerCoreComponentType("And", BuilderEntityFilterAnd::new)
         .registerCoreComponentType("Or", BuilderEntityFilterOr::new)
         .registerCoreComponentType("Altitude", BuilderEntityFilterAltitude::new)
         .registerCoreComponentType("InsideBlock", BuilderEntityFilterInsideBlock::new)
         .registerCoreComponentType("EntityEffect", BuilderEntityFilterEntityEffect::new)
         .registerCoreComponentType("IsExecutingInteraction", BuilderEntityFilterExecutingInteraction::new)
         .registerCoreComponentType("IsDead", BuilderEntityFilterDeath::new);
      this.registerCoreComponentType("Attitude", BuilderSensorEntityPrioritiserAttitude::new);
      NPCPlugin.NPCConfig var1 = this.config.get();
      this.autoReload = var1.isAutoReload();
      this.validateBuilder = var1.isValidateBuilder();
      this.maxBlackboardBlockCountPerType = var1.getMaxBlackboardBlockType();
      this.logFailingTestErrors = var1.isLogFailingTestErrors();
      this.presetCoverageTestNPCs = var1.getPresetCoverageTestNPCs();
   }

   class="kw">public String[] getPresetCoverageTestNPCs() {
      class="kw">return this.presetCoverageTestNPCs;
   }

   @Nullable
   class="kw">public Pair<Ref<EntityStore>, INonPlayerCharacter> spawnNPC(
      @Nonnull Store<EntityStore> var1, @Nonnull String var2, @Nullable String var3, @Nonnull Vector3dc var4, @Nonnull Rotation3fc var5
   ) {
      int var6 = this.getIndex(var2);
      if (var6 < 0) {
         class="kw">return null;
      } else {
         Pair var7 = this.spawnEntity(var1, var6, var4, var5, null, null);
         FlockAsset var8 = var3 != null ? FlockAsset.getAssetMap().getAsset(var3) : null;
         if (var7 != null) {
            Ref var9 = (Ref<EntityStore>)var7.first();
            NPCEntity var10 = (NPCEntity)var7.second();
            FlockPlugin.trySpawnFlock(var9, var10, var1, var6, var4, var5, var8, null);
            class="kw">return Pair.of((Ref)var7.first(), (INonPlayerCharacter)var7.second());
         } else {
            class="kw">return null;
         }
      }
   }

   @Nonnull
   class="kw">public SpawnTestResult spawnNPCWithSpaceValidation(
      @Nonnull Store<EntityStore> var1, @Nonnull String var2, @Nullable String var3, @Nonnull Vector3dc var4, @Nonnull Rotation3fc var5
   ) {
      class="kw">return this.spawnNPCWithSpaceValidation(var1, var2, var3, var4, var5, null);
   }

   @Nonnull
   class="kw">public SpawnTestResult spawnNPCWithSpaceValidation(
      @Nonnull Store<EntityStore> var1,
      @Nonnull String var2,
      @Nullable String var3,
      @Nonnull Vector3dc var4,
      @Nonnull Rotation3fc var5,
      @Nullable TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var6
   ) {
      class="kw">return this.spawnNPCWithSpaceValidation(var1, var2, var3, var4, var5, var6, false, false);
   }

   @Nonnull
   class="kw">public SpawnTestResult spawnNPCWithSpaceValidation(
      @Nonnull Store<EntityStore> var1,
      @Nonnull String var2,
      @Nullable String var3,
      @Nonnull Vector3dc var4,
      @Nonnull Rotation3fc var5,
      @Nullable TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var6,
      boolean var7,
      boolean var8
   ) {
      Vector3d var9 = new Vector3d(var4);
      SpawnTestResult var10 = this.canSpawnAtExactPosition(var1, var2, var9, var7, var8);
      if (var10 != SpawnTestResult.TEST_OK) {
         class="kw">return var10;
      }

      int var11 = this.getIndex(var2);
      if (var11 < 0) {
         class="kw">return SpawnTestResult.FAIL_SPAWN;
      }

      Pair var12 = this.spawnEntity(var1, var11, var9, var5, null, var6);
      if (var12 == null) {
         class="kw">return SpawnTestResult.FAIL_SPAWN;
      }

      FlockAsset var13 = var3 != null ? FlockAsset.getAssetMap().getAsset(var3) : null;
      FlockPlugin.trySpawnFlock((Ref<EntityStore>)var12.first(), (NPCEntity)var12.second(), var1, var11, var9, var5, var13, null);
      class="kw">return SpawnTestResult.TEST_OK;
   }

   @Nonnull
   class="kw">public SpawnTestResult spawnNPCWithColumnProbe(
      @Nonnull Store<EntityStore> var1,
      @Nonnull String var2,
      @Nullable String var3,
      @Nonnull World var4,
      int var5,
      int var6,
      double var7,
      @Nonnull Rotation3fc var9
   ) {
      class="kw">return this.spawnNPCWithColumnProbe(var1, var2, var3, var4, var5, var6, var7, var9, null);
   }

   @Nonnull
   class="kw">public SpawnTestResult spawnNPCWithColumnProbe(
      @Nonnull Store<EntityStore> var1,
      @Nonnull String var2,
      @Nullable String var3,
      @Nonnull World var4,
      int var5,
      int var6,
      double var7,
      @Nonnull Rotation3fc var9,
      @Nullable TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var10
   ) {
      int var11 = this.getIndex(var2);
      if (var11 < 0) {
         class="kw">return SpawnTestResult.FAIL_NOT_SPAWNABLE;
      }

      Builder var12 = this.tryGetCachedValidRole(var11);
      if (var12 != null && var12.isSpawnable() && var12 class="kw">instanceof ISpawnableWithModel var13) {
         SpawningContext var14 = new SpawningContext();

         try {
            if (!var14.setSpawnable(var13)) {
               class="kw">return SpawnTestResult.FAIL_NOT_SPAWNABLE;
            }

            double var15 = var5 + 0.5;
            double var17 = var6 + 0.5;
            if (!var14.set(var4, var15, var7, var17)) {
               class="kw">return SpawnTestResult.FAIL_INVALID_POSITION;
            }

            if (var14.canSpawn() != SpawnTestResult.TEST_OK) {
               class="kw">return SpawnTestResult.FAIL_INVALID_POSITION;
            }

            Model var19 = var14.getModel();
            if (var19 == null) {
               class="kw">return SpawnTestResult.FAIL_INVALID_POSITION;
            }

            Vector3d var20 = new Vector3d(var14.xSpawn, var14.ySpawn, var14.zSpawn);
            Pair var21 = this.spawnEntity(var1, var11, var20, var9, var19, var10);
            if (var21 == null) {
               class="kw">return SpawnTestResult.FAIL_SPAWN;
            }

            FlockAsset var22 = var3 != null ? FlockAsset.getAssetMap().getAsset(var3) : null;
            FlockPlugin.trySpawnFlock((Ref<EntityStore>)var21.first(), (NPCEntity)var21.second(), var1, var11, var20, var9, var22, null);
            class="kw">return SpawnTestResult.TEST_OK;
         } class="kw">finally {
            var14.releaseFull();
         }
      } else {
         class="kw">return SpawnTestResult.FAIL_NOT_SPAWNABLE;
      }
   }

   @Nonnull
   class="kw">private SpawnTestResult canSpawnAtExactPosition(@Nonnull Store<EntityStore> var1, @Nonnull String var2, @Nonnull Vector3d var3, boolean var4, boolean var5) {
      int var6 = this.getIndex(var2);
      if (var6 < 0) {
         class="kw">return SpawnTestResult.FAIL_NOT_SPAWNABLE;
      }

      Builder var7 = this.tryGetCachedValidRole(var6);
      if (var7 != null && var7.isSpawnable() && var7 class="kw">instanceof ISpawnableWithModel var8) {
         SpawningContext var9 = new SpawningContext();

         try {
            if (!var9.setSpawnable(var8)) {
               class="kw">return SpawnTestResult.FAIL_NOT_SPAWNABLE;
            }

            if (var5) {
               Model var10 = var9.getModel();
               if (var10 != null && var10.getBoundingBox() != null) {
                  Box var11 = var10.getBoundingBox();
                  var3.sub(var11.middleX(), var11.middleY(), var11.middleZ());
               }
            }

            World var15 = var1.getExternalData().getWorld();
            if (!var9.setExact(var15, var3.x(), var3.y(), var3.z())) {
               class="kw">return SpawnTestResult.FAIL_INVALID_POSITION;
            } else {
               class="kw">return var9.validatePosition(20, var4) ? SpawnTestResult.TEST_OK : SpawnTestResult.FAIL_INVALID_POSITION;
            }
         } class="kw">finally {
            var9.releaseFull();
         }
      } else {
         class="kw">return SpawnTestResult.FAIL_NOT_SPAWNABLE;
      }
   }

   class="kw">public class="kw">static void reloadNPCsWithRole(int var0) {
      Universe.get()
         .getWorlds()
         .forEach((var1, var2) -> var2.execute(() -> var2.getEntityStore().getStore().forEachChunk(NPCEntity.getComponentType(), (var2x, var3) -> {
            for (int var4 = 0; var4 < var2x.size(); var4++) {
               NPCEntity var5 = var2x.getComponent(var4, NPCEntity.getComponentType());
               if (var5.getRoleIndex() == var0 && !var5.getRole().isRoleChangeRequested()) {
                  RoleChangeSystem.requestRoleChange(var2x.getReferenceTo(var4), var5.getRole(), var0, true, var2.getEntityStore().getStore());
               }
            }
         })));
   }

   class="kw">protected void onNPCGroupsLoaded(LoadedAssetsEvent<String, NPCGroup, AssetMap<String, NPCGroup>> var1) {
      this.putNPCGroups();
   }

   class="kw">protected void onNPCGroupsRemoved(RemovedAssetsEvent<String, NPCGroup, AssetMap<String, NPCGroup>> var1) {
      this.putNPCGroups();
   }

   class="kw">protected void onAttitudeGroupsLoaded(@Nonnull LoadedAssetsEvent<String, AttitudeGroup, AssetMap<String, AttitudeGroup>> var1) {
      if (this.attitudeMap == null) {
         this.putAttitudeGroups();
      } else {
         Map var2 = var1.getLoadedAssets();
         IndexedLookupTableAssetMap var3 = AttitudeGroup.getAssetMap();
         int var4 = this.attitudeMap.getAttitudeGroupCount();

         for (String var6 : var2.keySet()) {
            int var7 = var3.getIndex(var6);
            if (var7 == Integer.MIN_VALUE) {
               throw new IllegalArgumentException("Unknown key! " + var6);
            }

            if (var7 >= var4) {
               this.putAttitudeGroups();
               class="kw">return;
            }
         }

         var2.forEach((var2x, var3x) -> {
            int var4 = var3.getIndex(var2x);
            if (var4 == Integer.MIN_VALUE) {
               throw new IllegalArgumentException("Unknown key! " + var2x);
            }

            this.attitudeMap.updateAttitudeGroup(var4, var3x);
         });
      }
   }

   class="kw">protected void onAttitudeGroupsRemoved(RemovedAssetsEvent<String, AttitudeGroup, AssetMap<String, AttitudeGroup>> var1) {
      this.putAttitudeGroups();
   }

   class="kw">protected void onItemAttitudeGroupsLoaded(@Nonnull LoadedAssetsEvent<String, ItemAttitudeGroup, AssetMap<String, ItemAttitudeGroup>> var1) {
      if (this.itemAttitudeMap == null) {
         this.putItemAttitudeGroups();
      } else {
         Map var2 = var1.getLoadedAssets();
         IndexedLookupTableAssetMap var3 = ItemAttitudeGroup.getAssetMap();
         int var4 = this.itemAttitudeMap.getAttitudeGroupCount();

         for (String var6 : var2.keySet()) {
            int var7 = var3.getIndex(var6);
            if (var7 == Integer.MIN_VALUE) {
               throw new IllegalArgumentException("Unknown key! " + var6);
            }

            if (var7 >= var4) {
               this.putItemAttitudeGroups();
               class="kw">return;
            }
         }

         var2.forEach((var2x, var3x) -> {
            int var4 = var3.getIndex(var2x);
            if (var4 == Integer.MIN_VALUE) {
               throw new IllegalArgumentException("Unknown key! " + var2x);
            }

            this.itemAttitudeMap.updateAttitudeGroup(var4, var3x);
         });
      }
   }

   class="kw">protected void onItemAttitudeGroupsRemoved(RemovedAssetsEvent<String, ItemAttitudeGroup, AssetMap<String, ItemAttitudeGroup>> var1) {
      this.putItemAttitudeGroups();
   }

   class="kw">protected void onBlockSetsLoaded(@Nonnull LoadedAssetsEvent<String, BlockSet, DefaultAssetMap<String, BlockSet>> var1) {
      this.builderManager.getAllBuilders().forEach((var1x, var2) -> {
         if (var2.getBuilder().category() == Role.class) {
            Int2ObjectOpenHashMap var3 = new Int2ObjectOpenHashMap();
            var3.put(var1x, var2);
            ObjectArrayList var4 = new ObjectArrayList();
            this.builderManager.validateAllLoadedBuilders(var3, false, var4);
            if (var4.isEmpty()) {
               var2.setValidated(true);
            } else {
               var2.setValidated(false);
               Iterator var5 = var4.iterator();

               while (var5.hasNext()) {
                  String var6 = (String)var5.next();
                  get().getLogger().at(Level.SEVERE).log("%s", var6);
               }
            }
         }
      });
   }

   class="kw">private void putItemAttitudeGroups() {
      ItemAttitudeMap.Builder var1 = new ItemAttitudeMap.Builder();
      var1.addAttitudeGroups(ItemAttitudeGroup.getAssetMap().getAssetMap());
      this.itemAttitudeMap = var1.build();
   }

   class="kw">protected void onPathChange(WorldPathChangedEvent var1) {
      this.pathChangeRevision.getAndIncrement();
   }

   class="kw">public int getPathChangeRevision() {
      class="kw">return this.pathChangeRevision.get();
   }

   class="kw">protected void onNPCsLoaded(AllNPCsLoadedEvent var1) {
      this.putNPCGroups();
   }

   class="kw">private void putNPCGroups() {
      IndexedLookupTableAssetMap var1 = NPCGroup.getAssetMap();
      Object2IntOpenHashMap var2 = new Object2IntOpenHashMap();
      var1.getAssetMap().forEach((var2x, var3) -> {
         int var4 = var1.getIndex(var2x);
         if (var4 == Integer.MIN_VALUE) {
            throw new IllegalArgumentException("Unknown key! " + var2x);
         }

         var2.put(var2x, var4);
      });
      TagSetPlugin.get(NPCGroup.class).putAssetSets(var1.getAssetMap(), var2, this.builderManager.getNameToIndexMap());
      this.putAttitudeGroups();
   }

   class="kw">private void putAttitudeGroups() {
      AttitudeMap.Builder var1 = new AttitudeMap.Builder();
      var1.addAttitudeGroups(AttitudeGroup.getAssetMap().getAssetMap());
      this.attitudeMap = var1.build();
   }

   @Nullable
   class="kw">public String getName(int var1) {
      class="kw">return this.builderManager.lookupName(var1);
   }

   class="kw">public int getIndex(String var1) {
      class="kw">return this.builderManager.getIndex(var1);
   }

   @Nullable
   class="kw">public Builder<Role> tryGetCachedValidRole(int var1) {
      class="kw">return this.builderManager.tryGetCachedValidRole(var1);
   }

   @Nullable
   class="kw">public BuilderInfo getBuilderInfo(Builder<?> var1) {
      class="kw">return this.builderManager.getBuilderInfo(var1);
   }

   class="kw">public List<String> getRoleTemplateNames(boolean var1) {
      class="kw">return this.builderManager
         .collectMatchingBuilders(
            new ObjectArrayList(),
            var1x -> var1x.getBuilder().category() == Role.class && (!var1 || var1x.getBuilder().isSpawnable()),
            (var0, var1x) -> var1x.add(var0.getKeyName())
         );
   }

   class="kw">public boolean hasRoleName(String var1) {
      class="kw">return this.getRoleBuilderInfo(this.getIndex(var1)) != null;
   }

   class="kw">public void validateSpawnableRole(String var1) {
      BuilderInfo var2 = this.getRoleBuilderInfo(this.getIndex(var1));
      if (var2 == null) {
         throw new SkipSentryException(new IllegalArgumentException(var1 + " does not exist as a role!"));
      }

      if (!var2.getBuilder().isSpawnable()) {
         throw new SkipSentryException(new IllegalArgumentException(var1 + " is an class="kw">abstract role type and cannot be spawned directly!"));
      }
   }

   @Nullable
   class="kw">public BuilderInfo getRoleBuilderInfo(int var1) {
      BuilderInfo var2 = this.builderManager.tryGetBuilderInfo(var1);
      class="kw">return var2 != null && var2.getBuilder().category() == Role.class ? var2 : null;
   }

   class="kw">public void setBuilderInvalid(int var1) {
      BuilderInfo var2 = this.builderManager.tryGetBuilderInfo(var1);
      if (var2 != null) {
         var2.setNeedsReload();
      }
   }

   class="kw">public AttitudeMap getAttitudeMap() {
      class="kw">return this.attitudeMap;
   }

   class="kw">public ItemAttitudeMap getItemAttitudeMap() {
      class="kw">return this.itemAttitudeMap;
   }

   class="kw">public boolean testAndValidateRole(@Nullable BuilderInfo var1) {
      class="kw">return var1 != null && var1.getBuilder() != null && var1.getBuilder().category() == Role.class && this.builderManager.validateBuilder(var1);
   }

   class="kw">public void forceValidation(int var1) {
      this.builderManager.forceValidation(var1);
   }

   @Nullable
   class="kw">public Pair<Ref<EntityStore>, NPCEntity> spawnEntity(
      @Nonnull Store<EntityStore> var1,
      int var2,
      @Nonnull Vector3dc var3,
      @Nullable Rotation3fc var4,
      @Nullable Model var5,
      @Nullable TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var6
   ) {
      class="kw">return this.spawnEntity(var1, var2, var3, var4, var5, null, var6);
   }

   @Nullable
   class="kw">public Pair<Ref<EntityStore>, NPCEntity> spawnEntity(
      @Nonnull Store<EntityStore> var1,
      int var2,
      @Nonnull Vector3dc var3,
      @Nullable Rotation3fc var4,
      @Nullable Model var5,
      @Nullable TriConsumer<NPCEntity, Holder<EntityStore>, Store<EntityStore>> var6,
      @Nullable TriConsumer<NPCEntity, Ref<EntityStore>, Store<EntityStore>> var7
   ) {
      WorldTimeResource var8 = var1.getResource(WorldTimeResource.getResourceType());
      NPCEntity var9 = new NPCEntity();
      var9.setSpawnInstant(var8.getGameTime());
      if (var4 == null) {
         var4 = NULL_ROTATION;
      }

      var9.saveLeashInformation(var3, var4);
      String var10 = this.getName(var2);
      if (var10 == null) {
         get().getLogger().at(Level.WARNING).log("Unable to spawn entity with invalid role index: %s!", var2);
         class="kw">return null;
      }

      var9.setRoleName(var10);
      var9.setRoleIndex(var2);
      Holder var11 = EntityStore.REGISTRY.newHolder();
      var11.addComponent(NPCEntity.getComponentType(), var9);
      var11.addComponent(TransformComponent.getComponentType(), new TransformComponent(var3, var4));
      var11.addComponent(HeadRotation.getComponentType(), new HeadRotation(var4));
      DisplayNameComponent var12 = new DisplayNameComponent(Message.raw(var10));
      var11.addComponent(DisplayNameComponent.getComponentType(), var12);
      var11.ensureComponent(UUIDComponent.getComponentType());
      if (var5 != null) {
         var9.setInitialModelScale(var5.getScale());
         var11.addComponent(ModelComponent.getComponentType(), new ModelComponent(var5));
         var11.addComponent(ModelRotateBoundingBoxComponent.getComponentType(), new ModelRotateBoundingBoxComponent());
         var11.addComponent(PersistentModel.getComponentType(), new PersistentModel(var5.toReference()));
      }

      if (var6 != null) {
         var6.accept(var9, var11, var1);
      }

      Ref var13 = var1.addEntity(var11, AddReason.SPAWN);
      if (var13 == null) {
         get().getLogger().at(Level.WARNING).log("Unable to handle non-spawned entity: %s!", this.getName(var2));
         class="kw">return null;
      }

      if (var7 != null) {
         var7.accept(var9, var13, var1);
      }

      class="kw">return Pair.of(var13, var9);
   }

   @Nonnull
   class="kw">public BuilderInfo prepareRoleBuilderInfo(int var1) {
      try {
         BuilderInfo var2 = this.builderManager.getCachedBuilderInfo(var1, Role.class);
         if (this.validateBuilder) {
            if (!var2.isValidated()) {
               this.builderManager.validateBuilder(var2);
            }

            if (!var2.isValid()) {
               throw new SkipSentryException(new IllegalStateException("Builder " + var2.getKeyName() + " failed validation!"));
            }
         }

         class="kw">return var2;
      } catch (RuntimeException var4) {
         throw new SkipSentryException(
            new RuntimeException(String.format("Cannot use role template '%s' (%s): %s", this.getName(var1), var1, var4.getMessage()), var4)
         );
      }
   }

   @Nonnull
   class="kw">public class="kw">static Role buildRole(
      @Nonnull Holder<EntityStore> var0, @Nonnull Builder<Role> var1, @Nonnull BuilderInfo var2, @Nonnull BuilderSupport var3, int var4
   ) {
      Role var5;
      try {
         StdScope var6 = var1.getBuilderParameters().createScope();
         var3.setScope(var6);
         var3.setGlobalScope(var6);
         var5 = ((RoleBuilder)var1).createAndAttach(var0, var3);
      } catch (Throwable var7) {
         var2.setNeedsReload();
         throw new SkipSentryException(var7);
      }

      var5.setRoleIndex(var0, var4, var2.getKeyName());
      class="kw">return var5;
   }

   class="kw">protected void onModelsChanged(@Nonnull LoadedAssetsEvent<String, ModelAsset, DefaultAssetMap<String, ModelAsset>> var1) {
      Map var2 = var1.getLoadedAssets();
      Universe.get()
         .getWorlds()
         .values()
         .forEach(
            var1x -> var1x.execute(
               () -> {
                  Store var2 = var1x.getEntityStore().getStore();
                  var2.forEachEntityParallel(
                     NPCEntity.getComponentType(),
                     (var1xx, var2x, var3) -> {
                        ModelComponent var4 = var2x.getComponent(var1xx, ModelComponent.getComponentType());
                        if (var4 != null) {
                           Model var5 = var4.getModel();
                           ModelAsset var6 = var2.get(var5.getModelAssetId());
                           if (var6 != null) {
                              Ref var7 = var2x.getReferenceTo(var1xx);
                              var3.putComponent(
                                 var7,
                                 ModelComponent.getComponentType(),
                                 new ModelComponent(Model.createScaledModel(var6, var5.getScale(), var5.getRandomAttachmentIds()))
                              );
                           }
                        }
                     }
                  );
               }
            )
         );
   }

   class="kw">public void generateDescriptors() {
      this.getLogger().at(Level.INFO).log("===== Generating descriptors for NPC!");
      this.builderDescriptors = this.builderManager.generateDescriptors();
   }

   class="kw">public void saveDescriptors() {
      this.getLogger().at(Level.INFO).log("===== Saving descriptors for NPC!");
      Path var1 = Path.of("npc_descriptors.json");
      BuilderManager.saveDescriptors(this.builderDescriptors, var1);
      this.getLogger().at(Level.INFO).log("Saved NPC descriptors to: %s", var1);
   }

   class="kw">public BuilderManager getBuilderManager() {
      class="kw">return this.builderManager;
   }

   class="kw">public int getMaxBlackboardBlockCountPerType() {
      class="kw">return this.maxBlackboardBlockCountPerType;
   }

   class="kw">public boolean isLogFailingTestErrors() {
      class="kw">return this.logFailingTestErrors;
   }

   class="kw">public boolean startRoleBenchmark(double var1, @Nonnull Consumer<Int2ObjectMap<TimeDistributionRecorder>> var3) {
      this.benchmarkLock.lock();

      try {
         if (this.isBenchmarking()) {
            class="kw">return false;
         }

         this.roleTickDistribution = new Int2ObjectOpenHashMap();
         this.roleTickDistributionAll = new TimeDistributionRecorder(0.01, 1.0E-5);
         this.roleTickDistribution.put(-1, this.roleTickDistributionAll);
      } class="kw">finally {
         this.benchmarkLock.unlock();
      }

      new CompletableFuture().completeOnTimeout(null, Math.round(var1 * 1000.0), TimeUnit.MILLISECONDS).thenRunAsync(() -> {
         Int2ObjectMap var2 = this.roleTickDistribution;
         this.benchmarkLock.lock();

         try {
            this.roleTickDistribution = null;
            this.roleTickDistributionAll = null;
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }

         var3.accept(var2);
      });
      class="kw">return true;
   }

   class="kw">public void collectRoleTick(int var1, long var2) {
      if (this.benchmarkLock.tryLock()) {
         try {
            if (this.roleTickDistribution != null) {
               ((TimeDistributionRecorder)this.roleTickDistribution.computeIfAbsent(var1, var0 -> new TimeDistributionRecorder(0.01, 1.0E-5)))
                  .recordNanos(var2);
               this.roleTickDistributionAll.recordNanos(var2);
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   class="kw">public boolean isBenchmarkingRole() {
      class="kw">return this.roleTickDistribution != null;
   }

   class="kw">public boolean startSensorSupportBenchmark(double var1, @Nonnull Consumer<Int2ObjectMap<SensorSupportBenchmark>> var3) {
      this.benchmarkLock.lock();

      try {
         if (this.isBenchmarking()) {
            class="kw">return false;
         }

         this.roleSensorSupportDistribution = new Int2ObjectOpenHashMap();
         this.roleSensorSupportDistributionAll = new SensorSupportBenchmark();
         this.roleSensorSupportDistribution.put(-1, this.roleSensorSupportDistributionAll);
      } class="kw">finally {
         this.benchmarkLock.unlock();
      }

      new CompletableFuture().completeOnTimeout(null, Math.round(var1 * 1000.0), TimeUnit.MILLISECONDS).thenRunAsync(() -> {
         Int2ObjectMap var2 = this.roleSensorSupportDistribution;
         this.benchmarkLock.lock();

         try {
            this.roleSensorSupportDistribution = null;
            this.roleSensorSupportDistributionAll = null;
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }

         var3.accept(var2);
      });
      class="kw">return true;
   }

   class="kw">public boolean isBenchmarkingSensorSupport() {
      class="kw">return this.roleSensorSupportDistributionAll != null;
   }

   class="kw">protected boolean isBenchmarking() {
      class="kw">return this.isBenchmarkingRole() || this.isBenchmarkingSensorSupport();
   }

   class="kw">public void collectSensorSupportPlayerList(int var1, long var2, double var4, double var6, double var8, int var10) {
      if (this.benchmarkLock.tryLock()) {
         try {
            if (this.roleSensorSupportDistribution != null) {
               ((SensorSupportBenchmark)this.roleSensorSupportDistribution.computeIfAbsent(var1, var0 -> new SensorSupportBenchmark()))
                  .collectPlayerList(var2, var4, var6, var8, var10);
               this.roleSensorSupportDistributionAll.collectPlayerList(var2, var4, var6, var8, var10);
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   class="kw">public void collectSensorSupportEntityList(int var1, long var2, double var4, double var6, double var8, int var10) {
      if (this.benchmarkLock.tryLock()) {
         try {
            if (this.roleSensorSupportDistribution != null) {
               ((SensorSupportBenchmark)this.roleSensorSupportDistribution.computeIfAbsent(var1, var0 -> new SensorSupportBenchmark()))
                  .collectEntityList(var2, var4, var6, var8, var10);
               this.roleSensorSupportDistributionAll.collectEntityList(var2, var4, var6, var8, var10);
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   class="kw">public void collectSensorSupportLosTest(int var1, boolean var2, long var3) {
      if (this.isBenchmarkingSensorSupport() && this.benchmarkLock.tryLock()) {
         try {
            if (this.roleSensorSupportDistribution != null) {
               ((SensorSupportBenchmark)this.roleSensorSupportDistribution.computeIfAbsent(var1, var0 -> new SensorSupportBenchmark()))
                  .collectLosTest(var2, var3);
               this.roleSensorSupportDistributionAll.collectLosTest(var2, var3);
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   class="kw">public void collectSensorSupportInverseLosTest(int var1, boolean var2) {
      if (this.isBenchmarkingSensorSupport() && this.benchmarkLock.tryLock()) {
         try {
            if (this.roleSensorSupportDistribution != null) {
               ((SensorSupportBenchmark)this.roleSensorSupportDistribution.computeIfAbsent(var1, var0 -> new SensorSupportBenchmark()))
                  .collectInverseLosTest(var2);
               this.roleSensorSupportDistributionAll.collectInverseLosTest(var2);
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   class="kw">public void collectSensorSupportFriendlyBlockingTest(int var1, boolean var2) {
      if (this.isBenchmarkingSensorSupport() && this.benchmarkLock.tryLock()) {
         try {
            if (this.roleSensorSupportDistribution != null) {
               ((SensorSupportBenchmark)this.roleSensorSupportDistribution.computeIfAbsent(var1, var0 -> new SensorSupportBenchmark()))
                  .collectFriendlyBlockingTest(var2);
               this.roleSensorSupportDistributionAll.collectFriendlyBlockingTest(var2);
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   class="kw">public void collectSensorSupportTickDone(int var1) {
      if (this.isBenchmarkingSensorSupport() && this.benchmarkLock.tryLock()) {
         try {
            if (this.roleSensorSupportDistribution != null) {
               ((SensorSupportBenchmark)this.roleSensorSupportDistribution.computeIfAbsent(var1, var0 -> new SensorSupportBenchmark())).tickDone();
               this.roleSensorSupportDistributionAll.tickDone();
            }
         } class="kw">finally {
            this.benchmarkLock.unlock();
         }
      }
   }

   @Nonnull
   class="kw">public <T> NPCPlugin registerCoreComponentType(String var1, @Nonnull Supplier<Builder<T>> var2) {
      BuilderFactory var3 = this.builderManager.getFactory(var2.get().category());
      var3.add(var1, var2);
      class="kw">return this;
   }

   class="kw">public void setRoleBuilderNeedsReload(Builder<?> var1) {
      BuilderInfo var2 = this.getBuilderInfo(var1);
      Objects.requireNonNull(var2, "Have builder but can't get builderInfo for it");
      var2.setNeedsReload();
   }

   class="kw">protected void registerCoreFactories() {
      BuilderFactory var1 = new BuilderFactory<>(Role.class, "Type");
      var1.add("Generic", BuilderRole::new);
      var1.add("Abstract", BuilderRoleAbstract::new);
      var1.add("Variant", BuilderRoleVariant::new);
      this.builderManager.registerFactory(var1);
      BuilderFactory var2 = new BuilderFactory<>(MotionController.class, "Type");
      var2.add("Walk", BuilderMotionControllerWalk::new);
      var2.add("Fly", BuilderMotionControllerFly::new);
      var2.add("Dive", BuilderMotionControllerDive::new);
      this.builderManager.registerFactory(var2);
      BuilderFactory var3 = new BuilderFactory<>(BuilderMotionControllerMapUtil.CLASS_REFERENCE, "Type", BuilderMotionControllerMap::new);
      this.builderManager.registerFactory(var3);
      BuilderFactory var4 = new BuilderFactory<>(ActionList.class, "Type", BuilderActionList::new);
      this.builderManager.registerFactory(var4);
      BuilderFactory var5 = new BuilderFactory<>(Instruction.class, "Type", BuilderInstruction::new);
      var5.add("Random", BuilderInstructionRandomized::new);
      var5.add("Reference", BuilderInstructionReference::new);
      this.builderManager.registerFactory(var5);
      BuilderFactory var6 = new BuilderFactory<>(TransientPathDefinition.class, "Type", BuilderTransientPathDefinition::new);
      this.builderManager.registerFactory(var6);
      BuilderFactory var7 = new BuilderFactory<>(RelativeWaypointDefinition.class, "Type", BuilderRelativeWaypointDefinition::new);
      this.builderManager.registerFactory(var7);
      BuilderFactory var8 = new BuilderFactory<>(WeightedAction.class, "Type", BuilderWeightedAction::new);
      this.builderManager.registerFactory(var8);
      BuilderFactory var9 = new BuilderFactory<>(BuilderValueToParameterMapping.ValueToParameterMapping.class, "Type", BuilderValueToParameterMapping::new);
      this.builderManager.registerFactory(var9);
      StateTransitionController.registerFactories(this.builderManager);
      this.builderManager.registerFactory(new BuilderFactory<>(BodyMotion.class, "Type"));
      this.builderManager.registerFactory(new BuilderFactory<>(HeadMotion.class, "Type"));
      this.builderManager.registerFactory(new BuilderFactory<>(Action.class, "Type"));
      this.builderManager.registerFactory(new BuilderFactory<>(Sensor.class, "Type"));
      this.builderManager.registerFactory(new BuilderFactory<>(IEntityFilter.class, "Type"));
      this.builderManager.registerFactory(new BuilderFactory<>(ISensorEntityPrioritiser.class, "Type"));
      this.builderManager.registerFactory(new BuilderFactory<>(ISensorEntityCollector.class, "Type"));
   }

   class="kw">protected class="kw">static void onBalanceAssetsChanged(@Nonnull LoadedAssetsEvent<String, BalanceAsset, DefaultAssetMap<String, BalanceAsset>> var0) {
      Map var1 = var0.getLoadedAssets();
      Universe.get()
         .getWorlds()
         .forEach((var1x, var2) -> var2.execute(() -> var2.getEntityStore().getStore().forEachChunk(NPCEntity.getComponentType(), (var2x, var3) -> {
            for (int var4 = 0; var4 < var2x.size(); var4++) {
               NPCEntity var5 = var2x.getComponent(var4, NPCEntity.getComponentType());
               assert var5 != null;
               if (var1.containsKey(var5.getRole().getBalanceAsset())) {
                  Ref var6 = var2x.getReferenceTo(var4);
                  RoleChangeSystem.requestRoleChange(var6, var5.getRole(), var5.getRoleIndex(), false, var2.getEntityStore().getStore());
               }
            }
         })));
   }

   class="kw">protected class="kw">static void onBalanceAssetsRemoved(@Nonnull RemovedAssetsEvent<String, BalanceAsset, DefaultAssetMap<String, BalanceAsset>> var0) {
      Set var1 = var0.getRemovedAssets();
      Universe.get()
         .getWorlds()
         .forEach((var1x, var2) -> var2.execute(() -> var2.getEntityStore().getStore().forEachChunk(NPCEntity.getComponentType(), (var1xx, var2x) -> {
            for (int var3 = 0; var3 < var1xx.size(); var3++) {
               NPCEntity var4 = var1xx.getComponent(var3, NPCEntity.getComponentType());
               assert var4 != null;
               if (var1.contains(var4.getRole().getBalanceAsset())) {
                  Ref var5 = var1xx.getReferenceTo(var3);
                  var2x.removeEntity(var5, RemoveReason.REMOVE);
               }
            }
         })));
   }

   class="kw">public class="kw">static class NPCConfig {
      class="kw">public class="kw">static class="kw">final BuilderCodec<NPCPlugin.NPCConfig> CODEC = BuilderCodec.builder(NPCPlugin.NPCConfig.class, NPCPlugin.NPCConfig::new)
         .append(new KeyedCodec<>("Descriptors", Codec.BOOLEAN), (var0, var1) -> var0.generateDescriptors = var1, var0 -> var0.generateDescriptors)
         .add()
         .append(new KeyedCodec<>("DescriptorsFile", Codec.BOOLEAN), (var0, var1) -> var0.generateDescriptorsFile = var1, var0 -> var0.generateDescriptorsFile)
         .add()
         .append(new KeyedCodec<>("AutoReload", Codec.BOOLEAN), (var0, var1) -> var0.autoReload = var1, var0 -> var0.autoReload)
         .add()
         .append(new KeyedCodec<>("ValidateBuilders", Codec.BOOLEAN), (var0, var1) -> var0.validateBuilder = var1, var0 -> var0.validateBuilder)
         .add()
         .append(
            new KeyedCodec<>("MaxBlackboardBlockType", Codec.INTEGER), (var0, var1) -> var0.maxBlackboardBlockType = var1, var0 -> var0.maxBlackboardBlockType
         )
         .add()
         .append(new KeyedCodec<>("LogFailingTestErrors", Codec.BOOLEAN), (var0, var1) -> var0.logFailingTestErrors = var1, var0 -> var0.logFailingTestErrors)
         .add()
         .append(
            new KeyedCodec<>("PresetCoverageTestNPCs", Codec.STRING_ARRAY),
            (var0, var1) -> var0.presetCoverageTestNPCs = var1,
            var0 -> var0.presetCoverageTestNPCs
         )
         .add()
         .build();
      class="kw">private boolean generateDescriptors;
      class="kw">private boolean generateDescriptorsFile;
      class="kw">private boolean autoReload = true;
      class="kw">private boolean validateBuilder = true;
      class="kw">private int maxBlackboardBlockType = 20;
      class="kw">private boolean logFailingTestErrors;
      class="kw">private String[] presetCoverageTestNPCs = new String[]{
         "Test_Bird",
         "Test_Block_Sensor",
         "Test_Attack_Bow",
         "Test_Combat_Sensor_Sheep",
         "Test_Bow_Charge",
         "Test_OffHand_Swap",
         "Test_Patrol_Path",
         "Test_Flock_Mixed#4",
         "Test_Group_Sheep",
         "Test_Attack_Flying_Ranged",
         "Test_Interaction_Complete_Task",
         "Test_Hotbar_Weapon_Swap",
         "Test_Inventory_Contents",
         "Test_Dive_Flee",
         "Test_Jumping",
         "Test_Walk_Leave",
         "Test_Walk_Seek",
         "Test_Watch",
         "Test_Chained_Path",
         "Test_Spawn_Action",
         "Test_State_Evaluator_Toggle",
         "Test_State_Evaluator_Sleep",
         "Test_Alarm",
         "Test_Timer_Repeating",
         "Test_Action_Model_Attachment",
         "Test_Animation_State_Change",
         "Test_Block_Change",
         "Test_Crouch",
         "Test_Drop_Item",
         "Test_Entity_Damage_Event",
         "Test_Hover_Parrot",
         "Test_In_Water",
         "Test_Light_Sensor",
         "Test_Model_Change",
         "Test_Particle_Emotions",
         "Test_Place_Blocks",
         "Test_Position_Adjustment_Wrapper",
         "Test_Probe",
         "Test_Sensor_Age",
         "Test_Sensor_DroppedItem",
         "Test_Shoot_At_Block",
         "Test_Species_Attitude",
         "Test_Standing_On_Block_Sensor",
         "Test_Teleport",
         "Test_Throw_NPC",
         "Test_Trigger_Spawners",
         "Test_Weather_Sensor",
         "Test_Bird_Land"
      };

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

      class="kw">public boolean isGenerateDescriptors() {
         class="kw">return this.generateDescriptors;
      }

      class="kw">public boolean isGenerateDescriptorsFile() {
         class="kw">return this.generateDescriptorsFile;
      }

      class="kw">public boolean isAutoReload() {
         class="kw">return this.autoReload;
      }

      class="kw">public boolean isValidateBuilder() {
         class="kw">return this.validateBuilder;
      }

      class="kw">public int getMaxBlackboardBlockType() {
         class="kw">return this.maxBlackboardBlockType;
      }

      class="kw">public boolean isLogFailingTestErrors() {
         class="kw">return this.logFailingTestErrors;
      }

      class="kw">public String[] getPresetCoverageTestNPCs() {
         class="kw">return this.presetCoverageTestNPCs;
      }
   }

   class="kw">public class="kw">static class NPCEntityRegenerateStatsSystem class="kw">extends EntityStatsSystems.Regenerate<NPCEntity> {
      class="kw">public NPCEntityRegenerateStatsSystem() {
         super(EntityStatMap.getComponentType(), NPCEntity.getComponentType());
      }
   }
}