Index: trunk/src/world_entities/projectiles/boomerang_projectile.cc
===================================================================
--- trunk/src/world_entities/projectiles/boomerang_projectile.cc	(revision 9235)
+++ trunk/src/world_entities/projectiles/boomerang_projectile.cc	(revision 9235)
@@ -0,0 +1,215 @@
+
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific
+   main-programmer: Silvan Nellen
+   co-programmer:
+
+*/
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
+
+#include "boomerang_projectile.h"
+
+#include "state.h"
+#include "class_list.h"
+
+#include "dot_emitter.h"
+#include "sprite_particles.h"
+
+#include "debug.h"
+
+CREATE_FAST_FACTORY_STATIC(BoomerangProjectile, CL_BOOMERANG_PROJECTILE);
+
+/**
+ *  standard constructor
+*/
+BoomerangProjectile::BoomerangProjectile () : Projectile()
+{
+  this->setClassID(CL_BOOMERANG_PROJECTILE, "BoomerangProjectile");
+
+  this->loadModel("models/projectiles/orx-rocket.obj", 2.0);
+  this->loadExplosionSound("sound/explosions/explosion_4.wav");
+
+
+  this->setMinEnergy(1);
+  this->setHealthMax(10);
+  this->lifeSpan = 2.0;
+  this->agility = 3.5;
+  this->maxVelocity = 150;
+
+  this->emitter = new DotEmitter(100, 5, M_2_PI);
+  this->emitter->setParent(this);
+  this->emitter->setSpread(M_PI, M_PI);
+}
+
+
+/**
+ *  standard deconstructor
+*/
+BoomerangProjectile::~BoomerangProjectile ()
+{
+  // delete this->emitter;
+
+  /* this is normaly done by World.cc by deleting the ParticleEngine */
+  if (BoomerangProjectile::trailParticles != NULL && ClassList::getList(CL_BOOMERANG_PROJECTILE)->size() <= 1)
+  {
+    if (ClassList::exists(BoomerangProjectile::trailParticles, CL_PARTICLE_SYSTEM))
+      delete BoomerangProjectile::trailParticles;
+    BoomerangProjectile::trailParticles = NULL;
+  }
+  if (BoomerangProjectile::explosionParticles != NULL && ClassList::getList(CL_BOOMERANG_PROJECTILE)->size() <= 1)
+  {
+    if (ClassList::exists(BoomerangProjectile::explosionParticles, CL_PARTICLE_SYSTEM))
+      delete BoomerangProjectile::explosionParticles;
+    BoomerangProjectile::explosionParticles = NULL;
+  }
+
+}
+
+SpriteParticles* BoomerangProjectile::trailParticles = NULL;
+SpriteParticles* BoomerangProjectile::explosionParticles = NULL;
+
+
+
+void BoomerangProjectile::activate()
+{
+  if (unlikely(BoomerangProjectile::trailParticles == NULL))
+  {
+    BoomerangProjectile::trailParticles = new SpriteParticles(2000);
+    BoomerangProjectile::trailParticles->setName("BoomerangProjectileTrailParticles");
+    BoomerangProjectile::trailParticles->setMaterialTexture("maps/radial-trans-noise.png");
+    BoomerangProjectile::trailParticles->setLifeSpan(1.0, .3);
+    BoomerangProjectile::trailParticles->setRadius(0.0, .5);
+    BoomerangProjectile::trailParticles->setRadius(0.2, 4.0);
+    BoomerangProjectile::trailParticles->setRadius(.5, 1.5);
+    BoomerangProjectile::trailParticles->setRadius(1.0, 1.5);
+    BoomerangProjectile::trailParticles->setColor(0.0, 1,0,0,.7);
+    BoomerangProjectile::trailParticles->setColor(0.2, .8,.8,0,.5);
+    BoomerangProjectile::trailParticles->setColor(0.5, .8,.8,.8,.8);
+    BoomerangProjectile::trailParticles->setColor(1.0, .8,.8,.8,.0);
+  }
+  if (unlikely(BoomerangProjectile::explosionParticles == NULL))
+  {
+    BoomerangProjectile::explosionParticles = new SpriteParticles(200);
+    BoomerangProjectile::explosionParticles->setName("BoomerangProjectileExplosionParticles");
+    BoomerangProjectile::explosionParticles->setMaterialTexture("maps/radial-trans-noise.png");
+    BoomerangProjectile::explosionParticles->setLifeSpan(.5, .3);
+    BoomerangProjectile::explosionParticles->setRadius(0.0, 10);
+    BoomerangProjectile::explosionParticles->setRadius(.5, 15.0);
+    BoomerangProjectile::explosionParticles->setRadius(1.0, 10.0);
+    BoomerangProjectile::explosionParticles->setColor(0.0, 0,1,0,1);
+    BoomerangProjectile::explosionParticles->setColor(0.5, .8,.8,0,.8);
+    BoomerangProjectile::explosionParticles->setColor(0.8, .8,.8,.3,.8);
+    BoomerangProjectile::explosionParticles->setColor(1.0, 1,1,1,.0);
+  }
+
+  this->emitter->setSystem(BoomerangProjectile::trailParticles);
+
+  this->updateNode(0);
+  this->emitter->setEmissionRate(45.0);
+  this->emitter->setEmissionVelocity(0.0);
+
+  this->setHealth(10.0* (float)rand()/(float)RAND_MAX);
+}
+
+
+void BoomerangProjectile::deactivate()
+{
+  this->emitter->setSystem(NULL);
+  this->lifeCycle = 0.0;
+
+  this->toList(OM_DEAD);
+  this->removeNode();
+  BoomerangProjectile::fastFactory->kill(this);
+}
+
+
+void BoomerangProjectile::collidesWith(WorldEntity* entity, const Vector& location)
+{
+  if (this->hitEntity != entity)
+    this->destroy( entity );
+  this->hitEntity = entity;
+}
+
+/**
+ *  signal tick, time dependent things will be handled here
+ * @param time since last tick
+*/
+void BoomerangProjectile::tick (float time)
+{
+
+  Vector targetFarFarAway = this->getAbsCoor() + Vector(100000, 0, 0);
+
+  {
+    speed = velocity.len();
+    diffVector = ((targetFarFarAway - this->getAbsCoor()).getNormalized());
+
+    if(velocity.dot(diffVector) != 0)
+    {
+      correctionVector = (( ( diffVector *  (speed * speed/( velocity.dot(diffVector ) ) )) - velocity).getNormalized()) * agility;
+
+      if( (diffVector *  (speed * speed/( velocity.dot(diffVector ) ) ) -velocity).len() < agility )
+        velocity = ((diffVector *  (speed * speed/( velocity.dot(diffVector ) ) )).getNormalized())*agility;
+      else if(velocity.dot(diffVector) > 0)
+        velocity += correctionVector;
+      else if (velocity.dot(diffVector) < 0)
+        velocity -= correctionVector;
+    }
+    else
+      velocity += diffVector * agility;
+
+    this->setAbsDir(Quaternion(velocity, Vector(0,1,0)) * Quaternion ( -M_PI_2, Vector(0,1,0)));
+  }
+
+  velocity *= maxVelocity/velocity.len();
+  Vector v = this->velocity * (time);
+  this->shiftCoor(v);
+
+  if(this->tickLifeCycle(time))
+    this->deactivate();
+}
+
+/**
+ *  the function gets called, when the projectile is destroyed
+ */
+void BoomerangProjectile::destroy (WorldEntity* killer)
+{
+
+  printf("THIS SHOULD WORLk\n");
+
+  Projectile::destroy( killer );
+  PRINTF(5)("DESTROY BoomerangProjectile\n");
+  this->lifeCycle = .95; //!< @todo calculate this usefully.
+  this->emitter->setSystem(BoomerangProjectile::explosionParticles);
+
+  this->emitter->setEmissionRate(1000.0);
+  this->emitter->setEmissionVelocity(50.0);
+  //  this->deactivate();
+
+}
+
+
+void BoomerangProjectile::draw () const
+{
+  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+
+  float matrix[4][4];
+  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
+  this->getAbsDir().matrix (matrix);
+  glMultMatrixf((float*)matrix);
+  glScalef(2.0, 2.0, 2.0);
+  this->getModel()->draw();
+
+  glPopMatrix();
+
+}
+
Index: trunk/src/world_entities/projectiles/boomerang_projectile.h
===================================================================
--- trunk/src/world_entities/projectiles/boomerang_projectile.h	(revision 9235)
+++ trunk/src/world_entities/projectiles/boomerang_projectile.h	(revision 9235)
@@ -0,0 +1,50 @@
+/*!
+ * @file boomerang_projectile.h
+ * @brief a BoomerangProjectile Projectile
+*/
+
+#ifndef _BOOMERANG_PROJECTILE_H
+#define _BOOMERANG_PROJECTILE_H
+
+#include "projectile.h"
+
+class Weapon;
+class SpriteParticles;
+class ParticleEmitter;
+class FastFactory;
+class Aim;
+
+class BoomerangProjectile : public Projectile
+{
+  public:
+    BoomerangProjectile ();
+    virtual ~BoomerangProjectile ();
+
+    virtual void activate();
+    virtual void deactivate();
+
+    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+
+    virtual void destroy (WorldEntity* killer);
+
+    virtual void tick (float time);
+    virtual void draw () const;
+
+
+  private:
+    static FastFactory*               fastFactory;
+    static SpriteParticles*           trailParticles;
+    static SpriteParticles*           explosionParticles;
+
+    ParticleEmitter*                  emitter;
+    float                             agility;
+    float                             maxVelocity;
+    float                             speed;
+    Vector                            diffVector ;
+    Vector                            correctionVector;
+
+    WorldEntity* hitEntity; // FIXME TEMPORARY
+
+};
+
+#endif /* _BOOMERANG_PROJECTILE_H */
Index: trunk/src/world_entities/projectiles/guided_missile.cc
===================================================================
--- trunk/src/world_entities/projectiles/guided_missile.cc	(revision 9061)
+++ trunk/src/world_entities/projectiles/guided_missile.cc	(revision 9235)
@@ -35,5 +35,5 @@
   this->setClassID(CL_GUIDED_MISSILE, "GuidedMissile");
 
