Взрыв автомобиля и PlayerSync

Xentron

Известный
Автор темы
15
0
У меня есть этот код, я хочу, чтобы у выбранного игрока появилась машина, которая затем взорвется. Но это не работает, мне нужно спамить команду, чтобы машина телепортировалась к игроку, и она не синхронизируется для меня, помогите, пожалуйста

Код:
local ev = require ('lib.samp.events')
local mad = require'MoonAdditions'

function main ()
    sampRegisterChatCommand ('sbomb', sadlerBomb)
    wait (-1)
end

function sadlerBomb (cmd)

    if not cmd: match ('% d +') then
        return sampAddChatMessage ('USAGE: / sbomb <player id>', - 1)
    end

    target = tonumber (cmd)

    if sampIsPlayerConnected (target) == false then
        return sampAddChatMessage ('Specified player is not connected', -1)
    end

    local _, ped = sampGetCharHandleBySampPlayerId (target)
    if _ then
        local x, y, z = getCharCoordinates (ped)

        lua_thread.create (function ()
            for i, car in ipairs (mad.get_all_vehicles (x, y, z, 100.0, false, false)) do
                if doesVehicleExist (car) then
                    local ped = getDriverOfCar (car)
                    local _, carid = sampGetVehicleIdByCarHandle (car)

                    if not doesCharExist (ped) then
                        sampAddChatMessage ("No player in car - car ID:" .. carid, -1)

                        local data = samp_create_sync_data ('vehicle')
                        data.vehicleId = carid
                        data.position = {x, y, z}
                        data.vehicleHealth = 200.0
                        data.send ()
                        sampForceVehicleSync (carid)
                    end
                end
            end
        end)

    else
        sampAddChatMessage ("Specified player is not streamed in.", -1)
    end
end


function samp_create_sync_data (sync_type, copy_from_player)
    local ffi = require 'ffi'
    local sampfuncs = require 'sampfuncs'
    - from SAMP.Lua
    local raknet = require 'samp.raknet'
    require 'samp.synchronization'

    copy_from_player = copy_from_player or true
    local sync_traits = {
        player = {'PlayerSyncData', raknet.PACKET.PLAYER_SYNC, sampStorePlayerOnfootData},
        vehicle = {'VehicleSyncData', raknet.PACKET.VEHICLE_SYNC, sampStorePlayerIncarData},
        passenger = {'PassengerSyncData', raknet.PACKET.PASSENGER_SYNC, sampStorePlayerPassengerData},
        aim = {'AimSyncData', raknet.PACKET.AIM_SYNC, sampStorePlayerAimData},
        trailer = {'TrailerSyncData', raknet.PACKET.TRAILER_SYNC, sampStorePlayerTrailerData},
        unoccupied = {'UnoccupiedSyncData', raknet.PACKET.UNOCCUPIED_SYNC, nil},
        bullet = {'BulletSyncData', raknet.PACKET.BULLET_SYNC, nil},
        spectator = {'SpectatorSyncData', raknet.PACKET.SPECTATOR_SYNC, nil}
    }
    local sync_info = sync_traits [sync_type]
    local data_type = 'struct' .. sync_info [1]
    local data = ffi.new (data_type, {})
    local raw_data_ptr = tonumber (ffi.cast ('uintptr_t', ffi.new (data_type .. '*', data)))
    - copy player's sync data to the allocated memory
    if copy_from_player then
        local copy_func = sync_info [3]
        if copy_func then
            local _, player_id
            if copy_from_player == true then
                _, player_id = sampGetPlayerIdByCharHandle (PLAYER_PED)
            else
                player_id = tonumber (copy_from_player)
            end
            copy_func (player_id, raw_data_ptr)
        end
    end
    - function to send packet
    local func_send = function ()
        local bs = raknetNewBitStream ()
        raknetBitStreamWriteInt8 (bs, sync_info [2])
        raknetBitStreamWriteBuffer (bs, raw_data_ptr, ffi.sizeof (data))
        raknetSendBitStreamEx (bs, sampfuncs.HIGH_PRIORITY, sampfuncs.UNRELIABLE_SEQUENCED, 1)
        raknetDeleteBitStream (bs)
    end
    - metatable to access sync data and 'send' function
    local mt = {
        __index = function (t, index)
            return data [index]
        end,
        __newindex = function (t, index, value)
            data [index] = value
        end
    }
    return setmetatable ({send = func_send}, mt)
end