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=48095af674aca7c63fab14b147956f05Mé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

Moi aussi, je me met un peu au jass
Aller à la page 1, 2  Suivante
 
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
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 04/02/09 18:35    Sujet du message: Moi aussi, je me met un peu au jass Citer

J'aimerais reproduire ce sort dans ma carte. Il y a quelques (bcp trop) trucs que je ne comprend pas, est-ce que vous pouvez m'aider?
Merci


Secret:

Jass:
function H2I takes handle h returns integer // je ne comprend pas trop tout ce bloc avec ce qu'il y a en dessous
    return h
    return 0
endfunction

function LocalVars takes nothing returns gamecache
    if udg_GameCache == null then
        set udg_GameCache = InitGameCache("jasslocalvars.w3v")
    endif
    return udg_GameCache
endfunction

function SetHandleInt takes handle subject, string name, integer value returns nothing
    if value==0 then
        call FlushStoredInteger(LocalVars(), I2S(H2I(subject)), name)
    else
        call StoreInteger(LocalVars(), I2S(H2I(subject)), name, value)
    endif
endfunction

function GetHandleInt takes handle subject, string name returns integer
    return GetStoredInteger(LocalVars(), I2S(H2I(subject)), name)
endfunction

function FlushHandleLocals takes handle subject returns nothing
    call FlushStoredMission(LocalVars(), I2S(H2I(subject)) )
endfunction



Jass:
scope Impetus

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// * GLOBALS DEFINITIONS *
// _______________________
//
// >> Percent_Base -- The % of the distance covered by the spell's projectile to be dealt in damage to an enemy unit. By default, it is 0.04/0.08/0.12/0.16.
// >> Max_Dmg -- The maximum damage the spell can deal. If you do not want a damage limitation, simply set this global to a huge number.
// >> Texttag_Vlcty -- The speed in which the floating text moves at.
// >> Texttag_Size -- The size of the floating text.
// >> Texttag_Red -- The amount of the colour red to be used for the floating text.
// >> Texttag_Green -- "         "         "  green "         "         "        ".
// >> Texttag_Blue --  "         "         " blue  "         "         "        ".
// >> Texttag_Trsprcy -- The transparency of the floating text. The higher the transparency, the less visible the text will be.
// >> Texttag_Durtn -- The time the floating text is shown for until it is destroyed.
// >> Cut_Off_Durtn -- If the spell has a high projectile speed, keep this value around 1-3. If it has a slow projectile speed (for ex, around 3-600), keep this value at around 10. It is not recommended to have a slow projectile speed at all.
// >> Minimum_Mana -- **If you change the mana cost via object editor, match it here** The minimum mana required for the spell to take effect when on auto-cast mode.
// >> Order_ID -- The order used when a unit turns on the auto-cast effects for the spell. To be matched via object editor, under, Text - Order String - Use/Turn On.
// >> Un_Order_ID -- The order used when a unit turns off the auto-cast effects for the spell. To be matched via object editor, under, Text - Order String - Turn Off.
// >> SFX -- The special effect to be created on an enemy affected by the spell.
// >> SFX_Point -- The attachment point for the special effect to be created on.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




globals
    private constant integer Imp_ID       = 'A000'
    private constant real Percent_Base    = 0.04
    private constant real Max_Dmg         = 375
    private constant real Texttag_Vlcty   = 60
    private constant real Texttag_Size    = 10
    private constant real Texttag_Red     = 5
    private constant real Texttag_Green   = 80
    private constant real Texttag_Blue    = 85
    private constant real Texttag_Trsprcy = 8
    private constant real Texttag_Angle   = 90
    private constant real Texttag_Durtn   = 1.25
    private constant real Cut_Off_Durtn   = 2.5
    private constant real Minimum_Mana    = 25
    private constant string Order_ID      = "flamingarrows"
    private constant string Un_Order_ID   = "unflamingarrows"
    private constant string SFX           = "Abilities\\Spells\\Orc\\FeralSpirit\\feralspiritdone.mdl"
    private constant string SFX_Point     = "origin"
endglobals

struct Imp_Data // A quoi servent ces structs?
    unit U
    boolean b
endstruct

struct Imp_Data_2
    unit u
    unit h
    triggeraction a
    real OX
    real OY
endstruct

