Index: code/branches/gameimmersion/data/levels/test-immersion-shield-01.oxw
===================================================================
--- code/branches/gameimmersion/data/levels/test-immersion-shield-01.oxw	(revision 8379)
+++ code/branches/gameimmersion/data/levels/test-immersion-shield-01.oxw	(revision 8386)
@@ -1,5 +1,5 @@
 <LevelInfo
- name = "shield-test-01"
- description = "LEVELINFO-DESCRIPTION"
+ name = "shield-test-level"
+ description = "A simple Level with one shielded drone to shoot at"
 />
 
@@ -7,21 +7,21 @@
   include("HUDTemplates3.oxo")
   include("stats.oxo")
-  include("templates/spaceshipAssff.oxt")
+  include("templates/spaceshipImmTest.oxt")
   include("templates/lodInformation.oxt")
 ?>
 
 <Level
- name         = "LEVEL-NAME"
+ name         = "shieldTL"
  description  = "LEVEL-DESCRIPTION"
 >
 
-  <templates>
-    <Template link=lodtemplate_default />
-  </templates>
+<templates>
+  <Template link=lodtemplate_default />
+</templates>
 
-  <Scene
+<Scene
    ambientlight = "0.8, 0.5, 0.5"
    skybox       = "Orxonox/Starbox"
-  >
+>
 
 
@@ -64,5 +64,5 @@
       for i = 1, 10, 1 do
     ?>
-      <SpawnPoint position="<?lua print(math.random() * 1000 - 500) ?>,<?lua print(math.random() * 1000 - 500) ?>,<?lua print(math.random() * 1000 - 500) ?>" lookat="0,0,0" spawnclass=SpaceShip pawndesign=spaceshipassff />
+      <SpawnPoint position="<?lua print(math.random() * 1000 - 500) ?>,<?lua print(math.random() * 1000 - 500) ?>,<?lua print(math.random() * 1000 - 500) ?>" lookat="0,0,0" spawnclass=SpaceShip pawndesign=spaceshipimmtest />
     <?lua end ?>
 
Index: code/branches/gameimmersion/src/modules/weapons/projectiles/Projectile.cc
===================================================================
--- code/branches/gameimmersion/src/modules/weapons/projectiles/Projectile.cc	(revision 8379)
+++ code/branches/gameimmersion/src/modules/weapons/projectiles/Projectile.cc	(revision 8386)
@@ -48,5 +48,9 @@
         this->bDestroy_ = false;
         this->owner_ = 0;
-        this->damage_ = 15;
+        this->damage_ = 115;
+///////////////////me
+        this->healthdamage_ = 0;
+        this->shielddamage_ = 0;
+///////////////////end me
 
         // Get notification about collisions
@@ -139,5 +143,5 @@
             if (victim)
             {
-                victim->hit(this->owner_, contactPoint, this->damage_);
+                victim->hit(this->owner_, contactPoint, this->damage_, this->healthdamage_, this->shielddamage_);
                 victim->startReloadCountdown();
             }
Index: code/branches/gameimmersion/src/modules/weapons/projectiles/Projectile.h
===================================================================
--- code/branches/gameimmersion/src/modules/weapons/projectiles/Projectile.h	(revision 8379)
+++ code/branches/gameimmersion/src/modules/weapons/projectiles/Projectile.h	(revision 8386)
@@ -50,5 +50,5 @@
 
             inline void setDamage(float damage)
-                { this->damage_ = damage; }
+                { this->damage_ = damage;  COUT(3) << "DAMAGE-SET-FUNKTION WIRD AUFGERUFEN" << endl; }
             inline float getDamage() const
                 { return this->damage_; }
@@ -58,8 +58,27 @@
                 { return this->owner_; }
 
+////////////////////me
+
+            inline void setHealthDamage(float healthdamage)
+                { this->healthdamage_ = healthdamage; }
+            inline float getHealthDamage() const
+                { return this->healthdamage_; }
+
+            inline void setShieldDamage(float shielddamage)
+                { this->shielddamage_ = shielddamage; COUT(3) << "SHIELDDAMAGE SET TO " << shielddamage << endl; } //ShieldDamage wird korrekt gesettet vom XML-File
+            inline float getShieldDamage() const
+                { return this->shielddamage_; }
+
+///////////////////end me
+
+
         private:
             WeakPtr<Pawn> owner_;
             float lifetime_;
             float damage_;
