Просмотр полной версии : 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.) Запустите снова. Все еще ошибка? Посетите форум (http://mangosclient.org/forum/)!
Часть 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)
На данный момент нормально входит на 3.3.2, но не лезет в 3.3.3. При обновлении с 3.1.3 на 3.3.2 были изменения:
WorldSession.cpp
void WorldSession::_HandleAuthChallengeOpcode(WorldPack et& 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... ну и так далее...
фикс под 333а
пишут, что работает, сам пока не проверил, только нашел и поставил.
Tempura, при компиляции возникают ошибки:
Компиляции проекта PseuWoW:
Linking...
Creating library D:\Dev\pseywow\/bin/PseuWoW_VC90_noconsole.lib and object D:\Dev\pseywow\/bin/PseuWoW_VC90_noconsole.exp
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
WorldSession.obj : error LNK2001: unresolved external symbol __CrtDbgReportW
libcpmtd.lib(stdthrow.obj) : error LNK2001: unresolved external symbol __CrtDbgReportW
libcpmtd.lib(xdebug.obj) : error LNK2001: unresolved external symbol __malloc_dbg
libcpmtd.lib(xdebug.obj) : error LNK2001: unresolved external symbol __free_dbg
D:\Dev\pseywow\/bin/PseuWoW_VC90_noconsole.exe : fatal error LNK1120: 3 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:
Linking...
LINK : fatal error LNK1104: cannot 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:
Все те же ошибки...
Linking...
Creating library D:\Dev\pseywow\/bin/PseuWoW_VC90.lib and object D:\Dev\pseywow\/bin/PseuWoW_VC90.exp
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
WorldSession.obj : error LNK2001: unresolved external symbol __CrtDbgReportW
libcpmtd.lib(stdthrow.obj) : error LNK2001: unresolved external symbol __CrtDbgReportW
libcpmtd.lib(xdebug.obj) : error LNK2001: unresolved external symbol __malloc_dbg
libcpmtd.lib(xdebug.obj) : error LNK2001: unresolved external symbol __free_dbg
D:\Dev\pseywow\/bin/PseuWoW_VC90.exe : fatal error LNK1120: 3 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: В дебаге скомпилилось без проблем....
Видите ли, дорогой вы мой Lawliet... Я не являюсь разработчиком проекта PseuWoW, поэтому любые личные обращения ко мне по поводу ошибок в данном проекте - просто бессмысленны. :) Обычно я (как и любой здоровый человек) все найденное и могущее принести пользу - сразу выкладываю сюда. Так что я тут совершенно ни при чем.
Однако, если вы затеете переписку с автором и разработчиком на его собственном форуме, я почти уверен, что вы получите хоть какой-то ответ. :)
(кстати - у меня таже фигня, и я компилю именно в дебаге)
Проблема в не объявленной библиотеки или в private объекте класса.
А скорее всего ошибка в Make файлах Visual Studio(не знал как их обозвать, но думаю вы меня поняли), просто автор работает в linux, а make для Visual Studio делает теоретически и проверить на практике не может
Проблема в не объявленной библиотеки или в private объекте класса.
А скорее всего ошибка в Make файлах Visual Studio(не знал как их обозвать, но думаю вы меня поняли), просто автор работает в linux, а make для Visual Studio делает теоретически и проверить на практике не может
Спасибо за подсказку, попробую сегодня, что нибудь придумать, если же не получится, будем компилить в дебаге =)))
Add: Ничего не вышло, чтож делать, дебаг так дебаг.... Только вот еще одна проблема, зависает GUI интерфейс, отладка говорит, что причина в:
MapMgr.h -> inline uint32 GetGridX(void) { return _gridx; }
Add2: возможно потому, что я извлекал из 3.3.3а клиента дата файлы, в вашем мануале написано, поддерживается только 3.0.8
Вспомнил об этом клиенте =) Зашёл и задался мыслью - а можно ли заставить его понимать русские символы и нормально работать с ними через консоль? Т.е. писать сообщения на русском, отображать получаемые сообщения не кракозябрами, а русскими символами, ну и, конечно, заходить персом с именем на русском?
Где это вообще менять, чтобы консольное приложение нормально работало с кириллицей?
По умолчанию консоль имеет кодировку 866 (OEM), посему :
Или воспользоваться функцией конвертацией для каждой выводимой строки CharToOem
Или один раз в начале программы написать:
setlocale(LC_ALL, "Russian");
и после этого любой вывод в консоль будет работать как положено
cout << "русский текст" << endl;
выведет именно "русский текст"
Я уже нашёл в интернетах что-то по поводу:
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Тоже в начале программы вставлять надо =)
Только я что-то совсем не понимаю, где среди множества файлов PseuWoW - начало? =)
С выводом на экран помогло следующее:
SetConsoleOutputCP(CP_UTF8);
При условии если в консоли стоит настройка шрифта Lucida Console.
А вот ввод воспринимать правильно по прежнему отказывается.
setlocale(LC_ALL, "Russian");
Вообще выводит страшные кракозябры, которые даже http://www.artlebedev.ru/tools/decoder перевести не может =)
Может, дело в том, что работаем мы с UTF8, а не cp1251? Я не нашёл нормального преобразователя с UTF8 для консоли...
А как это реализовано в мангосе? Там с вводом/выводом проблем нет. Всё прекрасно вводится и выводится на русском...
Только я что-то совсем не понимаю, где среди множества файлов PseuWoW - начало? =)
в любой программе на с/с++ "начало" это функция main
Может, дело в том, что работаем мы с 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;
}
Йоха, спасибо.
Вот только проблема в том, что предложенный тобой код не универсален, а в псивове уже есть множество функций вывода текста. Твоё преобразование придётся пихать в каждую их них или писать функцию (что почти равносильно - всё равно придётся переписывать код в очень многих местах...)
Но всё же интересно, как эту ситуацию порешили разработчики мангоса =) Владимир, не поделитесь тайной? =)
Добавил функцию, решил так перевести хотя бы некоторые строки - фиг вам получил.
Код:
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)"
А при чём он здесь вообще???
Универсального решения нет, что бы с минимальными модификациями кода влепить поддрежку utf8.
В мангосе все то же самое, используется функция vutf8printf, определенная в файле util.cpp.
при вызове sLog.OutError вызывается именно она. Внутри vutf8printf так же происходит конфвертация из utf8 в oem, чудес то не бывает -)
В псивове какая функция используется для вывода ? printf ? Если да то пишем там функцию printf_utf8, внутри нее делаем конвертацию utf8-oem, а во всем проекте делаем пакетную замену printf на printf_utf8
Имхо это самое быстрое решение.
Ух, я когда-то тоже намучался с этой проблемой...
Запускал bat файлом:
%COMSPEC% /C chcp 65001 & PseuWoW.exe
Но после первой команды с использованием кирилицы дальше что-либо ввести было нельзя.
Йоха, ну чтож, будем пробовать дальше... Спасибо за подсказки!
Burned,
С выводом на экран помогло следующее:
SetConsoleOutputCP(CP_UTF8);
При условии если в консоли стоит настройка шрифта Lucida Console
Вызывает аналогичную проблему. Отображать отображает, отправляет неверно. Если использовать ещё и
SetConsoleCP(CP_UTF8);
тоже виснет при первом вводе кириллицы...
P.S: Копаем дальше =)
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, ...)
Вот слегка измененный вариант, позволяет указывать кодировки при вызове функции, ее так же можно использовать при вводе данных для последующей обработки, только поменять местами 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;
}
Йоха, я думал BYTE - это важно =)
Я взял способ с мангоса - выводит теперь всё на русском нормально.
Теперь надо разобраться с нормальным вводом русских символов =)
Спасибо за подсказки - очень помог! ;)
Всё! Я сдаюсь =( Не могу понять, где идёт работа с входящими (вводимыми) командами, которые пишутся в консоли =(
Ну хоть отображает теперь на русском нормально =)
Йоха, я думал BYTE - это важно =)
BYTE это просто typedef unsigned char
Просто у меня в программе использовался именно BYTE, поэтому так и функция выглядела.
А для ввода тоже самое, только обратное преобразование
char *str;
// каким-то там образом ввели с консоли str
char *utf8str = str_convert(str, 866, CP_UTF8);
// здесь что-то делаем со строкой в utf8
// ...
delete[] utf8str // освобождаем память;
BYTE это просто typedef unsigned char
Просто у меня в программе использовался именно BYTE, поэтому так и функция выглядела.
А для ввода тоже самое, только обратное преобразование
char *str;
// каким-то там образом ввели с консоли str
char *utf8str = str_convert(str, 866, CP_UTF8);
// здесь что-то делаем со строкой в utf8
// ...
delete[] utf8str // освобождаем память;
Да с вашими подсказками с обратным преобразованием я уже справился бы, вот только не могу найти в коде где эта обработка входящих команд =)
сейчас скачаю исходники, посмотрю
этот адрес github.com/fgenesis/pseuwow ?
сейчас скачаю исходники, посмотрю
этот адрес github.com/fgenesis/pseuwow?
Да, оно.
Патчем, то, что я уже сделал - хотябы выводит русский язык =)
к сожалению не могу запустить сие творение, у меня дома нет мангоса, и не могу посмотреть как он выглядит этот псивов. Что за консоль ? и для чего она используется? а то поиск неизвестно чего в исходниках пока не принес результатов -)
KiriX, скриншот что ли покажи как он выглядит в работе
dj--alex
12.04.2011, 22:32
я вообще слышал как кто-то правда на базе не мангос а Runwow создал на базе Unigine совершенно новую Mmorpg с вовской механикой.
причем что интересно нашёл эту инфу на сайте разработчиков unigine.com наших русских кстати.
может и на базе PseuWow+ MaNGOS можно что то иное сделать?
хотя как мне кажется многие чисто wow-related вещи попросту будут неиспользованы.
к сожалению не могу запустить сие творение, у меня дома нет мангоса, и не могу посмотреть как он выглядит этот псивов. Что за консоль ? и для чего она используется? а то поиск неизвестно чего в исходниках пока не принес результатов -)
KiriX, скриншот что ли покажи как он выглядит в работе
Да а смысл тогда? =)
Такое же консольное окно как и мангос.
http://ru-mangos.ru/attachment.php?attachmentid=847&stc=1&d=1302636820
понятно. И в этом же окне печатаются команды ? а что за команды которые используют русские символы ?
Вроде как я понял по тексту орбработка консольных команд идет в функции 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), так как она описана выше.
Да, в общем-то всё правильно понял.
Спасибо, завтра уже попробую.
Команда какая? Да почти любая - начиная от простой переписки в чате и заканчивая announce и notify. В общем применение есть, самое важное - чат.
есть успехи ?
На работе? Не особо =)
До компилятора сегодняшня работа добраться не даёт пока =)
Результаты получены - всё прекрасно работает!!! =)
Огромное спасибо за помощь ;)
Попробую сегодня переписать и вывод инфы с функцией, которую ты дал, чтобы не добавлять лишние файлы в проект - потом выложу патчем. =)
Ещё раз огромное спасибо за помощь! ;)
Попробовал с вашим патчем на вывод данных - хренушки - программа падает, как только пробует вывести данные на русском. Пока не разбирался почему - обед кончился - работать надо =)
Попробовал с вашим патчем на вывод данных - хренушки - программа падает, как только пробует вывести данные на русском. Пока не разбирался почему - обед кончился - работать надо =)
а можно пример кода ?
... еще неплохо бы рабочие бинарники под 335 :) А то у меня таких нет.
а можно пример кода ?
Что именно нужно? Весь отрывок, что именно я сделал?
... еще неплохо бы рабочие бинарники под 335 :) А то у меня таких нет.
Хорошо, к вечеру выложу.
Что именно нужно? Весь отрывок, что именно я сделал?
Попробовал с вашим патчем на вывод данных - хренушки - программа падает, как только пробует вывести данные на русском.
Ну вот тот кусок который ты переписал на вывод используя мою функцию.
Вот код для Йохи:
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;
}
И в аттаче компил для темпуры =)
Оно наконец-то заработало!!! В логе поиском по слову error выдает только *** All files loaded without errors.
Вот оно - щщастие!
Оно наконец-то заработало!!! В логе поиском по слову error выдает только *** All files loaded without errors.
Вот оно - щщастие!
Везёт тебе - у меня ошибок море, о гуи вообще речи нет =)
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 строки передаются в качестве параметра, то тут то и наступят грабли
вот так 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;
}
Везёт тебе - у меня ошибок море, о гуи вообще речи нет =) Я в консоли пускаю, в консоли ошибок нет. А в мире - стоят и не мешаются.
Я в консоли пускаю, в консоли ошибок нет. А в мире - стоят и не мешаются.
У меня что-то странное - на ХП в консоли ошибок тоже нет, а вот на вин7 что-то он там в кэше найти не может и ругаеццо =(
Хотя работает как надо =)
А ты бы прочел, чего именно "он там в кэше найти не может". :) У меня сначала писал "не могу открыть файл CreatureTemplates.cache" - я его создал, и все пошло нормально. :)
Konctantin
22.04.2011, 13:51
void logcustom(uint8 lvl, Color color, const char *str, ...)
можно нубский вопрос?
Что означают три точки в аргументах функции?
void logcustom(uint8 lvl, Color color, const char *str, ...)
можно нубский вопрос?
Что означают три точки в аргументах функции?
Трудно объяснить. В общем это значит, что можно передавать неограниченное кол-во аргументов, которые потом использовать для подстановки например.
Вот пример где это реализовано:
int printf(const char *format, ...);
Вызывается так:
int a = 0, b = 1, c = 2;
printf("Numbers: %i, %i, %i", a, b, c);
Выведет
Numbers: 0, 1, 2
Трудно объяснить. В общем это значит, что можно передавать неограниченное кол-во аргументов
Что тут трудного ? все правильно говоришь. Многоточие означает что функция может принимать любое количество аргументов, которые потом получаются при помощи макросов va_arg, va_end, va_start.
Konctantin
22.04.2011, 14:15
все ясно, можно было не расписывать, в С# аналог тоже есть
void Test(string format, params object arg)
KiriX, заработало ? или еще не пробовал ?
Насколько функционально gui у этого клиента? У меня получился только некий "вид со стороны". Ни чата, ни какого бы то ни было управления персонажем, вообще ничего. только пейзаж, непонятно прорисованные npc, непонятно прорисованный мой персонаж и fps сверху пишется. Движение камеры причем происходит строго по ландшафту, т.е. если например зайти в огри, то ходить придется под ним. И это все только камера, сам персонаж остается на своем месте. Это только у меня так или так и должно быть?
KiriX, заработало ? или еще не пробовал ?
Я в отъезде. Вернусь - проверю.
vBulletin® v3.8.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot