Index: code/branches/ProtectBoss_HS17/data/levels/ProtectBoss.oxw
===================================================================
--- code/branches/ProtectBoss_HS17/data/levels/ProtectBoss.oxw	(revision 11603)
+++ code/branches/ProtectBoss_HS17/data/levels/ProtectBoss.oxw	(revision 11604)
@@ -11,4 +11,7 @@
   include("templates/lodInformation.oxt")
   include("templates/HeavyCruiser.oxt")
+  include("HUDPickupTemplate.oxo")
+  include("templates/pickupRepresentationTemplates.oxt")
+  include("includes/pickups.oxi")
 ?>
 
@@ -58,9 +61,12 @@
         team      = 0
         collisionType = kinematic
+        enablecollisiondamage=true
+        collisiondamage = 10
         position  = "0,0,-2500"
-        mass      = 10000
+        mass      = 100000
         health    = 1000 initialhealth=1000 maxhealth="1000"
         direction = "1,0,0"
         rotationaxis="0,0,1" rotationrate="4.5" velocity="0,0,30"
+        vulnerable=true
         name      = "CargoShip"
         radarname = "Cargo Ship" >
@@ -107,6 +113,42 @@
     <DistanceTrigger name="passedAsteroidFieldOne" beaconMode=identify position="0,0,3000" distance=1000 target="Pawn" targetname="CargoShip" />
 
+    <!-- triggers when first pirate wave is defeated -->
+    <Trigger name="firstPirateWaveKilled" mode="and">
+      <EventTrigger activations="1" stayactive="true" >
+        <events>
+          <trigger>
+             <EventListener event="p1" />
+          </trigger>
+        </events>
+      </EventTrigger>
+      <EventTrigger activations="1" stayactive="true" >
+        <events>
+          <trigger>
+             <EventListener event="p2" />
+          </trigger>
+        </events>
+      </EventTrigger>
+      <EventTrigger activations="1" stayactive="true" >
+        <events>
+          <trigger>
+             <EventListener event="p3" />
+          </trigger>
+        </events>
+      </EventTrigger>
+    </Trigger>
+
     <!-- create asteroids -->
     <?lua
+      function asteroidMesh()
+        x = math.random(8)
+        if x < 7 then
+          return "ast" .. x .. ".mesh"
+        elseif x == 7 then
+          return "asteroid_ice.mesh"
+        else
+          return "asteroid_UV.mesh"
+        end
+      end
+
       for count = 1, 30, 1 do
         x = math.random(-1000, 1000)
@@ -121,7 +163,35 @@
         vz = math.random(-vmax, vmax)
         rr = math.random() * 10
