32

» WarCraft 3 / как мне тригерно опустить юнита ниже 0 я пробывал написать -…

У каждого юнита в настройках есть минимальная высота, ниже которой нельзя его опускать, вводим отрицательную...
32

» WarCraft 3 / Что быстрее?

Скачивам мемхак анрайза и чекаем, там бенчмарк есть на такие вещи...
32

» WarCraft 3 / Как заставить юнита использовать свою способность в синематике!

Обычно герои в сениматиках способности вовсе не применяют, просто им приказывают проиграть Spell анимацию, ну а дальше создают в нужной точке красивый эффект, это позволяет настроить сцену как следует по по вкусу и продолжительности. Но можно изначально выучить водного элементаля и приказать герою выполнить приказ "Архимаг - Вызов духа воды", разумеется способность должна быть изучена и быть достаточно маны.
Ну а можно просто проиграть анимацию заклинания герою, и в нужной точке через N сек создать водного элементаля и проиграть ему birth анимацию, в таком случае дух воды появится в нужной точке а не где то рядом с героем + можно сразу ему настроить угол взгляда и прочие параметры, вплоть до скорости анимаций.
Ну а в отдельных случаях вовсе используют "Дамми юнитов", скажем во время синиматика рыцарь смерти на коне не останавливаясь бросает Лик смерти в Убегащего крестьянина, в этом случаи рыцарь смерти - не герой а не способный ходить дамми юнит с дальней атакой, в виде Лика смерти, а двигают по сцене его кодом, приказывая атаковать 1 раз в нужный момент, ну и создают отдельный триггер который срабатывает в момент получения урона крестьянином чтобы прорграть на нем нужную анимацию и создать скелета...
32

» WarCraft 3 / Replace

А зачем их реплейсить, темболее это здания. Можно же им золото ставить сколько хочешь, скрывать\показывать и так далее.
32

» WarCraft 3 / Как проверить что все игроки загрузились в игру

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

» WarCraft 3 / Неправильное срабатывание групп. Столкнулся с такой…

Поэтому вместо цикла юзайте ForGroup, особенно если работайте с уже созданными группами в которых может удалились юниты каким то другим куском кода, цикл + FirstOfGroup хороши лишь для мгновенный действий к примеру в спеллах, всем в аое сразу дмг нанесли. А вот если вы храните в группе допустим всех кого задел спелл и повесил дебафф, то определенно ForGroup, так же проверяем чему равен GetEnumUnit(), в целом не было бы лишним в таких спеллах где вы храните всех юнитов под его действием добавляеть и событие триггера на диспел или смерть юнита, чтобы удалять таких юнитов из группы.
32

» WarCraft 3 / [MemoryHack] Damage Handler

