Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-07-16 22:55:07 +0000
committerStijn Buys <ingar@osirion.org>2008-07-16 22:55:07 +0000
commiteb075660e7cb61b138c2da337115c59857f89e17 (patch)
tree0fe031a8f3562b22f61d0f95b740fe5f2326fd7b /src/core/gameserver.cc
parentfecc54ad8c5a108831c2bc268f9dd7e16b511b7e (diff)
network protocol cleanup, radar test (doesn't work)
Diffstat (limited to 'src/core/gameserver.cc')
-rw-r--r--src/core/gameserver.cc157
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();