BeaconSpawnController class

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

Файл: com/hypixel/hytale/server/spawning/controllers/BeaconSpawnController.java

extends: SpawnController<NPCBeaconSpawnJob>

Поля (15)

МодификаторыТипИмя
LegacySpawnBeaconEntity var2
BeaconNPCSpawn var2
BeaconSpawnWrapper var3
double var3
HytaleLogger.Api var3
HytaleLogger.Api var3
RoleSpawnParameters var4
UUIDComponent var4
UUIDComponent var4
String var5
double var5
int var6
NPCBeaconSpawnJob var7
var7
int var8

Методы (33)

МодификаторыВозвратСигнатура
public void addRoundSpawnvoid addRoundSpawn()
public void clearUnspawnableNPCsvoid clearUnspawnableNPCs()
public int[] getBaseMaxConcurrentSpawnsint[] getBaseMaxConcurrentSpawns()
public int getBaseMaxTotalSpawnsint getBaseMaxTotalSpawns()
public double getBeaconRadiusSquareddouble getBeaconRadiusSquared()
public int getCurrentScaledMaxConcurrentSpawnsint getCurrentScaledMaxConcurrentSpawns()
public Duration getDespawnBeaconAfterTimeoutDuration getDespawnBeaconAfterTimeout()
public double getDespawnNPCAfterTimeoutdouble getDespawnNPCAfterTimeout()
public Object2IntMap<UUID> getEntitiesPerPlayerObject2IntMap<UUID> getEntitiesPerPlayer()
public Reference2DoubleMap<Ref<EntityStore>> getEntityTimeoutCounterReference2DoubleMap<Ref<EntityStore>> getEntityTimeoutCounter()
public List<PlayerRef> getPlayersInRegionList<PlayerRef> getPlayersInRegion()
public double getSpawnRadiusSquareddouble getSpawnRadiusSquared()
public List<Ref<EntityStore>> getSpawnedEntitiesList<Ref<EntityStore>> getSpawnedEntities()
public int getSpawnsThisRoundint getSpawnsThisRound()
public Comparator<PlayerRef> getThreatComparatorComparator<PlayerRef> getThreatComparator()
public boolean hasSlotsboolean hasSlots()
if if(var2 == null)
if if(var4 == null)
if if(++this.spawnsThisRound >= this.currentScaledMaxConcurrentSpawns)
public void initialisevoid initialise(@Nonnull BeaconSpawnWrapper var1)
public boolean isDespawnNPCsIfIdleboolean isDespawnNPCsIfIdle()
public boolean isRoundStartboolean isRoundStart()
public void markNPCUnspawnablevoid markNPCUnspawnable(int var1)
public void notifyNPCRemovalvoid notifyNPCRemoval(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void notifySpawnedEntityExistsvoid notifySpawnedEntityExists(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void onAllConcurrentSpawnedvoid onAllConcurrentSpawned(@Nonnull ComponentAccessor<EntityStore> var1)
public void onJobFinishedvoid onJobFinished(@Nonnull ComponentAccessor<EntityStore> var1)
public void setCurrentScaledMaxConcurrentSpawnsvoid setCurrentScaledMaxConcurrentSpawns(int var1)
public void setCurrentScaledMaxTotalSpawnsvoid setCurrentScaledMaxTotalSpawns(int var1)
public void setNextPlayerIndexvoid setNextPlayerIndex(int var1)
public void setRemainingSpawnsvoid setRemainingSpawns(int var1)
public void setRoundStartvoid setRoundStart(boolean var1)
abstract super super(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.entity.UUIDComponent;
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.npc.NPCPlugin;
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.beacons.LegacySpawnBeaconEntity;
class="kw">import com.hypixel.hytale.server.spawning.jobs.NPCBeaconSpawnJob;
class="kw">import com.hypixel.hytale.server.spawning.wrappers.BeaconSpawnWrapper;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntMap;
class="kw">import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.Reference2DoubleMap;
class="kw">import it.unimi.dsi.fastutil.objects.Reference2DoubleOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import java.time.Duration;
class="kw">import java.util.Comparator;
class="kw">import java.util.List;
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">public class BeaconSpawnController class="kw">extends SpawnController<NPCBeaconSpawnJob> {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final int MAX_ATTEMPTS_PER_TICK = 5;
   class="kw">public class="kw">static class="kw">final double ROUNDING_BREAK_POINT = 0.25;
   @Nonnull
   class="kw">private class="kw">final Ref<EntityStore> ownerRef;
   class="kw">private class="kw">final List<Ref<EntityStore>> spawnedEntities = new ReferenceArrayList();
   class="kw">private class="kw">final List<PlayerRef> playersInRegion = new ObjectArrayList();
   class="kw">private int nextPlayerIndex = 0;
   class="kw">private class="kw">final Object2IntMap<UUID> entitiesPerPlayer = new Object2IntOpenHashMap();
   class="kw">private class="kw">final Reference2DoubleMap<Ref<EntityStore>> entityTimeoutCounter = new Reference2DoubleOpenHashMap();
   class="kw">private class="kw">final IntSet unspawnableRoles = new IntOpenHashSet();
   class="kw">private class="kw">final Comparator<PlayerRef> threatComparator = Comparator.comparingInt(var1x -> this.entitiesPerPlayer.getOrDefault(var1x.getUuid(), 0));
   class="kw">private int baseMaxTotalSpawns;
   class="kw">private int currentScaledMaxTotalSpawns;
   class="kw">private int[] baseMaxConcurrentSpawns;
   class="kw">private int currentScaledMaxConcurrentSpawns;
   class="kw">private int spawnsThisRound;
   class="kw">private int remainingSpawns;
   class="kw">private boolean roundStart = true;
   class="kw">private double beaconRadiusSquared;
   class="kw">private double spawnRadiusSquared;
   class="kw">private double despawnNPCAfterTimeout;
   class="kw">private Duration despawnBeaconAfterTimeout;
   class="kw">private boolean despawnNPCsIfIdle;

   class="kw">public BeaconSpawnController(@Nonnull World var1, @Nonnull Ref<EntityStore> var2) {
      super(var1);
      this.ownerRef = var2;
   }

   @Override
   class="kw">public int getMaxActiveJobs() {
      class="kw">return Math.min(this.remainingSpawns, this.baseMaxActiveJobs);
   }

   @Nullable
   class="kw">public NPCBeaconSpawnJob createRandomSpawnJob(@Nonnull ComponentAccessor<EntityStore> var1) {
      LegacySpawnBeaconEntity var2 = var1.getComponent(this.ownerRef, LegacySpawnBeaconEntity.getComponentType());
      if (var2 == null) {
         class="kw">return null;
      }

      BeaconSpawnWrapper var3 = var2.getSpawnWrapper();
      RoleSpawnParameters var4 = var3.pickRole(ThreadLocalRandom.current());
      if (var4 == null) {
         class="kw">return null;
      }

      String var5 = var4.getId();
      int var6 = NPCPlugin.get().getIndex(var5);
      if (var6 >= 0 && !this.unspawnableRoles.contains(var6)) {
         NPCBeaconSpawnJob var7 = null;
         int var8 = this.spawnedEntities.size() + this.activeJobs.size();
         if (this.activeJobs.size() < this.getMaxActiveJobs() && this.nextPlayerIndex < this.playersInRegion.size() && var8 < this.currentScaledMaxTotalSpawns) {
            var7 = this.idleJobs.isEmpty() ? new NPCBeaconSpawnJob() : this.idleJobs.pop();
            var7.beginProbing(this.playersInRegion.get(this.nextPlayerIndex++), this.currentScaledMaxConcurrentSpawns, var6, var4.getFlockDefinition());
            this.activeJobs.add(var7);
            if (this.nextPlayerIndex >= this.playersInRegion.size()) {
               this.nextPlayerIndex = 0;
            }
         }

         class="kw">return var7;
      } else {
         class="kw">return null;
      }
   }

   class="kw">public void initialise(@Nonnull BeaconSpawnWrapper var1) {
      BeaconNPCSpawn var2 = var1.getSpawn();
      this.baseMaxTotalSpawns = var2.getMaxSpawnedNpcs();
      this.baseMaxConcurrentSpawns = var2.getConcurrentSpawnsRange();
      double var3 = var2.getBeaconRadius();
      this.beaconRadiusSquared = var3 * var3;
      double var5 = var2.getSpawnRadius();
      this.spawnRadiusSquared = var5 * var5;
      this.despawnNPCAfterTimeout = var2.getNpcIdleDespawnTimeSeconds();
      this.despawnBeaconAfterTimeout = var2.getBeaconVacantDespawnTime();
      this.despawnNPCsIfIdle = var2.getNpcSpawnState() != null;
   }

   class="kw">public int getSpawnsThisRound() {
      class="kw">return this.spawnsThisRound;
   }

   class="kw">public void setRemainingSpawns(int var1) {
      this.remainingSpawns = var1;
   }

   class="kw">public void addRoundSpawn() {
      this.spawnsThisRound++;
      this.remainingSpawns--;
   }

   class="kw">public boolean isRoundStart() {
      class="kw">return this.roundStart;
   }

   class="kw">public void setRoundStart(boolean var1) {
      this.roundStart = var1;
   }

   @Nonnull
   class="kw">public Ref<EntityStore> getOwnerRef() {
      class="kw">return this.ownerRef;
   }

   class="kw">public int[] getBaseMaxConcurrentSpawns() {
      class="kw">return this.baseMaxConcurrentSpawns;
   }

   class="kw">public List<PlayerRef> getPlayersInRegion() {
      class="kw">return this.playersInRegion;
   }

   class="kw">public int getCurrentScaledMaxConcurrentSpawns() {
      class="kw">return this.currentScaledMaxConcurrentSpawns;
   }

   class="kw">public void setCurrentScaledMaxConcurrentSpawns(int var1) {
      this.currentScaledMaxConcurrentSpawns = var1;
   }

   class="kw">public Duration getDespawnBeaconAfterTimeout() {
      class="kw">return this.despawnBeaconAfterTimeout;
   }

   class="kw">public double getSpawnRadiusSquared() {
      class="kw">return this.spawnRadiusSquared;
   }

   class="kw">public double getBeaconRadiusSquared() {
      class="kw">return this.beaconRadiusSquared;
   }

   class="kw">public int getBaseMaxTotalSpawns() {
      class="kw">return this.baseMaxTotalSpawns;
   }

   class="kw">public void setCurrentScaledMaxTotalSpawns(int var1) {
      this.currentScaledMaxTotalSpawns = var1;
   }

   class="kw">public List<Ref<EntityStore>> getSpawnedEntities() {
      class="kw">return this.spawnedEntities;
   }

   class="kw">public void setNextPlayerIndex(int var1) {
      this.nextPlayerIndex = var1;
   }

   class="kw">public Reference2DoubleMap<Ref<EntityStore>> getEntityTimeoutCounter() {
      class="kw">return this.entityTimeoutCounter;
   }

   class="kw">public Object2IntMap<UUID> getEntitiesPerPlayer() {
      class="kw">return this.entitiesPerPlayer;
   }

   class="kw">public boolean isDespawnNPCsIfIdle() {
      class="kw">return this.despawnNPCsIfIdle;
   }

   class="kw">public double getDespawnNPCAfterTimeout() {
      class="kw">return this.despawnNPCAfterTimeout;
   }

   class="kw">public Comparator<PlayerRef> getThreatComparator() {
      class="kw">return this.threatComparator;
   }

   class="kw">public void notifySpawnedEntityExists(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      this.spawnedEntities.add(var1);
      HytaleLogger.Api var3 = LOGGER.at(Level.FINE);
      if (var3.isEnabled()) {
         UUIDComponent var4 = var2.getComponent(this.ownerRef, UUIDComponent.getComponentType());
         assert var4 != null;
         var3.log("Registering NPC with reference %s with Spawn Beacon %s", var1, var4.getUuid());
      }
   }

   class="kw">public void onJobFinished(@Nonnull ComponentAccessor<EntityStore> var1) {
      if (++this.spawnsThisRound >= this.currentScaledMaxConcurrentSpawns) {
         this.onAllConcurrentSpawned(var1);
      }
   }

   class="kw">public void notifyNPCRemoval(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      this.spawnedEntities.remove(var1);
      this.entityTimeoutCounter.removeDouble(var1);
      if (this.spawnedEntities.size() == this.currentScaledMaxTotalSpawns - 1) {
         LegacySpawnBeaconEntity.prepareNextSpawnTimer(this.ownerRef, var2);
      }

      HytaleLogger.Api var3 = LOGGER.at(Level.FINE);
      if (var3.isEnabled()) {
         UUIDComponent var4 = var2.getComponent(this.ownerRef, UUIDComponent.getComponentType());
         assert var4 != null;
         var3.log("Removing NPC with reference %s from Spawn Beacon %s", var1, var4.getUuid());
      }
   }

   class="kw">public boolean hasSlots() {
      class="kw">return this.spawnedEntities.size() < this.currentScaledMaxTotalSpawns;
   }

   class="kw">public void markNPCUnspawnable(int var1) {
      this.unspawnableRoles.add(var1);
   }

   class="kw">public void clearUnspawnableNPCs() {
      this.unspawnableRoles.clear();
   }

   class="kw">public void onAllConcurrentSpawned(@Nonnull ComponentAccessor<EntityStore> var1) {
      this.spawnsThisRound = 0;
      this.remainingSpawns = 0;
      LegacySpawnBeaconEntity.prepareNextSpawnTimer(this.ownerRef, var1);
      this.roundStart = true;
   }
}