From: Giuseppe Bilotta Date: Thu, 11 Aug 2011 05:02:57 +0000 (+0200) Subject: Notify other players of wielded item change X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=371af9c241c3064d64e1109098aa5471e545d32c;p=zefram%2Fminetest%2Fminetest_engine.git Notify other players of wielded item change --- diff --git a/src/client.cpp b/src/client.cpp index 398b2602..edce2538 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1549,6 +1549,47 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id) // get damage from falling on ground m_ignore_damage_timer = 3.0; } + else if(command == TOCLIENT_PLAYERITEM) + { + std::string datastring((char*)&data[2], datasize-2); + std::istringstream is(datastring, std::ios_base::binary); + + u16 count = readU16(is); + + for (u16 i = 0; i < count; ++i) { + u16 peer_id = readU16(is); + Player *player = m_env.getPlayer(peer_id); + + if (player == NULL) + { + dout_client<isLocal()) { + dout_client<inventory.getList("main"); + std::string itemstring(deSerializeString(is)); + if (itemstring.empty()) { + inv->deleteItem(0); + dout_client<changeItem(0, InventoryItem::deSerialize(iss)); + dout_client<getWieldItem()->serialize(dout_client); + dout_client<id); SendInventory(peer->id); + // Send player items to all players + SendPlayerItems(); + // Send HP { Player *player = m_env.getPlayer(peer_id); @@ -3388,6 +3391,7 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) u16 item = readU16(&data[2]); player->wieldItem(item); + SendWieldedItem(player); } else { @@ -3673,6 +3677,60 @@ void Server::SendInventory(u16 peer_id) m_con.Send(peer_id, 0, data, true); } +std::string getWieldedItemString(const Player *player) +{ + const InventoryItem *item = player->getWieldItem(); + if (item == NULL) + return std::string(""); + std::ostringstream os(std::ios_base::binary); + item->serialize(os); + return os.str(); +} + +void Server::SendWieldedItem(const Player* player) +{ + DSTACK(__FUNCTION_NAME); + + assert(player); + + std::ostringstream os(std::ios_base::binary); + + writeU16(os, TOCLIENT_PLAYERITEM); + writeU16(os, 1); + writeU16(os, player->peer_id); + os< data((u8*)s.c_str(), s.size()); + + m_con.SendToAll(0, data, true); +} + +void Server::SendPlayerItems() +{ + DSTACK(__FUNCTION_NAME); + + std::ostringstream os(std::ios_base::binary); + core::list players = m_env.getPlayers(true); + + writeU16(os, TOCLIENT_PLAYERITEM); + writeU16(os, players.size()); + core::list::Iterator i; + for(i = players.begin(); i != players.end(); ++i) + { + Player *p = *i; + writeU16(os, p->peer_id); + os< data((u8*)s.c_str(), s.size()); + + m_con.SendToAll(0, data, true); +} + void Server::SendChatMessage(u16 peer_id, const std::wstring &message) { DSTACK(__FUNCTION_NAME); diff --git a/src/server.h b/src/server.h index 4a2d667a..b10703e7 100644 --- a/src/server.h +++ b/src/server.h @@ -479,6 +479,10 @@ private: void SendObjectData(float dtime); void SendPlayerInfos(); void SendInventory(u16 peer_id); + // send wielded item info about player to all + void SendWieldedItem(const Player *player); + // send wielded item info about all players to all players + void SendPlayerItems(); void SendChatMessage(u16 peer_id, const std::wstring &message); void BroadcastChatMessage(const std::wstring &message); void SendPlayerHP(Player *player);