-        print("<Pawn team=1 health=30 position=\"" .. x .. "," .. y .. "," .. z .. "\" direction=\"0,0,-1\" velocity=\"" .. vx .. "," .. vy .. "," .. vz .. "\"rotationaxis=\"" .. rx .. "," .. ry .. "," .. rz .. "\" rotationrate=" .. rr .. " collisionType=dynamic mass=1 name=asteroid radarname=Asteroid> <!--events> <visibility> <EventListener event=flying4 /> </visibility> </events--> <attached> <Model position=\"0,0,0\" mesh=\"ast" .. math.random(6) .. ".mesh\" scale3D=\"10,10,10\" /> </attached> <collisionShapes> <SphereCollisionShape position=\"0,0,0\" radius=5 /> </collisionShapes> <!--controller> <WaypointController team=1> </WaypointController> </controller--> <explosion> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_flash2\" effect2=\"orxonox/explosion_flame2\" /> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_shockwave2\" effect2=\"orxonox/explosion_sparks2\" /> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_streak2\" effect2=\"orxonox/explosion_afterglow\" /> </explosion> </Pawn>")
+        print("<Pawn team=1 health=30 position=\"" .. x .. "," .. y .. "," .. z .. "\" direction=\"0,0,-1\" velocity=\"" .. vx .. "," .. vy .. "," .. vz .. "\"rotationaxis=\"" .. rx .. "," .. ry .. "," .. rz .. "\" rotationrate=" .. rr .. " collisionType=dynamic mass=1 name=asteroid radarname=Asteroid> <attached> <Model position=\"0,0,0\" mesh=\"" .. asteroidMesh() .. "\" scale3D=\"10,10,10\" /> </attached> <collisionShapes> <SphereCollisionShape position=\"0,0,0\" radius=5 /> </collisionShapes> <controller> <WaypointController team=1> </WaypointController> </controller> <explosion> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_flash2\" effect2=\"orxonox/explosion_flame2\" /> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_shockwave2\" effect2=\"orxonox/explosion_sparks2\" /> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_streak2\" effect2=\"orxonox/explosion_afterglow\" /> </explosion> </Pawn>")
+      end
+
+      for count = 1, 20, 1 do
+        x = math.random(-1000, 1000)
+        y = math.random(-1000, 1000)
+        z = 125 * count + math.random(-250, 250)
+        typenum = math.random(7)
+        type = ""
+        if typenum == 1 then
+          type = "smallmunition"
+        elseif typenum == 2 then
+          type = "mediummunition"
+        elseif typenum == 3 then
+          type = "hugemunition"
+        elseif typenum == 4 then
+          type = "smallhealth"
+        elseif typenum == 5 then
+          type = "mediumhealth"
+        elseif typenum == 6 then
+          type = "hugehealth"
+        else
+          type = "crazyhealth"
+        end
+        type = type .. "pickup"
+        --[[print("<PickupSpawner pickup=\"" .. "mediumhealth" .. "\" position=\"" .. x .. "," .. y .. "," .. z .. "\" triggerDistance=10 respawnTime=5 maxSpawnedItems=1 />")]]
       end
     ?>
+
+    <!--PickupSpawner pickup=mediumhealthpickup position="0,0,-125" triggerDistance="10" respawnTime="5" maxSpawnedItems="1" /-->
+    <!--PickupSpawner pickup=smallshieldpickup position="-25,-25,-125" triggerDistance="10" respawnTime="5" maxSpawnedItems="10" /-->
 
     <!-- start first quest -->
@@ -185,15 +255,44 @@
     </SimpleNotification>
 
-    <!-- A function to put pirates to a certain location -->
+    <SimpleNotification message="A second pirate wave is approaching!" broadcast=true >
+      <events>
+            <trigger>
+                <EventListener event="firstPirateWaveKilled" />
+            </trigger>
+        </events>
+    </SimpleNotification>
+
+
+    <!-- A function to put pirates and asteroids to a certain location -->
     <?lua
