ТРИГГЕР 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())
define ... Struct_Cond(ABILITY,Name_Struct) = {
 private bool cond(){ 
    if GetSpellAbilityId()==ABILITY {
      Name_Struct // заменится на Hook.act()
    }
    return false
  }
}
... 
Struct_Cond(ABILITY,Hook.act()) // вот эта линия превращается в то что выше но с подстановкой этих параметров
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
5
3 года назад
0
quq_CCCP:
Это cjass и работа с jngp, тебе ещё рановато, сперва vjass мануал почитай, про структуры и библиотеки, что такое initializer там есть.
а зачем все эти извращения с vjass и cjass, если есть обычный jass
0
17
3 года назад
0
а зачем все эти извращения с vjass и cjass, если есть обычный jass
Это просто инструменты. Кому оно нужно а кому нет, личное дело каждого.
0
3
3 года назад
0
quq_CCCP:
Это cjass и работа с jngp, тебе ещё рановато, сперва vjass мануал почитай, про структуры и библиотеки, что такое initializer там есть.
А что ты имеешь в виду про "работу с jgnp"? Просто я давно уже там пишу код, мб какие-то фичи, или что?
0
3
3 года назад
0
Мне бы хоть какой намёк, где тут реализуются действия(реакция на событие) Я вижу, как инициализатор инициализирует события и кондишн для тригера t. Но в каком участке кода идёт намёк(добавление) на "действия"? До этого я лишь с TriggerAddAction работал.
0
20
3 года назад
Отредактирован biridius
0
действие вызывается в условии, вот в этом куске кода
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()) // вот эта линия превращается в то что выше но с подстановкой этих параметров
Принятый ответ
0
3
3 года назад
0
biridius:
действие вызывается в условии, вот в этом куске кода
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()) // вот эта линия превращается в то что выше но с подстановкой этих параметров
Cпасибо, из-за этих скобок не мог увидеть истину!
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.