/** * This method loads all of the data for a level from a file. It does not * render the level, it only parses the file and gathers all of the information * needed to render the level. */ void Level::load(const std::string& file_name) { clearPreviousLevelData(); this->file_name = file_name; DEBUG("Loading level: " << this->file_name); tinyxml2::XMLDocument doc; if (doc.LoadFile(this->file_name.c_str()) != tinyxml2::XML_SUCCESS) { SDL_SetError(doc.ErrorName()); throw Application::Error::XML; } for (tinyxml2::XMLNode* node = doc.FirstChild(); node; node = node->NextSibling()) { std::string node_name = node->ToElement()->Name(); if (node_name == "about") { for (tinyxml2::XMLNode* about_node = node->FirstChild(); about_node; about_node = about_node->NextSibling()) { std::string name = about_node->ToElement()->Name(); std::string text = about_node->ToElement()->GetText(); if (name == "title") { title = text; DEBUG("Level title: " << title); } else if (name == "width") { width = atoi(text.c_str()); DEBUG("Level width: " << width); } else if (name == "height") { height = atoi(text.c_str()); DEBUG("Level height: " << height); } } } else if (node_name == "level") { for (tinyxml2::XMLNode* level_node = node->FirstChild(); level_node; level_node = level_node->NextSibling()) { std::string level_node_name = level_node->ToElement()->Name(); if (level_node_name == "layers") { #ifdef DEBUG_ENABLED int layer_num = 0; #endif // DEBUG_ENABLED for (tinyxml2::XMLNode* layer_node = level_node->FirstChild(); layer_node; layer_node = layer_node->NextSibling()) { std::string layer_node_name = layer_node->ToElement()->Name(); if (layer_node_name == "layer") { std::string layer_text = layer_node->ToElement()->GetText(); processLayers(layer_text); DEBUG("Layer " << ++layer_num << ":" << std::endl << layer_text); } } } if (level_node_name == "objects") { std::string object_text = level_node->ToElement()->GetText(); processObjects(object_text); } } } } }
void Streamer::performPlayerUpdate(Player &player, bool automatic) { Eigen::Vector3f delta = Eigen::Vector3f::Zero(), position = player.position; int state = GetPlayerState(player.playerID); bool update = true; if (automatic) { player.interiorID = GetPlayerInterior(player.playerID); player.worldID = GetPlayerVirtualWorld(player.playerID); GetPlayerPos(player.playerID, &player.position[0], &player.position[1], &player.position[2]); if (state != PLAYER_STATE_NONE && state != PLAYER_STATE_WASTED) { if (player.position != position) { position = player.position; Eigen::Vector3f velocity = Eigen::Vector3f::Zero(); if (state == PLAYER_STATE_ONFOOT) { GetPlayerVelocity(player.playerID, &velocity[0], &velocity[1], &velocity[2]); } else if (state == PLAYER_STATE_DRIVER || state == PLAYER_STATE_PASSENGER) { GetVehicleVelocity(GetPlayerVehicleID(player.playerID), &velocity[0], &velocity[1], &velocity[2]); } float velocityNorm = velocity.squaredNorm(); if (velocityNorm >= velocityBoundaries.get<0>() && velocityNorm <= velocityBoundaries.get<1>()) { delta = velocity * averageUpdateTime; player.position += delta; } } else { update = player.updateWhenIdle; } } else { update = false; } } std::vector<SharedCell> cells; if (update) { core->getGrid()->findAllCells(player, cells); if (!cells.empty()) { if (!core->getData()->objects.empty() && player.enabledItems[STREAMER_TYPE_OBJECT] && !IsPlayerNPC(player.playerID)) { processObjects(player, cells); } if (!core->getData()->checkpoints.empty() && player.enabledItems[STREAMER_TYPE_CP]) { processCheckpoints(player, cells); } if (!core->getData()->raceCheckpoints.empty() && player.enabledItems[STREAMER_TYPE_RACE_CP]) { processRaceCheckpoints(player, cells); } if (!core->getData()->mapIcons.empty() && player.enabledItems[STREAMER_TYPE_MAP_ICON] && !IsPlayerNPC(player.playerID)) { processMapIcons(player, cells); } if (!core->getData()->textLabels.empty() && player.enabledItems[STREAMER_TYPE_3D_TEXT_LABEL] && !IsPlayerNPC(player.playerID)) { processTextLabels(player, cells); } if (!core->getData()->areas.empty() && player.enabledItems[STREAMER_TYPE_AREA]) { if (!delta.isZero()) { player.position = position; } processAreas(player, cells); if (!delta.isZero()) { player.position += delta; } } } } if (automatic) { if (!core->getData()->pickups.empty()) { if (!update) { core->getGrid()->findMinimalCells(player, cells); } processPickups(player, cells); } if (!delta.isZero()) { player.position = position; } executeCallbacks(); } }