private function Impetus_Conditions_2 takes nothing returns boolean // Vu que les structs sont utilisées ici, je ne comprend pas trop les 3 lignes.
    local trigger t  = GetTriggeringTrigger()
    local Imp_Data d = Imp_Data(GetHandleInt(t, "d"))

    if GetTriggerEventId() == EVENT_UNIT_SPELL_EFFECT and GetSpellAbilityId() == Imp_ID then
        return true
    elseif GetTriggerEventId() == EVENT_PLAYER_UNIT_ATTACKED and GetUnitAbilityLevel(GetAttacker(), Imp_ID) > 0 and d.b == true and IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE) == false and GetAttacker() == d.U and GetUnitState(GetAttacker(), UNIT_STATE_MANA) >= Minimum_Mana and IsUnitEnemy(GetTriggerUnit(), GetOwningPlayer(GetAttacker())) then // j'ai un peu de mal pour la traduction des conditions mais ça va
   return true
    elseif GetTriggerEventId() == EVENT_UNIT_ISSUED_ORDER then
        if GetIssuedOrderId() == OrderId(Order_ID) then
            set d.b = true
        elseif GetIssuedOrderId() == OrderId(Un_Order_ID) then
            set d.b = false
        endif
    endif

    set t = null
    return false
endfunction

private function Impetus_Actions_3 takes nothing returns nothing
    local trigger x    = GetTriggeringTrigger() // Ici, il met un trigger dans une variable, non?
    local Imp_Data_2 D = Imp_Data_2(GetHandleInt(x, "D")) // je ne saisie pas cette ligne
    local real X2      = GetUnitX(D.h)
    local real Y2      = GetUnitY(D.h)
    local real dist    = SquareRoot((X2-D.OX) * (X2-D.OX) + (Y2-D.OY) * (Y2-D.OY))
    local real dmg     = (GetUnitAbilityLevel(D.u, Imp_ID) * Percent_Base) * dist
    local texttag t
 
    if D.u == GetEventDamageSource() then 
        if dmg > Max_Dmg then
            set dmg = Max_Dmg
        endif
        call TriggerRemoveAction(x, D.a)
        call FlushHandleLocals(x) // Là j'ai du mal aussi
        call DestroyTrigger(x)
        call DestroyEffect(AddSpecialEffectTarget(SFX, D.h, SFX_Point))
        call UnitDamageTarget(D.u, D.h, dmg, false, false, ATTACK_TYPE_HERO, DAMAGE_TYPE_DIVINE, null)
        set t = CreateTextTagUnitBJ("+" + I2S(R2I(dmg)), D.h, Texttag_Vlcty, Texttag_Size, Texttag_Red, Texttag_Green, Texttag_Blue, Texttag_Trsprcy)
        call SetTextTagVelocityBJ(t, Texttag_Vlcty, Texttag_Angle)
        call SetTextTagPermanent(t, false)
        call SetTextTagLifespan(t, Texttag_Durtn)
        call D.destroy() // A ça correspond?
    endif


    set x = null
    set t = null
endfunction

private function Impetus_Actions_2 takes nothing returns nothing
    local trigger z    = GetTriggeringTrigger()
    local Imp_Data d   = Imp_Data(GetHandleInt(z, "d"))  // Toujours avec les structs....
    local Imp_Data_2 D = Imp_Data_2.create() 
    local trigger x    = CreateTrigger()  // ?

    if GetTriggerEventId() == EVENT_UNIT_SPELL_EFFECT then
        set D.h = GetSpellTargetUnit()
    else
        set D.h = GetTriggerUnit()
    endif

    set D.u = d.U
    set D.OX = GetUnitX(D.u)
    set D.OY = GetUnitY(D.u)
    call TriggerRegisterUnitEvent(x, D.h, EVENT_UNIT_DAMAGED) // Pourquoi il utilise le trigger x?
    set D.a = TriggerAddAction(x, function Impetus_Actions_3) 
    call SetHandleInt(x, "D", D)

    //Safety
    call PolledWait(Cut_Off_Durtn)
    call TriggerRemoveAction(x, D.a)
    call FlushHandleLocals(x)
    call DestroyTrigger(x)
    call D.destroy()
    //

    set z = null
    set x = null
endfunction

private function Impetus_Actions takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local trigger t    // t c'était un textag avant...
    local Imp_Data d   // Les (s)truc(t)s

    if GetUnitAbilityLevel(u, Imp_ID) == 1 then
        set d = Imp_Data.create()
        set d.U = u
        set d.b = false
        set t = CreateTrigger()

   call TriggerRegisterUnitEvent(t, d.U, EVENT_UNIT_ISSUED_ORDER)
        call TriggerRegisterUnitEvent(t, d.U, EVENT_UNIT_SPELL_EFFECT)
   call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_ATTACKED)
        call TriggerAddCondition(t, Condition(function Impetus_Conditions_2))
        call TriggerAddAction(t, function Impetus_Actions_2)
        call SetHandleInt(t, "d", d) // je en comprend pas ici non plus

        set t = null
    endif

    set u = null
endfunction

