32

» WarCraft 3 / Как сделать так чтоб игрок не мог видеть/управлять юнитом?

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

» WarCraft 3 / Определить юнита под курсором (MemHack)

DracoL1ch, такс, а оно же локальное....
RMem[Rmem[gamedll+AB4F80]+1B4]+14
Кстати вроде же была тема с похожим вопросом.
32

» WarCraft 3 / Фаталит карта

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

» WarCraft 3 / Фаталит карта

ScopteRectuS, TimedLife с баффом BTLF не не слышал?, при смерти рили можно хайдить, труп разложится как положено.
32

» WarCraft 3 / Фаталит карта

ScopteRectuS, а вот хрен его знает, пытайся повторить фатал, бери героя, юзай его способности по кд, пока не фатальнет, пиши лог.
Тогда станет понятно наверняка.
32

» WarCraft 3 / Фаталит карта

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

» WarCraft 3 / Фаталит карта

ScopteRectuS, а вручить сразу то не судьба?
Это вовсе странно нахрена делать в коде то что, изи делается в РО?
32

» WarCraft 3 / Фаталит карта

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

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

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

» WarCraft 3 / Строение структур

Нука попробуй добавить в action функцию с аргументами!
Хз, мб какой какая то конструкция юзает действия триггеров, или это своего рода массив code, т.к мы не можем обьявить массивом code, а следовательно хранить массив функций тоже нельзя...
Ну тут кондишены и экшены триггера этакий массив, Condtion(function) еще примечателен тем, что он не вызывает утечку типа triggercondition т.к акшин триггера навсегда остаётся висеть в боллекспре, triggeraction же нужно обязательно удалять, иначе будут утечки.
Это в том случаи если триггеры создаются и удаляются динамически.
Не было тогда еще мемхака, а о ретунд баге знали очень мало, а так же что он ненадежен (его пофиксят).
Сейчас вовсе можно без этих методов обойтись и передать инт в функцию, к примеру как тут.
32

» WarCraft 3 / Строение структур

Триггеры принимают болекспры - для этого Condition, не соответствие типов при возврате == фатал.
32

» WarCraft 3 / Строение структур

Принятый ответ
TriggerEvalute наследует поток из которого запущен, а так же проверяет условие триггера, возвращая результат.
Мб. так было проще передавать аргумент. т.к триггер и поток из которого мы запустили триггер один, т.е работают GetTriggUnit\GetExpiredTimer и так далее.
32

» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?

ScopteRectuS, нет. Явного ограничения нету, но все упирается в память.
Миллионы триггеров ненормально! У вас что то нетак, подумайте над этим на досуге.
32

» WarCraft 3 / Поиск именных структур

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

» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?

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

» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?

GRESHNIK1, все ваши красивые гуи - переводятся в jass интерпретатором в момент сохранения карты, все триггеры - это такие обьекты, как к примеру юниты которых вы видите, триггеры нужно сначала создать, потом добавить в них события и дейсвия, а их овер дофига.
Для инициализации гуи триггеров используется отдельная функция InitCustomTriggers( ), в нее записываются все триггеры которые нужно создать, перед стартом игры, в момент когда загрузка почти завершилась. В jass есть лимит операций, когда в одной функции очень много действий, которые превышают этот лимит, функция считается зависшей, и движок перестает её выполнять. Вот почему триггеры перестали работать - да их просто не создали.
Потом вопрос зачем вам столько триггеров?
32

» WarCraft 3 / Есть ли ограничение по числу триггеров, областей или переменных?

Есть лимит операций, а так же кривое гуи.
Вы превысили лимит операций напихав 100500 триггеров которые, функция инициализации которых уходит в обрыв потока, т.к превышает лимит операций потока.
Выход, подумывать о переходе на jass или более правильно использовать триггеры, не создавая овер 100500 штук.
32

» WarCraft 3 / Как сделать свиток телепорта из доты?

Darknessay, Канал не чанеллистя в предметах и точка, это могут лишь некоторые абилки.
Пробуй юзнуть Звездопад (Starfall ), Вейты не юзай, иначе ничего работать не будет никогда!
32

» WarCraft 3 / Иконки способностей для предметов

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

» WarCraft 3 / Как сделать свиток телепорта из доты?

