>_ NRL Script
Universal Volt · · 2 menit baca

RakNet Packet Logger: Baca Apa yang Client Kamu Kirim

Pasang send hook RakNet buat inspect paket mentah yang dikirim client. Lengkap dengan validasi ukuran payload dan jalur cleanup yang aman.

Remote spy cuma nangkep lapisan RemoteEvent. Di bawahnya masih ada RakNet — tempat semua paket, termasuk replikasi physics dan sinkronisasi properti, lewat. Kalau kamu lagi ngerti kenapa suatu sinyal nyampe padahal remote-nya nggak kepanggil, di sinilah jawabannya.

Peringatan: send hook jalan di jalur pengiriman. Kalau kamu bikin dia lambat

atau error, koneksi client kamu yang kena. Baca bagian keselamatan di bawah

sebelum jalanin.

Skripnya#

```lua showLineNumbers --!strict -- RakNet Send Logger — read-only, tidak mengubah paket apa pun -- Cleanup: PacketLogger.stop()

local PacketLogger = {}

local MAX_PAYLOAD_PREVIEW = 32 -- byte yang ditampilkan per paket local THROTTLE_SECONDS = 0.5

local watchedIds: { [number]: boolean } = {} -- kosong = catat semua local lastSeen: { [number]: number } = {} local hookId: any = nil

local function toHex(bytes: { number }, limit: number): string local out = table.create(math.min(#bytes, limit)) for i = 1, math.min(#bytes, limit) do out[i] = string.format("%02X", bytes[i]) end local suffix = #bytes > limit and string.format(" ... (+%d byte)", #bytes - limit) or "" return table.concat(out, " ") .. suffix end

function PacketLogger.watch(packetId: number) watchedIds[packetId] = true end

function PacketLogger.start() if hookId then rconsolewarn("PacketLogger: hook sudah terpasang") return end

hookId = raknet.add_send_hook(function(packet) -- Paket kosong itu nyata dan bakal bikin ReadBytes error. -- Validasi ukuran SEBELUM baca apa pun. local size = packet:GetSize() if size == nil or size < 1 then return end

local bytes = packet:ReadBytes(math.min(size, MAX_PAYLOAD_PREVIEW)) if bytes == nil or #bytes == 0 then return end

local id = bytes[1]

if next(watchedIds) ~= nil and not watchedIds[id] then return end

local now = os.clock() if now - (lastSeen[id] or 0) < THROTTLE_SECONDS then return end lastSeen[id] = now

rconsoleprint(string.format( "[%s] id=0x%02X size=%d | %s\n", os.date("%H:%M:%S"), id, size, toHex(bytes, MAX_PAYLOAD_PREVIEW) ))

-- Tidak ada SetData, tidak ada Block. Hook ini murni observasi — -- paketnya lewat persis seperti aslinya. end)

rconsoleprint("PacketLogger: hook terpasang\n") end

function PacketLogger.stop() if not hookId then return end

raknet.remove_send_hook(hookId) hookId = nil table.clear(lastSeen)

rconsoleprint("PacketLogger: hook dilepas\n") end

rconsoleshow() PacketLogger.start()

return PacketLogger BLOCK0

Log jadi bersih dan kamu bisa lihat perubahan payload antar aksi — itu cara tercepat memetakan byte mana yang bawa data apa.

Langkah berikutnya#

Kalau kamu udah ketemu remote yang relevan tapi mau lihat argumennya di level Lua, gabungin sama remote spy __namecall. Dua lapisan itu saling isi: RakNet nunjukin apa yang keluar, __namecall nunjukin siapa yang manggil.