Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Tools (http://mangos.ytdb.ru/forumdisplay.php?f=22)
-   -   PseuWoW - первый Альтернативный клиент для сервера MaNGOS (http://mangos.ytdb.ru/showthread.php?t=722)

tempura 13.04.2010 08:53

PseuWoW - первый Альтернативный клиент для сервера MaNGOS
 
Часть 1.
Описание.


PseuWoW - альтернативный opensource MMORPG клиент, который позволяет соединяться с MaNGOS и другими серверами ВоВ.
Пожалуйста обратите внимание, что PseuWoW официально поддерживает только MаNGOS.

Преимущества:
- Работает на любой Windows-платформе (win98 +)
- почти отсутствуют системные требования к ЭВМ (386 процессора будет достаточно для запуска, но работа программмы будет медленной)
- минимум дискового пространства (основной размер пакета - ниже 5 МБ)
- минимальные требования к оперативной памяти
- может быть запущен ото всюду, не нуждается в установке, и ничего не изменяют в системе, на компьютере, где производится запуск (подобно реестру).

Запускайте клиент где угодно: школа, офис, и т.д, к примеру, Вы можете болтать с людьми, играющими на серверах.
- может быть расширен через скриптинг
- очень быстрое время входа. По локальным сетям требуется 2 секунды, чтобы подсоединиться к Realm серверу, если у вас достаточно быстрая машина (начал считать, как только запустил .ехе)
- файлы клиента Blizzard критически НЕ необходимы для работы, но Вы можете модульно добавлять контент от коммерческих MMO игр (stuffextract.exe для WoW)
- наиболее важный аспект: проект создан как opensource! измените код под ваши нужды, и поделитесь с другими.


Неудобства:
- основной пакет без извлеченных ресурсов игры обеспечивает мало функциональных возможностей
- все еще в очень раннем состоянии, так что не ожидайте слишком много, есть так много вещей, которые еще не осуществлены.
- чем больше контента включено и загружено, тем больше используется оперативной памяти и места на диске.
- Вы не можете использовать данные игры, упакованные в оригинале MPQ архив, их необходимо извлечь. Это занимает больше дискового места, но лучше для изменения данных и улучшения совместимости. К счастью stuffextract делает все необходимое автоматически.



Часть 2.
Установка.


---------------------
Клиент идет с готовыми к использованию SCP данными, извлеченными из 3.3.2 enGB клиента.
Все, что Вы должны сделать, это изменить ваши conf файлы.
---------------------

1.) Откройте дирректорию conf .

2.) Скопируйте все *.conf.default файлы и переимуйте их копии в *.conf (удалите расширение .default)

3.) Откройте PseuWoW.conf блокнотом или любым другим текстовым редактором.

4.) Сконфигурируйте файл, чтобы он соответствовыл вашей логин-информации. Читайте комментарии в файле для более детальной справки.

5.) Если Вы планируете использовать PseuWoW как бота, редактируйте файл users.conf и добавляйте пользователей и уровни доступа.
(Разрешения необходимы, чтобы управлять DefScripts; если разрешение игрока слишком низко для скрипта ему не разрешат запустить его.)
Также проверьте ScriptConfig.conf для встроенных назначений скрипта (автоброадкаст = сообщение дня).

6.) Не забывайте сохранять изменения!!!

7.) Скопируйте stuffextract.exe (и .bat файлы) в дирректорию, где установлен клиент World of Warcraft.
Обратите внимание: используйте WoW 3.0.8, другие клиенты не подходят и не подерживаются.
Запустите stuffextract, после того, как он закончит работу, перейдите в папку /stuffextract/ и скопируйте все файлы и папки в дирректорию PseuWoW .
замените существующие данные!
>> есть 2 .bat файла, идущих с сервером, один, чтобы извлечь только минимальное количество требуемых данных,
>> и тот, который также извлекает карты, если Вы интересуетесь тестированнием.
>>В этом релизе мы уже упаковали самые необходимые данные, так что Вы нуждаетесь в stuffextract только если хотите использовать данные различных языков.

8.) Запустите PseuWoW.

9.) Ошибка? Убедитесь, что Вы установили правильный адрес realmlist, realm name и character name.
Персонаж должен существовать! (В противном случае создайте персонажа, используя коммерческий клиент).
Проверьте также, есть ли файл _startup.def в корневой дирректории PseuWoW, он необходим!

10.) Запустите снова. Все еще ошибка? Посетите форум!




