Worldedit
  Worldedit
Le site sur l'éditeur de warcraft 3 !
 
  FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres    Groupes d'utilisateursGroupes d'utilisateurs   medals.php?sid=085c653a82c4386763f35c6c608d2ac9Médailles   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 
  FAQFAQ World Editor   UploadUploader une map ou une image    UploadAjouter sa map à l'annuaire   UploadConsulter l'annuaire

Afficher les dégâts reçus

 
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 28/02/10 13:50    Sujet du message: Afficher les dégâts reçus Citer

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. Wink

Bonne journée !

_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 28/02/10 14:05    Sujet du message: Citer

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
 
endscope

_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


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...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 28/02/10 19:33    Sujet du message: Citer

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.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Rommstein60
MODÉRATEUR À LA RETRAITE


Inscrit le: 23 Aoû 2007
Messages: 4766
Sujets: 136
Spécialité en worldedit: Keskesapeutfout'
Médailles: 1 (En savoir plus...)
Rédacteur de tuto #1 (Quantité : 1)

MessagePosté le: 28/02/10 20:24    Sujet du message: Citer

Merci Apo, mais je vais garder la solution de Troll. Wink
Et merci Troll. :'D

_________________
Leçon n°1 du WorldEdit : « Le violet > Troll-Brain »
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 28/02/10 20:36    Sujet du message: Citer

Une autre version qui se sert mieux d'autoindex
Jass:
scope CreepsSytem
   
    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
                   
            private method onDestroy takes nothing returns nothing
                    call DisableTrigger(.trig)
                    call DestroyTrigger(.trig)
                    set .trig = null
            endmethod
            implement AutoDestroy             
           
    endstruct   
   
endscope

_________________
Revenir en haut
 Troll-Brain
Ri1kamoua


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...)
Grand mage créateur de sort (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 28/02/10 20:58    Sujet du message: Citer

Code:
                                         ^
                                         |
                                         |

C'est globalement ma solution alternative.
_________________
Le violet, c'est moche.
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Worldedit Index du Forum -> Aide sur les déclencheurs Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
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


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com