スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

gta4_memo

来たるべき日のために…メモメモ。
(長文注意)

GTAⅣ C++ ScriptHook メモ1
最近、GTAⅣ C++ ScriptHookでMOD作って遊んでおります。
といってもかなり初歩的な事しかしかできてないですけどね。

もっと凝ったの作ろうと思ったらもうちょっと仕様を理解しないといけないですね。
市民を操ろうにも、PedGroupって概念があるみたい。これの仕様がどこにも書いてない困る。
というよりも、関数すら何も説明が無いから困る。使い方を試行錯誤して調べるしかないのかねぇ。


とりあえず、現状まででわかったことをメモ。

↓続きへ
・ニコを取得

static Ped player;
static Player playerIndex = ConvertIntToPlayerIndex(GetPlayerId());
GetPlayerChar(playerIndex, &player);
 
 これでplayerにニコが割り当てられる。

--------------------------------------------------------------------------------

・市民を取得

static Ped ped;
static float px,py,pz;
GetCharCoordinates(player, &px, &py, &pz);
GetRandomCharInAreaOffsetNoSave( px , py , pz , rx , ry , rz , &ped );

 まずニコの現在位置を取得しています
 そこから半径(x,y,z方向)の範囲内からランダムで市民を1人取得します。取得された市民はpedに入る。
 
 ただし、市民の取得に失敗(市民が周りに居ない時など)した場合でもpedには何かしら入ってます。
 なので、市民の取得に成功したかは DoesCharExist(ped) を使ってpedが有効かチェックするべきです。
 pedの指す市民が存在していたらTRUEが返却されます。FALSEなら取得に失敗しています。

 GetRandomCharInAreaOffsetNoSave関数は一度取得した市民を再度渡してくることがあります。
 なので複数の市民を操作する場合は配列に確保するなどして重複チェックをすると良いです。

--------------------------------------------------------------------------------


・数字の表示
DisplayTextWithNumber(f32 x, f32 y, const ch *gxtName, i32 value) ;
DisplayTextWithFloat(f32 x, f32 y, const ch *gxtName, f32 value, u32 unknown) ;

 いやらしい関数だと思う。とりあえず使い方がイマイチよくわからない。
 とりあえず、 x , yは表示する座標であり、それぞれ0~1の間で小数値で指定します。
*gxtNameの所は"NUMBER"と指定します。
 valueの所は表示する値。
 unknownは多分有効にするかどうか。1でいいと思う。


u32 PlayerHeath;
GetCharHealth(player, &PlayerHealth);
DisplayTextWithNumber(0.1f, 0.1f,"NUMBER", Playerhealth ) ;

これで画面左上にニコの体力が数値として表示されるはずです。(試してない


 ただ、文字列を表示する関数
 DisplayText(f32 x, f32 y, const ch *gxtName);
 が上手く動いてくれないのは何故なんでしょう・・・。


--------------------------------------------------------------------------------


いろいろと調べてわかったのはこれくらいかな。
後は関数名から動作を想像して組むしかないですね。
ただ、変数名にunknownとか書いてあるからややこしい。引数が何を指すパラメータなのかわからないとどうしようもないじゃねーか!


おまけ

警察に仕事させるような関数がないかなって調べてたら

SetCharWantedByPolice(Ped ped, b8 wanted)

って関数があったんですよ。雰囲気的に指定した市民を警察が逮捕する関数かなって感じですよね。
でも実際動かしたら何もしない警官・・・。やはり二つ目の変数wantedがどういう意味を持つのかわからないですからね・・・。


とりあえず、素手オンリーのカオスモードMODは作ることができました。
けど武器もたせるとなると面倒くさそうなので今日はここまで。


実は車の取得が成功したかチェックするために、車にわかりやすい変化を付けてみようと思って組んだテスト用のスクリプトです。
実際動かしたらツボ入ったので動画にしてみた。


Ped ped;
Ped player;
static Player playerIndex = ConvertIntToPlayerIndex(GetPlayerId());
static float px,py,pz;
GetPlayerChar(playerIndex, &player);
Vehicle pVehicle;

GetCharCoordinates(player, &px, &py, &pz);
pVehicle = GetClosestCar(px,py,pz,20,false,0);
if(DoesVehicleExist(pVehicle)){
  PrintStringWithLiteralStringNow("STRING", "GET CAR",2000,1);
  GetDriverOfCar(pVehicle,&ped);
  if(DoesCharExist(ped)){
    SetCarForwardSpeed(pVehicle,100.);
   }
  }
}


