CropCardクラスの仕様

バージョン: industrialcraft-2-2.2.720-experimental

概要




 
 

ここではic2.api.crops.CropCardの仕様を見ていく。APIなのでソースコードが公開されており大量のコメントが書かれているが、ここではそれらのJavaDocコメント文を全力で無視して各メソッドの品評を行う。コメントはすべて英文なのでJavaDoc出力してGoogleChromeで開くとよい。

CropCardこそが作物種を表すクラスである。Crop追加MODを作成するにあたって、最も重要で基本的なAPIクラスである。

 

メソッド

new()

コンストラクタ。modidにLoader.instance().activeModContainer()のgetModId()を突っ込んでいる。

abstract String name()

内部名を返す。"redMushroom"のように、先頭が小文字のキャメルケースの半角英数を使う。別に全角文字を入れても大丈夫な気もするが、通常は変数名とかの形でJavaコードにも出現すると思われるので、変数名と同化させるのがよいだろう。

農業革命中に仕様が表示名から内部名へと変わった。それゆえ、古いModでは"RedMushroom"のように英名が返されている。現在はこのメソッドは内部名を返すことになっている

String owner()

この作物種を追加したModのmodidを返す。オーバーライドしてない場合、コンストラクタで取得されたスレッドから判断されたmodidが使われる。

String displayName()

表示名を返す。これは"tile.dirt.name"のような形式の翻訳キーで返す。日本語などのローカライズされた名前では返さない(返しても動作は同じはず)。

標準の動作は内部名をそのまま返すというもの。というのも、name()は古い仕様では表示名を返していた。この動作だと翻訳しにくいので是非オーバーライドしよう

コメントを見ると、owner() + ".crop." + name()のような内容にオーバーライドしてくださいと言っている。"tile.dirt.name"側に合わせると、さしずめ"crop." + owner() + "." + name() + ".name"だろうか?

String discoveredBy()

発見者の名前を書く。デフォルトは"unknown"。実在の植物や創作植物の場合はMODのクリエイターの名前を書くのがいいだろう。その他に、バニラから持ってきた物は"Notch"のように作ったと思われる人物を記述する。

String desc(int i)

デフォルトの動作は属性を2列に分けて表示している。書き換えると面白いメッセージを出せるが、表示にしかかかわらないはずなので書き換えなくても特にゲームに影響はない。栽培のノウハウとか書いてみても面白いかも??

種解析機で表示できる。

int getrootslength(ICropTile crop)

根の長さを返す。デフォルトは1。この長さの分だけ耕土下ブロックの射程が伸びる。

しかし、値の対応が結構謎。以下に対応を載せる。

getrootslength 意味 植物種の例
0 意味をなさない  
1 意味をなさない デフォルト
2 意味をなさない  
3 耕土の下1ブロックに反応 フェルー・オーレリア
4 耕土の下2ブロックに反応 (ネザー/テラワート)

ワート系統はtickメソッドを見るに4でなければならなそうだが、1になっている。

abstractint tier()

植物種のTier(レア度)を返す。解説には1~16までの範囲で指定しろと書いてある。0は雑草である。

限界突破してTierが17以上になったものを超16植物と呼ぶことにしておく。

価値が高く、力強い植物種はこの値が高い。ちなみに最高はIC2のオーレリアで8、GregTechのダイヤアシで12である。

abstractint stat(int n)

植物の交配上のステータス。交配時のレート計算に使われる。0から4までの5通りの呼ばれ方があり、それぞれ返す値が次のような意味づけになっている。

  • 0 Chemistry 科学的(工業的には化学的な使い方をされる)
  • 1 Consumable 消費可能(食物・ポーションなど)
  • 2 Defensive 外敵に対する特殊な防御を持っている(棘や毒など)
  • 3 Colorful カラフルや美しい植物。染料に使いやすい。
  • 4 Weed 雑草に近い(疎まれる)植物は高い。必然的に高Tierほど下がるだろう。

abstractString[] attributes()

植物種の属性を返す。属性の例はこちらの記事にある。new String[] { "Leaves", }のようにその場でインスタンスを生成してもよいが、交配の処理場なかなか重くなりそうなのでコンストラクタで生成するのがよいだろう。

abstractint maxSize()

最大成長サイズを返す。様々な部分がこれを参照する。

@SideOnly(Side.CLIENT)
void registerSprites(IIconRegister iconRegister)

この植物種が使うテクスチャのリソースを登録する。描画系統で特別なことをしない限り、書き換える必要はない・・・・・・と一見思われるが、このメソッドはオーバーライドした方が良い

このままではテクスチャファイルのドメインがic2固定なので内部名の重複によってリソースの競合が起こるのだ。修正するにはAPIのコードをまるまるコピーし、

textures[i - 1] = iconRegister.registerIcon("ic2:crop/blockCrop." + name() + "." + i);

の行を

textures[i - 1] = iconRegister.registerIcon(owner().toLowerCase() + ":crop/blockCrop." + name() + "." + i);

にすればよい。

@SideOnly(Side.CLIENT)
IIcon getSprite(ICropTile crop)

TileEntityCropが与えられたときにアイコンを返すメソッド。引数がint sizeではなくITileCropなおかげで様々な条件によってテクスチャを切り替えられる

ただし、めまぐるしく変えようとしても、サーバーからクライアントに移動させる周期とクライアントが再描画する周期があるのでそこの2か所を突破しなければうまくはいかない。せいぜいGGR値によって変えるまでだろう・・・

int growthDuration(ICropTile crop)

最大成長経験値を返す。デフォルトとはTier*200。成長サイズが1段階進むのにかかるポイントである。単位は複雑な単位。

