ChunkRefAdded class
Пакет: com.hypixel.hytale.server.spawning.world.system
Файл: com/hypixel/hytale/server/spawning/world/system/ChunkSpawningSystems.java
extends: RefSystem<ChunkStore>
Поля (6)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final ComponentType<ChunkStore, ChunkSpawnData> |
chunkSpawnDataComponentType |
|
private final ComponentType<ChunkStore, ChunkSpawnedNPCData> |
chunkSpawnedNPCDataComponentType |
|
WorldSpawnData |
var5 |
|
WorldChunk |
var6 |
|
private final ComponentType<ChunkStore, WorldChunk> |
worldChunkComponentType |
|
private final ResourceType<EntityStore, WorldSpawnData> |
worldSpawnDataResourceType |
Методы (3)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public Query<ChunkStore> |
getQuerypublic Query<ChunkStore> getQuery() |
|
public void |
onEntityAddedpublic void onEntityAdded(@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4) |
|
public void |
onEntityRemovepublic void onEntityRemove(@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4) |
Исходный код
Показать/скрыть
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.Archetype;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.NonTicking;
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.RefChangeSystem;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.asset.type.environment.config.Environment;
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.chunk.environment.EnvironmentColumn;
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.spawning.SpawningPlugin;
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.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 it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">public class ChunkSpawningSystems {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final Query<ChunkStore> QUERY = Archetype.of(WorldChunk.getComponentType(), ChunkSpawnData.getComponentType());
class="kw">private class="kw">static class="kw">final Query<ChunkStore> TICKING_QUERY = Query.and(Query.not(ChunkStore.REGISTRY.getNonTickingComponentType()), QUERY);
class="kw">public ChunkSpawningSystems() {
}
class="kw">protected class="kw">static boolean processStoppedChunk(
@Nonnull Ref<ChunkStore> var0,
@Nonnull Store<ChunkStore> var1,
@Nonnull WorldSpawnData var2,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var3,
@Nonnull CommandBuffer<ChunkStore> var4
) {
ChunkSpawnData var5 = var1.getComponent(var0, var3);
if (var5 == null) {
class="kw">return false;
}
var4.removeComponent(var0, var3);
if (!var5.isStarted()) {
class="kw">return false;
}
World var6 = var1.getExternalData().getWorld();
Store var7 = var6.getEntityStore().getStore();
ObjectIterator var8 = Int2ObjectMaps.fastIterator(var5.getChunkEnvironmentSpawnDataMap());
while (var8.hasNext()) {
Entry var9 = (Entry<ChunkEnvironmentSpawnData>)var8.next();
WorldEnvironmentSpawnData var10 = var2.getWorldEnvironmentSpawnData(var9.getIntKey());
if (var10 != null) {
ChunkEnvironmentSpawnData var11 = (ChunkEnvironmentSpawnData)var9.getValue();
if (!var11.wasProcessedAsUnspawnable()) {
int var12 = -var11.getSegmentCount();
var10.adjustSegmentCount(var12);
if (var10.getSegmentCount() < 0) {
Environment var13 = Environment.getAssetMap().getAsset(var10.getEnvironmentIndex());
String var14 = var13 != null ? var13.getId() : null;
LOGGER.at(Level.SEVERE).log("Block count for environment %s dropped below 0 to %s", var14, var10.getSegmentCount());
}
var2.adjustSegmentCount(var12);
}
var10.removeChunk(var0, var7);
}
}
class="kw">return true;
}
class="kw">protected class="kw">static boolean processStartedChunk(
@Nonnull Ref<ChunkStore> var0,
@Nonnull Store<ChunkStore> var1,
@Nonnull WorldChunk var2,
@Nonnull WorldSpawnData var3,
@Nonnull ComponentType<ChunkStore, ChunkSpawnData> var4,
@Nonnull ComponentType<ChunkStore, ChunkSpawnedNPCData> var5,
@Nonnull CommandBuffer<ChunkStore> var6
) {
ChunkSpawnData var7 = var1.getComponent(var0, var4);
if (var7 == null) {
var7 = new ChunkSpawnData();
var6.putComponent(var0, var4, var7);
}
var6.ensureComponent(var0, var5);
if (var7.isStarted()) {
class="kw">return false;
}
ObjectIterator var8 = Int2ObjectMaps.fastIterator(var7.getChunkEnvironmentSpawnDataMap());
while (var8.hasNext()) {
Entry var9 = (Entry<ChunkEnvironmentSpawnData>)var8.next();
((ChunkEnvironmentSpawnData)var9.getValue()).init(var9.getIntKey(), var2);
}
preprocessChunk(var7, var2);
var7.setStarted(true);
World var19 = var1.getExternalData().getWorld();
Store var10 = var19.getEntityStore().getStore();
var8 = Int2ObjectMaps.fastIterator(var7.getChunkEnvironmentSpawnDataMap());
while (var8.hasNext()) {
Entry var11 = (Entry<ChunkEnvironmentSpawnData>)var8.next();
int var12 = var11.getIntKey();
ChunkEnvironmentSpawnData var13 = (ChunkEnvironmentSpawnData)var11.getValue();
var13.updateDensity(SpawningPlugin.get().getEnvironmentDensity(var12));
WorldEnvironmentSpawnData var14 = var3.getOrCreateWorldEnvironmentSpawnData(var12, var19, var10);
int var15 = var13.getSegmentCount();
var14.adjustSegmentCount(var15);
var3.adjustSegmentCount(var15);
var14.addChunk(var0, var10);
HytaleLogger.Api var16 = LOGGER.at(Level.FINER);
if (var16.isEnabled()) {
Environment var17 = Environment.getAssetMap().getAsset(var12);
var16.log(
" Add chunk [%s/%s] to env=%s, exp=%s, act=%s, blks=%s",
var2.getX(),
var2.getZ(),
var17 == null ? null : var17.getId(),
var14.getExpectedNPCs(),
var14.getActualNPCs(),
var14.getSegmentCount()
);
}
}
class="kw">return true;
}
class="kw">private class="kw">static void preprocessChunk(@Nonnull ChunkSpawnData var0, @Nonnull WorldChunk var1) {
for (int var2 = 0; var2 < 32; var2++) {
for (int var3 = 0; var3 < 32; var3++) {
preprocessColumn(var0, var1, var2, var3);
}
}
}
class="kw">private class="kw">static void preprocessColumn(@Nonnull ChunkSpawnData var0, @Nonnull WorldChunk var1, int var2, int var3) {
EnvironmentColumn var4 = var1.getBlockChunk().getEnvironmentColumn(var2, var3);
Int2ObjectMap var5 = var0.getChunkEnvironmentSpawnDataMap();
for (int var6 = var4.indexOf(0); var6 < var4.size() && var4.getValueMin(var6) <= 320; var6++) {
int var7 = var4.getValue(var6);
ChunkEnvironmentSpawnData var8 = (ChunkEnvironmentSpawnData)var5.get(var7);
if (var8 == null) {
var8 = new ChunkEnvironmentSpawnData();
var8.init(var7, var1);
var5.put(var7, var8);
}
var8.registerSegment(var2, var3);
}
}
class="kw">protected class="kw">static void updateChunkCount(int var0, @Nonnull WorldSpawnData var1) {
if (var0 > 0) {
var1.setUnspawnable(false);
}
var1.adjustChunkCount(var0);
var1.recalculateWorldCount();
}
class="kw">public class="kw">static class ChunkRefAdded class="kw">extends RefSystem<ChunkStore> {
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;
class="kw">private class="kw">final ComponentType<ChunkStore, WorldChunk> worldChunkComponentType;
class="kw">public ChunkRefAdded(
ResourceType<EntityStore, WorldSpawnData> var1, ComponentType<ChunkStore, ChunkSpawnData> var2, ComponentType<ChunkStore, ChunkSpawnedNPCData> var3
) {
this.worldSpawnDataResourceType = var1;
this.chunkSpawnDataComponentType = var2;
this.chunkSpawnedNPCDataComponentType = var3;
this.worldChunkComponentType = WorldChunk.getComponentType();
}
@Nonnull
@Override
class="kw">public Query<ChunkStore> getQuery() {
class="kw">return ChunkSpawningSystems.TICKING_QUERY;
}
@Override
class="kw">public void onEntityAdded(
@Nonnull Ref<ChunkStore> var1, @Nonnull AddReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
WorldSpawnData var5 = var3.getExternalData().getWorld().getEntityStore().getStore().getResource(this.worldSpawnDataResourceType);
WorldChunk var6 = var3.getComponent(var1, this.worldChunkComponentType);
if (ChunkSpawningSystems.processStartedChunk(var1, var3, var6, var5, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var4)) {
ChunkSpawningSystems.LOGGER.at(Level.FINE).log("Adding chunk [%s/%s]", var6.getX(), var6.getZ());
ChunkSpawningSystems.updateChunkCount(1, var5);
}
}
@Override
class="kw">public void onEntityRemove(
@Nonnull Ref<ChunkStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
}
}
class="kw">public class="kw">static class TickingState class="kw">extends RefChangeSystem<ChunkStore, NonTicking<ChunkStore>> {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
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;
class="kw">private class="kw">final ComponentType<ChunkStore, WorldChunk> worldChunkComponentType;
class="kw">public TickingState(
ResourceType<EntityStore, WorldSpawnData> var1, ComponentType<ChunkStore, ChunkSpawnData> var2, ComponentType<ChunkStore, ChunkSpawnedNPCData> var3
) {
this.worldSpawnDataResourceType = var1;
this.chunkSpawnDataComponentType = var2;
this.chunkSpawnedNPCDataComponentType = var3;
this.worldChunkComponentType = WorldChunk.getComponentType();
}
@Override
class="kw">public Query<ChunkStore> getQuery() {
class="kw">return this.worldChunkComponentType;
}
@Nonnull
@Override
class="kw">public ComponentType<ChunkStore, NonTicking<ChunkStore>> componentType() {
class="kw">return ChunkStore.REGISTRY.getNonTickingComponentType();
}
class="kw">public void onComponentAdded(
@Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
WorldSpawnData var5 = var3.getExternalData().getWorld().getEntityStore().getStore().getResource(this.worldSpawnDataResourceType);
WorldChunk var6 = var3.getComponent(var1, this.worldChunkComponentType);
if (ChunkSpawningSystems.processStoppedChunk(var1, var3, var5, this.chunkSpawnDataComponentType, var4)) {
LOGGER.at(Level.FINE).log("Removing chunk [%s/%s]", var6.getX(), var6.getZ());
ChunkSpawningSystems.updateChunkCount(-1, var5);
}
}
class="kw">public void onComponentSet(
@Nonnull Ref<ChunkStore> var1,
NonTicking<ChunkStore> var2,
@Nonnull NonTicking<ChunkStore> var3,
@Nonnull Store<ChunkStore> var4,
@Nonnull CommandBuffer<ChunkStore> var5
) {
}
class="kw">public void onComponentRemoved(
@Nonnull Ref<ChunkStore> var1, @Nonnull NonTicking<ChunkStore> var2, @Nonnull Store<ChunkStore> var3, @Nonnull CommandBuffer<ChunkStore> var4
) {
WorldSpawnData var5 = var3.getExternalData().getWorld().getEntityStore().getStore().getResource(this.worldSpawnDataResourceType);
WorldChunk var6 = var3.getComponent(var1, this.worldChunkComponentType);
if (ChunkSpawningSystems.processStartedChunk(var1, var3, var6, var5, this.chunkSpawnDataComponentType, this.chunkSpawnedNPCDataComponentType, var4)) {
LOGGER.at(Level.FINE).log("Adding chunk [%s/%s]", var6.getX(), var6.getZ());
ChunkSpawningSystems.updateChunkCount(1, var5);
}
}
}
}