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

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

Ответ
 
Wine
ЙАААЗЬ?
offline
Опыт: 17,126
Активность:
Первый джас спелл
//TESH.scrollpos=-1
//TESH.alwaysfold=0

function Spell takes nothing returns nothing
    local timer t = GetExpiredTimer() 
    local unit caster = LoadUnitHandle(udg_hash,h,1)
    local unit target = LoadUnitHandle(udg_hash,h,2) 
    local effect e = GetEffectUnit()
    call PolledWait( ( DistanceBetweenCaster(GetUnitLoc(GetSpellAbilityCaster()),(GetSpellTarget())) / 1000.00 ) )
    call EffectTarget( "overhead", udg_Target, "Abilities\\Spells\\Other\\TalkToMe\\TalkToMe.mdl" )
    call TimerStart(t,3.00,true,function Spell)
    call Destroy(e)

    set caster = null
    set target = null
    set t = null

function SpellCond takes nothing returns boolean
    return GetSpellAbilityId()=='A000'
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger(  )
    call DisableTrigger( gg_trg_Spell )
    call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
    set udg_hash = InitHashtable()
endfunction
Впервые попробывал создать спелл на джасе через хеш таблицу с нуля. Жалуется на многочисленные ошибки, но сильно не орать прочитал статьи 15 минут назад, хочется услышать что не так и как исправить.
пысы как текст засунуть в код?
Старый 25.04.2011, 12:46
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Правильно написана только одна функция:
function SpellCond takes nothing returns boolean
    return GetSpellAbilityId()=='A000'
endfunction
Ошибок очень много:
  1. DisableTrigger() - триггер не будет работать (и хорошо, что не будет...)
  2. Не вижу регистрации триггера на событие. (TriggerRegister<чего-то_0там>Event)
  3. GetEffectUnit(), GetSpellAbilityCaster(), EffectTarget() и прочее - это что вообще такое? В стандартных функциях такого нет. Если это твои, так выкладывай вместе с кодом.
  4. Где функция Trig_Spell_Actions?
  5. Почему триггеру не добавлена проверка на условие функции SpellCond?
  6. Функция запускает сама себя и не имеет даже намёка на выход!
  7. endfunction где у тебя?
  8. ...
  9. baka!
Я в отчаянии от такого абсурдного кода! Бегом читать статьи!
Старый 25.04.2011, 13:01
Wine
ЙАААЗЬ?
offline
Опыт: 17,126
Активность:
ShadoW_DaemoN, сейчас постараюсь исправить, но:
Не вижу регистрации триггера на событие. (TriggerRegister<чего-то_0там>Event)
Где функция Trig_Spell_Actions?
Немного не понял
Старый 25.04.2011, 13:09
Doc

offline
Опыт: 63,163
Активность:
свдн забыл еще про PolledWait сказать.
Если уж юзаешь таймеры, то используй по полной, никаких глючных вэйтов.
Doc добавил:
Алсо вэйт не рабоает в коллбеках.
Старый 25.04.2011, 13:12
Hanabishi
COOL STATUS
offline
Опыт: отключен
Wine, прежде чем браться за статью по хешу, нужно узнать как пользоваться jass, советую начать отсюда xgm.ru/p/wc3/jass_introduction
Hanabishi добавил:
алсо в JNGP есть лист функций, а их предназначение узнаётся банальным переводом названия на русский язык
[+] замечание от Doc: Эй йоу, чо творишь?
Старый 25.04.2011, 13:27
Wine
ЙАААЗЬ?
offline
Опыт: 17,126
Активность:
function Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId()=='A000'
endfunction

