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

Реклама


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

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

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

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

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

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

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

    Статус
    Онлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    663
    Репутация:
    234 ±
    У меня скорее всего да так оно и сеть говнокод. Возможно, он и работает :В
    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;

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

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

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

    Статус
    Онлайн
    Регистрация
    15.03.2015
    Адрес
    Slobodskoy
    Сообщений
    663
    Репутация:
    234 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Сложна, объяснение и пример, допереть не могу. Спасибо
    Да я не уверен, будет ли работать :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.
    Младший сержант Стяжкин | ЧСВ группа в ВКонтакте NEW

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

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

    В начало мода
    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.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

    ADD:

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

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

    Статус
    Оффлайн
    Регистрация
    31.07.2015
    Сообщений
    151
    Репутация:
    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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от Роуди. Посмотреть сообщение
    Да, почти понял код, но вот этот отрезок не дойдет никак.

    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.
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    161
    Репутация:
    243 ±
    Самое оптимальное решение: (Вычислительная сложность - 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)

Ваши права

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