NPCSpawnCommand class
Пакет: com.hypixel.hytale.server.npc.commands
Файл: com/hypixel/hytale/server/npc/commands/NPCSpawnCommand.java
extends: AbstractPlayerCommand
Поля (63)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
double |
PLAYER_FOOT_POINT_EPSILON |
|
|
return |
|
Rotation3f |
var10 |
|
TransformComponent |
var11 |
|
Vector3d |
var12 |
|
BoundingBox |
var13 |
|
Box |
var14 |
|
int |
var15 |
|
double |
var16 |
|
String |
var18 |
|
Vector3d |
var20 |
|
Random |
var21 |
|
Vector3d |
var22 |
|
Rotation3f |
var23 |
|
boolean |
var24 |
|
|
var24 |
|
Rotation3f |
var25 |
|
|
var25 |
|
|
var25 |
|
String |
var26 |
|
Integer |
var27 |
|
Boolean |
var28 |
|
String[] |
var3 |
|
String[] |
var3 |
|
Integer |
var3 |
|
Builder |
var30 |
|
SpawningContext |
var32 |
|
Model |
var33 |
|
|
var33 |
|
|
var33 |
|
|
var33 |
|
TriConsumer |
var34 |
|
|
var34 |
|
PlayerSkin |
var35 |
|
Float |
var36 |
|
|
var36 |
|
Vector3d |
var37 |
|
|
var37 |
|
|
var37 |
|
Pair |
var38 |
|
UUIDComponent |
var39 |
|
FlockAsset |
var4 |
|
Vector3d |
var40 |
|
double |
var41 |
|
double |
var43 |
|
double |
var45 |
|
ModelAsset |
var48 |
|
Ref |
var49 |
|
|
var49 |
|
|
var49 |
|
NPCEntity |
var50 |
|
|
var50 |
|
|
var50 |
|
Vector3d |
var51 |
|
TransformComponent |
var52 |
|
Pair |
var53 |
|
HeadRotation |
var54 |
|
NPCPlugin |
var6 |
|
Player |
var6 |
|
BuilderInfo |
var7 |
|
PlayerRef |
var7 |
|
int |
var8 |
|
HeadRotation |
var9 |
Методы (24)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Can't find a matching role builder") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Role builder must support ISpawnableWithModel interface") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Abstract role templates cannot be spawned directly - a variant needs to be created!") |
|
public |
SpawnPageCommandpublic SpawnPageCommand() |
|
protected void |
executeprotected void execute(@Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5) |
|
|
for for(int var29 = 0; var29 < var15; var29++) |
|
|
if if(var18 != null) |
|
|
if if(var27 != null) |
|
|
if if(var30 == null) |
|
|
if if(var24) |
|
|
if if(var22 != null) |
|
|
if if(var27 > 1) |
|
|
if if(var37 == null) |
|
|
if if(var22 != null) |
|
|
if if(var27 > 1) |
|
|
if if(var23 != null) |
|
|
if if(var15 > 1) |
|
|
if if(var28) |
|
|
if if(var3.length != 3) |
|
|
if if(var3.length != 3) |
|
|
if if(var3 <= 0) |
|
|
if if(var4 == null) |
abstract |
|
super super("spawn", "server.commands.npc.spawn.desc") |
abstract |
|
super super("server.commands.npc.spawn.page.desc") |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.commands;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.common.util.RandomUtil;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.function.consumer.TriConsumer;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.PlayerSkin;
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.command.system.CommandContext;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.FlagArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.OptionalArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.system.RequiredArg;
class="kw">import com.hypixel.hytale.server.core.command.system.arguments.types.ArgTypes;
class="kw">import com.hypixel.hytale.server.core.command.system.basecommands.AbstractPlayerCommand;
class="kw">import com.hypixel.hytale.server.core.command.system.exceptions.GeneralCommandException;
class="kw">import com.hypixel.hytale.server.core.cosmetics.CosmeticsModule;
class="kw">import com.hypixel.hytale.server.core.entity.Frozen;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.player.ApplyRandomSkinPersistedComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.player.PlayerSkinComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
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.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.BuilderInfo;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.pages.EntitySpawnPage;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.role.RoleDebugFlags;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnableWithModel;
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.Random;
class="kw">import java.util.concurrent.ThreadLocalRandom;
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 NPCSpawnCommand class="kw">extends AbstractPlayerCommand {
class="kw">private class="kw">static class="kw">final double PLAYER_FOOT_POINT_EPSILON = 0.01;
@Nonnull
class="kw">private class="kw">final RequiredArg<BuilderInfo> roleArg = this.withRequiredArg("role", "server.commands.npc.spawn.role.desc", NPCCommand.NPC_ROLE);
@Nonnull
class="kw">private class="kw">final OptionalArg<Integer> countArg = this.withOptionalArg("count", "server.commands.npc.spawn.count.desc", ArgTypes.INTEGER)
.addValidator(Validators.greaterThan(0));
@Nonnull
class="kw">private class="kw">final OptionalArg<Double> radiusArg = this.withOptionalArg("radius", "server.commands.npc.spawn.radius.desc", ArgTypes.DOUBLE)
.addValidator(Validators.greaterThan(0.0));
@Nonnull
class="kw">private class="kw">final OptionalArg<String> flagsArg = this.withOptionalArg("flags", "server.commands.npc.spawn.flags.desc", ArgTypes.STRING);
@Nonnull
class="kw">private class="kw">final OptionalArg<Double> speedArg = this.withOptionalArg("speed", "server.commands.npc.spawn.speed.desc", ArgTypes.DOUBLE)
.addValidator(Validators.greaterThan(0.0));
@Nonnull
class="kw">private class="kw">final FlagArg nonRandomArg = this.withFlagArg("nonrandom", "server.commands.npc.spawn.random.desc");
@Nonnull
class="kw">private class="kw">final OptionalArg<String> positionSetArg = this.withOptionalArg("position", "server.commands.npc.spawn.position.desc", ArgTypes.STRING);
@Nonnull
class="kw">private class="kw">final OptionalArg<String> posOffsetArg = this.withOptionalArg("posOffset", "server.commands.npc.spawn.posOffset.desc", ArgTypes.STRING);
@Nonnull
class="kw">private class="kw">final OptionalArg<String> headRotationArg = this.withOptionalArg("headRotation", "server.commands.npc.spawn.headRotation.desc", ArgTypes.STRING);
@Nonnull
class="kw">private class="kw">final OptionalArg<String> bodyRotationArg = this.withOptionalArg("bodyRotation", "server.commands.npc.spawn.bodyRotation.desc", ArgTypes.STRING);
@Nonnull
class="kw">private class="kw">final FlagArg randomRotationArg = this.withFlagArg("randomRotation", "server.commands.npc.spawn.randomRotation.desc");
@Nonnull
class="kw">private class="kw">final FlagArg facingRotationArg = this.withFlagArg("facingRotation", "server.commands.npc.spawn.facingRotation.desc");
@Nonnull
class="kw">private class="kw">final OptionalArg<String> flockArg = this.withOptionalArg("flock", "server.commands.npc.spawn.flock.desc", ArgTypes.STRING);
@Nonnull
class="kw">private class="kw">final FlagArg testArg = this.withFlagArg("test", "server.commands.npc.spawn.test.desc");
@Nonnull
class="kw">private class="kw">final FlagArg spawnOnGroundArg = this.withFlagArg("spawnOnGround", "server.commands.npc.spawn.spawnOnGround.desc");
@Nonnull
class="kw">private class="kw">final FlagArg frozenArg = this.withFlagArg("frozen", "server.commands.npc.spawn.frozen.desc");
@Nonnull
class="kw">private class="kw">final FlagArg randomModelArg = this.withFlagArg("randomModel", "server.commands.npc.spawn.randomModel.desc");
@Nonnull
class="kw">private class="kw">final OptionalArg<Float> scaleArg = this.withOptionalArg("scale", "server.commands.npc.spawn.scale.desc", ArgTypes.FLOAT);
@Nonnull
class="kw">private class="kw">final FlagArg bypassScaleLimitsArg = this.withFlagArg("bypassScaleLimits", "server.commands.npc.spawn.bypassScaleLimits.desc");
class="kw">public NPCSpawnCommand() {
super("spawn", "server.commands.npc.spawn.desc");
this.addUsageVariant(new NPCSpawnCommand.SpawnPageCommand());
}
@Override
class="kw">protected void execute(
@Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5
) {
NPCPlugin var6 = NPCPlugin.get();
BuilderInfo var7 = this.roleArg.get(var1);
int var8 = var7.getIndex();
HeadRotation var9 = var2.getComponent(var3, HeadRotation.getComponentType());
assert var9 != null;
Rotation3f var10 = var9.getRotation();
TransformComponent var11 = var2.getComponent(var3, TransformComponent.getComponentType());
assert var11 != null;
Vector3d var12 = var11.getPosition();
BoundingBox var13 = var2.getComponent(var3, BoundingBox.getComponentType());
assert var13 != null;
Box var14 = var13.getBoundingBox();
int var15 = this.countArg.provided(var1) ? this.countArg.get(var1) : 1;
double var16 = this.radiusArg.provided(var1) ? this.radiusArg.get(var1) : 8.0;
String var18 = this.flagsArg.provided(var1) ? this.flagsArg.get(var1) : null;
if (var18 != null) {
RoleDebugFlags.getFlags(var18.split(",", 0));
} else {
RoleDebugFlags.getPreset("none");
}
Vector3d var20 = new Vector3d(Vector3dUtil.ZERO);
if (this.speedArg.provided(var1)) {
PhysicsMath.vectorFromAngles(var10.yaw(), var10.pitch(), var20);
var20.normalize(this.speedArg.get(var1));
}
Random var21 = this.nonRandomArg.get(var1) ? new Random(0L) : ThreadLocalRandom.current();
Vector3d var22 = this.posOffsetArg.provided(var1) ? this.parseVector3d(var1, this.posOffsetArg.get(var1)) : null;
Rotation3f var23 = this.headRotationArg.provided(var1) ? this.parseVector3f(var1, this.headRotationArg.get(var1)) : null;
boolean var24 = false;
Rotation3f var25 = new Rotation3f(0.0F, var10.y(), 0.0F);
if (this.bodyRotationArg.provided(var1)) {
var25 = this.parseVector3f(var1, this.bodyRotationArg.get(var1));
} else if (this.randomRotationArg.get(var1)) {
var24 = true;
} else if (this.facingRotationArg.get(var1)) {
var25.setY(var25.y() - (float) Math.PI);
}
String var26 = this.flockArg.provided(var1) ? this.flockArg.get(var1) : "1";
Integer var27 = this.parseFlockSize(var1, var26);
if (var27 != null) {
Boolean var28 = this.frozenArg.get(var1);
var6.forceValidation(var8);
if (!var6.testAndValidateRole(var7)) {
throw new GeneralCommandException(Message.translation("server.commands.npc.spawn.validation_failed"));
}
try {
for (int var29 = 0; var29 < var15; var29++) {
Builder var30 = var6.tryGetCachedValidRole(var8);
if (var30 == null) {
throw new IllegalArgumentException("Can't find a matching role builder");
}
if (!(var30 class="kw">instanceof ISpawnableWithModel var31)) {
throw new IllegalArgumentException("Role builder must support ISpawnableWithModel class="kw">interface");
}
if (!var30.isSpawnable()) {
throw new IllegalArgumentException("Abstract role templates cannot be spawned directly - a variant needs to be created!");
}
SpawningContext var32 = new SpawningContext();
if (!var32.setSpawnable(var31)) {
throw new GeneralCommandException(Message.translation("server.commands.npc.spawn.cantSetRolebuilder"));
}
TriConsumer var34 = null;
Model var33;
if (this.randomModelArg.get(var1)) {
PlayerSkin var35 = CosmeticsModule.get().generateRandomSkin(RandomUtil.getSecureRandom());
var33 = CosmeticsModule.get().createModel(var35);
var34 = (var1x, var2x, var3x) -> {
var3x.putComponent(var2x, PlayerSkinComponent.getComponentType(), new PlayerSkinComponent(var35));
var3x.putComponent(var2x, ApplyRandomSkinPersistedComponent.getComponentType(), ApplyRandomSkinPersistedComponent.INSTANCE);
};
} else {
var33 = var32.getModel();
}
if (var24) {
var25 = new Rotation3f(0.0F, (float)(2.0 * var21.nextDouble() * Math.PI), 0.0F);
}
if (this.scaleArg.provided(var1)) {
ModelAsset var48 = ModelAsset.getAssetMap().getAsset(var33.getModelAssetId());
assert var48 != null;
Float var36 = this.scaleArg.get(var1);
if (!this.bypassScaleLimitsArg.get(var1)) {
var36 = MathUtil.clamp(var36, var48.getMinScale(), var48.getMaxScale());
}
var33 = Model.createScaledModel(var48, var36);
}
Ref var49;
NPCEntity var50;
if (var15 == 1 && this.testArg.get(var1)) {
if (!var32.set(var5, var12.x, var12.y, var12.z)) {
throw new GeneralCommandException(Message.translation("server.commands.npc.spawn.cantSpawnNotEnoughSpace"));
}
if (var31.canSpawn(var32) != SpawnTestResult.TEST_OK) {
throw new GeneralCommandException(Message.translation("server.commands.npc.spawn.cantSpawnNotSuitable"));
}
Vector3d var51 = var32.newPosition();
if (var22 != null) {
var51.add(var22);
}
Pair var53 = var6.spawnEntity(var2, var8, var51, var25, var33, var34);
var49 = (Ref<EntityStore>)var53.first();
var50 = (NPCEntity)var53.second();
if (var27 > 1) {
FlockPlugin.trySpawnFlock(var49, var50, var2, var8, var51, var25, var27, var34);
}
} else {
Vector3d var37;
if (this.positionSetArg.provided(var1)) {
var37 = this.parseVector3d(var1, this.positionSetArg.get(var1));
if (var37 == null) {
class="kw">return;
}
var37.y = var37.y - var33.getBoundingBox().min.y;
} else {
var37 = new Vector3d(var12);
var37.y = var37.y + var14.min.y + 0.01 - var33.getBoundingBox().min.y;
}
if (var22 != null) {
var37.add(var22);
}
Pair var38 = var6.spawnEntity(var2, var8, var37, var25, var33, var34);
var49 = (Ref<EntityStore>)var38.first();
var50 = (NPCEntity)var38.second();
if (var27 > 1) {
FlockPlugin.trySpawnFlock(var49, var50, var2, var8, var37, var25, var27, var34);
}
}
TransformComponent var52 = var2.getComponent(var49, TransformComponent.getComponentType());
assert var52 != null;
HeadRotation var54 = var2.getComponent(var49, HeadRotation.getComponentType());
assert var54 != null;
UUIDComponent var39 = var2.getComponent(var49, UUIDComponent.getComponentType());
assert var39 != null;
if (var23 != null) {
var54.getRotation().set(var23);
var2.ensureComponent(var49, Frozen.getComponentType());
}
Vector3d var40 = var52.getPosition();
double var41 = var40.x();
double var43 = var40.y();
double var45 = var40.z();
if (var15 > 1) {
var41 += var21.nextDouble() * 2.0 * var16 - var16;
var45 += var21.nextDouble() * 2.0 * var16 - var16;
var43 += this.spawnOnGroundArg.get(var1) ? 0.1 : var21.nextDouble() * 2.0 + 5.0;
} else {
var43 += 0.1;
}
var40.set(var41, var43, var45);
var50.saveLeashInformation(var40, var52.getRotation());
if (!var20.equals(Vector3dUtil.ZERO)) {
var50.getRole().setVelocity(var20, null, false);
}
if (var28) {
var2.ensureComponent(var49, Frozen.getComponentType());
}
NPCPlugin.get()
.getLogger()
.at(Level.INFO)
.log("%s created with id %s at position %s", var50.getRoleName(), var39.getUuid(), Vector3dUtil.formatShortString(var40));
}
} catch (IllegalArgumentException | IllegalStateException | NullPointerException var47) {
NPCPlugin.get().getLogger().at(Level.WARNING).log("Spawn failed: %s", var47.getMessage());
throw new GeneralCommandException(Message.translation("server.commands.npc.spawn.failed").param("reason", var47.getMessage()));
}
}
}
@Nullable
class="kw">private Vector3d parseVector3d(@Nonnull CommandContext var1, @Nonnull String var2) {
String[] var3 = var2.split(",", 0);
if (var3.length != 3) {
var1.sendMessage(Message.raw("Invalid Vector3d format: must be three comma-separated doubles"));
class="kw">return null;
}
try {
class="kw">return new Vector3d(Double.parseDouble(var3[0]), Double.parseDouble(var3[1]), Double.parseDouble(var3[2]));
} catch (NumberFormatException var5) {
var1.sendMessage(Message.raw("Invalid Vector3d format: " + var5.getMessage()));
class="kw">return null;
}
}
@Nullable
class="kw">private Rotation3f parseVector3f(@Nonnull CommandContext var1, @Nonnull String var2) {
String[] var3 = var2.split(",", 0);
if (var3.length != 3) {
var1.sendMessage(Message.raw("Invalid Vector3f format: must be three comma-separated floats"));
class="kw">return null;
}
try {
class="kw">return new Rotation3f(Float.parseFloat(var3[0]), Float.parseFloat(var3[1]), Float.parseFloat(var3[2]));
} catch (NumberFormatException var5) {
var1.sendMessage(Message.raw("Invalid Vector3f format: " + var5.getMessage()));
class="kw">return null;
}
}
@Nullable
class="kw">private Integer parseFlockSize(@Nonnull CommandContext var1, @Nonnull String var2) {
try {
Integer var3 = Integer.valueOf(var2);
if (var3 <= 0) {
var1.sendMessage(Message.raw("Flock size must be greater than 0!"));
class="kw">return null;
} else {
class="kw">return var3;
}
} catch (NumberFormatException var5) {
FlockAsset var4 = FlockAsset.getAssetMap().getAsset(var2);
if (var4 == null) {
var1.sendMessage(Message.raw("No such flock asset: " + var2));
class="kw">return null;
} else {
class="kw">return var4.pickFlockSize();
}
}
}
class="kw">public class="kw">static class SpawnPageCommand class="kw">extends AbstractPlayerCommand {
class="kw">public SpawnPageCommand() {
super("server.commands.npc.spawn.page.desc");
}
@Override
class="kw">protected void execute(
@Nonnull CommandContext var1, @Nonnull Store<EntityStore> var2, @Nonnull Ref<EntityStore> var3, @Nonnull PlayerRef var4, @Nonnull World var5
) {
Player var6 = var2.getComponent(var3, Player.getComponentType());
assert var6 != null;
PlayerRef var7 = var2.getComponent(var3, PlayerRef.getComponentType());
assert var7 != null;
var6.getPageManager().openCustomPage(var3, var2, new EntitySpawnPage(var7));
}
}
}