Часть 3.
ЧАВО.


Через некоторое время, я получаю crypt errors, exceptions или unknown object errors! Что я могу сделать?
Сообщите об ошибке! Опубликуйте ваши лог-файлы, они могли бы быть полезны. Не забудьте почистить логи, если вы собираетесь сделать их достоянием широкой общественности.

Крашит. КАКОГО ...?
СООБЩИТЕ НАМ!!!!!! И добавьте логи!!!

Как я могу изменить или выключить сообщение " [A13-dev1] login successful. "?
Откройте scripts/__core_eventstubs.def текстовым редактором и измените соответствующую строку.

Как я могу использовать консоль?
Если консоль не активна, убедитесь, что строка "enablecli=1" существует в вашем conf файле. Если Вы видите " <>: " при запуске, консоль однозначно активна. Вы можете ввести что - нибудь, что существует как a .def файл в вашй скриптовой дерриктории. Пример: "say привет" (проверьте scripts/say.def)
В основном все, в что Вы вводите - скриптовые команды.
Обратите внимание: чтобы "заблокировать(заморозит ь)" команду, напечатайте название, которому будет предшествовать символ "!"-> "! say".
Это означает, что Вы напечатали, будет добавляться в конец команды "say".
пример:
на консоли отобразилось: " <>: "
Вы напечатали: "! whisper, Keks" - нажмите enter
на консоли отобразилось: ":"
Вы напечатали: "Привет, друг! Видел бы ты мой клиент ))"
итог: отправлено личное сообщение игроку Keks "Привет, друг! Видел бы ты мой клиент ))".

Как я могу делать мои собственные скрипты?
Создайте .def файл в папке скриптов, и напишите код.Информация о синтаксисе - https: // opensvn.csie.org/traccgi/PseuWoW/wiki/DefScript

Когда выполняются основные скрипты?
- _enterworld.def: когда вход в мир был успешен.
- _leaveworld.def: когда PseuWoW разъединен.
- _startup.def: в течение инициализации программы. также здесь загружаются conf файлы.
- _nopermission.def: когда игрок пробовал выполнить недопустимую команду ingame.
- _onwhisper: личное сообщение от игрока - recieved. (за исключением личного сообщения самому себе)

Я хочу удаленно управлять PseuWoW. Как я могу сделать это?
(1) послать сообщение PseuWoW в чате (say, yell, whisper, channel,...),который начинается с - (минуса). PseuWoW интерпретирет это сообщение чата как скриптовую команду, подобно тому, если это было напечатано в окне консоли. Установить разрешения, какие скрипты кто может использовать, редактируя /conf/users.conf. Чтобы изменить уровень доступа для скриптов,редактируйте флаг *permission=xx в файлах скрипта, или установите это используя команду setscriptpermission.





Офсайт:
_http://mangosclient.org/

Исходники:
_https://pseuwow.svn.sourceforge.net/svnroot/pseuwow/ (outdated)
_http://github.com/fgenesis/pseuwow (orig) (outdated)
_http://github.com/BThallid/pseuwow (fork) (outdated)
_http://github.com/shlainn/pseuwow (fork) (current)

tempura 13.04.2010 08:57

На данный момент нормально входит на 3.3.2, но не лезет в 3.3.3. При обновлении с 3.1.3 на 3.3.2 были изменения:

WorldSession.cpp
Код:

void WorldSession::_HandleAuthChallengeOpcode(WorldPacket& recvPacket)
{
    std::string acc = stringToUpper(GetInstance()->GetConf()->accname);
+        uint32 sp;
+        recvPacket >> sp;
        uint32 serverseed;
        recvPacket >> serverseed;

        logdebug("Auth: serverseed=0x%X",serverseed);
        Sha1Hash digest;
        digest.UpdateData(acc);
        uint32 unk=0;
+        uint64 unk4=0;
        digest.UpdateData((uint8*)&unk,sizeof(uint32));
        BigNumber clientseed;

(про откат с 332 на 313 автор дословно написал: "pseuwow 3.1.3 expects 4 bytes in auth challenge, while pseuwow 3.3.2 expects 8. that explains why it fails to read - your 3.1.3 server sends only 4 bytes there")

Может кто-то объяснить - что куда написать, чтобы на 3.3.3 начал нормально входить? А то проект обновляется, мягко говоря, нечасто. :)



Сейчас при входе выдается ошибка в PseuWoW:
Код:

