TF2 Prefab et tuto map "PL"

  • Initiateur de la discussion
  • Administration
Seb

Seb

El Dictator
Membre du Staff
Messages
1 875
Score réaction
454
Points
370
Qu'est-ce que "payload" ?

Une map "pl" est simplement une map où se trouve une bombe montée sur un wagonnet signé "Cry Some more" par le Heavy. Ce wagonnet peut ou non être équipé d'un dispenser.

En général l'équipe bleu doit faire avancer le wagonnet à son terminus pour gagner.

Dans certaines cartes, les deux équipes peuvent le pousser mais ce n'est plus vraiment le même type de jeu.


Commençons!

Déjà lancez et Hammer² et créez une nouvelle map.
Créez une salle vide ayant une superficie de 2048 par 1024 et une hauteur de 512.

Je vous laisse le soin de placer les entités de base, ou texturer la map. Vous pouvez faire une orange box et la compiler en BSP only. Nous ne faisons que tester le mode de jeu. Les détails viendront après.

Note: la map prefab à des spawns et tous ce qu'il faut pas de panique.

Voici un aperçus des entités de "base" qu'il vous faudra :

tuto_pl1.png



Et oui tous ça!
On va donc commencer de droite à gauche.

Créez l'entité game_round_win :
  • Name : red_win
  • Team : Red
  • Force Map Reset : yes
  • Switch teams on map win? : yes