テスト目的だけあってシンプル。
車を取得した後、車にドライバーがいるかチェックしております。
チェックしないと駐車してあるのまで吹っ飛ぶから車に乗れなくなっちゃうんですよね。
実際はオン、オフできるようにもうちょっとややこしくなってますがね。

GTAⅣ C++ ScriptHook メモ2
とりあえずまた新たに即席でMOD作りました。
といっても5時間くらいかかったけどね。

とりあえずわかったことメモ。今回はunknown変数の1つを解明したぜ。


--------------------------------------------------------------------------------

・マップのアイコン(ターゲットマーカ、建物アイコンなど)の取得方法

Blip tarBlip;
tarBlip = GetFirstBlipInfoId(BLIP_WAYPOINT);

Blipがマップのアイコンを指す構造体。
GetFirstBlipInfoId ( eBlipSprite )でマップ上に存在する指定したタイプ eBlipSpriteのアイコンを返してくれるみたい。

 指定できるタイプの例
BLIP_PLAYER      ニコ
BLIP_WAYPOINT    マップ上に定められるマーカー(緑色の方)
BLIP_DESTINATION   目的地(黄色の方)

ただし、マップ上にそのアイコンが無い場合もあるので、取得に成功したかどうかは
DoesBlipExist(tarBlip)
を使いましょう。成功してたらtrueが返ります。


--------------------------------------------------------------------------------

・取得したマップアイコンから座標の取得

Vector3 tV;
GetBlipCoords( tarBlip , &tV );

これで tV.X  tV.Y  tV.Z  にそれぞれxyz座標値が入ります。
座標値は世界座標系での値であり、これから目的地との直線距離を求めたりなどできます。
ただし、いきなりGetBlipCoords()を呼ぶのではなく、DoesBlipExist(tarBlip)を使って有効かチェックすることを勧めます。


--------------------------------------------------------------------------------

・人物の速度を取得

float pvx,pvy,pvz;
GetCharVelocity( ped ,&pvx,&pvy,&pvz);

特に記述することはないですね。pedは前回の方法で取得しましょう。ニコ自身の速度も求められます。

--------------------------------------------------------------------------------



・人物に力を加える、速度を持たせる

float x,y,z;
x=0.0;
y=0.0;
z=10.0;
SetCharVelocity( ped, x , y . z);

これで人物に指定した速度を持たせることができます。この場合は真上に10.0の速度で吹っ飛びます。
単位はm/sかkm/hかわからないです。恐らくkm/hのほうだと思いますけど。
座標系は確かめてないけど多分世界座標系です。


力を加える
ApplyForceToPed( ped,
            3,
            x , y , z,
            spinX, spinY, spinZ,
            0,
            unknown1,unknown2,unknown3,);

これはちょっと面倒くさい。というか何回も試してみてやっと半分理解できた関数です。
1つめの引数は人物です。
2つめは未だに謎です。とりあえず3を指定しておけばいいみたいです。
3~5つめの引数には各方向に加える力の大きさです。単位はニュートンでいいのかな?
6~8つめの引数には各軸周りに加えるのモーメントの大きさです。ここは触ってないので怪しいですけど。
9つめも未だに謎です。ここは0でいいみたいです。

そして一番重要なくせに「unknown(用途不明)」となっていた10~12つめの引数です。
ここには各方向に加える力の基準とする座標系を指定します。
0で世界座標系
1で人物に張り付いた座標系
になります。

例えば、x方向に加える力を10としておきます。
この時、x方向の基準座標系を世界座標系( 0 )にしておくと加わる力は常に同じ方角、東方向になります。
ですが基準座標系を人物に貼り付けた座標系( 1 )にした場合はどうなるでしょうか。
この場合、指定した人物の身体の向き対して常に右方向に力が加わります。つまり、人物の向いている向きによって力の方向が変わるということです。

もっとわかりやすく言えば、ニコの向きはそのまま上下左右にスライド移動させてやる場合は基準座標系(unknown1~3)をすべて1にします。
ニコの向きによらずマップのある方角に向かって力を掛けたい場合は基準座標系をすべて0にします。

たぶん・・・。全組み合わせ試したわけじゃないので若干違うかも・・・。


--------------------------------------------------------------------------------

・距離の計算

float x1 , y1 , z1;
float x2 , y2 , z2;
float distance;
distance = sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1) );

