EntitySavingSystem class
Пакет: com.hypixel.hytale.server.core.entity
Файл: com/hypixel/hytale/server/core/entity/EntitySavingSystem.java
extends: TickingSystem<EntityStore>
implements: RunWhenPausedSystem<EntityStore>
Поля (20)
| Модификаторы | Тип | Имя |
|---|---|---|
|
boolean[] |
var10 |
|
Dirty |
var10 |
|
CompletableFuture |
var10 |
|
UUIDComponent |
var11 |
|
BiConsumer |
var11 |
|
Ref |
var12 |
|
World |
var4 |
|
Store |
var4 |
|
Store |
var5 |
|
Dirty |
var7 |
|
CompletableFuture |
var7 |
|
|
var7 |
|
ChunkSavingSystems.Data |
var8 |
|
UUIDComponent |
var8 |
|
boolean |
var8 |
|
|
var8 |
|
int[] |
var9 |
|
Ref |
var9 |
|
boolean |
var9 |
|
|
var9 |
Методы (10)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
void |
dispatchDirtyEntityvoid dispatchDirtyEntity(@Nullable Executor var0,
@Nonnull Store<EntityStore> var1,
@Nonnull IChunkSaver.Cubic var2,
@Nonnull ChunkSavingSystems.Data var3,
@Nonnull Dirty var4,
@Nonnull UUID var5,
@Nonnull Ref<EntityStore> var6) |
static |
void |
flushAllDirtyvoid flushAllDirty(@Nonnull World var0, @Nonnull IChunkSaver.Cubic var1, @Nonnull ChunkSavingSystems.Data var2, @Nullable Executor var3) |
abstract |
|
for for(int var9 = 0; var9 < var7x.size() |
abstract |
|
for for(int var6 = 0; var6 < var4x.size() |
|
|
if if(var10[0]) |
|
|
if if(var4x != null) |
|
|
if if(var0 != null) |
|
|
if if(!var8) |
|
|
if if(var7 != null) |
|
|
if if(!var9) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.entity;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.component.dependency.Dependency;
class="kw">import com.hypixel.hytale.component.dependency.RootDependency;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.tick.RunWhenPausedSystem;
class="kw">import com.hypixel.hytale.component.system.tick.TickingSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
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.core.universe.world.storage.IChunkSaver;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.component.ChunkSavingSystems;
class="kw">import java.util.Set;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.Executor;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class EntitySavingSystem class="kw">extends TickingSystem<EntityStore> class="kw">implements RunWhenPausedSystem<EntityStore> {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">private class="kw">static class="kw">final Query<EntityStore> QUERY = Query.and(
Dirty.getComponentType(),
UUIDComponent.getComponentType(),
Query.not(EntityStore.REGISTRY.getNonSerializedComponentType()),
Query.not(Player.getComponentType())
);
class="kw">public EntitySavingSystem() {
}
@Nonnull
@Override
class="kw">public Set<Dependency<EntityStore>> getDependencies() {
class="kw">return RootDependency.lastSet();
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull Store<EntityStore> var3) {
World var4 = var3.getExternalData().getWorld();
if (!var4.isSavingLocked() && var4.getWorldConfig().canSaveChunks()) {
Store var5 = var4.getChunkStore().getStore();
if (var4.getChunkStore().getSaver() class="kw">instanceof IChunkSaver.Cubic var7) {
ChunkSavingSystems.Data var8 = var5.getResource(ChunkStore.SAVE_RESOURCE);
int[] var9 = new int[]{0};
boolean[] var10 = new boolean[]{true};
var3.forEachChunk(QUERY, (var7x, var8x) -> {
for (int var9 = 0; var9 < var7x.size(); var9++) {
Dirty var10 = var7x.getComponent(var9, Dirty.getComponentType());
assert var10 != null;
if (var10.isDirty() && !var10.isSaving() && !(var10.pollCooldown(var1) > 0.0F)) {
var9[0]++;
if (var10[0]) {
if (!var8.tryReserveInFlight()) {
var10[0] = false;
} else {
UUIDComponent var11 = var7x.getComponent(var9, UUIDComponent.getComponentType());
assert var11 != null;
Ref var12 = var7x.getReferenceTo(var9);
dispatchDirtyEntity(var4, var3, var7, var8, var10, var11.getUuid(), var12);
}
}
}
}
});
var8.setDirtyEntitiesBacklog(var9[0]);
}
}
}
class="kw">public class="kw">static void flushAllDirty(@Nonnull World var0, @Nonnull IChunkSaver.Cubic var1, @Nonnull ChunkSavingSystems.Data var2, @Nullable Executor var3) {
Store var4 = var0.getEntityStore().getStore();
var4.forEachChunk(QUERY, (var4x, var5) -> {
for (int var6 = 0; var6 < var4x.size(); var6++) {
Dirty var7 = var4x.getComponent(var6, Dirty.getComponentType());
assert var7 != null;
if (var7.isDirty() && !var7.isSaving()) {
var2.awaitInFlightCapacity();
UUIDComponent var8 = var4x.getComponent(var6, UUIDComponent.getComponentType());
assert var8 != null;
Ref var9 = var4x.getReferenceTo(var6);
dispatchDirtyEntity(var3, var4, var1, var2, var7, var8.getUuid(), var9);
}
}
});
}
class="kw">private class="kw">static void dispatchDirtyEntity(
@Nullable Executor var0,
@Nonnull Store<EntityStore> var1,
@Nonnull IChunkSaver.Cubic var2,
@Nonnull ChunkSavingSystems.Data var3,
@Nonnull Dirty var4,
@Nonnull UUID var5,
@Nonnull Ref<EntityStore> var6
) {
CompletableFuture var7 = null;
boolean var8 = false;
boolean var9 = false;
try {
var7 = var2.saveEntity(var5, var1, var6);
var7.whenComplete((var1x, var2x) -> var3.releaseInFlight());
var9 = true;
var4.consumeDirty();
var4.setSaving(var7);
var3.pushSavingFuture(var7);
var8 = true;
CompletableFuture var10 = var7;
BiConsumer var11 = (var3x, var4x) -> {
if (var4x != null) {
((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var4x)).log("Failed to save entity %s:", var5);
var4.markDirty();
} else {
LOGGER.at(Level.FINEST).log("Finished saving entity %s", var5);
}
var4.clearSaving(var10);
};
if (var0 != null) {
var10.whenCompleteAsync(var11, var0);
} else {
var10.whenComplete(var11);
}
} class="kw">finally {
if (!var8) {
if (var7 != null) {
var4.markDirty();
var4.clearSaving(var7);
}
if (!var9) {
var3.releaseInFlight();
}
}
}
}
}