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

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...

abbv

Потрачен
120
40
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
ну, ты выставляешь задержку через ини файл пользователя, например в телепорте по дефолту стоит значение изменения синхры 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, то оно сразу тепнет очень далеко.
 

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 байта. Складываешь кол-во байтов и получаешь нужный оффсет."
 
  • Нравится
Реакции: why ega

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 байта. Складываешь кол-во байтов и получаешь нужный оффсет."
Спасибо!