Главная | Форум | Статьи | Фaйлы| Картинки WoW | Профиль | Регистрация | Вход

[ Новые сообщения · Правила форума · Поиск · RSS ]

WoW-Info — информационный World of Warcraft портал

[ChatChannels] Fix join/leave notifications - Форум

  • Сторінка 1 з 1
  • 1
[ChatChannels] Fix join/leave notifications
DjumHoRDeДата: Четвер, 16.12.2010, 14:11 | Сообщение # 1



DjumHoRDe
Скаут
Группа: Пользователи
Сообщений: 38

Замечания:

Оффлайн
* SMSG_CHANNEL_NOTIFY with ChannelNotification.YouJoined.
* SMSG_CHANNEL_NOTIFY with ChannelNotification.YouLeft.
* SMSG_USERLIST_ADD/SMSG_USERLIST_UPDATE opcodes. These may not be 100% correct, however. Needs checking. Seemngly SMSG_USERLIST_UPDATE is never sent?
* SMSG_CHANNEL_LIST, the channel user list opcode.
* SMSG_CHANNEL_NOTIFY with ChannelNotification.NotModerator.
* Some comments.

IMPORTANT: WCell's ChannelNotification enum is OUTDATED. This is one of the reasons why moderator status commands are broken. I'll get to this later.

Code
Index: Services/WCell.RealmServer/Chat/ChatChannel.cs  
===================================================================  
--- Services/WCell.RealmServer/Chat/ChatChannel.cs (revision 1053)  
+++ Services/WCell.RealmServer/Chat/ChatChannel.cs (working copy)  
@@ -205,7 +205,7 @@  
}  

/// <summary>  
- /// Whether or not the channel is constant.  
+ /// Whether or not the channel is constant. That is, General/LFG/Guild Rec., etc.  
/// </summary>  
public bool IsConstant { get; set; }  

@@ -370,15 +370,15 @@  
return;  
}  

- ChannelHandler.SendYouJoinedReply(user, Name);  
+ ChannelHandler.SendYouJoinedReply(user, this);  

- if (Announces)  
- {  
- ChannelHandler.SendJoinedReplyToEveryone(this, user.EntityId);  
- }  
-  
var member = user.Role.IsStaff ? new ChannelMember(user, ChannelMemberFlags.Moderator) : new ChannelMember(user);  

+ if (Announces)  
+ {  
+ ChannelHandler.SendJoinedReplyToEveryone(this, member);  
+ }  
+  
if (!IsConstant && m_owner == null)  
{  
Owner = member;  
Index: Services/WCell.RealmServer/Handlers/ChannelHandler.cs  
===================================================================  
--- Services/WCell.RealmServer/Handlers/ChannelHandler.cs (revision 1053)  
+++ Services/WCell.RealmServer/Handlers/ChannelHandler.cs (working copy)  
@@ -39,7 +39,8 @@  
//int channelNumber = packet.ReadInt32();  
uint channelId = packet.ReadUInt32(); // used for lookup in dbc for flags  

- ushort unk = packet.ReadUInt16();// packet.SkipBytes(1); // Unknown  
+ byte unk = packet.ReadByte(); // Unknown  
+ byte unk2 = packet.ReadByte(); // Unknown  

string channelName = packet.ReadCString();  
string password = packet.ReadCString();  
@@ -64,7 +65,7 @@  
[ClientPacketHandler(RealmServerOpCode.CMSG_LEAVE_CHANNEL)]  
public static void HandleLeaveChannel(IRealmClient client, RealmPacketIn packet)  
{  
- var channelNumber = packet.ReadUInt32();  
+ var channelNumber = packet.ReadUInt32(); // unk  
var channelName = packet.ReadCString();  

var chan = ChatChannelGroup.RetrieveChannel(client.ActiveCharacter, channelName);  
@@ -393,17 +394,17 @@  
#endregion  

#region Send Methods  
- public static void SendChannelNotify(IPacketReceiver client, string chan, EntityId targetChr, ChannelNotification notification)  
- {  
- using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_CHANNEL_NOTIFY))  
- {  
- packet.WriteByte((byte)ChannelNotification.AlreadyOnChannel);  
- packet.WriteCString(chan);  
- packet.Write(targetChr);  
+ //public static void SendChannelNotify(IPacketReceiver client, string chan, EntityId targetChr, ChannelNotification notification)  
+ //{  
+ // using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_CHANNEL_NOTIFY))  
+ // {  
+ // packet.WriteByte((byte)ChannelNotification.AlreadyOnChannel);  
+ // packet.WriteCString(chan);  
+ // packet.Write(targetChr);  

- client.Send(packet);  
- }  
- }  
+ // client.Send(packet);  
+ // }  
+ //}  

/// <summary>  
/// Send the "already on channel" reply  
@@ -476,15 +477,15 @@  
/// </summary>  
/// <param name="client">the client the outdoing packet belongs to</param>  
/// <param name="chan">name of channel</param>  
- public static void SendYouJoinedReply(IPacketReceiver client, string chan)  
+ public static void SendYouJoinedReply(IPacketReceiver client, ChatChannel chan)  
{  
using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_CHANNEL_NOTIFY))  
{  
packet.WriteByte((byte)ChannelNotification.YouJoined);  
- packet.WriteCString(chan);  
- //packet.WriteUInt(channelNum);  
+ packet.WriteCString(chan.Name);  
+ packet.Write((byte)chan.Flags);  
+ packet.WriteUInt(chan.ChannelId);  
packet.WriteUInt(0);  
- packet.WriteUInt(0);  

client.Send(packet);  
}  
@@ -536,7 +537,6 @@  
packet.WriteByte((byte)ChannelNotification.YouLeft);  
packet.WriteCString(chan);  
packet.WriteUInt(channelId);  
- packet.WriteUInt(0);  
packet.WriteByte(0);  

