Index: code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.cc
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.cc	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.cc	(revision 9995)
@@ -141,4 +141,67 @@
     }
 
+    bool BasicProjectile::customProcessCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint, const btCollisionShape* cs)
+        {
+            if (!this->bDestroy_ && GameMode::isMaster())
+            {
+                if (otherObject == this->getShooter()) // Prevents you from shooting yourself
+                    return false;
+
+                this->bDestroy_ = true; // If something is hit, the object is destroyed and can't hit something else.
+                                        // The projectile is destroyed by its tick()-function (in the following tick).
+
+                Pawn* victim = orxonox_cast<Pawn*>(otherObject); // If otherObject isn't a Pawn, then victim is NULL
+
+                WorldEntity* entity = orxonox_cast<WorldEntity*>(this);
+                assert(entity); // The projectile must not be a WorldEntity.
+
+                // If visual effects after destruction cause problems, put this block below the effects code block
+                if (victim)
+                {
+                    victim->customHit(this->getShooter(), contactPoint, cs, this->getDamage(), this->getHealthDamage(), this->getShieldDamage());
+                    victim->startReloadCountdown();
+                }
+
+                // Visual effects for being hit, depending on whether the shield is hit or not
+                if (this->getShooter()) // If the owner does not exist (anymore?), no effects are displayed.
+                {
+                    // Damping and explosion effect is only played if the victim is no Pawn (see cast above)
+                    // or if the victim is a Pawn, has no shield left, is still alive and any damage goes to the health
+                    if (!victim || (victim && !victim->hasShield() && victim->getHealth() > 0.0f && (this->getDamage() > 0.0f || this->getHealthDamage() > 0.0f)))
+                    {
+                        {
+                            ParticleSpawner* effect = new ParticleSpawner(this->getShooter()->getContext());
+                            effect->setPosition(entity->getPosition());
+                            effect->setOrientation(entity->getOrientation());
+                            effect->setDestroyAfterLife(true);
+                            effect->setSource("Orxonox/explosion3");
+                            effect->setLifetime(2.0f);
+                        }
+                        // Second effect with same condition
+                        {
+                            ParticleSpawner* effect = new ParticleSpawner(this->getShooter()->getContext());
+                            effect->setPosition(entity->getPosition());
+                            effect->setOrientation(entity->getOrientation());
+                            effect->setDestroyAfterLife(true);
+                            effect->setSource("Orxonox/smoke4");
+                            effect->setLifetime(3.0f);
+                        }
+                    }
+
+                    // victim->isAlive() is not false until the next tick, so getHealth() > 0 is used instead
+                    if (victim && victim->hasShield() && (this->getDamage() > 0.0f || this->getShieldDamage() > 0.0f) && victim->getHealth() > 0.0f)
+                    {
+                        ParticleSpawner* effect = new ParticleSpawner(this->getShooter()->getContext());
+                        effect->setDestroyAfterLife(true);
+                        effect->setSource("Orxonox/Shield");
+                        effect->setLifetime(0.5f);
+                        victim->attach(effect);
+                    }
+                }
+                return true;
+            }
+            return false;
+        }
+
     /**
     @brief
Index: code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.h
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.h	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/BasicProjectile.h	(revision 9995)
@@ -120,4 +120,5 @@
         protected:
             bool processCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint);
+            bool customProcessCollision(WorldEntity* otherObject, btManifoldPoint& contactPoint, const btCollisionShape* cs);
             void destroyCheck(void);
 
Index: code/branches/modularships/src/modules/weapons/projectiles/Projectile.cc
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/Projectile.cc	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/Projectile.cc	(revision 9995)
@@ -93,3 +93,8 @@
     }
 
+    bool Projectile::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint)
+    {
+        return this->customProcessCollision(otherObject, contactPoint, cs);
+    }
+
 }
Index: code/branches/modularships/src/modules/weapons/projectiles/Projectile.h
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/Projectile.h	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/Projectile.h	(revision 9995)
@@ -65,4 +65,5 @@
             virtual void tick(float dt);
             virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint);
+            virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint);
 
         private:
Index: code/branches/modularships/src/modules/weapons/projectiles/Rocket.cc
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/Rocket.cc	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/Rocket.cc	(revision 9995)
@@ -196,4 +196,9 @@
     }
 
+    bool Rocket::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint)
+    {
+        return this->customProcessCollision(otherObject, contactPoint, cs);
+    }
+
     /**
     @brief
Index: code/branches/modularships/src/modules/weapons/projectiles/Rocket.h
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/Rocket.h	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/Rocket.h	(revision 9995)
@@ -65,4 +65,5 @@
 
             virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint);
+            virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint);
             virtual void destroyObject(void);
             void destructionEffect();
Index: code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.cc
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.cc	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.cc	(revision 9995)
@@ -177,4 +177,9 @@
     }
 
+    bool SimpleRocket::customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint)
+    {
+        return this->customProcessCollision(otherObject, contactPoint, cs);
+    }
+
     /**
     @brief
Index: code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.h
===================================================================
--- code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.h	(revision 9994)
+++ code/branches/modularships/src/modules/weapons/projectiles/SimpleRocket.h	(revision 9995)
@@ -65,4 +65,5 @@
 
             virtual bool collidesAgainst(WorldEntity* otherObject, btManifoldPoint& contactPoint);
+            virtual bool customCollidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint);
 
             void disableFire(); //!< Method to disable the fire and stop all acceleration
