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

    Статус
    Оффлайн
    Регистрация
    26.08.2015
    Адрес
    Новокузнецк
    Сообщений
    54
    Репутация:
    2 ±

    Скрыть строку/ссылку 'Audio stream' для всех игроков?

    Чтобы скрыть ссылку на аудиопоток вводится стандартная команда /audiomsg. Работает это для одного игрока.
    Что можно сделать, чтобы эта строка вообще никогда не появлялась ни одному из игроков?
    Наткнулся на одном из форумов на вот такой способ от человека под ником "l1ghter" - использование 2х инклудов.

    Вот они:

    1.
    Код:
    forward SendClientMessageUpdate(playerid,color,const message[]);
    forward SendClientMessageToAllUpdate(color,const message[]);
    stock PlayAudioStreamForPlayerUpdate(playerid, url[], Float:posX = 0.0, Float:posY = 0.0, Float:posZ = 0.0, Float:distance = 50.0, usepos = 0) {
    PlayAudioStreamForPlayer(playerid, url, posX, posY, posZ,distance, usepos);
    new bf[145]; new addsend[145];
    for ( new l = 99; l > 0 ; l-- ) SendClientMessage(playerid,-1,""); 
    for ( new l = 99; l > -1; l-- ) {
    new meSage[145]; format(bf, sizeof(bf), "Messages%d" , l); GetPVarString(playerid,bf, meSage ,144);
    new string[145]; format(string, sizeof(string), "%s" , meSage); strdel(string, 0, 1);
    format( addsend , sizeof( addsend ), "MessageC%d" , l); SendClientMessage(playerid,GetPVarInt(playerid, addsend ),string); }
    return 1;
    }
    
    public SendClientMessageUpdate(playerid,color,const message[])
    { 
    new messagesv[145],addsend[145],addsens[145];
    format( messagesv ,  sizeof( messagesv ), "-%s",message); 
    SendClientMessage(playerid,color, message );
    for ( new l = 99; l > 0 ; l-- )
    {
    new meSage[145]; new tiw[145],bf[145], tiw2[64],bf2[64];
    format(bf, sizeof(bf), "Messages%d" , l-1); GetPVarString(playerid,bf, tiw , 145);
    format(meSage, sizeof(meSage), "Messages%d" , l); SetPVarString( playerid, meSage , tiw);
    format( tiw2, sizeof( tiw2 ), "MessageC%d" , l); format(bf2, sizeof(bf2), "MessageC%d" , l-1); SetPVarInt( playerid,tiw2, GetPVarInt(playerid, bf2) );
    }
    format( addsend , sizeof( addsend ), "Messages0" ); SetPVarString( playerid, addsend , messagesv );
    format( addsens , sizeof( addsens ), "MessageC0"); SetPVarInt( playerid, addsens ,color );
    return 1;
    }
    public SendClientMessageToAllUpdate(color,const message[])
    {
        for(new i =0;i<MAX_PLAYERS;i++) {
        if(IsPlayerConnected(i)) {
        SendClientMessageUpdate( i ,color, message ); } }
    }
    #define SendClientMessage(%1,%2,%3) SendClientMessageUpdate(%1,%2,%3)
    #define SendClientMessageToAll(%1,%2) SendClientMessageToAllUpdate(%1,%2)
    #define PlayAudioStreamForPlayer PlayAudioStreamForPlayerUpdate
    2.
    Код:
    #undef MAX_PLAYERS
    #define MAX_PLAYERS 32 // Bitte auf die Serverslot Zahl achten
    
    #define MAX_CHAT_LINES 99 // Am besten so lassen ;)
    
    #define SERVERIP "" // Hier bitte die IP des Server eintragen. Ohne Port!
    
    native _SendClientMessage(playerid, Color, const string[]) = SendClientMessage;
    native _PlayAudioStreamForPlayer(playerid, url[], Float:posX=0.0,Float:posY=0.0,Float:posZ=0.0,Float:distance=50.0,usepos=0)= PlayAudioStreamForPlayer;
    
    #define SendClientMessage __SendClientMessage
    #define PlayAudioStreamForPlayer __PlayAudioStreamForPlayer
    
    enum _ch { _inhalt[128], _color }
    new _Chat[MAX_PLAYERS][MAX_CHAT_LINES][_ch];
    
    stock __SendClientMessage(playerid, Color, const string[])
    {    
        for(new i=1;i!=MAX_CHAT_LINES;i++) 
        {
            format(_Chat[playerid][i-1][_inhalt],128,_Chat[playerid][i][_inhalt]);
            _Chat[playerid][i-1][_color]=_Chat[playerid][i][_color];
        }
        format(_Chat[playerid][MAX_CHAT_LINES-1][_inhalt],128,string);
        _Chat[playerid][MAX_CHAT_LINES-1][_color]=Color;
        _SendClientMessage(playerid, Color, string);
        return true;
    }
    
    stock __PlayAudioStreamForPlayer(playerid, url[], Float:posX=0.0,Float:posY=0.0,Float:posZ=0.0,Float:distance=50.0,usepos=0)
    {
        _PlayAudioStreamForPlayer(playerid, url, posX,posY,posZ,distance,usepos);
        for(new i;i!=MAX_CHAT_LINES-1;i++) _SendClientMessage(playerid,_Chat[playerid][i][_color],_Chat[playerid][i][_inhalt]);
        return true;
    }
    Что тут в этих инклудах, я разобрать не могу, для меня это пока очень сложно. При установке и компилировании выдало 2 варнинга:
    Код:
    warning 201: redefinition of constant/macro (symbol "SendClientMessage")
    warning 201: redefinition of constant/macro (symbol "PlayAudioStreamForPlayer")
    Прошу оценить этот способ решения задачи или предложить более упрощенный вариант.

  2. #2
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Jackal Посмотреть сообщение
    Что тут в этих инклудах, я разобрать не могу, для меня это пока очень сложно.
    В обоих вариантах происходит сначала флуд пустыми сообщениями, а потом повторно отсылаются уже отосланные ранее сообщения (они сохраняются у каждого игрока перед отправкой).
    Всё это делается незаметно для тех, кто использует инклуд, за счёт перехвата функций SendClientMessage и PlayAudioStreamForPlayer...

    Цитата Сообщение от Jackal Посмотреть сообщение
    При установке и компилировании выдало 2 варнинга:
    Код:
    warning 201: redefinition of constant/macro (symbol "SendClientMessage")
    warning 201: redefinition of constant/macro (symbol "PlayAudioStreamForPlayer")
    Ну... почти незаметно, потому, что с помощью одного #define перехватывают только быдлокодеры.
    http://pro-pawn.ru/showthread.php?10...ll=1#post63703 (см. п.3)


    Цитата Сообщение от Jackal Посмотреть сообщение
    Прошу оценить этот способ решения задачи...
    Во-первых, сразу бросается в глаза то, что в 1-м варианте при отправке каждого сообщения происходит куча форматирований строк. В итоге там используется 200 PVar'ов: 100 для сохранения строк чата и ещё 100 для сохранения их цветов.
    В другом же варианте вместо PVar'ов используются глобальные массивы, на которые расходуется 4 * (128 + 1) * 100 * 1000 = 51 600 000 байт ~ 50 Мб оперативной памяти. Мало того, при пересохранении копиросание строк опять же производится с помощью format, хотя никакого форматирования там нет и можно было обойтись более простой операцией strmid.
    Как результат, в обоих вариантах при отправке сообщений с помощью SendClientMessage и SendClientMessageToAll осуществляется заметная нагрузка на сервер.

    Во-вторых, при воспроизведении аудио (PlayAudioStreamForPlayer) происходит флуд пустыми сообщениями и отправка кучи старых сообщений.
    Заметьте, в SA:MP 0.3z R2 была добавлена консольная переменная messageslimit, которая ограничивает кол-во сообщений от сервера к игроку в секунду (нет, не SendClientMessage, а других сообщений, на уровне сетевого протокола) и кикает игроков, которые вызывают превышение лимита.
    Это сделано для того, чтобы отрезать читерам возможность создавать слишком большой трафик на сервере, но в указанных выше инклудах превышение лимита может произойти как раз из-за единовременной отправки 100 сообщений.

    Цитата Сообщение от Jackal Посмотреть сообщение
    ... или предложить более упрощенный вариант.
    А там улучшать почти нечего. Можно переписать код так, чтобы не было пересохранения строк, но риск превышения лимита сообщений всё равно останется. И ради чего всё это? Только ради того, чтобы "спрятать" пару сообщений.
    Я бы на вашем месте не пытался ничего "фиксить" в PlayAudioStreamForPlayer и просто оставил бы всё, как есть.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    26.08.2015
    Адрес
    Новокузнецк
    Сообщений
    54
    Репутация:
    2 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Я бы на вашем месте не пытался ничего "фиксить" в PlayAudioStreamForPlayer и просто оставил бы всё, как есть.
    Спасибо, так и сделаю. Понял, что игра не стоит свеч. Проще вывести SCM игроку сразу после регистрации - /audiomsg или в главное меню добавить список полезных стандартных команд сампа, где будет /timestamp, /headmove, /pagesize и прочее.

 

 

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

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

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

Ваши права

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