Добавлен , не публикуется
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Наработка
Версия Warcraft:
1.26 и выше

Описание

Утечки:Нет
Mui:Да
Ссылки: Дракон, Взрыв
Требования: JNGP
Описание:Герой создает огненного дракона, который движется на противника и через несколько секунд взрывается.
Время действия: 1.10 сек.
Урон: 25/50/75 ед. урона.
Перезарядка: 10 сек.

Скришоты

Подробности

Код
((код jass
function FireDragon_Act takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local unit b = LoadUnitHandle(hash,h,1) // загружаем юнитов
    local unit a = LoadUnitHandle(hash,h,2)
    local real d = GetUnitFacing(b)
    local unit n = null
    local group g = CreateGroup()
    call SetUnitX(b,GetWidgetX(b)+ 20 *Cos(d*bj_DEGTORAD)) // двигаем юнита
    call SetUnitY(b,GetWidgetY(b)+ 20 *Sin(d*bj_DEGTORAD))
    call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl",GetUnitX(b),GetUnitY(b))) // спецэффект при движениий
    call GroupEnumUnitsInRange(g,GetUnitX(b),GetUnitY(b),250,null)
    loop 
    set n = FirstOfGroup(g)
    exitwhen n == null
    if IsUnitEnemy(n,GetOwningPlayer(b)) == true and IsUnitType(n,UNIT_TYPE_DEAD) == false then
    call UnitDamageTarget(a,n,25*GetUnitAbilityLevel(a,'A000'),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_FIRE,null)
    endif
    call GroupRemoveUnit(g,n) // удаляем юнита из группы
    endloop
    call DestroyGroup(g)
    // обнуляем переменные
    set t = null
    set a = null
    set b = null
    set g = null
    set n = null
endfunction

function FireDragon takes nothing returns nothing
    local unit a = GetSpellAbilityUnit()
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    local group g = CreateGroup()
    local unit n = null
    local real d = bj_RADTODEG*Atan2(GetSpellTargetY()-GetUnitY(a),GetSpellTargetX()-GetUnitX(a)) // угол для Dummy юнита
    local unit b = CreateUnit(GetOwningPlayer(a),'u000',GetUnitX(a),GetUnitY(a),d)
    call SaveUnitHandle(hash,h,1,b) // сохраняем юнитов
    call SaveUnitHandle(hash,h,2,a)
    call TimerStart(t,0.02,true,function FireDragon_Act) // запуск таймера
    call TriggerSleepAction(1.10) // тут можете сами настроить секунды
    // здесь если хотите убрать взрыв можете удалить спецэффекты и урон
    call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl",GetUnitX(b),GetUnitY(b)))
    call DestroyEffect(AddSpecialEffect("SuperBigExplosion.mdx",GetUnitX(b),GetUnitY(b)))
    call GroupEnumUnitsInRange(g,GetUnitX(b),GetUnitY(b),320,null)
    loop 
    set n = FirstOfGroup(g)
    exitwhen n == null
    if IsUnitEnemy(n,GetOwningPlayer(b)) == true and IsUnitType(n,UNIT_TYPE_DEAD) == false then
    call UnitDamageTarget(a,n,150*GetUnitAbilityLevel(a,'A000'),true,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_FIRE,null)
    endif
    call GroupRemoveUnit(g,n)
    endloop
    call FlushChildHashtable(hash,h)
    call PauseTimer(t)
    call DestroyTimer(t)
    call RemoveUnit(b)
    call DestroyGroup(g)
    set t = null
    set a = null
    set n = null
    set g = null
    set b = null
endfunction

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

//===========================================================================
function InitTrig_FireDragon takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index = 0
    set index = 0
    loop
    call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
    set index = index + 1
    exitwhen index == bj_MAX_PLAYER_SLOTS // по просьбе NazarPunk`а сделал
    endloop
    call TriggerAddCondition(t, Condition( function FireDragon_Cond ) )
    call TriggerAddAction(t, function FireDragon )
    set t = null
endfunction

globals
hashtable hash = InitHashtable() // хэш таблица
endglobals
))
СКАЧАТЬ вот это скачивайте это на джаззе.
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
32
5 лет назад
Отредактирован Берги
3
Призываю Назара, он покажет на сколько короче и проще код на lua без хештаблиц...
Щас ещё придут и скажут что "local unit n = null" не надо делать, но иногда бывает, что редактор пишет "андеклиред n" поэтому смысл какой никакой тут есть
А ещё если используешь вызов "GetUnitX(b)" более одного раза, его следует прокешировать в переменную, это будет быстрее на 0,0001 наносекунд
раскрыть
о маева муа синдер ю
1
12
5 лет назад
1
Bergi_Bear:
Призываю Назара, он покажет на сколько короче и проще код на lua без хештаблиц...
Щас ещё придут и скажут что "local unit n = null" не надо делать, но иногда бывает, что редактор пишет "андеклиред n" поэтому смысл какой никакой тут есть
А ещё если используешь вызов "GetUnitX(b)" более одного раза, его следует прокешировать в переменную, это будет быстрее на 0,0001 наносекунд
Nani?
0
21
5 лет назад
0
Таймерами пользоваться умеете, а вейт всё равно влепили.
0
29
5 лет назад
0
Призываю Назара, он покажет на сколько короче и проще код на lua без хештаблиц...
Я прошлую способность этого автора переписал на zinc попутно оптимизировав и оставил критику. Но автор вместо того, чтоб её поправить, выложил такуюже кривую следующу.
2
28
5 лет назад
Отредактирован PT153
2
это будет быстрее на 0,0001 наносекунд
Это будет и быстрее, и короче.
поэтому смысл какой никакой тут есть
Смысла так делать нет, это бесполезное присваивание. Многие IDE об этом пишут.
Да и не редактор, а pjass.exe. Более того, данная ошибка выводится, если ты пытаешься использовать переменную без значения, что приводит к краху потока в JASS.
0
12
5 лет назад
0
ScopteRectuS:
Таймерами пользоваться умеете, а вейт всё равно влепили.
Без вэйта не будет красивее.Если хочешь чтобы он сразу взорваля можешь убрать вэйт.
Теперь я не могу наработки скидывать.(NazarPunk разозлится на меня)
Чтобы оставить комментарий, пожалуйста, войдите на сайт.