diff options
Diffstat (limited to 'src/core/player.cc')
-rw-r--r-- | src/core/player.cc | 64 |
1 files changed, 62 insertions, 2 deletions
diff --git a/src/core/player.cc b/src/core/player.cc index 488e407..4c4616a 100644 --- a/src/core/player.cc +++ b/src/core/player.cc @@ -4,8 +4,11 @@ the terms of the GNU General Public License version 2. */ +#include <sstream> + #include "sys/sys.h" #include "core/player.h" +#include "core/cvar.h" namespace core { @@ -25,11 +28,37 @@ void Player::clear() player_id = 0; player_name.clear(); player_dirty = false; + + clear_assets(); +} + +void Player::clear_assets() +{ + // clear assets + for (std::list<EntityControlable*>::iterator asset = assets.begin(); asset != assets.end(); asset++) { + (*asset)->entity_owner = 0; + (*asset)->die(); + } + assets.clear(); + player_control = 0; } -void Player::serialize_client_update(std::ostream & os) const +void Player::serialize_client_update(std::ostream & os) { + Cvar *cl_name = Cvar::find("cl_name"); + if (cl_name) { + 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()); + is >> color; + player_color = color; + } + os << " " << player_color << " \"" << player_name << "\""; } @@ -55,7 +84,7 @@ void Player::serialize_server_update(std::ostream & os) const co = player_control->id(); else co = 0; - + os << player_id << " " << co << " " << player_color << " \"" << player_name << "\""; } @@ -88,5 +117,36 @@ void Player::recieve_server_update(std::istream &is) 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<EntityControlable*>::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<EntityControlable*>::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"; +} + +} |