diff options
author | Stijn Buys <ingar@osirion.org> | 2008-07-16 22:55:07 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-07-16 22:55:07 +0000 |
commit | eb075660e7cb61b138c2da337115c59857f89e17 (patch) | |
tree | 0fe031a8f3562b22f61d0f95b740fe5f2326fd7b /src/core/gameserver.cc | |
parent | fecc54ad8c5a108831c2bc268f9dd7e16b511b7e (diff) |
network protocol cleanup, radar test (doesn't work)
Diffstat (limited to 'src/core/gameserver.cc')
-rw-r--r-- | src/core/gameserver.cc | 157 |
1 files changed, 71 insertions, 86 deletions
diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index 0a2370c..1866ad3 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -155,14 +155,14 @@ GameServer::GameServer() : GameInterface() func->set_info("[player] [reason] kick a player from the server"); /* func = Func::add("grant_rcon", func_grant_rcon); - func->set_info("[player] grant a player rcon rights"); + func->set_info("[player] grant rcon rights"); func = Func::add("revoke_rcon", func_grant_rcon); - func->set_info("[player] revoke a player's rcon rights"); + func->set_info("[player] revoke rcon rights"); */ /* -- player functions --*/ func = Func::add("time", func_time, Func::Shared); - func->set_info("get the server uptime and current localtime"); + func->set_info("get the server uptime and current server localtime"); func = Func::add("who", func_who, Func::Shared); func->set_info("get a list of connected players"); @@ -224,7 +224,7 @@ void GameServer::list_players() for (std::list<Player *>:: iterator it = players.begin(); it != players.end(); it++) { msgstr.str(""); - con_print << setw(3) << (*it)->id() << aux::spaces((*it)->name(), 24) << std::endl; + con_print << setw(3) << (*it)->id() << aux::pad_left((*it)->name(), 24) << std::endl; count++; } @@ -293,16 +293,13 @@ void GameServer::say(Player *player, std::string const &message) // broadcast to remote clients if (server_network) { - std::string netmessage("msg public "); - netmessage.append(notification); - netmessage += '\n'; - server_network->broadcast(netmessage); + server_network->broadcast_message("public", notification); } } +// FIXME kicked by void GameServer::kick(Player *player, std::string const &reason) { - // FIXME kicked by if (!server_network) { con_print << "Not running a networked server." << std::endl; return; @@ -322,92 +319,100 @@ void GameServer::kick(Player *player, std::string const &reason) } } +// broadcast an "info" message to all players void GameServer::broadcast(std::string const & message, Player *ignore_player) { + if (!message.size()) + return; + // send to application if (ignore_player != game()->localplayer()) application()->notify_message(message); // broadcast to remote clients if (server_network) { - std::string netmessage("msg info "); - netmessage.append(message); - netmessage += '\n'; - server_network->broadcast(netmessage, ignore_player); + server_network->broadcast_message("info", message, ignore_player); } } -void GameServer::broadcast_sound(std::string const & sound, Player *ignore_player) +// send and "info" message to a single player +void GameServer::send(Player *player, std::string message) { + if (!message.size()) + return; + // send to application - if (ignore_player != game()->localplayer()) - application()->notify_sound(sound.c_str()); + if (player == localplayer()) { + application()->notify_message(message); + return; + } - // broadcast to remote clients + // send to remote clients if (server_network) { - std::string netmessage("msg snd "); - netmessage.append(sound); - netmessage += '\n'; - server_network->broadcast(netmessage, ignore_player); + NetClient *client = server_network->find_client(player); + if (client) { + server_network->send_message(client, "info", message); + } } } -void GameServer::send(Player *player, std::string message) +// broadcast a sound event to all players +void GameServer::broadcast_sound(std::string const & sound, Player *ignore_player) { + if (!sound.size()) + return; + // send to application - if (player->id() == localplayer()->id()) { - application()->notify_message(message); + if (ignore_player != game()->localplayer()) { + application()->notify_sound(sound.c_str()); } - // send to remote clients + // broadcast to remote clients if (server_network) { - NetClient *client = server_network->find_client(player); - if (client) { - std::string netmessage("msg info "); - netmessage.append(message); - netmessage += '\n'; - server_network->send(client, netmessage); - } + server_network->broadcast_message("snd", sound, ignore_player); } } -void GameServer::send_rcon(Player *player, std::string message) +// send a sound event to a single player +void GameServer::send_sound(Player *player, std::string sound) { + if (!sound.size()) + return; + // send to application - if (player->id() == localplayer()->id()) { - con_print << message << std::endl; + if (player == localplayer()) { + application()->notify_sound(sound.c_str()); + return; } - // send to remote clients + // send to remote client if (server_network) { NetClient *client = server_network->find_client(player); if (client) { - std::string netmessage("msg rcon "); - netmessage.append(message); - netmessage += '\n'; - server_network->send(client, netmessage); + server_network->send_message(client, "snd", sound); } } } -void GameServer::send_sound(Player *player, std::string sound) +// send an rcon message to a single player +void GameServer::send_rcon(Player *player, std::string message) { - if (player->id() == localplayer()->id()) { - application()->notify_sound(sound.c_str()); + // send to application + if (player == localplayer()) { + con_print << message << std::endl; + return; } // send to remote clients if (server_network) { NetClient *client = server_network->find_client(player); if (client) { - std::string netmessage("msg snd "); - netmessage.append(sound); - netmessage += '\n'; - server_network->send(client, netmessage); + server_network->send_message(client, "rcon", message); } } } +// execute a command for a remote player void GameServer::exec(Player *player, std::string const & cmdline) { std::string command; @@ -415,8 +420,6 @@ void GameServer::exec(Player *player, std::string const & cmdline) cmdstream.str(cmdline); cmdstream >> command; - //con_debug << "Executing " << player->name() << ": " << cmdline << "\n"; - Func *function = Func::find(command); if (function ) { @@ -425,7 +428,6 @@ void GameServer::exec(Player *player, std::string const & cmdline) args.assign(cmdline.substr(command.size()+1)); if ((function ->flags() & Func::Game) == Func::Game) { - //con_debug << "About to execute " << function->name() << " " << args << "'\n"; function->exec(player, args); return; } else if ((function->flags() & Func::Shared) == Func::Shared) { @@ -436,8 +438,8 @@ void GameServer::exec(Player *player, std::string const & cmdline) char line[MAXCMDSIZE]; - while(console()->buffer().getline(line, MAXCMDSIZE-1)) { - send_rcon(player, std::string(line)); + while(console()->buffer().getline(line, MAXCMDSIZE-1)) { + send(player, std::string(line)); } // disable rcon buffering @@ -552,61 +554,44 @@ void GameServer::frame(float seconds) // send updates if (server_network) { + // FIXME prevent connecting clients from receiving update frames + // transmit buffered sends server_network->transmit(); // start server frame - std::ostringstream framehdr; - framehdr.str(""); - framehdr << "frame " << server_time << " " << server_previoustime << "\n"; - server_network->broadcast(framehdr.str()); + server_network->broadcast_frame(server_time, server_previoustime); + // send changes in the world std::map<unsigned int, Entity *>::iterator it; for (it=Entity::registry.begin(); it != Entity::registry.end(); it++) { + Entity *entity = (*it).second; + if (entity->entity_destroyed) { + if (!entity->entity_created) { - std::ostringstream netmsg; - netmsg.str(""); - netmsg << "die " << entity->id() << "\n"; - server_network->broadcast(netmsg.str()); + server_network->broadcast_entity_delete(entity); } + core::Entity::remove(entity->id()); + } else if (entity->entity_created) { - std::ostringstream netmsg; - netmsg.str(""); - netmsg << "ent "; - entity->serialize(netmsg); - netmsg << "\n"; - server_network->broadcast(netmsg.str()); + + server_network->broadcast_entity_create(entity); entity->entity_created = false; } else if (entity->dirty()) { - std::ostringstream netmsg; - netmsg.str(""); - netmsg << "sup " << entity->id() << " "; - entity->serialize_server_update(netmsg); - netmsg << "\n"; - netmsg.flush(); - server_network->broadcast(netmsg.str()); + + server_network->broadcast_entity_update(entity); } + entity->entity_dirty = false; } // update player info - for (std::list<NetClient *>::iterator it = server_network->clients.begin(); it != server_network->clients.end(); it++) { - NetClient *client = *it; - if (client->player()->dirty() && (client->state() == NetClient::Connected)) { - // send player data - std::ostringstream netmsg; - netmsg.str(""); - netmsg << "pif "; - client->player()->serialize_server_update(netmsg); - netmsg << "\n"; - client->send(netmsg.str()); - client->player()->player_dirty = false; - } - } + server_network->broadcast_player_update(); + // transmit buffered sends server_network->transmit(); |