MOD解説 > ComputerCraft > API

親ページに戻る
追加ブロック&アイテム&レシピ&インターフェース一覧
チュートリアル
サンプルプログラム
このページは情報流出により更新の止まってしまったコンピュータークラフト非公式Wikiの代わりに情報掲載する為のページです。
内容は殆ど引用しただけなので、何か問題があったら削除してください。

編集中。加筆修正をお願いします



APIについて

ComputerやTurtleのコンソールで“help API名”を実行すると、APIについての解説(英語)が表示される。



Bit API

数値のビット操作に関するAPI。
Lua自体はビット演算子を持たないが、このAPIを利用すればビットフラグなども簡単に操作することができる。

数値を2進数32bitの整数としてビット操作する。小数を含む数値や、32bit(4,294,967,295)を超える数値を指定するとエラーとなる。
数値は32bit符号なし整数(0~4,294,967,295)として扱われる(例:-1 → 4294967295)。

【1.42-】CC1.41以前のLuaによる実装からJava側での実装に変更され、bit.tobits関数とbit.tonumb関数が削除された。

【1.42-】dan200.computer.core.apis.BitAPI で定義
【-1.41】lua\rom\apis\bit で定義

長いので折り畳み
+...

bnot


  • bit.bnot(n)
  • n(数値)のビット単位の論理否定(NOT)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0 → 1
1 → 0

例:
print( bit.bnot( 18 ) )
18(2進数:10010)のビット単位NOTを求め、結果を表示する。
4294967277(2進数:11111111111111111111111111101101)が表示される。

band


  • bit.band(m, n)
  • m(数値)とn(数値)のビット単位の論理積(AND)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0, 0 → 0
1, 0 → 0
0, 1 → 0
1, 1 → 1

例:
print( bit.band( 18, 3 ) )
18(2進数:10010)と3(2進数:00011)のビット単位ANDを求め、結果を表示する。
2 (2進数:00010)が表示される。

bor


  • bit.bor(m, n)
  • m(数値)とn(数値)のビット単位の論理和(OR)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0, 0 → 0
1, 0 → 1
0, 1 → 1
1, 1 → 1

例:
print( bit.bor( 18, 3 ) )
18(2進数:10010)と3(2進数:00011)のビット単位ORを求め、結果を表示する。
19(2進数:10011)が表示される。

bxor


  • bit.bxor(m, n)
  • m(数値)とn(数値)のビット単位の排他的論理和(XOR)を求める
  • 戻り値:数値型

2進数での各桁の値と結果は以下の通り
0, 0 → 0
1, 0 → 1
0, 1 → 1
1, 1 → 0

例:
print( bit.bxor( 18, 3 ) )
18(2進数:10010)と3(2進数:00011)のビット単位XORを求め、結果を表示する。
17(2進数:10001)が表示される。

blshift


  • bit.blshift(n, bits)
  • n(数値)を左へbits(数値)ビットだけシフトする
  • 戻り値:数値型

n * 2 ^bits に等しい。

例:
print( bit.blshift( 18, 2 ) )
18(2進数:10010)を左に2ビットシフトし、結果を表示する。
72(2進数:1001000)が表示される。

brshift


  • bit.brshift(n, bits)
  • n(数値)を右へbits(数値)ビットだけ算術シフトする
  • 戻り値:数値型

例:
print( bit.brshift( 73, 2 ) )
73(2進数:1001001)を右に2ビット算術シフトし、結果を表示する。
18(2進数:10010)が表示される。

算術シフトなので最上位ビットが1の場合、ビットシフトで空いた上位ビットは1で埋められる(0の場合は0で埋められる)。

例:
print( bit.brshift( 2147483648, 2 ) )
2147483648(2進数:10000000000000000000000000000000)を右に2ビット算術シフトし、結果を表示する。
3758096384(2進数:11100000000000000000000000000000)が表示される。

blogic_rshift


  • bit.blogic_rshift(n, bits)
  • n(数値)を2進数で右へbits(数値)桁だけ論理シフトする
  • 戻り値:数値型

例:
print( bit.brshift( 73, 2 ) )
73(2進数:1001001)を右に2ビット論理シフトし、結果を表示する。
18(2進数:10010)が表示される。