function Spell takes nothing returns nothing
    local timer Timer = GetExpiredTimer()
    local integer Handle = GetHandleId(Timer)
    local unit Caster = LoadUnitHandle(udg_Hashtable,Handle,1)
    local unit Target = LoadUnitHandle(udg_Hashtable,Handle,2)
    local effect EffectTarget = LoadEffectHandle(udg_Hashtable,Handle,3)
    call TimerStart(Timer,3.00,true,function Spell)
    call DestroyEffect(EffectTarget)
    call DestroyTimer(Timer)
    call FlushChildHashtable(udg_Hashtable,Handle)
    set Caster = null
    set Target = null
    set Timer = null
endfunction

function Spell_Actions takes nothing returns nothing
    local timer Timer = CreateTimer()
    local integer Handle = GetHandleId(Timer)
    local unit Caster = GetSpellAbilityUnit()
    local unit Target = GetSpellTargetUnit()
    local real Damage = 9999.
    local effect EffectTarget = AddSpecialEffectTargetUnitBJ( "chest", Caster,"Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl")
    local real HP = GetUnitState(Target, UNIT_STATE_LIFE)
    
    call SaveUnitHandle(udg_Hashtable,Handle,1,Caster)
    call SaveUnitHandle(udg_Hashtable,Handle,2,Target)
    if HP <= 500 then
        call SetUnitState(Target, UNIT_STATE_LIFE, HP - 500)
        call UnitDamageTarget(Caster, Target, Damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
endif
    set Caster = null
    set Target = null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Spell, Condition( function Spell_Conditions ) )
    call TriggerAddAction( gg_trg_Spell, function Spell_Actions )
    call Preload("Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl")
endfunction
Вот короче что вышло у меня от долгого и нудного чтения статей
Спелл работает, но вопрос: Есть тут что оптимизировать и нет ли утечек?

Отредактировано Wine, 25.04.2011 в 16:29.
Старый 25.04.2011, 16:24
Rewenger
The culprit will not die
offline
Опыт: 35,873
Активность:
globals
constant real MYSPELL_DAMAGE = 9999.
constant real MYSPELL_HP = 500.
endglobals

function Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId()=='A000'
endfunction

function Spell takes nothing returns nothing
    local integer Handle = GetHandleId(GetExpiredTimer())
    call DestroyEffect(LoadEffectHandle(udg_Hashtable,Handle,3))
    call FlushChildHashtable(udg_Hashtable,Handle)
    call DestroyTimer(GetExpiredTimer())
endfunction

function Spell_Actions takes nothing returns nothing
    local timer Timer = CreateTimer()
    local integer Handle = GetHandleId(Timer)
    local unit Caster = GetSpellAbilityUnit()
    local unit Target = GetSpellTargetUnit()
    
    call SaveUnitHandle(udg_Hashtable, Handle, 1, Caster)
    call SaveUnitHandle(udg_Hashtable, Handle, 2, Target)
    call SaveEffectHandle(udg_Hashtable, Handle, 3, AddSpecialEffectTarget("Abilities\\Spells\\Human\\Avatar\\AvatarCaster.mdl", Caster, "chest"))
    call TimerStart(Timer, 3.00, false, function Spell)
    if GetWidgetLife(Target) < MYSPELL_HP then
        call SetWidgetLife(Target, GetWidgetLife(Target) - MYSPELL_HP)
        call UnitDamageTarget(Caster, Target, MYSPELL_DAMAGE, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_MAGIC, null)
endif
    set Caster = null
    set Target = null
    set Timer = null
endfunction
Сомневаюсь, что оно бы работало как вы хотели без запуска верхней функции.

Отредактировано Rewenger, 25.04.2011 в 17:34.
Старый 25.04.2011, 16:39
Wine
ЙАААЗЬ?
offline
Опыт: 17,126
Активность:
Rewenger, я уже исправил что хотел, но все равно спасибо
Старый 25.04.2011, 16:42
Rewenger
The culprit will not die
offline
Опыт: 35,873
Активность:
А если я сообщу, что ваш код выше не только работал неправильно, но ещё и был неоптимизирован и с утечками? //мой тоже, впрочем, неидеален
Старый 25.04.2011, 16:44
Ответ

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

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

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

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



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