Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 7 из 8 ПерваяПервая ... 5 6 7 8 ПоследняяПоследняя
Показано с 61 по 70 из 75
  1. #61
    Аватар для Edward Morra
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.10.2015
    Сообщений
    83
    Репутация:
    0 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Не знаю, лично я этим не пользуюсь и никому не советую. Повторюсь: выигрыш будет минимальным, по сравнению с грамотной оптимизацией алгоритмов.



    Как минимум, все вызовы GetPlayerVehicleID, GetPlayerState, IsPlayerInAnyVehicle можно заменить одним GetPlayerVehicleID. Также вызов PVar::GetInt можно сделать единожды.
    Код не оформлял (только лапшу убрал), ибо лень:
    PHP код:
    CMD:engine(playerid,params[])
    {
        if(!
    IsPlayerLogged{playerid}) return SendMe(playerid,COLOR_GREY,!" * [A] - Сначала нужно авторизоваться!");

        new 
    vehicleid GetPlayerVehicleID(playerid);
        if(
    vehicleid == 0) {
            return 
    1;
        }

        if(
    IsVehicleBike(vehicleid)) return false;

        if(
    Engine[vehicleid]) {
            
    printf("незаводим");
            static const 
    frm_engine[]=" * %s заглушил двигатель.";
            new 
    string[sizeof(frm_engine)+(-2+MAX_PLAYER_NAME)];
            
    format(string,sizeof(string),frm_engine,PlayerName(playerid));
            
    ProxDetector(playerid,5,string,COLOR_PURPLE);
            
    SetEngineOnOff(vehicleid,false);
            
    EngineTime[playerid] = 0;
            return 
    1;
        }

        if(
    Fuel[vehicleid] <= 0.0) {
            return 
    SendMe(playerid,COLOR_GREY,!" * Бензобак пуст. Вызовите механиков!");
        }

        if(
    EngineTime[playerid]) {
            return 
    SendMe(playerid,COLOR_GREY,!" * Нельзя так часто заводить двигатель!");
        }
        new 
    Float:vHealth;
        
    GetVehicleHealth(vehicleid,vHealth);
        new 
    driving PVar::GetInt(playerid,"Driving");
        if(
    OrgCarInfo[vehicleid][orgcFrac] == 15 && (driving == || driving == 6))
        {
            if(!
    SeatBelt{playerid} && !IsVehicleA(vehicleid))
            {
                
    SendMe(playerid,COLOR_GREY,!" * Перед началом движения вы обязаны пристегнуть ремень безопасности. Вы провалили экзамен!");
                
    PVar::SetInt(playerid,"Driving",0);
                
    acc_RemovePlayerFromVehicle(playerid);
                
    DisablePlayerRaceCheckpoint(playerid);
                
    SetEngineOnOff(vehicleid,false);
                
    AccountInfo[playerid][LoadCharacters{playerid}][acTestAS] = 0;
                
    licCP{playerid} = 0;
                
    licerror{playerid} = 0;
                
    lictesttime{playerid} = 0;
                return 
    false;
            }
        }
        
    printf("заводим");
        
    EngineTime[playerid] = 6;
        
    FreezePlayer(playerid);
        
    GameTextForPlayer(playerid"~w~€AЊYCKAEM ѓ‹…‚A¦E‡’..."50004);
        static const 
    frm_str[]=" * %s пытается запустить двигатель.";
        new 
    string[sizeof(frm_str)+(-2+MAX_PLAYER_NAME)];
        
    format(string,sizeof(string),frm_str,PlayerName(playerid));
        return 
    ProxDetector(playerid,5,string,COLOR_PURPLE);

    И такой ужас лишь в одной команде, страшно представить что во всём остальном скрипте творится. Уверен, что IsVehicleBike, IsVehicleA реализованы массой проверок, в ProxDetector вычисляется расстояние для всех игроков.

    P.S. Уродствами, вида SendMe и PVar::SetInt ты только путаешь людей, которые будут разбираться в твоём коде.
    Как всегда, благодарю...

  2. #62
    Аватар для Refraktor
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.07.2016
    Сообщений
    4
    Репутация:
    0 ±
    А как быть с двумерными массивами?
    Код:
    static const HeaderDialog[][] =
    {
    	{""},
    	{"{%06x}Регистрация: {%06x}%s"},
    	{"{%06x}Авторизация: {%06x}%s"},
    	{"{%06x}Выбор скина"},
    	{"{%06x}Админ-авторизация"},
    	{"{%06x}Администрация online"}
    };
    Код:
    new string[sizeof (HeaderDialog[1][])];
    format (string, sizeof (string), HeaderDialog[1], COLOR_SILVER >>> 8, COLOR_RED >>> 8, pInfo[playerid][pName]);
    Компилятор выдаёт ошибки:
    error 001: expected token: "]", but found "-identifier-"
    warning 215: expression has no effect
    error 001: expected token: ";", but found "]"
    error 029: invalid expression, assumed zero
    fatal error 107: too many error messages on one line
    Последний раз редактировалось Refraktor; 28.01.2017 в 14:38.

  3. #63
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Refraktor Посмотреть сообщение
    А как быть с двумерными массивами?
    Код:
    static const HeaderDialog[][] =
    {
    	{""},
    	{"{%06x}Регистрация: {%06x}%s"},
    	{"{%06x}Авторизация: {%06x}%s"},
    	{"{%06x}Выбор скина"},
    	{"{%06x}Админ-авторизация"},
    	{"{%06x}Администрация online"}
    };
    Код:
    new string[sizeof (HeaderDialog[1][])];
    format (string, sizeof (string), HeaderDialog[1], COLOR_SILVER >>> 8, COLOR_RED >>> 8, pInfo[playerid][pName]);
    Компилятор выдаёт ошибки:
    Вы не можете указать размер одного элемента массива. Более того, вы неправильно указали размер для массива string, ибо он будет инициализировать лишь одну ячейку. Вам также необходимо указать размер всех под-массивов, т.к. компилятор не умеет определять их.
    PHP код:
    static const HeaderDialog[][/* здесь должен быть размер под-массивов */] =
    {
        {
    ""},
        {
    "{%06x}Регистрация: {%06x}%s"},
        {
    "{%06x}Авторизация: {%06x}%s"},
        {
    "{%06x}Выбор скина"},
        {
    "{%06x}Админ-авторизация"},
        {
    "{%06x}Администрация online"}
    };

    new 
    string[sizeof (HeaderDialog[])];
    format (stringsizeof (string), HeaderDialog[1], COLOR_SILVER >>> 8COLOR_RED >>> 8pInfo[playerid][pName]); 

  4. Пользователь сказал cпасибо:
    Refraktor (28.01.2017)
  5. #64
    Аватар для vladivanovx
    Пользователь

    Статус
    Оффлайн
    Регистрация
    11.12.2016
    Сообщений
    27
    Репутация:
    0 ±
    Сколько места занимают символы на подобии \n, \t...?

  6. #65
    Аватар для Nexius_Tailer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от vladivanovx Посмотреть сообщение
    Сколько места занимают символы на подобии \n, \t...?
    1 символ, strlen в помощь
    Не хотите постоянно проверять обновления моих скриптов?
    Подключите его последним, после всех остальных
    Nexius's Update Checker

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    В SA:MP вряд ли будет возможно сделать более 65535 игроков: это что-то вроде лимита, который можно обнаружить в некоторых местах с помощью дизассемблирования кода сервера, а учитывая, что в SA:MP добавляют всего пару мелких фич и несколько новых моделек раз в год... вряд ли лимит игроков изменится.
    Этот лимит проявляется в виде бага в функциях SendDeathMessage и SendDeathMessageToPlayer: Kalcor вместо MAX_PLAYERS сделал сравнение ID игрока с INVALID_PLAYER_ID (65535), из-за чего эти две функции считают правильными не только ID от 0 до 999, но и от 1000 до INVALID_PLAYER_ID - 1 (65534) (иногда такой баг может оказаться полезным).
    65535 - 5 символов. Следовательно, нужно из sizeof(fmt_str) отнять 2 символа (длина спецификатора "%d") и прибавить 5.
    Уже не совсем помню, какими принципами я руководствовался при данном обосновании, но факт в том, что оно неправильное. ID от 1000 до 65534 являются невалидными и в обычных ситуациях не должны попадать в форматируемый текст.

    Исправил в статье приведённый выше текст на новый:
    На данный момент в SA-MP установлен лимит в 1000 игроков. Максимальный ID - 999 - в текстовом виде занимает 3 символа, однако в будущих версиях это число может перевалить за 1000 из-за увеличения лимита (кто знает?), поэтому я бы советовал не упираться вплотную в текущее ограничение и на всякий случай отводить под ID игрока 4 позиции в строке.
    Итак, для подсчёта длины строки, в которой форматируется ID игрока, нужно из sizeof(fmt_str) отнять 2 позиции (длина спецификатора "%d") и прибавить 4.
    Также в дальнейших расчётах заменил 5 на 4.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  8. #67
    Аватар для Refraktor
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.07.2016
    Сообщений
    4
    Репутация:
    0 ±
    Почему такое в mysql_format не работает? Вылетает "error 035: argument type mismatch (argument 2)".

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Да, действительно. Там это и не должно работать по очень простой причине:
    Код:
    native mysql_format(connectionHandle, output[], len, format[], {Float,_}:...);
    Аргумент format в заголовке объявлен без атрибута const, из-за чего функция может принимать только неконстантные массивы, т.е. такие, у которых нет const в объявлении.
    Пример:
    PHP код:
    new output[1];

    static const 
    fmt_str_0[] = ""// массив с атрибутом const
    mysql_format(conn_handleoutputsizeof(output), fmt_str_0); // error 035

    static fmt_str_1[] = ""// массив БЕЗ атрибута const
    mysql_format(conn_handleoutputsizeof(output), fmt_str_0); // ok 
    Такая же проблема есть в функции SetPVarString и никто её не исправит по всем известной причине. Но вы можете сообщить о проблеме в mysql_format разработчику плагина MySQL (заодно атрибут const следует добавить и в параметрах ещё нескольких функций плагина) - работы там не так уж и много.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #69
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Да, действительно. Там это и не должно работать по очень простой причине:
    Такая же проблема есть в функции SetPVarString и никто её не исправит по всем известной причине. Но вы можете сообщить о проблеме в mysql_format разработчику плагина MySQL (заодно атрибут const следует добавить и в параметрах ещё нескольких функций плагина) - работы там не так уж и много.
    В новой версии атрибут const добавили.

    Код:
    native mysql_format(MySQL:handle, output[], max_len, const format[], {Float,_}:...);

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Обновил 1-й пост: добавил список из преимуществ и недостатков подсчёта, а также пронумеровал примеры.
    Если считаете какие-то из критериев в списке необъективными - конструктивная критика всегда приветствуется.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 7 из 8 ПерваяПервая ... 5 6 7 8 ПоследняяПоследняя

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

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

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

Ваши права

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