Кстати, постил на хайве краткий "тутор" на эту тему. Скорее в качестве шпаргалки для самого себя, чтобы посмотреть и вспомнить как я это делал, когда забуду
Да в принципе ничего в этой задаче нет невыполнимого или даже архисложного. С учётом того, что формат карт разобран, формат моделей разобран, а архивы варкрафта распаковываются в пару кликов.
Другой вопрос, что никто в здравом уме не сядет это пилить, так что да, на практике нереализуемо.
только костылить с созданием нового юнита либо использовать
Где-то тут на сайте для мгновенного поворота предлагался костыль с переименованием рут кости модели в turret, и триггерным закрепом кости на цели. На рефе так делал для фиксации модельки героя на курсоре, на 1.26 тоже скорее всего рабочий вариант. Но не для каждой задачи этот способ будет допустим.
Большинство моделей этого чела (по крайней мере из данного пака, других не видел) имеют косяк с полигонами, а точнее наличие треугольников с дублирующимися вершинами. Не то чтобы претензия, но я не понимаю, как он вообще смог так моделить. У него это встречается буквально везде, где геометрия не является явной копипастой/небольшой доработкой близзовских моделек. В мдлвисе из точек собирал что ли
Пример. Геосет 0 модели NagaWhaler.mdx имеет 16 таких треугольников из 48
Во-первых, сообщество 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
Пример использования, с эффектами и набигающими врагами
Раз уж мы всем хгмом делаем наработку для крафтов, то вкачусь тоже В луа я бы сделал так. Ну, если все предметы разные, без повторений.
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
» WarCraft 3 / Пак моделей от -Grendel
» WarCraft 3 / проверка на неуязимость
» WarCraft 3 / Обновление Warcraft III: Reforged 1.36.2
» WarCraft 3 / RMS Twilac Edition
» WarCraft 3 / RMS Twilac Edition
» WarCraft 3 / RMS Twilac Edition
» Помойка Макебы / Суицидальная атака на Maya API
» Помойка Макебы / Тестим PopcornFX в рефоге
» WarCraft 3 / импорт карт в blender
» WarCraft 3 / как сделать мгновеный поворот юниту
» WarCraft 3 / как сделать мгновеный поворот юниту
Ред. Makeba
» WarCraft 3 / как сделать мгновеный поворот юниту
» WarCraft 3 / Заказы на ландшафт
» WarCraft 3 / Как прератить tga файл в png файл?
Первая ссылка по запросу convertio.co/ru/tga-png
» WarRaft / BLP - BLizzard Picture
» WarCraft 3 / Проблема с запуском редактора и Jass
» WarCraft 3 / Пак моделей от -Grendel
» WarCraft 3 / Пак моделей от -Grendel
» StarCraft 2 / .m3 аддон для Blender
» WarCraft 3 / Пулемётный огонь веером
Ред. Makeba
» WarCraft 3 / Пулемётный огонь веером
Во-вторых, сообщество XGM настоятельно рекомендует перейти на Ujapi и AngelScript.
» WarCraft 3 / Массив в магазине.
» WarCraft 3 / Где находятся спецэффекты, появляющиеся на земле
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
Ред. Makeba
» WarCraft 3 / Оптимизация Выполнения Последовательности Кода
Раз уж мы всем хгмом делаем наработку для крафтов, то вкачусь тожеВ луа я бы сделал так. Ну, если все предметы разные, без повторений.