Inscrit le: 12 Nov 2011 Messages: 1062 Sujets: 107 Spécialité en worldedit: Inactif(Enfin presque) Médailles: 1 (En savoir plus...)
Posté le: 26/06/12 11:14 Sujet du message: Gros problème avec : JNGP ou mon trigger ?
Voilà j'ai essayé de réaliser un sort(mon premier) en jass mais j'ai un petit problème, lorsque je veux sauvegarder le JNGP me dit qu'il manque un "endblock" en ligne 217 alors que le script total de la map fait 216 lignes, et ça ne le fait que pour mon trigger car lorsque je le copie sur une autre map il me remet le problème avec le endblock.
Mon trigger: il fait un peu tout: le spawn periodique des mobs, le sort
-les functions t2_Group_1, t2_Group_2 et T2_Condtions sont utilisées pour les dégâts et mobs respawning pour un spawn des mobs, seuls t_Conditions et t_Actions font partie de la "base du sort"
En quoi consiste le dit sort: il crée un cercle de feu qui inflige des dégâts à tout unité ennemie en contact avec lui
il reste des BJ, car je m'y connais pas trop en jass(manque de pratique) et j'ai donc convertie mes actions GUI en jass.
Jass:
function t_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
function t_Actions takes nothing returns nothing
local group circle
local location Tmp_Point
local integer I
local real R
//Le déclencheur
set Tmp_Point = GetSpellTargetLoc()
set R = 4.5
loop
if I < 90 then
call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(GetSpellAbilityUnit(), PolarProjectionBJ( Tmp_Point, 500, 4.00 * I ), 270 )
call UnitApplyTimedLifeBJ( 3.00 + R, 'BTLF', GetLastCreatedUnit() )
call SleepAction(0.05)
set I = I + 1
set R = R - 0.05
endloop
endfunction
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 26/06/12 12:24 Sujet du message:
Tu as oublié de mettre un endif dans ta fonction t_Actions (dans la boucle).
Pour supprimer les BJs, va dans la liste des fonctions et regarde comment elles sont construites.
Quelques petites choses que tu pourrais faire pour que le code soit plus lisible :
- Utilise une tabulation pour indenter le code, et évite d'écrire les appels de fonctions au même niveau que la déclaration de ta fonction.
-
Jass:
function t_Conditions takes nothing returns boolean
if ( not ( GetSpellAbilityId() == 'A000' ) ) then
return false
endif
return true
endfunction
Cela renverra en effet true si le sort est égal à 'A000' et false sinon.
- A la place d'utiliser ForGroup pour énumérer un groupe, il est préférable d'utiliser cette méthode :
Jass:
local unit u = null
local group g = CreateGroup()
call GroupEnumUnitsInRange(g, x, y, radius, null)
loop
set u = FirstOfGroup(g)
exitwhen u == null
call GroupRemoveUnit(g, u)
// Tes actions que tu peux appliquer sur l'unité u
endloop
Par contre le groupe sera vide à la fin de la boucle, je te laisse comprendre pourquoi. Mais la plupart du temps, ça ne pose aucun problème, c'est plus rapide, et en plus, on ne doit pas créer une autre fonction pour les actions. Au lieu de créer un groupe à chaque fois, on peut aussi en utiliser qu'un seul pour toute la map : warcraft ne gère qu'une fonction à la fois, et le tout restera multi-instanciable.
- Je te conseil de tout mettre dans une scope pour pouvoir utiliser des noms de fonctions plus simples. Il suffit de les privatiser, et c'est bon .
- Ah oui, aussi, évite d'utiliser les points. Les fonctions BJs en utilisent souvent, mais les natives se servent des coordonnées. C'est beaucoup plus propre et évite toute création de leak. Donc à la place de GetSpellTargetLoc, tu pourras te servir de GetSpellTargetX et Y (elles n'apparaissent pas en couleur mais existent bel et bien). _________________
function t_Actions takes nothing returns nothing
local location Tmp_Point
local integer I
local real R
local real x
local real y
local unit c
local group g
local unit u
//Le déclencheur
set c = GetSpellAbilityUnit()
set x = GetSpellTargetX()
set y = GetSpellTargetY()
set Tmp_Point = Location( x, y)
set R = 9
set I = 0
loop
if I < 90 then
call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(c) , PolarProjectionBJ( Tmp_Point, 500.00, ( 4.00 * I2R(I) )), 270.00 )
call UnitApplyTimedLifeBJ( ( 3.00 + R ), 'BTLF', GetLastCreatedUnit() )
call TriggerSleepAction(0.01)
set I = I + 1
set R = R - 0.01
endif
endloop
set u = null
set g = CreateGroup()
call GroupEnumUnitsInRange(g, x, y, 500, null )
loop
exitwhen u == null
set u = FirstOfGroup(g)
call GroupRemoveUnit(g, u)
call UnitDamageTargetBJ( c, u, 60.00, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
call DestroyEffect(AddSpecialEffectLocBJ( GetUnitLoc(u), "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl" ))
endloop
endfunction
endscope
function Just_Initializing_Actions takes nothing returns nothing
globals
unit Heros
endglobals
call CreateNUnitsAtLoc( 1, 'Hblm', Player(0), GetRectCenter(GetPlayableMapRect()), bj_UNIT_FACING )
set Heros = GetLastCreatedUnit()
endfunction
//===========================================================================
function InitTrig_Tout takes nothing returns nothing
local trigger t = CreateTrigger( )
local trigger Mobs_respawning = CreateTrigger( )
local trigger Just_Initializing = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerRegisterTimerEventPeriodic( Mobs_respawning, 10.00 )
call TriggerRegisterTimerEventSingle( Just_Initializing, 0.00 )
call TriggerAddAction( t, function t_Actions )
call TriggerAddAction( Mobs_respawning, function Mobs_respawning_Actions )
call TriggerAddAction( Just_Initializing, function Just_Initializing_Actions )
call TriggerAddCondition( t, function t_Conditions )
endfunction
J'ai modifié le code et j'y ai rajouté quelques trucs pour l'exemple(globale pour le spawn des mobs) mais je peux pas privaiser mes functions, le JassHelper m'indiquant qu'il ne les trouve pas, De plus les unités qui sont dans le cercle ne subissent pas de dégâts. _________________
Inscrit le: 14 Oct 2009 Messages: 719 Sujets: 40 Spécialité en worldedit: Les bugs Médailles: 1 (En savoir plus...)
Posté le: 26/06/12 15:04 Sujet du message:
Citation:
mais je peux pas privaiser mes functions, le JassHelper m'indiquant qu'il ne les trouve pas
Euh, tu les privatises bien à l'intérieur d'un bloc?
Citation:
De plus les unités qui sont dans le cercle ne subissent pas de dégâts.
Tu ne sors jamais de cette boucle :
Jass:
loop
if I < 90 then
call CreateNUnitsAtLoc( 1, 'h000', GetOwningPlayer(c) , PolarProjectionBJ( Tmp_Point, 500.00, ( 4.00 * I2R(I) )), 270.00 )
call UnitApplyTimedLifeBJ( ( 3.00 + R ), 'BTLF', GetLastCreatedUnit() )
call TriggerSleepAction(0.01)
set I = I + 1
set R = R - 0.01
endif
endloop
Les actions suivantes ne seront donc jamais exécutées. A la place du if, mets plutôt un exitwhen I >= 90. _________________
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