Загрузка своих TXD
|
|
DK22Pac | Дата: Суббота, 28.01.2012, 00:20 | Сообщение # 1 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| В этом примере я покажу, как загрузить TXD и получить возможность использовать текстуры, которые в нём находятся. Мы создадим буфер из 13 4-байтовых ячеек, в которые позже запишем адреса структур текстур. Code :textures hex 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 end Загрузка TXD Code 0AA7: call_function 0x731C80 num_params 1 pop 1 "rlogos" 0@ // _txdAdd // имя нового элемента в TXDpool 0AA7: call_function 0x7320B0 num_params 2 pop 2 "MODELS\\RLOGOS.TXD" 0@ 1@ // _txdLoad // путь к файлу 0AA5: call 0x731A00 num_params 1 pop 1 0@ // _txdAddRef 0AA5: call 0x7316A0 num_params 0 pop 0 // _saveTexDictionary 0AA7: call_function 0x7319C0 num_params 1 pop 1 0@ 1@ // _txdSetCurrent Загружаем нужные текстуры, записываем адреса структур текстур в наш буфер. Также, "восстанавливаем" сохранённый TXD. Code 0AC6: 0@ = label @textures offset 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_TPLAYERa" "radio_TPLAYER" 1@ // $CTexture__read // Альфа-маска ; Текстура 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_csra" "radio_csr" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_WCTRa" "radio_WCTR" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_SFURa" "radio_SFUR" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_RLSa" "radio_RLS" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_RADIOXa" "radio_RADIOX" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_playbacka" "radio_playback" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_mastera" "radio_master" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_krosea" "radio_krose" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_kjaha" "radio_kjah" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_KDSTa" "radio_KDST" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "radio_bouncea" "radio_bounce" 1@ // $CTexture__read 0@ += 4 0AA8: call_function_method 0x7272B0 struct 0@ num_params 2 pop 0 "arrowa" "arrow" // $CTexture__read 0AA7: call_function 0x7316B0 num_params 0 pop 0 // $restoreTexDictionary Ну и проверим загруженную текстуру в игре. Я решил заменить ею иконки оружия ("кулак" - не в счёт)). Code 0AC6: 0@ = label @textures offset 0A8C: write_memory 0x58D84B size 1 value 0xA1 virtual_protect 1 // mov eax, @textures 0A8C: write_memory 0x58D84C size 4 value 0@ virtual_protect 1 0A93: Вот и всё) Осталось только добавить выгрузку TXD и текстур. Но об этом будет написано позже) Полный код в аттаче.
Сообщение отредактировал DK22Pac - Суббота, 28.01.2012, 00:25 |
|
| |
Den_spb | Дата: Суббота, 28.01.2012, 00:27 | Сообщение # 2 |
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
| То есть этот способ предназначен для замены стандартных текстур прямо в процессе игры?
|
|
| |
DK22Pac | Дата: Суббота, 28.01.2012, 00:37 | Сообщение # 3 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Не только. Я хочу использовать текстуры в опкоде 038D. Но проблема в том, что передать адрес вместо ID текстуры не выйдет (в структуре CTextSprites для хранения ID выделено 2 байта), поэтому мне придёться переписывать (немножко подкорректировать) процедуру, которая рендерит текст-спрайты.
Сообщение отредактировал DK22Pac - Суббота, 28.01.2012, 00:38 |
|
| |
Den_spb | Дата: Суббота, 28.01.2012, 00:46 | Сообщение # 4 |
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
| Quote (DK22Pac) Но проблема в том, что передать адрес вместо ID текстуры не выйдет А зачем передавать адрес? Почему нельзя воспользоваться стандартными опкодами загрузки текстур, которые возвращают ИД текстуры?
|
|
| |
DK22Pac | Дата: Суббота, 28.01.2012, 01:53 | Сообщение # 5 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Потому что при использовании 0391 все текстуры, загруженные стандартными опкодами, выгружаются.
|
|
| |
DK22Pac | Дата: Суббота, 28.01.2012, 20:48 | Сообщение # 6 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Продолжим. Надо добавить выгрузку текстур. Эт у выгрузку мы добавим сразу после вызова _releaseHudTextures. Вот так будет выглядеть нужный код на ассемблере. Code :releaseTextures hex A1 B0 89 71 00 // mov eax, 0x7189B0 FF D0 // call eax 56 // push esi 57 // push edi 33 FF // xor edi, edi BE 00 00 00 00 // mov esi, offset @textures 8B CE // mov ecx, esi A1 40 72 72 00 // mov eax, 0x727240 ; CTexture__clean FF D0 // call eax 83 C6 04 // add esi, 4 47 // inc edi 83 FF 0D // cmp edi, 0xD 7C EE // jl short @label1 68 00 00 00 00 // push offset @name A1 50 18 73 00 // mov eax, 0x731850 ; _txdIndexByName FF D0 // call eax 50 // push eax A1 D0 1C 73 00 // mov eax, 0x731CD0 ; _texDictionaryRemove FF D0 // call eax 83 C4 08 // add esp, 8 5F // pop edi 5E // pop esi end Добавим jump на метку releaseTextures. Также запишем указатели (на адреса структур текстур, и на название TXD) в ассемблеровский код. Code 0AC6: 0@ = label @releaseTextures offset 0@ += 5 0A8C: write_memory 0@ size 4 value 1@ virtual_protect 1 0@ += 23 0AC6: 1@ = label @name offset 0A8C: write_memory 0@ size 4 value 1@ virtual_protect 1 0@ -= 28 0AC6: 1@ = label @jmp_back offset 0AB1: call_scm_func @asmdef 4 asm_inj 0@ jump_from 0x53BBA7 then_jump 0x53BBAC offset_jump_in_asm 1@ В конце добавим scm-функцию asmdef, 5 байт для записи адреса jump'а (адрес находит и записывает scm-функция), и буфер, который содержит имя TXD.
|
|
| |
DK22Pac | Дата: Вторник, 28.02.2012, 23:02 | Сообщение # 7 |
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
| Получение RwTexture* загруженных текстур.
|
|
| |
Den_spb | Дата: Среда, 29.02.2012, 01:27 | Сообщение # 8 |
Создатель сайта
Группа: Администраторы
Сообщений: 1600
Статус: Offline
| Интересный код
|
|
| |