論理シフトなので最上位ビットの値に関わらず、ビットシフトで空いた上位ビットは0で埋められる。
n / 2 ^bits で余りを捨てた値に等しい。

例:
print( bit.brshift( 2147483648, 2 ) )
2147483648(2進数:10000000000000000000000000000000)を右に2ビット論理シフトし、結果を表示する。
536870912 (2進数:00100000000000000000000000000000)が表示される。

tobits


【-1.41】
  • bit.tobits(n)
  • n(数値)をビットごとに分解しテーブルにして返す
  • 戻り値:テーブル型。キーは桁の番号(1が最下位)、値は各桁の値(数値型、0か1)

【1.42】この関数は削除された。

例:
for k, v in pairs( bit.tobits( 18 ) ) do
  print( k, ", ", v)
end
18(2進数:10010)をビット単位で分解したテーブルを取得し、その各キーと値を表示する。
以下の様に表示される。
1, 0
2, 1
3, 0
4, 0
5, 1

tonumb


【-1.41】
  • bit.tonumb(bit_tbl)
  • ビットごとに分解された値を表すテーブルbit_tbl(テーブル)から、それが表す値を返す
  • 戻り値:数値型

【1.42】この関数は削除された。

bit_tblのキーは桁の番号(1が最下位)、値は各桁の値(数値型、0か1)

例:
t = {}
t[1] = 0
t[2] = 1
t[3] = 0
t[4] = 0
t[5] = 1
print( bit.tonumb( t ) )
2進数10010(10進数:18)を表すテーブルを数値へ変換し、それを表示する。
18が表示される。


Colors API

Redstone APIで使用するRedPowerのワイヤーの色を表す値の使用を補助する。イギリス綴りで"colours"と表記することもできる。

色定数

RedPowerのInsulated Wire(絶縁ワイヤー)やMineFactoryReloadedのRedNet Cableの各色を表す整数値の定数。文字色や背景色を指定する際にも用いられる。

定数名 数値(10) 数値(16) 文字色
【-1.53】
文字色
【1.55-】
Image
データ
colors.white 1 0x1   #F0F0F0   #F0F0F0 0
colors.orange 2 0x2   #EB8844   #F2B233 1
colors.magenta 4 0x4   #C354CD   #E57FD8 2
colors.lightBlue 8 0x8   #6689D3   #99B2F2 3
colors.yellow 16 0x10   #DEDE6C   #DEDE6C 4
colors.lime 32 0x20   #41CD34   #7FCC19 5
colors.pink 64 0x40   #D88198   #F2B2CC 6
colors.gray 128 0x80   #434343   #4C4C4C 7
colors.lightGray 256 0x100   #999999   #999999 8
colors.cyan 512 0x200   #287697   #4C99B2 9
colors.purple 1024 0x400   #7B2FBE   #B266E5 a
colors.blue 2048 0x800   #253192   #253192 b
colors.brown 4096 0x1000   #51301A   #7F664C c
colors.green 8192 0x2000   #3B511A   #57A64E d
colors.red 16384 0x4000   #B3312C   #CC4C4C e
colors.black 32768 0x8000   #1E1B1B   #191919 f

全16色のワイヤーの各色を、16ビットのうち特定のビットを1にすることで表現している。これら値の論理和(OR)を取ることにより、複数の色の組み合わせを表現できる。Colors APIの各関数で行っていることは単なるビット演算である(ビット演算を行うにはBit APIを参照)。

折り畳み
+...

combine


  • colors.combine( color1 , color2 , ... )
  • ワイヤーの色をを表す値color1, color2, ...(数値)を合成する。引数は複数指定できる
  • 戻り値:数値型。合成されたワイヤーの色を表す整数値

例:
print(colors.combine(colors.white, colors.magenta, colours.lightBlue))
白とマゼンタとライトブルーのワイヤーを表す値(13)を作り、表示する。

subtract


  • colors.subtract( colors , color1 , color2 , ... )
  • ワイヤの色を表す値colors(数値)からcolor1, color2, ...(数値)の値の色を取り除く。引数は複数指定できる
  • 戻り値:数値型。引数で指定した色を取り除いたワイヤーの色を表す値

例:
print(colors.subtract(colors.combine(colors.white, colors.magenta, colours.lightBlue), colors.magenta))
白とマゼンタとライトブルーのワイヤーを表す値からマゼンタを取り除いた値(9)を表示する。

