ультра сложный вопрос

mc_alex

Участник
Автор темы
151
23
Версия MoonLoader
.027.0-preview
как сделать отправку синхры игрока по метке на команду?
 
  • Вау
Реакции: Looney.

qdIbp

Автор темы
Проверенный
1,390
1,146
Lua:
local pX,pY,pZ, Xx,Xy,Xz = 0,0,0, 0,0,0
local st = false

function SearchMarker(posX, posY, posZ, radius, isRace)
    local ret_posX = 0.0
    local ret_posY = 0.0
    local ret_posZ = 0.0
    local isFind = false

    for id = 0, 31 do
        local MarkerStruct = 0
        if isRace then MarkerStruct = 0xC7F168 + id * 56
        else MarkerStruct = 0xC7DD88 + id * 160 end
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                ret_posX = MarkerPosX
                ret_posY = MarkerPosY
                ret_posZ = MarkerPosZ
                isFind = true
                radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
            end
        end
    end

    return isFind, ret_posX, ret_posY, ret_posZ
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

function cmd(param)
    st = not st print(st)
    if isPlayerPlaying(playerHandle) then
        local pX,pY,pZ = getCharCoordinates(playerPed)
        local res, x, y, z = SearchMarker(pX,pY,pZ, 99999.0, false) Xx,Xy,Xz = x,y,z
        if res then
            sampAddChatMessage(string.format("Найден обычный маркер в координатах %.2f %.2f %.2f", x, y, z), -1)
         
        else
            res, x, y, z = SearchMarker(pX,pY,pZ, 99999.0, true) Xx,Xy,Xz = x,y,z
            if res then
                sampAddChatMessage(string.format("Найден гоночный маркер в координатах %.2f %.2f %.2f", x, y, z), -1)
            else
                sampAddChatMessage("Маркер не найден", -1)
            end
        end
    end
end

function main()
        sampRegisterChatCommand('cmd', cmd)
    while true do wait(0)
            if st then
                pX,pY,pZ = getCharCoordinates(playerPed)
                print(getDistanceBetweenCoords3d(Xx,Xy,Xz, pX,pY,pZ))
                local data = samp_create_sync_data('player')
                data.position.x = Xx
                data.position.y = Xy
                data.position.z = Xz
                st = false
                data.send()
            end
    end
end
Работает на каком то определённом расстоянии, то бишь аризона рп ЦЗ ЛС(ammo nation ЛС) до АЗС в блюбери
Снимок экрана (410).png


Хотя мне кажется что
Lua:
getDistanceBetweenCoords3d()
пиздит с расстоянием
 
Последнее редактирование:
  • Нравится
Реакции: mc_alex

mc_alex

Участник
Автор темы
151
23
Lua:
local pX,pY,pZ, Xx,Xy,Xz = 0,0,0, 0,0,0
local st = false

function SearchMarker(posX, posY, posZ, radius, isRace)
    local ret_posX = 0.0
    local ret_posY = 0.0
    local ret_posZ = 0.0
    local isFind = false

    for id = 0, 31 do
        local MarkerStruct = 0
        if isRace then MarkerStruct = 0xC7F168 + id * 56
        else MarkerStruct = 0xC7DD88 + id * 160 end
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                ret_posX = MarkerPosX
                ret_posY = MarkerPosY
                ret_posZ = MarkerPosZ
                isFind = true
                radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
            end
        end
    end

    return isFind, ret_posX, ret_posY, ret_posZ
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

function cmd(param)
    st = not st print(st)
    if isPlayerPlaying(playerHandle) then
        local pX,pY,pZ = getCharCoordinates(playerPed)
        local res, x, y, z = SearchMarker(pX,pY,pZ, 99999.0, false) Xx,Xy,Xz = x,y,z
        if res then
            sampAddChatMessage(string.format("Найден обычный маркер в координатах %.2f %.2f %.2f", x, y, z), -1)
        
        else
            res, x, y, z = SearchMarker(pX,pY,pZ, 99999.0, true) Xx,Xy,Xz = x,y,z
            if res then
                sampAddChatMessage(string.format("Найден гоночный маркер в координатах %.2f %.2f %.2f", x, y, z), -1)
            else
                sampAddChatMessage("Маркер не найден", -1)
            end
        end
    end
end

function main()
        sampRegisterChatCommand('cmd', cmd)
    while true do wait(0)
            if st then
                pX,pY,pZ = getCharCoordinates(playerPed)
                print(getDistanceBetweenCoords3d(Xx,Xy,Xz, pX,pY,pZ))
                local data = samp_create_sync_data('player')
                data.position.x = Xx
                data.position.y = Xy
                data.position.z = Xz
                st = false
                data.send()
            end
    end
end
Работает на каком то определённом расстоянии, то бишь аризона рп ЦЗ ЛС(ammo nation ЛС) до АЗС в блюбери
Посмотреть вложение 128932

Хотя мне кажется что
Lua:
getDistanceBetweenCoords3d()
пиздит с расстоянием
а зачем мне для аризоны? конечно, это круто, но мне обычный пример нужен простого телепорта на метку с использованием этой штуки. но за телепорт спасибо
 

qdIbp

Автор темы
Проверенный
1,390
1,146
а зачем мне для аризоны? конечно, это круто, но мне обычный пример нужен простого телепорта на метку с использованием этой штуки. но за телепорт спасибо
Не, я имел ввиду места, там где я был на аризоне это ЦЗ, просто хз как это здание назвать

И он просто просто ловит чекпоинт на расстоянии
 

mc_alex

Участник
Автор темы
151
23
Не, я имел ввиду места, там где я был на аризоне это ЦЗ, просто хз как это здание назвать

И он просто просто ловит чекпоинт на расстоянии
мне обычный пример нужен простого телепорта на метку, который будет отправлять на эту же метку синхру игрока