client.Send(packet);  
@@ -553,7 +553,7 @@  
using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_CHANNEL_NOTIFY))  
{  
packet.WriteByte((byte)ChannelNotification.NotModerator);  
- packet.WriteCString(chan);  
+ //packet.WriteCString(chan);  

client.Send(packet);  
}  
@@ -660,24 +660,17 @@  
{  
using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_CHANNEL_LIST))  
{  
- packet.Write(0x03);  
- packet.Write(chan.Members.Count);  
+ packet.Write((byte)0x01); // unk - 0x03?  
+ packet.WriteCString(chan.Name);  
+ packet.Write((byte)chan.Flags);  

+ // Note: InsertIntAt might be used here later if we want  
+ // to do some sort of "GM shouldn't be included" check.  
+ packet.WriteUInt(chan.Members.Count);  
foreach (var mi in chan.Members.Values)  
{  
packet.Write(mi.User.EntityId);  
-  
- byte mode = 0;  
- if (mi.IsMuted)  
- {  
- mode |= 0x04;  
- }  
- if (mi.IsModerator)  
- {  
- mode |= 0x02;  
- }  
-  
- packet.WriteByte(mode);  
+ packet.Write((byte)mi.Flags);  
}  

client.Send(packet);  
@@ -689,15 +682,23 @@  
/// </summary>  
/// <param name="chan">name of channel</param>  
/// <param name="sender">sender (to check the ignore list)</param>  
- public static void SendJoinedReplyToEveryone(ChatChannel chan, EntityId sender)  
+ public static void SendJoinedReplyToEveryone(ChatChannel chan, ChannelMember sender)  
{  
- using (RealmPacketOut packet = new RealmPacketOut(RealmServerOpCode.SMSG_CHANNEL_NOTIFY))  
+ // the packet has the same size no matter the opcode, so it's really  
+ // a retarded way of doing it... but blame blizz.  
+ var opcode = chan.IsConstant ? RealmServerOpCode.SMSG_USERLIST_ADD  
+ : RealmServerOpCode.SMSG_USERLIST_UPDATE;  
+  
+ using (RealmPacketOut packet = new RealmPacketOut(opcode))  
{  
- packet.WriteByte((byte)ChannelNotification.PlayerJoined);  
- packet.WriteCString(chan.Name);  
- packet.Write(sender);  
+ //packet.WriteByte((byte)ChannelNotification.PlayerJoined);  
+ packet.Write(sender.User.EntityId);  
+ packet.Write((byte)sender.Flags);  
+ packet.Write((byte)chan.ClientFlags);  
+ packet.WriteUInt(chan.MemberCount);  
+ packet.WriteCString(chan.Name);  

- SendPacketToChannel(chan, packet, sender);  
+ SendPacketToChannel(chan, packet, sender.User.EntityId);  
}  
}


 
  • Сторінка 1 з 1
  • 1
Пошук:

Новые сообщения в темах
Сдам в аренду сервер и хостинг · (Хост Предложения)
Автор: redlaine
Последнее сообщение в 23:53
хаха :D · (Приколы)
Автор: [N1ke]Medved
Последнее сообщение в 18:40
Autobattle - новый боевой бот ... · (Боты для WoW)
Автор: terrikon
Последнее сообщение в 18:39
PvE руководство для Чернокнижн... · (Чернокнижник)
Автор: Darkensand
Последнее сообщение в 18:38
Пустой свиток (Часть 11) · (Истории WoW)
Автор: R_a_Z_o_R
Последнее сообщение в 18:37
Друиды в Катаклизме: Официальн... · (Друид)
Автор: Darkensand
Последнее сообщение в 18:37
[Баг 3.3.5] Фарм ледяных бадже... · (Читы для WoW)
Автор: Darkensand
Последнее сообщение в 18:35
FarmBot (Бот для фарма руды и ... · (Боты для WoW)
Автор: homma
Последнее сообщение в 18:34
Почему мы сражаемся: ролевая и... · (Воин)
Автор: Darkensand
Последнее сообщение в 18:34
Книги по Wold of Warcraft · (Истории WoW)
Автор: R_a_Z_o_R
Последнее сообщение в 18:33
Маг огня в Cataclysm · (Маг)
Автор: Darkensand
Последнее сообщение в 18:33
Как начать играть в World of W... · (Полезно знать)
Автор: Belkmondesh
Последнее сообщение в 18:32
Характеризация профессий · (Профессии)
Автор: Darkensand
Последнее сообщение в 18:31
Что значит для арканов бета те... · (Маг)
Автор: Darkensand
Последнее сообщение в 18:31

Контакты Контакты Copyright WoW-Info — World of Warcraft портал © 2025 | Условия и правила использования ресурса | Реклама / Услуги
WoW-Info портал.World of Warcraft портал — готовые сервера, сайты, картинки, аддоны, патчи, читы, баги, mangos, ArcEmu, TrinityCore, Warcraft 3, новости, Cataclysm...
Яндекс.Метрика Хостинг від uCoz