hogepiyo

かつてはマイクラのModを作っていたがひざに矢を受けた

やっとpushできた

やっとherokuにpushできた.
最近のRuby、Railsの環境構築と、herokuへデプロイについて教えてもらいました | blog.ojimac.comを見て「開発環境ではsqlite3, herokuではpostgreSQLにする」という設定をgemfileに追加して, [Heroku] Rails 3.2 アプリを git push すると rake assets:precompile でエラーが出るときの対処法 | CodeNote.netにあるようにconfig/apprication.rbにも設定を追加してやってやっとherokuにpushできたとさ. ちゃんちゃん.

web系に限らないと思うけど, 参考にしてる資料と現在のバージョンが違うだけで導入が異様に大変になるっていうのは「これからプログラミングを学ぼうとしている人」にとって大変な敷居になってるんだろうなぁって思いました まる

Rails + Herokuさわってる

MCPがまだ不完全だし, ちょっと別件でrails触ってみることになったのでrails+herokuをやってみてはいるんだけど, とにかくこけまくる.

gitやrailsのverやIDEあたりをなんとか乗り越えたけど, herokuへのdeployでエラーが出る. エラー内容も頭がまわらずわからない. ぼすけて.

Minecraft 1.7.2, Forge985 Moddingの変更点まとめ

今のところの変更点まとめ

  • GameRegistry.registerBlockでBlockを登録すると使用されていないIDを小さい順から自動で割り振るようになった.
  • つまり内部的には(互換性の都合上)IDがまだ存在する.
  • Blockの登録は(FMLの指定通り)PreInitでやるようになった(Initでは登録されない).
  • LanguageRegistryではローカライズできなくなった(仕様か不具合かは不明), langファイルでのローカライズが推奨される模様.
  • Blockは文字列で参照をひっぱってこれるが, バニラのブロックなどはBlocks/Itemsというクラスにまとめられていて, ここから参照できる.
  • テクスチャの設定などは変わっていない.
  • IconがIIconに, IconRegistryがIIconRegistryになった(mcp側の変更かもしれないけど)
  • まだ試してないが, PacketはNetworkDispatcherでやるっぽい?
  • BlockやItemなどはリネームテーブルがまだ0(全部連番)だが, 機能も引数も変わっていないメソッドが多いため割となんとかなる.
  • 何故かMaterialまで連番になってる.
  • BlockのコンストラクタはMaterialのみだけどprotected, 無名クラス作りたくなった.

まだBlockとFMLのさわりしかやってないのでこんなところ. ItemもBlockと似たようなものなので, 最大の壁はBiomeやChunk, Packetあたりかな?

Forge1.7.2+IDEA

1.6.4のままだとクライアントが起動しないのでクライアントの実行時引数(Program arguments)に

--accessToken anything

を追加する.

起動するが, どうやらChestGenHooksでIllegalAccessErrorが起きてクラッシュする. まだ早い.

IDEA+Gradleでわいわい

IDEAについて

Eclipseと同じIDE(統合開発環境)で, 正式名称は「IntelliJ IDEA」.
IntelliJ IDEA — The Best Java and Polyglot IDEからDLできる. Ultimate Edition(有料)とCommunity Edition(無料)がある.
Eclipseと違って日本語化されていないので注意. 解説等も英語のままが多かったので, 自分も日本語化はしていない.

Gradleについて

Forgeさんが導入したビルドツールもといビルドスクリプト. ビルド時に必要な情報をわっしわっしスクリプトに書いておくと自動でそれらのことをやってくれる. AntやMavenを内部から呼び出せるのでそっちでやってた人は移行も簡単.

(今までの)自分の開発環境

EclipseでのModdingはForgeが用意したワークスペースのsrcフォルダに直接ソースコードを入れて, bin/assetsにリソースを入れて開発していた. そのためMCPのコマンドでreobf.batをやると, reobfフォルダに追加したクラスファイルが全部出力される(パッケージを分けていても).

+ reobf
  + rgn
    + mods
      + dwarventools
      + elventools
      + toolrack

Modとして配布する際, このクラスファイルとリソースを分けてアーカイブにするわけだけど, 数が増えると面倒になった(なので, pythonスクリプトで自動で分別してアーカイブ化させてた).
更にいうと, getchangedsrcで出力したソースをgithubのローカルリポジトリに移してコミットしてたり・・・とにかく"手間が多かった".

