/* core/gameinterface.cc This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #include #include #include #include "auxiliary/functions.h" #include "core/application.h" #include "core/cvar.h" #include "core/func.h" #include "core/info.h" #include "core/item.h" #include "core/gameinterface.h" #include "core/player.h" #include "core/zone.h" #include "model/model.h" #include "sys/sys.h" namespace core { void func_list_players(std::string const &args) { if (args.size()) { Player *player = game()->find_player(args); if (!player) { con_print << "^BPlayer '" + args + "^B' not found"; return; } else { player->print(); } } else { game()->list_players(); } } const float MIN_DELTA = 10e-10; Player GameInterface::game_localplayer; EntityControlable *localcontrol() { if (game()->localplayer()) return game()->localplayer()->control(); else return 0; } Player *localplayer() { return game()->localplayer(); } GameInterface::GameInterface() { clear(); game_localplayer.clear(); if (Cvar::sv_dedicated->value()) { game_localplayer.player_name.assign("Console"); } else { game_localplayer.player_name.assign("Player"); game_localplayer.update_info(); } Func *func = Func::add("list_players", func_list_players); func->set_info("get the local list of connected players"); // size of the vertex array in megabytes Cvar::sv_arraysize = core::Cvar::get("sv_arraysize", 128.0f , core::Cvar::Archive); Cvar::sv_arraysize->set_info("[int] size of the vertex array in megabyte"); size_t mb = (size_t) Cvar::sv_arraysize->value(); if (mb < 4 * sizeof(float)) mb = 4 * sizeof(float); if (mb > 512) mb = 512; (*Cvar::sv_arraysize) = (float) mb; game_vertexarray = new model::VertexArray(mb); } GameInterface::~GameInterface() { Func::remove("list_players"); game_localplayer.clear(); clear(); // delete vertex array if (game_vertexarray) { delete game_vertexarray; game_vertexarray = 0; } } // clear all game related objects void GameInterface::clear() { //con_debug << "Clearing game data\n"; // remove all entities for (Entity::Registry::iterator it = Entity::registry().begin(); it != Entity::registry().end(); it++) { delete(*it).second; } Entity::registry().clear(); // remove all zones for (Zone::Registry::iterator it = Zone::registry().begin(); it != Zone::registry().end(); it++) { Zone *zone = (*it).second; con_debug " removing zone " << zone->label() << std::endl; delete zone; } Zone::registry().clear(); // remove all game functions for (Func::Registry::iterator it = Func::registry().begin(); it != Func::registry().end();) { if (((*it).second->flags() & Func::Game) == Func::Game) { delete(*it).second; Func::registry().erase(it++); } else { ++it; } } // remove all game cvars for (Cvar::Registry::iterator it = Cvar::registry().begin(); it != Cvar::registry().end();) { if (((*it).second->flags() & Cvar::Game) == Cvar::Game) { delete(*it).second; Cvar::registry().erase(it++); } else { ++it; } } // remove all models model::Model::clear(); // remove infos Info::clear(); // remove items Item::clear(); // clear player list for (Players::iterator it = game_players.begin(); it != game_players.end(); it++) { Player *player = (*it); if (player != localplayer()) { delete player; } } game_players.clear(); } Player *GameInterface::find_player(const std::string &search) { using aux::lowercase; std::istringstream searchstr(search); int id = 0; if (searchstr >> id) { for (std::list:: iterator it = game_players.begin(); it != game_players.end(); it++) { if ((*it)->id() == id) { return (*it); } } } if (search.size() < 3) return 0; for (std::list:: iterator it = game_players.begin(); it != game_players.end(); it++) { if (aux::text_strip_lowercase((*it)->name()).find(lowercase(search)) != std::string::npos) return (*it); } return 0; } void GameInterface::list_players() { using namespace std; int count = 0; for (Players::iterator it = game_players.begin(); it != game_players.end(); it++) { const Player *player = (*it); con_print << " " << aux::pad_left(player->name(), 24) << "^N " << "id^B" << setw(4) << player->id() << " " << "ping^B" << setw(4) << player->ping() << "^N " << "level^B" << setw(4) << player->level() << "^N"; if (player->zone()) con_print << aux::pad_left(player->zone()->name(), 24) << "^N"; con_print << std::endl; count++; } con_print << count << " connected " << aux::plural("player", count) << std::endl; } }