Memory Hack
Есть структура привязанная к предмету, хранящая параметры, которые прибавляются при надевании и отнимаются при снятии. В процессе игры для каждого типа предметов параметры могут изменяться. Есть желание выводить параметры в описании предмета, подскажите как и куда копать?

Лучший ответ:
ага, визуальные данные предметов в двух таблицах лежат, и у скиллов, и у юнитов. но рабочие те, что у юнитов, как выяснилось. так что SetUnitUbertip


Views: 3 443

XGM Bot #1 - 4 years ago 0
Голосов: +0 / -0
Похожие вопросы:

» ответ
ну есть такая возможность
в [[gameClass2]+0x1B4]+0x14 хранится адрес виджета под мышкой. естественно, деревья не в счет, может, только у рабочих они учитываются
RMem(RMem(RMem(gameClass2)+0x1B4)+0x14)==address
» ответ
а, я думал, ты хочешь узнать тип объекта по его адресу. конвертировать в джасс сложно, не минуту доставать, позже
globals
integer l__Int2Unit
integer pGetHandleIDStackCounter=GameDLL+0x3A8060//26
integer pConvertAddressToHandleId=GameDLL+0x430C80//26
endglobals
function setInt2Unit takes integer i returns nothing
set l__Int2Unit=i
return Prevents JassHelper from inlining this function
endfunction
function ConvertUnitAddressToHandleID takes integer address returns integer
local integer a=CallThisCallWith1Args(pGetHandleIDStackCounter,RMem(GameState))
return CallThisCallWith3Args(pConvertAddressToHandleId,a,address,0)
endfunction
function Typecast4 takes nothing returns nothing
local unit l__Int2Unit
endfunction
# +nosemanticerror
function I2Unit takes integer i returns unit
call setInt2Unit(ConvertUnitAddressToHandleID(i))
return l__Int2Unit
endfunction
не забудь уточнить, что ВСЕ используемые здесь адреса НЕ делены на 4, или умножай их сам, если делились. GameState вроде был разделен в паблике.
» ответ
спутал, эта фунция прячет хендл, а не рисовку обеспечивает
function IsFlagBitSet takes integer flags, integer bit returns boolean
	if bit!=0 then
		return flags/bit*0x80000000 != 0
	endif
	return false
endfunction

function RMem takes integer addr returns integer
	if addr<0 or addr>0x7FFFFFFF then
		return 0
	endif
	return Memory[addr/4]
endfunction

function AddAlwaysVisibleFlag takes unit u returns nothing
	local integer a=ConvertHandle(u)
	if a>0 and IsFlagBitSet(RMem(a+0x20),0x10)==false then
		call WMem(a+0x20,RMem(a+0x20)+0x10)
	endif
endfunction
вместо юнита можно вроде любой виджет, просто смени входящий тип и проверь
» ответ
ClotPh:
Nelloy, ну тебе даже 1000 лвлов бы не хватило? У меня пассивка со 1000 уровнями спокойно прелоадится, очень тупо, значимо влияет на время загрузки карты, но очень легкореализуемо. А вообще при фантазии 100-200 лвлов хватить должно, если прям ппц предельной точности не должно быть.
Ну, офк, если через мемхак разберешься, будет лучше, это так, просто как альтернатива.
Допустим множитель точность 0.01 и шанс с точностью до 1%, 100 лвлов на каждый вариант множителя, от 1.0 до 3.0 нужно 20000 лвлов способности
Так что нет, спасибо
Вот именно предложенную тобой альтернативу решил переделать))
Стоит выложить наработку по генерации рельефа с помощью шумов Перлина?
Ничего особо примечательного там нет, и не подготовлена как наработка.
Спасибо велосипеду, разобрался. xgm.guru/p/wc3/181566

DracoL1ch #2 - 4 years ago (изм. ) 0
Голосов: +0 / -0
надо копать в setubertip/tip. поиск адресов через GetAbilityUIDefAddr (итем равноценен абилке) или более свежие варианты функции (из последней версии мх). SetAbilityUbertip попробуй
Nelloy #3 - 4 years ago (изм. ) 0
Голосов: +0 / -0
Вечером попробую, отпишусь. Думал итем ближе к юниту, а не к абилке
А, да. У итемов же 2 описания... Надеюсь получится менять оба
DracoL1ch #4 - 4 years ago 0
Голосов: +0 / -0
как у абилки, меняй tip/ubertip, вроде они соответствуют имени и описанию итема. в крайнем случае глянуть офсета description
Nelloy #5 - 4 years ago 0
Голосов: +0 / -0
Для меня "глянуть" это выводить все офсеты поочереди и смотреть где выдаст текст)
DracoL1ch #6 - 4 years ago 0
Голосов: +0 / -0
намана, у артов описаине в убертипе абилок, уровень, поятное дело, 1
Nelloy #7 - 4 years ago (изм. ) 0
Голосов: +0 / -0
SetAbilityUbertip('I000',1,"Test") ничего не изменил
А на счет оффсетов, где их глянуть можно?
GetAbilityStringParam2('I000',0x158,1) выдает null, при том что в полях записаны значения
Для цикла от 0 до 4000 (по +4) так же всегда null
PS: для абилок нормально выдает
Ах да, не пояснил, 'I000' - итем
GetAbilityUIDefAddr('I000') дает 0
PPS: предмет был создан на карте
DracoL1ch #8 - 4 years ago 0
Голосов: +0 / -0