test


  • colors.test( colors , color )
  • ワイヤの色を表す値colors(数値)にcolor(数値)の値の色が含まれているかを調べる。colorにも複数の色を表す値を指定することができ、その場合はcolorの値に含まれる全ての色がcolorsに含まれているときにのみtrueを返す
  • 戻り値:ブーリアン型。含まれているならtrue、いないならfalse

例:
print(colors.test(colors.combine(colors.white, colors.magenta, colours.lightBlue), colors.lightBlue))
白とマゼンタとライトブルーのワイヤーを表す値にライトブルーが含まれているかを調べて表示する。
(この例では true と表示される)


Disk API

Disk Driveを操作するためのAPI。
Peripheral APIで呼び出せるDisk Driveのメソッドのラッパー。

各関数の引数nameにはDisk Driveの接続名を指定する。Disk Driveがコンピュータに隣接している場合はその方向を、【1.45-】Wired Modemのケーブルネットワーク経由の場合はネットワーク名を文字列で指定する。

折り畳み
+...

isPresent


  • disk.isPresent( name )
  • name(文字列)というDisk Driveにアイテムがセットされているか調べる
  • 戻り値:ブーリアン型。あればtrue、ないかnameが存在しなければfalseが返る

例:
print( disk.isPresent( "bottom" ) )
下方向のDisk Driveにアイテムがセットされているか調べて結果を表示する(あればtrue、それ以外の場合はfalseが表示される)。

hasData


  • disk.hasData( name )
  • name(文字列)というDisk Driveにフロッピーディスクがセットされているか調べる
  • 戻り値:ブーリアン型。あればtrue、ないかnameが存在しなければfalseが返る

例:
print( disk.hasData( "bottom" ) )
下方向のDisk Driveにフロッピーディスクがセットされているか調べて結果を表示する(あればtrue、それ以外の場合はfalseが表示される)。

getMountPath


  • disk.getMountPath( name )
  • name(文字列)というDisk Driveにセットされたフロッピーディスクのパスを取得する
  • 戻り値:文字列型。nameやフロッピーディスクが存在しない場合はnilが返る

例:
print( disk.getMountPath( "bottom" ) )
下方向のDisk Driveのフロッピーディスクのパスを取得して表示する("disk"等が表示される)。

setLabel


  • disk.setLabel( name, label )
  • name(文字列)というDisk Driveにセットされたフロッピーディスクのラベルをlabel(文字列)に設定する
  • 戻り値:nil

例:
disk.setLabel( "bottom", "Floppy" )
下方向のDisk Driveのフロッピーディスクのラベルを"Floppy"に設定する。

getLabel


  • disk.getLabel( name )
  • name(文字列)というDisk Driveにセットされたフロッピーディスクのラベルやレコードのタイトルを取得する
  • 戻り値:文字列型。nameやフロッピーディスク、レコード、ラベルが存在しない場合はnilが返る

getID


  • disk.getID( name )
  • name(文字列)というDisk DriveにセットされたフロッピーディスクのIDを取得する
  • 戻り値:数値型。ディスクIDを表す0以上の整数。nameやフロッピーディスクが存在しない場合はnilが返る

戻り値はフロッピーディスクのセーブフォルダ(saves\ワールド\computer\disk 以下)のフォルダ名と一致する。

hasAudio


  • disk.hasAudio( name )
  • name(文字列)というDisk Driveにレコードがセットされているか調べる
  • 戻り値:ブーリアン型。あればtrue、ないかnameが存在しなければfalseが返る

getAudioTitle


  • getAudioTitle( name )
  • name(文字列)というDisk Driveにセットされたレコードのタイトルを取得する
  • 戻り値:文字列型。nameやレコードが存在しない場合はnilが返る

playAudio


  • disk.playAudio( name )
  • name(文字列)というDisk Driveにセットされたレコードを再生する
  • 戻り値:nil

stopAudio


  • stopAudio( [name] )
  • name(文字列)というDisk Driveにセットされたレコードを再生を停止する。
    nameを省略した場合は接続された全てのDisk Driveのレコードの再生を停止させる
  • 戻り値:nil

eject


  • disk.eject( name )
  • name(文字列)というDisk Driveにセットされたアイテムを取り出す
  • 戻り値:nil