Darknessay, оно и неудивительно. Где триггер с событием юнит завершает применение способности, юнит начинает применять способность, триггер время истекло.
Все вейты нафиг удаляем, это никогда не будет работать...
Необходимо отловить начало каста, потом следить сбили ли каст и найти ближайшее здание возле точки телепорта, если время вышло и юниту не сбили телепорт, переместить юнита в ближашую точку возде здания, иначе ничего не делать...
код свитка из доты
//Calls:
//    M7I
//    Q3I
//Functions as argument:
//    ZWO
function ZXO takes nothing returns boolean
    local trigger t = GetTriggeringTrigger()
    local integer MDI = GetHandleId(t)
    local unit MJI = LoadUnitHandle(XY, MDI, 14)
    local unit TFI = LoadUnitHandle(XY, MDI, 17)
    local real x = LoadReal(XY, MDI, 6)
    local real y = LoadReal(XY, MDI, 7)
    local unit ZHO = LoadUnitHandle(XY, MDI, 448)
    local unit ZZO = LoadUnitHandle(XY, MDI, 447)
    local ubersplat O11 = LoadUbersplatHandle(XY, MDI, 131)
    local integer M4I = LoadInteger(XY, MDI, 34)
    local real BH1 = LoadReal(XY, MDI, 57)
    local real EJ1 = LoadReal(XY, MDI, 442)
    local integer id = GetPlayerId(GetOwningPlayer(MJI))
    local boolean ZVO = false
    local integer i = 0
    local integer CS1

    if GetTriggerEventId() == EVENT_UNIT_SPELL_ENDCAST then
        if GetSpellAbilityId() == 'A231' then
            call DestroyEffect(LoadEffectHandle(XY, MDI, 175))
            call DestroyEffect(LoadEffectHandle(XY, MDI, 176))
            call DestroyEffect(LoadEffectHandle(XY, MDI, 177))
            call SaveInteger(XY, GetHandleId(MJI), 4256, 2)
            call KillUnit(ZHO)
            call KillUnit(ZZO)
            call DestroyUbersplat(O11)
            call FlushChildHashtable(XY, MDI)
            call M7I(t)
            call UnitRemoveType(TFI, UNIT_TYPE_PEON)
        endif
    elseif GetTriggerEventId() == EVENT_UNIT_DEATH then
        call DestroyEffect(LoadEffectHandle(XY, MDI, 175))
        call DestroyEffect(LoadEffectHandle(XY, MDI, 176))
        call DestroyEffect(LoadEffectHandle(XY, MDI, 177))
        call UnitRemoveType(TFI, UNIT_TYPE_PEON)
        call SaveInteger(XY, GetHandleId(MJI), 4256, 2)
        call KillUnit(ZHO)
        call KillUnit(ZZO)
        call DestroyUbersplat(O11)
        call FlushChildHashtable(XY, MDI)
        call M7I(t)
    else
        call DestroyEffect(LoadEffectHandle(XY, MDI, 175))
        call DestroyEffect(LoadEffectHandle(XY, MDI, 176))
        call DestroyEffect(LoadEffectHandle(XY, MDI, 177))
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTarget.mdl", GetUnitX(MJI), GetUnitY(MJI)))
        call SaveInteger(XY, GetHandleId(MJI), 4256, 2)
        call KillUnit(ZHO)
        call KillUnit(ZZO)
        call DestroyUbersplat(O11)
        call FlushChildHashtable(XY, MDI)
        call M7I(t)
        call UnitRemoveType(TFI, UNIT_TYPE_PEON)
        call Q3I(GetUnitX(TFI) - 1, GetUnitY(TFI) - 1, 240)
        call SetUnitX(MJI, GetUnitX(TFI) - 1)
        call SetUnitY(MJI, GetUnitY(TFI) - 1)
        call PauseUnit(MJI, true)
        call PauseUnit(MJI, false)
        set CK = MJI
        call ExecuteFunc("ZWO")
        call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTarget.mdl", GetUnitX(MJI), GetUnitY(MJI)))
    endif
    set t = null
    set MJI = null
    set ZHO = null
    set ZZO = null
    set O11 = null
    set TFI = null
    return false
endfunction

