Как сделать задержку в изменении координат?

HavenS

Участник
Автор темы
76
19
Как сделать задержку при отправке координат серверу, например: в некоторых телепортах есть отправка координат серверу с задержкой и определённым кол-во координат, как это сделать?
 
Решение
Ты меня немного не так понял, про задержки я знаю, мне нужно сделать задержку в изменении координат:

Lua:
function sampev.onSendPlayerSync(data)
    data.position.x + 1
    wait(1000)
end

это работать не будет, а если я уберу wait, то оно сразу тепнет очень далеко.
ну потому что при задержке в хуке ты просто пропускаешь пакет и потом отсылаешь один дополнительный, если тебе нужно просто отослать пакет, о координатах условно, можешь юзать функцию фипа
Lua:
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...

spelare for filmer

Потрачен
154
187
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ты меня немного не так понял, про задержки я знаю, мне нужно сделать задержку в изменении координат:

Lua:
function sampev.onSendPlayerSync(data)
    data.position.x + 1
    wait(1000)
end

это работать не будет, а если я уберу wait, то оно сразу тепнет очень далеко.
ну потому что при задержке в хуке ты просто пропускаешь пакет и потом отсылаешь один дополнительный, если тебе нужно просто отослать пакет, о координатах условно, можешь юзать функцию фипа
Lua:
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
и вот еще чисто пример использования с координатами в твоем случае

Lua:
local data = samp_create_sync_data("player")
data.position = {x,y,z}
data.send()

либо поиграйся со структурами ( setStructFloatElement )

Lua:
function sendOnfootSync()
 local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
 x,y,z = getCharCoordinates(1)
 local data = allocateMemory(68)
 sampStorePlayerOnfootData(myId, data)
 setStructFloatElement(data, 6, x, false)
 setStructFloatElement(data, 10, y, false)
 setStructFloatElement(data, 14, z, false)
 sampSendOnfootData(data)
 freeMemory(data)
end

задержку юзаешь в цикле по стандарту перед обоими методами одинаково в принципе, про задержку вне главной функции с потоками знаешь надеюсь

по поводу структур, их вообще много где можно найти, вот ярчайший пример с поиска https://cleo.fandom.com/ru/wiki/Структуры_SA:MP
ну или вот еще объяснение от хорошего человека "Структуры всех пакетов есть в /lib/samp/synchronization.lua. int8 - это 1 байт, int16 - 2 байта, float - 4 байта. Складываешь кол-во байтов и получаешь нужный оффсет."
 
  • Нравится
Реакции: хуега)

abbv

Потрачен
121
41
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну, ты выставляешь задержку через ини файл пользователя, например в телепорте по дефолту стоит значение изменения синхры 1000 ms, но пользователь может его менять, и например сменил его через ини файл на 321 ms, тогда будет не wait(1000) а wait(321)
посмотри все видео по поводу изучения lua TheChampGuess, он подробно рассказывает
 

HavenS

Участник
Автор темы
76
19
ну, ты выставляешь задержку через ини файл пользователя, например в телепорте по дефолту стоит значение изменения синхры 1000 ms, но пользователь может его менять, и например сменил его через ини файл на 321 ms, тогда будет не wait(1000) а wait(321)
посмотри все видео по поводу изучения lua TheChampGuess, он подробно рассказывает
Ты меня немного не так понял, про задержки я знаю, мне нужно сделать задержку в изменении координат:

Lua:
function sampev.onSendPlayerSync(data)
    data.position.x + 1
    wait(1000)
end

это работать не будет, а если я уберу wait, то оно сразу тепнет очень далеко.
 

HavenS

Участник
Автор темы
76
19
ну потому что при задержке в хуке ты просто пропускаешь пакет и потом отсылаешь один дополнительный, если тебе нужно просто отослать пакет, о координатах условно, можешь юзать функцию фипа
Lua:
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
и вот еще чисто пример использования с координатами в твоем случае

Lua:
local data = samp_create_sync_data("player")
data.position = {x,y,z}
data.send()

либо поиграйся со структурами ( setStructFloatElement )

Lua:
function sendOnfootSync()
 local _, myId = sampGetPlayerIdByCharHandle(PLAYER_PED)
 x,y,z = getCharCoordinates(1)
 local data = allocateMemory(68)
 sampStorePlayerOnfootData(myId, data)
 setStructFloatElement(data, 6, x, false)
 setStructFloatElement(data, 10, y, false)
 setStructFloatElement(data, 14, z, false)
 sampSendOnfootData(data)
 freeMemory(data)
end

задержку юзаешь в цикле по стандарту перед обоими методами одинаково в принципе, про задержку вне главной функции с потоками знаешь надеюсь

по поводу структур, их вообще много где можно найти, вот ярчайший пример с поиска https://cleo.fandom.com/ru/wiki/Структуры_SA:MP
ну или вот еще объяснение от хорошего человека "Структуры всех пакетов есть в /lib/samp/synchronization.lua. int8 - это 1 байт, int16 - 2 байта, float - 4 байта. Складываешь кол-во байтов и получаешь нужный оффсет."
Спасибо!