Disk Drive内のアイテムはDisk Drive正面へ射出される。


FS API

ファイルシステムに関する操作やファイルの入出力を行うAPI。

折り畳み
+...

list


  • fs.list( path )
  • ディレクトリpath(文字列)にあるファイルやディレクトリの名前のリストを取得する
  • 戻り値:テーブル型。キーは1以上の整数、値はファイルやディレクトリの名前

ルートディレクトリを表すpathは""(長さ0文字列)。

例:
local FileList = fs.list( "" )
for _, file in ipairs( FileList ) do
  print( file )  -- Print the file name
end  -- End the loop
ルートディレクトリにあるファイルやディレクトリの名前のリストを取得し、それを一つずつ表示する。

exists


  • fs.exists( path )
  • パスpath(文字列)にファイルやディレクトリが存在するかを調べる
  • 戻り値:ブーリアン型。存在する場合はtrue、しない場合はfalse

例:
print( fs.exists( "rom" ) )
"rom"ディレクトリが存在するか調べ、結果を表示する("true"と表示される)。

isDir


  • fs.isDir( path )
  • パスpath(文字列)がディレクトリかどうかを調べる
  • 戻り値:ブーリアン型。ディレクトリの場合はtrue、存在しないかファイルの場合はfalse

例:
print( fs.isDir( "rom" ) )
"rom"がディレクトリかどうかを調べ、結果を表示する("true"と表示される)。

isReadOnly


  • fs.isReadOnly( path )
  • パスpath(文字列)が読み取り専用かどうかを調べる
  • 戻り値:ブーリアン型。読み取り専用の場合はtrue、存在しないか書き込み可能の場合はfalse

例:
print( fs.isReadOnly( "rom" ) )
"rom"が読み取り専用かどうかを調べ、結果を表示する("true"と表示される)。

getName


  • fs.getName( path )
  • パスpath(文字列)からファイルまたはディレクトリの名前部分を取得する
  • 戻り値:文字列型

pathに""(ルートディレクトリを表す)を指定した場合は"root"が返る。ただし、"root"はパスでルートディレクトリを表すのに使うことができない。

例:
print( fs.getName( "rom/apis/colors" ) )
パス"rom/apis/colors"の名前部分を取得し、結果を表示する("colors"と表示される)。

getDrive


  • fs.getDrive( path )
  • パスpath(文字列)からドライブ名を取得する
  • 戻り値:文字列型。ドライブ名。ただし、存在しない場合はnilが返る

pathがコンピュータ本体に保存されている場合は"hdd"が、romディレクトリ以下(実体はComputerCraftのzip内)の場合は"rom"が、フロッピーディスクの場合はディスクドライブの接続名(方向またはネットワーク名)が返る。

例:
print( fs.getDrive("rom/startup") )
"rom/startup"のドライブ名を取得し、結果を表示する("rom"と表示される)。

getSize


  • fs.getSize( path )
  • パスpath(文字列)のファイルのサイズを取得する
  • 戻り値:数値型。サイズがバイト単位で返る

pathがディレクトリの場合は0が返る。また、存在しない場合はエラーになる。
ディスクスペースの計算では、ディレクトリ(ルートディレクトリを含む)やサイズが512バイト未満のファイルは、実際に返るサイズと異なり、それぞれ512バイトとして扱われる。

例:
print( fs.getSize( "/rom/programs/shell" ) )
ファイル"/rom/programs/shell"のサイズを取得し、結果を表示する。

getFreeSpace


  • fs.getFreeSpace( path )
  • パスpath(文字列)の空き容量を取得する
  • 戻り値:数値型。ディスクの空き容量がバイト単位で返る

pathがコンピュータ本体内の場合はコンピュータ本体の、フロッピーディスク内の場合はフロッピーディスクの空き容量が返る。
ディスクスペースの計算では、ディレクトリ(ルートディレクトリを含む)やサイズが512バイト未満のファイルは、実際のサイズと異なり、それぞれ512バイトとして扱われる。

例:
print( fs.getFreeSpace( "" ) )
コンピュータ本体の空き容量を取得し、結果を表示する。

makeDir


  • fs.makeDir( path )
  • パスpath(文字列)にディレクトリを作成する
  • 戻り値:nil

pathが読み取り専用であったり、同名のファイルがあったりした場合はエラーが発生する。