ага, визуальные данные предметов в двух таблицах лежат, и у скиллов, и у юнитов. но рабочие те, что у юнитов, как выяснилось. так что SetUnitUbertip
Nelloy #9 - 4 years ago (изм. ) 0
Голосов: +0 / -0
Попробуемс)
Переписал GetAbilityStringParam, заменив GetAbilityUIDefAddr на GetUnitUIDefAddr, получил фатал
GetUnitUIDefAddr дает не 0
Перебором выяснит что некоторые оффсеты дают фатал, пробую искать дальше
DracoL1ch #10 - 4 years ago 0
Голосов: +0 / -0
зачем вообще что-то менять? разве в той версии еще нет функции этой?
SetUnitUbertip
загляни в тред про мемхак, там ссср должен был давно обновить
Nelloy #11 - 4 years ago 0
Голосов: +0 / -0
Смотрел по темам на хайве
DracoL1ch #12 - 4 years ago 0
Голосов: +0 / -0
на хайве больше ничего не будет
Nelloy #13 - 4 years ago 0
Голосов: +0 / -0
Это нашел, вот пытаюсь впихнуть нужные функции в NewGen
GetUnitUbertip - фатал
на юнита тоже...
DracoL1ch #14 - 4 years ago 0
Голосов: +0 / -0
покажи, как вызывал
адреса все корректные? в новой версии нигде делить на 4 не надо, и офсеты тоже новые в инициализации
Nelloy #15 - 4 years ago 0
Голосов: +0 / -0
Да, сижу, обновляю версию
Потом отпишусь о результатах
Как ни странно, перестал работать всё. Даже базовый урон на атаках не могу сменить
Скопировал все из карты, добавил нужные функции и ничего, теперь где-то в зкромах мемхака поток прерывается
DracoL1ch #16 - 4 years ago 0
Голосов: +0 / -0
если протсо прерывается, без фатала, где-то переменная не инициализирована
Nelloy #17 - 4 years ago (изм. ) 0
Голосов: +0 / -0
Ага инициализацию пофиксил
Вернулся к этой проблеме xgm.guru/p/100/189998
Как это сделать адекватно? SetAbilityRealParam не дает эффекта
» Вот
function SetAbilityReal takes unit u, integer id, integer off, real newVal, integer lvl returns nothing
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
set Memory[ Memory[Memory[k/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8 + off] = cleanInt(realToIndex(newVal))
endif
endfunction
function GetAbilityReal takes unit u, integer id, integer off, integer lvl returns real
local integer k=GetUnitAbility(u,id)
if Memory[k/4+0x54/4]>0 then
return cleanReal(indexToReal( Memory[ Memory[Memory[k/4+0x54/4]/4+0x54/4]/4 + (lvl-1)*26 + 8+off] ))
endif
return .0
endfunction
Set нормально работает с Evasion, а Get выдает фатал
Только Set высталяет что-то не то
DracoL1ch #18 - 4 years ago 0
Голосов: +0 / -0
а что ты от неё хочешь-то?
Nelloy #19 - 4 years ago 0
Голосов: +0 / -0
Менять параметры способностей, например, DataA
Проверил деление на 4, сделал через WMem/RMem - заработало как надо, хотел шанс уворота задавать
UnitUbertip и UnitTip так же работает, теперь бы с полями "Description" и "Name" разобраться
awesomesk1ll #20 - 4 years ago (изм. ) 0
Голосов: +0 / -0
хоткеи на лету уже разобрались как менять (у скиллов)? помоему самое профитное
и немного оффтопа, Лич, а ты реализовал пинги из доты2? ну типа чтоб при пингах на самой карте тож анимация рисовалась (помимо миникарты)
quq_CCCP #21 - 4 years ago 0
Голосов: +0 / -0
awesomesk1ll, пока вроде научились коверкать саму миникарту, ну и в мемхаке видел события на пинг по карте, насчет динамической смены текстуры цветной точки на иконку героя хз, но вряд-ли что то мешает.
Nelloy #22 - 4 years ago 0
Голосов: +0 / -0
Есть какие идеи по полям "Name" и "Description"?
Это то описание что отображается вне инвентаря, не критично, но хотелось бы)
DracoL1ch #23 - 4 years ago 0
Голосов: +0 / -0
function GetUnitUIName takes integer id returns string
	local integer a=GetUnitUIDefByIdCaching(id)
	if a>0 then
		set a=RMem(a+0x28)
		if a>0 then
			return ConvertNullTerminatedStringToString(RMem(a))
		endif
	endif
	return null
endfunction

function SetUnitUIName takes integer id, string s returns nothing
	local integer a=GetUnitUIDefByIdCaching(id)
	if a>0 then
		set a=RMem(a+0x28)
		if a>0 then
			call WMem(a,GetStringAddress(s))
		endif
	endif
endfunction

function GetUnitUIDescription takes integer id returns string
	local integer a=GetUnitUIDefByIdCaching(id)
	if a>0 then
		set a=RMem(a+0x2C)
		if a>0 then
			return ConvertNullTerminatedStringToString(a)
		endif
	endif
	return null
endfunction

function SetUnitUIDescription takes integer id, string s returns nothing
	local integer a=GetUnitUIDefByIdCaching(id)
	if a>0 then
		call WMem(a+0x2C,GetStringAddress(s))
	endif
endfunction
Nelloy #24 - 4 years ago 0
Голосов: +0 / -0
круто, круто, спасибо