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