Inscrit le: 01 Mai 2014 Messages: 35 Sujets: 5 Spécialité en worldedit: France
Posté le: 15/11/14 11:41 Sujet du message: Petit Bug TriggerDynamique [vJass]
Bonjour à tous,
J'ai essayé de faire un sort alors tout d'abord voilà le descriptif du sort.
Tempest Blade [ACTIF] :
Saber déchaîne toute la puissance d'excalibur, envoyant une tempête de coups en avant, repoussant les ennemis et leur infligeant 5xPuissance.
Les ennemis tués rapportent 1.5xContitution points de vie et 1.5xRessource points de mana.
(Puissance=Agilité,Ressource = Intelligence, Constitution = Force)
Et voici donc le scope de mon sort..Mais le problème c'est que le trigger dynamique avec la function knock ne se lance pas je ne comprend pas pourquoi :
globals
private constant attacktype AT = ATTACK_TYPE_HERO
private constant damagetype DT = DAMAGE_TYPE_DEATH
private constant integer CONSTANT = 5 //C'est le facteur par lequelle la stat va être multiplié changé le si vous voulez augmentez ou diminuez les dégats
private constant string SE = "Abilities\\Spells\\Undead\\Unsummon\\UnsummonTarget.mdx"
private constant integer REG = 2
private constant integer SPELL = 'A005'
private constant real KNOCK = 25
private hashtable ht = InitHashtable()
endglobals
/*************************************************************FUNCTIONS************************************************************************/
private function Targets takes unit tu, unit caster returns boolean
//Les unités affecté par le spell
return (GetWidgetLife(tu) > 0.405) and (IsUnitType(tu, UNIT_TYPE_STRUCTURE) == false) and (IsUnitType(tu, UNIT_TYPE_MAGIC_IMMUNE) == false) and IsPlayerAlly(GetOwningPlayer(tu), GetOwningPlayer(caster)) == false
endfunction
private function dammage takes group g, unit caster, integer AGI, integer CONSTANT,attacktype AT, damagetype DT returns nothing
local unit f
loop
set f = FirstOfGroup(g)
exitwhen(f == null)
if Targets(f,caster) then
call UnitDamageTarget(caster, f, (AGI*CONSTANT) , true, false, AT, DT, null)
endif
call GroupRemoveUnit(g, f)
set f = null
endloop
call DestroyGroup(g)
endfunction
function Destroy takes nothing returns nothing
local unit caster = LoadUnitHandle(ht,0,GetHandleId(GetExpiredTimer()))
local group g = GetUnitsInRangeOfLocAll(1500,GetUnitLoc(caster))
local unit f
loop
exitwhen(f == null)
set f = FirstOfGroup(g)
if GetUnitUserData(f) == 10 then
call SetUnitUserData(f,0)
endif
call GroupRemoveUnit(g,f)
endloop
call DestroyTrigger( LoadTriggerHandle(ht,0,GetHandleId( GetExpiredTimer())))
call FlushChildHashtable( ht, GetHandleId( GetExpiredTimer()) )
call DestroyTimer(GetExpiredTimer())
endfunction
function knock takes nothing returns nothing
local unit f
local unit caster = LoadUnitHandle(ht,0,GetHandleId(GetTriggeringTrigger()))
local location p1
local location pcast = GetUnitLoc(caster)
local location p2
local location s = LoadLocationHandle(ht,0,GetHandleId(GetTriggeringTrigger()))
local real ang
local group g = GetUnitsInRangeOfLocAll(400,s)
local boolean b = (GetWidgetLife(f) > 0.405) and (IsUnitType(f, UNIT_TYPE_STRUCTURE) == false) and IsPlayerAlly(GetOwningPlayer(f), GetOwningPlayer(caster)) == false
call DestroyEffect(AddSpecialEffect(SE,GetUnitX(caster),GetUnitY(caster)))
loop
set f = FirstOfGroup(g)
exitwhen(f == null)
set p1 = GetUnitLoc(f)
set ang = AngleBetweenPoints(p1, pcast)
set p2 = PolarProjectionBJ(p1, KNOCK, ang)
call SetUnitPositionLoc(f,p2)
call DestroyEffect(AddSpecialEffect(SE,GetUnitX(f),GetUnitY(f)))
call GroupRemoveUnit(g, f)
endloop
call RemoveLocation(p1)
call RemoveLocation(p2)
set f = null
set p1 = null
set p2 = null
endfunction
/*************************************************************ACTIONS************************************************************************/
private function Actions takes nothing returns nothing
local location s = GetSpellTargetLoc()
local unit caster = GetSpellAbilityUnit()
local integer pui = GetHeroAgi(caster, true)
local integer con = GetHeroStr(caster, true)
local integer res = GetHeroInt(caster, true)
local trigger trig
local group g = GetUnitsInRangeOfLocAll(400, s)
local timer tim
set trig = CreateTrigger()
///Fin de déclaration
set tim = CreateTimer()
//HASHTABLE
call SaveTriggerHandle(ht,0,GetHandleId(tim),trig)
call SaveUnitHandle(ht,0,GetHandleId(trig),caster)
call SaveLocationHandle(ht,0,GetHandleId(trig),s)
//FINHASHTABLE
//TriggerSet
call TimerStart(tim, 1.00, TRUE, function Destroy)
call TriggerRegisterTimerEventPeriodic(trig,0.05)
call TriggerAddAction(trig, function knock)
//EndTriggerSet
//Dammage
call dammage(g,caster,pui,CONSTANT,AT,DT)
endfunction
/*************************************************************TRIGGER************************************************************************/
private function init takes nothing returns nothing
if GetSpellAbilityId() == SPELL then
call Actions()
endif
endfunction
private function check takes nothing returns nothing
set gg_trg_TempestBlade = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_TempestBlade, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddAction( gg_trg_TempestBlade, function init )
endfunction
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
Posté le: 15/11/14 14:20 Sujet du message:
Tu es sûr qu'il ne se lance pas ? Peut-être se lance t-il mais ne fonctionne pas. Met un BJDebugMsg au début de la fonction knock, si il apparaît pas en jeu, c'est bien que la fonction ne prend pas effet,sinon c'est qu'elle bug quelque part. _________________
Inscrit le: 01 Mai 2014 Messages: 35 Sujets: 5 Spécialité en worldedit: France
Posté le: 15/11/14 14:42 Sujet du message:
J'ai essayé avec un
Jass:
call BJDebugMsg("bug")
Et donc le trigger dynamique ne se lance pas pourtant y'a pas l'air d'avoir de problème ni au niveau de la création du trigger ni dans l'event du trigger.. _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 15/11/14 19:41 Sujet du message:
Ectelion a écrit:
Essaye de mettre la handle du lanceur plutôt que celle du timer, pour voir si ça vient de là.
Dans la GRANDE majorité des cas, l'handle du timer est bien plus appréciable. Celui du lanceur bousille juste la multi-instanciabilité. _________________
Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
Posté le: 15/11/14 23:36 Sujet du message:
Sapeur-Goblin a écrit:
Ectelion a écrit:
Essaye de mettre la handle du lanceur plutôt que celle du timer, pour voir si ça vient de là.
Dans la GRANDE majorité des cas, l'handle du timer est bien plus appréciable. Celui du lanceur bousille juste la multi-instanciabilité.
Secret:
Personnellement j'utilise un dummy pour faire la handle, comme il en utilisait pas, je lui ait conseillé d'utiliser celle du lanceur. Car en effet comme il n'utilisait pas TimerUtils(qui est quand même présent dans de nombreux sorts/systèmes), j'ai supposé que le problème venait de l'assignation/récupération de la handle du timer et ait cherché une méthode pour le vérifier. (ça venait d'autre part)
Secret:
En plus le problème là c'est même pas la multi-instanciabilité.
Ensuite, généralement peu de sorts sont multi-instanciables au point d'être lançables part la même unité en un temps infime(sauf dans les maps de test, même si c'est quand même pas nécessaire). Donc j'imagine que dans une grande majorité de cas on peut utiliser l'handle du lanceur(enfin ça c'est un autre débat).
Je vois pas d'où peut venir l'erreur, regarde juste si le trigger ne vaut pas null pour quelque raison que ce soit. _________________
Tu utilises deux fois le même emplacement pour stocker deux choses différentes : la location va remplacer l'unité.
Utilise un autre index pour la location (n'oublie pas de le modifier pour le load aussi).
On peut stocker un booléan, un entier, un réel et un handle dans un même slot de hashtable sans problème. Comme tu as deux handle, là, ça rentre en conflit.
Sans doute que tu as eu l'impression que le trigger ne se lançait pas parce qu'il est arrêté pendant la création des variables locales parce que l'unité est invalide.
Enfin, si tu es passé sur une autre méthode, c'est bon, mais tu le sauras pour la prochaine fois. _________________
Inscrit le: 01 Mai 2014 Messages: 35 Sujets: 5 Spécialité en worldedit: France
Posté le: 16/11/14 10:38 Sujet du message:
Ah ouais j'avais pas fait gaffe y'a la même key...Merci en tout cas mais je suis passé par une fonction gentiment fournit par Flo ! Mais je saurais pour la prochaine fois _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 16/11/14 13:37 Sujet du message:
Ectelion a écrit:
Personnellement j'utilise un dummy pour faire la handle, comme il en utilisait pas, je lui ait conseillé d'utiliser celle du lanceur.
Si tu utilises un dummy, oui, ça marche.
Citation:
Car en effet comme il n'utilisait pas TimerUtils(qui est quand même présent dans de nombreux sorts/systèmes), j'ai supposé que le problème venait de l'assignation/récupération de la handle du timer et ait cherché une méthode pour le vérifier. (ça venait d'autre part)
Ça ne change absolument rien d'utiliser timerutils ou pas.
Citation:
En plus le problème là c'est même pas la multi-instanciabilité
Non, ce n'est pas ça le problème de départ mais ce que tu proposes ajoute ce dysfonctionnement. Donc autant éviter.
Citation:
Ensuite, généralement peu de sorts sont multi-instanciables au point d'être lançables part la même unité en un temps infime(sauf dans les maps de test, même si c'est quand même pas nécessaire). Donc j'imagine que dans une grande majorité de cas on peut utiliser l'handle du lanceur
Si si, c'est justement ça la multi-instanciabilité. Et si, c'est nécessaire. Pour un sort qui dure 10 secondes avec 2 secondes de rechargement, j'ai bien envie de voir la gueule de l'effet avec ta pseudo-multi-instanciabilité.
Citation:
(enfin ça c'est un autre débat)
Si, c'est justement ça le débat. _________________
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