-  this->loadModel("models/projectiles/orx-rocket.obj", .3);
+  this->loadModel("models/projectiles/orx-rocket.obj", 2.0);
   this->loadExplosionSound("sound/explosions/explosion_4.wav");
 
@@ -88,7 +88,7 @@
     GuidedMissile::trailParticles->setLifeSpan(1.0, .3);
     GuidedMissile::trailParticles->setRadius(0.0, .5);
-    GuidedMissile::trailParticles->setRadius(0.2, 2.0);
-    GuidedMissile::trailParticles->setRadius(.5, .8);
-    GuidedMissile::trailParticles->setRadius(1.0, .8);
+    GuidedMissile::trailParticles->setRadius(0.2, 4.0);
+    GuidedMissile::trailParticles->setRadius(.5, 1.5);
+    GuidedMissile::trailParticles->setRadius(1.0, 1.5);
     GuidedMissile::trailParticles->setColor(0.0, 1,0,0,.7);
     GuidedMissile::trailParticles->setColor(0.2, .8,.8,0,.5);
@@ -135,5 +135,5 @@
 {
   if (this->hitEntity != entity)
-    this->destroy();
+    this->destroy( entity );
   this->hitEntity = entity;
 }
@@ -180,7 +180,10 @@
  *  the function gets called, when the projectile is destroyed
  */
