Добавлен , опубликован
Дисклеймер!
Я полный нуб/лох/помойка в джассе (называйте как хотите), ничего толком не знаю и короче, если каким-то чудом захотел эту способность, то юзай на свой страх и риск. По возможности буду стараться оптимизировать это говно
Сам я любитель поесть со своей помойки, и другим не прочь предложить.
Представляю новый шедвяврыфвыаф
Просто захотелось сделать какую-то супер простенькую способность, хоть и убил на это 4 часа
Цель: юнит
Тип: таргетный разовый урон
Суть: герой, как крыса сранная (то бишь я), телепортируется за спину юнита и калечит жизнь
Подходит как для обычного юнита, так и для героя
карта c видосом в комментах
Текущие настройки:
  • Название твоей хэш-таблицы
  • Название триггера
  • Тип события юнита-кастера
  • ID способности
  • Базовый урон
  • Доп. урон с прокачкой скилла
  • Скейл урона от силы
  • Скейл урона от ловкости
  • Скейл урона от интеллекта
  • вкл|выкл бонусы к характеристикам
  • Да|Нет - Урон с автоатаки?
  • Да|Нет - Автоатака дальнего боя?
  • Тип атаки
  • Тип урона
  • Тип оружия (звук)
  • Дистанция телепортации от юнита-цели
  • телепорт спереди|сзади юнита-цели
  • Задержка телепорта
  • выкл|вкл исчезновение юнита на время задержки телепорта
  • вкл|выкл эффекты при попадании
  • Эффект при попадании
  • Точка крепления эффекта
  • Время удаления эффекта
  • Эффект телепортации (начальный)
  • Время удаления эффекта
  • Эффект телепортации (конечный)
  • Время удаления эффекта
  • выкл|вкл отбрасывание
  • Сила отбрасывания
  • Время отбрасывания
  • Периодичность таймера
Код
Почему SetUnitPosition вместо SetUnitX|Y? Да потому что я бл задолбаюсь с этими конченными проверками и станом юнита, которые включает в себя эта ПРЕКРАСНАЯ функция. Да, я лох по жизни и люблю деградировать
scope MySc
globals
define private H = udg_Hash // Название твоей хэш-таблицы
define private TrigName = Phoenix // Название триггера
define private TrigEvent = EVENT_PLAYER_UNIT_SPELL_EFFECT // Тип события юнита-кастера
define private AbilityID = 'A000' // ID способности

define private Damage = 25.00 // Базовый урон
define private DamageLvl = 25.00 // Доп. урон с прокачкой скилла
define private DamageScaleStr = 0.00 // Скейл урона от силы
define private DamageScaleAgi = 0.00 // Скейл урона от ловкости
define private DamageScaleInt = 1.00 // Скейл урона от интеллекта
define private IncludeBonuses = true // true|false - вкл|выкл бонусы к характеристикам

define private Attack = false // true|false - Да|Нет - Урон с автоатаки?
define private Range = false // true|false - Да|Нет - Автоатака дальнего боя?
define private AttackType = ATTACK_TYPE_NORMAL // Тип атаки
define private DamageType = DAMAGE_TYPE_NORMAL // Тип урона
define private WeaponType = WEAPON_TYPE_WHOKNOWS // Тип оружия (звук)

define private Distance = 100.00 // Дистанция телепортации от юнита-цели
define private AngleTP = 1 // 0|1 - телепорт спереди|сзади юнита-цели
define private Delay = 0.25 // Задержка телепорта
define private UnitShow = 1 // 0|1 - выкл|вкл исчезновение юнита на время задержки телепорта

define private EffectTF = 1 // 0|1 - выкл|вкл эффекты при попадании
define private Effect = "Abilities\\Spells\\Other\\CrushingWave\\CrushingWaveDamage.mdl" // Эффект при попадании
define private AttachPoint = "origin" // Точка крепления эффекта
define private EffectRemoveTime = 1.00 // Время удаления эффекта

