Помогите с отправкой синхры

KenzieReeves

Участник
Автор темы
36
5
Версия MoonLoader
.027.0-preview
Сделал синхру чтобы дистанционно подбирать пикап который требует нажатие альта.
Всё работает, но решил увеличить дистанцию взятия и соответственно чтобы не кикал античит, для этого отправляю сначала 1 позицию (назовём её "средней" между текущим местоположением персонажа и чекпоинтом) относительно моего персонажа на которую не кикнет, а уже с этой позиции отправляю корды с пикапом, после чего снова отправляю корды "средней" позиции между персонажем и чекпоинтом чтобы не было кика из-за резкого обратного "прыжка" по кордам от пикапа прямо к персонажу. И тут всё работает, но ровно до момента пока не я не вставляю нажатие альта по "прибытию" на чекпоинт, мгновенно после того как нажимается альт, античит кикает. То ли при нажатии альта происходит мгновенная проверка текущего местоположения персонажа то ли хз. Если есть, кто знает с чем связана такая особенность и можно ли её как-то решить, буду очень признателен.

Lua:
onfoot(1440.5831298828, -1650.7821044922, 13.313400268555) // корды "средней" позиции между персонажем и чекпоинтом
onfoot(1441.95703125, -1625.8542480469, 13.313400268555) // корды чекпоинта


local data2 = samp_create_sync_data('player') // нажатие альта
data2.keysData = data2.keysData + 1024 // нажатие альта  -- кикает именно после нажатия альта, в чате видно что альт был нажат и поступила информация от чекпоинта
data2.send() // нажатие альта


onfoot(1440.5831298828, -1650.7821044922, 13.313400268555) // корды "средней" позиции между персонажем и чекпоинтом

Если убрать нажатие альта, то синхра отправляется по всем позициям без киков.
 
Решение
Lua:
function onfoot(x,y,z)
    local data = samp_create_sync_data("player")
    data.position = { x, y, z }
    data.send()
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 =...

why ega

РП игрок
Модератор
2,547
2,238
Сделал синхру чтобы дистанционно подбирать пикап который требует нажатие альта.
Всё работает, но решил увеличить дистанцию взятия и соответственно чтобы не кикал античит, для этого отправляю сначала 1 позицию (назовём её "средней" между текущим местоположением персонажа и чекпоинтом) относительно моего персонажа на которую не кикнет, а уже с этой позиции отправляю корды с пикапом, после чего снова отправляю корды "средней" позиции между персонажем и чекпоинтом чтобы не было кика из-за резкого обратного "прыжка" по кордам от пикапа прямо к персонажу. И тут всё работает, но ровно до момента пока не я не вставляю нажатие альта по "прибытию" на чекпоинт, мгновенно после того как нажимается альт, античит кикает. То ли при нажатии альта происходит мгновенная проверка текущего местоположения персонажа то ли хз. Если есть, кто знает с чем связана такая особенность и можно ли её как-то решить, буду очень признателен.

Lua:
onfoot(1440.5831298828, -1650.7821044922, 13.313400268555) // корды "средней" позиции между персонажем и чекпоинтом
onfoot(1441.95703125, -1625.8542480469, 13.313400268555) // корды чекпоинта


local data2 = samp_create_sync_data('player') // нажатие альта
data2.keysData = data2.keysData + 1024 // нажатие альта  -- кикает именно после нажатия альта, в чате видно что альт был нажат и поступила информация от чекпоинта
data2.send() // нажатие альта


onfoot(1440.5831298828, -1650.7821044922, 13.313400268555) // корды "средней" позиции между персонажем и чекпоинтом

Если убрать нажатие альта, то синхра отправляется по всем позициям без киков.
попробуй добавить кд между телепортами (и подозреваю, что у тебя функция onfoot работает не совсем легитно)
 
  • Нравится
Реакции: Lance_Sterling

KenzieReeves

Участник
Автор темы
36
5
попробуй добавить кд между телепортами (и подозреваю, что у тебя функция onfoot работает не совсем легитно)
Lua:
function onfoot(x,y,z)
    local data = samp_create_sync_data("player")
    data.position = { x, y, z }
    data.send()
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

Не знаю насколько это легитно.
Пробовал и с кд между ТП и без них.
 

why ega

РП игрок
Модератор
2,547
2,238
Lua:
function onfoot(x,y,z)
    local data = samp_create_sync_data("player")
    data.position = { x, y, z }
    data.send()
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

Не знаю насколько это легитно.
Пробовал и с кд между ТП и без них.
скорее всего это происходит потому, что ты отправляешь только один пакет, а не хукаешь всю синхру
 

KenzieReeves

Участник
Автор темы
36
5
скорее всего это происходит потому, что ты отправляешь только один пакет, а не хукаешь всю синхру
Это пока за гранью моих знаний. Если не сложно, мог бы по-подробнее объяснить/показать?

скорее всего это происходит потому, что ты отправляешь только один пакет, а не хукаешь всю синхру
Чуть покопавшись, наверное понял тебя. Объединил передачу кордов и нажатие альта в 1 отправку и сработало. Спасибо.
 
Последнее редактирование:
  • Нравится
Реакции: why ega