Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=a53c3d3d4b8604b2f5faeedc645a0c27Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Accumulation de dégâts

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Les sorts
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 gisgalion
Membre honoraire


Inscrit le: 30 Oct 2013
Messages: 283
Sujets: 20
Spécialité en worldedit: Spellmaker


MessagePosté le: 08/04/16 00:53    Sujet du message: Accumulation de dégâts Citer

Bonjour, comme vous le savez peut-être, je travaille actuellement sur les sorts de World of Conflict (la map de Cho'Gall).
Or, j'en suis actuellement à un des sorts du Chef de Guerre et... ce dernier me pose en effet un bon problème.
Après pas mal d'essais et de modifications, j'ai réussi à obtenir ce que je voulais (bonne trajectoire, les projectiles touchent lorsqu'il faut, tout ça c'est bon).

Par contre, les unités, au lieu de subir simplement les dégâts normalement infligés, sont quasiment tuées sur le coup. En réduisant les dégâts, j'ai constaté qu'elles survivaient mais perdaient vraiment beaucoup trop de hp.
J'en suis arrivé à la conclusion que les unités subissaient plusieurs fois le déclencheur, mais je ne comprends vraiment pas pourquoi !
Est-ce dû à une erreur dans la sauvegarde/recharge de mes hashtable ? Dans une destruction de groupe ? Vraiment, je suis assez perdu là, j'ai essayé sans y parvenir toute la journée :/

(Et je parie que l'erreur est toute bête maaaaaais que je suis incapable de la trouver x'D)

Voici le code des sorts :

(Ils ne sont peut-être pas encore totalement optimisés/deleakés, j'essaye d'abord de les faire totalement fonctionner)

L'unité lance le sort - Initialisation des données
Secret:

Gui:
Trigger:
Collapse Evénements
Unité - A unit Initie l'effet d'une compétence
Collapse Conditions
(Ability being cast) Egal à  Throw of axes
Collapse Actions
Set ToA_Caster = (Triggering unit)
Table de hachage - Save Handle OfToA_Caster as 4 of (Key (Triggering unit)) in ToA_Hashtable
Set ToA_BoleanReturn = FALSE
Table de hachage - Save ToA_BoleanReturn as 0 of (Key (Triggering unit)) in ToA_Hashtable
Groupe unité - Add (Triggering unit) to ToA_GrpCasters
Set ToA_TargetPoint = (Target point of ability being cast)
Table de hachage - Save Handle OfToA_TargetPoint as 3 of (Key (Triggering unit)) in ToA_Hashtable
Set ToA_TotalDistance = (Distance between (Position of (Triggering unit)) and ToA_TargetPoint)
Set ToA_RayLength = (ToA_TotalDistance / 2.00)
Set ToA_UnitAngle = (Angle from (Position of (Triggering unit)) to ToA_TargetPoint)
Set PointA = ((Position of (Triggering unit)) offset by 200.00 towards (ToA_UnitAngle + 90.00) degrees)
Set PointA2 = (PointA offset by ToA_RayLength towards ToA_UnitAngle degrees)
Set PointB = ((Position of (Triggering unit)) offset by 200.00 towards (ToA_UnitAngle - 90.00) degrees)
Set PointB2 = (PointB offset by ToA_RayLength towards ToA_UnitAngle degrees)
Unité - Create 1 Axe Dummy for (Owner of (Triggering unit)) at (Position of (Triggering unit)) facing ToA_TargetPoint
Set ToA_Dummy1 = (Last created unit)
Table de hachage - Save Handle OfToA_Dummy1 as 1 of (Key (Triggering unit)) in ToA_Hashtable
Unité - Create 1 Axe Dummy for (Owner of (Triggering unit)) at (Position of (Triggering unit)) facing ToA_TargetPoint
Set ToA_Dummy2 = (Last created unit)
Table de hachage - Save Handle OfToA_Dummy2 as 2 of (Key (Triggering unit)) in ToA_Hashtable
Collapse For each (Integer A) from 0 to 359, do (Actions)
Collapse Boucle - Actions
Set ToA_AxesPoint[(Integer A)] = (PointA2 offset by (ToA_RayLength x (Cos(Theta))) towards (ToA_UnitAngle - (24.00 x (Cos(Theta)))) degrees)
Table de hachage - Save Handle OfToA_AxesPoint[(Integer A)] as ((Integer A) + 1000) of (Key (Triggering unit)) in ToA_Hashtable
Set ToA_AxesPoint2[(Integer A)] = (PointB2 offset by (ToA_RayLength x (Cos(Theta))) towards ((ToA_UnitAngle - 180.00) - (24.00 x (Cos(Theta)))) degrees)
Table de hachage - Save Handle OfToA_AxesPoint2[(Integer A)] as ((Integer A) + 2000) of (Key (Triggering unit)) in ToA_Hashtable
Set Theta = (Theta + 1.00)
Déclencheur - Turn on ToA Actu <gen>




Actualisation de la position des projectiles, infliger les dommages aux unités touchées.
Secret:

Gui:
Trigger:
ToA Actu
Collapse Evénements
Temps - Every (1.00 / 64.00) seconds of game time
Conditions
Collapse Actions
Collapse Groupe unité - Pick every unit in ToA_GrpCasters and do (Actions)
Collapse Boucle - Actions
Set ToA_Integer = (Load 5 of (Key (Picked unit)) from ToA_Hashtable)
Set ToA_BoleanReturn = (Load 0 of (Key (Picked unit)) from ToA_Hashtable)
Set ToA_AxesPoint[ToA_Integer] = (Load (ToA_Integer + 1000) of (Key (Picked unit)) in ToA_Hashtable)
Set ToA_AxesPoint2[ToA_Integer] = (Load (ToA_Integer + 2000) of (Key (Picked unit)) in ToA_Hashtable)
Set ToA_Caster = (Load 4 of (Key (Picked unit)) in ToA_Hashtable)
Set ToA_Dummy1 = (Load 1 of (Key (Picked unit)) in ToA_Hashtable)
Set ToA_Dummy2 = (Load 2 of (Key (Picked unit)) in ToA_Hashtable)
Set ToA_GrpAlreadyDamaged = (Load 6 of (Key (Picked unit)) in ToA_Hashtable)
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
ToA_BoleanReturn Egal à  FALSE
Collapse Alors - Actions
Unité - Move ToA_Dummy1 instantly to ToA_AxesPoint[(180 - ToA_Integer)], facing ToA_TargetPoint
Custom script:   set bj_wantDestroyGroup = true
Collapse Groupe unité - Pick every unit in (Units within 125.00 of ToA_AxesPoint[(180 - ToA_Integer)] matching ((((Matching unit) belongs to an enemy of (Owner of ToA_Caster)) Egal à  TRUE) and (((Matching unit) is in ToA_GrpAlreadyDamaged) Egal à  FALSE))) and do (Actions)
Collapse Boucle - Actions
Unité - Cause ToA_Caster to damage (Picked unit), dealing 50.00 damage of attack type Héros and damage type Universel
Unité - Create 1 Dummy Bleeding for (Owner of ToA_Caster) at ToA_AxesPoint[(180 - ToA_Integer)] facing Orientation bâtiment par défaut degrees
Unité - Add a 0.50 second Générique expiration timer to (Last created unit)
Unité - Order (Last created unit) to Attaque une fois (Picked unit)
Groupe unité - Add (Picked unit) to ToA_GrpAlreadyDamaged
Unité - Move ToA_Dummy2 instantly to ToA_AxesPoint2[ToA_Integer], facing ToA_TargetPoint
Custom script:   set bj_wantDestroyGroup = true
Collapse Groupe unité - Pick every unit in (Units within 125.00 of ToA_AxesPoint2[ToA_Integer] matching ((((Matching unit) belongs to an enemy of (Owner of ToA_Caster)) Egal à  TRUE) and (((Matching unit) is in ToA_GrpAlreadyDamaged) Egal à  FALSE))) and do (Actions)
Collapse Boucle - Actions
Unité - Cause ToA_Caster to damage (Picked unit), dealing 50.00 damage of attack type Héros and damage type Universel
Unité - Create 1 Dummy Bleeding for (Owner of ToA_Caster) at ToA_AxesPoint[ToA_Integer] facing Orientation bâtiment par défaut degrees
Unité - Add a 0.50 second Générique expiration timer to (Last created unit)
Unité - Order (Last created unit) to Attaque une fois (Picked unit)
Groupe unité - Add (Picked unit) to ToA_GrpAlreadyDamaged
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
ToA_Integer Egal à  180
Collapse Alors - Actions
Set ToA_BoleanReturn = TRUE
Groupe unité - Remove all units from ToA_GrpAlreadyDamaged
Table de hachage - Save ToA_BoleanReturn as 0 of (Key (Picked unit)) in ToA_Hashtable
Collapse Sinon - Actions
Set ToA_Integer = (ToA_Integer + 2)
Table de hachage - Save ToA_Integer as 5 of (Key (Picked unit)) in ToA_Hashtable
Collapse Sinon - Actions
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
ToA_Integer Egal à  0
Collapse Alors - Actions
Set ToA_BoleanReturn = FALSE
Groupe unité - Remove all units from ToA_GrpAlreadyDamaged
Groupe unité - Remove ToA_Caster from ToA_GrpCasters
Collapse For each (Integer A) from 1 to 360, do (Actions)
Collapse Boucle - Actions
Custom script:   call RemoveLocation( udg_ToA_AxesPoint[GetForLoopIndexA ()] )
Custom script:   call RemoveLocation( udg_ToA_AxesPoint2[GetForLoopIndexA ()] )
Unité - Remove ToA_Dummy1 from the game
Unité - Remove ToA_Dummy2 from the game
Table de hachage - Clear all child hashtables of child (Key (Picked unit)) in ToA_Hashtable
Collapse Sinon - Actions
Set ToA_Integer = (ToA_Integer - 2)
Table de hachage - Save ToA_Integer as 5 of (Key (Picked unit)) in ToA_Hashtable
Unité - Move ToA_Dummy1 instantly to ToA_AxesPoint[(180 - ToA_Integer)], facing ToA_TargetPoint
Custom script:   set bj_wantDestroyGroup = true
Collapse Groupe unité - Pick every unit in (Units within 125.00 of ToA_AxesPoint[(180 - ToA_Integer)] matching ((((Matching unit) belongs to an enemy of (Owner of ToA_Caster)) Egal à  TRUE) and (((Matching unit) is in ToA_GrpAlreadyDamaged) Egal à  FALSE))) and do (Actions)
Collapse Boucle - Actions
Unité - Cause ToA_Caster to damage (Picked unit), dealing 50.00 damage of attack type Héros and damage type Universel
Unité - Create 1 Dummy Bleeding for (Owner of ToA_Caster) at ToA_AxesPoint[(180 - ToA_Integer)] facing Orientation bâtiment par défaut degrees
Unité - Add a 0.50 second Générique expiration timer to (Last created unit)
Unité - Order (Last created unit) to Attaque une fois (Picked unit)
Groupe unité - Add (Picked unit) to ToA_GrpAlreadyDamaged
Unité - Move ToA_Dummy2 instantly to ToA_AxesPoint2[ToA_Integer], facing ToA_TargetPoint
Custom script:   set bj_wantDestroyGroup = true
Collapse Groupe unité - Pick every unit in (Units within 125.00 of ToA_AxesPoint2[ToA_Integer] matching ((((Matching unit) belongs to an enemy of (Owner of ToA_Caster)) Egal à  TRUE) and (((Matching unit) is in ToA_GrpAlreadyDamaged) Egal à  FALSE))) and do (Actions)
Collapse Boucle - Actions
Unité - Cause ToA_Caster to damage (Picked unit), dealing 50.00 damage of attack type Héros and damage type Universel
Unité - Create 1 Dummy Bleeding for (Owner of ToA_Caster) at ToA_AxesPoint[ToA_Integer] facing Orientation bâtiment par défaut degrees
Unité - Add a 0.50 second Générique expiration timer to (Last created unit)
Unité - Order (Last created unit) to Attaque une fois (Picked unit)
Groupe unité - Add (Picked unit) to ToA_GrpAlreadyDamaged
Table de hachage - Save Handle OfToA_GrpAlreadyDamaged as 6 of (Key (Picked unit)) in ToA_Hashtable
Collapse If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Collapse Si - Conditions
(ToA_GrpCasters is empty) Egal à  TRUE
Collapse Alors - Actions
Déclencheur - Turn off (This trigger)
Collapse Sinon - Actions



Merci infiniment de votre aide !
_________________
Le vaste monde vous entoure de tous côtés ; vous pouvez vous enclore, mais vous ne pouvez éternellement le tenir en dehors de vos clôtures.

John Ronald Reuel Tolkien.

Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage.
Polissez-le sans cesse, et le repolissez.
Ajoutez quelquefois, et souvent effacez.

Boileau
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Zaitan
Membre honoraire


Inscrit le: 16 Oct 2015
Messages: 203
Sujets: 15
Spécialité en worldedit: Soigner les petits détails


MessagePosté le: 08/04/16 07:10    Sujet du message: Citer

Salut!

Je ne maîtrise pas suffisamment les hashtables, et je ne comprend pas complètement ton déclencheur, mais j'ai aussi eu des problèmes d'accumulation de dégâts sur une même compétence.
A un moment, tu infliges les dégâts aux unités qui sont dans une certaine zone. Il faut que tu ajoutes ces unités dans un groupe et que tu ajoutes une condition comme quoi, uniquement les unités qui ne sont pas dans ce groupe peuvent subir des dégâts, puis y être ajoutées.

J'espère t'avoir aidé!
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 gisgalion
Membre honoraire


Inscrit le: 30 Oct 2013
Messages: 283
Sujets: 20
Spécialité en worldedit: Spellmaker


MessagePosté le: 08/04/16 08:40    Sujet du message: Citer

C'est justement ce que j'ai fait Zaitan ^^
Je prends toutes les unités autour du point de mon projectile qui :
1) Appartiennent à un ennemi du joueur.
2) Ne sont pas dans le groupe ToA_GrpAlreadyDamaged

