CompanionBlockSpawnerSupport class

Пакет: com.hypixel.hytale.builtin.companionblockspawner

Файл: com/hypixel/hytale/builtin/companionblockspawner/CompanionBlockSpawnerSupport.java

Поля (28)

МодификаторыТипИмя
String var10
NPCPlugin var11
Ref var11
BuilderInfo var12
Builder var13
SpawningContext var14
MovementMode var15
Vector3d var16
PersistentRef var17
WorldConfig var18
BlockModule.BlockStateInfo var2
Store var3
Store var4
SpawnMarkerEntity var4
Ref var4
Store var5
Holder var5
SpawnMarkerEntity var5
CompanionBlockSpawnerBlock var6
double[][] var6
UUIDComponent var6
InvalidatablePersistentRef[] var6
SpawnMarker var7
Model var7
IWeightedMap var8
Ref var8
SpawnMarker.SpawnConfiguration var9
PersistentRef var9

Методы (17)

МодификаторыВозвратСигнатура
abstract return new Vector3dreturn new Vector3d(var2.xSpawn, var2.ySpawn, var2.zSpawn)
static void createMarkervoid createMarker(@Nonnull World var0, @Nonnull Vector3i var1, @Nonnull Ref<ChunkStore> var2, @Nonnull CompanionBlockSpawnerRecipe var3)
for for(double[] var10 : var6)
for for(int var11 = 1; var11 <= 4; var11++)
for for(int var12 = -var11; var12 <= var11; var12++)
for for(int var13 = -var11; var13 <= var11; var13++)
for for(InvalidatablePersistentRef var10 : var6)
static int getMaxMarkerDistanceint getMaxMarkerDistance()
if if(var6 == null)
if if(var7 == null)
if if(var16 != null)
if if(var5 != null)
if if(var6 != null)
if if(var2 != null)
static void markSpawnerDirtyvoid markSpawnerDirty(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1)
abstract markSpawnerDirty markSpawnerDirty(var5, var2)
static void removeMarkervoid removeMarker(@Nonnull World var0, @Nonnull UUID var1, @Nonnull String var2)

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.companionblockspawner.config.CompanionBlockSpawnerRecipe;
class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.RemoveReason;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.nameplate.Nameplate;
class="kw">import com.hypixel.hytale.server.core.entity.reference.InvalidatablePersistentRef;
class="kw">import com.hypixel.hytale.server.core.entity.reference.PersistentRef;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HiddenFromAdventurePlayers;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PersistentModel;
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.WorldConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
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.movement.MovementMode;
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 com.hypixel.hytale.server.spawning.assets.spawnmarker.config.SpawnMarker;
class="kw">import com.hypixel.hytale.server.spawning.spawnmarkers.SpawnMarkerEntity;
class="kw">import java.util.UUID;
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">import org.joml.Vector3i;

class="kw">public class="kw">final class CompanionBlockSpawnerSupport {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final int MAX_SPAWN_RADIUS = 4;
   class="kw">private class="kw">static class="kw">final int MAX_DROP_BELOW_SPAWNER = 2;
   class="kw">private class="kw">static class="kw">final int MAX_RISE_ABOVE_SPAWNER = 1;

   class="kw">static int getMaxMarkerDistance() {
      class="kw">return 4;
   }

   class="kw">private CompanionBlockSpawnerSupport() {
   }

