PDA

Просмотр полной версии : [Plugin] rustext - русификация игрового текста для множества русификаторов



ziggi
20.09.2016, 00:55
rustext
GitHub (https://github.com/ziggi/rustext)

Описание
Плагин заменяет символы, передаваемые функциями для работы с TextDraw, Menu и GameText на те, что соответствуют русификатору. Русификатор по умолчанию - SanLtd, но вы можете каждому игроку установить собственный русификатор.

Использование
Просто скопируйте плагин в директорию plugins/ вашего сервера и добавьте rustext[.so] (в зависимости от платформы) к ключу plugins в ваш server.cfg. Если вы хотите получить дополнительный функционал, то скопируйте rustext.inc в вашу директорию с библиотеками и добавьте #include "rustext" в ваш скрипт.

Типы русификаторов
enum RussifierType {
RussifierType_Disabled = -1,
RussifierType_SanLtd = 0,
RussifierType_OneC,
RussifierType_Rush,
RussifierType_Unknown1,
RussifierType_Unknown2,
RussifierType_Unknown3,
RussifierType_MG,
RussifierType_Community,
RussifierType_Ukrainian,
RussifierType_Hungarian,
}
Версии Unknown - это русификаторы в стиле "ПОТРАЧЕНО", просто мне не удалось определить их автора или названия (один из них от Фаргуса, но непонятно какой).

Примеры
Здесь показана работа с русификатором SanLtd:
https://cloud.githubusercontent.com/assets/1020099/18914954/db9b4ade-8597-11e6-8d72-783cfd24fb99.png
Здесь показана работа с украинской локализацией:
https://cloud.githubusercontent.com/assets/1020099/18914955/db9d95dc-8597-11e6-9c2b-6ae5cc05bc72.png

Функции
native SetPlayerRussifierType(playerid, RussifierType:type);
native RussifierType:GetPlayerRussifierType(playerid);

native SetDefaultRussifierType(RussifierType:type);
native RussifierType:GetDefaultRussifierType();

Пример использования
Система настройки русификатора для игрока.

#include <a_samp>
#include <rustext>

static
TextRusTD[RussifierType];

const
Float:TEXT_BASE_X = 150.0,
Float:TEXT_BASE_Y = 150.0,
TEXT_RUSSIFIERS_COUNT = 7; // only Russian localizations

public OnGameModeInit()
{
for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
TextRusTD[RussifierType:i] = _:TextDrawCreate(TEXT_BASE_X,
TEXT_BASE_Y + 15.0 * i,
"Я могу прочитать этот текст, это мой русификатор");
TextDrawSetSelectable(Text:TextRusTD[RussifierType:i], 1);
TextDrawTextSize(Text:TextRusTD[RussifierType:i], 600.0, 10.0);
}
return 1;
}

public OnPlayerSpawn(playerid)
{
for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
SetPlayerRussifierType(playerid, RussifierType:i);
TextDrawShowForPlayer(playerid, Text:TextRusTD[RussifierType:i]);
}
SelectTextDraw(playerid, 0xAA3333FF);
return 1;
}

public OnPlayerClickTextDraw(playerid, Text:clickedid)
{
for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
if (TextRusTD[RussifierType:i] == _:clickedid) {
SetPlayerRussifierType(playerid, RussifierType:i);
CancelSelectTextDraw(playerid);
}
TextDrawHideForPlayer(playerid, Text:TextRusTD[RussifierType:i]);
}
return 0;
}

