Index: /data/contentcreation/pps/FabianLandau/mover/WorldEntities.am
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/WorldEntities.am	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/WorldEntities.am	(revision 4844)
@@ -0,0 +1,290 @@
+
+## THE SUBCLASSES. THESE MUST BE DYNAMICALLY LINKED OR COMPILED IN DIRECTLY
+WorldEntities_SOURCES_ = \
+                world_entities/npcs/npc_test1.cc \
+                world_entities/npcs/npc_test.cc \
+                world_entities/npcs/ground_turret.cc \
+                world_entities/npcs/space_turret.cc \
+                world_entities/npcs/network_turret.cc \
+                world_entities/npcs/generic_npc.cc \
+                world_entities/npcs/door.cc \
+                world_entities/npcs/gate.cc \
+                world_entities/npcs/repair_station.cc \
+                world_entities/npcs/attractor_mine.cc \
+                \
+                \
+                world_entities/weapons/weapon_slot.cc \
+                world_entities/weapons/test_gun.cc \
+                world_entities/weapons/laser_cannon.cc \
+                world_entities/weapons/turret.cc \
+                world_entities/weapons/aiming_turret.cc \
+                world_entities/weapons/targeting_turret.cc \
+                world_entities/weapons/cannon.cc \
+                world_entities/weapons/hyperblaster.cc \
+                world_entities/weapons/aim.cc \
+                world_entities/weapons/aiming_system.cc \
+                world_entities/weapons/fps_sniper_rifle.cc \
+                world_entities/weapons/boomerang_gun.cc \
+                world_entities/weapons/light_blaster.cc \
+                world_entities/weapons/medium_blaster.cc \
+                world_entities/weapons/heavy_blaster.cc \
+                world_entities/weapons/swarm_launcher.cc \
+                world_entities/weapons/spike_thrower.cc \
+                world_entities/weapons/acid_launcher.cc \
+                \
+                world_entities/projectiles/lbolt.cc \
+                world_entities/projectiles/mbolt.cc \
+                world_entities/projectiles/hbolt.cc \
+                world_entities/projectiles/swarm_projectile.cc \
+                world_entities/projectiles/bomb.cc \
+                world_entities/projectiles/laser.cc \
+                world_entities/projectiles/rail_projectile.cc \
+                world_entities/projectiles/test_bullet.cc \
+                world_entities/projectiles/rocket.cc \
+                world_entities/projectiles/guided_missile.cc \
+                world_entities/projectiles/boomerang_projectile.cc \
+                world_entities/projectiles/hyperblast.cc \
+                world_entities/projectiles/spike.cc \
+                world_entities/projectiles/acid_splash.cc \
+                \
+                world_entities/projectiles/projectile_weapon.cc \
+                world_entities/projectiles/spike_ball.cc \
+                \
+                world_entities/items/power_ups/turret_power_up.cc \
+                world_entities/items/power_ups/laser_power_up.cc \
+                \
+                world_entities/space_ships/space_ship.cc \
+                world_entities/space_ships/helicopter.cc \
+                world_entities/space_ships/hover.cc \
+                world_entities/space_ships/turbine_hover.cc \
+                world_entities/space_ships/spacecraft_2d.cc \
+                world_entities/space_ships/collision_probe.cc \
+                world_entities/space_ships/cruizer.cc \
+                world_entities/creatures/md2_creature.cc \
+                world_entities/creatures/fps_player.cc \
+                world_entities/spectator.cc \
+                \
+                \
+                world_entities/environments/water.cc \
+                world_entities/environments/model_entity.cc \
+                world_entities/environments/building.cc \
+                world_entities/environments/rotor.cc \
+                world_entities/environments/mapped_water.cc \
+		world_entities/environments/environment.cc \
+		world_entities/environments/skysphere.cc \
+		world_entities/environments/skybox.cc \
+		world_entities/environments/skydome.cc \
+		world_entities/environments/terrain.cc \
+                world_entities/environments/planet.cc \
+                world_entities/environments/bsp_entity.cc \
+                world_entities/environments/mover.cc \
+                world_entities/environments/mover_station.cc \
+                world_entities/environments/mover_station_list.cc \
+                world_entities/environments/mover_trigger.cc \
+                world_entities/environments/mover_trigger_approach.cc \
+                world_entities/environments/mover_trigger_delay_list.cc \
+                world_entities/environments/mover_trigger_event.cc \
+                world_entities/environments/mover_trigger_event_list.cc \
+                world_entities/environments/mover_trigger_intervisibility.cc \
+                world_entities/environments/mover_trigger_key.cc \
+                world_entities/environments/mover_trigger_list.cc \
+                world_entities/environments/mover_trigger_pointer_list.cc \
+                world_entities/environments/mover_trigger_mapstart.cc \
+		\
+		\
+		world_entities/weather_effects/atmospheric_engine.cc \
+		world_entities/weather_effects/weather_effect.cc \
+		world_entities/weather_effects/cloud_effect.cc \
+		world_entities/weather_effects/sun_effect.cc \
+		world_entities/weather_effects/fog_effect.cc \
+		world_entities/weather_effects/volfog_effect.cc \
+		world_entities/weather_effects/rain_effect.cc \
+		world_entities/weather_effects/snow_effect.cc \
+		world_entities/weather_effects/lightning_effect.cc \
+		world_entities/weather_effects/lense_flare.cc \
+		world_entities/elements/image_entity.cc \
+		\
+                world_entities/elements/text_element.cc \
+                world_entities/elements/glgui_radar.cc \
+                \
+                world_entities/effects/lightning_bolt.cc \
+                world_entities/effects/blink.cc \
+                \
+                world_entities/tools/movie_entity.cc \
+                world_entities/tools/recorder.cc \
+                world_entities/tools/blackscreen.cc \
+                world_entities/tools/scrolling_screen.cc \
+                world_entities/tools/mount_point.cc \
+                world_entities/tools/sound_entity.cc \
+                world_entities/tools/camera.cc \
+		\
+                world_entities/script_triggers/script_trigger.cc \
+                world_entities/script_triggers/space_trigger.cc \
+		world_entities/script_triggers/tick_trigger.cc \
+		world_entities/script_triggers/time_trigger.cc \
+                world_entities/script_triggers/action_trigger.cc \
+                \
+                \
+                world_entities/particles/particle_emitter.cc \
+		world_entities/particles/dot_emitter.cc \
+		world_entities/particles/box_emitter.cc \
+		world_entities/particles/plane_emitter.cc \
+                world_entities/particles/emitter_node.cc \
+		world_entities/particles/particle_system.cc \
+		world_entities/particles/sprite_particles.cc \
+		world_entities/particles/spark_particles.cc \
+		world_entities/particles/model_particles.cc \
+		world_entities/particles/dot_particles.cc \
+		world_entities/particles/quick_animation.cc \
+		\
+                \
+                \
+                world_entities/questGUI/quest_gui.cc \
+                world_entities/questGUI/quest.cc
+
+
+
+
+
+
+
+WorldEntities_HEADERS_ = \
+                npcs/npc_test.h \
+                npcs/npc_test1.h \
+                npcs/ground_turret.h \
+                npcs/space_turret.h \
+                npcs/network_turret.h \
+                npcs/door.cc \
+                npcs/repair_station.h \
+                npcs/attractor_mine.h \
+                \
+                environments/environment.h \
+                environments/skysphere.h \
+                environments/skybox.h \
+                environments/skydome.h \
+                environments/terrain.h \
+                tools/movie_entity.h \
+                tools/recorder.h \
+                character_attributes.h \
+                tools/blackscreen.h \
+                tools/scrolling_screen.h \
+                environments/planet.h \
+                environments/bsp_entity.h \
+                tools/mount_point.h \
+                tools/sound_entity.h \
+                tools/camera.h \
+                \
+                questGUI/quest_gui.h \
+		questGUI/quest.h \
+                \
+                weapons/weapon_slot.h \
+                weapons/test_gun.h \
+                weapons/laser_cannon.cc \
+                weapons/cannon.h \
+                weapons/hyperblaster.h \
+                weapons/turret.h \
+                weapons/aiming_turret.h \
+                weapons/targeting_turret.h \
+                weapons/boomerang_gun.h \
+                weapons/aim.h \
+                weapons/aiming_system.h \
+                weapons/fps_sniper_rifle.h \
+                weapons/light_blaster.h \
+                weapons/medium_blaster.h \
+                weapons/heavy_blaster.h \
+                weapons/swarm_launcher.h \
+                weapons/spike_thrower.h \
+                weapons/acid_launcher.h \
+                \
+                projectiles/lbolt.h \
+                projectiles/mbolt.h \
+                projectiles/hbolt.h \
+                projectiles/swarm_projectile.h \
+                projectiles/bomb.h \
+                projectiles/laser.h \
+                projectiles/rail_projectile.h \
+                projectiles/test_bullet.h \
+                projectiles/rocket.h \
+                projectiles/guided_missile.h \
+                projectiles/boomerang_projectile.h \
+                projectiles/hyperblast.h \
+                projectiles/spike.h \
+                projectiles/spike_ball.h \
+                projectiles/acid_splash.h \
+                \
+                projectiles/projectile_weapon.h \
+                projectiles/spike_ball.h \
+                \
+                items/power_ups/turret_power_up.h \
+                items/power_ups/laser_power_up.h \
+                \
+                space_ships/space_ship.h \
+                space_ships/helicopter.h \
+                space_ships/hover.h \
+                space_ships/turbine_hover.h \
+                space_ships/spacecraft_2d.h \
+                space_ships/collision_probe.h \
+                space_ships/cruizer.h \
+                creatures/md2_creature.h \
+                creatures/fps_player.h \
+                spectator.h \
+                \
+                environments/water.h \
+                environments/model_entity.h \
+                environments/building.h \
+                environments/mapped_water.h \
+                environments/rotor.h \
+                environments/mover.h \
+                environments/mover_station.h \
+                environments/mover_station_list.h \
+                environments/mover_trigger.h \
+                environments/mover_trigger_approach.h \
+                environments/mover_trigger_delay_list.h \
+                environments/mover_trigger_event.h \
+                environments/mover_trigger_event_list.h \
+                environments/mover_trigger_intervisibility.h \
+                environments/mover_trigger_key.h \
+                environments/mover_trigger_list.h \
+                environments/mover_trigger_pointer_list.h \
+                environments/mover_trigger_mapstart.h \
+                \
+                elements/image_entity.h \
+                elements/text_element.h \
+                elements/glgui_radar.h \
+                \
+                effects/lightning_bolt.h \
+                effects/blink.h \
+                \
+                script_triggers/space_trigger.h \
+		script_triggers/tick_trigger.h \
+		script_triggers/time_trigger.h \
+                script_triggers/action_trigger.h \
+                \
+                \
+		particles/particle_emitter.h \
+		particles/dot_emitter.h \
+		particles/box_emitter.h \
+		particles/plane_emitter.h \
+                particles/emitter_node.h \
+		\
+		particles/particle_system.h \
+		particles/sprite_particles.h \
+		particles/spark_particles.h \
+		particles/model_particles.h \
+		particles/dot_particles.h \
+		\
+		particles/quick_animation.h \
+		\
+		\
+		weather_effects/atmospheric_engine.h \
+		weather_effects/weather_effect.h \
+		weather_effects/sun_effect.h \
+		weather_effects/fog_effect.h \
+		weather_effects/volfog_effect.h \
+		weather_effects/rain_effect.h \
+		weather_effects/snow_effect.h \
+		weather_effects/cloud_effect.h \
+		weather_effects/lightning_effect.h \
+		weather_effects/lense_flare.h
+
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/Kopie von mover.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/Kopie von mover.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/Kopie von mover.cc	(revision 4844)
@@ -0,0 +1,254 @@
+/*
+   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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "sound/resource_sound_buffer.h"
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "debug.h"
+
+#include "mover.h"
+#include "state.h"
+#include "tools/camera.h"
+
+
+ObjectListDefinition(Mover);
+CREATE_FACTORY(Mover);
+
+/**
+ *  initializes the Mover from a XmlElement
+*/
+Mover::Mover(const TiXmlElement* root)
+{
+    this->registerObject(this, Mover::_objectList);
+    this->toList(OM_ENVIRON);
+
+    this->targetCoordinates = Vector(0, 0, 0);
+    this->originCoordinates = Vector(0, 87, -256);
+    this->actionRadius = 40.0;
+    this->actionTime = 1.0;
+
+    if (root != NULL)
+        this->loadParams(root);
+
+    this->updateNode(0.001);
+    this->originCoordinates = this->getAbsCoor();
+    this->state = Closed;
+
+    this->soundSource_starting.setSourceNode(this);
+    this->soundSource_moving.setSourceNode(this);
+    this->soundSource_ending.setSourceNode(this);
+
+//    this->soundSource_starting.setRolloffFactor(0.0);
+//    this->soundSource_moving.setRolloffFactor(0.0);
+//    this->soundSource_ending.setRolloffFactor(0.0);
+}
+
+Mover::~Mover()
+{
+    if (this->soundSource_starting.isPlaying())
+        this->soundSource_starting.stop();
+    if (this->soundSource_moving.isPlaying())
+        this->soundSource_moving.stop();
+    if (this->soundSource_ending.isPlaying())
+        this->soundSource_ending.stop();
+}
+
+/**
+ * loads the Settings of the Mover from an XML-element.
+ * @param root the XML-element to load the Movers's properties from
+ */
+void Mover::loadParams(const TiXmlElement* root)
+{
+    WorldEntity::loadParams(root);
+
+    LoadParam(root, "rel-target-coor", this, Mover, setTargetCoordinates)
+        .describe("sets the relative target coordinates of the door");
+    LoadParam(root, "action-radius", this, Mover, setActionRadius)
+        .describe("sets the action radius of the door")
+        .defaultValues(40.0);
+    LoadParam(root, "action-time", this, Mover, setActionTime)
+        .describe("sets the action time of the door")
+        .defaultValues(1.0);
+    LoadParam(root, "stay-open-time", this, Mover, setStayOpenTime)
+        .describe("sets the time, the door must stay open")
+        .defaultValues(0.0);
+    LoadParam(root, "opening-sound", this, Mover, setOpeningSoundFile)
+        .describe("Sets the file of the opening sound source");
+    LoadParam(root, "opened-sound", this, Mover, setOpenedSoundFile)
+        .describe("Sets the file of the opened sound source");
+    LoadParam(root, "moving-sound", this, Mover, setMovingSoundFile)
+        .describe("Sets the file of the moving sound source");
+    LoadParam(root, "closing-sound", this, Mover, setClosingSoundFile)
+        .describe("Sets the file of the closing sound source");
+    LoadParam(root, "closed-sound", this, Mover, setClosedSoundFile)
+        .describe("Sets the file of the closed sound source");
+}
+
+void Mover::setOpeningSoundFile(const std::string& fileName)
+{
+    this->soundBuffer_opening = OrxSound::ResourceSoundBuffer(fileName);
+}
+
+void Mover::setOpenedSoundFile(const std::string& fileName)
+{
+    this->soundBuffer_opened = OrxSound::ResourceSoundBuffer(fileName);
+}
+
+void Mover::setMovingSoundFile(const std::string& fileName)
+{
+    this->soundBuffer_moving = OrxSound::ResourceSoundBuffer(fileName);
+}
+
+void Mover::setClosingSoundFile(const std::string& fileName)
+{
+    this->soundBuffer_closing = OrxSound::ResourceSoundBuffer(fileName);
+}
+
+void Mover::setClosedSoundFile(const std::string& fileName)
+{
+    this->soundBuffer_closed = OrxSound::ResourceSoundBuffer(fileName);
+}
+
+/**
+ * tick function
+ */
+void Mover::tick(float dt)
+{
+    if (this->state == Closed)
+    {
+        if (this->checkPlayerInActionRadius())
+        {
+            this->state = Opening;
+            if (this->soundBuffer_opening.loaded())
+                this->soundSource_starting.play(this->soundBuffer_opening);
+            if (this->soundBuffer_moving.loaded())
+                this->soundSource_moving.play(this->soundBuffer_moving, 1.0, true);
+        }
+    }
+    else if (this->state == Opening)
+    {
+        if (this->checkOpen(dt))
+        {
+            this->state = Open;
+            this->setAbsCoor(this->originCoordinates + this->targetCoordinates);
+            if (this->soundBuffer_opened.loaded())
+                this->soundSource_ending.play(this->soundBuffer_opened);
+            if (this->soundBuffer_moving.loaded())
+                this->soundSource_moving.stop();
+        }
+        this->openTime = 0;
+    }
+    else if (this->state == Open)
+    {
+        this->openTime += dt;
+        if (this->openTime >= this->stayOpenTime)
+        {
+            if (!this->checkPlayerInActionRadius())
+            {
+                this->state = Closing;
+                if (this->soundBuffer_closing.loaded())
+                    this->soundSource_starting.play(this->soundBuffer_closing);
+                if (this->soundBuffer_moving.loaded())
+                    this->soundSource_moving.play(this->soundBuffer_moving, 1.0, true);
+            }
+        }
+    }
+    else if (this->state == Closing)
+    {
+        if (this->checkClosed(dt))
+        {
+            this->state = Closed;
+            this->setAbsCoor(this->originCoordinates);
+            if (this->soundBuffer_closed.loaded())
+                this->soundSource_ending.play(this->soundBuffer_closed);
+            if (this->soundBuffer_moving.loaded())
+                this->soundSource_moving.stop();
+        }
+        if (this->checkPlayerInActionRadius())
+        {
+            this->state = Opening;
+        }
+    }
+
+    if (this->state == Opening)
+    {
+        this->shiftCoor(this->targetCoordinates / this->actionTime * dt);
+    }
+    else if (this->state == Closing)
+    {
+        this->shiftCoor(this->targetCoordinates * (-1) / this->actionTime * dt);
+    }
+}
+
+/**
+ * checks if the door is open
+ */
+bool Mover::checkOpen(float dt)
+{
+    if (fabs((this->originCoordinates - (this->getAbsCoor() - this->targetCoordinates)).len()) < fabs(2 * (this->targetCoordinates / this->actionTime * dt).len()))
+        return true;
+    
+    return false;
+}
+
+/**
+ * checks if the door is closed
+ */
+bool Mover::checkClosed(float dt)
+{
+    if (fabs((this->getAbsCoor() - this->originCoordinates).len()) < fabs(2 * (this->targetCoordinates / this->actionTime * dt).len()))
+        return true;
+
+    return false;
+}
+
+#include "playable.h"
+#include "../npcs/generic_npc.h"
+/**
+ * checks if the player is within the action radius
+ */
+bool Mover::checkPlayerInActionRadius()
+{
+    WorldEntity* entity;
+    float distance;
+
+    for (ObjectList<Playable>::const_iterator it = Playable::objectList().begin();
+        it != Playable::objectList().end();
+        ++it)
+    // for all players
+    {
+        entity = (*it);
+        distance = (this->originCoordinates - entity->getAbsCoor()).len();
+        if (distance < this->actionRadius)
+        {
+            this->soundSource_starting.setSourceNode((PNode*)State::getCamera());   // bad hack!
+            this->soundSource_moving.setSourceNode((PNode*)State::getCamera());     // TODO: make the sound louder without
+            this->soundSource_ending.setSourceNode((PNode*)State::getCamera());     // attaching him to the player
+            return true;
+        }
+    }
+
+    for (ObjectList<GenericNPC>::const_iterator it = GenericNPC::objectList().begin();
+        it != GenericNPC::objectList().end();
+        ++it)
+    {
+        entity = (*it);
+        distance = (this->originCoordinates - entity->getAbsCoor()).len();
+        if (distance < this->actionRadius)
+            return true;
+    }
+
+    return false;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/Kopie von mover.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/Kopie von mover.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/Kopie von mover.h	(revision 4844)
@@ -0,0 +1,72 @@
+/*!
+ * @file mover.h
+ *  Mover is an object which moves from its origin to relatively given coordinates
+ *  within a given action-time as soon as the player enters the action-radius.
+ */
+
+#ifndef _MOVER_H
+#define _MOVER_H
+
+/* INCLUDES */
+#include "world_entity.h"
+
+#include "sound_buffer.h"
+#include "sound_source.h"
+
+//! A Class to handle a Mover
+class Mover : public WorldEntity
+{
+    ObjectListDeclaration(Mover);
+    public:
+        typedef enum MoverState {
+            Closed        = 0,
+            Opening       = 1,
+            Open          = 2,
+            Closing       = 3,
+            Locked        = 4
+        };
+
+        Mover(const TiXmlElement* root = NULL);
+        virtual ~Mover();
+
+        virtual void loadParams(const TiXmlElement* root);
+
+        void setTargetCoordinates(float x, float y, float z) { this->targetCoordinates = Vector(x,y,z); }
+        void setActionRadius(float radius) { this->actionRadius = radius; }
+        void setActionTime(float time) { this->actionTime = time; }
+        void setStayOpenTime(float time) { this->stayOpenTime = time; }
+        void setOpeningSoundFile(const std::string& fileName);
+        void setOpenedSoundFile(const std::string& fileName);
+        void setMovingSoundFile(const std::string& fileName);
+        void setClosingSoundFile(const std::string& fileName);
+        void setClosedSoundFile(const std::string& fileName);
+
+        virtual void tick(float dt);
+
+    private:
+        bool checkOpen(float dt);
+        bool checkClosed(float dt);
+        bool checkPlayerInActionRadius();
+    
+        OrxSound::SoundSource       soundSource_starting;
+        OrxSound::SoundSource       soundSource_moving;
+        OrxSound::SoundSource       soundSource_ending;
+        OrxSound::SoundBuffer       soundBuffer_opening;
+        OrxSound::SoundBuffer       soundBuffer_opened;
+        OrxSound::SoundBuffer       soundBuffer_moving;
+        OrxSound::SoundBuffer       soundBuffer_closing;
+        OrxSound::SoundBuffer       soundBuffer_closed;
+
+        Vector                      targetCoordinates;          //!< the target coordinates
+        Vector                      originCoordinates;          //!< the origin coordinates
+        float                       actionRadius;               //!< the action-radius
+        float                       actionTime;                 //!< the action-time
+        int                         state;                      //!< the state of the mover
+        float                       stayOpenTime;               //!< waiting time while opened
+        float                       openTime;                   //!< time since opened
+};
+
+#endif  /* _MOVER_H */
+
+
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover.cc	(revision 4844)
@@ -0,0 +1,352 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "sound/resource_sound_buffer.h"
+#include "util/loading/load_param_xml.h"
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover.h"
+
+#define CLOSED 0
+#define OPEN 1
+#define MOVE 2
+#define WAIT 3
+#define NEXT 4
+#define DELAY 5
+#define STAY 6
+
+ObjectListDefinition(Mover);
+CREATE_FACTORY(Mover);
+
+
+Mover::Mover(const TiXmlElement* root)
+{
+    PRINTF(0)("1_1 Mover %p created\n", this);
+    this->registerObject(this, Mover::_objectList);
+    this->toList(OM_ENVIRON);
+
+    this->bLoop = false;
+    this->bRepeat = false;
+    this->bWaitAfterEachStation = false;
+    this->bOnlyMoveWhileTriggered = false;
+    this->bAttachTrigger = false;
+    this->bReopen = false;
+    this->bReclose = false;
+    
+    this->triggers = 0;
+    this->stations = 0;
+
+    this->repeats = 0;
+    this->state = CLOSED;
+    this->station = 0;
+    this->repeatsToGo = 0;
+    this->time = 0;
+    
+    this->originCoor = Vector(0, 0, 0);
+    this->originDir = Quaternion(0, Vector(0, 0, 0));
+
+    this->soundSource_starting.setSourceNode(this);
+    this->soundSource_moving.setSourceNode(this);
+    this->soundSource_ending.setSourceNode(this);
+
+    PRINTF(0)("1_2\n");
+    if (root != NULL)
+        this->loadParams(root);
+        
+    this->updateNode(0.001);
+        
+    this->originCoor = this->getAbsCoor();
+    this->originDir = this->getAbsDir();
+
+    PRINTF(0)("1_3\n");
+    if (this->stations)
+        this->station = this->stations->getNextStation(0);
+    PRINTF(0)("1_4\n");
+    if (this->triggers)
+        this->triggers->setBaseCoor(this->getAbsCoor());
+    PRINTF(0)("1_5\n");
+}
+
+Mover::~Mover()
+{
+    if (this->triggers)
+        delete this->triggers;
+    if (this->stations)
+        delete this->stations;
+    
+    if (this->soundSource_starting.isPlaying())
+        this->soundSource_starting.stop();
+    if (this->soundSource_moving.isPlaying())
+        this->soundSource_moving.stop();
+    if (this->soundSource_ending.isPlaying())
+        this->soundSource_ending.stop();
+}
+
+void Mover::loadParams(const TiXmlElement* root)
+{
+    PRINTF(0)("2_1\n");
+    WorldEntity::loadParams(root);
+
+    LoadParam(root, "bLoop", this, Mover, setLoop)
+        .describe("After getting triggered, the mover loops forever.")
+        .defaultValues(false);
+    LoadParam(root, "bRepeat", this, Mover, setRepeat)
+        .describe("After getting triggered, the mover moves n times.")
+        .defaultValues(1);
+    LoadParam(root, "bWaitAfterEachStation", this, Mover, setWaitAfterEachStation)
+        .describe("After each station, the mover waits until he gets triggered.")
+        .defaultValues(false);
+    LoadParam(root, "bOnlyMoveWhileTriggered", this, Mover, setOnlyMoveWhileTriggered)
+        .describe("The mover stops as soon as he gets untriggered.")
+        .defaultValues(false);
+    LoadParam(root, "bAttachTrigger", this, Mover, setAttachTrigger)
+        .describe("The trigger follows the mover.")
+        .defaultValues(false);
+    LoadParam(root, "bReopen", this, Mover, setReopen)
+        .describe("Stops closing and reopens the mover when he gets triggered again.")
+        .defaultValues(false);
+    LoadParam(root, "bReclose", this, Mover, setReclose)
+        .describe("Stops opening and recloses the mover when he gets untriggered.")
+        .defaultValues(false);
+    PRINTF(0)("2_2\n");
+    LoadParamXML(root, "triggers", this, Mover, setTriggers)
+        .describe("Adds a trigger that releases the mover.");
+    PRINTF(0)("2_3\n");
+    LoadParamXML(root, "stations", this, Mover, setStations)
+        .describe("Adds a station to the movers stations-list.");
+    PRINTF(0)("2_4\n");
+}
+
+void Mover::setTriggers(const TiXmlElement* root)
+{
+    PRINTF(0)("3_1\n");
+    this->triggers = new MoverTriggerList();
+    const TiXmlElement* element = root->FirstChildElement();
+    
+    PRINTF(0)("3_2\n");
+    while (element != NULL)
+    {
+        PRINTF(0)("3_3\n");
+//        PRINTF(0)("TiXmlElement Value:   %s\n", element->Value());
+        BaseObject *newObj = Factory::fabricate(element);
+//        PRINTF(0)("BaseObject ClassName: %s\n", newObj->getClassCName());
+//        MoverTrigger *newTrigger = ((MoverTrigger*)(&newObj));
+        MoverTrigger *newTrigger = (dynamic_cast< MoverTrigger *> ( newObj ));
+        this->triggers->addTrigger(newTrigger);
+//        this->triggers->addTrigger(MoverTrigger::createTrigger(element));
+        PRINTF(0)("3_4\n");
+        element = element->NextSiblingElement();
+        PRINTF(0)("3_5\n");
+    }
+    PRINTF(0)("3_6\n");
+}
+
+void Mover::setStations(const TiXmlElement* root)
+{
+    PRINTF(0)("4_1\n");
+    this->stations = new MoverStationList();
+    const TiXmlElement* element = root->FirstChildElement();
+
+    PRINTF(0)("4_2\n");
+    while (element != NULL)
+    {
+        PRINTF(0)("4_3\n");
+        this->stations->addStation(new MoverStation(element));
+        element = element->NextSiblingElement();
+    }
+    PRINTF(0)("4_4\n");
+}
+
+void Mover::tick(float dt)
+{
+//    PRINTF(0)("15_1 mover state of mover %p is %i, triggerlist is %p\n", this, this->state, this->triggers);
+    if (this->state == DELAY || this->state == MOVE || this->state == STAY)
+        this->time += dt;
+
+    if (this->state == NEXT)
+        this->changeState(this->next());
+        
+    if (this->state == WAIT)
+        this->changeState(this->wait());
+        
+    if (this->state == CLOSED)
+        this->changeState(this->closed());
+
+    if (this->state == OPEN)
+        this->changeState(this->open());
+
+    if (this->state == DELAY)
+        this->changeState(this->delay());
+
+    if (this->state == MOVE)
+        this->changeState(this->move(dt));
+
+    if (this->state == STAY)
+        this->changeState(this->stay());
+}
+
+void Mover::changeState(int state)
+{
+    if (this->state == state)
+        return;
+        
+    this->state = state;
+    
+    if (this->state == DELAY || this->state == STAY)
+        this->time = 0;
+}
+
+int Mover::closed()
+{
+    if (this->triggers && this->triggers->isTriggered())
+    {
+        if (this->bRepeat)
+            this->repeatsToGo = this->repeats;
+            
+        return DELAY;
+    }
+
+    return CLOSED;
+}
+
+int Mover::open()
+{
+    if (this->triggers && !this->triggers->isTriggered())
+    {
+        return DELAY;
+    }
+
+    return OPEN;
+}
+
+int Mover::wait()
+{
+    if (this->triggers && this->triggers->isTriggered())
+    {
+        this->soundSource_moving.play();
+        return MOVE;
+    }
+
+    return WAIT;
+}
+
+int Mover::next()
+{
+    bool isOpen = false;
+    bool isClosed = false;
+    if (this->stations)
+    {
+        isOpen = this->stations->isOpen(station);
+        isClosed = this->stations->isClosed(station);
+        this->station = this->stations->getNextStation(this->station);
+    }
+
+    if (isClosed && this->bRepeat)
+        this->repeatsToGo--;
+        
+    if (isClosed && (!this->bLoop && this->repeatsToGo <= 0))
+        return CLOSED;
+
+    if (isOpen && (!this->bLoop && this->repeatsToGo <= 0))
+        return OPEN;
+
+    if (this->bWaitAfterEachStation)
+        return WAIT;
+
+    if ((this->bLoop || this->repeats > 0) || (!isOpen && !isClosed))
+        return DELAY;
+        
+    return NEXT;
+}
+
+int Mover::delay()
+{
+    if (!this->stations || (this->time < this->stations->getDelay(this->station)))
+        return DELAY;
+
+    if (this->stations->getStartingSound(this->station).loaded())
+        this->soundSource_starting.play(this->stations->getStartingSound(this->station));
+    if (this->stations->getMovingSound(this->station).loaded())
+        this->soundSource_moving.play(this->stations->getMovingSound(this->station), 1.0, true);
+
+    this->time = 0;
+    
+    return MOVE;
+}
+
+int Mover::move(float dt)
+{
+    if (this->stations)
+    {
+        this->shiftCoor(this->stations->getVelocity(this->station) * dt);
+        this->setAbsDir(this->originDir * (this->stations->getRotation(this->station) * this->time));
+    }
+    
+    if (this->bAttachTrigger && this->triggers)
+        this->triggers->setBaseCoor(this->getAbsCoor());
+
+    if (!this->bLoop && this->repeatsToGo <= 0)
+    {
+        if (this->stations && this->triggers && this->stations->changeDirection(this->bReopen, this->bReclose, this->triggers->isTriggered()))
+        {
+            this->time = this->stations->getMovingTime(this->station) - this->time;
+            this->originCoor = this->originCoor - this->stations->getRelTargetCoor(this->station);
+            this->originDir = this->originDir / this->stations->getRelTargetDir(this->station);
+        }
+    }
+
+    if (/*this->reachedStationsTarget(dt) || */(this->stations && (this->time >= 1.1 * this->stations->getMovingTime(this->station))))
+//    if (this->stations && (this->time >= this->stations->getMovingTime(this->station)))
+    {
+        this->setAbsCoor(this->originCoor + this->stations->getRelTargetCoor(this->station));
+        this->setAbsDir(this->originDir * this->stations->getRelTargetDir(this->station));
+
+        if (this->stations->getEndingSound(this->station).loaded())
+            this->soundSource_ending.play(this->stations->getEndingSound(this->station));
+        this->soundSource_moving.stop();
+
+        this->originCoor = this->originCoor + this->stations->getRelTargetCoor(this->station);
+        this->originDir = this->originDir * this->stations->getRelTargetDir(this->station);
+        
+        return STAY;
+    }
+        
+    if (this->triggers && this->bOnlyMoveWhileTriggered && (!this->triggers->isTriggered()))
+    {
+        this->soundSource_moving.stop();
+        return WAIT;
+    }
+
+    return MOVE;
+}
+
+int Mover::stay()
+{
+    if (!this->stations || (this->time < this->stations->getStayOpenTime(this->station)))
+        return STAY;
+
+    return NEXT;
+}
+
+bool Mover::reachedStationsTarget(float dt)
+{
+    if (this->stations)
+        if ((this->getAbsCoor() - (this->originCoor + this->stations->getRelTargetCoor(this->station))).len() <= 1.2 * (this->stations->getVelocity(this->station) * dt).len())
+            if (fabs((this->getAbsDir() / (this->originDir * this->stations->getRelTargetDir(this->station))).w) <= 1.2 * fabs(this->stations->getRotation(this->station).w * dt))
+                return true;
+
+    return false;
+}
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover.h	(revision 4844)
@@ -0,0 +1,74 @@
+/*!
+ * @file mover.h
+ *  A mover is an object that moves along scripted paths, released by scripted events.
+ */
+
+#ifndef _MOVER_H
+#define _MOVER_H
+
+#include "world_entity.h"
+#include "mover_trigger.h"
+#include "mover_station.h"
+#include "mover_trigger_list.h"
+#include "mover_station_list.h"
+#include "sound_source.h"
+
+
+class Mover : public WorldEntity
+{
+    ObjectListDeclaration(Mover);
+
+    public:
+        Mover(const TiXmlElement* root = NULL);
+        virtual ~Mover();
+
+        virtual void loadParams(const TiXmlElement* root);
+        virtual void tick(float dt);
+
+        void setLoop(bool bLoop = true) { this->bLoop = bLoop; }
+        void setRepeat(int n) { this->bRepeat = true; this->repeats = n; }
+        void setWaitAfterEachStation(bool bWaitAfterEachStation = true) { this->bWaitAfterEachStation = bWaitAfterEachStation; }
+        void setOnlyMoveWhileTriggered(bool bOnlyMoveWhileTriggered = true) { this->bOnlyMoveWhileTriggered = bOnlyMoveWhileTriggered; }
+        void setAttachTrigger(bool bAttachTrigger = true) { this->bAttachTrigger = bAttachTrigger; }
+        void setTriggers(const TiXmlElement* root);
+        void setStations(const TiXmlElement* root);
+        void setReopen(bool bReopen = true) { this->bReopen = bReopen; }
+        void setReclose(bool bReclose = true) { this->bReclose = bReclose; }
+
+    private:
+        void changeState(int state);
+        int closed();
+        int open();
+        int move(float dt);
+        int wait();
+        int next();
+        int delay();
+        int stay();
+        bool reachedStationsTarget(float dt);
+
+        bool                        bLoop;
+        bool                        bRepeat;
+        int                         repeats;
+        bool                        bWaitAfterEachStation;
+        bool                        bOnlyMoveWhileTriggered;
+        bool                        bAttachTrigger;
+        bool                        bReopen;
+        bool                        bReclose;
+        
+        MoverTriggerList            *triggers;
+        MoverStationList            *stations;
+        
+        int                         state;
+        MoverStation                *station;
+        float                       time;
+        int                         repeatsToGo;
+        Vector                      originCoor;
+        Quaternion                  originDir;
+
+        OrxSound::SoundSource       soundSource_starting;
+        OrxSound::SoundSource       soundSource_moving;
+        OrxSound::SoundSource       soundSource_ending;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_station.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_station.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_station.cc	(revision 4844)
@@ -0,0 +1,103 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_station.h"
+#include "debug.h"
+
+ObjectListDefinition(MoverStation);
+CREATE_FACTORY(MoverStation);
+
+
+MoverStation::MoverStation(const TiXmlElement* root)
+{
+    PRINTF(0)("MoverStation %p erzeugt\n", this);
+    this->rank = 0;
+    this->relTargetCoor = Vector(0, 0, 0);
+    this->relTargetDir = Quaternion(0, Vector(0, 0, 0));
+    this->delay = 0;
+    this->movingTime = 0;
+    this->stayOpenTime = 0;
+    this->bAccelerate = false;
+    this->bDecelerate = false;
+    this->jumpToRank = 0;
+    this->bJumpToRank = false;
+    this->moveToRank = 0;
+    this->bMoveToRank = false;
+    this->bIsOpen = false;
+    this->bIsClosed = false;;
+
+    if (root != NULL)
+        this->loadParams(root);
+}
+
+MoverStation::~MoverStation()
+{
+}
+
+void MoverStation::loadParams(const TiXmlElement* root)
+{
+    WorldEntity::loadParams(root);
+
+    LoadParam(root, "rank", this, MoverStation, setRank)
+        .describe("The rank of the station in the stationlist of the mover.")
+        .defaultValues(0);
+    LoadParam(root, "rel-target-coor", this, MoverStation, setRelTargetCoor)
+        .describe("The relative coordinates of the stations target.")
+        .defaultValues(0, 0, 0);
+    LoadParam(root, "rel-target-dir", this, MoverStation, setRelTargetDir)
+        .describe("The relative direction of the stations target.")
+        .defaultValues(0, 0, 0, 0);
+    LoadParam(root, "delay", this, MoverStation, setDelay)
+        .describe("The amount of time the mover waits, before he starts moving.")
+        .defaultValues(0);
+    LoadParam(root, "moving-time", this, MoverStation, setMovingTime)
+        .describe("The amount of time the mover needs to move.")
+        .defaultValues(0);
+    LoadParam(root, "stay-open-time", this, MoverStation, setStayOpenTime)
+        .describe("The amount of time the mover waits when he reached the target.")
+        .defaultValues(0);
+    LoadParam(root, "bAccelerate", this, MoverStation, setAccelerate)
+        .describe("If true, the mover starts slowly and increases his speed.");
+    LoadParam(root, "bDecelerate", this, MoverStation, setDecelerate)
+        .describe("If true, the mover starts fast and decreases his speed.");
+    LoadParam(root, "jump-to-rank", this, MoverStation, setJumpToRank)
+        .describe("The rank of the station the mover should jump to, after reaching the target.")
+        .defaultValues(0);
+    LoadParam(root, "move-to-rank", this, MoverStation, setMoveToRank)
+        .describe("The rank of the station the mover should move to (instead of rel-target-coor).")
+        .defaultValues(0);
+    LoadParam(root, "bOpen", this, MoverStation, setOpen)
+        .describe("If true, the mover changes to state 'open' after reaching this station.");
+    LoadParam(root, "bClosed", this, MoverStation, setClosed)
+        .describe("If true, the mover changes to state 'closed' after reaching this station.");
+    LoadParam(root, "opening-sound", this, MoverStation, setOpeningSoundFile)
+        .describe("Sets the file of the opening sound source");
+    LoadParam(root, "opened-sound", this, MoverStation, setOpenedSoundFile)
+        .describe("Sets the file of the opened sound source");
+    LoadParam(root, "moving-sound", this, MoverStation, setMovingSoundFile)
+        .describe("Sets the file of the moving sound source");
+    LoadParam(root, "closing-sound", this, MoverStation, setClosingSoundFile)
+        .describe("Sets the file of the closing sound source");
+    LoadParam(root, "closed-sound", this, MoverStation, setClosedSoundFile)
+        .describe("Sets the file of the closed sound source");
+        
+    if (this->bMoveToRank)
+    {
+        this->relTargetCoor = Vector(0, 0, 0);
+        this->relTargetDir = Quaternion(0, Vector(0, 0, 0));
+    }
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_station.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_station.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_station.h	(revision 4844)
@@ -0,0 +1,67 @@
+/*!
+ * @file mover_station.h
+ *  A station for a mover.
+ */
+
+#ifndef _MOVER_STATION_H
+#define _MOVER_STATION_H
+
+#include "world_entity.h"
+#include "sound_buffer.h"
+#include "sound/resource_sound_buffer.h"
+
+
+class MoverStation : public WorldEntity
+{
+    friend class MoverStationList;
+
+    ObjectListDeclaration(MoverStation);
+
+    public:
+        MoverStation(const TiXmlElement* root = NULL);
+        virtual ~MoverStation();
+
+        virtual void loadParams(const TiXmlElement* root);
+
+        void setRank(int id) { this->rank = id; }
+        void setRelTargetCoor(float x, float y, float z) { this->relTargetCoor = Vector(x, y, z); }
+        void setRelTargetDir(float w, float x, float y, float z) { this->relTargetDir = Quaternion(w, Vector(x, y, z)); }
+        void setDelay(float t) { this->delay = t; }
+        void setMovingTime(float t) { this->movingTime = t; }
+        void setStayOpenTime(float t) { this->stayOpenTime = t; }
+        void setAccelerate() { this->bAccelerate = true; }
+        void setDecelerate() { this->bDecelerate = true; }
+        void setJumpToRank(int rank) { this->jumpToRank = rank; this->bJumpToRank = true; }
+        void setMoveToRank(int rank) { this->moveToRank = rank; this->bMoveToRank = true; }
+        void setOpen() { this->bIsOpen = true; }
+        void setClosed() { this->bIsClosed = true; }
+        void setOpeningSoundFile(const std::string& fileName) { this->soundBuffer_opening = OrxSound::ResourceSoundBuffer(fileName); }
+        void setOpenedSoundFile(const std::string& fileName) { this->soundBuffer_opened = OrxSound::ResourceSoundBuffer(fileName); }
+        void setMovingSoundFile(const std::string& fileName) { this->soundBuffer_moving = OrxSound::ResourceSoundBuffer(fileName); }
+        void setClosingSoundFile(const std::string& fileName) { this->soundBuffer_closing = OrxSound::ResourceSoundBuffer(fileName); }
+        void setClosedSoundFile(const std::string& fileName) { this->soundBuffer_closed = OrxSound::ResourceSoundBuffer(fileName); }
+
+    private:
+        int                     rank;
+        Vector                  relTargetCoor;
+        Quaternion              relTargetDir;
+        float                   delay;
+        float                   movingTime;
+        float                   stayOpenTime;
+        bool                    bAccelerate;
+        bool                    bDecelerate;
+        int                     jumpToRank;
+        bool                    bJumpToRank;
+        int                     moveToRank;
+        bool                    bMoveToRank;
+        bool                    bIsOpen;
+        bool                    bIsClosed;
+        OrxSound::SoundBuffer   soundBuffer_opening;
+        OrxSound::SoundBuffer   soundBuffer_opened;
+        OrxSound::SoundBuffer   soundBuffer_moving;
+        OrxSound::SoundBuffer   soundBuffer_closing;
+        OrxSound::SoundBuffer   soundBuffer_closed;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_station_list.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_station_list.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_station_list.cc	(revision 4844)
@@ -0,0 +1,451 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "mover_station_list.h"
+#include "debug.h"
+
+
+MoverStationList::MoverStationList()
+{
+    this->first = 0;
+    this->last = 0;
+    this->goForward = true;
+}
+
+MoverStationList::~MoverStationList()
+{
+    MoverStationListElement *temp1 = this->first;
+    MoverStationListElement *temp2;
+    while (temp1 != 0)
+    {
+        temp2 = temp1->next;
+        delete temp1;
+        temp1 = temp2;
+    }
+}
+
+void MoverStationList::addStation(MoverStation *station)
+{
+    PRINTF(0)("Füge MoverStation %p hinzu\n", station);
+    if (this->first == 0)
+    {
+        this->first = new MoverStationListElement(station);
+        this->last = this->first;
+        return;
+    }
+    else
+    {
+        if (this->first->station->rank > station->rank)
+        {
+            MoverStationListElement *temp = this->first;
+            this->first = new MoverStationListElement(station);
+            this->first->next = temp;
+            this->first->next->prev = this->first;
+            return;
+        }
+        else
+        {
+            MoverStationListElement *temp1 = this->first;
+            MoverStationListElement *temp2;
+            while (temp1->next != 0)
+            {
+                if (temp1->next->station->rank > station->rank)
+                {
+                    temp2 = temp1->next;
+                    temp1->next = new MoverStationListElement(station);
+                    temp1->next->prev = temp1;
+                    temp1->next->next = temp2;
+                    temp1->next->next->prev = temp1->next;
+                        
+                    return;
+                }
+                
+                temp1 = temp1->next;
+            }
+            
+            temp1->next = new MoverStationListElement(station);
+            temp1->next->prev = last;
+            last = temp1->next;
+        }
+    }
+}
+
+MoverStation *MoverStationList::getNextStation(MoverStation *station)
+{
+    if (this->goForward)
+    {
+        if (station)
+        {
+            MoverStationListElement *temp;
+            if (station->bJumpToRank)
+            {
+                temp = this->first;
+                while (temp != 0)
+                {
+                    if (temp->station->rank == station->jumpToRank)
+                        return temp->station;
+
+                    temp = temp->next;
+                }
+            } // no "else" here - if jumpToRank wasn't found, we return the following station (as usual)
+
+            if (station->bMoveToRank)
+            {
+                temp = this->first;
+                while (temp != 0)
+                {
+                    if (temp->station->rank == station->moveToRank)
+                        return temp->station;
+
+                    temp = temp->next;
+                }
+            } // no "else" here - if moveToRank wasn't found, we return the following station (as usual)
+
+            temp = this->first;
+            while (temp != 0)
+            {
+                if (temp->station == station)
+                {
+                    if (temp->next)
+                    {
+                        return temp->next->station;
+                    }
+                    else
+                    {
+                        this->goForward = false;
+                        return this->last->station;
+                    }
+                }
+                temp = temp->next;
+            }
+            return 0;
+        }
+        else
+        {
+            if (this->first)
+                return this->first->station;
+            else
+                return 0;
+        }
+    }
+    else
+    {
+        if (station)
+        {
+            MoverStationListElement *temp;
+            if (station->bJumpToRank)
+            {
+                temp = this->last;
+                while (temp != 0)
+                {
+                    if (temp->station->rank == station->jumpToRank)
+                        return temp->station;
+
+                    temp = temp->prev;
+                }
+            } // no "else" here - if jumpToRank wasn't found, we return the following station (as usual)
+
+            if (station->bMoveToRank)
+            {
+                temp = this->last;
+                while (temp != 0)
+                {
+                    if (temp->station->rank == station->moveToRank)
+                        return temp->station;
+
+                    temp = temp->prev;
+                }
+            } // no "else" here - if moveToRank wasn't found, we return the following station (as usual)
+
+            temp = this->last;
+            while (temp != 0)
+            {
+                if (temp->station == station)
+                {
+                    if (temp->prev)
+                    {
+                        return temp->prev->station;
+                    }
+                    else
+                    {
+                        this->goForward = true;
+                        return this->first->station;
+                    }
+                }
+                temp = temp->prev;
+            }
+            return 0;
+        }
+        else
+        {
+            if (this->last)
+                return this->last->station;
+            else
+                return 0;
+        }
+    }
+}
+
+Vector MoverStationList::getTotalRelCoor(MoverStation *station)
+{
+    MoverStationListElement *temp = this->first;
+    Vector totalRelCoor = Vector(0, 0, 0);
+
+    if (station)
+    {
+        if (this->goForward)
+        {
+            while (temp != 0)
+            {
+                totalRelCoor += temp->station->relTargetCoor;
+                if (temp->station == station)
+                    break;
+
+                temp = temp->next;
+            }
+        }
+        else
+        {
+            if (temp)
+            {
+                while (temp->next != 0)
+                {
+                    totalRelCoor += temp->next->station->relTargetCoor;
+                    if (temp->next->station == station)
+                        break;
+
+                    temp = temp->next;
+                }
+            }
+        }
+    }
+
+    return totalRelCoor;
+}
+
+Quaternion MoverStationList::getTotalRelDir(MoverStation *station)
+{
+    MoverStationListElement *temp = this->first;
+    Quaternion totalRelDir = Quaternion(0, Vector(0, 0, 0));
+    
+    if (station)
+    {
+        if (this->goForward)
+        {
+            while (temp != 0)
+            {
+                totalRelDir *= temp->station->relTargetDir;
+                if (temp->station == station)
+                    break;
+
+                temp = temp->next;
+            }
+        }
+        else
+        {
+            if (temp)
+            {
+                while (temp->next != 0)
+                {
+                    totalRelDir *= temp->next->station->relTargetDir;
+                    if (temp->next->station == station)
+                        break;
+
+                    temp = temp->next;
+                }
+            }
+        }
+    }
+
+    return totalRelDir;
+}
+
+bool MoverStationList::isOpen(MoverStation *station)
+{
+    if (station)
+        if ((this->goForward && this->last && this->last->station == station) || station->bIsOpen)
+            return true;
+        
+    return false;
+}
+
+bool MoverStationList::isClosed(MoverStation *station)
+{
+    if (station)
+        if ((!this->goForward && this->first && this->first->station == station) || station->bIsClosed)
+            return true;
+        
+    return false;
+}
+
+bool MoverStationList::changeDirection(bool bReopen, bool bReclose, bool bIsTriggered)
+{
+    if (this->goForward && bReclose && !bIsTriggered)
+    {
+        this->goForward = false;
+        return true;
+    }
+    
+    if (!this->goForward && bReopen && bIsTriggered)
+    {
+        this->goForward = true;
+        return true;
+    }
+    
+    return false;
+}
+
+Vector MoverStationList::getRelTargetCoor(MoverStation *station)
+{
+    if (station)
+    {
+        if (!station->bMoveToRank)
+        {
+            if (this->goForward)
+                return station->relTargetCoor;
+            else
+                return station->relTargetCoor * -1;
+        }
+        else
+        {
+            MoverStation *moveToStation = this->getStation(station->moveToRank);
+
+            if (moveToStation != 0)
+            {
+                if (this->goForward)
+                    return (this->getTotalRelCoor(station) - this->getTotalRelCoor(moveToStation)) * -1;
+                else
+                    return (this->getTotalRelCoor(station) - this->getTotalRelCoor(moveToStation));
+            }
+        }
+    }
+    
+    return Vector(0, 0, 0);
+}
+
+Quaternion MoverStationList::getRelTargetDir(MoverStation *station)
+{
+    if (station)
+    {
+        if (!station->bMoveToRank)
+        {
+            if (this->goForward)
+                return station->relTargetDir;
+            else
+                return station->relTargetDir.inverse();
+        }
+        else
+        {
+            MoverStation *moveToStation = this->getStation(station->moveToRank);
+
+            if (moveToStation != 0)
+            {
+                if (this->goForward)
+                    return (station->relTargetDir / this->getTotalRelDir(moveToStation)).inverse();
+                else
+                    return (station->relTargetDir / this->getTotalRelDir(moveToStation));
+            }
+        }
+    }
+    
+    return Quaternion(0, Vector(0, 0, 0));
+}
+
+Vector MoverStationList::getVelocity(MoverStation *station)
+{
+    Vector velocity = Vector(0, 0, 0);
+
+    if (station)
+        if (station->movingTime != 0)
+            velocity = this->getRelTargetCoor(station) / station->movingTime;
+
+    return velocity;
+}
+
+Quaternion MoverStationList::getRotation(MoverStation *station)
+{
+    Quaternion rotation = Quaternion(0, Vector(0, 0, 0));
+
+    if (station)
+        if (station->movingTime != 0)
+            rotation = Quaternion(this->getRelTargetDir(station).w / station->movingTime, this->getRelTargetDir(station).v);
+
+    return rotation;
+}
+
+OrxSound::SoundBuffer MoverStationList::getStartingSound(MoverStation *station)
+{
+    if (station)
+    {
+        if (this->goForward)
+            return station->soundBuffer_opening;
+        else
+            return station->soundBuffer_closing;
+    }
+
+    return OrxSound::ResourceSoundBuffer("");
+}
+
+OrxSound::SoundBuffer MoverStationList::getEndingSound(MoverStation *station)
+{
+    if (station)
+    {
+        if (this->goForward)
+            return station->soundBuffer_opened;
+        else
+            return station->soundBuffer_closed;
+    }
+
+    return OrxSound::ResourceSoundBuffer("");
+}
+
+OrxSound::SoundBuffer MoverStationList::getMovingSound(MoverStation *station)
+{
+    if (station)
+        return station->soundBuffer_moving;
+
+    return OrxSound::ResourceSoundBuffer("");
+}
+
+MoverStation *MoverStationList::getStation(int rank)
+{
+    MoverStationListElement *temp;
+
+    temp = this->first;
+    while (temp != 0)
+    {
+        if (temp->station->rank == rank)
+            return temp->station;
+
+        temp = temp->next;
+    }
+    
+    return 0;
+}
+
+////////////////////////////////////////////////////////
+
+
+MoverStationListElement::MoverStationListElement(MoverStation *station)
+{
+    this->station = station;
+    this->next = 0;
+    this->prev = 0;
+}
+
+MoverStationListElement::~MoverStationListElement()
+{
+    delete this->station;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_station_list.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_station_list.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_station_list.h	(revision 4844)
@@ -0,0 +1,59 @@
+/*!
+ * @file mover_station_list.h
+ *  A list to store and handle several stations.
+ */
+
+#ifndef _MOVER_STATION_LIST_H
+#define _MOVER_STATION_LIST_H
+
+#include "mover_station.h"
+#include "sound_buffer.h"
+
+
+class MoverStationListElement
+{
+    public:
+        MoverStationListElement(MoverStation *station);
+        ~MoverStationListElement();
+
+        MoverStation *station;
+        MoverStationListElement *next;
+        MoverStationListElement *prev;
+};
+
+
+class MoverStationList
+{
+    public:
+        MoverStationList();
+        ~MoverStationList();
+
+        void addStation(MoverStation *station);
+        MoverStation *getNextStation(MoverStation *station);
+        Vector getTotalRelCoor(MoverStation *station);
+        Quaternion getTotalRelDir(MoverStation *station);
+        bool isOpen(MoverStation *station);
+        bool isClosed(MoverStation *station);
+        bool changeDirection(bool bReopen, bool bRelocse, bool bIsTriggered);
+
+        Vector getRelTargetCoor(MoverStation *station);
+        Quaternion getRelTargetDir(MoverStation *station);
+        float getDelay(MoverStation *station) { return station->delay; }
+        float getStayOpenTime(MoverStation *station) { return station->stayOpenTime; }
+        float getMovingTime(MoverStation *station) { return station->movingTime; }
+        Vector getVelocity(MoverStation *station);
+        Quaternion getRotation(MoverStation *station);
+        OrxSound::SoundBuffer getStartingSound(MoverStation *station);
+        OrxSound::SoundBuffer getMovingSound(MoverStation *station);
+        OrxSound::SoundBuffer getEndingSound(MoverStation *station);
+
+    private:
+        MoverStation *getStation(int rank);
+        
+        MoverStationListElement *first;
+        MoverStationListElement *last;
+        bool goForward;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger.cc	(revision 4844)
@@ -0,0 +1,327 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param_xml.h"
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_trigger.h"
+#include "mover_trigger_approach.h"
+#include "mover_trigger_mapstart.h"
+#include "mover_trigger_key.h"
+#include "mover_trigger_event.h"
+#include "mover_trigger_intervisibility.h"
+#include <string.h>
+
+MoverTriggerEventList *MoverTrigger::events = 0;
+
+ObjectListDefinition(MoverTrigger);
+CREATE_FACTORY(MoverTrigger);
+
+
+MoverTrigger::MoverTrigger(const TiXmlElement* root)
+{
+    PRINTF(0)("5_1 MoverTrigger %p created\n", this);
+    this->registerObject(this, MoverTrigger::_objectList);
+    this->toList(OM_ENVIRON);
+
+    PRINTF(0)("5_2\n");
+    this->init_prae_params();
+    PRINTF(0)("5_3\n");
+
+    if (root != NULL)
+        this->loadParams(root);
+
+    PRINTF(0)("5_4\n");
+    this->init_post_params();
+    PRINTF(0)("5_5\n");
+}
+
+MoverTrigger::~MoverTrigger()
+{
+    PRINTF(0)("14_1 MoverTrigger %p destroyed\n", this);
+    if (this->triggers)
+        delete this->triggers;
+        
+    PRINTF(0)("14_2\n");
+    if (this->delaylist)
+        delete this->delaylist;
+    
+    PRINTF(0)("14_3\n");
+    if (MoverTrigger::events)
+    {
+        PRINTF(0)("14_4\n");
+        MoverTrigger::events->removeTrigger(this);
+        if (MoverTrigger::events->isEmpty())
+        {
+            PRINTF(0)("14_5\n");
+            delete MoverTrigger::events;
+            MoverTrigger::events = 0;
+        }
+    }
+    PRINTF(0)("14_6\n");
+}
+
+void MoverTrigger::init_prae_params()
+{
+    PRINTF(0)("6_1\n");
+    this->bIsTriggered = false;
+    this->delay = 0;
+    this->bIsWaitingForDelay = false;
+    this->relCoor = Vector(0, 0, 0);
+    this->bStayTriggered = false;
+    this->bTriggerOnceOnly = false;
+    this->bInvert = false;
+    this->bSwitch = false;
+    this->bObligatory = false;
+    this->bFirstRelease = true;
+    this->oldState = false;
+    this->time = 0;
+    
+    this->triggers = 0;
+    this->delaylist = 0;
+    
+//    if (!this->delaylist)
+        this->delaylist = new MoverTriggerDelayList();
+
+//    if (!this->triggers)
+        this->triggers = new MoverTriggerList();
+
+    PRINTF(0)("6_2\n");
+
+    if (!MoverTrigger::events)
+        MoverTrigger::events = new MoverTriggerEventList();
+        
+    PRINTF(0)("6_3\n");
+}
+
+void MoverTrigger::init_post_params()
+{
+    PRINTF(0)("6_4\n");
+    this->updateNode(0.001);
+    this->setBaseCoor(this->getAbsCoor());
+
+//    PRINTF(0)("6_5 MoverTrigger abs-coor: %f, %f, %f\n", this->getAbsCoor().x, this->getAbsCoor().y, this->getAbsCoor().z);
+
+    PRINTF(0)("6_5\n");
+    if (this->getName() != "")
+        MoverTrigger::events->addTrigger(this);
+        
+    PRINTF(0)("6_6\n");
+}
+
+void MoverTrigger::loadParams(const TiXmlElement* root)
+{
+    PRINTF(0)("7_1 MoverTrigger loadParams for trigger %p\n", this);
+    WorldEntity::loadParams(root);
+
+    LoadParam(root, "rel-coor", this, MoverTrigger, setRelCoor)
+        .describe("The relative position to the mover.")
+        .defaultValues(0, 0, 0);
+    LoadParam(root, "delay", this, MoverTrigger, setDelay)
+        .describe("The delay of the trigger.")
+        .defaultValues(0);
+    LoadParam(root, "bStayTriggered", this, MoverTrigger, setStayTriggered)
+        .describe("If the trigger gets released, he stays triggered forever.")
+        .defaultValues(false);
+    LoadParam(root, "bTriggerOnceOnly", this, MoverTrigger, setTriggerOnceOnly)
+        .describe("The trigger can only be released once.")
+        .defaultValues(false);
+    LoadParam(root, "bInvert", this, MoverTrigger, setInvert)
+        .describe("Inverts the state of the trigger.")
+        .defaultValues(false);
+    LoadParam(root, "bSwitch", this, MoverTrigger, setSwitch)
+        .describe("Each time the trigger gets triggered again, he switches his state.")
+        .defaultValues(false);
+    LoadParam(root, "bObligatory", this, MoverTrigger, setObligatory)
+        .describe("A obligatory trigger MUST be triggered to create an event.")
+        .defaultValues(false);
+    LoadParamXML(root, "triggers", this, MoverTrigger, setTriggers)
+        .describe("Adds a trigger that triggers the trigger.");
+}
+
+void MoverTrigger::setBaseCoor(Vector baseCoor)
+{
+//    PRINTF(0)("13_1\n");
+    this->setAbsCoor(baseCoor + this->relCoor);
+//    PRINTF(0)("13_2\n");
+    if (this->triggers)
+        this->triggers->setBaseCoor(baseCoor);
+//    PRINTF(0)("13_3\n");
+}
+
+void MoverTrigger::setTriggers(const TiXmlElement* root)
+{
+    PRINTF(0)("8_1\n");
+    if (!this->triggers)
+        this->triggers = new MoverTriggerList();
+        
+    const TiXmlElement* element = root->FirstChildElement();
+
+    PRINTF(0)("8_2\n");
+    while (element != NULL)
+    {
+        PRINTF(0)("8_3\n");
+        BaseObject *newObj = Factory::fabricate(element);
+//        MoverTrigger *newTrigger = ((MoverTrigger*)(&newObj));
+        MoverTrigger *newTrigger = (dynamic_cast< MoverTrigger *> ( newObj ));
+        this->triggers->addTrigger(newTrigger);
+//        this->triggers->addTrigger(MoverTrigger::createTrigger(element));
+        PRINTF(0)("8_4\n");
+        element = element->NextSiblingElement();
+    }
+    PRINTF(0)("8_5\n");
+}
+/*
+MoverTrigger *MoverTrigger::createTrigger(const TiXmlElement* root)
+{
+    PRINTF(0)("9_1\n");
+    PRINTF(0)("root->Value(): %s\n", root->Value());
+    if (strcmp(root->Value(), "MoverTrigger") == 0)
+    {
+        PRINTF(0)("9_2\n");
+        return new MoverTrigger(root);
+    }
+    else if (strcmp(root->Value(), "ApproachTrigger") == 0)
+    {
+        PRINTF(0)("9_3\n");
+        return new ApproachTrigger(root);
+    }
+    else if (strcmp(root->Value(), "MapstartTrigger") == 0)
+        return new MapstartTrigger(root);
+    else if (strcmp(root->Value(), "EventTrigger") == 0)
+        return new EventTrigger(root);
+    else if (strcmp(root->Value(), "KeyTrigger") == 0)
+        return new KeyTrigger(root);
+    else if (strcmp(root->Value(), "IntervisibilityTrigger") == 0)
+        return new IntervisibilityTrigger(root);
+    else
+    {
+        PRINTF(0)("9_4\n");
+        return new MoverTrigger(root);
+    }
+}
+*/
+void MoverTrigger::tick(float dt)
+{
+    this->time += dt;
+    
+    if (this->delaylist && this->delaylist->isEmpty())
+        this->time = 0;
+}
+
+bool MoverTrigger::isTriggered()
+{
+//    PRINTF(0)("17_1\n");
+    if (!this->bIsTriggered && this->bTriggerOnceOnly && !this->bFirstRelease)
+        return this->bInvert; // yes this makes sense... just think about it ;)
+
+//    PRINTF(0)("17_2\n");
+    if (!this->bStayTriggered || !this->bIsTriggered)
+    {
+//        PRINTF(0)("17_3\n");
+        if (this->triggers && this->delaylist)
+        {
+//            PRINTF(0)("17_4\n");
+            if (this->triggers->isTriggered())
+            {
+//                PRINTF(0)("17_5\n");
+                bool tempIsTriggered = this->checkIsTriggered();
+                if (this->delaylist->isEmpty())
+                {
+                    if (!this->bSwitch)
+                    {
+                        if (tempIsTriggered != this->bIsTriggered)
+                            this->delaylist->addState(tempIsTriggered, this->oldState, this->time + this->delay);
+                    }
+                    else
+                    {
+                        if (tempIsTriggered != this->oldState)
+                            this->delaylist->addState(tempIsTriggered, this->oldState, this->time + this->delay);
+                    }
+                }
+                else
+                {
+                    if (!this->bSwitch)
+                    {
+                        if (tempIsTriggered != this->delaylist->getLastState()->state)
+                            this->delaylist->addState(tempIsTriggered, this->oldState, this->time + this->delay);
+                    }
+                    else
+                    {
+                        if (tempIsTriggered != this->delaylist->getLastState()->oldState)
+                            this->delaylist->addState(tempIsTriggered, this->oldState, this->time + this->delay);
+                    }
+                }
+            }
+
+//            PRINTF(0)("17_6\n");
+            while (!this->delaylist->isEmpty())
+            {
+                MoverTriggerDelayListElement *element = this->delaylist->getFirstState();
+
+                if (element && (this->time >= element->time))
+                {
+                    if (!this->bSwitch)
+                    {
+                        this->bIsTriggered = element->state;
+                    }
+                    else
+                    {
+                        if (element->state && !this->oldState)
+                            this->bIsTriggered = !this->bIsTriggered;
+
+                        this->oldState = element->state;
+                    }
+
+                    this->delaylist->deleteFirstState();
+
+                    if (this->delaylist->isEmpty())
+                    {
+                        this->time = 0;
+                        break;
+                    }
+                    
+                    continue;
+                }
+                
+                break;
+            }
+        }
+        else
+            this->bIsTriggered = false;
+    }
+
+//    PRINTF(0)("17_7\n");
+    if (this->bIsTriggered && this->bTriggerOnceOnly && this->bFirstRelease)
+        this->bFirstRelease = false;
+
+//    PRINTF(0)("17_8\n");
+    if (this->bInvert)
+        return (!this->bIsTriggered);
+    else
+        return this->bIsTriggered;
+}
+
+bool MoverTrigger::isObligatory()
+{
+    return this->bObligatory;
+}
+
+bool MoverTrigger::checkIsTriggered()
+{
+    return true;
+}
+
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger.h	(revision 4844)
@@ -0,0 +1,73 @@
+/*!
+ * @file mover_trigger.h
+ *  Base-class for all mover triggers and container for an independent triggerlist.
+ */
+
+#ifndef _MOVER_TRIGGER_H
+#define _MOVER_TRIGGER_H
+
+#include "world_entity.h"
+#include "mover_trigger_list.h"
+#include "mover_trigger_event_list.h"
+#include "mover_trigger_delay_list.h"
+
+
+class MoverTriggerList;
+class MoverTriggerEventList;
+
+class MoverTrigger : public WorldEntity
+{
+    ObjectListDeclaration(MoverTrigger);
+    
+    public:
+        MoverTrigger(const TiXmlElement* root = NULL);
+        virtual ~MoverTrigger();
+
+        virtual void loadParams(const TiXmlElement* root);
+        virtual void tick(float dt);
+        
+        void setRelCoor(float x, float y, float z) { this->relCoor = Vector(x, y, z); }
+        void updateCoordinates(Vector baseCoor);
+        void setDelay(float delay) { this->delay = delay; }
+        void setStayTriggered(bool bStayTriggered = true) { this->bStayTriggered = bStayTriggered; }
+        void setTriggerOnceOnly(bool bTriggerOnceOnly = true) { this->bTriggerOnceOnly = bTriggerOnceOnly; }
+        void setInvert(bool bInvert = true) { this->bInvert = bInvert; }
+        void setSwitch(bool bSwitch = true) { this->bSwitch = bSwitch; }
+        void setObligatory(bool bObligatory = true) { this->bObligatory = bObligatory; }
+        void setTriggers(const TiXmlElement* root);
+        void setBaseCoor(Vector baseCoor);
+
+        bool isTriggered();
+        bool isObligatory();
+        static MoverTriggerEventList *events;
+        std::string getName() { return this->objectName; }
+        static MoverTrigger *createTrigger(const TiXmlElement* root);
+
+    protected:
+        void init_post_params();
+
+        bool                    bIsTriggered;
+
+    private:
+        void init_prae_params();
+        virtual bool checkIsTriggered();
+        
+        Vector                  relCoor;
+        float                   delay;
+        bool                    bIsWaitingForDelay;
+        bool                    bStayTriggered;
+        bool                    bTriggerOnceOnly;
+        bool                    bInvert;
+        bool                    bSwitch;
+        bool                    bObligatory;
+        float                   time;
+        bool                    bFirstRelease;
+        bool                    oldState;
+
+        MoverTriggerList        *triggers;
+        MoverTriggerDelayList   *delaylist;
+};
+
+
+#endif
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_approach.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_approach.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_approach.cc	(revision 4844)
@@ -0,0 +1,106 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_trigger_approach.h"
+#include "debug.h"
+
+ObjectListDefinition(ApproachTrigger);
+CREATE_FACTORY(ApproachTrigger);
+
+
+ApproachTrigger::ApproachTrigger(const TiXmlElement* root)
+{
+    PRINTF(0)("13_1 ApproachTrigger %p created\n", this);
+    this->registerObject(this, ApproachTrigger::_objectList);
+    this->toList(OM_ENVIRON);
+
+    this->onlyHumans = false;
+    this->onlyNPCs =  false;
+    this->radius = 0;
+    this->distanceX = 0;
+    this->distanceY = 0;
+    this->distanceZ = 0;
+
+    if (root != NULL)
+        this->loadParams(root);
+
+    this->init_post_params();
+}
+
+void ApproachTrigger::loadParams(const TiXmlElement* root)
+{
+    PRINTF(0)("13_2 ApproachTrigger loadParams\n", this);
+    MoverTrigger::loadParams(root);
+
+    LoadParam(root, "radius", this, ApproachTrigger, setRadius)
+        .describe("The radius wherein the player releases the trigger.")
+        .defaultValues(0);
+    LoadParam(root, "distance", this, ApproachTrigger, setDistance)
+        .describe("The distance of all axes wherein the player releases the trigger.")
+        .defaultValues(0, 0, 0);
+    LoadParam(root, "onlyHumans", this, ApproachTrigger, setOnlyHumans)
+        .describe("Only human players can release the trigger.")
+        .defaultValues(false);
+    LoadParam(root, "onlyNPCs", this, ApproachTrigger, setOnlyNPCs)
+        .describe("Only NPCs can release the trigger.")
+        .defaultValues(false);
+}
+
+#include "playable.h"
+#include "../npcs/generic_npc.h"
+
+bool ApproachTrigger::checkIsTriggered()
+{
+    WorldEntity* entity;
+    float distance;
+
+    // for all players
+    if (!this->onlyNPCs)
+    {
+        for (ObjectList<Playable>::const_iterator it = Playable::objectList().begin();
+            it != Playable::objectList().end();
+            ++it)
+        {
+            entity = (*it);
+            distance = (this->getAbsCoor() - entity->getAbsCoor()).len();
+            if (distance <= this->radius
+                || (fabs(this->getAbsCoor().x - entity->getAbsCoor().x) <= this->distanceX
+                    && fabs(this->getAbsCoor().y - entity->getAbsCoor().y) <= this->distanceY
+                    && fabs(this->getAbsCoor().z - entity->getAbsCoor().z) <= this->distanceZ))
+                return true;
+        }
+    }
+
+    // for all npcs
+    if (!this->onlyHumans)
+    {
+        for (ObjectList<GenericNPC>::const_iterator it = GenericNPC::objectList().begin();
+            it != GenericNPC::objectList().end();
+            ++it)
+        {
+            entity = (*it);
+            distance = (this->getAbsCoor() - entity->getAbsCoor()).len();
+            if (distance <= this->radius
+                || (fabs(this->getAbsCoor().x - entity->getAbsCoor().x) <= this->distanceX
+                    && fabs(this->getAbsCoor().y - entity->getAbsCoor().y) <= this->distanceY
+                    && fabs(this->getAbsCoor().z - entity->getAbsCoor().z) <= this->distanceZ))
+                return true;
+        }
+    }
+    
+    return false;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_approach.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_approach.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_approach.h	(revision 4844)
@@ -0,0 +1,36 @@
+/*!
+ * @file mover_trigger_approach.h
+ *  Gets triggered when a player enters a radius or a box.
+ */
+
+#ifndef _MOVER_TRIGGER_APPROACH_H
+#define _MOVER_TRIGGER_APPROACH_H
+
+#include "mover_trigger.h"
+
+
+class ApproachTrigger : public MoverTrigger
+{
+    ObjectListDeclaration(ApproachTrigger);
+
+    public:
+        ApproachTrigger(const TiXmlElement* root = NULL);
+        virtual void loadParams(const TiXmlElement* root);
+        void setRadius(float radius) { this->radius = radius; }
+        void setDistance(float x, float y, float z) { this->distanceX = x; this->distanceY = y; this->distanceZ = z; }
+        void setOnlyHumans(bool onlyHumans = true) { this->onlyHumans = onlyHumans; }
+        void setOnlyNPCs(bool onlyNPCs = true) { this->onlyNPCs = onlyNPCs; }
+
+    private:
+        virtual bool checkIsTriggered();
+        float radius;
+        float distanceX;
+        float distanceY;
+        float distanceZ;
+        bool onlyHumans;
+        bool onlyNPCs;
+};
+
+
+#endif
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_delay_list.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_delay_list.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_delay_list.cc	(revision 4844)
@@ -0,0 +1,91 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "mover_trigger_list.h"
+
+
+MoverTriggerDelayList::MoverTriggerDelayList()
+{
+    this->first = 0;
+}
+
+MoverTriggerDelayList::~MoverTriggerDelayList()
+{
+    while (this->first)
+        this->deleteFirstState();
+}
+
+void MoverTriggerDelayList::addState(bool state, bool oldState, float time)
+{
+    if (this->first == 0)
+        this->first = new MoverTriggerDelayListElement(state, oldState, time);
+    else
+    {
+        MoverTriggerDelayListElement *temp = this->first;
+        while (temp->next != 0)
+            temp = temp->next;
+            
+        temp->next = new MoverTriggerDelayListElement(state, oldState, time);
+    }
+}
+
+void MoverTriggerDelayList::deleteFirstState()
+{
+    if (this->first != 0)
+    {
+        MoverTriggerDelayListElement *temp = this->first->next;
+        delete this->first;
+        this->first = temp;
+    }
+}
+
+MoverTriggerDelayListElement *MoverTriggerDelayList::getFirstState()
+{
+    return this->first;
+}
+
+MoverTriggerDelayListElement *MoverTriggerDelayList::getLastState()
+{
+    MoverTriggerDelayListElement *temp = this->first;
+    while (temp != 0)
+    {
+        if (temp->next == 0)
+            return temp;
+            
+        temp = temp->next;
+    }
+            
+    return 0;
+}
+
+bool MoverTriggerDelayList::isEmpty()
+{
+    return (this->first == 0);
+}
+
+////////////////////////////////////////////////////////
+
+
+MoverTriggerDelayListElement::MoverTriggerDelayListElement(bool state, bool oldState, float time)
+{
+    this->state = state;
+    this->oldState = oldState;
+    this->time = time;
+    this->next = 0;
+}
+
+MoverTriggerDelayListElement::~MoverTriggerDelayListElement()
+{
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_delay_list.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_delay_list.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_delay_list.h	(revision 4844)
@@ -0,0 +1,40 @@
+/*!
+ * @file mover_trigger_delay_list.h
+ *  A list to delay trigger-state-changes.
+ */
+
+#ifndef _MOVER_TRIGGER_DELAY_LIST_H
+#define _MOVER_TRIGGER_DELAY_LIST_H
+
+
+class MoverTriggerDelayListElement
+{
+    public:
+        MoverTriggerDelayListElement(bool state, bool oldState, float time);
+        ~MoverTriggerDelayListElement();
+        
+        bool state;
+        bool oldState;
+        float time;
+        MoverTriggerDelayListElement *next;
+};
+
+
+class MoverTriggerDelayList
+{
+    public:
+        MoverTriggerDelayList();
+        ~MoverTriggerDelayList();
+
+        void addState(bool state, bool oldState, float time);
+        void deleteFirstState();
+        MoverTriggerDelayListElement *getFirstState();
+        MoverTriggerDelayListElement *getLastState();
+        bool isEmpty();
+
+    private:
+        MoverTriggerDelayListElement *first;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event.cc	(revision 4844)
@@ -0,0 +1,75 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_trigger_event.h"
+#include "debug.h"
+
+ObjectListDefinition(EventTrigger);
+CREATE_FACTORY(EventTrigger);
+
+
+EventTrigger::EventTrigger(const TiXmlElement* root)
+{
+    PRINTF(0)("15_1 EventTrigger %p created\n", this);
+    this->registerObject(this, EventTrigger::_objectList);
+    this->toList(OM_ENVIRON);
+
+    this->eventName = "";
+    this->eventTriggers = 0;
+    this->bIsChecking = false;
+    
+    if (root != NULL)
+        this->loadParams(root);
+
+    this->init_post_params();
+}
+
+EventTrigger::~EventTrigger()
+{
+    delete this->eventTriggers;
+}
+
+void EventTrigger::loadParams(const TiXmlElement* root)
+{
+    MoverTrigger::loadParams(root);
+
+    LoadParam(root, "event", this, EventTrigger, setEvent)
+        .describe("The event that releases the trigger")
+        .defaultValues("");
+}
+
+bool EventTrigger::checkIsTriggered()
+{
+    if (this->bIsChecking)
+        return this->bIsTriggered; // to avoid event-loops
+        
+    if (!this->eventTriggers)
+    {
+        if (MoverTrigger::events)
+            this->eventTriggers = MoverTrigger::events->getPointerList(this->eventName);
+
+        if (!this->eventTriggers)
+            this->eventTriggers = new MoverTriggerPointerList();
+    }
+
+    this->bIsChecking = true;
+    bool isTriggered = this->eventTriggers->isTriggered();
+    this->bIsChecking = false;
+    
+    return isTriggered;
+}
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event.h	(revision 4844)
@@ -0,0 +1,31 @@
+/*!
+ * @file mover_trigger_event.h
+ *  Gets triggered when a specific event occurs.
+ */
+
+#ifndef _MOVER_TRIGGER_EVENT_H
+#define _MOVER_TRIGGER_EVENT_H
+
+#include "mover_trigger.h"
+
+
+class EventTrigger : public MoverTrigger
+{
+    ObjectListDeclaration(EventTrigger);
+
+    public:
+        EventTrigger(const TiXmlElement* root = NULL);
+        virtual ~EventTrigger();
+        virtual void loadParams(const TiXmlElement* root);
+        void setEvent(const std::string& eventName) { this->eventName = eventName; }
+
+    private:
+        virtual bool checkIsTriggered();
+        std::string                 eventName;
+        MoverTriggerPointerList     *eventTriggers;
+        bool                        bIsChecking;
+};
+
+
+#endif
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event_list.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event_list.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event_list.cc	(revision 4844)
@@ -0,0 +1,152 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "mover_trigger_event_list.h"
+#include "debug.h"
+/*
+MoverTriggerEventList *listPointer = 0;
+
+MoverTriggerEventList::getListPointer()
+{
+    if (!this->listPointer)
+        this->listPointer = new MoverTriggerEventList();
+        
+    return this->listPointer;
+}
+*/
+MoverTriggerEventList::MoverTriggerEventList()
+{
+    this->first = 0;
+}
+
+
+MoverTriggerEventList::~MoverTriggerEventList()
+{
+    while (this->first != 0)
+    {
+        this->removeTrigger(this->first->trigger);
+    }
+}
+
+void MoverTriggerEventList::addTrigger(MoverTrigger *trigger)
+{
+    if (trigger)
+    {
+        if (!this->first)
+            this->first = new MoverTriggerEventListElement(trigger);
+        else
+        {
+            MoverTriggerEventListElement *temp = this->first;
+            while (temp->next != 0)
+                temp = temp->next;
+
+            temp->next = new MoverTriggerEventListElement(trigger);
+        }
+    }
+}
+
+void MoverTriggerEventList::removeTrigger(MoverTrigger *trigger)
+{
+    if (trigger)
+    {
+        if (this->first != 0)
+        {
+            if (this->first->trigger == trigger)
+            {
+                MoverTriggerEventListElement *temp = this->first->next;
+
+                delete this->first;
+                this->first = temp;
+            }
+            else
+            {
+                MoverTriggerEventListElement *temp = this->first;
+
+                while (temp != 0)
+                {
+                    if (temp->next && (temp->next->trigger == trigger))
+                    {
+                        MoverTriggerEventListElement *temp2 = temp->next->next;
+                        delete temp->next;
+                        temp->next = temp2;
+                    }
+
+                    temp = temp->next;
+                }
+            }
+        }
+    }
+}
+
+bool MoverTriggerEventList::isEmpty()
+{
+    return (this->first == 0);
+}
+
+bool MoverTriggerEventList::isTriggered(const std::string& triggerName)
+{
+    MoverTriggerEventListElement *temp = this->first;
+    bool isTriggered = false;
+    
+    while (temp != 0)
+    {
+        if (temp->trigger && (temp->trigger->getName() == triggerName))
+        {
+            if (temp->trigger->isTriggered())
+            {
+                isTriggered = true;
+            }
+            else
+            {
+                if (temp->trigger->isObligatory())
+                    return false;
+            }
+        }
+        
+        temp = temp->next;
+    }
+    
+    return isTriggered;
+}
+
+MoverTriggerPointerList *MoverTriggerEventList::getPointerList(const std::string& triggerName)
+{
+    MoverTriggerPointerList *list = new MoverTriggerPointerList();
+    MoverTriggerEventListElement *temp = this->first;
+
+    while (temp != 0)
+    {
+        if (temp->trigger && (temp->trigger->getName() == triggerName))
+            list->addTrigger(temp->trigger);
+
+        temp = temp->next;
+    }
+    
+    return list;
+}
+
+
+////////////////////////////////////////////////////////
+
+
+MoverTriggerEventListElement::MoverTriggerEventListElement(MoverTrigger *trigger)
+{
+    this->trigger = trigger;
+    this->next = 0;
+}
+
+MoverTriggerEventListElement::~MoverTriggerEventListElement()
+{
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event_list.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event_list.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_event_list.h	(revision 4844)
@@ -0,0 +1,48 @@
+/*!
+ * @file mover_trigger_event_list.h
+ *  A List to handle several events, caused by mover triggers.
+ */
+
+#ifndef _MOVER_TRIGGER_EVENT_LIST_H
+#define _MOVER_TRIGGER_EVENT_LIST_H
+
+#include "mover_trigger.h"
+#include "mover_trigger_pointer_list.h"
+
+
+class MoverTrigger;
+class MoverTriggerPointerList;
+
+class MoverTriggerEventListElement
+{
+    public:
+        MoverTriggerEventListElement(MoverTrigger *trigger);
+        ~MoverTriggerEventListElement();
+
+        MoverTrigger *trigger;
+        MoverTriggerEventListElement *next;
+};
+
+
+class MoverTriggerEventList
+{
+    public:
+//        static MoverTriggerEventList *getListPointer();
+        
+        void addTrigger(MoverTrigger *trigger);
+        void removeTrigger(MoverTrigger *trigger);
+        bool isEmpty();
+        bool isTriggered(const std::string& triggerName);
+        MoverTriggerPointerList *getPointerList(const std::string& triggerName);
+
+//    protected:
+        MoverTriggerEventList();
+        ~MoverTriggerEventList();
+
+    private:
+        MoverTriggerEventListElement *first;
+//        static MoverTriggerEventList *listPointer;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_intervisibility.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_intervisibility.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_intervisibility.cc	(revision 4844)
@@ -0,0 +1,54 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_trigger_intervisibility.h"
+
+ObjectListDefinition(IntervisibilityTrigger);
+CREATE_FACTORY(IntervisibilityTrigger);
+
+
+IntervisibilityTrigger::IntervisibilityTrigger(const TiXmlElement* root)
+{
+    this->registerObject(this, IntervisibilityTrigger::_objectList);
+    this->toList(OM_ENVIRON);
+
+    this->onlyHumans = false;
+    this->onlyNPCs =  false;
+
+    if (root != NULL)
+        this->loadParams(root);
+
+    this->init_post_params();
+}
+
+void IntervisibilityTrigger::loadParams(const TiXmlElement* root)
+{
+    MoverTrigger::loadParams(root);
+
+    LoadParam(root, "onlyHumans", this, IntervisibilityTrigger, setOnlyHumans)
+        .describe("Only human players can release the trigger.")
+        .defaultValues(false);
+    LoadParam(root, "onlyNPCs", this, IntervisibilityTrigger, setOnlyNPCs)
+        .describe("Only NPCs can release the trigger.")
+        .defaultValues(false);
+}
+
+bool IntervisibilityTrigger::checkIsTriggered()
+{
+    /* TODO */
+    return false;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_intervisibility.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_intervisibility.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_intervisibility.h	(revision 4844)
@@ -0,0 +1,30 @@
+/*!
+ * @file mover_trigger_intervisibility.h
+ *  Gets triggered when the trigger "sees" the player.
+ */
+
+#ifndef _MOVER_TRIGGER_INTERVISIBILITY_H
+#define _MOVER_TRIGGER_INTERVISIBILITY_H
+
+#include "mover_trigger.h"
+
+
+class IntervisibilityTrigger : public MoverTrigger
+{
+    ObjectListDeclaration(IntervisibilityTrigger);
+
+    public:
+        IntervisibilityTrigger(const TiXmlElement* root = NULL);
+        virtual void loadParams(const TiXmlElement* root);
+        void setOnlyHumans(bool onlyHumans = true) { this->onlyHumans = onlyHumans; }
+        void setOnlyNPCs(bool onlyNPCs = true) { this->onlyNPCs = onlyNPCs; }
+
+    private:
+        virtual bool checkIsTriggered();
+        bool onlyHumans;
+        bool onlyNPCs;
+};
+
+
+#endif
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_key.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_key.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_key.cc	(revision 4844)
@@ -0,0 +1,49 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_trigger_key.h"
+
+ObjectListDefinition(KeyTrigger);
+CREATE_FACTORY(KeyTrigger);
+
+
+KeyTrigger::KeyTrigger(const TiXmlElement* root)
+{
+    this->registerObject(this, KeyTrigger::_objectList);
+    this->toList(OM_ENVIRON);
+    this->keyName = "";
+
+    if (root != NULL)
+        this->loadParams(root);
+
+    this->init_post_params();
+}
+
+void KeyTrigger::loadParams(const TiXmlElement* root)
+{
+    MoverTrigger::loadParams(root);
+
+    LoadParam(root, "key", this, KeyTrigger, setKey)
+        .describe("The key that releases the trigger")
+        .defaultValues("");
+}
+
+bool KeyTrigger::checkIsTriggered()
+{
+    /* TODO */
+    return false;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_key.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_key.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_key.h	(revision 4844)
@@ -0,0 +1,28 @@
+/*!
+ * @file mover_trigger_key.h
+ *  Gets triggered when player presses a key.
+ */
+
+#ifndef _MOVER_TRIGGER_KEY_H
+#define _MOVER_TRIGGER_KEY_H
+
+#include "mover_trigger.h"
+
+
+class KeyTrigger : public MoverTrigger
+{
+    ObjectListDeclaration(KeyTrigger);
+
+    public:
+        KeyTrigger(const TiXmlElement* root = NULL);
+        virtual void loadParams(const TiXmlElement* root);
+        void setKey(const std::string& keyName) { this->keyName = keyName; }
+
+    private:
+        virtual bool checkIsTriggered();
+        std::string keyName;
+};
+
+
+#endif
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_list.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_list.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_list.cc	(revision 4844)
@@ -0,0 +1,126 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "mover_trigger_list.h"
+#include "debug.h"
+
+
+MoverTriggerList::MoverTriggerList()
+{
+    PRINTF(0)("10_1 MoverTriggerList %p created\n", this);
+    this->first = 0;
+    PRINTF(0)("10_2 first element: %p\n", this->first);
+}
+
+MoverTriggerList::~MoverTriggerList()
+{
+    PRINTF(0)("13_1 MoverTriggerList %p destroyed\n", this);
+    MoverTriggerListElement *temp1 = this->first;
+    MoverTriggerListElement *temp2;
+    while (temp1 != 0)
+    {
+        temp2 = temp1->next;
+        delete temp1;
+        temp1 = temp2;
+    }
+}
+
+void MoverTriggerList::addTrigger(MoverTrigger *trigger)
+{
+    PRINTF(0)("11_1 added trigger %p to list %p\n", trigger, this);
+    if (trigger)
+    {
+        if (this->first == 0)
+        {
+            PRINTF(0)("11_2\n");
+            this->first = new MoverTriggerListElement(trigger);
+        }
+        else
+        {
+            PRINTF(0)("11_3\n");
+            MoverTriggerListElement *temp = this->first;
+            while (temp->next != 0)
+                temp = temp->next;
+
+            temp->next = new MoverTriggerListElement(trigger);
+            PRINTF(0)("11_4\n");
+        }
+    }
+    PRINTF(0)("11_5\n");
+}
+
+bool MoverTriggerList::isTriggered()
+{
+//    PRINTF(0)("16_1\n");
+    if (this->first == 0)
+    {
+//        PRINTF(0)("16_2\n");
+        return true;
+    }
+    else
+    {
+//        PRINTF(0)("16_3\n");
+        bool isTriggered = false;
+        MoverTriggerListElement *temp = this->first;
+
+        while (temp != 0)
+        {
+            if (temp->trigger->isTriggered())
+            {
+                isTriggered = true;
+            }
+            else
+            {
+                if (temp->trigger->isObligatory())
+                    return false;
+            }
+                    
+            temp = temp->next;
+        }
+
+//        PRINTF(0)("16_4\n");
+        return isTriggered;
+    }
+}
+
+void MoverTriggerList::setBaseCoor(Vector baseCoor)
+{
+//    PRINTF(0)("12_1 set base coor in %p\n", this);
+//    PRINTF(0)("12_2 first element: %p\n", this->first);
+    MoverTriggerListElement *temp = this->first;
+    while (temp != 0)
+    {
+//        PRINTF(0)("12_3\n");
+        temp->trigger->setBaseCoor(baseCoor);
+        temp = temp->next;
+    }
+//    PRINTF(0)("12_4\n");
+}
+
+
+////////////////////////////////////////////////////////
+
+
+MoverTriggerListElement::MoverTriggerListElement(MoverTrigger *trigger)
+{
+    this->trigger = trigger;
+    this->next = 0;
+}
+
+MoverTriggerListElement::~MoverTriggerListElement()
+{
+    if (this->trigger)
+        delete this->trigger;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_list.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_list.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_list.h	(revision 4844)
@@ -0,0 +1,40 @@
+/*!
+ * @file mover_trigger_list.h
+ *  A list to store and handle several triggers.
+ */
+
+#ifndef _MOVER_TRIGGER_LIST_H
+#define _MOVER_TRIGGER_LIST_H
+
+#include "mover_trigger.h"
+
+
+class MoverTrigger;
+
+class MoverTriggerListElement
+{
+    public:
+        MoverTriggerListElement(MoverTrigger *trigger);
+        ~MoverTriggerListElement();
+        
+        MoverTrigger *trigger;
+        MoverTriggerListElement *next;
+};
+
+
+class MoverTriggerList
+{
+    public:
+        MoverTriggerList();
+        ~MoverTriggerList();
+
+        void addTrigger(MoverTrigger *trigger);
+        bool isTriggered();
+        void setBaseCoor(Vector baseCoor);
+
+    private:
+        MoverTriggerListElement *first;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_mapstart.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_mapstart.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_mapstart.cc	(revision 4844)
@@ -0,0 +1,53 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "util/loading/load_param.h"
+#include "util/loading/factory.h"
+#include "mover_trigger_mapstart.h"
+#include "debug.h"
+
+ObjectListDefinition(MapstartTrigger);
+CREATE_FACTORY(MapstartTrigger);
+
+
+MapstartTrigger::MapstartTrigger(const TiXmlElement* root)
+{
+    PRINTF(0)("13_1 MapstartTrigger %p created\n", this);
+    this->registerObject(this, MapstartTrigger::_objectList);
+    this->toList(OM_ENVIRON);
+
+    this->bInit = true;
+
+    if (root != NULL)
+        this->loadParams(root);
+
+    this->init_post_params();
+}
+
+void MapstartTrigger::loadParams(const TiXmlElement* root)
+{
+    MoverTrigger::loadParams(root);
+}
+
+bool MapstartTrigger::checkIsTriggered()
+{
+    if (this->bInit)
+    {
+        this->bInit = false;
+        return true;
+    }
+    
+    return false;
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_mapstart.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_mapstart.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_mapstart.h	(revision 4844)
@@ -0,0 +1,27 @@
+/*!
+ * @file mover_trigger_mapstart.h
+ *  Gets triggered when the map starts.
+ */
+
+#ifndef _MOVER_TRIGGER_MAPSTART_H
+#define _MOVER_TRIGGER_MAPSTART_H
+
+#include "mover_trigger.h"
+
+
+class MapstartTrigger : public MoverTrigger
+{
+    ObjectListDeclaration(MapstartTrigger);
+
+    public:
+        MapstartTrigger(const TiXmlElement* root = NULL);
+        virtual void loadParams(const TiXmlElement* root);
+
+    private:
+        virtual bool checkIsTriggered();
+        bool bInit;
+};
+
+
+#endif
+
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_pointer_list.cc
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_pointer_list.cc	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_pointer_list.cc	(revision 4844)
@@ -0,0 +1,97 @@
+/*
+   orxonox - the future of 3D-vertical-scrollers
+
+   Copyright (C) 2007 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: Fabian 'x3n' Landau
+   co-programmer:
+*/
+
+#include "mover_trigger_pointer_list.h"
+#include "debug.h"
+
+
+MoverTriggerPointerList::MoverTriggerPointerList()
+{
+    this->first = 0;
+}
+
+MoverTriggerPointerList::~MoverTriggerPointerList()
+{
+    MoverTriggerPointerListElement *temp1 = this->first;
+    MoverTriggerPointerListElement *temp2;
+    while (temp1 != 0)
+    {
+        temp2 = temp1->next;
+        delete temp1;
+        temp1 = temp2;
+    }
+}
+
+void MoverTriggerPointerList::addTrigger(MoverTrigger *trigger)
+{
+    if (trigger)
+    {
+        if (this->first == 0)
+        {
+            this->first = new MoverTriggerPointerListElement(trigger);
+        }
+        else
+        {
+            MoverTriggerPointerListElement *temp = this->first;
+            while (temp->next != 0)
+                temp = temp->next;
+
+            temp->next = new MoverTriggerPointerListElement(trigger);
+        }
+    }
+}
+
+bool MoverTriggerPointerList::isTriggered()
+{
+    if (this->first == 0)
+    {
+        return false;
+    }
+    else
+    {
+        bool isTriggered = false;
+        MoverTriggerPointerListElement *temp = this->first;
+
+        while (temp != 0)
+        {
+            if (temp->trigger->isTriggered())
+            {
+                isTriggered = true;
+            }
+            else
+            {
+                if (temp->trigger->isObligatory())
+                    return false;
+            }
+                    
+            temp = temp->next;
+        }
+
+        return isTriggered;
+    }
+}
+
+////////////////////////////////////////////////////////
+
+
+MoverTriggerPointerListElement::MoverTriggerPointerListElement(MoverTrigger *trigger)
+{
+    this->trigger = trigger;
+    this->next = 0;
+}
+
+MoverTriggerPointerListElement::~MoverTriggerPointerListElement()
+{
+}
Index: /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_pointer_list.h
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_pointer_list.h	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/environments/mover_trigger_pointer_list.h	(revision 4844)
@@ -0,0 +1,39 @@
+/*!
+ * @file mover_trigger_pointer_list.h
+ *  A list to store and handle several trigger pointers.
+ */
+
+#ifndef _MOVER_TRIGGER_POINTER_LIST_H
+#define _MOVER_TRIGGER_POINTER_LIST_H
+
+#include "mover_trigger.h"
+
+
+class MoverTrigger;
+
+class MoverTriggerPointerListElement
+{
+    public:
+        MoverTriggerPointerListElement(MoverTrigger *trigger);
+        ~MoverTriggerPointerListElement();
+        
+        MoverTrigger *trigger;
+        MoverTriggerPointerListElement *next;
+};
+
+
+class MoverTriggerPointerList
+{
+    public:
+        MoverTriggerPointerList();
+        ~MoverTriggerPointerList();
+
+        void addTrigger(MoverTrigger *trigger);
+        bool isTriggered();
+
+    private:
+        MoverTriggerPointerListElement *first;
+};
+
+
+#endif
Index: /data/contentcreation/pps/FabianLandau/mover/movertest.oxw
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/movertest.oxw	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/movertest.oxw	(revision 4844)
@@ -0,0 +1,1293 @@
+<WorldDataFile>
+  <name>Movertest</name>
+  <description>A level to test movers.</description>
+
+  <LoadScreen>
+    <BackgroundImage>textures/load_screens/ambush.png</BackgroundImage>
+    <ElementCount>16</ElementCount>
+    <BackgroundPS>0,0,1.0,1</BackgroundPS>
+    <BarPS>.65,.87,.3,.05</BarPS>
+    <BarImage>textures/load_screens/ambush-loadbar.png</BarImage>
+  </LoadScreen>
+
+  <WorldEntities>
+
+    <BspEntity>
+      <Name>levels/maps/movertest/testlevel.bsp</Name>
+    </BspEntity>
+
+    <FPSPlayer>
+      <name>Player</name>
+      <model>models/creatures/doom_male/male.md2, 9</model>
+      <abs-coor>0, 20, 0</abs-coor>
+    </FPSPlayer>
+
+
+<!-- START langsamer mover reopen/reclose -->
+    <Mover>
+      <abs-coor>0, 15, -200</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bReopen>1</bReopen>
+      <bReclose>1</bReclose>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>2.00</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END langsamer mover reopen/reclose -->
+
+
+
+<!-- START mehrere stationen reopen/reclose -->
+    <Mover>
+      <abs-coor>0, 15, -400</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bReopen>1</bReopen>
+      <bReclose>1</bReclose>
+      <triggers>
+        <ApproachTrigger>
+          <radius>125</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>50, 0, 0</rel-target-coor>
+          <moving-time>0.3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, -50, 0</rel-target-coor>
+          <moving-time>0.3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.6</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, -50, 0</rel-target-coor>
+          <moving-time>0.3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>-50, 0, 0</rel-target-coor>
+          <moving-time>0.3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.3</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END mehrere stationen reopen/reclose-->
+
+
+
+<!-- START move to rank -->
+    <Mover>
+      <abs-coor>0, 15, -600</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>0</rank>
+          <rel-target-coor>0, 0, 0</rel-target-coor>
+          <moving-time>0.0</moving-time>
+          <bClosed>1</bClosed>
+        </MoverStation>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.25</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>50, 0, 0</rel-target-coor>
+          <moving-time>0.25</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.25</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>50, 0, 0</rel-target-coor>
+          <moving-time>0.25</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>5</rank>
+          <move-to-rank>0</move-to-rank>
+          <moving-time>0.50</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- START move to rank-->
+
+
+
+<!-- START mehrere stationen normal -->
+    <Mover>
+      <abs-coor>300, 15, 0</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <radius>125</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.15</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, 0, 50</rel-target-coor>
+          <moving-time>0.15</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, -50, 0</rel-target-coor>
+          <moving-time>0.15</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, -50, 0</rel-target-coor>
+          <moving-time>0.15</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, 0, -50</rel-target-coor>
+          <moving-time>0.15</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.15</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END mehrere stationen normal -->
+
+
+
+<!-- START zwei unkoordinierte mover -->
+    <Mover>
+      <abs-coor>600, 15, 125</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>600, 15, 75</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END zwei unkoordinierte mover -->
+
+
+
+<!-- START zwei koordinierte mover -->
+    <Mover>
+      <abs-coor>600, 15, -125</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <name>koordiniert1</name>
+          <radius>75</radius>
+        </ApproachTrigger>
+        <EventTrigger>
+          <event>koordiniert2</event>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>600, 15, -75</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <name>koordiniert2</name>
+          <radius>75</radius>
+        </ApproachTrigger>
+        <EventTrigger>
+          <event>koordiniert1</event>
+          <delay>1</delay>
+        </EventTrigger>
+        <ApproachTrigger>
+          <rel-coor>200, 0, -25</rel-coor>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END zwei koordinierte mover -->
+
+
+
+<!-- START drei koordinierte mover -->
+    <Mover>
+      <abs-coor>700, 15, -300</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <name>koordiniert_drei</name>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>600, 15, -300</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <event>koordiniert_drei</event>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>600, 15, -350</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <event>koordiniert_drei</event>
+          <delay>0.15</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>600, 15, -400</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <event>koordiniert_drei</event>
+          <delay>0.3</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>500, 15, -300</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <name>koordiniert_drei</name>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END drei koordinierte mover -->
+
+
+<!-- START delay kaskade -->
+    <Mover>
+      <abs-coor>1000, 15, 200</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <name>kaskade1</name>
+          <radius>75</radius>
+        </ApproachTrigger>
+        <EventTrigger>
+          <event>kaskade18</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 250</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade2</name>
+          <event>kaskade1</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade18</name>
+          <event>kaskade17</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 300</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade3</name>
+          <event>kaskade2</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade17</name>
+          <event>kaskade16</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 350</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade4</name>
+          <event>kaskade3</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade16</name>
+          <event>kaskade15</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 400</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade5</name>
+          <event>kaskade4</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade15</name>
+          <event>kaskade14</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 450</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade6</name>
+          <event>kaskade5</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade14</name>
+          <event>kaskade13</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 500</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade7</name>
+          <event>kaskade6</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade13</name>
+          <event>kaskade12</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 550</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade8</name>
+          <event>kaskade7</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade12</name>
+          <event>kaskade11</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 600</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade9</name>
+          <event>kaskade8</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>kaskade11</name>
+          <event>kaskade10</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, 650</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>kaskade10</name>
+          <event>kaskade9</event>
+          <delay>0.25</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END delay kaskade -->
+
+
+<!-- START delay auto kaskade -->
+    <Mover>
+      <abs-coor>1000, 15, 0</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <name>2kaskade1</name>
+          <radius>75</radius>
+        </ApproachTrigger>
+        <EventTrigger>
+          <name>2kaskade1</name>
+          <event>2kaskade18</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -50</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade2</name>
+          <event>2kaskade1</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade18</name>
+          <event>2kaskade17</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -100</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade3</name>
+          <event>2kaskade2</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade17</name>
+          <event>2kaskade16</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -150</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade4</name>
+          <event>2kaskade3</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade16</name>
+          <event>2kaskade15</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -200</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade5</name>
+          <event>2kaskade4</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade15</name>
+          <event>2kaskade14</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -250</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade6</name>
+          <event>2kaskade5</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade14</name>
+          <event>2kaskade13</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -300</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade7</name>
+          <event>2kaskade6</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade13</name>
+          <event>2kaskade12</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -350</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade8</name>
+          <event>2kaskade7</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade12</name>
+          <event>2kaskade11</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -400</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade9</name>
+          <event>2kaskade8</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+        <EventTrigger>
+          <name>2kaskade11</name>
+          <event>2kaskade10</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>1000, 15, -450</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <EventTrigger>
+          <name>2kaskade10</name>
+          <event>2kaskade9</event>
+          <delay>0.1</delay>
+        </EventTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 50, 0</rel-target-coor>
+          <moving-time>0.1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END delay auto kaskade -->
+
+
+
+<!-- START attach trigger -->
+    <Mover>
+      <abs-coor>0, 15, 150</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bOnlyMoveWhileTriggered>1</bOnlyMoveWhileTriggered>
+      <bLoop>1</bLoop>
+      <bAttachTrigger>1</bAttachTrigger>
+      <triggers>
+        <ApproachTrigger>
+          <radius>50</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 0, 750</rel-target-coor>
+          <moving-time>8</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END attach trigger -->
+
+
+
+<!-- START loop -->
+    <Mover>
+      <abs-coor>950, 15, -800</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>850, 15, -800</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>750, 15, -800</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bRepeat>5</bRepeat>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>650, 15, -800</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <bOnlyMoveWhileTriggered>1</bOnlyMoveWhileTriggered>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+          <bInvert>1</bInvert>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>550, 15, -800</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bRepeat>1</bRepeat>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+          <bTriggerOnceOnly>1</bTriggerOnceOnly>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>450, 15, -800</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <bOnlyMoveWhileTriggered>1</bOnlyMoveWhileTriggered>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+          <bSwitch>1</bSwitch>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-coor>0, 100, 0</rel-target-coor>
+          <moving-time>0.30</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END loop -->
+
+
+
+<!-- START loop durch den raum-->
+    <Mover>
+      <abs-coor>950, 500, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>3</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 550, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>2.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>2.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>2.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>2.5</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 600, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>2</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>2</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>2</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>2</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 650, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>1.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>1.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>1.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>1.5</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 700, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>1</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>1</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>1</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>1</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 525, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>3</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>3</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>3</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 575, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>2.5</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>2.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>2.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>2.5</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 625, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>2</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>2</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>2</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>2</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 675, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>1.5</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>1.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>1.5</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>1.5</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+    <Mover>
+      <abs-coor>950, 725, 950</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <bLoop>1</bLoop>
+      <triggers>
+        <MapstartTrigger>
+        </MapstartTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rank>4</rank>
+          <rel-target-coor>1900, 0, 0</rel-target-coor>
+          <moving-time>1</moving-time>
+          <jump-to-rank>1</jump-to-rank>
+        </MoverStation>
+        <MoverStation>
+          <rank>3</rank>
+          <rel-target-coor>0, 0, 1900</rel-target-coor>
+          <moving-time>1</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>2</rank>
+          <rel-target-coor>-1900, 0, 0</rel-target-coor>
+          <moving-time>1</moving-time>
+        </MoverStation>
+        <MoverStation>
+          <rank>1</rank>
+          <rel-target-coor>0, 0, -1900</rel-target-coor>
+          <moving-time>1</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END loop durch den raum-->
+
+
+
+
+<!-- START drehende mover -->
+    <Mover>
+      <abs-coor>-300, 15, 200</abs-coor>
+      <model>models/decoration/redcube.obj, 15</model>
+      <triggers>
+        <ApproachTrigger>
+          <radius>75</radius>
+        </ApproachTrigger>
+      </triggers>
+      <stations>
+        <MoverStation>
+          <rel-target-dir>0.785398, 0, 1, 0</rel-target-dir>
+          <moving-time>1.00</moving-time>
+        </MoverStation>
+      </stations>
+    </Mover>
+<!-- END drehende mover -->
+
+
+  </WorldEntities>
+
+  <LightManager>
+    <Lights>
+      <Light>
+        <diffuse-color>1,1,1</diffuse-color>
+        <abs-coor>2000, 0, 0</abs-coor>
+      </Light>
+      <Light>
+        <diffuse-color>1,1,1</diffuse-color>
+        <abs-coor>0, 2000, 0</abs-coor>
+      </Light>
+      <Light>
+        <diffuse-color>1,1,1</diffuse-color>
+        <abs-coor>0, 0, 2000</abs-coor>
+      </Light>
+      <Light>
+        <diffuse-color>1,1,1</diffuse-color>
+        <abs-coor>-2000, 0, 0</abs-coor>
+      </Light>
+      <Light>
+        <diffuse-color>1,1,1</diffuse-color>
+        <abs-coor>0, -2000, 0</abs-coor>
+      </Light>
+      <Light>
+        <diffuse-color>1,1,1</diffuse-color>
+        <abs-coor>0, 0, -2000</abs-coor>
+      </Light>
+    </Lights>
+  </LightManager>
+
+</WorldDataFile>
+
+
Index: /data/contentcreation/pps/FabianLandau/mover/movertest/testlevel.map
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/movertest/testlevel.map	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/movertest/testlevel.map	(revision 4844)
@@ -0,0 +1,59 @@
+
+// entity 0
+{
+"classname" "worldspawn"
+// brush 0
+{
+( 1024 1024 1280 ) ( 1024 -1024 1280 ) ( -1024 1024 1280 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 1024 256 ) ( -1024 1024 256 ) ( 1024 1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 1024 256 ) ( 1024 1024 0 ) ( 1024 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 0 ) ( -1024 -1024 256 ) ( 1024 -1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 0 ) ( -1024 1024 0 ) ( -1024 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 1024 1024 ) ( 1024 -1024 1024 ) ( 1024 1024 1024 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+}
+// brush 1
+{
+( 1024 1024 1280 ) ( 1024 -1024 1280 ) ( -1024 1024 1280 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 1280 256 ) ( -1024 1280 256 ) ( 1024 1280 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1280 1024 256 ) ( 1280 1024 0 ) ( 1280 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 -256 ) ( 1024 -1024 -256 ) ( -1024 1024 -256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1280 -1024 0 ) ( -1280 1024 0 ) ( -1280 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 1024 0 ) ( -1024 1024 256 ) ( 1024 1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+}
+// brush 2
+{
+( 1024 1024 1280 ) ( 1024 -1024 1280 ) ( -1024 1024 1280 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 1024 256 ) ( -1024 1024 256 ) ( 1024 1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1280 1024 256 ) ( 1280 1024 0 ) ( 1280 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 -256 ) ( 1024 -1024 -256 ) ( -1024 1024 -256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 0 ) ( -1024 -1024 256 ) ( 1024 -1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 -1024 256 ) ( 1024 1024 0 ) ( 1024 1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+}
+// brush 3
+{
+( 1024 1024 256 ) ( -1024 1024 256 ) ( 1024 1024 0 ) metal_x1/metal_x1_039 0 0 0 0.5 0.5 0 0 0
+( 1024 1024 256 ) ( 1024 1024 0 ) ( 1024 -1024 256 ) metal_x1/metal_x1_039 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 -256 ) ( 1024 -1024 -256 ) ( -1024 1024 -256 ) metal_x1/metal_x1_039 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 0 ) ( -1024 -1024 256 ) ( 1024 -1024 0 ) metal_x1/metal_x1_039 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 0 ) ( -1024 1024 0 ) ( -1024 -1024 256 ) metal_x1/metal_x1_039 0 0 0 0.5 0.5 0 0 0
+( -1024 1024 0 ) ( 1024 -1024 0 ) ( -1024 -1024 0 ) metal_x1/metal_x1_039 0 0 0 0.5 0.5 0 0 0
+}
+// brush 4
+{
+( 1024 1024 1280 ) ( 1024 -1024 1280 ) ( -1024 1024 1280 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1280 1024 256 ) ( 1280 1024 0 ) ( 1280 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 -256 ) ( 1024 -1024 -256 ) ( -1024 1024 -256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1280 0 ) ( -1024 -1280 256 ) ( 1024 -1280 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1280 -1024 0 ) ( -1280 1024 0 ) ( -1280 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 -1024 0 ) ( -1024 -1024 256 ) ( -1024 -1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+}
+// brush 5
+{
+( 1024 1024 1280 ) ( 1024 -1024 1280 ) ( -1024 1024 1280 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( 1024 1024 256 ) ( -1024 1024 256 ) ( 1024 1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 -256 ) ( 1024 -1024 -256 ) ( -1024 1024 -256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 0 ) ( -1024 -1024 256 ) ( 1024 -1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1280 -1024 0 ) ( -1280 1024 0 ) ( -1280 -1024 256 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+( -1024 -1024 256 ) ( -1024 1024 0 ) ( -1024 -1024 0 ) metal_x1/metal_x1_038 0 0 0 0.5 0.5 0 0 0
+}
+}
Index: /data/contentcreation/pps/FabianLandau/mover/movertest/testlevel.srf
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/movertest/testlevel.srf	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/movertest/testlevel.srf	(revision 4844)
@@ -0,0 +1,218 @@
+default
+{
+	castShadows 1
+	receiveShadows 1
+	sampleSize 16
+	longestCurve 0.000000
+}
+
+0 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_039
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+1 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_039
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+2 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 1.000000 0.000000 0.000000 )
+}
+
+3 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 1.000000 0.000000 0.000000 )
+}
+
+4 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 1.000000 0.000000 0.000000 )
+}
+
+5 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+6 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+7 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+8 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( -1.000000 0.000000 0.000000 )
+}
+
+9 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+10 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+11 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+12 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+13 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 -1.000000 0.000000 )
+}
+
+14 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+15 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+16 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 1.000000 0.000000 )
+}
+
+17 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 1.000000 0.000000 0.000000 )
+}
+
+18 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+19 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 1.000000 0.000000 )
+}
+
+20 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+21 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+22 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( -1.000000 0.000000 0.000000 )
+}
+
+23 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+24 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+25 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+26 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+27 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+28 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( -1.000000 0.000000 0.000000 )
+}
+
+29 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+30 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 1.000000 )
+}
+
+31 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+32 // SURFACE_META V: 3 I: 3 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 0.000000 -1.000000 )
+}
+
+33 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( 0.000000 -1.000000 0.000000 )
+}
+
+34 // SURFACE_META V: 4 I: 6 planar
+{
+	shader textures/metal_x1/metal_x1_038
+	lightmapAxis ( -1.000000 0.000000 0.000000 )
+}
+
Index: /data/contentcreation/pps/FabianLandau/mover/redcube.mtl
===================================================================
--- /data/contentcreation/pps/FabianLandau/mover/redcube.mtl	(revision 4844)
+++ /data/contentcreation/pps/FabianLandau/mover/redcube.mtl	(revision 4844)
@@ -0,0 +1,12 @@
+# Material Count: 1
+newmtl Material_red3.jpg
+Ns 96.078431
+Ka 0.000000 0.000000 0.000000
+Kd 0.640000 0.640000 0.640000
+Ks 0.500000 0.500000 0.500000
+Ni 1.000000
+d 1.000000
+illum 2
+map_Kd unicolored/red3.jpg
+
+
