Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Feb 24, 2015, 10:54:24 PM (9 years ago)
Author:
landauf
Message:

added command 'reloadLevel' (by default on F5) which reloads the level while the player's camera remains at the same position

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/orxonox/gametypes/Gametype.cc

    r9984 r10281  
    4545#include "worldentities/pawns/Pawn.h"
    4646#include "overlays/OverlayGroup.h"
     47#include "Scene.h"
    4748
    4849namespace orxonox
     
    525526        GSLevel::startMainMenu();
    526527    }
     528
     529    GSLevelMementoState* Gametype::exportMementoState()
     530    {
     531        for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
     532        {
     533            if (it->first->isHumanPlayer() && it->first->getControllableEntity() && it->first->getControllableEntity()->getCamera())
     534            {
     535                Camera* camera = it->first->getControllableEntity()->getCamera();
     536
     537                GametypeMementoState* state = new GametypeMementoState();
     538                state->cameraPosition_ = camera->getWorldPosition();
     539                state->cameraOrientation_ = camera->getWorldOrientation();
     540                state->sceneName_ = camera->getScene()->getName();
     541                return state;
     542            }
     543        }
     544
     545        return NULL;
     546    }
     547
     548    void Gametype::importMementoState(const std::vector<GSLevelMementoState*>& states)
     549    {
     550        // find correct memento state
     551        GametypeMementoState* state = NULL;
     552        for (size_t i = 0; i < states.size(); ++i)
     553        {
     554            state = dynamic_cast<GametypeMementoState*>(states[i]);
     555            if (state)
     556                break;
     557        }
     558
     559        if (!state)
     560            return;
     561
     562        // find correct scene
     563        Scene* scene = NULL;
     564        for (ObjectList<Scene>::iterator it = ObjectList<Scene>::begin(); it != ObjectList<Scene>::end(); ++it)
     565        {
     566            if (it->getName() == state->sceneName_)
     567            {
     568                scene = *it;
     569                break;
     570            }
     571        }
     572
     573        if (!scene)
     574        {
     575            orxout(internal_warning) << "Could not find scene with name " << state->sceneName_ << endl;
     576            return;
     577        }
     578
     579        // find correct player and assign default entity with original position & orientation
     580        for (std::map<PlayerInfo*, Player>::iterator it = this->players_.begin(); it != this->players_.end(); ++it)
     581        {
     582            if (it->first->isHumanPlayer())
     583            {
     584                ControllableEntity* entity = this->defaultControllableEntity_.fabricate(scene->getContext());
     585                entity->setPosition(state->cameraPosition_);
     586                entity->setOrientation(state->cameraOrientation_);
     587                it->first->startControl(entity);
     588                break;
     589            }
     590        }
     591    }
    527592}
Note: See TracChangeset for help on using the changeset viewer.