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

Реклама


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

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

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

    Приветствую.
    Когда копался по старым файлам, нашёл код, который писал ещё для 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; 12.12.2016 в 20:00. Причина: Возможность взрывать только занятые тачки

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

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

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

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

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

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

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

    Статус
    Оффлайн
    Регистрация
    04.01.2015
    Адрес
    Гомель, Беларусь
    Сообщений
    347
    Репутация:
    106 ±
    Цитата Сообщение от 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
    new fuck_logic[0] = EOS;

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

    UPD: P.S.: Я этот способ не проверял. И даже не факт, что можно сделать так, чтобы игрок пережил взрыв.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
    SA-MP 0.4 is a lie

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

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

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

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

    Steve Pavlina

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

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



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


    Skype
    profan99
    VK
    click




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

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

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

    Steve Pavlina

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

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

 

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

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

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

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

Ваши права

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