Меняю позицию эффекта (любого) с помощью мемхака, а точней SetEffectX, SetEffectZ и т.п. На некоторых частях карты он перестает быть видимым, если переместить обратно - снова отображается. Вблизи точки создания эффект виден, но вдали - нет. Может пропадать на расстоянии примерно 2000, а может и на 800, смотря в каком направлении двигаю и на какой карте нахожусь, поэтому не могу представить, в чем проблема.

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

function SetObjectPosition takes handle h, real x, real y, real z returns nothing
	//doesn't update cached (creation) position, so object get hidden when it's spawn XYZ are out of current camera's bounds
	//probably useful to move effect slightly but definitely shouldn't be used for big (200+) movements
	set LastConvertedHandle=ConvertHandle(h)
	if LastConvertedHandle!=0 then
		call CallThisCallWith4Args(GameDLL+0x4D3180,RMem(LastConvertedHandle+0x28),mR2I(x),mR2I(y),mR2I(z))
	endif
endfunction

function SetEffectPositionComplex takes effect fx, real x, real y, real z returns nothing
	//DOES update cached (creation) position, could be sync-sensible
	//widget-base offset different from UNIT: Effects into B0, unit into B8, idk about others
	local integer a
	set LastConvertedHandle=ConvertHandle(fx)
	if LastConvertedHandle!=0 then
		set a=LastConvertedHandle
		call WRMem(pGetCastRangeHook+500,x)
		call WRMem(pGetCastRangeHook+504,y)
		call WRMem(pGetCastRangeHook+508,z)
		set a=CallThisCallWith1Args(RMem(RMem(a)+0xB0),a)//B0 for effects, B8 for unit
		call CallThisCallWith2Args(GameDLL+0x4743C0,a,pGetCastRangeHook+500)
		call SetObjectPosition(fx,x,y,z)
	endif
endfunction
пробуй
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
23
5 лет назад
2
переходи на 1.31 и не парься
1
6
5 лет назад
Отредактирован WAGARAX
1
Не хочу
2
29
5 лет назад
2
Не хочу
Тогда мучайтесь с мемхаком, в котором разбираются полтора человека.
0
6
5 лет назад
0
Не скажу, что это прям мучения, я то особо(вообще) в нем не разбираюсь, просто использую некоторые функции. Вопрос, связанный с написанным на нем, возник только сейчас, да и не факт, что проблема в этом.
0
32
5 лет назад
0
WAGARAX, а эффект к чему крепишь? если эффект свободный, то проблем быть не должно, хотя я не тестил перемещения эффеков, на мемхаке лишь размер менял. Но если эффект прикреплен к юниту, а потом смещается, то такое может быть... хотя скорее всего просто какие-то баги.. На 131 со смещением эффектов гораздо больше было тестов и тебе минимум человек 5 скажет: Всё норм, на 131 отлично всё работает
0
16
5 лет назад
0
function SetObjectPosition takes handle h, real x, real y, real z returns nothing
	//doesn't update cached (creation) position, so object get hidden when it's spawn XYZ are out of current camera's bounds
	//probably useful to move effect slightly but definitely shouldn't be used for big (200+) movements
	set LastConvertedHandle=ConvertHandle(h)
	if LastConvertedHandle!=0 then
		call CallThisCallWith4Args(GameDLL+0x4D3180,RMem(LastConvertedHandle+0x28),mR2I(x),mR2I(y),mR2I(z))
	endif
endfunction

function SetEffectPositionComplex takes effect fx, real x, real y, real z returns nothing
	//DOES update cached (creation) position, could be sync-sensible
	//widget-base offset different from UNIT: Effects into B0, unit into B8, idk about others
	local integer a
	set LastConvertedHandle=ConvertHandle(fx)
	if LastConvertedHandle!=0 then
		set a=LastConvertedHandle
		call WRMem(pGetCastRangeHook+500,x)
		call WRMem(pGetCastRangeHook+504,y)
		call WRMem(pGetCastRangeHook+508,z)
		set a=CallThisCallWith1Args(RMem(RMem(a)+0xB0),a)//B0 for effects, B8 for unit
		call CallThisCallWith2Args(GameDLL+0x4743C0,a,pGetCastRangeHook+500)
		call SetObjectPosition(fx,x,y,z)
	endif
endfunction
пробуй
Принятый ответ
0
6
5 лет назад
0
DracoL1ch:
function SetObjectPosition takes handle h, real x, real y, real z returns nothing
	//doesn't update cached (creation) position, so object get hidden when it's spawn XYZ are out of current camera's bounds
	//probably useful to move effect slightly but definitely shouldn't be used for big (200+) movements
	set LastConvertedHandle=ConvertHandle(h)
	if LastConvertedHandle!=0 then
		call CallThisCallWith4Args(GameDLL+0x4D3180,RMem(LastConvertedHandle+0x28),mR2I(x),mR2I(y),mR2I(z))
	endif
endfunction

function SetEffectPositionComplex takes effect fx, real x, real y, real z returns nothing
	//DOES update cached (creation) position, could be sync-sensible
	//widget-base offset different from UNIT: Effects into B0, unit into B8, idk about others
	local integer a
	set LastConvertedHandle=ConvertHandle(fx)
	if LastConvertedHandle!=0 then
		set a=LastConvertedHandle
		call WRMem(pGetCastRangeHook+500,x)
		call WRMem(pGetCastRangeHook+504,y)
		call WRMem(pGetCastRangeHook+508,z)
		set a=CallThisCallWith1Args(RMem(RMem(a)+0xB0),a)//B0 for effects, B8 for unit
		call CallThisCallWith2Args(GameDLL+0x4743C0,a,pGetCastRangeHook+500)
		call SetObjectPosition(fx,x,y,z)
	endif
endfunction
пробуй
А что за версия? У меня нет ни "WRMem" ни "pGetCastRangeHook", не нашел
Bergi_Bear:
WAGARAX, а эффект к чему крепишь? если эффект свободный, то проблем быть не должно, хотя я не тестил перемещения эффеков, на мемхаке лишь размер менял. Но если эффект прикреплен к юниту, а потом смещается, то такое может быть... хотя скорее всего просто какие-то баги.. На 131 со смещением эффектов гораздо больше было тестов и тебе минимум человек 5 скажет: Всё норм, на 131 отлично всё работает
Эффект если что ни к чему не крепил
0
32
5 лет назад
0
WAGARAX, WRMem это mr2i, ищи похожу функцию, надо адаптировать под себя, про pGetCastRangeHook хз
0
6
5 лет назад
0
У меня есть mr2i, но он принимает один аргумент.
0
16
5 лет назад
0
pGetCastRangeHook+500 - просто адрес для хранения данных, можешь через malloc выделить 12 байт и использовать переменную
типа
set pGetCastRangeHook=malloc(12)
только +500 убери, чтобы просто +0 +4 +8 соответсвенно осталось
call WRMem(pGetCastRangeHook+0,x) == call WMem(pGetCastRangeHookm,mR2I(x))
0
32
5 лет назад
0
DracoL1ch, ну публикуй уж третью версию. Эффекты насколько помню двигались нормально, щяс только тестил, я вращал эффект - работало.
0
6
5 лет назад
0
Теперь не пропадает, спасибо за помощь. Только вот строку "set pGetCastRangeHook=malloc(12)" в InitMemory нужно прописать или нет разницы где?
0
23
5 лет назад
0
WAGARAX, 1 раз достаточно!
0
6
5 лет назад
0
Спасибо
Чтобы оставить комментарий, пожалуйста, войдите на сайт.