define private EffectTP = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl" // Эффект телепортации (начальный)
define private EffectRemoveTime0 = 1.00 // Время удаления эффекта

define private EffectTP0 = "Objects\\Spawnmodels\\Naga\\NagaDeath\\NagaDeath.mdl" // Эффект телепортации (конечный)
define private EffectRemoveTime1 = 1.00 // Время удаления эффекта

define private DiscardingTF = 1 // 0|1 - выкл|вкл отбрасывание
define private Discarding = 15.00 // Сила отбрасывания
define private DiscardingTime = 0.50 // Время отбрасывания
define private DiscardingTimer = 0.02 // Периодичность таймера (выше цифра = +оптимизация -графика, ниже = наоборот)

endglobals
//==========================================================================
private function IsUnitDead takes unit u returns boolean
	return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction

private function remeff takes nothing returns nothing
    local timer t = GetExpiredTimer()
    call DestroyEffect(LoadEffectHandle(H,GetHandleId(t),0))
    call FlushChildHashtable(H,GetHandleId(t))
    call DestroyTimer(t)
    set t = null
endfunction

private function move takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real a = LoadReal(H,i,1)
    local real d = LoadReal(H,i,2)
    local real tm = LoadReal(H,i,3)+DiscardingTimer
    
    if tm > DiscardingTime then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
    else
        call SetUnitPosition(u,GetUnitX(u)+d*Cos(a),GetUnitY(u)+d*Sin(a))
        call SaveReal(H,i,2,d-(Discarding/DiscardingTime*DiscardingTimer))
        call SaveReal(H,i,3,tm)
    endif
    
    set t = null
    set u = null
endfunction

private function wis takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local unit uu = LoadUnitHandle(H,i,1)
    local real dmg = LoadReal(H,i,2)
    local real a = LoadReal(H,i,3)
    
    call DestroyTimer(t)
    call FlushChildHashtable(H,i)
    set t = null
    
    if UnitShow != 1 then
        set t = CreateTimer()
        call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffect(EffectTP,GetUnitX(u),GetUnitY(u)))
        call TimerStart(t,EffectRemoveTime0,false,function remeff)
        set t = null
    endif
    call SetUnitPosition(u,GetUnitX(uu)+Distance*Cos(a),GetUnitY(uu)+Distance*Sin(a))
    if UnitShow == 1 then
        call ShowUnit(u,true)
        if GetLocalPlayer() == GetOwningPlayer(u) then
            call SelectUnit(u,true)
        endif
    endif
    if dmg < 0.00 then
        call SetWidgetLife(uu,GetWidgetLife(uu)+-dmg)
    endif
    call UnitDamageTarget(u,uu,dmg,Attack,Range,AttackType,DamageType,WeaponType)
    set t = CreateTimer()
    call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffect(EffectTP0,GetUnitX(u),GetUnitY(u)))
    call TimerStart(t,EffectRemoveTime1,false,function remeff)
    set t = null
    
    if DiscardingTF == 1 then
        set t = CreateTimer()
        set i = GetHandleId(t)
        call SaveUnitHandle(H,i,0,uu)
        call SaveReal(H,i,1,Atan2(GetUnitY(uu)-GetUnitY(u),GetUnitX(uu)-GetUnitX(u)))
        call SaveReal(H,i,2,Discarding)
        call TimerStart(t,DiscardingTimer,true,function move)
        set t = null
    endif
    if EffectTF == 1 then
        set t = CreateTimer()
        call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffectTarget(Effect,uu,AttachPoint))
        call TimerStart(t,EffectRemoveTime,false,function remeff)
        set t = null
    endif
endfunction

