[SourcePawn] Урок 4 - Форматирование текста и мультиязычность

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@8Ahnenerbe8, так нельзя делать. компилятор не даст такое скомпилить
Я про это и говорю, что в уроке ошибка
sizeof до компиляции получает размер
тут же размер будет известен только после вызова функции
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #22
@8Ahnenerbe8, видимо держал в уме чтобы так не написать и в итоге так и написал
 

DeeperSpy

Гений, миллиардер, плейбой, филантроп, майнкрафтер
Сообщения
588
Реакции
362
PHP:
    "MyPhrase"    // Имя фразы
    {
        "en"        "Моя фраза"        // Перевод фразы для языка с кодом en
        "ru"        "My Phrase"        // Перевод фразы для языка с кодом ru
    }

-->

    "MyPhrase"    // Имя фразы
    {
        "en"        "My Phrase"        // Перевод фразы для языка с кодом en
        "ru"        "Моя фраза"        // Перевод фразы для языка с кодом ru
    }
 
  • Мне нравится
Реакции: R1KO

Munoon

Участник
Сообщения
200
Реакции
26
Выводит ошибку..
Код:
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

public void OnPluginStart() {
  HookEvent("player_death", Event_PlayerDeath);
  LoadTranslations("tes.phrases");
}

public void Event_PlayerDeath(Event event, const char[] sEvName, bool bDontBroadcast) {
  int iUserID = event.GetInt("userid");
  int iAttackerUserID = event.GetInt("attacker");
  char szWeapon[34];
  event.GetString("weapon", szWeapon, sizeof(szWeapon));
  int bHS = event.GetBool("headshot");
  char szBufer[128];
  FormatEx(szBufer, sizeof(szBufer), "%t", "test", iUserID, iAttackerUserID, szWeapon, bHS);
  PrintToServer(szBufer);
}

tes.phrases.txt
C-подобный:
"Phrases"
{
    "test"
    {
        "#format"    "{1:i},{2:i},{3:i},{4:i}"
        "ru"        "умер: {1}, убил: {2}, оружие: {3}, убийство в голову: {4}"
        "en"        "userid: {1}, attacker: {2}, weapon: {3}, headshot: {4}"
    }
}

Вывод в консоль:
C-подобный:
L 03/09/2019 - 22:32:06: [SM] Blaming: test.smx
L 03/09/2019 - 22:32:06: [SM] Call stack trace:
L 03/09/2019 - 22:32:06: [SM]   [0] FormatEx
L 03/09/2019 - 22:32:06: [SM]   [1] Line 17, E:\Deathmatch\csgo\addons\sourcemod\scripting\test.sp::Event_PlayerDeath
Помогите пожалуйста...
 

DeeperSpy

Гений, миллиардер, плейбой, филантроп, майнкрафтер
Сообщения
588
Реакции
362
Выводит ошибку..
Код:
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

public void OnPluginStart() {
  HookEvent("player_death", Event_PlayerDeath);
  LoadTranslations("tes.phrases");
}

public void Event_PlayerDeath(Event event, const char[] sEvName, bool bDontBroadcast) {
  int iUserID = event.GetInt("userid");
  int iAttackerUserID = event.GetInt("attacker");
  char szWeapon[34];
  event.GetString("weapon", szWeapon, sizeof(szWeapon));
  int bHS = event.GetBool("headshot");
  char szBufer[128];
  FormatEx(szBufer, sizeof(szBufer), "%t", "test", iUserID, iAttackerUserID, szWeapon, bHS);
  PrintToServer(szBufer);
}

tes.phrases.txt
C-подобный:
"Phrases"
{
    "test"
    {
        "#format"    "{1:i},{2:i},{3:i},{4:i}"
        "ru"        "умер: {1}, убил: {2}, оружие: {3}, убийство в голову: {4}"
        "en"        "userid: {1}, attacker: {2}, weapon: {3}, headshot: {4}"
    }
}

Вывод в консоль:
C-подобный:
L 03/09/2019 - 22:32:06: [SM] Blaming: test.smx
L 03/09/2019 - 22:32:06: [SM] Call stack trace:
L 03/09/2019 - 22:32:06: [SM]   [0] FormatEx
L 03/09/2019 - 22:32:06: [SM]   [1] Line 17, E:\Deathmatch\csgo\addons\sourcemod\scripting\test.sp::Event_PlayerDeath
Помогите пожалуйста...
"#format" "{1:i},{2:i},{3:s},{4:i}"
 

Someone

