Всем привет, хотел бы сделать предмет блинк дагер как в доте 2 , который после телепорта будет замедлять и наносить урон врагам в месте блинка . Желательно чистый джасс ;)
Принятый ответ
Взял код спелла и либу которую юзал в спелле из своей мапы, оптимизируй под свою , должно быть все понятно если хоть чуть-чуть понимаешь как работает джасс
globals
hashtable H = InitHashtable()
hashtable HashTable = InitHashtable()
unit uFAST = null
unit uENUM = null
unit uDMG = null
unit uKILL = null
group gKILL = CreateGroup()
group gFAST = CreateGroup()
group gDMG = CreateGroup()
integer idTIMER = 0
real SysX = 0
real SysY = 0
endglobals
function UnitEvent takes trigger Trig, playerunitevent whichEvent, code Act returns trigger
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent( Trig, Player( index ), whichEvent, null )
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
if Act != null then
call TriggerAddAction( Trig, Act )
endif
return Trig
endfunction
function TimerPause takes timer LocTimer returns nothing
if LoadBoolean( HashTable, GetHandleId( LocTimer ), StringHash( "TimerStarted" ) ) then
call PauseTimer( LocTimer )
call SaveBoolean( HashTable, GetHandleId( LocTimer ), StringHash( "TimerStarted" ), false )
endif
endfunction
function CleanMUI takes timer Timer returns nothing
call TimerPause( Timer )
call FlushChildHashtable( HashTable, GetHandleId( Timer ) )
endfunction
function CleanTimer takes nothing returns nothing
call CleanMUI(GetExpiredTimer())
endfunction
function NewTimer takes player p returns nothing
local integer MaxTimer = 100
local integer idP = GetHandleId(p)
local integer Iterator = LoadInteger( HashTable, idP, StringHash( "TimerIterator" ) )
loop
exitwhen not LoadBoolean( HashTable, GetHandleId( LoadTimerHandle( HashTable, idP, StringHash( "Timer_Num_" + I2S( Iterator ) ) ) ), StringHash( "TimerStarted" ) ) and Iterator <= MaxTimer
if Iterator > MaxTimer then
set Iterator = 0
else
set Iterator = Iterator + 1
endif
endloop
call SaveInteger( HashTable, idP, StringHash( "TimerIterator" ), Iterator )
if LoadTimerHandle( HashTable, idP, StringHash( "Timer_Num_" + I2S( Iterator ) ) ) == null then
call SaveTimerHandle( HashTable, idP, StringHash( "Timer_Num_" + I2S( Iterator ) ), CreateTimer())
endif
set idTIMER = GetHandleId(LoadTimerHandle(HashTable, idP, StringHash("Timer_Num_" + I2S(Iterator))))
endfunction
function LoadTimer takes player p returns timer
local integer id = GetHandleId(p)
local integer Iterator = LoadInteger( HashTable, id, StringHash( "TimerIterator" ) )
call SaveBoolean( HashTable, GetHandleId( LoadTimerHandle( HashTable, id, StringHash( "Timer_Num_" + I2S( Iterator ) ) ) ), StringHash( "TimerStarted" ), true )
return LoadTimerHandle( HashTable, id, StringHash( "Timer_Num_" + I2S( Iterator ) ) )
endfunction
function Damage_Unit takes unit Source, unit Target, real DMG, attacktype Atk_Type, damagetype Dmg_Type returns boolean
if GetUnitAbilityLevel( Target, 'BHbn' ) > 0 then
set Atk_Type = ATTACK_TYPE_NORMAL
set Dmg_Type = DAMAGE_TYPE_MAGIC
endif
return UnitDamageTarget( Source, Target, DMG, true, false, Atk_Type, Dmg_Type, WEAPON_TYPE_WHOKNOWS )
endfunction
function MagicDamage takes unit caster, unit target, real damage returns nothing
call Damage_Unit(caster, target, damage, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL)
endfunction
function CastAoEAbility takes integer PID, real LocX, real LocY, integer AID, integer ALvL, string Order returns boolean
set bj_lastCreatedUnit = CreateUnit( Player( PID ), 'n00A', LocX, LocY, 270 )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1 )
call UnitAddAbility( bj_lastCreatedUnit, AID )
call SetUnitAbilityLevel( bj_lastCreatedUnit, AID, ALvL )
return IssueImmediateOrder( bj_lastCreatedUnit, Order )
endfunction
function LCast takes string s returns unit
set idTIMER = GetHandleId(GetExpiredTimer())
return LoadUnitHandle( H, idTIMER, StringHash( s ) )
endfunction
function LUnit takes string s returns unit
return LoadUnitHandle( H, idTIMER, StringHash( s ) )
endfunction
function LInt takes string s returns integer
return LoadInteger( H, idTIMER, StringHash( s ) )
endfunction
function LReal takes string s returns real
return LoadReal( H, idTIMER, StringHash( s ) )
endfunction
function SUnit takes string s, unit u returns nothing
call SaveUnitHandle( H, idTIMER, StringHash(s), u)
endfunction
function SInt takes string s, integer i returns nothing
call SaveInteger( H, idTIMER, StringHash(s), i)
endfunction
function SReal takes string s, real r returns nothing
call SaveReal( H, idTIMER, StringHash(s), r)
endfunction
function NewCTimer takes unit caster returns nothing
call NewTimer(GetOwningPlayer(caster))
call SInt("Time", 0)
call SUnit("Caster", caster)
endfunction
function StartCTimer takes unit caster, real period, code func returns nothing
call TimerStart(LoadTimer(GetOwningPlayer(caster)), period, true, func)
endfunction
function LSTime takes integer add returns integer
local integer time = LoadInteger(H, idTIMER, StringHash("Time")) + add
call SaveInteger( H, idTIMER, StringHash( "Time" ), time )
return time
endfunction
function GUStr takes unit u returns integer
return GetHeroStr(u, true)
endfunction
function IsAlive takes unit u returns boolean
return GetWidgetLife(u) > .405
endfunction
function IsEnemyBasic takes unit target, unit caster returns boolean
return (not IsUnitType(target, UNIT_TYPE_STRUCTURE) and IsUnitEnemy(target, GetOwningPlayer(caster)) and IsAlive(target))
endfunction
function IsGroupEmpty takes nothing returns boolean
set uENUM = FirstOfGroup(gFAST)
if uENUM != null then
call GroupRemoveUnit(gFAST, uENUM)
return false
endif
return true
endfunction
function GroupUnitsInRange takes real x, real y, real range returns nothing
call GroupEnumUnitsInRange(gFAST, x, y, range, null)
endfunction
function ThunderGodSTR_act takes unit caster returns nothing
local integer time = LSTime(1)
local real x
local real y
local integer pid = GetPlayerId(GetOwningPlayer(caster))
if time == 10 then
set x = GetUnitX(caster)
set y = GetUnitY(caster)
call GroupUnitsInRange(x, y, 400)
loop
exitwhen IsGroupEmpty()
if IsEnemyBasic(uENUM, caster) then
call MagicDamage(caster, uENUM, LReal("Damage") )
endif
endloop
call CastAoEAbility(pid, x, y, 'AS05', 1, "creepthunderclap")
call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Orc\\WarStomp\\WarStompCaster.mdl", x , y ))
endif
if time > 10 then
call CleanTimer()
endif
endfunction
function ThunderGodSTR_Shell takes nothing returns nothing
call ThunderGodSTR_act(LCast("Caster"))
endfunction
function ThunderGodSTR takes unit caster returns nothing
local real damage = 350 + GUStr(caster)
call NewCTimer(caster)
call SReal("Damage", damage)
call StartCTimer(caster , 0.01, function ThunderGodSTR_Shell)
endfunction
function CustomSpellEffect takes nothing returns nothing
local integer id = GetSpellAbilityId()
if id == 'AS18' then
call ThunderGodSTR(GetTriggerUnit())
endif
endfunction
function InitSpellEffect takes nothing returns nothing
call UnitEvent(CreateTrigger(), EVENT_PLAYER_UNIT_SPELL_EFFECT, function CustomSpellEffect)
endfunction
function main takes nothing returns nothing
call ExecuteFunc("InitSpellEffect")
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. nazarpunk
Ред. SAND
Урон наносим триггерно.
Дебафф через ауру.
Можно сделать на GUI.
Хочешь Jass - можно и Jass.
Понятно конечно что пострадала развёртка страницы, но в первые мгновения этого не осознаёшь и просто афигеваешь от урона в "6 + 3 от силы", от замедления движения на 150%, и от длительности эффекта в 50 сек. )))