Анти взрыв вертолёта/самолёта

-MaDnEsS-

Известный
Автор темы
194
37
Версия SA-MP
  1. 0.3.7 (R1)
  2. 0.3.7-R2
Думаю можно реализовать такой скрипт, с автоматической активацией при входе в игру.

Суть такова: На Кары и лодки это не действует. Действует только на Летающее воздушное средство. Это вертолёты и самолёты.
ХП кара будет теряться, но сделать так, чтобы вертолёт не взрывался при падении и т.д. очень сильно бесит, когда врезаешься в дерево или столб, вертолёт начинает дымиться и взрываться.
Что нужно в скрипте, параметр отвечающий за поломку вертолёта и его взрыву.
Можно сделать и остановку ХП в определённом количестве, где уже грань его падению и взрыву воздушного судна.
ГМ не предлагать ( сильно палится и банят )
 

dravica

Участник
17
7
наткнулся на топик пока искал похожий скрипт, вдруг помогу кому-то с похожими запросами из будущевг
на самом деле это реально! чтобы самолеты не взрывались, достаточно просто поставить хук на функцию, отвечающую за взрывы. код для установки хука можно взять из этой темы, а уже готовый адрес функции и ее прототип найти вот в этом репозитории. получится что-то подобного вида:
Lua:
local ffi = require 'ffi'

--HOOKS
local hook = {hooks = {}}
addEventHandler('onScriptTerminate', function(scr)
    if scr == script.this then
        for i, hook in ipairs(hook.hooks) do
            if hook.status then
                hook.stop()
            end
        end
    end
end)
ffi.cdef [[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function hook.new(cast, callback, hook_addr, size)
    jit.off(callback, true) --off jit compilation | thx FYP
    local size = size or 5
    local new_hook = {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.call = ffi.cast(cast, hook_addr)
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()
    table.insert(hook.hooks, new_hook)
    return setmetatable(new_hook, {
        __call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end
    })
end
--HOOKS

function blowUpPlaneHook(plane, damager, bHideExplosion)
    printStringNow('~r~CPlane::BlowUpCar called', 800)

    -- you can add some condition checks here
    -- to make your plane explode only when you want it to
    
    -- return blowUpPlane(plane, damager, bHideExplosion)
end

function blowUpHeliHook(heli, damager, bHideExplosion)
    printStringNow('~r~CHeli::BlowUpCar called', 800)
    
    -- actually, this hook doesn't work as it should.
    -- the helicopter itself doesn't explode, but explosions
    -- occur underneath it and its HP goes negative. 
    -- not sure what might be causing this

    -- return blowUpHeli(heli, damager, bHideExplosion)
end

function main()
    local blowUpPlaneAddr    = 0x6CCCF0    -- CPlane::BlowUpCar
    local blowUpHeliAddr    = 0x6C6D30    -- CHeli::BlowUpCar

    blowUpPlane = hook.new(
        'void(__thiscall *)(void *plane, void *damager, bool bHideExplosion)',
        blowUpPlaneHook,
        blowUpPlaneAddr
    )

    blowUpHeli = hook.new(
        'void(__thiscall *)(void *heli, void *damager, bool bHideExplosion)',
        blowUpHeliHook,
        blowUpHeliAddr
    )
end

хук на взрывы вертолётов ставится так же легко, но почему-то работает очень странно.
могу предположить, что на серверах, поддерживающих ХП транспорта >250, такого не произойдет, но в таких условиях у меня и не получилось взорвать маверик ¯\_(ツ)_/¯

 
  • Нравится
Реакции: moreveal