SAND, ну я вот для доты такой хак юзаю:
function InitAttackDamageCalculationHook takes integer pTriggerHandle returns nothing
    local integer old1 = RMem( pMeleeAttackCatcher )
    local integer old2 = RMem( pMeleeAttackCatcher + 4 )
    local integer oldprotection = ChangeOffsetProtection( pMeleeAttackCatcher, 8, 0x40 )
    
    call WMem( pReservedMemoryForMeleeAttackHook + 0, 0x30498B60 )
    call WMem( pReservedMemoryForMeleeAttackHook + 4, 0x000000BB )
    call WMem( pReservedMemoryForMeleeAttackHook + 8, 0xE80B8900 )
    call WMem( pReservedMemoryForMeleeAttackHook + 5, DataArray1Address + 260 )// source address
    call WMem( pReservedMemoryForMeleeAttackHook + 12, ( pToJUnit ) - ( pReservedMemoryForMeleeAttackHook + 12 ) - 4 )
    call WMem( pReservedMemoryForMeleeAttackHook + 16, 0x000000BB )
    call WMem( pReservedMemoryForMeleeAttackHook + 20, 0x61038900 )
    call WMem( pReservedMemoryForMeleeAttackHook + 17, pGlobalUnitArrayForDataPassing + 12 )// source l__udg_GlobalUnitArrayForDataPassing[3]
    call WMem( pReservedMemoryForMeleeAttackHook + 24, 0x6C798160 )
    call WMem( pReservedMemoryForMeleeAttackHook + 28, 0xFFFFFFFF )
    call WMem( pReservedMemoryForMeleeAttackHook + 32, 0xC1833a74 )
    call WMem( pReservedMemoryForMeleeAttackHook + 36, 0x0000E86C )
    call WMem( pReservedMemoryForMeleeAttackHook + 40, 0xC88B0000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 38, pGetAgentInternal - ( pReservedMemoryForMeleeAttackHook + 38 ) - 4 )
    call WMem( pReservedMemoryForMeleeAttackHook + 44, 0x000000B8 )
    call WMem( pReservedMemoryForMeleeAttackHook + 48, 0x8B088900 )
    call WMem( pReservedMemoryForMeleeAttackHook + 45, DataArray1Address + 264 )//66 target address
    call WMem( pReservedMemoryForMeleeAttackHook + 52, 0x1C5B8B19 )
    call WMem( pReservedMemoryForMeleeAttackHook + 56, 0x00BBD3FF )
    call WMem( pReservedMemoryForMeleeAttackHook + 60, 0x89000000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 59, DataArray1Address + 268 )//67 target type
    call WMem( pReservedMemoryForMeleeAttackHook + 64, 0x00E89003 )
    call WMem( pReservedMemoryForMeleeAttackHook + 68, 0xBB000000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 67, pToJUnit - ( pReservedMemoryForMeleeAttackHook + 67 ) - 4 )
    call WMem( pReservedMemoryForMeleeAttackHook + 72, pGlobalUnitArrayForDataPassing + 16 )//4 target handle
    call WMem( pReservedMemoryForMeleeAttackHook + 76, 0x00BB0389 )
    call WMem( pReservedMemoryForMeleeAttackHook + 80, 0xC7000000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 79, DataArray1Address + 272 )//68 result
    call WMem( pReservedMemoryForMeleeAttackHook + 84, 0x00000103 )
    call WMem( pReservedMemoryForMeleeAttackHook + 88, 0x0BEB9000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 92, 0x000000BB )
    call WMem( pReservedMemoryForMeleeAttackHook + 96, 0x0003C700 )
    call WMem( pReservedMemoryForMeleeAttackHook + 93, DataArray1Address + 272 )//68 result
    call WMem( pReservedMemoryForMeleeAttackHook + 100, 0x61000000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 104, 0x90909060 )
    call WMem( pReservedMemoryForMeleeAttackHook + 108, 0x00000068 )
    call WMem( pReservedMemoryForMeleeAttackHook + 112, 0x0000B800 )
    call WMem( pReservedMemoryForMeleeAttackHook + 109, pTriggerHandle )
    call WMem( pReservedMemoryForMeleeAttackHook + 116, 0xD0FF0000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 114, pTriggerExecute )
    call WMem( pReservedMemoryForMeleeAttackHook + 120, 0x6104C483 )
    call WMem( pReservedMemoryForMeleeAttackHook + 124, 0x8B575651 )
    call WMem( pReservedMemoryForMeleeAttackHook + 128, 0xB8BE8BF1 )
    call WMem( pReservedMemoryForMeleeAttackHook + 132, 0x8B000002 )
    call WMem( pReservedMemoryForMeleeAttackHook + 136, 0x00ACBE84 )
    call WMem( pReservedMemoryForMeleeAttackHook + 140, 0x84030000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 144, 0x0000A0BE )
    //call WMem( pReservedMemoryForMeleeAttackHook + 148, 0x8C860300 )
    //call WMem( pReservedMemoryForMeleeAttackHook + 152, 0x8B000000 )
    
    //call WMem( pReservedMemoryForMeleeAttackHook + 156, 0x00008C8E )
    //call WMem( pReservedMemoryForMeleeAttackHook + 160, 0x988E8900 )
    //call WMem( pReservedMemoryForMeleeAttackHook + 164, 0xC7000000 )
    
    //call WMem( pReservedMemoryForMeleeAttackHook + 168, 0x00008C86 )
    //call WMem( pReservedMemoryForMeleeAttackHook + 172, 0x00000000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 148, 0xBE8C8B00 )
    call WMem( pReservedMemoryForMeleeAttackHook + 152, 0x00000094 )
    call WMem( pReservedMemoryForMeleeAttackHook + 156, 0x88BE948B )
    call WMem( pReservedMemoryForMeleeAttackHook + 160, 0xE9000000 )
    call WMem( pReservedMemoryForMeleeAttackHook + 164, ( pMeleeAttackRetun ) - ( pReservedMemoryForMeleeAttackHook + 164 ) - 4 )
    
    call WMem( pMeleeAttackCatcher, 0xE9E9E9E9 )
    call WMem( pMeleeAttackCatcher + 4, 0x90909090 )
    
    call WMem( pMeleeAttackCatcher + 1, pReservedMemoryForMeleeAttackHook - pMeleeAttackCatcher - 5 )
    
    call ChangeOffsetProtection( pMeleeAttackCatcher, 8, oldprotection )
endfunction

