Index: /trunk/src/defs/class_id.h
===================================================================
--- /trunk/src/defs/class_id.h	(revision 5457)
+++ /trunk/src/defs/class_id.h	(revision 5458)
@@ -131,4 +131,5 @@
 
   CL_TURRET_POWER_UP            =    0x00000211,
+  CL_LASER_POWER_UP             =    0x00000212,
 
   CL_TEST_GUN                   =    0x00000230,
Index: /trunk/src/world_entities/Makefile.am
===================================================================
--- /trunk/src/world_entities/Makefile.am	(revision 5457)
+++ /trunk/src/world_entities/Makefile.am	(revision 5458)
@@ -27,5 +27,6 @@
                   weapons/crosshair.cc \
                   power_ups/power_up.cc \
-                  power_ups/turret_power_up.cc
+                  power_ups/turret_power_up.cc \
+                  power_ups/laser_power_up.cc
 
 noinst_HEADERS = \
@@ -50,5 +51,6 @@
                  weapons/crosshair.h \
                  power_ups/power_up.h \
-                 power_ups/turret_power_up.h
+                 power_ups/turret_power_up.h \
+                 power_ups/laser_power_up.h
 
 
Index: /trunk/src/world_entities/Makefile.in
===================================================================
--- /trunk/src/world_entities/Makefile.in	(revision 5457)
+++ /trunk/src/world_entities/Makefile.in	(revision 5458)
@@ -58,5 +58,5 @@
 	weapon_manager.lo weapon.lo test_gun.lo turret.lo \
 	projectile.lo test_bullet.lo rocket.lo laser.lo crosshair.lo \
-	power_up.lo turret_power_up.lo
+	power_up.lo turret_power_up.lo laser_power_up.lo
 libORXworld_entities_la_OBJECTS =  \
 	$(am_libORXworld_entities_la_OBJECTS)
@@ -68,6 +68,7 @@
 @AMDEP_TRUE@	./$(DEPDIR)/crosshair.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/environment.Plo ./$(DEPDIR)/laser.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/npc.Plo ./$(DEPDIR)/npc2.Plo \
-@AMDEP_TRUE@	./$(DEPDIR)/player.Plo ./$(DEPDIR)/power_up.Plo \
+@AMDEP_TRUE@	./$(DEPDIR)/laser_power_up.Plo ./$(DEPDIR)/npc.Plo \
+@AMDEP_TRUE@	./$(DEPDIR)/npc2.Plo ./$(DEPDIR)/player.Plo \
+@AMDEP_TRUE@	./$(DEPDIR)/power_up.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/projectile.Plo ./$(DEPDIR)/rocket.Plo \
 @AMDEP_TRUE@	./$(DEPDIR)/satellite.Plo ./$(DEPDIR)/skybox.Plo \
@@ -243,5 +244,6 @@
                   weapons/crosshair.cc \
                   power_ups/power_up.cc \
-                  power_ups/turret_power_up.cc
+                  power_ups/turret_power_up.cc \
+                  power_ups/laser_power_up.cc
 
 noinst_HEADERS = \
@@ -266,5 +268,6 @@
                  weapons/crosshair.h \
                  power_ups/power_up.h \
-                 power_ups/turret_power_up.h
+                 power_ups/turret_power_up.h \
+                 power_ups/laser_power_up.h
 
 SUBDIRS = .          .
