[code = lua] script_name ("tp car to tp")
function main ()
if not isSampLoaded () or not isSampfuncsLoaded () then return end
while not isSampAvailable () do wait (0) end
sampRegisterChatCommand ("tp", tptotp)
if isSampLoaded () then wait (1500) sampAddChatMessage ("TP car to tp.", -1)
while true do
wait (0)
end
end
end
function tptotp (carhandle, pid)
if not isCharOnFoot (PLAYER_PED) then
local carhandle = sampGetCarHandleBySampVehicleId (tonumber (carhandle))
local result, handle = sampGetCharHandleBySampPlayerId (tonumber (pid))
local x, y, z = getCharCoordinates (handle)
local playerx, playery, playerz = getCharCoordinates (PLAYER_PED)
local _, id = sampGetVehicleIdByCarHandle (carhandle)
local data = samp_create_sync_data ('vehicle')
data.vehicleId = id
data.position.x, data.position.y, data.position.z = getCarCoordinates (carhandle)
data.position.x = x
data.position.y = y
data.position.z = z
data.moveSpeed.z = 100
printStringNow (data.position.x, data.position.y, data.position.z, 10000)
data.send ()
local data = samp_create_sync_data ('player')
data.position.x = playerx
data.position.y = playery
data.position.z = playerz
data.send ()
else sampAddChatMessage ("You are not in a car.", -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
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 [/ code]
What is wrong?
function main ()
if not isSampLoaded () or not isSampfuncsLoaded () then return end
while not isSampAvailable () do wait (0) end
sampRegisterChatCommand ("tp", tptotp)
if isSampLoaded () then wait (1500) sampAddChatMessage ("TP car to tp.", -1)
while true do
wait (0)
end
end
end
function tptotp (carhandle, pid)
if not isCharOnFoot (PLAYER_PED) then
local carhandle = sampGetCarHandleBySampVehicleId (tonumber (carhandle))
local result, handle = sampGetCharHandleBySampPlayerId (tonumber (pid))
local x, y, z = getCharCoordinates (handle)
local playerx, playery, playerz = getCharCoordinates (PLAYER_PED)
local _, id = sampGetVehicleIdByCarHandle (carhandle)
local data = samp_create_sync_data ('vehicle')
data.vehicleId = id
data.position.x, data.position.y, data.position.z = getCarCoordinates (carhandle)
data.position.x = x
data.position.y = y
data.position.z = z
data.moveSpeed.z = 100
printStringNow (data.position.x, data.position.y, data.position.z, 10000)
data.send ()
local data = samp_create_sync_data ('player')
data.position.x = playerx
data.position.y = playery
data.position.z = playerz
data.send ()
else sampAddChatMessage ("You are not in a car.", -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
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 [/ code]
What is wrong?