Przy tworzeniu nowych misji, bądź innych skryptów czasem zachodzi potrzeba zmiany wyglądu gracza na zupełnie inny model. To prosty zabieg, który przedstawię w tym poradniku na dwa sposoby.
Zmiana wyglądu gracza na już istniejący model w grze, bądź taki, który został podmieniony za oryginalny:
Kod:
0247: load_model #MALE01
038B: load_requested_models
09C7: change_player
$PLAYER_CHAR model_to #MALE01
0249: release_model #MALE01
Zmiana wyglądu gracza na zupełnie nowy model wymaga dodanie go do archiwum
gta3.img. Operacje na plikach
*.img są opisane
w tym poradniku.
Jeżeli wgrałeś już swój model, to musisz załadować go jako
model aktora specjalnego.
Kod:
023C: load_special_actor
'NAZWA_PLIKU_MODELU' as 1
038B: load_requested_models
09C7: change_player
$PLAYER_CHAR model_to #SPECIAL01
0296: unload_special_actor 1
Zauważ, że zmieniamy model gracza na
#SPECIAL01, który odpowiada identyfikatorowi ustawionemu w opcodzie
023C
Poniższa
funkcja SCM umożliwia zmianę modelu gracza na dowolny model bez wczytywania go jako
aktora specjalnego. Może to być użyteczne, gdy chcemy mieć pewność, że nasz model aktora specjalnego nie zostanie nadpisany przez żadne zewnętrzne skrypty lub wątek
MAIN.
Na końcu swojego skryptu dodaj dwie procedury, które będą potrzebne do przeprowadzenia tej operacji. Nazwę modelu ustaw w procedurze
NAZWA_MODELU.
UWAGA! Nazwa modelu
nie może przekraczać ośmiu znaków. Do nazwy modelu
nie dodawaj rozszerzenia *.dff.
Kod:
:ChangePlayerModel
0A9F: 2@ = current_thread_pointer
000A: 2@ += 0x10
0A8D: 2@ = read_memory
2@ size 4 virtual_protect 0
0062: 2@ -=
1@
000A: 2@ += 0x4
for 3@ = 0
to 7
0A8E: 4@ =
2@ +
3@
0A8D: 5@ = read_memory
4@ size 1 virtual_protect 0
if and
0029: 5@ >= 0x41
002B: 0x5A >=
5@
then
000A: 5@ += 0x20
0A8C: write_memory
4@ size 1 value
5@ virtual_protect 0
end
end
0AA5: call 0x409D10 num_params 3 pop 3 26
2@ 0
038B: load_requested_models
if 0039: 0@ == 0
then 008B: 2@ =
$PLAYER_ACTOR
else 008B: 2@ =
$SECOND_PLAYER_ACTOR
end
0A96: 2@ = actor
2@ struct
0A8E: 3@ =
2@ + 0x4D4
0A8D: 4@ = read_memory
2@ size 4 virtual_protect 0
0A8D: 5@ = read_memory
3@ size 4 virtual_protect 0
0A8E: 6@ =
4@ + 0x20
0A8D: 6@ = read_memory
6@ size 4 virtual_protect 0
0AA6: call_method
6@ struct
2@ num_params 0 pop 0
0A8E: 7@ =
2@ + 0x22
0A8C: write_memory
7@ size 2 value 0xFFFF virtual_protect 0
0A8E: 8@ =
4@ + 0x14
0A8D: 8@ = read_memory
8@ size 4 virtual_protect 0
0AA6: call_method
8@ struct
2@ num_params 1 pop 0
0@
0A8C: write_memory
3@ size 4 value
5@ virtual_protect 0
0AB2: ret 0
:NAZWA_MODELU
0662: NOP
"nazwa_modelu"
0000: NOP
Teraz wystarczy użyć utworzonych funkcji w dowolnym miejscu swojego skryptu:
Kod:
0AB1: call_scm_func
@ChangePlayerModel 2 change_player
$PLAYER_CHAR model_to
@NAZWA_MODELU
070D: rebuild_player
$PLAYER_CHAR