Или вы можете использовать библиотеку russifier (https://github.com/Open-GTO/russifier):

https://user-images.githubusercontent.com/1020099/42131912-a08b08b8-7d15-11e8-93f6-aa0478d4b095.png

Русификаторы

Все поддерживаемые руссификаторы можно скачать здесь (https://mega.nz/#F!tVhlhDCT!FK1xFcBalTA0ySY_JsryMg), названия файлов соответствуют названиям в плагине.


Скачать

Последнюю версию вы всегда можете найти на странице релизов GitHub (https://github.com/ziggi/rustext/releases).

ziggi
26.09.2016, 14:20
rustext v1.1.0

Поддержка двух новых русификаторов:
- От MG
- Народный

Русификаторы можно взять здесь: https://mega.nz/#F!tVhlhDCT!FK1xFcBalTA0ySY_JsryMg

P.S. Если у вас есть ещё какой-либо русификатор - отправляйте мне, я добавлю его в плагин.

ziggi
28.09.2016, 17:36
rustext v1.2.0

- Оптимизация (замена символов без поиска по массиву)
- Добавлена возможность отключить локализацию
- Добавлена поддержка украинской локализации

DeimoS
17.10.2016, 22:49
А можно ли добавить аналог функции SetPlayerRussifierType, только для глобальных текстдравов?
Иначе глобальные текстдравы у разных игроков будут превращаться в кашу же.
Ну или только у меня SetPlayerRussifierType не реагирует на "TextDrawCreate"

new Text:localisation_td[9] = {Text:INVALID_TEXT_DRAW,...};

CMD:textdraw(playerid, params[])
{
SetPlayerRussifierType(playerid, RussifierType_SanLtd);
localisation_td[0] = TextDrawCreate(100.0, 0.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[0]);
// ...

SetPlayerRussifierType(playerid, RussifierType_OneC);
localisation_td[1] = TextDrawCreate(100.0, 10.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[1]);
// ...

SetPlayerRussifierType(playerid, RussifierType_Rush);
localisation_td[2] = TextDrawCreate(100.0, 20.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[2]);
// ...

SetPlayerRussifierType(playerid, RussifierType_Unknown1);
localisation_td[3] = TextDrawCreate(100.0, 30.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[3]);
// ...

SetPlayerRussifierType(playerid, RussifierType_Unknown2);
localisation_td[4] = TextDrawCreate(100.0, 40.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[4]);
// ...

SetPlayerRussifierType(playerid, RussifierType_Unknown3);
localisation_td[5] = TextDrawCreate(100.0, 50.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[5]);
// ...

SetPlayerRussifierType(playerid, RussifierType_MG);
localisation_td[6] = TextDrawCreate(100.0, 60.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[6]);
// ...

SetPlayerRussifierType(playerid, RussifierType_Community);
localisation_td[7] = TextDrawCreate(100.0, 70.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[7]);
// ...

SetPlayerRussifierType(playerid, RussifierType_Ukraine);
localisation_td[8] = TextDrawCreate(100.0, 80.0, "Я могу прочитать этот текст");
TextDrawShowForPlayer(playerid, localisation_td[8]);
// ...
return 1;
}
http://i.imgur.com/wHYIymy.png


И да, такой массив будет выплёвывать ошибки (tag missmatch) из-за enum.

new PlayerText:rus_td[MAX_PLAYERS][RussifierType];

ziggi
17.10.2016, 23:27
Естественно SetPlayerRussifierType работает только для TD игрока. Глобальные TD для всех игроков одинаковые, поэтому их русификатор меняется с помощью SetDefaultRussifierType. Реализовать работу глобальных TD таким образом можно только перехватывая исходящий RPC заменяя в нём данные. Но в эти дебри я не хочу лезть, поэтому всё останется так, как позволяет SA-MP.

DeimoS
18.10.2016, 10:50
А если просто перехватить TextDrawShowForAll/TextDrawShowForPlayer и добавить в них TextDrawSetString, заменяя входящую строку на изменённую? Такой вариант, конечно, будет проигрывать в производительности в сравнении с перехватом пакетов, но, в теории, должно сработать.

Либо просто добавь функцию, которая будет текст в одном массиве перегонять в формат указанного русификатора и помещать в другой массив. Что-то типа

Имя_функции(string[], RussifierType:type, result[]);
Чтоб, при желании, можно было самому реализовать подобное

Daniel_Cortez
18.10.2016, 13:26
А если просто перехватить TextDrawShowForAll/TextDrawShowForPlayer и добавить в них TextDrawSetString, заменяя входящую строку на изменённую? Такой вариант, конечно, будет проигрывать в производительности в сравнении с перехватом пакетов, но, в теории, должно сработать.
Разве функция TextDrawSetString не меняет текст у всех игроков, которым показан текстдрав?

DeimoS
18.10.2016, 15:00
Разве функция TextDrawSetString не меняет текст у всех игроков, которым показан текстдрав?

Нет. Для обновления текста у игрока, этот текстдрав нужно показать повторно. Пока этого не сделать, изменения не будут синхронизированы.


Можно ещё постоянно играться с SetDefaultRussifierType, делая как-то так:

stock rus_TextDrawShowForAll(Text:text)
{
for(new i; i < MAX_PLAYERS; i++)
{
SetDefaultRussifierType(GetPlayerRussifierType(i));
TextDrawShowForPlayer(i, text);
}
return 1;
}
#if defined _ALS_TextDrawShowForAll
#undef TextDrawShowForAll
#else
#define _ALS_TextDrawShowForAll
#endif

#define TextDrawShowForAll rus_TextDrawShowForAll

// То бишь, узнавая какой русификатор указан у игрока и делая его стандартным для всех
но, как я понимаю, такой вариант не будет работать, ибо подмена текста идёт прямо при создании текстдрава, и мне кажется, что реализация через плагин будет гораздо адекватнее.

- - - Добавлено - - -

Да, только что проверил. Такой вариант не работает. Сейчас ещё посмотрю как плагин реагирует на TextDrawSetString и если так же будет всё глухо, останется последняя идея "фикса" средствами SA-MP

DeimoS
18.10.2016, 15:24
Вариант с TextDrawSetString:


new global_text_draw_string[Text:MAX_TEXT_DRAWS][1024];


#if !defined isnull
#define isnull(%1) \
(((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))
#endif


stock rus_TextDrawShowForAll(Text:text, RussifierType:russifier_id = RussifierType_Disabled)
{
if(isnull(global_text_draw_string[text]))
return 0;

new
RussifierType:default_russifier_type = GetDefaultRussifierType();

for(new i; i < MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i))
continue;

if(russifier_id != RussifierType_Disabled)
SetDefaultRussifierType(russifier_id);
else
SetDefaultRussifierType(GetPlayerRussifierType(i));

TextDrawSetString(text, global_text_draw_string[text]);
TextDrawShowForPlayer(i, text);
}

SetDefaultRussifierType(default_russifier_type);
return 1;
}


stock rus_TextDrawShowForPlayer(playerid, Text:text, RussifierType:russifier_id = RussifierType_Disabled)
{
if(isnull(global_text_draw_string[text]))
return 0;

new
RussifierType:default_russifier_type = GetDefaultRussifierType();

if(russifier_id != RussifierType_Disabled)
SetDefaultRussifierType(russifier_id);
else
SetDefaultRussifierType(GetPlayerRussifierType(playerid));

TextDrawSetString(text, global_text_draw_string[text]);

SetDefaultRussifierType(default_russifier_type);

return TextDrawShowForPlayer(playerid, text);
}



stock Text:rus_TextDrawCreate(Float:x, Float:y, text[])
{
new
Text:td_id = TextDrawCreate(Float:x, Float:y, text);
global_text_draw_string[td_id][0] = '\0';// Просто на всякий случай =3
strcat(global_text_draw_string[td_id], text);
return td_id;
}
#if defined _ALS_TextDrawCreate
#undef TextDrawCreate
#else
#define _ALS_TextDrawCreate
#endif

#define TextDrawCreate rus_TextDrawCreate




stock rus_TextDrawDestroy(Text:text)
{
global_text_draw_string[text][0] = '\0';
return TextDrawDestroy(text);
}
#if defined _ALS_TextDrawDestroy
#undef TextDrawDestroy
#else
#define _ALS_TextDrawDestroy
#endif

#define TextDrawDestroy rus_TextDrawDestroy


Тестировал один и лишь с одним русификатором, но, вроде, всё работает.
В идеале стоит что-то подобное реализовать на стороне плагина и вывести в отдельные функции, как мне кажется


Ну и пример из шапки на глобальных текстдравах

new PlayerText:rus_td[9];

SetDefaultRussifierType(RussifierType_SanLtd);
rus_td[0] = TextDrawCreate(240.0, 200.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_OneC);
rus_td[1] = TextDrawCreate(240.0, 210.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_Rush);
rus_td[2] = TextDrawCreate(240.0, 220.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_Unknown1);
rus_td[3] = TextDrawCreate(240.0, 230.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_Unknown2);
rus_td[4] = TextDrawCreate(240.0, 240.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_Unknown3);
rus_td[5] = TextDrawCreate(240.0, 250.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_MG);
rus_td[6] = TextDrawCreate(240.0, 260.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_Community);
rus_td[7] = TextDrawCreate(240.0, 270.0, "Я могу прочитать этот текст, это мой русификатор");
// ...

SetDefaultRussifierType(RussifierType_Ukraine);
rus_td[8] = TextDrawCreate(240.0, 280.0, "Я могу прочитать этот текст, это мой русификатор");

for(new i; i < sizeof(rus_td); i++)
TextDrawShowForPlayer(playerid, rus_td[i]);

Только он не совместим с тем кодом, что я дал выше + вообще это немного бред :)

Пример, совместимый с моим кодом:

new Text:rus_td[9],
russifier_phrase[] = "Я могу прочитать этот текст, это мой русификатор";



public OnGameModeInit()
{
rus_td[0] = TextDrawCreate(240.0, 200.0, russifier_phrase);
rus_td[1] = TextDrawCreate(240.0, 210.0, russifier_phrase);
rus_td[2] = TextDrawCreate(240.0, 220.0, russifier_phrase);
rus_td[3] = TextDrawCreate(240.0, 230.0, russifier_phrase);
rus_td[4] = TextDrawCreate(240.0, 240.0, russifier_phrase);
rus_td[5] = TextDrawCreate(240.0, 250.0, russifier_phrase);
rus_td[6] = TextDrawCreate(240.0, 260.0, russifier_phrase);
rus_td[7] = TextDrawCreate(240.0, 270.0, russifier_phrase);
rus_td[8] = TextDrawCreate(240.0, 280.0, russifier_phrase);
return 1;
}



CMD:test(playerid, params[])
{
for(new i; i < sizeof(rus_td); i++) rus_TextDrawShowForAll(rus_td[i], RussifierType:i);
return 1;
}

// Или так
CMD:test2(playerid, params[])
{
rus_TextDrawShowForAll(rus_td[0], RussifierType_SanLtd);
rus_TextDrawShowForAll(rus_td[1], RussifierType_OneC);
rus_TextDrawShowForAll(rus_td[2], RussifierType_Rush);
rus_TextDrawShowForAll(rus_td[3], RussifierType_Unknown1);
rus_TextDrawShowForAll(rus_td[4], RussifierType_Unknown2);
rus_TextDrawShowForAll(rus_td[5], RussifierType_Unknown3);
rus_TextDrawShowForAll(rus_td[6], RussifierType_MG);
rus_TextDrawShowForAll(rus_td[7], RussifierType_Community);
rus_TextDrawShowForAll(rus_td[8], RussifierType_Ukraine);
return 1;
}

ziggi
18.10.2016, 17:17
Покопался я в сервере и обнаружил, что каждый вызов TextDrawSetString отправляет новый текст каждому игроку, просто на клиенте этот RPC не обрабатывается (очередной баг). И, от чего я в недоумении, каждый вызов TextDrawShowForAll и TextDrawShowForPlayer тоже отправляет текст целиком (лично я в этом вижу мало смысла, только лишний трафик создавать). Поэтому, для достижения подобной работы необходимо перехватить лишь один RPC и заменить в нём данные.

Если реализовать функцию возврата текста, то эту систему можно будет очень просто реализовать с плагином RakNetManager. Пожалуй, в следующей версии я добавлю эту функцию, а реализацию этой возможности помещу в rustext.inc, тогда, при наличии RakNetManager, текст глобальных TD будет зависеть от локализации игрока.

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

ziggi
03.11.2016, 22:35
rustext v2.0.0

- Работа через перехват RPC (теперь текст глобальных TextDraw, Menu и GameText будет приходить игроку с установленной для него локализацией)
- Оповещение о выходе новой версии
- Добавлены функции

native GetRussifierVersion(version[], const size = sizeof(version));
native GetRussifierText(RussifierType:type, string[], string_return[], const size = sizeof(string_return));

P.S. Обновил пример использования, теперь там полноценная система выбора русификатора для игрока.

DeimoS
17.11.2016, 13:02
В примере массив нужно создавать раньше констант

static
TextRusTD[RussifierType];

const
Float:TEXT_BASE_X = 240.0,
Float:TEXT_BASE_Y = 200.0,
TEXT_RUSSIFIERS_COUNT = sizeof(TextRusTD) - 1; // minus Ukraine

+ ты забыл изменять русификатор при показе, из-за чего у игрока все текстдравы будут одного и того же вида

public OnPlayerSpawn(playerid)
{
for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
SetPlayerRussifierType(playerid, RussifierType:i);
TextDrawShowForPlayer(playerid, Text:TextRusTD[RussifierType:i]);
}
return 1;
}

