diff options
author | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2011-08-11 07:02:57 +0200 |
---|---|---|
committer | Giuseppe Bilotta <giuseppe.bilotta@gmail.com> | 2011-08-11 15:22:36 +0200 |
commit | 371af9c241c3064d64e1109098aa5471e545d32c (patch) | |
tree | 3e58bd6b0662ba26a008a208024717eb03f667bf | |
parent | 88a9bae160dd0bf28fe41b2a45c198d67a65c914 (diff) | |
download | minetest-371af9c241c3064d64e1109098aa5471e545d32c.tar.gz minetest-371af9c241c3064d64e1109098aa5471e545d32c.tar.bz2 minetest-371af9c241c3064d64e1109098aa5471e545d32c.zip |
Notify other players of wielded item change
-rw-r--r-- | src/client.cpp | 41 | ||||
-rw-r--r-- | src/clientserver.h | 7 | ||||
-rw-r--r-- | src/server.cpp | 58 | ||||
-rw-r--r-- | src/server.h | 4 |
4 files changed, 110 insertions, 0 deletions
diff --git a/src/client.cpp b/src/client.cpp index 398b2602d..edce25381 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<<DTIME<<"Client: ignoring player item " + << deSerializeString(is) + << " for non-existing peer id " << peer_id + << std::endl; + continue; + } else if (player->isLocal()) { + dout_client<<DTIME<<"Client: ignoring player item " + << deSerializeString(is) + << " for local player" << std::endl; + continue; + } else { + InventoryList *inv = player->inventory.getList("main"); + std::string itemstring(deSerializeString(is)); + if (itemstring.empty()) { + inv->deleteItem(0); + dout_client<<DTIME + <<"Client: empty player item for peer " + << peer_id << std::endl; + } else { + std::istringstream iss(itemstring); + delete inv->changeItem(0, InventoryItem::deSerialize(iss)); + dout_client<<DTIME<<"Client: player item for peer " << peer_id << ": "; + player->getWieldItem()->serialize(dout_client); + dout_client<<std::endl; + } + } + } + } else { dout_client<<DTIME<<"WARNING: Client: Ignoring unknown command " diff --git a/src/clientserver.h b/src/clientserver.h index 717e657b7..9b8b45c85 100644 --- a/src/clientserver.h +++ b/src/clientserver.h @@ -160,6 +160,13 @@ enum ToClientCommand u16 reason_length wstring reason */ + + TOCLIENT_PLAYERITEM = 0x36, + /* + u16 command + u16 peer id + string serialized item + */ }; enum ToServerCommand diff --git a/src/server.cpp b/src/server.cpp index e3747775a..176a13e38 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2157,6 +2157,9 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id) UpdateCrafting(peer->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<<serializeString(getWieldedItemString(player)); + + // Make data buffer + std::string s = os.str(); + SharedBuffer<u8> 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<Player *> players = m_env.getPlayers(true); + + writeU16(os, TOCLIENT_PLAYERITEM); + writeU16(os, players.size()); + core::list<Player *>::Iterator i; + for(i = players.begin(); i != players.end(); ++i) + { + Player *p = *i; + writeU16(os, p->peer_id); + os<<serializeString(getWieldedItemString(p)); + } + + // Make data buffer + std::string s = os.str(); + SharedBuffer<u8> 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 4a2d667a8..b10703e70 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); |