Загрузка своих TXD - Форум
Вторник, 06.12.2016, 11:15
Качественные скрипты, моды и дополнения для GTA без регистрации
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Игры серии ГТА » Справочная информация » Загрузка своих TXD (Пример)
Загрузка своих 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 и текстур. Но об этом будет написано позже)
Полный код в аттаче.
Прикрепления: textur.txt(2Kb)


Сообщение отредактировал DK22Pac - Суббота, 28.01.2012, 00:25
 
Den_spbДата: Суббота, 28.01.2012, 00:27 | Сообщение # 2
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: 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.
Прикрепления: textures.txt(4Kb)
 
DK22PacДата: Вторник, 28.02.2012, 23:02 | Сообщение # 7
$player_actor
Группа: Проверенные
Сообщений: 559
Статус: Offline
Получение RwTexture* загруженных текстур.
Прикрепления: findtexture.txt(1Kb) · 1150642.jpg(38Kb)
 
Den_spbДата: Среда, 29.02.2012, 01:27 | Сообщение # 8
Создатель сайта
Группа: Администраторы
Сообщений: 1536
Статус: Offline
Интересный код up
 
Форум » Игры серии ГТА » Справочная информация » Загрузка своих TXD (Пример)
Страница 1 из 11
Поиск: