ActionSpawn class

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

Файл: com/hypixel/hytale/server/npc/corecomponents/lifecycle/ActionSpawn.java

extends: ActionBase

implements: Deferrable

Поля (49)

МодификаторыТипИмя
return this.spawnsLeft > 0
break
final float spawnDirection
double var10
double var11
var11
var11
double var11
double var12
double var13
var13
var13
double var13
double var14
float var15
double var15
Pair var16
float var17
double var17
double var18
FlockAsset var19
float var19
double var21
double[] var3
NPCEntity var3
TransformComponent var3
int[] var4
World var4
NPCEntity var4
Ref var4
var4
NPCEntity var4
double[] var5
TransformComponent var5
Role var5
ModelComponent var6
Vector3d var6
SpawningContext var6
IPositionProvider var7
Vector3d var7
double var7
Builder var7
SpawningContext var8
Rotation3f var8
Builder var9
double var9
var9
var9
double var9

Методы (25)

МодификаторыВозвратСигнатура
protected boolean deferredSpawningboolean deferredSpawning(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, double var3, @Nonnull Store<EntityStore> var5)
if if(this.spawnsLeft == 0)
if if(this.launchAtTarget)
if if(this.spawnsLeft == 1)
if if(--this.spawnsLeft == 0)
if if(this.minDelay > 0.0 || this.maxDelay > 0.0)
if if(--this.maxTries == 0)
if if(this.launchAtTarget)
if if(!this.fanOut)
if if(this.fanOut)
if if(var4 != null)
if if(this.spawnState != null)
if if(this.joinFlock)
if if(var3 != null)
if if(var4 == null)
if if(this.launchAtTarget)
if if(this.spread > 0.0)
if if(this.spawnDelay > 0.0)
if if(this.maxTries <= 0)
protected void joinFlockvoid joinFlock(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2)
protected void launchAtTargetvoid launchAtTarget(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2)
protected void postSpawnvoid postSpawn(@Nonnull NPCEntity var1, @Nonnull Ref<EntityStore> var2, @Nonnull Store<EntityStore> var3)
abstract super super(var1)
protected boolean trySpawnboolean trySpawn(@Nonnull Ref<EntityStore> var1, @Nonnull SpawningContext var2, @Nonnull Store<EntityStore> var3)
while while(this.spawnsLeft > 0)

Исходный код

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