-      function placePirate(posX, posY, posZ, trigger)
-        print("<SpaceShip mass=10 position=\"" .. posX .. "," .. posY .. "," .. posZ .. "\" name=Pirate radarname=Pirate><events><visibility><EventListener event=\"" .. trigger .. "\"/></visibility><activity><EventListener event=\"" .. trigger .. "\"/></activity></events><templates><Template link=spaceshippirate /></templates><controller><WaypointPatrolController alertnessradius=3129 team=1 active=false><waypoints><Model mesh=\"cube.mesh\" scale=0 position=\"-1300,-600,900\" /><Model mesh=\"cube.mesh\" scale=0 position=\"0,0,0\" /></waypoints><events><activity><EventListener event=attack /></activity></events></WaypointPatrolController></controller></SpaceShip>")
+      function placePirate(posX, posY, posZ, name, trigger)
+        print("<SpaceShip mass=10 health=25 initialhealth=25 maxhealth=25 shieldhealth=10 maxshieldhealth=10 initialshieldhealth=10 shieldabsorption=0.3 shieldrechargerate=1 shieldrechargewaittime=1 primaryThrust=40 auxiliaryThrust=15 rotationThrust=10 boostpower=5 boostrate=2 boostCooldownDuration = 20 position=\"" .. posX .. "," .. posY .. "," .. posZ .. "\" name=\"" .. name .. "\" radarname=Pirate><events><visibility><EventListener event=\"" .. trigger .. "\"/></visibility><activity><EventListener event=\"" .. trigger .. "\"/></activity></events><templates><Template link=spaceshippirate /></templates><controller><WaypointPatrolController alertnessradius=3129 team=1 active=false><waypoints><Model mesh=\"cube.mesh\" scale=0 position=\"-1300,-600,900\" /><Model mesh=\"cube.mesh\" scale=0 position=\"0,0,0\" /></waypoints><events><activity><EventListener event=attack /></activity></events></WaypointPatrolController></controller></SpaceShip>")
+      end
+
+      function placeAsteroid(posX, posY, posZ, vx, vy, vz, trigger)
+        rx = math.random(-vmax, vmax)
+        ry = math.random(-vmax, vmax)
+        rz = math.random(-vmax, vmax)
+        rr = math.random() * 10
+        print("<Pawn team=1 health=30 position=\"" .. posX .. "," .. posY .. "," .. posZ .. "\" direction=\"0,0,-1\" velocity=\"" .. vx .. "," .. vy .. "," .. vz .. "\"rotationaxis=\"" .. rx .. "," .. ry .. "," .. rz .. "\" rotationrate=" .. rr .. " collisionType=dynamic mass=1 name=asteroid radarname=Asteroid> <events> <visibility> <EventListener event=\"" .. trigger .. "\" /> </visibility> </events> <attached> <Model position=\"0,0,0\" mesh=\"" .. asteroidMesh() .. "\" scale3D=\"10,10,10\" /> </attached> <collisionShapes> <SphereCollisionShape position=\"0,0,0\" radius=5 /> </collisionShapes> <!--controller> <WaypointController team=1> </WaypointController> </controller--> <explosion> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_flash2\" effect2=\"orxonox/explosion_flame2\" /> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_shockwave2\" effect2=\"orxonox/explosion_sparks2\" /> <ExplosionPart minspeed=0 maxspeed=0 effect1=\"orxonox/explosion_streak2\" effect2=\"orxonox/explosion_afterglow\" /> </explosion> </Pawn>")
       end
     ?>
 
     <?lua
-      placePirate(0, 0, 5500, "passedAsteroidFieldOne")
-      placePirate(0, 0, 6500, "passedAsteroidFieldOne")
-      placePirate(0, 0, 7500, "passedAsteroidFieldOne")
+    placeAsteroid(0, 0, -1000, 0, 0, 0, "spawntrigger")
+    placeAsteroid(0, 0, -1100, 0, 0, 0, "spawntrigger")
+    placeAsteroid(0, 0, -1200, 0, 0, 0, "spawntrigger")
+    placeAsteroid(0, 0, -1300, 0, 0, 0, "spawntrigger")
+    placeAsteroid(0, 0, -1400, 0, 0, 0, "spawntrigger")
+    placeAsteroid(0, 0, -1500, 0, 0, 0, "spawntrigger")
+      placePirate(0, 0, 5500, "p1", "spawntrigger")
+      placePirate(0, 0, 6500, "p2", "spawntrigger")
+      placePirate(0, 0, 7500, "p3", "spawntrigger")
+      placePirate(0, 0, 5500, "p11", "firstPirateWaveKilled")
+      placePirate(0, 0, 5600, "p12", "firstPirateWaveKilled")
+      placePirate(0, 0, 5700, "p13", "firstPirateWaveKilled")
+      placePirate(0, 0, 5800, "p14", "firstPirateWaveKilled")
+      placePirate(0, 0, 5900, "p15", "firstPirateWaveKilled")
+      placePirate(0, 0, 6000, "p16", "firstPirateWaveKilled")
     ?>
 
