Index: trunk/src/story_entities/multi_player_world_data.cc
===================================================================
--- trunk/src/story_entities/multi_player_world_data.cc	(revision 7345)
+++ trunk/src/story_entities/multi_player_world_data.cc	(revision 7346)
@@ -213,5 +213,5 @@
         playable->toList(OM_GROUP_00);
         playable->setAbsCoor(213.37, 57.71, -47.98);
-        playable->setStartDirection(Quaternion(M_PI, Vector(0.0, 1.0, 0.0)));
+        playable->setPlayDirection(Quaternion(M_PI, Vector(0.0, 1.0, 0.0)));
       }
     }
Index: trunk/src/world_entities/creatures/md2_creature.h
===================================================================
--- trunk/src/world_entities/creatures/md2_creature.h	(revision 7345)
+++ trunk/src/world_entities/creatures/md2_creature.h	(revision 7346)
@@ -24,5 +24,5 @@
 
     virtual void loadParams(const TiXmlElement* root);
-    virtual void setStartDirection(const Quaternion& rot) {/* FIXME */};
+    virtual void setPlayDirection(const Quaternion& rot, float speed = 0.0f) {/* FIXME */};
 
     virtual void enter();
Index: trunk/src/world_entities/playable.cc
===================================================================
--- trunk/src/world_entities/playable.cc	(revision 7345)
+++ trunk/src/world_entities/playable.cc	(revision 7346)
@@ -63,5 +63,7 @@
 
 
-
+/**
+ * @brief destroys the Playable
+ */
 Playable::~Playable()
 {
@@ -72,202 +74,22 @@
 }
 
