コンテンツにスキップ

CRecipeImpl

CRecipeImplCRecipe インターフェースの標準実装クラスです。 定形・不定形のどちらのレシピも作成できます。 open class として定義されているため、継承して独自フィールドを持ったレシピを作ることもできます。


open class CRecipeImpl @JvmOverloads constructor(
override val name: String,
override val items: Map<CoordinateComponent, CMatter>,
override val type: CRecipe.Type,
override val predicates: List<CRecipePredicate>? = null,
override val results: List<ResultSupplier>? = null,
) : CRecipe
パラメータデフォルト値概要
nameレシピの識別名
items座標とアイテム条件のマッピング
typeCRecipe.Type.SHAPED または CRecipe.Type.SHAPELESS
predicatesnullレシピ全体の追加検査ロジック
resultsnull成果物を生成する ResultSupplier のリスト

不定形レシピを簡潔に作成するためのファクトリメソッドです。 itemsCMatter のリストを渡すと、座標の割り当てを自動で行います。 内部で isValidRecipe() を呼び出してバリデーションを行い、失敗した場合は例外をスローします。

@JvmStatic
fun shapeless(
name: String,
items: List<CMatter>,
predicates: List<CRecipePredicate>? = null,
results: List<ResultSupplier>? = null,
): CRecipeImpl

items のサイズは 1 以上 36 以下である必要があります。

val stone = CMatterImpl.of(Material.STONE)
val result = ResultSupplier.timesSingle(ItemStack.of(Material.GRAVEL))
// 石 4 個を不定形で要求するレシピ
val recipe = CRecipeImpl.shapeless(
name = "stone-to-gravel",
items = List(4) { stone },
results = listOf(result)
)

val stone = CMatterImpl.of(Material.STONE)
val result = ResultSupplier.timesSingle(ItemStack.of(Material.CHISELED_STONE_BRICKS))
// 2x2 の正方形に石を配置するレシピ
val shaped = CRecipeImpl(
name = "chiseled-stone-bricks",
items = CoordinateComponent.squareFill(2).associateWith { stone },
results = listOf(result),
type = CRecipe.Type.SHAPED
)
val apple = CMatterImpl.of(Material.APPLE)
val result = ResultSupplier.single(ItemStack.of(Material.ENCHANTED_GOLDEN_APPLE))
// リンゴ 8 個を任意の配置で要求するレシピ
val shapeless = CRecipeImpl.shapeless(
name = "apple-to-notch-apple",
items = List(8) { apple },
results = listOf(result)
)
val diamond = CMatterImpl.of(Material.DIAMOND)
val result = ResultSupplier.single(ItemStack.of(Material.NETHER_STAR))
// OP プレイヤーのみ作成できるレシピ
val opRecipe = CRecipeImpl(
name = "op-only-star",
items = CoordinateComponent.squareFill(3).associateWith { diamond },
type = CRecipe.Type.SHAPED,
results = listOf(result),
predicates = listOf(CRecipePredicate { ctx ->
ctx.player?.isOp ?: false
})
)

継承して独自フィールドを追加する

Section titled “継承して独自フィールドを追加する”
// レシピにカテゴリ情報を持たせる例
open class CategorizedRecipe(
name: String,
items: Map<CoordinateComponent, CMatter>,
type: CRecipe.Type,
val category: String,
predicates: List<CRecipePredicate>? = null,
results: List<ResultSupplier>? = null,
) : CRecipeImpl(name, items, type, predicates, results)

CRecipeImpl.isValidRecipe() でレシピが登録可能な状態かを確認できます。 CustomCrafterAPI.registerRecipe() は内部でこのメソッドを呼び出しており、失敗した場合は IllegalStateException がスローされます。

val recipe = CRecipeImpl(/* ... */)
recipe.isValidRecipe().exceptionOrNull()?.let { e ->
println("レシピが無効です: ${e.message}")
return
}
CustomCrafterAPI.registerRecipe(recipe)