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

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

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

Типы русификаторов
PHP код:
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:

Здесь показана работа с украинской локализацией:


Функции
PHP код:
native SetPlayerRussifierType(playerid, RussifierType:type);
native RussifierType:GetPlayerRussifierType(playerid);
native SetDefaultRussifierType(RussifierType:type);
native RussifierType:GetDefaultRussifierType(); 
Пример использования
Система настройки русификатора для игрока.
PHP код:
#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:



Русификаторы
  • Все поддерживаемые руссификаторы можно скачать здесь, названия файлов соответствуют названиям в плагине.
Скачать
Reply
#2

Ну ты крут, уже плагины научился писать, C++ стал изучать давно?
Reply
#3

Quote:
Originally Posted by Diman777
Посмотреть сообщение
Ну ты крут, уже плагины научился писать, C++ стал изучать давно?
Давно, но активным изучением не занимался, ибо мне этот язык не нравится.
Reply
#4

rustext v1.1.0

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

А можешь прикрепить к каждому в списке поддерживаемых русификаторов провереный источник на них?
Reply
#6

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
А можешь прикрепить к каждому в списке поддерживаемых русификаторов провереный источник на них?
Русификаторы я сохранил, но некоторые нужно ещё раз проверить, как проверю - опубликую ссылку.
Reply
#7

Quote:
Originally Posted by Mutha_X
Посмотреть сообщение
А можешь прикрепить к каждому в списке поддерживаемых русификаторов провереный источник на них?
Русификаторы можно взять здесь: https://mega.nz/#F!tVhlhDCT!FK1xFcBalTA0ySY_JsryMg

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

rustext v1.2.0

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

Работает только на player текстдравах? Или можно как-то для каждого игрока выводить текст global текстдрава на своем руссификаторе?
Reply
#10

Quote:
Originally Posted by Art4D
View Post
Работает только на player текстдравах? Или можно как-то для каждого игрока выводить текст global текстдрава на своем руссификаторе?
Для глобальных TD используется русификатор по умолчанию, который задаётся с помощью SetDefaultRussifierType. И, естественно, глобальный TD для всех игроков одинаковый.
Reply
#11

Quote:
Originally Posted by ZiGGi
Посмотреть сообщение
Давно, но активным изучением не занимался, ибо мне этот язык не нравится.
А чем именно не нравится C++? Сложностью?
Ты знаешь, что синтаксис у языка полон разнообразия, всяких ключевых слов (их запредельно много), это рай:
PHP код:
// отрывки кода с твоих исходников
extern void *pAMXFunctions;
int menuid = static_cast<int>(params[1]);
amx_Redirect(amx, "GameTextForAll", reinterpret_cast<ucell>(Natives::GameTextForAll), &Samp::addr_GameTextForAll);
int Samp::GameTextForAll(const char *string, int time, int style) 
Reply
#12

Quote:
Originally Posted by Diman777
Посмотреть сообщение
А чем именно не нравится C++? Сложностью?
Ты знаешь, что синтаксис у языка полон разнообразия, всяких ключевых слов (их запредельно много), это рай:
PHP код:
// отрывки кода с твоих исходников
extern void *pAMXFunctions;
int menuid = static_cast<int>(params[1]);
amx_Redirect(amx, "GameTextForAll", reinterpret_cast<ucell>(Natives::GameTextForAll), &Samp::addr_GameTextForAll);
int Samp::GameTextForAll(const char *string, int time, int style) 
Мне он не нравится по массе причин: уродливый синтаксис, опасная и неудобная работа с памятью, множество костылей и небезопасных функций, ну и много ещё чего (об этом много информации в интернете).
Reply
#13

И не смотря на это ты решил написать плагин на C++. Можно вроде и на других языках писать (дельфи, ява, питон, С#).
Reply
#14

Quote:
Originally Posted by Diman777
View Post
И не смотря на это ты решил написать плагин на C++. Можно вроде и на других языках писать (дельфи, ява, питон, С#).
SDK есть только для C/C++, да и опыт разработки плагина на C++ у меня уже был благодаря FCNPC.
Reply
#15

rustext v2.0.0

- Работа через перехват RPC (теперь текст глобальных TextDraw, Menu и GameText будет приходить игроку с установленной для него локализацией)
- Оповещение о выходе новой версии
- Добавлены функции
PHP Code:
native GetRussifierVersion(version[], const size = sizeof(version));
native GetRussifierText(RussifierType:type, string[], string_return[], const size = sizeof(string_return)); 
P.S. Обновил пример использования, теперь там полноценная система выбора русификатора для игрока.
Reply
#16

rustext v2.0.1

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

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

Quote:
Originally Posted by ZiGGi
View Post
Плагин заменяет символы, передаваемые функциями для работы с TextDraw, Menu и GameText на те, что соответствуют русификатору. Русификатор по умолчанию - SanLtd, но вы можете каждому игроку установить собственный русификатор.
C PlayerText не работает?
Reply
#18

Quote:
Originally Posted by thebatya
View Post
C PlayerText не работает?
Работает.
Reply
#19

Quote:
Originally Posted by ZiGGi
View Post
Работает.
в CR:MP не работало.

Пришлось, вот так сделать.
PHP Code:
stock PlayerText:Russifier_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
{
    new 
string[1024];
    new 
RussifierType:type = GetPlayerRussifierType(playerid);
    
GetRussifierText(type, text, string, sizeof(string));
    return 
CreatePlayerTextDraw(playerid, Float:x, Float:y, string);
}
#if defined _ALS_CreatePlayerTextDraw
    #undef CreatePlayerTextDraw
#else
    #define _ALS_CreatePlayerTextDraw
#endif
#define CreatePlayerTextDraw Russifier_CreatePlayerTextDraw 
Reply
#20

Quote:
Originally Posted by thebatya
View Post
в CR:MP не работало.

Пришлось, вот так сделать.
PHP Code:
stock PlayerText:Russifier_CreatePlayerTextDraw(playerid, Float:x, Float:y, text[])
{
    new 
string[1024];
    new 
RussifierType:type = GetPlayerRussifierType(playerid);
    
GetRussifierText(type, text, string, sizeof(string));
    return 
CreatePlayerTextDraw(playerid, Float:x, Float:y, string);
}
#if defined _ALS_CreatePlayerTextDraw
    #undef CreatePlayerTextDraw
#else
    #define _ALS_CreatePlayerTextDraw
#endif
#define CreatePlayerTextDraw Russifier_CreatePlayerTextDraw 
Если используется старая версия CR-MP (SA-MP 0.3e), то, возможно, вторая версия плагина с ним не будет работать. Попробуй использовать версию 1.2.0.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)