From a6f9773c358dd7d091ff64cbda504ab8d8066dd3 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Wed, 22 Sep 2010 21:32:34 +0000 Subject: full trading support for networked games --- src/core/netserver.cc | 97 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 5 deletions(-) (limited to 'src/core/netserver.cc') diff --git a/src/core/netserver.cc b/src/core/netserver.cc index 2d83728..8d3e762 100644 --- a/src/core/netserver.cc +++ b/src/core/netserver.cc @@ -15,8 +15,6 @@ #include #include -#else -#include #endif #include @@ -295,6 +293,10 @@ void NetServer::client_initialize(NetClient *client) client->player()->send(welcome); client->transmit(); + // send info types + send_infotypes(client); + client->transmit(); + // send zones for (Zone::Registry::iterator it = Zone::registry().begin(); it != Zone::registry().end(); it++) { send_zone_update(client, (*it).second); @@ -377,6 +379,19 @@ void NetServer::client_frame(NetClient *client, unsigned long timestamp) } } + // send inventory update for control + // FIXME this should be done for all player assets + if (client->player()->control() && client->player()->control()->inventory() && client->player()->control()->inventory()->dirty()) { + //con_debug << "SERVER Sending inventory for entity " << client->player()->control()->id() << " server timestamp " << game()->timestamp() << std::endl; + send_inventory_update(client, client->player()->control(), client->player()->control()->inventory()->timestamp()); + } + + // send inventory updates for view + if (client->player()->view() && client->player()->view()->inventory() && client->player()->view()->inventory()->dirty()) { + //con_debug << "SERVER Sending inventory for entity " << client->player()->view()->id() << " server timestamp " << game()->timestamp() << std::endl; + send_inventory_update(client, client->player()->view(), client->player()->view()->inventory()->timestamp()); + } + // send updates for other players for (GameInterface::Players::iterator it = server()->players().begin(); it != server()->players().end(); it++) { if (((*it)->id() != client->player()->id()) && ((*it)->dirty())) { @@ -429,6 +444,8 @@ void NetServer::frame(unsigned long timestamp) * frame * ent * die + * inf + * inv * ping * sup * @@ -571,6 +588,49 @@ void NetServer::send_info_update(NetClient *client, Info *info) client->send_raw(msg.str()); } +// send "inf" info types +void NetServer::send_infotypes(NetClient *client) +{ + std::ostringstream msg; + msg << "inf 0 " << InfoType::registry().size(); + + for (InfoType::Registry::const_iterator it = InfoType::registry().begin(); it != InfoType::registry().end(); it++) { + msg << " \"" << (*it)->label() << "\""; + } + msg << '\n'; + client->send_raw(msg.str()); +} + +// send a "inv" inventory update +void NetServer::send_inventory_update(NetClient *client, Entity *entity, const unsigned long timestamp) +{ + if (!entity || !entity->inventory()) + return; + + std::ostringstream msg; + msg << "inv " << entity->id() << " " << game()->timestamp() << " "; + + size_t nbitems = 0; + + std::ostringstream itemstr; + for (Inventory::Items::const_iterator it = entity->inventory()->items().begin(); it != entity->inventory()->items().end(); it++) { + const Item *item = (*it); + if (item->timestamp() >= timestamp) { + itemstr << item->info()->id() << " "; + item->serialize_server_update(itemstr); + nbitems++; + } + } + + msg << nbitems; + + if (nbitems) { + msg << " " << itemstr.str(); + } + msg << '\n'; + client->send_raw(msg.str()); +} + // parse incoming client messages /** @@ -584,8 +644,9 @@ void NetServer::send_info_update(NetClient *client, Info *info) * ping * say * priv - * info