公式ガイド解説/プログラマブルブロック・グリッド間通信ガイド

Last-modified: 2017-01-30 (月) 20:12:04

公式フォーラムの「Programmable Block Inter-Grid Communication Guide」にある、遠隔操作でハンガー開閉・弾頭爆破を行うサンプルプログラムの使い方です。

使い方簡易解説

OwnerはMe同士かNobody同士にしておきましょう。

もしくは、受信側アンテナの「Ignore Other Broadcast(中立と敵を無視)」をオフにしておけば、送信側と受信側のOwnerが違っても動きます。

受信側のブロックと設定

プログラマブルブロック
  • 下記の受信側スクリプトを保存しておきます。
アンテナ
  • Assigned Programmable Block」プルダウンメニューで、上記スクリプトを保存してあるプログラマブルブロックを設定しておきます。
ハンガードア
  • Hangar 1」グループに入れておきます。
弾頭
  • 設定は特になし

受信側スクリプト:Example reciever script

解説記事の「Example reciever script」を元に、エラーが出るアンテナ名変更処理を修正したものです。

string password = "A702A9E2-4C2A-436B-B9C4-8F8D9221D72F";
void Main(string argument)
{
  if (argument == password)
  {
     List<IMyWarhead> warheads = new List<IMyWarhead>();
     GridTerminalSystem.GetBlocksOfType(warheads);
     foreach (var warhead in warheads)
     {
        warhead.SetValue("Safety", true);
        warhead.SetValue("DetonationTime", 3f);
        warhead.ApplyAction("StartCountdown");
     }
     List<IMyRadioAntenna> antennas = new List<IMyRadioAntenna>();
     GridTerminalSystem.GetBlocksOfType(antennas);
     foreach (var antenna in antennas)
     {
        antenna.SetCustomName("WARNING! SELF DESTRUCT IN 3 SECONDS");
        antenna.SetValue("IsBroadcasting", true);
        antenna.SetValue("Radius", 50000f);
        return;
     }
  }
  if (argument == "OpenHangar1")
  {
     var hangarGroup = GridTerminalSystem.GetBlockGroupWithName("Hangar 1");
     List<IMyAirtightHangarDoor> doors = new List<IMyAirtightHangarDoor>();
     hangarGroup.GetBlocksOfType(doors);
     foreach (var door in doors)
     {
        door.SetValue("Open", true);
     }
  }
  if (argument == "CloseHangar1")
  {
     var hangarGroup = GridTerminalSystem.GetBlockGroupWithName("Hangar 1");
     List<IMyAirtightHangarDoor> doors = new List<IMyAirtightHangarDoor>();
     hangarGroup.GetBlocksOfType(doors);
     foreach (var door in doors)
     {
        door.SetValue("Open", false);
     }
  }
}

送信側のブロックと設定

アンテナ
  • 名前は「Antenna
プログラマブルブロック
  • 下記送信側スクリプト(記事のExample transmitter)を保存しておきます。
ボタンパネル操縦席など
上記プログラマブルブロックの「Run」をツールバーに設定します。設定時に表示されるArgumentダイアログの入力内容は下記のとおりです。
  • 自爆用:Argumentダイアログでは「A702A9E2-4C2A-436B-B9C4-8F8D9221D72F」を入力します。
  • ハンガー開:Argumentダイアログでは「OpenHangar1」を入力します。
  • ハンガー閉:Argumentダイアログでは「CloseHangar1」を入力します。

送信側スクリプト:Example transmitter

下記は解説記事の「Example transmitter」そのままです。

void Main(string argument)
{
    var ant = GridTerminalSystem.GetBlockWithName("Antenna") as IMyRadioAntenna;
    ant.TransmitMessage(argument, MyTransmitTarget.Everyone);
}
  • 3行目:送信に使うために「Antenna」という名前のアンテナを名前で取得(※送信側の船)
  • 4行目:送信処理
    • 送信する文章:argumentの内容
    • 送信対象の種類:Everyone(誰でも受信可能)

備考

送信対象フラグ

TransmitMessageのオプション

送信に使うアンテナ.TransmitMessage(送信する文字列, MyTransmitTarget.送信対象フラグ);
基本
None送信しない?
Owner自分が所有するアンテナのみに送信
公開時点のバージョンではエラーになる
Ally同盟、つまり所属ファクション?に送信
Neutral中立にのみ送信
Enemy敵に送信
複合
Everyone全部に送信
DefaultOwnerとAllyに送信

関連項目

コメント