Предполагаю, что пулемётчик выпускает в ряд стоящих перед ним противников пустышку-способность типа "Ледяного дыхания", накидывая на попавших эффект-пустышку. Создаются даммики и выпускают в юнитов под эффектом-пустышкой способность "Стадо ящериц", и уже рядом с атакованными ящерицами юнитами создаются даммики и наносят нужный мне урон нужного типа (20 урона дальнего боя). "Стадо ящериц" нужно для того, чтобы юниты спереди заслоняли собой юнитов сзади от пулемётного огня. Во время всего этого действа пулемётчик крутится и проигрывает анимацию атаки.
Вопрос в чём: я протестировал само "стадо ящериц".
Событие: юнит атакован
Условие: атакующий юнит = пулемётчик И применяемая способность = "Стадо ящериц".
Действие: ну, спавн даммиков рядом с атакованным, с приказом нанести урон и удалиться.
Триггер факт атаки юнитов ящерицами пулемётчика НЕ видит. Как решить данную проблему? Очень хочется, чтобы пулемёт был пулемётом.

Принятый ответ

Крч. У тебя проблема в том, что твое событие Юнит атакован не ловит урон. Тебе нужно событие отвечающее за отлов урона. Ознакомься с этим xgm.guru/p/wc3/catch-dmg (catch-dmg).
Вешаешь событие на свой триггер и теперь уже реализируешь свой пулемет. По простому можешь сделать через кодоев как ты и хотел. Если хочешь углубиться, то делай свою систему снарядов как предложил молодой токсик выше.
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
2 недели назад
Отредактирован KaneThaumaturge
0
Событие "Юнит атакован" отслеживает начало выполнения приказа обычной атаки.

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

### Плюсы:
  • супер просто
  • познакомишься с выбором юнитов в секторе круга
### Минусы:
  • непроизводительно
  • нельзя отловить урон или управлять им
0
27
2 недели назад
0
Попробуй сделать это триггерно. Тут нужны конечно какие-то знания, но возможностей контролировать поведение способности больше, да и сам заказ не сложным был бы
1
23
2 недели назад
Отредактирован Makeba
1
Во-первых, сообщество XGM настоятельно рекомендует перестать использовать эти решения из 2007-го, с даммиками, вызывающими даммиков, сейчас есть возможность сделать лучше.
Во-вторых, сообщество XGM настоятельно рекомендует перейти на Ujapi и AngelScript.

Немного говнокода на эту тему, набросал на луа в рефе за 1 наносекунду
group = CreateGroup()

--всякие параметры
range = 650
dAngle = 30
stepAngle = 15
projVelocity = 100

Timers = {}
Timers.bullets = CreateTimer()

TimerStart(Timers.bullets, 0.25, true, function()
    launchBullets(GetUnitX(hero), GetUnitY(hero)) -- пусть hero это будет пулемётчик
end)

