GW-Drag-lib

GW Draggable Lib — Guide complet (GitBook)

Ce guide explique comment installer, configurer et utiliser la librairie de drag & drop d’objets, l’UI intégrée (steps + contrôles), ainsi que les fonctions utilitaires d’animation et d’effets. Le but est qu’un débutant puisse tout utiliser rapidement.

Présentation

  • Déplacement d’objets 3D à la souris avec surbrillance et rotation à la molette

  • Interactions “drag → drop” validées par modèles, avec distance et tolérance

  • UI “Étapes” (steps) à gauche et “Contrôles” en bas à gauche

  • Timer d’étapes (optionnel)

  • Localisation (FR/EN/ES)

  • Affichage d’un label près du curseur (configurable)

  • Fonctions utilitaires prêtes à l’emploi (shake, move, fade, rotation smooth)

  • Sécurité/robustesse: auto-stop si le joueur meurt/ragdoll/chute libre, callbacks encapsulés en pcall

Limitations actuelles

  • Drag d’un seul objet à la fois (pas de “multi-drag” simultané). Vous pouvez toutefois afficher/spawner plusieurs objets à manipuler dans une session.

Installation

  1. Placer la ressource dans votre serveur:

  • Dossier: resources/[LOCK]/gw-draggable-lib

  1. Manifeste

  • fxmanifest.lua inclut déjà:

    • client_scripts: config.lua, functions.lua, Draggable.lua, exemple.lua

    • ui_page + files pour l’UI

  1. Démarrer la ressource

  • ensure gw-draggable-lib dans votre server.cfg

Configuration globale (config.lua)

  • Debug et couleur de surbrillance:

  • Constantes du drag:

  • Caméra:

  • UI “Steps”:

  • Locale:

  • Label du nom sous le curseur:

  • Noms de modèles (affichés au survol) centralisés:

API Client

1) Draggable:Register(config)

Enregistre une “session” avec:

  • props: objets à spawner

  • interactions: règles “drag → drop” et callbacks

  • steps: liste d’étapes (UI)

  • stepsTitle (optionnel)

  • stepsMaxTimeSeconds ou stepsMaxTimeMs (optionnels)

  • onTimeout (optionnel)

  • onStop (optionnel)

Exemple:

2) Draggable:Start([targetOrOptions])

Démarre l’interaction.

  • Paramètre facultatif:

    • Entité à focus (handle)

    • Coords à focus (vector3)

    • Table d’options: { focusEntity=..., focusCoords=..., enableCamera=true/false, camera={...} }

Exemples:

3) Draggable:Stop()

Arrête l’interaction proprement:

  • Restaure collision/Freeze, détruit les props de la session

  • Masque l’UI “Steps” et la barre “Contrôles”

  • Appelle onStop si défini

4) Draggable:SetCustomCamera(camHandle)

Spécifie une caméra custom à utiliser pour le raycast souris.

Structure d’une session

  • props[]:

    • model: string (nom de modèle) ou hash

    • coords: vector3

    • rotation: vector3

    • name (optionnel): si non fourni ici, le nom est récupéré dans Config.props

  • interactions[]:

    • drag: string/hash ou table de modèles autorisés

    • drop: string/hash ou table de modèles cibles

    • stepId (optionnel): id d’étape à cocher si drop valide

    • maxDistance (optionnel): distance de validation “drag vs drop”

    • callback(draggingProp, dropTarget): appelé quand la règle est validée

  • steps[]:

    • id, title, description

  • stepsMaxTimeSeconds / stepsMaxTimeMs (optionnels)

    • si non complété à temps: onTimeout() + stop

UI intégrée

  • Panneau “Étapes” (gauche) avec liste des steps

  • Barre “Contrôles” (bas gauche) avec:

    • Souris G.: saisir/lâcher

    • Molette: rotation

    • ESC: quitter

Note: lorsque toutes les steps sont cochées, l’UI se masque (selon config et flux). Si vous arrêtez juste après, l’UI se fermera immédiatement.

Contrôles par défaut

  • Clic gauche (ATTACK): saisir/lâcher l’objet

  • Molette haut/bas: rotation Z +/- pendant le drag

  • ESC: quitter sans valider

Astuce: ajustez ROTATION_SPEED dans Config.CONSTANTS pour une rotation plus lente/rapide.

Validation des drops

  • Matching par hash modèle: drag et drop acceptent noms ou hashes (ou listes)

  • Si le raycast sous la souris n’attrape pas la bonne cible, fallback sur la cible valide la plus proche dans un rayon (DROP_PROXIMITY_THRESHOLD)

  • Distance de validation entre l’objet lâché et la cible (DROP_VALIDATE_MAX_DISTANCE global ou interaction.maxDistance)

  • Si les conditions sont OK:

    • stepId (si défini) est coché

    • puis callback(draggingProp, dropTarget) est exécuté (protégé par pcall)

Fonctions utilitaires (animations/effets)

Disponibles côté client (via functions.lua). Signatures et exemples:

  • MoveEntitySmoothly(entity, targetCoords, duration)

    • Déplace en douceur vers targetCoords en duration ms

    • Exemple:

  • SetRotationSmoothly(entity, targetRotation, duration)

    • Fait pivoter progressivement jusqu’à targetRotation

    • Exemple:

  • Shakeprops(entity, duration?, intensity?, smoothness?)

    • “Tremblement” doux d’un objet (par défaut 2500ms, intensité 0.03, lissage 0.05)

    • Exemple:

  • DeleteEntityFade(entity, duration?)

    • Fade out puis suppression de l’entité (par défaut 1000ms)

  • Helpers math:

    • Normalize(v), CrossProduct(v1, v2), DotProduct(v1, v2), LerpColor(c1, c2, t), CT(table)

Localisation

  • Définir Config.Locale ('fr', 'en', 'es')

  • Les libellés UI (steps title, contrôles) suivent cette locale

Bonnes pratiques

  • Définissez Config.props pour nommer vos modèles une seule fois; vous n’aurez pas à répéter name dans chaque session

  • Ajustez DROP_VALIDATE_MAX_DISTANCE si vos modèles sont gros/petits pour éviter des validations “trop faciles” ou “impossibles”

  • Dans vos callbacks, utilisez les utilitaires MoveEntitySmoothly, SetRotationSmoothly, Shakeprops, DeleteEntityFade pour donner du pep’s

  • Pour plusieurs interactions, utilisez des stepId différents pour guider l’utilisateur étape par étape

Exemple de bout en bout

Dépannage

  • Le menu pause s’ouvre avec ESC

    • Config.CONSTANTS.CONTROLS.DISABLED inclut déjà 199, 200. Assurez-vous que Config.lua est bien chargé en premier (fxmanifest).

  • Le label du nom ne s’affiche pas

    • Assurez-vous d’avoir un name dans Config.props pour ce modèle (ou directement dans propInfo.name).

  • Le drop valide trop loin / trop près

    • Ajustez DROP_VALIDATE_MAX_DISTANCE (global) ou interaction.maxDistance (local).

  • Les steps ne se cochent pas

    • Vérifiez stepId dans interaction correspond exactement à l’id d’une step dans steps.

    • Vérifiez les modèles drag/drop (noms GTAV corrects).

Last updated