28

» WarCraft 3 / Правка урона

вы оба не учитываете это
А, ты про ситуацию, когда полный урон убивает, а сниженный нет? Да, не подумал.
28

» WarCraft 3 / Правка урона

Классический способ:
В чём проблема через 0 секунд просто восполнить здоровье в размере полученного урона, если юнит всё ещё жив?
28

» WarCraft 3 / Правка урона

исцелить юнита на этот процент урона
Урон в EVENT_UNIT_DAMAGED наносится после завершения триггера, потому следует либо восполнить хп с помощью таймера в 0 секунд, либо способом Hate.
EVENT_PLAYER_UNIT_DAMAGING
Стоит отметить, что в триггере с таким событием урон снизится до вычета брони.
28

» WarCraft 3 / Создание проклятого рудника через триггеры

WestTiger, триггеры вообще открывал?
Найти ближайший рудник можно с помощью такого кастомого скрипта.
set Mine = MeleeFindNearestMine(startLoc, bj_MELEE_MINE_SEARCH_RADIUS)
Где startLoc - стартовая позиция игрока.
Загруженные файлы
28

» WarCraft 3 / AdicHelper?

А в чём проблема переменной без значения?
При обращении к переменной без значения поток обрывается. Вот у массивов все ячейки имеют дефолтное значение, обычнве переменные нет.
Vlod, а какая ошибка?
28

» WarCraft 3 / AdicHelper?

Vlod, ты всегда пытаешься использовать переменную без значения. Это ошибка. Во втором случае ты пытаешь использовать не определённую переменную, о чём и говорит парсер. Скачай новый pjass.exe, он укажет и на ошибки в оставшися случаях.
28

» WarCraft 3 / Как сделать для каждого игрока отдельный MultiBoard?

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

» WarCraft 3 / Ошибка в описании спасобности

Принятый ответ
Kanteu, у тебя в описаниях стоит код AUdc, тебе нужно его заменить на равкод твоей способности. Чтобы его узнать, выдели способность и нажми Ctrl+D. Перед двоеточием будет равкод способности.
28

» WarCraft 3 / Способности прыгают со своего места

MKDimon, если в спелбуке должно быть X заклинаний, то ты должен поставить минимум и максимум на X.
28

» WarCraft 3 / Хеш-таблица и юнит

Принятый ответ
действительно, почему же не работает?
Это вообще никак не влияет. Ты ещё скажи, что set a = a + 1 не работает.

Дело может быть в том, что юнит за 10 секунд разлагается.
немного исправленный код
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local unit dead = LoadUnitHandle (udg_hash, s, 6)
    call FlushChildHashtable(udg_hash, s)
    call CreateUnit(GetOwningPlayer(dead), GetUnitTypeId(dead), GetUnitX(dead), GetUnitY(dead), GetUnitFacing(dead))
    call DestroyTimer(t)
    set dead = null
    set t = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()                      //Присваиваем убитого юнита
    local timer t = CreateTimer()                              //Создаём таймер
    local integer s = GetHandleId(t)                         //Узнаём его ID
    call SaveUnitHandle(udg_hash, s, 6, dead)       //Сохраняем юнита 
    call TimerStart(t, 10, false, function Reborn)        //Активируем одноразовый таймер на 10 секунд
    set dead = null
    set t = null
endfunction
код с учётом разложения
function Reborn takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer s = GetHandleId(t)
    local player p = LoadPlayerHandle(udg_hash, s, 0)
    local integer id = LoadInteger(udg_hash, s, 0)
    local real x = LoadReal(udg_hash, s, 0)
    local real y = LoadReal(udg_hash, s, 1)
    local real f = LoadReal(udg_hash, s, 2)
    call CreateUnit(p, id, x, y, f)
    call FlushChildHashtable(udg_hash, s)
    call DestroyTimer(t)
    set t = null
    set p = null
endfunction

function Trig_Kill_Unit_Actions takes nothing returns nothing
    local unit dead = GetTriggerUnit()
    local timer t = CreateTimer()
    local integer s = GetHandleId(t)
    call SavePlayerHandle(udg_hash, s, 0, GetOwningPlayer(dead))
    call SaveInteger(udg_hash, s, 0, GetUnitTypeId(dead))
    call SaveReal(udg_hash, s, 0, GetUnitX(dead))
    call SaveReal(udg_hash, s, 1, GetUnitY(dead))
    call SaveReal(udg_hash, s, 2, GetUnitFacing(dead))
    call TimerStart(t, 10, false, function Reborn)
    set dead = null
    set t = null
endfunction
28

» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один

8gabriel8, простая оптимизация. Очень легко делается, а при срабатывании триггера проверяются не все условия.
Можно сделать по другому, для каждого спела в соответствие поставить триггер и вызывать его, передавая аргументы через глобалки.
28

» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один

То есть в "То - Действия" нужно после всех моих действий там вписывать Skip remaining actions, чтобы оно пропускало "Иначе - действия", т.к там у меня ничего нет. Да ?
Условия на то и условия, что либо выполнится ветка then, либо ветка else. Black Soul верно ответил, это для того, чтобы другие условия пропускались. На твоём скриншоте код выглядит так.
код
If something1 then
    // actions
