WorldSpawnTrackingSystem class
Пакет: com.hypixel.hytale.server.spawning.world.system
Файл: com/hypixel/hytale/server/spawning/world/system/WorldSpawnTrackingSystem.java
extends: RefSystem<EntityStore>
Поля (74)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
HytaleLogger |
LOGGER |
|
|
break |
|
|
break |
|
|
return |
|
|
return |
|
|
return |
|
|
return |
|
|
return |
|
|
return |
|
Environment |
var1 |
|
ChunkStore |
var10 |
|
ChunkStore |
var10 |
|
double |
var10 |
|
double |
var10 |
|
Store |
var11 |
|
Store |
var11 |
|
Vector3d |
var12 |
|
TransformComponent |
var12 |
|
WorldChunk |
var12 |
|
WorldChunk |
var12 |
|
int |
var13 |
|
Vector3d |
var13 |
|
double |
var13 |
|
double |
var13 |
|
int |
var14 |
|
int |
var14 |
|
Ref |
var15 |
|
|
var15 |
|
int |
var15 |
|
double |
var15 |
|
HytaleLogger.Api |
var15 |
|
double |
var16 |
|
|
var16 |
|
|
var16 |
|
Ref |
var16 |
|
|
var16 |
|
double |
var17 |
|
|
var17 |
|
|
var17 |
|
HytaleLogger.Api |
var17 |
|
HytaleLogger.Api |
var17 |
|
SpiralIterator |
var18 |
|
int |
var19 |
|
SpiralIterator |
var19 |
|
HytaleLogger.Api |
var19 |
|
int |
var20 |
|
long |
var20 |
|
long |
var21 |
|
List |
var21 |
|
List |
var22 |
|
Iterator |
var22 |
|
Iterator |
var23 |
|
WorldEnvironmentSpawnData |
var24 |
|
HytaleLogger.Api |
var24 |
|
WorldNPCSpawnStat |
var25 |
|
HytaleLogger.Api |
var27 |
|
HytaleLogger.Api |
var3 |
|
NPCEntity |
var5 |
|
NPCEntity |
var5 |
|
HytaleLogger.Api |
var5 |
|
boolean |
var6 |
|
boolean |
var6 |
|
World |
var7 |
|
WorldSpawnData |
var7 |
|
ChunkSpawnData |
var7 |
|
ChunkSpawnData |
var7 |
|
WorldSpawnData |
var8 |
|
int |
var8 |
|
ChunkEnvironmentSpawnData |
var8 |
|
ChunkEnvironmentSpawnData |
var8 |
|
int |
var9 |
|
World |
var9 |
|
ChunkSpawnedNPCData |
var9 |
|
ChunkSpawnedNPCData |
var9 |
Методы (22)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
String |
getEnvironmentNameString getEnvironmentName(int var0) |
|
|
if if(!var6) |
|
|
if if(var16 <= 0.0) |
|
|
if if(var15 == null) |
|
|
if if(var16 > 0.0) |
|
|
if if(var6) |
|
|
if if(var17 <= 0.0) |
|
|
if if(var16 != null) |
|
|
if if(var17 > 0.0) |
|
|
if if(var7 == null) |
|
|
if if(var8 == null) |
|
|
if if(var2 > var15) |
|
|
if if(var7 == null) |
|
|
if if(var8 == null) |
|
|
if if(var10 <= 0.0) |
|
|
if if(var10 < var2) |
|
|
switch switch(var2) |
|
|
switch switch(var2) |
static |
boolean |
trackNPCboolean trackNPC(int var0, int var1, @Nonnull WorldSpawnData var2, @Nonnull World var3, @Nonnull ComponentAccessor<EntityStore> var4) |
static |
double |
trackNewNPCdouble trackNewNPC(@Nonnull Ref<ChunkStore> var0,
int var1,
double var2,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var4,
@Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var5,
@Nonnull Store<ChunkStore> var6) |
static |
boolean |
untrackNPCboolean untrackNPC(int var0, int var1, @Nonnull WorldSpawnData var2) |
static |
double |
untrackRemovedNPCdouble untrackRemovedNPC(@Nonnull Ref<ChunkStore> var0,
int var1,
double var2,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var4,
@Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var5,
@Nonnull Store<ChunkStore> var6) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.spawning.world.system;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
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.RemoveReason;
class="kw">import com.hypixel.hytale.component.ResourceType;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.iterator.SpiralIterator;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
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.chunk.WorldChunk;
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.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.spawning.world.ChunkEnvironmentSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.WorldEnvironmentSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.WorldNPCSpawnStat;
class="kw">import com.hypixel.hytale.server.spawning.world.component.ChunkSpawnData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.ChunkSpawnedNPCData;
class="kw">import com.hypixel.hytale.server.spawning.world.component.WorldSpawnData;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
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 WorldSpawnTrackingSystem class="kw">extends RefSystem<EntityStore> {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final int COUNT_SPREAD_RADIUS = 3;
@Nullable
class="kw">private class="kw">final ComponentType<EntityStore, NPCEntity> npcComponentType = NPCEntity.getComponentType();
class="kw">private class="kw">final ComponentType<EntityStore, TransformComponent> transformComponentType = TransformComponent.getComponentType();
class="kw">private class="kw">final ResourceType<EntityStore, WorldSpawnData> worldSpawnDataResourceType;
class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSpawnData> chunkSpawnDataComponentType;
class="kw">private class="kw">final ComponentType<ChunkStore, ChunkSpawnedNPCData> chunkSpawnedNPCDataComponentType;
@Nonnull
class="kw">private class="kw">final Query<EntityStore> query;
class="kw">public WorldSpawnTrackingSystem(
@Nonnull ResourceType<EntityStore, WorldSpawnData> var1,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var2,
@Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var3
) {
this.worldSpawnDataResourceType = var1;
this.chunkSpawnDataComponentType = var2;
this.chunkSpawnedNPCDataComponentType = var3;
this.query = Query.and(this.npcComponentType, this.transformComponentType);
}
@Nonnull
@Override
class="kw">public Query<EntityStore> getQuery() {
class="kw">return this.query;
}
@Override
class="kw">public void onEntityAdded(
@Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
) {
NPCEntity var5 = var3.getComponent(var1, this.npcComponentType);
assert var5 != null;
boolean var6 = var5.updateSpawnTrackingState(true);
if (!var6) {
World var7 = var3.getExternalData().getWorld();
WorldSpawnData var8 = var3.getResource(this.worldSpawnDataResourceType);
class="kw">switch (var2) {
case SPAWN:
int var9 = var5.getEnvironment();
if (!trackNPC(var9, var5.getSpawnRoleIndex(), var8, var7, var4)) {
class="kw">return;
}
ChunkStore var10 = var7.getChunkStore();
Store var11 = var10.getStore();
Vector3d var12 = var3.getComponent(var1, this.transformComponentType).getPosition();
int var13 = ChunkUtil.chunkCoordinate(var12.x());
int var14 = ChunkUtil.chunkCoordinate(var12.z());
Ref var15 = var10.getChunkReference(ChunkUtil.indexChunk(var13, var14));
double var16 = var15 != null
? trackNewNPC(var15, var9, 1.0, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var11)
: 1.0;
if (var16 <= 0.0) {
class="kw">return;
}
SpiralIterator var18 = var8.getSpiralIterator();
var18.init(var13, var14, 3);
if (!var18.hasNext()) {
class="kw">return;
}
var18.next();
int var19 = 0;
int var20 = 0;
while (var18.hasNext() && var16 > 0.0) {
var19++;
long var21 = var18.next();
var15 = var10.getChunkReference(var21);
if (var15 == null) {
var20++;
} else {
var16 = trackNewNPC(var15, var9, var16, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var11);
}
}
if (var16 > 0.0) {
HytaleLogger.Api var27 = LOGGER.at(Level.FINE);
if (var27.isEnabled()) {
var27.log(
"Failed to spread %s of an NPC spawn to neighbouring chunks. Checked %s chunks, %s not in memory. Centered on chunk (%s, %s), spreading to other chunks with matching environment",
var16,
var19,
var20,
var13,
var14
);
}
List var22 = var8.getWorldEnvironmentSpawnData(var9).getChunkRefList();
Iterator var23 = var22.iterator();
while (var23.hasNext() && var16 > 0.0) {
var16 = trackNewNPC(var23.next(), var9, var16, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var11);
}
if (var16 > 0.0 && var27.isEnabled()) {
WorldEnvironmentSpawnData var24 = var8.getWorldEnvironmentSpawnData(var9);
WorldNPCSpawnStat var25 = (WorldNPCSpawnStat)var24.getNpcStatMap().get(var5.getRoleIndex());
var27.log(
"Failed to spread %s of an NPC spawn across random chunks with matching environments (%s). NPC Type: %s. World environment exp: %s act: %s. Stat exp: %s act: %s",
var16,
Environment.getAssetMap().getAsset(var9).getId(),
NPCPlugin.get().getName(var5.getRoleIndex()),
var24.getExpectedNPCs(),
var24.getActualNPCs(),
var25.getExpected(),
var25.getActual()
);
}
}
var18.reset();
break;
case LOAD:
trackNPC(var5.getEnvironment(), var5.getSpawnRoleIndex(), var8, var7, var4);
}
}
}
@Override
class="kw">public void onEntityRemove(
@Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
) {
NPCEntity var5 = var3.getComponent(var1, this.npcComponentType);
assert var5 != null;
boolean var6 = var5.updateSpawnTrackingState(false);
if (var6) {
WorldSpawnData var7 = var3.getResource(this.worldSpawnDataResourceType);
class="kw">switch (var2) {
case REMOVE:
case BUILDER_TOOLS_UNDO:
int var8 = var5.getEnvironment();
if (!untrackNPC(var8, var5.getSpawnRoleIndex(), var7)) {
class="kw">return;
}
World var9 = var3.getExternalData().getWorld();
ChunkStore var10 = var9.getChunkStore();
Store var11 = var10.getStore();
TransformComponent var12 = var3.getComponent(var1, this.transformComponentType);
assert var12 != null;
Vector3d var13 = var12.getPosition();
int var14 = ChunkUtil.chunkCoordinate(var13.x());
int var15 = ChunkUtil.chunkCoordinate(var13.z());
Ref var16 = var10.getChunkReference(ChunkUtil.indexChunk(var14, var15));
double var17 = var16 != null
? untrackRemovedNPC(var16, var8, 1.0, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var11)
: 1.0;
if (var17 <= 0.0) {
class="kw">return;
}
SpiralIterator var19 = var7.getSpiralIterator();
var19.init(var14, var15, 3);
if (!var19.hasNext()) {
class="kw">return;
}
var19.next();
while (var19.hasNext() && var17 > 0.0) {
long var20 = var19.next();
var16 = var10.getChunkReference(var20);
if (var16 != null) {
var17 = untrackRemovedNPC(var16, var8, var17, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var11);
}
}
if (var17 > 0.0) {
HytaleLogger.Api var24 = LOGGER.at(Level.FINE);
if (var24.isEnabled()) {
var24.log("Failed to remove %s of a spread NPC spawn from neighbouring chunks, spreading to other chunks with matching environment", var17);
}
List var21 = var7.getWorldEnvironmentSpawnData(var8).getChunkRefList();
Iterator var22 = var21.iterator();
while (var22.hasNext() && var17 > 0.0) {
var17 = untrackRemovedNPC(var22.next(), var8, var17, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var11);
}
if (var17 > 0.0 && var24.isEnabled()) {
var24.log("Failed to remove %s of an NPC spawn from random chunks with matching environments", var17);
}
}
var19.reset();
break;
case UNLOAD:
untrackNPC(var5.getEnvironment(), var5.getSpawnRoleIndex(), var7);
}
}
}
class="kw">private class="kw">static boolean trackNPC(int var0, int var1, @Nonnull WorldSpawnData var2, @Nonnull World var3, @Nonnull ComponentAccessor<EntityStore> var4) {
if (!var2.trackNPC(var0, var1, 1, var3, var4)) {
class="kw">return false;
}
HytaleLogger.Api var5 = LOGGER.at(Level.FINER);
if (var5.isEnabled()) {
var5.log("Track Spawn env=%s role=%s", getEnvironmentName(var0), NPCPlugin.get().getName(var1));
}
class="kw">return true;
}
class="kw">private class="kw">static boolean untrackNPC(int var0, int var1, @Nonnull WorldSpawnData var2) {
if (!var2.untrackNPC(var0, var1, 1)) {
class="kw">return false;
}
HytaleLogger.Api var3 = LOGGER.at(Level.FINER);
if (var3.isEnabled()) {
var3.log("Despawn env=%s role=%s", getEnvironmentName(var0), NPCPlugin.get().getName(var1));
}
class="kw">return true;
}
class="kw">private class="kw">static double trackNewNPC(
@Nonnull Ref<ChunkStore> var0,
int var1,
double var2,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var4,
@Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var5,
@Nonnull Store<ChunkStore> var6
) {
ChunkSpawnData var7 = var6.getComponent(var0, var4);
if (var7 == null) {
class="kw">return var2;
}
ChunkEnvironmentSpawnData var8 = (ChunkEnvironmentSpawnData)var7.getChunkEnvironmentSpawnDataMap().get(var1);
if (var8 == null) {
class="kw">return var2;
}
ChunkSpawnedNPCData var9 = var6.getComponent(var0, var5);
assert var9 != null;
double var10 = var9.getEnvironmentSpawnCount(var1);
if (var8.isFullyPopulated(var10)) {
class="kw">return var2;
}
WorldChunk var12 = var6.getComponent(var0, WorldChunk.getComponentType());
assert var12 != null;
var12.markNeedsSaving();
double var13 = var8.getExpectedNPCs();
double var15 = var13 - var10;
if (var2 > var15) {
HytaleLogger.Api var19 = LOGGER.at(Level.FINEST);
if (var19.isEnabled()) {
var19.log("Spreading %g to chunk %d with total capacity %g", var15, var12.getIndex(), var13);
}
var2 -= var15;
var9.setEnvironmentSpawnCount(var1, var13);
class="kw">return var2;
} else {
HytaleLogger.Api var17 = LOGGER.at(Level.FINEST);
if (var17.isEnabled()) {
var17.log("Spreading %g to chunk %d with total capacity %g", var2, var12.getIndex(), var13);
}
var9.setEnvironmentSpawnCount(var1, var10 + var2);
class="kw">return 0.0;
}
}
class="kw">private class="kw">static double untrackRemovedNPC(
@Nonnull Ref<ChunkStore> var0,
int var1,
double var2,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var4,
@Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var5,
@Nonnull Store<ChunkStore> var6
) {
ChunkSpawnData var7 = var6.getComponent(var0, var4);
if (var7 == null) {
class="kw">return var2;
}
ChunkEnvironmentSpawnData var8 = (ChunkEnvironmentSpawnData)var7.getChunkEnvironmentSpawnDataMap().get(var1);
if (var8 == null) {
class="kw">return var2;
}
ChunkSpawnedNPCData var9 = var6.getComponent(var0, var5);
assert var9 != null;
double var10 = var9.getEnvironmentSpawnCount(var1);
if (var10 <= 0.0) {
class="kw">return var2;
}
WorldChunk var12 = var6.getComponent(var0, WorldChunk.getComponentType());
assert var12 != null;
var12.markNeedsSaving();
double var13 = var8.getExpectedNPCs();
if (var10 < var2) {
HytaleLogger.Api var17 = LOGGER.at(Level.FINEST);
if (var17.isEnabled()) {
var17.log("Spreading removal of %g to chunk %d with total capacity %g", var10, var12.getIndex(), var13);
}
var2 -= var10;
var9.setEnvironmentSpawnCount(var1, 0.0);
class="kw">return var2;
} else {
HytaleLogger.Api var15 = LOGGER.at(Level.FINEST);
if (var15.isEnabled()) {
var15.log("Spreading removal of %g to chunk %d with total capacity %g", var2, var12.getIndex(), var13);
}
var9.setEnvironmentSpawnCount(var1, var10 - var2);
class="kw">return 0.0;
}
}
class="kw">private class="kw">static String getEnvironmentName(int var0) {
Environment var1 = Environment.getAssetMap().getAsset(var0);
class="kw">return var1 != null ? var1.getId() : "<" + var0 + ">";
}
}