rsfghd,
1)SetUnitPosition - значительно более ресурсоемка чем движение по осям, для проверки границ карты проверяйете кординаты на корректность, это элементарно.
Нет никакой надобности юзать таймеры с таким малым периодом, типа 100 раз в сек, 50 или 23 более чем достаточно.
Ты скорее наделал утечики с переменными чем сделал лучше, подобный код бесполезен, уж лучше обынчый БЖ код юзай.
Далее неверный алгоритм, нет иного завершения кроме как попадания. Если у тебя планируется тонны снарядом - то мб не делать как ты для каждого снаряда 1 таймер, еще и переборы группой ?
local trigger t = CreateTrigger()
local integer index = 0
local playerunitevent e = null
local code c = function Frost_Conditions
local player p = null
local boolexpr b = null
loop
set p = Player(index)
set e = EVENT_PLAYER_UNIT_SPELL_EFFECT
call TriggerRegisterPlayerUnitEvent(t,p,e,b)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
set e = null
set p = null
endloop
set b = Condition(c)
call TriggerAddCondition(t,b)
set c = null
set c = function Frost_Actions
call TriggerAddAction(t,c)
set b = null
set c = null
set t = null
Ну сами и наплодили непойми чего.
Потом волну силы то не пробовали а?
Тут спелл примитив примитивом, но сделан отвратно, зачем то SteUnitPos - вместо нормального движения по осям, как таймер бредовый 0.01, ну ладно уж 0.02, или 0.03125.
Куда 0.01? Нет никакой обьективной нужды в таких таймерах, как и в прочих вещях вроде SetIUnitPosition.
Vlod, они там улететь немогут, т.к SetUnitPos не выпустит.
Но тут почему то нормально не пострена дальность полета, тупая проверка группой что кто то попалася, а если никто - то оно и дальше тикает....
Полная ахинея, уж блин триггер бы взяли и событие UnitsInRange и вручали его всем даммиками, а триггер был бы 1, если уж дофига оптимизацию охото.
grudlac, карту в студию.
Видно что в коде ошибки и глупость, но непонятно что, где и как. Вовсе что хочешь сделать опиши нормально, если ты хайдишь юнита - почему не паузишь, скрытый юнит может делать что ему вздумается.
Не везде можно указывать отрец значения, точнее не везде это дает какой то толк. Некоторые поля движок игры проверяет на корректность и изменяет на минимально возможное, если оно неккоректно. Хп юниту отрец вы не поставите. Длительность тоже, толку 0.
Ты забываешь важное НО - ты меришь дистацнию между центрами юнитов, а игра между краем моделей, это раз, два юнит начинает атаковать не мгновенно как увидел цель в зоне досягаемости, так же не забывай что снаняды будут догонять юнита и не смотря на то что юнит уже вышел за радиус атаки - тот удар что был заготовлен всеравно на пофиг полетит в него.
Не пробовал поступить оригинальнее - событие юнит входит в регион, юнит выходит из региона, при входе помещаем юнита в группу, при выходе удаляем из этой группы, как и при смерти. В отдельном триггере кадую секунду всем юнитам в этой группе отнимаем здоровье в размере 10% от максимума.
Там все гораздо проще, на каждого юнита аттачится экземпляр структуры где хранится цель, заклинатель, кол-во урона в сек, и сколько хп у тебя было, по нему высчитывается урон каждые 4 секунды. Тебе ни 10 таймеров ни группы не нужны.
function WC5 takes nothing returns boolean
local trigger t = GetTriggeringTrigger( )
local integer S5I = GetHandleId( t )
local unit P7I = ( LoadUnitHandle( HashData, ( S5I ), ( 2 ) ) )
local unit P8I = ( LoadUnitHandle( HashData, ( S5I ), ( 17 ) ) )
local integer SUI = GetUnitAbilityLevel( P7I, 'A0NO' )
local integer NPI = GetTriggerEvalCount( t )
local real WD5 = ( LoadReal( HashData, ( S5I ), ( 392 ) ) )
local real H84 = 0
if GetTriggerEventId( ) == EVENT_WIDGET_DEATH then
call DestroyEffect( ( LoadEffectHandle( HashData, ( S5I ), ( 32 ) ) ) )
call FlushChildHashtable( HashData, ( S5I ) )
call S0I( t )
else
if NPI == 4 or NPI == 8 or NPI == 12 then
call DestroyEffect( ( LoadEffectHandle( HashData, ( S5I ), ( 32 ) ) ) )
if NPI == 12 then
call FlushChildHashtable( HashData, ( S5I ) )
call S0I( t )
elseif NPI == 4 or NPI == 8 then
call SaveEffectHandle( HashData, ( S5I ), ( 32 ), ( AddSpecialEffectTarget( "effects\\NetherInferno.mdx", P8I, "origin" ) ) )
endif
set H84 = ( 0.08 + SUI * 0.08 ) * QDI( WD5 - GetUnitState( P8I, UNIT_STATE_LIFE ), 0 )
if H84 > 0 then
call UYI( "+" + I2S( R2I( H84 ) ), 2, P8I, 0.023, 68, 0, 187, 216 )
endif
endif
call DamageTarget( P7I, P8I, 1, 5 * SUI + H84 )
endif
set t = null
set P7I = null
set P8I = null
return false
endfunction
function WE5 takes nothing returns nothing
local trigger t = CreateTrigger( )
local integer S5I = GetHandleId( t )
local unit P7I = GetTriggerUnit( )
local unit P8I = GetEnumUnit( )
call DestroyEffect( AddSpecialEffectTarget( "effects\\NetherInferno.mdx", P8I, "origin" ) )
call TriggerRegisterTimerEvent( t, 1, true )
call TriggerRegisterDeathEvent( t, P8I )
call TriggerAddCondition( t, Condition( function WC5 ) )
call SaveUnitHandle( HashData, ( S5I ), ( 17 ), ( P8I ) )
call SaveUnitHandle( HashData, ( S5I ), ( 2 ), ( P7I ) )
call SaveReal( HashData, ( S5I ), ( 392 ), ( ( GetUnitState( P8I, UNIT_STATE_LIFE ) ) * 1.0 ) )
call SaveEffectHandle( HashData, ( S5I ), ( 32 ), ( AddSpecialEffectTarget( "effects\\NetherInferno.mdx", P8I, "origin" ) ) )
set t = null
set P7I = null
set P8I = null
endfunction
function WF5 takes nothing returns nothing
local unit P7I = GetTriggerUnit( )
local location l = GetSpellTargetLoc( )
local real x = GetLocationX( l )
local real y = GetLocationY( l )
local group g = NTI( )
local integer SUI = GetUnitAbilityLevel( P7I, 'A0NO' )
call GroupEnumUnitsInRange( g, x, y, 180 + 25, Condition( function D01 ) )
call ForGroup( g, function WE5 )
call NSI( g )
call RemoveLocation( l )
set l = null
set g = null
endfunction
function WG5 takes nothing returns boolean
if GetSpellAbilityId( ) == 'A0NO' then
call WF5( )
endif
return false
endfunction
function NI1 takes nothing returns nothing
local trigger t = CreateTrigger( )
call UMI( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function WG5 ) )
set t = null
endfunction
Как видишь все очень примитивно.Точно так же делаешь структуру с данными кто, где, когда. Нет смысла пытатся хранить сразу группу.
Bergi_Bear, 200% на 2, крит по механике варкравта заменяет основную атаку множенной, т.е если сработал крит - твоя основная атака не срабатывает, она подменяется множенной, при этом отваливаются всякие орбы которые "ждали" обычной атаки.
Это техническая способность, сама по себе не работает, это как создать труп - у кладбища, без способности оживить скелета или вызывать жука трупоеда оно бесполезно. Тут тоже самое, само по себе не пашет, юзай связку способностей или триггерный вариант спауна возле здания.
GetLocalPlayer, кому оно укаколось в 2020? параноики еще не вымерли, в 2006 это никому не было интересно, и никто этого не делал, сейчас и подавно. Карта которая открывала сайт близов, вот все демо на которое хватило ума у чувака который ниче умнее не придумал это близард послать а не расскзаать аудитории вменяемо об этой находке.
Fly123, xgm.guru/p/wc3/memoryhack
В краце это пару функций, и ''сломанный массив", благодаря этому массиву мы можем читать и писать данные. Ну остальное - тысячи строк кода функций для мемхака, которые юзают этот массив. Есть возможность заружать сторонние длл, которые модифицируют игру, ибо согласитесь делать фишки как в мапхаках с кд в секундах или регенерации в интерфейсе проще через вижуал студио чем через хексредактор и список мамашиных инструкций?
Раньше был лимит 8 мегабайт на игру по сети, на айкапе нету его сняли, но какой он там хз, 2 гб это явно много. В общем карта может быть и немного больше 8 мегабайт но уж явно не стоит злоупотреблять и делать карту дикого размера.
Может если руки кривые, во первых ы сферу молний низя сувать чаннелинг спеллы, фатал.
Удаление юнитов - дибильная идея, есть функция kill unit, которая нормально утилизирует юнитов.
Qulore, потому что ты игнорируешь то что пишу я и другие, и просишь готовую наработку. Ты не 1 такой, таких как ты десятки. увы научится они не могут... Я же прямо говорю что нужна практика, читай статьи и вникай, смотри карты близардов и вникай- почему сделано так а не иначе?
Иначе ты никогда ничему не научишся. Я не написал ничего нового, все описанное выше давно известно и разжевано.
Пока не начнешь вникаеть как и что в варе работает, ты так и будешь тыкатся.
Надеюсь ты запомнил - вейты юзать нельзя, нужно понимать что функции из раздела - реакция на событие, реагирует на событие в потоке триггера, применяющий юнит - вернет нужного юнита лишь в триггере который спаботал на каст абилки, при том до вейта, после вейта там скорее всего null или другой юнит, триггер может за время вейта сработать десятки раз на событие каста. Поэтому нужны переменные, в которые будут сразу записаны все параметры вначале и только потом действия, если нужна задержка - лучше осваивай таймеры.
Почему ты такой..., у тебя это не может работать по определению: вейты зло.
У тебя GetTriggerUnit() - применяющий юнит, да и цель - существуют лишь до дейсвтвия ждать, далее их уже нет. Тоже самое с последний созданый юнит - на деле это тупо глобальная переменная, её нельзя использовать после вейта, т.к данные могли уже 10 раз переписатся.
Нужно Сперва нанести урон, и сразу же приказать даммику кастануть сон, а у сна поставить время подготовки заклинания, разумеется даммика лучше сделать за нейтралпассивных и сделать глобальнуюальность, а у сна сделать в настройках возможность примнения в союзников. Т.к если враг стоит где то в лесу, то из за обзора даммик может тупо не увидеть врага, враг уйдет в тень.
Все эти действия Wait, PolledWait не пригодны для использования в качестве задержек для триггерных заклинаний, их единственно назначение - синхронизация геймкеша и кинематики в кампании. Поэтому сразу думайте как можно обойтись, или как иначе реализовать задержку.
» WarCraft 3 / Утечки
1)SetUnitPosition - значительно более ресурсоемка чем движение по осям, для проверки границ карты проверяйете кординаты на корректность, это элементарно.
Ред. Maniac_91
» WarCraft 3 / Утечки
Тут спелл примитив примитивом, но сделан отвратно, зачем то SteUnitPos - вместо нормального движения по осям, как таймер бредовый 0.01, ну ладно уж 0.02, или 0.03125.
Куда 0.01? Нет никакой обьективной нужды в таких таймерах, как и в прочих вещях вроде SetIUnitPosition.
» WarCraft 3 / скрыть/показать юнита
Видно что в коде ошибки и глупость, но непонятно что, где и как. Вовсе что хочешь сделать опиши нормально, если ты хайдишь юнита - почему не паузишь, скрытый юнит может делать что ему вздумается.
» WarCraft 3 / В чем проблема?
» WarCraft 3 / Дистанция получения цели
» WarCraft 3 / Способности и алгоритмы на заказ
» WarCraft 3 / Система постройки стен
» WarCraft 3 / Дистанция атаки
Не пробовал поступить оригинальнее - событие юнит входит в регион, юнит выходит из региона, при входе помещаем юнита в группу, при выходе удаляем из этой группы, как и при смерти. В отдельном триггере кадую секунду всем юнитам в этой группе отнимаем здоровье в размере 10% от максимума.
» WarCraft 3 / Способности и алгоритмы на заказ
Этот спел очень популярен и его много раз делали, фрог его тупо спер с конкурса спеллов хайва =)
» WarCraft 3 / Нужна помощь (vjass)
» WarCraft 3 / Как сделать так чтоб 4 удар был 100 крит 200%
» WarCraft 3 / Способность завод не работает
» WarCraft 3 / MapHack для реплея
» WarCraft 3 / Способности - Редактор объектов
» WarCraft 3 / MemoryHackAPI
» WarCraft 3 / MemoryHackAPI
» WarCraft 3 / Объясните как сейчас всё существует
Ред. PT153
» WarCraft 3 / Объясните как сейчас всё существует
В краце это пару функций, и ''сломанный массив", благодаря этому массиву мы можем читать и писать данные. Ну остальное - тысячи строк кода функций для мемхака, которые юзают этот массив. Есть возможность заружать сторонние длл, которые модифицируют игру, ибо согласитесь делать фишки как в мапхаках с кд в секундах или регенерации в интерфейсе проще через вижуал студио чем через хексредактор и список мамашиных инструкций?
» WarCraft 3 / По поводу размеров карты в байтах, лаунчеров для WC3 и вообще
» WarCraft 3 / MapHack для реплея
» WarCraft 3 / Проблема с биндами в Dota Allstars
Пишите автору кеев, мб исправит для 1.27б.
» WarCraft 3 / Способность
Удаление юнитов - дибильная идея, есть функция kill unit, которая нормально утилизирует юнитов.
» WarCraft 3 / Спосоность связанная со сном
Иначе ты никогда ничему не научишся. Я не написал ничего нового, все описанное выше давно известно и разжевано.
Пока не начнешь вникаеть как и что в варе работает, ты так и будешь тыкатся.
Надеюсь ты запомнил - вейты юзать нельзя, нужно понимать что функции из раздела - реакция на событие, реагирует на событие в потоке триггера, применяющий юнит - вернет нужного юнита лишь в триггере который спаботал на каст абилки, при том до вейта, после вейта там скорее всего null или другой юнит, триггер может за время вейта сработать десятки раз на событие каста. Поэтому нужны переменные, в которые будут сразу записаны все параметры вначале и только потом действия, если нужна задержка - лучше осваивай таймеры.
Ред. Берги
» WarCraft 3 / Спосоность связанная со сном
У тебя GetTriggerUnit() - применяющий юнит, да и цель - существуют лишь до дейсвтвия ждать, далее их уже нет. Тоже самое с последний созданый юнит - на деле это тупо глобальная переменная, её нельзя использовать после вейта, т.к данные могли уже 10 раз переписатся.
Нужно Сперва нанести урон, и сразу же приказать даммику кастануть сон, а у сна поставить время подготовки заклинания, разумеется даммика лучше сделать за нейтралпассивных и сделать глобальнуюальность, а у сна сделать в настройках возможность примнения в союзников. Т.к если враг стоит где то в лесу, то из за обзора даммик может тупо не увидеть врага, враг уйдет в тень.
» WarCraft 3 / Order ID , flamingarrowstarg