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