Connected to world server.
CRYPT ERROR: opcode=7442, remain=5078590
Shutting down instance...

Код:

Connected to world server.
CRYPT ERROR: opcode=42499, remain=3846113
Shutting down instance...

Код:

Connected to world server.
CRYPT ERROR: opcode=34771, remain=32501
Shutting down instance...

ну и так далее...

tempura 07.05.2010 20:43

Вложений: 1
фикс под 333а


пишут, что работает, сам пока не проверил, только нашел и поставил.

Lawliet 11.05.2010 18:51

Tempura, при компиляции возникают ошибки:
Компиляции проекта PseuWoW:

PHP код:

Linking...
   
Creating library D:\Dev\pseywow\/bin/PseuWoW_VC90_noconsole.lib and object D:\Dev\pseywow\/bin/PseuWoW_VC90_noconsole.exp
LINK 
warning LNK4098defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
WorldSession
.obj error LNK2001unresolved external symbol __CrtDbgReportW
libcpmtd
.lib(stdthrow.obj) : error LNK2001unresolved external symbol __CrtDbgReportW
libcpmtd
.lib(xdebug.obj) : error LNK2001unresolved external symbol __malloc_dbg
libcpmtd
.lib(xdebug.obj) : error LNK2001unresolved external symbol __free_dbg
D
:\Dev\pseywow\/bin/PseuWoW_VC90_noconsole.exe fatal error LNK11203 unresolved externals
Build log was saved at 
"file://D:\Dev\pseywow\temp\PseuWoW\Release noconsole\BuildLog.htm"
PseuWoW 5 error(s), 3 warning(s

И StuffExtract:

PHP код:

Linking...
LINK fatal error LNK1104cannot open file 'StormLibRAS.lib'
Build log was saved at "file://D:\Dev\pseywow\temp\StuffExtract\Release\BuildLog.htm"
StuffExtract 1 error(s), 0 warning(s

В чем проблема не подскажите, пробовал компилить как просто Release Win32, так и остальные конфигурации, с настройками и без, ни хочет ни в какую.

Ревизия 386 (самая последняя... :mda: )

Да и кстати, нашел на github.com репозитарий:
http://github.com/BThallid/pseuwow

ИМХО: Две ветки, на взгляд одна оригинал, другой он занимается лично :) сейчас скачаю, попробую скомпилить. И еще, в коммитах есть масса обновляний под 3.3.3а :declare:

Все те же ошибки...

PHP код:

Linking...
   
Creating library D:\Dev\pseywow\/bin/PseuWoW_VC90.lib and object D:\Dev\pseywow\/bin/PseuWoW_VC90.exp
LINK 
warning LNK4098defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
WorldSession
.obj error LNK2001unresolved external symbol __CrtDbgReportW
libcpmtd
.lib(stdthrow.obj) : error LNK2001unresolved external symbol __CrtDbgReportW
libcpmtd
.lib(xdebug.obj) : error LNK2001unresolved external symbol __malloc_dbg
libcpmtd
.lib(xdebug.obj) : error LNK2001unresolved external symbol __free_dbg
D
:\Dev\pseywow\/bin/PseuWoW_VC90.exe fatal error LNK11203 unresolved externals
Build log was saved at 
"file://D:\Dev\pseywow\temp\PseuWoW\Release\BuildLog.htm"
PseuWoW 5 error(s), 1 warning(s

Tempura, подскажите пожалуйста как от этого избавится :sorry:


Add: В дебаге скомпилилось без проблем....

tempura 12.05.2010 04:31

Видите ли, дорогой вы мой Lawliet... Я не являюсь разработчиком проекта PseuWoW, поэтому любые личные обращения ко мне по поводу ошибок в данном проекте - просто бессмысленны. :) Обычно я (как и любой здоровый человек) все найденное и могущее принести пользу - сразу выкладываю сюда. Так что я тут совершенно ни при чем.
Однако, если вы затеете переписку с автором и разработчиком на его собственном форуме, я почти уверен, что вы получите хоть какой-то ответ. :)

(кстати - у меня таже фигня, и я компилю именно в дебаге)

MangMan 12.05.2010 05:18

Проблема в не объявленной библиотеки или в private объекте класса.
А скорее всего ошибка в Make файлах Visual Studio(не знал как их обозвать, но думаю вы меня поняли), просто автор работает в linux, а make для Visual Studio делает теоретически и проверить на практике не может

Lawliet 12.05.2010 11:48

Цитата:

