XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Ошибка с вылетом
» раскрыть

Код:
globals
  timer array Tm
  unit array U
  unit array UT
  integer hf
endglobals

function H2I takes handle h returns integer
  return h
  return 0
endfunction

function Cancel takes nothing returns nothing
  local timer e = GetExpiredTimer()
  local integer he = H2I(e)-0x100000
  local integer hf = H2I(Tm[he])-0x100000
  local trigger tr = GetTriggeringTrigger()
  set U[hf] = null
  set UT[hf] = null
  call DestroyTimer(Tm[he])
  call DestroyTimer(e)
  set Tm[he] = null
  set e = null
  call DisableTrigger(tr)
  call PolledWait (1)
  call DestroyTrigger(tr)
  set tr = null
endfunction

function End takes nothing returns nothing
  local timer e = GetExpiredTimer()
  local integer he = H2I(e)-0x100000
  local integer hf = H2I(Tm[he])-0x100000
  call IssueImmediateOrder( U[hf], "stop" )
  set U[hf] = null
  set UT[hf] = null
  call DestroyTimer(Tm[he])
  call DestroyTimer(e)
  set Tm[he] = null
  set e = null
endfunction


function SpellDamage takes nothing returns real
    return 10.00*I2R(GetUnitAbilityLevel(U[hf], 'A001'))
endfunction    