//Calls:
//    N7I
//    ZAO
//    PII
//    R1I
//    R5I
//    Z5O
//    Z6O
//    Z4O
//    Z3O
//    QAI
//    I51
//Functions as argument:
//    ZGO
function ZYO takes nothing returns nothing
    local unit MJI = GetTriggerUnit()
    local unit TFI = GetSpellTargetUnit()
    local location l
    local real x
    local real y
    local real a
    local trigger t
    local integer MDI
    local unit ZHO
    local unit ZZO
    local ubersplat O11
    local integer id = GetPlayerId(GetOwningPlayer(MJI))
    local integer M4I
    local real ZJO

    set t = CreateTrigger()
    set MDI = GetHandleId(t)
    call SaveInteger(XY, GetHandleId(MJI), 4256, 1)
    if TFI == null then
        set l = GetSpellTargetLoc()
        set x = GetLocationX(l)
        set y = GetLocationY(l)
        if x == LU0[id] and y == M00[id] then
            if N7I(GetOwningPlayer(MJI)) then
                set x = GetUnitX(LQ)
                set y = GetUnitY(LQ)
            else
                set x = GetUnitX(BF0)
                set y = GetUnitY(BF0)
            endif
        endif
        set TFI = ZAO(MJI, x, y)
        call RemoveLocation(l)
    else
        set x = GetUnitX(TFI)
        set y = GetUnitY(TFI)
    endif
    if PII(x, y, GetUnitX(TFI), GetUnitY(TFI)) > M50 then
        set a = Atan2(y - GetUnitY(TFI), x - GetUnitX(TFI))
        set x = GetUnitX(TFI) + M50 * Cos(a)
        set y = GetUnitY(TFI) + M50 * Sin(a)
    elseif PII(x, y, GetUnitX(TFI), GetUnitY(TFI)) < 50 then
        set a = Atan2(y - GetUnitY(TFI), x - GetUnitX(TFI))
        set x = GetUnitX(TFI) + 120 * Cos(a)
        set y = GetUnitY(TFI) + 120 * Sin(a)
    endif
    if IsPointInRegion(XN, x, y) == true then
        set a = Atan2(y - GetUnitY(TFI), x - GetUnitX(TFI))
        set x = GetUnitX(TFI) + 200 * Cos(a)
        set y = GetUnitY(TFI) + 200 * Sin(a)
    endif
    set x = R1I(x)
    set y = R5I(y)
    if (IsUnitAlly(MJI, GetLocalPlayer()) and GetLocalPlayer() != GetOwningPlayer(MJI)) or (C2 and (GetLocalPlayer() == D10 or GetLocalPlayer() == DO0)) then
        call PingMinimapEx(x, y, 3, 255, 255, 255, false)
    endif
    set ZZO = CreateUnit(GetOwningPlayer(MJI), Z5O(id), x, y, 0)
    set ZHO = CreateUnit(GetOwningPlayer(MJI), Z6O(id), GetUnitX(MJI), GetUnitY(MJI), 0)
    set O11 = CreateUbersplat(GetUnitX(MJI), GetUnitY(MJI), "SCTP", 255, 255, 255, 255, false, false)
    if IsUnitVisible(MJI, GetLocalPlayer()) == true then
        call SetUbersplatRenderAlways(O11, true)
    else
        call SetUbersplatRenderAlways(O11, false)
    endif
    set M4I = Z4O(GetPlayerId(GetOwningPlayer(MJI)), x, y)
    set ZJO = 3
    if M4I > 0 then
        set ZJO = 4.5 + 0.5 * M4I
    endif
    call Z3O(GetPlayerId(GetOwningPlayer(MJI)), x, y)
    if M4I > 0 then
        call SetUnitAnimationByIndex(ZHO, 2)
        call SetUnitAnimationByIndex(ZZO, 2)
    endif
    call TriggerRegisterTimerEvent(t, ZJO - 3, false)
    call TriggerRegisterTimerEvent(t, ZJO, false)
    call TriggerRegisterUnitEvent(t, MJI, EVENT_UNIT_SPELL_ENDCAST)
    call TriggerAddCondition(t, Condition(function ZGO))
    call QAI(GetOwningPlayer(MJI), ZJO, x, y, 200)
    call SaveUnitHandle(XY, MDI, 447, ZZO)
    call SaveUnitHandle(XY, MDI, 448, ZHO)
    call SaveReal(XY, MDI, 6, (x * 1.0))
    call SaveReal(XY, MDI, 7, (y * 1.0))
    call SaveReal(XY, MDI, 442, (TimerGetElapsed(M) * 1.0))
    call SaveReal(XY, MDI, 57, (ZJO * 1.0))
    call SaveUbersplatHandle(XY, MDI, 131, O11)
    call SaveUnitHandle(XY, MDI, 14, MJI)
    call SaveInteger(XY, MDI, 34, 0)
    call I51(MJI, XF, x, y, 2400)
    set MJI = null
    set TFI = null
    set ZHO = null
    set ZZO = null
    set l = null
    set t = null
    set O11 = null
