28

» WarCraft 3 / Что может вызвать утечки в этой системе инкома?

quq_CCCP, работа с группами не утекает же в данном случае, юзаются темповые глобалки которые уничтожаются

Сам утечек не обнаружил, автор просто хочет найти изъяны в системе или у него карта вылетает после продолжительной игры? Можешь закинуть счётчик хэндлов для этого триггера, он в состоянии определить утечки на гуи
28

» WarCraft 3 / Способности и алгоритмы на заказ

Заклинание готово!

Заказчик: 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


Загруженные файлы
28

» WarCraft 3 / Способности и алгоритмы на заказ

Заказ принят

Заказчик: Roy Mustang
Способность: Cyclop Roar
Спелл будет завершен к: без понятия
28

» Блог им. rsfghd / Последний полёт феникса

этот спелл задумывался для карты Crusader, мы хотели таким образом выкашивать дальников, но его негде было пихнуть
28

» WarCraft 3 / Способности и алгоритмы на заказ

Заклинание готово!

Заказчик: 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', если в триггерах юзаешь этот предмет где-то, то лучше замени на не используемый

сорян что долго делал спелл, завал отовсюду
Загруженные файлы
28

» Блог им. rsfghd / Прыгающий вурдалак или же снорк

VuRdaLaK1337, сейчас я бы переделал немного вурдов, с новыми знаниями)
да и вообще абсолютно каждый спелл бы свой переделал, но такой завал по жизни что попросту нет времени
спасибо, что интересуешься моими ресурсами, приятно на душе
28

» XGM Конкурсы / Итоги конкурса становления героев 2021

SNART, я зарегистрировался тупо ради одного вопроса, я не думал, что буду заходить сюда вновь и вновь, что начну сидеть по кд на сайте

впрочем, я хоть и могу сменить ник, но те, что мне нравятся, палят меня в местах, где я не хочу чтобы меня знали, так что не трогаю текущий
28

» WarCraft 3 / Система снаряда с настройками

потестил, к сожалению способ не vJass, а vJass + cJass, сам спелл нормальный, обычная волна силы только с более менее гибкими настройками, искл. поиск целей для урона, тут нужно знать джасс, за карту стрела не вылетает (при любой скорости полёта), утечек вроде нет, это всё хорошо, молодец, задержку перед вылетом никак не настроить, нужно рыться по коду, чтобы удалить дебаг тоже нужно искать его по коду, тип атаки, урона и оружия тоже нужно рыться по коду, держитесь гуишники
Загруженные файлы
28

» WarCraft 3 / Система снаряда с настройками

Гуванч, кому понятно? Тот кто знает джасс и без этого разберёт, поймёт и даже сам сделает этот спелл. Гуишники в любом случае ничего не разберут кроме настроек)
28

» WarCraft 3 / Система снаряда с настройками

Я так понимаю оно взрывается при первой пораженной цели и наносит урон всем вокруг?
Не имею возможности пока посмотреть

А нет, похоже обычная волна силы, если ориентироваться на код

По коду есть что поправить, но в целом всё норм, хотя ты однозначно можешь намного лучше. Основное что бросилось в глаза - настройки настройками, но фильтр юнитов для нанесения урона гуишники совсем не разберут

Порадовало, что юзаешь темповые глобалки групп, осталось только урон в фильтре наносить и саму TempGroup не заполнять

В принципе чего я распинаюсь, я ж не учитель
28

» WarCraft 3 / Как импортировать

Mentilar, у тебя же есть сама наработка, если не видно где в коде или ро оно юзается, то посмотри в игровом интерфейсе
28

» XGM Конкурсы / Итоги конкурса становления героев 2021

SNART, для такой карты лишь 2 аргумента, красивый ланд и говно-убогие-мерзкие механики
ник от балды писал, лень придумывать
28

» WarCraft 3 / Вопрос по коду

EviLInside, в структуре находится таймер и группа, таймер запускаешь на функцию удаления, а всем юнитам в группе в этой структуре сохраняешь саму структуру, чтобы доставать и наносить разовый урон если кто-то из них его получит от постороннего источника, в таймер тоже сохраняешь, по окончании действия таймера выбираешь всех юнитов в группе и очищаешь им сохранённую структуру, т.к. сама структура лишь 1 раз создалась на этот спелл, то и уничтожить её вместе с группой и таймером достаточно 1 раз, в истекающем таймере

короче один раз создал и посохранял её везде, потом уничтожил в истекающем таймере и очистил везде где сохранял
28

» WarCraft 3 / Вопрос по коду

А эмпатия не подошла бы?

Сам спелл несложный, и в принципе всё что достаточно для реализации это 2 группы, те, кто будет получать урон, когда кто-то из этой же группы продамажен (уже есть судя по словам автора), и темповая, куда закидывать тех, кто только что получили урон, чтобы избежать цикла бесконечного урона

саму структуру нужно в юнита сохранять само собой, и при получении урона доставать её
28

» XGM Конкурсы / Итоги конкурса становления героев 2021

Гуванч, система чего? Какой код ты видел и что там вообще смог разобрать?)
Я писал так, что по сути только я разберу
28

» XGM Конкурсы / Итоги конкурса становления героев 2021

Гуванч, лол, мне.до топовых кодеров как до плутона, а то что я сделал - откровенно говоря говнище, после этих слов сложилось ощущение будто ты даже не играл в это)
Мы вывезли только за счёт ланда и сюжета от драгонлора
28

» WarCraft 3 / Способности и алгоритмы на заказ

mistwood, знаю конечно, это несложно, вообще я планировал после скиллов мустанга взяться за стенку

Единственное мне не особо ясен метод получения урона, я бы тупо периодично наносил находящимся в стенке, но тебе видимо нужен именно разовый, после которого можно стоять в стенке и не получать урон, пока не выйдешь из её радиуса и не зайдёшь снова

бтв стенки уже делал, разные по методу каста и нанесения урона, так что не впервой
28

» WarCraft 3 / Как запустить один раз стандартный музыкальный трек?

Я любимый, потом сам проверю с рандомной музыкой, пока могу предположить, что ты не ставил двойные слеши
28

» XGM Конкурсы / Итоги конкурса становления героев 2021

Гуванч, потому что много кто хотел топ 1, мы с драгонлором и вовсе рассчитывали хотя бы на 4 или 5 место, а оно вот как