Posté le: 26/01/09 13:09 Sujet du message: Méthode pour passer un sort à cible unique en sort de zone
I/ Introduction
Commentaire
Je profite d’une carte que j’ai fait pour répondre à une question pour faire ce tout petit tutorial.
L’objectif est, à travers l’exemple d’un sort de charme de zone, de comprendre comme passer n’importe quel sort à cible unique en sort de zone grâce aux variables et aux dummys, en Gui.
Bonus : la version Jass.
Prérequis
Si vous connaissez déjà les variables et les dummys, je dirais que vous n’avez pas besoin de lire ce tuto.
Néanmoins, un petit rappel aura lieu durant le tutorial.
Le JassNewGenpack est indispensable pour la version Jass.
II/ Editeur d’objets
Compétences
Nous auront besoin d’une première compétence héros.
Elle n’aura aucun effet réel, mais elle montrera la zone ciblée par le héros.
Si vous désirez utiliser un sort qui tire des projectiles, je conseille de prendre le sort ClusterRockets de l’Artisan et de régler ses dégâts à 0.
Dans mon cas, j’utilise le sort canaliser. Rappel : il permet de fabriquer n’importe quel sort sans aucune conséquence directe et d’être utilisé dans les déclencheurs .
Données importantes à modifier :
Désactiver les autres compétences : faux.
Suivre dans la durée : 0.00
Options : visible (pour que l’on voit le sort, logique) et image de visée (pour faire apparaître le grand cercle qui entoure la zone ciblée, comme pour Choc de Flammes par exemple).
Cible : type de cible : cible point.
Zone d’effet : j’ai mis pour mes 3 niveaux 300, 350 et 450. Ceci règle la taille de la zone ciblée.
Cibles autorisées : terre suffira. (On cible bien le sol).
Le reste : faites ce que vous voulez.
J’appelle ce sort : Charme de Zone.
Prenez maintenant la compétence unité neutre hostile appelée « Charme ».
Renommez-là Dummy Charme, par exemple, pour vous rappeler qu’elle servira à un Dummy (voir après).
Réglez les paramètres :
Donnée : niveau maximum du monstre : 100. Comme ça vous pourrez cibler n’importe quelle unité.
Portée du sort : 1000 (Tout dépend de la zone d’effet de votre sort Charme de Zone).
Temps de rechargement : 0
Coût en mana : 0
Vous pouvez modifier le reste à votre guise.
Unités
Prenez votre héro favori, et dans la ligne «compétences héros », donnez-lui notre sort Charme de Zone.
Créez maintenant une unité en copiant collant la balise des orcs.
Modifiez les champs :
Capacités : rajoutez notre sort Dummy Charme et infestation. Notre sort dummy charme sera celui tiré sur les cibles, et infestation permet de rendre l’unité invulnérable et inselectionnable.
Taille de Collision : 0.00
Cacher l’affichage sur la minimap : true.
Portée de vue jour et nuit : 0
Son unité : aucun
Fichier modèle : « .mdl » pour que l’unité n’ait aucun modèle.
Image de l’ombre : aucune.
Et vous venez de créer un dummy, c'est-à-dire une unité invisible qui pourra faire ce que vous voulez, tout en donnant l’impression que c’est le héros qui a tout fait comme un grand
III/ Editeur de déclencheur
Variables
Si vous voulez faire le sort le plus correctement possible, vous aurez besoin de plusieurs variables (pour éviter le leak, c’est-à-dire un ralentissement du jeu).
Charme_distance : Réel réglé par défaut à 0. Ce sera le rayon de la zone d’effet de notre charme de zone. Si votre sort Charme de Zone comporte plusieurs niveaux, vous pouvez cocher la case « déploiement ».
Charme_dummy_type : Un type d’unité. On y stockera notre Dummy pour diminuer le leak.
Charme_entier : Un entier (vous l’aurez compris). Il permettra de compter le nombre d’unités ciblées par notre charme de zone.
Charme_groupe : Un groupe d’unité. On y placera toutes les unités ennemies ciblées par notre charme de zone.
Charme_point : Un point. Il correspondra au centre de la zone ciblée par le sort Charme de Zone.
Charme_random_unit : une unité. On y stockera la cible du dummy.
Déclencheurs
Les réglages initiaux du sort.
Secret:
Gui:
Trigger:
Charme initialisation
Evénements
Map initialization
Conditions
Actions
-------- On stocke le type d'unité de notre Dummy -------- Set Charme_dummy_type = Dummy Charme de Zone -------- On règle le rayon d'effet en fonction du niveau du sort -------- Set Charme_distance[1] = 300.00 Set Charme_distance[2] = 350.00 Set Charme_distance[3] = 400.00
L’effet du sort.
Secret:
Gui:
Trigger:
Charme action
Evénements
Unité - A unit Commence le lancement d'une compétence
Conditions
(Ability being cast) Egal à Charme de Zone
Actions
-------- Si une unité commence le lancement de notre sort Charme de Zone -------- -------- Attribuer à la variable "Charme_point" le point qui correspond au centre de la zone ciblée -------- Set Charme_point = (Target point of ability being cast) -------- Attribuer à la variable "Charme_point" le point qui correspond au centre de la zone ciblée -------- -------- Là , on va prendre toutes les unités situées dans une zone -------- -------- De centre Charme_point -------- -------- Et de rayon Charme_distance (La distance étant régie par le niveau du sort) -------- -------- Et on ne prend que les unités vérifiant: -------- -------- L'unité "pickée" n'est ni un bâtiment, ni un héro, et appartient aux ennemis du lanceur de sort --------
Groupe unité - Pick every unit in (Units within Charme_distance[(Level of Charme de Zone for (Triggering unit))] of Charme_point matching ((((Matching unit) is Un bâtiment) Egal à FALSE) and ((((Matching unit) is Un héros) Egal à FALSE) and (((Matching unit) belongs to an enemy of (Owner and do (Actions)
Boucle - Actions
-------- Une fois le test réalisé, on ajoute toutes les unités marquées dans le groupe Charme_groupe -------- Groupe unité - Add (Picked unit) to Charme_groupe
-------- On attribue à la variable Charme_entier le nombre d'unités de ce groupe -------- Set Charme_entier = (Number of units in Charme_groupe) -------- Boucle: pour chaque entier compris entre 1 et le nombre total d'unité du groupe -------- -------- Ce qui se traduit ici par: pour chaque unité du groupe --------
For each (Integer A) from 1 to Charme_entier, do (Actions)
Boucle - Actions
-------- On prend une unité de ce groupe au hasard et on la stocke dans Charme_random_unit -------- Set Charme_random_unit = (Random unit from Charme_groupe) -------- On créé un dummy au centre de la zone ciblée -------- -------- On oublie pas de donner ce dummy au joueur du lanceur de sort ;) -------- Unité - Create 1 Charme_dummy_type for (Owner of (Triggering unit)) at Charme_point facing Orientation bâtiment par défaut degrees -------- On lui ordonne d'utiliser le sort Dummy Charme sur notre unité du groupe prise au hasard -------- -------- Le nom du sort lancé par ordre correspond à l'identité du sort de base: -------- -------- Si vous utilisez un sort fondé sur "sarments", l'ordre de chaîne serait celui de sarment (Entangle) -------- Unité - Order (Last created unit) to Ranger sombre neutre - Charme Charme_random_unit -------- On lui donne une vie limitée dans le temps pour éviter de saturer la carte ;) ) -------- Unité - Add a 2.00 second Générique expiration timer to (Last created unit) -------- Hop! On supprime notre unité prise au hasard du groupe, tout simplement pour que la boucle s'attaque ensuite à une autre unité du groupe -------- Groupe unité - Remove Charme_random_unit from Charme_groupe -------- Et comme on demande à la boucle de se répéter aussi souvent qu'il y a d'unités dans le groupe, tout le monde aura le droit à son petit Dummy Charme --------
-------- Très important: on supprime le point pour éviter le leak -------- Custom script: call RemoveLocation( udg_Charme_point ) Custom script: call DestroyGroup( udg_Charme_group )
La version jass de l’effet du sort.
A utiliser avec le JassNewGenPack.
Permet de ne pas utiliser de variables globales (cf la première partie de la rubrique déclencheur) autre que la distance réglée en fonction du sort. Et encore on pourrait s’en passer.
Ici je n’ai mis qu’une seule condition : le groupe d’unité prendra en compte tout ennemi (et non tout ennemi non héros/non bâtiment)
Secret:
Jass:
//La condition: si le sort lancé est notre charme de Zone
function Trig_Charme_action_en_jass_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
//L'action du déclencheur
function Trig_Charme_action_en_jass_Actions takes nothing returns nothing
local unit u = GetTriggerUnit() // L'unité qui lance le sort
local player pl = GetOwningPlayer(u) // Le joueur possédant le lanceur de sort
local location p = GetSpellTargetLoc() //Le point ciblé
local group g = GetUnitsInRangeOfLocAll(udg_Charme_distance[GetUnitAbilityLevelSwapped('A000', u)], p) //Toutes les unités situées dans le rayon correspondant au niveau du sort
local unit target //Ce qui sera la cible du dummy durant la boucle
loop
set target = FirstOfGroup(g) //On cible une première unité
call GroupRemoveUnit(g, target) //On la supprime du groupe
exitwhen (target == null) //La boucle s'arrêtera quand il n'y aura plus d'unités dans le groupe
if (IsUnitEnemy(target, pl) then //Et on applique le sort uniquement si l'unité target est un ennemy du lanceur du sort
call CreateNUnitsAtLoc( 1, udg_Charme_dummy_type, pl, p, bj_UNIT_FACING )// on créé n1 petit dummy pour le lanceur de sort sur le point ciblé, et on se moque de ce qu'il regarde de toute façon personne ne le voit
call IssueTargetOrderBJ( GetLastCreatedUnit(), "charm", target ) //Et pan! On lui ordonne de charmer notre cible. Ironiquement la cible sera charmée par un être invisible. La classe.
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )//La beauté est éphémère. Notre charmeur n'existera que deux secondes.
else//On n'oublie pas d'écrire le esle et le endif sinon le jeu ne va pas apprécier.
endif
endloop//Ibid pour la boucle.
//Et le plus important: on supprime toute source de leak.
call RemoveLocation( p)
set p = null
call DestroyGroup(g)
set g = null
set u = null
set target = null
set pl = null
endfunction
//===========================================================================
function InitTrig_Charme_action_en_jass takes nothing returns nothing
set gg_trg_Charme_action_en_jass = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Charme_action_en_jass, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_Charme_action_en_jass, Condition( function Trig_Charme_action_en_jass_Conditions ) )
call TriggerAddAction( gg_trg_Charme_action_en_jass, function Trig_Charme_action_en_jass_Actions )
endfunction
IV/ Conclusion
Et voilà. Les possibilités de cette méthode sont larges : on peut faire des sorts de Feu Sacré de zone, de Sarment de zone, de Boule de foudre de zone etc…Il suffit de changer le sort du dummy
Inscrit le: 21 Aoû 2007 Messages: 915 Sujets: 47 Spécialité en worldedit: Faire des maps avec 500 déclos en GUI alors que 2 en JASS suffisent Médailles: 1 (En savoir plus...)
Posté le: 27/01/09 19:33 Sujet du message:
Pourquoi on a besoin de choisir une unité aléatoire ?
Comment peut on faire pour limiter le nombre d'unité. Genre le charme va prendre que 3 unités dans la zone au niveau 1, au niveau 2 il en prendre 4 et au niveau 3 il en predra 5 ? _________________
L'unité choisie au hasard: parce qu'en Gui c'est la seule méthode pour sélectionner successivement toutes les unités du groupe en passant par une boucle.
En revanche, pour ta demande (3, 4 , 5 unités...) il suffit de remplacer
For each (Integer A) from 1 to Charme_entier, do (Actions)
par
For each (Integer A) from 1 to Ton Nombre, do (Actions)
Si tu veux régler dès le début le nombre en fonction du niveau, tu mets en place une variable entier de déploiement (exemple: nombre_cible) et dans le premier déclencheur (initialisation) tu règle nombre_cible[1] = 3 etc...
Enfin, tu mets
For each (Integer A) from 1 to nombre_cible[Level of (Charme de Zone) for (Triggering Unit)], do (Actions) _________________
J'essaye (ça n'en est qu'au stade expérimental) de faire un système automatisé de passage à des sorts de zone n'utilisant pas le JNGP (même si c'est débile de pas s'en servir vJass ou pas) et ne fonctionnant qu'avec l'éditeur de compétences et le set de variables (pas d'autres triggers à faire). Si les résultats sont concluants et à moins d'inconvénients trop nombreux, je la posterai ici.
Edit : Voici une première mouture. Si des gens pouvaient la tester et essayer d'autres sorts, ce serait cool.
Cette carte de test nécessite le Jass NewGen Pack à cause de trois triggers de test. Si vous ne l'avez pas, supprimez-les tout simplement.
J'ai suivi le tuto exactement (je crois que je n'ai pas fait d'erreur) mais je ne peux utiliser le sort de zone qu'une fois, ensuite un effet apparait et le dummy n'ait pas créé (sûrement l'effet du sort canaliser habituel)
si quelqu'un pourrait m'aider (j'envoie la map test sa peux toujours aider)
Télécharger la map _________________
-déjà j'ai modifié les ordres chaînes de tes sorts qui étaient tous les deux "channel".
-ensuite ton feu sacré de zone: dans les unités que tu ajoute au groupe, tu ne prends que les unités alliées.(Pour un feu sacré mieux vaut prendre toutes les unités).
-j'ai retesté ma map exemple: le sort marche sur les 4 groupes d'unités neutre hostile.
J'ai ensuite reglé le rechargement de canaliser sur 1 seconde. Là, le feu sacré fonctionne deux fois -_-
La fonction RemoveGroup n'existe pas, la variable udg_Charme_group non plus (et oui le "e" manque"). Mais de toute façon je crois que le problème vient du fait que tu détruises un groupe que tu réutilises.
Soit tu mets un custom script au début pour faire du groupe une locale (astuce qui ne fonctionne que pour une variable par déclencheur) :
Gui:
Trigger:
Custom script: local group udg_Charme_groupe = CreateGroup()
Et dans ce cas tu dois le détruire par le DestroyGroup() à la fin.
Soit tu rajoutes juste avant le Pick Every Unit, le custom script :
Gui:
Trigger:
Custom script: set bj_wantDestroyGroup = true
Qu'on m'arrête vite si je me trompe. En tout cas les tests me donnent raison.
Donc selon toi sa serait à cause de la destruction du groupe ?
j'essaie et je met à jour le plus rapidement possible mon message
Edit : j'ai enlevé le destroy group et je peux faire le sort plusieurs fois mais il y a toujours un effet violet bizarre qui est sur moi et sur le point du centre du sort lorsque je lance le sort sur aucune unité. Mais ce n'est pas très grave ; le principale c'est que sa marche _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2Suivante
Page 1 sur 2 La question posée dans ce topic a été résolue !
Vous ne pouvez pas poster de nouveaux sujets dans ce forum Vous ne pouvez pas répondre aux sujets dans ce forum Vous ne pouvez pas éditer vos messages dans ce forum Vous ne pouvez pas supprimer vos messages dans ce forum Vous ne pouvez pas voter dans les sondages de ce forum