SpawnBeacon class

Пакет: com.hypixel.hytale.server.spawning.beacons

Файл: com/hypixel/hytale/server/spawning/beacons/SpawnBeacon.java

extends: Entity

Поля (19)

МодификаторыТипИмя
final BuilderCodec<SpawnBeacon> CODEC
ISpawnableWithModel var10
Vector3d var11
Vector3d var12
Rotation3f var13
FlockAsset var14
int var15
String var16
Pair var17
Ref var18
NPCEntity var19
Player var4
UUIDComponent var4
int var5
String var5
int var6
RoleSpawnParameters var8
FloodFillPositionSelector var9
int var9

Методы (11)

МодификаторыВозвратСигнатура
for for(int var7 = 0; var7 < var5; var7++)
public String getSpawnConfigIdString getSpawnConfigId()
public BeaconSpawnWrapper getSpawnWrapperBeaconSpawnWrapper getSpawnWrapper()
if if(var8 != null)
if if(var10 != null)
if if(var5 != null)
public boolean manualTriggerboolean manualTrigger(@Nonnull Ref<EntityStore> var1, @Nonnull FloodFillPositionSelector var2, @Nonnull Ref<EntityStore> var3, @Nonnull Store<EntityStore> var4)
protected void markUnspawnablevoid markUnspawnable(Ref<EntityStore> var1, int var2, ComponentAccessor<EntityStore> var3)
static void postSpawnvoid postSpawn(@Nonnull NPCEntity var0, @Nonnull Ref<EntityStore> var1, @Nonnull BeaconNPCSpawn var2, Ref<EntityStore> var3, ComponentAccessor<EntityStore> var4)
public void setSpawnWrappervoid setSpawnWrapper(@Nonnull BeaconSpawnWrapper var1)
abstract super super(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.ComponentType;
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.protocol.GameMode;
class="kw">import com.hypixel.hytale.server.core.entity.Entity;
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.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.role.support.MarkedEntitySupport;
class="kw">import com.hypixel.hytale.server.npc.role.support.StateSupport;
class="kw">import com.hypixel.hytale.server.npc.systems.NewSpawnStartTickingSystem;
class="kw">import com.hypixel.hytale.server.spawning.ISpawnableWithModel;
class="kw">import com.hypixel.hytale.server.spawning.SpawningContext;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawns.config.BeaconNPCSpawn;
class="kw">import com.hypixel.hytale.server.spawning.assets.spawns.config.RoleSpawnParameters;
class="kw">import com.hypixel.hytale.server.spawning.util.FloodFillPositionSelector;
class="kw">import com.hypixel.hytale.server.spawning.wrappers.BeaconSpawnWrapper;
class="kw">import it.unimi.dsi.fastutil.Pair;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
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 SpawnBeacon class="kw">extends Entity {
   class="kw">public class="kw">static class="kw">final BuilderCodec<SpawnBeacon> CODEC = BuilderCodec.builder(SpawnBeacon.class, SpawnBeacon::new, Entity.CODEC)
      .append(new KeyedCodec<>("SpawnConfiguration", Codec.STRING), (var0, var1) -> var0.spawnConfigId = var1, var0 -> var0.spawnConfigId)
      .add()
      .build();
   class="kw">private BeaconSpawnWrapper spawnWrapper;
   class="kw">private String spawnConfigId;
   class="kw">private class="kw">final IntSet unspawnableRoles = new IntOpenHashSet();
   class="kw">private class="kw">final SpawningContext spawningContext = new SpawningContext();

   @Nullable
   class="kw">public class="kw">static ComponentType<EntityStore, SpawnBeacon> getComponentType() {
      class="kw">return EntityModule.get().getComponentType(SpawnBeacon.class);
   }

   class="kw">public SpawnBeacon() {
   }

   class="kw">public SpawnBeacon(World var1) {
      super(var1);
   }

   class="kw">public BeaconSpawnWrapper getSpawnWrapper() {
      class="kw">return this.spawnWrapper;
   }

   class="kw">public void setSpawnWrapper(@Nonnull BeaconSpawnWrapper var1) {
      this.spawnWrapper = var1;
      this.spawnConfigId = var1.getSpawn().getId();
   }

   class="kw">public String getSpawnConfigId() {
      class="kw">return this.spawnConfigId;
   }

   @Override
   class="kw">public boolean isHiddenFromLivingEntity(@Nonnull Ref<EntityStore> var1, @Nonnull Ref<EntityStore> var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      Player var4 = var3.getComponent(var2, Player.getComponentType());
      class="kw">return var4 == null || var4.getGameMode() != GameMode.Creative;
   }

   @Override
   class="kw">public boolean isCollidable() {
      class="kw">return false;
   }

   @Override
   class="kw">public void moveTo(@Nonnull Ref<EntityStore> var1, double var2, double var4, double var6, @Nonnull ComponentAccessor<EntityStore> var8) {
      super.moveTo(var1, var2, var4, var6, var8);
      FloodFillPositionSelector var9 = var8.getComponent(var1, FloodFillPositionSelector.getComponentType());
      assert var9 != null;
      var9.setCalculatePositionsAfter(SpawnBeaconSystems.POSITION_CALCULATION_DELAY_RANGE[1]);
      var9.forceRebuildCache();
      this.unspawnableRoles.clear();
   }

   class="kw">public boolean manualTrigger(
      @Nonnull Ref<EntityStore> var1, @Nonnull FloodFillPositionSelector var2, @Nonnull Ref<EntityStore> var3, @Nonnull Store<EntityStore> var4
   ) {
      int var5 = RandomExtra.randomRange(this.spawnWrapper.getSpawn().getConcurrentSpawnsRange());
      int var6 = 0;

      for (int var7 = 0; var7 < var5; var7++) {
         RoleSpawnParameters var8 = this.spawnWrapper.pickRole(ThreadLocalRandom.current());
         if (var8 != null) {
            int var9 = NPCPlugin.get().getIndex(var8.getId());
            if (!this.unspawnableRoles.contains(var9)) {
               ISpawnableWithModel var10 = (ISpawnableWithModel)NPCPlugin.get().tryGetCachedValidRole(var9);
               if (var10 != null) {
                  this.spawningContext.setSpawnable(var10);
                  if (!var2.hasPositionsForRole(var9)) {
                     this.markUnspawnable(var1, var9, var4);
                     this.spawningContext.releaseFull();
                  } else {
                     Vector3d var11 = var3.getStore().getComponent(var3, TransformComponent.getComponentType()).getPosition();
                     if (!var2.prepareSpawnContext(var11, var5, var9, this.spawningContext, this.spawnWrapper)) {
                        this.spawningContext.releaseFull();
                     } else {
                        Vector3d var12 = this.spawningContext.newPosition();
                        Rotation3f var13 = this.spawningContext.newRotation();
                        FlockAsset var14 = var8.getFlockDefinition();
                        int var15 = var14 != null ? var14.pickFlockSize() : 1;

                        try {
                           String var16 = this.spawningContext.activeMotionControllerType;
                           Pair var17 = NPCPlugin.get().spawnEntity(var4, var9, var12, var13, this.spawningContext.getModel(), (var3x, var4x, var5x) -> {
                              var3x.setActiveMotionControllerName(var16);
                              postSpawn(var3x, var4x, this.spawnWrapper.getSpawn(), var3, var5x);
                           });
                           Ref var18 = (Ref<EntityStore>)var17.first();
                           NPCEntity var19 = (NPCEntity)var17.second();
                           FlockPlugin.trySpawnFlock(var18, var19, var9, var12, var13, var15, var14, null, (var3x, var4x, var5x) -> {
                              var3x.setActiveMotionControllerName(var16);
                              postSpawn(var3x, var4x, this.spawnWrapper.getSpawn(), var3, var5x);
                           }, var4);
                           var6++;
                        } catch (RuntimeException var23) {
                           LOGGER.at(Level.WARNING).log("Failed to create %s: %s", NPCPlugin.get().getName(var9), var23.getMessage());
                           this.markUnspawnable(var1, var9, var4);
                        } class="kw">finally {
                           this.spawningContext.releaseFull();
                        }
                     }
                  }
               }
            }
         }
      }

      class="kw">return var6 != 0;
   }

   class="kw">protected void markUnspawnable(Ref<EntityStore> var1, int var2, ComponentAccessor<EntityStore> var3) {
      this.unspawnableRoles.add(var2);
      if (this.unspawnableRoles.size() >= this.spawnWrapper.getRoles().size()) {
         UUIDComponent var4 = var3.getComponent(var1, UUIDComponent.getComponentType());
         assert var4 != null;
         LOGGER.at(Level.WARNING).log("Removed spawn beacon %s due to being unable to spawn any NPC types", var4.getUuid());
         this.remove();
      }
   }

   class="kw">protected class="kw">static void postSpawn(
      @Nonnull NPCEntity var0, @Nonnull Ref<EntityStore> var1, @Nonnull BeaconNPCSpawn var2, Ref<EntityStore> var3, ComponentAccessor<EntityStore> var4
   ) {
      MarkedEntitySupport.get(var1, var4).setMarkedEntity(var2.getTargetSlot(), var3, var2.isRebind(), var4);
      String var5 = var2.getNpcSpawnState();
      if (var5 != null) {
         StateSupport.get(var1, var4).setState(var1, var5, var2.getNpcSpawnSubState(), var4);
      }

      NewSpawnStartTickingSystem.queueNewSpawn(var1, var1.getStore());
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "SpawnBeacon{spawnConfigId='" + this.spawnConfigId + "'} " + super.toString();
   }
}