Сообщение от MangMan (Сообщение 6223)
Проблема в не объявленной библиотеки или в private объекте класса.
А скорее всего ошибка в Make файлах Visual Studio(не знал как их обозвать, но думаю вы меня поняли), просто автор работает в linux, а make для Visual Studio делает теоретически и проверить на практике не может

Спасибо за подсказку, попробую сегодня, что нибудь придумать, если же не получится, будем компилить в дебаге =)))

Add: Ничего не вышло, чтож делать, дебаг так дебаг.... Только вот еще одна проблема, зависает GUI интерфейс, отладка говорит, что причина в:

PHP код:

MapMgr.-> inline uint32 GetGridX(void) { return _gridx; } 

Add2: возможно потому, что я извлекал из 3.3.3а клиента дата файлы, в вашем мануале написано, поддерживается только 3.0.8

KiriX 12.04.2011 08:55

Вспомнил об этом клиенте =) Зашёл и задался мыслью - а можно ли заставить его понимать русские символы и нормально работать с ними через консоль? Т.е. писать сообщения на русском, отображать получаемые сообщения не кракозябрами, а русскими символами, ну и, конечно, заходить персом с именем на русском?
Где это вообще менять, чтобы консольное приложение нормально работало с кириллицей?

Йоха 12.04.2011 09:24

По умолчанию консоль имеет кодировку 866 (OEM), посему :
Или воспользоваться функцией конвертацией для каждой выводимой строки
Код:

CharToOem
Или один раз в начале программы написать:
Код:

setlocale(LC_ALL, "Russian");
и после этого любой вывод в консоль будет работать как положено
Код:

cout << "русский текст" << endl;
выведет именно "русский текст"

KiriX 12.04.2011 10:45

Я уже нашёл в интернетах что-то по поводу:
Код:

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Тоже в начале программы вставлять надо =)
Только я что-то совсем не понимаю, где среди множества файлов PseuWoW - начало? =)

С выводом на экран помогло следующее:
Код:

SetConsoleOutputCP(CP_UTF8);
При условии если в консоли стоит настройка шрифта Lucida Console.
А вот ввод воспринимать правильно по прежнему отказывается.
Код:

setlocale(LC_ALL, "Russian");
Вообще выводит страшные кракозябры, которые даже http://www.artlebedev.ru/tools/decoder перевести не может =)
Может, дело в том, что работаем мы с UTF8, а не cp1251? Я не нашёл нормального преобразователя с UTF8 для консоли...

KiriX 12.04.2011 14:32

А как это реализовано в мангосе? Там с вводом/выводом проблем нет. Всё прекрасно вводится и выводится на русском...

Йоха 12.04.2011 16:11

Цитата:

Сообщение от KiriX (Сообщение 20867)
Только я что-то совсем не понимаю, где среди множества файлов PseuWoW - начало? =)

в любой программе на с/с++ "начало" это функция main

Цитата:

Сообщение от KiriX (Сообщение 20867)
Может, дело в том, что работаем мы с UTF8, а не cp1251? Я не нашёл нормального преобразователя с UTF8 для консоли...

а, ну если там используется UTF-8, то придется конвертировать текст из этой кодировки в OEM

Я как-то писал такую функцию, пример взят из MSDN, там идет сперва идет конвертация в юникод, а потом в 866.
Конечно можно написать функцию попроще, но эта работает и главное что она универсальная, можно ее за 5 сек исправить для преобразования любой другой кодировки опять же в любую другую -). Всего лишь поменять "CP_UTF8" и "866".
Да, и не забыть что строку после использования нужно удалять руками, или написать маленький класс обертку, для автоматического удаления буфера

Код:

char* str_utf8_to_866(BYTE *buf)
{
        wchar_t* pResw = 0;
        char* pRes = 0;
        int res_len = 0;
 
        res_len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, -1, 0, 0);
        if (!res_len)
                return NULL;
 
        pResw = new wchar_t[res_len];
        if (!MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, -1, pResw, res_len))
        {
                delete[] pResw;
                return NULL;
        }
 
        res_len = WideCharToMultiByte(866, 0, pResw, -1, 0, 0, 0, 0);
        if (!res_len)
                return 0;
 
        pRes = new char[res_len];
        if (!pRes)
                return NULL;
 
        if (!WideCharToMultiByte(866, 0, pResw, -1, pRes, res_len, 0, 0))
        {
                delete[] pRes;
                return NULL;
        }
        delete[] pResw;

        return pRes;
}