-
+/**
+ * @brief loads Playable parameters onto the Playable
+ * @param root the XML-root to load from
+ */
 void Playable::loadParams(const TiXmlElement* root)
 {
   WorldEntity::loadParams(root);
 
-  LoadParam(root, "abs-dir", this, Playable, setStartDirection);
-}
-
-void Playable::addWeapon(Weapon* weapon, int configID, int slotID)
-{
-  this->weaponMan.addWeapon(weapon, configID, slotID);
-
-  this->weaponConfigChanged();
-}
-
-
-void Playable::removeWeapon(Weapon* weapon)
-{
-  this->weaponMan.removeWeapon(weapon);
-
-  this->weaponConfigChanged();
-}
-
-
-void Playable::nextWeaponConfig()
-{
-  this->weaponMan.nextWeaponConfig();
-  this->weaponConfigChanged();
-}
-
-
-void Playable::previousWeaponConfig()
-{
-  this->weaponMan.previousWeaponConfig();
-  this->weaponConfigChanged();
-}
-
-
-void Playable::weaponConfigChanged()
-{
-  if (this->currentPlayer != NULL)
-    this->currentPlayer->weaponConfigChanged();
-}
-
-/**
- * @brief sets the CameraMode.
- * @param cameraMode: the Mode to switch to.
- */
-void Playable::setCameraMode(unsigned int cameraMode)
-{}
-
-/**
- * @brief sets the Playmode
- * @param playmode the Playmode
- * @returns true on success, false otherwise
- */
-bool Playable::setPlaymode(Playable::Playmode playmode)
-{
-  if (!this->playmodeSupported(playmode))
-    return false;
-  else
-  {
-    this->playmode = playmode;
-    return true;
-  }
-}
-
-
-/**
- * @brief helps us colliding Playables
- */
-void Playable::collidesWith(WorldEntity* entity, const Vector& location)
-{
-  if (entity == collider)
-    return;
-  collider = entity;
-
-  if ( entity->isA(CL_PROJECTILE) && ( !State::isOnline() || SharedNetworkData::getInstance()->isGameServer() ) )
-  {
-    this->decreaseHealth(entity->getHealth() *(float)rand()/(float)RAND_MAX);
-    // EXTREME HACK
-    if (this->getHealth() <= 0.0f)
-    {
-      this->die();
-    }
-  }
-}
-
-
-void Playable::respawn()
-{
-  PRINTF(0)("Playable respawn\n");
-  // only if this is the spaceship of the player
-  if( this == State::getPlayer()->getPlayable())
-    State::getGameRules()->onPlayerSpawn();
-
-
-  if( this->getOwner() % 2 == 0)
-  {
-    //     this->toList(OM_GROUP_00);
-    this->setAbsCoor(213.37, 57.71, -47.98);
-    this->setAbsDir(0, 0, 1, 0);
-  }
-  else
-  { // red team
-    //     this->toList(OM_GROUP_01);
-    this->setAbsCoor(-314.450, 40.701, 83.554);
-    this->setAbsDir(1.0, -0.015, -0.012, 0.011);
-  }
-  this->reset();
-  this->bDead = false;
-}
-
-
-
-void Playable::die()
-{
-  Explosion::explode(dynamic_cast<PNode*>(this), Vector(1.0f, 1.0f, 1.0f));
-
-
-  if( !this->bDead)
-  {
-    PRINTF(0)("Playable dies\n");
-    // only if this is the spaceship of the player
-    if (State::isOnline())
-    {
-      if( this == State::getPlayer()->getPlayable())
-        State::getGameRules()->onPlayerDeath();
-
-      //     this->toList(OM_GROUP_05);
-      //HACK: moves the entity to an unknown place far far away: in the future, GameRules will look for that
-      this->setAbsCoor(-2000.0, -2000.0, -2000.0);
-
-      //explosion hack
-
-    }
-    this->bDead = true;
-  }
-}
-
-
-/**
- * subscribe to all events the controllable needs
- * @param player the player that shall controll this Playable
- */
-bool Playable::setPlayer(Player* player)
-{
-  // if we already have a Player inside do nothing
-  if (this->currentPlayer != NULL && player != NULL)
-  {
-    return false;
-  }
-
-  // eject the Player if player == NULL
-  if (this->currentPlayer != NULL && player == NULL)
-  {
-    PRINTF(4)("Player gets ejected\n");
-
-    // unsubscibe all events.
-    EventHandler* evh = EventHandler::getInstance();
-    std::vector<int>::iterator ev;
-    for (ev = this->events.begin(); ev != events.end(); ev++)
-      evh->unsubscribe( ES_GAME, (*ev));
-
-    // leave the entity
-    this->leave();
-
-    // eject the current Player.
-    Player* ejectPlayer = this->currentPlayer;
-    this->currentPlayer = NULL;
-    // eject the Player.
-    ejectPlayer->setPlayable(NULL);
-
-    return true;
-  }
-
-  // get the new Player inside
-  if (this->currentPlayer == NULL && player != NULL)
-  {
-    PRINTF(4)("New Player gets inside\n");
-    this->currentPlayer = player;
-    if (this->currentPlayer->getPlayable() != this)
-      this->currentPlayer->setPlayable(this);
-
-    /*EventHandler*/
-    EventHandler* evh = EventHandler::getInstance();
-    std::vector<int>::iterator ev;
-    for (ev = this->events.begin(); ev != events.end(); ev++)
-      evh->subscribe(player, ES_GAME, (*ev));
-
-    this->enter();
-    return true;
-  }
-
-  return false;
-}
-
-
+  LoadParam(root, "abs-dir", this, Playable, setPlayDirection);
+}
+
+/**
+ * @brief picks up a powerup
+ * @param powerUp the PowerUp that should be picked.
+ * @returns true on success (pickup was picked, false otherwise)
+ *
+ * This function also checks if the Pickup can be picked up by this Playable
+ */
 bool Playable::pickup(PowerUp* powerUp)
 {
@@ -293,5 +115,264 @@
 
 /**
- * add an event to the event list of events this Playable can capture
+ * @brief adds a Weapon to the Playable.
+ * @param weapon the Weapon to add.
+ * @param configID the Configuration ID to add this weapon to.
+ * @param slotID the slotID to add the Weapon to.
+ */
+void Playable::addWeapon(Weapon* weapon, int configID, int slotID)
+{
+  this->weaponMan.addWeapon(weapon, configID, slotID);
+
+  this->weaponConfigChanged();
+}
+
+/**
+ * @brief removes a Weapon.
+ * @param weapon the Weapon to remove.
+ */
+void Playable::removeWeapon(Weapon* weapon)
+{
+  this->weaponMan.removeWeapon(weapon);
+
+  this->weaponConfigChanged();
+}
+
+/**
+ * @brief jumps to the next WeaponConfiguration
+ */
+void Playable::nextWeaponConfig()
+{
+  this->weaponMan.nextWeaponConfig();
+  this->weaponConfigChanged();
+}
+
+/**
+ * @brief moves to the last WeaponConfiguration
+ */
+void Playable::previousWeaponConfig()
+{
+  this->weaponMan.previousWeaponConfig();
+  this->weaponConfigChanged();
+}
+
+/**
+ * @brief tells the Player, that the Weapon-Configuration has changed.
+ *
+ * TODO remove this
+ * This function is needed, so that the WeponManager of this Playable can easily update the HUD
+ */
+void Playable::weaponConfigChanged()
+{
+  if (this->currentPlayer != NULL)
+    this->currentPlayer->weaponConfigChanged();
+}
+
+
+/**
+ * @brief subscribe to all events the controllable needs
+ * @param player the player that shall controll this Playable
+ * @returns false on error true otherwise.
+ */
+bool Playable::setPlayer(Player* player)
+{
+  // if we already have a Player inside do nothing
+  if (this->currentPlayer != NULL && player != NULL)
+  {
+    return false;
+  }
+
+  // eject the Player if player == NULL
+  if (this->currentPlayer != NULL && player == NULL)
+  {
+    PRINTF(4)("Player gets ejected\n");
+
+    // unsubscibe all events.
+    EventHandler* evh = EventHandler::getInstance();
+    std::vector<int>::iterator ev;
+    for (ev = this->events.begin(); ev != events.end(); ev++)
+      evh->unsubscribe( ES_GAME, (*ev));
+
+    // leave the entity
+    this->leave();
+
+    // eject the current Player.
+    Player* ejectPlayer = this->currentPlayer;
+    this->currentPlayer = NULL;
+    // eject the Player.
+    ejectPlayer->setPlayable(NULL);
+
+    return true;
+  }
+
+  // get the new Player inside
+  if (this->currentPlayer == NULL && player != NULL)
+  {
+    PRINTF(4)("New Player gets inside\n");
+    this->currentPlayer = player;
+    if (this->currentPlayer->getPlayable() != this)
+      this->currentPlayer->setPlayable(this);
+
+    /*EventHandler*/
+    EventHandler* evh = EventHandler::getInstance();
+    std::vector<int>::iterator ev;
+    for (ev = this->events.begin(); ev != events.end(); ev++)
+      evh->subscribe(player, ES_GAME, (*ev));
+
+    this->enter();
+    return true;
+  }
+
+  return false;
+}
+
+/**
+ * @brief attaches the current Camera to this Playable
+ *
+ * this function can be derived, so that any Playable can make the attachment differently.
+ */
+void Playable::attachCamera()
+{
+  State::getCameraNode()->setParentSoft(this);
+  State::getCameraTargetNode()->setParentSoft(this);
+
+}
+
+/**
+ * @brief detaches the Camera
+ * @see void Playable::attachCamera()
+ */
+void  Playable::detachCamera()
+{}
+
+
+/**
+ * @brief sets the CameraMode.
+ * @param cameraMode: the Mode to switch to.
+ */
+void Playable::setCameraMode(unsigned int cameraMode)
+{}
+
+
+/**
+ * @brief sets the Playmode
+ * @param playmode the Playmode
+ * @returns true on success, false otherwise
+ */
+bool Playable::setPlaymode(Playable::Playmode playmode)
+{
+  if (!this->playmodeSupported(playmode))
+    return false;
+  else
+  {
+    this->playmode = playmode;
+    return true;
+  }
+}
+
+/**
+ * @brief This function look, that the Playable rotates to the given rotation.
+ * @param angle the Angle around
+ * @param dirX directionX
+ * @param dirY directionY
+ * @param dirZ directionZ
+ * @param speed how fast to turn there.
+ */
+void Playable::setPlayDirection(float angle, float dirX, float dirY, float dirZ, float speed)
+{
+  this->setPlayDirection(Quaternion(angle, Vector(dirX, dirY, dirZ)), speed);
+}
+
+/**
+ * @brief all Playable will enter the Playmode Differently, say here how to do it.
+ * @param playmode the Playmode to enter.
+ *
+ * In this function all the actions that are required to enter the Playmode are described.
+ * e.g: camera, rotation, wait cycle and so on...
+ */
+void Playable::enterPlaymode(Playable::Playmode playmode)
+{
+
+}
+
+/**
+ * @brief helps us colliding Playables
+ * @param entity the Entity to collide
+ * @param location where the collision occured.
+ */
+void Playable::collidesWith(WorldEntity* entity, const Vector& location)
+{
+  if (entity == collider)
+    return;
+  collider = entity;
+
+  if ( entity->isA(CL_PROJECTILE) && ( !State::isOnline() || SharedNetworkData::getInstance()->isGameServer() ) )
+  {
+    this->decreaseHealth(entity->getHealth() *(float)rand()/(float)RAND_MAX);
+    // EXTREME HACK
+    if (this->getHealth() <= 0.0f)
+    {
+      this->die();
+    }
+  }
+}
+
+
+void Playable::respawn()
+{
+  PRINTF(0)("Playable respawn\n");
+  // only if this is the spaceship of the player
+  if( this == State::getPlayer()->getPlayable())
+    State::getGameRules()->onPlayerSpawn();
+
+
+  if( this->getOwner() % 2 == 0)
+  {
+    //     this->toList(OM_GROUP_00);
+    this->setAbsCoor(213.37, 57.71, -47.98);
+    this->setAbsDir(0, 0, 1, 0);
+  }
+  else
+  { // red team
+    //     this->toList(OM_GROUP_01);
+    this->setAbsCoor(-314.450, 40.701, 83.554);
+    this->setAbsDir(1.0, -0.015, -0.012, 0.011);
+  }
+  this->reset();
+  this->bDead = false;
+}
+
+
+
+void Playable::die()
+{
+  Explosion::explode(dynamic_cast<PNode*>(this), Vector(1.0f, 1.0f, 1.0f));
+
+
+  if( !this->bDead)
+  {
+    PRINTF(0)("Playable dies\n");
+    // only if this is the spaceship of the player
+    if (State::isOnline())
+    {
+      if( this == State::getPlayer()->getPlayable())
+        State::getGameRules()->onPlayerDeath();
+
+      //     this->toList(OM_GROUP_05);
+      //HACK: moves the entity to an unknown place far far away: in the future, GameRules will look for that
+      this->setAbsCoor(-2000.0, -2000.0, -2000.0);
+
+      //explosion hack
+
+    }
+    this->bDead = true;
+  }
+}
+
+
+
+
+
+/**
+ * @brief add an event to the event list of events this Playable can capture
  * @param eventType the Type of event to add
  */
@@ -346,18 +427,4 @@
 
 
-
-void  Playable::attachCamera()
-{
-  State::getCameraNode()->setParentSoft(this);
-  State::getCameraTargetNode()->setParentSoft(this);
-
-}
-
-
-
-
-void  Playable::detachCamera()
-{}
-
 #define DATA_FLAGS    1
 #define DATA_SCORE    2
@@ -436,4 +503,9 @@
 
 
+/**
+ * @brief converts a string into a Playable::Playmode.
+ * @param playmode the string naming the Playable::Playmode to convert.
+ * @returns the Playable::Playmode converted from playmode.
+ */
 Playable::Playmode Playable::stringToPlaymode(const std::string& playmode)
 {
@@ -450,4 +522,10 @@
 }
 
+
+/**
+ * @brief converts a playmode into a string.
+ * @param playmode the Playable::Playmode to convert.
+ * @returns the String.
+ */
 const char* Playable::playmodeToString(Playable::Playmode playmode)
 {
Index: trunk/src/world_entities/playable.h
===================================================================
--- trunk/src/world_entities/playable.h	(revision 7345)
+++ trunk/src/world_entities/playable.h	(revision 7346)
@@ -27,9 +27,10 @@
 {
 public:
+  //! Defines the Playmode of an Entity.
   typedef enum {
-    Vertical         = 1,
-    Horizontal       = 2,
-    FromBehind       = 4,
-    Full3D           = 8,
+    Vertical         = 1,       //!< Vertical (seen from left or right/move in x-z)
+    Horizontal       = 2,       //!< Horizontal (seet from the top/move in x-y)
+    FromBehind       = 4,       //!< Seen from behind (move in z-y)
+    Full3D           = 8,       //!< Full featured 3D-mode. (move in all directions x-y-z)
   } Playmode;
 
@@ -40,21 +41,21 @@
   virtual void loadParams(const TiXmlElement* root);
 
-  virtual void die();
-  virtual void respawn();
-
+  // Weapon and Pickups
   virtual bool pickup(PowerUp* powerUp);
-
   void addWeapon(Weapon* weapon, int configID = -1, int slotID = -1);
   void removeWeapon(Weapon* weapon);
   void nextWeaponConfig();
   void previousWeaponConfig();
-
   inline WeaponManager& getWeaponManager() { return this->weaponMan; };
   void weaponConfigChanged();
 
 
+  // Player Settup
   bool setPlayer(Player* player);
   Player* getCurrentPlayer() const { return this->currentPlayer; };
+  /** @return a List of Events in PEV_* sytle */
+  inline const std::vector<int>& getEventList() { return this->events; };
 
+  // Camera and Playmode
   void attachCamera();
   void detachCamera();
@@ -63,24 +64,22 @@
   bool setPlaymode(Playable::Playmode playmode);
   Playable::Playmode getPlaymode() const { return this->playmode; };
+  virtual void setPlayDirection(const Quaternion& rot, float speed = 0.0f) = 0;
+  void setPlayDirection(float angle, float dirX, float dirY, float dirZ, float speed = 0.0f);
 
+  inline void setScore( int score ) { this->score = score; }
+  inline int  getScore() { return this->score; }
+
+
+  // WorldEntity Extensions
+  virtual void die();
+  virtual void respawn();
   virtual void collidesWith(WorldEntity* entity, const Vector& location);
   virtual void process(const Event &event);
-
   virtual void tick(float dt);
 
-  /** @return a List of Events in PEV_* sytle */
-  inline const std::vector<int>& getEventList() { return this->events; };
-
+  // NETWORK
   int       writeSync(const byte* data, int length, int sender);
   int       readSync(byte* data, int maxLength );
   bool      needsReadSync();
-
-
-  //
-  virtual void setStartDirection(const Quaternion& rot) = 0;
-  void setStartDirection(float angle, float dirX, float dirY, float dirZ) { this->setStartDirection(Quaternion(angle, Vector(dirX, dirY, dirZ))); }
-
-  inline void setScore( int score ) { this->score = score; }
-  inline int  getScore() { return this->score; }
 
 
@@ -91,9 +90,12 @@
   Playable();
 
+  // Player Setup
   virtual void enter() = 0;
   virtual void leave() = 0;
+  // Playmode
+  void setSupportedPlaymodes(short playmodes) { this->supportedPlaymodes = playmodes; };
+  virtual void enterPlaymode(Playable::Playmode playmode);
 
-  void setSupportedPlaymodes(short playmodes) { this->supportedPlaymodes = playmodes; };
-
+  // Events.
   void registerEvent(int eventType);
   void unregisterEvent(int eventType);
Index: trunk/src/world_entities/space_ships/helicopter.h
===================================================================
--- trunk/src/world_entities/space_ships/helicopter.h	(revision 7345)
+++ trunk/src/world_entities/space_ships/helicopter.h	(revision 7346)
@@ -22,5 +22,5 @@
 
     virtual void loadParams(const TiXmlElement* root);
-    virtual void setStartDirection(const Quaternion& rot){/* FIXME */};
+    virtual void setPlayDirection(const Quaternion& rot, float speed = 0.0f) {/* FIXME */};
 
     virtual void enter();
Index: trunk/src/world_entities/space_ships/hover.h
===================================================================
--- trunk/src/world_entities/space_ships/hover.h	(revision 7345)
+++ trunk/src/world_entities/space_ships/hover.h	(revision 7346)
@@ -19,5 +19,5 @@
 
     virtual void loadParams(const TiXmlElement* root);
-    virtual void setStartDirection(const Quaternion& rot) {/* FIXME */};
+    virtual void setPlayDirection(const Quaternion& rot, float speed = 0.0f) {/* FIXME */};
 
     virtual void enter();
Index: trunk/src/world_entities/space_ships/space_ship.cc
===================================================================
--- trunk/src/world_entities/space_ships/space_ship.cc	(revision 7345)
+++ trunk/src/world_entities/space_ships/space_ship.cc	(revision 7346)
@@ -248,5 +248,5 @@
 }
 
-void SpaceShip::setStartDirection(const Quaternion& quat)
+void SpaceShip::setPlayDirection(const Quaternion& quat, float speed)
 {
   this->mouseDir = quat;
Index: trunk/src/world_entities/space_ships/space_ship.h
===================================================================
--- trunk/src/world_entities/space_ships/space_ship.h	(revision 7345)
+++ trunk/src/world_entities/space_ships/space_ship.h	(revision 7346)
@@ -27,5 +27,5 @@
     virtual void loadParams(const TiXmlElement* root);
 
-    virtual void setStartDirection(const Quaternion& rot);
+    virtual void setPlayDirection(const Quaternion& rot, float speed = 0.0f);
 
     virtual void enter();
Index: trunk/src/world_entities/space_ships/turbine_hover.cc
===================================================================
--- trunk/src/world_entities/space_ships/turbine_hover.cc	(revision 7345)
+++ trunk/src/world_entities/space_ships/turbine_hover.cc	(revision 7346)
@@ -103,5 +103,5 @@
   this->setClassID(CL_TURBINE_HOVER, "TurbineHover");
 
-  this->setSupportedPlaymodes(Playable::Full3D | Playable::Horizontal);
+  this->setSupportedPlaymodes(Playable::Full3D | Playable::Horizontal | Playable::Vertical);
 
   this->loadModel("models/ships/hoverglider_wing.obj", 1.0f, 3);
@@ -393,4 +393,26 @@
       }
       break;
+
+    case Playable::Vertical:
+    {
+      accel.z = 0;
+      Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
+      accelerationDir.z=0;
+
+        // this is the air friction (necessary for a smooth control)
+      Vector damping = (this->velocity * this->airFriction);
+
+      this->velocity += (accelerationDir - damping)* dt;
+      this->shiftCoor (this->velocity * dt);
+
+      this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
+
+      this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
+      this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation + cameraLook, Vector(0,0,1)), 5);
+
+      this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
+      this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation + cameraLook, Vector(0,0,1)), 5);
+    }
+    break;
   }
 }
Index: trunk/src/world_entities/space_ships/turbine_hover.h
===================================================================
--- trunk/src/world_entities/space_ships/turbine_hover.h	(revision 7345)
+++ trunk/src/world_entities/space_ships/turbine_hover.h	(revision 7346)
@@ -22,5 +22,5 @@
 
     virtual void loadParams(const TiXmlElement* root);
-    virtual void setStartDirection(const Quaternion& rot) {/* FIXME */};
+    virtual void setPlayDirection(const Quaternion& rot, float speed = 0.0f) {/* FIXME */};
     virtual void enter();
     virtual void leave();
