Index: /trunk/src/story_entities/game_world.cc
===================================================================
--- /trunk/src/story_entities/game_world.cc	(revision 7337)
+++ /trunk/src/story_entities/game_world.cc	(revision 7338)
@@ -280,4 +280,15 @@
 
 
+void GameWorld::setPlaymode(Playable::Playmode playmode)
+{
+  if (this->dataTank->localPlayer &&
+      this->dataTank->localPlayer->getPlayable() &&
+      this->dataTank->localPlayer->getPlayable()->setPlayMode(playmode))
+  {
+    PRINTF(3)("Set Playmode to %d\n", playmode);
+  }
+}
+
+
 /**
  *  synchronize local data with remote data
Index: /trunk/src/story_entities/game_world.h
===================================================================
--- /trunk/src/story_entities/game_world.h	(revision 7337)
+++ /trunk/src/story_entities/game_world.h	(revision 7338)
@@ -10,4 +10,5 @@
 #include "story_entity.h"
 #include "game_world_data.h"
+#include "playable.h"
 
 class Shell;
@@ -45,4 +46,5 @@
     virtual void run();
 
+    void setPlaymode(Playable::Playmode playmode);
     /**  this returns the current game time @returns elapsed game time     */
     inline double getGameTime() { return this->gameTime; }
Index: /trunk/src/world_entities/playable.cc
===================================================================
--- /trunk/src/world_entities/playable.cc	(revision 7337)
+++ /trunk/src/world_entities/playable.cc	(revision 7338)
@@ -39,5 +39,7 @@
 
 Playable::Playable()
-  : weaponMan(this)
+    : weaponMan(this),
+    supportedPlaymodes(Playable::Full3D),
+    playmode(Playable::Full3D)
 {
   this->setClassID(CL_PLAYABLE, "Playable");
@@ -90,5 +92,5 @@
   this->weaponMan.removeWeapon(weapon);
 
-    this->weaponConfigChanged();
+  this->weaponConfigChanged();
 }
 
@@ -97,5 +99,5 @@
 {
   this->weaponMan.nextWeaponConfig();
-    this->weaponConfigChanged();
+  this->weaponConfigChanged();
 }
 
@@ -104,5 +106,5 @@
 {
   this->weaponMan.previousWeaponConfig();
-    this->weaponConfigChanged();
+  this->weaponConfigChanged();
 }
 
@@ -119,6 +121,17 @@
  */
 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;
 }
 
