Способ реализации:
Lua
Версия Warcraft:
Известный случай, что используя различные физические размеры, GetUnitX/Y возвращает не очень корректные значения, либо же создание объектов используя полученные координаты немного смещаются, что приводит к заметным сдвигам, например при создании спецэффектов.
данный случай можно исправить данным алгоритмом
RealGetUnitX = GetUnitX
RealGetUnitY = GetUnitY


    function GetUnitRealX(unit)
        local collision = math.floor(BlzGetUnitCollisionSize(unit) + 0.5)

		if not IsUnitType(unit, UNIT_TYPE_STRUCTURE) then
			if (collision < 32 and collision > 15) or collision > 47 then return RealGetUnitX(unit) - 16. end
		end

        return RealGetUnitX(unit)
    end

    function GetUnitRealY(unit)
        local collision = math.floor(BlzGetUnitCollisionSize(unit) + 0.5)

		if not IsUnitType(unit, UNIT_TYPE_STRUCTURE) then
        	if (collision < 32 and collision > 15) or collision > 47 then return RealGetUnitY(unit) - 16. end
		end

        return RealGetUnitY(unit)
    end
при инициализации карты, забиваем
local InitGlobalsOrigin = InitGlobals
	--как пример

	function InitGlobals()
		InitGlobalsOrigin()

			GetUnitX = GetUnitRealX
        	GetUnitY = GetUnitRealY
	end
теперь, если все таки нужно получить реальные старые значения, вызываем RealGetUnitX(unit), во всех остальных случаях вызов нативки будет перехватываться и корректироваться
`
ОЖИДАНИЕ РЕКЛАМЫ...
Этот комментарий удален
27
Здесь есть объяснение почему, кстати блоге не могу свой ресурс редактировать.
26
у меня твой код не рабоатет но я сделал так
function GetUnitRealX(unit)
        local collision = math.floor(BlzGetUnitCollisionSize(unit) + 0.5)

		if not IsUnitType(unit, UNIT_TYPE_STRUCTURE) then
			if (collision < 32 and collision > 15) or collision > 47 then return GetUnitX(unit) - 16. end
		end
        return GetUnitX(unit)
    end
    function GetUnitRealY(unit)
        local collision = math.floor(BlzGetUnitCollisionSize(unit) + 0.5)

		if not IsUnitType(unit, UNIT_TYPE_STRUCTURE) then
        	if (collision < 32 and collision > 15) or collision > 47 then return GetUnitY(unit) - 16. end
		end
        return GetUnitY(unit)
    end
это будет рабоатть так же как у тебя?
в каком смысле "не работает"?
если не хочешь париться с перехватом функции, твой вариант подойдет, у меня же нативки сами перехватываются и заменяются вызовом моих функций с коррекцией
26
просто все эти вызовы таймеры как инитглобалс оригин из за нее выкидывает из игры
все равно мой метод тоже не работает)
какие таймеры?) ну показывайте весь код или ошибки
Чтобы оставить комментарий, пожалуйста, войдите на сайт.