TickingSystem class
Пакет: com.hypixel.hytale.server.core.modules.entity.system
Файл: com/hypixel/hytale/server/core/modules/entity/system/UpdateLocationSystems.java
extends: EntityTickingSystem<EntityStore>
Поля (4)
| Модификаторы | Тип | Имя |
|---|---|---|
|
World |
var6 |
|
Ref |
var7 |
|
TransformComponent |
var8 |
|
Dirty |
var9 |
Методы (2)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public Query<EntityStore> |
getQuerypublic Query<EntityStore> getQuery() |
|
public void |
tickpublic void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.entity.system;
class="kw">import com.hypixel.hytale.common.util.CompletableFutureUtil;
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.ComponentAccessor;
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.Store;
class="kw">import com.hypixel.hytale.component.query.Query;
class="kw">import com.hypixel.hytale.component.system.RefSystem;
class="kw">import com.hypixel.hytale.component.system.tick.EntityTickingSystem;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.server.core.Message;
class="kw">import com.hypixel.hytale.server.core.entity.Dirty;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.teleport.Teleport;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.EntitySection;
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 java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">public class UpdateLocationSystems {
@Nonnull
class="kw">private class="kw">static class="kw">final Message MESSAGE_GENERAL_PLAYER_IN_INVALID_CHUNK = Message.translation("server.general.playerInInvalidChunk");
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">public UpdateLocationSystems() {
}
class="kw">private class="kw">static void updateLocation(
@Nonnull Ref<EntityStore> var0, @Nonnull TransformComponent var1, @Nullable Dirty var2, @Nullable World var3, @Nonnull CommandBuffer<EntityStore> var4
) {
if (var3 != null) {
Vector3d var5 = var1.getPosition();
if (var5.y() < -32.0 && !var4.getArchetype(var0).contains(Player.getComponentType())) {
LOGGER.at(Level.WARNING).log("Unable to move entity below the world! %d < %s", -32, var5);
var4.removeEntity(var0, RemoveReason.REMOVE);
} else {
if (var2 != null && var1.pollMovedEnoughToSave()) {
var2.markDirty();
}
ChunkStore var6 = var3.getChunkStore();
Store var7 = var6.getStore();
int var8 = ChunkUtil.chunkCoordinate(var5.x());
int var9 = ChunkUtil.chunkCoordinate(var5.y());
int var10 = ChunkUtil.chunkCoordinate(var5.z());
Ref var11 = var1.getSectionRef();
boolean var12 = false;
int var13 = 0;
int var14 = 0;
int var15 = 0;
if (var11 != null && var11.isValid()) {
ChunkSection var16 = var7.getComponent(var11, ChunkSection.getComponentType());
if (var16 != null) {
var12 = true;
var13 = var16.getX();
var14 = var16.getY();
var15 = var16.getZ();
}
}
if (!var12 || var13 != var8 || var15 != var10 || var14 != var9) {
Ref var19 = var6.getChunkSectionReference(var8, var9, var10);
if (var19 != null && var19.isValid()) {
updateSection(var0, var1, var2, var11, var19, null, var7, var4);
} else {
boolean var17 = var4.getArchetype(var0).contains(Player.getComponentType());
if (var17) {
Ref var18 = var6.getChunkReference(ChunkUtil.indexChunkFromBlock(var1.getPosition().x, var1.getPosition().z));
if (var18 != null) {
updateSection(var0, var1, var2, var11, var19, var18, var7, var4);
class="kw">return;
}
}
LOGGER.at(Level.WARNING).log("Entity has moved into a chunk that isn't currently loaded! %d, %d, %d, %s", var8, var9, var10, var1);
CompletableFutureUtil._catch(var6.getChunkSectionReferenceAsync(var8, var9, var10).thenAcceptAsync(var2x -> {
if (var2x != null && var2x.isValid()) {
updateSectionAsync(var0, (Ref<ChunkStore>)var2x, var7);
} else {
updateSectionAsync(var0, null, var7);
}
}, var3));
}
}
}
}
}
class="kw">private class="kw">static void updateSectionAsync(@Nonnull Ref<EntityStore> var0, @Nullable Ref<ChunkStore> var1, @Nonnull Store<ChunkStore> var2) {
if (var0.isValid()) {
Store var3 = var0.getStore();
TransformComponent var4 = var3.getComponent(var0, TransformComponent.getComponentType());
assert var4 != null;
Dirty var5 = var3.getComponent(var0, Dirty.getComponentType());
Ref var6 = var4.getSectionRef();
updateSection(var0, var4, var5, var6, var1, null, var2, var3);
}
}
class="kw">private class="kw">static void updateSection(
@Nonnull Ref<EntityStore> var0,
@Nonnull TransformComponent var1,
@Nullable Dirty var2,
@Nullable Ref<ChunkStore> var3,
@Nullable Ref<ChunkStore> var4,
@Nullable Ref<ChunkStore> var5,
@Nonnull ComponentAccessor<ChunkStore> var6,
@Nonnull ComponentAccessor<EntityStore> var7
) {
boolean var8 = var7.getArchetype(var0).contains(Player.getComponentType());
if (var4 == null) {
handleInvalidChunk(var0, var1, var8, var5, var7);
} else {
if (!var8) {
updateEntityInChunk(var0, var2, var3, var4, var6, var7);
}
var1.setSectionLocation(var4);
}
}
class="kw">private class="kw">static void handleInvalidChunk(
@Nonnull Ref<EntityStore> var0,
@Nonnull TransformComponent var1,
boolean var2,
@Nullable Ref<ChunkStore> var3,
@Nonnull ComponentAccessor<EntityStore> var4
) {
if (!var2) {
LOGGER.at(Level.SEVERE).log("Entity is in a chunk that can't be loaded! Removing! %s", var1);
var4.removeEntity(var0, EntityStore.REGISTRY.newHolder(), RemoveReason.REMOVE);
} else {
var1.setSectionLocation(null);
Ref var5 = var3 != null
? var3
: var4.getExternalData().getWorld().getChunkStore().getChunkReference(ChunkUtil.indexChunkFromBlock(var1.getPosition().x, var1.getPosition().z));
if (var5 != null) {
class="kw">return;
}
LOGGER.at(Level.SEVERE).log("Player is in a chunk that can't be loaded! Moving (-%d,0,0)! %s", 32, var1);
Vector3d var6 = var1.getPosition();
Vector3d var7 = new Vector3d(var6).sub(32.0, 0.0, 0.0);
Rotation3f var8 = var1.getRotation();
Teleport var9 = Teleport.createForPlayer(var7, var8);
var4.addComponent(var0, Teleport.getComponentType(), var9);
PlayerRef var10 = var4.getComponent(var0, PlayerRef.getComponentType());
if (var10 != null) {
var10.sendMessage(MESSAGE_GENERAL_PLAYER_IN_INVALID_CHUNK);
}
}
}
class="kw">private class="kw">static void updateEntityInChunk(
@Nonnull Ref<EntityStore> var0,
@Nullable Dirty var1,
@Nullable Ref<ChunkStore> var2,
@Nonnull Ref<ChunkStore> var3,
@Nonnull ComponentAccessor<ChunkStore> var4,
@Nonnull ComponentAccessor<EntityStore> var5
) {
if (var2 != null && var2.isValid()) {
EntitySection var6 = var4.getComponent(var2, EntitySection.getComponentType());
assert var6 != null;
var6.removeEntityReference(var0);
}
EntitySection var8 = var4.getComponent(var3, EntitySection.getComponentType());
assert var8 != null;
if (var1 != null) {
if (!(var4.getExternalData().getSaver() class="kw">instanceof IChunkSaver.Cubic)) {
var1.setSection(var8);
} else {
var1.setSection(null);
}
var1.forceMarkDirty();
}
if (var4.getArchetype(var3).contains(ChunkStore.REGISTRY.getNonTickingComponentType())) {
Holder var7 = EntityStore.REGISTRY.newHolder();
var5.removeEntity(var0, var7, RemoveReason.UNLOAD);
var8.addEntityHolder(var7);
} else {
var8.addEntityReference(var0);
}
}
class="kw">public class="kw">static class SpawnSystem class="kw">extends RefSystem<EntityStore> {
class="kw">public SpawnSystem() {
}
@Override
class="kw">public Query<EntityStore> getQuery() {
class="kw">return TransformComponent.getComponentType();
}
@Override
class="kw">public void onEntityAdded(
@Nonnull Ref<EntityStore> var1, @Nonnull AddReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
) {
TransformComponent var5 = var4.getComponent(var1, TransformComponent.getComponentType());
assert var5 != null;
Dirty var6 = var4.getComponent(var1, Dirty.getComponentType());
Ref var7 = var5.getSectionRef();
if (var7 == null || !var7.isValid()) {
UpdateLocationSystems.updateLocation(var1, var5, var6, var3.getExternalData().getWorld(), var4);
}
}
@Override
class="kw">public void onEntityRemove(
@Nonnull Ref<EntityStore> var1, @Nonnull RemoveReason var2, @Nonnull Store<EntityStore> var3, @Nonnull CommandBuffer<EntityStore> var4
) {
}
}
class="kw">public class="kw">static class TickingSystem class="kw">extends EntityTickingSystem<EntityStore> {
class="kw">public TickingSystem() {
}
@Override
class="kw">public Query<EntityStore> getQuery() {
class="kw">return TransformComponent.getComponentType();
}
@Override
class="kw">public void tick(
float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5
) {
World var6 = var5.getExternalData().getWorld();
Ref var7 = var3.getReferenceTo(var2);
TransformComponent var8 = var3.getComponent(var2, TransformComponent.getComponentType());
assert var8 != null;
Dirty var9 = var3.getComponent(var2, Dirty.getComponentType());
UpdateLocationSystems.updateLocation(var7, var8, var9, var6, var5);
}
}
}