RoleBuilderSystem class

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

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

extends: HolderSystem<EntityStore>

Поля (34)

МодификаторыТипИмя
return
return
return
return
return
BuilderSupport var10
Role var11
var11
Message var12
Object2IntMap var13
BeaconSupport var14
StateEvaluator var15
ValueStore.Builder var16
boolean var17
boolean var18
ModelComponent var19
Archetype var2
String var20
ModelAsset var21
float var22
Model var23
NPCPlugin var25
BuilderInfo var26
Interactions var27
Tickable[] var28
TransformComponent var30
NPCEntity var4
ComponentType var4
AlarmStore var5
int var6
var6
String var7
Builder var8
RoleStats var9

Методы (15)

МодификаторыВозвратСигнатура
private void failvoid fail(@Nonnull Holder<EntityStore> var1)
abstract for for(int var3 = var2.getMinIndex()
if if(var5 != null)
if if(var6 == Integer.MIN_VALUE)
if if(var6 < 0)
if if(var13 != null)
if if(var28 != null)
if if(var15 != null)
if if(var16 != null)
if if(var18)
if if(var19 == null)
if if(var21 == null)
if if(var8 instanceof SpawnEffect var29)
if if(var2 != null)
if if(var4 != null)

Исходный код

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

class="kw">import com.hypixel.hytale.common.thread.ticking.Tickable;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Archetype;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.RemoveReason;
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.query.Query;
class="kw">import com.hypixel.hytale.component.system.HolderSystem;
class="kw">import com.hypixel.hytale.logger.sentry.SkipSentryException;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.server.core.Message;
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.entity.effect.EffectControllerComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ActiveAnimationComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.CachedStatsComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.DisplayNameComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.FromPrefab;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Invulnerable;
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.PersistentDisplayName;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PersistentModel;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.system.ModelSystems;
class="kw">import com.hypixel.hytale.server.core.modules.entitystats.EntityStatsSystems;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.Interactions;
class="kw">import com.hypixel.hytale.server.core.modules.physics.systems.PhysicsValuesAddSystem;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.Builder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderInfo;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.blackboard.BlackboardSubscription;
class="kw">import com.hypixel.hytale.server.npc.components.FailedSpawnComponent;
class="kw">import com.hypixel.hytale.server.npc.components.Timers;
class="kw">import com.hypixel.hytale.server.npc.components.messaging.BeaconSupport;
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.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.SpawnEffect;
class="kw">import com.hypixel.hytale.server.npc.role.support.RoleStats;
class="kw">import com.hypixel.hytale.server.npc.storage.AlarmStore;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
class="kw">import com.hypixel.hytale.server.npc.valuestore.ValueStore;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import java.util.Set;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;

class="kw">public class RoleBuilderSystem class="kw">extends HolderSystem<EntityStore> {
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcComponentType;
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType = TransformComponent.getComponentType();
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, ModelComponent> modelComponentType = ModelComponent.getComponentType();
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, ModelRotateBoundingBoxComponent> modelRotateBoundingBoxComponentType = ModelRotateBoundingBoxComponent.getComponentType();
   @Nonnull
   class="kw">private class="kw">final ComponentType<EntityStore, PersistentModel> persistentModelComponentType = PersistentModel.getComponentType();
   @Nonnull
   class="kw">private class="kw">final Set<Dependency<EntityStore>> dependencies;
   @Nonnull
   class="kw">private class="kw">final Query<EntityStore> query;

   class="kw">public RoleBuilderSystem() {
      this.npcComponentType = NPCEntity.getComponentType();
      this.dependencies = Set.of(
         new SystemDependency<>(Order.AFTER, EntityStatsSystems.Setup.class),
         new SystemDependency<>(Order.AFTER, PhysicsValuesAddSystem.class),
         new SystemDependency<>(Order.AFTER, NPCSystems.OnNPCAdded.class),
         new SystemDependency<>(Order.BEFORE, ModelSystems.ModelSpawned.class)
      );
      this.query = Archetype.of(this.npcComponentType, this.transformComponentType);
   }

   @Nonnull
   @Override
   class="kw">public Set<Dependency<EntityStore>> getDependencies() {
      class="kw">return this.dependencies;
   }

   @Nonnull
   @Override
   class="kw">public Query<EntityStore> getQuery() {
      class="kw">return this.query;
   }

   @Override
   class="kw">public void onEntityAdd(@Nonnull Holder<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3) {
      NPCEntity var4 = var1.getComponent(this.npcComponentType);
      assert var4 != null;
      if (var4.getRole() == null) {
         if (var1.getComponent(AlarmStore.getComponentType()) == null) {
            AlarmStore var5 = var4.takeLegacyAlarmStore();
            if (var5 != null) {
               var1.putComponent(AlarmStore.getComponentType(), var5);
            }
         }

         NPCPlugin var25 = NPCPlugin.get();
         int var6 = var4.getRoleIndex();
         if (var6 == Integer.MIN_VALUE) {
            String var7 = var4.getRoleName();
            var6 = var25.getIndex(var7);
            if (var6 < 0) {
               this.fail(var1);
               var25.getLogger().at(Level.SEVERE).log("Reloading nonexistent role %s!", var7);
               class="kw">return;
            }

            if (var25.tryGetCachedValidRole(var6) == null) {
               this.fail(var1);
               var25.getLogger().at(Level.SEVERE).log("Reloading invalid role %s!", var7);
               class="kw">return;
            }

            var4.setRoleIndex(var6);
         }

         BuilderInfo var26 = var25.prepareRoleBuilderInfo(var6);
         Builder var8 = (Builder<Role>)var26.getBuilder();
         if (!var8.isSpawnable()) {
            this.fail(var1);
            var25.getLogger().at(Level.SEVERE).log("Attempting to spawn un-spawnable (class="kw">abstract) role: %s", var4.getRoleName());
         } else {
            RoleStats var9 = var4.shouldCollectSensorStats() ? new RoleStats() : null;
            BuilderSupport var10 = new BuilderSupport(var25.getBuilderManager(), var4, var1, new ExecutionContext(), var8, var9);

            Role var11;
            try {
               var11 = NPCPlugin.buildRole(var1, var8, var26, var10, var6);
            } catch (SkipSentryException var24) {
               this.fail(var1);
               var25.getLogger().at(Level.SEVERE).log("Error: %s for NPC %s", var24.getMessage(), var4.getRole());
               class="kw">return;
            }

            var4.setRole(var11);
            if (var11.isInvulnerable()) {
               var1.ensureComponent(Invulnerable.getComponentType());
            }

            if (var1.getComponent(PersistentDisplayName.getComponentType()) == null) {
               Message var12 = Message.translation(var11.getNameTranslationKey());
               var1.putComponent(DisplayNameComponent.getComponentType(), new DisplayNameComponent(var12));
            }

            Interactions var27 = var1.ensureAndGetComponent(Interactions.getComponentType());
            var27.setInteractionId(InteractionType.Use, "*UseNPC");
            if (var11.getDeathInteraction() != null) {
               var27.setInteractionId(InteractionType.Death, var11.getDeathInteraction());
            }

            Object2IntMap var13 = var10.getBeaconSlotMappings();
            if (var13 != null) {
               BeaconSupport var14 = new BeaconSupport();
               var14.initialise(var13);
               var1.putComponent(BeaconSupport.getComponentType(), var14);
            }

            BlackboardSubscription.buildAndAttach(var1, var10);
            Tickable[] var28 = var10.allocateTimers();
            if (var28 != null) {
               var1.putComponent(Timers.getComponentType(), new Timers(var28));
            }

            StateEvaluator var15 = var10.getStateEvaluator();
            if (var15 != null) {
               var1.putComponent(StateEvaluator.getComponentType(), var15);
            }

            ValueStore.Builder var16 = var10.getValueStoreBuilder();
            if (var16 != null) {
               var1.putComponent(ValueStore.getComponentType(), var16.build());
            }

            var1.ensureComponent(EffectControllerComponent.getComponentType());
            var1.ensureComponent(ActiveAnimationComponent.getComponentType());
            var1.ensureComponent(CachedStatsComponent.getComponentType());
            var1.ensureComponent(this.modelRotateBoundingBoxComponentType);
            boolean var17 = var1.getArchetype().contains(FromPrefab.getComponentType());
            boolean var18 = var2.equals(AddReason.SPAWN) || var17;
            if (var18) {
               ModelComponent var19 = var1.getComponent(this.modelComponentType);
               if (var19 == null) {
                  String var20 = var11.getAppearanceName();
                  if (var20 == null || var20.isEmpty()) {
                     this.fail(var1);
                     var25.getLogger().at(Level.SEVERE).log("Appearance can't be initially empty for role %s", var4.getRoleName());
                     class="kw">return;
                  }

                  ModelAsset var21 = ModelAsset.getAssetMap().getAsset(var20);
                  if (var21 == null) {
                     this.fail(var1);
                     var25.getLogger().at(Level.SEVERE).log("Model asset not found: %s for role %s", var20, var4.getRoleName());
                     class="kw">return;
                  }

                  float var22 = var21.generateRandomScale();
                  var4.setInitialModelScale(var22);
                  Model var23 = Model.createScaledModel(var21, var22);
                  var1.putComponent(this.persistentModelComponentType, new PersistentModel(var23.toReference()));
                  var1.putComponent(this.modelComponentType, new ModelComponent(var23));
               }

               var11.spawned(var1, var4, var3);
               if (var8 class="kw">instanceof SpawnEffect var29) {
                  TransformComponent var30 = var1.getComponent(this.transformComponentType);
                  assert var30 != null;
                  var29.spawnEffect(var1, var10, var30.getPosition(), var30.getRotation(), var3);
               }
            }
         }
      }
   }

   @Override
   class="kw">public void onEntityRemoved(@Nonnull Holder<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3) {
   }

   class="kw">private void fail(@Nonnull Holder<EntityStore> var1) {
      Archetype var2 = var1.getArchetype();
      if (var2 != null) {
         for (int var3 = var2.getMinIndex(); var3 < var2.length(); var3++) {
            ComponentType var4 = (ComponentType<EntityStore, ? class="kw">extends Component<EntityStore>>)var2.get(var3);
            if (var4 != null) {
               var1.removeComponent(var4);
            }
         }

         var1.ensureComponent(FailedSpawnComponent.getComponentType());
      }
   }
}