package com.hypixel.hytale.server.spawning.suppression.system; import com.hypixel.hytale.component.AddReason; import com.hypixel.hytale.component.CommandBuffer; import com.hypixel.hytale.component.ComponentType; import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.component.RemoveReason; import com.hypixel.hytale.component.ResourceType; import com.hypixel.hytale.component.Store; import com.hypixel.hytale.component.query.Query; import com.hypixel.hytale.component.system.RefSystem; import com.hypixel.hytale.component.system.tick.TickingSystem; import com.hypixel.hytale.server.core.universe.world.World; import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk; import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.hypixel.hytale.server.spawning.SpawningPlugin; import com.hypixel.hytale.server.spawning.suppression.component.ChunkSuppressionEntry; import com.hypixel.hytale.server.spawning.suppression.component.ChunkSuppressionQueue; import com.hypixel.hytale.server.spawning.suppression.component.SpawnSuppressionController; import java.util.List; import java.util.Map.Entry; import java.util.logging.Level; import javax.annotation.Nonnull; public class ChunkSuppressionSystems { public static class ChunkAdded extends RefSystem { private static final ComponentType COMPONENT_TYPE = BlockChunk.getComponentType(); private final ComponentType chunkSuppressionEntryComponentType; private final ResourceType spawnSuppressionControllerResourceType; public ChunkAdded( ComponentType chunkSuppressionEntryComponentType, ResourceType spawnSuppressionControllerResourceType ) { this.chunkSuppressionEntryComponentType = chunkSuppressionEntryComponentType; this.spawnSuppressionControllerResourceType = spawnSuppressionControllerResourceType; } @Override public Query getQuery() { return COMPONENT_TYPE; } @Override public void onEntityAdded( @Nonnull Ref reference, @Nonnull AddReason reason, @Nonnull Store store, @Nonnull CommandBuffer commandBuffer ) { World world = store.getExternalData().getWorld(); SpawnSuppressionController spawnSuppressionController = world.getEntityStore().getStore().getResource(this.spawnSuppressionControllerResourceType); BlockChunk blockChunk = commandBuffer.getComponent(reference, COMPONENT_TYPE); long index = blockChunk.getIndex(); ChunkSuppressionEntry entry = spawnSuppressionController.getChunkSuppressionMap().get(index); if (entry != null) { commandBuffer.addComponent(reference, this.chunkSuppressionEntryComponentType, entry); SpawningPlugin.get().getLogger().at(Level.FINEST).log("Annotated chunk index %s on load", index); } } @Override public void onEntityRemove( @Nonnull Ref reference, @Nonnull RemoveReason reason, @Nonnull Store store, @Nonnull CommandBuffer commandBuffer ) { } } public static class Ticking extends TickingSystem { private final ComponentType chunkSuppressionEntryComponentType; private final ResourceType chunkSuppressionQueueResourceType; public Ticking( ComponentType chunkSuppressionEntryComponentType, ResourceType chunkSuppressionQueueResourceType ) { this.chunkSuppressionEntryComponentType = chunkSuppressionEntryComponentType; this.chunkSuppressionQueueResourceType = chunkSuppressionQueueResourceType; } @Override public void tick(float dt, int systemIndex, @Nonnull Store store) { ChunkSuppressionQueue queue = store.getResource(this.chunkSuppressionQueueResourceType); List, ChunkSuppressionEntry>> addQueue = queue.getToAdd(); if (!addQueue.isEmpty()) { for (int i = 0; i < addQueue.size(); i++) { Entry, ChunkSuppressionEntry> entry = addQueue.get(i); Ref ref = entry.getKey(); store.putComponent(ref, this.chunkSuppressionEntryComponentType, entry.getValue()); SpawningPlugin.get().getLogger().at(Level.FINEST).log("Annotated chunk %s from queue", ref); } addQueue.clear(); } List> removeQueue = queue.getToRemove(); if (!removeQueue.isEmpty()) { for (int i = 0; i < removeQueue.size(); i++) { Ref ref = removeQueue.get(i); store.tryRemoveComponent(ref, this.chunkSuppressionEntryComponentType); SpawningPlugin.get().getLogger().at(Level.FINEST).log("Removed annotation from chunk %s from queue", ref); } removeQueue.clear(); } } } }