И в некоторых русификаторах (1, 2, 3, 4 и 6) заглавная "О" всегда заменяется на строчную.

ziggi
17.11.2016, 19:01
В примере массив нужно создавать раньше констант

static
TextRusTD[RussifierType];

const
Float:TEXT_BASE_X = 240.0,
Float:TEXT_BASE_Y = 200.0,
TEXT_RUSSIFIERS_COUNT = sizeof(TextRusTD) - 1; // minus Ukraine

+ ты забыл изменять русификатор при показе, из-за чего у игрока все текстдравы будут одного и того же вида

public OnPlayerSpawn(playerid)
{
for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
SetPlayerRussifierType(playerid, RussifierType:i);
TextDrawShowForPlayer(playerid, Text:TextRusTD[RussifierType:i]);
}
return 1;
}


Спасибо. Исправил.


И в некоторых русификаторах (1, 2, 3, 4 и 6) заглавная "О" всегда заменяется на строчную.

Не замечал такого, проверю.

P.S. Мне жаловались на крэши, никто не сталкивался?

DeimoS
17.11.2016, 20:33
Спасибо. Исправил.
Так же у меня твой вариант всё так же отказывался компилироваться, если имя enum указывается как тэг. Это и в прошлой версии было. Пришлось сделать так

enum RussifierType {
RussifierType_Disabled = -1,
RussifierType_SanLtd = 0,
RussifierType_OneC,
RussifierType_Rush,
RussifierType_Unknown1,
RussifierType_Unknown2,
RussifierType_Unknown3,
RussifierType_MG,
RussifierType_Community,
RussifierType_Ukraine
}