KiriX 12.04.2011 16:20

Йоха, спасибо.
Вот только проблема в том, что предложенный тобой код не универсален, а в псивове уже есть множество функций вывода текста. Твоё преобразование придётся пихать в каждую их них или писать функцию (что почти равносильно - всё равно придётся переписывать код в очень многих местах...)
Но всё же интересно, как эту ситуацию порешили разработчики мангоса =) Владимир, не поделитесь тайной? =)

Добавил функцию, решил так перевести хотя бы некоторые строки - фиг вам получил.
Код:
Код:

char *str_utf8_to_866(BYTE *buf)
{
        wchar_t* pResw = 0;
        char* pRes = 0;
        int res_len = 0;

        res_len = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, -1, 0, 0);
        if (!res_len)
                return NULL;

        pResw = new wchar_t[res_len];
        if (!MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)buf, -1, pResw, res_len))
        {
                delete[] pResw;
                return NULL;
        }

        res_len = WideCharToMultiByte(866, 0, pResw, -1, 0, 0, 0, 0);
        if (!res_len)
                return 0;

        pRes = new char[res_len];
        if (!pRes)
                return NULL;

        if (!WideCharToMultiByte(866, 0, pResw, -1, pRes, res_len, 0, 0))
        {
                delete[] pRes;
                return NULL;
        }
        delete[] pResw;
                return pRes;
}

void logcustom(uint8 lvl, Color color, BYTE *stru, ...)
{
        char *str = str_utf8_to_866(stru);

    if(!str || loglevel < lvl)
        return;
    va_list ap;
    _log_setcolor(true,color);
    if(logtime)
        printf("%s ", GetTimeString().c_str());
    va_start(ap, str);
    vprintf( str, ap );
    va_end(ap);
    _log_resetcolor(true);

    printf("\n");

    if(logfile)
    {
        fprintf(logfile, "%s", getDateString().c_str());
        va_start(ap, str);
        vfprintf(logfile, str, ap);
        fprintf(logfile, "\n" );
        va_end(ap);
        fflush(logfile);
    }
    fflush(stdout);
}

Почему-то ругается на неразрешённый внешний символ =(
Код:

3>DefScriptInterface.obj : error LNK2001: неразрешенный внешний символ ""void __cdecl logcustom(unsigned char,enum Color,char const *,...)" (?logcustom@@YAXEW4Color@@PBDZZ)"
А при чём он здесь вообще???

Йоха 12.04.2011 16:29

Универсального решения нет, что бы с минимальными модификациями кода влепить поддрежку utf8.
В мангосе все то же самое, используется функция vutf8printf, определенная в файле util.cpp.
при вызове sLog.OutError вызывается именно она. Внутри vutf8printf так же происходит конфвертация из utf8 в oem, чудес то не бывает -)

В псивове какая функция используется для вывода ? printf ? Если да то пишем там функцию printf_utf8, внутри нее делаем конвертацию utf8-oem, а во всем проекте делаем пакетную замену printf на printf_utf8
Имхо это самое быстрое решение.

Burned 12.04.2011 17:35

Ух, я когда-то тоже намучался с этой проблемой...
Запускал bat файлом:
%COMSPEC% /C chcp 65001 & PseuWoW.exe

Но после первой команды с использованием кирилицы дальше что-либо ввести было нельзя.

KiriX 12.04.2011 17:45

Йоха, ну чтож, будем пробовать дальше... Спасибо за подсказки!
Burned,
Цитата:

Сообщение от KiriX (Сообщение 20867)
С выводом на экран помогло следующее:
Код:

SetConsoleOutputCP(CP_UTF8);
При условии если в консоли стоит настройка шрифта Lucida Console

Вызывает аналогичную проблему. Отображать отображает, отправляет неверно. Если использовать ещё и
Код:

SetConsoleCP(CP_UTF8);
тоже виснет при первом вводе кириллицы...
P.S: Копаем дальше =)

Йоха 12.04.2011 18:07

Код:

DefScriptInterface.obj : error LNK2001: неразрешенный внешний символ ""void __cdecl logcustom(unsigned char,enum Color,char const *,...)"
Дело в том что убран модификатор const у третьего параметра, это получилась другая функция.
Код:

void logcustom(uint8 lvl, Color color, BYTE *stru, ...)
Надо изменить объявление функции str_utf8_to_866 на :
Код:

