mirror of https://github.com/Minestom/Minestom.git
170 lines
5.9 KiB
Java
170 lines
5.9 KiB
Java
package net.minestom.server.entity;
|
|
|
|
import net.minestom.testing.Env;
|
|
import net.minestom.testing.EnvTest;
|
|
import net.minestom.server.coordinate.Pos;
|
|
import net.minestom.server.instance.block.Block;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
@EnvTest
|
|
public class EntityLineOfSightIntegrationTest {
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSight(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(10, 42, 0)).join();
|
|
|
|
assertEquals(entity2, entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertTrue(entity.hasLineOfSight(entity2, true));
|
|
|
|
for (int z = -1; z <= 1; ++z) {
|
|
for (int y = 40; y <= 44; ++y) {
|
|
instance.setBlock(5, y, z, Block.STONE);
|
|
}
|
|
}
|
|
|
|
assertNull(entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertFalse(entity.hasLineOfSight(entity2, true));
|
|
}
|
|
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSightBehind(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(-10, 42, 0)).join();
|
|
|
|
assertNull(entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertFalse(entity.hasLineOfSight(entity2, true));
|
|
assertTrue(entity.hasLineOfSight(entity2, false));
|
|
|
|
for (int z = -1; z <= 1; ++z) {
|
|
for (int y = 40; y <= 44; ++y) {
|
|
instance.setBlock(-5, y, z, Block.STONE);
|
|
}
|
|
}
|
|
|
|
assertFalse(entity.hasLineOfSight(entity2, false));
|
|
}
|
|
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSightNearMiss(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(10, 42, 0.31)).join();
|
|
|
|
assertNull(entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertFalse(entity.hasLineOfSight(entity2, true));
|
|
assertTrue(entity.hasLineOfSight(entity2, false));
|
|
|
|
for (int z = -1; z <= 1; ++z) {
|
|
for (int y = 40; y <= 44; ++y) {
|
|
instance.setBlock(5, y, z, Block.STONE);
|
|
}
|
|
}
|
|
|
|
assertFalse(entity.hasLineOfSight(entity2, false));
|
|
}
|
|
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSightNearHit(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(10, 42, 0.3)).join();
|
|
|
|
assertEquals(entity2, entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertTrue(entity.hasLineOfSight(entity2, true));
|
|
assertTrue(entity.hasLineOfSight(entity2, false));
|
|
|
|
for (int z = -1; z <= 1; ++z) {
|
|
for (int y = 40; y <= 44; ++y) {
|
|
instance.setBlock(5, y, z, Block.STONE);
|
|
}
|
|
}
|
|
|
|
assertNull(entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertFalse(entity.hasLineOfSight(entity2, true));
|
|
assertFalse(entity.hasLineOfSight(entity2, false));
|
|
}
|
|
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSightCorrectOrder(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(10, 42, 0)).join();
|
|
|
|
var entity3 = new Entity(EntityTypes.ZOMBIE);
|
|
entity3.setInstance(instance, new Pos(5, 42, 0)).join();
|
|
|
|
assertEquals(entity3, entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertTrue(entity.hasLineOfSight(entity2, true));
|
|
assertTrue(entity.hasLineOfSight(entity2, false));
|
|
assertTrue(entity.hasLineOfSight(entity3, true));
|
|
assertTrue(entity.hasLineOfSight(entity3, false));
|
|
}
|
|
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSightBigMiss(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(10, 42, 10)).join();
|
|
|
|
assertNull(entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertFalse(entity.hasLineOfSight(entity2, true));
|
|
assertTrue(entity.hasLineOfSight(entity2, false));
|
|
}
|
|
@Test
|
|
public void entityPhysicsCheckLineOfSightLargeBoundingBox(Env env) {
|
|
var instance = env.createFlatInstance();
|
|
|
|
var entity = new Entity(EntityTypes.ZOMBIE);
|
|
entity.setInstance(instance, new Pos(0, 42, 0)).join();
|
|
entity.setView(-90, 0);
|
|
|
|
var entity2 = new Entity(EntityTypes.ZOMBIE);
|
|
entity2.setInstance(instance, new Pos(6, 42, 0)).join();
|
|
entity2.setBoundingBox(4.0, 2.0, 4.0);
|
|
|
|
for (int z = -1; z <= 1; ++z) {
|
|
for (int y = 40; y <= 44; ++y) {
|
|
instance.setBlock(5, y, z, Block.STONE);
|
|
}
|
|
}
|
|
|
|
assertEquals(entity2, entity.getLineOfSightEntity(20, (e) -> true));
|
|
assertTrue(entity.hasLineOfSight(entity2, true));
|
|
assertTrue(entity.hasLineOfSight(entity2, false));
|
|
}
|
|
}
|