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

Реклама


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

Тема: @playerid

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

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    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
    Аватар для untonyst
    Младший сержант

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    663
    Репутация:
    234 ±
    OKStyle что-то подобное делал, в беседе в ВК проскакивал код, потом пороюсь и найду :)
    Младший сержант Стяжкин | ЧСВ группа в ВКонтакте NEW

  3. #3
    Аватар для Londlem
    Модератор

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

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

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

  5. #5
    Аватар для untonyst
    Младший сержант

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

    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;

    Младший сержант Стяжкин | ЧСВ группа в ВКонтакте NEW

  6. Пользователь сказал cпасибо:
    Роуди. (01.02.2016)
  7. #6
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,666
    Репутация:
    2145 ±
    Цитата Сообщение от 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
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

  8. Пользователь сказал cпасибо:
    $continue$ (01.02.2016)
  9. #7
    Аватар для Daniel_Cortez
    new fuck_logic[0] = EOS;

    Статус
    Онлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    1,666
    Репутация:
    2145 ±
    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 сравнивать нет смысла из-за неправильной работы последнего. С другими вариантами (при предоставлении оных в этой теме) могу сравнить, как по валидности работы алгоритма, так и по производительности, но уже не сегодня.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Эмм
    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;

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    22.12.2015
    Сообщений
    162
    Репутация:
    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 12 ПоследняяПоследняя

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

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

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

Ваши права

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