Datagen now runs properly, Codex pt.3

This commit is contained in:
thedarkcolour 2026-04-06 22:15:36 -07:00
parent 382e5c359a
commit a4fb8e37e0
36 changed files with 197 additions and 159 deletions

View File

@ -40,9 +40,7 @@ neoForge {
} }
data { data {
data() clientData()
// instead of using --all, skip file check validation
programArguments.addAll('--server', '--client', '--dev', '--reports')
programArguments.addAll('--mod', 'exdeorum', '--output', file('src/generated/resources/').absolutePath, '--existing', file('src/main/resources/').absolutePath) programArguments.addAll('--mod', 'exdeorum', '--output', file('src/generated/resources/').absolutePath, '--existing', file('src/main/resources/').absolutePath)
} }
} }

View File

@ -5,7 +5,7 @@ org.gradle.daemon=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.caching=true org.gradle.caching=true
mc_version=1.26.1 mc_version=26.1.1
neo_version=26.1.1.1-beta neo_version=26.1.1.1-beta
neo_version_range=[26.1,) neo_version_range=[26.1,)
loader_version_range=[4,) loader_version_range=[4,)
@ -19,5 +19,5 @@ loader_version_range=[4,)
#rhino_version=2101.2.7-build.81 #rhino_version=2101.2.7-build.81
#architectury_version=13.0.8 #architectury_version=13.0.8
#parchment_minecraft_version=1.26.1 #parchment_minecraft_version=26.1.1
#parchment_mappings_version=2024.11.17 #parchment_mappings_version=2024.11.17

View File

