Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: @playerid

  1. #1
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±

    @playerid

    Привет.
    Видел на одном сервере такую фишку, вводишь в чат: Text [id:playerid] text а в чат выводится так: {FFFFFF}Text {FFFF00}NickName {FFFFFF}продолжение текста

    Немножко погуглил

     И наткнулся на тот же вариант

    PHP код:
    public OnPlayerText(playeridtext[]) 

        
    SearchCode(text); // сканируем на наличие BB-code 
        
    SendClientMessageToAll(-1text); // отправляем отредактированный текст  
        
    return false


    stock SearchCode(text[], color 0xFFFFFFFF

        new 
    f1 strfind(text,"[id:") + 4f2 strfind(text[f1],"]"), numid[4]; 
        if(
    f1 && f2 4
        { 
            
    strmid(numidtextf1f1 f2); 
            if(
    IsPlayerConnected((numid[0] = strval(numid)))) 
            
    format(text[f1 4], -1"{85caea}%s{%06x}%s"pName(numid[0]), color >>> 8text[f1 f2 1]); 
        } 



    Затем мне не понравился этот "BBCode" и я решил сделать так: @id23 //типо как на вк :)
    Начал переделывать SearchCode, но в конечном итоге компилятор отказался компилироваться. HELP!

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

    @id23:
    @id - код для поиска
    23 - playerid

  2. #2
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    OKStyle что-то подобное делал, в беседе в ВК проскакивал код, потом пороюсь и найду :)

  3. #3
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±
    Версия OKStyle не работает в некоторых случаях.

  4. #4
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±
    Цитата Сообщение от Londlem Посмотреть сообщение
    Версия OKStyle не работает в некоторых случаях.
    Это вообще реально сделать?

  5. #5
    Аватар для Desulaid
    лесоруб продакшен

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Нашел

    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    PlayerName[MAX_PLAYER_NAME];
        for(new 
    strfind(text"@"true), 0tmp[4]; != -1strfind(text"@"truei)) // нашли включение обращения
        
    {
            ++
    i0// если их несколько - продолжаем до конца
            
    while(48 <= text[i] <= 57 && != 4tmp[a++] = text[i++]; // ы
            
    if(tmp[0] == EOS) continue; // если не найден
            
    GetPlayerName(strval(tmp), PlayerNamesizeof(PlayerName)); // получаем имя введённого в чат ID
            
    strdel(text1i); // удаляем символ и ID
            
    strins(textPlayerName1128); // вставляем ник в чат
        
    }
        
    GetPlayerName(playeridPlayerNamesizeof(PlayerName));
        
    format(text128"%s: {FFFFF}%s"PlayerNametext);
        
    SendClientMessageToAll(GetPlayerColor(playerid), text);
        return 
    0;


  6. Пользователь сказал cпасибо:
    Роуди. (01.02.2016)
  7. #6
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Нашел

    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    PlayerName[MAX_PLAYER_NAME];
        for(new 
    strfind(text"@"true), 0tmp[4]; != -1strfind(text"@"truei)) // нашли включение обращения
        
    {
            ++
    i0// если их несколько - продолжаем до конца
            
    while(48 <= text[i] <= 57 && != 4tmp[a++] = text[i++]; // ы
            
    if(tmp[0] == EOS) continue; // если не найден
            
    GetPlayerName(strval(tmp), PlayerNamesizeof(PlayerName)); // получаем имя введённого в чат ID
            
    strdel(text1i); // удаляем символ и ID
            
    strins(textPlayerName1128); // вставляем ник в чат
        
    }
        
    GetPlayerName(playeridPlayerNamesizeof(PlayerName));
        
    format(text128"%s: {FFFFF}%s"PlayerNametext);
        
    SendClientMessageToAll(GetPlayerColor(playerid), text);
        return 
    0;

    Этот код изменяет ту же строку, что и получает на входе, при этом в функцию strins в качестве длины строки всё время передаётся 128, из-за чего не мудрено словить выход за пределы массива. Мало того, этот выход будет не в коде на Pawn, а в нативной функции, что может привести к крашу или другим непредсказуемым результатам. Легендарный код такой легендарный.

    Точно помню, что делал что-то подобное раньше, попробую поискать в своих заготовках.

    UPD: Пример кода, на котором фейлится функция от OKStyle:
    PHP код:
    #include <a_samp>


    my_GetPlayerName(playeridoutput[], size)
    {
        static const 
    names[][MAX_PLAYER_NAME] =
        {
            {
    "Nick1"},
            {
    "Nick2"},
            {
    "Nick_Abcdefgh"}
        };
        if((
    playerid 0) || (playerid >= sizeof(names)))
            return 
    0;
        
    output[0] = '\0';
        return 
    strcat(outputnames[playerid], size);
    }
    #if    defined    _ALS_GetPlayerName
        #undef    GetPlayerName
    #else
        #define    _ALS_GetPlayerName
    #endif
    #define    GetPlayerName    my_GetPlayerName


    public OnPlayerText(playeridtext[])
    {
        new 
    PlayerName[MAX_PLAYER_NAME];
        for(new 
    strfind(text"@"true), 0tmp[4]; != -1strfind(text"@"truei))
        {
            ++
    i0;
            while(
    48 <= text[i] <= 57 && != 4tmp[a++] = text[i++];
            if(
    tmp[0] == EOS) continue;
            
    GetPlayerName(strval(tmp), PlayerNamesizeof(PlayerName));
            
    strdel(text1i);
            
    strins(textPlayerName1128);
        }
        
    GetPlayerName(playeridPlayerNamesizeof(PlayerName));
        
    format(text128"%s: {FFFFF}%s"PlayerNametext);
        
    SendClientMessageToAll(GetPlayerColor(playerid), text);
        return 
    0;
    }


    main()
    {
        static 
    test_string[] = "Wassup, @0! @2? @3?";
        
    OnPlayerText(0test_string);
        print(
    test_string);

    Последний раз редактировалось Daniel_Cortez; 01.02.2016 в 19:14. Причина: UPD
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. Пользователь сказал cпасибо:
    $continue$ (01.02.2016)
  9. #7
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    PHP код:
    ParseReferences(const text[], output[], size sizeof(output))
    // by Daniel_Cortez \\pro-pawn.ru
        
    static size_m_1nickname_pos1nickname_pos2ref_playeridpos1pos2c;
        
    size_m_1 size 1;
        
    pos1 0pos2 strlen(output);
        for(;;)
        {
            if(
    text[pos1] == '@')
            {
                
    nickname_pos1 pos1nickname_pos2 pos2;
                
    ref_playerid 0;
                while((
    text[++pos1]), '0' <= <= '9')
                    
    ref_playerid ref_playerid 10 + ('0');
                
    pos2 += GetPlayerName(
                    
    ref_playerid,
                    
    output[nickname_pos2],
                    
    size nickname_pos2
                
    );
                if(
    pos2 == nickname_pos2)
                    
    output[pos2++] = '@'pos1 nickname_pos1 1;
            }
            else if((
    output[pos2++] = text[pos1++]) == '\0')
                break;
            if(
    pos2 == size_m_1)
            {
                
    output[pos2] = '\0';
                break;
            }
        }

    Пример использования:
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    parsed_text[144+1];
        
    GetPlayerName(playeridparsed_textsizeof(parsed_text));
        
    strcat(parsed_text" сказал: ");
        
    ParseReferences(textparsed_text);
        
    SendClientMessageToAll(-1parsed_text);
        return 
    0;

    P.S.: С вариантом от OKStyle сравнивать нет смысла из-за неправильной работы последнего. С другими вариантами (при предоставлении оных в этой теме) могу сравнить, как по валидности работы алгоритма, так и по производительности, но уже не сегодня.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #8
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    PHP код:
    ParseReferences(const text[], output[], size sizeof(output))
    // by Daniel_Cortez \\pro-pawn.ru
        
    static size_m_1nickname_pos1nickname_pos2ref_playeridpos1pos2c;
        
    size_m_1 size 1;
        
    pos1 0pos2 strlen(output);
        for(;;)
        {
            if(
    text[pos1] == '@')
            {
                
    nickname_pos1 pos1nickname_pos2 pos2;
                
    ref_playerid 0;
                while((
    text[++pos1]), '0' <= <= '9')
                    
    ref_playerid ref_playerid 10 + ('0');
                
    pos2 += GetPlayerName(
                    
    ref_playerid,
                    
    output[nickname_pos2],
                    
    size nickname_pos2
                
    );
                if(
    pos2 == nickname_pos2)
                    
    output[pos2++] = '@'pos1 nickname_pos1 1;
            }
            else if((
    output[pos2++] = text[pos1++]) == '\0')
                break;
            if(
    pos2 == size_m_1)
            {
                
    output[pos2] = '\0';
                break;
            }
        }

    Пример использования:
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    parsed_text[144+1];
        
    GetPlayerName(playeridparsed_textsizeof(parsed_text));
        
    strcat(parsed_text" сказал: ");
        
    ParseReferences(textparsed_text);
        
    SendClientMessageToAll(-1parsed_text);
        return 
    0;

    P.S.: С вариантом от OKStyle сравнивать нет смысла из-за неправильной работы последнего. С другими вариантами (при предоставлении оных в этой теме) могу сравнить, как по валидности работы алгоритма, так и по производительности, но уже не сегодня.

    Если не трудно можешь пример использования через format сделать а то я не понел

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Эмм
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    parsed_text[144+1], player_name[MAX_PLAYER_NAME+1];
        
    GetPlayerName(playeridplayer_namesizeof(player_name));
        
    ParseReferences(textparsed_text);
        
    format(parsed_textsizeof(parsed_text), "%s сказал: %s"player_nameparsed_text);
        
    SendClientMessageToAll(-1parsed_text);
        return 
    0;

    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  12. #10
    Аватар для Иван Бубнов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    157
    Репутация:
    8 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        new 
    parsed_text[144+1], player_name[MAX_PLAYER_NAME+1];
        
    GetPlayerName(playeridplayer_namesizeof(player_name));
        
    ParseReferences(textparsed_text);
        
    format(parsed_textsizeof(parsed_text), "%s сказал: %s"player_nameparsed_text);
        
    SendClientMessageToAll(-1parsed_text);
        return 
    0;

    Обнаруженные баги:
    Если написать больше 20-и раз @playerid, то OnPlayerText возвращает 1, и каким-то чудо способом игнорится SendClientMessageToAll (см. цитирование).

    Пожелания:
    1) Хотелось бы перед узнаваемым ником, определялся цвет ника игрока. Кто может помочь с этим вопросом, стучитесь в ЛС. 50 рубликов могу дать.)

    2) Если написать @playerid больше 2-х раз, то пишем игроку "Максимум 2 ника!");
    Последний раз редактировалось Иван Бубнов; 04.02.2016 в 18:58.

 

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

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

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

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

Ваши права

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