Всем привет, хотел бы сделать предмет блинк дагер как в доте 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	
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
29
1 год назад
0
Угадал))
Это просто единственное разумное объяснение.

но оно будет идеально работать
function IsAlive takes unit u returns boolean 
	return GetWidgetLife(u) > .405
endfunction
С очень редким шансом может сработать неидеально. UnitAlive понадёжней будет.
0
10
1 год назад
0
А может кастануть дамми клэп в точку блинка? Ну и урон вокруг даммика
0
6
1 год назад
0
А может кастануть дамми клэп в точку блинка? Ну и урон вокруг даммика
А у меня как по твоему сделано?)
0
26
1 год назад
0
А я бы без дамми обошёлся.
Урон наносим триггерно.
Дебафф через ауру.
Можно сделать на GUI.
Хочешь Jass - можно и Jass.

Открыл офф-вики д2, нашёл там этот даггер - ужаснулся с цифр))
Понятно конечно что пострадала развёртка страницы, но в первые мгновения этого не осознаёшь и просто афигеваешь от урона в "6 + 3 от силы", от замедления движения на 150%, и от длительности эффекта в 50 сек. )))
0
6
1 год назад
0
А я бы без дамми обошёлся.
Урон наносим триггерно.
Дебафф через ауру.
Можно сделать на GUI.
Хочешь Jass - можно и Jass.

Открыл офф-вики д2, нашёл там этот даггер - ужаснулся с цифр))
Понятно конечно что пострадала развёртка страницы, но в первые мгновения этого не осознаёшь и просто афигеваешь от урона в "6 + 3 от силы", от замедления движения на 150%, и от длительности эффекта в 50 сек. )))
А стоп, меня запутали :c . Без даммика у меня ы
Загруженные файлы
0
29
1 год назад
0
Без даммика у меня ы
А это святым духом кастуется?
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.