Чета облазил и не нашел чтобы менять потрет у данного героя... Я бы через морф делал с 6 таких моделей но с разными потретами но это же бред.. есть ли проше?
PS Суть у мя модель прозрачный который крепляет атачи к героя разными скинами чтоб и потрел выглядел.

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

function ChangeUnitPortraitTo takes unit u, string modelpath returns nothing
	set LastConvertedHandle=ConvertHandle(u)
	if LastConvertedHandle>0 then
		call CallThisCallWith3Args(GameDLL+0x33ADC0,LastConvertedHandle,GetStringAddress(modelpath),1)
	endif
endfunction
насколько помню, это меняет на одно выделение, нужно постоянно заново вызывать,если хочешь на постоянку
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
21
5 лет назад
0
вообще можно динамически текстуру менять даже без мемхака были статьи
но это кривовато
а тут имхо проще искать способ сразу всю модель менять
0
23
5 лет назад
0
ClotPh, не текстура у мя.. Как бы разные расы но 1 тот же герой если понял =)
1 герой прозрачный но каждый части руки ноги тело голов разные крепит на героя прозрачного
как меняю голову человек на волка то и потрет должен менять
0
21
5 лет назад
0
pro100master, а, понятно, тогда да, по-твоему надо
0
32
5 лет назад
0
Надо у наших гуру мемхака спросить, я знаю только
    function SetUnitPortrait takes integer uiobjectaddr, string s returns nothing
        call WriteNullTerminatedString( s, uiobjectaddr + 0x34 )
    endfunction
но не пойму что такое uiobjectaddr
0
23
5 лет назад
0
Bergi_Bear, адрес на обьект видимо надо получить после юнита
Bergi_Bear, а где ты этот код нашел я в лазил не нашел... 0_о
0
32
5 лет назад
0
pro100master, дык и как получить, что туда написать? мне просто тоже нужна нормальная функция для смены портрета
pro100master, он есть в мемхаке второй версии
Вспомнил мне отвечали недавно, но я так и не проверил:
//Модель портрета
    //----Узнать путь портрета указанного типа юнита (id - rawcode юнита)
    //Изменение распространяется на тип, это значит, распространяется на всех юнитов двнного типа
    function GetUnitModelPortrait takes integer id returns string
        local integer k=GetUnitUIDefByIdCaching(id)
        if k < 1 then
            return null
        endif
        set k=k+0x34
        if RMem(k)>0 then
			return ConvertNullTerminatedStringToString(RMem(k))
        endif
        return null
    endfunction
    //----Изменить путь портрета указанного типа юнита (uiobjectaddr - адрес указанного типа юнита)
    function SetUnitPortrait takes integer uiobjectaddr, string s returns nothing
        call AddNewOffsetToRestoreFast(uiobjectaddr+0x34)
        call WMem(uiobjectaddr+0x34, GetStringAddress(s))
    endfunction
    //----Изменить путь портрета указанного типа юнита (id - rawcode юнита)
    function SetUnitPortraitById takes integer id, string s returns nothing
        call SetUnitPortrait(GetUnitUIDefByIdCaching(id),s)
    endfunction    
И в любом случае, эта функция работа, поидее меняет для ТИПА юнита, то бишь у всех портреты полетят =(
0
23
5 лет назад
0
пробую так
function SetUnitPortrait takes unit u, string s returns nothing
        local integer pConvertedHandle = ConvertHandle(u)
        if pConvertedHandle > 0 then
            call WriteRealMemory(pConvertedHandle + 0x34, GetStringAddress(s))
        endif
    endfunction
крашит =) Но мне надо отдельный потрет каждого юнита. Но видимо придеться морфить просто иметь 6 моделей одинаковых это уже лишный вес 500 кб итог 3 мб встанет
0
32
5 лет назад
0
pro100master, да погоди, я уверен есть способ
0
23
5 лет назад
0
Bergi_Bear, я и не терял духом ковыряю способом =)
3
16
5 лет назад
3
function ChangeUnitPortraitTo takes unit u, string modelpath returns nothing
	set LastConvertedHandle=ConvertHandle(u)
	if LastConvertedHandle>0 then
		call CallThisCallWith3Args(GameDLL+0x33ADC0,LastConvertedHandle,GetStringAddress(modelpath),1)
	endif
endfunction
насколько помню, это меняет на одно выделение, нужно постоянно заново вызывать,если хочешь на постоянку
Принятый ответ
0
32
5 лет назад
0
DracoL1ch, должно сработать!
можно хранить где нить в хеш таблице текущий портрет и вызывать его по событию "юнит выбран"
pro100master, проверил работает?
0
23
5 лет назад
0
Bergi_Bear, проверю вечером.
0
26
5 лет назад
0
Событие Юнит Выбран работает с задержкой.
0
23
5 лет назад
0
8gabriel8, при создание юнита его вручаем потрет, после выбора юнита он сбрасывает данные и устанавливаем новый и не заметиш как потрет меняет...
0
26
5 лет назад
0
В том и дело, что заметишь.
0
32
5 лет назад
0
8gabriel8, никогда не замечал этой задержки, знаю есть задержка если выбрать/снять выделение, на долю секунды можно увидеть кого выбрал, но мы же не будем снимать выделение..., ждём тестов pro100masterа
0
26
5 лет назад
0
Вот оно как, тогда замечательно) предполагал вину за задержку на событии, а не действии
0
23
5 лет назад
0
DracoL1ch, чет крашит. set address_GameBase = ReadRealMemory(bytecodeAddress) - 0x951060 адрес все верно и тот код выше но крашит.
0
21
5 лет назад
0
В рефордже и 1.30 же тоже нет смены модели юниту на постоянку (портрета или вообще)?
Надо бы, как мемхаком это все будет долизано, тогда отдельный сабж создать, т. к. вещь-то нужная для всяких оборотней. Стандартные варкрафтовские морфы не очень
0
32
5 лет назад
0
DracoL1ch, чет крашит. set address_GameBase = ReadRealMemory(bytecodeAddress) - 0x951060 адрес все верно и тот код выше но крашит.
Проверил, тоже крашит
0
23
5 лет назад
0
Bergi_Bear, я думаю лич копировал для 1.27 =)
0
16
5 лет назад
0
нет, у меня только 1.26
ну раз не пашет, значит без вариантов) я её не использую
0
23
5 лет назад
0
DracoL1ch, а если изменять потрет тип юнитов через локально пашет?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.