IDEA+Gradle+Github

IDEAはデフォルトでGradleがIDEから使える. またgitにも対応しているので, msysGitなどをインストールしてgithubに接続すればIDEAから直接コミットできる.
加えてForgeGradleのbuildを実行すれば, ソースフォルダとリソースフォルダにあるものをコンパイルしてアーカイブ化してくれる. これを利用しない手はない.

ForgeGradleの導入

IntelliJ IDEA+gradleでもぢんぐ環境整える(Forge964) - nk0t's diaryを参考にIDEAで導入した. なおこれだけでもEclipseよりIDEAのほうが簡単だったりする(EclipseはGradleにデフォルトで対応していないのでプラグインを導入する必要がある).

ForgeGradleの仕様

インストール後のフォルダ階層を見れば一目瞭然だ. Modのソースとリソースはsrc/main/javaとsrc/main/resourcesにおけばいい. ビルド(MCPのreobf相当)はコンソールでForgeをインストールしたフォルダに移動して以下のコマンドを叩けばいい.

gradlew build

これを実行するとbuild/libsにアーカイブ化されたjarファイルが生成される.

マルチプロジェクト

ここからが本題. 上記の方法ではsrc/main/java&resourcesのものしかビルドされないし, 複数のModのソースをいれても1つのjarに入れられてしまう.
[How-To]Build multiple separate projects with Gradleという記事があったのでそれを試したってワケ.

上記記事はEclipse向けだったので, IDEAで色々つまづいた. なので出来たこと/やったことを手短にまとめる.

1. Modを子プロジェクトとして追加する

rootディレクトリ(名前を変えてないならforge-1.6.4-9.11.1.964-src, srcとかgradleとかeclipseとかいうフォルダがあるとこ)にsettings.gradleというファイルを以下の内容で追加する.
(もちろん名前は任意)

include 'modname'

次にrootディレクトリ内にmodnameフォルダを作成し, 以下のようなフォルダ構成にする.

+- root
   +- modname
      +- src
         +- main
            +- java
            +- resources

次にrootディレクトリにあるbuild.gradleを開き, 以下のようにする.

buildscript {
    repositories {
        mavenCentral()
        maven {
            name = "forge"
            url = "http://files.minecraftforge.net/maven"
        }
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT'
    }
}

allprojects {
    apply plugin: 'forge'

    minecraft {
        version = "1.6.4-9.11.1.964"
    }

    version = "1.0"

    archivesBaseName = project.projectDir.name
}

processResources
{
    // replace stuff in mcmod.info, nothing else
    from(sourceSets.main.resources.srcDirs) {
        include 'mcmod/info'
                
        // replace version and mcversion
        expand 'version':project.version, 'mcversion':project.minecraft.version
    }
        
    // copy everything else, thats not the mcmod.info
    from(sourceSets.main.resources.srcDirs) {
        exclude 'mcmod.info'
    }
}

中央のallprojects~以外はデフォルトのまま.

次にmodnameフォルダの中に新しいbuild.gradleを以下の内容で作成する.

tasks.withType(Compile) {
    options.encoding = 'UTF-8'
}

sourceSets.main {
    java.srcDirs project.projectDir.name
    resources.srcDirs project.projectDir.name
}

version = "0.0.0"

ここでは2つのbuild.gradleがあることに注意.

+- root
   +- build.gradle
   +- modname
      +- build.gradle
      +- src
         +- main
            +- java
            +- resources

なお, 後者のbuild.gradleのencoding = 'UTF-8'は日本語を含むソースコードの場合必要. 英語のみなら必要ない. versionはアーカイブのファイル名に利用される. アーカイブのファイル名はmodname-verison.jarになる.

この状態でビルドするとmodname/build/libsにmodnameのアーカイブが生成される.

おわり

ざっくりだけど, Eclipseでがやがややるよりもスマートに出来るような気がする. 特にgradleのスクリプトをがりがり書いたわけではない. ちょっと追加しただけ. またgradleには生成されたjarファイルを自動でサーバーにアップロードすることもできる模様. FMLやForgeはそうしているようだ.