Cette page a été traduite par machine, elle peut contenir quelques inexactitudes. Tu peux aider en contribuant à une traduction, ou tu peux aussi passer à la version anglaise.

Nouvelles fonctionnalités de script#

Cela ne fonctionne que sur T6 et IW5.

Pour IW5, vous devez placer des scripts de type carte/jeu à l’intérieur d’un mp dossier (Donc, scripts/mp/mp_rust/myGsc.gscou scripts/mp/dm/myFfaGsc.gsc)

Commencer#

Cette rubrique servira de ressource pour ceux qui souhaitent savoir quelles fonctionnalités/ améliorations de script sont disponibles ainsi que celles qui sont confirmées à venir.

Cette rubrique décrira comment la fonction GSC actuellement existante appelée replaceFunc() ajouté il y a un certain temps fonctionne, et entrez dans les détails sur le fonctionnement des scripts personnalisés.

replaceFunc() Vue d’ensemble#

replaceFunc() permet à un scripteur de remplacer n’importe quelle fonction de script d’un script stock par sa propre version. Le concept est similaire à la façon dont un pointeur de fonction fonctionne déjà, mais replaceFunc() fonctionnera sur n’importe quelle fonction, qu’elle soit appelée en tant que pointeur de fonction ou non.

L’utilisation principale serait de modifier une mécanique de jeu de base contrôlée par GSC et la seule façon de le faire normalement est de remplacer l’ensemble du script, même si vous n’avez besoin de modifier qu’une ou deux fonctions.

replaceFunc() fonctionne comme ceci :
Sur le premier argument est la fonction exacte que vous souhaitez remplacer.
Il peut s’agir d’une fonction dans n’importe quel script actuellement chargé par le jeu (de sorte que les scripts dépendants de la carte doivent être remplacés d’une manière légèrement différente).
Il peut également s’agir d’une fonction dans le même script.

Sur le deuxième argument est la fonction que vous souhaitez que le jeu appelle au lieu de la fonction stock.
Cela dépendra probablement du type de fonction que vous souhaitez remplacer et que vous devrez baser la nouvelle fonction sur celle que vous remplacez afin de minimiser la probabilité qu’il y ait des problèmes.

Lorsqu’il est utilisé dans un script, il ressemblerait à ceci:

main()
{
    replaceFunc( common_scripts/utility::flag_set, ::flag_set_with_print );
}

flag_set_with_print( flagname )
{
    print( "Flag set: " + flagname );
    level.flag[ flagname ] = 1;
    level notify( flagname );
    common_scripts/utility::set_trigger_flag_permissions( flagname );
}

Maintenant, chaque fois qu’un drapeau est défini par l’appel normal, il appelle plutôt notre fonction et imprime le nom du drapeau en cours de définition.
Ce n’est bien sûr qu’un exemple de remplacement d’une simple fonction utilitaire pour avoir une meilleure compréhension de l’ordre dans lequel les drapeaux pourraient être définis (ce qui est une grande partie de la logique chez les zombies) à certains moments.

Vue d’ensemble des scripts nommés personnalisés#

Vous vous demandez peut-être : « Pourquoi cet exemple de code utilise-t-il un main() au lieu d’un init() ? »

En conjonction avec ReplaceFunc(), il est maintenant possible de créer des scripts entièrement personnalisés indépendamment des scripts stock.
Il n’est plus nécessaire de remplacer des scripts tels que _clientids ou _development_dvars.
De plus ReplaceFunc() doit être exécutée avant qu’une fonction ne soit exécutée, sinon les modifications que vous souhaitez apporter ne se produiraient jamais.
Par conséquent, les scripts personnalisés ont un main() à cette fin.
Vous pouvez ReplaceFunc() n’importe quelle fonction de l' main() d’un script personnalisé car les principales de script personnalisées sont toujours exécutées avant tout script stock.

Cela signifie bien sûr que vous devrez modifier le fonctionnement de votre code en raison de cet ordre de chargement, n’est-ce pas?
En fait, en plus d’un main() les scripts personnalisés ont également un init() que le jeu appellera automatiquement après le démarrage de la logique du type de jeu.
En fait, c’est à peu près au même moment que _clientids::init() est appelé.

Donc, sachant cela, vous pouvez utiliser main() pour configurer n’importe quel type de logique que vous voulez initialiser avant toute autre chose que le jeu exécute normalement.
Ensuite, vous pouvez également utiliser init() pour remplacer des valeurs de variable spécifiques et utiliser d’autres codes a _clientids::init() contiendrait habituellement.

Maintenant que j’ai bien expliqué les bases de ces deux fonctionnalités, je vais détailler chaque bizarrerie ou information potentiellement utile sur ReplaceFunc() et des scripts de noms personnalisés.

Caractéristiques de ReplaceFunc()#

Maintenant, alors que j’avais précédemment déclaré, vous pouvez remplacer n’importe quelle fonction en utilisant cette fonction GSC qui n’est pas complètement précise.
Vous ne pouvez pas remplacer une fonction directement appelée par le moteur, telle que :

  • Toutes les fonctions qui commencent par CodeCallback_
  • Quelconque main() dans un script portant le même nom que la carte
  • Quelconque main() dans un script portant le même nom que le type de jeu
  • Une fonction exclusive aux zombies appelée gamemode_callback_setup() également situé dans le fichier mapname.gsc.

Vous pouvez contourner cette limitation en remplaçant l’ensemble du script en le plaçant dans le même sous-chemin qu’il attend dans storage/gamename/, ou en remplaçant toutes les fonctions qu’il appelle.
Par exemple si vous vouliez remplacer maps/mp/gametypes/_globallogic.gsc le chemin serait storage/T6/maps/mp/gametypes/_globallogic.gsc.

ReplaceFunc() DEVOIR être toujours appelé avant que la fonction que vous souhaitez remplacer ne soit appelée, sinon cela n’aura aucun effet.
Par conséquent, utilisez toujours ReplaceFunc() dans un main() d’un script personnalisé.

Spécificités des scripts nommés personnalisés#

Les scripts personnalisés peuvent également être organisés efficacement.
Tout script analysé par le jeu aura également ses inclusions analysées tant qu’elles se trouvent dans le même dossier ou un sous-dossier de ce dossier.
Cela vous permet de créer des scripts utilitaires et de diviser vos scripts en scripts plus petits dans des sous-dossiers.
Par exemple, vous pouvez créer un sous-dossier appelé custom_perks dans scripts/zm et y ont différents scripts différents qui définissent les attributs et les fonctionnalités d’un avantage personnalisé.
Ensuite, pour appeler ces fonctions dans ces scripts, vous devez ajouter une inclusion dans l’un des scripts du dossier zm quelque chose comme #include scripts/zm/custom_perks/flopper; et alors vous seriez en mesure d’appeler des fonctions à partir de celui-ci.
Scripts main() ou init() dans les sous-dossiers définis par l’utilisateur sont NON appelé automatiquement par le moteur. Tout script stock peut également être inclus dans des scripts personnalisés.
Un utilisateur peut également placer des scripts dans scripts/zm/mapname pour que les scripts ne soient appelés automatiquement par le moteur que lorsque cette carte est chargée, ou qu’ils puissent également être placés dans scripts/zm/gametype pour n’être appelé automatiquement par le moteur que lorsque ce type de jeu est chargé.
Seuls les scripts de niveau racine sont appelés par le moteur dans ces sous-dossiers.

L’ordre de chargement spécifique pour ces curieux fonctionne comme ceci:

- custom_scripts::main()
- gametype::main()
- mapname::main()
- gametype start (_callbacksetup::startgametype)
- custom_scripts::init()