ArhiMEN, ну тогда хз, с этой штукой мне половина хгм канала пытались помочь, но формулу мне по итогу скинул N1ghtSiren
function PolarProjectionXYZ(x, y, z, dist, GroundAngle, FacingAngle)
--FacingAngle - 0-360 -- yaw
--GroundAngle - 0-180 -- pitch
local x1 = x + dist*SinBJ(GroundAngle)*CosBJ(FacingAngle)
local y1 = y + dist*SinBJ(GroundAngle)*SinBJ(FacingAngle)
local z1 = z + dist*CosBJ(GroundAngle)
--
return x1,y1,z1
end
надеюсь не составит труда на джасс перенести
ну и сама карта, смотреть там правда нечего, я был абсолютным дауном и клепал недоспеллы на то время (собственно ничего и не изменилось), но мб этот вонючий огрызок как-то сможет помочь
library spelllib initializer SpiritMissile
globals
hashtable H = InitHashtable( )
endglobals
private struct SpiritMissileInfo
unit u
unit u1
unit u2
real x
real y
real speed
real offsetz
real a
real a1
real dmg
real radius
real dist
real az
real azs
integer AttackType
integer DamageType
boolean tf
boolexpr b
endstruct
private function SpiritMissileMove takes nothing returns nothing
local timer t = GetExpiredTimer()
local SpiritMissileInfo A = LoadInteger(H,GetHandleId(t),0)
local real d = 0
set A.x = (A.x+A.speed*Cos(A.a)) + A.offsetz*Sin(A.az)*Cos(A.a-A.a1)
set A.y = (A.y+A.speed*Sin(A.a)) + A.offsetz*Sin(A.az)*Sin(A.a-A.a1)
set A.dist = A.dist-A.speed
call SetUnitX( A.u1, A.x )
call SetUnitY( A.u1, A.y )
call SetUnitFlyHeight(A.u1,GetUnitFlyHeight(A.u1) + A.offsetz*Cos(A.az),0)
/*set bj_lastCreatedUnit = A.u
call GroupEnumUnitsInRange(TempG,A.x,A.y,A.radius,A.b)
if A.tf then
call SetItemPositionEx(TempIt,A.x,A.y)
set d = DBC(GetItemX(TempIt),GetItemY(TempIt),A.x,A.y)
endif*/
if A.dist <= 0 or d > 10 then
//call KillUnit(A.u1)
call FlushChildHashtable(H,GetHandleId(t))
call PauseTimer(t)
call DestroyTimer(t)
call A.destroy()
set A.u = null
set A.u1 = null
set A.u2 = null
set A.a = 0.
set A.a1 = 0.
set A.speed = 0.
set A.offsetz = 0.
set A.dmg = 0.
set A.dist = 0.
set A.radius = 0.
set A.az = 0.
set A.azs = 0.
set A.b = null
set A.AttackType = 0
set A.DamageType = 0
else
set A.az = A.az+(A.azs*bj_DEGTORAD)
if A.u2 != null then
set A.a = Atan2(GetUnitY(A.u2)-A.y,GetUnitX(A.u2)-A.x)
endif
endif
set t = null
endfunction
function SpiritMissile takes nothing returns nothing
local timer t = CreateTimer()
local SpiritMissileInfo A = SpiritMissileInfo.create()
set A.u = gg_unit_hfoo_0000
set A.a = 0.00
set A.a1 = 45.00 * bj_DEGTORAD
set A.u1 = gg_unit_hfoo_0000
set A.x = GetUnitX(A.u1)
set A.y = GetUnitY(A.u1)
set A.speed = 3
set A.offsetz = 20
set A.dmg = 0
set A.dist = 999
set A.radius = 100
set A.az = 0.
set A.azs = 6
set A.b = null
set A.AttackType = 0
set A.DamageType = 0
if false then
set A.u2 = GetTriggerUnit()
endif
set A.tf = false
call UnitAddAbility(A.u1,'Arav')
call SetUnitFlyHeight(A.u1,50,0)
call SetUnitPathing(A.u1,false)
call SaveInteger(H,GetHandleId(t),0,A)
call TimerStart(t,0.01,true,function SpiritMissileMove)
set t = null
endfunction
endlibrary
так ты зациклил триггер, каков результат ожидался?
юнит получил урон - нанести юниту урон - юнит снова получил урон - юниту снова наносить урон, и так бесконечно
вот чутка отредаченный мной русификатор, тут вместо скобочек источник повреждения
насчёт булекспра кста, проще на самом деле выдать абилку пустышку всё-таки тем юнитам, что приносят инком, так удобнее, чем каждого юнита через "или" добавлять, да и в плане оптимизации выйдет лучше, т.к. вызовется поменьше функций
можешь такую конструкцию использовать, мб удобнее будет
смешно, ведь в моём первом комментарии в этом вопросе я указывал про вариант, чтобы кастануть абилку триггерно, но меня походу игнорят и пишут то же самое
ну через если тогда иначе, допустим у тебя выбор расы происходит через найм юнита, нанятого юнита удаляешь, в соответствии с купленным спавнишь такие-то здания в таких-то зонах
примерно так оно и выглядит, это набросок, в игре не тестил
только удаление юнита переместить на самый низ нужно, дабы избежать всяких казусов, пускай и удаляется юнит не сразу, а с какой-то задержкой
мб и владелец юнита триггера нужно переделать на владелец проданного юнита
ArhiMEN, в смысле.. я в крусадере модель вертел как мне угодно, которая фиолетовый/красный след оставляла от взмахов меча/косы мордреда, то же самое и с этими когтями
Bergi_Bear, ну если он гуишник то вышесказанное нами ему вообще не поможет Fullega, на гуи нет толковых функций для работы с координатами, но вульфер уже делал видео с вращением юнитов, прошу к ознакомлению)
» WarCraft 3 / Как выдать способность зданию
» WarCraft 3 / Не меняется анимация старфолла
Ctrl + D -> Ctrl + F -> AEsd
» WarCraft 3 / Манекен для битья
» WarCraft 3 / Манекен для битья
» WarCraft 3 / Трёхмерное движение
» WarCraft 3 / Трёхмерное движение
Ред. rsfghd
» WarCraft 3 / Трёхмерное движение
» WarCraft 3 / Что не так?
» WarCraft 3 / Что не так?
юнит получил урон - нанести юниту урон - юнит снова получил урон - юниту снова наносить урон, и так бесконечно
» WarCraft 3 / Ролик перед загрузкой
Ред. rsfghd
» WarCraft 3 / Проверка типа юнитов
» WarCraft 3 / Проверка типа юнитов
» WarCraft 3 / Как сделать так чтобы способность ушла в кд от действия?
» WarCraft 3 / Как ограничить плавающий текст
на гуях это конвертирование реального в целочисленное
» WarCraft 3 / Выбор расы в кругу и быстрое строительство зданий в зоне
» WarCraft 3 / SetUnitVertexColor
Ред. rsfghd
» WarCraft 3 / Точка приложения эффекта
» WarCraft 3 / Как ограничить плавающий текст
» WarCraft 3 / Способности и алгоритмы на заказ
» WarCraft 3 / Точка приложения эффекта
» WarCraft 3 / Как сделать способность с баффом
» WarCraft 3 / Вращение вокруг своей оси
Fullega, на гуи нет толковых функций для работы с координатами, но вульфер уже делал видео с вращением юнитов, прошу к ознакомлению)