Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±

    Последние сообщения игрока.

    Интересует вопрос, как получить последние 10 сообщений игрока в чат? Максимум что у меня вышло, так получить последнее сообщение.

    Заранее спасибо.

    //DeimoS: Тема почищена от оффтопа и закрыта.
    Последний раз редактировалось DeimoS; 05.01.2016 в 19:39.

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    У меня скорее всего да так оно и сеть говнокод. Возможно, он и работает :В
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        static 
    msg[144 10];
        new 
    msg_idif_msg_o10;
        
    strcat(msgtext);
        
    strcat(msg"\n");//как обозначение конца сообщения
        
    for (new isizeof(msg); ji++)
        {
            if (
    strfind(msg"\n"true))
            {
                
    if_msg_o10 strfind(msg"\n"true);
                
    msg_id++;
                if (
    msg_id >= 10)
                
    // предпологается, что если совпадений больше 10,
                // то все лишние сообщения удаляться, которые после '\n'
                
    {
                    
    strdel(msgif_msg_o10sizeof(msg));
                    break;
                }
            }
            else
            {
                break;
            }
        }
        return 
    1;


  3. Пользователь сказал cпасибо:
    Роуди. (05.01.2016)
  4. #3
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    У меня скорее всего да так оно и сеть говнокод. Возможно, он и работает :В
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        static 
    msg[144 10];
        new 
    msg_idif_msg_o10;
        
    strcat(msgtext);
        
    strcat(msg"\n");//как обозначение конца сообщения
        
    for (new isizeof(msg); ji++)
        {
            if (
    strfind(msg"\n"true))
            {
                
    if_msg_o10 strfind(msg"\n"true);
                
    msg_id++;
                if (
    msg_id >= 10)
                
    // предпологается, что если совпадений больше 10,
                // то все лишние сообщения удаляться, которые после '\n'
                
    {
                    
    strdel(msgif_msg_o10sizeof(msg));
                    break;
                }
            }
            else
            {
                break;
            }
        }
        return 
    1;

    Сложна, объяснение и пример, допереть не могу. Спасибо

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

    Статус
    Оффлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    667
    Репутация:
    236 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Сложна, объяснение и пример, допереть не могу. Спасибо
    Да я не уверен, будет ли работать :D

    А по плану все шло так. Например, игрок в чат ввел "Привет" и в массив запишется "Привет\n", чтобы хоть как-то разделить между собой строки без путаницы. Далше, если игрок введет "Как дела?", то в массиве уже будут "Привет\nКак дела?\n". И так далее. Как только символов '\n' стало больше 10, остальную часть массива удаляем. Ведь суть - 10 сообщений. Мне такой вариант показался вполне адекватным. Лучше бы все это запилить в PVar, но я с ними не очень и признаюсь, запутался в GetPVarString ;D.

    PHP код:
    public OnPlayerText(playeridtext[])
    {
        static 
    msg[144 10];
        new 
    msg_idif_msg_o10;
        
    strcat(msgtext);
        
    strcat(msg"\n");//как обозначение конца сообщения
        
    for (new isizeof(msg); ji++)
        {
            if (
    strfind(msg"\n"true))
            {
                
    if_msg_o10 strfind(msg"\n"true);
                
    msg_id++;
                if (
    msg_id >= 10)
                
    // предпологается, что если совпадений больше 10,
                // то все лишние сообщения удаляться, которые после '\n'
                
    {
                    
    strdel(msgif_msg_o10sizeof(msg));
                    break;
                }
            }
            else
            {
                break;
            }
        }
        
    ShowPlayerDialog(playerid1DIALOG_STYLE_MSGBOX"."msg"X""");
        return 
    1;

    Для теста показывайте диалог при каждом вызове каллбэка OnPlayerText, ибо без PVars не оч эффективно выходит. Можно запилить new msg[144 * 10]; как глобальный массив. Но лучше переделать в Pvar.

  6. 3 пользователя(ей) сказали cпасибо:
    $continue$ (05.01.2016) DeimoS (05.01.2016) Роуди. (05.01.2016)
  7. #5
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Ну вот самый простой вариант, что пришёл в голову.

    В начало мода
    PHP код:
    #define NUMBER_STORABLE_LINES 10
    new recent_player_messages[MAX_PLAYERS][NUMBER_STORABLE_LINES][144]; 

    В конец мода
    PHP код:
    stock ShowRecentPlayerMessage(playeridtargetplayerid)
    {
        if(!
    recent_player_messages[targetplayerid][0][0]) return SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Данный игрок ещё не написал ни одного сообщения в чат");
        new 
    string[144];
        
    SendClientMessage(playerid, -1"Последние сообщения игрока:");
        for(new 
    iNUMBER_STORABLE_LINESi++)
        {
            if(!
    recent_player_messages[targetplayerid][i][0]) break;
            
    format(stringsizeof(string), "%i) %s"i+1recent_player_messages[targetplayerid][i]);
            
    SendClientMessage(playerid, -1string);
        }
        return 
    1;

    И public OnPlayerText
    PHP код:
    public OnPlayerText(playeridtext[])
    {
        if(!
    recent_player_messages[playerid][NUMBER_STORABLE_LINES-1][0])
        {
            for(new 
    iNUMBER_STORABLE_LINESi++)
            {
                if(!
    recent_player_messages[playerid][i][0])
                {
                    
    format(recent_player_messages[playerid][i], 144"%s"text);
                    break;
                }
            }
        }
        else
        {
            for(new 
    iNUMBER_STORABLE_LINES-1i++) format(recent_player_messages[playerid][i], 144"%s"recent_player_messages[playerid][i+1]);
            
    format(recent_player_messages[playerid][NUMBER_STORABLE_LINES-1], 144"%s"text);
        }
        return 
    1;

    Показ функцией:
    PHP код:
    ShowRecentPlayerMessage(/*ID того, кому показываем чат игрока*//*ID того, чей чат показываем*/); 
    В теории всё работает :)

    P.S. У Untonyst задумка интересная. Может что сейчас ещё придумаю... (UPD: Не, лень :D)
    Последний раз редактировалось DeimoS; 05.01.2016 в 14:42.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  8. 3 пользователя(ей) сказали cпасибо:
    Desulaid (05.01.2016) iWors (28.03.2016) Роуди. (05.01.2016)
  9. #6
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Цитата Сообщение от Untonyst Посмотреть сообщение
    Можешь залогировать массив? Просто может '\n' в нечто другое преобразует или игнорирует.

    ADD:

    \n надо заменить на что-нибудь другое и прогонять в массиве эти символы и потом менять на \n. Но чет температура подниматься начинает, как станет легче переправлю немного код =).
    123123335w45
    как-то так выводило)

  10. #7
    Аватар для Роуди.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    154
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Вы, кажется, пропустили моё сообщение, не?

    Или не работает?
    P.S. В конце от бессмысленных сообщений тему почищу, наверн.
    Да, почти понял код, но вот этот отрезок не дойдет никак.

    PHP код:
        else
        {
            for(new 
    iNUMBER_STORABLE_LINES-1i++)
            {
                
    format(recent_player_messages[playerid][i], 144"%s"recent_player_messages[playerid][i+1]);
                
    format(recent_player_messages[playerid][NUMBER_STORABLE_LINES-1], 144"%s"text);
            }
        } 

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Да, почти понял код, но вот этот отрезок не дойдет никак.

    PHP код:
        else
        {
            for(new 
    iNUMBER_STORABLE_LINES-1i++)
            {
                
    format(recent_player_messages[playerid][i], 144"%s"recent_player_messages[playerid][i+1]);
                
    format(recent_player_messages[playerid][NUMBER_STORABLE_LINES-1], 144"%s"text);
            }
        } 
    Если все строки массива заполнены (написано больше 10 сообщений), мы запускаем цикл, который в текущую ячейку массива, прогоняемую циклом, перезаписываем значение следующей ячейки. Тем самым мы удаляем самое первое сообщение из десяти, а все остальные девять сообщений смещаем на строчку выше, освобождая последнюю строку для нового сообщения, тем самым не нарушая хронометрию.
    То есть, у нас было записано десять сообщений:
    PHP код:
    1Привет всем
    2
    Я Алёша
    3
    Гоу все на мой чудный сервер
    4
    Каждому по админке
    5
    И лидерку тоже каждому дам
    6
    Сервер уникальный
    7
    Правда мод скачан с паблика
    8
    И лагает жутко
    9
    Но вы это узнаете позже
    10
    Заходите
    И если игрок напишет, например "Админ - не закон. Я - закон!", то получится так:
    PHP код:
    1Я Алёша
    2
    Гоу все на мой чудный сервер
    3
    Каждому по админке
    4
    И лидерку тоже каждому дам
    5
    Сервер уникальный
    6
    Правда мод скачан с паблика
    7
    И лагает жутко
    8
    Но вы это узнаете позже
    9
    Заходите!
    10Админ не законЯ закон!  // Вот это сообщение 
    А не так:
    PHP код:
    1Админ не законЯ закон// Вот это сообщение
    2Я Алёша
    3
    Гоу все на мой чудный сервер
    4
    Каждому по админке
    5
    И лидерку тоже каждому дам
    6
    Сервер уникальный
    7
    Правда мод скачан с паблика
    8
    И лагает жутко
    9
    Но вы это узнаете позже
    10
    Заходите
    Только код изменять не стоило, ибо Ваша версия не верна. Цикл должен работать лишь с первой функцией format. Вторая функция должна 1 раз вызываться, в самом конце. Если так нужны скобки, то так будет вернее
    PHP код:
    else
    {
        for(new 
    iNUMBER_STORABLE_LINES-1i++)
        {
            
    format(recent_player_messages[playerid][i], 144"%s"recent_player_messages[playerid][i+1]);
        }
        
    format(recent_player_messages[playerid][NUMBER_STORABLE_LINES-1], 144"%s"text);

    Последний раз редактировалось DeimoS; 05.01.2016 в 15:41.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  12. 2 пользователя(ей) сказали cпасибо:
    Desulaid (05.01.2016) iWors (28.03.2016)
  13. #9
    Аватар для ^_^
    Übermensch

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    157
    Репутация:
    245 ±
    Самое оптимальное решение: (Вычислительная сложность - O(n))
    PHP код:
    #define LAST_MESSAGE_NUMBER 10
    new LastPlayerMessages[MAX_PLAYERS][LAST_MESSAGE_NUMBER][144];
    new 
    TotalMessages[MAX_PLAYERS char];
    public 
    OnPlayerText(playeridtext[])
    {
        if 
    TotalMessages{playerid} < LAST_MESSAGE_NUMBER *then strins(LastPlayerMessages[playerid][TotalMessages{playerid}++], text0);
        else{
             
    format(LastPlayerMessages[playerid][TotalMessages{playerid}++-LAST_MESSAGE_NUMBER], sizeof LastPlayerMessages[][], "%s"text);
             if 
    TotalMessages{playerid} >= 2*LAST_MESSAGE_NUMBER *then TotalMessages{playerid} = LAST_MESSAGE_NUMBER;
        }
            return 
    0;
    }
    CMD:showlastmessages(playeridparams[])
    {
        new 
    _showmess[(4+144)*LAST_MESSAGE_NUMBER];
        if 
    sscanf(params"i"params[0]) *then return SendClientMessage(playeridCOLOR_RED"Введите: /showlastmessages [id игрока]");
        if !
    TotalMessages{params[0]} *then return SendClientMessage(playeridCOLOR_RED"Игрок ничего не писал в чат.");
        if 
    TotalMessages{params[0]} - LAST_MESSAGE_NUMBER *then
            
    for new _i 0_i TotalMessages{params[0]}; _i++ do
                
    format(_showmesssizeof _showmess"%s\n%i) %s"_showmessLAST_MESSAGE_NUMBER _iLastPlayerMessages[params[0]][_i]);
        else{
            for new 
    _i TotalMessages{params[0]} - LAST_MESSAGE_NUMBER_i LAST_MESSAGE_NUMBER_i++ do
                
    format(_showmesssizeof _showmess"%s\n%i) %s"_showmessTotalMessages{params[0]} -_i LastPlayerMessages[params[0]][_i]);
            for new 
    _i 0_i TotalMessages{params[0]} - LAST_MESSAGE_NUMBER_i++ do
                
    format(_showmesssizeof _showmess"%s\n%i) %s"_showmessTotalMessages{params[0]} - LAST_MESSAGE_NUMBER -_i LastPlayerMessages[params[0]][_i]);
        }
        
    ShowPlayerDialog(playeridD_NULLDIALOG_STYLE_MSGBOX,"{CC0000} Последние сообщения:"_showmess"Хорошо""");
        return 
    1;

    Также, не забывай обнулить переменную TotalMessages{playerid} в OnPlayerDisconnect.
    Последний раз редактировалось ^_^; 05.01.2016 в 18:34.

  14. 2 пользователя(ей) сказали cпасибо:
    iWors (28.03.2016) Роуди. (05.01.2016)
 

 

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

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

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

Ваши права

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