まぁ常識的に考えればこれ以外は方法ないですよね。
何のことはない、三平方の定理を使うだけです。


--------------------------------------------------------------------------------


今回作ったMODはマップ上の指定した点にニコを移動させるという簡単なMODです。
ただワープさせるだけじゃつまらんので空を飛んで移動させるようにしました。
これくらい楽勝だろうと考えていたらさっきの ApplyForceToPed()のドツボにはまったわけですよ。

  ニコが変な方向に飛んでいく・・・。しかも方角が毎回違う・・・。

で、いろいろいじっていたらさっきのことがわかったわけですよ。
とりあえず最後の3つの引数は1にしておきましょうって書いてあるせいで無駄に時間食いましたよ。

この引数の意味に気づく前は
行列使ってニコの座標系を世界座標系に変換するか!?
などとかなり血迷ったことをやる寸前でした。気づけてよかった、ほんと。


(゜ω゜` )でも相変わらず警察車両は取得できねぇんだよなぁ・・・。

GTAⅣ C++ ScriptHook メモ3
とりあえず、文字列表示のやり方がやっとわかりました。
というかそのまんまなのに何故気づかなかったんでしょう。


--------------------------------------------------------------------------------


●文字列を表示する
サンプルコード

char buff[64];
sprintf(buff,"PlayerID is %d", GetPlayerId());
DisplayTextWithLiteralString(0.88f,0.02f,"STRING",buff);

画面右上にニコのIDが表示されます。

ふつーに第3引数を"STRING"にしたらいけました。前動かなかったのは別の関数使っていたからかな・・・?
とりあえず動いたのでよしとしましょう。


--------------------------------------------------------------------------------

●指定座標の地面の高さを調べる
ScriptAny GetGroundZFor3DCoord(f32 x, f32 y, f32 z, f32 *pGroundZ)

返却値の使い道はわからないので放置でいいかと。
覚えておくと便利な関数ですね。

--------------------------------------------------------------------------------


関数で特に気になったのはこれくらい。



--------------------------------------------------------------------------------

●車爆雷化のコード

GenerateRandomIntInRange(0,300,&ram);
if(ram==1){
  NowV = GetClosestCar(px,py,pz,30,false,70);
  if(DoesVehicleExist(NowV)){
   if(!IsCarAMissionCar(NowV)){
   GetDriverOfCar(NowV,&ped);
   if(DoesCharExist(ped)){
    if(GetPetrolTankHealth(NowV)>0.0f){
      f32 pH;
      GenerateRandomFloatInRange(1.0f,700.0f,&pH); 
     pH = -pH;
     SetPetrolTankHealth(NowV,pH);
      }
     }
    }
 }
}

すげー単純に書いてます。難易度としては初級でしょうね。
一応解説・・・、というか条件分岐ばかりですが。

0~300の値からランダムに1つを選び、それが1であれば爆雷化の処理を行います。この抽選は1秒間に約30回程度おこなれています。
上から順番に、もし車が近くにあり、それがミッション用の車でなく、車に人が乗っていて、車が既に出火していないなら、車のガソリンタンクの耐久力を -1 ~ -700 からランダムで設定。

条件分岐多いですけど、どれも省略はできませんね。
・車が近くない状態で処理を行うとフリーズする。
・ミッション用の車が出火したら困る。
・駐車してあるのは出火しない(SAがそうであったため
・既に出火している車に再度出火処理をすると爆発までの時間がリセットされてしまう

車は 耐久力・エンジン耐久力・燃料タンク耐久力 の3つのパラメータを持っています。
重要なのは燃料タンク耐久力で、この値が負となると出火します。出火後はこの燃料タンク耐久力値が毎秒減少していき、-1000となった瞬間に爆発します。
このため、この燃料タンク値を負数にセットすることで出火させることができ、またその値をランダムにすることで爆発までの時間をランダムにしています。


まぁわざわざ解説するほどのことでもないんですが。
このブログ見て「俺もMOD作ってみようかな!」って思う人が増えたらうれしいなと思って解説してみました。

GTA? C++ ScriptHook メモ4
とりあえずまたいろいろ触ってわかったこと。


・ゲームパッドからの信号を受け取る

GTA4ではゲームパッドとして通常ではXBOX360コントローラを使っていると思います。
そこで、どのキーが押されたか判断する処理の書き方です。


IsButtonPressed(0,PAD_X)     ボタンが押されているか? 押されたらtrue
IsButtonJustPressed(0,PAD_DOWN)  ボタンがたった今押された瞬間か? 押されたらtrue

ボタンの入力は上の2つを使い、if文などでその時の処理を書けばいいだけです。
2つの関数の違いは押しっぱなしを認識するかどうかです。上が押しっぱなしを認識します。
第一引数はPadIndexとなっていますが、 0 で大丈夫です。

2つ目の引数ですが、デフォルトでは何も設定されていないので自分で設定する必要があります。
ScriptingEnums.h に enum ePadButton から始まる部分がありそこが空白となっているので以下の文をコピペしてください。

enum ePadButton
{
PAD_L_X,
PAD_L_Y,
PAD_R_X,
PAD_R_Y,
PAD_LB,
PAD_LT,
PAD_RB,
PAD_RT,
PAD_UP,
PAD_DOWN,
PAD_LEFT,
PAD_RIGHT,
PAD_START,
PAD_BACK,
PAD_X,
PAD_Y,
PAD_A,
PAD_B,
PAD_LSTICK, //Lスティック押し込み
PAD_RSTICK, //Rスティック押し込み
};

自分の環境ではこの通りでしたが、違うゲームパッドを使っていたりすると変化する場合があるので自分で調べてみることをおすすめします。


左右のスティックの倒し具合は
GetPositionOfAnalogueSticks(u32 padIndex, u32 *pLeftX, u32 *pLeftY, u32 *pRightX, u32 *pRightY)
を使えば知ることができます。数値は±128の値となります。

     -128
     ↑
-128←  → 128
     ↓
     128


--------------------------------------------------------------------------------


・カメラのステータスを調べる

殆どは関数名からわかりますが、ちょっとややこしいのがあるので解説。

カメラの回転角を調べるには
GetCamRot(Camera camera, f32 *angleX, f32 *angleY, f32 *angleZ)
を使えばいいのですが、どれがどの角度がわかりにくいので解説します。

angleX : 北方向を0度とする水平方向の角
angleY : カメラのねじれ具合
angleZ : 水平方向を0度とするカメラの高さ方向の角

このようになっています。数値は -180~180 と度で返ってくるので、これを使って何か計算する場合はラジアンに変換する必要があります。


また、元から用意されている関数ではカメラの方向ベクトルを知ることができません。
ですのでカメラの向いている○メートル先に爆発を起こしたい、などという場合は方向ベクトルを求める必要があります。
普通に球座標系を直交座標系に直す式を使えば求めることができますけどね。ただ角φの基準角が90度ズレていることに注意しましょう。

void GetCameraVector(Camera cam,Vector3& CameraVector){
     Vector3 CamRot;
     float Sxy,Sz;
     if(DoesCamExist(cam)){
         GetCamRot(cam,&CamRot.X,&CamRot.Y,&CamRot.Z);
         Sz = CamRot.X;
         Sxy = CamRot.Z + 90.0f;
         CameraVector.X = cos(Sxy*M_PI/180.0)*cos(Sz*M_PI/180.0);
         CameraVector.Y = sin(Sxy*M_PI/180.0)*cos(Sz*M_PI/180.0);
         CameraVector.Z = sin(Sz*M_PI/180.0);
     }
}


これでカメラの方向ベクトルを求めることができます。
例えば、常にカメラの20m先に人間を固定したいのであれば

GetCameraVector( cam , CamVec);
GetCamPos( cam , &CamPos.X , &CamPos.Y , &CamPos.Z );
SetCharCoordinates( ped , CamPos.X + 20*CamVec.X , CamPos.Y + 20*CamVec.Y , CamPos.Z + 20*CamVec.Z );

とすればいいわけです。
細かい部分は省略したので、実際はもっと細かく書かないと駄目ですけどね。


--------------------------------------------------------------------------------


・何も無いところからRPGを発射する

ScriptHookではRPGの弾をオブジェクトとして召喚しても、ただの石みたいに地面に転がって爆発も何もおきません。
このため、RPGを任意の点から発射するには別の方法を考えなければいけません。

そこで思いついたのがこの方法です。思いついたと言っても、偶然発見したんですけどね。
簡単な話で、RPGを持った人を出現させその人にRPGを撃ってもらい、すぐに消えてもらうだけです。



Ped Asan;
float sx,sy,sz; //出現させる座標
float tx,ty,tz; //ターゲット座標

-----
省略
-----

CreateRandomChar( sx , sy , sz , &Asan);
if(DoesCharExist(Asan)){
   GiveWeaponToChar( Asan , WEAPON_RLAUNCHER , 25000 , 0 );
   SetCurrentCharWeapon( Asan , WEAPON_RLAUNCHER , true );
   FirePedWeapon( Asan , tx , ty , tz );
   DeleteChar( &Asan );
}

//ここまで

ランダムでキャラを作成し、RPGを装備させた後ターゲット座標に向かってそれを撃ってもらい、そのあとキャラを消去しています。
キャラの作成に成功したかはちゃんとチェックしておかないと、フリーズしてしまうことがあります。

MODのネタ募集。
別にカオスモード本編で使えない奴でもいいのでなんかあればここに書いて下さい。


●できること
 ・市民、車、物体を操作する
    市民のパラメータを変更したり、武器を持たせたり、車に乗せるなど
    車の速度や座標を変更したり
    物体を出現させる

 ・カメラを操作する
    カメラアングルや位置等を変える。

 ・外部ファイルから読み書きする
    設定ファイルを作っておいて後から読み込んだり、逆に書き込んだりもできます。

●できないこと
 ・警察車両に手を加える
   どうがんばっても警察車両を取得することができません(ニコが乗ってる物を除く
   このため、警察車両はMODの対象外となります

 ・周辺のオブジェクトに手を加える
   オブジェクトとは、市民・車を除く街中にある物です。例えばゴミ箱とか。RPGの弾頭もここに属します。
   近くのオブジェクトを取得する方法がが無い為、発射されたRPGの軌道を変更する等のことはできません。
   
 ・車のパラメータを変更する
   質量、最高速度、ギア数、摩擦、サスの強さ等の車の各パラメータは動的には変更できません。



基本的にパラメータを表示したり、変更したりするのは割と楽だったりします。
ただ複数の市民や車を同時に操作しようとするのは結構面倒くさかったりします。

カオスヘリ導入
カオスヘリ導入です。

・4人乗りのヘリが空から追いかけてきます
・パイロット以外はカオス化します
・破壊すると数十秒後に次の機体が出現します
・操縦は自動なので壁とかによく衝突します



--------------------------------------------------------------------------------


市民への車の運転命令の使い方が未だにわからないという悲しさ。
具体的にどうわからないかというと、「交通ルールを無視して指定座標まで運転する」って命令があるんですが

void TaskCarDriveToCoordNotAgainstTraffic(
ScriptAny p0,
ScriptAny p1,
ScriptAny p2,
ScriptAny p3,
ScriptAny p4,
ScriptAny p5,
ScriptAny p6,
ScriptAny p7,
ScriptAny p8,
ScriptAny p9,
ScriptAny p10)

とまぁこんな感じなんですよ。全部引数がわからないですよね。
大体他の関数と比較すると、(運転者、車、指定座標、運転方法)だと思うんですけどね。
とりあえずいろいろな組み合わせを試してみてるんですが、やっぱり動いてくれない…。


関数名で検索すると

TaskCarDriveToCoordNotAgainstTraffic(
b8 unknown01,
Vehicle v,
f32 x,
f32 y,
f32 z,
u32 unknownInt1,
b8 unknown02,
f32 unknownF1,
u32 unknownInt2,
f32 unknownF2,
u32 unknownInt3)

TaskCarDriveToCoordNotAgainstTraffic(0, v, x, y, z, 24, 0, 400514754, 2, -1f, 200);

で動くよみたいな書き込みがあるんですけどね…。でも実際いれて動かしてみると何も起きない。
最初の0をtrueとかにしてもダメですし…。


あと、市民を上手いこと管理する方法はないんでしょうか。
ボンバットを市民全員に適用したいんですけどね。今はニコがバットで殴られたら足元を爆発するってだけになってます。
バットの性能をいじったら実装できるのだろうか…。



///////////////ここからC#版///////////////
NET ScriptHook
.Net ScriptHookの使い方をメモ。
自分用のメモなんでわかりにくいのはしかたない。



--------------------------------------------------------------------------------


指定した時間間隔で処理を行う場合


public class ScriptName : Script
{
    //メンバ変数はここで定義

    public ScriptName()
    {
        //コンストラクタ
        //ここに初期化処理を書く
        Interval = 500;
        this.Tick += new EventHandler(this.ScriptName_Tick);
    }
    private void ScriptName_Tick(object sender, EventArgs e)
    {
//ここに処理を書く
    }
}

Intervalで指定した時間[ミリ秒]間隔でScriptName_Tickの処理が繰り返される。
この場合は500m秒(0.5秒)間隔で処理される。


--------------------------------------------------------------------------------

キー入力を判別する場合
shachou氏作成のInputCheckerを利用。 → ですのコンツェルン様


public class ScriptName : Script
{
    InputChecker inputChecker = new InputChecker();

    public ScriptName()
    {
        inputChecker.AddCheckKeys(new Keys[] { Keys.T, Keys.E, Keys.S, Keys.T});
        KeyDown += new GTA.KeyEventHandler(ScriptName_KeyDown);
    }
    void ScriptName_KeyDown(object sender, GTA.KeyEventArgs e)
    {
        inputChecker.AddInputKey(e.Key);
 
        if (inputChecker.Check(0) == true)
        {
          //文字列一致の時ここが実行される
        }
    }
}


InputCheckerで入力された文字列を解析できる。
MODの起動コマンドを設定できるので便利。


--------------------------------------------------------------------------------


その他メモ

○ネイティブ関数を呼び出す
 C++版で使っていた関数を呼び出したい場合の書き方。
 GTA.Native.Function.Call もしくは GTA.Native.Function.Call<返却型> を使う。


Ped A = GTA.World.CreatePed(Player.Character.Position);
A.Weapons.RocketLauncher.Ammo = 999;
A.Weapons.Select(Weapon.Heavy_RocketLauncher);
GTA.Native.Function.Call("FIRE_PED_WEAPON", A, A.Position.X, A.Position.Y, A.Position.Z+50.0f);

これでニコの近くにRPGを持った市民を出現させ、上空に向かってRPGを発射させることができる。

ただしCreatePedが必ず成功するとは限らないので、if(Exist(A))を使って本当に市民作成が成功したかチェックした方がいい。
これを怠るとエラーを吐いてMODが停止する。最悪の場合はGTAごと落ちる。


○ポインタの必要な関数を使う

 市民が使っている車を取得する関数はC++版で

 GetCarCharIsUsing(Ped ped, Vehicle *pVehicle)

 となっており、Vehicleへのポインタを必要としていることがわかる。
    ↓
 ではこれをC#版ではどう書くか。

 GTA.Native.Pointer CarPointer = typeof(Vehicle);
GTA.Native.Function.Call("GET_CAR_CHAR_IS_USING", player, CarPointer);
 Vehicle vehicle = CarPointer;

 こんな感じ。
 別に Ped.CurrentVehicle でいいんですけどね。


--------------------------------------------------------------------------------


感想
・.NET版の方が明らかにMODが作りやすい
・C++で使えた関数を呼び出せば使えるので C++版 ⊂ .NET版 と感じた。
 ただしその場合は行数が長くなるのでソースが汚くなる。
・というかC#自体初めてだが割となんとかなった。Javaに近い?
・サンプルソースやChaosModeMODを参考にして手探り状態で使い方を解析したのでつかれた。
・というかサンプルソース(TestScriptCS)から作ったMODを分離できない。どうにかしたい。
  → TestScriptCS.Scripts.Bakurai みたいに1つにグループ化されてしまう
・C++版だとフリーダムにコーディングできたが、C#ではそれができず制約が厳しい感じがして窮屈に感じた。


結論
 C++ですら満足に扱えてない俺がC#を語るな。
スポンサーサイト

コメントの投稿

非公開コメント

No title

教えていただきありがとうございます!
なるほど、先にリンクの方を細かく見ておくべきでした。すみません。
でも本当にありがとうございました。

■それはGTASAのMODです。
■当Blogのリンクリストの1番上にあるsaiaKUNのskydriveのsaiaKUNs_cleo.zipとかいうやつの中に入っているはずです。
■導入方法はcleoでグクって下さい。

No title

あの…記事にまったく関係ない内容のコメントで申し訳ないのですが
過去の記事の「killed_by_boom_then_disappear_2.cs」というのは
GTA SAのMODなのでしょうか?
非常に興味深くて欲しいのですが、ググっても見つからず
困っています。
できれば、あのMOD?の導入方法を教えてください…お願いしますorz
プロフィール

saiaKUN

Author:saiaKUN
GTASAはイイですよ。
うっぷん晴らしできるし。
MOD入れてSS撮るのも楽しい。
動画とってアップするのも良いし。
古いから軽いし。
私のcleoMODはリンクの一番上からgo。

最新記事
最新コメント
カテゴリ
FC2カウンター
フリーエリア
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
月別アーカイブ
リンク
見つけたら追加。みたいな?
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。