private function Actions takes nothing returns nothing
    local timer t = null
    local unit u = GetSpellAbilityUnit()
    local unit uu = GetSpellTargetUnit()
    local integer lvl = GetUnitAbilityLevel(u,AbilityID)
    local integer i
    local real a
    local real dmg = Damage+(lvl*DamageLvl)+(GetHeroStr(u,IncludeBonuses)*DamageScaleStr)+(GetHeroAgi(u,IncludeBonuses)*DamageScaleAgi)+(GetHeroInt(u,IncludeBonuses)*DamageScaleInt)
    
    if not IsUnitDead(u) and not IsUnitDead(uu) then
        if AngleTP == 0 then
            set a = Atan2(GetUnitY(u)-GetUnitY(uu),GetUnitX(u)-GetUnitX(uu))
        else
            set a = Atan2(GetUnitY(uu)-GetUnitY(u),GetUnitX(uu)-GetUnitX(u))
        endif
    
        if Delay <= 0.00 then
            set t = CreateTimer()
            call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffect(EffectTP,GetUnitX(u),GetUnitY(u)))
            call TimerStart(t,EffectRemoveTime0,false,function remeff)
            set t = null
            call SetUnitPosition(u,GetUnitX(uu)+Distance*Cos(a),GetUnitY(uu)+Distance*Sin(a))
            call UnitDamageTarget(u,uu,dmg,Attack,Range,AttackType,DamageType,WeaponType)
            if dmg < 0.00 then
                call SetWidgetLife(uu,GetWidgetLife(uu)+-dmg)
            endif
            set t = CreateTimer()
            call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffect(EffectTP0,GetUnitX(u),GetUnitY(u)))
            call TimerStart(t,EffectRemoveTime1,false,function remeff)
            set t = null
            if DiscardingTF == 1 then
                set t = CreateTimer()
                set i = GetHandleId(t)
                call SaveUnitHandle(H,i,0,uu)
                call SaveReal(H,i,1,Atan2(GetUnitY(uu)-GetUnitY(u),GetUnitX(uu)-GetUnitX(u)))
                call SaveReal(H,i,2,Discarding)
                call TimerStart(t,DiscardingTimer,true,function move)
                set t = null
            endif
            if EffectTF == 1 then
                set t = CreateTimer()
                call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffectTarget(Effect,uu,AttachPoint))
                call TimerStart(t,EffectRemoveTime,false,function remeff)
                set t = null
            endif
        else
            set t = CreateTimer()
            set i = GetHandleId(t)
            call SaveUnitHandle(H,i,0,u)
            call SaveUnitHandle(H,i,1,uu)
            call SaveReal(H,i,2,Damage+(lvl*DamageLvl)+(GetHeroStr(u,IncludeBonuses)*DamageScaleStr)+(GetHeroAgi(u,IncludeBonuses)*DamageScaleAgi)+(GetHeroInt(u,IncludeBonuses)*DamageScaleInt))
            call SaveReal(H,i,3,a)
            call TimerStart(t,Delay,false,function wis)
            set t = null
            if UnitShow == 1 then
                set t = CreateTimer()
                call SaveEffectHandle(H,GetHandleId(t),0,AddSpecialEffect(EffectTP,GetUnitX(u),GetUnitY(u)))
                call TimerStart(t,EffectRemoveTime0,false,function remeff)
                set t = null
                call ShowUnit(u,false)
            endif
        endif
    endif
    
    set u = null
    set uu = null
endfunction

//===========================================================================
private function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == AbilityID
endfunction

function InitTrig_##TrigName takes nothing returns nothing
    local trigger t = CreateTrigger()
    local integer index = 0
    loop
        call TriggerRegisterPlayerUnitEvent(t,Player(index),TrigEvent,null)
        set index = index + 1
        exitwhen index == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition(t,Condition(function Conditions))
    call TriggerAddAction(t,function Actions)
    set t = null
endfunction
endscope
Если при запуске карты через редактор тебя выбивает в главное меню, то включи JassHelper (если он выключен) и просто нажми Ctrl+S в редакторе, если возникнет ошибка, пожалуйста, сделай скрин и пришли мне, если ошибки не будет, то после этого карта должна запустится
`
ОЖИДАНИЕ РЕКЛАМЫ...