Inscrit le: 23 Aoû 2007 Messages: 4766 Sujets: 136 Spécialité en worldedit: Keskesapeutfout' Médailles: 1 (En savoir plus...)
Posté le: 28/02/10 13:50 Sujet du message: Afficher les dégâts reçus
Hey,
je me lance dans une petite library qui consistera à afficher pour chaque joueur les dégâts que son héros prendra, ainsi que les dégâts qu'il infligera aux unités. Le technique consiste donc à créer un déclencheur auquel je rajouterai l'évènement 'TriggerRegisterUnitEvent' pour chaque unité. Je sais que dans la première version de mon RPG, j'ajoutais chaque unité qui apparaissait sur le carte dans le déclencheur, cependant je ne le nettoyais jamais.
Ma question est donc la suivante :
Faut-il que je rafraichisse le déclencheur de temps en temps (lorsqu'une unité meurt par exemple), ou cela n'est pas trop important qu'un déclencheur puisse se retrouver avec plusieurs centaines/milliers d'évènements au bout d'un certain temps ?
Si cela n'est pas important, il n'y aura probablement pas de problème, dans le cas contraire j'aimerais que vous m'indiquiez comment procéder.
Bonne journée ! _________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
C'est gênant sur la durée, ça te fait plein d'évènements non nettoyés.
L'idéal est de détecter effectivement la mort d'une unité.
Je te conseille d'utiliser AutoIndex et de créer à l'entrée d'une unité sur la map un trigger grâce à une structure par unité.
Quand elle meurt, tu n'as plus qu'à virer le trigger.
Dans ce genre là, pour Stars, j'ai un trigger qui détecte les dégâts subis grâce à un sort d'aura.
Peu importe les détails, juste pour que tu vois le principe.
Ici tu as besoin de TimerUtils, AutoIndex et SpellEvent pour que cela fonctionne.
Jass:
scope ParticleShield initializer init
globals
private constant integer PARTSHIELD = 'A024'
private constant integer SHIELDEC = 'A043'
private constant real AOETAUNT = 350.
private constant real AOESHIELD = 250.
private constant real TIMEOUT = 1.
private constant integer DUR = 30
private player Owner = null
private unit Caster = null
endglobals
private function TakeDamageConditions takes nothing returns boolean
local unit damaged = GetTriggerUnit()
local real damage = GetEventDamage()
if GetUnitAbilityLevel(damaged,SHIELDEC) >= 1 then
if GetUnitAbilityLevel(damaged,PARTSHIELD)<= 0 then
call SetUnitState(damaged,UNIT_STATE_LIFE,GetUnitState(damaged,UNIT_STATE_LIFE)+0.50*damage)
else
call SetUnitState(damaged,UNIT_STATE_LIFE,GetUnitState(damaged,UNIT_STATE_LIFE)-0.50*damage)
endif
endif
return false
endfunction
private struct str
unit ship = null
unit shieldSource = null
integer count = 0
trigger trig = null
static method operator [] takes unit u returns thistype
return thistype(GetUnitId(u))
endmethod
method destroy takes nothing returns nothing
if GetUnitAbilityLevel(.ship,SHIELDEC)>=1 then
call UnitRemoveAbility(.ship,SHIELDEC)
endif
set .shieldSource = null
set .ship = null
call DisableTrigger(.trig)
call DestroyTrigger(.trig)
set .trig = null
endmethod
endstruct
private function Update takes nothing returns nothing
local timer t = GetExpiredTimer()
local str dat = GetTimerData(t)
if dat.count < DUR and GetUnitState(dat.ship,UNIT_STATE_LIFE)>0 and GetUnitState(dat.shieldSource,UNIT_STATE_LIFE)>0 then
set dat.count = dat.count + 1
else
call ReleaseTimer(t)
call dat.destroy()
endif
endfunction
private function AddShipToParticleShield takes unit ship, unit shieldSource returns nothing
local timer t = NewTimer()
local str dat = str[ship]
set dat.ship = ship
set dat.shieldSource = shieldSource
set dat.count = 0
if GetUnitAbilityLevel(dat.ship,SHIELDEC)<= 0 then
call UnitAddAbility(dat.ship,SHIELDEC)
endif
set dat.trig = CreateTrigger()
call TriggerRegisterUnitEvent(dat.trig,dat.ship, EVENT_UNIT_DAMAGED )
call TriggerAddCondition(dat.trig, Condition(function TakeDamageConditions))
call SetTimerData(t, dat)
call TimerStart(t,TIMEOUT, true, function Update )
endfunction
private function FilterAndAddAbility takes nothing returns boolean
if IsUnitType(GetFilterUnit(),UNIT_TYPE_MECHANICAL)==false and IsUnitAlly(GetFilterUnit(),Owner)==true then
call AddShipToParticleShield(GetFilterUnit(),Caster)
endif
return true
endfunction
private function FilterAndTaunt takes nothing returns boolean
if IsUnitEnemy(GetFilterUnit(),Owner)==true then
call IssueTargetOrder(GetFilterUnit(),"attack",Caster)
endif
return true
endfunction
private function CastSpell takes nothing returns nothing
local real x = GetUnitX(SpellEvent.CastingUnit)
local real y = GetUnitY(SpellEvent.CastingUnit)
set Caster = SpellEvent.CastingUnit
set Owner = GetOwningPlayer(SpellEvent.CastingUnit)
call GroupEnumUnitsInRange(ENUM_GROUP,x,y,AOETAUNT,Filter(function FilterAndTaunt))
call GroupEnumUnitsInRange(ENUM_GROUP,x,y,AOESHIELD,Filter(function FilterAndAddAbility))
endfunction
public function init takes nothing returns nothing
call AbilityPreload(SHIELDEC)
call RegisterSpellFinishResponse(PARTSHIELD,CastSpell)
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: 28/02/10 19:33 Sujet du message:
Huhh, et si l'unité peut être ressuscitée ?
Je te conseille de simplement laisser le leak d'events, et tu ajoutes l'event une unité subit des dégâts, quand une unité entre sur la map.
Si vraiment ca pose un problème de performance à terme (ce que je doutes quand même), fais nous en part et je te proposerais une solution de rohxor. _________________
private function TakeDamageConditions takes nothing returns boolean
local unit attacker = GetEventDamageSource()
local unit victim = GetTriggerUnit()
local real damage = GetEventDamage()
local real x = GetUnitX(victim)
local real y = GetUnitY(victim)
local texttag tag = CreateTextTag()
call SetTextTagText(tag, I2S(R2I(damage)),0.025)
call SetTextTagPos(tag, x, y, 0.00)
call SetTextTagColor(tag, 255, 255, 255,200)
call SetTextTagVelocity(tag, 0, 0.05)
call SetTextTagFadepoint(tag, 1)
call SetTextTagLifespan(tag, 1)
call SetTextTagPermanent(tag, false)
if GetLocalPlayer()!= GetOwningPlayer(attacker) then
call SetTextTagVisibility(tag,false)
endif
set attacker = null
set victim = null
set tag = null
return false
endfunction
private struct s_Creeps
trigger trig = null
private method onCreate takes nothing returns nothing
local player owner = GetOwningPlayer(me)
local integer i = 0
if owner == Player(8) or owner == Player(9) or owner == Player(10) or owner == Player(11) then
set this.trig = CreateTrigger()
call TriggerRegisterUnitEvent(this.trig,me, EVENT_UNIT_DAMAGED )
call TriggerAddCondition(this.trig, Condition(function TakeDamageConditions))
endif
set owner = null
endmethod
implement AutoCreate
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