rsfghd, я первый раз что-то делал на южапи, закинул по привычке необходимости, потом увидел возможность создания фреймов без ток файла, просто забыл убрать этот огрызок, но ты прав, мне нужно вскры
EugeAl, этот замочек из Обливиона вроде, и если не ошибаюсь там тоже можно мышкой ковыряться. Первобытная моя задумка тоже включала манипуляции с мышкой, но я так не удобно реализовал это на месхаке, что решил на стрелочках сделать
Полезное, но энивей новичкам будет трудно даже с таким инструментарием осваивать фреймы. Думаю найдётся более годное применение подобному, но это уже фантазия юзеров
Тебе же нужно ещё сохранять исходное время для возвращения. Сложность в том, что при лунном затмении интерфейс времени изменяется соответствующе, такое из коробки только на южапи и рефе доступно
Meddin, всё что нужно изменить при импорте в коде помечено комментариями, достаточно скопировать папку Initialization и вставить в свою карту
если что-то не понятно или нужно переделать - пиши
function GetDirection takes real alpha, real gamma returns integer
if ( alpha < bj_PI and not( gamma > alpha and gamma < alpha + bj_PI ) ) or ( alpha > bj_PI and gamma > alpha - bj_PI and gamma < alpha ) then
return 2
else
return 1
endif
endfunction
function ParabolaZ2 takes real y0, real y1, real h, real d, real x returns real
return ( 2.00 * ( y0 + y1 - 2.00 * h ) * ( x / d - 1.00 ) + ( y1 - y0 ) ) * ( x / d ) + y0
endfunction
function GetLocZ takes real x, real y returns real
call MoveLocation( udg_LFZ, x, y )
return GetLocationZ( udg_LFZ )
endfunction
function IsUnitDead takes unit u returns boolean
return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) == 0
endfunction
function MoveCollision takes nothing returns nothing
local timer t = GetExpiredTimer( )
local timer t1
local integer i = GetHandleId( t )
local integer i1
local unit target = LoadUnitHandle( udg_H, i, 0 )
local unit caster = LoadUnitHandle( udg_H, i, 1 )
local unit u
local real a = LoadReal( udg_H, i, 2 )
local real d = LoadReal( udg_H, i, 3 )
local real s = LoadReal( udg_H, i, 5 )
local real x
local real y
local real x1
local real y1
local group g = LoadGroupHandle( udg_H, i, 6 )
local group g1
local player p = GetOwningPlayer( caster )
if s > d then
set s = d
endif
set d = d - s
set x = GetUnitX( target ) + s * Cos( a )
set y = GetUnitY( target ) + s * Sin( a )
call SetItemPosition( udg_TempItem, x, y )
call SetItemVisible( udg_TempItem, false )
set x1 = GetItemX( udg_TempItem )
set y1 = GetItemY( udg_TempItem )
if ( x + 1.00 < x1 or x - 1.00 > x1 ) or ( y + 1.00 < y1 or y - 1.00 > y1 ) then
set x = x - s * Cos( a )
set y = y - s * Sin( a )
set d = 0.00
call UnitDamageTarget( caster, target, 25.00, false, false, null, null, null )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", target, "chest" ) )
endif
call SetUnitX( target, x )
call SetUnitY( target, y )
call GroupEnumUnitsInRange( udg_TempGroup, x, y, 416.00, null )
loop
set u = FirstOfGroup( udg_TempGroup )
exitwhen u == null
call GroupRemoveUnit( udg_TempGroup, u )
if not IsUnitDead( u ) and IsUnitEnemy( u, p ) and not IsUnitInGroup( u, g ) and IsUnitInRange( u, target, 16.00 ) then
call GroupAddUnit( g, u )
set t1 = CreateTimer( )
set i1 = GetHandleId( t1 )
set x1 = GetUnitX( u )
set y1 = GetUnitY( u )
call SaveUnitHandle( udg_H, i1, 0, u )
call SaveUnitHandle( udg_H, i1, 1, caster )
call SaveReal( udg_H, i1, 2, Atan2( y1 - y, x1 - x ) )
call SaveReal( udg_H, i1, 3, LoadReal( udg_H, i, 4 ) * 0.50 )
call SaveReal( udg_H, i1, 4, LoadReal( udg_H, i, 4 ) * 0.50 )
call SaveReal( udg_H, i1, 5, LoadReal( udg_H, i, 5 ) * 0.50 )
set g1 = CreateGroup( )
set bj_groupAddGroupDest = g1
call ForGroup( g, function GroupAddGroupEnum )
call SaveGroupHandle( udg_H, i1, 6, g1 )
call TimerStart( t1, 0.01, true, function MoveCollision )
set g1 = null
set t1 = null
endif
endloop
if d <= 0.00 then
call DestroyGroup( g )
call PauseTimer( t )
call DestroyTimer( t )
call FlushChildHashtable( udg_H, i )
else
call SaveReal( udg_H, i, 3, d )
endif
set t = null
set g = null
set target = null
set caster = null
endfunction
function Move takes nothing returns nothing
local timer t = GetExpiredTimer( )
local timer t1
local integer i = GetHandleId( t )
local integer i1
local unit caster = LoadUnitHandle( udg_H, i, 0 )
local unit u
local real a = LoadReal( udg_H, i, 1 )
local real d = LoadReal( udg_H, i, 2 )
local real s = LoadReal( udg_H, i, 4 )
local real x
local real y
local real x1
local real y1
local player p = GetOwningPlayer( caster )
local group g = LoadGroupHandle( udg_H, i, 8 )
local group g1
if s > d then
set s = d
endif
set d = d - s
set x = GetUnitX( caster ) + s * Cos( a )
set y = GetUnitY( caster ) + s * Sin( a )
call SetItemPosition( udg_TempItem, x, y )
call SetItemVisible( udg_TempItem, false )
set x1 = GetItemX( udg_TempItem )
set y1 = GetItemY( udg_TempItem )
// check pathing
if ( x + 1.00 < x1 or x - 1.00 > x1 ) or ( y + 1.00 < y1 or y - 1.00 > y1 ) then
set x = x - s * Cos( a )
set y = y - s * Sin( a )
endif
call SetUnitX( caster, x )
call SetUnitY( caster, y )
call SetUnitFlyHeight( caster, ParabolaZ2( LoadReal( udg_H, i, 6 ), LoadReal( udg_H, i, 5 ), LoadReal( udg_H, i, 7 ), LoadReal( udg_H, i, 3 ), d ) - GetLocZ( x, y ), 0.00 )
call GroupEnumUnitsInRange( udg_TempGroup, x, y, 464.00, null ) // radius with collision ( caster + target max collisions (200.00 + 200.00) )
loop
set u = FirstOfGroup( udg_TempGroup )
exitwhen u == null
call GroupRemoveUnit( udg_TempGroup, u )
if not IsUnitDead( u ) and IsUnitEnemy( u, p ) and not IsUnitInGroup( u, g ) and IsUnitInRange( u, caster, 64.00 ) then // 64.00 - radius with unit collision
call GroupAddUnit( g, u )
call UnitDamageTarget( caster, u, LoadReal( udg_H, i, 9 ), false, false, null, null, null ) // damage
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", u, "chest" ) )
set t1 = CreateTimer( )
set i1 = GetHandleId( t1 )
set x1 = GetUnitX( u )
set y1 = GetUnitY( u )
call SaveUnitHandle( udg_H, i1, 0, u )
call SaveUnitHandle( udg_H, i1, 1, caster )
if GetDirection( a, Atan2( y1 - y, x1 - x ) ) == 1 then // left or right move
call SaveReal( udg_H, i1, 2, a + bj_PI * 0.50 )
else
call SaveReal( udg_H, i1, 2, a - bj_PI * 0.50 )
endif
call SaveReal( udg_H, i1, 3, 416.00 ) // distance for discarding
call SaveReal( udg_H, i1, 4, 416.00 )
call SaveReal( udg_H, i1, 5, 7.00 ) // speed of discarding
call SaveReal( udg_H, i1, 7, LoadReal( udg_H, i, 10 ) ) // wall damage
// save group of all units thats already got damage from spell
set g1 = CreateGroup( )
set bj_groupAddGroupDest = g1
call ForGroup( g, function GroupAddGroupEnum )
call SaveGroupHandle( udg_H, i1, 6, g1 )
call TimerStart( t1, 0.01, true, function MoveCollision )
set g1 = null
set t1 = null
endif
endloop
if d <= 0.00 then
call PauseUnit( caster, false )
call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", x + 64.00 * Cos( a ), y + 64.00 * Sin( a ) ) )
call DestroyGroup( g )
call PauseTimer( t )
call DestroyTimer( t )
call FlushChildHashtable( udg_H, i )
else
call SaveReal( udg_H, i, 2, d )
endif
set t = null
set g = null
set caster = null
endfunction
function SetAnim takes nothing returns nothing
local timer t = GetExpiredTimer( )
local unit caster = LoadUnitHandle( udg_H, GetHandleId( t ), 0 )
call PauseUnit( caster, true )
call SetUnitAnimation( caster, "attack slam" )
call QueueUnitAnimation( caster, "stand" )
call TimerStart( t, 0.01, true, function Move )
set t = null
set caster = null
endfunction
function Trig_Spell_Actions takes nothing returns nothing
local timer t = CreateTimer( )
local integer i = GetHandleId( t )
local integer lvl
local unit caster = GetTriggerUnit( )
local real x = GetUnitX( caster )
local real y = GetUnitY( caster )
local real x1 = GetSpellTargetX( )
local real y1 = GetSpellTargetY( )
local real d
if UnitAddAbility( caster, 'Arav' ) then
call UnitRemoveAbility( caster, 'Arav' )
endif
call SaveReal( udg_H, i, 5, GetLocZ( x, y ) ) // start height
call SaveReal( udg_H, i, 6, GetLocZ( x1, y1 ) ) // end height
set x = x1 - x
set y = y1 - y
set d = SquareRoot( x * x + y * y )
call SaveUnitHandle( udg_H, i, 0, caster )
call SaveReal( udg_H, i, 1, Atan2( y, x ) ) // angle
call SaveReal( udg_H, i, 2, d ) // distance
call SaveReal( udg_H, i, 3, d ) // distance max
call SaveReal( udg_H, i, 4, d * 0.018 ) // speed
call SaveReal( udg_H, i, 7, 75.00 + ( 750.00 - d ) * 0.15 ) // parabola height
call SaveGroupHandle( udg_H, i, 8, CreateGroup( ) )
set lvl = GetUnitAbilityLevel( caster, GetSpellAbilityId( ) )
if lvl == 1 then // ability level
call SaveReal( udg_H, i, 9, 175.00 ) // start damage
call SaveReal( udg_H, i, 10, 50.00 ) // wall damage
elseif lvl == 2 then
call SaveReal( udg_H, i, 9, 275.00 )
call SaveReal( udg_H, i, 10, 70.00 )
else
call SaveReal( udg_H, i, 9, 375.00 )
call SaveReal( udg_H, i, 10, 100.00 )
endif
call TimerStart( t, 0.00, false, function SetAnim )
set t = null
set caster = null
endfunction
//===========================================================================
function Trig_Spell_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A000'
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 Trig_Spell_Conditions ) )
call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
endfunction
выбери всех юнитов вокруг нужного тебе юнита избегая утечек, вот и всё
утечки вызовут точки и выбор юнитов в группу, чтобы избежать этого - нужно пользоваться кастомскриптом:
» WarCraft 3 / [UjAPI] Chest Puzzle
вскрыРед. rsfghd
» WarCraft 3 / [UjAPI] Chest Puzzle
» WarCraft 3 / [UjAPI] Chest Puzzle
» WarCraft 3 / [UjAPI] Chest Puzzle
» WarCraft 3 / бесконечная молния
» Блог им. rsfghd / какая-то фигня
» WarCraft 3 / Что делать если Fatal Error при запуске карты? Warcraft 3.
» WarCraft 3 / [UjAPI] Frame builder
» WarCraft 3 / Нужно ли брать сапог скорости герою у которого скоросыть передвежения и так очень высокая
» Администрация XGM / Не соответствует предпросмотр
» WarCraft 3 / Путь фильтров снижения яркости в MPQ
» WarCraft 3 / бесконечная молния
» Unryze Jass API / [UjAPI] Конкурс Наработок 2024
» WarCraft 3 / Можно ли отменить действие предмета "лунное затмение"?
Ред. rsfghd
» WarCraft 3 / Способности и алгоритмы на заказ
» WarCraft 3 / Способности и алгоритмы на заказ
если что-то не понятно или нужно переделать - пиши
» WarCraft 3 / Городские жители
» WarCraft 3 / Отслеживание юнитов
» WarCraft 3 / Городские жители
» WarCraft 3 / Ошмбка
» WarCraft 3 / Отслеживание юнитов
утечки вызовут точки и выбор юнитов в группу, чтобы избежать этого - нужно пользоваться кастомскриптом:
» WarCraft 3 / Как управлять своей молнией каждому юниту отдельно, а не всем одной
» WarCraft 3 / Выдать нестандартный автокаст
» WarCraft 3 / S.T.A.L.K.E.R. Marked (One)
» WarCraft 3 / Включить/отключить регенерацию