+///////me
+            float healthdamage_;
+            float shielddamage_;
+///////end me
             bool bDestroy_;
             Timer destroyTimer_;
Index: code/branches/gameimmersion/src/modules/weapons/weaponmodes/LightningGun.cc
===================================================================
--- code/branches/gameimmersion/src/modules/weapons/weaponmodes/LightningGun.cc	(revision 8379)
+++ code/branches/gameimmersion/src/modules/weapons/weaponmodes/LightningGun.cc	(revision 8386)
@@ -69,4 +69,5 @@
         projectile->setOwner(this->getWeapon()->getWeaponPack()->getWeaponSystem()->getPawn());
         projectile->setDamage(this->getDamage());
+        projectile->setShieldDamage(this->getShieldDamage());
     }
 }
Index: code/branches/gameimmersion/src/orxonox/controllers/Controller.h
===================================================================
--- code/branches/gameimmersion/src/orxonox/controllers/Controller.h	(revision 8379)
+++ code/branches/gameimmersion/src/orxonox/controllers/Controller.h	(revision 8386)
@@ -52,4 +52,10 @@
             virtual inline void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage) {};
 
+/* Override needed for different visual effects (e.g. in "NewHumanController.cc") depending on
+   the DIFFERENT AMOUNT OF DAMAGE done to the shield and to the health of "victim" (see Projectile.cc, Pawn.cc)
+
+//            virtual inline void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage, float shielddamage) {};
+*/
+
             void setGodMode( bool mode ){ this->bGodMode_ = mode; }
             bool getGodMode(){ return this->bGodMode_; }
Index: code/branches/gameimmersion/src/orxonox/weaponsystem/WeaponMode.cc
===================================================================
--- code/branches/gameimmersion/src/orxonox/weaponsystem/WeaponMode.cc	(revision 8379)
+++ code/branches/gameimmersion/src/orxonox/weaponsystem/WeaponMode.cc	(revision 8386)
@@ -66,5 +66,8 @@
 
         this->damage_ = 0;
-
+///////////////////me
+        this->healthdamage_ = 0;
+        this->shielddamage_ = 0;
+///////////////////end me
         this->muzzleOffset_ = Vector3::ZERO;
         this->muzzlePosition_ = Vector3::ZERO;
@@ -106,4 +109,8 @@
 
         XMLPortParam(WeaponMode, "damage",           setDamage,           getDamage,           xmlelement, mode);
+//////////me
+        XMLPortParam(WeaponMode, "healthdamage",     setHealthDamage,     getHealthDamage,     xmlelement, mode);
+        XMLPortParam(WeaponMode, "shielddamage",     setShieldDamage,     getShieldDamage,     xmlelement, mode);
+/////////end me
         XMLPortParam(WeaponMode, "muzzleoffset",     setMuzzleOffset,     getMuzzleOffset,     xmlelement, mode);
     }
Index: code/branches/gameimmersion/src/orxonox/weaponsystem/WeaponMode.h
===================================================================
--- code/branches/gameimmersion/src/orxonox/weaponsystem/WeaponMode.h	(revision 8379)
+++ code/branches/gameimmersion/src/orxonox/weaponsystem/WeaponMode.h	(revision 8386)
@@ -104,8 +104,20 @@
             // Fire
             inline void setDamage(float damage)
-                { this->damage_ = damage; }
+                { this->damage_ = damage; COUT(3) << "DAMAGE-SET-FUNKTION (WeaponMode) WIRD AUFGERUFEN" << endl;}
             inline float getDamage() const
                 { return this->damage_; }
+////////////////////me, copied to projectile.cc
 
+            inline void setHealthDamage(float healthdamage)
+                { this->healthdamage_ = healthdamage; }
+            inline float getHealthDamage() const
+                { return this->healthdamage_; }
+
+            inline void setShieldDamage(float shielddamage)
+                { this->shielddamage_ = shielddamage;} //ShieldDamage wird korrekt gesettet vom XML-File
+            inline float getShieldDamage() const
+                { return this->shielddamage_; }
+
+///////////////////end me
             inline void setMuzzleOffset(const Vector3& offset)
                 { this->muzzleOffset_ = offset; }
@@ -146,4 +158,6 @@
 
             float damage_;
