private struct str
unit caster
boolean isdefending = false
timer ti = null
private static method createFilter takes unit u returns boolean
return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and IsUnitType(u,UNIT_TYPE_HERO)==false
endmethod
private method onCreate takes nothing returns nothing
set .isdefending = false
set .caster = me
set .ti = null
endmethod
implement AutoCreate
private method onDestroy takes nothing returns nothing
call ReleaseTimer(.ti)
set .ti = null
set .isdefending = false
set .caster = null
endmethod
implement AutoDestroy
endstruct
private function Update takes nothing returns nothing
local str this = GetTimerData(GetExpiredTimer() )
call IssueImmediateOrder(this.caster,"undefend")
set this.isdefending = false
endfunction
private function IniWait takes unit whichUnit returns nothing
local str this = str[whichUnit]
set this.isdefending = true
set this.caster = whichUnit
call IssueImmediateOrder(this.caster,"defend")
set this.ti = NewTimer()
call SetTimerData(this.ti, this)
call TimerStart (this.ti,DURATION, false, function Update)
endfunction
private function CheckStatus takes unit whichUnit returns nothing
local str this = str[whichUnit]
if this.isdefending == false then
call IniWait(whichUnit)
endif
endfunction
private function Conditions takes nothing returns boolean
local unit victim = GetTriggerUnit()
if victim!= null and GetUnitState(victim,UNIT_STATE_LIFE)>0 then
call CheckStatus(victim)
endif
set victim = null
return false
endfunction
public function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition(t, Condition(function Conditions))
endfunction
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 10/03/10 18:49 Sujet du message:
En toute logique si le code a été bien conçu str[<unit>] devrait être égal à 0 pour une unité dont aucune instance a été liée, mais en aucun cas cela ne créé une instance, on obtient simplement l'instance liée à l'unité.
Mais oui tu dois faire toi même cette vérification car le booléen avec pour index 0 sera forcément égal à false.
- CheckStatus est plutôt inutile car tu ne l'appelles qu'une fois tu peux parfaitement l'inliner, puis côté speed freak une fonction qui prend un ou plusieurs arguments est "couteuse", contrairement à une fonction sans arguments. (oui oui l'échelle de valeur est bien en dessous de la milli seconde )
- Tu n'es pas obligé de nullifier les timer étant donné que ceux ci sont recyclés (jamais détruits)
- On peut le tester facilement, mais je doute fortement qu'un event "une unité est attaquée" puisse se produire sur une unité morte
- Ce n'est pas une façon safe de vérifier si une unité est morte, go IsUnitType(<unit>,UNIT_TYPE_DEAD), et si tu as une possibilité d'avoir une ghost unit ou null rajoute or GetUnitTypeId(<unit>) == 0, en effet il est à mes yeux plus judicieux de considérer une telle unité comme morte plutôt que vivante. _________________
private struct str
unit caster
boolean isdefending = false
timer ti = null
private static method createFilter takes unit u returns boolean
return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and IsUnitType(u,UNIT_TYPE_HERO)==false
endmethod
private method onCreate takes nothing returns nothing
set .isdefending = false
set .caster = me
set .ti = null
endmethod
implement AutoCreate
private method onDestroy takes nothing returns nothing
call ReleaseTimer(.ti)
set .isdefending = false
set .caster = null
endmethod
implement AutoDestroy
endstruct
private function Update takes nothing returns nothing
local str this = GetTimerData(GetExpiredTimer() )
call IssueImmediateOrder(this.caster,"undefend")
set this.isdefending = false
endfunction
private function IniWait takes unit whichUnit returns nothing
local str this = str[whichUnit]
set this.isdefending = true
set this.caster = whichUnit
call IssueImmediateOrder(this.caster,"defend")
set this.ti = NewTimer()
call SetTimerData(this.ti, this)
call TimerStart (this.ti,DURATION, false, function Update)
endfunction
private function Conditions takes nothing returns boolean
local unit victim = GetTriggerUnit()
local str this = str[GetTriggerUnit()]
if this != 0 and this.isdefending == false then
call IniWait(victim)
endif
set victim = null
return false
endfunction
public function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition(t, Condition(function Conditions))
endfunction
- Comme tu utilises l'allocation naturelle des structs tu n'as pas besoin de définir la valeur des membres de la struct dans la method onCreate, donner la valeur par défaut suffit pour que la valeur initiale soit donnée aux membres de l'instance.
Tu peux donc supprimer onCreate.
- c'est inutile de définir la valeur par défaut des variable array (ce qu'est un membre d'une struct), c'est fait automatiquement par le jassounet. _________________
Le violet, c'est moche.
Dernière édition par Troll-Brain le 10/03/10 22:24; édité 2 fois
private struct str
unit caster = me
boolean isdefending = false
timer ti = null
private static method createFilter takes unit u returns boolean
return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and IsUnitType(u,UNIT_TYPE_HERO)==false
endmethod
implement AutoCreate
private method onDestroy takes nothing returns nothing
call ReleaseTimer(.ti)
set .isdefending = false
set .caster = null
endmethod
implement AutoDestroy
endstruct
private function Update takes nothing returns nothing
local str this = GetTimerData(GetExpiredTimer() )
call IssueImmediateOrder(this.caster,"undefend")
set this.isdefending = false
endfunction
private function CheckIfSpellIsPossible takes nothing returns boolean
local unit victim = GetTriggerUnit()
local str this = str[GetTriggerUnit()]
if this != 0 and this.isdefending == false then
set this.isdefending = true
call IssueImmediateOrder(victim,"defend")
set this.ti = NewTimer()
call SetTimerData(this.ti, this)
call TimerStart (this.ti,DURATION, false, function Update)
endif
set victim = null
return false
endfunction
public function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition(t, Condition(function CheckIfSpellIsPossible))
endfunction
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 10/03/10 22:25 Sujet du message:
Citation:
- c'est inutile de définir la valeur par défaut des variable array (ce qu'est un membre d'une struct), c'est fait automatiquement par le jassounet.
Ce n'est pas le cas des membre static par contre, qui eux sont de simple variable non array, et crash le thread en cours si une variable non initialisée est utilisée.
Je chipote mais c'est toujours bon de savoir le plus de choses possibles ^^
IsUnitType(u,UNIT_TYPE_HERO)==false --> not IsUnitType(u,UNIT_TYPE_HERO) _________________
Le violet, c'est moche.
Dernière édition par Troll-Brain le 10/03/10 22:31; édité 1 fois
private struct str
unit caster
boolean isdefending
timer ti
private static method createFilter takes unit u returns boolean
return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and not IsUnitType(u,UNIT_TYPE_HERO)==true
endmethod
implement AutoCreate
private method onDestroy takes nothing returns nothing
call ReleaseTimer(.ti)
set .isdefending = false
set .caster = null
endmethod
implement AutoDestroy
endstruct
private function Update takes nothing returns nothing
local str this = GetTimerData(GetExpiredTimer() )
call IssueImmediateOrder(this.caster,"undefend")
set this.isdefending = false
endfunction
private function CheckIfSpellIsPossible takes nothing returns boolean
local unit victim = GetTriggerUnit()
local str this = str[GetTriggerUnit()]
if this != 0 and this.isdefending == false then
set this.caster = victim
set this.isdefending = true
call IssueImmediateOrder(victim,"defend")
set this.ti = NewTimer()
call SetTimerData(this.ti, this)
call TimerStart (this.ti,DURATION, false, function Update)
endif
set victim = null
return false
endfunction
public function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition(t, Condition(function CheckIfSpellIsPossible))
endfunction
Inscrit le: 23 Aoû 2007 Messages: 7143 Sujets: 147 Spécialité en worldedit: le troll, le flood, la vulgarité, mon coeur balance Médailles: 2 (En savoir plus...)
Posté le: 10/03/10 22:33 Sujet du message:
Bah c'était bien ce que tu avais fait pour "caster".
Mais hmm faudrait que je vérifie le code compilé, t'es peut être obligé de le faire dans la method onCreate, je regarderais cela demain.
PS : J'ai édité mon précédent post.
PS2 : Mais lol enlève le == true !!! _________________
private struct str
unit caster
boolean isdefending
timer ti
private static method createFilter takes unit u returns boolean
return (GetUnitAbilityLevel(u,SPELL1)>=1 or GetUnitAbilityLevel(u,SPELL2)>=1) and not IsUnitType(u,UNIT_TYPE_HERO)
endmethod
implement AutoCreate
private method onDestroy takes nothing returns nothing
call ReleaseTimer(.ti)
set .isdefending = false
set .caster = null
endmethod
implement AutoDestroy
endstruct
private function Update takes nothing returns nothing
local str this = GetTimerData(GetExpiredTimer() )
call IssueImmediateOrder(this.caster,"undefend")
set this.isdefending = false
endfunction
private function CheckIfSpellIsPossible takes nothing returns boolean
local unit victim = GetTriggerUnit()
local str this = str[GetTriggerUnit()]
if this != 0 and this.isdefending == false then
set this.caster = victim
set this.isdefending = true
call IssueImmediateOrder(victim,"defend")
set this.ti = NewTimer()
call SetTimerData(this.ti, this)
call TimerStart (this.ti,DURATION, false, function Update)
endif
set victim = null
return false
endfunction
public function init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition(t, Condition(function CheckIfSpellIsPossible))
endfunction
endscope
Ce que je me demande c'est: du coup le timer n'est released que quand l'unité quitte la carte non? _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page Précédente1, 2, 3Suivante
Page 2 sur 3 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