function Trig_Surge_Expires_Conditions takes nothing returns boolean
local trigger trg = GetTriggeringTrigger()
local integer id = GetHandleId(trg)
local unit targ = LoadUnitHandle( HashData, id, 0 )
call DisableTrigger(trg)
call UnitRemoveAbility( targ, 'A0C9' )
call UnitRemoveAbility( targ, 'B07W' )
call RemoveSavedHandle( HashData, ExSurge, GetHandleId(targ))
call FlushChildHashtable( HashData, id )
call S0I(trg)
set trg = LoadTriggerHandle( HashData, ExPhaseKey, GetHandleId(targ) )
if trg == null then
//call SetUnitPathing( targ, true )
endif
set targ = null
set trg = null
return false
endfunction
function Trig_Surge_Actions takes nothing returns nothing
local unit targ = GetSpellTargetUnit( )
local real dur = RMaxBJ( 1.50 * GetUnitAbilityLevel( GetSpellAbilityUnit(),'A0R7' ) + 1.50, 3.01 )
local trigger trg = LoadTriggerHandle( HashData, ExSurge, GetHandleId(targ) )
local integer id
if trg != null then
call TriggerEvaluate(trg)
endif
set trg = LoadTriggerHandle( HashData, ExPhaseKey, GetHandleId(targ) )
if trg != null then
call TriggerEvaluate(trg)
endif
set trg = CreateTrigger()
set id = GetHandleId(trg)
call SaveTriggerHandle( HashData,ExSurge, GetHandleId(targ), trg )
call SaveUnitHandle( HashData, id, 0, targ )
call TriggerAddCondition( trg, Condition(function Trig_Surge_Expires_Conditions ) )
call TriggerRegisterDeathEvent( trg, targ )
call TriggerRegisterTimerEvent( trg, dur, false )
call UnitAddAbility( targ, 'A0C9' )
call UnitMakeAbilityPermanent( targ, true, 'A0C9' )
call SetUnitAbilityLevel( targ, 'A0C9', GetUnitAbilityLevel( GetSpellAbilityUnit(),'A0R7' ) )
call AuraUpdateEffect( targ, 'A0R7' )
call IO1(UD,GetUnitX(targ),GetUnitY(targ))
call DestroyEffect(AddSpecialEffectTarget("effects\\Surge.mdx",targ,"origin"))
if not IsUnitType( targ,UNIT_TYPE_FLYING)then
//call SetUnitPhased(targ)
endif
set targ = null
set trg = null
endfunction
function Trig_Surge_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'A0R7' then
call Trig_Surge_Actions()
endif
return false
endfunction
function Register_Surge takes nothing returns nothing
local trigger trg = CreateTrigger( )
local integer nIndex = 1
call TriggerAddCondition( trg, Condition( function Trig_Surge_Conditions ) )
loop
exitwhen nIndex > 11
if IsSlotPlayer( Player( nIndex ) ) then
call TriggerRegisterPlayerUnitEvent( trg, Player( nIndex ), EVENT_PLAYER_UNIT_SPELL_EFFECT, OnlyHero )
endif
set nIndex = nIndex + 1
endloop
set trg = null
endfunction
Это код способности surge, из доты, когда то давно делал. Ну собственно тут довольно примитивный код и как раз пример как нужно следить за юнитом, тут реализован и диспел и перебивание баффа при повторном применении, это не намного сложнее кастомного сна, который я описал выше.
Просто добавляем в кондишене второго триггера услвоие с GetTriggerEventId() == ну и событие, к примеру EVENT_WIDGET_DEATH чтобы снимать эффект при смерти, уроне выше 0 не от кастера или от истечении времени.
А в чем проблема, т.к сон сбивается при уроне, то стандартные способности не подойдут, берешь обычное высасывание жизни, и создаешь триггер событием которого будет - юнит приводит способность в действие, условие - примененная способность == твоё сосание жизни, ну и действие:
Применяем на жертву PauseUnit, вручаем жертве способность на основе кольца защиты с нулевым бонусом и прекрепленным эффектом сна, далее создаем новый триггер, с событиями - юнит получает урон, юнит умирает, время вышло, кастер отдел приказ, цель точка, цель обьект, без указания цели. Ну и добавляем триггеру новое условие, в котором будем делать действия. Сохраняем в хештаблицу юнита цель и нашего кастера. Выгружаем в условии вновь созданного нами триггера, проверяем от чего сработал триггер, если триггер сработал от смерти, или урона, или от приказа не равного - приказу похищения жизни, триггер отключаем, у юнита удаляем паузу и абилку пустышку для визуального эффекта. Если цель получила урон не от кастера, и урон выше 0 - то паузим кастера и тут же сбиваем паузу, попутно так же выключая триггер и снимая с жертвы паузу и спецэффект. Ну и не забываем обнулять все локальные переменные и удалять триггер в конце.
LaBlinov369, это хакнутая версия game.dll, в ней исправили лимит карт для мультиплеера, запомните на айкап дорога закрыта с ним, айкап лаунчер считает что с игрой чето нетак. Снимать лимит, не трогая целостность файлов игры умеют многие проги, тот же WFE, был даже отдельный микс файл для снятия лимита.
Механику каста ты никак не изменишь у дефолтных способностей, Берёшь автокаст пустышку к примеру ярость огра, или ледяной щит,и триггерно из них делаешь эти абилки.
Ну как же, винда вам даст формат диска, ага. Есть 100500 способов без мемхака сделать пакость юзеру, ну это лишено смысла - ибо чтобы это работало, вам нужна популярная карта, своя популярная карта на создание которой уйдет уйма времени и сил, другие популярные карты висят на хостботах, и ваша ломаная версия никому не уперлась, к вам даже не зайдут. Дальше то что?
FriendlyGuest, такие способности делаются не так, у вас ошибка в реализации, если ты хочешь спелл со снярядом, то либо ты делаешь триггерный снаряд и спелл пустышку или хитрость с детекиом урона. При касте молотка бурь, ты создаёшь новый триггер с событием - время вышло ( примерное время полёта снаряда, от 0.6 до 3 сёк), событие цель умирает, событие цель получила урон. В условии делаются все действия, если триггер сработал от истечения времени или от смерти, то утилизируем триггер, иначе проверяем урон, он ровно 0.00, урон от кластера и цель имеет бафф стана, тогда наносим полный урон по формуле. Сам молоток урона не наносит, такая реализация позволяет юзать без проблемно все дефолт абилки со снарядами и дебаффом, чётко отслеживаю их попадание и промахи или блок амулет защиты. Разумеется на гуи нехватает инструментов для этого и это делается на jass, но код очень прост, могу сделать пример как буду дома.
С массивами тоже не все так просто, но это все хрень, в реальной игре такого нет как и такого обьёма данных, по 10к+ записей, это все ахинея и не заслуживает внимания. Нет ничего плохого ни в глобалках ни в хештаблице, и ненадо пытается все на массивах делать или исключительно все на хт.
Vlod, ага, там много ошибок и глупостей. Но факт что хт не нужно боятся, они не настолько медленные чтобы отказыватся, разница - одно обращение к хт = 2 обращения к массиву примерно, в мемхаке анрайза есть тест на скорость, можите попробовать, сравнить разницу.
Немного не понял что хотите добится, и причем тут полный урон?
При касте способности цели мгновенно наносится урон по формуле 'Уровень способности Х 2 х ловкость героя, включая бонусы на момент каста', вроде все верно но не мешало бы использовать переменные и вычислить урон 1 раз, не делая рассчет 2 раза, для функции урона и для функции текстага.
Если вам нужен урон с учетом резиста - тут нужен отдельный триггер с событием юнит получает урон, условием что урон выше 0, ну и действием записать входящий урон в глобальную переменную, из которой вы прочитаете кол-во урона с учетом резистов в своем триггере, т.к событие урона сработает раньше реального нанесения урона.
Анрайз оставил тест, для измерения скорости работы функций, в попугаях конечно, но даёт понять насколько сильно различается ресурсоемкость функций, какие то более быстрее а какие то медленные. Можите по сравнивать ваш код, и наглядно сравнить что даёт оптимизация, и какова разница между нативками и кастом кодом.
Просто стоит учитывать что вызов внутринних функций игры посредством мемхака очень ресурсоемкий, и юзать все эти callthis, stdcall нужно с умом.
Нативки или код в движке гораздо шустрее, потому все и пилят Длл с этими магазинами, талантами и тому подобным, ибо когда в карте и без того много чего, 6 кадров обеспечено, не стоит юзать функции этого типа бездумно.
Vlod, вопрос в другом - как ты расскажешь другим игрокам о твоей карте, кроме рекламы? То что кому то зайдет, а кому то нет - офк, так всегда, ептить есть люди которые за годы игр в варкрафте не играли ниразу в доту, ниче такого в этом нет, не нравится, не интересно. Но ваша карте чудесным образом не появится в папочке "maps" всех игроков платформы.
То что у всех свои интересы, тоже совершенно нормально, кому то подавай рпг, кому то арены, я вот от тдшек и таг карт фанатею (петры имхо баганая имбалансная карта), кто то кроме доты ниче не признает, ну многие балдеют от минигр вроде are you lucker или Uther paty - в них кстати норм играть именно с друзьями.
Bergi_Bear, а никто иначе не будет играть если нет хосьбота по кд, почему лтд так раскручен - по кд хостботы, админки, статистика, закрытые про игры для задров, без этого конечно, многие даже не узнают о твоей карте.
» WarCraft 3 / Как создать способность
Ред. quq_CCCP
» WarCraft 3 / Как создать способность
Просто добавляем в кондишене второго триггера услвоие с GetTriggerEventId() == ну и событие, к примеру EVENT_WIDGET_DEATH чтобы снимать эффект при смерти, уроне выше 0 не от кастера или от истечении времени.
» WarCraft 3 / Как создать способность
» WarCraft 3 / Как создать способность
» WarCraft 3 / Как создать способность
» WarCraft 3 / Как создать способность
Применяем на жертву PauseUnit, вручаем жертве способность на основе кольца защиты с нулевым бонусом и прекрепленным эффектом сна, далее создаем новый триггер, с событиями - юнит получает урон, юнит умирает, время вышло, кастер отдел приказ, цель точка, цель обьект, без указания цели. Ну и добавляем триггеру новое условие, в котором будем делать действия. Сохраняем в хештаблицу юнита цель и нашего кастера. Выгружаем в условии вновь созданного нами триггера, проверяем от чего сработал триггер, если триггер сработал от смерти, или урона, или от приказа не равного - приказу похищения жизни, триггер отключаем, у юнита удаляем паузу и абилку пустышку для визуального эффекта. Если цель получила урон не от кастера, и урон выше 0 - то паузим кастера и тут же сбиваем паузу, попутно так же выключая триггер и снимая с жертвы паузу и спецэффект. Ну и не забываем обнулять все локальные переменные и удалять триггер в конце.
» IrInA Host Bot / Game.dll
» WarCraft 3 / Автокаст прожимных навыков
» WarCraft 3 / Использование ShellExecute
» WarCraft 3 / Друг
» WarCraft 3 / Как сделать всплывающий урон от такой способности?
» WarCraft 3 / Ресурсы карт
Ред. quq_CCCP
» WarCraft 3 / Обучение jass
» WarCraft 3 / Обучение jass
» WarCraft 3 / Как сделать всплывающий урон от такой способности?
При касте способности цели мгновенно наносится урон по формуле 'Уровень способности Х 2 х ловкость героя, включая бонусы на момент каста', вроде все верно но не мешало бы использовать переменные и вычислить урон 1 раз, не делая рассчет 2 раза, для функции урона и для функции текстага.
Если вам нужен урон с учетом резиста - тут нужен отдельный триггер с событием юнит получает урон, условием что урон выше 0, ну и действием записать входящий урон в глобальную переменную, из которой вы прочитаете кол-во урона с учетом резистов в своем триггере, т.к событие урона сработает раньше реального нанесения урона.
» WarCraft 3 / Обучение jass
» WarCraft 3 / Обучение jass
» WarCraft 3 / Когда UnitDamageTarget возвращает false
» WarCraft 3 / Модели зданий и юнитов
» WarCraft 3 / Рекомендации по успешным проектам
» WarCraft 3 / Рекомендации по успешным проектам
» WarCraft 3 / Магазин на фреймах
» WarCraft 3 / Магазин на фреймах
Нативки или код в движке гораздо шустрее, потому все и пилят Длл с этими магазинами, талантами и тому подобным, ибо когда в карте и без того много чего, 6 кадров обеспечено, не стоит юзать функции этого типа бездумно.
» WarCraft 3 / Рекомендации по успешным проектам
То что у всех свои интересы, тоже совершенно нормально, кому то подавай рпг, кому то арены, я вот от тдшек и таг карт фанатею (петры имхо баганая имбалансная карта), кто то кроме доты ниче не признает, ну многие балдеют от минигр вроде are you lucker или Uther paty - в них кстати норм играть именно с друзьями.
» WarCraft 3 / Рекомендации по успешным проектам