PortalSpawnFinder class
Пакет: com.hypixel.hytale.builtin.portals.ui
Файл: com/hypixel/hytale/builtin/portals/ui/PortalSpawnFinder.java
Поля (44)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
MAX_ATTEMPTS_PER_WORLD |
|
SOLID,
FLUID,
AIR, |
UNKNOWN |
|
|
break |
|
Vector3d |
var1 |
|
ChunkColumn |
var10 |
|
int |
var10 |
|
BlockChunk |
var11 |
|
int |
var11 |
|
int |
var12 |
|
PortalSpawnFinder.Material |
var13 |
|
BlockSection |
var13 |
|
PortalSpawnFinder.Material |
var14 |
|
int |
var14 |
|
boolean |
var15 |
|
BlockType |
var15 |
|
HLongSet |
var2 |
|
long |
var2 |
|
Vector3d |
var3 |
|
|
var3 |
|
List |
var3 |
|
Vector3d |
var3 |
|
int |
var3 |
|
Rotation3f |
var4 |
|
WorldChunk |
var4 |
|
int |
var4 |
|
WorldChunk |
var4 |
|
Vector3d |
var5 |
|
boolean |
var5 |
|
ThreadLocalRandom |
var5 |
|
int |
var5 |
|
long |
var6 |
|
int |
var6 |
|
World |
var6 |
|
int |
var6 |
|
Vector3d |
var7 |
|
int |
var7 |
|
ChunkStore |
var7 |
|
CompletableFuture |
var8 |
|
int |
var8 |
|
Ref |
var8 |
|
long |
var9 |
|
Vector3d |
var9 |
|
Store |
var9 |
|
int |
var9 |
Методы (17)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
Material Material() |
abstract |
return new |
Vector3dreturn new Vector3d(var1, var2 - var12, var3) |
abstract |
return |
findWithGroundBelowreturn findWithGroundBelow(var4, var5, 319, var6, 319, true) |
|
|
for for(int var6 = 0; var6 < 8; var6++) |
|
|
for for(int var12 = 0; var12 < var4; var12++) |
|
|
if if(var3 == null) |
|
|
if if(var3 != null) |
|
|
if if(var3 == null) |
|
|
if if(var4 != null) |
|
|
if if(var7 != null) |
|
|
if if(var10 == null) |
|
|
if if(var11 == null) |
|
|
if if(!var15) |
|
|
if if(var14 == PortalSpawnFinder.Material.SOLID) |
|
|
if if(var12 != 0) |
|
|
if if(var15 == null) |
|
|
if if(var4 == null) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.portals.ui;
class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.FitsAPortal;
class="kw">import com.hypixel.hytale.common.fastutil.HLongOpenHashSet;
class="kw">import com.hypixel.hytale.common.fastutil.HLongSet;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
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.collision.WorldUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">public class="kw">final class PortalSpawnFinder {
class="kw">private class="kw">static class="kw">final int MAX_ATTEMPTS_PER_WORLD = 10;
class="kw">private class="kw">static class="kw">final int QUALITY_ATTEMPTS = 2;
class="kw">private class="kw">static class="kw">final int CHECKS_PER_CHUNK = 8;
class="kw">private class="kw">static class="kw">final Vector3dc FALLBACK_POSITION = Vector3dUtil.ZERO;
class="kw">private class="kw">static class="kw">final int FALLBACK_MARGIN = 2;
class="kw">public PortalSpawnFinder() {
}
@Nonnull
class="kw">public class="kw">static CompletableFuture<Transform> computeSpawnTransform(@Nonnull World var0, @Nonnull List<Vector3d> var1) {
class="kw">return loadCandidateChunks(var0, var1)
.thenApplyAsync(
var2 -> {
Vector3d var3 = guesstimateFromHints(var0, var1);
if (var3 == null) {
var3 = findFallbackPositionOnGround(var0);
if (var3 != null) {
((HytaleLogger.Api)HytaleLogger.getLogger().atWarning())
.log("Had to use fallback spawn for portal spawn (%d attempts) in %s", 10, var0.getName());
}
}
if (var3 == null) {
((HytaleLogger.Api)HytaleLogger.getLogger().atWarning())
.log("Both dart and fallback spawn finder failed for portal spawn in %s", var0.getName());
class="kw">return null;
} else {
Rotation3f var4 = Rotation3f.lookAt(var3).mul(-1.0F);
var4.setPitch(0.0F);
var4.setRoll(0.0F);
class="kw">return new Transform(new Vector3d(var3).add(0.0, 0.5, 0.0), var4);
}
},
var0
);
}
@Nonnull
class="kw">private class="kw">static CompletableFuture<Void> loadCandidateChunks(@Nonnull World var0, @Nonnull List<Vector3d> var1) {
HLongSet var2 = new HLongOpenHashSet();
List var3 = new ArrayList<>();
for (int var4 = 0; var4 < Math.min(var1.size(), 10); var4++) {
Vector3d var5 = var1.get(var4);
long var6 = ChunkUtil.indexChunkFromBlock(var5.x, var5.z);
if (var2.add(var6)) {
CompletableFuture var8 = var0.getChunkStore()
.getChunkReferenceAsync(var6, 36)
.thenApplyAsync(
var1x -> var1x == null ? null : var0.getChunkStore().getStore().getComponent((Ref<ChunkStore>)var1x, WorldChunk.getComponentType()), var0
);
var3.add(var8);
}
}
long var9 = ChunkUtil.indexChunkFromBlock(FALLBACK_POSITION.x(), FALLBACK_POSITION.z());
if (var2.add(var9)) {
var3.add(var0.getChunkAsync(var9));
}
class="kw">return CompletableFuture.allOf(var3.toArray(new CompletableFuture[0]));
}
@Nullable
class="kw">private class="kw">static Vector3d guesstimateFromHints(World var0, List<Vector3d> var1) {
for (int var2 = 0; var2 < Math.min(var1.size(), 10); var2++) {
Vector3d var3 = var1.get(var2);
WorldChunk var4 = var0.getChunk(ChunkUtil.indexChunkFromBlock(var3.x, var3.z));
if (var4 != null) {
boolean var5 = var2 < 2;
int var6 = var5 ? (int)var3.y : 319;
Vector3d var7 = findGroundWithinChunk(var4, var6, var5);
if (var7 != null) {
((HytaleLogger.Api)HytaleLogger.getLogger().atInfo()).log("Found portal spawn %s on attempt #%d quality=%s", var7, var2 + 1, var5);
class="kw">return var7;
}
}
}
class="kw">return null;
}
@Nullable
class="kw">private class="kw">static Vector3d findGroundWithinChunk(@Nonnull WorldChunk var0, int var1, boolean var2) {
int var3 = ChunkUtil.minBlock(var0.getX());
int var4 = ChunkUtil.minBlock(var0.getZ());
ThreadLocalRandom var5 = ThreadLocalRandom.current();
for (int var6 = 0; var6 < 8; var6++) {
int var7 = var3 + var5.nextInt(2, 14);
int var8 = var4 + var5.nextInt(2, 14);
Vector3d var9 = findWithGroundBelow(var0, var7, var1, var8, var1, false);
if (var9 != null && (!var2 || FitsAPortal.check(var0.getWorld(), var9))) {
class="kw">return var9;
}
}
class="kw">return null;
}
@Nullable
class="kw">private class="kw">static Vector3d findWithGroundBelow(@Nonnull WorldChunk var0, int var1, int var2, int var3, int var4, boolean var5) {
World var6 = var0.getWorld();
ChunkStore var7 = var6.getChunkStore();
Ref var8 = var0.getReference();
if (var8 != null && var8.isValid()) {
Store var9 = var7.getStore();
ChunkColumn var10 = var9.getComponent(var8, ChunkColumn.getComponentType());
if (var10 == null) {
class="kw">return null;
}
BlockChunk var11 = var9.getComponent(var8, BlockChunk.getComponentType());
if (var11 == null) {
class="kw">return null;
}
for (int var12 = 0; var12 < var4; var12++) {
PortalSpawnFinder.Material var13 = getMaterial(var9, var10, var11, var1, var2 - var12, var3);
PortalSpawnFinder.Material var14 = getMaterial(var9, var10, var11, var1, var2 - var12 - 1, var3);
boolean var15 = var13 == PortalSpawnFinder.Material.AIR || var5 && var13 == PortalSpawnFinder.Material.FLUID;
if (!var15) {
break;
}
if (var14 == PortalSpawnFinder.Material.SOLID) {
class="kw">return new Vector3d(var1, var2 - var12, var3);
}
}
class="kw">return null;
} else {
class="kw">return null;
}
}
@Nonnull
class="kw">private class="kw">static PortalSpawnFinder.Material getMaterial(
@Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ChunkColumn var1, @Nonnull BlockChunk var2, double var3, double var5, double var7
) {
int var9 = (int)var3;
int var10 = (int)var5;
int var11 = (int)var7;
int var12 = WorldUtil.getFluidIdAtPosition(var0, var1, var9, var10, var11);
if (var12 != 0) {
class="kw">return PortalSpawnFinder.Material.FLUID;
}
BlockSection var13 = var2.getSectionAtBlockY(var10);
int var14 = var13.get(var9, var10, var11);
BlockType var15 = BlockType.getAssetMap().getAsset(var14);
if (var15 == null) {
class="kw">return PortalSpawnFinder.Material.UNKNOWN;
}
class="kw">return class="kw">switch (var15.getMaterial()) {
case Solid -> PortalSpawnFinder.Material.SOLID;
case Empty -> PortalSpawnFinder.Material.AIR;
};
}
@Nullable
class="kw">private class="kw">static Vector3d findFallbackPositionOnGround(@Nonnull World var0) {
Vector3d var1 = new Vector3d(FALLBACK_POSITION);
long var2 = ChunkUtil.indexChunkFromBlock(var1.x, var1.z);
WorldChunk var4 = var0.getChunk(var2);
if (var4 == null) {
class="kw">return null;
}
int var5 = ChunkUtil.minBlock(var4.getX()) + 2;
int var6 = ChunkUtil.minBlock(var4.getZ()) + 2;
class="kw">return findWithGroundBelow(var4, var5, 319, var6, 319, true);
}
class="kw">private enum Material {
SOLID,
FLUID,
AIR,
UNKNOWN;
Material() {
}
}
}