Cela fait, créez un team_round_timer
  • Name : round_timer[/*:m]
  • Start Disabled : No[/*:m]
  • Timer length (in seconds) : 300 (durée du round en secondes)
  • Max timer length (in seconds) : 0 (durée max que peut durée le round si l'on ajoute du temps. Mettre 0 si il n'y a pas de valeur max)
  • Start Paused : No [/*:m]
  • Setup timer length (in seconds) : 40 (c'est le temps de configuration en général que l'on met)
  • Reset time on round restart : Yes (on remet à zéro le compteur quand le round commence)
  • use countdown sounds : Yes (on demande à la dame de dire à haute voix : 5 4 3 2 1)
  • Show timer in the HUD : Yes (on affiche le temps sur le HUD)

Cette entité à des Outpus. Nous n'avons pas encore créé toutes les entités donc deux d'entre elles seront temporairement invalides, pas de panique.

Note: Les outpus sont écrits de la forme :
My outputnamed | Targets entities named | Via this input | With a parameter override of | After a delay in seconds of | Fire once only

Donc normalement, vous entrez les valeur entre pipe (symbole "|") les unes à la suites des autres dans la fenêtre Outputs après avoir cliqué sur Add)

On ajoute 3 outputs:
OnFinished | red_win | RoundWin || 0.00 | Yes
Un fois le round fini on déclare l'équipe rouge gagnante.

OnFinished | Blu_train | Stop || 0.00 | Yes
Une fois le round fini on va stopper le wagonnet.

OnSetupFinished | endsetuptime | Trigger || 0.00 | No
Une fois le temps de configuration fini, on appelle un logic_relay qui va faire tous se dont on a éventuellement besoin (on pourrait s'en passer). Ici, nous allons lui demander d'ouvrir les portes!

Bien, passons vite fait sur les entités cosmétiques que vous retrouverez dans la map préfabs:
- light_environnement
- shadow_control
- water_lod_control (bon j'ai pas d'eau mais si vous en mettez)
- env_fog_controller
- env_tonemap_controller (nommez le tone_map_global)

Réglez c'est entité comme vous le voulez !
passons à l'entité suivante : logic_auto
Elle n'a que des outputs (je fais main basse sur les trois output cosmétiques du tone_map):

OnMapSpawn |gamerules | SetBlueTeamRole | 2 |0.00 | No
On demande à l'entité qui gère les règles du jeu de définir l'équipe bleu comme l'équipe qui pousse le wagon (attaque).

OnMapSpawn |gamerules | SetRedTeamRole |1 |0.00 | No
On demande à l'entité qui gère les règles du jeu de définir l'équipe rouge comme l'équipe qui empêche la progression du wagon (défend).

OnMultiNewMap |gamerules | setredteamrespawnwavetime | 4 |0.00 | No
On définit le temps de respawn de l'équipe rouge. Cela peut varier en fonction des points de contrôles franchis. C'est un élément de gameplay important! La map prefab étant assez simple j'ai appliqué le même temps aux deux équipes.

OnMultiNewMap |gamerules | setblueteamrespawnwavetime | 4 |0.00 | No
Pareil qu'au dessus, mais pour l'équipe bleu.

Passons au logic_relay
  • Name: endsetuptime

Outputs :
OnTigger |blu_gp_door | Open || 0.00 | No
Toutes les entités de type 'porte' (door) qui étaient fermées, bloquant les joueurs Bleu, s'ouvriront!
Rappelez-vous, on crée cette entité pour gérer tous ce qui ce passe une fois le temps de configuration terminé!

OnTigger |cap_area | Enable || 0.00 | No
Nous y reviendrons quand le wagon sera créé. ça activera la zone qui détermine si un joueur bleu fait avancer ou non le wagon.

Passons aux classiques entités filtres, elles nous permettrons de n'autoriser que certaines entités dans certaines actions. Par exemple on va dire au wagon d'avancer quand un joueur est à côté de lui... Mais il nous faut savoir si le joueur est rouge, ou bleu. Car seul les bleus on le droit de faire avancer le wagon!

filter_activator_tfteam
  • Team : Red
  • Name : filter_team_red
  • Filter Mode : Allow entities that match criteria
  • Associated Control Point :

filter_activator_tfteam
  • Team : Blue
  • Name : filter_team_blue
  • Filter Mode : Allow entities that match criteria
  • Associated Control Point :

filter_activator_class
  • Name : noplayer
  • Filter Mode : Disallow entities that match criteria
  • Filter Classname : player

Ce dernier filtre nous permet d'appliquer un effet sur tout ce qui n'est pas un joueur.

Bien nous arrivons à une entité importante que nous avons déjà configuré : l'entité qui gère les règles du jeu.
Créez l'entité tf_gamerules nommé la gamerules. C'est tout!

Créez maintenant un team_train_watcher. Il en faut un par round. Nous allons travailler sur un seul round. Donc on en place un seul
  • Name : watcher
  • Start Disabled : No
  • Train to wathc. : Blu_train (quel train on suis)
  • Node that the path starts at. : blu_track (nom du path_track ou commence le wagon)
  • Node that the path ends at. : blu_track_cpe (nom du path_track ou le wagon est arrivé)
  • Linked path Track 1 : blu_track_cpm (path_track du premier point de contrôle)
  • Linked CP 1 : cp_mid (premier point de contrôle)
  • Linked path Track2 : blu_track_cpe (path_track du deuxième point de contrôle)
  • Linked CP 2 : cp_end (deuxième point de contrôle)
  • Linked path Track 3
  • Linked CP 3
  • Min Speed for Speed level 1 : 1
  • Min Speed for Speed level 2 : 60
  • Min Speed for Speed level 3 : 90

Cette entité permet d'afficher le chemin du wagon sur le HUD. Elle va même afficher les point de contrôle à une distance proportionnelle à la distance total que le wagon a à parcourir!

On a deux outputs :

OnTrainStartRecede | sparks | StartSpark || 0.00 | No
On va faire des petites étincelles toutes z'oulies quand le train recule!

OnTrainStartRecede | Blu_Train | SetSpeedDirAccel || -0.1 | No
Quand le train doit reculer on le fait reculer à la vitesse de 0.1 unité. Le chiffre -0.1 permet de le faire reculer "0.1" tout court le ferait avancer.

Note: JeffLane (valve) m'a répondu indirectement sur le wiki officiel. En effet ce output/inputs n'existe pas! Cela cause donc une erreur quand on fait ALT+P pour voir si on à des erreurs.

Il faut l'ajouter manuellement à votre fichier base.fgd En modifiant l'entité func_tracktrain par l'ajout de cette ligne :

Code:
input SetSpeedDirAccel(float): "Set new train speed direction acceleration. Use Negative value to backward"

Jeff nous fait savoir que le SDK sera mis à jours prochainement et que le FGD sera corriger. Libre à vous de mettre ce fix ou non. D'après lui il ne faut pas c'est pas bien! (qu'est-ce qu'il ont encore mal coder pour être si méfiant hein?!)

Bien continuons avec une autre entité!

team_control_point_master
  • Name :
  • Start disabled : No
  • Material for the RED Base icon : icon_base_red (texture de la base rouge sur le hud)
  • Material for the BLUE Base icon : icon_base_red (texture de la base bleu sur le hud)
  • Cap Layout :
  • Restrict team from winning : Red (les rouge ne peuvent pas gagner, si ils capturent tous les points de contrôle... il les ont tous dès le début)
  • Switch teams on map win : Yes (on change les équipes une fois le round terminé)
  • Scoring style : Add team score for each captured point
  • Play all rounds before changelevel : Changelevel normally
  • Rate at which to give cap points for area captures : 0.1


Allez c'est pas encore finit!
Passons au team_control_point_round
  • Name : stage_1
  • Start disabled : No
  • Print Name : (ce que vous voulez, ou rien. C'est le nom du round qu'on affiche)
  • Control points in this round : cp_mid cp_end (les noms des points de contrôle de ce round séparé par un espace)
  • Restrict team from winning : Red (comme dit avant)


Cette entité gère les rounds. Nous avions dit que nous ne travaillons que sur un seul round.
Donc une seule entité!

Courage!
Passons au math_remap
  • Name : blu_counter
  • Start disabled : No
  • Minimim Valid Input Value : 0
  • Maximum Valid Input Value : 3
  • Output Value When Input is Min. : 0
  • Output Value When Input is Max. : 3

Cette entité permet de limiter le dénombrement de joueurs bleus qui sont nécessaire autour du wagon pour le faire avancer.

Il en faut minimum 0 et maximum 3. Cela va nous permettre de modifier la vitesse du wagon, en fonction du nombre de joueur bleu qui le pousse. Comme vous le remarquez. Officiellement, trois joueurs (ou un scout + un joueur) suffisent pour atteindre la vitesse max.

Mais à vous de choisir!

On à Un output:
OutValue | logic_count | InValue || 0.00 | No

On va demander à un logic_case de réagir à la valeur qu'à reçut le math_remap
On va donc créer ce logic_case
  • Name : logic_count
  • Case 01 : 0
  • Case 02 : 1
  • Case 03 : 2
  • Case 04 : 3

On limite donc à 3 joueurs max.

Côté Output:
OnCase01 | Blu_train | SetSpeedDirAccel | 0 | 0.00 | No
OnCase01 | Blu_cart_particles | Stop | 0 | 0.00 | No
OnCase01 | sparks | StopSpark | 0 | 0.00 | No


Si il n'y à aucun joueur qui pouse (Case01 valeur 0) alors on stop tout!

OnCase02 | Blu_train | SetSpeedDirAccel | 0.55 | 0.00 | No
OnCase02 | Blu_cart_particles | Start | 0 | 0.00 | No
OnCase02 | sparks | StopSpark | 0 | 0.00 | No


Si il y a un joueur qui pousse on fait légèrement avancer le wagon, on affiche le gyro qui est une particule, mais le train ne recule pas donc pas d'étincelles

OnCase03 | Blu_train | SetSpeedDirAccel | 0.77 | 0.00 | No
OnCase03 | Blu_cart_particles | Start | 0 | 0.00 | No
OnCase03 | sparks | StopSpark | 0 | 0.00 | No


Deux joueur, le train avance un peu plus vite

OnCase04 | Blu_train | SetSpeedDirAccel | 1.0 | 0.00 | No
OnCase04 | Blu_cart_particles | Start | 0 | 0.00 | No
OnCase04 | sparks | StopSpark | 0 | 0.00 | No


3 joueurs, le wagon va à ça vitesse maximum

Bien, une étape de faite, plus que deux.

Pour soufler un peu je vous propose d'attaquer le chemin de fer que le wagon va emprunter
les rails sont des models static, toutes dans props_mining. Pour beaucoups vous aurez leurs longueur en unité à la fin de leurs nom.

Sur votre chemin posé 2 points de contrôle (un au milieu et un qui sera au bout de vos rails dans la base rouge)
les models des points de contrôle sont des prop_dynamiques sont dans props_trainyards (models/props_trainyard/track_midcap.mdl) ainsi que de nombreux models propres à goldrush. Noté qu'on peut y trouver le train en un morceaux ou en deux (bombe puis wagon) mais pas de dispenser.

Note: les models de plateformes ont le skin 0 (équipe rouge) par défaut


Etapes 2 : Le chemin!
Vos rails sont posées ? On va donc va donc faire en sorte que votre future wagon les suivens!

Tout d'abord revenons à vos points de contrôle nommé le premier point : mid_cp_platform
et le dernier point end_cp_platform

Au dessus de chacun d'eux on va placer un point de contrôle au sens 'entité'
sur le premier placer un team_control_point cette entité est un model, aussi veillez à bien la placer sur le point
  • Name : cp_mid
  • Start disabled : No
  • Default Owner : Red
  • Print Name : (ce que vous voulez, c'est le nom affiché)
  • Index : 0 (premier point = 0)
  • Warning type : No Annoucements (ce n'est pas un point critique)

Et en output
OnCapteam2 | cap_area | SetControlPoint | cp_end | 0.10 | No

Une fois capturer, le point dit à la zone de capture quel est el prochain point.
Laissons le reste par défauts, ça reste cosmétique alors libre à vous.

Sur le dernier point faite de même : rajouté un team_control_point :
  • Name : cp_end
  • Start disabled : No
  • Print Name : (ce que vous voulez, c'est le nom affiché)
  • Default Owner : Red
  • Index : 1
  • Warning type : Final Capture Point Warning (c'est LE point critique)

Le reste par défaut ou à votre guise.

Il y a un output :
OnCapteam2 | round_timer | pause | | | No

Fin du décompte du temps restant

Bien passons à la création même du chemin que suivra le wagon, ca rpour lui les rails ça veux rien dire!
Créer au points de départ du wagon, au centre des des rails une entité path_track

Attention elle doit être à 47 unité du sol soit à 41 unités au dessus du model des rails, cela vaut aussi pour le model des points de contrôle (41 unité) mais rassurez-vous la map prefab vous indiquera avec détails les positions des paths sur les points de contrôle.

Donc commençons par le tout premier path_track
  • Name : blu_track
  • Next Stop target : blu_trackm1

Le reste par défaut.


Normalement si vous maintener SHIFT enfoncé avec l'outil de déplacement et le path_track sélectionné, vous pourrez le dupliquer. Le prochain sera nommé blu_track1 et aura pour cible blu_track2 une fois dupliqué et ainsi de suite. Faite ainsi les path_track jusqu'à arriver au premier point de contrôle. Les lignes droites ne poserons pas de problème mais veiller à bien former les virage. Normalement un petit trait part de chaque path_track vers le suivant. Veillez à ce que le chemin ainsi matérialisé soit proche de celui représenté par les rails au sols.

Voici comment est constituer un point de contrôle, vous devrier déjà avoir 2 models:

tuto_pl2.png


Sur la map prefabs j'ai nommé mes path différement ce qui permet un copier/coller aisé/
Il porte toujours le nom blue_track mais cette fois-ce j'ajoute le préfix du point :
"m" pour middle :
blu_trackm1
blu_trackm2
blu_track_cpm (le path_track du point de control, le plus important!)
blu_trackm3
blu_trackm4

Comme vous le voyez le strois track au centre sont légèrement relever car le train 'monte' sur la plateforme.
Dans ce jeu de path_track seul deux sont important, celui du milieu qui va déclencher plein de output. Et le blu_trackm2, le deuxième en partant de la gauche. Car il recevra un Input, donc il faut juste connaître son nom.

On va donc créer les outputs du blu_track_cpm.
OnPass | cp_mid | SetOwner |3 | 0.00 | Yes
OnPass | cap_area | CaptureCurrentCP | | 0.00 | Yes
OnPass | mid_cp_platform| Skin |1 | 0.00 | Yes

Le point passe sous le contrôle de l'équipe bleu

OnPass | blu_track_m2| DisablePath |0 | 0.00 | Yes
On rend inactif le path_track qui précède. En effet le point de contrôle assure à l'équipe bleu que leur wagon ne pourra pas reculer plus loin. La distance gagné jusque là est acquise.

OnPass | round_timer | AddteamTime | 300 | 0.00 | Yes
L'équipe bleu gagne 300s de temps suplémentaire

OnPass | gamerules | AddBlueTeamRespawnWaveTime | -1 | 0.00 | Yes
L'équipe bleu vois sont temps de respawn réduit de 1s. (a vous de voir)

OnPass | Blu_Train | Stop | 0 | 0.00 | No
Si le train revient en arrière, il n'ira pas plus loin.

OnPass |sparks | StopSparks | 0 | 0.00 | No
Si le train revient en arrière, comme il s'arrête ici, les étincelles s'arrête aussi.

Maintenant continuer de faire des path_track jusqu'au prochain et dernier point de contrôle.
Une fois que vous êtes sur celui-ci, on fait pratiquement pareil. Seul les Outputs vont changer.

Je vous donne le nom de mes path_track pour ce dernier points de contrôle :
"e" pour "end"
blu_tracke1
blu_tracke2
blu_track_cpe
blu_tracke3
blu_tracke4

Et en output sur le blu_track_cpe:
OnPass | cp_end | SetOwner |3 | 0.00 | Yes
OnPass | cap_area | CaptureCurrentCP | | 0.00 | Yes
OnPass | mid_end_platform| Skin |1 | 0.00 | Yes

Le point passe sous le contrôle de l'équipe bleu

OnPass | cap_area | Disable | | 0.00 | Yes
OnPass | Blu_train | Stop | | 0.00 | Yes

le jeu est finit pas besoin de continuer à faire avancer le train.


Et voila! Plus que le train à faire!

Etape 3 : Le Wagon CRY SOMMMEE MOOOOREE !!!!!!

Commençons par le plus simple...
Créezun prop_dynamic nommé Blu_train ayant pour World model :
models/props_trainyard/bomb_cart.mdl

Sa place importe peu dans la map, mais le mieux reste proche du départ! pourquoi pas sur les rails!

Bien maintenant on va placer deux petites entités comme sur le screen :

tuto_pl3.png



Celle de gauche au niveau du girophare :

info_particle_system
  • Name : cart_particles
  • Parent : Blu_train
  • Particle System Name : cart_flashinglight

Celle de droite sur la cheminer du dispenser n'est utile que si votre train doit régénérer les joueurs bleu qui sont proche de lui.
mapobj_cart_dispenser
  • Name : healing_thing
  • Parent : Blu_train
  • Team : Blue
  • Custom Touch Trigger : dispenser_area

Noter qu'on peu très bien permetre au wagon de régénérer les bleus et/ou les rouges!

Bien maintenant on va ajouter deux entités juste derrière les roue arrière...des env_sparks pour fair des étincelles!
les deux sont configurés pareil:
  • Name : sparks
  • Parent : Blu_train
  • Spark Trail Length : medium

Le reste par défaut, ou comme vous voulez!

Bien! notre wagon est matérialisé et à ses effets. Mais comme pour le chemin et les rails on va maintenant créer notre "vrai" train!

Enrober votre model de train par un bloc recouvert de la texture player_clip ayant pour dimension 80*104*64 comme sur le screen (trait rouge)

tuto_pl4.png



Transformer votre block recouvert de player_clip en func_tracktrain
  • Name : Blu_train
  • First Stop Target : blu_track (le premier track)
  • Max speed units : 90 (vitesse maximum)
  • Change velocity : Linear Blend (la vitesse change progressivement et pas d'un coup)
  • Distance Between the Wheels : 20 (hauteur par rapport au roue, on parle du centre du bloc)
  • Height Above Track : -8 (Le centre du block devrait être à -8 unité de la hauteur du path_track)
  • Damage on Crush : 10000
  • Move Sound : Cart.Roll
  • Start Sound : Cart.RollStart
  • Stop Sound : Cart.RollStop

le reste par défaut.
Note: Si on veux mettre 0 à Height Above Track il faut baisser tous les path_track de 8 unité.

Juste devant et derrière le train (le bloc clip) ajouter deux blocs recouvert de la texture trigger d'une dimension de 8*80*64 Ceci ralongeant le train de 16 unité (8 devant et 8 derrière)

tuto_pl5.png



Transformer les deux bloc ainsi créer en trigger_hurt configurer pareil:
  • Name : hurt_trigger
  • Parent : Blu_train
  • Filter Name : noplayer
  • Damage : 10000
  • Damage Type : FREEZE

le reste par défaut.
Grâce à ça, rien d'autre qu'un joueur, ne peux bloquer le train (en théorie) sinon il est détruit!

Nous aprochons du but!
Nous allons maintenant définir la zone de soin/régène du wagon à l'équipe bleu.

Pour ce faire rien de bien dur créer un block recouvert de la texture trigger qui englobe le wagon d'une dimension que vous voulez (en générale on prend : 256*272*128) et transformer le en dispenser_touch_trigger
  • Name : dispenser_area
  • Parent : Blu_train

Pour finir, il ne reste plus qu'à déterminer la zone dans laquelle on considère que les joueurs bleu poussent le wagon. Dupliquer le bloc que vous venez de créer et mettez la taille que vous voulez (en générale on prend : 256*288*128) C'est normalement déjà une entité, mais pas celel que nous voulons, modifier la en trigger_capture_area
  • Name : cap_area
  • Parent : Blu_train
  • Start Disabled : yes
  • Contol Point : cp_mid (premier point à prendre)
  • Can Red Cap : No (seul les bleu peuvent prendre le point)
  • Time to cap (sec) : 99999

Le reste par défaut.

Voila!
Il ne vous reste plus qu'à créer vos func_door nommées blu_gp_door et qui bloquerons les joueurs bleu durant le temps de configuration.

(et à créer vos spawns etc etc!)

Quoi vous êtes encore là? Vous voulez quoi encore? Ha la map prefab ?
Elle est jointe juste en dessous (pl_type.zip) !
 

Pièces jointes

  • pl_type.zip
    48.6 KB Vues: 9
Dernière édition:
Discord Hytale, Minecraft, Rust, ARK, FiveM

Découvrez mTxServ!

Discord d'entraide

Rejoignz-nous sur Discord