Knight docs
EN ID
GitHub

RPC Kustom

Tukar paket biner sendiri antara client mod dan server.

SA-MP menyisakan banyak id RPC yang tidak terpakai. Knight membiarkan gamemode mengambil id tersebut dan bertukar payload biner sendiri dengan client yang dimodifikasi. Engine memvalidasi frame, membatasi ukuran dan laju per pemain, lalu meneruskan payload ke handler Anda.

1. Mendaftarkan handler

knight
function onInventoryRPC(RPC rpc) {
    let item = rpc.reader.read_int32();
    let amount = rpc.reader.read_int32();

    if (!rpc.reader.valid()) { return; }   // payload terpotong

    SendCustomRPC(rpc.playerid, 201, RPCPack("u32", item, "u32", amount));
};

system::start() {
    HandleCustomRPC(200, onInventoryRPC, {
        direction: "incoming",
        max_size: 4096,
        rate_limit: 20,
        client_mod: true
    });
};

2. Opsi

OpsiDefaultArti
direction"incoming"incoming, outgoing, atau both
max_size4096Payload terbesar (1..65535); lebih besar dibuang
rate_limit0Paket per pemain per detik; 0 = tanpa batas
client_modfalsetrue = hanya client yang menyatakan dukungan
Warning
Id yang sudah dipakai protokol bawaan (mis. 101 chat, 25 ClientJoin, 50 ServerCommand) tidak bisa diambil; HandleCustomRPC mengembalikan false dan mencatat alasannya.

3. Objek RPC

FieldTipeArti
rpc.idintId RPC
rpc.playeridintPemain pengirim
rpc.payloadstringByte mentah
rpc.lengthintPanjang payload
rpc.readerReaderPembaca biner dengan pemeriksaan batas
rpc.directionstring"incoming" atau "outgoing"
rpc.is_validboolFalse bila frame ditolak

4. Method Reader

MethodByteCatatan
read_int8() / read_uint8()1Bertanda / tak bertanda
read_int16() / read_uint16()2Little-endian
read_int32() / read_uint32()4Little-endian
read_float()4IEEE-754 float32
read_bool()1Bukan nol = true
read_string(n)nByte mentah tanpa awalan panjang
remaining()—Sisa byte
valid()—False setelah pembacaan kurang
tell()—Offset saat ini
Note
Setiap pembacaan diperiksa batasnya. Payload pendek atau jahat menghasilkan nol, menandai valid() false, dan tidak pernah membuat server crash.

5. Membangun payload

knight
let payload = RPCPack("u8", 7, "u16", 300, "u32", 70000, "f32", 1.5, "s", "hi");
SendCustomRPC(playerid, 201, payload);   // satu pemain
SendCustomRPC(-1, 201, payload);         // semua (broadcast)
TagUkuran
u81 byte
u162 byte
u32 / i324 byte
f324 byte
sbyte string mentah

6. Client mana yang boleh mengirim

Dengan client_mod: true, hanya client yang menambahkan +knight-rpc pada version string ClientJoin yang diterima. Selain itu diabaikan diam-diam, jadi client 0.3.7 biasa tidak bisa memicu handler.

text
Version string ClientJoin: 0.3.7+knight-rpc
bash
./knight-client -host 127.0.0.1 -port 7777 -name RPCBot     -customrpc 200 -rpc1 42 -rpc2 8

7. Helper

FungsiHasilKegunaan
HandleCustomRPC(id, handler, options)boolDaftarkan; false bila id/opsi ditolak
SendCustomRPC(playerid, id, payload)boolSatu pemain; -1 = broadcast
RPCPack(tag, value, ...)stringBangun payload little-endian
CustomRPCIds()arrayId yang terdaftar
LastCustomRPCStatus()stringok, ignored, too_large, rate_limited, no_client_mod

8. Model keamanan

9. Banyak handler: HandleRPC

HandleCustomRPC memasang satu handler per id. HandleRPC memasang banyak: masing-masing punya priority dan filter payload opsional, dijalankan dari prioritas tertinggi, dan yang pertama cocok mengonsumsi paket. Bila tidak ada yang cocok, paket diabaikan.

knight
HandleRPC(230, onFallback, { priority: 1, max_size: 4096, rate_limit: 20 });
HandleRPC(230, onExact, {
    priority: 50,
    direction: "incoming",
    filter: { match: "prefix", bytes: "AA" }
});
OpsiDefaultArti
priority0Lebih tinggi dijalankan lebih dulu (-1000..1000)
directionincomingincoming, outgoing, atau both
max_size4096Payload di atas ini melewati handler
rate_limit0Paket per detik untuk handler ini
client_modfalseWajibkan capability +knight-rpc
filtercocok apa pun{ match, bytes, offset, length }

Handler dan HandleCustomRPC hidup bersama: engine mencoba rantai HandleRPC dulu, lalu handler HandleCustomRPC untuk id yang sama.

10. Filter payload

MatchBenar bila
anyPayload diterima (default)
exactWindow yang diperiksa sama dengan bytes
prefixWindow diawali bytes
containsbytes ada di mana pun dalam window
bytesSama seperti contains, untuk data biner

offset (default 0) dan length (default sampai akhir) menentukan window sebelum pencocokan. Nilai di luar batas tidak pernah cocok dan tidak membuat crash.

11. CheckRPC

CheckRPC(id, payload, options) adalah predikat murni: tidak mendaftarkan apa pun dan mengembalikan apakah id dan payload cocok dengan kriteria. Berguna di dalam handler untuk merutekan berdasarkan header, atau sebelum mengirim balasan.

OpsiArti
directionDivalidasi agar simetris dengan HandleRPC
matchexact, contains, prefix, bytes, atau any
bytesByte yang dicari
offsetAwal window
lengthPanjang window
playeridBila diisi (>= 0), pengirim harus terhubung

12. Mengelola handler

FungsiHasilKegunaan
HandleRPC(id, handler, options)boolTambah handler berprioritas
UnregisterRPC(id)boolHapus semua entri HandleRPC untuk id
RPCHookCount(id)intJumlah entri HandleRPC
Warning
Id protokol bawaan (chat, ClientJoin, ServerCommand, dialog, sync...) ditolak kedua API, jadi RPC internal tidak bisa dioverride.