VoidInvasionPortalsSpawnSystem class
Пакет: com.hypixel.hytale.builtin.portals.systems.voidevent
Файл: com/hypixel/hytale/builtin/portals/systems/voidevent/VoidInvasionPortalsSpawnSystem.java
extends: DelayedEntitySystem<EntityStore>
Поля (28)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private CompletableFuture<Vector3d> |
findPortalSpawnPos |
|
|
return |
|
SpatialHashGrid |
var1 |
|
Holder |
var10 |
|
NotNearAnyInHashGrid |
var10 |
|
Ref |
var11 |
|
VoidEventConfig |
var12 |
|
InvasionPortalConfig |
var13 |
|
Vector3i |
var14 |
|
long |
var15 |
|
SpatialHashGrid |
var18 |
|
Collection |
var2 |
|
BlockType |
var3 |
|
PortalWorld |
var3 |
|
List |
var3 |
|
Transform |
var4 |
|
Vector3d |
var5 |
|
VoidEvent |
var6 |
|
Transform |
var6 |
|
Ref |
var6 |
|
World |
var7 |
|
Vector3d |
var7 |
|
TransformComponent |
var7 |
|
VoidInvasionPortalsSpawnSystem.VoidInvasionData |
var8 |
|
Vector3d |
var8 |
|
Vector3d |
var9 |
|
|
var9 |
|
SpatialHashGrid |
var9 |
Методы (10)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
VoidInvasionDatapublic VoidInvasionData() |
|
public Resource<EntityStore> |
clonepublic Resource<EntityStore> clone() |
|
|
for for(PlayerRef var5 : var2) |
|
|
if if(var8.findPortalSpawnPos == null) |
|
|
if if(var9 != null) |
|
|
if if(var12 == null) |
|
|
if if(var3 == null) |
|
|
if if(var4 == null) |
|
|
if if(var6 == null) |
abstract |
|
super super(2.0F) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.portals.systems.voidevent;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.VoidEvent;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.VoidSpawner;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.config.InvasionPortalConfig;
class="kw">import com.hypixel.hytale.builtin.portals.components.voidevent.config.VoidEventConfig;
class="kw">import com.hypixel.hytale.builtin.portals.resources.PortalWorld;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.generators.SearchBelow;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.generators.SearchCone;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.FitsAPortal;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.NotNearAnyInHashGrid;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.NotNearPointXZ;
class="kw">import com.hypixel.hytale.builtin.portals.utils.spatial.SpatialHashGrid;
class="kw">import com.hypixel.hytale.common.util.RandomUtil;
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.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Resource;
class="kw">import com.hypixel.hytale.component.ResourceType;
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.tick.DelayedEntitySystem;
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.math.vector.Transform;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import java.util.Collection;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
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">import org.joml.Vector3i;
class="kw">public class VoidInvasionPortalsSpawnSystem class="kw">extends DelayedEntitySystem<EntityStore> {
@Nonnull
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final int MAX_PORTALS = 24;
class="kw">private class="kw">final ResourceType<EntityStore, VoidInvasionPortalsSpawnSystem.VoidInvasionData> voidInvasionDataResourceType = this.registerResource(
VoidInvasionPortalsSpawnSystem.VoidInvasionData.class, VoidInvasionPortalsSpawnSystem.VoidInvasionData::new
);
class="kw">public VoidInvasionPortalsSpawnSystem() {
super(2.0F);
}
@Override
class="kw">public void tick(float var1, int var2, @Nonnull ArchetypeChunk<EntityStore> var3, @Nonnull Store<EntityStore> var4, @Nonnull CommandBuffer<EntityStore> var5) {
VoidEvent var6 = var3.getComponent(var2, VoidEvent.getComponentType());
assert var6 != null;
World var7 = var4.getExternalData().getWorld();
VoidInvasionPortalsSpawnSystem.VoidInvasionData var8 = var5.getResource(this.voidInvasionDataResourceType);
if (var8.findPortalSpawnPos == null) {
SpatialHashGrid var18 = cleanupAndGetSpawners(var6);
if (var18.size() < 24) {
var8.findPortalSpawnPos = findPortalSpawnPosition(var7, var6, var5);
}
} else if (var8.findPortalSpawnPos.isDone()) {
Vector3d var9;
try {
var9 = var8.findPortalSpawnPos.join();
var8.findPortalSpawnPos = null;
} catch (Throwable var17) {
((HytaleLogger.Api)LOGGER.at(Level.SEVERE).withCause(var17)).log("Error trying to find a void event spawn position");
class="kw">return;
}
if (var9 != null) {
Holder var10 = EntityStore.REGISTRY.newHolder();
var10.addComponent(VoidSpawner.getComponentType(), new VoidSpawner());
var10.addComponent(TransformComponent.getComponentType(), new TransformComponent(var9, new Rotation3f()));
Ref var11 = var5.addEntity(var10, AddReason.SPAWN);
var6.getVoidSpawners().add(var9, var11);
VoidEventConfig var12 = VoidEvent.getConfig(var7);
if (var12 == null) {
LOGGER.at(Level.WARNING).log("There's a Void Event entity but no void event config in the gameplay config");
} else {
InvasionPortalConfig var13 = var12.getInvasionPortalConfig();
Vector3i var14 = Vector3dUtil.toVector3i(var9);
long var15 = ChunkUtil.indexChunkFromBlock(var14.x, var14.z);
var7.getChunkAsync(var15)
.thenAcceptAsync(
var2x -> {
BlockType var3 = var13.getBlockType();
if (var3 == null) {
LOGGER.at(Level.WARNING)
.log("Failed to place invasion portal block at %s, %s, %s. Block type is not configured", var14.x, var14.y, var14.z);
} else {
var2x.setBlock(var14.x, var14.y, var14.z, var3, 4);
}
},
var7
);
}
}
}
}
@Nullable
class="kw">private class="kw">static CompletableFuture<Vector3d> findPortalSpawnPosition(@Nonnull World var0, @Nonnull VoidEvent var1, @Nonnull CommandBuffer<EntityStore> var2) {
PortalWorld var3 = var2.getResource(PortalWorld.getResourceType());
if (!var3.exists()) {
class="kw">return null;
}
Transform var4 = var3.getSpawnPoint();
if (var4 == null) {
class="kw">return null;
}
Vector3d var5 = var4.getPosition();
Transform var6 = findRandomPlayerTransform(var0, var2);
if (var6 == null) {
class="kw">return null;
}
Vector3d var7 = new Vector3d(var6.getPosition()).add(0.0, 5.0, 0.0);
Vector3d var8 = var6.getDirection();
SpatialHashGrid var9 = var1.getVoidSpawners();
NotNearAnyInHashGrid var10 = new NotNearAnyInHashGrid(var9, 62.0);
class="kw">return CompletableFuture.supplyAsync(
() -> new SearchCone(var8, 48.0, 64.0, 90.0, 8)
.filter(var10)
.filter(new NotNearPointXZ(var5, 18.0))
.then(new SearchBelow(12))
.filter(new FitsAPortal())
.execute(var0, var7)
.orElse(null),
var0
);
}
@Nullable
class="kw">private class="kw">static Transform findRandomPlayerTransform(@Nonnull World var0, @Nonnull CommandBuffer<EntityStore> var1) {
Collection var2 = var0.getPlayerRefs();
if (var2.isEmpty()) {
class="kw">return null;
}
List var3 = new ReferenceArrayList(var2.size());
for (PlayerRef var5 : var2) {
var3.add(var5.getReference());
}
Ref var6 = RandomUtil.selectRandom(var3);
TransformComponent var7 = var1.getComponent(var6, TransformComponent.getComponentType());
assert var7 != null;
class="kw">return var7.getTransform();
}
@Nonnull
class="kw">private class="kw">static SpatialHashGrid<Ref<EntityStore>> cleanupAndGetSpawners(@Nonnull VoidEvent var0) {
SpatialHashGrid var1 = var0.getVoidSpawners();
var1.removeIf(var0x -> !var0x.isValid());
class="kw">return var1;
}
@Nullable
@Override
class="kw">public Query<EntityStore> getQuery() {
class="kw">return VoidEvent.getComponentType();
}
class="kw">public class="kw">static class VoidInvasionData class="kw">implements Resource<EntityStore> {
@Nullable
class="kw">private CompletableFuture<Vector3d> findPortalSpawnPos;
class="kw">public VoidInvasionData() {
}
@Nullable
@Override
class="kw">public Resource<EntityStore> clone() {
class="kw">return new VoidInvasionPortalsSpawnSystem.VoidInvasionData();
}
}
}