Plugin Voice
Voice proximity yang tidak menyentuh protokol game.
SA-MP 0.3.7 dan 0.3.DL tidak punya channel voice, jadi audio tidak bisa lewat RakNet. Knight memakai sidecar: server menentukan siapa mendengar siapa, dan audio dibawa transport terpisah (WebRTC atau lainnya). Latensi gameplay tidak terpengaruh karena audio tidak pernah masuk tick.
text
game client ── Knight server ── voice sidecar ── audio transport ── game client
│ │
player::update proximity groups
1. Menjalankan
bash
# 1. sidecar (separate process)
./knight-voice -addr :7788 -range 30
# 2. server with the voice plugin compiled in
KNIGHT_VOICE_URL=http://127.0.0.1:7788 ./knight-server -cfg "" -gamemode Gamemodes/voice.sa
| Variabel | Default | Arti |
|---|---|---|
KNIGHT_VOICE_URL | http://127.0.0.1:7788 | alamat sidecar |
KNIGHT_VOICE_RANGE | 30 | radius pendengaran dalam unit dunia |
2. Native
| Native | Hasil | Kegunaan |
|---|---|---|
VoiceJoin(playerid) | bool | Daftar ke sidecar |
VoiceLeave(playerid) | bool | Hapus dari sidecar |
VoiceMute(playerid, bool) | bool | Senyapkan audio keluar |
VoiceDeafen(playerid, bool) | bool | Senyapkan audio masuk |
VoicePeers(playerid) | string | Id dipisah koma yang bisa didengar |
VoiceInRange(playerid, other) | bool | Cek lokal, tanpa panggilan sidecar |
VoiceSetRange(float) | bool | Ubah radius |
3. Perilaku otomatis
| Event | Action |
|---|---|
player::spawn | masuk room voice |
player::update | kirim posisi |
player::disconnect | keluar dari room |
Note
Hook selalu mengembalikan true. Bila sidecar mati, gameplay tetap jalan dan
VoiceJoin mengembalikan false.4. Contoh
knight
player::spawn() {
if (!VoiceJoin(playerid)) {
SendClientMessage(playerid, "Voice tidak tersedia.");
}
};
player::command("/who") {
SendClientMessage(playerid, "Dengar: [{VoicePeers(playerid)}]");
};
player::command("/mute") {
VoiceMute(playerid, true);
};
5. Aturan keanggotaan
| Aturan | Efek |
|---|---|
| Same world | Pemain di world/interior lain tidak mendengar apa pun |
| Within range | Default 30 unit, jarak 3D |
| Not muted | Pembicara yang di-mute tidak terdengar siapa pun |
| Deafened | Pendengar itu tidak mendengar apa pun, tapi masih terdengar |
-teams | Bila diaktifkan di sidecar, hanya pemain satu tim terhubung |
6. Menguji dengan bot
bash
./knight-voice -addr 127.0.0.1:7788 -range 30 &
./knight-voicebot -url http://127.0.0.1:7788 -bots 5 -steps 8
Bot mendaftarkan beberapa pemain, menggerakkan mereka, mute, deafen, lalu leave; gagal bila ada pendengar yang mendengar pemain mute, jauh, beda world, atau sudah keluar.
7. Yang tidak termasuk
Penangkapan audio di dalam client SA-MP, yang tidak bisa dibawa protokol; pemain memakai browser/aplikasi terpisah. Sidecar tidak terikat transport: pion/webrtc sudah menjadi dependency bila ingin menambah SFU.