Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама



**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 100руб/мес, Текстовая 50руб/мес.
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17
  1. #1
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    639
    Репутация:
    511 ±

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

    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_Ukraine,

    Версии Unknown - это русификаторы в стиле "ПОТРАЧЕНО", просто мне не удалось определить их автора или названия (один из них от Фаргуса, но непонятно какой).

    Примеры
    Здесь показана работа с русификатором SanLtd:

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


    Функции
    PHP код:
    native SetPlayerRussifierType(playeridRussifierType: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 sizeof(TextRusTD) - 1// minus Ukraine

    public OnGameModeInit()
    {
        for (new 
    iTEXT_RUSSIFIERS_COUNTi++) {
            
    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.010.0);
        }
        return 
    1;
    }

    public 
    OnPlayerSpawn(playerid)
    {
        for (new 
    iTEXT_RUSSIFIERS_COUNTi++) {
            
    SetPlayerRussifierType(playeridRussifierType:i);
            
    TextDrawShowForPlayer(playeridText:TextRusTD[RussifierType:i]);
        }
        
    SelectTextDraw(playerid0xAA3333FF);
        return 
    1;
    }

    public 
    OnPlayerClickTextDraw(playeridText:clickedid)
    {
        for (new 
    iTEXT_RUSSIFIERS_COUNTi++) {
            if (
    TextRusTD[RussifierType:i] == _:clickedid) {
                
    SetPlayerRussifierType(playeridRussifierType:i);
                
    CancelSelectTextDraw(playerid);
            }
            
    TextDrawHideForPlayer(playeridText:TextRusTD[RussifierType:i]);
        }
        return 
    0;

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


    Скачать
    Последний раз редактировалось ziggi; 27.11.2016 в 12:15.

  2. 20 пользователя(ей) сказали cпасибо:
    $continue$ (20.09.2016)1lyad (20.09.2016)Anton Styazhkin (26.09.2016)Avertus (20.09.2016)Battista (27.09.2016)Daniel_Cortez (20.09.2016)DeimoS (20.09.2016)gangzone.ini (20.09.2016)Geebrox (06.10.2016)Nash_Brigers (18.10.2016)Nurick (29.09.2016)Osetin (20.09.2016)Profyan (22.09.2016)Seregamil (20.09.2016)SkyLaGer (20.09.2016)Sp1ke (20.09.2016)suza (20.09.2016)Unreal (20.11.2016)[ForD] (11.11.2016)_lizard (26.09.2016)
  3. #2
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    639
    Репутация:
    511 ±
    rustext v1.1.0

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

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

    P.S. Если у вас есть ещё какой-либо русификатор - отправляйте мне, я добавлю его в плагин.
    Последний раз редактировалось ziggi; 26.09.2016 в 21:27.

  4. 2 пользователя(ей) сказали cпасибо:
    DeimoS (26.09.2016)Nash_Brigers (18.10.2016)
  5. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    639
    Репутация:
    511 ±
    rustext v1.2.0

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

  6. 2 пользователя(ей) сказали cпасибо:
    Daniel_Cortez (17.10.2016)Nash_Brigers (18.10.2016)
  7. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,751
    Репутация:
    1085 ±
    А можно ли добавить аналог функции SetPlayerRussifierType, только для глобальных текстдравов?
    Иначе глобальные текстдравы у разных игроков будут превращаться в кашу же.
    Ну или только у меня SetPlayerRussifierType не реагирует на "TextDrawCreate"
     На всякий случай код
    PHP код:
    new Text:localisation_td[9] = {Text:INVALID_TEXT_DRAW,...};

    CMD:textdraw(playeridparams[])
    {
        
    SetPlayerRussifierType(playeridRussifierType_SanLtd);
        
    localisation_td[0] = TextDrawCreate(100.00.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[0]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_OneC);
        
    localisation_td[1] = TextDrawCreate(100.010.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[1]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_Rush);
        
    localisation_td[2] = TextDrawCreate(100.020.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[2]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_Unknown1);
        
    localisation_td[3] = TextDrawCreate(100.030.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[3]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_Unknown2);
        
    localisation_td[4] = TextDrawCreate(100.040.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[4]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_Unknown3);
        
    localisation_td[5] = TextDrawCreate(100.050.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[5]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_MG);
        
    localisation_td[6] = TextDrawCreate(100.060.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[6]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_Community);
        
    localisation_td[7] = TextDrawCreate(100.070.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[7]);
        
    // ...

        
    SetPlayerRussifierType(playeridRussifierType_Ukraine);
        
    localisation_td[8] = TextDrawCreate(100.080.0"Я могу прочитать этот текст");
        
    TextDrawShowForPlayer(playeridlocalisation_td[8]);
        
    // ...
        
    return 1;


     Скрин



    И да, такой массив будет выплёвывать ошибки (tag missmatch) из-за enum.
    PHP код:
    new PlayerText:rus_td[MAX_PLAYERS][RussifierType]; 
    Последний раз редактировалось DeimoS; 17.10.2016 в 22:52.
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #5
    Аватар для ziggi
    Проверенный

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

  9. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,751
    Репутация:
    1085 ±
    А если просто перехватить TextDrawShowForAll/TextDrawShowForPlayer и добавить в них TextDrawSetString, заменяя входящую строку на изменённую? Такой вариант, конечно, будет проигрывать в производительности в сравнении с перехватом пакетов, но, в теории, должно сработать.

    Либо просто добавь функцию, которая будет текст в одном массиве перегонять в формат указанного русификатора и помещать в другой массив. Что-то типа
    PHP код:
    Имя_функции(string[], RussifierType:typeresult[]); 
    Чтоб, при желании, можно было самому реализовать подобное
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #7
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,419
    Репутация:
    1998 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А если просто перехватить TextDrawShowForAll/TextDrawShowForPlayer и добавить в них TextDrawSetString, заменяя входящую строку на изменённую? Такой вариант, конечно, будет проигрывать в производительности в сравнении с перехватом пакетов, но, в теории, должно сработать.
    Разве функция TextDrawSetString не меняет текст у всех игроков, которым показан текстдрав?

  11. #8
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,751
    Репутация:
    1085 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Разве функция TextDrawSetString не меняет текст у всех игроков, которым показан текстдрав?
    Нет. Для обновления текста у игрока, этот текстдрав нужно показать повторно. Пока этого не сделать, изменения не будут синхронизированы.


    Можно ещё постоянно играться с SetDefaultRussifierType, делая как-то так:
    PHP код:
    stock rus_TextDrawShowForAll(Text:text)
    {
        for(new 
    iMAX_PLAYERSi++)
        {
            
    SetDefaultRussifierType(GetPlayerRussifierType(i));
            
    TextDrawShowForPlayer(itext);
        }
        return 
    1;
    }
    #if defined _ALS_TextDrawShowForAll
        #undef TextDrawShowForAll
    #else
        #define _ALS_TextDrawShowForAll
    #endif

    #define TextDrawShowForAll rus_TextDrawShowForAll

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

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

    Да, только что проверил. Такой вариант не работает. Сейчас ещё посмотрю как плагин реагирует на TextDrawSetString и если так же будет всё глухо, останется последняя идея "фикса" средствами SA-MP
    Последний раз редактировалось DeimoS; 18.10.2016 в 14:57.
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  12. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    2,751
    Репутация:
    1085 ±
    Вариант с TextDrawSetString:
      Открыть/закрыть

    PHP код:
    new global_text_draw_string[Text:MAX_TEXT_DRAWS][1024]; 
    PHP код:
    #if !defined isnull
        #define isnull(%1) \
                    
    (((%1[0]) == 0) || ((%1[0]) == '\1') && ((%1[1]) == 0))
    #endif 
    PHP код:
    stock rus_TextDrawShowForAll(Text:textRussifierType:russifier_id RussifierType_Disabled)
    {
        if(
    isnull(global_text_draw_string[text])) 
            return 
    0;

        new 
            
    RussifierType:default_russifier_type GetDefaultRussifierType();

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

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

            
    TextDrawSetString(textglobal_text_draw_string[text]);
            
    TextDrawShowForPlayer(itext);
        }

        
    SetDefaultRussifierType(default_russifier_type);
        return 
    1;

    PHP код:
    stock rus_TextDrawShowForPlayer(playeridText:textRussifierType: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(textglobal_text_draw_string[text]);

        
    SetDefaultRussifierType(default_russifier_type);

        return 
    TextDrawShowForPlayer(playeridtext);


    PHP код:
    stock Text:rus_TextDrawCreate(Float:xFloat:ytext[])
    {
        new 
            
    Text:td_id TextDrawCreate(Float:xFloat:ytext);
        
    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 


    PHP код:
    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 


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


    Ну и пример из шапки на глобальных текстдравах
      Открыть/закрыть
    PHP код:
    new PlayerText:rus_td[9];

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

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

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

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

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

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

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

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

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

    for(new 
    isizeof(rus_td); i++)
        
    TextDrawShowForPlayer(playeridrus_td[i]); 

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

    Пример, совместимый с моим кодом:
      Открыть/закрыть
    PHP код:
    new Text:rus_td[9],
        
    russifier_phrase[] = "Я могу прочитать этот текст, это мой русификатор"

    PHP код:
    public OnGameModeInit()
    {
        
    rus_td[0] = TextDrawCreate(240.0200.0russifier_phrase);
        
    rus_td[1] = TextDrawCreate(240.0210.0russifier_phrase);
        
    rus_td[2] = TextDrawCreate(240.0220.0russifier_phrase);
        
    rus_td[3] = TextDrawCreate(240.0230.0russifier_phrase);
        
    rus_td[4] = TextDrawCreate(240.0240.0russifier_phrase);
        
    rus_td[5] = TextDrawCreate(240.0250.0russifier_phrase);
        
    rus_td[6] = TextDrawCreate(240.0260.0russifier_phrase);
        
    rus_td[7] = TextDrawCreate(240.0270.0russifier_phrase);
        
    rus_td[8] = TextDrawCreate(240.0280.0russifier_phrase);
        return 
    1;


    PHP код:
    CMD:test(playeridparams[])
    {
        for(new 
    isizeof(rus_td); i++) rus_TextDrawShowForAll(rus_td[i], RussifierType:i);
        return 
    1;
    }

    // Или так
    CMD:test2(playeridparams[])
    {
        
    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;

    Последний раз редактировалось DeimoS; 18.10.2016 в 15:55.
    Связаться со мной можно в личных сообщениях этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  13. #10
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    639
    Репутация:
    511 ±
    Покопался я в сервере и обнаружил, что каждый вызов TextDrawSetString отправляет новый текст каждому игроку, просто на клиенте этот RPC не обрабатывается (очередной баг). И, от чего я в недоумении, каждый вызов TextDrawShowForAll и TextDrawShowForPlayer тоже отправляет текст целиком (лично я в этом вижу мало смысла, только лишний трафик создавать). Поэтому, для достижения подобной работы необходимо перехватить лишь один RPC и заменить в нём данные.

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

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

  14. Пользователь сказал cпасибо:
    DeimoS (18.10.2016)
 

 
Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •