function Trig_Retablissement_Func019002 takes nothing returns boolean
return ( GetUnitTypeId(GetTriggerUnit()) == GetUnitTypeId(GetTriggerUnit()) )
endfunction
function Trig_Retablissement_Conditions takes nothing returns boolean
if ( not GetBooleanAnd( Trig_Retablissement_Func019001(), Trig_Retablissement_Func019002() ) ) then
return false
endif
return true
endfunction
function Trig_Retablissement_Func014C takes nothing returns boolean
local unit LocalSortsUnitCible = GetSpellTargetUnit()
if ( not ( UnitHasBuffBJ(LocalSortsUnitCible, 'B000') == true ) ) then
return false
endif
return true
endfunction
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 07/02/10 16:16 Sujet du message:
Les seules variables locales nécessaires sont celles dans l'action de trigger car tu utilises un wait.
Tu as besoin d'utiliser une variable locale pour l'unité que tu créé "last created unit" est par définition non multi instanciable, étant donné que ca retourne la dernière unité crée.
Pour ton edit, il s'agit d'un bug des balises du forum, tu n'y es absolument pour rien. _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 07/02/10 16:41 Sujet du message:
Citation:
Oui mais la conditoon où j'ai mis une variable locale fait partie du wait. Donc il faut la locale non?
Non car c'est avant le wait, et même si c'était après le wait une variable locale n'est accessible que dans la fonction où elle a été déclarée.
Tu devrais dans ce cas utiliser une variable globale tampon (que tu set juste avant l'appel de la fonction condition).
Tu ne peux pas utiliser d'arguments dans une action de trigger (takes ...), tu dois mettre "takes nothing" _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 07/02/10 18:05 Sujet du message:
Pourquoi les nullifier?
Secret:
Jass:
loop
exitwhen i > 10
set udg_VariableUniteGlobale = LocalSortsUnitCible
if not ( UnitHasBuffBJ(udg_VariableUniteGlobale, 'B000') then
call PolledWait( 1.00 )
call SetUnitLifeBJ( LocalSortsUnitCible, ( GetUnitStateSwap(UNIT_STATE_LIFE, LocalSortsUnitCible) + ( 60.00 + ( 20.00 * I2R(GetUnitAbilityLevelSwapped('A001', GetTriggerUnit())) ) ) ) )
else
endif
set i=i+1
endloop
call PolledWait( 0.50 )
call RemoveUnit( dummy )
set dummy = null
set LocalSortsUnitCible = null
set LocalSortsPoint =null
endfunction
Là je suis plus trop... L'autre fonction (lancienne condition) il faut que je la supprime?
Quand j'active le déclo ça m'affiche:
- set udg_VariableUniteGlobale = LocalSortsUnitCible : attendait un nom de variable;
- if not ( UnitHasBuffBJ(udg_VariableUniteGlobale, 'B000') then : attendait un nom;
- else : attendait un "endloop";
- endif : attendait un "endloop"
Avec cette variable globale la multiinstanciabilité est toujours là?
Secret:
Tu es un bon pédagogue, j'apprend le Jass avec toi .
EDIT: non, j'avais oublié un 'e' désolé. Maintenent il n'y a plus aucune faute mais la boucle ne s'active toujours pas. _________________
Inscrit le: 23 Aoû 2007 Messages: 7146 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 07/02/10 19:43 Sujet du message:
Hmm j'ai édité mon post, tu as du le lire avant l'édit je penses.
Il faut nullifier les variables locales, sinon tu auras un leak de reference d'handle quand l'handle sera détruit et qu'une variable pointe encore dessus.
C'est toujours MUI avec la variable globale, car entre le set et son utilisation il n'y a aucun wait.
Mais si tu utilises la façon plus clean sans la variable globale, en effet la fonction Trig_Retablissement_Func014C devient inutile et tu peux la supprimer.
D'ailleurs c'est horrible comment le GUI gère les conditions, les appels de fonctions sont totalement inutiles et rendent l'utilisation d'une variable locale plus difficile ... _________________
function Trig_Feu_stellaire_Conditions takes nothing returns boolean
if ( not GetBooleanAnd( Trig_Feu_stellaire_Func019001(), Trig_Feu_stellaire_Func019002() ) ) then
return false
endif
return true
endfunction
function Trig_Feu_stellaire_Func014Func001C takes nothing returns boolean
if ( not ( IsUnitAliveBJ(udg_VariableUnite) == true ) ) then
return true
endif
if ( not ( UnitHasBuffBJ(udg_VariableUnite, 'B002') == true ) ) then
return true
endif
return true
endfunction
function Trig_Feu_stellaire_Func014Func008Func002Func001C takes nothing returns boolean
if ( not ( GetOwningPlayer(GetEnumUnit()) == GetEnumPlayer() ) ) then
return false
endif
return true
endfunction
function Trig_Feu_stellaire_Func014Func008Func002A takes nothing returns nothing
if ( Trig_Feu_stellaire_Func014Func008Func002Func001C() ) then
call UnitDamageTargetBJ( GetTriggerUnit(), GetEnumUnit(), ( 90.00 * I2R(GetUnitAbilityLevelSwapped('A000', GetTriggerUnit())) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
else
endif
endfunction
function Trig_Feu_stellaire_Func014Func008A takes nothing returns nothing
local unit LocalSortsUnitCible = GetSpellTargetUnit()
set bj_wantDestroyGroup = true
call ForGroupBJ( GetUnitsInRangeOfLocAll(512.00, GetUnitLoc(LocalSortsUnitCible)), function Trig_Feu_stellaire_Func014Func008Func002A )
endfunction
function Trig_Feu_stellaire_Func014C takes nothing returns boolean
if ( not Trig_Feu_stellaire_Func014Func001C() ) then
return false
endif
return true
endfunction
function Trig_Feu_stellaire_Actions takes nothing returns nothing
local integer i=1
local location LocalSortsPoint = GetUnitLoc(GetSpellTargetUnit())
local unit LocalSortsUnitCible = GetSpellTargetUnit()
local unit dummy
call AddSpecialEffectLocBJ( LocalSortsPoint, "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl" )
call DestroyEffectBJ( GetLastCreatedEffectBJ() )
call UnitDamageTargetBJ( GetTriggerUnit(), LocalSortsUnitCible, ( 100.00 * I2R(GetUnitAbilityLevelSwapped('A000', GetTriggerUnit())) ), ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
call CreateNUnitsAtLoc( 1, 'h000', Player(PLAYER_NEUTRAL_PASSIVE), LocalSortsPoint, bj_UNIT_FACING )
set dummy = GetLastCreatedUnit()
call SetUnitVertexColorBJ( dummy, 100, 100, 100, 100.00 )
call UnitAddAbilityBJ( 'A00C', dummy )
call IssueTargetOrderBJ( dummy, "shadowstrike", LocalSortsUnitCible )
call RemoveLocation( LocalSortsPoint)
loop
exitwhen i > 4
set udg_VariableUnite = LocalSortsUnitCible
if ( Trig_Feu_stellaire_Func014C() ) then
call PolledWait( 3.00 )
set LocalSortsPoint = GetUnitLoc(LocalSortsUnitCible)
call AddSpecialEffectLocBJ( LocalSortsPoint, "Abilities\\Spells\\Items\\AIre\\AIreTarget.mdl" )
call DestroyEffectBJ( GetLastCreatedEffectBJ() )
call RemoveLocation( LocalSortsPoint)
set bj_wantDestroyGroup = true
call ForForce( GetPlayersAllies(GetOwningPlayer(LocalSortsUnitCible)), function Trig_Feu_stellaire_Func014Func008A )
else
endif
set i=i+1
endloop
call PolledWait( 0.50 )
call RemoveUnit( GetLastCreatedUnit() )
endfunction
//===========================================================================
function InitTrig_Feu_stellaire takes nothing returns nothing
set gg_trg_Feu_stellaire = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Feu_stellaire, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( gg_trg_Feu_stellaire, Condition( function Trig_Feu_stellaire_Conditions ) )
call TriggerAddAction( gg_trg_Feu_stellaire, function Trig_Feu_stellaire_Actions )
endfunction
Dans la fonction Trig_Feu_stellaire_Actions tout marche bien sauf au moment du pick every player et ça change de fonction. Donc ma variable LocalSortsUnitCible ne marche plus Les dégâts aux unités adjacente de la cible ne fonctionnent pas. J'ai essayé de copier les actions des autres fonctions pour les mettre dans la fonction Trig_Feu_stellaire_Actions mais ça ne marche pas .
Comment faire? -> si j'utilise une variable globale comme dans l'ancien déclo, le sort ne sera plus multiinstanciable puisqu'il y a des wait entre. _________________
Function Trig_Retablissement_Func014C takes nothing returns boolean
if ( not ( UnitHasBuffBJ(udg_VariableUnite, 'B000') == true ) ) then
return true
endif
return true
endfunction
Jass:
Function Trig_Retablissement_Func014C takes nothing returns boolean
return UnitHasBuffBJ(udg_VariableUnite, 'B000')
endfunction
Ou encore
Jass:
Function Trig_Retablissement_Func014C takes nothing returns boolean
return GetUnitAbilityLevel(udg_VariableUnite, 'B000')>=1
endfunction
Euh je comprends pas trop, je suis nul en Jass...
La première fonction que je t'ai mise: tu gagnes simplement des lignes de code.
Ca revient exactement au même que la tienne, mais en présenté différement (et plus court).
La deuxième: en utilisant le même système de code condensé (directement return blablabla au lieu d'inclure un if/then/else), je te montrais une autre façon de détecter la présence d'un Buff, qui t'évite de te servir de UnitHasBuffBJ() mais revient exactement au même.
Ton nouveau déclencheur:
Alors déjà remarque générale: lorsque tu utilises un Wait et que tes variables locales sont rendues obsolètes lors du changement de fonction, c'est là que le VJass est utile. Tu peux utiliser des structs. Cela dit je suppose que tu ne veux pas encore t'en servir.
Autre méthode, donc: les Hashtables. Mais je n'aime pas du tout m'en servir donc je ne pourrais pas trop t'aider à ce sujet.
Troisième méthode: utiliser le groupe DANS la fonction.
Je n'ai pas accès à l'éditeur en ce moment mais l'idée c'est que:
Jass:
function blabla takes nothing returns nothing
call ForGroupBJ( GetUnitsInRangeOfLocAll(512.00, GetUnitLoc(LocalSortsUnitCible)), function Trig_Feu_stellaire_Func014Func008Func002A )
enfunction
Avec au dessus ta fonction Trig_Feu_stellaire_Func014Func008Func002A doit devenir:
Jass:
function blabla takes nothing returns nothing
local group g = CreateGroup()
local unit pickedUnit
set g = Cequetuveuxcommegroup
loop
set pickedUnit = FirstOfGroup(g)
exitwhen pickedUnit==null
call UneFonctionSurTonUnité pickedUNit
call GroupRemoveUnit(g,pickedUnit)
endloop
//Ne pas oublier de détruire/nullifier les variables locales
set pickedUnit = null
call DestroyGroup(g)
set g = null
endfunction
En gros l'idée, tant que utiliseras des Wait, c'est de te servir du groupe dans la même fonction du début à la fin.
Ensuite, tu lance une boucle qui va attribuer à la variable unité pickedUnit la première unité trouvée pour le groupe g.
La boucle s'arrête quand pickedUnit renvoie null, à savoir que plus aucune unité n'est dans ce groupe.
En effet, tu demandes à chaque fois GroupRemoveUnit, ce qui vire l'unité de ton groupe.
Ca c'est pour avoir un groupe au sein d'une fonction.
Maintenant, si tu veux récupérer tes unités plus tard, tu peux les stocker en même temps dans une variable array.
Donc dans la boucle, quelque chose comme:
Jass:
function blabla takes nothing returns nothing
local group g = CreateGroup()
local unit pickedUnit
local unit array indexedUnit
local integer i = 0
local integer stack = 0
set g = Cequetuveuxcommegroup
loop
set pickedUnit = FirstOfGroup(g)
exitwhen pickedUnit==null
call UneFonctionSurTonUnité pickedUNit
set indexedUnit[i]= pickedUnit
set i = i + 1
call GroupRemoveUnit(g,pickedUnit)
endloop
set i = stack
//blablabla
//maintenant tu veux retrouver les unités indexées:
set i = 0
loop
exitwhen i > stack
call UneFonctionSurTonUnité indexedUnit[i]
set i = i + 1
endloop
//Ne pas oublier de détruire/nullifer les locales
set pickedUnit = null
call DestroyGroup(g)
set g = null
set i = 0
loop
exitwhen i > stack
set indexedUnit[i] = null
set i = i + 1
endloop
endfunction
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 09/02/10 11:18 Sujet du message:
Citation:
Tu peux utiliser des structs. Cela dit je suppose que tu ne veux pas encore t'en servir.
Si, je veux bien m'en servir, parce que là ton autre soluce je comprends pas trop.
Par contre j'ai l'impression que mon JassNewGenPack est périmé: quand j'ouvre une carte TFT ça m'affiche que le fichier est trop récent .
(mais je peux quand même l'ouvrir) _________________
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