Posté le: 22/05/17 19:32 Sujet du message: invulnerabilité spéciale via trigger
Bonsoir à tous !
J'ai tenté de construire un système qui donne à un unité la capacité, lors de mort imminente, de s'immuniser à cette dernière pendant un laps de temps donné.
En effet, le système fonctionne lorsque peu d'ennemi attaquent l'unité en question, mais dès que les sources de dégât se font trop importantes, il arrive qu'elle meurt avant la fin de cette capacité.
Voici mes deux déclencheur qui concernent le système.
Secret:
Gui:
Trigger:
Initialization and settings
Evénements
Temps - Elapsed game time is 0.10 seconds
Conditions
Actions
Groupe unité - Pick every unit in (Units in (Playable map area)) and do (Actions)
Boucle - Actions
Déclencheur - Add to Lifesteal <gen> the event (Unité - (Picked unit) Subit des dégâts) If ((Unit-type of (Picked unit)) Egal à Grom Hellscream) then do (Déclencheur - Add to UndyingRage <gen> the event (Unité - (Picked unit) Subit des dégâts)) else do (Do nothing)
Set LSA_FloatingText = TRUE
Secret:
Gui:
Trigger:
UndyingRage Evénements
Conditions
(Damage taken) Supérieur ou égal à (Vie of (Triggering unit)) isUndyingRageInCd Egal à FALSE
Actions
Set tempUnit = (Triggering unit) Set DmgTakenUndyingRage = (Damage taken) Unité - Set life of tempUnit to (DmgTakenUndyingRage + 2.00)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
HasUndyingRageBuff Egal à FALSE
Alors - Actions
Unité - Create 1 Dummy for (Owner of tempUnit) at (Position of tempUnit) facing Orientation bâtiment par défaut degrees Unité - Add Furie sanguinaire to (Last created unit) Unité - Order (Last created unit) to Chaman orc - Furie sanguinaire tempUnit Unité - Add a 2.00 second Générique expiration timer to (Last created unit) Set HasUndyingRageBuff = TRUE
Sinon - Actions
Wait 10.00 seconds
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
HasUndyingRageBuff Egal à TRUE
Alors - Actions
Partie - Display to (All players) the text: La rage s'estompe Set HasUndyingRageBuff = FALSE
Sinon - Actions
Compte à rebours - Start UndyingRageTimer as a Un coup timer that will expire in 10.00 seconds Set isUndyingRageInCd = TRUE
La vie du héros devrait être maintenue à 2 minimum pendant 10 secondes.
Concernant le leak, je suis au courant. Cette map n'étant utile que pour les tests, je ne m'en préoccupe pas.
Pour moi, je pense jusque que tellement d’événement sont générés que le code ne parvient pas à être aussi précis que je ne le voudrais.
Qu'en pensez-vous? Avez vous une idée pour le rendre infaillible?
Merci à vous.
EDIT : ce système fonctionne de concert avec un système de vol de vie commandé par le trigger suivant. Il me semble comprendre que c'est ce système qui provoque parfois la mort du héro. Si je le désactive, il devient bien invulnérable pour ce temps.
Secret:
Gui:
Trigger:
Lifesteal Evénements Conditions
Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
(Unit-type of (Damage source)) Egal à Grom Hellscream ((Triggering unit) is Un bâtiment) Egal à FALSE ((Triggering unit) is Mécanique) Egal à FALSE
Alors - Actions
Set LSA_DamagesTaken = (Damage taken) Set tempA = (100.00 - (Percentage life of (Damage source))) Set tempB = (tempA / 1.50) Partie - Display to (All players) the text: (String(tempA)) Partie - Display to (All players) the text: (String((tempB x 0.01))) Set LSA_DamageTakenR = (LSA_DamagesTaken x (0.01 x tempB))
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
HasUndyingRageBuff Egal à TRUE
Alors - Actions
Set LSA_DamageTakenR = (LSA_DamageTakenR x 2.00)
Sinon - Actions
Set LSA_DamageTakenS = (String((Integer(LSA_DamageTakenR)))) Unité - Set life of (Damage source) to ((Vie of (Damage source)) + (Real(LSA_DamageTakenS))) Effet spécial - Create a special effect attached to the origin of (Damage source) using AbilitiesSpellsUndeadVampiricAuraVampiricAuraTarget.mdl
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
LSA_FloatingText Egal à TRUE
Alors - Actions
Texte flottant - Create floating text that reads LSA_DamageTakenS above (Damage source) with Z offset 0.00, using font size 10.00, color (10.00%, 100.00%, 10.00%), and 10.00% transparency Texte flottant - Change (Last created floating text): Désactiver permanence Texte flottant - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees Texte flottant - Change the fading age of (Last created floating text) to 0.40 seconds Texte flottant - Change the lifespan of (Last created floating text) to 1.20 seconds
Sinon - Actions
Sinon - Actions
_________________
Dernière édition par louisdespi le 23/05/17 17:20; édité 4 fois
A première vue, tu n'utilises pas de Damage Detection System, par conséquent ton événement "Une unité subit des dégâts" se déclenche APRES résolution des dégâts, soit ton unité a déjà perdu ses points de vie.
Pour vérifier, créer une unité avec 1000 points de dégâts, et donne 500 points de vie à ton héros. Il mourra à 100% sans que la capacité ne se déclenche, puisque normalement, ses points de vie seront de -500 (en omettant l'armure) et sera donc mort. Tu auras beau le soigné, ton personnage est mort (et au passage, a déclenché l'événement "Une unité meurt"). Peut-être que les fois où il fonctionne ton unité n'est pas considérée comme morte avec un lag, ou un petit bug. On est pas à l'abri sur Warcraft lors de cas comme celui-ci.
Pour faire court, impossible sans DDS de le rendre "infaillible" selon moi. _________________
A première vue, tu n'utilises pas de Damage Detection System, par conséquent ton événement "Une unité subit des dégâts" se déclenche APRES résolution des dégâts, soit ton unité a déjà perdu ses points de vie.
C'est étrange ce que tu dis là, car dans la majorité des cas, j'arrive à maintenir le héros à exactement 2-3 pdv.
Quant aux attaquant, pour le test, j'ai mis des dégâts de type Chaos, afin d'ignorer l'armure. sachant que ces unités tapent à +/- à 20 de dégâts
Si ce que tu dis est vrai, il devrait être impossible de le maintenir en vie, dans TOUS les cas. Non?
J'ai trouvé ceci dans le lien envoyé par Hisoka, peut-être cela aurait-il un lien avec mon problème.
Troll-Brain a écrit:
Si mes souvenirs sont bons, lorsque l’événement "une unité subit des dégâts" se produit, les dégâts ne sont pas encore appliqués.
Et donc à ce moment il suffit de vérifier si les dégâts sont supérieurs aux points de vie actuels de l'unité (sans oublier les 0.405, aller 0.5 pour être safe).
Troll-Brain a écrit:
[...] une unité meurt si elle a 0.405 points de vie, ou un truc du style.
Vaut mieux le prendre en compte.
J'insiste sur le fait que lorsque le système de vol de vie n'est pas activé, il semble n'y avoir aucun bug imprévu quand à sa survie.
Je vais tester un petit peu avec ces nouveaux éléments. Si réponse trouvée, je posterai le déclencheur final ici. _________________
J'ai éclaircis un peu le tout, créé quelques variables et de manière surprenante cela s'est mis à fonctionner.
En même temps, je ne comprenais pas trop ce qui ne marchais pas là dedans.
Voici les déclencheurs finaux :
Secret:
Gui:
Trigger:
Initialization
Evénements
Temps - Elapsed game time is 0.10 seconds
Conditions
Actions
Set tempRect = (Playable map area)
Groupe unité - Pick every unit in (Units in tempRect) and do (Actions)
Boucle - Actions
Déclencheur - Add to Lifesteal <gen> the event (Unité - (Picked unit) Subit des dégâts) If ((Unit-type of (Picked unit)) Egal à Grom Hellscream) then do (Déclencheur - Add to LastBreath <gen> the event (Unité - (Picked unit) Subit des dégâts)) else do (Do nothing)
Custom script: call RemoveRect(udg_tempRect)
Secret:
Gui:
Trigger:
LastBreath Evénements
Conditions
(Damage taken) Supérieur ou égal à ((Vie of (Triggering unit)) - 1.00) LB_Available Egal à TRUE
Actions
Set LB_GromUnit = (Triggering unit) Set LB_DamagesTaken = (Damage taken) Unité - Set life of LB_GromUnit to (LB_DamagesTaken + 1.00)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
LB_IsActive Egal à FALSE
Alors - Actions
Set LB_TempPoint = (Position of LB_GromUnit) Unité - Create 1 Dummy for (Owner of LB_GromUnit) at (Position of LB_GromUnit) facing Orientation bâtiment par défaut degrees Custom script: call RemoveLocation(udg_LB_TempPoint) Unité - Add Furie sanguinaire to (Last created unit) Unité - Order (Last created unit) to Chaman orc - Furie sanguinaire LB_GromUnit Unité - Add a 2.00 second Générique expiration timer to (Last created unit) Set LB_IsActive = TRUE
Sinon - Actions
Wait 10.00 seconds Set LB_IsActive = FALSE Set LB_Available = FALSE Compte à rebours - Start LB_Cooldown as a Un coup timer that will expire in 10.00 seconds
Secret:
Gui:
Trigger:
LastBreathCooldown
Evénements
Temps - LB_Cooldown expires
Conditions
Actions
Set LB_Available = TRUE
Secret:
Gui:
Trigger:
Lifesteal Evénements
Conditions
(Unit-type of (Damage source)) Egal à Grom Hellscream ((Triggering unit) is Un bâtiment) Egal à FALSE ((Triggering unit) is Mécanique) Egal à FALSE
Actions
Set LS_GromUnit = (Damage source) Set tempA = (100.00 - (Percentage life of LS_GromUnit)) Set tempB = (tempA / 2.00) Set LS_HealAmountReal = ((Damage taken) x (0.01 x tempB)) If (LB_IsActive Egal à TRUE) then do (Set LS_HealAmountReal = (LS_HealAmountReal x 2.00)) else do (Do nothing) Set LS_HealAmountString = (String((Integer(LS_HealAmountReal)))) Set LS_NewHealth = ((Vie of LS_GromUnit) + (Real(LS_HealAmountString))) Unité - Set life of LS_GromUnit to LS_NewHealth
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Si - Conditions
LS_HealAmountReal Supérieur à 0.00
Alors - Actions
Effet spécial - Create a special effect attached to the origin of (Damage source) using AbilitiesSpellsUndeadVampiricAuraVampiricAuraTarget.mdl Effet spécial - Destroy (Last created special effect) Texte flottant - Create floating text that reads LS_HealAmountString above LS_GromUnit with Z offset 0.00, using font size 10.00, color (10.00%, 100.00%, 10.00%), and 10.00% transparency Texte flottant - Change (Last created floating text): Désactiver permanence Texte flottant - Set the velocity of (Last created floating text) to 64.00 towards 90.00 degrees Texte flottant - Change the fading age of (Last created floating text) to 0.40 seconds Texte flottant - Change the lifespan of (Last created floating text) to 1.20 seconds
Sinon - Actions
Je pense avoir retiré toutes les possibilités de leak.
Merci pour votre aide à tous les 2. _________________
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