@ -1,7 +1,9 @@
package thedarkcolour.exdeorum.block; package thedarkcolour.exdeorum.block;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier; import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
@ -32,8 +34,8 @@ public class CompressedBlockType implements ItemLike {
this.base = base; this.base = base;
} }
private Block createBlock() { private Block createBlock(Identifier id) {
return new Block(BlockBehaviour.Properties.ofFullCopy(this.base.get())); return new Block(BlockBehaviour.Properties.ofFullCopy(this.base.get()).setId(ResourceKey.create(Registries.BLOCK, id)));
} }
public Block getBlock() { public Block getBlock() {

View File

@ -216,10 +216,10 @@ public abstract class AbstractCrucibleBlockEntity extends ETankBlockEntity {
var result = recipe.getResult(); var result = recipe.getResult();
var contained = this.tank.getFluid(); var contained = this.tank.getFluid();
shrinkAction.accept(item); shrinkAction.accept(item);
this.solids = (short) Math.min(this.solids + result.getAmount(), MAX_SOLIDS); this.solids = (short) Math.min(this.solids + result.amount(), MAX_SOLIDS);
if (contained.isEmpty()) { if (contained.isEmpty()) {
this.fluid = result.getFluid(); this.fluid = result.fluid().value();
updateLight(this.level, this.worldPosition, this.fluid); updateLight(this.level, this.worldPosition, this.fluid);
} }
@ -249,8 +249,8 @@ public abstract class AbstractCrucibleBlockEntity extends ETankBlockEntity {
var result = recipe.getResult(); var result = recipe.getResult();
var contained = this.tank.getFluid(); var contained = this.tank.getFluid();
if (FluidStack.isSameFluidSameComponents(result, contained) || contained.isEmpty()) { if (FluidStack.isSameFluidSameComponents(contained, result) || contained.isEmpty()) {
return result.getAmount() + this.solids <= MAX_SOLIDS ? InsertionResult.YES : InsertionResult.FULL; return result.amount() + this.solids <= MAX_SOLIDS ? InsertionResult.YES : InsertionResult.FULL;
} }
} }

View File

@ -272,7 +272,7 @@ public class BarrelBlockEntity extends ETankBlockEntity {
if (recipe != null && this.tank.getFluidAmount() >= recipe.baseFluid().amount() && itemFluid.getAmount() == 1000) { if (recipe != null && this.tank.getFluidAmount() >= recipe.baseFluid().amount() && itemFluid.getAmount() == 1000) {
if (!level.isClientSide()) { if (!level.isClientSide()) {
this.tank.drain(recipe.baseFluid().amount(), IFluidHandler.FluidAction.EXECUTE); this.tank.drain(recipe.baseFluid().amount(), IFluidHandler.FluidAction.EXECUTE);
setItem(recipe.result().copy()); setItem(recipe.result().create());
if (recipe.consumesAdditive()) { if (recipe.consumesAdditive()) {
itemFluidCap.drain(1000, IFluidHandler.FluidAction.EXECUTE); itemFluidCap.drain(1000, IFluidHandler.FluidAction.EXECUTE);
@ -376,7 +376,7 @@ public class BarrelBlockEntity extends ETankBlockEntity {
// Empty barrel // Empty barrel
this.tank.drain(recipe.fluid.amount(), IFluidHandler.FluidAction.EXECUTE); this.tank.drain(recipe.fluid.amount(), IFluidHandler.FluidAction.EXECUTE);
// Replace fluid with result // Replace fluid with result
setItem(recipe.result.copy()); setItem(recipe.result.create());
this.level.playSound(null, this.worldPosition, ESounds.BARREL_MIXING.get(), SoundSource.BLOCKS, 0.8f, 1.0f); this.level.playSound(null, this.worldPosition, ESounds.BARREL_MIXING.get(), SoundSource.BLOCKS, 0.8f, 1.0f);
} }
// Mixing was successful, so return true // Mixing was successful, so return true
@ -443,12 +443,12 @@ public class BarrelBlockEntity extends ETankBlockEntity {
// If additive is consumed, check that the additive can be consumed before crafting // If additive is consumed, check that the additive can be consumed before crafting
if (!recipe.consumesAdditive()) { if (!recipe.consumesAdditive()) {
this.tank.drain(recipe.baseFluid().amount(), IFluidHandler.FluidAction.EXECUTE); this.tank.drain(recipe.baseFluid().amount(), IFluidHandler.FluidAction.EXECUTE);
setItem(recipe.result().copy()); setItem(recipe.result().create());
} else if (aboveBlockState.getBlock() instanceof BucketPickup pickup) { } else if (aboveBlockState.getBlock() instanceof BucketPickup pickup) {
// If something was picked up, we can craft // If something was picked up, we can craft
if (!pickup.pickupBlock(null, this.level, abovePos, aboveBlockState).isEmpty()) { if (!pickup.pickupBlock(null, this.level, abovePos, aboveBlockState).isEmpty()) {
this.tank.drain(recipe.baseFluid().amount(), IFluidHandler.FluidAction.EXECUTE); this.tank.drain(recipe.baseFluid().amount(), IFluidHandler.FluidAction.EXECUTE);
setItem(recipe.result().copy()); setItem(recipe.result().create());
} }
} }
} }

View File

@ -131,7 +131,7 @@ public class MechanicalHammerBlockEntity extends AbstractMachineBlockEntity<Mech
if (output.isEmpty() || output.getCount() < output.getMaxStackSize()) { if (output.isEmpty() || output.getCount() < output.getMaxStackSize()) {
var recipe = RecipeUtil.getHammerRecipe(input.getItem()); var recipe = RecipeUtil.getHammerRecipe(input.getItem());
if (recipe != null && (output.isEmpty() || ItemStack.isSameItemSameComponents(recipe.result, output))) { if (recipe != null && (output.isEmpty() || ItemStack.isSameItemSameComponents(recipe.result.create(), output))) {
return recipe; return recipe;
} }
} }
@ -158,7 +158,7 @@ public class MechanicalHammerBlockEntity extends AbstractMachineBlockEntity<Mech
} }
var output = this.inventory.getStackInSlot(OUTPUT_SLOT); var output = this.inventory.getStackInSlot(OUTPUT_SLOT);
if (output.isEmpty()) { if (output.isEmpty()) {
this.inventory.setStackInSlot(OUTPUT_SLOT, recipe.result.copyWithCount(resultCount)); this.inventory.setStackInSlot(OUTPUT_SLOT, recipe.result.withCount(resultCount).create());
} else { } else {
output.setCount(Math.min(output.getMaxStackSize(), resultCount + output.getCount())); output.setCount(Math.min(output.getMaxStackSize(), resultCount + output.getCount()));
} }

View File

@ -102,9 +102,9 @@ public class SieveLogic {
while (amount > 0) { while (amount > 0) {
hasDrops = true; hasDrops = true;
// make a single item copy of recipe result // make a single item copy of recipe result
var result = recipe.result.copyWithCount(1); var result = recipe.result.withCount(1).create();
// the size of the stack respecting stack limits (ex. ender pearl limits to 16) // the size of the stack respecting stack limits (ex. ender pearl limits to 16)
var stackAmount = Math.min(amount, recipe.result.getMaxStackSize()); var stackAmount = Math.min(amount, result.getMaxStackSize());
result.setCount(stackAmount); result.setCount(stackAmount);
amount -= stackAmount; amount -= stackAmount;
var handleDrop = this.owner.handleResultItem(result, level, rand); var handleDrop = this.owner.handleResultItem(result, level, rand);

View File

@ -94,7 +94,7 @@ public record XeiSieveRecipe(Ingredient ingredient, ItemStack mesh, List<Result>
for (var recipe : meshRecipes) { for (var recipe : meshRecipes) {
int resultCount = recipe.resultAmount instanceof ConstantValue constant ? Math.round(constant.value()) : 1; int resultCount = recipe.resultAmount instanceof ConstantValue constant ? Math.round(constant.value()) : 1;
results.add(new Result(recipe.result.copyWithCount(resultCount), recipe.resultAmount, recipe.byHandOnly)); results.add(new Result(recipe.result.withCount(resultCount).create(), recipe.resultAmount, recipe.byHandOnly));
} }
results.sort(resultSorter); results.sort(resultSorter);

View File

@ -31,7 +31,7 @@ abstract class CrucibleEmiRecipe extends EmiOneToOneRecipe {
CrucibleEmiRecipe(CrucibleRecipe recipe, Identifier id) { CrucibleEmiRecipe(CrucibleRecipe recipe, Identifier id) {
super(recipe, id); super(recipe, id);
this.outputs = EmiUtil.outputs(recipe.getResult()); this.outputs = EmiUtil.outputs(recipe.createResult());
} }
@Override @Override

View File

@ -90,7 +90,7 @@ public abstract class BarrelMixingCategory<T> implements IRecipeCategory<T> {
public void setRecipe(IRecipeLayoutBuilder builder, BarrelMixingRecipe recipe, IFocusGroup focuses) { public void setRecipe(IRecipeLayoutBuilder builder, BarrelMixingRecipe recipe, IFocusGroup focuses) {
JeiUtil.addFluidIngredient(builder.addSlot(RecipeIngredientRole.INPUT, 1, 1), recipe.fluid).setFluidRenderer(1000, false, 16, 16); JeiUtil.addFluidIngredient(builder.addSlot(RecipeIngredientRole.INPUT, 1, 1), recipe.fluid).setFluidRenderer(1000, false, 16, 16);
builder.addSlot(RecipeIngredientRole.INPUT, 33, 1).addIngredients(recipe.ingredient()); builder.addSlot(RecipeIngredientRole.INPUT, 33, 1).addIngredients(recipe.ingredient());
builder.addSlot(RecipeIngredientRole.OUTPUT, 79, 1).addItemStack(recipe.result); builder.addSlot(RecipeIngredientRole.OUTPUT, 79, 1).addItemStack(recipe.result.create());
} }
@Override @Override
@ -115,7 +115,7 @@ public abstract class BarrelMixingCategory<T> implements IRecipeCategory<T> {
if (recipe.consumesAdditive()) { if (recipe.consumesAdditive()) {
additiveSlot.addTooltipCallback((view, tooltip) -> tooltip.add(CONTENTS_ARE_CONSUMED_TOOLTIP)); additiveSlot.addTooltipCallback((view, tooltip) -> tooltip.add(CONTENTS_ARE_CONSUMED_TOOLTIP));
} }
builder.addSlot(RecipeIngredientRole.OUTPUT, 79, 1).addItemStack(recipe.result().copy()); builder.addSlot(RecipeIngredientRole.OUTPUT, 79, 1).addItemStack(recipe.result().create());
} }
@Override @Override

View File

@ -41,8 +41,8 @@ abstract class CrucibleCategory extends OneToOneCategory<CrucibleRecipe> {
@Override @Override
protected void addOutput(IRecipeSlotBuilder slot, CrucibleRecipe recipe) { protected void addOutput(IRecipeSlotBuilder slot, CrucibleRecipe recipe) {
slot.addFluidStack(recipe.getResult().getFluid(), recipe.getResult().getAmount()) slot.addFluidStack(recipe.getResult().fluid().value(), recipe.getResult().amount())
.setFluidRenderer(Math.max(1000, recipe.getResult().getAmount()), false, 16, 16); .setFluidRenderer(Math.max(1000, recipe.getResult().amount()), false, 16, 16);
} }
static class LavaCrucible extends CrucibleCategory { static class LavaCrucible extends CrucibleCategory {

View File

@ -52,9 +52,9 @@ class HammerCategory extends OneToOneCategory<HammerRecipe> {
@Override @Override
protected void addOutput(IRecipeSlotBuilder slot, HammerRecipe recipe) { protected void addOutput(IRecipeSlotBuilder slot, HammerRecipe recipe) {
if (recipe.resultAmount instanceof ConstantValue constant) { if (recipe.resultAmount instanceof ConstantValue constant) {
slot.addItemStack(recipe.result.getCount() == 1 ? recipe.result : recipe.result.copyWithCount((int) constant.value())); slot.addItemStack(recipe.result.count() == 1 ? recipe.result.create() : recipe.result.withCount((int) constant.value()).create());
} else { } else {
slot.addItemStack(recipe.result); slot.addItemStack(recipe.result.create());
SieveCategory.addTooltips(slot, false, recipe.resultAmount); SieveCategory.addTooltips(slot, false, recipe.resultAmount);
} }
} }

View File

@ -25,7 +25,7 @@ import thedarkcolour.exdeorum.data.recipe.Recipes;
import thedarkcolour.modkit.data.DataHelper; import thedarkcolour.modkit.data.DataHelper;
public class Data { public class Data {
public static void generateData(GatherDataEvent event) { public static void generateData(GatherDataEvent.Client event) {
// Two things used by data generators // Two things used by data generators
var gen = event.getGenerator(); // writes to json var gen = event.getGenerator(); // writes to json
var output = gen.getPackOutput(); var output = gen.getPackOutput();

View File

@ -18,7 +18,9 @@
package thedarkcolour.exdeorum.data; package thedarkcolour.exdeorum.data;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier; import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockBehaviour;
@ -42,7 +44,7 @@ public class ModCompatData {
private static DeferredItem<Item> item(String modid, String name) { private static DeferredItem<Item> item(String modid, String name) {
if (DatagenModLoader.isRunningDataGen()) { if (DatagenModLoader.isRunningDataGen()) {
DeferredRegister.Items registry = itemRegistries.computeIfAbsent(modid, DeferredRegister::createItems); DeferredRegister.Items registry = itemRegistries.computeIfAbsent(modid, DeferredRegister::createItems);
return registry.register(name, () -> new Item(new Item.Properties())); return registry.register(name, id -> new Item(new Item.Properties().setId(ResourceKey.create(Registries.ITEM, id))));
} else { } else {
return null; return null;
} }
@ -52,7 +54,7 @@ public class ModCompatData {
private static DeferredBlock<Block> block(String modid, String name) { private static DeferredBlock<Block> block(String modid, String name) {
if (DatagenModLoader.isRunningDataGen()) { if (DatagenModLoader.isRunningDataGen()) {
DeferredRegister.Blocks registry = blockRegistries.computeIfAbsent(modid, DeferredRegister::createBlocks); DeferredRegister.Blocks registry = blockRegistries.computeIfAbsent(modid, DeferredRegister::createBlocks);
return registry.register(name, () -> new Block(BlockBehaviour.Properties.of())); return registry.register(name, id -> new Block(BlockBehaviour.Properties.of().setId(ResourceKey.create(Registries.BLOCK, id))));
} else { } else {
return null; return null;
} }

View File

@ -39,6 +39,7 @@ import thedarkcolour.exdeorum.registry.EBlocks;
import thedarkcolour.exdeorum.registry.ECompressedBlocks; import thedarkcolour.exdeorum.registry.ECompressedBlocks;
import thedarkcolour.exdeorum.registry.EFluids; import thedarkcolour.exdeorum.registry.EFluids;
import thedarkcolour.exdeorum.registry.EItems; import thedarkcolour.exdeorum.registry.EItems;
import thedarkcolour.exdeorum.registry.EWorldPresets;
import thedarkcolour.exdeorum.tag.EBlockTags; import thedarkcolour.exdeorum.tag.EBlockTags;
import thedarkcolour.exdeorum.tag.EItemTags; import thedarkcolour.exdeorum.tag.EItemTags;
import thedarkcolour.exdeorum.tag.EStructureSetTags; import thedarkcolour.exdeorum.tag.EStructureSetTags;
@ -150,7 +151,7 @@ class ModTags {
} }
public static void createWorldPresetTags(MKTagsProvider<WorldPreset> tags) { public static void createWorldPresetTags(MKTagsProvider<WorldPreset> tags) {
tags.tag(net.minecraft.tags.WorldPresetTags.NORMAL).add(ResourceKey.create(Registries.WORLD_PRESET, Identifier.fromNamespaceAndPath(ExDeorum.ID, "void_world"))); tags.tag(net.minecraft.tags.WorldPresetTags.NORMAL).addOptional(EWorldPresets.VOID_WORLD.identifier());
} }
public static void createFluidTags(MKTagsProvider<Fluid> tags) { public static void createFluidTags(MKTagsProvider<Fluid> tags) {

View File

@ -31,7 +31,7 @@ import net.minecraft.tags.BlockTags;
import net.minecraft.tags.ItemTags; import net.minecraft.tags.ItemTags;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
@ -52,6 +52,7 @@ import net.neoforged.neoforge.common.conditions.ModLoadedCondition;
import net.neoforged.neoforge.common.conditions.NotCondition; import net.neoforged.neoforge.common.conditions.NotCondition;
import net.neoforged.neoforge.common.conditions.TagEmptyCondition; import net.neoforged.neoforge.common.conditions.TagEmptyCondition;
import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.FluidStack;
import net.neoforged.neoforge.fluids.FluidStackTemplate;
import net.neoforged.neoforge.fluids.crafting.FluidIngredient; import net.neoforged.neoforge.fluids.crafting.FluidIngredient;
import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient;
import thedarkcolour.exdeorum.ExDeorum; import thedarkcolour.exdeorum.ExDeorum;
@ -348,7 +349,7 @@ public class Recipes {
recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_WATERING_CAN), EItems.NETHERITE_WATERING_CAN.get()); recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_WATERING_CAN), EItems.NETHERITE_WATERING_CAN.get());
// misc // misc
recipes.shapelessCrafting(RecipeCategory.MISC, new ItemStack(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(Items.CLAY_BALL), ingredient(Items.BONE_MEAL)); recipes.shapelessCrafting(RecipeCategory.MISC, EItems.PORCELAIN_CLAY_BALL.get(), 1, ingredient(Items.CLAY_BALL), ingredient(Items.BONE_MEAL));
recipes.shapedCrafting(RecipeCategory.MISC, EItems.UNFIRED_PORCELAIN_BUCKET.get(), recipe -> { recipes.shapedCrafting(RecipeCategory.MISC, EItems.UNFIRED_PORCELAIN_BUCKET.get(), recipe -> {
recipe.define('#', EItems.PORCELAIN_CLAY_BALL); recipe.define('#', EItems.PORCELAIN_CLAY_BALL);
recipe.pattern("# #"); recipe.pattern("# #");
@ -539,11 +540,11 @@ public class Recipes {
} }
private static void lavaCrucible(RecipeOutput writer, String id, Ingredient ingredient, int volume) { private static void lavaCrucible(RecipeOutput writer, String id, Ingredient ingredient, int volume) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("lava_crucible/" + id)), new CrucibleRecipe.Lava(ingredient, new FluidStack(Fluids.LAVA, volume)), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("lava_crucible/" + id)), new CrucibleRecipe.Lava(ingredient, new FluidStackTemplate(Fluids.LAVA, volume)), null);
} }
private static void waterCrucible(RecipeOutput writer, String id, Ingredient ingredient, int volume) { private static void waterCrucible(RecipeOutput writer, String id, Ingredient ingredient, int volume) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("water_crucible/" + id)), new CrucibleRecipe.Water(ingredient, new FluidStack(Fluids.WATER, volume)), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("water_crucible/" + id)), new CrucibleRecipe.Water(ingredient, new FluidStackTemplate(Fluids.WATER, volume)), null);
} }
private static void hammerRecipes(RecipeOutput writer, MKRecipeProvider recipes) { private static void hammerRecipes(RecipeOutput writer, MKRecipeProvider recipes) {
@ -594,7 +595,7 @@ public class Recipes {
} }
private static void compressedHammerRecipe(RecipeOutput writer, ItemLike result, Ingredient block) { private static void compressedHammerRecipe(RecipeOutput writer, ItemLike result, Ingredient block) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("compressed_hammer/" + path(result))), new CompressedHammerRecipe(block, new ItemStack(result.asItem()), exactly(9)), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("compressed_hammer/" + path(result))), new CompressedHammerRecipe(block, new ItemStackTemplate(result.asItem()), exactly(9)), null);
} }
private static void hammerRecipe(RecipeOutput writer, String name, Ingredient block, ItemLike result) { private static void hammerRecipe(RecipeOutput writer, String name, Ingredient block, ItemLike result) {
@ -602,7 +603,7 @@ public class Recipes {
} }
private static void hammerRecipe(RecipeOutput writer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) { private static void hammerRecipe(RecipeOutput writer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("hammer/" + name)), new HammerRecipe(block, new ItemStack(result.asItem()), resultAmount), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("hammer/" + name)), new HammerRecipe(block, new ItemStackTemplate(result.asItem()), resultAmount), null);
} }
private static void crookRecipes(RecipeOutput writer) { private static void crookRecipes(RecipeOutput writer) {
@ -615,7 +616,7 @@ public class Recipes {
} }
private static void crookRecipe(RecipeOutput writer, String name, BlockPredicate blockPredicate, ItemLike result, float chance) { private static void crookRecipe(RecipeOutput writer, String name, BlockPredicate blockPredicate, ItemLike result, float chance) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("crook/" + name)), new CrookRecipe(blockPredicate, new ItemStack(result), chance), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("crook/" + name)), new CrookRecipe(blockPredicate, new ItemStackTemplate(result.asItem()), chance), null);
} }
@SuppressWarnings("OptionalGetWithoutIsPresent") @SuppressWarnings("OptionalGetWithoutIsPresent")
@ -742,11 +743,11 @@ public class Recipes {
} }
private static void barrelMixing(RecipeOutput writer, String suffix, Ingredient ingredient, Fluid fluidType, Item result) { private static void barrelMixing(RecipeOutput writer, String suffix, Ingredient ingredient, Fluid fluidType, Item result) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("barrel_mixing/" + path(result) + suffix)), new BarrelMixingRecipe(ingredient, SizedFluidIngredient.of(fluidType, 1000), new ItemStack(result)), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("barrel_mixing/" + path(result) + suffix)), new BarrelMixingRecipe(ingredient, SizedFluidIngredient.of(fluidType, 1000), new ItemStackTemplate(result)), null);
} }
private static void barrelFluidMixing(RecipeOutput writer, Fluid base, Fluid additive, Item result, boolean consumesAdditive) { private static void barrelFluidMixing(RecipeOutput writer, Fluid base, Fluid additive, Item result, boolean consumesAdditive) {
writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("barrel_fluid_mixing/" + path(result))), new BarrelFluidMixingRecipe(SizedFluidIngredient.of(base, 1000), FluidIngredient.of(additive), new ItemStack(result), consumesAdditive), null); writer.accept(ResourceKey.create(Registries.RECIPE, modLoc("barrel_fluid_mixing/" + path(result))), new BarrelFluidMixingRecipe(SizedFluidIngredient.of(base, 1000), FluidIngredient.of(additive), new ItemStackTemplate(result), consumesAdditive), null);
} }
private static void fluidTransformationRecipes(RecipeOutput writer) { private static void fluidTransformationRecipes(RecipeOutput writer) {

View File

@ -24,7 +24,7 @@ import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
@ -963,25 +963,27 @@ class SieveRecipes {
private record MeshDrops(RecipeOutput output, String basePath, String baseCompressedPath, Ingredient block, Ingredient mesh, Map<Ingredient, Ingredient> compressedVariants) { private record MeshDrops(RecipeOutput output, String basePath, String baseCompressedPath, Ingredient block, Ingredient mesh, Map<Ingredient, Ingredient> compressedVariants) {
private void add(Item result, NumberProvider resultAmount) { private void add(Item result, NumberProvider resultAmount) {
this.output.accept(ResourceKey.create(Registries.RECIPE, modLoc(this.basePath + path(result))), new SieveRecipe(this.block, new ItemStack(result), resultAmount, this.mesh, false), null); var resultStack = new ItemStackTemplate(result);
this.output.accept(ResourceKey.create(Registries.RECIPE, modLoc(this.basePath + path(result))), new SieveRecipe(this.block, resultStack, resultAmount, this.mesh, false), null);
if (this.compressedVariants.containsKey(this.block)) { if (this.compressedVariants.containsKey(this.block)) {
var compressedLoc = ResourceKey.create(Registries.RECIPE, modLoc(this.baseCompressedPath + path(result))); var compressedLoc = ResourceKey.create(Registries.RECIPE, modLoc(this.baseCompressedPath + path(result)));
var multiplied = Recipes.compressedMultiplier(resultAmount); var multiplied = Recipes.compressedMultiplier(resultAmount);
this.output.accept(compressedLoc, new CompressedSieveRecipe(this.compressedVariants.get(this.block), new ItemStack(result), multiplied, this.mesh, false), null); this.output.accept(compressedLoc, new CompressedSieveRecipe(this.compressedVariants.get(this.block), resultStack, multiplied, this.mesh, false), null);
} }
} }
private void addConditional(ItemLike result, NumberProvider resultAmount, ICondition condition) { private void addConditional(ItemLike result, NumberProvider resultAmount, ICondition condition) {
var path = ResourceKey.create(Registries.RECIPE, modLoc(this.basePath + path(result))); var path = ResourceKey.create(Registries.RECIPE, modLoc(this.basePath + path(result)));
this.output.withConditions(condition).accept(path, new SieveRecipe(this.block, new ItemStack(result), resultAmount, this.mesh, false), null); var resultStack = new ItemStackTemplate(result.asItem());
this.output.withConditions(condition).accept(path, new SieveRecipe(this.block, resultStack, resultAmount, this.mesh, false), null);
if (this.compressedVariants.containsKey(this.block)) { if (this.compressedVariants.containsKey(this.block)) {
var compressedLoc = ResourceKey.create(Registries.RECIPE, modLoc(this.baseCompressedPath + path(result))); var compressedLoc = ResourceKey.create(Registries.RECIPE, modLoc(this.baseCompressedPath + path(result)));
var multiplied = Recipes.compressedMultiplier(resultAmount); var multiplied = Recipes.compressedMultiplier(resultAmount);
this.output.withConditions(condition).accept(compressedLoc, new CompressedSieveRecipe(this.compressedVariants.get(this.block), new ItemStack(result), multiplied, this.mesh, false), null); this.output.withConditions(condition).accept(compressedLoc, new CompressedSieveRecipe(this.compressedVariants.get(this.block), resultStack, multiplied, this.mesh, false), null);
} }
} }
} }

View File

@ -62,7 +62,7 @@ public class CrookLootModifier extends LootModifier {
for (CrookRecipe recipe : RecipeUtil.getCrookRecipes(state)) { for (CrookRecipe recipe : RecipeUtil.getCrookRecipes(state)) {
for (int i = 0; i < rolls; i++) { for (int i = 0; i < rolls; i++) {
if (rand.nextFloat() < recipe.chance()) { if (rand.nextFloat() < recipe.chance()) {
generatedLoot.add(recipe.result().copy()); generatedLoot.add(recipe.result().create());
} }
} }
} }

View File

@ -86,7 +86,7 @@ public class HammerLootModifier extends LootModifier {
} }
if (resultAmount > 0) { if (resultAmount > 0) {
newLoot.add(recipe.result.copyWithCount(resultAmount)); newLoot.add(recipe.result.withCount(resultAmount).create());
} }
return newLoot; return newLoot;

View File

@ -18,6 +18,9 @@
package thedarkcolour.exdeorum.material; package thedarkcolour.exdeorum.material;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
@ -50,12 +53,12 @@ public abstract class AbstractMaterial implements ItemLike {
this.requiredModId = requiredModId; this.requiredModId = requiredModId;
} }
protected abstract Block createBlock(); protected abstract Block createBlock(Identifier id);
protected BlockBehaviour.Properties props() { protected BlockBehaviour.Properties props(Identifier id) {
var properties = BlockBehaviour.Properties.of().strength(this.strength).sound(this.soundType); var properties = BlockBehaviour.Properties.of().strength(this.strength).sound(this.soundType);
if (this.needsCorrectTool) properties.requiresCorrectToolForDrops(); if (this.needsCorrectTool) properties.requiresCorrectToolForDrops();
return properties; return properties.setId(ResourceKey.create(Registries.BLOCK, id));
} }
public Item getItem() { public Item getItem() {

View File

@ -18,6 +18,7 @@
package thedarkcolour.exdeorum.material; package thedarkcolour.exdeorum.material;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -42,8 +43,8 @@ public class BarrelMaterial extends AbstractMaterial {
} }
@Override @Override
protected Block createBlock() { protected Block createBlock(Identifier id) {
var props = props().noOcclusion(); var props = props(id).noOcclusion();
if (!this.fireproof) props.ignitedByLava(); if (!this.fireproof) props.ignitedByLava();
return new BarrelBlock(props); return new BarrelBlock(props);
} }

View File

@ -18,6 +18,7 @@
package thedarkcolour.exdeorum.material; package thedarkcolour.exdeorum.material;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -29,8 +30,8 @@ public class CompressedSieveMaterial extends SieveMaterial {
} }
@Override @Override
protected Block createBlock() { protected Block createBlock(Identifier id) {
return new CompressedSieveBlock(props().noOcclusion()); return new CompressedSieveBlock(props(id).noOcclusion());
} }
@Nullable @Nullable

View File

@ -18,6 +18,7 @@
package thedarkcolour.exdeorum.material; package thedarkcolour.exdeorum.material;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import thedarkcolour.exdeorum.block.LavaCrucibleBlock; import thedarkcolour.exdeorum.block.LavaCrucibleBlock;
@ -28,7 +29,7 @@ public class LavaCrucibleMaterial extends AbstractCrucibleMaterial {
} }
@Override @Override
protected Block createBlock() { protected Block createBlock(Identifier id) {
return new LavaCrucibleBlock(props().noOcclusion()); return new LavaCrucibleBlock(props(id).noOcclusion());
} }
} }

View File

@ -18,6 +18,7 @@
package thedarkcolour.exdeorum.material; package thedarkcolour.exdeorum.material;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -29,8 +30,8 @@ public class SieveMaterial extends AbstractMaterial {
} }
@Override @Override
protected Block createBlock() { protected Block createBlock(Identifier id) {
return new SieveBlock(props().noOcclusion()); return new SieveBlock(props(id).noOcclusion());
} }
@Nullable @Nullable

View File

@ -18,6 +18,7 @@
package thedarkcolour.exdeorum.material; package thedarkcolour.exdeorum.material;
import net.minecraft.resources.Identifier;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import thedarkcolour.exdeorum.block.WaterCrucibleBlock; import thedarkcolour.exdeorum.block.WaterCrucibleBlock;
@ -28,7 +29,7 @@ public class WaterCrucibleMaterial extends AbstractCrucibleMaterial {
} }
@Override @Override
protected Block createBlock() { protected Block createBlock(Identifier id) {
return new WaterCrucibleBlock(props().noOcclusion()); return new WaterCrucibleBlock(props(id).noOcclusion());
} }
} }