   class="kw">public class="kw">static void createMarker(@Nonnull World var0, @Nonnull Vector3i var1, @Nonnull Ref<ChunkStore> var2, @Nonnull CompanionBlockSpawnerRecipe var3) {
      Store var4 = var0.getEntityStore().getStore();
      Store var5 = var0.getChunkStore().getStore();
      if (!var2.isValid()) {
         LOGGER.at(Level.FINE).log("Skipping deferred marker creation at %s: spawner block entity no longer valid", var1);
      } else {
         CompanionBlockSpawnerBlock var6 = var5.getComponent(var2, CompanionBlockSpawnerBlock.getComponentType());
         if (var6 == null) {
            LOGGER.at(Level.FINE).log("Skipping deferred marker creation at %s: spawner component gone", var1);
         } else if (!var6.hasMarker()) {
            SpawnMarker var7 = SpawnMarker.getAssetMap().getAsset(var3.getSpawnMarker());
            if (var7 == null) {
               LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s references unknown spawn marker '%s'", var3.getId(), var3.getSpawnMarker());
            } else {
               IWeightedMap var8 = var7.getWeightedConfigurations();
               SpawnMarker.SpawnConfiguration var9 = var8 != null ? var8.get(ThreadLocalRandom.current()) : null;
               String var10 = var9 != null ? var9.getNpc() : null;
               if (var10 != null && !var10.isEmpty()) {
                  NPCPlugin var11 = NPCPlugin.get();
                  BuilderInfo var12 = var11.getRoleBuilderInfo(var11.getIndex(var10));
                  if (var12 != null && var12.isValid()) {
                     Builder var13 = var12.getBuilder();
                     if (var13 != null && var13.isSpawnable()) {
                        SpawningContext var14 = new SpawningContext();
                        if (!var14.setSpawnable((ISpawnableWithModel)var13)) {
                           LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s failed validation for NPC role '%s'", var3.getId(), var10);
                        } else {
                           MovementMode var15 = var14.breathesInAir ? MovementMode.WALK : MovementMode.UNDERWATER_WALK;
                           Vector3d var16 = findMarkerTile(var0, var1, var14, var15, var3, var10);
                           if (var16 != null) {
                              PersistentRef var17 = createMarkerEntity(var4, var7, var16, var1);
                              var6.setMarkerRef(var17);
                              markSpawnerDirty(var5, var2);
                              LOGGER.at(Level.FINE)
                                 .log("Created companion spawn marker (uuid %s) for spawner at %s (recipe %s)", var17.getUuid(), var1, var3.getId());
                              WorldConfig var18 = var0.getWorldConfig();
                              if (!var18.isSpawningNPC() || !var18.isSpawnMarkersEnabled()) {
                                 LOGGER.at(Level.FINE)
                                    .log(
                                       "Companion spawn marker created at %s but world '%s' has NPC spawning disabled (SpawningNPC=%s, SpawnMarkersEnabled=%s) - no companion will spawn until re-enabled",
                                       var1,
                                       var0.getName(),
                                       var18.isSpawningNPC(),
                                       var18.isSpawnMarkersEnabled()
                                    );
                              }
                           }
                        }
                     } else {
                        LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s marker references non-spawnable NPC role '%s'", var3.getId(), var10);
                     }
                  } else {
                     LOGGER.at(Level.SEVERE).log("Companion block spawner recipe %s marker references unknown NPC role '%s'", var3.getId(), var10);
                  }
               } else {
                  LOGGER.at(Level.FINE)
                     .log("Companion block spawner recipe %s marker '%s' has no concrete role to position", var3.getId(), var3.getSpawnMarker());
               }
            }
         }
      }
   }

