TTH Job Center — Fiche technique Généralités Ressource : tth_jobcenter, en fx_version 'cerulean' avec lua54. Côté client : client/ped.lua, client/borne.lua, client/placement.lua. Côté serveur : server/main.lua. Standalone, aucune dépendance à un framework (ESX, QBCore, Qbox ou aucun). Dépendances : ox_lib et ox_target. Optionnelle : object_gizmo, utilisée seulement par la commande de placement. Prop streamé Modèle custom tth_jobcenter_borne, en .ydr + .ytyp, chargé via data_file 'DLC_ITYP_REQUEST'. Dimensions : 0,66 × 0,40 × 1,90 m. Écran portrait de 0,54 × 0,96 m. 5 textures intégrées au modèle. Shaders default.sps pour le corps, emissive.sps pour l’écran et le bandeau. Collision : une boîte simple, déclarée objet, détectable par les raycasts d’ox_target. Distance d’affichage du .ytyp : 120 m. Rendu de l’écran (DUI) Une seule DUI en 1080×1920, partagée entre toutes les bornes. Elle est créée à l’apparition de la première borne et détruite quand plus aucune n’est à portée. L’image est appliquée avec AddReplaceTexture sur la texture tth_jc_screen du modèle. Aucune autre texture du jeu n’est modifiée. La page de la borne est en HTML, CSS et JavaScript sans librairie, avec les polices intégrées. Lua et l’écran communiquent par SendDuiMessage et des callbacks NUI. Interaction avec les bornes Deux points d’entrée ox_target pour la même option : l’entité de la borne et une zone de boîte. La taille de la zone, son décalage et la distance se règlent dans la config. À l’utilisation : Le joueur est placé devant la borne. Une caméra scriptée se cale face à l’écran. Le personnage devient invisible pour le joueur lui-même uniquement. Le HUD et la minimap sont masqués, puis remis dans leur état d’avant à la fermeture. Saisie : la souris et le clavier passent par l’overlay NUI (SetNuiFocus). Les coins de l’écran sont projetés une seule fois à l’écran du joueur, puis le JavaScript convertit chaque position du curseur en coordonnées de la DUI. Les mouvements de souris sont transmis à 30 Hz au maximum, et seulement quand la souris bouge. Les clics et la molette sont transmis à l’événement (SendDuiMouseMove/Down/Up/Wheel). Pendant l’utilisation, la boucle par image se limite à SetEntityLocallyInvisible. Sortie : Échap, Retour, clic droit ou le bouton « Quitter » de l’interface. Agent d’accueil PNJ configurable, a_m_y_business_02 par défaut. Il apparaît et disparaît par proximité (lib.points, 60 m). Le PNJ est invincible, figé, insensible aux événements, avec un scénario d’ambiance. Cinématique : caméra scriptée sur l’os de la tête et bandes cinéma. L’audio (html/sounds/accueil.mp3) est lu dans l’overlay NUI, avec sous-titres. Animation des lèvres pendant la lecture, avec le bon jeu d’animations selon le sexe du PNJ. La fin de la cinématique est déclenchée par l’événement ended du fichier audio, avec un délai maximum de sécurité. En cas d’erreur, un pcall remet la caméra, les contrôles et l’état du joueur à zéro. GPS et carte Point GPS classique posé avec SetNewWaypoint. Un thread vérifie la distance une fois par seconde et retire le point à l’arrivée, à une distance configurable. Le script ne retire que le point GPS qu’il a lui-même créé. Blip du Job Center configurable : icône, couleur, taille, libellé, activation. Placement Commande /jc_place [index], restreinte par ACE avec command.jc_place. Le serveur se contente de relayer la commande au client. Deux modes de placement : avec le gizmo 3D d’object_gizmo ; sans lui, au clavier : raycast depuis la caméra, molette pour la rotation, flèches pour la hauteur. Le résultat est un bloc de vec4 affiché en F8, copié dans le presse-papier avec lib.setClipboard et appliqué à chaud. Configuration (config.lua) Config.Ped : modèle, position, scénario, ox_target, audio, sous-titre, caméra. Config.Blip : blip du Job Center. Config.Borne : modèle, texture remplacée et coins de l’écran ; nombre de bornes, positions ; ox_target ; caméra, distance du joueur, rayon d’apparition. Config.Jobs : id, t