-void GuidedMissile::destroy ()
-{
-  Projectile::destroy();
+void GuidedMissile::destroy (WorldEntity* killer)
+{
+
+  printf("THIS SHOULD WORLk\n");
+
+  Projectile::destroy( killer );
   PRINTF(5)("DESTROY GuidedMissile\n");
   this->lifeCycle = .95; //!< @todo calculate this usefully.
Index: trunk/src/world_entities/projectiles/guided_missile.h
===================================================================
--- trunk/src/world_entities/projectiles/guided_missile.h	(revision 9061)
+++ trunk/src/world_entities/projectiles/guided_missile.h	(revision 9235)
@@ -26,5 +26,5 @@
     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
-    virtual void destroy ();
+    virtual void destroy (WorldEntity* killer);
 
     virtual void tick (float time);
Index: trunk/src/world_entities/projectiles/hyperblast.cc
===================================================================
--- trunk/src/world_entities/projectiles/hyperblast.cc	(revision 9061)
+++ trunk/src/world_entities/projectiles/hyperblast.cc	(revision 9235)
@@ -126,7 +126,7 @@
  *  the function gets called, when the projectile is destroyed
 */
-void Hyperblast::destroy ()
+void Hyperblast::destroy (WorldEntity* killer)
 {
-  Projectile::destroy();
+  Projectile::destroy( killer );
 
   PRINTF(5)("DESTROY Hyperblast\n");
Index: trunk/src/world_entities/projectiles/hyperblast.h
===================================================================
--- trunk/src/world_entities/projectiles/hyperblast.h	(revision 9061)
+++ trunk/src/world_entities/projectiles/hyperblast.h	(revision 9235)
@@ -27,5 +27,5 @@
     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
-    virtual void destroy ();
+    virtual void destroy (WorldEntity* killer);
 
     virtual void tick (float time);
Index: trunk/src/world_entities/projectiles/laser.cc
===================================================================
--- trunk/src/world_entities/projectiles/laser.cc	(revision 9061)
+++ trunk/src/world_entities/projectiles/laser.cc	(revision 9235)
@@ -42,5 +42,5 @@
 
   this->setMinEnergy(10);
-  this->setHealthMax(10);
+  this->setHealthMax(0);
   this->lifeSpan = 5.0;
 
@@ -88,5 +88,6 @@
   }
 
-  this->setHealth(10);
+  this->setDamage(0);
+  this->setHealth(0);
 }
 
@@ -107,5 +108,5 @@
 {
   if (this->hitEntity != entity && entity->isA(CL_NPC))
-    this->destroy();
+    this->destroy( entity );
   this->hitEntity = entity;
 }
@@ -128,7 +129,7 @@
  *  the function gets called, when the projectile is destroyed
 */
-void Laser::destroy ()
+void Laser::destroy (WorldEntity* killer)
 {
-  Projectile::destroy();
+  Projectile::destroy( killer );
   PRINTF(5)("DESTROY Laser\n");
   this->lifeCycle = .95; //!< @todo calculate this usefully.
Index: trunk/src/world_entities/projectiles/laser.h
===================================================================
--- trunk/src/world_entities/projectiles/laser.h	(revision 9061)
+++ trunk/src/world_entities/projectiles/laser.h	(revision 9235)
@@ -27,5 +27,5 @@
     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
-    virtual void destroy ();
+    virtual void destroy (WorldEntity* killer);
 
     virtual void tick (float dt);
Index: trunk/src/world_entities/projectiles/projectile.cc
===================================================================
--- trunk/src/world_entities/projectiles/projectile.cc	(revision 9061)
+++ trunk/src/world_entities/projectiles/projectile.cc	(revision 9235)
@@ -41,5 +41,5 @@
   /* character attributes */
   this->setHealth(1.0f);
-  this->setDamage(100.0f); // default damage of a projectile set to 100.0 damage points
+  this->setDamage(1.0f); // default damage of a projectile set to 100.0 damage points
 
   this->explosionBuffer = NULL;
@@ -162,5 +162,5 @@
 
   if (this->tickLifeCycle(dt))
-    this->destroy();
+    this->destroy( NULL );
 }
 
@@ -169,5 +169,5 @@
  *  the function gets called, when the projectile is destroyed
 */
-void Projectile::destroy ()
+void Projectile::destroy (WorldEntity* killer)
 {
   if (this->explosionBuffer != NULL)
Index: trunk/src/world_entities/projectiles/projectile.h
===================================================================
--- trunk/src/world_entities/projectiles/projectile.h	(revision 9061)
+++ trunk/src/world_entities/projectiles/projectile.h	(revision 9235)
@@ -41,5 +41,5 @@
     virtual void deactivate() = 0;
 
-    virtual void destroy ();
+    virtual void destroy (WorldEntity* killer);
 
     virtual void tick (float dt);
Index: trunk/src/world_entities/projectiles/rail_projectile.cc
===================================================================
--- trunk/src/world_entities/projectiles/rail_projectile.cc	(revision 9235)
+++ trunk/src/world_entities/projectiles/rail_projectile.cc	(revision 9235)
@@ -0,0 +1,159 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2004 orx
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   ### File Specific
+   main-programmer: Patrick Boenzli
+   co-programmer: Benjamin Grauer
+
+*/
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
+
+#include "rail_projectile.h"
+
+#include "state.h"
+#include "class_list.h"
+#include "model.h"
+
+#include "dot_emitter.h"
+#include "sprite_particles.h"
+
+#include <cassert>
+#include "debug.h"
+
+using namespace std;
+
+CREATE_FAST_FACTORY_STATIC(RailProjectile, CL_RAIL_PROJECTILE);
+
+/**
+ *  standard constructor
+*/
+RailProjectile::RailProjectile () : Projectile()
+{
+  this->setClassID(CL_RAIL_PROJECTILE, "RailProjectile");
+
+  this->loadModel("models/projectiles/laser_projectile.obj", 100);
+
+  this->setMinEnergy(10);
+  this->setHealthMax(10);
+  this->lifeSpan = .5f;
+
+  this->emitter = new DotEmitter(100, 5, M_2_PI);
+  this->emitter->setParent(this);
+  this->emitter->setSpread(M_PI, M_PI);
+  this->emitter->setEmissionRate(300.0);
+  this->emitter->setEmissionVelocity(50.0);
+}
+
+
+/**
+ *  standard deconstructor
+*/
+RailProjectile::~RailProjectile ()
+{
+  // delete this->emitter;
+
+  /* this is normaly done by World.cc by deleting the ParticleEngine */
+  if (RailProjectile::explosionParticles != NULL && ClassList::getList(CL_RAIL_PROJECTILE)->size() <= 1)
+  {
+    //if (ClassList::exists(RailProjectile::explosionParticles, CL_PARTICLE_SYSTEM))
+    //  delete RailProjectile::explosionParticles;
+    PRINTF(1)("Deleting RailProjectile Particles\n");
+    RailProjectile::explosionParticles = NULL;
+  }
+
+}
+
+SpriteParticles* RailProjectile::explosionParticles = NULL;
+
+void RailProjectile::activate()
+{
+  if (unlikely(RailProjectile::explosionParticles == NULL))
+  {
+    RailProjectile::explosionParticles = new SpriteParticles(1000);
+    RailProjectile::explosionParticles->setName("RailProjectileExplosionParticles");
+    RailProjectile::explosionParticles->setLifeSpan(.5, .3);
+    RailProjectile::explosionParticles->setRadius(0.0, 10.0);
+    RailProjectile::explosionParticles->setRadius(.5, 6.0);
+    RailProjectile::explosionParticles->setRadius(1.0, 3.0);
+    RailProjectile::explosionParticles->setColor(0.0, 1,1,0,.9);
+    RailProjectile::explosionParticles->setColor(0.5, .8,.8,0,.5);
+    RailProjectile::explosionParticles->setColor(1.0, .8,.8,.7,.0);
+  }
+
+  this->setHealth(10);
+}
+
+
+void RailProjectile::deactivate()
+{
+  assert (RailProjectile::explosionParticles != NULL);
+  RailProjectile::explosionParticles->removeEmitter(this->emitter);
+  this->lifeCycle = 0.0;
+
+  this->toList(OM_NULL);
+  this->removeNode();
+  RailProjectile::fastFactory->kill(this);
+}
+
+
+void RailProjectile::collidesWith(WorldEntity* entity, const Vector& location)
+{
+  if (this->hitEntity != entity && entity->isA(CL_NPC))
+    this->destroy( entity );
+  this->hitEntity = entity;
+}
+
+/**
+ *  signal tick, time dependent things will be handled here
+ * @param dt time since last tick
+*/
+void RailProjectile::tick (float dt)
+{
+  //Vector v = *this->flightDirection * ( this->speed * time * 1000 + 0.1);
+  Vector v = this->velocity * dt;
+  this->shiftCoor(v);
+
+  if (this->tickLifeCycle(dt))
+    this->deactivate();
+}
+
+/**
+ *  the function gets called, when the projectile is destroyed
+*/
+void RailProjectile::destroy (WorldEntity* killer)
+{
+  Projectile::destroy( killer );
+  PRINTF(5)("DESTROY RailProjectile\n");
+  this->lifeCycle = .95; //!< @todo calculate this usefully.
+
+  this->emitter->setSystem(RailProjectile::explosionParticles);
+}
+
+
+void RailProjectile::draw () const
+{
+  glPushAttrib(GL_ENABLE_BIT);
+  glDisable(GL_LIGHTING);
+
+  WorldEntity::draw();
+/*  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+
+  float matrix[4][4];
+  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
+  this->getAbsDir().matrix (matrix);
+  glMultMatrixf((float*)matrix);
+  glScalef(2.0, 2.0, 2.0);
+  this->getModel()->draw();
+  glPopMatrix();*/
+
+  glPopAttrib();
+}
+
Index: trunk/src/world_entities/projectiles/rail_projectile.h
===================================================================
--- trunk/src/world_entities/projectiles/rail_projectile.h	(revision 9235)
+++ trunk/src/world_entities/projectiles/rail_projectile.h	(revision 9235)
@@ -0,0 +1,46 @@
+/*!
+ * @file rail_projectile.h
+ * @brief a projectile, that is been shooted by a weapon
+*/
+
+#ifndef _RAIL_PROJECTILE_H
+#define _RAIL_PROJECTILE_H
+
+#include "projectile.h"
+
+class Vector;
+class Weapon;
+class SpriteParticles;
+class ParticleEmitter;
+class FastFactory;
+
+class RailProjectile : public Projectile
+{
+  public:
+    RailProjectile ();
+    virtual ~RailProjectile ();
+
+
+    virtual void activate();
+    virtual void deactivate();
+
+    virtual void collidesWith(WorldEntity* entity, const Vector& location);
+
+    virtual void destroy (WorldEntity* killer);
+
+    virtual void tick (float dt);
+    virtual void draw () const;
+
+
+  private:
+    static FastFactory*               fastFactory;
+
+    static SpriteParticles*           explosionParticles;
+
+    ParticleEmitter*                  emitter;
+
+
+    WorldEntity* hitEntity; // FIXME TEMPORARY
+};
+
+#endif /* _RAIL_PROJECTILE_H */
Index: trunk/src/world_entities/projectiles/rocket.cc
===================================================================
--- trunk/src/world_entities/projectiles/rocket.cc	(revision 9061)
+++ trunk/src/world_entities/projectiles/rocket.cc	(revision 9235)
@@ -128,5 +128,5 @@
 {
   if (this->hitEntity != entity)
-    this->destroy();
+    this->destroy( entity );
   this->hitEntity = entity;
 }
@@ -149,7 +149,7 @@
  *  the function gets called, when the projectile is destroyed
 */
-void Rocket::destroy ()
+void Rocket::destroy (WorldEntity* killer)
 {
-  Projectile::destroy();
+  Projectile::destroy( killer );
 
   PRINTF(5)("DESTROY Rocket\n");
Index: trunk/src/world_entities/projectiles/rocket.h
===================================================================
--- trunk/src/world_entities/projectiles/rocket.h	(revision 9061)
+++ trunk/src/world_entities/projectiles/rocket.h	(revision 9235)
@@ -27,5 +27,5 @@
     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
-    virtual void destroy ();
+    virtual void destroy (WorldEntity* killer);
 
     virtual void tick (float time);
Index: trunk/src/world_entities/projectiles/test_bullet.cc
===================================================================
--- trunk/src/world_entities/projectiles/test_bullet.cc	(revision 9061)
+++ trunk/src/world_entities/projectiles/test_bullet.cc	(revision 9235)
@@ -119,5 +119,5 @@
 {
   if (this->hitEntity != entity && entity->isA(CL_NPC))
-    this->destroy();
+    this->destroy( entity );
   this->hitEntity = entity;
 }
@@ -147,5 +147,5 @@
  *  the function gets called, when the projectile is destroyed
 */
-void TestBullet::destroy ()
+void TestBullet::destroy (WorldEntity* killer)
 {
   PRINTF(5)("DESTROY TestBullet\n");
Index: trunk/src/world_entities/projectiles/test_bullet.h
===================================================================
--- trunk/src/world_entities/projectiles/test_bullet.h	(revision 9061)
+++ trunk/src/world_entities/projectiles/test_bullet.h	(revision 9235)
@@ -27,5 +27,5 @@
     virtual void collidesWith(WorldEntity* entity, const Vector& location);
 
-    virtual void destroy ();
+    virtual void destroy (WorldEntity* killer);
 
     virtual void tick (float time);