function Damage takes nothing returns nothing
     local integer hf = H2I(GetExpiredTimer())-0x100000
     if GetUnitState(U[hf], UNIT_STATE_MANA) >= 1.00 and GetUnitState(UT[hf], UNIT_STATE_LIFE)>0 then
        call SetUnitState(U[hf], UNIT_STATE_MANA, GetUnitState(U[hf], UNIT_STATE_MANA) - 1)
        call UnitDamageTarget(U[hf], UT[hf], SpellDamage() , true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl",UT[hf],"origin"))
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl",UT[hf],"origin"))
     endif
     call End()
endfunction

function Action takes nothing returns nothing
  local timer t 
  local timer te 
  local integer he 
  local trigger tr = CreateTrigger ()
  local unit u = GetTriggerUnit ()
   if GetSpellAbilityId() == 'A001' then
     set t = CreateTimer()
     set te = CreateTimer()
     set he = H2I(te)-0x100000 
     set hf = H2I(t)-0x100000 
     set Tm[he] = t
     set U[hf] = GetTriggerUnit()
     set UT[hf] = GetSpellTargetUnit ()
     call TimerStart(Tm[he],0.1, true, function Damage)
     //call TimerStart(te,6.01, false, function Cancel)
     call TriggerRegisterUnitEvent(tr, u, EVENT_UNIT_SPELL_FINISH )
     call TriggerRegisterUnitEvent(tr, u, EVENT_UNIT_SPELL_ENDCAST)
     call TriggerAddAction(tr, function Cancel)
   endif 
  set t = null 
  set te = null
  set tr = null
  set u = null
endfunction

//===========================================================================
function InitTrig_ManaLightning_1 takes nothing returns nothing
    local integer i = 0
    local trigger t = CreateTrigger ()
    loop
        exitwhen i > 12
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set i = i + 1
    endloop
    call TriggerAddAction(t, function Action )
set t = null    
endfunction



Вар вылетает с ошибкой, делаю локал тригер который должен при событии END_CAST и FINISH_CAST уничтожатся и прекращять действия с юнитом, почему вар с ошибкой вылетает, когда тригер уничтожается?
Старый 28.05.2009, 16:54
J
expert
offline
Опыт: 48,747
Активность:
Цитата:
call DisableTrigger(tr)
call PolledWait (1)
call DestroyTrigger(tr)
set tr = null

зачем?
Старый 28.05.2009, 17:03
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Так чтобы уничтожить локальный тригер который я создал

Ninbous добавил:
в другой функции

Ninbous добавил:
Jon подскажи как сделать тригер который будет улавливать окончание спелла и прекращять действия с юнитом?
Старый 28.05.2009, 17:40
Hellfim
Новичок
offline
Опыт: 79,880
Активность:
Ninbous, триггер забивай в глобальную переменную и уничтожай через нее, потому что в функции GetTriggeringTrigger может быть уже другой триггер => вылет. И уничтожай сразу, без выключения триггера.
Старый 28.05.2009, 21:24
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Hellfim Все равно вылетает

Ninbous добавил:
» раскрыть

Код:
globals
  timer array Tm
  unit array U
  unit array UT
  integer hf
  trigger array TR
endglobals

function H2I takes handle h returns integer
  return h
  return 0
endfunction

function Cancel takes nothing returns nothing
  local timer e = GetExpiredTimer()
  local integer he = H2I(e)-0x100000
  local integer hf = H2I(Tm[he])-0x100000
  set U[hf] = null
  set UT[hf] = null
  call DestroyTimer(Tm[he])
  call DestroyTimer(e)
  set Tm[he] = null
  set e = null
  call DestroyTrigger(TR[hf])
  //set TR[hf] = null
endfunction



function SpellDamage takes nothing returns real
    return 10.00*I2R(GetUnitAbilityLevel(U[hf], 'A001'))
endfunction    

function Damage takes nothing returns nothing
     local integer hf = H2I(GetExpiredTimer())-0x100000
     if GetUnitState(U[hf], UNIT_STATE_MANA) >= 1.00 and GetUnitState(UT[hf], UNIT_STATE_LIFE)>0 then
        call SetUnitState(U[hf], UNIT_STATE_MANA, GetUnitState(U[hf], UNIT_STATE_MANA) - 1)
        call UnitDamageTarget(U[hf], UT[hf], SpellDamage() , true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl",UT[hf],"origin"))
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl",UT[hf],"origin"))
     else 
        call Cancel() 
     endif
endfunction

function Action takes nothing returns nothing
  local timer t 
  local timer te 
  local integer he 
  local trigger tr = CreateTrigger ()
  local unit u = GetTriggerUnit ()
   if GetSpellAbilityId() == 'A001' then
     set t = CreateTimer()
     set te = CreateTimer()
     set he = H2I(te)-0x100000 
     set hf = H2I(t)-0x100000 
     set Tm[he] = t
     set U[hf] = GetTriggerUnit()
     set UT[hf] = GetSpellTargetUnit ()
     call TimerStart(Tm[he],0.1, true, function Damage)
     //call TimerStart(te,6.01, false, function Cancel)
     call TriggerRegisterUnitEvent(tr, u, EVENT_UNIT_SPELL_FINISH )
     call TriggerRegisterUnitEvent(tr, u, EVENT_UNIT_SPELL_ENDCAST)
     call TriggerAddAction(tr, function Cancel)
     set TR[hf] = tr
   endif 
  set t = null 
  set te = null
  set tr = null
  set u = null
endfunction

//===========================================================================
function InitTrig_ManaLightning_1 takes nothing returns nothing
    local integer i = 0
    local trigger t = CreateTrigger ()
    loop
        exitwhen i > 12
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set i = i + 1
    endloop
    call TriggerAddAction(t, function Action )
set t = null    
endfunction


Переделал под глобал все рано ошибка.
Старый 28.05.2009, 21:52
DKbru

offline
Опыт: 1,407
Активность:
function Damage опережает то действие, когда ты заносишь триггер в глобалку... Эта функция содержит Cancel, котрорая уничтожает триггер. Несмотря на то, что эта функция вызывается таймером, советую тебе перенести строку set TR[hf] = tr выше, возможно это и причина вылета
Старый 28.05.2009, 23:27
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
DKbru Не, непомогло даже если убирать call Cancel()...

Ninbous добавил:
Код:
function Cancel takes nothing returns nothing
  local unit u = GetTriggerUnit ()
  local integer he = H2I(u)-0x100000
  local integer hf = H2I(Tm[he])-0x100000
  set U[hf] = null
  set UT[hf] = null
  call DestroyTimer(Tm[he])
  set Tm[he] = null
  set u = null
  call DestroyTrigger(TR[hf])
  set TR[hf] = null
endfunction


Разобрался почему был фатал: потомучто было вот ето local timer e = GetExpiredTimer() хотя в событии стоит "Юнит - завершает способность" и наверно поетому "GetExpiredTimer() возвращял ничего, сейчас исправил функцию на local unit u = GetTriggerUnit (), вроде должно работать фатала нет, но функция вроде необнуляет переменные и поетому таймер Tm[he] продолжает наносить урон =/ причем он стакивается если кинуть спелл еще раз... что опять не так?

Ninbous добавил:
Мб возвращяет неверный индекс массива?
Старый 29.05.2009, 01:21
ScorpioT1000
Работаем
offline
Опыт: отключен
в новом потоке надо call ExecuteFunction("Cancel")
Старый 29.05.2009, 19:43
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
ScorpioT1000 Куда вставить call ExecuteFunction("Cancel")?
Старый 29.05.2009, 20:01
ScorpioT1000
Работаем
offline
Опыт: отключен
завместо ее вызова?
Старый 29.05.2009, 21:25
J
expert
offline
Опыт: 48,747
Активность:
Код:
globals
    unit array g_Caster
    unit array g_Target
    timer array g_Tm  
    trigger array g_Tr
    triggeraction array g_TrA
endglobals

function H2I takes handle h returns integer
    return h
    return 0
endfunction

function Cancel takes nothing returns nothing
    local trigger Tr = GetTriggeringTrigger()
    local integer hTr = H2I(Tr)-0x100000
    call DestroyTimer(g_Tm[hTr])
    call TriggerRemoveAction(Tr, g_TrA[hTr])
    call DestroyTrigger(Tr)
    set Tr = null
endfunction

function Damage takes nothing returns nothing
    local integer hTm = H2I(GetExpiredTimer())-0x100000
    if GetUnitState(g_Caster[hTm], UNIT_STATE_MANA) >= 1.0 and GetUnitState(g_Target[hTm], UNIT_STATE_LIFE) > 0 then
        call SetUnitState(g_Caster[hTm], UNIT_STATE_MANA, GetUnitState(g_Caster[hTm], UNIT_STATE_MANA) - 1)
        call UnitDamageTarget(g_Caster[hTm], g_Target[hTm], I2R(10*GetUnitAbilityLevel(g_Caster[hTm], 'A001')), true, true, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\FaerieDragonMissile\\FaerieDragonMissile.mdl",g_Target[hTm],"origin"))
        call DestroyEffect(AddSpecialEffectTarget("Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl",g_Target[hTm],"origin"))
    else 
        call TriggerExecute(g_Tr[hTm])
    endif
endfunction
                                            
function Action_Condition takes nothing returns nothing
    return GetSpellAbilityId() == 'A001'
endfunction
  
function Action takes nothing returns nothing
    local unit Caster = GetTriggerUnit()
    local timer Tm = CreateTimer()
    local trigger Tr = CreateTrigger()
    local integer hTm = H2I(Tm)-0x100000
    local integer hTr = H2I(Tr)-0x100000
    call TimerStart(Tm, 0.1, true, function Damage)
    set g_Caster[hTm] = Caster
    set g_Target[hTm] = GetSpellTargetUnit()
    set g_Tr[hTm] = Tr             
    call TriggerRegisterUnitEvent(Tr, Caster, EVENT_UNIT_SPELL_FINISH )
    call TriggerRegisterUnitEvent(Tr, Caster, EVENT_UNIT_SPELL_ENDCAST)
    set g_TrA[hTr] = TriggerAddAction(Tr, function Cancel)
    set g_Tm[hTr] = Tm
    set Caster = null 
    set Tm = null
    set Tr = null
endfunction

function InitTrig_ManaLightning_1 takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer i = 0
    loop
        exitwhen i > 11
        call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
        set i = i + 1
    endloop                         
    call TriggerAddCondition(t, Condition(function Action_Condition))
    call TriggerAddAction(t, function Action)
    set t = null
endfunction

Отредактировано J, 30.05.2009 в 02:22.
Старый 29.05.2009, 21:41
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
J Куча ошибок, попытался их исправить, сохранил карту, запустил, но уже нече неработало
ScorpioT1000 Поставил заместо её вызова, все равно при завершении способности тригер дамажит цель...
Вот карта плиз помогите сделать как нада.
Прикрепленные файлы
Тип файла: w3x ManaLighting.w3x (18.8 Кбайт, 10 просмотров )
Старый 30.05.2009, 02:00
J
expert
offline
Опыт: 48,747
Активность:
лень запускать редактор, прошелся глазами по диагонале, вроде исправил все что попалось
Старый 30.05.2009, 02:24
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
Код:
function Action_Condition takes nothing returns nothing // Тут вроде должно стоять boolean? 
    return GetSpellAbilityId() == 'A001'
endfunction


Ninbous добавил:
Неработает, даже Action (там поставил проверку call DisplayTextToForce( GetPlayersAll(), "Test" ) после всех локалок) при касте непоявляется сообшение
Старый 30.05.2009, 02:49
ScorpioT1000
Работаем
offline
Опыт: отключен
Цитата:
call TriggerRegisterUnitEvent(Tr, Caster, EVENT_UNIT_SPELL_FINISH )
call TriggerRegisterUnitEvent(Tr, Caster, EVENT_UNIT_SPELL_ENDCAST)

это вот тоже сомнительная хрень, ты уверен в ее стабильности?
Старый 30.05.2009, 12:57
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
ScorpioT1000 Это обычное добавление событий в тригер, что в нем может быть не так? Тем более как раз из за этих событий я и делаю етот гемор, без них бы поставил таймер по истечению срока действия и все.

Ninbous добавил:
Выполнить сразу 2 события неудастся, если ты об этом ScorpioT1000
Юнит либо заканчивает применение способности, либо её прерывает.

Ninbous добавил:
J Нашел ошибку: "call TimerStart(Tm, 0.1, true, function Damage)" нужно было ставить ниже всех Set, так как таймер начинался без значений переменных g_Caster и g_Target. Теперь то все работает МУИ.

Ninbous добавил:
Спасибо ScorpioT1000 и J
Старый 30.05.2009, 16:48
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 01:45.