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;
}
}
}