例:
fs.makeDir( "abcd/efgh" )
ルートディレクトリにあるabcdというディレクトリの中にefghというディレクトリを作成する(abcdというディレクトリが無かった場合はそれも作成する)。

move


  • fs.move( fromPath, toPath )
  • fromPath(文字列)のファイルまたはディレクトリをtoPath(文字列)へ移動する
  • 戻り値:nil

fromPathが存在しなかったり、fromPathtoPathが読み取り専用であったり、toPathに同名のファイルまたはディレクトリがあったり、toPathの移動先ディレクトリが存在しなかったりした場合はエラーが発生する。

例:
fs.move("test1", "mydir/test2")
ルートディレクトリにあるtest1をtest2に名前変更してルートディレクトリにあるmydirディレクトリ内に移動する。

copy


  • fs.copy( fromPath, toPath )
  • fromPath(文字列)のファイルまたはディレクトリをtoPath(文字列)へコピーする
  • 戻り値:nil

fromPathが存在しなかったり、toPathが読み取り専用であったり、toPathに同名のファイルまたはディレクトリがあったり、toPathの移動先ディレクトリが存在しなかったりした場合はエラーが発生する。

例:
fs.move( "test1", "mydir/test2" )
ルートディレクトリにあるtest1をtest2という名前でルートディレクトリにあるmydirディレクトリ内にコピーする。

delete


  • fs.delete( path )
  • パスpath(文字列)のファイルまたはディレクトリを削除する
  • 戻り値:nil

path読み取り専用であったり、コンピュータ本体やフロッピーディスクのルートディレクトリであった場合はエラーが発生する。

例:
fs.delete( "test1" )
ルートディレクトリにあるtest1を削除する。

combine


  • fs.combine( basePath, localPath )
  • 基礎パスbasePath(文字列)にパスlocalPath(文字列)を合成して返す
  • 戻り値:文字列型

例:
print( fs.combine( "a/b", "c/d" ) )
基礎パスa/bにパスc/dを合成して表示する("a/b/c/d"と表示される)。

open


  • fs.open( path, mode )
  • ファイルpath(文字列)をモードmode(文字列)で開き、ファイルハンドルを返す
  • 戻り値:テーブル型。ファイルハンドル。開くのに失敗した場合はnilが返る

モード
"r" ファイルを読み取り・テキストモードで開く。
"w" ファイルを書き込み・テキストモードで開く。既にあるデータは削除される。
"a" ファイルを追加・テキストモードで開く。既にあるデータは削除されず、書き込みはその後ろから行われる。
"rb" ファイルを読み取り・バイナリモードで開く。
"wb" ファイルを書き込み・バイナリモードで開く。既にあるデータは削除される。
"ab" ファイルを追加・バイナリモードで開く。既にあるデータは削除されず、書き込みはその後ろから行われる。
※テキストモードでは改行コードが環境に合わせて適切に変換される。一方、バイナリモードではそれが行われないので読み書きでバイナリデータの同一性が保持される。

"r"モードでファイルが存在しなかったり、"w"や"a"モードでファイルが読み取り専用だったりすると開くのに失敗してnilが返る。

ファイルを閉じる処理や入出力は後述のファイルハンドルを参照。

例:
h = fs.open("abcd", "w")
ファイルabcdを作成(既にある場合データは削除される)して、そのファイルハンドルを変数hに代入する。

find


【1.6-】
  • fs.find( wildcard )
  • ワイルドカードwildcard(文字列)に一致するすべてのファイルとフォルダのリストを返す。
  • 戻り値:テーブル型。ファイルとフォルダのリストが返される

例:
print(textutils.serialize(fs.find("/rom/*/gps")))
ROMフォルダのサブフォルダにある「GPS」と名前のついたファイルの一覧を表示する。

getDir

【1.63-】
  • fs.getDir( path )
  • パスpath(文字列)のファイル又はディレクトリの親ディレクトリを返す
  • 戻り値:文字列。親ディレクトリが返される

例:
print(fs.getDir("rom/programs/edit"))
ROM/programs/editファイルの親ディレクトリを表示する。

complete

【1.74-】
  • fs.complete( file/directory, parent folder[include files][include slashes] )
  • 戻り値:テーブル型。補完リストが返される

例:
textutils.tabulate( fs.complete( "p", "rom/apis" ) )