Не замечал такого, проверю.

На скрине локализации расположены так:
1 2 3
4 5 6
Под основу был взят код из твоего примера, так что так же отсутствует украинская локализация.
http://i.imgur.com/UFd1kwN.png
Сама строка:

АаБбВвГгДд~n~ЕеЁёЖжЗзИи~n~ЙйКкЛлМмНн~n~ооПпРрСсТт~n~УуФфХхЦцЧч~n~ШшЩщЪъЫы~n~ЬьЭэЮюЯя~n~!\"№;%%:?*()
Это проблема русификатора SanLtd, которая стоит у меня (насчёт других не знаю). Как вариант, можно просто заглавную О менять на английскую заглавную, если текст преобразуется для SanLtd


P.S. Мне жаловались на крэши, никто не сталкивался?

++

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

[15:19:35] [debug] Server crashed while executing скрипт.amx
[15:19:35] [debug] AMX backtrace:
[15:19:35] [debug] #0 native TextDrawShowForPlayer () from samp-server.exe
[15:19:35] [debug] #1 000269b0 in ShowLocalizationTextdraw (playerid=0) at путь_до_файла_с_функцией_TextDrawShowForPlayer:108
[15:19:35] [debug] #2 00034c1c in public pc_cmd_td (playerid=0, params[]=@001063dc "") at путь_до_основного_скрипта:60
[15:19:35] [debug] Native backtrace:
[15:19:35] [debug] #0 770f1b56 in ?? () from C:\WINDOWS\SYSTEM32\ntdll.dll
[15:19:35] [debug] #1 63ceecfa in ?? () from C:\WINDOWS\SYSTEM32\MSVCR120.dll
[15:19:35] [debug] #2 63dd38a2 in ?? () from plugins\rustext.dll
[15:19:35] [debug] #3 1000b776 in ?? () from plugins\YSF.dll
[15:19:35] [debug] #4 0048e4be in ?? () from samp-server.exe

