PDA

Просмотр полной версии : гуид персонажа?


Йоха
16.07.2010, 11:24
Интересует как узнать guid своего персонажа которым я захожу в мир.
Порылся в снифе и нашел вроде бы два варианта: первый - в сообщениии SMSG_CHAR_ENUM и второй - в SMSG_NAME_QUERY_RESPONSE. В последнем приходит packed guid и имя.

В связи с этим два вопроса:

guid каждого персонажа задается при его создании на сервере и больше не меняется ?

Как перевести текст который возвращает сервер в нормальный вид? некоторые символы заменены на 2 байта, логику пока не разглядел

RomanRom2
16.07.2010, 11:40
CMSG_PLAYER_LOGIN
гуид никогда не меняется.
текс в обычном юникоде.

я ж тебе в аську всё написал.

Йоха
16.07.2010, 11:40
да не юникод это, какая-то двухбайтовая ахинея -)

RomanRom2
16.07.2010, 11:50
давным давно, когда динозавры еще были молодые, я на скору руку сделал две функции и (вот парадокс) пользуюсь ими до сих пор.


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;

может пригодится.

TOM_RUS
16.07.2010, 11:57
Там не юникод, а 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);
}
}
}

RomanRom2
16.07.2010, 13:20
а UTF-8 разве не юникод (http://ru.wikipedia.org/wiki/BOM#UTF-8)? :pardon:

в дельфи наверняка тоже есть встроенные средства. в 2010ой точно есть, она вся такая юникодная стала.
я просто написал сам по быстрой и не маялся с поиском. в данном случае было проще замазать, чем отскрести =)))

Йоха
16.07.2010, 13:20
Рома, я ж говорил что это UTF-8, а ты уникод -)

TOM_RUS, RomanRom2 спасибо за подсказки

P.S.
в общем выкрутился парой WideCharToMultiByte(...)

virusav
16.07.2010, 17:11
При перекодировании данных из Windows-1251 в UTF-8 и Unicode получаем разные данные, так что кодировки разные, надо использовать UTF-8.

Minimajack
16.07.2010, 18:25
При перекодировании данных из Windows-1251 в UTF-8 и Unicode получаем разные данные, так что кодировки разные, надо использовать UTF-8.

ну е-маё
unicode это не кодировка, это обобщенное название расширенных кодировок символов, таких как utf-8, utf-16, utf-32...
естественно представление разное...

Vladimir
16.07.2010, 19:34
Ну обычно когда говорят юникод имеют ввиду utf-16, а про utf-8 явно говорят, все остальные просто очень редко используются...