Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
PROTOCOL_LOBBY_CHATTING_ACK
#11
Ну да, если опкоды поменяются, то куда лучше по каждому файлу лазить. )
Ответ
#12
PROGRAMMATOR Написал:Ну да, если опкоды поменяются, то куда лучше по каждому файлу лазить. )

> ПБ
> Поменяются опкоды

Я еще не помню такого случая что бы все иды под чистую изменили, разве что с выходом пирсинга все "глобально" изменили.
Когда клиент с новым интерфейсом на арабском сервере только вышел(в году 2011), там вообще по моему отличий на пакетном уровне не было от старых версий
Ответ
#13
Ну вот, раз уже было. Smile

Да норм всё, добавил пакет, внес его имя, опкод и забыл.
Ответ
#14
PROGRAMMATOR Написал:Ну вот, раз уже было. Smile

Да норм всё, добавил пакет, внес его имя, опкод и забыл.

Приходит пакет -> Ищем ид в enum списке -> По иду вытаскиваем название -> По названию ищем и вызываем класс с логикой пакета

Я верно понял вашу систему?
Ответ
#15
partyvan,
Да так и есть. Другие варианты просто извращены тогда......
Хотя у меня так же HandlePacket клиентский построен Big Grin
Ответ
#16
[SRC="csharp"]PacketOpcode Id;

if (Enum.TryParse(GetType().Name, out Id))
{
// ...
}
else
{
// ...
}
[/SRC]
Ответ
#17
Awiion Написал:Boris2105, Смотри лучше.
Во первых, в Unicode один символ, равен двум.

Во вторых, включи рассудок,

Код:
WriteH(_message.Length);
   WriteUnicode(_message, _message.Length);

Код:
Write<ushort>(Text.Leneth)
WriteUnicode(Text);

У тебя первый указывает массив, второй столбец записывает.
Записываешь ты не правильно, WriteUnicode по этому используешь +1

Код:
[OpCode(3087)]
    class SM_LOBBY_CHATTING : WriterPacket
    {
        private Player player;
        private ChatType type;
        private string text;

        public SM_LOBBY_CHATTING(Player player, ChatType type, string text)
        {
            this.player = player;
            this.type = type;
            this.text = text;
        }

        public override WriteImpl()
        {
            Write<int>(player.Id);
            Write<byte>(player.Name.Length);
            WriteUnicode(player.Name);
            Write<byte>(player.Color);
            Write<byte>(type);
            Write<ushort>(text.Length);
            WriteUnicode(text);
        }
    }

[Изображение: SnimokPNG_2066051_22716911.png]

Почему то к нику прибавляются китайские иероглифы .


[SRC=CSharp]
public void WriteUnicode(string text, int count)
{
if (text != null)
{
WriteB(Encoding.GetEncoding(1200).GetBytes(text));
WriteB(new byte[count - (text.Length)]);
}
}


Logger.Instance.Info("Message:{0}, Name:{1}", _message, _player.Name);
WriteD(_player.Id);
WriteC(_player.Name.Length);
WriteUnicode(_player.Name, _player.Name.Length);
WriteC(0);
WriteC(0);
WriteH(_message.Length);
WriteUnicode(_message, _message.Length);
[/SRC]

[Изображение: WaZ_N_JRZ4Q.jpg]
Ответ
#18
Boris2105, WriteUnicode не верный, в твоем случае тогда так:
Код:
WriteC((byte)(_player.Name.Length + 1));
WriteUnicode(_player.Name, _player.Name.Length + 2);
Ответ
#19
Awiion Написал:Boris2105, WriteUnicode не верный, в твоем случае тогда так:
Код:
WriteC((byte)(_player.Name.Length + 1));
WriteUnicode(_player.Name, _player.Name.Length + 2);

а ты не мог бы дать верный?
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)