ziggi
17.11.2016, 21:21
Так же у меня твой вариант всё так же отказывался компилироваться, если имя enum указывается как тэг. Это и в прошлой версии было. Пришлось сделать так

enum RussifierType {
RussifierType_Disabled = -1,
RussifierType_SanLtd = 0,
RussifierType_OneC,
RussifierType_Rush,
RussifierType_Unknown1,
RussifierType_Unknown2,
RussifierType_Unknown3,
RussifierType_MG,
RussifierType_Community,
RussifierType_Ukraine
}

Точно, поправил.


На скрине локализации расположены так:
1 2 3
4 5 6
Под основу был взят код из твоего примера, так что так же отсутствует украинская локализация.
http://i.imgur.com/UFd1kwN.png
Сама строка:

АаБбВвГгДд~n~ЕеЁёЖжЗзИи~n~ЙйКкЛлМмНн~n~ооПпРрСсТт~n~УуФфХхЦцЧч~n~ШшЩщЪъЫы~n~ЬьЭэЮюЯя~n~!\"№;%%:?*()
Это проблема русификатора SanLtd, которая стоит у меня (насчёт других не знаю). Как вариант, можно просто заглавную О менять на английскую заглавную, если текст преобразуется для SanLtd

Дак у тебя в строке две маленькие "о". А заглавные О во всех русификаторах одинаковые - они все берут О из латиницы.

gCharMap[206] = /* О */ {{79, 79, 79, 79, 79, 79, 79, 79, 79}};



++

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

[15:19:35] [debug] Server crashed while executing скрипт.amx
[15:19:35] [debug] AMX backtrace:
[15:19:35] [debug] #0 native TextDrawShowForPlayer () from samp-server.exe
[15:19:35] [debug] #1 000269b0 in ShowLocalizationTextdraw (playerid=0) at путь_до_файла_с_функцией_TextDrawShowForPlayer:108
[15:19:35] [debug] #2 00034c1c in public pc_cmd_td (playerid=0, params[]=@001063dc "") at путь_до_основного_скрипта:60
[15:19:35] [debug] Native backtrace:
[15:19:35] [debug] #0 770f1b56 in ?? () from C:\WINDOWS\SYSTEM32\ntdll.dll
[15:19:35] [debug] #1 63ceecfa in ?? () from C:\WINDOWS\SYSTEM32\MSVCR120.dll
[15:19:35] [debug] #2 63dd38a2 in ?? () from plugins\rustext.dll
[15:19:35] [debug] #3 1000b776 in ?? () from plugins\YSF.dll
[15:19:35] [debug] #4 0048e4be in ?? () from samp-server.exe

Эхх, буду разбираться. Мне бы код, ну или просто настройки TD (включая текст), чтобы определиться куда копать.

DeimoS
17.11.2016, 21:38
Дак у тебя в строке две маленькие "о". А заглавные О во всех русификаторах одинаковые - они все берут О из латиницы.

Как-то нехорошо получилось :blush2:


