Browse Source

NPC start and some other tweaks

Tankernn 8 years ago
parent
commit
87ccff3314

+ 1 - 0
TODO.txt

@@ -1,3 +1,4 @@
+Floating-in-world text
 Texture atlases with the new model spec system.
 Multiplayer
 Modular GUIs

+ 0 - 244
src/main/java/eu/tankernn/gameEngine/MainLoop.java

@@ -1,244 +0,0 @@
-package eu.tankernn.gameEngine;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.Display;
-import org.lwjgl.opengl.GL30;
-import org.lwjgl.util.vector.Vector2f;
-import org.lwjgl.util.vector.Vector3f;
-import org.lwjgl.util.vector.Vector4f;
-
-import eu.tankernn.gameEngine.entities.Camera;
-import eu.tankernn.gameEngine.entities.Entity3D;
-import eu.tankernn.gameEngine.entities.Light;
-import eu.tankernn.gameEngine.entities.Player;
-import eu.tankernn.gameEngine.entities.PlayerCamera;
-import eu.tankernn.gameEngine.environmentMap.EnvironmentMapRenderer;
-import eu.tankernn.gameEngine.loader.Loader;
-import eu.tankernn.gameEngine.loader.font.FontType;
-import eu.tankernn.gameEngine.loader.font.GUIText;
-import eu.tankernn.gameEngine.loader.textures.TerrainTexturePack;
-import eu.tankernn.gameEngine.loader.textures.Texture;
-import eu.tankernn.gameEngine.particles.ParticleMaster;
-import eu.tankernn.gameEngine.particles.ParticleSystem;
-import eu.tankernn.gameEngine.particles.ParticleTexture;
-import eu.tankernn.gameEngine.postProcessing.PostProcessor;
-import eu.tankernn.gameEngine.renderEngine.DisplayManager;
-import eu.tankernn.gameEngine.renderEngine.Fbo;
-import eu.tankernn.gameEngine.renderEngine.MasterRenderer;
-import eu.tankernn.gameEngine.renderEngine.MultisampleMultitargetFbo;
-import eu.tankernn.gameEngine.renderEngine.Scene;
-import eu.tankernn.gameEngine.renderEngine.font.TextMaster;
-import eu.tankernn.gameEngine.renderEngine.gui.GuiRenderer;
-import eu.tankernn.gameEngine.renderEngine.gui.GuiTexture;
-import eu.tankernn.gameEngine.renderEngine.skybox.Skybox;
-import eu.tankernn.gameEngine.renderEngine.water.WaterMaster;
-import eu.tankernn.gameEngine.renderEngine.water.WaterTile;
-import eu.tankernn.gameEngine.settings.Settings;
-import eu.tankernn.gameEngine.terrains.Terrain;
-import eu.tankernn.gameEngine.terrains.TerrainPack;
-import eu.tankernn.gameEngine.util.DistanceSorter;
-import eu.tankernn.gameEngine.util.InternalFile;
-import eu.tankernn.gameEngine.util.MousePicker;
-
-public class MainLoop {
-
-	private static final int SEED = 1235;
-
-	// Skybox settings
-	public static final String[] TEXTURE_FILES = { "alps_ft", "alps_bk", "alps_up", "alps_dn", "alps_rt", "alps_lf", };
-	public static final String[] NIGHT_TEXTURE_FILES = { "midnight_ft", "midnight_bk", "midnight_up", "midnight_dn",
-			"midnight_rt", "midnight_lf" };
-
-	// Water settings
-	public static final String DUDV_MAP = "waterDUDV.png";
-	public static final String NORMAL_MAP = "waterNormalMap.png";
-
-	public static final boolean DEBUG = true;
-
-	static List<Entity3D> entities = new ArrayList<Entity3D>();
-	static List<Light> lights = new ArrayList<Light>();
-
-	public static void main(String[] args) throws IOException {
-		DisplayManager.createDisplay("Tankernn Game Engine tester");
-
-		Loader loader = new Loader();
-		loader.readModelSpecification(new InternalFile("models.json"));
-
-		// ### Terrain textures ###
-
-		Texture backgroundTexture = loader.loadTexture("grassy.png");
-		Texture rTexture = loader.loadTexture("dirt.png");
-		Texture gTexture = loader.loadTexture("pinkFlowers.png");
-		Texture bTexture = loader.loadTexture("path.png");
-
-		TerrainTexturePack texturePack = new TerrainTexturePack(backgroundTexture, rTexture, gTexture, bTexture);
-		Texture blendMap = loader.loadTexture("blendMap.png");
-
-		TerrainPack terrainPack = new TerrainPack(loader, texturePack, blendMap, SEED);
-
-		// Player
-		Entity3D entity = new Entity3D(loader.getModel(0), new Vector3f(0, 0, 20), new Vector3f(0, 0, 0), 1, loader.getBoundingBox(0));
-		entities.add(entity);
-		Player player = new Player(loader.getModel(0), new Vector3f(10, 0, 50), new Vector3f(0, 0, 0), 1, loader.getBoundingBox(0),
-				terrainPack);
-		entities.add(player);
-		Camera camera = new PlayerCamera(player, terrainPack);
-
-		InternalFile[] dayTextures = InternalFile.fromFilenames("skybox", TEXTURE_FILES, "png"),
-				nightTextures = InternalFile.fromFilenames("skybox", NIGHT_TEXTURE_FILES, "png");
-
-		Skybox skybox = new Skybox(loader, Texture.newCubeMap(dayTextures, 200), Texture.newCubeMap(nightTextures, 200), 200);
-
-		MasterRenderer renderer = new MasterRenderer(loader, camera, skybox);
-		ParticleMaster particleMaster = new ParticleMaster(loader, camera.getProjectionMatrix());
-		TextMaster textMaster = new TextMaster(loader);
-
-		FontType font = new FontType(loader.loadTexture("arial.png"), new InternalFile("arial.fnt"));
-		GUIText text = new GUIText("Sample text", 1, font, new Vector2f(0.5f, 0.0f), 0.5f, false).setColor(0, 1, 0);
-		GUIText fpsText = new GUIText("FPS: ", 1, font, new Vector2f(0.0f, 0.0f), 0.5f, false).setColor(1, 1, 1);
-		textMaster.loadText(fpsText);
-		textMaster.loadText(text);
-
-		// Barrel
-		Entity3D barrel = new Entity3D(loader.getModel(1), new Vector3f(75, 10, 75), new Vector3f(0, 0, 0), 1f, loader.getBoundingBox(1));
-		entities.add(barrel);
-
-		Light sun = new Light(new Vector3f(100000, 150000, -70000), new Vector3f(1f, 1f, 1f));
-		Light flashLight = new Light(new Vector3f(0, 10, -10), new Vector3f(2, 0, 0), new Vector3f(1, 0.01f, 0.002f));
-
-		lights.add(sun);
-		lights.add(flashLight);
-
-		// ### Random lantern generation ###
-
-		Random rand = new Random(SEED);
-
-		for (int i = 0; i < 100; i++) {
-			float x = rand.nextFloat() * 1000;
-			float z = rand.nextFloat() * 1000;
-
-			entities.add(new Entity3D(loader.getModel(2), new Vector3f(x, terrainPack.getTerrainHeightByWorldPos(x, z), z), new Vector3f(),
-					1, loader.getBoundingBox(2)));
-		}
-
-		terrainPack.addWaitingForTerrainHeight(entities.toArray(new Entity3D[entities.size()]));
-
-		// #### Water rendering ####
-		WaterMaster waterMaster = new WaterMaster(loader, loader.loadTexture(DUDV_MAP), loader.loadTexture(NORMAL_MAP),
-				camera);
-		WaterTile water = new WaterTile(75, 75, 0, 50);
-		waterMaster.addWaterTile(water);
-		waterMaster.addWaterTile(new WaterTile(175, 75, 0, 50));
-
-		// #### Gui rendering ####
-		List<GuiTexture> guis = new ArrayList<GuiTexture>();
-		GuiRenderer guiRenderer = new GuiRenderer(loader);
-
-		ParticleTexture particleTexture = new ParticleTexture(loader.loadTexture("particles/cosmic.png"), 4, true);
-		ParticleSystem ps = new ParticleSystem(particleTexture, 50, 10, 0.3f, 1);
-		particleMaster.addSystem(ps);
-
-		MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
-				Display.getHeight());
-		Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
-		Fbo outputFbo2 = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE);
-
-		PostProcessor postProcessor = new PostProcessor(loader);
-
-		MousePicker picker = new MousePicker(camera, camera.getProjectionMatrix(), entities, guis);
-
-		while (!Display.isCloseRequested()) {
-			barrel.increaseRotation(new Vector3f(0, 1, 0));
-			player.move();
-			terrainPack.update(player);
-			camera.update();
-			picker.update(terrainPack);
-
-			if (picker.getCurrentTerrainPoint() != null) {
-				Vector3f currentPoint = picker.getCurrentTerrainPoint();
-				flashLight.getPosition().set(currentPoint);
-				flashLight.getPosition().y = terrainPack.getTerrainHeightByWorldPos(currentPoint.x, currentPoint.z)
-						+ 1.0f;
-			}
-
-			if (picker.getCurrentEntity() != null) {
-				picker.getCurrentEntity().setScale(2);
-			}
-
-			if (picker.getCurrentGui() != null) {
-				if (Mouse.isButtonDown(0)) {
-					System.out.println("Clicked gui.");
-				}
-			}
-
-			// Update debug info
-			if (DEBUG) {
-				Terrain currentTerrain = terrainPack.getTerrainByWorldPos(player.getPosition().x,
-						player.getPosition().z);
-				if (currentTerrain != null) {
-					Vector3f pos = player.getPosition();
-					String textString = "X: " + Math.floor(pos.x) + " Y: " + Math.floor(pos.y) + " Z: "
-							+ Math.floor(pos.z) + " Current terrain: " + currentTerrain.getX() / Settings.TERRAIN_SIZE
-							+ ":" + currentTerrain.getZ() / Settings.TERRAIN_SIZE;
-					text.setText(textString);
-					fpsText.setText(String.format("FPS: %.2f", getFps()));
-				}
-			}
-
-			// Sort list of lights
-			DistanceSorter.sort(lights, camera);
-
-			renderer.renderShadowMap(entities, sun);
-
-			ps.setPosition(player.getPosition());
-			particleMaster.update(camera);
-
-			Scene scene = new Scene(entities, terrainPack, lights, camera, skybox);
-
-			EnvironmentMapRenderer.renderEnvironmentMap(scene.getEnvironmentMap(), scene, player.getPosition(),
-					renderer);
-
-			waterMaster.renderBuffers(renderer, scene);
-
-			multisampleFbo.bindFrameBuffer();
-
-			renderer.renderScene(scene, new Vector4f(0, 1, 0, Float.MAX_VALUE));
-			waterMaster.renderWater(camera, lights);
-			particleMaster.renderParticles(camera);
-
-			multisampleFbo.unbindFrameBuffer();
-
-			multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT0, outputFbo);
-			multisampleFbo.resolveToFbo(GL30.GL_COLOR_ATTACHMENT1, outputFbo2);
-			
-			postProcessor.doPostProcessing(outputFbo.getColourTexture(), outputFbo2.getColourTexture());
-
-			guiRenderer.render(guis);
-			textMaster.render();
-
-			DisplayManager.updateDisplay();
-		}
-
-		postProcessor.cleanUp();
-		outputFbo.cleanUp();
-		outputFbo2.cleanUp();
-		multisampleFbo.cleanUp();
-		particleMaster.cleanUp();
-		textMaster.cleanUp();
-		waterMaster.cleanUp();
-		guiRenderer.cleanUp();
-		renderer.cleanUp();
-		loader.cleanUp();
-		terrainPack.cleanUp();
-		DisplayManager.closeDisplay();
-	}
-
-	private static double getFps() {
-		return 1 / DisplayManager.getFrameTimeSeconds();
-	}
-}