char *str_utf8_to_866(const char *buf)
а logcustom оставить без изменений
Код:

void logcustom(uint8 lvl, Color color, const char *stru, ...)

Йоха 12.04.2011 18:16

Вот слегка измененный вариант, позволяет указывать кодировки при вызове функции, ее так же можно использовать при вводе данных для последующей обработки, только поменять местами CP_UTF8 и 866.

Код:

char* str_convert(const char *buf, UINT codepage_from, UINT codepage_to)
{
        wchar_t* pResw = 0;
        char* pRes = 0;
        int res_len = 0;
        res_len = MultiByteToWideChar(codepage_from, 0, (LPCSTR)buf, -1, 0, 0);
        if (!res_len)
                return NULL;
        pResw = new wchar_t[res_len];
        if (!MultiByteToWideChar(codepage_from, 0, (LPCSTR)buf, -1, pResw, res_len))
        {
                delete[] pResw;
                return NULL;
        }
        res_len = WideCharToMultiByte(codepage_to, 0, pResw, -1, 0, 0, 0, 0);
        if (!res_len)
                return 0;
        pRes = new char[res_len];
        if (!pRes)
                return NULL;
        if (!WideCharToMultiByte(codepage_to, 0, pResw, -1, pRes, res_len, 0, 0))
        {
                delete[] pRes;
                return NULL;
        }
        delete[] pResw;
        return pRes;
}

И не забываем удалять строку после использования:
Код:

int _tmain(int argc, _TCHAR* argv[])
{
        char* str = str_convert("some text", CP_UTF8, 866);
        printf("%s\n", str);
        delete[] str;

        return 0;
}


KiriX 12.04.2011 19:24

Йоха, я думал BYTE - это важно =)
Я взял способ с мангоса - выводит теперь всё на русском нормально.
Теперь надо разобраться с нормальным вводом русских символов =)
Спасибо за подсказки - очень помог! ;)

KiriX 12.04.2011 19:44

Всё! Я сдаюсь =( Не могу понять, где идёт работа с входящими (вводимыми) командами, которые пишутся в консоли =(
Ну хоть отображает теперь на русском нормально =)

Йоха 12.04.2011 19:46

Цитата:

Сообщение от KiriX (Сообщение 20893)
Йоха, я думал BYTE - это важно =)

BYTE это просто typedef unsigned char
Просто у меня в программе использовался именно BYTE, поэтому так и функция выглядела.

А для ввода тоже самое, только обратное преобразование
Код:

char *str;
// каким-то там образом ввели с консоли str
char *utf8str = str_convert(str, 866, CP_UTF8);
// здесь что-то делаем со строкой в utf8
// ...
delete[] utf8str // освобождаем память;


KiriX 12.04.2011 19:51

Цитата:

Сообщение от Йоха (Сообщение 20899)
BYTE это просто typedef unsigned char
Просто у меня в программе использовался именно BYTE, поэтому так и функция выглядела.

А для ввода тоже самое, только обратное преобразование
Код:

char *str;
// каким-то там образом ввели с консоли str
char *utf8str = str_convert(str, 866, CP_UTF8);
// здесь что-то делаем со строкой в utf8
// ...
delete[] utf8str // освобождаем память;


Да с вашими подсказками с обратным преобразованием я уже справился бы, вот только не могу найти в коде где эта обработка входящих команд =)

Йоха 12.04.2011 20:00

сейчас скачаю исходники, посмотрю

этот адрес github.com/fgenesis/pseuwow ?

KiriX 12.04.2011 21:48

Вложений: 1
Цитата:

Сообщение от Йоха (Сообщение 20901)
сейчас скачаю исходники, посмотрю

этот адрес github.com/fgenesis/pseuwow?

Да, оно.
Патчем, то, что я уже сделал - хотябы выводит русский язык =)

Йоха 12.04.2011 22:06

к сожалению не могу запустить сие творение, у меня дома нет мангоса, и не могу посмотреть как он выглядит этот псивов. Что за консоль ? и для чего она используется? а то поиск неизвестно чего в исходниках пока не принес результатов -)

KiriX, скриншот что ли покажи как он выглядит в работе

dj--alex 12.04.2011 22:32

я вообще слышал как кто-то правда на базе не мангос а Runwow создал на базе Unigine совершенно новую Mmorpg с вовской механикой.
причем что интересно нашёл эту инфу на сайте разработчиков unigine.com наших русских кстати.

