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

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

ага, визуальные данные предметов в двух таблицах лежат, и у скиллов, и у юнитов. но рабочие те, что у юнитов, как выяснилось. так что SetUnitUbertip
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
19
7 лет назад
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

0
16
7 лет назад
Отредактирован DracoL1ch
0
надо копать в setubertip/tip. поиск адресов через GetAbilityUIDefAddr (итем равноценен абилке) или более свежие варианты функции (из последней версии мх). SetAbilityUbertip попробуй
0
13
7 лет назад
Отредактирован Nelloy
0
Вечером попробую, отпишусь. Думал итем ближе к юниту, а не к абилке
А, да. У итемов же 2 описания... Надеюсь получится менять оба
0
16
7 лет назад
0
как у абилки, меняй tip/ubertip, вроде они соответствуют имени и описанию итема. в крайнем случае глянуть офсета description
0
13
7 лет назад
0
Для меня "глянуть" это выводить все офсеты поочереди и смотреть где выдаст текст)
0
16
7 лет назад
0
намана, у артов описаине в убертипе абилок, уровень, поятное дело, 1
0
13
7 лет назад
Отредактирован Nelloy
0
SetAbilityUbertip('I000',1,"Test") ничего не изменил
А на счет оффсетов, где их глянуть можно?
GetAbilityStringParam2('I000',0x158,1) выдает null, при том что в полях записаны значения
Для цикла от 0 до 4000 (по +4) так же всегда null
PS: для абилок нормально выдает
Ах да, не пояснил, 'I000' - итем
GetAbilityUIDefAddr('I000') дает 0
PPS: предмет был создан на карте
0
16
7 лет назад
0
ага, визуальные данные предметов в двух таблицах лежат, и у скиллов, и у юнитов. но рабочие те, что у юнитов, как выяснилось. так что SetUnitUbertip
Принятый ответ
0
13
7 лет назад
Отредактирован Nelloy
0
Попробуемс)
Переписал GetAbilityStringParam, заменив GetAbilityUIDefAddr на GetUnitUIDefAddr, получил фатал
GetUnitUIDefAddr дает не 0
Перебором выяснит что некоторые оффсеты дают фатал, пробую искать дальше
0
16
7 лет назад
0
зачем вообще что-то менять? разве в той версии еще нет функции этой?
SetUnitUbertip
загляни в тред про мемхак, там ссср должен был давно обновить
0
13
7 лет назад
0
Смотрел по темам на хайве
0
16
7 лет назад
0
на хайве больше ничего не будет
0
13
7 лет назад
0
Это нашел, вот пытаюсь впихнуть нужные функции в NewGen
GetUnitUbertip - фатал
на юнита тоже...
0
16
7 лет назад
0
покажи, как вызывал
адреса все корректные? в новой версии нигде делить на 4 не надо, и офсеты тоже новые в инициализации
0
13
7 лет назад
0
Да, сижу, обновляю версию
Потом отпишусь о результатах
Как ни странно, перестал работать всё. Даже базовый урон на атаках не могу сменить
Скопировал все из карты, добавил нужные функции и ничего, теперь где-то в зкромах мемхака поток прерывается
0
16
7 лет назад
0
если протсо прерывается, без фатала, где-то переменная не инициализирована
0
13
7 лет назад
Отредактирован Nelloy
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 высталяет что-то не то
0
16
7 лет назад
0
а что ты от неё хочешь-то?
0
13
7 лет назад
0
Менять параметры способностей, например, DataA
Проверил деление на 4, сделал через WMem/RMem - заработало как надо, хотел шанс уворота задавать
UnitUbertip и UnitTip так же работает, теперь бы с полями "Description" и "Name" разобраться
0
21
7 лет назад
Отредактирован awesomesk1ll
0
хоткеи на лету уже разобрались как менять (у скиллов)? помоему самое профитное
и немного оффтопа, Лич, а ты реализовал пинги из доты2? ну типа чтоб при пингах на самой карте тож анимация рисовалась (помимо миникарты)
0
32
7 лет назад
0
awesomesk1ll, пока вроде научились коверкать саму миникарту, ну и в мемхаке видел события на пинг по карте, насчет динамической смены текстуры цветной точки на иконку героя хз, но вряд-ли что то мешает.
0
13
7 лет назад
0
Есть какие идеи по полям "Name" и "Description"?
Это то описание что отображается вне инвентаря, не критично, но хотелось бы)
0
16
7 лет назад
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
0
13
7 лет назад
0
круто, круто, спасибо
Чтобы оставить комментарий, пожалуйста, войдите на сайт.