private function Impetus_Conditions takes nothing returns boolean
    return GetLearnedSkill() == Imp_ID // Si je comprend bien, sur ce dernier bloc, il allume les déclos?
endfunction

function InitTrig_Impetus takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_HERO_SKILL)
    call TriggerAddCondition(t, Condition(function Impetus_Conditions))
    call TriggerAddAction(t, function Impetus_Actions)
    set t = null
endfunction

endscope


Merci de prendre sur vous et votre temps pour me répondre.
_________________


Dernière édition par Crowolf le 10/02/09 22:05; édité 2 fois
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 profet
Instanton Gravitationnel Singulier


Inscrit le: 21 Aoû 2007
Messages: 1633
Sujets: 53
Spécialité en worldedit: Pain d'épice multitâche (terrain, scripts, textures, modèles...)
Médailles: 2 (En savoir plus...)
Profet (Quantité : 1) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 04/02/09 19:39    Sujet du message: Citer

Déplacé dans la partie triggers Wink
_________________

Bêta Systems: 70%
Bêta Spells: 13%
Bêta Arts & graphics: 70%
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web du posteur
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 04/02/09 21:30    Sujet du message: Citer

H2I est une astuce.

Quand tu mets plusieurs return, seul le premier est exécuté. Mais il y a bug si tu renvois un type différent de celui dit dans le returns de ta déclaration de fonction (take ... returns integer). Par contre si tu mets plusieurs return mais qu'un d'eux est le type demandé, la fonction marchera et le return exécuté serra le premier. Donc, l'astuce consiste à donner à la fonction un handle (au faite, un handle est tout type de variable qui n'est pas : integer, real, string et boolean) pour qu'elle te ressorte un integer correspondant à cet handle. Comme un raccourci : l'integer a la marque de l'handle.
Ce qui est utile, c'est d'utiliser cette fontion avec la Integer to Handle (I2H) pour des triggers multi-instancés.

Je suis pas très sur de ça puisque je l'avais médiocrement traduit d'un tuto en anglais.
_________________
Nom in-game : Goatow
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 07/02/09 11:15    Sujet du message: Citer

Personne d'autre ne peut m'aider?!... Je commence peut-être avec quelque chose de costaud, mais j'ai lu tout les tutos et la doc du jasshelper.
Par contre, j'ai essayé de copier bêtement le code dans ma map (avec JNPG), j'ai fais les variables (GameCache), j'ai modifié le code du sort (A000) et WE ne veut pas tester ma carte.
Une autre petite question, qu'est-ce que les "scope - endscope"?
Merci
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 07/02/09 12:08    Sujet du message: Citer

Scope c'est un peu comme une library, les différences sont dans la doc.
Et t'entend quoi par "WE ne veut pas tester ma carte" ?
_________________
Nom in-game : Goatow
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 07/02/09 12:43    Sujet du message: Citer

WE charge la carte, mais j'arrive sur le portail de démarrage de War3.
En fait, toutes les lignes sont "statement outside of function"

Syntax check me dit que toutes les lignes comportent une erreur... -_- J'ai essayé de tester d'autres sorts jass qui marchent normalement, mais à chaque fois ça bug.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Rhadamante
Petit flooder


Inscrit le: 28 Aoû 2007
Messages: 1457
Sujets: 24
Spécialité en worldedit: Bêêh hé hé hé !
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Créateur de race (Quantité : 1)

MessagePosté le: 08/02/09 00:26    Sujet du message: Citer

Crowolf a écrit:
En fait, toutes les lignes sont "statement outside of function"


C'est que tu n'utilises pas le JNGP, ou que tu l'utilises mal.

Pour ce qui est des structs, en gros c'est une variable, un entier, qui "contient" d'autres variables. A quoi ça sert ?
Dans ton exemple, la fonction crée un trigger et a besoin d'associer à ce trigger une unité et un booléen pour pouvoir les récupérer plus tard à l'activation de ce trigger.
Le moyen simple employé est la création d'une struct contenant cette unité et ce booléen et l'utilisation du gamecache pour stocker cette struct (un entier donc) :

Jass:
call StoreInteger(udg_GameCache, I2S(H2I(letrigger)), "exemple", lastruct)


edit : question stupide, tu lances bien NewGen WE.exe ?
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 08/02/09 00:41    Sujet du message: Citer

Oui, je lance bien NewGen WE.exe. Par contre, est-ce normal que je ne puisse pas lancer jasshelper? J'ai une fenêtre qui m'annonce :"Missing arguments: <commonj> <blizzardj> <mappath>"
Alors qu'ils sont bien dans le dossier jasshelper (sauf mappath que je n'arrive pas à trouver).
J'ai cherché sur le net, mais je n'ai pas vu ce problème résolu).
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Eme
Floodeur prématuré


