format
#1

Столкнулся с такой проблемой что...

Есть конструкция кода:

PHP код:
SendServerMessage(playerid"%s"Get_Language_Text(LANG_WELCOME), Get_Player_Name(playerid)); 
Get_Language_Text(LANG_WELCOME) содержит в себе "%s, добро пожаловать на SERVERNAME!".
Get_Player_Name(playerid) - Ник игрока.

И выводиться конечно же только ", добро пожаловать на SERVERNAME!", вот меня и интересует как можно сделать так, чтобы формат работал как я хотел.

Да можно сделать и вот так:
PHP код:
SendServerMessage(playerid"%s%s"Get_Player_Name(playerid), Get_Language_Text(LANG_WELCOME)); 
Ну, а если у меня формат в середине предложения?

Конструкция Get_Language_Text
PHP код:
enum {
    
LANG_WELCOME
};
new 
gLanguageData[][] = {
    
"%s, добро пожаловать на SERVERNAME!"
};
Get_Language_Text(textid)
{
    new 
        
string[256];
    
    
format(stringsizeof(string), gLanguageData[textid]);
    
    return 
string;

Reply
#2

pawn Код:
SendServerMessage(playerid, gLanguageData[LANG_WELCOME], Get_Player_Name(playerid));
Reply
#3

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
pawn Код:
SendServerMessage(playerid, gLanguageData[LANG_WELCOME], Get_Player_Name(playerid));
Компилятор вылетает с ошибками

PHP код:
Pawn compiler 3.2.3664                  Copyright (c1997-2006ITB CompuPhase
modules
\system_player.p(30) : error 001expected token"-string end-"but fou
nd 
"-identifier-"
modules\system_player.p(30) : warning 215expression has no effect
modules
\system_player.p(30) : error 001expected token";"but found ")"
modules\system_player.p(30) : error 029invalid expressionassumed zero
modules
\system_player.p(30) : fatal error 107too many error messages on one li
ne
Compilation aborted
.
4 Errors
Причина всему наверно все таки сама функция SendServerMessage и придется отказаться от красоты кода и использовать нативные функции.

Функция SendServerMessage = SendClientMessageEx
PHP код:
SendClientMessageEx(playeridcolor, const text[], {Float_}:...)
{
    static
        
args,
        
str[144];
    if ((
args numargs()) == 3)
    {
        
SendClientMessage(playeridcolortext);
    }
    else
    {
        while (--
args >= 3)
        {
            
#emit LCTRL 5
            #emit LOAD.alt args
            #emit SHL.C.alt 2
            #emit ADD.C 12
            #emit ADD
            #emit LOAD.I
            #emit PUSH.pri
        
}
        
#emit PUSH.S text
        #emit PUSH.C 144
        #emit PUSH.C str
        #emit PUSH.S 8
        #emit SYSREQ.C format
        #emit LCTRL 5
        #emit SCTRL 4
        
SendClientMessage(playeridcolorstr);
        
#emit RETN
    
}
    return 
true;

Reply
#4

Ну ещё должно быть так:
pawn Код:
enum yourEnumName {
    LANG_WELCOME[40]
};

new gLanguageData[yourEnumName] = {
    "%s, добро пожаловать на SERVERNAME!"
};
Reply
#5

Quote:
Originally Posted by Stepashka
Посмотреть сообщение
Ну ещё должно быть так:
pawn Код:
enum yourEnumName {
    LANG_WELCOME[40]
};

new gLanguageData[yourEnumName] = {
    "%s, добро пожаловать на SERVERNAME!"
};
Почему ваш вариант лучше?

Для меня удобней делать так:

PHP код:
/* Используется как константы для обращения к ячейкам массива */
enum {
    
LANG_WELCOME
}; 
/* Не нужно каждый раз указывать размер строки. */
new gLanguageData[][] = {
    
"%s, добро пожаловать на SAMPLAY!"
}; 
Reply
#6

Quote:
Originally Posted by themakar
Посмотреть сообщение
Почему ваш вариант лучше?
Я не говорил что мой вариант лучше.
Вы используете enum не по назначению, и есть подозрение что ошибка у вас из-за этого. Попробуйте создать реальную константу, и использовать тот код что я писал ранее, есть подозрение что всё заработает.
Reply
#7

Quote:
Originally Posted by themakar
Посмотреть сообщение
Да можно сделать и вот так:
PHP код:
SendServerMessage(playerid"%s%s"Get_Player_Name(playerid), Get_Language_Text(LANG_WELCOME)); 
Ну, а если у меня формат в середине предложения?
А есть ли разница? Что говорят тесты?
Reply
#8

Вторая проблема, как совместить в одном формате два текста?

PHP код:
format(stringsizeof(string), Get_Language_Text(LANG_LOGIN_ATTEMP_ERROR), Get_Player_Login_Attempts(extraid), Get_Language_Text(LANG_DIALOG_LOGIN), Get_Player_Name(extraid));
ShowPlayerDialog(extraidDIALOG_LOGINDIALOG_STYLE_PASSWORDGet_Language_Text(LANG_DIALOG_LOGIN_HEADER), stringGet_Language_Text(LANG_DIALOG_ACCEPT), Get_Language_Text(LANG_DIALOG_CANCEL)); 
Допустим у меня вот есть две фразы в которые нужно передать параметры и я хочу все сделать это в одном формате, есть легкий вариант отформатировать сначала первую, потом вторую, а потом их вместе, чтобы соединить в одно целое.

PHP код:
enum {
    
LANG_DIALOG_ACCEPT,
    
LANG_DIALOG_CANCEL,
    
LANG_DIALOG_LOGIN_HEADER,
    
LANG_DIALOG_LOGIN,
    
LANG_LOGIN_ATTEMP_ERROR
};
new 
gLanguageData[][] = {
    
"{9cc254}Авторизация"
    
"{9cc254}%s{ffffff}, добро пожаловать на сервер {9cc254}servername{ffffff}!\n\nВаш аккаунт уже зарегистрирован на нашем проекте.\n\nДля авторизации на сервере, введите свой пароль в окошке:",
    
"{800000}* {ffffff}Указан неверный пароль, у вас осталось {800000}%d {ffffff}попыток.\n\n%s"
}; 
Reply
#9

Вот так, как ты написал - получается? В формате аргументы должны идти по очереди включения %#
Reply
#10

Quote:
Originally Posted by OKStyle
Посмотреть сообщение
Вот так, как ты написал - получается? В формате аргументы должны идти по очереди включения %#
Да вот так получается.

PHP код:
format(errorsizeof(error), Get_Language_Text(LANG_LOGIN_ATTEMP_ERROR), Get_Player_Login_Attempts(extraid));
format(stringsizeof(string), Get_Language_Text(LANG_DIALOG_LOGIN), Get_Player_Name(extraid));
                    
strcat(errorstring);
ShowPlayerDialog(extraidDIALOG_LOGINDIALOG_STYLE_PASSWORDGet_Language_Text(LANG_DIALOG_LOGIN_HEADER), errorGet_Language_Text(LANG_DIALOG_ACCEPT), Get_Language_Text(LANG_DIALOG_CANCEL)); 
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)