Inscrit le: 30 Oct 2013 Messages: 284 Sujets: 21 Spécialité en worldedit: Spellmaker
Posté le: 08/04/16 00:53 Sujet du message: Accumulation de dégâts
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:
Evénements
Unité - A unit Initie l'effet d'une compétence
Conditions
(Ability being cast) Egal à Throw of axes
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
For each (Integer A) from 0 to 359, do (Actions)
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
Evénements
Temps - Every (1.00 / 64.00) seconds of game time
Conditions
Actions
Groupe unité - Pick every unit in ToA_GrpCasters and do (Actions)
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)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
ToA_BoleanReturn Egal à FALSE
Alors - Actions
Unité - Move ToA_Dummy1 instantly to ToA_AxesPoint[(180 - ToA_Integer)], facing ToA_TargetPoint Custom script: set bj_wantDestroyGroup = true
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)
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
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)
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
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
ToA_Integer Egal à 180
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
Sinon - Actions
Set ToA_Integer = (ToA_Integer + 2) Table de hachage - Save ToA_Integer as 5 of (Key (Picked unit)) in ToA_Hashtable
Sinon - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
ToA_Integer Egal à 0
Alors - Actions
Set ToA_BoleanReturn = FALSE Groupe unité - Remove all units from ToA_GrpAlreadyDamaged Groupe unité - Remove ToA_Caster from ToA_GrpCasters
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
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
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)
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
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)
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
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(ToA_GrpCasters is empty) Egal à TRUE
Alors - Actions
Déclencheur - Turn off (This trigger)
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.
Inscrit le: 16 Oct 2015 Messages: 219 Sujets: 17 Spécialité en worldedit: Soigner les petits détails
Posté le: 08/04/16 07:10 Sujet du message:
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.
Inscrit le: 30 Oct 2013 Messages: 284 Sujets: 21 Spécialité en worldedit: Spellmaker
Posté le: 08/04/16 08:40 Sujet du message:
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.
Inscrit le: 16 Oct 2015 Messages: 219 Sujets: 17 Spécialité en worldedit: Soigner les petits détails
Posté le: 08/04/16 10:29 Sujet du message:
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é _________________
Inscrit le: 30 Oct 2013 Messages: 284 Sujets: 21 Spécialité en worldedit: Spellmaker
Posté le: 08/04/16 11:24 Sujet du message:
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.
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 ... _________________
Inscrit le: 30 Oct 2013 Messages: 284 Sujets: 21 Spécialité en worldedit: Spellmaker
Posté le: 08/04/16 12:38 Sujet du message:
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.
Inscrit le: 30 Oct 2013 Messages: 284 Sujets: 21 Spécialité en worldedit: Spellmaker
Posté le: 11/04/16 11:16 Sujet du message:
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.
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. _________________
Inscrit le: 30 Oct 2013 Messages: 284 Sujets: 21 Spécialité en worldedit: Spellmaker
Posté le: 11/04/16 22:57 Sujet du message:
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.
Page 1 sur 1 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