Вопрос про баги синхры сампа

whyhardlyz

Известный
Автор темы
120
90
Версия SA-MP
  1. Любая

Приветствую! Назрел вопрос, какие баги синхры существуют в сампе которые можно воспроизвести при помощи написания кода (SF плагин, Lua скрипт)?
Желаю услышать что-то наподобие того что можно для игроков стрельнуть с РПГ и снаряд полетит, а у себя даже патрона не потратить на это.
Так же интересно узнать про всякие интересные баги для троллинга, пример с Прибором ночного видения и "озелененнии" всех игроков в зоне стрима


Пример "озеленения", вроде должно быть с таймкодом, если нету то 6:02:​


Возможно не в ту тему закинул, но всё же, лучший ответ будет самый информативный, а если будет объяснение то что нужно сделать для того чтобы выполнить любой описанный баг, то вообще будет шикарно

 
Решение
можно для игроков стрельнуть с РПГ и снаряд полетит, а у себя даже патрона не потратить на это.
то что ты привёл в пример - подмена синхры
баги это другое.
Пример "озеленения"
это работает при использовании ОНВ ( обычный предмет из ГТА са а не акс!)
Пример с подменой синхры можно привести много. От рванки до прикола что ты у себя сидишь за рулём а у остальных на пассажирском.
В основом такую штуку проделывают с помощью функции @FYP или битстрима, но можно и с помощью SAMP.lua, например
Lua:
local ev = require("lib.samp.events")

function ev.onSendPlayerSync(data)
    data.weapon = 35 -- подменяет информацию о оружии и ставит РПГ
end

Но более правильно будет(моё мнение):


Lua:
local state =...

VanoKLR

Известный
851
464
можно для игроков стрельнуть с РПГ и снаряд полетит, а у себя даже патрона не потратить на это.
то что ты привёл в пример - подмена синхры
баги это другое.
Пример "озеленения"
это работает при использовании ОНВ ( обычный предмет из ГТА са а не акс!)
Пример с подменой синхры можно привести много. От рванки до прикола что ты у себя сидишь за рулём а у остальных на пассажирском.
В основом такую штуку проделывают с помощью функции @FYP или битстрима, но можно и с помощью SAMP.lua, например
Lua:
local ev = require("lib.samp.events")

function ev.onSendPlayerSync(data)
    data.weapon = 35 -- подменяет информацию о оружии и ставит РПГ
end

Но более правильно будет(моё мнение):


Lua:
local state = false
local weap = 0

function main()
    while not isSampAvailable() do wait(0) end
        sampRegisterChatCommand("setGun"function(arg)
            weap = arg
            state = not state
        end)
    while true do wait(0)
        if state then
            local data = samp_create_sync_data("player")
            data.weapon = weap
            data.send()
        end
    end
end

addEventHandler('onReceivePacket', function (id, bs)
    if id == 207 and state then return false -- нопаем изначальную синхру
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
Ещё есть прикольная штучка как "NaN" или же "Не валидная" синхра - скажем так, этот типаж синхры отправляет серверу информацию о том что её просто нету, сервер не знает как её обработать и не может отрисовать тебя, но на крупных серверах уже давно есть фильтры которые такую информацию отклоняют. И если отправлять NaN синхру - тебя тупо кинет в афк.
Добиться такой можно с помощью 0/0 или
Код:
tonumber("NaN")
 
Последнее редактирование:
  • Нравится
Реакции: whyhardlyz и pastow