Projectile.java 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package eu.tankernn.gameEngine.entities.projectiles;
  2. import java.util.List;
  3. import org.lwjgl.util.vector.Vector3f;
  4. import eu.tankernn.gameEngine.entities.Entity3D;
  5. import eu.tankernn.gameEngine.loader.models.AABB;
  6. import eu.tankernn.gameEngine.loader.models.TexturedModel;
  7. import eu.tankernn.gameEngine.particles.ParticleSystem;
  8. import eu.tankernn.gameEngine.terrains.TerrainPack;
  9. public abstract class Projectile extends Entity3D {
  10. private ParticleSystem particleSystem;
  11. private final float range;
  12. private final Vector3f startPosition;
  13. public Projectile(TerrainPack terrain, TexturedModel model, Vector3f position, Vector3f velocity, float range, AABB boundingBox, ParticleSystem particleSystem) {
  14. super(model, position, new Vector3f(0, 0, 0), 1, boundingBox, terrain);
  15. this.particleSystem = particleSystem;
  16. this.velocity = velocity;
  17. this.range = range;
  18. this.startPosition = new Vector3f(position);
  19. }
  20. public void update() {
  21. super.update();
  22. particleSystem.setPosition(this.getPosition());
  23. if (this.terrain != null) {
  24. this.position.y = Math.max(this.position.y, 5 + terrain.getTerrainHeightByWorldPos(position.x, position.z));
  25. }
  26. Vector3f distance = Vector3f.sub(position, startPosition, null);
  27. if (distance.length() > range) {
  28. kill();
  29. }
  30. }
  31. public void checkCollision(List<Entity3D> entities) {
  32. entities.stream().filter((e) -> AABB.collides(e.getBoundingBox(), Projectile.this.getBoundingBox())).forEach(this::onCollision);
  33. }
  34. protected void kill() {
  35. particleSystem.remove();
  36. this.dead = true;
  37. }
  38. public abstract void onCollision(Entity3D entity);
  39. }