Retour

tk-phone

Système de téléphonie physique complet et immersif pour FiveM (QBCore).

Contributeurs


📖 Le Contexte : "L'objet avant le script"

Dans la majorité des serveurs RP, le téléphone est un menu immatériel lié magiquement au joueur. Pour PakeTekos, je voulais introduire une dimension de réalisme supplémentaire : le téléphone est un item physique doté d'un numéro de série unique.

Cette approche change radicalement le gameplay : si un joueur perd son téléphone ou se le fait dérober, le nouveau possesseur accède à l'intégralité des messages, contacts et photos contenus dans l'appareil. C'est un moteur de scénarios RP (chantage, enquête, vol de données) que peu de serveurs proposent.

📱 Une Interface "App Store" Moderne

Propulsé par ma stack tk-ui (Vue/Nuxt), le téléphone propose une expérience fluide proche d'un smartphone moderne :

  • VoIP Intégrée : Appels en temps réel via pma-voice avec gestion des canaux audio dédiés.
  • Système d'Apps : Une architecture modulaire permettant d'installer/désinstaller des applications (GPS, SMS, Store, Paramètres).
  • Notifications Persistantes : Un système de pastilles (unread counts) qui survit aux reconnexions.

🎯 Mon Rôle : Lead Developer & Architecte Système

J'ai conçu l'intégralité du pont entre le moteur de jeu (Lua) et l'interface (Vue.js), en mettant l'accent sur la performance brute côté serveur.

1. Optimisation : Le Cache en $O(1)$

Gérer des milliers de messages et d'appels peut rapidement saturer une base de données. Pour éviter cela, j'ai implémenté un système de cache serveur utilisant des Maps synchronisées. Cela permet des recherches quasi instantanées par numéro de série ou par numéro de téléphone, sans solliciter la base MariaDB à chaque interaction.

2. UX : NUI Focus & Immersion

Le plus gros défi des interfaces sur FiveM est la perte de contrôle du personnage. J'ai développé une boucle de contrôle intelligente qui gère le focus :

  • Mode Souris dynamique : Activation du curseur via une touche, tout en bloquant les actions de combat pour éviter les tirs accidentels.
  • Input Suspension : Lorsque le joueur tape un message, les touches du jeu sont suspendues pour éviter que le personnage ne saute ou ne coure dans tous les sens en écrivant.

🧠 Sous le capot : Logique Métier & Sécurité

⚙️ Le Flow d'Appel (State Machine)

La gestion des appels est un défi de synchronisation. J'ai mis en place une machine à états robuste pour gérer les cas critiques :

  • Accusés de réception : Si le destinataire raccroche avant que le serveur n'ait validé l'ID de l'appel, une "annulation pendante" est enregistrée pour éviter les appels fantômes.
  • Mode Anonyme : Un système de masquage de numéro intégré nativement dans le flux de données.
-- Exemple de gestion du cache d'inventaire
AddEventHandler('qb-inventory:server:specialSlotUpdated', function(identifier, slot, inventoryItem, action)
    if slot ~= Config.PhoneSlot then return end
    -- Synchronisation instantanée du matériel avec le propriétaire virtuel
    if action == 'add' then
        Cache.ActiveSIMs[phone_number] = Player.citizenid
    elseif action == 'remove' then
        Cache.ActiveSIMs[phone_number] = nil
    end
end)

🔭 La Vision et la Suite

tk-phone est le centre névralgique de l'interaction sociale sur le serveur. Les prochaines étapes incluent :

  • Partage de Médias : Envoi de photos prises in-game via un système d'upload vers un CDN (Imgur/Discord).
  • Dark Web : Une application cachée accessible uniquement via certains items ou lieux spécifiques.
  • NPC Interactions : Possibilité pour des PNJ de contacter le joueur pour lui confier des missions en fonction de son historique.

Expertise technique : Vue.js 3, Nuxt, Lua, SQL (MariaDB), VoIP integration, State Management, UI/UX Design.