quq_CCCP, работа с группами не утекает же в данном случае, юзаются темповые глобалки которые уничтожаются
Сам утечек не обнаружил, автор просто хочет найти изъяны в системе или у него карта вылетает после продолжительной игры? Можешь закинуть счётчик хэндлов для этого триггера, он в состоянии определить утечки на гуи
Заказчик: Roy Mustang Способность: Cyclop Roar Выполнено: Да
В общем если постоянно отдавать приказ то юнит как-то дёрганно перемещается, тем не менее я оставил возможность контролировать этот процесс на гуи, если на рефе есть функции, ты можешь отключить контроль над юнитом, затем вернуть его, инструкция по импорту та же
код
library CyclopsRoar
globals
constant hashtable H = InitHashtable( )
private constant real TimerPeriodic = 0.10 // периодичность сбития приказа
private constant real DistancePoint = 50.00 // точка (дистанция), куда отбегать в зависимости от угла между кастером и таргетом
endglobals
private struct RoarS
unit caster
unit target
real time
endstruct
native UnitAlive takes unit id returns boolean
private function Move takes nothing returns nothing
local timer t = GetExpiredTimer( )
local RoarS A = LoadInteger( H, GetHandleId( t ), 0 )
local real x = GetUnitX( A.target )
local real y = GetUnitY( A.target )
local real a = Atan2( y - GetUnitY( A.caster ), x - GetUnitX( A.caster ) )
call IssuePointOrder( A.target, "smart", x + DistancePoint * Cos( a ), y + DistancePoint * Sin( a ) )
set A.time = A.time - TimerPeriodic
if A.time <= 0.00 or not UnitAlive( A.caster ) or not UnitAlive( A.target ) then
call FlushChildHashtable( H, GetHandleId( t ) )
call DestroyTimer( t )
set udg_TempUnit = A.target
call TriggerExecute( gg_trg_SpellEnd )
set A.caster = null
set A.target = null
call A.destroy( )
else
call TimerStart( t, TimerPeriodic, false, function Move )
endif
set t = null
endfunction
function Spell_Actions takes unit caster, unit target, real time returns nothing
local timer t = CreateTimer( )
local RoarS A = RoarS.create( )
set A.caster = caster
set A.target = target
set A.time = time
call SaveInteger( H, GetHandleId( t ), 0, A )
call TimerStart( t, 0.00, false, function Move )
set t = null
endfunction
//===========================================================================
function InitTrig_Spell takes nothing returns nothing
//set gg_trg_Spell = CreateTrigger( )
endfunction
endlibrary
Заказчик: Roy Mustang Способность: Cyclop Slam Выполнено: Да
инструкция по импорту
Копируешь папку с триггерами в свою карту, мб возможны состыковки с переменными и тебе понадобится доп. помощь по импорту, это уже в лс пиши
в SpellInit выставляешь булекспр, который послужит условием кого дамажить и отталкивать (добавлю для отталкивания отдельное условие, если необходимо)
триггер Spell это сама абилка, там в самом вверху кода есть базовые настройки (макс/мин дистанция, скорость отталкивания, периодичность таймера отталкивания, условие, сбивать ли приказы при отталкивании, условие, прекращать ли отталкивание если юнит столкнулся с ландом (если выставить false, у юнита просто будут сбиваться приказы пока не закончится "полёт", движение сквозь ланд происходить не будет) )
в триггере SpellEnd можешь юзать собственные действия при приземлении кастера, я оставил пример использования, так же тебе даётся группа пораженных юнитов, если она нужна конечно
в триггере DiscardingEnd можешь юзать собственные действия при окончании оттакливания, я добавил пример с замедлением (поленился делать ауры, но если необходимо - сделаю)
там тоже есть тот, кто откинул юнита, и сам юнит
Если у тебя есть хэш-таблица с названием H, то закомменти её в триггере Spell (3-я строка)
Если это не хэш-таблица имеет название H, то измени название хэш-таблицы через кнопку Find/Replace - Replace (Ctrl+H), в верхней строчке (Search for) пишешь H, а в нижней (Replace with) на что изменить название, должны стоять галочки Case Sensitivity, Whole worlds only, Search from caret, сам курсор (мигающая палочка) должен находится в самом вверху кода
код
library CyclopsSlam
globals
constant hashtable H = InitHashtable( )
private constant group TempG = CreateGroup( )
private constant real MaxDistance = 600.00 // макс дистанция отбрасывания
private constant real MinDistance = 0.00 // мин дистанция отбрасывания ( без понятия зачем, мб пригодится )
private constant real DiscardingS = 15.00 // скорость полёта отброшенных
private constant real TimerPeriodic = 0.01 // периодичность полёта таймера для отброшенных противников ( чем выше - тем оптимизированнее и хуже плавность )
private constant boolean OrderPause = true // сбивать приказы при отбрасывании? true - да, false - нет
private constant boolean DiscrPause = true // прекращать отталкивание если юнит столкнулся с ландом?
private attacktype AttackType = null
private damagetype DamageType = null
private real TempX
private real TempY
private real TempReal
private unit TempUnit
private item TempItem
endglobals
private function ParabolaZ takes real h, real d, real x returns real
return (4 * h / d) * (d - x) * (x / d)
endfunction
private struct mys
unit caster
real damage
real radius
real time
real timeM
real height
attacktype AttackType
damagetype DamageType
endstruct
private struct MoveS
unit target
unit caster
real speedx
real speedy
real distance
real angle
endstruct
private function Discarding takes nothing returns nothing
local MoveS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
local real x = GetUnitX( A.target ) + DiscardingS * A.speedx
local real y = GetUnitY( A.target ) + DiscardingS * A.speedy
local boolean b = false
call SetItemPosition( TempItem, x, y )
call SetItemVisible( TempItem, false )
if SquareRoot( ( GetItemX( TempItem ) - x ) * ( GetItemX( TempItem ) - x ) + ( GetItemY( TempItem ) - y ) * ( GetItemY( TempItem ) - y ) ) <= 10 then
call SetUnitX( A.target, x )
call SetUnitY( A.target, y )
elseif DiscrPause then
set b = true
endif
if OrderPause then
call IssueImmediateOrder( A.target, "stop" )
endif
set A.distance = A.distance - DiscardingS
if A.distance <= 0.00 or GetUnitTypeId( A.target ) == 0 or b then
call SetUnitPathing( A.target, true )
call FlushChildHashtable( H, GetHandleId( GetExpiredTimer( ) ) )
call PauseTimer( GetExpiredTimer( ) )
call DestroyTimer( GetExpiredTimer( ) )
set udg_TempUnit = A.target
set udg_LastCaster = A.caster
call TriggerExecute( gg_trg_DiscardingEnd )
set A.target = null
set A.caster = null
call A.destroy( )
endif
endfunction
private function Damage takes nothing returns nothing
local timer t = CreateTimer( )
local MoveS A = MoveS.create( )
local real x
local real y
set A.caster = udg_LastCaster
set A.target = GetEnumUnit( )
set x = GetUnitX( A.target )
set y = GetUnitY( A.target )
set A.speedx = x - TempX
set A.speedy = y - TempY
set A.distance = SquareRoot( A.speedx * A.speedx + A.speedy * A.speedy )
set A.speedx = A.speedx / A.distance
set A.speedy = A.speedy / A.distance
set A.distance = SquareRoot( ( TempX - x ) * ( TempX - x ) + ( TempY - y ) * ( TempY - y ) )
set A.distance = MaxDistance * ( 1 - ( A.distance / MaxDistance ) )
if A.distance < MinDistance then
set A.distance = MinDistance
elseif A.distance > MaxDistance then
set A.distance = MaxDistance
endif
call SetUnitPathing( A.target, false )
call SaveInteger( H, GetHandleId( t ), 0, A )
call TimerStart( t, TimerPeriodic, true, function Discarding )
call GroupAddUnit( udg_TempGroup, A.target )
call UnitDamageTarget( udg_LastCaster, A.target, TempReal, false, false, AttackType, DamageType, null )
set t = null
endfunction
private function Move takes nothing returns nothing
local mys A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
set A.time = A.time - 0.01
call SetUnitFlyHeight( A.caster, ParabolaZ( A.height, A.timeM, A.time ), 0.00 )
if A.time <= 0. then
call SetUnitFlyHeight( A.caster, 0.00, 0.00 )
set udg_LastCaster = A.caster
set TempReal = A.damage
set AttackType = A.AttackType
set DamageType = A.DamageType
set TempX = GetUnitX( A.caster )
set TempY = GetUnitY( A.caster )
call GroupEnumUnitsInRange( TempG, TempX, TempY, A.radius, udg_DamageCond )
call ForGroup( TempG, function Damage )
call GroupClear( TempG )
call FlushChildHashtable( H, GetHandleId( GetExpiredTimer( ) ) )
call DestroyTimer( GetExpiredTimer( ) )
set A.caster = null
call A.destroy( )
call TriggerExecute( gg_trg_SpellEnd )
endif
endfunction
function Spell_Actions takes unit caster, real damage, real time, real height, real radius, attacktype at, damagetype dt returns nothing
local timer t = CreateTimer( )
local mys A = mys.create( )
set A.caster = caster
set A.damage = damage
set A.time = time
set A.timeM = time
set A.height = height
set A.radius = radius
set A.AttackType = at
set A.DamageType = dt
call UnitAddAbility( A.caster, 'Arav' )
call UnitRemoveAbility( A.caster, 'Arav' )
call SaveInteger( H, GetHandleId( t ), 0, A )
call TimerStart( t, 0.01, true, function Move )
set t = null
endfunction
//===========================================================================
function InitTrig_Spell takes nothing returns nothing
//set gg_trg_Spell = CreateTrigger( )
set TempItem = CreateItem( 'spsh', 0, 0 )
call SetItemVisible( TempItem, false )
endfunction
endlibrary
в самом низу кода юзается предмет, для проходимости точки, с равкодом 'spsh', если в триггерах юзаешь этот предмет где-то, то лучше замени на не используемый
VuRdaLaK1337, сейчас я бы переделал немного вурдов, с новыми знаниями)
да и вообще абсолютно каждый спелл бы свой переделал, но такой завал по жизни что попросту нет времени
спасибо, что интересуешься моими ресурсами, приятно на душе
потестил, к сожалению способ не vJass, а vJass + cJass, сам спелл нормальный, обычная волна силы только с более менее гибкими настройками, искл. поиск целей для урона, тут нужно знать джасс, за карту стрела не вылетает (при любой скорости полёта), утечек вроде нет, это всё хорошо, молодец, задержку перед вылетом никак не настроить, нужно рыться по коду, чтобы удалить дебаг тоже нужно искать его по коду, тип атаки, урона и оружия тоже нужно рыться по коду, держитесь гуишники
Гуванч, кому понятно? Тот кто знает джасс и без этого разберёт, поймёт и даже сам сделает этот спелл. Гуишники в любом случае ничего не разберут кроме настроек)
Я так понимаю оно взрывается при первой пораженной цели и наносит урон всем вокруг?
Не имею возможности пока посмотреть
А нет, похоже обычная волна силы, если ориентироваться на код
По коду есть что поправить, но в целом всё норм, хотя ты однозначно можешь намного лучше. Основное что бросилось в глаза - настройки настройками, но фильтр юнитов для нанесения урона гуишники совсем не разберут
Порадовало, что юзаешь темповые глобалки групп, осталось только урон в фильтре наносить и саму TempGroup не заполнять
EviLInside, в структуре находится таймер и группа, таймер запускаешь на функцию удаления, а всем юнитам в группе в этой структуре сохраняешь саму структуру, чтобы доставать и наносить разовый урон если кто-то из них его получит от постороннего источника, в таймер тоже сохраняешь, по окончании действия таймера выбираешь всех юнитов в группе и очищаешь им сохранённую структуру, т.к. сама структура лишь 1 раз создалась на этот спелл, то и уничтожить её вместе с группой и таймером достаточно 1 раз, в истекающем таймере
короче один раз создал и посохранял её везде, потом уничтожил в истекающем таймере и очистил везде где сохранял
Сам спелл несложный, и в принципе всё что достаточно для реализации это 2 группы, те, кто будет получать урон, когда кто-то из этой же группы продамажен (уже есть судя по словам автора), и темповая, куда закидывать тех, кто только что получили урон, чтобы избежать цикла бесконечного урона
саму структуру нужно в юнита сохранять само собой, и при получении урона доставать её
Гуванч, лол, мне.до топовых кодеров как до плутона, а то что я сделал - откровенно говоря говнище, после этих слов сложилось ощущение будто ты даже не играл в это)
Мы вывезли только за счёт ланда и сюжета от драгонлора
mistwood, знаю конечно, это несложно, вообще я планировал после скиллов мустанга взяться за стенку
Единственное мне не особо ясен метод получения урона, я бы тупо периодично наносил находящимся в стенке, но тебе видимо нужен именно разовый, после которого можно стоять в стенке и не получать урон, пока не выйдешь из её радиуса и не зайдёшь снова
бтв стенки уже делал, разные по методу каста и нанесения урона, так что не впервой
Ред. rsfghd
» WarCraft 3 / Что может вызвать утечки в этой системе инкома?
» WarCraft 3 / Спавн юнита с помощью фрейма
» WarCraft 3 / Способности и алгоритмы на заказ
Заклинание готово!
Способность: Cyclop Roar
Выполнено: Да
» WarCraft 3 / Способности и алгоритмы на заказ
Заказ принят
Способность: Cyclop Roar
Спелл будет завершен к: без понятия
» Блог им. rsfghd / Последний полёт феникса
» WarCraft 3 / Способности и алгоритмы на заказ
Заклинание готово!
Способность: Cyclop Slam
Выполнено: Да
триггер Spell это сама абилка, там в самом вверху кода есть базовые настройки (макс/мин дистанция, скорость отталкивания, периодичность таймера отталкивания, условие, сбивать ли приказы при отталкивании, условие, прекращать ли отталкивание если юнит столкнулся с ландом (если выставить false, у юнита просто будут сбиваться приказы пока не закончится "полёт", движение сквозь ланд происходить не будет) )
в триггере SpellEnd можешь юзать собственные действия при приземлении кастера, я оставил пример использования, так же тебе даётся группа пораженных юнитов, если она нужна конечно
в триггере DiscardingEnd можешь юзать собственные действия при окончании оттакливания, я добавил пример с замедлением (поленился делать ауры, но если необходимо - сделаю)
там тоже есть тот, кто откинул юнита, и сам юнит
Если у тебя есть хэш-таблица с названием H, то закомменти её в триггере Spell (3-я строка)
Если это не хэш-таблица имеет название H, то измени название хэш-таблицы через кнопку Find/Replace - Replace (Ctrl+H), в верхней строчке (Search for) пишешь H, а в нижней (Replace with) на что изменить название, должны стоять галочки Case Sensitivity, Whole worlds only, Search from caret, сам курсор (мигающая палочка) должен находится в самом вверху кода
» Блог им. rsfghd / Прыгающий вурдалак или же снорк
да и вообще абсолютно каждый спелл бы свой переделал, но такой завал по жизни что попросту нет времени
спасибо, что интересуешься моими ресурсами, приятно на душе
Ред. rsfghd
» XGM Конкурсы / Итоги конкурса становления героев 2021
Ред. rsfghd
» WarCraft 3 / Система снаряда с настройками
» WarCraft 3 / Система снаряда с настройками
Ред. rsfghd
» WarCraft 3 / Система снаряда с настройками
Не имею возможности пока посмотреть
Ред. rsfghd
» WarCraft 3 / Как импортировать
» WarCraft 3 / Как импортировать
» XGM Конкурсы / Итоги конкурса становления героев 2021
ник от балды писал, лень придумывать
Ред. rsfghd
» WarCraft 3 / Вопрос по коду
Ред. rsfghd
» WarCraft 3 / Вопрос по коду
» WarCraft 3 / Способности и алгоритмы на заказ
» XGM Конкурсы / Итоги конкурса становления героев 2021
Я писал так, что по сути только я разберу
» WarCraft 3 / Memory hack API v1.4
» XGM Конкурсы / Итоги конкурса становления героев 2021
Мы вывезли только за счёт ланда и сюжета от драгонлора
» WarCraft 3 / Способности и алгоритмы на заказ
» XGM Конкурсы / Итоги конкурса становления героев 2021
» WarCraft 3 / Как запустить один раз стандартный музыкальный трек?
» XGM Конкурсы / Итоги конкурса становления героев 2021
» XGM Конкурсы / Итоги конкурса становления героев 2021