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

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

Закрытая тема
 
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Помогите исправить 1 ошибку
call TimerStart(t,i,true,function spell) - отсутствует название функции уже кучу статей прошел, но так и не нашел ответа...
function Trig_spell_Conditions takes nothing returns boolean
    if ( not ( GetUnitAbilityLevelSwapped('A000', GetAttacker()) > 0 ) ) then
        return false
    endif
    return true
endfunction

function spell takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit c = LoadUnitHandle(udg_Hash,id,1)
    local unit u = LoadUnitHandle(udg_Hash,id,2)
    local integer dmg = LoadInteger(udg_Hash,id,0)
    call UnitDamageTargetBJ( c, u, I2R(dmg) , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call AddSpecialEffectTarget( "chest", u, "Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl" )
    call CreateTextTagUnitBJ( I2S(dmg), u , 0.00, 9.00, 100, 100, 0.00, 0 )
    call SetTextTagVelocityBJ( GetLastCreatedTextTag(), 90.00, 90 )
    call SetTextTagPermanentBJ( GetLastCreatedTextTag(), false )
    call SetTextTagFadepointBJ( GetLastCreatedTextTag(), 1.00 )
    call SetTextTagLifespanBJ( GetLastCreatedTextTag(), 2.00 )
    call DestroyEffect( GetLastCreatedEffectBJ() )
    call DestroyTimer(t)
    set u = null
    set t = null
    set c = null
endfunction

function Trig_spell_Actions takes nothing returns nothing
    local unit c = GetAttacker()
    local unit u = GetAttackedUnitBJ()
    local integer dmg = R2I( 0.25 * (GetUnitAbilityLevelSwapped('A000', u)) * I2R(GetHeroStatBJ(bj_HEROSTAT_AGI, c, true)))
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    call SaveInteger(udg_Hash,id,0,dmg)
    call SaveUnitHandle(udg_Hash,id,1,c)
    call SaveUnitHandle(udg_Hash,id,2,u)
    call TimerStart(t,1.00,true,function spell)
    set t = null
    set c = null
    set u = null
endfunction

//===========================================================================
function InitTrig_spell takes nothing returns nothing
    set gg_trg_spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_spell, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_spell, Condition( function Trig_spell_Conditions ) )
    call TriggerAddAction( gg_trg_spell, function Trig_spell_Actions )
endfunction
Vadik29 добавил:
Сохранил в jngp ошибок нету оО

Отредактировано Vadik29, 14.03.2012 в 16:09.
Старый 14.03.2012, 15:16
ScorpioT1000
Работаем
offline
Опыт: отключен
Это касается процедурного программирования в целом - компилятор разбирает код сверху вниз, т.е. просто перемести функцию спелл выше места ее вызова.
Старый 14.03.2012, 15:16
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
ScorpioT1000, триггер заработал, но варик вылетает с критом при ударе.....
Старый 14.03.2012, 15:26
ScorpioT1000
Работаем
offline
Опыт: отключен
Это уже новая проблема =)
function spell takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = 0
    local unit c = null
    local unit u = null
    local integer dmg = 0
    if (t==null) then
        call BJDebugMsg("|cFF0000FF[debug]|r spell: t==null")
        return
    endif
    set id = GetHandleId(t)
    set c = LoadUnitHandle(udg_Hash,id,1)
    set u = LoadUnitHandle(udg_Hash,id,2)
    if (c==null or u==null) then
        call BJDebugMsg("|cFF0000FF[debug]|r spell: c==null or u==null")
        return
    endif
    set dmg = LoadInteger(udg_Hash,id,0)
    call UnitDamageTargetBJ( c, u, (I2R(dmg)) , ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL )
    call AddSpecialEffectTargetUnitBJ( "chest", u, "Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl" )
    call DestroyEffectBJ( GetLastCreatedEffectBJ() )
    call FlushChildHashtable(udg_Hash,id)
    set u = null
    set t = null
    set c = null