Ensuite, je leur inflige des dommages puis je les ajoute au groupe. Mais c'est là que je ne comprend pas, normalement les unités ne devraient pas être de nouveau ciblées, pourtant c'est bel et bien le cas.
_________________
Le vaste monde vous entoure de tous côtés ; vous pouvez vous enclore, mais vous ne pouvez éternellement le tenir en dehors de vos clôtures.

John Ronald Reuel Tolkien.

Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage.
Polissez-le sans cesse, et le repolissez.
Ajoutez quelquefois, et souvent effacez.

Boileau
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Zaitan
Membre honoraire


Inscrit le: 16 Oct 2015
Messages: 203
Sujets: 15
Spécialité en worldedit: Soigner les petits détails


MessagePosté le: 08/04/16 10:29    Sujet du message: Citer

Ah oui, autant pour moi, j'ai mal lu ton deuxième déclencheur.

Mais il y a tellement de fonction que je n'ai jamais utilisée que j'ai de la peine à lire et comprendre ta compétence. D'autres pourront t'aider, mais pas moi, désolé Sad
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 gisgalion
Membre honoraire


Inscrit le: 30 Oct 2013
Messages: 283
Sujets: 20
Spécialité en worldedit: Spellmaker


MessagePosté le: 08/04/16 11:24    Sujet du message: Citer

