Minecraftとタートルと僕

PCゲームMinecraftのMOD「ComputerCraft」の情報を集めたニッチなブログです。

こちらのページは更新が滞っており、情報が古くなりつつあります。新しいCC情報サイトをはじめましたので、もしよければご参照ください。今後ともよろしくお願い申し上げます。

「百億のマインクラフトと千億のタートル」(https://hevo2.hatenablog.com/)

ComputerCraftプログラミング環境の設定メモ

まずは基本的な設定

  1. GAME_DIR\resoucepacks フォルダに、ComputerCraft1.6xx.jar を展開して配置。
    • 圧縮・解凍ソフト 7-Zip使って、右クリックで展開がてっとり早い。
    • 念のためComputerCraftとフォルダ名前を変えておく(必要ないかも)
  2. GAME_DIR\resourcepacks\ComputerCraft\assets\computercraft\lua\rom に、好きな名前のフォルダを作成
    • ここでは、PocketComputer用に「pc」という名前のフォルダを作る
    • GAME_DIR\resourcepacks\ComputerCraft\assets\computercraft\lua\rom\pc
  3. ゲーム外のテキストエディタなどで作成したプログラムファイルをこの「pc」フォルダに置くと、ゲーム内の全てのコンピュータから「/rom/pc」ディレクトリとしてアクセスできる

パスを通すことで入力を楽にする

上記フォルダに置いたプログラムファイル(たとえばファイル名「test」)を実行するには、

> /rom/pc/test

のように打ち込まないといけないが、面倒ならばパスをここに通しておくと良い。

GAME_DIR\resourcepacks\ComputerCraft\assets\computercraft\lua\rom\startup ファイルの書き換え。

「sPath = sPath..":/rom/pc"」のような記述を、ファイル中の「shell.setPath( sPath )」の行よりも前の位置に書き込む

これだけで、「/rom/pc」にあるプログラムファイルをファイル名だけで実行できる。

> test

のように。

ファイル名の拡張子を省略しても実行できるように

テキストエディタとの関係で、ファイル名を拡張子「.lua」付きにしないといけない(あるいは意図的にそうしたい)ときに、以下のように既存プログラムを書き換えることで、拡張子を省略してもそのままそのファイルを実行できる。

  • 「/rom/program/shell」ファイル内、shell.resolveProgram()の書き換え
    • コメント「-- Otherwise, look on the path variable」以下のfor文の中で「.lua」の処理を追加。
function shell.resolveProgram( _sCommand )
    -- Substitute aliases firsts
    if tAliases[ _sCommand ] ~= nil then
        _sCommand = tAliases[ _sCommand ]
    end

    -- If the path is a global path, use it directly
    local sStartChar = string.sub( _sCommand, 1, 1 )
    if sStartChar == "/" or sStartChar == "\\" then
        local sPath = fs.combine( "", _sCommand )
        if fs.exists( sPath ) and not fs.isDir( sPath ) then
            return sPath
        end
        return nil
    end
    
    -- Otherwise, look on the path variable
    for sPath in string.gmatch(sPath, "[^:]+") do
        sPath = fs.combine( shell.resolve( sPath ), _sCommand )
        local sPathExtLua = sPath..".lua"
        if fs.exists( sPath ) and not fs.isDir( sPath ) then
            return sPath
        elseif fs.exists( sPathExtLua ) and not fs.isDir( sPathExtLua ) then
            return sPathExtLua
        end
    end
    
    -- Not found
    return nil
end

つまり

以上をすべて行うことで、

GAME_DIR\resourcepacks\ComputerCraft\assets\computercraft\lua\rom\pc\ フォルダに置いた、「test.lua」というプログラムファイルを、

全てのCCコンピュータから、> testと打ち込むだけで実行できる。

ただし、/romディレクトリにあるプログラムファイルは、ゲーム内から編集できないので注意。

つまり、プログラムファイルの編集は常に外部エディタで行うことになる。

APIをLoadする方法

自分が以前に作ったAPIを、これから作るプログラムファイルで読み込みたいときには、次のような行をプログラムファイルの前のほうに書き込む

  • os.loadAPI("/rom/pc/myapi")
    • myapi.luaというファイル名のままだとちょっとまずい。拡張子無しにファイル自体の名前を変更してください。あるいは、os.loadAPI()ではなく自分でAPIをloadする関数を定義するか。

これで、テーブル「myapi」を使って、APIを利用できる。

シンボリックリンクの活用

(以下は、自己責任で行うこと。コマンド入力ミスによるトラブルが起きても保障はできません)

GAME_DIR\resourcepacks\ComputerCraft\assets\computercraft\lua\rom\ ディレクトリはとても深いところにあるのでアクセスしづらい。

また、いくつものバージョンのマインクラフトを使い分けているとき、それぞれのresourcepacksフォルダにLuaプログラムファイルを置くのもめんどう。

Luaファイル置き場へ飛ぶことができるシンボリックリンクを各resoucepacksフォルダに作ることで楽をしよう。

  1. あらかじめファイル置き場ディレクトリを作っておく(たとえば C:\luafiles\pc)
  2. 管理者モードでコマンドプロンプト起動
  3. mklink コマンドの実行。書式は以下の通り
> mklink /d <作りたいシンボリックリンク> <すでに存在するディレクトリ>

たとえば、次のように(GAME_DIRは自分の環境に置き換えること)

> mklink /d GAME_DIR\resourcepacks\ComputerCraft\assets\computercraft\lua\rom\pc C:\luafiles\pc

言わば、すでに存在するディレクトリに対するショートカットなので、同じディレクトリに向かって複数のシンボリックリンクを作ることが可能。

遊んでいるマインクラフトのディレクトリごとに上記コマンドを実行すればよい。

ファイル置き場ディレクトリ内のファイルを書き換えれば、それぞれのマイクラで反映される。

なお、mklinkコマンドの引数の前後を入れ替えてしまわないよう注意。悲惨なことになる。

以上はWindowsでのやり方だが、MacOSX、Linuxでもシンボリックリンクを使うと同じことができるはず。

Windowsのシンボリックリンクは以下の図のように矢印付きのフォルダで表示される。

f:id:hevohevo:20140805003036p:plain