Просмотр полной версии : [Plugin] rustext - русификация игрового текста для множества русификаторов
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).
rustext v1.1.0
Поддержка двух новых русификаторов:
- От MG
- Народный
Русификаторы можно взять здесь: https://mega.nz/#F!tVhlhDCT!FK1xFcBalTA0ySY_JsryMg
P.S. Если у вас есть ещё какой-либо русификатор - отправляйте мне, я добавлю его в плагин.
rustext v1.2.0
- Оптимизация (замена символов без поиска по массиву)
- Добавлена возможность отключить локализацию
- Добавлена поддержка украинской локализации
А можно ли добавить аналог функции 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];
Естественно SetPlayerRussifierType работает только для TD игрока. Глобальные TD для всех игроков одинаковые, поэтому их русификатор меняется с помощью SetDefaultRussifierType. Реализовать работу глобальных TD таким образом можно только перехватывая исходящий RPC заменяя в нём данные. Но в эти дебри я не хочу лезть, поэтому всё останется так, как позволяет SA-MP.
А если просто перехватить TextDrawShowForAll/TextDrawShowForPlayer и добавить в них TextDrawSetString, заменяя входящую строку на изменённую? Такой вариант, конечно, будет проигрывать в производительности в сравнении с перехватом пакетов, но, в теории, должно сработать.
Либо просто добавь функцию, которая будет текст в одном массиве перегонять в формат указанного русификатора и помещать в другой массив. Что-то типа
Имя_функции(string[], RussifierType:type, result[]);
Чтоб, при желании, можно было самому реализовать подобное
Daniel_Cortez
18.10.2016, 13:26
А если просто перехватить TextDrawShowForAll/TextDrawShowForPlayer и добавить в них TextDrawSetString, заменяя входящую строку на изменённую? Такой вариант, конечно, будет проигрывать в производительности в сравнении с перехватом пакетов, но, в теории, должно сработать.
Разве функция TextDrawSetString не меняет текст у всех игроков, которым показан текстдрав?
Разве функция 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
Вариант с 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;
}
Покопался я в сервере и обнаружил, что каждый вызов TextDrawSetString отправляет новый текст каждому игроку, просто на клиенте этот RPC не обрабатывается (очередной баг). И, от чего я в недоумении, каждый вызов TextDrawShowForAll и TextDrawShowForPlayer тоже отправляет текст целиком (лично я в этом вижу мало смысла, только лишний трафик создавать). Поэтому, для достижения подобной работы необходимо перехватить лишь один RPC и заменить в нём данные.
Если реализовать функцию возврата текста, то эту систему можно будет очень просто реализовать с плагином RakNetManager. Пожалуй, в следующей версии я добавлю эту функцию, а реализацию этой возможности помещу в rustext.inc, тогда, при наличии RakNetManager, текст глобальных TD будет зависеть от локализации игрока.
P.S. В принципе, для поиска функции отправки RPC в сервере, не требуется даже искать адреса в памяти, поэтому, если будет время и желание, я могу попробовать реализовать всю систему прямо в плагине.
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. Обновил пример использования, теперь там полноценная система выбора русификатора для игрока.
В примере массив нужно создавать раньше констант
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) заглавная "О" всегда заменяется на строчную.
В примере массив нужно создавать раньше констант
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. Мне жаловались на крэши, никто не сталкивался?
Спасибо. Исправил.
Так же у меня твой вариант всё так же отказывался компилироваться, если имя 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
Так же у меня твой вариант всё так же отказывался компилироваться, если имя 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 (включая текст), чтобы определиться куда копать.
Дак у тебя в строке две маленькие "о". А заглавные О во всех русификаторах одинаковые - они все берут О из латиницы.
Как-то нехорошо получилось :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
rustext v2.0.1
- Исправлен крэш
- Исправлено создание enum
- Исправлен скрипт - пример
Скачать: https://github.com/ziggi/rustext/releases
Версия 1.2.0 работает нормально, а 2.0.1 не русифицирует, в чем может быть проблема?
Версия 1.2.0 работает нормально, а 2.0.1 не русифицирует, в чем может быть проблема?
у меня такая же проблема была, но когда написал ziggi об этом, он ответил, что это только у меня такая проблема. Рад увидеть таких как я :clapping::mosking:
Версия 1.2.0 работает нормально, а 2.0.1 не русифицирует, в чем может быть проблема?
у меня такая же проблема была, но когда написал ziggi об этом, он ответил, что это только у меня такая проблема. Рад увидеть таких как я :clapping::mosking:
Да уж, но я понятия не имею в чём может быть проблема.
Заметил, что плагин не работает нормально с YSF. Возможно также присутствуют проблемы с другими плагинами, работающими с RPC.
Заметил, что плагин не работает нормально с YSF. Возможно также присутствуют проблемы с другими плагинами, работающими с RPC.
На чистом моде тоже не работает у меня, версия 2.x
На чистом моде тоже не работает у меня, версия 2.x
Плагины? Читы? Другие клиентские модификации?
Плагины? Читы? Другие клиентские модификации?
Ни плагинов, ни читов, ни модификации. Чистый сервер самп с rustext и с одним текстдравом
Ни плагинов, ни читов, ни модификации. Чистый сервер самп с rustext и с одним текстдравом
Запакуй этот сервер и дай мне.
Запакуй этот сервер и дай мне.
я уже давно удалил этот сервер, можешь сам проверить, говорю же брал чистый windows сервер из офф сайта sa-mp. Включал только твой include
Вот заново скачал чистый сервер и поставил твой плагин, версия последняя.
Скачать с яндекс диска (https://yadi.sk/d/EzzUBeIH3EGtDp)
VirusTotal (https://virustotal.com/ru/file/9ca1caa5cfc7c9883132fbd87653373f2ee0972bbf8edce043cf5d61d634f067/analysis/1487537575/)
Кажется исправил, прошу проверить новую версию.
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
Как вывести в формат версию русификатора, которую выбрал игрок?
Как вывести в формат версию русификатора, которую выбрал игрок?
Не понял вопроса, что значит вывести в формат? Что за версия русификатора?
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, то текстдравы, перед отображением которых прописан стринг только для русификатора, не правильно отображаются и так до перезапуска сервера.
когда меняешь тип выбираешь , то текстдравы, перед отображением которых прописан стринг только для русификатора, не правильно отображаются и так до перезапуска сервера.
Можно по-русски? А лучше кодом.
А если ты хочешь отключить русификатор для игрока, то ты должен отключить 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;
}
}
После отключения русификатора пишет БЕНЭ, и это не единичный случай: подобные ТД также неправильно отображает.
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 и загружать каждый при коннекте игроков? И в обоих случаяъ менять их стринг перед показом, в зависимости от того, имеется русификатор или нет
Еще один вопрос: Оставлять глобальные текстдравы? Или сделать все playertextdraw и загружать каждый при коннекте игроков? И в обоих случаяъ менять их стринг перед показом, в зависимости от того, имеется русификатор или нет
Плагин может выводить текст глобальных TD для каждого игрока со своим русификатором без каких-либо изменений. Но, так как ты хочешь использовать два текста то да, придётся создавать их для каждого игрока. Ну, или можно создать для одного текста два TD, один с английским, а другой с русским текстом.
koberman
11.08.2017, 19:56
Плагин может выводить текст глобальных TD для каждого игрока со своим русификатором без каких-либо изменений. Но, так как ты хочешь использовать два текста то да, придётся создавать их для каждого игрока. Ну, или можно создать для одного текста два TD, один с английским, а другой с русским текстом.
Для меньшей нагрузки будет лучше второй вариант, я так понимаю? Чтобы загрузить их один раз.
Для меньшей нагрузки будет лучше второй вариант, я так понимаю? Чтобы загрузить их один раз.
Наверное.
Время, потраченное на создание ТД без вашего плагина и с вашим плагином практически идентично: в чем же секрет? На что идёт нагрузка и в какие именно моменты? Упор на память?
Время, потраченное на создание ТД без вашего плагина и с вашим плагином практически идентично: в чем же секрет? На что идёт нагрузка и в какие именно моменты? Упор на память?
В плагине перехватывается отправляемый сервером 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
Он используется без русификатора ?
Он используется без русификатора ?
Без русификатора на клиенте русского текста в ТД не получить.
Snegovik1337
21.02.2018, 10:35
Без русификатора на клиенте русского текста в ТД не получить.
Интересно почему калкор не добавит русификатор, когда знает что большинство игроков из стран СНГ
Интересно почему калкор не добавит русификатор, когда знает что большинство игроков из стран СНГ
По тому же, почему он не сделал много других вещей). Кстати, он в 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))
Приветствую, не подскажешь, что в таком случае делать? Слышал, надо чет с тех поддержкой связываться, но решил спросить.
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:
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
- #4 (https://github.com/ziggi/rustext/issues/4): Исправлена несовместимость с Pawn.RakNet и Pawn.CMD (спасибо @urShadow (https://github.com/urShadow))
Лол. Я прав был? Это все из-за перезаписи байт?
Лол. Я прав был? Это все из-за перезаписи байт?
Ага, похоже на то.
Ага, похоже на то.
Мне кажется, нужно написать предложение в urmem, чтобы он автоматически проверял все это (насколько я помню, это сделано только в плагинах jit и crashdetect).
Hello how can i modified by Turkish language, can you help me?
Hello how can i modified by Turkish language, can you help me?
http://forum.sa-mp.com/showpost.php?p=3898309&postcount=33
Daniel_Cortez
29.06.2018, 15:18
ИМХО, было бы здорово для наглядности добавить под примером использования скриншот текстдравов с выбором русификатора.
Также константа для венгерского русификатора названа "RussifierType_Hungarian", но для украинского почему-то "RussifierType_Ukraine", а не "..._Ukrainian". Непорядок =/
ИМХО, было бы здорово для наглядности добавить под примером использования скриншот текстдравов с выбором русификатора.
Также константа для венгерского русификатора названа "RussifierType_Hungarian", но для украинского почему-то "RussifierType_Ukraine", а не "..._Ukrainian". Непорядок =/
Поправил.
Вынес код выбора русификатора из Open-GTO в отдельную библиотеку: russifier (https://github.com/Open-GTO/russifier), скриншот добавил.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot