Collector class
Пакет: com.hypixel.hytale.builtin.adventure.worldevents.system
Файл: com/hypixel/hytale/builtin/adventure/worldevents/system/WorldEventStorageSystem.java
implements: IntBiObjectConsumer<ArchetypeChunk<EntityStore>, CommandBuffer<EntityStore>>, AutoCloseable
Поля (7)
| Модификаторы | Тип | Имя |
|---|---|---|
|
protected static final ThreadLocal<WorldEventStorageSystem.Collector> |
LOCAL |
|
protected final Map<UUID, Ref<EntityStore>> |
entities |
|
protected final ComponentType<EntityStore, WorldEvent> |
eventComponent |
|
protected final ObjectList<WorldEvent> |
events |
|
protected final DynamicArray<Holder<EntityStore>> |
toAdd |
|
protected final DynamicArray<Ref<EntityStore>> |
toRemove |
|
WorldEvent |
var4 |
Методы (3)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public void |
acceptpublic void accept(int var1, @Nonnull ArchetypeChunk<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3) |
|
public void |
closepublic void close() |
|
protected static void |
collectEventsprotected static void collectEvents(@Nonnull WorldEvent var0, @Nonnull WorldEventStorageSystem.Collector var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.worldevents.system;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventManager;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventStorage;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.WorldEventsPlugin;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.event.WorldEvent;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.util.DynamicArray;
class="kw">import com.hypixel.hytale.builtin.adventure.worldevents.util.PrefabSnapshotUtil;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.ArchetypeChunk;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.ComponentRegistry;
class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Holder;
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.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.function.consumer.IntBiObjectConsumer;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.Intangible;
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 it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectList;
class="kw">import java.util.Map;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import javax.annotation.Nonnull;
class="kw">public class WorldEventStorageSystem class="kw">extends TickingSystem<EntityStore> {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">protected class="kw">final ResourceType<EntityStore, WorldEventManager> managerResourceType;
@Nonnull
class="kw">protected class="kw">final ResourceType<EntityStore, WorldEventStorage> storageResourceType;
@Nonnull
class="kw">protected class="kw">final ComponentType<EntityStore, WorldEvent> eventComponentType;
@Nonnull
class="kw">protected class="kw">final ComponentType<EntityStore, Intangible> intangibleComponentType;
class="kw">public WorldEventStorageSystem(
@Nonnull ResourceType<EntityStore, WorldEventManager> var1,
@Nonnull ResourceType<EntityStore, WorldEventStorage> var2,
@Nonnull ComponentType<EntityStore, WorldEvent> var3
) {
this.managerResourceType = var1;
this.storageResourceType = var2;
this.eventComponentType = var3;
this.intangibleComponentType = Intangible.getComponentType();
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
WorldEventStorage var4 = var3.getResource(this.storageResourceType);
World var5 = var3.getExternalData().getWorld();
class="kw">switch (var4.consumeState()) {
case SAVE: {
((HytaleLogger.Api)LOGGER.atFine()).log("Saving world-events storage to disk");
ComponentRegistry.Data var16 = var3.getRegistry().getData();
var3.getResourceStorage().save(var3, var16, this.storageResourceType, var4).whenCompleteAsync(var4::onCompleteSave, var5);
break;
}
case LOAD: {
((HytaleLogger.Api)LOGGER.atFine()).log("Loading world-events storage from disk");
ComponentRegistry.Data var15 = var3.getRegistry().getData();
var3.getResourceStorage().load(var3, var15, this.storageResourceType).whenCompleteAsync(var4::onCompleteLoad, var5);
break;
}
case LOADED:
try (WorldEventStorageSystem.Collector var6 = WorldEventStorageSystem.Collector.LOCAL.get()) {
var4.forEach(var6, WorldEventStorageSystem.Collector::collectEvents);
var3.forEachEntityParallel(this.eventComponentType, var6);
int var7 = 0;
int var8 = 0;
for (int var9 = 0; var9 < var6.events.size(); var9++) {
WorldEvent var10 = (WorldEvent)var6.events.get(var9);
Ref var11 = var6.entities.get(var10.uuid);
if (var11 != null) {
assert var11.isValid();
WorldEvent var12 = var3.getComponent(var11, this.eventComponentType);
assert var12 != null;
if (var12 == var10) {
class="kw">continue;
}
var12.uuid = WorldEvent.EMPTY_ID;
var6.toRemove.add(var11);
var10.restart = true;
var8++;
} else {
var7++;
}
Holder var17 = var3.getRegistry().newHolder();
var17.ensureComponentsSize(2);
var17.addComponent(this.eventComponentType, var10);
var17.addComponent(this.intangibleComponentType, Intangible.INSTANCE);
var6.toAdd.add(var17);
}
var3.removeEntities(var6.toRemove.array(), 0, var6.toRemove.size(), RemoveReason.REMOVE);
var3.addEntities(var6.toAdd.array(), 0, var6.toAdd.size(), AddReason.LOAD);
PrefabSnapshotUtil.cleanSnapshotsDir(var5, var3.getResource(this.managerResourceType));
WorldEventsPlugin.loadGameplayWorldEvents(var5);
((HytaleLogger.Api)LOGGER.atFine()).log("Loaded world-event entities from storage. Loaded: %d, Reloaded: %d", var7, var8);
}
}
}
class="kw">protected class="kw">static class Collector class="kw">implements IntBiObjectConsumer<ArchetypeChunk<EntityStore>, CommandBuffer<EntityStore>>, AutoCloseable {
class="kw">protected class="kw">static class="kw">final ThreadLocal<WorldEventStorageSystem.Collector> LOCAL = ThreadLocal.withInitial(WorldEventStorageSystem.Collector::new);
@Nonnull
class="kw">protected class="kw">final ObjectList<WorldEvent> events = new ObjectArrayList();
@Nonnull
class="kw">protected class="kw">final Map<UUID, Ref<EntityStore>> entities = new ConcurrentHashMap<>();
@Nonnull
class="kw">protected class="kw">final ComponentType<EntityStore, WorldEvent> eventComponent = WorldEvent.getComponentType();
@Nonnull
class="kw">protected class="kw">final DynamicArray<Ref<EntityStore>> toRemove = new DynamicArray<>(8, Ref[]::new);
@Nonnull
class="kw">protected class="kw">final DynamicArray<Holder<EntityStore>> toAdd = new DynamicArray<>(8, Holder[]::new);
class="kw">protected Collector() {
}
class="kw">public void accept(int var1, @Nonnull ArchetypeChunk<EntityStore> var2, @Nonnull CommandBuffer<EntityStore> var3) {
WorldEvent var4 = var2.getComponent(var1, this.eventComponent);
assert var4 != null;
this.entities.put(var4.uuid, var2.getReferenceTo(var1));
}
@Override
class="kw">public void close() {
this.toAdd.clear();
this.toRemove.clear();
this.events.clear();
this.entities.clear();
}
class="kw">protected class="kw">static void collectEvents(@Nonnull WorldEvent var0, @Nonnull WorldEventStorageSystem.Collector var1) {
var1.events.add(var0);
}
}
}