16.07.2010, 11:24 | #1 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
гуид персонажа?
Интересует как узнать guid своего персонажа которым я захожу в мир.
Порылся в снифе и нашел вроде бы два варианта: первый - в сообщениии SMSG_CHAR_ENUM и второй - в SMSG_NAME_QUERY_RESPONSE. В последнем приходит packed guid и имя. В связи с этим два вопроса: guid каждого персонажа задается при его создании на сервере и больше не меняется ? Как перевести текст который возвращает сервер в нормальный вид? некоторые символы заменены на 2 байта, логику пока не разглядел |
16.07.2010, 11:40 | #2 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
CMSG_PLAYER_LOGIN
гуид никогда не меняется. текс в обычном юникоде. я ж тебе в аську всё написал. |
16.07.2010, 11:40 | #3 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
да не юникод это, какая-то двухбайтовая ахинея -)
|
16.07.2010, 11:50 | #4 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
давным давно, когда динозавры еще были молодые, я на скору руку сделал две функции и (вот парадокс) пользуюсь ими до сих пор.
Код:
procedure cmd_CMSG_MESSAGECHAT(sender: TWorldUser); var imsg: T_CMSG_MESSAGECHAT; i: longint; begin i:= msgParse(sender.RBuf, imsg); ... MainLog('CMSG_MESSAGECHAT type='+strr(imsg.cType)+', lang='+strr(imsg.cLanguage)+' ['+wow_unicode866(imsg.cText)+']',1,0,0); ... Код:
function wow_unicode866(s: string): string; var ofs: integer; c: byte; begin ofs:=1; result:=''; while ofs<=length(s) do begin c:=ord(s[ofs]); if c in [208,209] then begin inc(ofs); c:=ord(s[ofs]); if (c in [128..143]) then result:=result+chr(c+96); if (c in [144..191]) then result:=result+chr(c-16); end else result:=result+s[ofs]; inc(ofs); end; end; Код:
function wow_unicode1251(s: string): string; var ofs: integer; c: byte; begin ofs:=1; result:=''; while ofs<=length(s) do begin c:=ord(s[ofs]); if c in [208,209] then begin inc(ofs); c:=ord(s[ofs]); if (c in [128..143]) then result:=result+chr(c+112); if (c in [144..191]) then result:=result+chr(c+48); end else result:=result+s[ofs]; inc(ofs); end; end; |
Пользователь сказал cпасибо: | Йоха (16.07.2010) |
16.07.2010, 11:57 | #5 |
MaNGOS Dev
Регистрация: 11.03.2010
Сообщений: 468
Сказал(а) спасибо: 0
Поблагодарили 514 раз(а) в 163 сообщениях
|
Там не юникод, а UTF-8. А гуид персонажа меняется при трансфере на другой сервер.
На C# с UTF8 вообще элементарно работать: Код:
using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Wlp.IO { public static class CStringExtensions { /// <summary> Reads the NULL terminated string from /// the current stream and advances the current position of the stream by string length + 1. /// <seealso cref="BinaryReader.ReadString"/> /// </summary> public static string ReadCString(this BinaryReader reader) { return reader.ReadCString(Encoding.UTF8); } /// <summary> Reads the NULL terminated string from /// the current stream and advances the current position of the stream by string length + 1. /// <seealso cref="BinaryReader.ReadString"/> /// </summary> public static string ReadCString(this BinaryReader reader, Encoding encoding) { try { var bytes = new List<byte>(); byte b; while ((b = reader.ReadByte()) != 0) bytes.Add(b); return encoding.GetString(bytes.ToArray()); } catch (EndOfStreamException exc) { Logger.Instance.WarnFormat("ReadCString failed: {0}!", exc.Message); return String.Empty; } } public static void WriteCString(this BinaryWriter writer, string str) { var bytes = Encoding.UTF8.GetBytes(str); writer.Write(bytes); writer.Write((byte)0); } } } Последний раз редактировалось TOM_RUS; 16.07.2010 в 12:14. |
Пользователь сказал cпасибо: | Йоха (16.07.2010) |
16.07.2010, 13:20 | #6 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
а UTF-8 разве не юникод?
в дельфи наверняка тоже есть встроенные средства. в 2010ой точно есть, она вся такая юникодная стала. я просто написал сам по быстрой и не маялся с поиском. в данном случае было проще замазать, чем отскрести |
16.07.2010, 13:20 | #7 |
Умный
Регистрация: 02.07.2010
Сообщений: 434
Сказал(а) спасибо: 27
Поблагодарили 73 раз(а) в 45 сообщениях
|
Рома, я ж говорил что это UTF-8, а ты уникод -)
TOM_RUS, RomanRom2 спасибо за подсказки P.S. в общем выкрутился парой WideCharToMultiByte(...) Последний раз редактировалось Йоха; 16.07.2010 в 13:49. |
16.07.2010, 17:11 | #8 |
Администратор
|
При перекодировании данных из Windows-1251 в UTF-8 и Unicode получаем разные данные, так что кодировки разные, надо использовать UTF-8.
|
16.07.2010, 19:34 | #10 |
MaNGOS Dev
Регистрация: 09.02.2010
Сообщений: 594
Сказал(а) спасибо: 315
Поблагодарили 438 раз(а) в 181 сообщениях
|
Ну обычно когда говорят юникод имеют ввиду utf-16, а про utf-8 явно говорят, все остальные просто очень редко используются...
__________________
Так как устал объяснять знайте ICQ не пользуюсь |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Открыть все зоны для персонажа. Реально? | Sl3p0y | Новичкам | 1 | 13.07.2010 10:55 |
Забрать предмет у персонажа через личный кабинет. | tozter | WWW | 9 | 07.07.2010 16:21 |
Зависание персонажа | serg1 | Корзина | 7 | 17.04.2010 05:03 |
Сброс статистики персонажа | uNkind | Флудильня | 1 | 12.03.2010 04:34 |