+            float healthdamage_;
+            float shielddamage_;
             Vector3 muzzleOffset_;
 
Index: code/branches/gameimmersion/src/orxonox/worldentities/pawns/Pawn.cc
===================================================================
--- code/branches/gameimmersion/src/orxonox/worldentities/pawns/Pawn.cc	(revision 8379)
+++ code/branches/gameimmersion/src/orxonox/worldentities/pawns/Pawn.cc	(revision 8386)
@@ -265,4 +265,44 @@
 ////////////////////end edit
 
+
+/////////////////////me override
+    void Pawn::damage(float damage, float healthdamage, float shielddamage, Pawn* originator)
+    {
+        if (this->getGametype() && this->getGametype()->allowPawnDamage(this, originator))
+        {
+            if (shielddamage >= this->getShieldHealth())
+            {
+                this->setShieldHealth(0);
+                this->setHealth(this->health_ - (healthdamage + damage));
+            }
+            else
+            {
+                this->setShieldHealth(this->shieldHealth_ - shielddamage);
+
+                // remove remaining shieldAbsorpton-Part of damage from shield
+                shielddamage = damage * this->shieldAbsorption_;
+                shielddamage = std::min(this->getShieldHealth(),shielddamage);
+                this->setShieldHealth(this->shieldHealth_ - shielddamage);
+
+                // set remaining damage to health
+                this->setHealth(this->health_ - (damage - shielddamage) - healthdamage);
+            }
+
+            this->lastHitOriginator_ = originator;
+
+            // play damage effect
+        }
+        COUT(3) << "neue damage-Funktion wurde aufgerufen // " << "Shield:" << this->getShieldHealth() << endl;
+    }
+
+/////////////end me
+
+
+/* HIT-Funktionen
+	Die hit-Funktionen muessen auch in src/orxonox/controllers/Controller.h angepasst werden!
+
+*/
+
+
     void Pawn::hit(Pawn* originator, const Vector3& force, float damage)
     {
@@ -276,4 +316,18 @@
     }
 
+/////////////me override
+    void Pawn::hit(Pawn* originator, const Vector3& force, float damage, float healthdamage, float shielddamage)
+    {
+        COUT(3) << "neue hit-Funktion wurde aufgerufen // " << std::flush;
+        if (this->getGametype() && this->getGametype()->allowPawnHit(this, originator) && (!this->getController() || !this->getController()->getGodMode()) )
+        {
+            this->damage(damage, healthdamage, shielddamage, originator);
+            this->setVelocity(this->getVelocity() + force);
+
+            // play hit effect
+        }
+    }
+/////////////end me
+
     void Pawn::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage)
     {
@@ -288,4 +342,20 @@
         }
     }
+
+/////////////me override
+    void Pawn::hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage, float shielddamage)
+    {
+        COUT(3) << "neue hit2-Funktion wurde aufgerufen // shielddamage: " << shielddamage << std::flush;
+        if (this->getGametype() && this->getGametype()->allowPawnHit(this, originator) && (!this->getController() || !this->getController()->getGodMode()) )
+        {
+            this->damage(damage, healthdamage, shielddamage, originator);
+
+            if ( this->getController() )
+                this->getController()->hit(originator, contactpoint, shielddamage);
+
+            // play hit effect
+        }
+    }
+/////////////end me
 
     void Pawn::kill()
Index: code/branches/gameimmersion/src/orxonox/worldentities/pawns/Pawn.h
===================================================================
--- code/branches/gameimmersion/src/orxonox/worldentities/pawns/Pawn.h	(revision 8379)
+++ code/branches/gameimmersion/src/orxonox/worldentities/pawns/Pawn.h	(revision 8386)
@@ -127,4 +127,8 @@
             virtual void hit(Pawn* originator, const Vector3& force, float damage);
             virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage);
+/////////me
+            virtual void hit(Pawn* originator, const Vector3& force, float damage, float healthdamage, float shielddamage);
+            virtual void hit(Pawn* originator, btManifoldPoint& contactpoint, float damage, float healthdamage, float shielddamage);
+////////end me
             virtual void kill();
 
@@ -183,4 +187,7 @@
 
             virtual void damage(float damage, Pawn* originator = 0);
+//////////me
+            virtual void damage(float damage, float healthdamage, float shielddamage, Pawn* originator);
+/////////end me
 
             bool bAlive_;
