Notify other players of wielded item change

This commit is contained in:
Giuseppe Bilotta 2011-08-11 07:02:57 +02:00
parent 88a9bae160
commit 371af9c241
4 changed files with 110 additions and 0 deletions

View File

@ -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 "

View File

@ -160,6 +160,13 @@ enum ToClientCommand
u16 reason_length
wstring reason
*/
TOCLIENT_PLAYERITEM = 0x36,
/*
u16 command
u16 peer id
string serialized item
*/
};
enum ToServerCommand

View File

@ -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);

View File

@ -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);