【GTA5】敵対マーカーが付いているPedを取得する方法【MOD】

はじめに

このブログでは時々、GTA5のスクリプトMOD関連についての記事を書いていきたいと思っています。
Script Hook V .NETの日本語情報は極端に少ないので、私が日本語で記事を書くことで情報を残していきたいと思っています。
需要があるかどうかは別として...

やること

さて、今回は敵対しているキャラクタ (Ped) を取得する方法をメモしたいと思います。
敵対している」と言っても、色々な基準や判定方法がありますが、今回は右下のミニマップ上で赤色に表示されているPedを敵対しているとみなすことにします。

実際のコード

とりあえずコードです。

using System;
using System.Linq;
using GTA;
using GTA.Native;

namespace GTAScript
{
    public class MyScript : Script
    {
        public MyScript()
        {
            Tick += (s, e) =>
            {
                var enemies =
                    World.GetNearbyPeds(Game.Player.Character, 50.0f)
                    .Select(p => (ped: p, blip: p.CurrentBlip))
                    .Where(p => p.blip != null && p.blip.IsOnMinimap)
                    .Where(p => Function.Call<int>(Hash.GET_BLIP_HUD_COLOUR, p.blip.Handle) == 6)
                    .Select(p => p.ped);
            };
        }
    }
}

変数 enemies にミニマップ上で赤色に表示されているPedのコレクションが入っています。

軽く説明する

v2.9.6 の時点で Blip クラスに Color プロパティはあるんですが、このプロパティというのはミニマップ上での色とは関係がないようでした。
(p.CurrentBlip.Color == BlipColor.Redでは正しく判定できなかった)
そのため、ネイティブ関数を呼び出すことでミニマップ上での描画色を取得する方法を取りました。

何度か検証したところ GET_BLIP_HUD_COLOUR が返す値が 6 のとき、ミニマップ上での描画色が赤色だったみたいなので、6 と等しいかで判定させています。

ちなみに、フランクリンの場合、9 が描画色として返ってきました。
また、警察官の場合、Blip.IsOnMinimap プロパティが false を返すような仕様になっていました。
なんででしょうかね? 謎ですね。

ということで初のGTA5のスクリプトMOD関連の記事でした。

2017/05/27 22:44:29
コメントを投稿する