Участник
Сообщения
1,933
Реакции
1,653
Выводит ошибку..
Код:
C-подобный:
#pragma semicolon 1
#include <sourcemod>
#pragma newdecls required

public void OnPluginStart() {
  HookEvent("player_death", Event_PlayerDeath);
  LoadTranslations("tes.phrases");
}

public void Event_PlayerDeath(Event event, const char[] sEvName, bool bDontBroadcast) {
  int iUserID = event.GetInt("userid");
  int iAttackerUserID = event.GetInt("attacker");
  char szWeapon[34];
  event.GetString("weapon", szWeapon, sizeof(szWeapon));
  int bHS = event.GetBool("headshot");
  char szBufer[128];
  FormatEx(szBufer, sizeof(szBufer), "%t", "test", iUserID, iAttackerUserID, szWeapon, bHS);
  PrintToServer(szBufer);
}

tes.phrases.txt
C-подобный:
"Phrases"
{
    "test"
    {
        "#format"    "{1:i},{2:i},{3:i},{4:i}"
        "ru"        "умер: {1}, убил: {2}, оружие: {3}, убийство в голову: {4}"
        "en"        "userid: {1}, attacker: {2}, weapon: {3}, headshot: {4}"
    }
}

Вывод в консоль:
C-подобный:
L 03/09/2019 - 22:32:06: [SM] Blaming: test.smx
L 03/09/2019 - 22:32:06: [SM] Call stack trace:
L 03/09/2019 - 22:32:06: [SM]   [0] FormatEx
L 03/09/2019 - 22:32:06: [SM]   [1] Line 17, E:\Deathmatch\csgo\addons\sourcemod\scripting\test.sp::Event_PlayerDeath
Помогите пожалуйста...
Не совсем понимаю чего ты добиваешься, но..
upload_2019-3-10_1-27-14.png

Ты же вовсе не выбираешь себе "цель" для перевода.
И аргументы в файле перевода у тебя неверно указаны.

Код:
PHP:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    LoadTranslations("tes.phrases");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    char szWeapon[34];
    hEvent.GetString("weapon", szWeapon, sizeof(szWeapon));
    PrintToChatAll("%t", "Info", hEvent.GetInt("userid"), hEvent.GetInt("attacker"), szWeapon, hEvent.GetBool("headshot") ? "Yes":"No");
}

Перевод:
C-подобный:
"Phrases"
{
    "Info"
    {
        "#format"    "{1:i},{2:i},{3:s},{4:t}"
        "ru"        "Умер: {1}, убил: {2}, оружие: {3}, убийство в голову: {4}"
        "en"        "userid: {1}, attacker: {2}, weapon: {3}, headshot: {4}"
    }
   
    "Yes"
    {
       "ru"            "да"
       "en"            "yes"
    }
   
    "No"
    {
       "ru"            "нет"
       "en"            "no"
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Munoon, попробуй так:
PHP:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    LoadTranslations("tes.phrases");
}

public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast)
{
    static bool hs;
    static int victim, attacker;
    static char wpn[34], buffer[128];

    victim = event.GetInt("userid");
    attacker = event.GetInt("attacker");
    event.GetString("weapon", wpn, sizeof(wpn));
    hs = event.GetBool("headshot");

    SetGlobalTransTarget(LANG_SERVER);
    FormatEx(buffer, sizeof(buffer), "%t", "test", victim, attacker, wpn, hs ? 'V' : 'X');
    PrintToServer(buffer);
}

-   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -   -

"Phrases"
{
    "test"
    {
        "#format"    "{1:i},{2:i},{3:s},{4:c}"
        "en"    "userid: {1}, attacker: {2}, weapon: {3}, headshot: {4}"
        "ru"    "умер: {1}, убил: {2}, оружие: {3}, убийство в голову: {4}"
    }
}
 

Munoon

Участник
Сообщения
200
Реакции
26
Не совсем понимаю чего ты добиваешься, но..
Посмотреть вложение 39905
Ты же вовсе не выбираешь себе "цель" для перевода.
И аргументы в файле перевода у тебя неверно указаны.

Код:
PHP:
#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    HookEvent("player_death", Event_PlayerDeath);
    LoadTranslations("tes.phrases");
}

public void Event_PlayerDeath(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    char szWeapon[34];
    hEvent.GetString("weapon", szWeapon, sizeof(szWeapon));
    PrintToChatAll("%t", "Info", hEvent.GetInt("userid"), hEvent.GetInt("attacker"), szWeapon, hEvent.GetBool("headshot") ? "Yes":"No");
}

