Добавлен , опубликован
Дисклеймер!
Я полный нуб/лох/помойка в джассе (называйте как хотите), ничего толком не знаю и короче юзай систему на свой страх и риск. По возможности буду стараться оптимизировать это говно
Предложения по улучшению пишите в комменты

типичная триггерная система стана, позволяет использовать один стан на всю карту
настолько каловая система стана, что игроки будут оглушены в реальной жизни и не смогут в это говно вообще играть, психанут и разобьют монитор, поэтому лучше вообще ничего не юзать и пойти пить чай
код
library StunSystemLib
globals
    private constant hashtable H = InitHashtable( )
    private constant timer TempTimer = CreateTimer( )
    private constant group TempGroup = CreateGroup( )
    private constant key StunKey
    private unit TempUnit
endglobals

native UnitAlive takes unit id returns boolean

function GetUnitStunTime takes unit u returns real
    return LoadReal( H, GetHandleId( u ), StunKey )
endfunction

function SetUnitStunTime takes unit u, real time returns nothing
	call SaveReal( H, GetHandleId( u ), StunKey, time )
endfunction

private function CheckStunTime_1 takes nothing returns nothing
    local unit u = GetEnumUnit( )
    local real r = LoadReal( H, GetHandleId( u ), StunKey ) - 0.01
    
    if r <= 0.00 or not UnitAlive( u ) then
        call UnitRemoveAbility( u, 'BPSE' ) // дебафф стану
        call RemoveSavedReal( H, GetHandleId( u ), StunKey )
        call GroupRemoveUnit( TempGroup, u )
    else
        call SaveReal( H, GetHandleId( u ), StunKey, r )
    endif
    
    set u = null
endfunction

private function CheckStunTime takes nothing returns nothing
    call ForGroup( TempGroup, function CheckStunTime_1 )
    
    if FirstOfGroup( TempGroup ) == null then
        call PauseTimer( TempTimer )
    endif
endfunction

function StunUnit takes unit u, real time returns nothing
    call IssueTargetOrder( TempUnit, "thunderbolt", u ) // приказ
    
    if FirstOfGroup( TempGroup ) == null then
        call TimerStart( TempTimer, 0.01, true, function CheckStunTime )
    endif
    
    if time > LoadReal( H, GetHandleId( u ), StunKey ) then
        call SaveReal( H, GetHandleId( u ), StunKey, time )
        call GroupAddUnit( TempGroup, u )
    endif
endfunction

//===========================================================================
function InitTrig_StunSystem takes nothing returns nothing
    //set gg_trg_StunSystem = CreateTrigger(  )
    set TempUnit = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u000', 0.00, 0.00, 0.00 ) // дамі
endfunction
endlibrary



прикладываю так же карту с демонстрацией помойного кастомного стана на таких же помойных говноабилках

если лень смотреть, то распишу на словах
с кастомным станом можно сделать продолжительность оглушения например от какой-нибудь арвтгграптсч
кхм, характеристики героя, за 100 ед силы +0.10 секунд к стану, от какого-то времени можно взять зависимость, можно сделать, что если происходит серия станов, ослаблять последующие на 20%, через время снимать бафф к устойчивости станов, чтобы не стоять в контроле всю жизнь, в общем много идей, но лучшая, это чтобы я застрелился
самому молотку бурь нужно поставить длительность максимального возможного стана в карте выставить нулевое значение продолжительности стана
чтобы использовать, достаточно прописать в кастомскрипте StunUnit( какой юнит, время ), помимо этого есть функция GetUnitStunTime( какой юнит ), возвращающая значение оставшегося стана

upd
добавил в код функцию изменения продолжительности текущего стана SetUnitStunTime, первый аргумент юнит, второй - время (не проверял работоспособность)
updd
исправил пару багов с примерами

upd 13.09.2022 оптимизировал стан даммиком, теперь понял как использовать одного даммика для одновременного стана нескольких целей, игрока указывать больше не нужно, даммик принадлежит нейтралу который и так видит всю карту

upd 05.10.2022
забыл добавить последнюю функцию в код выше, поправил

