人物車その他を作るときに注意すべき事

Last-modified: 2018-12-18 (火) 21:17:35
 

ガオンッ!現象について

0053: $PLAYER_CHAR = create_player #NULL at 0.0 0.0 0.0
00A5: 0@ = create_car #PONY at 0.0 0.0 0.0
009A: 0@ = create_actor_pedtype 4 model #MALE01 at 0.0 0.0 0.0
0107: $99 = create_object #AD_FLATDOOR at 0.0 0.0 0.0
00A1: put_actor $PLAYER_ACTOR at 0.0 0.0 0.0
00AB: put_car 0@ at 0.0 0.0 0.0
01BC: put_object 0@ at 0@ 1@ 2@

上記のコードで人物車を作ると作った座標にあった人物車が消滅してしまいます。
従って、何も考えずポコポコポコポコ作っていると、他の処理で使用しているものを消してしまい不具合が出ることがあります。
指定した座標に作るのではなく、下記のコードのように作ってから指定した座標に置く方が良いと思います。

// 12@13@14@が作りたい座標
14@ += 100.0
0107: 16@ = create_object 18@ at 12@ 13@ 14@
14@ -= 100.0
if
03CA: (check) object 16@ exists
then
    ////////////set_obj_pos////////
    0A98: 12@ = object 16@ struct
    000A: 12@ += 0x14
    0A8D: 12@ = read_memory 12@ size 4 virtual_protect 0
    000A: 12@ += 0x30
    0A8C: write_memory 12@ size 4 value 12@ virtual_protect 0
    000A: 12@ += 0x04
    0A8C: write_memory 12@ size 4 value 13@ virtual_protect 0
    000A: 12@ += 0x04
    0A8C: write_memory 12@ size 4 value 14@ virtual_protect 0
    ////////////set_obj_pos////////
end

作ったものの後始末について

下記のコードで作ったオブジェクトやマーカーは、後処理をせずにセーブしてしまうとずっと消えなくなってしまうようです。

0107: $99 = create_object #AD_FLATDOOR at 0.0 0.0 0.0
0167: 0@ = create_marker_at 0@ 1@ 2@ flags 0 2
0188: 0@ = create_marker_above_object 0@
 

オブジェクトの場合は用が済んだら下記のコードを実行するようにしましょう。

01C4: remove_references_to_object 0@ // This object will now disappear when the player looks away
 

マーカーの場合は毎フレーム下記のコードを実行し、フレーム毎にマーカーを作り直すのが良いでしょう。

if
075C: (check) marker 0@ enabled
then
    0164: disable_marker 0@
end

もしくはオブジェクトにつけず、人や車につけるようにしましょう。
なぜか人や車はリムーブリファレンスしなくても勝手に消えてくれるようです(するに越したことはありませんが)。
つけた対象が消滅すればマーカーも消えます(多分)。

リムーブリファレンスについて

01C2: remove_references_to_actor $PLAYER_ACTOR // Like turning an actor into a random pedestrian
01C3: remove_references_to_car 0@ // Like turning a car into any random car
01C4: remove_references_to_object 0@ // This object will now disappear when the player looks away

生成したオブジェクトなどにこれらのコードを実行することで、プレイヤーから離れると勝手に消えるようになります。
特にオブジェクトについてはセーブしても残ることがなくなります。

 

もし生成直後にリムーブリファレンスする場合、突然消えることを想定してスクリプトを作らなければなりません。
ミサイルなどをプレイヤーから離れたところに飛ばすには、毎フレーム存在するか確認して、存在しなくなったら同じ座標に作り直す必要があるかもしれません。
そんなことをするのは大変なので大抵はリムーブリファレンスせず飛ばしますが…

 

セーブするとオブジェクトが残ることを知らないのか、気にしてないのかは分かりませんが、大抵の人は知らないことだと思います。
※GTASAでは残ったりしないようにミッション中はセーブできないようになっています。