Inscrit le: 02 Nov 2008
Messages: 541
Sujets: 23



MessagePosté le: 08/02/09 10:07    Sujet du message: Citer

Si quand tu fais tester la carte avec le JNGP et qu'il te renvoie au menu principal de Warcraft 3, sauvegarde avant de tester.
_________________
Nom in-game : Goatow
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 Crowolf
Animateur


Inscrit le: 21 Avr 2008
Messages: 1607
Sujets: 81
Spécialité en worldedit: Utiliser le travail des autres
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Rédacteur de tuto #3 (Quantité : 1)

MessagePosté le: 08/02/09 11:19    Sujet du message: Citer

Eme a écrit:
Si quand tu fais tester la carte avec le JNGP et qu'il te renvoie au menu principal de Warcraft 3, sauvegarde avant de tester.


Même, Eme, ça fait pareil et de toute façon, je sauvegarde toujours avant de tester.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé
 jk2pach
Invité








MessagePosté le: 10/02/09 12:49    Sujet du message: Citer

J'ai lu la documentation en Anglais mais j'aurai besoin également de petites explications/confirmations si quelqu'un le veut bien (et si Cro ça ne te dérange pas que je me serve de ton sujet).

En gros si je fais un déclencheur dans un scope, ca veut dire que tout ce qui est dans le scope ne concerne que le scope, ç'est ça?

Par exemple si j'utilise la même structure qu'un déclencheur normal (ini, condition, action) mais que je place ces éléments dans un scope, je pourrais, par la suite, créer un autre déclencheur utilisant les mêmes nom (ini, condition, action) sans que le JNPG donne le message d'erreur fonctions redéclarées?
_________________
Revenir en haut
 Rhadamante
Petit flooder


Inscrit le: 28 Aoû 2007
Messages: 1457
Sujets: 24
Spécialité en worldedit: Bêêh hé hé hé !
Médailles: 3 (En savoir plus...)
Créateur de race (Quantité : 1) Grand décorateur (Quantité : 2)

MessagePosté le: 10/02/09 16:49    Sujet du message: Citer

Apocalypse a écrit:
En gros si je fais un déclencheur dans un scope, ca veut dire que tout ce qui est dans le scope ne concerne que le scope, ç'est ça?

Par exemple si j'utilise la même structure qu'un déclencheur normal (ini, condition, action) mais que je place ces éléments dans un scope, je pourrais, par la suite, créer un autre déclencheur utilisant les mêmes nom (ini, condition, action) sans que le JNPG donne le message d'erreur fonctions redéclarées?


Tu veux dire, en faisant ça par exemple ? Rolling Eyes

Jass:
scope NewScope initializer init

//=================================================
globals

endglobals

//=================================================
private function Conditions takes nothing returns boolean
    return true
endfunction

//=================================================
private function Actions takes nothing returns nothing
   
endfunction

//=================================================
public function init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerAddCondition(t, Condition(function Conditions))
    call TriggerAddAction(t, function Actions)
endfunction
   
endscope

_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 jk2pach
Invité








MessagePosté le: 10/02/09 16:59    Sujet du message: Citer

-_- euh oui. Enfin je ne comprends pas trop l'utilité du scope.
_________________
Revenir en haut
 Rhadamante
Petit flooder


Inscrit le: 28 Aoû 2007
Messages: 1457
Sujets: 24
Spécialité en worldedit: Bêêh hé hé hé !
Médailles: 3 (En savoir plus...)
Grand décorateur (Quantité : 2) Créateur de race (Quantité : 1)

MessagePosté le: 10/02/09 18:41    Sujet du message: Citer

Apocalypse a écrit:
-_- euh oui. Enfin je ne comprends pas trop l'utilité du scope.


A faire ce que tu as dit et ce que j'ai posté par exemple. En gros la réponse à ta question d'avant est oui.
Tous mes déclencheurs (merci Troll-Brain) ont maintenant cette gueule, et c'est beaucoup plus rapide et pratique.
_________________
Revenir en haut
Voir le profil de l'utilisateur Envoyer un message privé MSN Messenger
 jk2pach
Invité








MessagePosté le: 10/02/09 19:01    Sujet du message: Citer

Ok, merci. Je crois que je vais adopter.

Et question suivante, sur les globales. C'est plus rapide/léger/imba etc... de déclarer les globales au début d'une fonction de ce genre, ou via l'éditeur de variable?

En gros c'est mieux de faire create 1 udg_dummy ou 1 'Hpea' ou 1 dummy avec dummy=globale?
_________________
Revenir en haut
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
Aller à la page 1, 2  Suivante
Page 1 sur 2

 
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