Few SMSG_CHANNEL chat opcodes (#31)

* SMSG_CHANNEL_NOTIFY: CHAT_YOU_JOINED/YOU_LEFT structure

* Refactoring: CHAT_NOT_MEMBER_NOTICE must be functional of the Channel class

* SMSG_CHANNEL_LIST structure fix
This commit is contained in:
Oleg 2017-07-09 14:23:36 +03:00 committed by Antz
parent 6304d628c7
commit 4c9182be60
5 changed files with 22 additions and 20 deletions

View File

@ -213,9 +213,9 @@ void Opcodes::BuildOpcodeList()
/*0x096*/ StoreOpcode(SMSG_MESSAGECHAT, "SMSG_MESSAGECHAT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x096*/ StoreOpcode(SMSG_MESSAGECHAT, "SMSG_MESSAGECHAT", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide);
/*[-ZERO] Need check */ /*0x097*/ StoreOpcode(CMSG_JOIN_CHANNEL, "CMSG_JOIN_CHANNEL", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannelOpcode); /*[-ZERO] Need check */ /*0x097*/ StoreOpcode(CMSG_JOIN_CHANNEL, "CMSG_JOIN_CHANNEL", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleJoinChannelOpcode);
/*[-ZERO] Need check */ /*0x098*/ StoreOpcode(CMSG_LEAVE_CHANNEL, "CMSG_LEAVE_CHANNEL", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannelOpcode); /*[-ZERO] Need check */ /*0x098*/ StoreOpcode(CMSG_LEAVE_CHANNEL, "CMSG_LEAVE_CHANNEL", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLeaveChannelOpcode);
/*[-ZERO] Need check */ /*0x099*/ StoreOpcode(SMSG_CHANNEL_NOTIFY, "SMSG_CHANNEL_NOTIFY", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x099*/ StoreOpcode(SMSG_CHANNEL_NOTIFY, "SMSG_CHANNEL_NOTIFY", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide);
/*[-ZERO] Need check */ /*0x09A*/ StoreOpcode(CMSG_CHANNEL_LIST, "CMSG_CHANNEL_LIST", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelListOpcode); /*[-ZERO] Need check */ /*0x09A*/ StoreOpcode(CMSG_CHANNEL_LIST, "CMSG_CHANNEL_LIST", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelListOpcode);
/*[-ZERO] Need check */ /*0x09B*/ StoreOpcode(SMSG_CHANNEL_LIST, "SMSG_CHANNEL_LIST", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide); /*0x09B*/ StoreOpcode(SMSG_CHANNEL_LIST, "SMSG_CHANNEL_LIST", STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide);
/*[-ZERO] Need check */ /*0x09C*/ StoreOpcode(CMSG_CHANNEL_PASSWORD, "CMSG_CHANNEL_PASSWORD", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPasswordOpcode); /*[-ZERO] Need check */ /*0x09C*/ StoreOpcode(CMSG_CHANNEL_PASSWORD, "CMSG_CHANNEL_PASSWORD", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelPasswordOpcode);
/*[-ZERO] Need check */ /*0x09D*/ StoreOpcode(CMSG_CHANNEL_SET_OWNER, "CMSG_CHANNEL_SET_OWNER", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelSetOwnerOpcode); /*[-ZERO] Need check */ /*0x09D*/ StoreOpcode(CMSG_CHANNEL_SET_OWNER, "CMSG_CHANNEL_SET_OWNER", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelSetOwnerOpcode);
/*[-ZERO] Need check */ /*0x09E*/ StoreOpcode(CMSG_CHANNEL_OWNER, "CMSG_CHANNEL_OWNER", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelOwnerOpcode); /*[-ZERO] Need check */ /*0x09E*/ StoreOpcode(CMSG_CHANNEL_OWNER, "CMSG_CHANNEL_OWNER", STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChannelOwnerOpcode);

View File

@ -455,13 +455,12 @@ void Channel::List(Player* player)
} }
// list players in channel // list players in channel
WorldPacket data(SMSG_CHANNEL_LIST, 1 + (GetName().size() + 1) + 1 + 4 + m_players.size() * (8 + 1)); WorldPacket data(SMSG_CHANNEL_LIST, (GetName().size() + 1) + 1 + 4 + m_players.size() * (8 + 1)); // guess size
data << uint8(1); // channel type?
data << GetName(); // channel name data << GetName(); // channel name
data << uint8(GetFlags()); // channel flags? data << uint8(GetFlags()); // channel flags?
size_t pos = data.wpos(); size_t pos = data.wpos();
data << uint32(0); // size of list, placeholder data << int32(0); // size of list, placeholder
AccountTypes gmLevelInWhoList = (AccountTypes)sWorld.getConfig(CONFIG_UINT32_GM_LEVEL_IN_WHO_LIST); AccountTypes gmLevelInWhoList = (AccountTypes)sWorld.getConfig(CONFIG_UINT32_GM_LEVEL_IN_WHO_LIST);
@ -481,7 +480,7 @@ void Channel::List(Player* player)
} }
} }
data.put<uint32>(pos, count); data.put<int32>(pos, count);
SendToOne(&data, guid); SendToOne(&data, guid);
} }
@ -754,16 +753,16 @@ void Channel::MakeLeft(WorldPacket* data, ObjectGuid guid)
void Channel::MakeYouJoined(WorldPacket* data) void Channel::MakeYouJoined(WorldPacket* data)
{ {
MakeNotifyPacket(data, CHAT_YOU_JOINED_NOTICE); MakeNotifyPacket(data, CHAT_YOU_JOINED_NOTICE);
*data << uint8(GetFlags()); *data << uint32(GetFlags());
*data << uint32(GetChannelId()); *data << uint32(0); // the non-zero number will be appended to the channel name
*data << uint32(0); *data << uint8(0); // CString max length 512, conditional read
} }
void Channel::MakeYouLeft(WorldPacket* data) void Channel::MakeYouLeft(WorldPacket* data)
{ {
MakeNotifyPacket(data, CHAT_YOU_LEFT_NOTICE); MakeNotifyPacket(data, CHAT_YOU_LEFT_NOTICE);
*data << uint32(GetChannelId()); //*data << uint32(GetChannelId()); //[-ZERO]
*data << uint8(0); // can be 0x00 and 0x01 //*data << uint8(0); //[-ZERO] can be 0x00 and 0x01 (bool)
} }
void Channel::MakeWrongPassword(WorldPacket* data) void Channel::MakeWrongPassword(WorldPacket* data)
@ -776,6 +775,12 @@ void Channel::MakeNotMember(WorldPacket* data)
MakeNotifyPacket(data, CHAT_NOT_MEMBER_NOTICE); MakeNotifyPacket(data, CHAT_NOT_MEMBER_NOTICE);
} }
void Channel::MakeNotOnPacket(WorldPacket* data, const std::string &name)
{
data->Initialize(SMSG_CHANNEL_NOTIFY, (1 + name.length() + 1));
(*data) << (uint8)CHAT_NOT_MEMBER_NOTICE << name;
}
void Channel::MakeNotModerator(WorldPacket* data) void Channel::MakeNotModerator(WorldPacket* data)
{ {
MakeNotifyPacket(data, CHAT_NOT_MODERATOR_NOTICE); MakeNotifyPacket(data, CHAT_NOT_MODERATOR_NOTICE);

View File

@ -211,7 +211,11 @@ class Channel
* \ref Channel::SPEAK_IN_LOCALDEFENSE_RANK for more info on the 4 added. * \ref Channel::SPEAK_IN_LOCALDEFENSE_RANK for more info on the 4 added.
*/ */
static const uint8 SPEAK_IN_WORLDDEFENSE_RANK = 4 + 10; static const uint8 SPEAK_IN_WORLDDEFENSE_RANK = 4 + 10;
/**
* This creates the packet informing client that the player is not on requested \ref name channel.
* See also \ref MakeNotMember for non-static version.
*/
static void MakeNotOnPacket(WorldPacket* data, const std::string &name);
private: private:
// initial packet data (notify type and channel name) // initial packet data (notify type and channel name)
void MakeNotifyPacket(WorldPacket* data, uint8 notify_type); void MakeNotifyPacket(WorldPacket* data, uint8 notify_type);

View File

@ -79,7 +79,7 @@ Channel* ChannelMgr::GetChannel(const std::string &name, Player* p, bool pkt)
if (pkt) if (pkt)
{ {
WorldPacket data; WorldPacket data;
MakeNotOnPacket(&data, name); Channel::MakeNotOnPacket(&data, name);
p->GetSession()->SendPacket(&data); p->GetSession()->SendPacket(&data);
} }
@ -108,9 +108,3 @@ void ChannelMgr::LeftChannel(const std::string &name)
delete channel; delete channel;
} }
} }
void ChannelMgr::MakeNotOnPacket(WorldPacket* data, const std::string &name)
{
data->Initialize(SMSG_CHANNEL_NOTIFY, (1 + 10)); // we guess size
(*data) << (uint8)CHAT_NOT_MEMBER_NOTICE << name;
}

View File

@ -42,7 +42,6 @@ class ChannelMgr
void LeftChannel(const std::string &name); void LeftChannel(const std::string &name);
private: private:
ChannelMap channels; ChannelMap channels;
void MakeNotOnPacket(WorldPacket* data, const std::string &name);
}; };
class AllianceChannelMgr : public ChannelMgr {}; class AllianceChannelMgr : public ChannelMgr {};