ファイルハンドル


fs.open関数で取得したファイルハンドルを用いてファイル入出力を行う。

write関数などでデータを書き込んでも、flush関数やclose関数を呼び出すまでは実際のファイルには保存されていないので注意。
flush関数とclose関数以外は、ファイルを開いたモードによって呼び出せる関数が限定される。

以下の解説では、fs.open関数で取得したファイルハンドルを変数hに代入したものとする。

折り畳み
+...

close


  • h.close()
  • ファイルを閉じる
  • 戻り値:nil

全モードで使用可能。
まだ保存されていない書き込みデータも保存される。

flush


  • h.flush()
  • ファイルに書き込まれたデータを実際にファイルへ保存する
  • 戻り値:nil

全モードで使用可能。

readLine ("r"モード)


  • h.readLine()
  • ファイルから一行読み込んで返す。行末の改行は削除されて返る
  • 戻り値:文字列型。ファイル終端まで読み込んだ後はnilが返る

readAll ("r"モード)


  • h.readAll()
  • ファイルを終端まで読み込んで返す。最終行終端の改行は削除されて返る
  • 戻り値:文字列型。ファイル終端まで読み込んだ後は""(長さ0文字列)が返る

write ("w"/"a"モード)


  • h.write( data )
  • data(文字列)をファイルに書き込む
  • 戻り値:nil

writeLine ("w"/"a"モード)


  • h.writeLine( data )
  • data(文字列)を終端に改行文字を付加してファイルに書き込む
  • 戻り値:nil

read ("rb"モード)


  • h.read()
  • ファイルから1バイト読み込んでそれを数値で返す
  • 戻り値:数値型。ファイル終端まで読み込んだ後はnilが返る

write ("wb"/"ab"モード)


  • h.write( byte )
  • 1バイト分のデータbyte(数値)をファイルに書き込む
  • 戻り値:nil

byteには実数範囲の数値が指定できるが、実際に書き込まれるのは符号なし整数1バイト分である。また、引数に数値以外を指定した場合、エラーこそ発生しないが書き込み処理は行われない。


GPS API

折り畳み
+...

GPSとは


assets\computercraft\lua\rom\programs\gps で定義
GPSホストに記憶させた座標と、無線通信時に取得できるGPSホストまでの距離を元に、三次元測位の原理で位置を知りたいコンピュータの座標を計算するシステム(現実のGPSとはあまり関係ない)。ゲーム内から直接座標を取得するのではなく、Rednet APIの機能をフル活用して座標を求めている。

GPSホストの設置

最低限必要なもの:
  • GPSホストにする「Wireless Modemを接続したComputer」または「Wireless Turtle」を計4つ
(当然ながらWired Modemでは利用できない)

GPSホスト4つをそれぞれが同じ平面上にならない位置(つまり三角錐の各頂点の位置)に設置する。GPSホストは、なるべく広範囲から利用できるように、設置限界高度ギリギリに設置するとよい。そして、gps host <x> <y> <z>コマンドで各GPSホストの座標を指定してGPSホストプログラムを起動する。GPSホストの座標は、GPSホストとするComputer/Turtleを設置した座標である(※Wireless Modemブロックの座標ではないので注意)。

GPSホストのComputer/Turtleがチャンク凍結・リロードで再起動しても自動で復帰できるようにするため、GPSホストプログラムはstartupプログラム内で起動するとよい。

startupの例:
shell.run("gps", "host", "100", "254", "-200")
GPSホストプログラムを座標(100, 254, -200)に設定して起動する。


CC1.4からWireless Turtleでもgps hostコマンドが使えるように修正された。これにより、Wireless Turtleをプログラムによって設置位置まで移動させGPSホストプログラムを起動することが可能となった(ただし、自力で登って設置するならComputerの方が低コスト)。

ホスト設置座標の例

※以下の例の「有効範囲」はWireless Modemの通信距離によるもの。実際には、GPSホストがプレイヤーからxまたはz座標で160mくらい離れた(正確にはプレイヤーのいるチャンクを中心とした21*21チャンクの範囲から出た)時点でGPSホストのあるチャンクが凍結され、利用できなくなってしまう(他のmodで追加されるチャンクローダーで回避可能)。