upd 14.10.2022
максимальное время возможного стана не нужно указывать молотку, достаточно вписать нулевое значение, поправлен пример

upd 15.10.2022
добавил дисклеймер
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
18
Если
  1. Застанить героя на минуту
  2. Через 2 секунды снять бафф стана
  3. Попытаться застанить на 5 секунд, то застанит на 58 секунд
28
Vlod, действительно, попробовал побороть но не получилось)
возможно только кастомное снятие придётся делать, чтобы вместе со снятием обнулять время
думал просто в периодик закинуть, но это не то, а при получении урона всё равно нужна нулевая задержка на отключение триггера, пока даммик застанит, чтобы не снимать стан сразу при его получении, что тоже нехорошо
28
по хорошему, нужно просто выбросить эту "наработку", если так можно вообще выразиться (нет), и
пойти пить чай
30
Если стан кастуется через молоток, почему даммик не двигается под цель заклинания?
Хэштаблица на каждое заклинание это плохо, лучше использовать одну глобальную, резервируя ключи на каждое заклинание.
Таймер лучше вешать прям на хэндл юнита и не заморачиваться с группами.
Одним словом довольно странная реализация довольно банальной задачи.
28
Если стан кастуется через молоток, почему даммик не двигается под цель заклинания?
потому что можно выставить радиус, соответствующий карте?
nazarpunk:
Хэштаблица на каждое заклинание это плохо, лучше использовать одну глобальную, резервируя ключи на каждое заклинание.
спокойно можно убрать строку с хэштаблицей и автозаменой пройтись, подставив свою, если названия не совпадают, у меня одна глобальная хэштаблица, но есть некоторые исключения
как видишь, ключ уже есть, но если до этого работа с юнитами не была через ключи вджасса, то лучше само собой вместо key подставить integer и вписать своё число, короче это больше в силу возможностей импортирующего человека зависит, банальные знания джасса в принципе, хотя тем, кому оно бы пригодилось, джасс вероятно не знают
nazarpunk:
Таймер лучше вешать прям на хэндл юнита и не заморачиваться с группами.
я не знал что лучше, таймера на каждого юнита или один таймер с группой, выбрал второе
nazarpunk:
Одним словом довольно странная реализация довольно банальной задачи.
rsfghd:
типичная триггерная система стана, позволяет использовать один стан на всю карту
настолько каловая система стана, что игроки будут оглушены в реальной жизни и не смогут в это говно вообще играть, психанут и разобьют монитор, поэтому лучше вообще ничего не юзать и пойти пить чай
я и не хвастался этим помойным ресурсом, поэтому оно и лежит в блоге и даже не заявлялось на публикацию, ты хочешь чтобы я это попросил в бездну закинуть из моего блога?)

я понимаю твоё недовольство, но на данный момент интересует факт в чём группа хуже, переделаю на таймера
30
потому что можно выставить радиус, соответствующий карте?
У молотка скорость полёта как-бы есть, и если он вылетит прям по цели, то сразу стриггерит стан.
спокойно можно убрать строку с хэштаблицей и автозаменой пройтись, подставив свою
Если в дизайне присутвует автозамена, то с дизайном явно что-то не так.
хотя тем, кому оно бы пригодилось, джасс вероятно не знают
Почему это? Иногда проще импортировать оттестированную либу и ставить её в зависимость, чем каждый раз писать свою.
я не знал что лучше, таймера на каждого юнита или один таймер с группой, выбрал второе
Таймер на каждого юнита лучше, ибо к нему поверх всего можно ещё данных прикрутить. В идеале вообще на таймер вешать struct и хранить всё в ней, а хэштаблицы использовать только для привязки структуры к таймеру.
я и не хвастался этим помойным ресурсом
Упоминание через каждые два слова "помойности" ресурса не оправдывает качество кода.

Система довольно таки простая. Переписать её на zinc со структурами, вывести хэштаблицу в глобал ивыложить как наработку. Так можно получить больше обЪективной критики и научиться писать более качественный код, а не прятаться за отмазками о "помойности".
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.