TargetBuffer class
Пакет: com.hypixel.hytale.server.core.util
Файл: com/hypixel/hytale/server/core/util/TargetUtil.java
Поля (13)
| Модификаторы | Тип | Имя |
|---|---|---|
|
private final ComponentAccessor<ChunkStore> |
chunkStoreAccessor |
|
private BlockChunk |
currentBlockChunk |
|
private ChunkColumn |
currentChunkColumn |
|
private Ref<ChunkStore> |
currentChunkRef |
|
private int |
currentChunkX |
|
private int |
currentChunkZ |
|
int |
var3 |
|
int |
var4 |
|
long |
var5 |
|
private final World |
world |
|
private int |
x |
|
private int |
y |
|
private int |
z |
Методы (2)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
if if(this.currentChunkRef == null || var3 != this.currentChunkX || var4 != this.currentChunkZ) |
|
public void |
updateChunkpublic void updateChunk(int var1, int var2) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.util;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.function.predicate.BiIntPredicate;
class="kw">import com.hypixel.hytale.math.block.BlockUtil;
class="kw">import com.hypixel.hytale.math.iterator.BlockIterator;
class="kw">import com.hypixel.hytale.math.shape.Box;
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.server.core.modules.collision.CollisionMath;
class="kw">import com.hypixel.hytale.server.core.modules.collision.WorldUtil;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.section.BlockSection;
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 it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import java.util.Collection;
class="kw">import java.util.List;
class="kw">import java.util.function.IntPredicate;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2d;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class="kw">final class TargetUtil {
class="kw">private class="kw">static class="kw">final float ENTITY_TARGET_RADIUS = 8.0F;
class="kw">public TargetUtil() {
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlock(
@Nonnull World var0, @Nonnull BiIntPredicate var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14
) {
TargetUtil.TargetBuffer var16 = new TargetUtil.TargetBuffer(var0);
var16.updateChunk((int)var2, (int)var6);
boolean var17 = BlockIterator.iterate(
var2, var4, var6, var8, var10, var12, var14, (var1x, var2x, var3, var4x, var6x, var8x, var10x, var12x, var14x, var16x) -> {
if (var2x >= 0 && var2x < 320) {
var16x.updateChunk(var1x, var3);
if (var16x.currentBlockChunk != null && var16x.currentChunkColumn != null) {
var16x.x = var1x;
var16x.y = var2x;
var16x.z = var3;
BlockSection var17 = var16x.currentBlockChunk.getSectionAtBlockY(var2x);
int var18 = var17.get(var1x, var2x, var3);
int var19 = WorldUtil.getFluidIdAtPosition(var16x.chunkStoreAccessor, var16x.currentChunkColumn, var1x, var2x, var3);
class="kw">return !var1.test(var18, var19);
} else {
class="kw">return false;
}
} else {
class="kw">return false;
}
}, var16
);
class="kw">return var17 ? null : new Vector3i(var16.x, var16.y, var16.z);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlockOrigin(
@Nonnull World var0, @Nonnull BiIntPredicate var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14
) {
TargetUtil.TargetBuffer var16 = new TargetUtil.TargetBuffer(var0);
var16.updateChunk((int)var2, (int)var6);
boolean var17 = BlockIterator.iterate(
var2, var4, var6, var8, var10, var12, var14, (var1x, var2x, var3, var4x, var6x, var8x, var10x, var12x, var14x, var16x) -> {
if (var2x >= 0 && var2x < 320) {
var16x.updateChunk(var1x, var3);
if (var16x.currentBlockChunk != null && var16x.currentChunkColumn != null) {
BlockSection var17 = var16x.currentBlockChunk.getSectionAtBlockY(var2x);
int var18 = var17.get(var1x, var2x, var3);
int var19 = WorldUtil.getFluidIdAtPosition(var16x.chunkStoreAccessor, var16x.currentChunkColumn, var1x, var2x, var3);
if (var1.test(var18, var19)) {
class="kw">return true;
}
int var20 = var17.getFiller(var1x, var2x, var3);
var16x.x = var1x - FillerBlockUtil.unpackX(var20);
var16x.y = var2x - FillerBlockUtil.unpackY(var20);
var16x.z = var3 - FillerBlockUtil.unpackZ(var20);
class="kw">return false;
} else {
class="kw">return false;
}
} else {
class="kw">return false;
}
}, var16
);
class="kw">return var17 ? null : new Vector3i(var16.x, var16.y, var16.z);
}
@Nullable
class="kw">public class="kw">static Vector3d getTargetLocation(
@Nonnull World var0, @Nonnull IntPredicate var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14
) {
TargetUtil.TargetBufferLocation var16 = new TargetUtil.TargetBufferLocation(var0);
var16.updateChunk((int)var2, (int)var6);
boolean var17 = BlockIterator.iterate(
var2, var4, var6, var8, var10, var12, var14, (var1x, var2x, var3, var4x, var6x, var8x, var10x, var12x, var14x, var16x) -> {
if (var2x >= 0 && var2x < 320) {
var16x.updateChunk(var1x, var3);
if (var16x.currentBlockChunk == null) {
class="kw">return false;
}
var16x.x = var1x + var4x;
var16x.y = var2x + var6x;
var16x.z = var3 + var8x;
BlockSection var17 = var16x.currentBlockChunk.getSectionAtBlockY(var2x);
int var18 = var17.get(var1x, var2x, var3);
class="kw">return !var1.test(var18);
} else {
class="kw">return false;
}
}, var16
);
class="kw">return var17 ? null : new Vector3d(var16.x, var16.y, var16.z);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlockAvoidLocations(
@Nonnull World var0,
@Nonnull IntPredicate var1,
double var2,
double var4,
double var6,
double var8,
double var10,
double var12,
double var14,
@Nonnull Collection<LongOpenHashSet> var16
) {
TargetUtil.TargetBuffer var17 = new TargetUtil.TargetBuffer(var0);
var17.updateChunk((int)var2, (int)var6);
boolean var18 = BlockIterator.iterate(
var2, var4, var6, var8, var10, var12, var14, (var2x, var3, var4x, var5, var7, var9, var11, var13, var15, var17x) -> {
if (var3 >= 0 && var3 < 320) {
var17x.updateChunk(var2x, var4x);
if (var17x.currentBlockChunk == null) {
class="kw">return false;
}
var17x.x = var2x;
var17x.y = var3;
var17x.z = var4x;
BlockSection var18 = var17x.currentBlockChunk.getSectionAtBlockY(var3);
int var19 = var18.get(var2x, var3, var4x);
if (var19 != 0) {
long var20 = BlockUtil.pack(var2x, var3, var4x);
for (LongOpenHashSet var23 : var16) {
if (var23.contains(var20)) {
class="kw">return true;
}
}
}
class="kw">return !var1.test(var19);
} else {
class="kw">return false;
}
}, var17
);
class="kw">return var18 ? null : new Vector3i(var17.x, var17.y, var17.z);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlockAvoidLocations(
@Nonnull World var0,
@Nonnull IntPredicate var1,
double var2,
double var4,
double var6,
double var8,
double var10,
double var12,
double var14,
@Nonnull Collection<LongOpenHashSet> var16,
@Nonnull Vector3d var17
) {
TargetUtil.TargetBuffer var18 = new TargetUtil.TargetBuffer(var0);
var18.updateChunk((int)var2, (int)var6);
boolean var19 = BlockIterator.iterate(
var2, var4, var6, var8, var10, var12, var14, (var3, var4x, var5, var6x, var8x, var10x, var12x, var14x, var16x, var18x) -> {
if (var4x >= 0 && var4x < 320) {
var18x.updateChunk(var3, var5);
if (var18x.currentBlockChunk == null) {
class="kw">return false;
}
var18x.x = var3;
var18x.y = var4x;
var18x.z = var5;
var17.x = var3 + var6x;
var17.y = var4x + var8x;
var17.z = var5 + var10x;
BlockSection var19 = var18x.currentBlockChunk.getSectionAtBlockY(var4x);
int var20 = var19.get(var3, var4x, var5);
if (var20 != 0) {
long var21 = BlockUtil.pack(var3, var4x, var5);
for (LongOpenHashSet var24 : var16) {
if (var24.contains(var21)) {
class="kw">return true;
}
}
}
class="kw">return !var1.test(var20);
} else {
class="kw">return false;
}
}, var18
);
class="kw">return var19 ? null : new Vector3i(var18.x, var18.y, var18.z);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlock(@Nonnull Ref<EntityStore> var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
class="kw">return getTargetBlock(var0, var0x -> var0x != 0, var1, var3);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlock(@Nonnull Ref<EntityStore> var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
World var5 = var4.getExternalData().getWorld();
Transform var6 = getLook(var0, var4);
Vector3d var7 = var6.getPosition();
Vector3d var8 = var6.getDirection();
class="kw">return getTargetBlock(var5, (var1x, var2x) -> var1.test(var1x), var7.x, var7.y, var7.z, var8.x, var8.y, var8.z, var2);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlockOrigin(@Nonnull Ref<EntityStore> var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
class="kw">return getTargetBlockOrigin(var0, var0x -> var0x != 0, var1, var3);
}
@Nullable
class="kw">public class="kw">static Vector3i getTargetBlockOrigin(
@Nonnull Ref<EntityStore> var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4
) {
World var5 = var4.getExternalData().getWorld();
Transform var6 = getLook(var0, var4);
Vector3d var7 = var6.getPosition();
Vector3d var8 = var6.getDirection();
class="kw">return getTargetBlockOrigin(var5, (var1x, var2x) -> var1.test(var1x), var7.x, var7.y, var7.z, var8.x, var8.y, var8.z, var2);
}
@Nullable
class="kw">public class="kw">static Vector3d getTargetLocation(@Nonnull Ref<EntityStore> var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
class="kw">return getTargetLocation(var0, var0x -> var0x != 0, var1, var3);
}
@Nullable
class="kw">public class="kw">static Vector3d getTargetLocation(
@Nonnull Ref<EntityStore> var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4
) {
Transform var5 = getLook(var0, var4);
class="kw">return getTargetLocation(var5, var1, var2, var4);
}
@Nullable
class="kw">public class="kw">static Vector3d getTargetLocation(@Nonnull Transform var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
World var5 = var4.getExternalData().getWorld();
Vector3d var6 = var0.getPosition();
Vector3d var7 = var0.getDirection();
class="kw">return getTargetLocation(var5, var1, var6.x, var6.y, var6.z, var7.x, var7.y, var7.z, var2);
}
@Nonnull
class="kw">public class="kw">static List<Ref<EntityStore>> getAllEntitiesInSphere(@Nonnull Vector3d var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
List var4 = SpatialResource.getThreadLocalReferenceList();
SpatialResource var5 = var3.getResource(EntityModule.get().getEntitySpatialResourceType());
var5.getSpatialStructure().collect(var0, (float)var1, var4);
SpatialResource var6 = var3.getResource(EntityModule.get().getPlayerSpatialResourceType());
var6.getSpatialStructure().collect(var0, (float)var1, var4);
class="kw">return var4;
}
@Nonnull
class="kw">public class="kw">static List<Ref<EntityStore>> getAllEntitiesInCylinder(@Nonnull Vector3d var0, double var1, double var3, @Nonnull ComponentAccessor<EntityStore> var5) {
List var6 = SpatialResource.getThreadLocalReferenceList();
SpatialResource var7 = var5.getResource(EntityModule.get().getEntitySpatialResourceType());
var7.getSpatialStructure().collectCylinder(var0, var1, var3, var6);
SpatialResource var8 = var5.getResource(EntityModule.get().getPlayerSpatialResourceType());
var8.getSpatialStructure().collectCylinder(var0, var1, var3, var6);
class="kw">return var6;
}
@Nonnull
class="kw">public class="kw">static List<Ref<EntityStore>> getAllEntitiesInBox(@Nonnull Vector3d var0, @Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2) {
List var3 = SpatialResource.getThreadLocalReferenceList();
SpatialResource var4 = var2.getResource(EntityModule.get().getEntitySpatialResourceType());
var4.getSpatialStructure().collectBox(var0, var1, var3);
SpatialResource var5 = var2.getResource(EntityModule.get().getPlayerSpatialResourceType());
var5.getSpatialStructure().collectBox(var0, var1, var3);
class="kw">return var3;
}
@Nullable
class="kw">public class="kw">static Ref<EntityStore> getTargetEntity(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
class="kw">return getTargetEntity(var0, 8.0F, var1);
}
@Nullable
class="kw">public class="kw">static Ref<EntityStore> getTargetEntity(@Nonnull Ref<EntityStore> var0, float var1, @Nonnull ComponentAccessor<EntityStore> var2) {
class="kw">return getTargetEntity(var0, var1, false, var2);
}
@Nullable
class="kw">public class="kw">static Ref<EntityStore> getTargetEntity(@Nonnull Ref<EntityStore> var0, float var1, boolean var2, @Nonnull ComponentAccessor<EntityStore> var3) {
TransformComponent var4 = var3.getComponent(var0, TransformComponent.getComponentType());
assert var4 != null;
Vector3d var5 = var4.getPosition();
Transform var6 = getLook(var0, var3);
Vector3d var7 = var6.getPosition();
Vector3d var8 = var6.getDirection();
List var9 = getAllEntitiesInSphere(var7, var1, var3);
if (var2) {
SpatialResource var10 = var3.getResource(EntityModule.get().getItemSpatialResourceType());
var10.getSpatialStructure().collect(var7, var1, var9);
}
var9.removeIf(var4x -> var4x != null && var4x.isValid() && !var4x.equals(var0) ? !isHitByRay((Ref<EntityStore>)var4x, var7, var8, var3) : true);
if (var9.isEmpty()) {
class="kw">return null;
}
Ref var18 = null;
double var11 = Double.MAX_VALUE;
for (Ref var14 : var9) {
if (var14 != null && var14.isValid()) {
TransformComponent var15 = var3.getComponent(var14, TransformComponent.getComponentType());
assert var15 != null;
double var16 = var5.distanceSquared(var15.getPosition());
if (var16 < var11) {
var11 = var16;
var18 = var14;
}
}
}
class="kw">return var18;
}
@Nonnull
class="kw">public class="kw">static Transform getLook(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
TransformComponent var2 = var1.getComponent(var0, TransformComponent.getComponentType());
assert var2 != null;
float var3 = ModelComponent.getEyeHeight(var0, var1);
HeadRotation var4 = var1.getComponent(var0, HeadRotation.getComponentType());
assert var4 != null;
Vector3d var5 = var2.getPosition();
Rotation3f var6 = var4.getRotation();
class="kw">return new Transform(var5.x(), var5.y() + var3, var5.z(), var6.pitch(), var6.yaw(), var6.roll());
}
class="kw">private class="kw">static boolean isHitByRay(
@Nonnull Ref<EntityStore> var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3
) {
BoundingBox var4 = var3.getComponent(var0, BoundingBox.getComponentType());
TransformComponent var5 = var3.getComponent(var0, TransformComponent.getComponentType());
assert var5 != null;
if (var4 == null) {
class="kw">return false;
}
Box var6 = var4.getBoundingBox();
Vector3d var7 = var5.getPosition();
Vector2d var8 = new Vector2d();
class="kw">return CollisionMath.intersectRayAABB(var1, var2, var7.x(), var7.y(), var7.z(), var6, var8);
}
class="kw">private class="kw">static class TargetBuffer {
@Nonnull
class="kw">private class="kw">final World world;
@Nonnull
class="kw">private class="kw">final ComponentAccessor<ChunkStore> chunkStoreAccessor;
class="kw">private int x;
class="kw">private int y;
class="kw">private int z;
class="kw">private int currentChunkX;
class="kw">private int currentChunkZ;
@Nullable
class="kw">private Ref<ChunkStore> currentChunkRef;
@Nullable
class="kw">private ChunkColumn currentChunkColumn;
@Nullable
class="kw">private BlockChunk currentBlockChunk;
class="kw">public TargetBuffer(@Nonnull World var1) {
this.world = var1;
this.chunkStoreAccessor = var1.getChunkStore().getStore();
}
class="kw">public void updateChunk(int var1, int var2) {
int var3 = ChunkUtil.chunkCoordinate(var1);
int var4 = ChunkUtil.chunkCoordinate(var2);
if (this.currentChunkRef == null || var3 != this.currentChunkX || var4 != this.currentChunkZ) {
this.currentChunkX = var3;
this.currentChunkZ = var4;
long var5 = ChunkUtil.indexChunk(var3, var4);
this.currentChunkRef = this.world.getChunkStore().getChunkReference(var5);
if (this.currentChunkRef != null && this.currentChunkRef.isValid()) {
this.currentChunkColumn = this.chunkStoreAccessor.getComponent(this.currentChunkRef, ChunkColumn.getComponentType());
this.currentBlockChunk = this.chunkStoreAccessor.getComponent(this.currentChunkRef, BlockChunk.getComponentType());
} else {
this.currentChunkColumn = null;
this.currentBlockChunk = null;
}
}
}
}
class="kw">private class="kw">static class TargetBufferLocation {
@Nonnull
class="kw">public class="kw">final World world;
@Nonnull
class="kw">public class="kw">final ComponentAccessor<ChunkStore> chunkStoreAccessor;
class="kw">private double x;
class="kw">private double y;
class="kw">private double z;
class="kw">private int currentChunkX;
class="kw">private int currentChunkZ;
@Nullable
class="kw">public Ref<ChunkStore> currentChunkRef;
@Nullable
class="kw">public BlockChunk currentBlockChunk;
class="kw">public TargetBufferLocation(@Nonnull World var1) {
this.world = var1;
this.chunkStoreAccessor = var1.getChunkStore().getStore();
}
class="kw">public void updateChunk(int var1, int var2) {
int var3 = ChunkUtil.chunkCoordinate(var1);
int var4 = ChunkUtil.chunkCoordinate(var2);
if (this.currentChunkRef == null || var3 != this.currentChunkX || var4 != this.currentChunkZ) {
this.currentChunkX = var3;
this.currentChunkZ = var4;
long var5 = ChunkUtil.indexChunk(var3, var4);
this.currentChunkRef = this.world.getChunkStore().getChunkReference(var5);
if (this.currentChunkRef != null && this.currentChunkRef.isValid()) {
this.currentBlockChunk = this.chunkStoreAccessor.getComponent(this.currentChunkRef, BlockChunk.getComponentType());
} else {
this.currentBlockChunk = null;
}
}
}
}
}