может и на базе PseuWow+ MaNGOS можно что то иное сделать?
хотя как мне кажется многие чисто wow-related вещи попросту будут неиспользованы.

KiriX 12.04.2011 22:33

Вложений: 1
Цитата:

Сообщение от Йоха (Сообщение 20906)
к сожалению не могу запустить сие творение, у меня дома нет мангоса, и не могу посмотреть как он выглядит этот псивов. Что за консоль ? и для чего она используется? а то поиск неизвестно чего в исходниках пока не принес результатов -)

KiriX, скриншот что ли покажи как он выглядит в работе

Да а смысл тогда? =)
Такое же консольное окно как и мангос.

Йоха 12.04.2011 23:02

понятно. И в этом же окне печатаются команды ? а что за команды которые используют русские символы ?

Вроде как я понял по тексту орбработка консольных команд идет в функции DefReturnResult DefScriptPackage::RunSingleLine(std::string line)
эта команда заменяет какие-то переменные на их значения, заполняет структуру CmdSet и передает ее дальше на исполнение:
DefScriptPackage::Interpret(CmdSet& Set)
тут идет перебор встроенных команд и если найдена то отдается выполнение найденой функции, если нет, пытается запустить какой-то внешний скрипт

В общем предлагаю в эту функцию:
Код:

void PseuInstance::ProcessCliQueue(void)
{
    std::string cmd;
    while(_cliQueue.size())
    {
        cmd = _cliQueue.next();
        try
        {
            GetScripts()->RunSingleLine(cmd);
        }
        catch(...)
        {
            logerror("Exception while executing CLI command: \"%s\"",cmd.c_str());
        }
    }
}

вставить конвертацию и посмотреть что вышло -)

примерно так:
Код:

void PseuInstance::ProcessCliQueue(void)
{
  std::string cmd;
  while(_cliQueue.size())
  {
    cmd = _cliQueue.next();
    try
    {
      char *charutf8 = str_convert(cmd.c_str(), 866, CP_UTF8);
      std::string strutf8(charutf8);
      GetScripts()->RunSingleLine(strutf8);
      delete[] charutf8;
    }
    catch(...)
    {
      logerror("Exception while executing CLI command: \"%s\"",cmd.c_str());
    }
  }
}

ну а в начало файла засунуть определение функции char* str_convert(const char *buf, UINT codepage_from, UINT codepage_to), так как она описана выше.

KiriX 12.04.2011 23:22

Да, в общем-то всё правильно понял.
Спасибо, завтра уже попробую.
Команда какая? Да почти любая - начиная от простой переписки в чате и заканчивая announce и notify. В общем применение есть, самое важное - чат.

Йоха 13.04.2011 10:15

есть успехи ?

KiriX 13.04.2011 12:02

Цитата:

Сообщение от Йоха (Сообщение 20972)
есть успехи ?


Результаты получены - всё прекрасно работает!!! =)
Огромное спасибо за помощь ;)
Попробую сегодня переписать и вывод инфы с функцией, которую ты дал, чтобы не добавлять лишние файлы в проект - потом выложу патчем. =)
Ещё раз огромное спасибо за помощь! ;)

Попробовал с вашим патчем на вывод данных - хренушки - программа падает, как только пробует вывести данные на русском. Пока не разбирался почему - обед кончился - работать надо =)

Йоха 20.04.2011 19:35

Цитата:

Сообщение от KiriX (Сообщение 20976)
Попробовал с вашим патчем на вывод данных - хренушки - программа падает, как только пробует вывести данные на русском. Пока не разбирался почему - обед кончился - работать надо =)

а можно пример кода ?

tempura 21.04.2011 06:16

... еще неплохо бы рабочие бинарники под 335 :) А то у меня таких нет.

KiriX 21.04.2011 06:52

Цитата:

Сообщение от Йоха (Сообщение 21344)
а можно пример кода ?

Что именно нужно? Весь отрывок, что именно я сделал?
Цитата:

Сообщение от tempura (Сообщение 21359)
... еще неплохо бы рабочие бинарники под 335 :) А то у меня таких нет.

Хорошо, к вечеру выложу.

Йоха 21.04.2011 08:19

Цитата:

Сообщение от KiriX
Что именно нужно? Весь отрывок, что именно я сделал?

Цитата:

Сообщение от KiriX (Сообщение 20976)
Попробовал с вашим патчем на вывод данных - хренушки - программа падает, как только пробует вывести данные на русском.


Ну вот тот кусок который ты переписал на вывод используя мою функцию.