Pas grave, c'est vrai que ça peut faire un peu brouillon mais il y a énormément de répétitions en fait x'D
Merci tout de même, des fois, c'est un oeil non averti qui trouve l'erreur, c'était très sympa de ta part =)
_________________
Le vaste monde vous entoure de tous côtés ; vous pouvez vous enclore, mais vous ne pouvez éternellement le tenir en dehors de vos clôtures.

John Ronald Reuel Tolkien.

Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage.
Polissez-le sans cesse, et le repolissez.
Ajoutez quelquefois, et souvent effacez.

Boileau
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Ayane
Bot administrateur


Inscrit le: 17 Sep 2007
Messages: 1961
Sujets: 49

Médailles: 2 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1) Ayane (Quantité : 1)

MessagePosté le: 08/04/16 11:59    Sujet du message: Citer

Une table de hashage (hashtable) est similaire à un tableau (array) sauf qu'au lieu de spécifier un index pour accéder à un élément on spécifie un clé qui est du type de données choisie et sans contrainte (pas de limite [0; 8092[).

Pour le problème l'utilisation de la hashtable est bizzarre, surtout avec le tableau ToA_AxesPoint vu qu'il accède à ToA_AxesPoint[(180 - ToA_Integer)] alors qu'il n'y a que ToA_AxesPoint[ToA_Integer] qui est définis ...
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 gisgalion
Membre honoraire


