Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 04/02/09 18:35 Sujet du message: Moi aussi, je me met un peu au jass
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
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// * 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)
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
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. _________________
Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 07/02/09 11:15 Sujet du message:
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 _________________
Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 07/02/09 12:43 Sujet du message:
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. _________________
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) :
Inscrit le: 21 Avr 2008 Messages: 1607 Sujets: 81 Spécialité en worldedit: Utiliser le travail des autres Médailles: 3 (En savoir plus...)
Posté le: 08/02/09 00:41 Sujet du message:
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). _________________
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? _________________
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?
//=================================================
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
-_- 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. _________________
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? _________________
Toutes les heures sont au format GMT + 1 Heure Aller à la page 1, 2Suivante
Page 1 sur 2
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