call AddSpecialEffectLocBJ( PolarProjectionBJ(Ltargetpoint, 220, Lradiusadd), "Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl" )
set Leffect = GetLastCreatedEffectBJ()
call BlzSetSpecialEffectPitch( Leffect, 45.00 )
call BlzSetSpecialEffectHeight( Leffect, 300.00 )
Собственно высота эффекта поднимается на 300 как я понял от стандартного нуля карты.
Как мне сделать 300 от текущей высоты на применяемом рельефе.
Далее возникнет вопрос, (мой спелл аое , там появляется несколько эффектов образуя кольцо)
Так вот если половина моего спелла будет на подъёме, а другая половина кольца внизу, это как то не очень красиво (для конкретного спелла ) Типо по высочайшей точке этой области выровнять остальные эффекты. Надеюсь меня поняли,
Желательно просто продолжить код на jass, заранее спасибо.

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

+- GetLocationZ(Ltargetpoint)
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
22
4 года назад
1
+- GetLocationZ(Ltargetpoint)
Принятый ответ
0
10
4 года назад
0
Никак не соображу как сделать что бы если мой Ltargetpoint ( это центр этой АоЕ абилки во время применения) находится на нижней части, но кольцо задевает ту что выше, делать высоту всех эффектов в кольце относительно той которая выше.
Загруженные файлы
1
32
4 года назад
Отредактирован Берги
1
BlzSetSpecialEffectPosition(eff, nx, ny, nz)
где nz нужная высота, можно сделать
GetTerrainZ(nx, ny)
В рефордже вообще новая функция для высоты есть но я старьём пользуюсь, лень проверять чёт, но скорее всего тоже самое там
Рекомендую использовать библиотеку Math
там она есть
есть в мой вариант чутка дополненный
раскрыть
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by Bergi.
--- DateTime: 10.01.2020 23:44
---
---@param x real
---@param y real
---@return boolean
function InMapXY(x, y)
	return x > GetRectMinX(bj_mapInitialPlayableArea) and x < GetRectMaxX(bj_mapInitialPlayableArea) and y > GetRectMinY(bj_mapInitialPlayableArea) and y < GetRectMaxY(bj_mapInitialPlayableArea)
end

---@param x real
---@param distance real
---@param angle real radian
---@return real
function GetPolarOffsetX(x, distance, angle)
	return x + distance * math.cos(angle)
end

---@param y real
---@param distance real
---@param angle real radian
---@return real
function GetPolarOffsetY(y, distance, angle)
	return y + distance * math.sin(angle)
end

---@param x real
---@param distance real
---@param angle real degrees
---@return real
function MoveX(x, distance, angle)
	return x + distance * math.cos(angle * bj_DEGTORAD)
end

---@param y real
---@param distance real
---@param angle real degrees
---@return real
function MoveY(y, distance, angle)
	return y + distance * math.sin(angle * bj_DEGTORAD)
end


local GetTerrainZ_location = Location(0, 0)
---@param x real
---@param y real
---@return real
function GetTerrainZ(x, y)
	MoveLocation(GetTerrainZ_location, x, y)
	return GetLocationZ(GetTerrainZ_location)
end

---@param target unit
---@return real
function GetUnitZ(target)
	MoveLocation(GetTerrainZ_location, GetUnitX(target), GetUnitY(target))
	return GetLocationZ(GetTerrainZ_location) + GetUnitFlyHeight(target)
end

---@param target unit
---@param z real
function SetUnitZ(target, z)
	UnitAddAbility(target, FourCC('Aave'))
	UnitRemoveAbility(target, FourCC('Aave'))
	MoveLocation(GetTerrainZ_location, GetUnitX(target), GetUnitY(target))
	SetUnitFlyHeight(target, z - GetLocationZ(GetTerrainZ_location), 0)
end

---@param h real максимальная высота в прыжке на середине расстояния (x = d / 2)
---@param d real общее расстояние до цели
---@param x real расстояние от исходной цели до точки, где следует взять высоту по параболе
---@return real
function ParabolaZ (h, d, x)
	return (4 * h / d) * (d - x) * (x / d)
end

---@param zs real начальная высота высота одного края дуги
---@param ze real конечная высота высота другого края дуги
---@param h real максимальная высота на середине расстояния (x = d / 2)
---@param d real общее расстояние до цели
---@param x real расстояние от исходной цели до точки
---@return real
function GetParabolaZ(zs, ze, h, d, x)
	return (2 * (zs + ze - 2 * h) * (x / d - 1) + (ze - zs)) * (x / d) + zs
end

---@param xa real
---@param ya real
---@param xb real
---@param yb real
---@return real
function DistanceBetweenXY(xa, ya, xb, yb)
	local dx = xb - xa
	local dy = yb - ya
	return math.sqrt(dx * dx + dy * dy)
end

---@param xa real
---@param ya real
---@param za real
---@param xb real
---@param yb real
---@param zb real
---@return real
function DistanceBetweenXYZ(xa, ya, za, xb, yb, zb)
	local dx = xb - xa
	local dy = yb - ya
	local dz = zb - za
	return math.sqrt(dx * dx + dy * dy + dz * dz)
end

---@param xa real
---@param ya real
---@param xb real
---@param yb real
---@return real radian
function AngleBetweenXY(xa, ya, xb, yb)
	return math.atan(yb - ya, xb - xa)