function OnAttackerDeath takes nothing returns boolean
    local unit dying = GetTriggerUnit( )
    local integer id
    if IsUnitInGroup( dying, MissGroup ) then
        set id = GetHandleId( dying )
        call GroupRemoveUnit( MissGroup, dying )
        call RemoveSavedInteger( HashData, ExMissPrdKey, id )
        call RemoveSavedReal( HashData, ExMissCdTime, id )
    endif
    
    if GetUnitTypeId( dying ) =='Opgh' and IsUnitIllusion( dying ) then
        set id = GetHandleId( dying )
        call RemoveSavedInteger( HashData, id, 823 )
        call RemoveSavedReal( HashData, ExCounerBool, id )
    endif
    if IsUnitType( dying, UNIT_TYPE_SAPPER ) then
        call UnitRemoveType( dying, UNIT_TYPE_SAPPER )
        call RemoveSavedInteger( HashData, ExMultishoTarg, GetHandleId(dying) )
    endif

    set dying = null
    return false
endfunction

function InitMMEhack takes nothing returns nothing
    local trigger trig
    call PresetSomeArray( )
    set pReservedMemoryForMeleeAttackHook = pfast_call_1 + 300
    set pGlobalUnitArrayForDataPassing = RMem( GetUnitArrayAddress( ) + 0xC )
    set DataArray1Address = RMem( GetDataArrayAAddress( ) + 0xC )
    set OnAttack = CreateTrigger( )
    call TriggerAddAction( OnAttack, function OnAttackDamageActions )
    call InitAttackDamageCalculationHook( GetHandleId( OnAttack ) )
    set DummyBlinder = CreateUnit( Player( 15 ), DUMMY, 0.00, 0.00, 270.00 )
    call UnitAddAbility( DummyBlinder, 'A15A' )
    set trig = CreateTrigger( )
    set MissGroup = CreateGroup( )
    call TriggerAddCondition( trig, Condition( function OnAttackerDeath ) )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 0 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 1 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 2 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 3 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 4 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 5 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 6 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 7 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 8 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 9 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 10 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 11 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 12 ), EVENT_PLAYER_UNIT_DEATH, null )
    call TriggerRegisterPlayerUnitEvent( trig, Player( 15 ), EVENT_PLAYER_UNIT_DEATH, null )
    set trig = null
endfunction
32

» WarCraft 3 / [MemoryHack] Damage Handler

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

» WarCraft 3 / [MemoryHack] Damage Handler

Хм, а миссы же до урона рисуются, как и спелл нигейшин срабатывет?
32

» WarCraft 3 / какими способами лечить карты для заливки на epicwar?

Не думаю что проблема в картах, темболее епик там особо не лезит, W3i максимум прочитает (его некоторые спазлеры портили, но это бага а не фитча).
32

» WarCraft 3 / Можно ли как-то узнать версию игры через триггеры? Там же в…

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

(есть рефаундовские версии без записи в память, на хайве лежат)
32

» WarCraft 3 / Как добавить listfile в карту? [депротект]

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

» WarCraft 3 / Как добавить listfile в карту? [депротект]

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

» WarCraft 3 / Есть ли способ удалить событие из триггера? Если в триггере…

Ничего страшного не произойдет, дота тому пример. Вот у триггеров действия trigger action не удаляются, если их отдельно не сохранить и удалить. Строки тоже не удаляются если чо, ну с этим все живут и никто не умер)
32

» WarCraft 3 / При заходе или выходе из подземелья в кампании Рексара, всем…

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

» WarCraft 3 / Есть ли какие-то хитрые способы приказать юниту строить…

WilliamBz, ну как рект создаешь размером чтобы лесопилка влазила, и все переносишь рект по точкам, и проверяешь можно ли в нем строить или нет, ну и так в цикле штук 20 точек вокруг дерева проверяешь с рандомным смещением, в первое свободное приказываешь строить.Если в области есть криттеры - приказываешь сперва работника атаковать их, потом строить как сдохнут.
32

» WarCraft 3 / Как разрешить несколько орб-эффектов?

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

» WarCraft 3 / Есть ли какие-то хитрые способы приказать юниту строить…

Отдать приказ добывать древесину, он пойдет к ближайшему дереву, найти вблизи этого дерева свободное для строительсва место, и приказать строить там лесопилку.
32

» WarCraft 3 / [JASS] - Цепная Молния

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

» WarCraft 3 / [JASS] - Цепная Молния

LastUchiha, точка начала атаки юнита, в редакторе у юнита есть 3 координаты, это смещение от центра модели для места откуда вылетает дальний снаряд, или спелл, в том числе молния, ну а молния бьет юнитов не в ноги а в этот самый ImpactZ.
function GetUnitZ takes unit u returns real
call MoveLocation( TempLoc, GetUnitX( u ), GetUnitY( u ) )
return ( GetUnitImpactZ( u ) + GetLocationZ( TempLoc ) + GetUnitFlyHeight( u ) ) * 1.00
endfunction
Если мемхак не юзать, то импакт координаты просто базой данных делаются.
32

» WarCraft 3 / [JASS] - Цепная Молния

Z молнии не правильно определяется, нет Impaсt xyz для кастера как у дефолтных молний.