Minecraft1.8からItemModelやBlockModelのjsonを書く必要が出てきて面倒じゃないですか?
僕は見た目の部分をコードから排除するのはすごい良いと思うんだけど、使い回しができずにファイルを複製してひたすら増えていくのはどうかと思うんです。

そこでテンプレートをベースにコンパイル時に生成するライブラリを作りました。
コードはこんなかんじになります。

public class BlockSample {

    @BlockModel(name = "block1", args = {"blocks/brick", "blocks/clay"}, template = "sample:block_base")
    @BlockState(name = "block1", args = {"sample:block1"}, template = "sample:state_base")
    @ItemModel(name = "block1", args = {"sample:block/block1"}, template = "sample:item_block_base")
    @Languages({
            @Language(value = "サンプルブロック1", name = "sampleBlock1", lang = LangType.JA_JP, target = LangTarget.BLOCK),
            @Language(value = "Sample Block 1", name = "sampleBlock1", lang = LangType.EN_US, target = LangTarget.BLOCK)
    })
    public static final Block block1 = new SimpleBlock();
    @BlockModel(name = "block2", args = {"blocks/clay", "blocks/brick"}, template = "sample:block_base")
    @BlockState(name = "block2", args = {"sample:block2"}, template = "sample:state_base")
    @ItemModel(name = "block2", args = {"sample:block/block2"}, template = "sample:item_block_base")
    @Languages({
            @Language(value = "サンプルブロック2", name = "sampleBlock2", lang = LangType.JA_JP, target = LangTarget.BLOCK),
            @Language(value = "Sample Block 2", name = "sampleBlock2", lang = LangType.EN_US, target = LangTarget.BLOCK)
    })
    public static final Block block2 = new SimpleBlock();

    public static void init() {
        CoreProxy.proxy.registerBlock(block1, "block1");
        CoreProxy.proxy.registerBlock(block2, "block2");
    }
}

@BlockModelテンプレートはこんな感じ

{
  "parent": "block/cube",
  "textures": {
    "particle": "{1}",
    "down": "{0}",
    "up": "{0}",
    "north": "{1}",
    "south": "{1}",
    "west": "{1}",
    "east": "{1}"
  }
}

テンプレートの{index}は@BlockModelのargsの各インデックスにバインドされています。
これで同じテンプレートからテクスチャだけ違うBlockModelのjsonが生成されます。
同じように@ItemModelと@BlockStateも利用できます。

次に@Languageはlangファイルへの書き込みを行います。
1つのアイテムやブロックに複数の翻訳を指定したい場合は@Languagesに配列で@Languageアノテーションを入れます。
valueに翻訳後の値
nameにunlocalizedName
langに翻訳言語
targetに翻訳のタイプを指定します。
コンパイル時にアノテーションが処理されてlangが生成されます。

次に必須となるアノテーションを紹介

@Mod(modid = SampleMod.MODID, version = SampleMod.VERSION)
@ResourcesDomain("sample")
@ModID(SampleMod.MODID)
public class SampleMod
{
    public static final String MODID = "sample";
    public static final String VERSION = "1.0";
    
    @EventHandler
    public void init(FMLInitializationEvent event)
    {
        ItemSample.init();
        BlockSample.init();
    }
}

これはエントリポイントのクラスですが、クラスに付けられている@ResourcesDomeinと@ModIDがこのライブラリのアノテーションです。
@ResourcesDomeinは生成されるファイルのドメインを指定します。
多重定義はできません。これが使用されると各リソース生成用アノテーション(@BlockModelとか@ItemModel)のdomeinのデフォルト値として利用されます。
複数のドメインを使いたい場合は1つだけ宣言しておき、その他のドメインはdomein要素を指定してください。

@ModIDはModIDを指定します。
これは多重定義不可で、必ず指定する必要があります。

この2つのアノテーションはエントリポイントとなるクラスに置くのが良いと思います。

最後にこのライブラリの利用方法。
ビルド済みのjarを用意して{projectDir}/libs/MinecraftForgeAnnotations-1.0.jarのように配置します。
build.gradleに以下を追加

//依存関係にMinecraftForgeAnnotationsを追加
dependencies {
    compile files('libs/MinecraftForgeAnnotations-1.0.jar')
}

compileJava {
    //アノテーションプロセッサを指定
    options.compilerArgs += ['-processor', 'net.orekyuu.minecraftanotations.apt.MinecraftAnnotationProcessor', "-Adir=" + file('templates')]
    doLast {
        //コンパイルが終了したらアセットを適切な位置へコピー
        tasks.copyAssets.execute()
    }
}

task copyAssets(type: Copy) {
    from 'build/classes/main/assets/'
    into 'out/production/Minecraft/assets/'
}

-Adirオプションではテンプレートの配置ディレクトリを指定しています。

テンプレートはtemplatesフォルダに配置してください。
動く形になっているサンプルも用意しておいたので良かったら確認して下さい。
サンプルプロジェクト
MinecraftForgeAnnotationsのリポジトリ

バグ報告や要望などはリポジトリのIssueにお願いします。
プルリクエストも待ってます。