公式フォーラムの「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 | 全部に送信 |
Default | OwnerとAllyに送信 |