Разобрав алгоритм загрузки текстур в .exe, написал такой код, который демонстрирует использование новодобавленной текстуры в particle.txd:
Code
{$CLEO .cs}
0AA5: call 0x7316A0 num_params 0 pop 0 // _saveTexDictionary
0AA7: call_function 0x731850 num_params 1 pop 1 0x85C648 1@ // _txdIndexByName
0AA5: call 0x7319C0 num_params 1 pop 1 1@ // _txdSetCurrent
0AC6: 0@ = label @__texture offset // "tailight"
0AA7: call_function 0x7F3AC0 num_params 2 pop 2 0 0@ 1@ // _RwReadTexture
0AA5: call 0x7316B0 num_params 0 pop 0 // $restoreTexDictionary
while true
if
player.Defined(0)
then
00A0: store_actor $player_actor position_to 2@ 3@ 4@
0AC7: 5@ = var 2@ offset
0AA5: call 0x707390 num_params 16 pop 16 0 0 0x3F800000 0 0x447A0000 255 255 255 255 0xC1400000 0 0 0x41400000 5@ 1@ 2
end
003D:
end
:__texture
hex
"tailight" 00
end
Правда, надо ещё будет добавить выгрузку текстуры в CGame_Terminate. Это выглядит примерно так:
Code
0AC6: 31@ = label @__asm offset
0AC6: 39@ = label @__jmp offset
0AB1: call_scm_func @define_jump_to_asm_inj 4 asm_inj 31@ jump_from 0x706F57 then_jump 0x706F5F offset_jump_in_asm 30@
31@ += 8
0A8C: write_memory 31@ size 4 value 1@ virtual_protect 0
...
:__asm
hex
B8 20 38 7F 00 // mov eax, 0x7F3820 ; _RwTextureDestroy
FF D0 // call eax
68 00 00 00 00 // push 0
B8 20 38 7F 00 // mov eax, 0x7F3820 ; _RwTextureDestroy
FF D0 // call eax
83 C4 34 // add esp, 0x34
end
:__jmp
hex
E9 00 00 00 00 // jmp 0
end
:define_jump_to_asm_inj
0A8C: write_memory 1@ size 1 value 0xE9 virtual_protect 1
0085: 4@ = 1@
4@ += 5
0062: 0@ -= 4@
1@ += 1
0A8C: write_memory 1@ size 4 value 0@ virtual_protect 1
0085: 4@ = 3@
4@ += 5
0062: 2@ -= 4@
3@ += 1
0A8C: write_memory 3@ size 4 value 2@ virtual_protect 1
0AB2: ret 0