endfunction
и проверь Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl на правильность
ScorpioT1000 добавил:
Сохранил в jngp ошибок нету оО
потому что он несколько раз проходит по коду )
Старый 14.03.2012, 15:44
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Vadik29, где удаление таймера?
Klop добавил:
call TriggerAddAction( gg_trg_spell, function spell )
call TriggerAddAction( gg_trg_spell, function Trig_spell_Actions )
что то мне подсказывает что проблема здесь)
Klop добавил:
может не будеш вызывать функцию spell пока не запустиш таймер

Отредактировано Klop, 14.03.2012 в 16:02.
Старый 14.03.2012, 15:52
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Klop, неа, теперь таймер удалаяется ScorpioT1000, твой вариант тоже не пашет(

Отредактировано Vadik29, 14.03.2012 в 16:02.
Старый 14.03.2012, 15:56
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Vadik29, call TriggerAddAction( gg_trg_spell, function spell )
удали эту строку
Старый 14.03.2012, 16:06
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Vadik29, закомментируй все строчки, вар не будет вылетать. По очереди раскомментируй и смотри когда начнутся вылеты. Ну и да, вот нормальный код (возможно, без вылетов). Возможно проблема была в том, что ты хочешь получить GetExpiredTimer, когда он ещё даже не создан (spell выполняется перед Trig_spell_Actions, вроде как).
» код
function Trig_spell_Conditions takes nothing returns boolean
    return GetUnitAbilityLevel(GetAttacker(),'A000')>0
endfunction

function spell takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit c = LoadUnitHandle(udg_Hash,id,0)
    local unit u = LoadUnitHandle(udg_Hash,id,1)
    local real dmg = LoadReal(udg_Hash,id,0)
    call UnitDamageTarget(c,u,dmg,true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,WEAPON_TYPE_WHOKNOWS)
    call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThi​efBlood.mdl",u,"chest"))
    if LoadInteger(udg_Hash,id,0)==0 then
        SaveInteger(udg_Hash,id,0,1)
    else
        call DestroyTextTag(LoadTextTagHandle(udg_Hash,id,2))
        call FlushChildHashtable(udg_Hash,id)
        call DestroyTimer(t)
    endif
    set u = null
    set t = null
    set c = null
endfunction

function Trig_spell_Actions takes nothing returns nothing
    local unit c = GetAttacker()
    local unit u = GetTriggerUnit()
    local real dmg = 0.25*(GetUnitAbilityLevel(c,'A000'))*I2R(GetHeroAgi(c,true)) //у тебя здесь брался уровень способности цели, 
                                                                                    //а не напавшего, к тому же целочисленная...
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local texttag tt=CreateTextTag()
    call SaveInteger(udg_Hash,id,0,0) //номер вызова функции spell
    call SaveReal(udg_Hash,id,0,dmg)
    call SaveUnitHandle(udg_Hash,id,0,c) //разные типы в разные части хештаблицы записываются, не за чем записывать первый
    call SaveUnitHandle(udg_Hash,id,1,u) //хендл, в слот 1, можно и в 0, т.к. выше у тебя реальная переменная пишется в 0 слот
                                         //вот если бы ты писал там Save...Handle, тогда да, а так ничего не перебивается.
    call SaveTextTagHandle(udg_Hash,id,2,tt)                                         
    call SetTextTagText(tt, I2S(R2I(dmg)), 0.0207) //Размер равен size*0.0023=9*0.0023=0.0207
    call SetTextTagPosUnit(tt,u,0.)
    call SetTextTagColor(tt,255,255,0,255)
    call SetTextTagVelocity(tt,0.,0.049921875)//последнее число тоже получил просто подставив формулу
    call SetTextTagPermanent(tt,false)
    call SetTextTagFadepoint(tt,1.00)
    call SetTextTagLifespan(tt,2.00)
    call TimerStart(t,0.00,false,function spell)
    set tt = null
    set t = null
    set c = null
    set u = null
endfunction

//===========================================================================
function InitTrig_spell takes nothing returns nothing
    set gg_trg_spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_spell, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_spell, Condition( function Trig_spell_Conditions ) )
    call TriggerAddAction( gg_trg_spell, function Trig_spell_Actions )
endfunction
Старый 14.03.2012, 16:21
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
Клоз разобрался спс Hellfim, Klop, ScorpioT1000, )
Старый 14.03.2012, 17:08
Закрытая тема

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

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

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

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



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