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

Реклама


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

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

    Система двигателя. [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
    Сообщений
    375
    Репутация:
    144 ±
    Отредактировал. Автору пару замечаний:

    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
    Сообщений
    375
    Репутация:
    144 ±
    И random(4) никогда не выдаст 4

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

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

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

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

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

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

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

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    25.11.2013
    Сообщений
    74
    Репутация:
    41 ±
    Цитата Сообщение от 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,282
    Репутация:
    417 ±
    Ну раз значение только 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
    Адрес
    Восточный Мордор
    Сообщений
    3,931
    Репутация:
    1502 ±
    Цитата Сообщение от 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;

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

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

    Steve Pavlina

 

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

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

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

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

Ваши права

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