27

» WarCraft 3 / Обновление Warcraft III: Reforged 1.36.2

jasonrus96, да чего плакать то, ну понерфили немного Нежить, будем теперь на эльфах катать
27

» WarCraft 3 / RMS Twilac Edition

OVOgenez, вроде новый баг, репортили уже.
Разраб пока не отреагировал, наверное, сейчас можно только воспользоваться более старой версией, или дополнительно подолбить его в дискорде
Загруженные файлы
27

» WarCraft 3 / RMS Twilac Edition

OVOgenez, через Edit -> Preferences Windows -> Hotkeys можно настроить управление, правда не знаю работает ли это с вращением камеры
27

» WarCraft 3 / RMS Twilac Edition

OVOgenez, проверил в последней версии, вроде всё норм. По умолчанию, крутить камеру вокруг модели нужно зажав колесо мыши
27

» Помойка Макебы / Тестим PopcornFX в рефоге

Кстати, постил на хайве краткий "тутор" на эту тему. Скорее в качестве шпаргалки для самого себя, чтобы посмотреть и вспомнить как я это делал, когда забуду
27

» WarCraft 3 / импорт карт в blender

осуществить твою задумку вряд ли возможно софтом
Да в принципе ничего в этой задаче нет невыполнимого или даже архисложного. С учётом того, что формат карт разобран, формат моделей разобран, а архивы варкрафта распаковываются в пару кликов.
Другой вопрос, что никто в здравом уме не сядет это пилить, так что да, на практике нереализуемо.
27

» WarCraft 3 / как сделать мгновеный поворот юниту

rsfghd, ну так UnitFacing в сделку не входил, поэтому я и обозначил, что не для каждой ситуации способ применим.
Вращение будет видно если таргет двигать плавно, а не просто установить ему нужные конечные координаты
27

» WarCraft 3 / как сделать мгновеный поворот юниту

только костылить с созданием нового юнита либо использовать
Где-то тут на сайте для мгновенного поворота предлагался костыль с переименованием рут кости модели в turret, и триггерным закрепом кости на цели. На рефе так делал для фиксации модельки героя на курсоре, на 1.26 тоже скорее всего рабочий вариант. Но не для каждой задачи этот способ будет допустим.
27

» WarCraft 3 / Заказы на ландшафт

Интересно, oGre_ ещё жив на сайте?) Я бы с удовольствием обратился к нему.
Опоздали на год...
27

» WarCraft 3 / Пак моделей от -Grendel

Галендор Крэйл, похоже, что автор не брезговал заметать проблемы с нормалями под ковёр, путём установки флага Unshaded в материалах
27

» WarCraft 3 / Пак моделей от -Grendel

Большинство моделей этого чела (по крайней мере из данного пака, других не видел) имеют косяк с полигонами, а точнее наличие треугольников с дублирующимися вершинами. Не то чтобы претензия, но я не понимаю, как он вообще смог так моделить. У него это встречается буквально везде, где геометрия не является явной копипастой/небольшой доработкой близзовских моделек. В мдлвисе из точек собирал что ли
Пример. Геосет 0 модели NagaWhaler.mdx имеет 16 таких треугольников из 48
NagaWhaler.mdx

Faces with doubles (16):

        Triangle 17: [22, 24, 24]
        Triangle 19: [21, 24, 24]
        Triangle 21: [20, 24, 24]
        Triangle 23: [19, 24, 24]
        Triangle 25: [18, 24, 24]
        Triangle 27: [17, 24, 24]
        Triangle 29: [23, 24, 24]
        Triangle 31: [16, 24, 24]
        Triangle 33: [32, 33, 33]
        Triangle 35: [30, 33, 33]
        Triangle 37: [29, 33, 33]
        Triangle 39: [28, 33, 33]
        Triangle 41: [27, 33, 33]
        Triangle 43: [26, 33, 33]
        Triangle 45: [31, 33, 33]
        Triangle 47: [25, 33, 33]

All geoset Faces (48):

        Triangle 0: [9, 10, 7]
        Triangle 1: [7, 6, 9]
        Triangle 2: [10, 11, 5]
        Triangle 3: [5, 7, 10]
        Triangle 4: [11, 12, 4]
        Triangle 5: [4, 5, 11]
        Triangle 6: [12, 13, 3]
        Triangle 7: [3, 4, 12]
        Triangle 8: [13, 14, 2]
        Triangle 9: [2, 3, 13]
        Triangle 10: [14, 15, 1]
        Triangle 11: [1, 2, 14]
        Triangle 12: [15, 8, 0]
        Triangle 13: [0, 1, 15]
        Triangle 14: [8, 9, 6]
        Triangle 15: [6, 0, 8]
        Triangle 16: [24, 23, 22]
        Triangle 17: [22, 24, 24]
        Triangle 18: [24, 22, 21]
        Triangle 19: [21, 24, 24]
        Triangle 20: [24, 21, 20]
        Triangle 21: [20, 24, 24]
        Triangle 22: [24, 20, 19]
        Triangle 23: [19, 24, 24]
        Triangle 24: [24, 19, 18]
        Triangle 25: [18, 24, 24]
        Triangle 26: [24, 18, 17]
        Triangle 27: [17, 24, 24]
        Triangle 28: [24, 16, 23]
        Triangle 29: [23, 24, 24]
        Triangle 30: [24, 17, 16]
        Triangle 31: [16, 24, 24]
        Triangle 32: [33, 31, 32]
        Triangle 33: [32, 33, 33]
        Triangle 34: [33, 32, 30]
        Triangle 35: [30, 33, 33]
        Triangle 36: [33, 30, 29]
        Triangle 37: [29, 33, 33]
        Triangle 38: [33, 29, 28]
        Triangle 39: [28, 33, 33]
        Triangle 40: [33, 28, 27]
        Triangle 41: [27, 33, 33]
        Triangle 42: [33, 27, 26]
        Triangle 43: [26, 33, 33]
        Triangle 44: [33, 25, 31]
        Triangle 45: [31, 33, 33]
        Triangle 46: [33, 26, 25]
        Triangle 47: [25, 33, 33]
27

» StarCraft 2 / .m3 аддон для Blender

Anime Chan, нужен доброволец, который зальёт новый ресурс с новым аддоном
27

» WarCraft 3 / Пулемётный огонь веером

Во-первых, сообщество 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

Пример использования, с эффектами и набигающими врагами
Загруженные файлы
27

» WarCraft 3 / Оптимизация Выполнения Последовательности Кода

Принятый ответ
Раз уж мы всем хгмом делаем наработку для крафтов, то вкачусь тоже В луа я бы сделал так. Ну, если все предметы разные, без повторений.
RequiredItems = {0x6F646566, 0x6F736C6F, 0x6F666972, 0x6F636F72, 0x6F76656E, 0x4930304C}

function checkItems(u)
    for _, v in ipairs(RequiredItems) do
        if not UnitHasItemOfTypeBJ(u, v) then
            return false
        end
    end
    return true
end
Результат
Загруженные файлы