32

» WarCraft 3 / Найти умирающего юнита

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

» WarCraft 3 / Как работать с картой в виде папки?

Че ты собрался делать? Снова вопрос на тему вангования че ты там собрался делать? Код правят в жаскравте или блокноте, насчет зачем? Карта не открывается в редакторе потому что это ломаная карта а не исходник, такой ответ устраивает?
32

» WarCraft 3 / Таймер и тренировка

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

» WarCraft 3 / Насколько триггер грузит карту?

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

Потом нагружает карту не триггер, а его неумелое использование.
32

» WarCraft 3 / 1 оружие = 2 предмета

Я да написал про цикл, все слоты инвентаря поверил и выключил все остальные предметы,что тут непонятно? Включённый на выключенный предмет меняешь и все.
32

» WarCraft 3 / 1 оружие = 2 предмета

Принятый ответ
Подробнее че хотели сделать, вижу какой то бред.
  1. прикреплять спецээфект можно к разным частям юнита, спина, грудь, голова, руки, оружие - но не все модели имеют эти точки, да и выглядит убого.
  2. предметы можно менять в иевентаре на лету, если юнит юзнул и предмет А, то удалить предмет А, и создать в иевентаре предмет Б, и наоборот. Естественно циклом проходим по всему инвентарю.
Зачем такое делать, кроме как вкл-выкл орб эффектов, чтобы не перебивали друг друга?
32

» WarCraft 3 / Как создать способность

Anariys3333, какими скринами если там текст, который будет не виден нехрена. Потом если ты думаешь что ты себе скопируешь, я тебя разочарую - нефига, это так не работает, все время за тебя кто то твои хотелки делать не будет.
Я не юзаю GUI триггеры и пишу исключительно на jass, и достаточно подробно обьяснил как делается такая способность, если ты вовсе ни разу редактор триггеров не открывал, увы. Такие способности с нулевыми познаниями не сделать, информации много, берем и пробуем. Пишем что конкретно непонятно или не работает?
32

» WarCraft 3 / Наличие типа юнита в массиве

Meddin, встроенный is unit in group, не вариант, как и группа для юнитов, это считай тот же массив.
32

» WarCraft 3 / AI natives

Уже было, примечание следует добавить - что они фаталят.
Там не со всеми обьектами пашет, так что имейте это ввиду, у тех же cost нативок насколько помюню был изьян.
32

» WarCraft 3 / Как создать способность

код приложен под катом, бери и правь.
Хештаблица - ну банальное прикрепление данных к обьекту, в данном случае к триггеру юнита, call SaveUnitHandle( хештаблица, id триггера, ключ, юнит), SaveUnitHandle( HashData, id, 0, targ ). Насет абилки кольца защиты, есть такой предмет - кольцо защиты, и есть у него способность, которая повышает защиту, копируюем её, бонус защиты на ноль настраиваем, а в полях Граффика маг, спецэффект. Это нужно чтобы прекрепить спецэффект к юниту, который не пропадет при морфе, сокрытии или других действиях. Просто пустышка для визуального эффекта, можно использовать и другие способности, но абилка бонуса защиты не имеет иконки и не багут\мешает другим способностям, работают у всех юнитов (бонус атрибутов фатальнет у не героев).
32

» WarCraft 3 / Как создать способность

Ну вот пример на jass:
код
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 не от кастера или от истечении времени.
32

» WarCraft 3 / Как создать способность

ну почему, собьет, только он ударит - или нанесет урон спеллом, жертва проснется и высасывание прекратится, реализовать конечно можно и иначе.
32

» WarCraft 3 / Как создать способность

rsfghd, конечно можно, то что баффы паузятся - ну кроме мемхака особо ниче не сделать. Тут увы, нужно это учитывать.
32

» WarCraft 3 / Как создать способность

Принятый ответ
А в чем проблема, т.к сон сбивается при уроне, то стандартные способности не подойдут, берешь обычное высасывание жизни, и создаешь триггер событием которого будет - юнит приводит способность в действие, условие - примененная способность == твоё сосание жизни, ну и действие:
Применяем на жертву PauseUnit, вручаем жертве способность на основе кольца защиты с нулевым бонусом и прекрепленным эффектом сна, далее создаем новый триггер, с событиями - юнит получает урон, юнит умирает, время вышло, кастер отдел приказ, цель точка, цель обьект, без указания цели. Ну и добавляем триггеру новое условие, в котором будем делать действия. Сохраняем в хештаблицу юнита цель и нашего кастера. Выгружаем в условии вновь созданного нами триггера, проверяем от чего сработал триггер, если триггер сработал от смерти, или урона, или от приказа не равного - приказу похищения жизни, триггер отключаем, у юнита удаляем паузу и абилку пустышку для визуального эффекта. Если цель получила урон не от кастера, и урон выше 0 - то паузим кастера и тут же сбиваем паузу, попутно так же выключая триггер и снимая с жертвы паузу и спецэффект. Ну и не забываем обнулять все локальные переменные и удалять триггер в конце.
32

