Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 6 1 2 3 ... ПоследняяПоследняя
Показано с 1 по 10 из 57
  1. #1
    Аватар для ziggi
    Проверенный

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

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

    rustext
    GitHub

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

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

    Типы русификаторов
    1. enum RussifierType {
    2. RussifierType_Disabled = -1,
    3. RussifierType_SanLtd = 0,
    4. RussifierType_OneC,
    5. RussifierType_Rush,
    6. RussifierType_Unknown1,
    7. RussifierType_Unknown2,
    8. RussifierType_Unknown3,
    9. RussifierType_MG,
    10. RussifierType_Community,
    11. RussifierType_Ukrainian,
    12. RussifierType_Hungarian,
    13. }

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

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

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


    Функции
    1. native SetPlayerRussifierType(playerid, RussifierType:type);
    2. native RussifierType:GetPlayerRussifierType(playerid);
    3.  
    4. native SetDefaultRussifierType(RussifierType:type);
    5. native RussifierType:GetDefaultRussifierType();


    Пример использования
    Система настройки русификатора для игрока.
    1. #include <a_samp>
    2. #include <rustext>
    3.  
    4. static
    5. TextRusTD[RussifierType];
    6.  
    7. const
    8. Float:TEXT_BASE_X = 150.0,
    9. Float:TEXT_BASE_Y = 150.0,
    10. TEXT_RUSSIFIERS_COUNT = 7; // only Russian localizations
    11.  
    12. {
    13. for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
    14. TextRusTD[RussifierType:i] = _:TextDrawCreate(TEXT_BASE_X,
    15. TEXT_BASE_Y + 15.0 * i,
    16. "Я могу прочитать этот текст, это мой русификатор");
    17. TextDrawSetSelectable(Text:TextRusTD[RussifierType:i], 1);
    18. TextDrawTextSize(Text:TextRusTD[RussifierType:i], 600.0, 10.0);
    19. }
    20. return 1;
    21. }
    22.  
    23. public OnPlayerSpawn(playerid)
    24. {
    25. for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
    26. SetPlayerRussifierType(playerid, RussifierType:i);
    27. TextDrawShowForPlayer(playerid, Text:TextRusTD[RussifierType:i]);
    28. }
    29. SelectTextDraw(playerid, 0xAA3333FF);
    30. return 1;
    31. }
    32.  
    33. public OnPlayerClickTextDraw(playerid, Text:clickedid)
    34. {
    35. for (new i; i < TEXT_RUSSIFIERS_COUNT; i++) {
    36. if (TextRusTD[RussifierType:i] == _:clickedid) {
    37. SetPlayerRussifierType(playerid, RussifierType:i);
    38. }
    39. TextDrawHideForPlayer(playerid, Text:TextRusTD[RussifierType:i]);
    40. }
    41. return 0;
    42. }

    Или вы можете использовать библиотеку russifier:



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


    Скачать
    Последний раз редактировалось ziggi; 01.07.2018 в 11:01.

  2. 23 пользователя(ей) сказали cпасибо:
    $continue$ (20.09.2016) 1lyad (20.09.2016) Avertus (20.09.2016) Battista (27.09.2016) Daniel_Cortez (20.09.2016) DeimoS (20.09.2016) Desulaid (26.09.2016) Freaky (15.12.2016) gangzone.ini (20.09.2016) Geebrox (06.10.2016) Josan_Solomon (11.04.2019) Nash_Brigers (18.10.2016) Nurick (29.09.2016) Osetin (20.09.2016) Profyan (22.09.2016) punkochel (30.11.2021) 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
    Сообщений
    1,181
    Репутация:
    790 ±
    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
    Сообщений
    1,181
    Репутация:
    790 ±
    rustext v1.2.0

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

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    А можно ли добавить аналог функции 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.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

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

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

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

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

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

    Steve Pavlina

  10. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

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

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от 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.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Вариант с 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.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

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

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

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

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

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

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

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

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

Ваши права

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