end

---@param a real radian
---@param b real radian
---@return real radian
function AngleDifference(a, b)
	local c---@type real
	local d---@type real
	if a > b then
		c = a - b
		d = b - a + 2 * math.pi
	else
		c = b - a
		d = a - b + 2 * math.pi
	end
	return c > d and d or c
end

--@author https://xgm.guru/p/wc3/warden-math
---@param a real degrees
---@param b real degrees
---@return real degrees
function AngleDifferenceDeg(a, b)
	a, b = math.abs(a, 360), math.abs(b, 360)
	local x---@type real
	if (a > b) then
		a, b = b, a
	end
	x = b - 360
	if (b - a > a - x) then
		b = x
	end
	return math.abs(a - b)
end

-- Находит длину перпендикуляра от отрезка, заданного xa, ya, xb, yb к точке, заданной xc, yc
--@author https://xgm.guru/p/wc3/perpendicular
---@param xa real
---@param ya real
---@param xb real
---@param yb real
---@param xc real
---@param yc real
---@return real
function Perpendicular (xa, ya, xb, yb, xc, yc)
	return math.sqrt((xa - xc) * (xa - xc) + (ya - yc) * (ya - yc)) * math.sin(math.atan(yc - ya, xc - xa) - math.atan(yb - ya, xb - xa))
end

--@Hate https://xgm.guru/p/wc3/241479
---@param source unit
---@param x real
---@param y real
function SetUnitPositionSmooth(source, x, y)
	local last_x = GetUnitX(source)
	local last_y = GetUnitY(source)
	local bx
	local by
	--print("Смус выполнена")
	SetUnitPosition(source, x, y)
	if (RAbsBJ(GetUnitX(source) - x) > 0.5) or (RAbsBJ(GetUnitY(source) - y) > 0.5) then
		SetUnitPosition(source, x, last_y)
		bx = RAbsBJ(GetUnitX(source) - x) <= 0.5
		SetUnitPosition(source, last_x, y)
		by = RAbsBJ(GetUnitY(source) - y) <= 0.5

		---
		local dx=math.abs(x-last_x)
		if dx>=100 then
			print("Телепорт бак в функции Smooth"..dx )
		end
		---
		if bx then
			SetUnitPosition(source, x, last_y)
		elseif by then
			SetUnitPosition(source, last_x, y)
		else
			SetUnitPosition(source, last_x, last_y)
		end
	end
end

--Bergi
function GetUnitXY(unit)
	return GetUnitX(unit),GetUnitY(unit)
end

function MoveXY(x,y, distance, angle)
	return x + distance * math.cos(angle * bj_DEGTORAD),y + distance * math.sin(angle * bj_DEGTORAD)
end

function UnitCollisionOFF(unit)
	UnitAddAbility(unit,FourCC('A000'))
	IssueImmediateOrder(unit,"windwalk")
end

function AngleBetweenUnits(caster,target)
	local yb,ya,xb,xa=GetUnitY(target),GetUnitY(caster),GetUnitX(target),GetUnitX(caster)
	return Atan2BJ(yb - ya, xb - xa)
end

function math.clamp (inb, low, high) --
	return math.min( math.max(inb, low ), high )
end

function math.lerp(a, b, t)
	return a + (b - a) * t
end

function repeatN(t, m)
	return math.clamp(t - math.floor(t / m) * m, 0, m)
end

function lerpTheta(a, b, t)
	local dt = repeatN(b - a, 360)
	if dt>180 then	dt=dt-360 end
	return math.lerp(a, a + dt, t)
end

function AngleBetweenXYZ(x1, y1,z1, x2, y2,z2)
	local a=x1*x2+y1*y2+z1*z2
	local b=math.sqrt(x1*x1+y1*y1+z1*z1)
	local c=math.sqrt(x2*x2+y2*y2+z2*z2)
--	print("a"..a)
--	print("b"..b)
--	print("c"..c)
	return math.acos(a/(b*c))
end

а сорь у тебя jass ну разницы нет, загугли на сайте миллион вариаций GetPointZ GetTerrainZ, суть там одна, двигаем локацию глобальную и читаем у неё GetLocationZ

и в call BlzSetSpecialEffectPitch( Leffect, 45.00 ) нельзя передать угол, от требует радианы, поэтому нужен конверт, я же писал пример там math.rad

типа вот так должно быть

call BlzSetSpecialEffectPitch( Leffect,  math.rad(45.00) )
0
10
4 года назад
Отредактирован EviLInside
0
и в call BlzSetSpecialEffectPitch( Leffect, 45.00 ) нельзя передать угол, от требует радианы, поэтому нужен конверт, я же писал пример там math.rad
у меня всё вращается нормально
1
32
4 года назад
1
EviLInside, тебе кажется =) потому что там десятки кругов точка сделала, оно соответствует тому что ты выставил?

Вот нашел на джасе полную
0
10
4 года назад
0
Bergi_Bear:
EviLInside, тебе кажется =) потому что там десятки кругов точка сделала, оно соответствует тому что ты выставил?
Ну я поставил число на бум, думал раз двигается значит работает, да ты прав
Чтобы оставить комментарий, пожалуйста, войдите на сайт.