Inscrit le: 30 Oct 2013
Messages: 283
Sujets: 20
Spécialité en worldedit: Spellmaker


MessagePosté le: 08/04/16 12:38    Sujet du message: Citer

Ah, ce serait ça le problème ?
Mince alors...
Avant, j'avais justement ToA_AxesPoint[ToA_Integer] comme point où infliger les dégâts, et un des projectiles n'infligeait aucun dégât sur son chemin :/
Désormais, avec ToA_AxesPoint[(180 - ToA_Integer)] il inflige bel et bien des dommages.

Donc tu penses qu'en changeant ça ça devrait résoudre le problème ? Tu me conseillerais de faire quoi/comment ?

EDIT : En testant par ci et par là, j'ai pu constater que mon groupe était en effet bel et bien vide à chaque reprise du déclencheur N°2.

EDOT 2 : En ajoutant le Warchief au groupe lors du cast, j'ai constaté qu'il était bien compté comme présent dans le groupe, alors que les autres unités ne le sont pas. Donc ce serait un problème sur soit la sauvegarde de la hashtable soit l'ajout des unités au groupe.
J'ai tort ?
_________________
Le vaste monde vous entoure de tous côtés ; vous pouvez vous enclore, mais vous ne pouvez éternellement le tenir en dehors de vos clôtures.