+ 2 - 0
src/main/java/eu/tankernn/gameEngine/TankernnGame3D.java

@@ -44,6 +44,8 @@ public class TankernnGame3D extends TankernnGame {
 	protected TerrainPack terrainPack;
 	protected Player player;
 	
+	
+	
 	private MultisampleMultitargetFbo multisampleFbo = new MultisampleMultitargetFbo(Display.getWidth(),
 			Display.getHeight());
 	private Fbo outputFbo = new Fbo(Display.getWidth(), Display.getHeight(), Fbo.DEPTH_TEXTURE),

+ 1 - 21
src/main/java/eu/tankernn/gameEngine/entities/Car.java

@@ -6,8 +6,6 @@ import org.lwjgl.util.vector.Vector3f;
 import eu.tankernn.gameEngine.loader.models.AABB;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
-import eu.tankernn.gameEngine.settings.Physics;
-import eu.tankernn.gameEngine.terrains.Terrain;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
 
 public class Car extends Player {
@@ -22,25 +20,7 @@ public class Car extends Player {
 	@Override
 	public void move() {
 		checkInputs();
-		super.increaseRotation(new Vector3f(0, currentTurnSpeed * DisplayManager.getFrameTimeSeconds(), 0));
-		float distance = currentSpeed * DisplayManager.getFrameTimeSeconds();
-		float dx = (float) (distance * Math.sin(Math.toRadians(super.getRotation().y)));
-		float dz = (float) (distance * Math.cos(Math.toRadians(super.getRotation().y)));
-		super.increasePosition(new Vector3f(dx, 0, dz));
-
-		upwardsSpeed += Physics.GRAVITY * DisplayManager.getFrameTimeSeconds();
-		super.increasePosition(new Vector3f(0, upwardsSpeed * DisplayManager.getFrameTimeSeconds(), 0));
-
-		Terrain currentTerrain = terrainPack.getTerrainByWorldPos(this.getPosition().x, this.getPosition().z);
-
-		float terrainHeight = 0;
-		if (currentTerrain != null) {
-			terrainHeight = currentTerrain.getHeightOfTerrain(super.getPosition().x, super.getPosition().z);
-		}
-
-		if (super.getPosition().getY() < terrainHeight) {
-			super.getPosition().y = terrainHeight;
-		}
+		super.move();
 	}
 
 	@Override

+ 57 - 2
src/main/java/eu/tankernn/gameEngine/entities/Entity3D.java

@@ -1,27 +1,43 @@
 package eu.tankernn.gameEngine.entities;
 
+import java.util.concurrent.atomic.AtomicInteger;
+
 import org.lwjgl.util.vector.Vector3f;
 
 import eu.tankernn.gameEngine.animation.model.AnimatedModel;
 import eu.tankernn.gameEngine.loader.models.AABB;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
+import eu.tankernn.gameEngine.renderEngine.DisplayManager;
+import eu.tankernn.gameEngine.settings.Physics;
+import eu.tankernn.gameEngine.terrains.Terrain;
+import eu.tankernn.gameEngine.terrains.TerrainPack;
 import eu.tankernn.gameEngine.util.IPositionable;
 
 public class Entity3D implements IPositionable {
+	private static final AtomicInteger ID_GEN = new AtomicInteger();
+	
 	private TexturedModel model;
-	protected Vector3f position;
+	protected Vector3f position, velocity = new Vector3f(0, 0, 0);
 	private Vector3f rotation;
 	private float scale;
 	private AABB boundingBox;
 	protected boolean dead;
+	protected TerrainPack terrain;
+	private final int id;
 	
-	public Entity3D(TexturedModel model, Vector3f position, Vector3f rotation, float scale, AABB boundingBox) {
+	public Entity3D(TexturedModel model, Vector3f position, AABB boundingBox, TerrainPack terrain) {
+		this(model, position, new Vector3f(0, 0, 0), 1, boundingBox, terrain);
+	}
+	
+	public Entity3D(TexturedModel model, Vector3f position, Vector3f rotation, float scale, AABB boundingBox, TerrainPack terrain) {
 		this.model = model;
 		this.position = position;
 		this.rotation = rotation;
 		this.scale = scale;
 		this.boundingBox = boundingBox;
 		this.boundingBox.updatePosition(position);
+		this.terrain = terrain;
+		this.id = ID_GEN.incrementAndGet();
 	}
 	
 	public void increasePosition(Vector3f velocity) {
@@ -30,6 +46,31 @@ public class Entity3D implements IPositionable {
 		this.position.z += velocity.z;
 	}
 	
+	/**
+	 * Moves this entity in the direction of its rotation.
+	 * 
+	 * @param speed The speed with which to move the entity
+	 */
+	public void increasePosition(float speed) {
+		float distance = speed * DisplayManager.getFrameTimeSeconds();
+		float dx = (float) (distance * Math.sin(Math.toRadians(rotation.y)));
+		float dz = (float) (distance * Math.cos(Math.toRadians(rotation.y)));
+		velocity.y += Physics.GRAVITY * DisplayManager.getFrameTimeSeconds();
+		this.increasePosition(new Vector3f(dx, velocity.y * DisplayManager.getFrameTimeSeconds(), dz));
+		
+		Terrain currentTerrain = terrain.getTerrainByWorldPos(this.getPosition().x, this.getPosition().z);
+		
+		float terrainHeight = 0;
+		if (currentTerrain != null) {
+			terrainHeight = currentTerrain.getHeightOfTerrain(this.getPosition().x, this.getPosition().z);
+		}
+		
+		if (position.y < terrainHeight) {
+			velocity.y = 0;
+			position.y = terrainHeight;
+		}
+	}
+	
 	public void increaseRotation(Vector3f deltaRotation) {
 		Vector3f.add(this.rotation, deltaRotation, this.rotation);
 	}
@@ -76,4 +117,18 @@ public class Entity3D implements IPositionable {
 		return dead;
 	}
 	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj == null) return false;
+		if (obj instanceof Entity3D) {
+			return this.id == ((Entity3D) obj).id;
+		}
+		return super.equals(obj);
+	}
+	
+	@Override
+	public int hashCode() {
+		return id;
+	}
+	
 }

+ 8 - 27
src/main/java/eu/tankernn/gameEngine/entities/Player.java

@@ -8,7 +8,6 @@ import eu.tankernn.gameEngine.animation.model.AnimatedModel;
 import eu.tankernn.gameEngine.loader.models.AABB;
 import eu.tankernn.gameEngine.loader.models.TexturedModel;
 import eu.tankernn.gameEngine.renderEngine.DisplayManager;
-import eu.tankernn.gameEngine.settings.Physics;
 import eu.tankernn.gameEngine.terrains.Terrain;
 import eu.tankernn.gameEngine.terrains.TerrainPack;
 
@@ -22,45 +21,23 @@ public class Player extends Entity3D {
 	
 	protected float currentSpeed = 0;
 	protected float currentTurnSpeed = 0;
-	protected float upwardsSpeed = 0;
-	private boolean isInAir = false;
 	
 	private float height = 2.0f;
 	
 	public Player(TexturedModel model, Vector3f position, Vector3f rotation, float scale, AABB boundingBox, TerrainPack terrainPack) {
-		super(model, position, rotation, scale, boundingBox);
+		super(model, position, rotation, scale, boundingBox, terrainPack);
 		this.terrainPack = terrainPack;
 	}
 	
 	public void move() {
 		checkInputs();
 		super.increaseRotation(new Vector3f(0, currentTurnSpeed * DisplayManager.getFrameTimeSeconds(), 0));
-		float distance = currentSpeed * DisplayManager.getFrameTimeSeconds();
-		float dx = (float) (distance * Math.sin(Math.toRadians(super.getRotation().y)));
-		float dz = (float) (distance * Math.cos(Math.toRadians(super.getRotation().y)));
-		upwardsSpeed += Physics.GRAVITY * DisplayManager.getFrameTimeSeconds();
-		super.increasePosition(new Vector3f(dx, upwardsSpeed * DisplayManager.getFrameTimeSeconds(), dz));
-		
-		Terrain currentTerrain = terrainPack.getTerrainByWorldPos(this.getPosition().x, this.getPosition().z);
-		
-		float terrainHeight = 0;
-		if (currentTerrain != null) {
-			terrainHeight = currentTerrain.getHeightOfTerrain(super.getPosition().x, super.getPosition().z);
-		}
-		
-		if (super.getPosition().getY() < terrainHeight) {
-			upwardsSpeed = 0;
-			this.isInAir = false;
-			super.getPosition().y = terrainHeight;
-		} else {
-			this.isInAir = true;
-		}
+		super.increasePosition(currentSpeed);
 	}
 	
 	private void jump() {
-		if (!this.isInAir) {
-			this.upwardsSpeed = JUMP_POWER;
-			this.isInAir = true;
+		if (!this.isInAir()) {
+			this.velocity.y = JUMP_POWER;
 		}
 	}
 	
@@ -94,6 +71,10 @@ public class Player extends Entity3D {
 		}
 	}
 	
+	public boolean isInAir() {
+		return this.position.y > this.terrainPack.getTerrainHeightByWorldPos(this.position.x, this.position.z);
+	}
+	
 	public float getHeight() {
 		return height;
 	}

+ 56 - 0
src/main/java/eu/tankernn/gameEngine/entities/npc/NPC.java

@@ -0,0 +1,56 @@
+package eu.tankernn.gameEngine.entities.npc;
+
+import org.lwjgl.util.vector.Vector2f;
+import org.lwjgl.util.vector.Vector3f;
+
+import eu.tankernn.gameEngine.entities.Entity3D;
+import eu.tankernn.gameEngine.loader.models.AABB;
+import eu.tankernn.gameEngine.loader.models.TexturedModel;
+import eu.tankernn.gameEngine.renderEngine.DisplayManager;
+import eu.tankernn.gameEngine.terrains.TerrainPack;
+
+public class NPC extends Entity3D {
+	
+	private int health;
+	private final int maxHealth;
+	
+	// Roaming stuff, should probable be a component or something
+	private Vector2f targetPosition;
+	private RoamingArea area;
+	private float standbyTime, speed;
+	
+	public NPC(TexturedModel model, Vector3f position, int health, AABB boundingBox, RoamingArea area, float speed, TerrainPack terrainPack) {
+		super(model, position, boundingBox, terrainPack);
+		this.area = area;
+		this.speed = speed;
+		this.health = this.maxHealth = health;
+	}
+	
+	@Override
+	public void update() {
+		if (this.health <= 0)
+			this.dead = true;
+		
+		// Roaming stuff, should probable be a component or something
+		if (targetPosition == null) {
+			if (standbyTime > 0f)
+				standbyTime -= DisplayManager.getFrameTimeSeconds();
+			else
+				targetPosition = area.getPointInside();
+		} else {
+			Vector2f direction = (Vector2f) Vector2f.sub(targetPosition, new Vector2f(getPosition().x, getPosition().z), null);
+			if (direction.length() < 1f) { // Reached target
+				targetPosition = null;
+				standbyTime = (float) (Math.random() * 5);
+			}
+			this.getRotation().y = (float) Math.toDegrees(Math.atan2(direction.x, direction.y));
+			super.increasePosition(speed);
+		}
+		super.update();
+	}
+	
+	public void fullHeal() {
+		this.health = this.maxHealth;
+	}
+	
+}

+ 19 - 0
src/main/java/eu/tankernn/gameEngine/entities/npc/RoamingArea.java

@@ -0,0 +1,19 @@
+package eu.tankernn.gameEngine.entities.npc;
+
+import java.util.Random;
+
+import org.lwjgl.util.vector.Vector2f;
+
+public class RoamingArea {
+	private Vector2f a, b;
+	private Random rand = new Random();
+
+	public RoamingArea(Vector2f a, Vector2f b) {
+		this.a = a;
+		this.b = b;
+	}
+	
+	public Vector2f getPointInside() {
+		return new Vector2f(a.x + rand.nextFloat() * (b.x - a.x), a.y + rand.nextFloat() * (b.y - a.y));
+	}
+}

+ 2 - 5
src/main/java/eu/tankernn/gameEngine/entities/projectiles/Projectile.java

@@ -13,19 +13,16 @@ import eu.tankernn.gameEngine.terrains.TerrainPack;
 
 public abstract class Projectile extends Entity3D {
 	
-	protected Vector3f velocity;
 	private ParticleSystem particleSystem;
 	private final float range;
 	private final Vector3f startPosition;
-	private TerrainPack terrain;
 	
 	public Projectile(TerrainPack terrain, TexturedModel model, Vector3f position, Vector3f velocity, float range, AABB boundingBox, ParticleSystem particleSystem) {
-		super(model, position, new Vector3f(0, 0, 0), 1, boundingBox);
+		super(model, position, new Vector3f(0, 0, 0), 1, boundingBox, terrain);
 		this.particleSystem = particleSystem;
 		this.velocity = velocity;
 		this.range = range;
 		this.startPosition = new Vector3f(position);
-		this.terrain = terrain;
 	}
 	
 	public void update() {
@@ -44,7 +41,7 @@ public abstract class Projectile extends Entity3D {
 	}
 	
 	public void checkCollision(List<Entity3D> entities) {
-		entities.stream().filter((e) -> !e.equals(Projectile.this)).filter((e) -> AABB.collides(e.getBoundingBox(), Projectile.this.getBoundingBox())).forEach(this::onCollision);
+		entities.stream().filter((e) -> AABB.collides(e.getBoundingBox(), Projectile.this.getBoundingBox())).forEach(this::onCollision);
 	}
 
 	protected void kill() {

+ 8 - 8
src/main/java/eu/tankernn/gameEngine/entities/projectiles/TargetedProjectile.java

@@ -10,27 +10,27 @@ import eu.tankernn.gameEngine.terrains.TerrainPack;
 import eu.tankernn.gameEngine.util.IPositionable;
 
 public class TargetedProjectile extends Projectile {
-
+	
 	private IPositionable target;
 	private float speed;
-
-	public TargetedProjectile(TerrainPack terrain, TexturedModel model, Vector3f position, IPositionable target,
-			float speed, AABB boundingBox, ParticleSystem particleSystem) {
+	
+	public TargetedProjectile(TerrainPack terrain, TexturedModel model, Vector3f position, IPositionable target, float speed, AABB boundingBox, ParticleSystem particleSystem) {
 		super(terrain, model, position, new Vector3f(0, 0, 0), Float.MAX_VALUE, boundingBox, particleSystem);
 		this.target = target;
 		this.speed = speed;
 	}
-
+	
 	@Override
 	public void update() {
 		Vector3f direction = (Vector3f) Vector3f.sub(target.getPosition(), this.getPosition(), null).normalise();
 		this.velocity = (Vector3f) direction.scale(speed);
 		super.update();
 	}
-
+	
 	@Override
 	public void onCollision(Entity3D entity) {
-		this.kill();
+		if (entity.equals(target))
+			this.kill();
 	}
-
+	
 }

+ 1 - 0
src/main/java/eu/tankernn/gameEngine/settings/Settings.java

@@ -1,6 +1,7 @@
 package eu.tankernn.gameEngine.settings;
 
 public class Settings {
+	public static final String GAME_NAME = "Tankernn Game Engine";
 	//Display settings
 	public static final float FOV = 70;
 	public static final float NEAR_PLANE = 0.1f;