@@ -155,5 +168,5 @@
   if( this->getOwner() % 2 == 0)
   {
-//     this->toList(OM_GROUP_00);
+    //     this->toList(OM_GROUP_00);
     this->setAbsCoor(213.37, 57.71, -47.98);
     this->setAbsDir(0, 0, 1, 0);
@@ -161,5 +174,5 @@
   else
   { // red team
-//     this->toList(OM_GROUP_01);
+    //     this->toList(OM_GROUP_01);
     this->setAbsCoor(-314.450, 40.701, 83.554);
     this->setAbsDir(1.0, -0.015, -0.012, 0.011);
@@ -179,5 +192,5 @@
   {
     PRINTF(0)("Playable dies\n");
-  // only if this is the spaceship of the player
+    // only if this is the spaceship of the player
     if (State::isOnline())
     {
@@ -185,9 +198,9 @@
         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->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
+      //explosion hack
 
     }
@@ -216,5 +229,5 @@
     // unsubscibe all events.
     EventHandler* evh = EventHandler::getInstance();
-    std::list<int>::iterator ev;
+    std::vector<int>::iterator ev;
     for (ev = this->events.begin(); ev != events.end(); ev++)
       evh->unsubscribe( ES_GAME, (*ev));
@@ -242,5 +255,5 @@
     /*EventHandler*/
     EventHandler* evh = EventHandler::getInstance();
-    std::list<int>::iterator ev;
+    std::vector<int>::iterator ev;
     for (ev = this->events.begin(); ev != events.end(); ev++)
       evh->subscribe(player, ES_GAME, (*ev));
@@ -256,10 +269,13 @@
 bool Playable::pickup(PowerUp* powerUp)
 {
-  if(powerUp->isA(CL_WEAPON_POWER_UP)) {
+  if(powerUp->isA(CL_WEAPON_POWER_UP))
+  {
     return dynamic_cast<WeaponPowerUp*>(powerUp)->process(&this->getWeaponManager());
   }
-  else if(powerUp->isA(CL_PARAM_POWER_UP)) {
+  else if(powerUp->isA(CL_PARAM_POWER_UP))
+  {
     ParamPowerUp* ppu = dynamic_cast<ParamPowerUp*>(powerUp);
-    switch(ppu->getType()) {
+    switch(ppu->getType())
+    {
       case POWERUP_PARAM_HEALTH:
         this->increaseHealth(ppu->getValue());
@@ -291,5 +307,6 @@
 void Playable::unregisterEvent(int eventType)
 {
-  this->events.remove(eventType);
+  std::vector<int>::iterator rmEvent = std::find(this->events.begin(), this->events.end(), eventType);
+  this->events.erase(rmEvent);
 
   if (this->currentPlayer != NULL)
@@ -338,6 +355,5 @@
 
 void  Playable::detachCamera()
-{
-}
+{}
 
 #define DATA_FLAGS    1
Index: /trunk/src/world_entities/playable.h
===================================================================
--- /trunk/src/world_entities/playable.h	(revision 7337)
+++ /trunk/src/world_entities/playable.h	(revision 7338)
@@ -10,5 +10,5 @@
 #include "extendable.h"
 #include "event.h"
-#include <list>
+#include <vector>
 
 #include "world_entities/weapons/weapon_manager.h"
@@ -26,77 +26,89 @@
 class Playable : public WorldEntity, public Extendable
 {
-  public:
-    virtual ~Playable();
-
-    virtual void loadParams(const TiXmlElement* root);
-
-    virtual void die();
-    virtual void respawn();
-
-    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();
+public:
+  typedef enum {
+    Vertical         = 1,
+    Horizontal       = 2,
+    FromBehind       = 4,
+    Full3D           = 8,
+  } Playmode;
 
 
-    bool setPlayer(Player* player);
-    Player* getCurrentPlayer() const { return this->currentPlayer; };
+public:
+  virtual ~Playable();
 
-    void attachCamera();
-    void detachCamera();
-    virtual void setCameraMode(unsigned int cameraMode = 0);
+  virtual void loadParams(const TiXmlElement* root);
 
-    virtual void collidesWith(WorldEntity* entity, const Vector& location);
-    virtual void process(const Event &event);
+  virtual void die();
+  virtual void respawn();
 
-    virtual void tick(float dt);
+  virtual bool pickup(PowerUp* powerUp);
 
-    /** @return a List of Events in PEV_* sytle */
-    inline const std::list<int>& getEventList() { return this->events; };
+  void addWeapon(Weapon* weapon, int configID = -1, int slotID = -1);
+  void removeWeapon(Weapon* weapon);
+  void nextWeaponConfig();
+  void previousWeaponConfig();
 
-    int       writeSync(const byte* data, int length, int sender);
-    int       readSync(byte* data, int maxLength );
-    bool      needsReadSync();
+  inline WeaponManager& getWeaponManager() { return this->weaponMan; };
+  void weaponConfigChanged();
 
 
-    //
-    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))); }
+  bool setPlayer(Player* player);
+  Player* getCurrentPlayer() const { return this->currentPlayer; };
 
-    inline void setScore( int score ) { this->score = score; }
-    inline int  getScore() { return this->score; }
+  void attachCamera();
+  void detachCamera();
+  virtual void setCameraMode(unsigned int cameraMode = 0);
+  bool playmodeSupported(Playable::Playmode playmode) const { return this->supportedPlaymodes & playmode; };
+  bool setPlayMode(Playable::Playmode playmode);
 
-  protected:
-    Playable();
+  virtual void collidesWith(WorldEntity* entity, const Vector& location);
+  virtual void process(const Event &event);
 
-    virtual void enter() = 0;
-    virtual void leave() = 0;
+  virtual void tick(float dt);
 
-    void registerEvent(int eventType);
-    void unregisterEvent(int eventType);
+  /** @return a List of Events in PEV_* sytle */
+  inline const std::vector<int>& getEventList() { return this->events; };
 
-  private:
-    WeaponManager         weaponMan;          //!< the weapon manager: managing a list of weapon to wepaon-slot mapping
-    std::list<int>        events;             //!< A list of Events, that are captured for this playable
-
-    Player*               currentPlayer;      //!< The Player currently connected to this Playable (the one that has controll) otherwise NULL
-
-    bool                  bFire;              //!< If the Ship is firing.
-    int                   oldFlags;           //!< Used for synchronisation
-
-    int                   score;
-    int                   oldScore;
-
-    bool                  bDead;
-
-    //TODO HACK: explosion emitter
+  int       writeSync(const byte* data, int length, int sender);
+  int       readSync(byte* data, int maxLength );
+  bool      needsReadSync();
 
 
-    WorldEntity* collider;
+  //
+  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; }
+
+protected:
+  Playable();
+
+  virtual void enter() = 0;
+  virtual void leave() = 0;
+
+  void setSupportedPlaymodes(short playmodes) { this->supportedPlaymodes = playmodes; };
+
+  void registerEvent(int eventType);
+  void unregisterEvent(int eventType);
+
+private:
+  WeaponManager         weaponMan;          //!< the weapon manager: managing a list of weapon to wepaon-slot mapping
+  std::vector<int>      events;             //!< A list of Events, that are captured for this playable
+
+  Player*               currentPlayer;      //!< The Player currently connected to this Playable (the one that has controll) otherwise NULL
+
+  bool                  bFire;              //!< If the Ship is firing.
+  int                   oldFlags;           //!< Used for synchronisation
+
+  int                   score;
+  int                   oldScore;
+
+  bool                  bDead;
+  short                 supportedPlaymodes; //!< What Playmodes are Supported in this Playable.
+  Playable::Playmode    playmode;           //!< The current playmode.
+
+  WorldEntity* collider;
 };
 