KiriX 21.04.2011 12:08

Вложений: 1
Вот код для Йохи:
Код:

char* str_convert_log(const char *buf, UINT codepage_from, UINT codepage_to)
{
        wchar_t* pResw = 0;
        char* pRes = 0;
        int res_len = 0;
        res_len = MultiByteToWideChar(codepage_from, 0, (LPCSTR)buf, -1, 0, 0);
        if (!res_len)
                return NULL;
        pResw = new wchar_t[res_len];
        if (!MultiByteToWideChar(codepage_from, 0, (LPCSTR)buf, -1, pResw, res_len))
        {
                delete[] pResw;
                return NULL;
        }
        res_len = WideCharToMultiByte(codepage_to, 0, pResw, -1, 0, 0, 0, 0);
        if (!res_len)
                return 0;
        pRes = new char[res_len];
        if (!pRes)
                return NULL;
        if (!WideCharToMultiByte(codepage_to, 0, pResw, -1, pRes, res_len, 0, 0))
        {
                delete[] pRes;
                return NULL;
        }
        delete[] pResw;
        return pRes;
}

***

void logcustom(uint8 lvl, Color color, const char *str, ...)
{
        char *charutf8 = str_convert_log(str, CP_UTF8, 866);

    if(!str || loglevel < lvl)
        return;
    va_list ap;
    _log_setcolor(true,color);
    if(logtime)
        printf("%s ", GetTimeString().c_str());
    va_start(ap, charutf8);
    vprintf(charutf8, ap);
    va_end(ap);
    _log_resetcolor(true);

    printf("\n");

    if(logfile)
    {
        fprintf(logfile, "%s", getDateString().c_str());
        va_start(ap, charutf8);
        vfprintf(logfile, charutf8, ap);
        fprintf(logfile, "\n" );
        va_end(ap);
        fflush(logfile);
    }
    fflush(stdout);

        delete[] charutf8;
}

И в аттаче компил для темпуры =)

tempura 21.04.2011 19:43

Оно наконец-то заработало!!! В логе поиском по слову error выдает только
Код:

*** All files loaded without errors.
Вот оно - щщастие!

KiriX 21.04.2011 20:20

Цитата:

Сообщение от tempura (Сообщение 21383)
Оно наконец-то заработало!!! В логе поиском по слову error выдает только
Код:

*** All files loaded without errors.
Вот оно - щщастие!

Везёт тебе - у меня ошибок море, о гуи вообще речи нет =)

Йоха 21.04.2011 21:03

Код:

void logcustom(uint8 lvl, Color color, const char *str, ...)
{
        char *charutf8 = str_convert_log(str, CP_UTF8, 866);

    if(!str || loglevel < lvl)
        return;
    va_list ap;
    _log_setcolor(true,color);
    if(logtime)
        printf("%s ", GetTimeString().c_str());
    va_start(ap, charutf8);
    vprintf(charutf8, ap);
    va_end(ap);
    _log_resetcolor(true);

    printf("\n");

    if(logfile)
    {
        fprintf(logfile, "%s", getDateString().c_str());
        va_start(ap, charutf8);
        vfprintf(logfile, charutf8, ap);
        fprintf(logfile, "\n" );
        va_end(ap);
        fflush(logfile);
    }
    fflush(stdout);

        delete[] charutf8;

какая строчка вызывает падение ? так чисто визуально вроде не видно где тут можно рухнуть

P.S. этот код может быть не корректен, так как конвертируется только строка формата, а все параметры остаются в изначальной кодировке и если utf8 строки передаются в качестве параметра, то тут то и наступят грабли

Йоха 21.04.2011 23:14

вот так 100% верно:
Код:

void logcustom(uint8 lvl, Color color, const char *str, ...)
{
        char buf[4096]; //

    if(!str || loglevel < lvl)
        return;
    va_list ap;
    _log_setcolor(true,color);
    if(logtime)
        printf("%s ", GetTimeString().c_str());
    va_start(ap, str);
    vsprintf(buf, str, ap );
    va_end(ap);
        char* str_oem = str_convert_log(buf, CP_UTF8, 866);
        printf("%s\n", str_oem);
    _log_resetcolor(true);

    if(logfile)
    {
        fprintf(logfile, "%s %s\n", getDateString().c_str(), str_oem);
        fflush(logfile);
    }
    fflush(stdout);
        delete[] str_oem;
}



Текущее время: 18:48. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS