Добавлен NatriY
ТРИГГЕР 1:
scope SpellHook initializer InitSpellHook{
define{
private ABILITY = 'A000' //| Способность
private HOOK = 'h001' //| ИД пустышки крюка
private CHAIN = 'h000' //| ИД пустышки цепи
private SPEED_HOOK = 40 //| Скорость/Расстояние
private AOE(a) = 100+50*GetUnitAbilityLevel(a,ABILITY) //| Радиус выбора врагов/союзников
private DMG(a) = 50*GetUnitAbilityLevel(a,ABILITY) //| Урон
private RANGE_MAX(a) = 1500*GetUnitAbilityLevel(a,ABILITY) //| Дальность крюка
private TYPE_DMG = ATTACK_TYPE_MAGIC,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS //| Тип урона
private EFFECT = "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl" //| Эффект на юните
private BODY = "chest" //| Точка крепления эффекта на юните
}
private bool MaxXY(real x,real y){return GetRectMinX(bj_mapInitialPlayableArea)<=x&&x<=GetRectMaxX(bj_mapInitialPlayableArea)&&GetRectMinY(bj_mapInitialPlayableArea)<=y&&y<=GetRectMaxY(bj_mapInitialPlayableArea)}
private struct Hook{
static timer t = CreateTimer()
static int M = 0
static int m[]
unit a,c,B
unit h[200]
int id
bool f
real ang,d
Struct_Dest(this,i,t)
Metod(Time)
local stype this
local int i = 0
local real x,y,angle
local int e
local group g
local unit C
whilenot(++i>M){
set this = m[i]
set x = GetUnitX(a)
set y = GetUnitY(a)
if id>0&&DistXY(x,y,GetUnitX(h[id]),GetUnitY(h[id]))>SPEED_HOOK{
set e = R2I(DistXY(x,y,GetUnitX(h[id]),GetUnitY(h[id])))/SPEED_HOOK
whilenot(e<=0){
id++
set angle = AngleXY(x,y,GetUnitX(h[id-1]),GetUnitY(h[id-1]))
set h[id] = NewUnit(a,CHAIN,x+(SPEED_HOOK*e)*Cos(angle*DG),y+(SPEED_HOOK*e)*Sin(angle*DG),angle)
e--
}}
if !f{
id++
set h[id] = NewUnit(a,CHAIN,x,y,ang)
call MoveXY(B,GetUnitX(B),GetUnitY(B),SPEED_HOOK,ang)
set e = 0
whilenot(e>id){
if e<2{
SetUnitPosition(h[e],GetUnitX(h[e])+SPEED_HOOK*Cos(ang*0.0174),GetUnitY(h[e])+SPEED_HOOK*Sin(ang*0.0174))
call SetUnitFacing(h[e],ang)
else
SetUnitPosition(h[e],GetUnitX(h[e-1])+SPEED_HOOK*Cos(AngleXY(GetUnitX(h[e-1]),GetUnitY(h[e-1]),GetUnitX(h[e]),GetUnitY(h[e]))*0.0174),GetUnitY(h[e-1])+SPEED_HOOK*Sin(AngleXY(GetUnitX(h[e-1]),GetUnitY(h[e-1]),GetUnitX(h[e]),GetUnitY(h[e]))*0.0174))
call SetUnitFacing(h[e],AngleXY(GetUnitX(h[e]),GetUnitY(h[e]),GetUnitX(h[e-1]),GetUnitY(h[e-1])))
}
e++
}
set g = CreateGroup()
call GroupEnumUnitsInRange(g,GetUnitX(B),GetUnitY(B),AOE(a),null)
for(){
set C = FirstOfGroup(g)
exitwhen C==null||c!=null
if Life(C)&&a!=C{
if IsUnitEnemy(C,GetOwningPlayer(a)){UnitDamageTarget(a,C,DMG(a),false,false,TYPE_DMG)}
call DestroyEffect(AddSpecialEffectTarget(EFFECT,C,BODY))
call PauseUnit(C,true)
set c = C
}
call GroupRemoveUnit(g,C)
}
call DestroyGroup(g)
set d = d - SPEED_HOOK
f = d<=0||MaxXY(GetUnitX(B),GetUnitY(B))==false||c!=null
else
if id>0{
call MoveXY(B,GetUnitX(h[1]),GetUnitY(h[1]),0,GetUnitFacing(h[1]))
if c!=null{MoveXY(c,GetUnitX(B),GetUnitY(B),0,GetUnitFacing(c))}
set e = id
whilenot(e<=0){
if e==id{
SetUnitPosition(h[e],GetUnitX(h[e])+SPEED_HOOK*Cos(AngleXY(GetUnitX(h[e]),GetUnitY(h[e]),GetUnitX(a),GetUnitY(a))*0.0174),GetUnitY(h[e])+SPEED_HOOK*Sin(AngleXY(GetUnitX(h[e]),GetUnitY(h[e]),GetUnitX(a),GetUnitY(a))*0.0174))
call SetUnitFacing(h[e],AngleXY(GetUnitX(a),GetUnitY(a),GetUnitX(h[e]),GetUnitY(h[e])))
if IsUnitInRange(a,h[e],SPEED_HOOK){
call RemoveUnit(h[e])
set h[e] = null
id--
}
else
SetUnitPosition(h[e],GetUnitX(h[e+1])+SPEED_HOOK*Cos(AngleXY(GetUnitX(h[e+1]),GetUnitY(h[e+1]),GetUnitX(h[e]),GetUnitY(h[e]))*0.0174),GetUnitY(h[e+1])+SPEED_HOOK*Sin(AngleXY(GetUnitX(h[e+1]),GetUnitY(h[e+1]),GetUnitX(h[e]),GetUnitY(h[e]))*0.0174))
call SetUnitFacing(h[e],AngleXY(GetUnitX(h[e+1]),GetUnitY(h[e+1]),GetUnitX(h[e]),GetUnitY(h[e])))
}
e--
}
else
if c!=null{
call PauseUnit(c,false)
set c = null
}
call RemoveUnit(B)
set a = null
set B = null
call Destroy(this,i,t)
}}}
endmethod
Metod(act)
M++
local stype this = stype.create()
if M<13{
set m[M] = this
set a = GetSpellAbilityUnit()
set c = null
set ang = AngleXY(GetUnitX(a),GetUnitY(a),GetSpellTargetX(),GetSpellTargetY())
set B = NewUnit(a,HOOK,GetUnitX(a),GetUnitY(a),ang)
set id = 0
set d = RANGE_MAX(a)
set f = false
if M==1{TimerStart(t,0.04,true,fun stype.Time)}
else
call deallocate()
M--
}
endmethod
}
Struct_Cond(ABILITY,Hook.act())
void InitSpellHook(){TR_EC(cond)}}
ТРИГГЕР 2:
define{
bool = boolean
int = integer
void = nothing
fun = function
stype = thistype
DG = 0.0174
AngleXY(x,y,x1,y1) = 180.0 / 3.14159 * Atan2(y1 - y,x1 - x)
DistXY(x,y,x1,y1) = SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1))
NewUnit(a,id,x,y,ang) = CreateUnit(GetOwningPlayer(a),id,x,y,ang)
Life(a) = GetWidgetLife(a)>.405
FilterE(b,a) = IsUnitEnemy(b,GetOwningPlayer(a))&&Life(b)
MoveXY(a,x,y,s,ang) = {
SetUnitX(a,x+s*Cos(ang*DG))
SetUnitY(a,y+s*Sin(ang*DG))
}
Struct_Cond(ABILITY,Name_Struct) = {
private bool cond(){
if GetSpellAbilityId()==ABILITY{Name_Struct}
return false
}}
Struct_Dest(Struct,i,t) = {
static method Destroy takes stype Struct,int i,timer t returns void
destroy()
m[i] = m[M]
M--
if M==0{PauseTimer(t)}
endmethod
}
Metod(Name) = static method Name takes void returns void
TR_EC(cond) = {
trigger t = CreateTrigger()
TriggerRegisterPlayerUnitEvent(t,Player(0x00),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x01),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x02),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x03),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x04),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x05),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x06),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x07),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x08),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x09),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x0a),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x0b),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerRegisterPlayerUnitEvent(t,Player(0x0c),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
TriggerAddCondition(t,Condition(fun cond))
}
}
В общем, расскажите, пожалуйста, как этот код в двух триггерах начинает работать при запуске карты. Весь код я скинул для наглядности, но мне интересно, почему тот участок, который инициализирует СОБЫТИЕ запускается. До этого я работал лишь с функциями, которые переводятся в джасс с ГУИ(именно инициализация событий), но вот этот случай что-то не очень понятен. Чуйка говорит, что дело в ключевом слове Initializer сверху, но если кто знает, обьясните немного подробней, или скиньте, пожалуйста норм статьи, а то лично я ничего не нарыл(
Принятый ответ
действие вызывается в условии, вот в этом куске кода
Name_Struct - параметр действия (дефайном подставляется Hook.act())
Name_Struct - параметр действия (дефайном подставляется Hook.act())
define ... Struct_Cond(ABILITY,Name_Struct) = {
private bool cond(){
if GetSpellAbilityId()==ABILITY {
Name_Struct // заменится на Hook.act()
}
return false
}
}
...
Struct_Cond(ABILITY,Hook.act()) // вот эта линия превращается в то что выше но с подстановкой этих параметров
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован biridius
Name_Struct - параметр действия (дефайном подставляется Hook.act())