@@ -343,4 +346,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/environment.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laser.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/laser_power_up.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/npc2.Plo@am__quote@
@@ -649,4 +653,28 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o turret_power_up.lo `test -f 'power_ups/turret_power_up.cc' || echo '$(srcdir)/'`power_ups/turret_power_up.cc
+
+laser_power_up.o: power_ups/laser_power_up.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT laser_power_up.o -MD -MP -MF "$(DEPDIR)/laser_power_up.Tpo" -c -o laser_power_up.o `test -f 'power_ups/laser_power_up.cc' || echo '$(srcdir)/'`power_ups/laser_power_up.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/laser_power_up.Tpo" "$(DEPDIR)/laser_power_up.Po"; else rm -f "$(DEPDIR)/laser_power_up.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='power_ups/laser_power_up.cc' object='laser_power_up.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/laser_power_up.Po' tmpdepfile='$(DEPDIR)/laser_power_up.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o laser_power_up.o `test -f 'power_ups/laser_power_up.cc' || echo '$(srcdir)/'`power_ups/laser_power_up.cc
+
+laser_power_up.obj: power_ups/laser_power_up.cc
+@am__fastdepCXX_TRUE@	if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT laser_power_up.obj -MD -MP -MF "$(DEPDIR)/laser_power_up.Tpo" -c -o laser_power_up.obj `if test -f 'power_ups/laser_power_up.cc'; then $(CYGPATH_W) 'power_ups/laser_power_up.cc'; else $(CYGPATH_W) '$(srcdir)/power_ups/laser_power_up.cc'; fi`; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/laser_power_up.Tpo" "$(DEPDIR)/laser_power_up.Po"; else rm -f "$(DEPDIR)/laser_power_up.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='power_ups/laser_power_up.cc' object='laser_power_up.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/laser_power_up.Po' tmpdepfile='$(DEPDIR)/laser_power_up.TPo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o laser_power_up.obj `if test -f 'power_ups/laser_power_up.cc'; then $(CYGPATH_W) 'power_ups/laser_power_up.cc'; else $(CYGPATH_W) '$(srcdir)/power_ups/laser_power_up.cc'; fi`
+
+laser_power_up.lo: power_ups/laser_power_up.cc
+@am__fastdepCXX_TRUE@	if $(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT laser_power_up.lo -MD -MP -MF "$(DEPDIR)/laser_power_up.Tpo" -c -o laser_power_up.lo `test -f 'power_ups/laser_power_up.cc' || echo '$(srcdir)/'`power_ups/laser_power_up.cc; \
+@am__fastdepCXX_TRUE@	then mv -f "$(DEPDIR)/laser_power_up.Tpo" "$(DEPDIR)/laser_power_up.Plo"; else rm -f "$(DEPDIR)/laser_power_up.Tpo"; exit 1; fi
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='power_ups/laser_power_up.cc' object='laser_power_up.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	depfile='$(DEPDIR)/laser_power_up.Plo' tmpdepfile='$(DEPDIR)/laser_power_up.TPlo' @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(LIBTOOL) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o laser_power_up.lo `test -f 'power_ups/laser_power_up.cc' || echo '$(srcdir)/'`power_ups/laser_power_up.cc
 
 mostlyclean-libtool:
Index: /trunk/src/world_entities/npc.cc
===================================================================
--- /trunk/src/world_entities/npc.cc	(revision 5457)
+++ /trunk/src/world_entities/npc.cc	(revision 5458)
@@ -25,4 +25,5 @@
 #include "stdlibincl.h"
 #include "power_ups/turret_power_up.h"
+#include "power_ups/laser_power_up.h"
 
 using namespace std;
@@ -54,4 +55,10 @@
       State::getWorldEntityList()->add(powerUp);
     }
+    else if ((float)rand()/RAND_MAX < .3)
+    {
+      WorldEntity* powerUp = new LaserPowerUp();
+      powerUp->setAbsCoor(this->getAbsCoor());
+      State::getWorldEntityList()->add(powerUp);
+    }
     State::getWorldEntityList()->remove(this);
 