Index: code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/CMakeLists.txt
===================================================================
--- code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/CMakeLists.txt	(revision 11603)
+++ code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/CMakeLists.txt	(revision 11604)
@@ -7,3 +7,4 @@
   TeamBaseMatchBase.cc
   Destroyer.cc
+  ShootableObstacle.cc
 )
Index: code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/ShootableObstacle.cc
===================================================================
--- code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/ShootableObstacle.cc	(revision 11604)
+++ code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/ShootableObstacle.cc	(revision 11604)
@@ -0,0 +1,59 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   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
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Leon Rigoni
+ *
+ */
+
+namespace orxonox
+{
+    RegisterClass(ShootableObstacle);
+
+    ShootableObstacle::ShootableObstacle(Context* context) : Pawn(context)
+    {
+        RegisterObject(ShootableObstacle);
+    }
+
+    bool ShootableObstacle::collidesAgainst(WorldEntity* otherObject, const btCollisionShape* ownCollisionShape, btManifoldPoint& contactPoint)
+    {
+        if (GameMode::isMaster() && enableCollisionDamage_)
+        {
+            Pawn* victim = orxonox_cast<Pawn*>(otherObject);
+            if (victim)
+            {
+                float damage = this->collisionDamage_ * (victim->getVelocity() - this->getVelocity()).length();
+                victim->hit(nullptr, contactPoint, ownCollisionShape, damage);
+            }
+        }
+
+        return false;
+    }
+
+    void ShootableObstacle::XMLPort(Element& xmlelement, XMLPort::Mode mode)
+    {
+        SUPER(ShootableObstacle, XMLPort, xmlelement, mode);
+
+        XMLPortParam(ShootableObstacle, "enablecollisiondamage", setEnableCollisionDamage, getEnableCollisionDamage, xmlelement, mode).defaultValues(false);
+        XMLPortParam(ShootableObstacle, "collisiondamage", setCollisionDamage, getCollisionDamage, xmlelement, mode).defaultValues(1);
+    }
+
+}
Index: code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/ShootableObstacle.h
===================================================================
--- code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/ShootableObstacle.h	(revision 11604)
+++ code/branches/ProtectBoss_HS17/src/orxonox/worldentities/pawns/ShootableObstacle.h	(revision 11604)
@@ -0,0 +1,66 @@
+/*
+ *   ORXONOX - the hottest 3D action shooter ever to exist
+ *                    > www.orxonox.net <
+ *
+ *
+ *   License notice:
+ *
+ *   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
+ *   of the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with this program; if not, write to the Free Software
+ *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ *
+ *   Author:
+ *      Leon Rigoni
+ *
+ */
+#ifndef _ShootableObstacle_H__
+#define _ShootableObstacle_H__
+#include "worldentities/pawns/Pawn.h"
+
+namespace orxonox // tolua_export
+{
+    /**
+    @brief
+        This class encapsulates a pawn (so an object with health) with the addition, that it damages other objects when it hits them.
+    */
+
+    class _OrxonoxExport ShootableObstacle
+        : public Pawn
+    {
+	    public:
+	    	ShootableObstacle(Context* context);
+	        virtual void XMLPort(Element& xmlelement, XMLPort::Mode mode) override;
+	        virtual bool collidesAgainst(WorldEntity* otherObject, const btCollisionShape* cs, btManifoldPoint& contactPoint) override;
+
+	        inline void setCollisionDamage(float c)
+	                { this->collisionDamage_ = c; }
+
+	        inline float getCollisionDamage()
+	            { return this->collisionDamage_; }
+
+	        inline void setEnableCollisionDamage(bool c)
+	        {
+	            this->enableCollisionDamage_ = c;
+	            this->enableCollisionCallback();
+	        }
+
+	        inline bool getEnableCollisionDamage()
+	            { return this->enableCollisionDamage_; }
+
+	    private:
+	    	float collisionDamage_;
+	        bool enableCollisionDamage_;
+    };
+}
+
+#endif