View File

@ -21,29 +21,30 @@ package thedarkcolour.exdeorum.recipe;
import com.mojang.datafixers.Products; import com.mojang.datafixers.Products;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; import net.minecraft.world.level.storage.loot.providers.number.NumberProvider;
import net.minecraft.world.level.storage.loot.providers.number.NumberProviders; import net.minecraft.world.level.storage.loot.providers.number.NumberProviders;
public abstract class ProbabilityRecipe extends SingleIngredientRecipe { public abstract class ProbabilityRecipe extends SingleIngredientRecipe {
public final ItemStack result; public final ItemStackTemplate result;
public final NumberProvider resultAmount; public final NumberProvider resultAmount;
public ProbabilityRecipe(Ingredient ingredient, ItemStack result, NumberProvider resultAmount) { public ProbabilityRecipe(Ingredient ingredient, ItemStackTemplate result, NumberProvider resultAmount) {
super(ingredient); super(ingredient);
this.result = result; this.result = result;
this.resultAmount = resultAmount; this.resultAmount = resultAmount;
} }
protected static <T extends ProbabilityRecipe> Products.P3<RecordCodecBuilder.Mu<T>, Ingredient, ItemStack, NumberProvider> commonFields(RecordCodecBuilder.Instance<T> instance) { protected static <T extends ProbabilityRecipe> Products.P3<RecordCodecBuilder.Mu<T>, Ingredient, ItemStackTemplate, NumberProvider> commonFields(RecordCodecBuilder.Instance<T> instance) {
return instance.group( return instance.group(
CodecUtil.ingredientField(), CodecUtil.ingredientField(),
ItemStack.CODEC.fieldOf("result").forGetter(ProbabilityRecipe::result), ItemStackTemplate.CODEC.fieldOf("result").forGetter(ProbabilityRecipe::result),
NumberProviders.CODEC.fieldOf("result_amount").forGetter(ProbabilityRecipe::resultAmount) NumberProviders.CODEC.fieldOf("result_amount").forGetter(ProbabilityRecipe::resultAmount)
); );
} }
public ItemStack result() { public ItemStackTemplate result() {
return this.result; return this.result;
} }

View File

@ -24,6 +24,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.PlacementInfo; import net.minecraft.world.item.crafting.PlacementInfo;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeBookCategories; import net.minecraft.world.item.crafting.RecipeBookCategories;
@ -44,13 +45,13 @@ import thedarkcolour.exdeorum.registry.ERecipeTypes;
public record BarrelFluidMixingRecipe( public record BarrelFluidMixingRecipe(
SizedFluidIngredient baseFluid, SizedFluidIngredient baseFluid,
FluidIngredient additiveFluid, FluidIngredient additiveFluid,
ItemStack result, ItemStackTemplate result,
boolean consumesAdditive boolean consumesAdditive
) implements Recipe<RecipeInput> { ) implements Recipe<RecipeInput> {
public static final MapCodec<BarrelFluidMixingRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( public static final MapCodec<BarrelFluidMixingRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
SizedFluidIngredient.CODEC.fieldOf("base_fluid").forGetter(BarrelFluidMixingRecipe::baseFluid), SizedFluidIngredient.CODEC.fieldOf("base_fluid").forGetter(BarrelFluidMixingRecipe::baseFluid),
FluidIngredient.CODEC.fieldOf("additive_fluid").forGetter(BarrelFluidMixingRecipe::additiveFluid), FluidIngredient.CODEC.fieldOf("additive_fluid").forGetter(BarrelFluidMixingRecipe::additiveFluid),
ItemStack.CODEC.fieldOf("result").forGetter(BarrelFluidMixingRecipe::result), ItemStackTemplate.CODEC.fieldOf("result").forGetter(BarrelFluidMixingRecipe::result),
Codec.BOOL.optionalFieldOf("consumes_additive", false).forGetter(BarrelFluidMixingRecipe::consumesAdditive) Codec.BOOL.optionalFieldOf("consumes_additive", false).forGetter(BarrelFluidMixingRecipe::consumesAdditive)
).apply(instance, BarrelFluidMixingRecipe::new)); ).apply(instance, BarrelFluidMixingRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, BarrelFluidMixingRecipe> STREAM_CODEC = StreamCodec.of(BarrelFluidMixingRecipe::toNetwork, BarrelFluidMixingRecipe::fromNetwork); public static final StreamCodec<RegistryFriendlyByteBuf, BarrelFluidMixingRecipe> STREAM_CODEC = StreamCodec.of(BarrelFluidMixingRecipe::toNetwork, BarrelFluidMixingRecipe::fromNetwork);
@ -98,14 +99,14 @@ public record BarrelFluidMixingRecipe(
public static void toNetwork(RegistryFriendlyByteBuf buffer, BarrelFluidMixingRecipe recipe) { public static void toNetwork(RegistryFriendlyByteBuf buffer, BarrelFluidMixingRecipe recipe) {
SizedFluidIngredient.STREAM_CODEC.encode(buffer, recipe.baseFluid); SizedFluidIngredient.STREAM_CODEC.encode(buffer, recipe.baseFluid);
FluidIngredient.STREAM_CODEC.encode(buffer, recipe.additiveFluid); FluidIngredient.STREAM_CODEC.encode(buffer, recipe.additiveFluid);
ItemStack.STREAM_CODEC.encode(buffer, recipe.result); ItemStackTemplate.STREAM_CODEC.encode(buffer, recipe.result);
buffer.writeBoolean(recipe.consumesAdditive); buffer.writeBoolean(recipe.consumesAdditive);
} }
public static BarrelFluidMixingRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { public static BarrelFluidMixingRecipe fromNetwork(RegistryFriendlyByteBuf buffer) {
SizedFluidIngredient baseFluid = SizedFluidIngredient.STREAM_CODEC.decode(buffer); SizedFluidIngredient baseFluid = SizedFluidIngredient.STREAM_CODEC.decode(buffer);
FluidIngredient additiveFluid = FluidIngredient.STREAM_CODEC.decode(buffer); FluidIngredient additiveFluid = FluidIngredient.STREAM_CODEC.decode(buffer);
ItemStack result = ItemStack.STREAM_CODEC.decode(buffer); ItemStackTemplate result = ItemStackTemplate.STREAM_CODEC.decode(buffer);
boolean consumesAdditive = buffer.readBoolean(); boolean consumesAdditive = buffer.readBoolean();
return new BarrelFluidMixingRecipe(baseFluid, additiveFluid, result, consumesAdditive); return new BarrelFluidMixingRecipe(baseFluid, additiveFluid, result, consumesAdditive);

View File

@ -23,6 +23,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeInput; import net.minecraft.world.item.crafting.RecipeInput;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
@ -39,14 +40,14 @@ public class BarrelMixingRecipe extends SingleIngredientRecipe {
public static final MapCodec<BarrelMixingRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( public static final MapCodec<BarrelMixingRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
CodecUtil.ingredientField(), CodecUtil.ingredientField(),
SizedFluidIngredient.CODEC.fieldOf("fluid").forGetter(BarrelMixingRecipe::getFluid), SizedFluidIngredient.CODEC.fieldOf("fluid").forGetter(BarrelMixingRecipe::getFluid),
ItemStack.CODEC.fieldOf("result").forGetter(BarrelMixingRecipe::getResult) ItemStackTemplate.CODEC.fieldOf("result").forGetter(BarrelMixingRecipe::getResult)
).apply(instance, BarrelMixingRecipe::new)); ).apply(instance, BarrelMixingRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, BarrelMixingRecipe> STREAM_CODEC = StreamCodec.of(BarrelMixingRecipe::toNetwork, BarrelMixingRecipe::fromNetwork); public static final StreamCodec<RegistryFriendlyByteBuf, BarrelMixingRecipe> STREAM_CODEC = StreamCodec.of(BarrelMixingRecipe::toNetwork, BarrelMixingRecipe::fromNetwork);
public final SizedFluidIngredient fluid; public final SizedFluidIngredient fluid;
public final ItemStack result; public final ItemStackTemplate result;
public BarrelMixingRecipe(Ingredient ingredient, SizedFluidIngredient fluid, ItemStack result) { public BarrelMixingRecipe(Ingredient ingredient, SizedFluidIngredient fluid, ItemStackTemplate result) {
super(ingredient); super(ingredient);
this.fluid = fluid; this.fluid = fluid;
this.result = result; this.result = result;
@ -56,7 +57,7 @@ public class BarrelMixingRecipe extends SingleIngredientRecipe {
return this.fluid; return this.fluid;
} }
public ItemStack getResult() { public ItemStackTemplate getResult() {
return this.result; return this.result;
} }
@ -84,13 +85,13 @@ public class BarrelMixingRecipe extends SingleIngredientRecipe {
public static void toNetwork(RegistryFriendlyByteBuf buffer, BarrelMixingRecipe recipe) { public static void toNetwork(RegistryFriendlyByteBuf buffer, BarrelMixingRecipe recipe) {
Ingredient.CONTENTS_STREAM_CODEC.encode(buffer, recipe.ingredient); Ingredient.CONTENTS_STREAM_CODEC.encode(buffer, recipe.ingredient);
SizedFluidIngredient.STREAM_CODEC.encode(buffer, recipe.fluid); SizedFluidIngredient.STREAM_CODEC.encode(buffer, recipe.fluid);
ItemStack.STREAM_CODEC.encode(buffer, recipe.result); ItemStackTemplate.STREAM_CODEC.encode(buffer, recipe.result);
} }
public static BarrelMixingRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { public static BarrelMixingRecipe fromNetwork(RegistryFriendlyByteBuf buffer) {
Ingredient ingredient = Ingredient.CONTENTS_STREAM_CODEC.decode(buffer); Ingredient ingredient = Ingredient.CONTENTS_STREAM_CODEC.decode(buffer);
SizedFluidIngredient fluid = SizedFluidIngredient.STREAM_CODEC.decode(buffer); SizedFluidIngredient fluid = SizedFluidIngredient.STREAM_CODEC.decode(buffer);
ItemStack result = ItemStack.STREAM_CODEC.decode(buffer); ItemStackTemplate result = ItemStackTemplate.STREAM_CODEC.decode(buffer);
return new BarrelMixingRecipe(ingredient, fluid, result); return new BarrelMixingRecipe(ingredient, fluid, result);
} }

View File

@ -24,6 +24,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.PlacementInfo; import net.minecraft.world.item.crafting.PlacementInfo;
import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeBookCategories; import net.minecraft.world.item.crafting.RecipeBookCategories;
@ -36,10 +37,10 @@ import thedarkcolour.exdeorum.recipe.BlockPredicate;
import thedarkcolour.exdeorum.registry.ERecipeSerializers; import thedarkcolour.exdeorum.registry.ERecipeSerializers;
import thedarkcolour.exdeorum.registry.ERecipeTypes; import thedarkcolour.exdeorum.registry.ERecipeTypes;
public record CrookRecipe(BlockPredicate blockPredicate, ItemStack result, float chance) implements Recipe<RecipeInput> { public record CrookRecipe(BlockPredicate blockPredicate, ItemStackTemplate result, float chance) implements Recipe<RecipeInput> {
public static final MapCodec<CrookRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( public static final MapCodec<CrookRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group(
BlockPredicate.CODEC.fieldOf("block_predicate").forGetter(CrookRecipe::blockPredicate), BlockPredicate.CODEC.fieldOf("block_predicate").forGetter(CrookRecipe::blockPredicate),
ItemStack.CODEC.fieldOf("result").forGetter(CrookRecipe::result), ItemStackTemplate.CODEC.fieldOf("result").forGetter(CrookRecipe::result),
Codec.FLOAT.fieldOf("chance").forGetter(CrookRecipe::chance) Codec.FLOAT.fieldOf("chance").forGetter(CrookRecipe::chance)
).apply(instance, CrookRecipe::new)); ).apply(instance, CrookRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, CrookRecipe> STREAM_CODEC = StreamCodec.of(CrookRecipe::toNetwork, CrookRecipe::fromNetwork); public static final StreamCodec<RegistryFriendlyByteBuf, CrookRecipe> STREAM_CODEC = StreamCodec.of(CrookRecipe::toNetwork, CrookRecipe::fromNetwork);
@ -86,13 +87,13 @@ public record CrookRecipe(BlockPredicate blockPredicate, ItemStack result, float
public static void toNetwork(RegistryFriendlyByteBuf buffer, CrookRecipe recipe) { public static void toNetwork(RegistryFriendlyByteBuf buffer, CrookRecipe recipe) {
recipe.blockPredicate.toNetwork(buffer); recipe.blockPredicate.toNetwork(buffer);
ItemStack.STREAM_CODEC.encode(buffer, recipe.result); ItemStackTemplate.STREAM_CODEC.encode(buffer, recipe.result);
buffer.writeFloat(recipe.chance); buffer.writeFloat(recipe.chance);
} }
public static CrookRecipe fromNetwork(RegistryFriendlyByteBuf buffer) { public static CrookRecipe fromNetwork(RegistryFriendlyByteBuf buffer) {
BlockPredicate blockPredicate = BlockPredicate.STREAM_CODEC.decode(buffer); BlockPredicate blockPredicate = BlockPredicate.STREAM_CODEC.decode(buffer);
ItemStack result = ItemStack.STREAM_CODEC.decode(buffer); ItemStackTemplate result = ItemStackTemplate.STREAM_CODEC.decode(buffer);
float chance = buffer.readFloat(); float chance = buffer.readFloat();
return new CrookRecipe(blockPredicate, result, chance); return new CrookRecipe(blockPredicate, result, chance);

View File

@ -26,6 +26,7 @@ import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
import net.neoforged.neoforge.fluids.FluidStack; import net.neoforged.neoforge.fluids.FluidStack;
import net.neoforged.neoforge.fluids.FluidStackTemplate;
import thedarkcolour.exdeorum.recipe.CodecUtil; import thedarkcolour.exdeorum.recipe.CodecUtil;
import thedarkcolour.exdeorum.recipe.SingleIngredientRecipe; import thedarkcolour.exdeorum.recipe.SingleIngredientRecipe;
import thedarkcolour.exdeorum.registry.ERecipeSerializers; import thedarkcolour.exdeorum.registry.ERecipeSerializers;
@ -34,9 +35,9 @@ import thedarkcolour.exdeorum.registry.ERecipeTypes;
import java.util.function.BiFunction; import java.util.function.BiFunction;
public abstract class CrucibleRecipe extends SingleIngredientRecipe { public abstract class CrucibleRecipe extends SingleIngredientRecipe {
private final FluidStack result; private final FluidStackTemplate result;
protected CrucibleRecipe(Ingredient ingredient, FluidStack result) { protected CrucibleRecipe(Ingredient ingredient, FluidStackTemplate result) {
super(ingredient); super(ingredient);
this.result = result; this.result = result;
@ -45,34 +46,38 @@ public abstract class CrucibleRecipe extends SingleIngredientRecipe {
} }
} }
public FluidStack getResult() { public FluidStackTemplate getResult() {
return this.result; return this.result;
} }
private static <R extends CrucibleRecipe> MapCodec<R> mapCodec(BiFunction<Ingredient, FluidStack, R> factory) { public FluidStack createResult() {
return this.result.create();
}
private static <R extends CrucibleRecipe> MapCodec<R> mapCodec(BiFunction<Ingredient, FluidStackTemplate, R> factory) {
return RecordCodecBuilder.mapCodec(instance -> instance.group( return RecordCodecBuilder.mapCodec(instance -> instance.group(
CodecUtil.ingredientField(), CodecUtil.ingredientField(),
CodecUtil.FLUIDSTACK_CODEC.fieldOf("fluid").forGetter(CrucibleRecipe::getResult) FluidStackTemplate.CODEC.fieldOf("fluid").forGetter(CrucibleRecipe::getResult)
).apply(instance, factory)); ).apply(instance, factory));
} }
private static <R extends CrucibleRecipe> StreamCodec<RegistryFriendlyByteBuf, R> streamCodec(BiFunction<Ingredient, FluidStack, R> factory) { private static <R extends CrucibleRecipe> StreamCodec<RegistryFriendlyByteBuf, R> streamCodec(BiFunction<Ingredient, FluidStackTemplate, R> factory) {
return StreamCodec.of( return StreamCodec.of(
CrucibleRecipe::toNetwork, CrucibleRecipe::toNetwork,
buffer -> factory.apply(Ingredient.CONTENTS_STREAM_CODEC.decode(buffer), FluidStack.STREAM_CODEC.decode(buffer)) buffer -> factory.apply(Ingredient.CONTENTS_STREAM_CODEC.decode(buffer), FluidStackTemplate.STREAM_CODEC.decode(buffer))
); );
} }
public static void toNetwork(RegistryFriendlyByteBuf buffer, CrucibleRecipe recipe) { public static void toNetwork(RegistryFriendlyByteBuf buffer, CrucibleRecipe recipe) {
Ingredient.CONTENTS_STREAM_CODEC.encode(buffer, recipe.ingredient); Ingredient.CONTENTS_STREAM_CODEC.encode(buffer, recipe.ingredient);
FluidStack.STREAM_CODEC.encode(buffer, recipe.result); FluidStackTemplate.STREAM_CODEC.encode(buffer, recipe.result);
} }
public static class Lava extends CrucibleRecipe { public static class Lava extends CrucibleRecipe {
public static final MapCodec<Lava> CODEC = mapCodec(Lava::new); public static final MapCodec<Lava> CODEC = mapCodec(Lava::new);
public static final StreamCodec<RegistryFriendlyByteBuf, Lava> STREAM_CODEC = streamCodec(Lava::new); public static final StreamCodec<RegistryFriendlyByteBuf, Lava> STREAM_CODEC = streamCodec(Lava::new);
public Lava(Ingredient ingredient, FluidStack result) { public Lava(Ingredient ingredient, FluidStackTemplate result) {
super(ingredient, result); super(ingredient, result);
} }
@ -91,7 +96,7 @@ public abstract class CrucibleRecipe extends SingleIngredientRecipe {
public static final MapCodec<Water> CODEC = mapCodec(Water::new); public static final MapCodec<Water> CODEC = mapCodec(Water::new);
public static final StreamCodec<RegistryFriendlyByteBuf, Water> STREAM_CODEC = streamCodec(Water::new); public static final StreamCodec<RegistryFriendlyByteBuf, Water> STREAM_CODEC = streamCodec(Water::new);
public Water(Ingredient ingredient, FluidStack result) { public Water(Ingredient ingredient, FluidStackTemplate result) {
super(ingredient, result); super(ingredient, result);
} }

View File

@ -22,7 +22,7 @@ import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
@ -36,11 +36,11 @@ public class CompressedHammerRecipe extends HammerRecipe {
public static final MapCodec<CompressedHammerRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> ProbabilityRecipe.commonFields(instance).apply(instance, CompressedHammerRecipe::new)); public static final MapCodec<CompressedHammerRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> ProbabilityRecipe.commonFields(instance).apply(instance, CompressedHammerRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, CompressedHammerRecipe> STREAM_CODEC = StreamCodec.composite( public static final StreamCodec<RegistryFriendlyByteBuf, CompressedHammerRecipe> STREAM_CODEC = StreamCodec.composite(
Ingredient.CONTENTS_STREAM_CODEC, CompressedHammerRecipe::ingredient, Ingredient.CONTENTS_STREAM_CODEC, CompressedHammerRecipe::ingredient,
ItemStack.STREAM_CODEC, CompressedHammerRecipe::result, ItemStackTemplate.STREAM_CODEC, CompressedHammerRecipe::result,
CodecUtil.NUMBER_PROVIDER_CODEC, CompressedHammerRecipe::resultAmount, CodecUtil.NUMBER_PROVIDER_CODEC, CompressedHammerRecipe::resultAmount,
CompressedHammerRecipe::new); CompressedHammerRecipe::new);
public CompressedHammerRecipe(Ingredient ingredient, ItemStack result, NumberProvider resultAmount) { public CompressedHammerRecipe(Ingredient ingredient, ItemStackTemplate result, NumberProvider resultAmount) {
super(ingredient, result, resultAmount); super(ingredient, result, resultAmount);
} }

View File

@ -22,7 +22,7 @@ import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
@ -36,11 +36,11 @@ public class HammerRecipe extends ProbabilityRecipe {
public static final MapCodec<HammerRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> ProbabilityRecipe.commonFields(instance).apply(instance, HammerRecipe::new)); public static final MapCodec<HammerRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> ProbabilityRecipe.commonFields(instance).apply(instance, HammerRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, HammerRecipe> STREAM_CODEC = StreamCodec.composite( public static final StreamCodec<RegistryFriendlyByteBuf, HammerRecipe> STREAM_CODEC = StreamCodec.composite(
Ingredient.CONTENTS_STREAM_CODEC, HammerRecipe::ingredient, Ingredient.CONTENTS_STREAM_CODEC, HammerRecipe::ingredient,
ItemStack.STREAM_CODEC, HammerRecipe::result, ItemStackTemplate.STREAM_CODEC, HammerRecipe::result,
CodecUtil.NUMBER_PROVIDER_CODEC, HammerRecipe::resultAmount, CodecUtil.NUMBER_PROVIDER_CODEC, HammerRecipe::resultAmount,
HammerRecipe::new); HammerRecipe::new);
public HammerRecipe(Ingredient ingredient, ItemStack result, NumberProvider resultAmount) { public HammerRecipe(Ingredient ingredient, ItemStackTemplate result, NumberProvider resultAmount) {
super(ingredient, result, resultAmount); super(ingredient, result, resultAmount);
} }

View File

@ -22,7 +22,7 @@ import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
@ -34,7 +34,7 @@ public class CompressedSieveRecipe extends SieveRecipe {
public static final MapCodec<CompressedSieveRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> commonSieveFields(instance).apply(instance, CompressedSieveRecipe::new)); public static final MapCodec<CompressedSieveRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> commonSieveFields(instance).apply(instance, CompressedSieveRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, CompressedSieveRecipe> STREAM_CODEC = sieveStreamCodec(CompressedSieveRecipe::new); public static final StreamCodec<RegistryFriendlyByteBuf, CompressedSieveRecipe> STREAM_CODEC = sieveStreamCodec(CompressedSieveRecipe::new);
public CompressedSieveRecipe(Ingredient ingredient, ItemStack result, NumberProvider resultAmount, Ingredient mesh, boolean byHandOnly) { public CompressedSieveRecipe(Ingredient ingredient, ItemStackTemplate result, NumberProvider resultAmount, Ingredient mesh, boolean byHandOnly) {
super(ingredient, result, resultAmount, mesh, byHandOnly); super(ingredient, result, resultAmount, mesh, byHandOnly);
} }

View File

@ -26,7 +26,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.network.RegistryFriendlyByteBuf; import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.codec.StreamCodec;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.item.crafting.RecipeType;
@ -40,10 +40,10 @@ public class SieveRecipe extends ProbabilityRecipe {
public static final MapCodec<SieveRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> commonSieveFields(instance).apply(instance, SieveRecipe::new)); public static final MapCodec<SieveRecipe> CODEC = RecordCodecBuilder.mapCodec(instance -> commonSieveFields(instance).apply(instance, SieveRecipe::new));
public static final StreamCodec<RegistryFriendlyByteBuf, SieveRecipe> STREAM_CODEC = sieveStreamCodec(SieveRecipe::new); public static final StreamCodec<RegistryFriendlyByteBuf, SieveRecipe> STREAM_CODEC = sieveStreamCodec(SieveRecipe::new);
static <T extends SieveRecipe> StreamCodec<RegistryFriendlyByteBuf, T> sieveStreamCodec(Function5<Ingredient, ItemStack, NumberProvider, Ingredient, Boolean, T> factory) { static <T extends SieveRecipe> StreamCodec<RegistryFriendlyByteBuf, T> sieveStreamCodec(Function5<Ingredient, ItemStackTemplate, NumberProvider, Ingredient, Boolean, T> factory) {
return StreamCodec.composite( return StreamCodec.composite(
Ingredient.CONTENTS_STREAM_CODEC, T::ingredient, Ingredient.CONTENTS_STREAM_CODEC, T::ingredient,
ItemStack.STREAM_CODEC, T::result, ItemStackTemplate.STREAM_CODEC, T::result,
CodecUtil.NUMBER_PROVIDER_CODEC, T::resultAmount, CodecUtil.NUMBER_PROVIDER_CODEC, T::resultAmount,
Ingredient.CONTENTS_STREAM_CODEC, T::mesh, Ingredient.CONTENTS_STREAM_CODEC, T::mesh,
ByteBufCodecs.BOOL, T::byHandOnly, ByteBufCodecs.BOOL, T::byHandOnly,
@ -51,7 +51,7 @@ public class SieveRecipe extends ProbabilityRecipe {
); );
} }
protected static <T extends SieveRecipe> Products.P5<RecordCodecBuilder.Mu<T>, Ingredient, ItemStack, NumberProvider, Ingredient, Boolean> commonSieveFields(RecordCodecBuilder.Instance<T> instance) { protected static <T extends SieveRecipe> Products.P5<RecordCodecBuilder.Mu<T>, Ingredient, ItemStackTemplate, NumberProvider, Ingredient, Boolean> commonSieveFields(RecordCodecBuilder.Instance<T> instance) {
return commonFields(instance).and( return commonFields(instance).and(
instance.group( instance.group(
Ingredient.CODEC.fieldOf("mesh").forGetter(SieveRecipe::mesh), Ingredient.CODEC.fieldOf("mesh").forGetter(SieveRecipe::mesh),
@ -62,7 +62,7 @@ public class SieveRecipe extends ProbabilityRecipe {
public final Ingredient mesh; public final Ingredient mesh;
public final boolean byHandOnly; public final boolean byHandOnly;
public SieveRecipe(Ingredient ingredient, ItemStack result, NumberProvider resultAmount, Ingredient mesh, boolean byHandOnly) { public SieveRecipe(Ingredient ingredient, ItemStackTemplate result, NumberProvider resultAmount, Ingredient mesh, boolean byHandOnly) {
super(ingredient, result, resultAmount); super(ingredient, result, resultAmount);
this.mesh = mesh; this.mesh = mesh;

View File

@ -18,9 +18,13 @@
package thedarkcolour.exdeorum.registry; package thedarkcolour.exdeorum.registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.util.ColorRGBA; import net.minecraft.util.ColorRGBA;
import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeColor;
import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor; import net.minecraft.world.level.material.MapColor;
import net.minecraft.world.level.material.PushReaction; import net.minecraft.world.level.material.PushReaction;
import net.neoforged.neoforge.registries.DeferredBlock; import net.neoforged.neoforge.registries.DeferredBlock;
@ -35,20 +39,24 @@ public class EBlocks {
public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(ExDeorum.ID); public static final DeferredRegister.Blocks BLOCKS = DeferredRegister.createBlocks(ExDeorum.ID);
// Materials // Materials
public static final DeferredBlock<Block> DUST = BLOCKS.register("dust", () -> new ColoredFallingBlock(new ColorRGBA(0xC8C6AB), of().sound(SoundType.SAND).strength(0.4f))); public static final DeferredBlock<Block> DUST = BLOCKS.register("dust", id -> new ColoredFallingBlock(new ColorRGBA(0xC8C6AB), props(id, of().sound(SoundType.SAND).strength(0.4f))));
public static final DeferredBlock<Block> CRUSHED_NETHERRACK = BLOCKS.register("crushed_netherrack", () -> new ColoredFallingBlock(new ColorRGBA(0x501B1B), of().mapColor(MapColor.NETHER).sound(SoundType.SAND).strength(0.6f))); public static final DeferredBlock<Block> CRUSHED_NETHERRACK = BLOCKS.register("crushed_netherrack", id -> new ColoredFallingBlock(new ColorRGBA(0x501B1B), props(id, of().mapColor(MapColor.NETHER).sound(SoundType.SAND).strength(0.6f))));
public static final DeferredBlock<Block> CRUSHED_END_STONE = BLOCKS.register("crushed_end_stone", () -> new ColoredFallingBlock(new ColorRGBA(0xEEF6B4), of().mapColor(MapColor.SAND).sound(SoundType.SAND).strength(0.6f))); public static final DeferredBlock<Block> CRUSHED_END_STONE = BLOCKS.register("crushed_end_stone", id -> new ColoredFallingBlock(new ColorRGBA(0xEEF6B4), props(id, of().mapColor(MapColor.SAND).sound(SoundType.SAND).strength(0.6f))));
public static final DeferredBlock<Block> CRUSHED_DEEPSLATE = BLOCKS.register("crushed_deepslate", () -> new ColoredFallingBlock(new ColorRGBA(0x4A4A4F), of().mapColor(DyeColor.GRAY).sound(SoundType.SAND).strength(0.8f))); public static final DeferredBlock<Block> CRUSHED_DEEPSLATE = BLOCKS.register("crushed_deepslate", id -> new ColoredFallingBlock(new ColorRGBA(0x4A4A4F), props(id, of().mapColor(DyeColor.GRAY).sound(SoundType.SAND).strength(0.8f))));
public static final DeferredBlock<Block> CRUSHED_BLACKSTONE = BLOCKS.register("crushed_blackstone", () -> new ColoredFallingBlock(new ColorRGBA(0x20131C), of().mapColor(DyeColor.BLACK).sound(SoundType.SAND).strength(0.6f))); public static final DeferredBlock<Block> CRUSHED_BLACKSTONE = BLOCKS.register("crushed_blackstone", id -> new ColoredFallingBlock(new ColorRGBA(0x20131C), props(id, of().mapColor(DyeColor.BLACK).sound(SoundType.SAND).strength(0.6f))));
// Mechanical Sieve // Mechanical Sieve
public static final DeferredBlock<MechanicalSieveBlock> MECHANICAL_SIEVE = BLOCKS.register("mechanical_sieve", () -> new MechanicalSieveBlock(of().mapColor(MapColor.METAL).requiresCorrectToolForDrops().strength(5f, 1200f))); public static final DeferredBlock<MechanicalSieveBlock> MECHANICAL_SIEVE = BLOCKS.register("mechanical_sieve", id -> new MechanicalSieveBlock(props(id, of().mapColor(MapColor.METAL).requiresCorrectToolForDrops().strength(5f, 1200f))));
// Mechanical Hammer // Mechanical Hammer
public static final DeferredBlock<MechanicalHammerBlock> MECHANICAL_HAMMER = BLOCKS.register("mechanical_hammer", () -> new MechanicalHammerBlock(of().mapColor(MapColor.METAL).requiresCorrectToolForDrops().strength(5f, 1200f))); public static final DeferredBlock<MechanicalHammerBlock> MECHANICAL_HAMMER = BLOCKS.register("mechanical_hammer", id -> new MechanicalHammerBlock(props(id, of().mapColor(MapColor.METAL).requiresCorrectToolForDrops().strength(5f, 1200f))));
// Misc // Misc
public static final DeferredBlock<UnfiredCrucibleBlock> UNFIRED_PORCELAIN_CRUCIBLE = BLOCKS.register("unfired_porcelain_crucible", () -> new UnfiredCrucibleBlock(of().strength(2.0f))); public static final DeferredBlock<UnfiredCrucibleBlock> UNFIRED_PORCELAIN_CRUCIBLE = BLOCKS.register("unfired_porcelain_crucible", id -> new UnfiredCrucibleBlock(props(id, of().strength(2.0f))));
public static final DeferredBlock<InfestedLeavesBlock> INFESTED_LEAVES = BLOCKS.register("infested_leaves", () -> new InfestedLeavesBlock(ofFullCopy(Blocks.OAK_LEAVES))); public static final DeferredBlock<InfestedLeavesBlock> INFESTED_LEAVES = BLOCKS.register("infested_leaves", id -> new InfestedLeavesBlock(props(id, ofFullCopy(Blocks.OAK_LEAVES))));
public static final DeferredBlock<LiquidBlock> WITCH_WATER = BLOCKS.register("witch_water", () -> new WitchWaterBlock(EFluids.WITCH_WATER, ofFullCopy(Blocks.WATER).mapColor(MapColor.COLOR_PURPLE))); public static final DeferredBlock<LiquidBlock> WITCH_WATER = BLOCKS.register("witch_water", id -> new WitchWaterBlock(EFluids.WITCH_WATER, props(id, ofFullCopy(Blocks.WATER).mapColor(MapColor.COLOR_PURPLE))));
public static final DeferredBlock<EndCakeBlock> END_CAKE = BLOCKS.register("end_cake", () -> new EndCakeBlock(of().noLootTable().mapColor(MapColor.COLOR_BLACK).forceSolidOn().strength(0.5F).sound(SoundType.WOOL).pushReaction(PushReaction.BLOCK))); public static final DeferredBlock<EndCakeBlock> END_CAKE = BLOCKS.register("end_cake", id -> new EndCakeBlock(props(id, of().noLootTable().mapColor(MapColor.COLOR_BLACK).forceSolidOn().strength(0.5F).sound(SoundType.WOOL).pushReaction(PushReaction.BLOCK))));
private static BlockBehaviour.Properties props(Identifier id, BlockBehaviour.Properties properties) {
return properties.setId(ResourceKey.create(Registries.BLOCK, id));
}
} }

View File

@ -19,6 +19,9 @@
package thedarkcolour.exdeorum.registry; package thedarkcolour.exdeorum.registry;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.food.FoodProperties; import net.minecraft.world.food.FoodProperties;
import net.minecraft.world.item.*; import net.minecraft.world.item.*;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@ -39,44 +42,44 @@ public class EItems {
public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(ExDeorum.ID); public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(ExDeorum.ID);
// Silk Worm // Silk Worm
public static final DeferredItem<SilkwormItem> SILKWORM = ITEMS.register("silkworm", () -> new SilkwormItem(props())); public static final DeferredItem<SilkwormItem> SILKWORM = register("silkworm", SilkwormItem::new);
public static final DeferredItem<Item> COOKED_SILKWORM = ITEMS.register("cooked_silkworm", () -> new CookedSilkwormItem(props().food(new FoodProperties.Builder().nutrition(2).saturationModifier(0.6f).build()))); public static final DeferredItem<Item> COOKED_SILKWORM = register("cooked_silkworm", properties -> new CookedSilkwormItem(properties.food(new FoodProperties.Builder().nutrition(2).saturationModifier(0.6f).build())));
// Crooks // Crooks
public static final DeferredItem<Item> CROOK = ITEMS.register("crook", () -> new CrookItem(props().durability(128), 2.0f)); public static final DeferredItem<Item> CROOK = register("crook", properties -> new CrookItem(properties.durability(128), 2.0f));
public static final DeferredItem<Item> BONE_CROOK = ITEMS.register("bone_crook", () -> new CrookItem(props().durability(312), 4.0f)); public static final DeferredItem<Item> BONE_CROOK = register("bone_crook", properties -> new CrookItem(properties.durability(312), 4.0f));
// Watering cans // Watering cans
public static final DeferredItem<Item> WOODEN_WATERING_CAN = ITEMS.register("wooden_watering_can", () -> new WateringCanItem(300, props().stacksTo(1))); public static final DeferredItem<Item> WOODEN_WATERING_CAN = register("wooden_watering_can", properties -> new WateringCanItem(300, properties.stacksTo(1)));
public static final DeferredItem<Item> STONE_WATERING_CAN = ITEMS.register("stone_watering_can", () -> new WateringCanItem(1000, props().stacksTo(1))); public static final DeferredItem<Item> STONE_WATERING_CAN = register("stone_watering_can", properties -> new WateringCanItem(1000, properties.stacksTo(1)));
public static final DeferredItem<Item> IRON_WATERING_CAN = ITEMS.register("iron_watering_can", () -> new WateringCanItem(2000, props().stacksTo(1))); public static final DeferredItem<Item> IRON_WATERING_CAN = register("iron_watering_can", properties -> new WateringCanItem(2000, properties.stacksTo(1)));
public static final DeferredItem<Item> GOLDEN_WATERING_CAN = ITEMS.register("golden_watering_can", () -> new WateringCanItem(4000, props().stacksTo(1))); public static final DeferredItem<Item> GOLDEN_WATERING_CAN = register("golden_watering_can", properties -> new WateringCanItem(4000, properties.stacksTo(1)));
public static final DeferredItem<Item> DIAMOND_WATERING_CAN = ITEMS.register("diamond_watering_can", () -> new WideWateringCanItem(false, props().stacksTo(1))); public static final DeferredItem<Item> DIAMOND_WATERING_CAN = register("diamond_watering_can", properties -> new WideWateringCanItem(false, properties.stacksTo(1)));
public static final DeferredItem<Item> NETHERITE_WATERING_CAN = ITEMS.register("netherite_watering_can", () -> new WideWateringCanItem(true, props().stacksTo(1))); public static final DeferredItem<Item> NETHERITE_WATERING_CAN = register("netherite_watering_can", properties -> new WideWateringCanItem(true, properties.stacksTo(1)));
// Sieve Meshes // Sieve Meshes
public static final DeferredItem<Item> STRING_MESH = ITEMS.register("string_mesh", () -> new MeshItem(props().stacksTo(16))); public static final DeferredItem<Item> STRING_MESH = register("string_mesh", properties -> new MeshItem(properties.stacksTo(16)));
public static final DeferredItem<Item> FLINT_MESH = ITEMS.register("flint_mesh", () -> new MeshItem(props().stacksTo(16))); public static final DeferredItem<Item> FLINT_MESH = register("flint_mesh", properties -> new MeshItem(properties.stacksTo(16)));
public static final DeferredItem<Item> IRON_MESH = ITEMS.register("iron_mesh", () -> new MeshItem(props().stacksTo(16))); public static final DeferredItem<Item> IRON_MESH = register("iron_mesh", properties -> new MeshItem(properties.stacksTo(16)));
public static final DeferredItem<Item> GOLDEN_MESH = ITEMS.register("golden_mesh", () -> new MeshItem(props().stacksTo(16))); public static final DeferredItem<Item> GOLDEN_MESH = register("golden_mesh", properties -> new MeshItem(properties.stacksTo(16)));
public static final DeferredItem<Item> DIAMOND_MESH = ITEMS.register("diamond_mesh", () -> new MeshItem(props().stacksTo(16))); public static final DeferredItem<Item> DIAMOND_MESH = register("diamond_mesh", properties -> new MeshItem(properties.stacksTo(16)));
public static final DeferredItem<Item> NETHERITE_MESH = ITEMS.register("netherite_mesh", () -> new MeshItem(props().stacksTo(16))); public static final DeferredItem<Item> NETHERITE_MESH = register("netherite_mesh", properties -> new MeshItem(properties.stacksTo(16)));
// Hammers // Hammers
public static final DeferredItem<Item> WOODEN_HAMMER = ITEMS.register("wooden_hammer", () -> new HammerItem(ToolMaterial.WOOD, props())); public static final DeferredItem<Item> WOODEN_HAMMER = register("wooden_hammer", properties -> new HammerItem(ToolMaterial.WOOD, properties));
public static final DeferredItem<Item> STONE_HAMMER = ITEMS.register("stone_hammer", () -> new HammerItem(ToolMaterial.STONE, props())); public static final DeferredItem<Item> STONE_HAMMER = register("stone_hammer", properties -> new HammerItem(ToolMaterial.STONE, properties));
public static final DeferredItem<Item> GOLDEN_HAMMER = ITEMS.register("golden_hammer", () -> new HammerItem(ToolMaterial.GOLD, props())); public static final DeferredItem<Item> GOLDEN_HAMMER = register("golden_hammer", properties -> new HammerItem(ToolMaterial.GOLD, properties));
public static final DeferredItem<Item> IRON_HAMMER = ITEMS.register("iron_hammer", () -> new HammerItem(ToolMaterial.IRON, props())); public static final DeferredItem<Item> IRON_HAMMER = register("iron_hammer", properties -> new HammerItem(ToolMaterial.IRON, properties));
public static final DeferredItem<Item> DIAMOND_HAMMER = ITEMS.register("diamond_hammer", () -> new HammerItem(ToolMaterial.DIAMOND, props())); public static final DeferredItem<Item> DIAMOND_HAMMER = register("diamond_hammer", properties -> new HammerItem(ToolMaterial.DIAMOND, properties));
public static final DeferredItem<Item> NETHERITE_HAMMER = ITEMS.register("netherite_hammer", () -> new HammerItem(ToolMaterial.NETHERITE, props())); public static final DeferredItem<Item> NETHERITE_HAMMER = register("netherite_hammer", properties -> new HammerItem(ToolMaterial.NETHERITE, properties));
// Compressed Hammers // Compressed Hammers
public static final DeferredItem<Item> COMPRESSED_WOODEN_HAMMER = ITEMS.register("compressed_wooden_hammer", () -> new HammerItem(ToolMaterial.WOOD, props())); public static final DeferredItem<Item> COMPRESSED_WOODEN_HAMMER = register("compressed_wooden_hammer", properties -> new HammerItem(ToolMaterial.WOOD, properties));
public static final DeferredItem<Item> COMPRESSED_STONE_HAMMER = ITEMS.register("compressed_stone_hammer", () -> new HammerItem(ToolMaterial.STONE, props())); public static final DeferredItem<Item> COMPRESSED_STONE_HAMMER = register("compressed_stone_hammer", properties -> new HammerItem(ToolMaterial.STONE, properties));
public static final DeferredItem<Item> COMPRESSED_GOLDEN_HAMMER = ITEMS.register("compressed_golden_hammer", () -> new HammerItem(ToolMaterial.GOLD, props())); public static final DeferredItem<Item> COMPRESSED_GOLDEN_HAMMER = register("compressed_golden_hammer", properties -> new HammerItem(ToolMaterial.GOLD, properties));
public static final DeferredItem<Item> COMPRESSED_IRON_HAMMER = ITEMS.register("compressed_iron_hammer", () -> new HammerItem(ToolMaterial.IRON, props())); public static final DeferredItem<Item> COMPRESSED_IRON_HAMMER = register("compressed_iron_hammer", properties -> new HammerItem(ToolMaterial.IRON, properties));
public static final DeferredItem<Item> COMPRESSED_DIAMOND_HAMMER = ITEMS.register("compressed_diamond_hammer", () -> new HammerItem(ToolMaterial.DIAMOND, props())); public static final DeferredItem<Item> COMPRESSED_DIAMOND_HAMMER = register("compressed_diamond_hammer", properties -> new HammerItem(ToolMaterial.DIAMOND, properties));
public static final DeferredItem<Item> COMPRESSED_NETHERITE_HAMMER = ITEMS.register("compressed_netherite_hammer", () -> new HammerItem(ToolMaterial.NETHERITE, props())); public static final DeferredItem<Item> COMPRESSED_NETHERITE_HAMMER = register("compressed_netherite_hammer", properties -> new HammerItem(ToolMaterial.NETHERITE, properties));
// Ore Chunks // Ore Chunks
public static final DeferredItem<Item> IRON_ORE_CHUNK = registerSimpleItem("iron_ore_chunk"); public static final DeferredItem<Item> IRON_ORE_CHUNK = registerSimpleItem("iron_ore_chunk");
@ -112,38 +115,42 @@ public class EItems {
// Misc // Misc
public static final DeferredItem<Item> PORCELAIN_CLAY_BALL = registerSimpleItem("porcelain_clay_ball"); public static final DeferredItem<Item> PORCELAIN_CLAY_BALL = registerSimpleItem("porcelain_clay_ball");
public static final DeferredItem<Item> GRASS_SEEDS = ITEMS.register("grass_seeds", () -> new GrassSpreaderItem(props(), Blocks.GRASS_BLOCK::defaultBlockState)); public static final DeferredItem<Item> GRASS_SEEDS = register("grass_seeds", properties -> new GrassSpreaderItem(properties, Blocks.GRASS_BLOCK::defaultBlockState));
public static final DeferredItem<Item> MYCELIUM_SPORES = ITEMS.register("mycelium_spores", () -> new GrassSpreaderItem(props(), Blocks.MYCELIUM::defaultBlockState)); public static final DeferredItem<Item> MYCELIUM_SPORES = register("mycelium_spores", properties -> new GrassSpreaderItem(properties, Blocks.MYCELIUM::defaultBlockState));
public static final DeferredItem<Item> WARPED_NYLIUM_SPORES = ITEMS.register("warped_nylium_spores", () -> new NyliumSpreaderItem(props(), Blocks.WARPED_NYLIUM::defaultBlockState)); public static final DeferredItem<Item> WARPED_NYLIUM_SPORES = register("warped_nylium_spores", properties -> new NyliumSpreaderItem(properties, Blocks.WARPED_NYLIUM::defaultBlockState));
public static final DeferredItem<Item> CRIMSON_NYLIUM_SPORES = ITEMS.register("crimson_nylium_spores", () -> new NyliumSpreaderItem(props(), Blocks.CRIMSON_NYLIUM::defaultBlockState)); public static final DeferredItem<Item> CRIMSON_NYLIUM_SPORES = register("crimson_nylium_spores", properties -> new NyliumSpreaderItem(properties, Blocks.CRIMSON_NYLIUM::defaultBlockState));
public static final DeferredItem<Item> SCULK_CORE = ITEMS.register("sculk_core", () -> new SculkCoreItem(props().stacksTo(1))); public static final DeferredItem<Item> SCULK_CORE = register("sculk_core", properties -> new SculkCoreItem(properties.stacksTo(1)));
public static final DeferredItem<Item> RANDOM_POTTERY_SHERD = ITEMS.register("random_pottery_sherd", () -> new RandomResultItem(props(), EItemTags.RANDOM_SHERD_DROPS)); public static final DeferredItem<Item> RANDOM_POTTERY_SHERD = register("random_pottery_sherd", properties -> new RandomResultItem(properties, EItemTags.RANDOM_SHERD_DROPS));
public static final DeferredItem<Item> RANDOM_ARMOR_TRIM = ITEMS.register("random_armor_trim", () -> new RandomResultItem(props(), EItemTags.RANDOM_TRIM_DROPS)); public static final DeferredItem<Item> RANDOM_ARMOR_TRIM = register("random_armor_trim", properties -> new RandomResultItem(properties, EItemTags.RANDOM_TRIM_DROPS));
public static final DeferredItem<Item> WOOD_CHIPPINGS = registerSimpleItem("wood_chippings"); public static final DeferredItem<Item> WOOD_CHIPPINGS = registerSimpleItem("wood_chippings");
// Buckets // Buckets
public static final DeferredItem<Item> UNFIRED_PORCELAIN_BUCKET = registerSimpleItem("unfired_porcelain_bucket"); public static final DeferredItem<Item> UNFIRED_PORCELAIN_BUCKET = registerSimpleItem("unfired_porcelain_bucket");
public static final DeferredItem<Item> PORCELAIN_BUCKET = ITEMS.register("porcelain_bucket", () -> new PorcelainBucket(() -> Fluids.EMPTY, props().stacksTo(16))); public static final DeferredItem<Item> PORCELAIN_BUCKET = register("porcelain_bucket", properties -> new PorcelainBucket(() -> Fluids.EMPTY, properties.stacksTo(16)));
public static final DeferredItem<Item> PORCELAIN_WATER_BUCKET = ITEMS.register("porcelain_water_bucket", () -> new PorcelainBucket(() -> Fluids.WATER, props().craftRemainder(PORCELAIN_BUCKET.get()).stacksTo(1))); public static final DeferredItem<Item> PORCELAIN_WATER_BUCKET = register("porcelain_water_bucket", properties -> new PorcelainBucket(() -> Fluids.WATER, properties.craftRemainder(PORCELAIN_BUCKET.get()).stacksTo(1)));
public static final DeferredItem<Item> PORCELAIN_LAVA_BUCKET = ITEMS.register("porcelain_lava_bucket", () -> new PorcelainBucket(() -> Fluids.LAVA, props().stacksTo(1))); public static final DeferredItem<Item> PORCELAIN_LAVA_BUCKET = register("porcelain_lava_bucket", properties -> new PorcelainBucket(() -> Fluids.LAVA, properties.stacksTo(1)));
public static final DeferredItem<Item> PORCELAIN_MILK_BUCKET = ITEMS.register("porcelain_milk_bucket", () -> new PorcelainMilkBucket(props().craftRemainder(PORCELAIN_BUCKET.get()).stacksTo(1))); public static final DeferredItem<Item> PORCELAIN_MILK_BUCKET = register("porcelain_milk_bucket", properties -> new PorcelainMilkBucket(properties.craftRemainder(PORCELAIN_BUCKET.get()).stacksTo(1)));
public static final DeferredItem<Item> PORCELAIN_WITCH_WATER_BUCKET = ITEMS.register("porcelain_witch_water_bucket", () -> new PorcelainBucket(EFluids.WITCH_WATER, props().craftRemainder(PORCELAIN_BUCKET.get()).stacksTo(1))); public static final DeferredItem<Item> PORCELAIN_WITCH_WATER_BUCKET = register("porcelain_witch_water_bucket", properties -> new PorcelainBucket(EFluids.WITCH_WATER, properties.craftRemainder(PORCELAIN_BUCKET.get()).stacksTo(1)));
// Fluids // Fluids
public static final DeferredItem<Item> WITCH_WATER_BUCKET = ITEMS.register("witch_water_bucket", () -> new BucketItem(EFluids.WITCH_WATER.get(), props().craftRemainder(Items.BUCKET).stacksTo(1))); public static final DeferredItem<Item> WITCH_WATER_BUCKET = register("witch_water_bucket", properties -> new BucketItem(EFluids.WITCH_WATER.get(), properties.craftRemainder(Items.BUCKET).stacksTo(1)));
public static DeferredItem<Item> registerSimpleItem(String name) { public static DeferredItem<Item> registerSimpleItem(String name) {
return ITEMS.register(name, () -> new Item(props())); return register(name, Item::new);
} }
// Returns new properties with creative tab set // Returns new properties with creative tab set
public static Item.Properties props() { public static Item.Properties props(Identifier id) {
return new Item.Properties(); return new Item.Properties().setId(ResourceKey.create(Registries.ITEM, id));
}
public static <T extends Item> DeferredItem<T> register(String name, java.util.function.Function<Item.Properties, T> factory) {
return ITEMS.register(name, id -> factory.apply(props(id)));
} }
// Register a block item // Register a block item
public static DeferredItem<BlockItem> registerItemBlock(DeferredBlock<? extends Block> block) { public static DeferredItem<BlockItem> registerItemBlock(DeferredBlock<? extends Block> block) {
return ITEMS.register(block.getId().getPath(), () -> new BlockItem(block.get(), props())); return ITEMS.register(block.getId().getPath(), id -> new BlockItem(block.get(), props(id)));
} }
// BlockItems // BlockItems