Aller au contenu

Les Répertoires et création d'un projet

https://developer.valvesoftware.com/wiki/Source_SDK_Files_and_Directory_Structure

Ce chapitre à pour but de vous expliquer comment marche le système de fichier d'un jeu qui marche avec le Source. Pour placer correctement vos différentes ressources, il faut crée un fichier GameInfo.txt pour indiquer de quel type de jeu qu'il s'agit.

📁 Répertoire Racine

Les jeux source on ce système de répertoire

Le Dossier Bin, possède les outils et les bibliothèques du moteur, aller ici pour trouver Hammer.

Le dossier avec les données (hl2 pour Half-Life 2, left4dead2 pour Left4 Dead 2, etc.)

Vous pouvez trouver les fichiers de votre jeu sur les paramètres devotre jeu Steam, cliquer sur l'engrenage puis sur fichiers locaux.

-Des dossiers de données supplémentaire lier au langues ou DLC (ce n'est pas très important pour le moment)

📁 [Jeu Source]
├── 📁 bin/                    ← Outils et DLLs du moteur
│   ├── hammer.exe             (Éditeur de maps)
│   ├── hlmv.exe               (Model Viewer)
│   ├── studiomdl.exe          (Compilateur de modèles)
│   ├── vtex.exe               (Compilateur de textures)
│   └── vbsp.exe, vvis.exe, vrad.exe (Compilateurs de maps)
│
├── 📁 [nom_du_jeu]/           ← Données du jeu (hl2, csgo, tf, etc.)
│   ├── gameinfo.txt
│   ├── 📁 maps/
│   ├── 📁 materials/
│   ├── 📁 models/
│   ├── 📁 scripts/
│   └── 📦 pak01_dir.vpk       (Archives compressées)
│
└── 📁 [nom_du_jeu]_[langue]/  ← Fichiers de localisation
    └── 📦 resource/

Création de projet et répertoires des données

(Si ces dossiers n'apparaissent pas, c'est normal, ils sont pour la plupart compressé en .vpk)

Dans les fichiers du jeu dont nous voulons en faire un mod crée un dossier avec le nom du mod dans notre exemple, nous allons l'appeler "custom"

⚠️ Important : Le nom ne doit contenir que : - Lettres minuscules (a-z) - Chiffres (0-9) - Underscores (_) - Pas d'espaces, pas de caractères spéciaux

Dans ce dossier, nous allons créer plusieurs dossiers voici leurs utilités

📁 [votre_mod]/
├── 📄 gameinfo.txt           ← OBLIGATOIRE
│
├── 📁 bin/                   ← DLLs du mod (code compilé)
│   ├── server.dll            (Logique serveur)
│   └── client.dll            (Logique client)
│
├── 📁 cfg/                   ← Fichiers de configuration
│   ├── autoexec.cfg          (Exécuté au démarrage)
│   ├── config.cfg            (Configuration joueur)
│   └── server.cfg            (Configuration serveur)
│
├── 📁 maps/                  ← Maps compilées (.bsp)
│   └── dm_mymap.bsp
│
├── 📁 mapsrc/                ← Sources des maps
│   ├── dm_mymap.vmf          (Fichier Hammer)
│   └── 📁 prefabs/           (Préfabriqués réutilisables)
│
├── 📁 materials/             ← Textures et matériaux
│   ├── 📁 custom/
│   │   ├── ma_texture.vmt    (Définition matériau)
│   │   └── ma_texture.vtf    (Texture compilée)
│   └── 📁 models/
│
├── 📁 materialsrc/           ← Sources des textures
│   └── 📁 custom/
│       ├── ma_texture.tga    (Source texture)
│       └── ma_texture.txt    (Paramètres vtex)
│
├── 📁 models/                ← Modèles compilés
│   └── 📁 props/
│       ├── mon_prop.mdl      (Modèle)
│       ├── mon_prop.vvd      (Données vertex)
│       ├── mon_prop.dx90.vtx (Optimisation DirectX)
│       └── mon_prop.phy      (Collision physique)
│
├── 📁 modelsrc/              ← Sources des modèles
│   └── 📁 props/
│       ├── mon_prop.qc       (Script de compilation)
│       ├── mon_prop.smd      (Mesh)
│       ├── mon_prop.blend    (Fichier Blender)
│       └── 📁 textures/
│
├── 📁 particles/             ← Systèmes de particules
│   └── my_particles.pcf
│
├── 📁 resource/              ← Interface utilisateur
│   ├── 📁 fonts/             (Polices)
│   ├── 📁 flash/             (Scaleform UI)
│   ├── GameMenu.res          (Menu principal)
│   └── closecaption_*.txt    (Sous-titres)
│
├── 📁 scenes/                ← Scènes de dialogue
│   └── npc_scene.vcd
│
├── 📁 scripts/               ← Scripts du jeu
│   ├── weapon_mygun.txt      (Définition arme)
│   ├── npc_sounds.txt        (Sons NPCs)
│   └── surfaceproperties.txt (Propriétés surfaces)
│
├── 📁 sound/                 ← Fichiers audio
│   └── 📁 custom/
│       └── mon_son.wav
│
├── 📁 media/                 ← Vidéos
│   └── intro.bik
│
├── 📁 expressions/           ← Expressions faciales NPCs
│   └── npc_expressions.txt
│
├── 📁 save/                  ← Sauvegardes
│   └── autosave01.sav
│

Les dossiers sources (modelsrc, src, materialsrc) sont uniquement destinée aux développeurs. Ils contiennent les fichiers non compilé pour le moteur.

📄 Le fichier GameInfo.txt

Dans le dossier de votre mod, vous devez avoir un gameinfo.txt qui contient les informations primaires de votre mod (Titre, SearchPath, etc...).

Le fichier gameinfo.txt décrit votre mod. Il contient des métadonnées comme le nom du mod, un lien vers votre site web et un manuel, et définit comment on peut y accéder. Ce fichier est stocké dans le dossier principal de votre mod, et il fait office de marqueur pour Steam, Source et le Source SDK pour détecter son existence.

cf. Exemple GameInfo.txt

Le fichier gameinfo.txt est obligatoire. C'est la carte d'identité de votre mod.

Structure de base

"GameInfo"
{
    game    "Mon Super Mod"                // Nom affiché dans Steam
    title   "Mon Super Mod"                // Titre dans le menu
    type    singleplayer_only              // Type de jeu

    gamelogo 1                             // Afficher le logo
    developer   "Votre nom"                // Développeur
    developer_url "https://monsite.com"    // Site web
    manual  "https://monsite.com/help"     // Manuel utilisateur

    icon    "resource/icon"                // Icône du mod

    FileSystem
    {
        SteamAppId  220        // ID Steam du jeu de base (HL2 = 220)

        SearchPaths
        {
            // Ordre de recherche des fichiers (du plus prioritaire au moins)

            game+mod            |all_source_engine_paths|monmod
            game                |all_source_engine_paths|hl2
            platform            |all_source_engine_paths|platform
        }
    }
}

Types de jeu disponibles

singleplayer_only       → Uniquement solo (Half-Life 2)
multiplayer_only        → Uniquement multi (CS:S, TF2)
both                    → Solo + Multi (Garry's Mod)

IDs Steam communs (SteamAppId)

Jeu ID
Half-Life 2 220
Half-Life 2: Episode One 380
Half-Life 2: Episode Two 420
Team Fortress 2 440
Counter-Strike: Source 240
Left 4 Dead 500
Left 4 Dead 2 550
Portal 400
Portal 2 620
Source SDK Base 2013 SP 243730
Source SDK Base 2013 MP 243750

SearchPaths expliqués

Les SearchPaths définissent où Source cherche les fichiers. L'ordre est important !

SearchPaths
{
    // 1. Votre mod (PRIORITÉ MAXIMALE)
    game+mod    |all_source_engine_paths|monmod

    // 2. Jeu de base
    game        |all_source_engine_paths|hl2

    // 3. Épisode 2 (si vous voulez ses assets)
    game        |all_source_engine_paths|episodic
    game        |all_source_engine_paths|ep2

    // 4. Platform (fichiers système)
    platform    |all_source_engine_paths|platform
}

Fonctionnement : Source cherche d'abord dans monmod/, puis dans hl2/, etc. Si un fichier existe dans plusieurs endroits, c'est celui du premier dossier qui est utilisé.

Exemple complet : Mod basé sur HL2

"GameInfo"
{
    game    "My Half-Life 2 Mod"
    title   "MYHL2MOD"
    type    singleplayer_only

    gamelogo 1
    developer   "MonStudio"
    developer_url "https://monstudio.com"
    icon    "resource/icon"

    FileSystem
    {
        SteamAppId  220  // Half-Life 2

        SearchPaths
        {
            // Notre mod
            game+mod            |all_source_engine_paths|mymod

            // Half-Life 2 et ses épisodes
            game                |all_source_engine_paths|episodic
            game                |all_source_engine_paths|hl2

            // Platform
            platform            |all_source_engine_paths|platform
        }
    }
}

Exemple : Mod multiplayer basé sur Source SDK 2013

"GameInfo"
{
    game    "My Multiplayer Mod"
    title   "MYMPMOD"
    type    multiplayer_only

    gamelogo 1
    developer   "MonStudio"
    developer_url "https://monstudio.com"

    FileSystem
    {
        SteamAppId  243750  // Source SDK Base 2013 MP

        SearchPaths
        {
            game+mod            |all_source_engine_paths|mymod
            game                |all_source_engine_paths|hl2mp
            game                |all_source_engine_paths|hl2
            platform            |all_source_engine_paths|platform
        }
    }
}

Ajouter des custom folders

Pour utiliser le dossier custom/ (comme Counter-Strike: Source) :

SearchPaths
{
    game+mod+custom_mod    |all_source_engine_paths|monmod/custom/*
    game+mod               |all_source_engine_paths|monmod
    game                   |all_source_engine_paths|hl2
    platform               |all_source_engine_paths|platform
}

Cela permet aux joueurs de créer des sous-mods dans monmod/custom/leurmod/.


🎨 Organisation des assets

Conventions de nommage

Maps (.bsp)

[prefix]_[nom].bsp

Exemples:
dm_desert          → Deathmatch
cs_office          → Counter-Strike
cp_dustbowl        → Control Point
pl_badwater        → Payload
ar_shoots          → Arena

Préfixes courants : - dm_ = Deathmatch - cs_ = Counter-Strike - de_ = Defuse (CS) - cp_ = Control Point (TF2) - pl_ = Payload (TF2) - d1_ = Day 1 (campagne HL2)

Textures (.vmt/.vtf)

materials/
└── [categorie]/
    └── [nom]_[type].vtf

Exemples:
materials/brick/brickwall01.vtf
materials/metal/metalwall01_normal.vtf
materials/concrete/floor01_spec.vtf

Suffixes courants : - _normal = Normal map - _spec = Specular map - _ref = Reflection map - _mask = Masque alpha

Modèles (.mdl)

models/
└── [categorie]/
    └── [nom].mdl

Exemples:
models/props_c17/furniturechair001a.mdl
models/weapons/w_rifle.mdl
models/player/soldier.mdl

Catégories courantes : - props/ = Objets statiques - props_c17/ = Props City 17 - weapons/ = Armes - player/ = Modèles joueurs - vehicles/ = Véhicules

Sons (.wav/.mp3)

sound/
└── [categorie]/
    └── [nom].wav

Exemples:
sound/weapons/pistol/pistol_fire1.wav
sound/player/footsteps/concrete1.wav
sound/ambient/wind/wind_hit1.wav

Hiérarchie de priorité

Lorsque plusieurs mods/dossiers contiennent le même fichier :

PRIORITÉ HAUTE
    ↓
1. Votre mod (monmod/)
    ↓
2. Custom folders (monmod/custom/*/)
    ↓
3. Jeu secondaire (episodic/, hl2mp/)
    ↓
4. Jeu de base (hl2/)
    ↓
5. Platform (platform/)
    ↓
PRIORITÉ BASSE

Exemple pratique :

Si vous avez : - monmod/materials/metal/wall.vtf - hl2/materials/metal/wall.vtf

C'est la version de monmod/ qui sera utilisée !


🚀 Lancement et test du mod

Méthode 1 : Ligne de commande Steam

  1. Clic droit sur votre jeu de base dans Steam
  2. PropriétésOptions de lancement
  3. Ajoutez : -game "chemin\vers\monmod"

Exemple :

-game "D:\Steam\steamapps\common\Half-Life 2\monmod"

Méthode 2 : Créer un raccourci

Windows : 1. Trouvez hl2.exe (ou autre) 2. Clic droit → Créer un raccourci 3. Propriétés du raccourci 4. Dans "Cible", ajoutez :

"C:\...\hl2.exe" -game "C:\...\monmod"

Paramètres de lancement utiles :

-game monmod          → Charger le mod
-console              → Activer la console
-dev                  → Mode développeur
-windowed             → Mode fenêtré
-w 1280 -h 720        → Résolution
-novid                → Pas de vidéo d'intro
-nosteam              → Pas de connexion Steam
+map dm_test          → Charger une map au démarrage

Exemple complet :

"C:\...\hl2.exe" -game monmod -console -dev -windowed -w 1280 -h 720 +map dm_test

Méthode 3 : Source SDK

Pour les mods basés sur Source SDK 2013 :

  1. Ouvrez Steam
  2. BibliothèqueOutils
  3. Installez Source SDK Base 2013 (SP ou MP)
  4. Clic droit → PropriétésOptions de lancement
  5. Ajoutez -game "chemin\vers\monmod"

Méthode 4 : Hammer Editor

Pour tester rapidement dans Hammer :

  1. Ouvrez Hammer
  2. ToolsOptions
  3. Game Configurations
  4. Add
  5. Configurez :
  6. Game Directory : C:\...\monmod
  7. Hammer Executable : C:\...\bin\hammer.exe
  8. Game Executable : C:\...\hl2.exe -game "$gamedir"

Vérifier que le mod fonctionne

Une fois lancé, ouvrez la console (~) et tapez :

version

Vous devriez voir votre mod mentionné. Sinon :

gamedir

Affiche le répertoire actuel du jeu.


✅ Bonnes pratiques

Organisation du code

src/
├── README.md                 ← Documentation du code
├── BUILD.md                  ← Instructions de compilation
│
├── game/
│   ├── client/              ← Code client (UI, prédiction, etc.)
│   │   ├── hl2/
│   │   └── custom/          ← Votre code client
│   │
│   ├── server/              ← Code serveur (gameplay, NPCs, etc.)
│   │   ├── hl2/
│   │   └── custom/          ← Votre code serveur
│   │
│   └── shared/              ← Code partagé client/serveur
│       └── custom/
│
└── materialsystem/
    └── stdshaders/          ← Vos shaders personnalisés

Lancer le mod

Fait la commande -game «yourModName» (dans notre cas custom)