Index: /trunk/src/world_entities/power_ups/laser_power_up.cc
===================================================================
--- /trunk/src/world_entities/power_ups/laser_power_up.cc	(revision 5458)
+++ /trunk/src/world_entities/power_ups/laser_power_up.cc	(revision 5458)
@@ -0,0 +1,120 @@
+/*
+   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: Benjamin Grauer
+   co-programmer: ...
+*/
+
+#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
+
+#include "laser_power_up.h"
+#include "factory.h"
+#include "state.h"
+#include "list.h"
+
+#include "primitive_model.h"
+
+using namespace std;
+
+CREATE_FACTORY(LaserPowerUp);
+
+LaserPowerUp::LaserPowerUp ()
+{
+  this->init();
+}
+
+LaserPowerUp::LaserPowerUp(const TiXmlElement* root)
+{
+  this->init();
+
+  this->loadParams(root);
+}
+
+
+LaserPowerUp::~LaserPowerUp ()
+{
+  delete this->sphereModel;
+  delete this->sphereMaterial;
+}
+
+
+void LaserPowerUp::init()
+{
+  this->setClassID(CL_LASER_POWER_UP, "LaserPowerUp");
+  this->loadModelWithScale("models/guns/test_gun.obj", 2.0);
+
+  this->sphereModel = new PrimitiveModel(PRIM_SPHERE, 7, 5);
+  this->sphereMaterial = new Material;
+  this->sphereMaterial->setTransparency(.1);
+  this->sphereMaterial->setDiffuse(.7, .7, .1);
+
+  this->rotation = Vector(0,1,0);
+  this->cycle    = (float)rand()/RAND_MAX*M_2_PI;
+  this->shiftDir(Quaternion((float)rand()/RAND_MAX*M_2_PI, this->rotation));
+}
+
+
+void LaserPowerUp::loadParams(const TiXmlElement* root)
+{
+  static_cast<PowerUp*>(this)->loadParams(root);
+
+}
+
+
+/**
+ * this function is called, when two entities collide
+ * @param entity: the world entity with whom it collides
+ *
+ * Implement behaviour like damage application or other miscellaneous collision stuff in this function
+ */
+void LaserPowerUp::collidesWith(WorldEntity* entity, const Vector& location)
+{
+ // PRINTF(3)("collision %s vs %s @ (%f,%f,%f)\n", this->getClassName(), entity->getClassName(), location.x, location.y, location.z);
+ if (entity->isA(CL_PLAYER))
+  State::getWorldEntityList()->remove(this);
+}
+
+/**
+ *  this method is called every frame
+ * @param time: the time in seconds that has passed since the last tick
+ *
+ * Handle all stuff that should update with time inside this method (movement, animation, etc.)
+*/
+void LaserPowerUp::tick(float dt)
+{
+  this->shiftDir(Quaternion(dt, this->rotation));
+  this->cycle+=dt;
+
+}
+
+/**
+ *  the entity is drawn onto the screen with this function
+ *
+ * This is a central function of an entity: call it to let the entity painted to the screen.
+ * Just override this function with whatever you want to be drawn.
+*/
+void LaserPowerUp::draw()
+{  glMatrixMode(GL_MODELVIEW);
+  glPushMatrix();
+  /* translate */
+  glTranslatef (this->getAbsCoor ().x,
+                this->getAbsCoor ().y + cos(this->cycle*3.0)*2.0,
+                this->getAbsCoor ().z);
+  /* rotate */
+  Vector tmpRot = this->getAbsDir().getSpacialAxis();
+  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
+  this->model->draw();
+
+  this->sphereMaterial->select();
+  this->sphereModel->draw();
+  glPopMatrix();
+}
+
Index: /trunk/src/world_entities/power_ups/laser_power_up.h
===================================================================
--- /trunk/src/world_entities/power_ups/laser_power_up.h	(revision 5458)
+++ /trunk/src/world_entities/power_ups/laser_power_up.h	(revision 5458)
@@ -0,0 +1,34 @@
+/*!
+ * @file laser_power_up.h
+ * @brief A class representing a PowerUp in the world.
+*/
+
+#ifndef _LASER_POWER_UP_H
+#define _LASER_POWER_UP_H
+
+#include "power_up.h"
+
+class LaserPowerUp : public PowerUp {
+
+ public:
+  LaserPowerUp();
+  LaserPowerUp(const TiXmlElement* root);
+  virtual ~LaserPowerUp ();
+
+  virtual void LaserPowerUp::collidesWith(WorldEntity* entity, const Vector& location);
+  virtual void tick(float dt);
+  virtual void draw();
+
+  private:
+   void init();
+   void loadParams(const TiXmlElement* root);
+
+  private:
+   Vector              rotation;
+   float               cycle;
+
+   Model*              sphereModel;
+   Material*           sphereMaterial;
+};
+
+#endif /* _LASER_POWER_UP_H */
Index: /trunk/src/world_entities/weapons/laser.cc
===================================================================
--- /trunk/src/world_entities/weapons/laser.cc	(revision 5457)
+++ /trunk/src/world_entities/weapons/laser.cc	(revision 5458)
@@ -46,5 +46,5 @@
   this->energyMax = 10;
   this->remove();
-  this->lifeSpan = 2;
+  this->lifeSpan = 1.0;
 
   this->emitter = new ParticleEmitter(Vector(0,1,0), M_2_PI, 100, 5);
Index: /trunk/src/world_entities/weapons/test_gun.cc
===================================================================
--- /trunk/src/world_entities/weapons/test_gun.cc	(revision 5457)
+++ /trunk/src/world_entities/weapons/test_gun.cc	(revision 5458)
@@ -129,5 +129,4 @@
   this->setMaximumEnergy(1000, 100);
   this->increaseEnergy(1000);
-  this->setEmissionPoint(0,-100,0);
   //this->minCharge = 2;
 
@@ -186,5 +185,5 @@
   pj->setParent(NullParent::getInstance());
 
-  pj->setVelocity(this->getVelocity() + this->getAbsDir().apply(Vector(1,0,0))*20);
+  pj->setVelocity(this->getVelocity() + this->getAbsDir().apply(Vector(1,0,0))*50);
 
   pj->setAbsCoor(this->getEmissionPoint());