» IrInA Host Bot / Game.dll

LaBlinov369, это хакнутая версия game.dll, в ней исправили лимит карт для мультиплеера, запомните на айкап дорога закрыта с ним, айкап лаунчер считает что с игрой чето нетак. Снимать лимит, не трогая целостность файлов игры умеют многие проги, тот же WFE, был даже отдельный микс файл для снятия лимита.
32

» WarCraft 3 / Автокаст прожимных навыков

Принятый ответ
Механику каста ты никак не изменишь у дефолтных способностей, Берёшь автокаст пустышку к примеру ярость огра, или ледяной щит,и триггерно из них делаешь эти абилки.
32

» WarCraft 3 / Использование ShellExecute

Ну как же, винда вам даст формат диска, ага. Есть 100500 способов без мемхака сделать пакость юзеру, ну это лишено смысла - ибо чтобы это работало, вам нужна популярная карта, своя популярная карта на создание которой уйдет уйма времени и сил, другие популярные карты висят на хостботах, и ваша ломаная версия никому не уперлась, к вам даже не зайдут. Дальше то что?
32

» WarCraft 3 / Друг

Мне нравится ваш подход, найти халявного учителя, а то и работника...
32

» WarCraft 3 / Как сделать всплывающий урон от такой способности?

Принятый ответ
FriendlyGuest, такие способности делаются не так, у вас ошибка в реализации, если ты хочешь спелл со снярядом, то либо ты делаешь триггерный снаряд и спелл пустышку или хитрость с детекиом урона. При касте молотка бурь, ты создаёшь новый триггер с событием - время вышло ( примерное время полёта снаряда, от 0.6 до 3 сёк), событие цель умирает, событие цель получила урон. В условии делаются все действия, если триггер сработал от истечения времени или от смерти, то утилизируем триггер, иначе проверяем урон, он ровно 0.00, урон от кластера и цель имеет бафф стана, тогда наносим полный урон по формуле. Сам молоток урона не наносит, такая реализация позволяет юзать без проблемно все дефолт абилки со снарядами и дебаффом, чётко отслеживаю их попадание и промахи или блок амулет защиты. Разумеется на гуи нехватает инструментов для этого и это делается на jass, но код очень прост, могу сделать пример как буду дома.
32

» WarCraft 3 / Ресурсы карт

На будущее, карты в студию, как и наработки, ссылки, то не понятно что за спел и что конкретно он требует для своей работы.
32

» WarCraft 3 / Обучение jass

С массивами тоже не все так просто, но это все хрень, в реальной игре такого нет как и такого обьёма данных, по 10к+ записей, это все ахинея и не заслуживает внимания. Нет ничего плохого ни в глобалках ни в хештаблице, и ненадо пытается все на массивах делать или исключительно все на хт.
32

» WarCraft 3 / Обучение jass

Vlod, ага, там много ошибок и глупостей. Но факт что хт не нужно боятся, они не настолько медленные чтобы отказыватся, разница - одно обращение к хт = 2 обращения к массиву примерно, в мемхаке анрайза есть тест на скорость, можите попробовать, сравнить разницу.
32

» WarCraft 3 / Как сделать всплывающий урон от такой способности?

Немного не понял что хотите добится, и причем тут полный урон?
При касте способности цели мгновенно наносится урон по формуле 'Уровень способности Х 2 х ловкость героя, включая бонусы на момент каста', вроде все верно но не мешало бы использовать переменные и вычислить урон 1 раз, не делая рассчет 2 раза, для функции урона и для функции текстага.
Если вам нужен урон с учетом резиста - тут нужен отдельный триггер с событием юнит получает урон, условием что урон выше 0, ну и действием записать входящий урон в глобальную переменную, из которой вы прочитаете кол-во урона с учетом резистов в своем триггере, т.к событие урона сработает раньше реального нанесения урона.