Crop追加アドオンの作成方法

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

概要





 
 

この項目では、IC2Cropシステムの作物種を追加するためのModを作成するために有用な情報を載せる。

 

modid(またはModId、modId)

ModのId(識別子)である。それ以上でもそれ以下でもない(文字列型なので比較はできない)。

農業革命からIC2Cropでは整数なIdではなく文字列のIdであるこれが重要な識別子となった。

前提

IC2ExpのAPIであるic2.api.crops.*は必須である。これは、APIパックやDev版のJenkinsのJarの中に入っている。

デバッガ

Gregのポータブルスキャナやクリエイティブモード、IC2をinDevにすることで得られる影響をデバッガとして利用可能。

また、新PluginCropsは開発者向けのクリエイティブ専用デバッガアイテムを多く含む。

MirageCrops 6

本記事群産のアドオン。書き方がカオスだが、サンプルコードとしても一応使えると思う。

Cropの追加処理はmiragecrops6.InitializerCropsに存在する。miragecrops6.crop.CropCardMirageCropsがこのMod唯一のCropCard継承クラスである。miragecrops6.crop.HCropCardMirageCropsには、CropCardMirageCropsに対して、各種作物種の特殊な機能を与えるためのヘルパが詰まっている。

Cropの追加処理

  • 新たにCropCardを継承したクラスを作成し、そのインスタンスをCrops.instance.registerCropに喰わせてやることで登録される。
    • 登録タイミングは、FMLInitializationEventで大丈夫な模様。
  • IC2Exp720時点で、作物種はownerとnameによって識別される。
    • ownerは​呼び出したスレッドから自動で特定され、その値は呼び出し元のModIdとなる
      • ​registerCropのオーバーロードされたAPIの利用によって、owner指定登録も可能。
      • ちなみにCropCardのowner()をオーバーライドすることが推奨されている。
    • ​それゆえ、どんなに競合を起こす気満々のnameを与えても、ownerが固有であれば競合しない。
  • 翻訳は、assets/modid/lang/ja_JP.langに次のように書くとできるできる(実は.langファイルの設置場所はどこでもいい)。
    • crop.sampleCrop.name=サンプルの作物
    • また、en_US.langに英語名を記述する。これは翻訳未設定の言語で表示する際にも使われるので、なるべく設定したい。
  • 次のコマンドによって種袋を取得できる。
    • /giveプレイヤーの名前 IC2:itemCropSeed 1 0 {owner:modid,name:sampleCrop,scan:4}
  • 画像の指定方法は、resources以下のassets/ic2/textures/blocks/crop以下に、blockCrop.sampleCrop.1.pngのようなファイル名の画像を置く。
    • 下記のサンプルでは表示するアイコンを直接別のブロックのアイコンに指定しているので、そこにファイルを置いても反映されない。
      • 下記のサンプルからgetSpriteメソッドを除去すると標準の画像表示処理が使われる。
    • ちなみに、画像の参照先はregisterSpritesをオーバーライドすればいくらでも変更可能。
      • APIには参照先が"ic2:crop/blockCrop."+name()+"."+iとあるが、これは、実ファイルでいうとassets/ic2/textures/blocks/crop/blockCrop.作物種内部名.成長サイズ.pngを表す。
      • ドメイン(":"の左にあるmodidの部分)がic2になっているので、ここを独自のmodidに変えた方が良い(この場所だと別のownerにある同名作物種が競合するので)。

CropCardの詳細

CropCardクラスの仕様にまとめた。

サンプルコード

以下は追加部分のコーディングサンプルである。sampleCropという内部名で、土や石ブロックのテクスチャを持ったTier4で砂糖を収穫できる作物種を追加する。

CropCardクラスは抽象メソッドが多いので、大量に追加したい場合はそこらへんをうまいことやるとよい。

このコードは、@Modが付いたクラスに設置する用のメソッド形式である。青字部分が実際の追加処理になるので、件のイベントの処理に最低限これだけ並べればよい。

    @EventHandler
    public void handle(FMLInitializationEvent event)
    {

        Crops.instance.registerCrop(new CropCard() {

            @Override
            public String displayName()
            {
                return "crop." + name() + ".name";
            }

            @Override
            public String name()
            {
                return "sampleCrop";
            }

            @Override
            public int tier()
            {
                return 4;
            }

            @Override
            public int stat(int n)
            {
                if (n == 0) return 4;
                if (n == 1) return 3;
                if (n == 2) return 2;
                if (n == 3) return 1;
                if (n == 4) return 0;
                return 0;
            }

            @Override
            public String[] attributes()
            {
                return new String[] {
                    "Sample",
                };
            }

            @Override
            public int maxSize()
            {
                return 4;
            }

            @Override
            public boolean canGrow(ICropTile crop)
            {
                return crop.getSize() < maxSize();
            }

            @Override
            public int getOptimalHavestSize(ICropTile crop)
            {
                return maxSize();
            }

            @Override
            public boolean canBeHarvested(ICropTile crop)
            {
                return crop.getSize() == maxSize();
            }

            @Override
            public ItemStack getGain(ICropTile crop)
            {
                return new ItemStack(Items.sugar);
            }

            @Override
            public IIcon getSprite(ICropTile crop)
            {
                if (crop.getSize() == 1) return Blocks.dirt.getBlockTextureFromSide(0);
                if (crop.getSize() == 2) return Blocks.stone.getBlockTextureFromSide(0);
                if (crop.getSize() == 3) return Blocks.cobblestone.getBlockTextureFromSide(0);
                if (crop.getSize() == 4) return Blocks.iron_block.getBlockTextureFromSide(0);
                return super.getSprite(crop);
            }

        });

    }

 

最終更新:2015年05月29日 01:23