package com.hypixel.hytale.server.npc.systems; import com.hypixel.hytale.component.ComponentType; import com.hypixel.hytale.component.NonTicking; import com.hypixel.hytale.component.Ref; import com.hypixel.hytale.component.Resource; import com.hypixel.hytale.component.ResourceType; import com.hypixel.hytale.component.Store; import com.hypixel.hytale.component.dependency.Dependency; import com.hypixel.hytale.component.dependency.Order; import com.hypixel.hytale.component.dependency.SystemDependency; import com.hypixel.hytale.component.system.tick.TickingSystem; import com.hypixel.hytale.server.core.universe.world.storage.EntityStore; import com.hypixel.hytale.server.npc.NPCPlugin; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectList; import it.unimi.dsi.fastutil.objects.ObjectListIterator; import java.util.Set; import javax.annotation.Nonnull; public class NewSpawnStartTickingSystem extends TickingSystem { @Nonnull private final ResourceType queueResourceType; @Nonnull private final ComponentType> nonTickingComponentType; @Nonnull private final Set> dependencies = Set.of(new SystemDependency<>(Order.AFTER, StepCleanupSystem.class)); public NewSpawnStartTickingSystem(@Nonnull ResourceType queueResourceType) { this.queueResourceType = queueResourceType; this.nonTickingComponentType = EntityStore.REGISTRY.getNonTickingComponentType(); } @Nonnull @Override public Set> getDependencies() { return this.dependencies; } @Override public void tick(float dt, int systemIndex, @Nonnull Store store) { ObjectList> queue = store.getResource(this.queueResourceType).queue; if (!queue.isEmpty()) { ObjectListIterator var5 = queue.iterator(); while (var5.hasNext()) { Ref reference = (Ref)var5.next(); if (reference.isValid()) { store.removeComponent(reference, this.nonTickingComponentType); } } queue.clear(); } } public static void queueNewSpawn(@Nonnull Ref reference, @Nonnull Store store) { store.ensureComponent(reference, EntityStore.REGISTRY.getNonTickingComponentType()); store.getResource(NewSpawnStartTickingSystem.QueueResource.getResourceType()).queue.add(reference); } public static class QueueResource implements Resource { @Nonnull private final ObjectList> queue = new ObjectArrayList(); @Nonnull public static ResourceType getResourceType() { return NPCPlugin.get().getNewSpawnStartTickingQueueResourceType(); } @Nonnull @Override public Resource clone() { NewSpawnStartTickingSystem.QueueResource queue = new NewSpawnStartTickingSystem.QueueResource(); queue.queue.addAll(this.queue); return queue; } } }