Игра дает не всегда точное значение высоты. Работаю давно с сферическими координатами, и начал замечать не точные расчеты высоты. Знаю б этом давно, так как кто-то говорил мне ссылка
вот стандартный такой использую код (чтоб предупредить что знаю, что можно использовать GetLocationZ)
globals
    location LocationForGetZ = Location(0,0)
endglobals

function GetLocZ takes real x, real y returns real
    call MoveLocation(LocationForGetZ, x, y)
    return GetLocationZ(LocationForGetZ) //высота ландшафта
endfunction

function GetUnitZ takes unit u returns real
    call MoveLocation(LocationForGetZ, GetUnitX(u), GetUnitY(u))
    return GetLocationZ(LocationForGetZ) + GetUnitFlyHeight(u) //высота ландшафта + высота юнита
endfunction

function SetUnitZ takes unit u, real z returns nothing
    call MoveLocation (LocationForGetZ, GetUnitX (u), GetUnitY (u))
    call SetUnitFlyHeight (u, z - GetLocZ(LocationForGetZ), 0.)
endfunction
Если использовать в рельефе "Повысить/Понизить", то потом сложно определить высоту ландшафта
получается как говорил Nereval тут
Или тут
Про что говорил Diod здесь не понимаю. Порылся на форуме, на сайте, и ничего не нашел. Пробовал считать по-другому (есть попытки), но значение высоты или приблизительно (немного выше не достает) или все равно не достает
код карты
function AddLightningEx2 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local lightning lg = LoadLightningHandle(udg_Hash,id,1)

call DestroyLightning(lg)

call FlushChildHashtable(udg_Hash,id)

call DestroyTimer(t)
set t = null
set lg = null

endfunction

function AddLightningEx1 takes lightning lg returns nothing
local timer t = CreateTimer()
local integer id = GetHandleId(t)

call SaveLightningHandle(udg_Hash,id,1, lg)
call TimerStart(t,30,false, function AddLightningEx2)

set lg=null
set t =null

endfunction

function Trig_Cast_1_Conditions takes nothing returns boolean
    return( GetSpellAbilityId() == 'A000' )
endfunction

function Abs takes real a, real b returns real
local real h = a + b
//a-ландшафт
//b-ландшафт+юнит
if a<0 and b>0 then  //если ландшафт опушен вниз, а высота юнита больше нуля (или наооброт)
    set h = b - a
elseif a>0 and b<0 then
    set h = a - b
endif
return h
endfunction

function Trig_Cast_1_Actions takes nothing returns nothing
local unit u1 = GetTriggerUnit()
local unit u2 = GetSpellTargetUnit()

local real x1 = GetUnitX(u1)
local real y1 = GetUnitY(u1)
local real z1 = GetUnitZ(u1)

local real x2 = GetUnitX(gg_unit_hgry_0000)
local real y2 = GetUnitY(gg_unit_hgry_0000)
local real z2 = Abs(GetLocZ(x2,y2),GetUnitFlyHeight(gg_unit_hgry_0000))//GetUnitZ(gg_unit_hgry_0000)

set bj_lastCreatedLightning = AddLightningEx("CLPB", true, x1, y1, z1, x2, y2, z2)
call AddLightningEx1(bj_lastCreatedLightning)
call BJDebugMsg( "Высота ландшафта GetLocZ: "+R2S(GetLocZ(x2,y2)) )
call BJDebugMsg( "Текущая высота юнита GetUnitFlyHeight : "+R2S(GetUnitFlyHeight(gg_unit_hgry_0000)) )
call BJDebugMsg( "Высота юнита GetUnitZ = GetLocZ + GetUnitFlyHeight : "+R2S(GetUnitZ(gg_unit_hgry_0000)) )
call BJDebugMsg( "Высота ландшафта + текущая высота юнита: "+R2S(z2))
set u1 = null
set u2 = null
endfunction

//===========================================================================
function InitTrig_Cast_1 takes nothing returns nothing
    set gg_trg_Cast_1 = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_Cast_1, Player(0), EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Cast_1, Condition( function Trig_Cast_1_Conditions ) )
    call TriggerAddAction( gg_trg_Cast_1, function Trig_Cast_1_Actions )
endfunction

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

Игра дает не всегда точное значение высоты.
Высоты чего? Ландшафта? Или юнита? Летающего юнита?
Пока лучше используй наземных даммиков, ибо с летающими пока все запущено.
Возможно, в новом патче пофиксят. Если он вообще будет...
1
19
6 лет назад
1
4
32
6 лет назад
Отредактирован quq_CCCP
4
Ну этим кодом высоту юнита не найдешь, нужна либо бд либо мемхак, насколько помню готовой функции нет, но нам нужно вот это поле из ро:
Ну у многих оно 60 по дефолту, но так же и много исключений, так что GetLocationZ + значение вот этого поля и молнии будут такие же живые как настоящие, от цепной молнии.
Загруженные файлы
1
30
6 лет назад
1
Работаю давно с сферическими координатами
Переходи на вектора.
1
21
6 лет назад
1
Игра дает не всегда точное значение высоты.
Высоты чего? Ландшафта? Или юнита? Летающего юнита?
Пока лучше используй наземных даммиков, ибо с летающими пока все запущено.
Возможно, в новом патче пофиксят. Если он вообще будет...
Принятый ответ
0
27
6 лет назад
0
GF RaiseD, летающего юнита.
0
21
6 лет назад
0
Steal nerves, по ссылке есть разбор этой ерунды. Вопрос решен.
0
21
6 лет назад
0
quq_CCCP, а как в англ. версии называется "Точка начала атаки (Z)" ?
3
32
6 лет назад
3
ScopteRectuS, launchZ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.