   @Nullable
   class="kw">private class="kw">static Vector3d findMarkerTile(
      @Nonnull World var0,
      @Nonnull Vector3i var1,
      @Nonnull SpawningContext var2,
      @Nonnull MovementMode var3,
      @Nonnull CompanionBlockSpawnerRecipe var4,
      @Nonnull String var5
   ) {
      double[][] var6 = new double[][]{{var1.y - 2, var1.y + 0.5}, {var1.y + 0.5, var1.y + 1}};

      for (double[] var10 : var6) {
         for (int var11 = 1; var11 <= 4; var11++) {
            for (int var12 = -var11; var12 <= var11; var12++) {
               for (int var13 = -var11; var13 <= var11; var13++) {
                  if ((Math.abs(var12) == var11 || Math.abs(var13) == var11)
                     && var2.set(var0, var1.x + var12 + 0.5, var1.y, var1.z + var13 + 0.5)
                     && !(var2.ySpawn < var10[0])
                     && !(var2.ySpawn > var10[1])) {
                     if (!var2.setMovementMode(var3, true)) {
                        LOGGER.at(Level.FINE)
                           .log("Companion block spawner recipe %s role '%s' is incompatible with movement mode %s", var4.getId(), var5, var3);
                        class="kw">return null;
                     }

                     if (var2.canSpawn(true, false) == SpawnTestResult.TEST_OK) {
                        class="kw">return new Vector3d(var2.xSpawn, var2.ySpawn, var2.zSpawn);
                     }
                  }
               }
            }
         }
      }

      LOGGER.at(Level.FINE).log("Companion block spawner recipe %s could not find a free tile near %s", var4.getId(), var1);
      class="kw">return null;
   }

   @Nonnull
   class="kw">private class="kw">static PersistentRef createMarkerEntity(@Nonnull Store<EntityStore> var0, @Nonnull SpawnMarker var1, @Nonnull Vector3d var2, @Nonnull Vector3i var3) {
      SpawnMarkerEntity var4 = new SpawnMarkerEntity();
      var4.setSpawnMarker(var1);
      Holder var5 = EntityStore.REGISTRY.newHolder();
      var5.addComponent(SpawnMarkerEntity.getComponentType(), var4);
      var5.addComponent(Nameplate.getComponentType(), new Nameplate(var1.getId()));
      var5.addComponent(TransformComponent.getComponentType(), new TransformComponent(var2, Rotation3f.IDENTITY));
      UUIDComponent var6 = var5.ensureAndGetComponent(UUIDComponent.getComponentType());
      Model var7 = SpawnMarkerEntity.getModel(var1);
      var5.addComponent(ModelComponent.getComponentType(), new ModelComponent(var7));
      var5.addComponent(PersistentModel.getComponentType(), new PersistentModel(var7.toReference()));
      var5.ensureComponent(HiddenFromAdventurePlayers.getComponentType());
      var5.addComponent(CompanionSpawnerMarkerReference.getComponentType(), new CompanionSpawnerMarkerReference(new Vector3i(var3)));
      Ref var8 = var0.addEntity(var5, AddReason.SPAWN);
      PersistentRef var9 = new PersistentRef();
      var9.setEntity(var8, var6.getUuid());
      class="kw">return var9;
   }

   class="kw">public class="kw">static void removeMarker(@Nonnull World var0, @Nonnull UUID var1, @Nonnull String var2) {
      Store var3 = var0.getEntityStore().getStore();
      Ref var4 = var3.getExternalData().getRefFromUUID(var1);
      if (var4 != null && var4.isValid()) {
         LOGGER.at(Level.FINE).log("Removing companion spawn marker %s: %s", var1, var2);
         SpawnMarkerEntity var5 = var3.getComponent(var4, SpawnMarkerEntity.getComponentType());
         if (var5 != null) {
            InvalidatablePersistentRef[] var6 = var5.getNpcReferences();
            if (var6 != null) {
               for (InvalidatablePersistentRef var10 : var6) {
                  Ref var11 = var10.getEntity(var3);
                  if (var11 != null && var11.isValid()) {
                     var3.removeEntity(var11, RemoveReason.REMOVE);
                  }
               }
            }
         }

         var3.removeEntity(var4, RemoveReason.REMOVE);
      } else {
         LOGGER.at(Level.FINE).log("Companion spawn marker %s not loaded for removal (%s); MarkerHeartbeat will clean it up on load", var1, var2);
      }
   }

   class="kw">static void markSpawnerDirty(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1) {
      if (var1.isValid()) {
         BlockModule.BlockStateInfo var2 = var0.getComponent(var1, BlockModule.BlockStateInfo.getComponentType());
         if (var2 != null) {
            var2.markNeedsSaving();
         }
      }
   }
}