ここではic2.api.crops.CropCardの仕様を見ていく。APIなのでソースコードが公開されており大量のコメントが書かれているが、ここではそれらのJavaDocコメント文を全力で無視して各メソッドの品評を行う。コメントはすべて英文なのでJavaDoc出力してGoogleChromeで開くとよい。
CropCardこそが作物種を表すクラスである。Crop追加MODを作成するにあたって、最も重要で基本的なAPIクラスである。
コンストラクタ。modidにLoader.instance().activeModContainer()のgetModId()を突っ込んでいる。
内部名を返す。"redMushroom"のように、先頭が小文字のキャメルケースの半角英数を使う。別に全角文字を入れても大丈夫な気もするが、通常は変数名とかの形でJavaコードにも出現すると思われるので、変数名と同化させるのがよいだろう。
農業革命中に仕様が表示名から内部名へと変わった。それゆえ、古いModでは"RedMushroom"のように英名が返されている。現在はこのメソッドは内部名を返すことになっている。
この作物種を追加したModのmodidを返す。オーバーライドしてない場合、コンストラクタで取得されたスレッドから判断されたmodidが使われる。
表示名を返す。これは"tile.dirt.name"のような形式の翻訳キーで返す。日本語などのローカライズされた名前では返さない(返しても動作は同じはず)。
標準の動作は内部名をそのまま返すというもの。というのも、name()は古い仕様では表示名を返していた。この動作だと翻訳しにくいので是非オーバーライドしよう。
コメントを見ると、owner() + ".crop." + name()のような内容にオーバーライドしてくださいと言っている。"tile.dirt.name"側に合わせると、さしずめ"crop." + owner() + "." + name() + ".name"だろうか?
発見者の名前を書く。デフォルトは"unknown"。実在の植物や創作植物の場合はMODのクリエイターの名前を書くのがいいだろう。その他に、バニラから持ってきた物は"Notch"のように作ったと思われる人物を記述する。
String desc(int i)
デフォルトの動作は属性を2列に分けて表示している。書き換えると面白いメッセージを出せるが、表示にしかかかわらないはずなので書き換えなくても特にゲームに影響はない。栽培のノウハウとか書いてみても面白いかも??
種解析機で表示できる。
根の長さを返す。デフォルトは1。この長さの分だけ耕土下ブロックの射程が伸びる。
しかし、値の対応が結構謎。以下に対応を載せる。
getrootslength | 意味 | 植物種の例 |
0 | 意味をなさない | |
1 | 意味をなさない | デフォルト |
2 | 意味をなさない | |
3 | 耕土の下1ブロックに反応 | フェルー・オーレリア |
4 | 耕土の下2ブロックに反応 | (ネザー/テラワート) |
ワート系統はtickメソッドを見るに4でなければならなそうだが、1になっている。
植物種のTier(レア度)を返す。解説には1~16までの範囲で指定しろと書いてある。0は雑草である。
限界突破してTierが17以上になったものを超16植物と呼ぶことにしておく。
価値が高く、力強い植物種はこの値が高い。ちなみに最高はIC2のオーレリアで8、GregTechのダイヤアシで12である。
植物の交配上のステータス。交配時のレート計算に使われる。0から4までの5通りの呼ばれ方があり、それぞれ返す値が次のような意味づけになっている。
植物種の属性を返す。属性の例はこちらの記事にある。new String[] { "Leaves", }のようにその場でインスタンスを生成してもよいが、交配の処理場なかなか重くなりそうなのでコンストラクタで生成するのがよいだろう。
最大成長サイズを返す。様々な部分がこれを参照する。
この植物種が使うテクスチャのリソースを登録する。描画系統で特別なことをしない限り、書き換える必要はない・・・・・・と一見思われるが、このメソッドはオーバーライドした方が良い。
このままではテクスチャファイルのドメインがic2固定なので内部名の重複によってリソースの競合が起こるのだ。修正するにはAPIのコードをまるまるコピーし、
の行を
にすればよい。
TileEntityCropが与えられたときにアイコンを返すメソッド。引数がint sizeではなくITileCropなおかげで様々な条件によってテクスチャを切り替えられる。
ただし、めまぐるしく変えようとしても、サーバーからクライアントに移動させる周期とクライアントが再描画する周期があるのでそこの2か所を突破しなければうまくはいかない。せいぜいGGR値によって変えるまでだろう・・・
最大成長経験値を返す。デフォルトとはTier*200。成長サイズが1段階進むのにかかるポイントである。単位は複雑な単位。
成長可能かおよび、設置可能かおよび、交配によって出現可能かを返す。
引数の成長サイズが1以上なら成長時。0で、かつupgraded(リフレクションを使わなければ取得できない)なら交配時、そうでないなら種袋やベースシードでの設置時。
なお、成長サイズ=最大成長サイズの場合はfalseを返すようにしなければ成長が際限なく進みバグる。
デフォルトの動作は3つのfloatを足したものをintにして返す。
これはどのように改変すればよいのかというと、以下はアシのオーバーライドである。
これは保水環境値に大きな荷重がかかっていることを示している。
交配に参加可能かどうかを返す。デフォルトでは、成長サイズが3以上のときにtrueとなっている。
IC2の中ではオーバーライドしている者は居ない。
最大成長サイズが2以下である場合、これをオーバーライドすること!その植物種は交配に参加できなくなってしまう。
右クリック時のイベント。デフォルトの動作はcrop.harvest(true)を呼び出す。
ヴェノミリアはplayerがスニークじゃないなら毒に犯すという処理が挟まれている。どうやら引数のplayerは非nullのようだ。
そのままreturn trueなどすると、収穫不能となる。
Cropハーベスターに種解析機を突っ込んだ時にベストな収穫時期として判断されるらしい。通常はreturn maxSize();などと書いておけばよいだろう。
右クリックで収穫可能かどうかを返す。このメソッドでは、普通は成長サイズが適切かどうかを判断する処理が入っている。
多くの植物種では最大成長サイズの場合にのみ収穫可能であるので、return crop.getSize() == maxSize();としておけば困らないだろう。これで困るような特殊な植物種には、アシやヴェノミリアなどがある。
収穫物の収穫量にかかわる値である。デフォルトでは0.95^Tierを返している。Tierが高いほど収穫物が出にくいのだ。
フェルーはsuperを半分にしたものを返すようにオーバーライドしている。ネザーワートは2を返している。金属が収穫できるような強力な植物種は、倍率がかかっていることが多い。
収穫物を返す。1種類しか返せないが、スイカはIC2.random.nextIntを呼び出してランダムにすることでうまくメロンブロックとメロンの切り身を返している。
収穫後の成長サイズ。デフォルトは1。植物種によってまちまちとなるだろう。
左クリック時のイベント。デフォルトはreturn crop.pick(true);。
ヴェノミリアはこれをオーバーライドしてsuperのこれを実行する前にplayerを毒に犯している。
雑草はreturn false;することで左クリックで除草できなくしている。
種袋のドロップ率に影響する。このメソッドは面倒なことをしているので書き換えない方が無難だが、高Tierになるほど種袋が取りにくくなるので、救済したい場合は書き換えるとよい。
以下のことを行っている。
種袋に当たるアイテムを返す。crop.generateSeedsを叩くことでデフォルトの種袋を取得できる。
小麦などがオーバーライドしており、非常に低いGGR値では単なる小麦の種を落とすようにしている。
近隣のブロックが更新されたときに呼び出されるイベントである。バニラIC2に存在する植物種では使われていない。
赤石信号を出力するかどうか。デフォルトは0。
赤石小麦は成長サイズ7で15の赤石信号を出力する。
支柱の破壊時のイベント。バニラIC2に存在する植物種では使われていない。
発光する植物の場合、その強度。
赤石小麦は成長サイズ7で7の照明光を出力する。
エンティティが接触した際に呼ばれるイベント。trueを返した場合、このあと踏み荒らしのイベントを発火する。デフォルトではエンティティがEntityLivingBaseであり疾走状態の時にtrueを返している。
256MinecraftTickに1回、即ちCropTickごとに呼ばれるメソッド。
デフォルトでは何もしないが、ネザーワートとテラワートでは必然変異に関する処置が書かれている。
雑草属性状態であるかどうかを返す。デフォルトは、成長サイズが2以上かつ植物種が雑草と等しいかGrowthが24以上である場合にtrue。
ヴェノミリアはこれを成長サイズが5以上かつGrowthが8以上であるときとしている。
今は非推奨となった整数IDによる識別番号である。指定しなくとも自動的に番号が振られる。
この変数はregisterSpritesやgetSpriteのデフォルト実装が使っている。protectedなので、サブクラスから参照可能である。