NPCPlugin class

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

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

extends: JavaPlugin

Поля (109)

МодификаторыТипИмя
public static final BuilderCodec<NPCPlugin.NPCConfig> CODEC
private boolean autoReload
private boolean generateDescriptors
private boolean generateDescriptorsFile
instance
private boolean logFailingTestErrors
private int maxBlackboardBlockType
private String[] presetCoverageTestNPCs
return
return
private boolean validateBuilder
ComponentRegistryProxy var1
NPCPlugin.NPCConfig var1
NPCPlugin.NPCConfig var1
ItemAttitudeMap.Builder var1
IndexedLookupTableAssetMap var1
AttitudeMap.Builder var1
Path var1
BuilderFactory var1
Map var1
Set var1
NPCEntity var10
SpawnTestResult var10
Model var10
String var10
int var11
int var11
Box var11
Holder var11
Pair var12
Builder var12
DisplayNameComponent var12
FlockAsset var13
Ref var13
SpawningContext var14
double var15
World var15
double var17
Model var19
EventRegistry var2
long var2
Schema var2
Map var2
Map var2
Object2IntOpenHashMap var2
BuilderInfo var2
BuilderInfo var2
BuilderInfo var2
BuilderInfo var2
Map var2
Store var2
Int2ObjectMap var2
Int2ObjectMap var2
BuilderInfo var2
BuilderFactory var2
Vector3d var20
Pair var21
FlockAsset var22
Schema.HytaleMetadata var3
ComponentType var3
IndexedLookupTableAssetMap var3
IndexedLookupTableAssetMap var3
Int2ObjectOpenHashMap var3
BuilderFactory var3
BuilderFactory var3
boolean var4
Set var4
int var4
int var4
int var4
int var4
ObjectArrayList var4
int var4
var4
ModelComponent var4
BuilderFactory var4
NPCEntity var4
List var5
NPCEntity var5
Iterator var5
Role var5
var5
Model var5
BuilderFactory var5
NPCEntity var5
Ref var5
int var6
int var6
String var6
StdScope var6
ModelAsset var6
BuilderFactory var6
Ref var6
boolean var7
Pair var7
Builder var7
int var7
int var7
Ref var7
BuilderFactory var7
boolean var8
FlockAsset var8
WorldTimeResource var8
BuilderFactory var8
Ref var9
Vector3d var9
SpawningContext var9
NPCEntity var9
BuilderFactory var9

Методы (137)