Эхх, буду разбираться. Мне бы код, ну или просто настройки TD (включая текст), чтобы определиться куда копать.

Собственно, код практически такой же, как у тебя в примере

stock ShowLocalizationTextdraw(playerid)
{
for (new i; i < sizeof(tdLocalization); i++)
{
SetPlayerRussifierType(playerid, RussifierType:i);
TextDrawShowForPlayer(playerid, tdLocalizationBox[i]);
TextDrawShowForPlayer(playerid, tdLocalization[i]);
}
SelectTextDraw(playerid, 0xC0C0C0CC);
SetPVarInt(playerid, "LocalizationTextDraws", true);
ShowLocalizationDialog(playerid, _:RussifierType_SanLtd);
return 1;
}

Дело даже не в коде, ибо даже с iPleomax пару раз крашило. Крашит именно TextDrawShowForPlayer

ziggi
27.11.2016, 12:16
rustext v2.0.1

- Исправлен крэш
- Исправлено создание enum
- Исправлен скрипт - пример

Скачать: https://github.com/ziggi/rustext/releases

Freaky
15.12.2016, 16:48
Версия 1.2.0 работает нормально, а 2.0.1 не русифицирует, в чем может быть проблема?

Geebrox
15.12.2016, 18:23
Версия 1.2.0 работает нормально, а 2.0.1 не русифицирует, в чем может быть проблема?

у меня такая же проблема была, но когда написал ziggi об этом, он ответил, что это только у меня такая проблема. Рад увидеть таких как я :clapping::mosking:

ziggi
15.12.2016, 23:28
Версия 1.2.0 работает нормально, а 2.0.1 не русифицирует, в чем может быть проблема?


у меня такая же проблема была, но когда написал ziggi об этом, он ответил, что это только у меня такая проблема. Рад увидеть таких как я :clapping::mosking:

Да уж, но я понятия не имею в чём может быть проблема.

ziggi
05.01.2017, 00:27
Заметил, что плагин не работает нормально с YSF. Возможно также присутствуют проблемы с другими плагинами, работающими с RPC.

Geebrox
10.01.2017, 15:33
Заметил, что плагин не работает нормально с YSF. Возможно также присутствуют проблемы с другими плагинами, работающими с RPC.

На чистом моде тоже не работает у меня, версия 2.x

ziggi
10.01.2017, 17:45
На чистом моде тоже не работает у меня, версия 2.x

Плагины? Читы? Другие клиентские модификации?

Geebrox
15.01.2017, 22:36
Плагины? Читы? Другие клиентские модификации?

Ни плагинов, ни читов, ни модификации. Чистый сервер самп с rustext и с одним текстдравом

ziggi
15.01.2017, 22:47
Ни плагинов, ни читов, ни модификации. Чистый сервер самп с rustext и с одним текстдравом

Запакуй этот сервер и дай мне.

Geebrox
23.01.2017, 22:12
Запакуй этот сервер и дай мне.

я уже давно удалил этот сервер, можешь сам проверить, говорю же брал чистый windows сервер из офф сайта sa-mp. Включал только твой include

Geebrox
20.02.2017, 00:56
Вот заново скачал чистый сервер и поставил твой плагин, версия последняя.