endif

if something2 then
    // actions
endif
В этом случае, даже если something1 = true, второе условие будет всё равно проверятся. Тебе же нужно, чтобы при обнаружении нужного условия остальные не выполнялись. Потому нужно сделать так.
код
If something1 then
    // actions
    return
endif

if something2 then
    // actions
    return  // Если это условие в самом конце, то return необязателен.
endif
От этого смысла примерно столько же, как от удаления действия Do nothing. То есть вообще незаметно.
?
28

» WarCraft 3 / Десинк с Preloader'ом

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

» WarCraft 3 / Десинк с Preloader'ом

Скорее всего не у всех есть такой файл. Потому для одного игрока юнит создаётся, а для других нет.
28

» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один

Skip remaining actions
Это просто return в JASS, вот и всё, после этого слова триггер завершается, так как триггер в GUI состоит из одной функции.
А диалоги багнуты чутка, их лучше всего скрывать через EnableUserInterface.
28

» WarCraft 3 / Передвижение юнитов через спел на Хеш-таблице

8gabriel8, он же ссылку кинул.
Black Soul:
полностью все заклинание.
Я пока вижу только проблему, когда в одну цель несколько похищений.
28

» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один

В каком смысле криво ?
В Jass.
If something then

elseif something then

elseif something then

else

endif
В GUI можно сделать только так.
If something then

else
    if something then

    else

    endif
endif
Прикрепил скрин триггера, правильно ли я делаю ?
Почти. Убери Do nothing, а в каждый Then добавь в самый конец Skip remaining actions. Или делай ветвление if\then\else, но это некрасиво.
28

» WarCraft 3 / Передвижение юнитов через спел на Хеш-таблице

просто займет оно очень много времени и сил, т.к. оно слишком громоздкое и учитывает много всего.
Не думаю, на сайте есть наработка сохранения молний через хеш, её чуть под себя обновить и 50% готово.
NazarPunk:
Хватит всем набирать код руками, ноги выбор мастеров.
Выходит, что Lua - это ноги? Я думал, что наоборот.
28

» WarCraft 3 / Нужно ли собирать триггеры с одинаковым условием в один

Принятый ответ
Или заменяются только те, у которых не написано "Реакция на событие"
Заменяются все глобальные переменные. Например, последний созданный юнит - глобальная переменная. Реакции на событие всегда нативки, но вот что из них перезаписывается, а что нет - не могу сказать, надо тестировать вручную.
GetLocalPlayer:
но на практике это не имеет смысла.
Имеет большой смысл, потому что 1 триггер проще дебажить, что 100500. Более того, события могут конфликтовать, так как триггер с удалением юнита может сработать раньше, и для всех других триггеров с таким же событием юнита уже не будет. Что уж говорить про события каста.
GetLocalPlayer:
Между тем есть такая вещь как лимит операций, в который ты можешь когда-нибудь упереться если делать все через один триггер.
Скорее лимит операций будет достигнут во время инициализации при 100500 триггеров, чем при 1 триггере с if\then\else. А тут ещё есть Lua, где можно нормально сохранять функции, так что даже if\then\else не нужен. Аналогично, но немного хуже можно сделать и на Jass.

crusader556, делать надо так, как будет удобней. На GUI if\then\else сделан криво, потому удобнее будет делать несколько триггеров. Но тогда надо будет следить за ними, чтобы они не конфликтовали.
28

» WarCraft 3 / Ох уж эти Хеш-таблицы

Принятый ответ
Стас Орлов, ну ты же как-то прикрепил группу к строению? Тут тоже самое, только строение к юниту.
call SaveUnitHandle(твой_хеш, GetHandleId(твой_юнит), твоё_число, твоё_строение)
При смерти узнавай строение.
set Host = LoadUnitHandle(твой_хеш, GetHandleId(умерший_юнит), твоё_число)
set Dead = LoadInteger(твой_хеш, GetHandleId(Host), другое_твоё_число)
call SaveInteger(твой_хеш, GetHandleId(Host), другое_твоё_число, Dead + 1)
// Не забываем чистить хеш.
call FlushChildHashtable(твой_хеш, GetHandleId(умерший_юнит))
Через некоторое время создавай новых юнитов.
set Group = LoadGroupHandle(твой_хеш, GetHandleId(твоё_строение), твоё_число_2)
set Dead = LoadInteger(твой_хеш, GetHandleId(твоё_строение), другое_твоё_число)
if Dead > 0 then
    call SaveInteger(твой_хеш, GetHandleId(твоё_строение), другое_твоё_число, 0)
    loop
        set Dead = Dead - 1
        set Unit = CreateUnit(...)
        call GroupAddUnit(Group, Unit)
        call SaveUnitHandle(твой_хеш, GetHandleId(Unit), твоё_число, твоё_строение)
        exitwhen Dead == 0
    endloop
endif
28

» WarCraft 3 / Ох уж эти Хеш-таблицы

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