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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±

    Взрыв машины при попадании по баку

    Приветствую.
    Когда копался по старым файлам, нашёл код, который писал ещё для 0.3z - взрыв автомобиля, если попали с огнестрельного оружия по его бензобаку.
    Работает, только если машина занята водителем (т.к. существует баг со взрывом незанятого транспорта).
    Код проще некуда.

    Сейчас мы это разберём:

    Итак, в public OnPlayerWeaponShot вставляем следующее:
    PHP код:
    if(hittype == BULLET_HIT_TYPE_VEHICLE && GetVehicleDriver(hitid) != INVALID_PLAYER_ID)
    {
        new 
    Float:Offset[3];
        
    GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAPOffset[0], Offset[1], Offset[2]);
        if(
    VectorSize(Offset[0] - fXOffset[1] - fYOffset[2] - fZ) <= 0.3)
        {
            
    GetVehicleHealth(hitidOffset[0]);
            if(
    Offset[0])
            {
                
    GetVehiclePos(hitidOffset[0], Offset[1], Offset[2]);
                
    CreateExplosion(Offset[0], Offset[1], Offset[2], 15.0);
                
    SetVehicleHealth(hitid0.0);
            }
        }


    Куда-нибудь в конец:
    PHP код:
    stock GetVehicleDriver(vehicleid)
    {
        for(new 
    GetPlayerPoolSize(); != -1; --i)
        {
            if(
    IsPlayerInVehicle(ivehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
        }
        return 
    INVALID_PLAYER_ID;


    Разжую:
    Первое условие проверяет, во что попал игрок. Если он попал в машину и в машине кто-то сидит за рулём, то двигаемся дальше;
    Создаём переменные для последующего узнавания координат бензобака, а также узнаём модель машины, в которую попали;
    Узнаём координаты бензобака;
    Проверяем, насколько далеко от бензобака попал игрок. Если расстояние до бензобака равно либо меньше 0.3 метра (т.е. попал именно в бензобак), идём дальше;
    Узнаём хп машины на тот случай, если она уже взорвана (тогда хп будет равняться 0.0);
    Проверяем это. Если хп больше 0.0, двигаемся далее;
    Узнаём координаты машины для создания взрыва, создаём взрыв на тех координатах, а также ставим машине 0.0 хп.

    При следующем выстреле сработает проверка, и если хп у тачки 0.0, то больше машина взрываться не будет.

    Функция "GetVehicleDriver" нужна для проверки транспорта на занятость водителем.

    Как должно выглядеть в итоге:
    PHP код:
    public OnPlayerWeaponShot(playeridweaponidhittypehitidFloat:fXFloat:fYFloat:fZ)
    {
        if(
    hittype == BULLET_HIT_TYPE_VEHICLE && GetVehicleDriver(hitid) != INVALID_PLAYER_ID)
        {
            new 
    Float:Offset[3];
            
    GetVehicleModelInfo(GetVehicleModel(hitid), VEHICLE_MODEL_INFO_PETROLCAPOffset[0], Offset[1], Offset[2]);
            if(
    VectorSize(Offset[0] - fXOffset[1] - fYOffset[2] - fZ) <= 0.3)
            {
                
    GetVehicleHealth(hitidOffset[0]);
                if(
    Offset[0])
                {
                    
    GetVehiclePos(hitidOffset[0], Offset[1], Offset[2]);
                    
    CreateExplosion(Offset[0], Offset[1], Offset[2], 15.0);
                    
    SetVehicleHealth(hitid0.0);
                }
            }
        }
        return 
    1;
    }

    stock GetVehicleDriver(vehicleid)
    {
        for(new 
    GetPlayerPoolSize(); != -1; --i)
        {
            if(
    IsPlayerInVehicle(ivehicleid) && GetPlayerState(i) == PLAYER_STATE_DRIVER) return i;
        }
        return 
    INVALID_PLAYER_ID;


    Вроде-бы я этого пока не видел нигде, потому и выложил.
    Последний раз редактировалось Nexius_Tailer; 22.06.2023 в 01:17. Причина: Мелкие правки

  2. #2
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Есть одна проблема. Если взорвать транспорт, в котором не сидел игрок, то после рестрима этого транспорта он снова взрывается. И это не исправить (потому что OnVehicleDeath не вызывается).

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

    Статус
    Оффлайн
    Регистрация
    13.12.2013
    Сообщений
    377
    Репутация:
    146 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Есть одна проблема. Если взорвать транспорт, в котором не сидел игрок, то после рестрима этого транспорта он снова взрывается. И это не исправить (потому что OnVehicleDeath не вызывается).
    ну может тогда после взрыва в таймере вызвать SpawnVehicle? или не поможет?

  4. #4
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    ну может тогда после взрыва в таймере вызвать SpawnVehicle? или не поможет?
    Можно попробовать.

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    547
    Репутация:
    158 ±
    Цитата Сообщение от wAx Посмотреть сообщение
    ну может тогда после взрыва в таймере вызвать SpawnVehicle? или не поможет?
    А, ну тогда можно и вовсе убрать взрыв:

    PHP код:
                    //GetVehiclePos(hitid, Offset[0], Offset[1], Offset[2]);
                    //CreateExplosion(Offset[0], Offset[1], Offset[2], 1, 5.0); 
    Всё равно после установки тачке 0 хп она взорвётся. Или я не правильно понимаю, и даже если взрыв будет вызван не CreateExplosion, а SetVehicleHealth, то будет этот баг?
    В таком случае можно наоборот, отказаться от SetVehicleHealth :)

    Хотя тогда она не будет уничтожена..

    Либо, ещё как решение, проверять, занят ли транспорт, и взрывать только если занят.
    Последний раз редактировалось Nexius_Tailer; 31.01.2016 в 20:00.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Nexius_Tailer Посмотреть сообщение
    Либо, ещё как решение, проверять, занят ли транспорт, и взрывать только если занят.
    Возможно, прокатит на несколько миллисекунд телепортировать игрока, запомнив положение его камеры и заблокировав её на прежнем месте, пока игрок не будет телепортирован обратно.

    UPD: P.S.: Я этот способ не проверял. И даже не факт, что можно сделать так, чтобы игрок пережил взрыв.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    А ещё можно насильно вызвать OnVehicleDeath для взорванного автомобиля

    P.S. Респавн авто по таймеру поможет. Проверенно на личном опыте. Только есть один минус: пока авто не зареспавнено, у всех, кто был вне зоны стрима, оно будет взрываться при приблежении к нему. Да и у тех, кто был в зоне стрима, тоже, если они отъедут от него и подъедут вновь. А если спавнить с малым интервалом, то можно будет взрывать авто прямо на спавне и обузить это.
    Лучший вариант, имхо, либо телепортировать куда-то на время автомобиль, либо менять его интерьер/виртуальный мир после взрыва. Но это уже лучше делать каждому, кто решит взять этот код себе в мод, самостоятельно
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    23.12.2013
    Адрес
    Омск
    Сообщений
    196
    Репутация:
    22 ±
    #offtop
    Ох уж эти костыли в Pawn.Ничто так не развивает фантазию, как sa:mp.
    По теме:А зачем таймеры нужны и прочее?Сразу зареспавнить транспорт и все?!



    Любой дурак может написать код, понятный компьютеру. Хороший программист пишет код, понятный человеку
    Мартин Фаулер


    Skype
    profan99
    VK
    click




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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Profyan Посмотреть сообщение
    #offtop
    Ох уж эти костыли в Pawn.Ничто так не развивает фантазию, как sa:mp.
    По теме:А зачем таймеры нужны и прочее?Сразу зареспавнить транспорт и все?!
    И появится он на том же месте, если был взорван на месте спавна. И выглядеть это будет убого, и начнут опять это же авто взрывать, и и
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

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

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

 

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

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

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

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

Ваши права

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