/* Method: GetShip * * Return the <Ship> that created this cloud, or nil. * * Returns: * * the <Ship> that created this cloud, or nil. * */ static int l_hyperspace_cloud_get_ship(lua_State *l) { HyperspaceCloud *cloud = LuaObject<HyperspaceCloud>::CheckFromLua(1); Ship *ship = cloud->GetShip(); if(ship == nullptr) lua_pushnil(l); else LuaPush(l, ship); return 1; }
void Game::SwitchToHyperspace() { // remember where we came from so we can properly place the player on exit m_hyperspaceSource = m_space->GetStarSystem()->GetPath(); const SystemPath &dest = m_player->GetHyperspaceDest(); // find all the departure clouds, convert them to arrival clouds and store // them for the next system m_hyperspaceClouds.clear(); for (Space::BodyIterator i = m_space->BodiesBegin(); i != m_space->BodiesEnd(); ++i) { if (!(*i)->IsType(Object::HYPERSPACECLOUD)) continue; // only want departure clouds with ships in them HyperspaceCloud *cloud = static_cast<HyperspaceCloud*>(*i); if (cloud->IsArrival() || cloud->GetShip() == 0) continue; // make sure they're going to the same place as us if (!dest.IsSameSystem(cloud->GetShip()->GetHyperspaceDest())) continue; // remove it from space m_space->RemoveBody(cloud); // player and the clouds are coming to the next system, but we don't // want the player to have any memory of what they were (we're just // reusing them for convenience). tell the player it was deleted so it // can clean up m_player->NotifyRemoved(cloud); // turn the cloud arround cloud->GetShip()->SetHyperspaceDest(m_hyperspaceSource); cloud->SetIsArrival(true); // and remember it m_hyperspaceClouds.push_back(cloud); } printf(SIZET_FMT " clouds brought over\n", m_hyperspaceClouds.size()); // remove the player from space m_space->RemoveBody(m_player.Get()); // create hyperspace :) m_space.Reset(new Space(this)); // put the player in it m_player->SetFrame(m_space->GetRootFrame()); m_space->AddBody(m_player.Get()); // put player at the origin. kind of unnecessary since it won't be moving // but at least it gives some consistency m_player->SetPosition(vector3d(0,0,0)); m_player->SetVelocity(vector3d(0,0,0)); m_player->SetRotMatrix(matrix4x4d::Identity()); // animation and end time counters m_hyperspaceProgress = 0; m_hyperspaceDuration = m_player->GetHyperspaceDuration(); m_hyperspaceEndTime = Pi::game->GetTime() + m_hyperspaceDuration; m_state = STATE_HYPERSPACE; m_wantHyperspace = false; printf("Started hyperspacing...\n"); }