John Ronald Reuel Tolkien.

Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage.
Polissez-le sans cesse, et le repolissez.
Ajoutez quelquefois, et souvent effacez.

Boileau
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 gisgalion
Membre honoraire


Inscrit le: 30 Oct 2013
Messages: 283
Sujets: 20
Spécialité en worldedit: Spellmaker


MessagePosté le: 11/04/16 11:16    Sujet du message: Citer

Je me permets d'up le sujet, je n'ai toujours pas réussi à comprendre pourquoi les unités ne sont pas ajoutées au groupe :/
_________________
Le vaste monde vous entoure de tous côtés ; vous pouvez vous enclore, mais vous ne pouvez éternellement le tenir en dehors de vos clôtures.

John Ronald Reuel Tolkien.

Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage.
Polissez-le sans cesse, et le repolissez.
Ajoutez quelquefois, et souvent effacez.

Boileau
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Ayane
Bot administrateur


Inscrit le: 17 Sep 2007
Messages: 1961
Sujets: 49

Médailles: 2 (En savoir plus...)
Ayane (Quantité : 1) Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 11/04/16 21:20    Sujet du message: Citer

La sauvegarde/chargement de groupe dans une hashtable doit se faire par valeur et non pas par référence.
Donc lorsque tu fais save cela sauvegarde les unités qu'il y a dans le groupe au moment de l'appel, et lorsque que tu fais load cela créé une nouvelle instance de groupe avec les unités qu'il y avait lors de la sauvegarde.
Si tu veux modifier le groupe d'une itération à une autre il te faut donc le sauvegarder dans la hashtable une fois que tu as finis de le modifier.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 gisgalion
Membre honoraire


Inscrit le: 30 Oct 2013
Messages: 283
Sujets: 20
Spécialité en worldedit: Spellmaker


MessagePosté le: 11/04/16 22:57    Sujet du message: Citer

Merci beaucoup Ayane, c'est bon, ça marche ! Me reste plus qu'à fignoler le tout =)
_________________
Le vaste monde vous entoure de tous côtés ; vous pouvez vous enclore, mais vous ne pouvez éternellement le tenir en dehors de vos clôtures.

John Ronald Reuel Tolkien.

Hâtez-vous lentement, et sans perdre courage,
Vingt fois sur le métier remettez votre ouvrage.
Polissez-le sans cesse, et le repolissez.
Ajoutez quelquefois, et souvent effacez.

Boileau
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Les sorts Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1
La question posée dans ce topic a été résolue !

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com