class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.random.RandomExtra;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.flock.FlockMembershipSystems;
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.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.Builder;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.ActionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.PositionSource;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.lifecycle.builders.BuilderActionSpawn;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.instructions.Deferrable;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.MotionControllerFly;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.support.StateSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.IPositionProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.systems.NewSpawnStartTickingSystem;
class="kw">import com.hypixel.hytale.server.npc.util.AimingHelper;
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 java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class ActionSpawn class="kw">extends ActionBase class="kw">implements Deferrable {
   class="kw">protected class="kw">final float spawnDirection;
   class="kw">protected class="kw">final float spawnAngle;
   class="kw">protected class="kw">final boolean fanOut;
   class="kw">protected class="kw">final double minDistance;
   class="kw">protected class="kw">final double maxDistance;
   class="kw">protected class="kw">final String kind;
   class="kw">protected class="kw">final String flock;
   class="kw">protected class="kw">final int roleIndex;
   class="kw">protected class="kw">final int maxCount;
   class="kw">protected class="kw">final int minCount;
   class="kw">protected class="kw">final double minDelay;
   class="kw">protected class="kw">final double maxDelay;
   class="kw">protected class="kw">final Vector3d position = new Vector3d();
   class="kw">protected class="kw">final Rotation3f rotation = new Rotation3f();
   class="kw">protected class="kw">final boolean launchAtTarget;
   class="kw">protected class="kw">final boolean pitchHigh;
   class="kw">protected class="kw">final Vector3d targetPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d launchDirection = new Vector3d();
   @Nullable
   class="kw">protected class="kw">final float[] pitch;
   class="kw">protected class="kw">final double spread;
   class="kw">protected class="kw">final boolean joinFlock;
   class="kw">protected class="kw">final String spawnState;
   class="kw">protected class="kw">final String spawnSubState;
   class="kw">protected class="kw">final PositionSource positionSource;
   class="kw">protected class="kw">final Vector3d scopedOrigin = new Vector3d();
   class="kw">protected boolean hasScopedOrigin;
   class="kw">protected int spawnsLeft;
   class="kw">protected int maxTries;
   class="kw">protected float yaw0;
   class="kw">protected float yawIncrement;
   class="kw">protected double spawnDelay;
   class="kw">protected Ref<EntityStore> parent;

   class="kw">public ActionSpawn(@Nonnull BuilderActionSpawn var1, @Nonnull BuilderSupport var2) {
      super(var1);
      this.spawnDirection = var1.getSpawnDirection(var2);
      this.spawnAngle = var1.getSpawnAngle(var2);
      this.fanOut = var1.isFanOut(var2);
      double[] var3 = var1.getDistanceRange(var2);
      this.minDistance = var3[0];
      this.maxDistance = var3[1];
      int[] var4 = var1.getCountRange(var2);
      this.minCount = var4[0];
      this.maxCount = var4[1];
      double[] var5 = var1.getDelayRange(var2);
      this.minDelay = var5[0];
      this.maxDelay = var5[1];
      this.kind = var1.getKind(var2);
      this.flock = var1.getFlock(var2);
      this.roleIndex = NPCPlugin.get().getIndex(this.kind);
      this.launchAtTarget = var1.isLaunchAtTarget(var2);
      this.pitchHigh = var1.isPitchHigh(var2);
      this.spread = var1.getSpread(var2);
      this.joinFlock = var1.isJoinFlock(var2);
      this.pitch = this.launchAtTarget ? new float[2] : null;
      this.spawnState = var1.getSpawnState(var2);
      this.spawnSubState = var1.getSpawnSubState(var2);
      this.positionSource = var1.getPositionSource(var2);
   }

   @Override
   class="kw">public boolean canExecute(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, double var4, @Nonnull Store<EntityStore> var6
   ) {
      if (super.canExecute(var1, var2, var3, var4, var6) && this.roleIndex >= 0 && this.spawnsLeft <= 0) {
         if (NPCPlugin.get().tryGetCachedValidRole(this.roleIndex) == null) {
            NPCPlugin.get().getLogger().at(Level.SEVERE).log("Entity '%s': Unable to spawn NPC of type '%s' from Action Spawn", var2.getName(), this.kind);
            this.setOnce();
            this.once = true;
            class="kw">return false;
         } else {
            class="kw">return !this.launchAtTarget ? true : var3 != null && var3.hasPosition();
         }
      } else {
         class="kw">return false;
      }
   }

   @Override
   class="kw">public boolean execute(
      @Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull InfoProvider var3, double var4, @Nonnull Store<EntityStore> var6
   ) {
      super.execute(var1, var2, var3, var4, var6);
      IPositionProvider var7 = this.positionSource == PositionSource.Sensor ? var3.getPositionProvider() : null;
      this.hasScopedOrigin = var7 != null && var7.providePosition(this.scopedOrigin);
      this.spawnsLeft = RandomExtra.randomRange(this.minCount, this.maxCount);
      if (this.spawnsLeft == 0) {
         class="kw">return true;
      }

      this.maxTries = this.spawnsLeft * 5;
      if (this.launchAtTarget) {
         var3.getPositionProvider().providePosition(this.targetPosition);
      } else if (this.fanOut) {
         if (this.spawnsLeft == 1) {
            this.yaw0 = this.spawnDirection;
         } else {
            this.yaw0 = this.spawnDirection - this.spawnAngle / 2.0F;
            this.yawIncrement = this.spawnAngle / (this.spawnsLeft - 1);
         }
      } else {
         this.yaw0 = this.spawnDirection - this.spawnAngle / 2.0F;
      }

      SpawningContext var8 = new SpawningContext();
      this.parent = var1;
      Builder var9 = NPCPlugin.get().tryGetCachedValidRole(this.roleIndex);
      if ((var9.isSpawnable() || var9 class="kw">instanceof ISpawnableWithModel) && var8.setSpawnable((ISpawnableWithModel)var9)) {
         while (this.spawnsLeft > 0) {
            if (this.trySpawn(var1, var8, var6)) {
               if (--this.spawnsLeft == 0) {
                  class="kw">return true;
               }

               if (this.minDelay > 0.0 || this.maxDelay > 0.0) {
                  break;
               }

               var8.newModel();
            }

            if (--this.maxTries == 0) {
               this.spawnsLeft = 0;
               class="kw">return true;
            }
         }

         this.spawnDelay = RandomExtra.randomRange(this.minDelay, this.maxDelay);
         var2.getEntitySupport().addDeferredAction(this::deferredSpawning);
         class="kw">return true;
      } else {
         this.spawnsLeft = 0;
         class="kw">return true;
      }
   }

   @Override
   class="kw">public boolean isBusy() {
      class="kw">return this.spawnsLeft > 0;
   }

   @Override
   class="kw">public boolean isDeferred() {
      class="kw">return this.maxCount > 1 && this.maxDelay > 0.0;
   }

   class="kw">protected boolean trySpawn(@Nonnull Ref<EntityStore> var1, @Nonnull SpawningContext var2, @Nonnull Store<EntityStore> var3) {
      World var4 = var3.getExternalData().getWorld();
      TransformComponent var5 = var3.getComponent(var1, TransformComponent.getComponentType());
      assert var5 != null;
      ModelComponent var6 = var3.getComponent(var1, ModelComponent.getComponentType());
      Vector3d var7 = !this.launchAtTarget && this.positionSource == PositionSource.Sensor && this.hasScopedOrigin ? this.scopedOrigin : var5.getPosition();
      Rotation3f var8 = var5.getRotation();
      double var9;
      double var11;
      double var13;
      if (this.launchAtTarget) {
         float var15 = var6 != null ? var6.getModel().getEyeHeight() : 0.0F;
         var9 = var7.x();
         var11 = var7.z();
         var13 = var7.y() + var15;
      } else {
         double var18 = RandomExtra.randomRange(this.minDistance, this.maxDistance);
         float var17 = var8.yaw() + this.yaw0;
         if (!this.fanOut) {
            var17 += RandomExtra.randomRange(0.0F, this.spawnAngle);
         }

         var9 = var7.x() + PhysicsMath.headingX(var17) * var18;
         var11 = var7.z() + PhysicsMath.headingZ(var17) * var18;
         var13 = var7.y();
      }

      if (var2.set(var4, var9, var13, var11) && var2.canSpawn() == SpawnTestResult.TEST_OK) {
         this.position.set(var2.xSpawn, var2.ySpawn, var2.zSpawn);
         this.rotation.set(var8);
         FlockAsset var19 = this.flock != null ? FlockAsset.getAssetMap().getAsset(this.flock) : null;
         Pair var16 = NPCPlugin.get().spawnEntity(var3, this.roleIndex, this.position, this.rotation, var2.getModel(), this::postSpawn);
         FlockPlugin.trySpawnFlock(
            (Ref<EntityStore>)var16.first(), (NPCEntity)var16.second(), var3, this.roleIndex, this.position, this.rotation, var19, this::postSpawn
         );
         if (this.fanOut) {
            this.yaw0 = this.yaw0 + this.yawIncrement;
         }

         class="kw">return true;
      } else {
         class="kw">return false;
      }
   }

   class="kw">protected void postSpawn(@Nonnull NPCEntity var1, @Nonnull Ref<EntityStore> var2, @Nonnull Store<EntityStore> var3) {
      NPCEntity var4 = var3.getComponent(this.parent, NPCEntity.getComponentType());
      if (var4 != null) {
         this.joinFlock(var2, var3);
         var1.setSpawnConfiguration(var4.getSpawnConfiguration());
      }

      this.launchAtTarget(var2, var3);
      if (this.spawnState != null) {
         StateSupport.get(var2, var3).setState(var2, this.spawnState, this.spawnSubState, var3);
      }

      NewSpawnStartTickingSystem.queueNewSpawn(var2, var3);
      SpawnLineage.inherit(this.parent, var2, var3);
   }

   class="kw">protected void joinFlock(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      if (this.joinFlock) {
         NPCEntity var3 = var2.getComponent(this.parent, NPCEntity.getComponentType());
         if (var3 != null) {
            Ref var4 = FlockPlugin.getFlockReference(this.parent, var2);
            if (var4 == null) {
               var4 = FlockPlugin.createFlock(var2, var3.getRole());
               FlockMembershipSystems.join(this.parent, var4, var2);
            }

            FlockMembershipSystems.join(var1, var4, var2);
         }
      }
   }

   class="kw">protected void launchAtTarget(@Nonnull Ref<EntityStore> var1, @Nonnull Store<EntityStore> var2) {
      if (this.launchAtTarget) {
         if (this.spread > 0.0) {
            this.targetPosition.add(RandomExtra.randomRange(-this.spread, this.spread), 0.0, RandomExtra.randomRange(-this.spread, this.spread));
         }

         TransformComponent var3 = var2.getComponent(var1, TransformComponent.getComponentType());
         assert var3 != null;
         NPCEntity var4 = var2.getComponent(var1, NPCEntity.getComponentType());
         assert var4 != null;
         Role var5 = var4.getRole();
         Vector3d var6 = var3.getPosition();
         this.launchDirection.set(this.targetPosition).sub(var6).normalize();
         if (var5.getActiveMotionController() class="kw">instanceof MotionControllerFly var20) {
            double var21 = var6.distance(this.targetPosition);
            double var10 = var20.getExternalVelocityStopThresholdSquared();
            double var12 = -var20.getDampingDeceleration();
            double var14 = Math.sqrt(var10 - 2.0 * var12 * var21);
            this.launchDirection.mul(var14);
            var5.setVelocity(this.launchDirection, null, false);
         } else {
            double var7 = this.targetPosition.x - var6.x;
            double var9 = this.targetPosition.z - var6.z;
            double var11 = Math.sqrt(var7 * var7 + var9 * var9);
            double var13 = this.targetPosition.y - var6.y;
            double var15 = 32.0;
            double var17 = AimingHelper.ensurePossibleThrowSpeed(var11, var13, 32.0, 1.0);
            if (!AimingHelper.computePitch(var11, var13, var17, 32.0, this.pitch)) {
               throw new IllegalStateException(
                  String.format("Error in computing pitch with distance %s, height %s, and speed %s despite ensuring possible throw speed", var11, var13, var17)
               );
            }

            float var19 = PhysicsMath.headingFromDirection(this.launchDirection.x, this.launchDirection.z);
            PhysicsMath.vectorFromAngles(var19, this.pitchHigh ? this.pitch[1] : this.pitch[0], this.launchDirection).normalize();
            this.launchDirection.mul(var17);
            var5.setVelocity(this.launchDirection, null, true);
         }
      }
   }

   class="kw">protected boolean deferredSpawning(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, double var3, @Nonnull Store<EntityStore> var5) {
      this.spawnDelay -= var3;
      if (this.spawnDelay > 0.0) {
         class="kw">return false;
      }

      this.spawnDelay = RandomExtra.randomRange(this.minDelay, this.maxDelay);
      SpawningContext var6 = new SpawningContext();
      Builder var7 = NPCPlugin.get().tryGetCachedValidRole(this.roleIndex);
      if (var7.isSpawnable() && var7 class="kw">instanceof ISpawnableWithModel && var6.setSpawnable((ISpawnableWithModel)var7)) {
         while (!this.trySpawn(var1, var6, var5)) {
            this.maxTries--;
            if (this.maxTries <= 0) {
               this.spawnsLeft = 0;
               class="kw">return true;
            }
         }

         this.spawnsLeft--;
         class="kw">return this.spawnsLeft == 0;
      } else {
         class="kw">return true;
      }
   }
}