function launchBullets(x, y) -- выпускаем очередь из пулемёта
    local angle = GetUnitFacing(hero)

    SetUnitAnimation(hero, "attack")
    local segments = getSegments(x, y, range, angle - dAngle, angle + dAngle, stepAngle) --находим конечные точки отрезков, по которым пустим снаряды

    local t = CreateTimer()
    TimerStart(t, 0.03, true, function()
        local p = table.remove(segments, math.random(1, #segments))
        launchBullet(x, y, p.x, p.y) --для красоты пускаем выстрелы с небольшой задержкой

        if #segments <= 0 or IsUnitDeadBJ(t) then
            DestroyTimer(t)
            return
        end
    end)
end

function launchBullet(x, y, x1, y1)
    -- выпускаем "снаряд" и ищем цель
    local eff = AddSpecialEffect("bullets", x, y)
    BlzSetSpecialEffectZ(eff, 60)
    BlzSetSpecialEffectYaw(eff, getAngle(x, y, x1, y1))

    local t = CreateTimer()
    local isProjectileAlive = true
    local xEffect, yEffect = x, y
    TimerStart(t, 0.015, true, function()
        GroupEnumUnitsInRange(group, xEffect, yEffect, 120)
        while true do
            local target = FirstOfGroup(group)
            if target == nil then break end
            GroupRemoveUnit(group, target)
            if UnitAlive(target) and target ~= hero and IsUnitInRangeXY(target, xEffect, yEffect, 50) --ищем юнитов в ренже, кроме пулемётчика
            then
                DestroyEffect(eff)
                isProjectileAlive = false --после первого столкновения уничтожим снаряд, чтобы он не летел дальше
                UnitDamageTargetBJ(hero, target, 20.00, ATTACK_TYPE_PIERCE, DAMAGE_TYPE_NORMAL) -- наносим те самые 20 дальнего урона
            end
        end

        -- двигаем снаряд в нужном направлении
        local sin, cos = getSinCos(xEffect, yEffect, x1, y1)

        xEffect = xEffect + cos * projVelocity
        yEffect = yEffect + sin * projVelocity

        if getDistance(x, y, xEffect, yEffect) >= range or not isProjectileAlive then
            DestroyTimer(t)
            DestroyEffect(eff)
            return
        end
        BlzSetSpecialEffectPosition(eff, xEffect, yEffect, 60)
    end)
end

function getSegments(cx, cy, r, angle1, angle2, angle_step)
    local segments = {}
    local n = math.floor((angle2 - angle1) / angle_step) + 1

    for i = 0, n - 1 do
        local angle = angle1 + i * angle_step
        local x = cx + r * math.cos(math.rad(angle))
        local y = cy + r * math.sin(math.rad(angle))
        table.insert(segments, {x = x, y = y})
    end

    return segments
end

function getSinCos(x1, y1, x2, y2)
    local dX = x2 - x1
    local dY = y2 - y1
    local dist = math.sqrt(dX*dX + dY*dY)
    local sin = dY / dist
    local cos = dX / dist

    return sin, cos
end

function getAngle(x1, y1, x2, y2)
    local deltaX = x2 - x1
    local deltaY = y2 - y1

    local angle
    if deltaX == 0 then
        if deltaY > 0 then
            angle = math.pi / 2
        else
            angle = -math.pi / 2
        end
    else
        angle = math.atan(deltaY / deltaX)
        if deltaX < 0 then
            angle = angle + math.pi
        end
    end

    return angle
end

function getDistance(x1, y1, x2, y2)
    local deltaX = x2 - x1
    local deltaY = y2 - y1

    return math.sqrt(deltaX^2 + deltaY^2)
end

Пример использования, с эффектами и набигающими врагами
Загруженные файлы
Ответы (5)
4
18
2 недели назад
4
Во-первых, сообщество XGM настоятельно рекомендует перестать использовать эти решения из 2007-го, с даммиками, вызывающими даммиков, сейчас есть возможность сделать лучше.
Во-вторых, сообщество XGM настоятельно рекомендует перейти на Ujapi и AngelScript.
Не припомню такое голосование на XGM, где проголосовало 51% пользователей и где было принято решение советовать перестать делать даммики и переходить на ujapi и angelscript. 20 - 50 человек из сотен людей - это не сообщество XGM.
Говорите за себя, а не за всех )
0
23
2 недели назад
0
EugeAl, весь дискорд хгма уже на AngelScript
1
27
2 недели назад
1
Makeba, значит я не попадаю под сообщество хгм либо его дискорд
0
29
2 недели назад
0
EugeAl, я так понимаю, что ты считаешь всех людей одинаково компетентными во всех вопросах?
0
18
2 недели назад
0
nazarpunk, участие в сообществе не зависит от компетенции, работник и зам гендира - оба являются сотрудниками компании, здесь аналогично
0
19
2 недели назад
0
Крч. У тебя проблема в том, что твое событие Юнит атакован не ловит урон. Тебе нужно событие отвечающее за отлов урона. Ознакомься с этим xgm.guru/p/wc3/catch-dmg (catch-dmg).
Вешаешь событие на свой триггер и теперь уже реализируешь свой пулемет. По простому можешь сделать через кодоев как ты и хотел. Если хочешь углубиться, то делай свою систему снарядов как предложил молодой токсик выше.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.