例1:
CC公式フォーラムで紹介されていたもの。平面上の有効範囲はy1で半径約270m、y64で半径約320mの大体円形。
  1. (x, 254, z - 9)
  2. (x + 9, 251, z)
  3. (x, 254, z + 9)
  4. (x - 9, 251, z)

ただし上の例では、y240~250付近で通信範囲内であっても座標を特定できないエリアがわずかに存在する(山岳~地下で利用する分には特に問題ない)。

例2:
GPSホストを一辺が約12mの正四面体の各頂点に配置した例。有効範囲は4機目を中心として半径約363mの球形内。平面上の有効範囲はy1で半径約270m、y64で半径約315m、y128で半径約340mの円形。
  1. (x - 6, 254, z - 4)
  2. (x + 6, 254, z - 4)
  3. (x, 254, z + 7)
  4. (x, 244, z)

4機目の高度を下げているのは、4機目が1~3機目と同じ平面上の位置にならないようにするため。
+...
ホスト3機で2つに絞れた座標(片方が正しい)を4機目で1つに絞るためには、【《計算で求められた正しい座標と4機目間の距離》と《Rednetによる4機目までの正確な距離》の差の絶対値】と【《計算で求められた正しくない座標と4機目間の距離》と《Rednetによる4機目までの正確な距離》の差の絶対値】の差の絶対値が0.05以上である必要がある。これはGPS APIによる制約で、この値がGPS利用予定範囲内のすべての位置で0.05以上になるように4機目の高度を下げるのだが、高度を下げ過ぎると今度は通信可能範囲が縮小してGPS全体の利用可能範囲が狭くなってしまう。双方のバランスをとった結果、4機目のy座標、そして2~4機目のx, z座標つまりGPSの利用可能範囲が決まることになる。

GPSの利用

4つ以上のGPSホストが利用可能な位置にある「Wireless Modemを接続したComputer」や「Wireless系 Turtle」でgps locateコマンドやgps.locate関数を使用する。

GPSの仕組み

※【1.5】からWireless Modemの通信仕様変更により、GPS API及びgpsプログラムは、GPSホスト側の受信にはgps.CHANNEL_GPSのチャンネルを、GPSで座標を求めるコンピュータ側の受信には自身のコンピュータIDのチャンネルを用いるように変更されている。そのため、GPS APIやgpsプログラムを使わずにGPSネットワークを利用する場合は、Peripheral APIを用いて、直接Wireless Modemのメソッドを呼び出して通信する必要がある。詳しくは assets\computercraft\lua\rom\apis\gps 及び assets\computercraft\lua\rom\programs\gps のLuaスクリプトを参照。なお、 GPS API及びgpsプログラムからのみGPSを利用する限りは、この仕様変更を特に気にする必要はない。

  1. GPSホストには事前にGPSホストのある座標を記憶させておく(gps hostコマンドを使用。GPSホストはCHANNEL_GPSチャンネル宛ての通信が受信可能になる)
  2. gps locateコマンドまたはgps.locate関数によって、現在位置を知りたいコンピュータから文字列"PING"がCHANNEL_GPSチャンネルへ送信される
  3. 文字列"PING"を受信したGPSホストは、1.で設定した自身の座標を"PING"を送信したコンピュータ(2.の位置を知りたいコンピュータ)へ返信する
  4. 位置を知りたいコンピュータは各GPSホストからGPSホストの座標とGPSホストまでの距離(位置を求める計算に使われる)を得る。
  5. 位置を知りたいコンピュータ側に、同一平面上にない4つ以上のGPSホストから返信があれば位置を計算できる。
    同一直線上にない3つのGPSホストの場合、gps locateコマンドや、デバッグモードを指定したgps.locate関数は2つの座標(片方が正しい)を画面に表示するが、gps.locate関数の戻り値から結果を得ることはできない。

locate


assets\computercraft\lua\rom\apis\gps で定義
  • gps.locate( timeout [ , debug ] )
  • GPSシステムを利用してコンピュータやタートルの座標を求める。timeout(数値)はGPSホストからの返信を待つ時間(秒)。debug(ブーリアン)にtrueを指定すると画面にデバッグ情報を表示する。
  • 戻り値:数値型(x), 数値型(y), 数値型(z)。座標が求められた場合は各座標の数値が返る。求められなかった場合はnilが返る