Скачать с яндекс диска (https://yadi.sk/d/EzzUBeIH3EGtDp)
VirusTotal (https://virustotal.com/ru/file/9ca1caa5cfc7c9883132fbd87653373f2ee0972bbf8edce043cf5d61d634f067/analysis/1487537575/)

ziggi
23.04.2017, 11:57
Кажется исправил, прошу проверить новую версию.

rustext v2.0.2

- Добавлена поддержка венгерского языка
- Чистка inc файла
- Исправлена процедура перехвата функции GetRakServerInterface

rustext v2.0.3

- Исправлено подключение a_http
- Добавлена директива RUSTEXT_DISABLE_VERSION_CHECK для отключения проверки версии
- Добавлена конвертация для TextDrawSetString

rustext v2.0.4

- Исправлена проверка версии
- Обновление urmem (с исправлением переполнения)

Скачать: https://github.com/ziggi/rustext/releases

koberman
08.08.2017, 15:09
Как вывести в формат версию русификатора, которую выбрал игрок?

ziggi
08.08.2017, 18:56
Как вывести в формат версию русификатора, которую выбрал игрок?

Не понял вопроса, что значит вывести в формат? Что за версия русификатора?

Nexius_Tailer
08.08.2017, 21:17
Наверное речь про вот это:

enum RussifierType {
RussifierType_Disabled = -1,
RussifierType_SanLtd = 0,
RussifierType_OneC,
RussifierType_Rush,
RussifierType_Unknown1,
RussifierType_Unknown2,
RussifierType_Unknown3,
RussifierType_MG,
RussifierType_Community,
RussifierType_Ukraine,
RussifierType_Hungarian,
}
А вывести название русификатора надобно куда-либо строкой, если я правильно понимаю.

В таком случае нужно объявить массив с названиями в таком же порядке, и выбирать из него нужное по индексу массива, подставляя в качестве него выбранный игроком тип русификатора (GetPlayerRussifierType).

koberman
09.08.2017, 07:49
Не понял вопроса, что значит вывести в формат? Что за версия русификатора?

Уже решил, проблема другая: когда меняешь тип выбираешь
RussifierType_Disabled, то текстдравы, перед отображением которых прописан стринг только для русификатора, не правильно отображаются и так до перезапуска сервера.

ziggi
09.08.2017, 20:58
когда меняешь тип выбираешь , то текстдравы, перед отображением которых прописан стринг только для русификатора, не правильно отображаются и так до перезапуска сервера.

Можно по-русски? А лучше кодом.
А если ты хочешь отключить русификатор для игрока, то ты должен отключить Default русификатор тоже (SetDefaultRussifierType).

koberman
09.08.2017, 21:52
Можно по-русски? А лучше кодом.
А если ты хочешь отключить русификатор для игрока, то ты должен отключить Default русификатор тоже (SetDefaultRussifierType).


speedTD[1] = TextDrawCreate(506.939880, 395.499969, "FUEL");
#сел в машину
if(player_info[playerid][TDRUS] != 0)
{
TextDrawSetString(Text:speedTD[1], "БЕНЗ");
}
#отключение русификатора
else if(clickedid == TDDefaultLang)
{
player_info[playerid][TDRUS] = 0;
SetDefaultRussifierType(GetPlayerRussifierType(playerid));
}
#выбор русификатора
for(new i; i < TEXT_RUSSIFIERS_COUNT; i++)
{
if(TextRusTD[RussifierType:i] == _:clickedid)
{
SetPlayerRussifierType(playerid, RussifierType:i);
player_info[playerid][TDRUS] = 1;
}
}
После отключения русификатора пишет БЕНЭ, и это не единичный случай: подобные ТД также неправильно отображает.

ziggi
09.08.2017, 22:22
speedTD[1] = TextDrawCreate(506.939880, 395.499969, "FUEL");
#сел в машину
if(player_info[playerid][TDRUS] != 0)
{
TextDrawSetString(Text:speedTD[1], "БЕНЗ");
}
#отключение русификатора
else if(clickedid == TDDefaultLang)
{
player_info[playerid][TDRUS] = 0;
SetDefaultRussifierType(GetPlayerRussifierType(playerid));
}
#выбор русификатора
for(new i; i < TEXT_RUSSIFIERS_COUNT; i++)
{
if(TextRusTD[RussifierType:i] == _:clickedid)
{
SetPlayerRussifierType(playerid, RussifierType:i);
player_info[playerid][TDRUS] = 1;
}
}
После отключения русификатора пишет БЕНЭ, и это не единичный случай: подобные ТД также неправильно отображает.

Во-первых: твой код не отключает русификатор.
Во-вторых: а что ты ожидаешь там увидеть? FUEL? По всей видимости, ты не понял смысла этого плагина. Этот плагин не русифицирует твой текст, этот плагин позволяет выводить русский текст в соответствии с установленным у игрока русификатором игры.

koberman
11.08.2017, 18:15
Еще один вопрос: Оставлять глобальные текстдравы? Или сделать все playertextdraw и загружать каждый при коннекте игроков? И в обоих случаяъ менять их стринг перед показом, в зависимости от того, имеется русификатор или нет

ziggi
11.08.2017, 18:35
Еще один вопрос: Оставлять глобальные текстдравы? Или сделать все playertextdraw и загружать каждый при коннекте игроков? И в обоих случаяъ менять их стринг перед показом, в зависимости от того, имеется русификатор или нет

Плагин может выводить текст глобальных TD для каждого игрока со своим русификатором без каких-либо изменений. Но, так как ты хочешь использовать два текста то да, придётся создавать их для каждого игрока. Ну, или можно создать для одного текста два TD, один с английским, а другой с русским текстом.

koberman
11.08.2017, 19:56
Плагин может выводить текст глобальных TD для каждого игрока со своим русификатором без каких-либо изменений. Но, так как ты хочешь использовать два текста то да, придётся создавать их для каждого игрока. Ну, или можно создать для одного текста два TD, один с английским, а другой с русским текстом.

Для меньшей нагрузки будет лучше второй вариант, я так понимаю? Чтобы загрузить их один раз.

ziggi
11.08.2017, 20:49
Для меньшей нагрузки будет лучше второй вариант, я так понимаю? Чтобы загрузить их один раз.

Наверное.

Ashmy
03.12.2017, 05:14
Время, потраченное на создание ТД без вашего плагина и с вашим плагином практически идентично: в чем же секрет? На что идёт нагрузка и в какие именно моменты? Упор на память?

ziggi
03.12.2017, 11:21
Время, потраченное на создание ТД без вашего плагина и с вашим плагином практически идентично: в чем же секрет? На что идёт нагрузка и в какие именно моменты? Упор на память?

В плагине перехватывается отправляемый сервером RPC (https://github.com/ziggi/rustext/blob/master/src/hooks.cpp#L87), затем все символы заменяются в простеньком цикле (https://github.com/ziggi/rustext/blob/master/src/converter.cpp#L96-L101). Всё это должно быть существенно быстрее всего имеющегося на Pawn.

Snegovik1337
20.02.2018, 22:29
Он используется без русификатора ?

ziggi
21.02.2018, 07:22
Он используется без русификатора ?

Без русификатора на клиенте русского текста в ТД не получить.

Snegovik1337
21.02.2018, 10:35
Без русификатора на клиенте русского текста в ТД не получить.

Интересно почему калкор не добавит русификатор, когда знает что большинство игроков из стран СНГ

ziggi
21.02.2018, 11:24
Интересно почему калкор не добавит русификатор, когда знает что большинство игроков из стран СНГ

По тому же, почему он не сделал много других вещей). Кстати, он в 0.3.8 планировал сделать текст в ТД аналогичным, какой используется на номерах и на объектах, но, видимо, что-то не сложилось.

Kovshevoy
28.02.2018, 23:41
Приветствую, не подскажешь, что в таком случае делать? Слышал, надо чет с тех поддержкой связываться, но решил спросить.

Loading plugin: rustext.so
Failed (/usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by plugins/rustext.so))

ziggi
28.02.2018, 23:49
Приветствую, не подскажешь, что в таком случае делать? Слышал, надо чет с тех поддержкой связываться, но решил спросить.

Loading plugin: rustext.so
Failed (/usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by plugins/rustext.so))