Перевод:
C-подобный:
"Phrases"
{
    "Info"
    {
        "#format"    "{1:i},{2:i},{3:s},{4:t}"
        "ru"        "Умер: {1}, убил: {2}, оружие: {3}, убийство в голову: {4}"
        "en"        "userid: {1}, attacker: {2}, weapon: {3}, headshot: {4}"
    }
  
    "Yes"
    {
       "ru"            "да"
       "en"            "yes"
    }
  
    "No"
    {
       "ru"            "нет"
       "en"            "no"
    }
}
Спасибо, помогло.
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Что означают ошибки (arg 1,2,3,4,5,6) и так далее?
C-подобный:
Exception reported: Language phrase "Перевод 1" not found (arg 5)
 

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
Что означают ошибки (arg 1,2,3,4,5,6) и так далее?
C-подобный:
Exception reported: Language phrase "Перевод 1" not found (arg 5)
Функция у которой аргумент (фраза) по счету является 5, не смогла найти данную фразу в файле переводов.
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Функция у которой аргумент (фраза) по счету является 5, не смогла найти данную фразу в файле переводов.
Есть какие то ограничения для заглавия меню? Всё читает, а его нет.

C-подобный:
case TopMenuAction_DisplayTitle:
            Format(buffer, maxlength, "%T", "TeamSwitch when");
Сообщения автоматически склеены:

И вроде честор говорил, что лучше использовать "%T", вместо "%t" ?
 

DENFER

Пишу плагины за два биг тести и картошку фри..
Сообщения
260
Реакции
289
Есть какие то ограничения для заглавия меню? Всё читает, а его нет.

C-подобный:
case TopMenuAction_DisplayTitle:
            Format(buffer, maxlength, "%T", "TeamSwitch when");
Сообщения автоматически склеены:

И вроде честор говорил, что лучше использовать "%T", вместо "%t" ?
Когда ты используешь "%T", то после фразы ты обязан не забыть указать индекс клиента, которому она адресована. В данном случае, ты как раз-таки и забыл это сделать, вот он и ругается. "%T" - лучше всего использовать для пунктов меню и тп.
 

MAGNAT2645

Участник
Сообщения
63
Реакции
7
Ещё про %x (%X) пример немного неточный. Там должно вывести просто Число - 4b т.к.:
1) указано %x (нижний регистр)
2) не указан вывод нулей перед самим числом (т.е. должно быть %06x тогда, но для новичков это будет немного труднее понять с первого раза)
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
Подскажите пожалуйста
У меня двое, атакер и жертва
С сообщением атакеру понятно
C-подобный:
SetGlobalTransTarget(attacker);
FormatEx(Msg, sizeof(Msg), "%t", "TKSlayed");

А вот сообщение для всех как? Ставить жертву?
C-подобный:
SetGlobalTransTarget(victim);
FormatEx(sMsgLog, sizeof(sMsgLog), "%t", "TKSlayed Logs", attacker);
 

Designed

Твой антибиотик
Сообщения
233
Реакции
107
Подскажите пожалуйста
У меня двое, атакер и жертва
С сообщением атакеру понятно
C-подобный:
SetGlobalTransTarget(attacker);
FormatEx(Msg, sizeof(Msg), "%t", "TKSlayed");

А вот сообщение для всех как? Ставить жертву?
C-подобный:
SetGlobalTransTarget(victim);
FormatEx(sMsgLog, sizeof(sMsgLog), "%t", "TKSlayed Logs", attacker);
можно поподробней?) какая цель, что нужно сделать с жертвой, а то раза 3 прочитал не понял что вы хотите.
 

Nekro

Терра инкогнита
Сообщения
4,025
Реакции
2,260
можно поподробней?) какая цель, что нужно сделать с жертвой, а то раза 3 прочитал не понял что вы хотите.
Ничего, сообщение будет адресовано всем игрокам. Вот кого писать в SetGlobalTransTarget вопрос
 

Designed

Твой антибиотик
Сообщения
233
Реакции
107
Ничего, сообщение будет адресовано всем игрокам. Вот кого писать в SetGlobalTransTarget вопрос
Если вы собираетесь использовать одну из функций PrintToChat, PrintToChatAll, PrintCenterText, PrintCenterTextAll, PrintHintText, PrintHintTextToAll, то SetGlobalTransTarget прописывать не нужно, она там уже есть.
А так если сообщение нужно показать как-то по другому и всем, то цикл по игрокам и SetGlobalTransTarget(iClient) соответственно
 
Сверху Снизу