Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 15
  1. #1
    Аватар для Hidden
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    73
    Репутация:
    43 ±

    Система двигателя. [for new.pwn]

    Приветствую всех посетивших тему. Как ни странно, этого мануала я не нашёл на портале.

    1. Добавляем в начало мода:
    PHP код:
    #include <a_samp>
    #include <foreach>

    #define PRESSED(%0)                 (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0))) // нажатие кнопки
    #define COLOR_PURPLE                 0xC2A2DAAA // фиолетовый цвет


    new engine_car[MAX_VEHICLES char]; // заведена машина / нет
    new engine,lights,alarm,bonnet,boot,objective,doors// перменные для данных о состоянии машины 
    2. Добавляем в public OnGameModeInit():
    PHP код:
    ManualVehicleEngineAndLights(); // отключаем автоматическую заводку двигателя 
    3. Добавляем в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys):
    PHP код:
        if(PRESSED(KEY_SUBMISSION)) // если нажали цифру "2" на клавиатуре
        
    {
            if(!
    IsPlayerInAnyVehicle(playerid)) return true// находится ли игрок в машине
              
    if(GetPVarInt(playerid"Engining") > 0) return true// начал ли игрок заводку двигателя
            
    new vehicleid GetPlayerVehicleID(playerid); // создаём переменную, в которую записываем ID машины игрока, чтобы код был менее громоздким
            
    if(GetPlayerState(playerid) != 2) return true// находится ли игрок за рулём
            
    if(IsABicycle(vehicleid)) return true// если на велосипеде
            
    new player_name[MAX_PLAYER_NAME]; // переменная для хранения имени игрока
              
    GetPlayerName(playeridplayer_namesizeof(player_name)); // записываем имя игрока в переменную
            
    if(engine_car{vehicleid} == 0// если двигатель машины не заведён
            
    {
                new 
    text[29+MAX_PLAYER_NAME]; // создаём переменную для хранения текста (29 символов данного текста + ячейки для имени игрока)
                
    format(textsizeof(text), "*%s пытается завести двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
                
    ProxDetectorEx(15.0playeridtextCOLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
                
    SetTimerEx("RandomEnginingCar"15000"%i"playerid); // переменной таймера присваивам запуск таймера
                
    SetPVarInt(playerid"Engining"1); // начинаем заводку двигателя
            
    }
            else 
    // если двигатель машины заведён
            
    {
                
    engine_car{vehicleid} = 0// глушим двигатель
                
    new text2[19+MAX_PLAYER_NAME]; // создаём переменную для хранения текста (19 символов данного текста + ячейки для имени игрока)
                
    format(text2sizeof(text2), "*%s глушит двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
                
    ProxDetectorEx(15.0playeridtext2COLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
                
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
                
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective); // выключаем двигатель
            
    }
        } 
    4. Добавляем в public OnPlayerStateChange(playerid, newstate, oldstate):
    PHP код:
        if(newstate == PLAYER_STATE_DRIVER// если игрок сел за руль
        
    {
            new 
    vehicleid GetPlayerVehicleID(playerid); // создаём переменную, в которую записываем ID машины игрока, чтобы код был менее громоздким
            
    if(IsABicycle(vehicleid) || engine_car{vehicleid} != 0)
            
    // если сели на велосипед или переменная, хранящая информацию о двигателе машины, не равна 0
            
    {
                
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
                
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем "двигатель
            
    }
        } 
    5. Теперь сам процесс заводки двигателя. В середину/конец мода добавляем:
    PHP код:
    forward RandomEnginingCar(playerid);
    public 
    RandomEnginingCar(playerid)
    {
        new 
    text[36+MAX_PLAYER_NAME]; // создаём переменную для хранения текста
        
    new vehicleid GetPlayerVehicleID(playerid); // создаём переменную, в которую записываем ID машины игрока, чтобы код был менее громоздким
        
    new Floatvehicle_health// создаём переменную для хранения HP машины
        
    GetVehicleHealth(vehicleidvehicle_health); // записываем HP машины в переменную
        
    new player_name[MAX_PLAYER_NAME]; // переменная для хранения имени игрока
        
    GetPlayerName(playeridplayer_namesizeof(player_name)); // записываем имя игрока в переменную
        
    if(vehicle_health >= 900// если HP машины больше либо равно 900
        
    {
            
    engine_car{vehicleid} = 1// заводим машину
            
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
            
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем двигатель
            
    format(textsizeof(text), "*%s заводит двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
            
    ProxDetectorEx(15.0playeridtextCOLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
        
    }
        else if(
    vehicle_health >= 500 || vehicle_health 900// если HP машины от 500 до 900
        
    {
            switch(
    random(5)) // проверяем значения random_engine
            
    {
                case 
    0..3// если выпали числа 0, 1, 2, 3, двигатель заведётся
                
    {
                    
    engine_car{vehicleid} = 1// заводим машину
                    
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
                    
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем двигатель
                    
    format(textsizeof(text), "*%s заводит двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
                    
    ProxDetectorEx(15.0playeridtextCOLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
                
    }
                case 
    4// если выпало число 4, двигатель не заведётся
                
    {
                     
    format(textsizeof(text), "*У %s не получилось завести двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
                    
    ProxDetectorEx(15.0playeridtextCOLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
                
    }
            }
        }
         else if(
    vehicle_health 500// если HP машины < 500
        
    {
            switch(
    random(5)) // проверяем значения random_engine
            
    {
                case 
    34// если выпали числа 3 или 4, то двигатель заведётся
                
    {
                    
    engine_car{vehicleid} = 1// заводим машину
                    
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // получаем данные о состоянии машины
                    
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // включаем двигатель
                    
    format(textsizeof(text), "*%s заводит двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
                    
    ProxDetectorEx(15.0playeridtextCOLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
                
    }
                case 
    0..2// если выпали числа 0, 1, 2, то двигатель не заведётся
                
    {
                     
    format(textsizeof(text), "*У %s не получилось завести двигатель."player_name); // форматируем текст - записываем вместо %s имя игрока
                    
    ProxDetectorEx(15.0playeridtextCOLOR_PURPLE); // отправляем текст в чат всем, кто находится в 15 метрах от нас (фиолетовым цветом)
                
    }
            }
        }
        
    SetPVarInt(playerid"Engining"0); // процесс заводки авто окончен
        
    return true;

    6. Нужные стоки (stock):
    PHP код:
    stock ProxDetectorEx(Float:radiplayeridstring[], color// отправка сообщения в чат на расстояние
    {
        new 
    Float:positions[3]; // создаём 3 перменные типа FLOAT (0, 1 и 2) для хранения координат игрока
        
    GetPlayerPos(playerid,positions[0],positions[1],positions[2]); // записываем координаты игрока в переменные
        
    foreach(new iPlayer// перебираем всех игроков
        
    {
            if(
    IsPlayerInRangeOfPoint(i,radi,positions[0],positions[1],positions[2])) // если игрок в указанном радиусе
            
    {
                if(
    GetPlayerVirtualWorld(i) == GetPlayerVirtualWorld(playerid) && GetPlayerInterior(playerid) == GetPlayerInterior(i)) SendClientMessage(icolorstring);
                
    // и имеет такие же виртуальный мир и интерьер, как и у данного игрока, то ему приходит сообщение в чат
            
    }
        }
        return 
    true;
    }

    stock IsABicycle(vehicleid// велосипеды
    {
        switch(
    GetVehicleModel(vehicleid)) // проверяем значения модели
        
    {
            case 
    481509510448: return true;
        }
        return 
    false;

    7. В public OnVehicleSpawn:
    PHP код:
    engine_car{vehicleid} = 0
    *Во время респавна автомобиля выключаем ему двигатель.

    Постарался всё разъяснить предельно подробно. Если заметили недоработки/ошибки или хотите задать вопрос - оставляйте сообщение ниже.
    Автор мануала: Hidden.
    Последний раз редактировалось Hidden; 20.06.2014 в 02:00. Причина: Поправки. (tnx wAx, Salvador, DeimoS)

  2. #2
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Отредактировал. Автору пару замечаний:

    PHP код:
    stock SetVehicleToRespawnEx(vehicle

        
    engine_car[vehicle] = 0
        
    SetVehicleToRespawn(vehicle); 
        return 
    true

    Нет нужды в замене стандартной функции. Достаточно в OnVehicleSpawn приравнивать переменную к 0.

    PHP код:
    new random_engine[MAX_PLAYERS]; // заведётся / не заведётся 
    Почему-бы напрямую не использовать функцию random(max) в switch?

    PHP код:
    new timer_engining[MAX_PLAYERS]; // переменная для таймера
    timer_engining[playerid] = SetTimerEx("RandomEnginingCar"15001"%i"playerid); // переменной таймера присваивам запуск таймера 
    Достаточно поставить циклирование таймера на 0 и после выполнения кода таймера - сервер его забудет как страшный сон.
    У меня все. По делу: Неплохой урок.

    - - - Добавлено - - -

    Ах-да, еще в IsABicycle

    PHP код:
    new model  GetVehicleModel(vehicleid); 
    зачем использовать переменную? Можно напрямую получить модель в switch

  3. #3
    Аватар для wAx
    ¯\_(ツ)_/¯

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    И random(4) никогда не выдаст 4

  4. #4
    Аватар для Hidden
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    73
    Репутация:
    43 ±
    Безумно благодарен за исправление ошибок. Урок для меня, обязательно учту.

  5. #5
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    7. В OnVehicleSpawn:

    PHP код:
    engine_car[vehicle] = 0
    Исправь на vehicleid

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    И массив тогда лучше перенести на char и работать уже с байтами, а не с ячейками, раз значение может быть только 0 и 1
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  7. #7
    Аватар для Hidden
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    73
    Репутация:
    43 ±
    Цитата Сообщение от Salvador Посмотреть сообщение
    7. В OnVehicleSpawn:

    PHP код:
    engine_car[vehicle] = 0
    Исправь на vehicleid
    Цитата Сообщение от DeimoS Посмотреть сообщение
    И массив тогда лучше перенести на char и работать уже с байтами, а не с ячейками, раз значение может быть только 0 и 1
    Внёс поправки. Спасибо.
    Hidden (Kenny Hellwood)

    Темы:
    [Мануал] Система двигателя [for new.pwn] - click.
    [Мануал] Запись нескольких значений в один столбец через запятую [mysql r7] - click.
    [Мануал] Табличка на прицепы - click.
    [Info] Выражения и операторы PAWN - click.

  8. #8
    Аватар для Salvacore
    Инжунер-погромист

    Статус
    Оффлайн
    Регистрация
    10.05.2013
    Адрес
    Аҧсуа бызшәа
    Сообщений
    2,271
    Репутация:
    418 ±
    Ну раз значение только 1 и 0, можно и
    PHP код:
    new bool:engine_car[MAX_VEHICLES char];

    engine_car{vehicleid}= false

  9. #9
    Аватар для vitalik6243
    Пользователь

    Статус
    Оффлайн
    Регистрация
    26.03.2014
    Сообщений
    1
    Репутация:
    0 ±
    честно говоря тупо, лучше нажал клавишу и держишь идет звук типо машина пытается завестись id звука где-то был.
    но вот вопрос как сделать чтобы OnPlayerKeyStateChange узнавал держу я клавишу или нет...

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от vitalik6243 Посмотреть сообщение
    честно говоря тупо, лучше нажал клавишу и держишь идет звук типо машина пытается завестись id звука где-то был.
    но вот вопрос как сделать чтобы OnPlayerKeyStateChange узнавал держу я клавишу или нет...
    А параметры newkeys и oldkeys для кого? Узнаём длительность этого вашего звука и запускаем таймер при нажатии на клавишу с тем интервалом, с которым играет наш звук. А после делаем какую-нибудь переменную, по которой будем отлавливать нажатие следующей клавиши и глушим звук. Ну что-то типа

    PHP код:
    public OnPlayerKeyStateChange(playeridnewkeysoldkeys)
    {
        new 
    vehicle_id GetPlayerVehicleId(playerid);
        if(
    vehicle_id)
        {
            if(
    newkeys KEY_FIRE && !(oldkeys KEY_FIRE))
            {
                
    SetTimerEx("SoundEngine"/*Интервал*/0"i"playerid);
                
    SetPVarInt(playerid"EngineStartPressed"1);
                
    //Запускаем наш звук и выполняем другие действия
            
    }
            else if(!(
    oldkeys KEY_FIRE) && !(newkeys KEY_FIRE))
            {
                
    DeletePVar(playerid"EngineStartPressed");
            }
        }
        return 
    1;
    }

    forward SoundEngine(playerid);
    public 
    SoundEngine(playerid)
    {
        if(
    Двигатель нужно завести)
        {
            
    DeletePVar(playerid"EngineStartPressed");
            
    //Запускаем двигатель
        
    }
        else
        {
            
    //Повторно запускаем звук
        
    }
        if(
    GetPVarInt(playerid"EngineStartPressed")) SetTimerEx("SoundEngine"/*Интервал*/0"i"playerid);
        return 
    1;

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

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

    Steve Pavlina

 

 
Страница 1 из 2 1 2 ПоследняяПоследняя

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

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

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

Ваши права

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