/* core/player.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 "sys/sys.h" #include "core/player.h" #include "core/cvar.h" namespace core { Player::Player() { clear(); } Player::~Player() { clear(); } void Player::clear() { player_id = 0; player_name.clear(); player_dirty = false; clear_assets(); } void Player::clear_assets() { // clear assets for (std::list::iterator asset = assets.begin(); asset != assets.end(); asset++) { (*asset)->entity_owner = 0; (*asset)->die(); } assets.clear(); player_control = 0; } void Player::update_info() { Cvar *cl_name = Cvar::find("cl_name"); if (cl_name) { if (cl_name->str().size()) player_name = cl_name->str(); } Cvar *cl_color = Cvar::find("cl_color"); math::Color color(1.0, 1.0, 1.0, 1.0); if (cl_color) { std::istringstream is(cl_color->str()); if (is >> color) player_color = color; } } void Player::serialize_client_update(std::ostream & os) { os << " " << player_color << " \"" << player_name << "\""; } void Player::recieve_client_update(std::istream &is) { is >> player_color; std::string n; char c; while ( (is.get(c)) && (c != '"')); while ( (is.get(c)) && (c != '"')) n += c; if (n.size()) player_name = n; } void Player::serialize_server_update(std::ostream & os) const { unsigned int co; if (player_control) co = player_control->id(); else co = 0; os << player_id << " " << co << " " << player_color << " \"" << player_name << "\""; } void Player::recieve_server_update(std::istream &is) { is >> player_id; unsigned int co = 0; is >> co; if (co) { Entity *e = Entity::find(co); if (e && e->type() == Entity::Controlable) { player_control = (EntityControlable *) e; } else { player_control = 0; con_warn << "control set to unknown entity " << co << "\n"; } } else { player_control = 0; } is >> player_color; std::string n; char c; while ( (is.get(c)) && (c != '"')); while ( (is.get(c)) && (c != '"')) n += c; if (n.size()) player_name = n; } void Player::add_asset(EntityControlable *entity) { entity->entity_owner = this; assets.push_back(entity); } void Player::remove_asset(EntityControlable *entity) { for (std::list::iterator asset = assets.begin(); asset != assets.end(); asset++) { if ((*asset) == entity) { (*asset)->entity_owner = 0; (*asset)->die(); assets.erase(asset); return; } } con_warn << "Could not remove asset " << entity->id() << " from player " << this->id() << "\n"; } void Player::remove_asset(unsigned int id) { for (std::list::iterator asset = assets.begin(); asset != assets.end(); asset++) { if ((*asset)->id() == id) { (*asset)->entity_owner = 0; (*asset)->die(); assets.erase(asset); return; } } con_warn << "Could not remove asset " << id << " from player " << this->id() << "\n"; } }