МодификаторыВозвратСигнатура
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown key! " + var6)
abstract throw new IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown key! " + var2x)
public NPCConfigpublic NPCConfig()
public NPCEntityRegenerateStatsSystempublic NPCEntityRegenerateStatsSystem()
abstract throw new SkipSentryExceptionthrow new SkipSentryException(var7)
abstract throw new UnsupportedOperationExceptionthrow new UnsupportedOperationException("Not implemented")
public void collectRoleTickvoid collectRoleTick(int var1, long var2)
public void collectSensorSupportEntityListvoid collectSensorSupportEntityList(int var1, long var2, double var4, double var6, double var8, int var10)
public void collectSensorSupportFriendlyBlockingTestvoid collectSensorSupportFriendlyBlockingTest(int var1, boolean var2)
public void collectSensorSupportInverseLosTestvoid collectSensorSupportInverseLosTest(int var1, boolean var2)
public void collectSensorSupportLosTestvoid collectSensorSupportLosTest(int var1, boolean var2, long var3)
public void collectSensorSupportPlayerListvoid collectSensorSupportPlayerList(int var1, long var2, double var4, double var6, double var8, int var10)
public void collectSensorSupportTickDonevoid collectSensorSupportTickDone(int var1)
abstract for for(int var6 = 0; var6 < var5.size()
abstract for for(int var4 = 0; var4 < var2x.size()
abstract for for(int var3 = 0; var3 < var1xx.size()
public void forceValidationvoid forceValidation(int var1)
public void generateDescriptorsvoid generateDescriptors()
static NPCPlugin getNPCPlugin get()
public ResourceType<EntityStore, AStarNodePoolProviderSimple> getAStarNodePoolProviderSimpleResourceTypeResourceType<EntityStore, AStarNodePoolProviderSimple> getAStarNodePoolProviderSimpleResourceType()
public ComponentType<EntityStore, AlarmStore> getAlarmStoreComponentTypeComponentType<EntityStore, AlarmStore> getAlarmStoreComponentType()
public AttitudeMap getAttitudeMapAttitudeMap getAttitudeMap()
public ComponentType<EntityStore, BeaconSupport> getBeaconSupportComponentTypeComponentType<EntityStore, BeaconSupport> getBeaconSupportComponentType()
public ResourceType<EntityStore, Blackboard> getBlackboardResourceTypeResourceType<EntityStore, Blackboard> getBlackboardResourceType()
public BuilderManager getBuilderManagerBuilderManager getBuilderManager()
public ComponentType<EntityStore, CombatViewSystems.CombatData> getCombatDataComponentTypeComponentType<EntityStore, CombatViewSystems.CombatData> getCombatDataComponentType()
public ResourceType<EntityStore, CombatViewSystems.CombatDataPool> getCombatDataPoolResourceTypeResourceType<EntityStore, CombatViewSystems.CombatDataPool> getCombatDataPoolResourceType()
public ComponentType<EntityStore, CombatSupport> getCombatSupportComponentTypeComponentType<EntityStore, CombatSupport> getCombatSupportComponentType()
public ComponentType<EntityStore, DebugSupport> getDebugSupportComponentTypeComponentType<EntityStore, DebugSupport> getDebugSupportComponentType()
public ComponentType<EntityStore, DisplayNameSupport> getDisplayNameSupportComponentTypeComponentType<EntityStore, DisplayNameSupport> getDisplayNameSupportComponentType()
public ComponentType<EntityStore, EntitySupport> getEntitySupportComponentTypeComponentType<EntityStore, EntitySupport> getEntitySupportComponentType()
public ComponentType<EntityStore, FailedSpawnComponent> getFailedSpawnComponentTypeComponentType<EntityStore, FailedSpawnComponent> getFailedSpawnComponentType()
public ComponentType<EntityStore, FlagsComponent> getFlagsComponentTypeComponentType<EntityStore, FlagsComponent> getFlagsComponentType()
public int getIndexint getIndex(String var1)
public ItemAttitudeMap getItemAttitudeMapItemAttitudeMap getItemAttitudeMap()
public ComponentType<EntityStore, MarkedEntitySupport> getMarkedEntitySupportComponentTypeComponentType<EntityStore, MarkedEntitySupport> getMarkedEntitySupportComponentType()
public int getMaxBlackboardBlockCountPerTypeint getMaxBlackboardBlockCountPerType()
public int getMaxBlackboardBlockTypepublic int getMaxBlackboardBlockType()
public ComponentType<EntityStore, MotionContextSupport> getMotionContextSupportComponentTypeComponentType<EntityStore, MotionContextSupport> getMotionContextSupportComponentType()
public ResourceType<EntityStore, NewSpawnStartTickingSystem.QueueResource> getNewSpawnStartTickingQueueResourceTypeResourceType<EntityStore, NewSpawnStartTickingSystem.QueueResource> getNewSpawnStartTickingQueueResourceType()
public ComponentType<EntityStore, NPCBlockEventSupport> getNpcBlockEventSupportComponentTypeComponentType<EntityStore, NPCBlockEventSupport> getNpcBlockEventSupportComponentType()
public ComponentType<EntityStore, NPCEntityEventSupport> getNpcEntityEventSupportComponentTypeComponentType<EntityStore, NPCEntityEventSupport> getNpcEntityEventSupportComponentType()
public ResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> getNpcSpatialResourceResourceType<EntityStore, SpatialResource<Ref<EntityStore>, EntityStore>> getNpcSpatialResource()
public ComponentType<EntityStore, NPCRunTestsCommand.NPCTestData> getNpcTestDataComponentTypeComponentType<EntityStore, NPCRunTestsCommand.NPCTestData> getNpcTestDataComponentType()
public int getPathChangeRevisionint getPathChangeRevision()
public ComponentType<EntityStore, PlayerBlockEventSupport> getPlayerBlockEventSupportComponentTypeComponentType<EntityStore, PlayerBlockEventSupport> getPlayerBlockEventSupportComponentType()
public ComponentType<EntityStore, PlayerEntityEventSupport> getPlayerEntityEventSupportComponentTypeComponentType<EntityStore, PlayerEntityEventSupport> getPlayerEntityEventSupportComponentType()
public ComponentType<EntityStore, PlayerTaskSupport> getPlayerTaskSupportComponentTypeComponentType<EntityStore, PlayerTaskSupport> getPlayerTaskSupportComponentType()
public ComponentType<EntityStore, PositionCache> getPositionCacheComponentTypeComponentType<EntityStore, PositionCache> getPositionCacheComponentType()
public String[] getPresetCoverageTestNPCsString[] getPresetCoverageTestNPCs()
public String[] getPresetCoverageTestNPCspublic String[] getPresetCoverageTestNPCs()
public ResourceType<EntityStore, RoleChangeSystem.RoleChangeQueue> getRoleChangeQueueResourceTypeResourceType<EntityStore, RoleChangeSystem.RoleChangeQueue> getRoleChangeQueueResourceType()
public List<String> getRoleTemplateNamesList<String> getRoleTemplateNames(boolean var1)
public ResourceType<EntityStore, SortBufferProviderResource> getSortBufferProviderResourceResourceTypeResourceType<EntityStore, SortBufferProviderResource> getSortBufferProviderResourceResourceType()
public ComponentType<EntityStore, SpawnLineage> getSpawnLineageComponentTypeComponentType<EntityStore, SpawnLineage> getSpawnLineageComponentType()
public ResourceType<EntityStore, SpawnNPCInteractionFailureTracker> getSpawnNPCInteractionFailureTrackerResourceTypeResourceType<EntityStore, SpawnNPCInteractionFailureTracker> getSpawnNPCInteractionFailureTrackerResourceType()
public ComponentType<EntityStore, StateEvaluator> getStateEvaluatorComponentTypeComponentType<EntityStore, StateEvaluator> getStateEvaluatorComponentType()
public ComponentType<EntityStore, StateSupport> getStateSupportComponentTypeComponentType<EntityStore, StateSupport> getStateSupportComponentType()
public ComponentType<EntityStore, StepComponent> getStepComponentTypeComponentType<EntityStore, StepComponent> getStepComponentType()
public ComponentType<EntityStore, Timers> getTimersComponentTypeComponentType<EntityStore, Timers> getTimersComponentType()
public ComponentType<EntityStore, ValueStore> getValueStoreComponentTypeComponentType<EntityStore, ValueStore> getValueStoreComponentType()
public ComponentType<EntityStore, WorldSupport> getWorldSupportComponentTypeComponentType<EntityStore, WorldSupport> getWorldSupportComponentType()
public boolean hasRoleNameboolean hasRoleName(String var1)
if if(!var8)
if if(var6 < 0)
if if(var7 != null)
if if(var10 != SpawnTestResult.TEST_OK)
if if(var11 < 0)
if if(var12 == null)
if if(var11 < 0)
if if(var19 == null)
if if(var21 == null)
if if(var6 < 0)
if if(var5)
if if(this.attitudeMap == null)
if if(var7 == Integer.MIN_VALUE)
if if(var7 >= var4)
if if(var4 == Integer.MIN_VALUE)
if if(this.itemAttitudeMap == null)
if if(var7 == Integer.MIN_VALUE)
if if(var7 >= var4)
if if(var4 == Integer.MIN_VALUE)
if if(var4 == Integer.MIN_VALUE)
if if(var2 == null)
if if(var2 != null)
if if(var4 == null)
if if(var10 == null)
if if(var5 != null)
if if(var6 != null)
if if(var13 == null)
if if(var7 != null)
if if(this.validateBuilder)
if if(var4 != null)
if if(var6 != null)
if if(this.roleTickDistribution != null)
if if(this.roleSensorSupportDistribution != null)
if if(this.roleSensorSupportDistribution != null)
if if(this.roleSensorSupportDistribution != null)
if if(this.roleSensorSupportDistribution != null)
if if(this.roleSensorSupportDistribution != null)
if if(this.roleSensorSupportDistribution != null)
public boolean isAutoReloadpublic boolean isAutoReload()
protected boolean isBenchmarkingboolean isBenchmarking()
public boolean isBenchmarkingRoleboolean isBenchmarkingRole()
public boolean isBenchmarkingSensorSupportboolean isBenchmarkingSensorSupport()
public boolean isGenerateDescriptorspublic boolean isGenerateDescriptors()
public boolean isGenerateDescriptorsFilepublic boolean isGenerateDescriptorsFile()
public boolean isLogFailingTestErrorsboolean isLogFailingTestErrors()
public boolean isLogFailingTestErrorspublic boolean isLogFailingTestErrors()
public boolean isValidateBuilderpublic boolean isValidateBuilder()
protected void onAttitudeGroupsLoadedvoid onAttitudeGroupsLoaded(@Nonnull LoadedAssetsEvent<String, AttitudeGroup, AssetMap<String, AttitudeGroup>> var1)
protected void onAttitudeGroupsRemovedvoid onAttitudeGroupsRemoved(RemovedAssetsEvent<String, AttitudeGroup, AssetMap<String, AttitudeGroup>> var1)
static void onBalanceAssetsChangedvoid onBalanceAssetsChanged(@Nonnull LoadedAssetsEvent<String, BalanceAsset, DefaultAssetMap<String, BalanceAsset>> var0)
static void onBalanceAssetsRemovedvoid onBalanceAssetsRemoved(@Nonnull RemovedAssetsEvent<String, BalanceAsset, DefaultAssetMap<String, BalanceAsset>> var0)
protected void onBlockSetsLoadedvoid onBlockSetsLoaded(@Nonnull LoadedAssetsEvent<String, BlockSet, DefaultAssetMap<String, BlockSet>> var1)
protected void onItemAttitudeGroupsLoadedvoid onItemAttitudeGroupsLoaded(@Nonnull LoadedAssetsEvent<String, ItemAttitudeGroup, AssetMap<String, ItemAttitudeGroup>> var1)
protected void onItemAttitudeGroupsRemovedvoid onItemAttitudeGroupsRemoved(RemovedAssetsEvent<String, ItemAttitudeGroup, AssetMap<String, ItemAttitudeGroup>> var1)
protected void onModelsChangedvoid onModelsChanged(@Nonnull LoadedAssetsEvent<String, ModelAsset, DefaultAssetMap<String, ModelAsset>> var1)
protected void onNPCGroupsLoadedvoid onNPCGroupsLoaded(LoadedAssetsEvent<String, NPCGroup, AssetMap<String, NPCGroup>> var1)
protected void onNPCGroupsRemovedvoid onNPCGroupsRemoved(RemovedAssetsEvent<String, NPCGroup, AssetMap<String, NPCGroup>> var1)
protected void onNPCsLoadedvoid onNPCsLoaded(AllNPCsLoadedEvent var1)
protected void onPathChangevoid onPathChange(WorldPathChangedEvent var1)
private void putAttitudeGroupsvoid putAttitudeGroups()
private void putItemAttitudeGroupsvoid putItemAttitudeGroups()
private void putNPCGroupsvoid putNPCGroups()
public void registerBeaconReceiverProvidervoid registerBeaconReceiverProvider(@Nonnull BeaconReceiverProvider var1)
protected void registerCoreFactoriesvoid registerCoreFactories()
static void reloadNPCsWithRolevoid reloadNPCsWithRole(int var0)
public void saveDescriptorsvoid saveDescriptors()
public void setBuilderInvalidvoid setBuilderInvalid(int var1)
public void setRoleBuilderNeedsReloadvoid setRoleBuilderNeedsReload(Builder<?> var1)
public void setupNPCLoadingvoid setupNPCLoading()
public boolean startRoleBenchmarkboolean startRoleBenchmark(double var1, @Nonnull Consumer<Int2ObjectMap<TimeDistributionRecorder>> var3)
public boolean startSensorSupportBenchmarkboolean startSensorSupportBenchmark(double var1, @Nonnull Consumer<Int2ObjectMap<SensorSupportBenchmark>> var3)
abstract super super(var1)
public boolean testAndValidateRoleboolean testAndValidateRole(@Nullable BuilderInfo var1)
public void validateSpawnableRolevoid validateSpawnableRole(String var1)

Исходный код

Показать/скрыть
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());
      }
   }
}