EntityCollisionProvider class
Пакет: com.hypixel.hytale.server.core.modules.collision
Файл: com/hypixel/hytale/server/core/modules/collision/EntityCollisionProvider.java
Поля (12)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
int |
ALLOC_SIZE |
|
SpatialResource |
var10 |
|
SpatialResource |
var14 |
|
Archetype |
var2 |
|
boolean |
var3 |
|
Entity |
var3 |
|
BoundingBox |
var4 |
|
boolean |
var4 |
|
Box |
var5 |
|
TransformComponent |
var6 |
|
Vector3d |
var7 |
|
List |
var9 |
Методы (18)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
static |
void |
acceptNearestIgnorevoid acceptNearestIgnore(@Nonnull Ref<EntityStore> var0, @Nonnull EntityCollisionProvider var1, @Nonnull ComponentAccessor<EntityStore> var2) |
public |
void |
clearvoid clear() |
protected |
void |
clearRefsvoid clearRefs() |
public |
double |
computeNearestdouble computeNearest(@Nonnull Box var1,
@Nonnull Vector3d var2,
@Nonnull Vector3d var3,
@Nullable Ref<EntityStore> var4,
@Nullable Ref<EntityStore> var5,
@Nonnull ComponentAccessor<EntityStore> var6) |
public |
double |
computeNearestdouble computeNearest(@Nonnull Vector3d var1,
@Nonnull Vector3d var2,
@Nonnull Box var3,
double var4,
@Nonnull BiPredicate<Ref<EntityStore>, ComponentAccessor<EntityStore>> var6,
@Nullable Ref<EntityStore> var7,
@Nullable Ref<EntityStore> var8,
@Nonnull ComponentAccessor<EntityStore> var9) |
static |
boolean |
defaultEntityFilterboolean defaultEntityFilter(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) |
|
|
for for(int var1 = 0; var1 < this.contacts.length; var1++) |
|
|
for for(int var1 = 0; var1 < this.count; var1++) |
|
|
for for(Ref var12 : var9) |
|
|
for for(Ref var13 : var9) |
public |
int |
getCountint getCount() |
|
|
if if(this.count == 0) |
|
|
if if(var4 == null) |
|
|
if if(var3) |
|
|
if if(var3 != null) |
protected |
boolean |
isCollidingboolean isColliding(@Nonnull Ref<EntityStore> var1, @Nonnull Vector2d var2, @Nonnull ComponentAccessor<EntityStore> var3) |
protected |
void |
iterateEntitiesInSpherevoid iterateEntitiesInSphere(@Nonnull Vector3d var1,
@Nonnull Vector3d var2,
@Nonnull Box var3,
double var4,
@Nonnull BiConsumer<Ref<EntityStore>, EntityCollisionProvider> var6,
@Nonnull BiConsumer<Ref<EntityStore>, EntityCollisionProvider> var7,
@Nonnull ComponentAccessor<EntityStore> var8) |
protected |
void |
setContactvoid setContact(@Nonnull Ref<EntityStore> var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.modules.collision;
class="kw">import com.hypixel.hytale.component.Archetype;
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.math.shape.Box;
class="kw">import com.hypixel.hytale.server.core.entity.Entity;
class="kw">import com.hypixel.hytale.server.core.entity.EntityUtils;
class="kw">import com.hypixel.hytale.server.core.entity.entities.ProjectileComponent;
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.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.component.Projectile;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.List;
class="kw">import java.util.function.BiConsumer;
class="kw">import java.util.function.BiPredicate;
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">public class EntityCollisionProvider {
class="kw">protected class="kw">static class="kw">final int ALLOC_SIZE = 4;
class="kw">protected class="kw">static class="kw">final double EXTRA_DISTANCE = 8.0;
class="kw">protected EntityContactData[] contacts;
class="kw">protected EntityContactData[] sortBuffer;
class="kw">protected int count;
class="kw">protected class="kw">final Vector2d minMax = new Vector2d();
class="kw">protected class="kw">final Vector3d collisionPosition = new Vector3d();
class="kw">protected class="kw">final Box tempBox = new Box();
class="kw">protected double nearestCollisionStart;
@Nullable
class="kw">protected Vector3d position;
@Nullable
class="kw">protected Vector3d direction;
@Nullable
class="kw">protected Box boundingBox;
@Nullable
class="kw">protected BiPredicate<Ref<EntityStore>, ComponentAccessor<EntityStore>> entityFilter;
@Nullable
class="kw">protected Ref<EntityStore> ignoreSelf;
@Nullable
class="kw">protected Ref<EntityStore> ignoreOther;
class="kw">public EntityCollisionProvider() {
this.contacts = new EntityContactData[4];
this.sortBuffer = new EntityContactData[4];
for (int var1 = 0; var1 < this.contacts.length; var1++) {
this.contacts[var1] = new EntityContactData();
}
}
class="kw">public int getCount() {
class="kw">return this.count;
}
@Nonnull
class="kw">public EntityContactData getContact(int var1) {
class="kw">return this.contacts[var1];
}
class="kw">public void clear() {
for (int var1 = 0; var1 < this.count; var1++) {
this.contacts[var1].clear();
}
this.count = 0;
}
class="kw">public double computeNearest(
@Nonnull Box var1,
@Nonnull Vector3d var2,
@Nonnull Vector3d var3,
@Nullable Ref<EntityStore> var4,
@Nullable Ref<EntityStore> var5,
@Nonnull ComponentAccessor<EntityStore> var6
) {
class="kw">return this.computeNearest(var2, var3, var1, var3.length() + 8.0, EntityCollisionProvider::defaultEntityFilter, var4, var5, var6);
}
class="kw">public double computeNearest(
@Nonnull Vector3d var1,
@Nonnull Vector3d var2,
@Nonnull Box var3,
double var4,
@Nonnull BiPredicate<Ref<EntityStore>, ComponentAccessor<EntityStore>> var6,
@Nullable Ref<EntityStore> var7,
@Nullable Ref<EntityStore> var8,
@Nonnull ComponentAccessor<EntityStore> var9
) {
this.ignoreSelf = var7;
this.ignoreOther = var8;
this.nearestCollisionStart = Double.MAX_VALUE;
this.entityFilter = var6;
this.iterateEntitiesInSphere(
var1, var2, var3, var4, (var1x, var2x) -> acceptNearestIgnore(var1x, var2x, var9), (var1x, var2x) -> acceptNearestIgnore(var1x, var2x, var9), var9
);
if (this.count == 0) {
this.nearestCollisionStart = -Double.MAX_VALUE;
}
this.clearRefs();
this.ignoreSelf = null;
this.ignoreOther = null;
class="kw">return this.nearestCollisionStart;
}
class="kw">protected void iterateEntitiesInSphere(
@Nonnull Vector3d var1,
@Nonnull Vector3d var2,
@Nonnull Box var3,
double var4,
@Nonnull BiConsumer<Ref<EntityStore>, EntityCollisionProvider> var6,
@Nonnull BiConsumer<Ref<EntityStore>, EntityCollisionProvider> var7,
@Nonnull ComponentAccessor<EntityStore> var8
) {
this.position = var1;
this.direction = var2;
this.boundingBox = var3;
List var9 = SpatialResource.getThreadLocalReferenceList();
SpatialResource var10 = var8.getResource(EntityModule.get().getEntitySpatialResourceType());
var10.getSpatialStructure().collect(var1, var4, var9);
for (Ref var12 : var9) {
if (var12.isValid()) {
var6.accept(var12, this);
}
}
var9.clear();
SpatialResource var14 = var8.getResource(EntityModule.get().getPlayerSpatialResourceType());
var14.getSpatialStructure().collect(var1, var4, var9);
for (Ref var13 : var9) {
if (var13.isValid()) {
var7.accept(var13, this);
}
}
}
class="kw">protected void setContact(@Nonnull Ref<EntityStore> var1) {
this.collisionPosition.set(this.position).fma(this.minMax.x, this.direction);
this.contacts[0].assign(this.collisionPosition, this.minMax.x, this.minMax.y, var1, null);
this.count = 1;
}
class="kw">protected boolean isColliding(@Nonnull Ref<EntityStore> var1, @Nonnull Vector2d var2, @Nonnull ComponentAccessor<EntityStore> var3) {
BoundingBox var4 = var3.getComponent(var1, BoundingBox.getComponentType());
if (var4 == null) {
class="kw">return false;
}
Box var5 = var4.getBoundingBox();
TransformComponent var6 = var3.getComponent(var1, TransformComponent.getComponentType());
assert var6 != null;
Vector3d var7 = var6.getPosition();
class="kw">return CollisionMath.intersectSweptAABBs(this.position, this.direction, this.boundingBox, var7, var5, var2, this.tempBox) && var2.x <= 1.0;
}
class="kw">protected void clearRefs() {
this.position = null;
this.direction = null;
this.boundingBox = null;
this.entityFilter = null;
}
class="kw">public class="kw">static boolean defaultEntityFilter(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
Archetype var2 = var1.getArchetype(var0);
boolean var3 = var2.contains(Projectile.getComponentType()) || var2.contains(ProjectileComponent.getComponentType());
if (var3) {
class="kw">return false;
}
boolean var4 = var2.contains(DeathComponent.getComponentType());
class="kw">return var4 ? false : var0.isValid();
}
class="kw">protected class="kw">static void acceptNearestIgnore(
@Nonnull Ref<EntityStore> var0, @Nonnull EntityCollisionProvider var1, @Nonnull ComponentAccessor<EntityStore> var2
) {
Entity var3 = EntityUtils.getEntity(var0, var2);
if (var3 != null) {
if (var3.isCollidable()
&& !var0.equals(var1.ignoreSelf)
&& !var0.equals(var1.ignoreOther)
&& (var1.entityFilter == null || var1.entityFilter.test(var0, var2))
&& var1.isColliding(var0, var1.minMax, var2)
&& var1.minMax.x < var1.nearestCollisionStart) {
var1.nearestCollisionStart = var1.minMax.x;
var1.setContact(var0);
}
}
}
}