位置を求めるのに有効なGPSホストが3つしかない場合は、デバッグ情報に2つの候補座標が表示されるが関数の戻り値からは座標を取得することができない(nilが返る)。

内部的にはos.pullEvent関数でmodem_messageイベントとtimerイベントを捕捉している。イベントシステムを使って実装されているため、受信待機中に発生した他のイベントは破棄される。


Help API


helpコマンドに関するAPI

折り畳み
+...

path


  • help.path()
  • Help APIがあるパスを返す(通常はROM直下)。
  • 戻り値:文字列型。パスを返す

例:
print(help.path())
Help APIの現在のパスを出力する。

setPath


  • help.setPath( path )
  • 戻り値:nil

help.setPath( "/disk/help/" )

lookup


  • help.lookup( topic )
  • 戻り値:文字列又はnil

print(help.lookup("disk"))

topics


  • help.topics()
  • "help"コマンドで参照できるすべてのトピックを返す
  • 戻り値:テーブル型。トピックのリストが返される

例:
for _, v in ipairs(help.topics()) do
 print(v)
end
全てのトピックリストを表示する

completeTopic


【1.74-】
  • help.completeTopic( partial topic name )
  • 戻り値:テーブル型

例:
for _, match in pairs( help.completeTopic("ex") ) do print( match ) end






編集用コメント

コメント欄の方針に関してはコメント欄方針を参照して下さい。
wikiの編集が苦手な方は、以下のコメントフォームへ書き込んで頂ければ有志でページに取り込みます。
MODの情報について間違った点や、動作確認済みのMODの不具合等があればご報告下さい。
※コメントを投稿する際は、以下の点を確認して下さい※
  • 編集に関わらない内容のコメント・質問・雑談 は一律して削除されます。
    MOD配布サイト、ReadMeを熟読しても分からなかった質問は、配布サイトや非公式フォーラムなどにて質問して下さい。
  • 投稿の前に一度コメントログに目を通し、 既に同じ内容が載っていないか確認して下さい。
  • 投稿の際は必ず 前提MOD及びそのMODのバージョンを明記し、様々なケースを試した上で 報告して下さい。
  • 投稿されているコメントへの返信の際は、 返信したいコメント横の○にチェックを入れて 返信して下さい。
    表示できる親コメントの数は限られます。新規投稿をむやみに行うことは、他のコメントが流れてしまう要因になります。
コメントログ:MOD解説/ComputerCraft/API
+上記の内容を守れる方のみご利用ください。
上記の内容を守れる方のみご利用ください。
  • 単なるコピペに情報を少し加えただけですが仮作成ということで。あと、wiki編集自体これが初めてなので単なるコピペでも至らない点などがあると思いますがご了承ください - joji0425 2015-08-30 22:25:24
    • help apiだけ作成 - joji0425 2015-08-30 22:56:52
  • colors.subtractが使えないバグを発見しました。FTBの - hexbin 2015-11-21 05:35:48
    • Infinity Evolved 1.7の環境にて確認。 - 名無しさん 2015-11-21 05:37:21
  • 症状は、subtractを使って結束ケーブル(Rp2) - 名無しさん 2015-11-21 05:38:59
  • を、出力した結果除算されていない出力が出てしまいました。追記でバグありという風に修正お願いします。 - 名無しさん 2015-11-21 05:40:22
    • ps、すみませんエンターキーのバグで連続投稿の状態になってしまい、ログが流れすぎています、合わせて修正のほどお願いしますm__m - 名無しさん 2015-11-21 05:43:25
  • 目次の飛び先が折りたたまれていてもジャンプして欲しいですね。 - 名無しさん 2016-04-09 00:47:30
    • そんな無茶な… - 13540 2017-12-11 06:51:53
名前:

|新しいページ|検索|ページ一覧|RSS|@ウィキご利用ガイド | 管理者にお問合せ
|ログイン|
Wikiのガイドライン
必ずお読みください!

基本事項



プラットフォーム


アイテムデータ



エンティティ



ゲームデータ



ワールド



Tips



ADVANCE



マルチプレイ



リンク




Wiki運営



その他



カウンタ


合計
-

トップページ
今日 : -
昨日 : -

更新履歴


取得中です。
※「ログ」「アーカイブ」「コメント」のページはここの履歴に表示されませんので、「更新履歴」および「コメント」から参照してください

人気ページ