Надо перекомпилировать плагин на той системе (и её версии), на которой стоит твой сервер.

Kovshevoy
01.03.2018, 00:55
Надо перекомпилировать плагин на той системе (и её версии), на которой стоит твой сервер.

Весёлый ответ тех. поддержки хостинга.
"Данную систему можно релизовать на PAWNO , плагины дают нагрузку большую".
Ну раз на Павно "релизовать" можно, то почему бы и нет :rofl:

ziggi
20.04.2018, 00:53
rustext v2.0.5

- Исправлены возвращаемые значения GetPlayerRussifierType и GetDefaultRussifierType при отключенной русификации
- Исправлена обработка некорректного ответа от оповещения о новой версии

rustext v2.0.6

- #4 (https://github.com/ziggi/rustext/issues/4): Исправлена несовместимость с Pawn.RakNet и Pawn.CMD (спасибо @urShadow (https://github.com/urShadow))

https://github.com/ziggi/rustext/releases

VVWVV
20.04.2018, 15:02
- #4 (https://github.com/ziggi/rustext/issues/4): Исправлена несовместимость с Pawn.RakNet и Pawn.CMD (спасибо @urShadow (https://github.com/urShadow))

Лол. Я прав был? Это все из-за перезаписи байт?

ziggi
20.04.2018, 15:50
Лол. Я прав был? Это все из-за перезаписи байт?

Ага, похоже на то.

VVWVV
21.04.2018, 05:02
Ага, похоже на то.

Мне кажется, нужно написать предложение в urmem, чтобы он автоматически проверял все это (насколько я помню, это сделано только в плагинах jit и crashdetect).

jensen
24.04.2018, 22:08
Hello how can i modified by Turkish language, can you help me?

ziggi
25.04.2018, 00:37
Hello how can i modified by Turkish language, can you help me?

http://forum.sa-mp.com/showpost.php?p=3898309&postcount=33

jensen
26.04.2018, 01:31
Thanks, i will try.

Daniel_Cortez
29.06.2018, 15:18
ИМХО, было бы здорово для наглядности добавить под примером использования скриншот текстдравов с выбором русификатора.

Также константа для венгерского русификатора названа "RussifierType_Hungarian", но для украинского почему-то "RussifierType_Ukraine", а не "..._Ukrainian". Непорядок =/

ziggi
01.07.2018, 10:55
ИМХО, было бы здорово для наглядности добавить под примером использования скриншот текстдравов с выбором русификатора.

Также константа для венгерского русификатора названа "RussifierType_Hungarian", но для украинского почему-то "RussifierType_Ukraine", а не "..._Ukrainian". Непорядок =/

Поправил.
Вынес код выбора русификатора из Open-GTO в отдельную библиотеку: russifier (https://github.com/Open-GTO/russifier), скриншот добавил.