endfunction

//Calls:
//    N7I
//    ZFO
//    QAI
//    I51
//Functions as argument:
//    ZXO
function ZKO takes nothing returns nothing
    local unit MJI = GetTriggerUnit()
    local unit TFI = GetSpellTargetUnit()
    local location l
    local real x
    local real y
    local real a
    local trigger t
    local integer MDI
    local unit ZHO
    local unit ZZO
    local ubersplat O11
    local integer id = GetPlayerId(GetOwningPlayer(MJI))
    local integer M4I
    local real ZJO

    set t = CreateTrigger()
    set MDI = GetHandleId(t)
    if TFI == null then
        set l = GetSpellTargetLoc()
        set x = GetLocationX(l)
        set y = GetLocationY(l)
        if x == LU0[id] and y == M00[id] then
            if N7I(GetOwningPlayer(MJI)) then
                set x = GetUnitX(LQ)
                set y = GetUnitY(LQ)
            else
                set x = GetUnitX(BF0)
                set y = GetUnitY(BF0)
            endif
        endif
        set TFI = ZFO(MJI, x, y)
        call RemoveLocation(l)
    endif
    call SaveInteger(XY, GetHandleId(MJI), 4256, 1)
    set x = GetUnitX(TFI)
    set y = GetUnitY(TFI)
    if (IsUnitAlly(MJI, GetLocalPlayer()) and GetLocalPlayer() != GetOwningPlayer(MJI)) or (C2 and (GetLocalPlayer() == D10 or GetLocalPlayer() == DO0)) then
        call PingMinimapEx(x, y, 3, 255, 255, 255, false)
    endif
    set O11 = CreateUbersplat(GetUnitX(MJI), GetUnitY(MJI), "SCTP", 255, 255, 255, 255, false, false)
    if IsUnitVisible(MJI, GetLocalPlayer()) == true then
        call SetUbersplatRenderAlways(O11, true)
    else
        call SetUbersplatRenderAlways(O11, false)
    endif
    set ZJO = 3
    call UnitAddType(TFI, UNIT_TYPE_PEON)
    call TriggerRegisterTimerEvent(t, ZJO, false)
    call TriggerRegisterUnitEvent(t, MJI, EVENT_UNIT_SPELL_ENDCAST)
    call TriggerRegisterUnitEvent(t, TFI, EVENT_UNIT_DEATH)
    call TriggerAddCondition(t, Condition(function ZXO))
    call QAI(GetOwningPlayer(MJI), ZJO, x, y, 200)
    call SaveReal(XY, MDI, 6, (x * 1.0))
    call SaveReal(XY, MDI, 7, (y * 1.0))
    call SaveReal(XY, MDI, 442, (TimerGetElapsed(M) * 1.0))
    call SaveReal(XY, MDI, 57, (ZJO * 1.0))
    call SaveUbersplatHandle(XY, MDI, 131, O11)
    call SaveUnitHandle(XY, MDI, 14, MJI)
    call SaveUnitHandle(XY, MDI, 17, TFI)
    call SaveInteger(XY, MDI, 34, 0)
    call SaveEffectHandle(XY, MDI, 175, AddSpecialEffectTarget("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl", MJI, "origin"))
    call SaveEffectHandle(XY, MDI, 176, AddSpecialEffectTarget("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportCaster.mdl", MJI, "origin"))
    call SaveEffectHandle(XY, MDI, 177, AddSpecialEffectTarget("Abilities\\Spells\\Human\\MassTeleport\\MassTeleportTo.mdl", TFI, "origin"))
    call I51(MJI, XF, x, y, 2400)
    set MJI = null
    set TFI = null
    set ZHO = null
    set ZZO = null
    set l = null
    set t = null
    set O11 = null
endfunction

//Calls:
//    STI
//    ZYO
//    ZKO
function ZLO takes nothing returns nothing
    if GetSpellAbilityId() == 'A1R5' and STI(GetTriggerUnit()) == false then
        call ZYO()
    endif
    if GetSpellAbilityId() == 'A231' then
        call ZKO()
    endif
endfunction
А вот сам спелл.
Загруженные файлы