abstractboolean canGrow(ICropTile crop)

成長可能かおよび、設置可能かおよび、交配によって出現可能かを返す。

引数の成長サイズが1以上なら成長時。0で、かつupgraded(リフレクションを使わなければ取得できない)なら交配時、そうでないなら種袋ベースシードでの設置時。

なお、成長サイズ=最大成長サイズの場合はfalseを返すようにしなければ成長が際限なく進みバグる。

int weightInfluences(ICropTile crop, float humidity, float nutrients, float air)

デフォルトの動作は3つのfloatを足したものをintにして返す。

これはどのように改変すればよいのかというと、以下はアシのオーバーライドである。

(int) ((double) humidity * 1.2D + (double) nutrients + (double) air * 0.8D)

これは保水環境値に大きな荷重がかかっていることを示している。

boolean canCross(ICropTile crop)

交配に参加可能かどうかを返す。デフォルトでは、成長サイズが3以上のときにtrueとなっている。

IC2の中ではオーバーライドしている者は居ない。

最大成長サイズが2以下である場合、これをオーバーライドすること!その植物種は交配に参加できなくなってしまう。

boolean rightclick(ICropTile crop, EntityPlayer player)

右クリック時のイベント。デフォルトの動作はcrop.harvest(true)を呼び出す。

ヴェノミリアはplayerがスニークじゃないなら毒に犯すという処理が挟まれている。どうやら引数のplayerは非nullのようだ。

そのままreturn trueなどすると、収穫不能となる。

abstractint getOptimalHavestSize(ICropTile crop)

Cropハーベスターに種解析機を突っ込んだ時にベストな収穫時期として判断されるらしい。通常はreturn maxSize();などと書いておけばよいだろう。

abstractboolean canBeHarvested(ICropTile crop)

右クリックで収穫可能かどうかを返す。このメソッドでは、普通は成長サイズが適切かどうかを判断する処理が入っている。

多くの植物種では最大成長サイズの場合にのみ収穫可能であるので、return crop.getSize() == maxSize();としておけば困らないだろう。これで困るような特殊な植物種には、アシやヴェノミリアなどがある。

float dropGainChance()

収穫物の収穫量にかかわる値である。デフォルトでは0.95^Tierを返している。Tierが高いほど収穫物が出にくいのだ。

フェルーはsuperを半分にしたものを返すようにオーバーライドしている。ネザーワートは2を返している。金属が収穫できるような強力な植物種は、倍率がかかっていることが多い。

abstractItemStack getGain(ICropTile crop)

収穫物を返す。1種類しか返せないが、スイカはIC2.random.nextIntを呼び出してランダムにすることでうまくメロンブロックとメロンの切り身を返している。

byte getSizeAfterHarvest(ICropTile crop)

収穫後の成長サイズ。デフォルトは1。植物種によってまちまちとなるだろう。

boolean leftclick(ICropTile crop, EntityPlayer player)

左クリック時のイベント。デフォルトはreturn crop.pick(true);

ヴェノミリアはこれをオーバーライドしてsuperのこれを実行する前にplayerを毒に犯している。

雑草はreturn false;することで左クリックで除草できなくしている

float dropSeedChance(ICropTile crop)

種袋のドロップ率に影響する。このメソッドは面倒なことをしているので書き換えない方が無難だが、高Tierになるほど種袋が取りにくくなるので、救済したい場合は書き換えるとよい。

以下のことを行っている。

  • 収穫時の成長サイズが1なら0を返す
  • 収穫時の成長サイズが2なら0.5*0.8^Tierを返す
  • 収穫時の成長サイズがそれ以外なら0.25*0.8^Tierを返す

ItemStack getSeeds(ICropTile crop)

種袋に当たるアイテムを返す。crop.generateSeedsを叩くことでデフォルトの種袋を取得できる。

小麦などがオーバーライドしており、非常に低いGGR値では単なる小麦の種を落とすようにしている。

void onNeighbourChange(ICropTile crop)

近隣のブロックが更新されたときに呼び出されるイベントである。バニラIC2に存在する植物種では使われていない。

int emitRedstone(ICropTile crop)

赤石信号を出力するかどうか。デフォルトは0。

赤石小麦は成長サイズ7で15の赤石信号を出力する。

void onBlockDestroyed(ICropTile crop)

支柱の破壊時のイベント。バニラIC2に存在する植物種では使われていない。

int getEmittedLight(ICropTile crop)

発光する植物の場合、その強度。

赤石小麦は成長サイズ7で7の照明光を出力する。

boolean onEntityCollision(ICropTile crop, Entity entity)

エンティティが接触した際に呼ばれるイベント。trueを返した場合、このあと踏み荒らしのイベントを発火する。デフォルトではエンティティがEntityLivingBaseであり疾走状態の時にtrueを返している。

void tick(ICropTile crop)

256MinecraftTickに1回、即ちCropTickごとに呼ばれるメソッド。

デフォルトでは何もしないが、ネザーワートとテラワートでは必然変異に関する処置が書かれている。

boolean isWeed(ICropTile crop)

雑草属性状態であるかどうかを返す。デフォルトは、成長サイズが2以上かつ植物種が雑草と等しいかGrowthが24以上である場合にtrue。

ヴェノミリアはこれを成長サイズが5以上かつGrowthが8以上であるときとしている。

@Deprecated
finalint getId()

今は非推奨となった整数IDによる識別番号である。指定しなくとも自動的に番号が振られる。

@SideOnly(Side.CLIENT)
protectedIIcon textures[];

この変数はregisterSpritesやgetSpriteのデフォルト実装が使っている。protectedなので、サブクラスから参照可能である。

 

最終更新:2015年06月07日 18:12