/// <summary> /// Updates the list of active projectiles, checking for collisions with objects, NPCs, and the player, /// while also removing inactive projectiles /// </summary> public void updateProjectiles() { for (int i = 0; i < projectiles.Count; i++) { Projectile projectile = projectiles[i]; projectile.update(game, projectile.getOwner()); if (projectile.isActive()) { foreach (Npc n in npcs) { if (projectile.getOwner() == n) { if (collisionManager.collides(projectile, player)) { projectile.setActive(false); playerManager.damagePlayer(projectile.getDamage()); player.getHitsplat().playEffect(); } break; } else if (collisionManager.collides(projectile, n)) { projectile.setActive(false); n.deriveHealth(-projectile.getDamage()); n.setHit(true); n.resetCombatTicks(); n.getDisplayBar().update(n.getCurrentHealth(), n.getMaxHealth()); n.getHitsplat().setHit("" + projectile.getDamage()); n.getHitsplat().playEffect(); int exp = 4 * projectile.getDamage(); playerManager.incrementExperience(exp); PauseMenu pause = (PauseMenu)getScreen("Pause"); pause.setExperience(pause.getExperience() + exp); inputManager.setDropText("+ " + exp + " EXP"); break; } } if (projectile.isActive()) { foreach (GameObject e in objects) { if (collisionManager.collides(projectile, e)) { projectile.setActive(false); break; } } } if (projectile.isActive()) { foreach (Wall w in walls) { if (collisionManager.collides(projectile, w)) { projectile.setActive(false); break; } } } if (projectile.isActive()) { foreach (Door d in doors) { if (collisionManager.collides(projectile, d)) { projectile.setActive(false); break; } } } if (projectile.isActive()) { foreach (Barrier b in barriers) { if (!b.isOpen() && collisionManager.collides(projectile, b)) { projectile.setActive(false); break; } } } } if (!projectile.isActive()) { projectiles.RemoveAt(i); i--; } } }