Ex Deorum 1.5

This commit is contained in:
thedarkcolour 2023-09-10 09:24:04 -07:00
parent 379c470670
commit bf450086a2
16 changed files with 648 additions and 496 deletions

View File

@ -5,7 +5,7 @@ plugins {
id 'org.spongepowered.mixin' version '0.7.+'
}
version = '1.3'
version = '1.4'
group = 'thedarkcolour.exdeorum'
base {
archivesName = 'exdeorum'

View File

@ -1,3 +1,10 @@
## Ex Deorum 1.4
- Red Sand is now obtainable by hammering crushed netherrack.
- Sieves can no longer be automated by machines (can be re-enabled in the server config.)
- Fixed desync bug when a machine like Create's Deployer interacts with the Sieve
- Fixed an edge case where a modded ore wouldn't appear if the item form wasn't in the ore's tag.
- Fixed #5, which prevented automating the Crucible
## Ex Deorum 1.3
- Allow modded ores to drop from sieving Gravel and Crushed Deepslate if a mod with that ore is installed. Supported ores are Aluminum, Cobalt, Silver, Lead, Platinum, Nickel, Uranium, Osmium, Tin, Zinc, and Iridium.
- Allow some modded drops from sieving if a mod with those resources is installed. Currently, only Grains of Infinity from Ender IO is supported.

View File

@ -1,4 +1,4 @@
// 1.20.1 2023-09-01T15:25:16.1558751 Recipes
// 1.20.1 2023-09-09T11:37:17.5523493 Recipes
5ad481a0c376c1a1785a5d3b992064d0ec0bf3b0 data/exdeorum/advancements/recipes/food/end_cake.json
25dd027e844a72b03c95dbe5e3c3dd8c738ceb00 data/exdeorum/advancements/recipes/misc/acacia_barrel.json
376be94a64c9ca97a9ea2346547b6e617f13a815 data/exdeorum/advancements/recipes/misc/acacia_crucible.json
@ -222,6 +222,7 @@ df7f23b00f23a5ac255345801ac88850877a2e88 data/exdeorum/recipes/hammer/fire_coral
808203624a792fcd4a0289975d82b3bff34af90e data/exdeorum/recipes/hammer/horn_coral.json
5ebb5a4dfa54230abcd4cdb5af34b2b296c7eb23 data/exdeorum/recipes/hammer/horn_coral_fan.json
19c00defa531bfbaa11f19403ff9d1694a9cd04a data/exdeorum/recipes/hammer/prismarine.json
fdc243a5cfb1e84220cf6c41f46f454b3aff8b87 data/exdeorum/recipes/hammer/red_sand.json
b592554bc00ab20d8affdfd1627406858ac10797 data/exdeorum/recipes/hammer/sand.json
0e879c5bcf28023efdcd257d3e12e7153bd0bef7 data/exdeorum/recipes/hammer/stone_pebbles.json
3bf60837b935bd09248a84fd8f22968fc244ea46 data/exdeorum/recipes/hammer/tube_coral.json
@ -564,12 +565,14 @@ da3556d43a22a00cfba29419879f8bb1c24f76e0 data/exdeorum/recipes/sieve/dust/diamon
0087b10cc106dc6cb22a9574567faf8096fa797e data/exdeorum/recipes/sieve/dust/diamond/grains_of_infinity.json
aacdbedc91e09191a6fc335ed82ca481d934ebc3 data/exdeorum/recipes/sieve/dust/diamond/gunpowder.json
00907e701451521c3ca793ec337b0b2f0166e895 data/exdeorum/recipes/sieve/dust/diamond/redstone.json
64de5902f0aaee9c844ba1316a796e10cb0aed34 data/exdeorum/recipes/sieve/dust/diamond/yellorium_dust.json
7eba59b03b5affdc11c937060e99949db301086a data/exdeorum/recipes/sieve/dust/flint/blaze_powder.json
7af226b5661b96e0b8ddcb8ec902d37f429b0b48 data/exdeorum/recipes/sieve/dust/flint/bone_meal.json
0a7d44bdff5a9b7040f702cb5ff756ce231c9a60 data/exdeorum/recipes/sieve/dust/flint/glowstone_dust.json
c418797b65a0c67841c5e99d8fec95d1ee780065 data/exdeorum/recipes/sieve/dust/flint/grains_of_infinity.json
52c65219279d46fe5474a8a01d69a1362cb3a2ea data/exdeorum/recipes/sieve/dust/flint/gunpowder.json
7ecd5ae5d7f6783ff7535978352190a9af1b0ab4 data/exdeorum/recipes/sieve/dust/flint/redstone.json
34cf976c49dbd139da48e9896d700587e0ae75e1 data/exdeorum/recipes/sieve/dust/flint/yellorium_dust.json
bdbe4b3434ff67299b47d65eab0c442b235dc654 data/exdeorum/recipes/sieve/dust/golden/blaze_powder.json
fab2426618c3f527ed401f1ef2cee3fa81de1969 data/exdeorum/recipes/sieve/dust/golden/bone_meal.json
9a9eb3cc996de392e75dd9c6613af1ff382615d5 data/exdeorum/recipes/sieve/dust/golden/glowstone_dust.json
@ -578,6 +581,7 @@ c087c3ba3bd7bda74aac13435f61a998060d4872 data/exdeorum/recipes/sieve/dust/golden
4d28a3acd946fd55c3982e5ff9bb8876b8b0baef data/exdeorum/recipes/sieve/dust/golden/gunpowder.json
a9c9258b74162f5132b8b47f3981b071ec6b60bf data/exdeorum/recipes/sieve/dust/golden/raw_gold.json
65c99881294536c0f59d66d0e7429d85bbec0b9b data/exdeorum/recipes/sieve/dust/golden/redstone.json
f5e23ee85134101ff76f64b301e7cc3d86fb87e6 data/exdeorum/recipes/sieve/dust/golden/yellorium_dust.json
4b304a265794186e3c1fbd23acfcfde57322d615 data/exdeorum/recipes/sieve/dust/iron/blaze_powder.json
758573f460a7f2ff2104a1bbfde2fa8392d002a4 data/exdeorum/recipes/sieve/dust/iron/bone_meal.json
e3f7f74c6e84a149282b23f0388e25c7ae5f4352 data/exdeorum/recipes/sieve/dust/iron/glowstone_dust.json
@ -585,6 +589,7 @@ f5c25b6ee05890bdc41ddc45a14b2015665388fe data/exdeorum/recipes/sieve/dust/iron/g
5ffc2f95fc5a52aad02e7b063ba64c4cd41836f3 data/exdeorum/recipes/sieve/dust/iron/gunpowder.json
eeb2ec19599044971eeff5929e7238fa398f1f08 data/exdeorum/recipes/sieve/dust/iron/iron_nugget.json
9dc82b4a79edf9561566137af39399b1621b89a0 data/exdeorum/recipes/sieve/dust/iron/redstone.json
9fd60c04e81943398e45a95f8f301fe4ee1f6efd data/exdeorum/recipes/sieve/dust/iron/yellorium_dust.json
55bf627cf6c3a8eca57328cb482a6f86326a8e68 data/exdeorum/recipes/sieve/dust/netherite/blaze_powder.json
33e35a1af71274a675498234b8dcd9834368c717 data/exdeorum/recipes/sieve/dust/netherite/bone_meal.json
0472c65dad0e35df7397dfb2a7b53c5408f5fffc data/exdeorum/recipes/sieve/dust/netherite/glowstone_dust.json
@ -593,12 +598,14 @@ a776c6d6946a02fea8bb346860f525bde2c835de data/exdeorum/recipes/sieve/dust/nether
2fb062f8d8be004bd5e54a43a089c579a374abb1 data/exdeorum/recipes/sieve/dust/netherite/gunpowder.json
c6a8996009ae3e712a2895001e96c74bb35b224c data/exdeorum/recipes/sieve/dust/netherite/iron_nugget.json
44e98c8ce40d6f72596b009398943cb3ac6ef1b5 data/exdeorum/recipes/sieve/dust/netherite/redstone.json
20f154dc498320be8037e23b3bdc7b1c483d2f95 data/exdeorum/recipes/sieve/dust/netherite/yellorium_dust.json
7bed9653a0d40436bd15531ffb15eb84563cfc4d data/exdeorum/recipes/sieve/dust/string/blaze_powder.json
74dc1675b4dc9c0d1d96bc22db0b844f322082b8 data/exdeorum/recipes/sieve/dust/string/bone_meal.json
e4ead3b21ece1d4470c2000017586c1730acd1bb data/exdeorum/recipes/sieve/dust/string/glowstone_dust.json
91428deb05889718e458b8cd9f6d610f1e652330 data/exdeorum/recipes/sieve/dust/string/grains_of_infinity.json
3272a1f8b4534dd8800b07b7ec826d8f7a4fae65 data/exdeorum/recipes/sieve/dust/string/gunpowder.json
e1a8558df8270d57cbcdf7255b93b40d0c05d33b data/exdeorum/recipes/sieve/dust/string/redstone.json
9b5162b466041d395a2428c2c944b0a450c135b6 data/exdeorum/recipes/sieve/dust/string/yellorium_dust.json
9df7ca0a604ab01b33dfe0b342441b9705c9ac9e data/exdeorum/recipes/sieve/gravel/diamond/aluminum_ore_chunk.json
b1b1c231670f2622dc2227fac65aff0ebbd2ea19 data/exdeorum/recipes/sieve/gravel/diamond/amethyst_shard.json
2284efd2a38ecb63f694ba0586c478b26207adce data/exdeorum/recipes/sieve/gravel/diamond/coal.json
@ -798,6 +805,35 @@ ee240ebb80802c83d48985d9e431bc12410589a4 data/exdeorum/recipes/sieve/moss_block/
e5351932ff3700bf95f2ec770cd051f08debee9c data/exdeorum/recipes/sieve/moss_block/string/small_dripleaf.json
64280db27eca51b0aa8fddc970756c1e3a25db08 data/exdeorum/recipes/sieve/moss_block/string/spore_blossom.json
fec8737e1aba9773807c7cd582c685e4532f488d data/exdeorum/recipes/sieve/moss_block/string/spruce_sapling.json
156f165c67999ede3087cb52cb701f0d265a4aed data/exdeorum/recipes/sieve/red_sand/diamond/cactus.json
c96dd108668d448619c27dafa1770b8473de904f data/exdeorum/recipes/sieve/red_sand/diamond/dead_bush.json
cb16aa3c76c75a47abdad3a42dfdb13676525851 data/exdeorum/recipes/sieve/red_sand/diamond/gold_nugget.json
0509eae50392db7a5d04ce937a5f3973f75d9921 data/exdeorum/recipes/sieve/red_sand/diamond/raw_gold.json
8dc85127d9bf3d2882b5551b889cbf23eb013f7a data/exdeorum/recipes/sieve/red_sand/diamond/redstone.json
0d883ea6b876bbf69711a3ebf367c1e465b72a24 data/exdeorum/recipes/sieve/red_sand/flint/cactus.json
404252db62319c367d0564b18c340b66e7fafa28 data/exdeorum/recipes/sieve/red_sand/flint/dead_bush.json
a135a5cfc5d6177ece92481fd6ba2a3ae50d28ac data/exdeorum/recipes/sieve/red_sand/flint/gold_nugget.json
eff718d36e89f82a96d9ffdc98caa5a5c33e0a2b data/exdeorum/recipes/sieve/red_sand/flint/raw_gold.json
9f19e4c9f625de7d3490ab3feef53e4436989a91 data/exdeorum/recipes/sieve/red_sand/flint/redstone.json
bdd32c9a8b3fa2f379ad71289bb52b4ef68c0577 data/exdeorum/recipes/sieve/red_sand/golden/cactus.json
6281aadf6936c3160d0e261bf1a248ebc86c7f7e data/exdeorum/recipes/sieve/red_sand/golden/dead_bush.json
d2329615e5d3a674ff162901518bf91043c4b2bc data/exdeorum/recipes/sieve/red_sand/golden/gold_nugget.json
238130e1482e64676b0b45a48e261bf6443fec9f data/exdeorum/recipes/sieve/red_sand/golden/raw_gold.json
e836570ca27341f19df56ffe342957ba54fb5e38 data/exdeorum/recipes/sieve/red_sand/golden/redstone.json
85c37a8ea69278436f5b354a098fa8dd93a269cb data/exdeorum/recipes/sieve/red_sand/iron/cactus.json
e301aa1a48bbb0cba03d0efd4162c4ea27bcd735 data/exdeorum/recipes/sieve/red_sand/iron/dead_bush.json
e7890d925decdcd1972508026943b52507ba6ce1 data/exdeorum/recipes/sieve/red_sand/iron/gold_nugget.json
ad592d67fba2ae9554f7425d88c13ec106e6e08a data/exdeorum/recipes/sieve/red_sand/iron/raw_gold.json
1b82c029f28894e2eee7ab8effca14e745dab1d5 data/exdeorum/recipes/sieve/red_sand/iron/redstone.json
a9aa1611d994d1b3f6c4a9bbb6865d8998521a48 data/exdeorum/recipes/sieve/red_sand/netherite/cactus.json
1294a1825ceb652ffdb1aac352a20886e4ee162c data/exdeorum/recipes/sieve/red_sand/netherite/gold_nugget.json
f31cb4bb77b550f1239f7853ebc95f9671c0a356 data/exdeorum/recipes/sieve/red_sand/netherite/raw_gold.json
09bfe3d4ca5ba25fe268ef680f7e1af24bf06da0 data/exdeorum/recipes/sieve/red_sand/netherite/redstone.json
0bbec585a6a89b7eb128c2f9475e0ae4c325852f data/exdeorum/recipes/sieve/red_sand/string/cactus.json
54b7248def54580a7e88cf538a52e721b1c872d1 data/exdeorum/recipes/sieve/red_sand/string/dead_bush.json
b443cbaf342f0fa3a6a88d7205644792bcb47093 data/exdeorum/recipes/sieve/red_sand/string/gold_nugget.json
e1c550f09fcddcc09da0f76458f2d2ef429bcc44 data/exdeorum/recipes/sieve/red_sand/string/raw_gold.json
5c3788fbc13f9a25dd7e42b27210f258ec337c02 data/exdeorum/recipes/sieve/red_sand/string/redstone.json
c63500f17bbac4d47caac5a48f3cedfe750916a5 data/exdeorum/recipes/sieve/sand/diamond/flint.json
3b0c8920c2c19e3731e0258bd005b4d2cc2bd5ab data/exdeorum/recipes/sieve/sand/diamond/gold_nugget.json
286085cb6ec9ed4d3fb2e84fc19887019dbe2d02 data/exdeorum/recipes/sieve/sand/diamond/iron_nugget.json

View File

@ -32,7 +32,6 @@ import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.SaplingBlock;
import net.minecraft.world.level.block.entity.BlockEntityTicker;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
@ -121,7 +120,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity {
return FluidUtil.interactWithFluidHandler(player, hand, tank) ? InteractionResult.sidedSuccess(level.isClientSide) : InteractionResult.PASS;
}
if (!level.isClientSide) {
if (!level.isClientSide && canInsertItem(playerItem)) {
tryMelt(playerItem, player.getAbilities().instabuild ? stack -> {} : stack -> stack.shrink(1));
}
@ -138,36 +137,51 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity {
* @param shrinkAction What to do when item is melted
*/
private void tryMelt(ItemStack item, Consumer<ItemStack> shrinkAction) {
CrucibleRecipe recipe = getRecipe(item);
if (item.isEmpty()) return;
if (recipe != null) {
FluidStack result = recipe.getResult();
FluidStack contained = tank.getFluid();
var meltItem = item.getItem();
var recipe = getRecipe(item);
if (recipe == null) {
this.item.setStackInSlot(0, ItemStack.EMPTY);
return;
}
var result = recipe.getResult();
var contained = this.tank.getFluid();
shrinkAction.accept(item);
this.solids = (short) Math.max(solids + result.getAmount(), MAX_SOLIDS);
if (((result.isFluidEqual(contained) || contained.isEmpty()) && result.getAmount() + solids <= MAX_SOLIDS)) {
var meltItem = item.getItem();
shrinkAction.accept(item);
solids += result.getAmount();
if (contained.isEmpty()) {
fluid = result.getFluid();
}
if (contained.isEmpty()) {
fluid = result.getFluid();
}
var melts = MELT_OVERRIDES.get();
if (melts.containsKey(meltItem)) {
lastMelted = melts.get(meltItem);
} else if (meltItem.getClass() == BlockItem.class) {
lastMelted = ((BlockItem) meltItem).getBlock();
} else {
// If we already have something else inside just use that instead of switching to default
if (lastMelted == null) {
lastMelted = getDefaultMeltBlock();
}
}
markUpdated();
var melts = MELT_OVERRIDES.get();
if (melts.containsKey(meltItem)) {
lastMelted = melts.get(meltItem);
} else if (meltItem.getClass() == BlockItem.class) {
lastMelted = ((BlockItem) meltItem).getBlock();
} else {
// If we already have something else inside just use that instead of switching to default
if (lastMelted == null) {
lastMelted = getDefaultMeltBlock();
}
}
markUpdated();
}
private boolean canInsertItem(ItemStack item) {
if (item.isEmpty()) return false;
var recipe = getRecipe(item);
if (recipe != null) {
var result = recipe.getResult();
var contained = tank.getFluid();
return (result.isFluidEqual(contained) || contained.isEmpty()) && result.getAmount() + solids <= MAX_SOLIDS;
}
return false;
}
public int getMeltingRate() {
@ -250,7 +264,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity {
@Override
public boolean isItemValid(int slot, @Nonnull ItemStack stack) {
return getRecipe(stack) != null;
return canInsertItem(stack);
}
public ItemStack getItem() {

View File

@ -31,6 +31,7 @@ import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.storage.loot.LootContext;
import net.minecraft.world.level.storage.loot.LootParams;
import net.minecraftforge.common.util.FakePlayer;
import thedarkcolour.exdeorum.config.EConfig;
import thedarkcolour.exdeorum.recipe.RecipeUtil;
import thedarkcolour.exdeorum.recipe.sieve.SieveRecipe;
@ -147,7 +148,9 @@ public class SieveBlockEntity extends EBlockEntity {
}
}
} else {
if (EConfig.SERVER.simultaneousSieveUsage.get()) {
var realPlayer = !(player instanceof FakePlayer);
if (realPlayer && EConfig.SERVER.simultaneousSieveUsage.get()) {
var cursor = worldPosition.mutable().move(-1, 0, -1);
// Sieve with adjacent sieves
@ -165,7 +168,7 @@ public class SieveBlockEntity extends EBlockEntity {
}
cursor.move(1, 0, -3);
}
} else {
} else if (realPlayer || EConfig.SERVER.automatedSieves.get()) {
performSift(player);
}
}
@ -211,6 +214,8 @@ public class SieveBlockEntity extends EBlockEntity {
if (!level.isClientSide) {
giveItems(player);
}
} else {
markUpdated();
}
}

View File

@ -39,10 +39,9 @@ public class InfestedLeavesRenderer implements BlockEntityRenderer<InfestedLeave
// Default to oak leaves
if (state == null) state = Blocks.OAK_LEAVES.defaultBlockState();
// If something is wrong render default leaves
// If something is wrong skip rendering
var level = te.getLevel();
if (level == null) {
Minecraft.getInstance().getBlockRenderer().renderSingleBlock(state, stack, buffer, light, unused, ModelData.EMPTY, null);
return;
}
@ -50,7 +49,6 @@ public class InfestedLeavesRenderer implements BlockEntityRenderer<InfestedLeave
int progress = Math.min((int) (te.getProgress() * 16000), 16000);
// Render
var model = mc.getBlockRenderer().getBlockModel(state);
//noinspection deprecation
mc.getBlockRenderer().getModelRenderer().tesselateBlock(level, model, state, te.getBlockPos(), stack, buffer.getBuffer(RenderUtil.TINTED_CUTOUT_MIPPED), false, level.random, 42L, progress);
mc.getBlockRenderer().getModelRenderer().tesselateBlock(level, model, state, te.getBlockPos(), stack, buffer.getBuffer(RenderUtil.TINTED_CUTOUT_MIPPED), false, level.random, 42L, progress, ModelData.EMPTY, null);
}
}

View File

@ -28,7 +28,8 @@ public class ModIds {
public static final String OCCULTISM = "occultism";
public static final String RAILCRAFT = "railcraft";
public static final String GREG = "gtceu";
public static final String BIG_REACTORS = "bigreactors";
public static final String BIGGER_REACTORS = "biggerreactors";
public static final String EXTREME_REACTORS = "bigreactors";
public static final String MEKANISM = "mekanism";
public static final String CREATE = "create";
public static final String ENDERIO = "enderio";

View File

@ -98,10 +98,10 @@ public class ModdedTags {
}
public static Item getDefaultUraniumOre() {
var item = defaultItem("uranium_ore", ModIds.ALL_THE_ORES, ModIds.MEKANISM);
var item = defaultItem("uranium_ore", ModIds.ALL_THE_ORES, ModIds.MEKANISM, ModIds.BIGGER_REACTORS);
if (item == Items.AIR && ModList.get().isLoaded(ModIds.BIG_REACTORS)) {
item = defaultItem("yellorite_ore", ModIds.BIG_REACTORS);
if (item == Items.AIR && ModList.get().isLoaded(ModIds.EXTREME_REACTORS)) {
item = defaultItem("yellorite_ore", ModIds.EXTREME_REACTORS);
}
return item;

View File

@ -74,6 +74,9 @@ public class ExDeorumInfoProvider implements IProbeInfoProvider {
} else if (te instanceof AbstractCrucibleBlockEntity crucible) {
info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Rate: ").style(TextStyleClass.WARNING).text(crucible.getMeltingRate() + "x"));
} else if (te instanceof SieveBlockEntity sieve) {
if (!sieve.getContents().isEmpty()) {
info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Progress: ").style(TextStyleClass.WARNING).text((100 - sieve.getProgress()) + "%"));
}
if (playerEntity.isShiftKeyDown()) {
var mesh = sieve.getMesh();
info.horizontal(info.defaultLayoutStyle().spacing(10).alignment(ElementAlignment.ALIGN_CENTER))

View File

@ -97,6 +97,7 @@ public class EConfig {
public final BooleanValue startingTorch;
public final BooleanValue startingWateringCan;
public final BooleanValue simultaneousSieveUsage;
public final BooleanValue automatedSieves;
public final DoubleValue barrelProgressStep;
public final BooleanValue witchWaterNetherrackGenerator;
public final BooleanValue setVoidWorldAsDefault;
@ -113,6 +114,9 @@ public class EConfig {
this.simultaneousSieveUsage = builder
.comment("Whether players can use multiple sieves in a 3x3 area at once.")
.define("simultaneous_sieve_usage", true);
this.automatedSieves = builder
.comment("Whether machines/fake players can interact with the Sieve.")
.define("automated_sieves", false);
this.barrelProgressStep = builder
.comment("The progress to increment by each tick for barrel composting and witch water transformation.")
.defineInRange("barrel_progress_step", 0.004, 0.0f, 1.0f);

View File

@ -19,13 +19,12 @@
package thedarkcolour.exdeorum.data;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.DataGenerator;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.data.loading.DatagenModLoader;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModLoader;
import net.minecraftforge.fml.common.Mod;
import thedarkcolour.exdeorum.ExDeorum;
import thedarkcolour.exdeorum.data.recipe.Recipes;
import thedarkcolour.modkit.data.DataHelper;
// these two annotations are equivalent to modEventBus.addListener(Data::generateData)

View File

@ -1,6 +1,5 @@
package thedarkcolour.exdeorum.data;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
@ -11,9 +10,11 @@ import thedarkcolour.exdeorum.compat.ModIds;
// registers dummy items so that data generation can reference modded items without needing those mods installed.
public class ModCompatData {
public static RegistryObject<Item> GRAINS_OF_INFINITY = null;
public static RegistryObject<Item> YELLORITE_DUST = null;
public static void registerModData() {
registerEnderIO();
registerExtremeReactors();
}
private static void registerEnderIO() {
@ -22,4 +23,11 @@ public class ModCompatData {
GRAINS_OF_INFINITY = deferredRegister.register("grains_of_infinity", () -> new Item(new Item.Properties()));
}
private static void registerExtremeReactors() {
var deferredRegister = DeferredRegister.create(ForgeRegistries.ITEMS, ModIds.BIGGER_REACTORS);
deferredRegister.register(FMLJavaModLoadingContext.get().getModEventBus());
YELLORITE_DUST = deferredRegister.register("yellorium_dust", () -> new Item(new Item.Properties()));
}
}

View File

@ -0,0 +1,457 @@
/*
* Ex Deorum
* Copyright (c) 2023 thedarkcolour
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package thedarkcolour.exdeorum.data.recipe;
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
import net.minecraft.world.level.storage.loot.providers.number.NumberProvider;
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
import net.minecraftforge.common.Tags;
import net.minecraftforge.registries.RegistryObject;
import org.apache.commons.lang3.mutable.MutableObject;
import thedarkcolour.exdeorum.ExDeorum;
import thedarkcolour.exdeorum.recipe.TagResultRecipe;
import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelCompostRecipe;
import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelMixingRecipe;
import thedarkcolour.exdeorum.recipe.crucible.FinishedCrucibleRecipe;
import thedarkcolour.exdeorum.recipe.hammer.FinishedHammerRecipe;
import thedarkcolour.exdeorum.registry.EBlocks;
import thedarkcolour.exdeorum.registry.EFluids;
import thedarkcolour.exdeorum.registry.EItems;
import thedarkcolour.exdeorum.registry.ERecipeSerializers;
import thedarkcolour.exdeorum.tag.EItemTags;
import thedarkcolour.modkit.data.MKRecipeProvider;
import java.util.function.Consumer;
import java.util.function.Supplier;
import static net.minecraft.world.level.storage.loot.providers.number.UniformGenerator.between;
import static thedarkcolour.modkit.data.MKRecipeProvider.ingredient;
import static thedarkcolour.modkit.data.MKRecipeProvider.path;
public class Recipes {
private static final Ingredient SPORES_AND_SEEDS = ingredient(EItems.GRASS_SEEDS, EItems.MYCELIUM_SPORES, EItems.WARPED_NYLIUM_SPORES, EItems.CRIMSON_NYLIUM_SPORES);
public static void addRecipes(Consumer<FinishedRecipe> writer, MKRecipeProvider recipes) {
craftingRecipes(writer, recipes);
smeltingRecipes(recipes);
SieveRecipes.sieveRecipes(writer);
crucibleRecipes(writer);
hammerRecipes(writer);
barrelCompostRecipes(writer);
barrelMixingRecipes(writer);
}
private static void craftingRecipes(Consumer<FinishedRecipe> writer, MKRecipeProvider recipes) {
// Crooks
shapedCrook(recipes, EItems.CROOK, ingredient(Tags.Items.RODS_WOODEN));
shapedCrook(recipes, EItems.BONE_CROOK, ingredient(Items.BONE));
// Hammers
shapedHammer(recipes, EItems.WOODEN_HAMMER, ingredient(ItemTags.PLANKS));
shapedHammer(recipes, EItems.STONE_HAMMER, ingredient(ItemTags.STONE_CRAFTING_MATERIALS));
shapedHammer(recipes, EItems.GOLDEN_HAMMER, ingredient(Tags.Items.INGOTS_GOLD));
shapedHammer(recipes, EItems.IRON_HAMMER, ingredient(Tags.Items.INGOTS_IRON));
shapedHammer(recipes, EItems.DIAMOND_HAMMER, ingredient(Tags.Items.GEMS_DIAMOND));
recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_HAMMER.get()), EItems.NETHERITE_HAMMER.get());
// Crucibles
uShaped(recipes, EItems.OAK_CRUCIBLE, ingredient(Items.OAK_LOG), ingredient(Items.OAK_SLAB));
uShaped(recipes, EItems.SPRUCE_CRUCIBLE, ingredient(Items.SPRUCE_LOG), ingredient(Items.SPRUCE_SLAB));
uShaped(recipes, EItems.BIRCH_CRUCIBLE, ingredient(Items.BIRCH_LOG), ingredient(Items.BIRCH_SLAB));
uShaped(recipes, EItems.JUNGLE_CRUCIBLE, ingredient(Items.JUNGLE_LOG), ingredient(Items.JUNGLE_SLAB));
uShaped(recipes, EItems.ACACIA_CRUCIBLE, ingredient(Items.ACACIA_LOG), ingredient(Items.ACACIA_SLAB));
uShaped(recipes, EItems.DARK_OAK_CRUCIBLE, ingredient(Items.DARK_OAK_LOG), ingredient(Items.DARK_OAK_SLAB));
uShaped(recipes, EItems.MANGROVE_CRUCIBLE, ingredient(Items.MANGROVE_LOG), ingredient(Items.MANGROVE_SLAB));
uShaped(recipes, EItems.CHERRY_CRUCIBLE, ingredient(Items.CHERRY_LOG), ingredient(Items.CHERRY_SLAB));
uShaped(recipes, EItems.BAMBOO_CRUCIBLE, ingredient(Items.BAMBOO_BLOCK), ingredient(Items.BAMBOO_SLAB));
uShaped(recipes, EItems.CRIMSON_CRUCIBLE, ingredient(Items.CRIMSON_STEM), ingredient(Items.CRIMSON_SLAB));
uShaped(recipes, EItems.WARPED_CRUCIBLE, ingredient(Items.WARPED_STEM), ingredient(Items.WARPED_SLAB));
uShaped(recipes, EItems.UNFIRED_PORCELAIN_CRUCIBLE, ingredient(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(EItems.PORCELAIN_CLAY_BALL.get()));
// Barrels
uShaped(recipes, EItems.OAK_BARREL, ingredient(Items.OAK_PLANKS), ingredient(Items.OAK_SLAB));
uShaped(recipes, EItems.SPRUCE_BARREL, ingredient(Items.SPRUCE_PLANKS), ingredient(Items.SPRUCE_SLAB));
uShaped(recipes, EItems.BIRCH_BARREL, ingredient(Items.BIRCH_PLANKS), ingredient(Items.BIRCH_SLAB));
uShaped(recipes, EItems.JUNGLE_BARREL, ingredient(Items.JUNGLE_PLANKS), ingredient(Items.JUNGLE_SLAB));
uShaped(recipes, EItems.ACACIA_BARREL, ingredient(Items.ACACIA_PLANKS), ingredient(Items.ACACIA_SLAB));
uShaped(recipes, EItems.DARK_OAK_BARREL, ingredient(Items.DARK_OAK_PLANKS), ingredient(Items.DARK_OAK_SLAB));
uShaped(recipes, EItems.MANGROVE_BARREL, ingredient(Items.MANGROVE_PLANKS), ingredient(Items.MANGROVE_SLAB));
uShaped(recipes, EItems.CHERRY_BARREL, ingredient(Items.CHERRY_PLANKS), ingredient(Items.CHERRY_SLAB));
uShaped(recipes, EItems.BAMBOO_BARREL, ingredient(Items.BAMBOO_PLANKS), ingredient(Items.BAMBOO_SLAB));
uShaped(recipes, EItems.CRIMSON_BARREL, ingredient(Items.CRIMSON_PLANKS), ingredient(Items.CRIMSON_SLAB));
uShaped(recipes, EItems.WARPED_BARREL, ingredient(Items.WARPED_PLANKS), ingredient(Items.WARPED_SLAB));
uShaped(recipes, EItems.STONE_BARREL, ingredient(Items.STONE), ingredient(Items.STONE_SLAB));
// Pebbles and ore chunks
recipes.grid2x2(Items.COBBLESTONE, ingredient(EItems.STONE_PEBBLE));
recipes.grid2x2(Items.ANDESITE, ingredient(EItems.ANDESITE_PEBBLE));
recipes.grid2x2(Items.DIORITE, ingredient(EItems.DIORITE_PEBBLE));
recipes.grid2x2(Items.GRANITE, ingredient(EItems.GRANITE_PEBBLE));
recipes.grid2x2(Items.COBBLED_DEEPSLATE, ingredient(EItems.DEEPSLATE_PEBBLE));
recipes.grid2x2(Items.TUFF, ingredient(EItems.TUFF_PEBBLE));
recipes.grid2x2(Items.CALCITE, ingredient(EItems.CALCITE_PEBBLE));
recipes.grid2x2(Items.BLACKSTONE, ingredient(EItems.BLACKSTONE_PEBBLE));
recipes.grid2x2(Items.BASALT, ingredient(EItems.BASALT_PEBBLE));
recipes.grid2x2(Items.IRON_ORE, ingredient(EItems.IRON_ORE_CHUNK));
recipes.grid2x2(Items.GOLD_ORE, ingredient(EItems.GOLD_ORE_CHUNK));
recipes.grid2x2(Items.COPPER_ORE, ingredient(EItems.COPPER_ORE_CHUNK));
recipes.grid2x2(Items.MOSS_BLOCK, ingredient(EItems.GRASS_SEEDS));
// Modded ores
grid2x2TagResult(writer, recipes, EItemTags.ORES_ALUMINUM, ingredient(EItems.ALUMINUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_COBALT, ingredient(EItems.COBALT_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_SILVER, ingredient(EItems.SILVER_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_LEAD, ingredient(EItems.LEAD_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_PLATINUM, ingredient(EItems.PLATINUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_NICKEL, ingredient(EItems.NICKEL_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_URANIUM, ingredient(EItems.URANIUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_OSMIUM, ingredient(EItems.OSMIUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_TIN, ingredient(EItems.TIN_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_ZINC, ingredient(EItems.ZINC_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_IRIDIUM, ingredient(EItems.IRIDIUM_ORE_CHUNK));
// Sieves
sieve(recipes, EItems.OAK_SIEVE, Items.OAK_PLANKS, Items.OAK_SLAB);
sieve(recipes, EItems.SPRUCE_SIEVE, Items.SPRUCE_PLANKS, Items.SPRUCE_SLAB);
sieve(recipes, EItems.BIRCH_SIEVE, Items.BIRCH_PLANKS, Items.BIRCH_SLAB);
sieve(recipes, EItems.JUNGLE_SIEVE, Items.JUNGLE_PLANKS, Items.JUNGLE_SLAB);
sieve(recipes, EItems.ACACIA_SIEVE, Items.ACACIA_PLANKS, Items.ACACIA_SLAB);
sieve(recipes, EItems.DARK_OAK_SIEVE, Items.DARK_OAK_PLANKS, Items.DARK_OAK_SLAB);
sieve(recipes, EItems.MANGROVE_SIEVE, Items.MANGROVE_PLANKS, Items.MANGROVE_SLAB);
sieve(recipes, EItems.CHERRY_SIEVE, Items.CHERRY_PLANKS, Items.CHERRY_SLAB);
sieve(recipes, EItems.BAMBOO_SIEVE, Items.BAMBOO_PLANKS, Items.BAMBOO_SLAB);
sieve(recipes, EItems.CRIMSON_SIEVE, Items.CRIMSON_PLANKS, Items.CRIMSON_SLAB);
sieve(recipes, EItems.WARPED_SIEVE, Items.WARPED_PLANKS, Items.WARPED_SLAB);
// Meshes
recipes.grid3x3(EItems.STRING_MESH.get(), ingredient(Tags.Items.STRING));
mesh(recipes, EItems.FLINT_MESH.get(), ingredient(Items.FLINT));
mesh(recipes, EItems.IRON_MESH.get(), ingredient(Tags.Items.INGOTS_IRON));
mesh(recipes, EItems.GOLDEN_MESH.get(), ingredient(Tags.Items.INGOTS_GOLD));
mesh(recipes, EItems.DIAMOND_MESH.get(), ingredient(Tags.Items.GEMS_DIAMOND));
recipes.netheriteUpgrade(RecipeCategory.MISC, ingredient(EItems.DIAMOND_MESH), EItems.NETHERITE_MESH.get());
// Watering cans
wateringCan(recipes, EItems.WOODEN_WATERING_CAN, ingredient(ItemTags.PLANKS));
wateringCan(recipes, EItems.STONE_WATERING_CAN, ingredient(ItemTags.STONE_TOOL_MATERIALS));
wateringCan(recipes, EItems.IRON_WATERING_CAN, ingredient(Tags.Items.INGOTS_IRON));
wateringCan(recipes, EItems.GOLDEN_WATERING_CAN, ingredient(Tags.Items.INGOTS_GOLD));
wateringCan(recipes, EItems.DIAMOND_WATERING_CAN, ingredient(Tags.Items.GEMS_DIAMOND));
recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_WATERING_CAN), EItems.NETHERITE_WATERING_CAN.get());
// misc
recipes.shapelessCrafting(RecipeCategory.MISC, new ItemStack(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(Items.CLAY_BALL), ingredient(Items.BONE_MEAL));
recipes.shapedCrafting(RecipeCategory.MISC, EItems.UNFIRED_PORCELAIN_BUCKET.get(), recipe -> {
recipe.define('#', EItems.PORCELAIN_CLAY_BALL);
recipe.pattern("# #");
recipe.pattern(" # ");
});
recipes.shapedCrafting(RecipeCategory.MISC, EItems.SCULK_CORE.get(), recipe -> {
recipe.define('#', Items.ECHO_SHARD);
recipe.define('O', Items.ENDER_PEARL);
recipe.pattern(" # ");
recipe.pattern("#O#");
recipe.pattern(" # ");
});
recipes.shapedCrafting(RecipeCategory.FOOD, EItems.END_CAKE.get(), recipe -> {
recipe.define('P', Items.ENDER_EYE);
recipe.define('S', Items.SUGAR);
recipe.define('E', Tags.Items.EGGS);
recipe.define('C', EItems.CRUSHED_END_STONE);
recipe.pattern("PPP");
recipe.pattern("SES");
recipe.pattern("CCC");
});
}
private static void grid2x2TagResult(Consumer<FinishedRecipe> writer, MKRecipeProvider recipes, TagKey<Item> resultTag, Ingredient ingredient) {
var ref = new MutableObject<FinishedRecipe>();
recipes.pushWriter(ref::setValue, newWriter -> {
recipes.shapedCrafting(resultTag.location().getPath() + "_tag", RecipeCategory.MISC, Items.AIR, recipe -> {
recipe.define('#', ingredient);
recipe.pattern("##");
recipe.pattern("##");
});
});
writer.accept(new TagResultRecipe.Finished(resultTag, ref.getValue()));
}
private static void shapedCrook(MKRecipeProvider recipes, RegistryObject<? extends Item> crook, Ingredient stick) {
recipes.shapedCrafting(RecipeCategory.TOOLS, crook.get(), recipe -> {
recipe.define('x', stick);
recipe.pattern("xx");
recipe.pattern(" x");
recipe.pattern(" x");
});
}
private static void shapedHammer(MKRecipeProvider recipes, RegistryObject<? extends Item> hammer, Ingredient material) {
recipes.shapedCrafting(RecipeCategory.TOOLS, hammer.get(), recipe -> {
recipe.define('m', material);
recipe.define('s', Tags.Items.RODS_WOODEN);
recipe.pattern(" m ");
recipe.pattern(" sm");
recipe.pattern("s ");
});
}
private static void uShaped(MKRecipeProvider recipes, RegistryObject<? extends Item> result, Ingredient sides, Ingredient middle) {
recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> {
recipe.define('s', sides);
recipe.define('m', middle);
recipe.pattern("s s");
recipe.pattern("s s");
recipe.pattern("sms");
});
}
private static void sieve(MKRecipeProvider recipes, Supplier<? extends Item> result, Item planks, Item slab) {
recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> {
recipe.define('O', planks);
recipe.define('_', slab);
recipe.define('I', Tags.Items.RODS_WOODEN);
recipe.pattern("O O");
recipe.pattern("O_O");
recipe.pattern("I I");
});
}
private static void mesh(MKRecipeProvider recipes, Item result, Ingredient ingredient) {
recipes.shapedCrafting(RecipeCategory.MISC, result, recipe -> {
recipe.define('#', ingredient);
recipe.define('S', ingredient(Tags.Items.STRING));
recipe.pattern("S#S");
recipe.pattern("#S#");
recipe.pattern("S#S");
});
}
private static void wateringCan(MKRecipeProvider recipes, Supplier<? extends Item> result, Ingredient shell) {
recipes.shapedCrafting(RecipeCategory.TOOLS, result.get(), recipe -> {
recipe.define('#', shell);
recipe.define('B', Items.BOWL);
recipe.pattern("# ");
recipe.pattern("#B#");
recipe.pattern(" # ");
});
}
private static void smeltingRecipes(MKRecipeProvider recipes) {
recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_CRUCIBLE), EItems.PORCELAIN_CRUCIBLE.get(), 0.1f);
recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_BUCKET), EItems.PORCELAIN_BUCKET.get(), 0.1f);
recipes.foodCooking(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get(), 0.1f);
}
private static void crucibleRecipes(Consumer<FinishedRecipe> writer) {
lavaCrucible(writer, "cobblestone", ingredient(Tags.Items.COBBLESTONE), 250);
lavaCrucible(writer, "stone", ingredient(Tags.Items.STONE), 250);
lavaCrucible(writer, "gravel", ingredient(Tags.Items.GRAVEL), 250);
lavaCrucible(writer, "netherrack", ingredient(Tags.Items.NETHERRACK), 500);
waterCrucible(writer, "saplings", ingredient(ItemTags.SAPLINGS), 100);
waterCrucible(writer, "leaves", ingredient(ItemTags.LEAVES), 250);
waterCrucible(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100);
waterCrucible(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 200);
waterCrucible(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100);
waterCrucible(writer, "lily_pad", ingredient(Items.LILY_PAD), 150);
waterCrucible(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 100);
waterCrucible(writer, "vine", ingredient(Items.VINE), 100);
waterCrucible(writer, "seeds_and_spores", SPORES_AND_SEEDS, 50);
waterCrucible(writer, "seeds", ingredient(Tags.Items.SEEDS), 50);
waterCrucible(writer, "grass", ingredient(Items.GRASS, Items.TALL_GRASS), 100);
waterCrucible(writer, "grass_block", ingredient(Items.GRASS_BLOCK), 150);
waterCrucible(writer, "sweet_berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 50);
waterCrucible(writer, "melon_slice", ingredient(Items.MELON_SLICE), 50);
waterCrucible(writer, "potato", ingredient(Items.POTATO), 100);
waterCrucible(writer, "carrot", ingredient(Items.CARROT), 100);
waterCrucible(writer, "beetroot", ingredient(Items.BEETROOT), 100);
waterCrucible(writer, "apple", ingredient(Items.APPLE), 100);
waterCrucible(writer, "cactus", ingredient(Items.CACTUS), 250);
waterCrucible(writer, "pumpkin", ingredient(Items.PUMPKIN), 250);
waterCrucible(writer, "melon", ingredient(Items.MELON), 250);
waterCrucible(writer, "seagrass", ingredient(Items.SEAGRASS), 100);
waterCrucible(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 200);
waterCrucible(writer, "moss", ingredient(Items.MOSS_BLOCK), 150);
waterCrucible(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100);
waterCrucible(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 150);
}
private static void lavaCrucible(Consumer<FinishedRecipe> writer, String id, Ingredient ingredient, int volume) {
writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "lava_crucible/" + id), ERecipeSerializers.LAVA_CRUCIBLE.get(), ingredient, Fluids.LAVA, volume));
}
private static void waterCrucible(Consumer<FinishedRecipe> writer, String id, Ingredient ingredient, int volume) {
writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "water_crucible/" + id), ERecipeSerializers.WATER_CRUCIBLE.get(), ingredient, Fluids.WATER, volume));
}
private static void hammerRecipes(Consumer<FinishedRecipe> writer) {
// Cobblestone -> Gravel -> Sand -> Dust
hammerRecipe(writer, "gravel", ingredient(Items.COBBLESTONE, Items.DIORITE, Items.GRANITE, Items.ANDESITE), Blocks.GRAVEL);
hammerRecipe(writer, "sand", ingredient(Items.GRAVEL), Blocks.SAND);
hammerRecipe(writer, "dust", ingredient(Items.SAND, Items.RED_SAND), EBlocks.DUST.get());
hammerRecipe(writer, "crushed_deepslate", ingredient(Blocks.DEEPSLATE, Blocks.COBBLED_DEEPSLATE), EBlocks.CRUSHED_DEEPSLATE.get());
hammerRecipe(writer, "crushed_netherrack", ingredient(Blocks.NETHERRACK), EBlocks.CRUSHED_NETHERRACK.get());
hammerRecipe(writer, "crushed_blackstone", ingredient(Blocks.BLACKSTONE), EBlocks.CRUSHED_BLACKSTONE.get());
hammerRecipe(writer, "crushed_end_stone", ingredient(Blocks.END_STONE), EBlocks.CRUSHED_END_STONE.get());
hammerRecipe(writer, "red_sand", ingredient(EBlocks.CRUSHED_NETHERRACK), Blocks.RED_SAND);
hammerRecipe(writer, "crushing_sandstone", ingredient(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), Items.SAND);
hammerRecipe(writer, "crushing_red_sandstone", ingredient(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), Items.RED_SAND);
hammerRecipe(writer, "crushing_stone_bricks", ingredient(Items.STONE_BRICKS), Items.CRACKED_STONE_BRICKS);
hammerRecipe(writer, "stone_pebbles", ingredient(Items.STONE, Items.STONE_BRICKS, Items.CHISELED_STONE_BRICKS, Items.CRACKED_STONE_BRICKS), EItems.STONE_PEBBLE.get(), new UniformGenerator(ConstantValue.exactly(1), ConstantValue.exactly(6)));
hammerRecipe(writer, "basalt", ingredient(Items.POLISHED_BASALT, Items.SMOOTH_BASALT), Items.BASALT);
hammerRecipe(writer, "tube_coral", ingredient(Items.TUBE_CORAL_BLOCK), Items.TUBE_CORAL);
hammerRecipe(writer, "brain_coral", ingredient(Items.BRAIN_CORAL_BLOCK), Items.BRAIN_CORAL);
hammerRecipe(writer, "bubble_coral", ingredient(Items.BUBBLE_CORAL_BLOCK), Items.BUBBLE_CORAL);
hammerRecipe(writer, "fire_coral", ingredient(Items.FIRE_CORAL_BLOCK), Items.FIRE_CORAL);
hammerRecipe(writer, "horn_coral", ingredient(Items.HORN_CORAL_BLOCK), Items.HORN_CORAL);
hammerRecipe(writer, "tube_coral_fan", ingredient(Items.TUBE_CORAL), Items.TUBE_CORAL_FAN);
hammerRecipe(writer, "brain_coral_fan", ingredient(Items.BRAIN_CORAL), Items.BRAIN_CORAL_FAN);
hammerRecipe(writer, "bubble_coral_fan", ingredient(Items.BUBBLE_CORAL), Items.BUBBLE_CORAL_FAN);
hammerRecipe(writer, "fire_coral_fan", ingredient(Items.FIRE_CORAL), Items.FIRE_CORAL_FAN);
hammerRecipe(writer, "horn_coral_fan", ingredient(Items.HORN_CORAL), Items.HORN_CORAL_FAN);
hammerRecipe(writer, "prismarine", ingredient(Items.PRISMARINE, Items.PRISMARINE_BRICKS, Items.DARK_PRISMARINE), Items.PRISMARINE_SHARD, between(1, 4));
}
private static void hammerRecipe(Consumer<FinishedRecipe> writer, String name, Ingredient block, ItemLike result) {
hammerRecipe(writer, name, block, result, ConstantValue.exactly(1f));
}
private static void hammerRecipe(Consumer<FinishedRecipe> writer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) {
writer.accept(new FinishedHammerRecipe(new ResourceLocation(ExDeorum.ID, "hammer/" + name), block, result.asItem(), resultAmount));
}
private static void barrelCompostRecipes(Consumer<FinishedRecipe> writer) {
// plants
barrelCompost(writer, "saplings", ingredient(ItemTags.SAPLINGS), 125);
barrelCompost(writer, "leaves", ingredient(ItemTags.LEAVES), 125);
barrelCompost(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100);
barrelCompost(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 150);
barrelCompost(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100);
barrelCompost(writer, "lily_pad", ingredient(Items.LILY_PAD), 100);
barrelCompost(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 80);
barrelCompost(writer, "vine", ingredient(Items.VINE), 100);
barrelCompost(writer, "grass", ingredient(Items.GRASS, Items.FERN), 100);
barrelCompost(writer, "tall_grass", ingredient(Items.TALL_GRASS, Items.LARGE_FERN), 150);
barrelCompost(writer, "seagrass", ingredient(Items.SEAGRASS), 80);
barrelCompost(writer, "nether_wart", ingredient(Items.NETHER_WART), 100);
barrelCompost(writer, "seeds", ingredient(Tags.Items.SEEDS), 80);
barrelCompost(writer, "wheat", ingredient(Tags.Items.CROPS_WHEAT), 80);
barrelCompost(writer, "berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 80);
barrelCompost(writer, "melon", ingredient(Items.MELON), 200);
barrelCompost(writer, "cake", ingredient(Items.CAKE), 500);
barrelCompost(writer, "pumpkin", ingredient(Items.PUMPKIN), 500);
barrelCompost(writer, "carrots", ingredient(Items.CARROT), 100);
barrelCompost(writer, "potatoes", ingredient(Items.POTATO, Items.BAKED_POTATO, Items.POISONOUS_POTATO), 80);
barrelCompost(writer, "beetroot", ingredient(Items.BEETROOT), 80);
barrelCompost(writer, "moss_block", ingredient(Items.MOSS_BLOCK), 150);
barrelCompost(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100);
barrelCompost(writer, "spores_and_seeds", SPORES_AND_SEEDS, 80);
barrelCompost(writer, "bamboo", ingredient(Items.BAMBOO), 100);
barrelCompost(writer, "cactus", ingredient(Items.CACTUS), 125);
barrelCompost(writer, "dead_bush", ingredient(Items.DEAD_BUSH), 80);
barrelCompost(writer, "chorus_flower", ingredient(Items.CHORUS_FLOWER), 150);
barrelCompost(writer, "chorus_fruit", ingredient(Items.CHORUS_FRUIT), 80);
barrelCompost(writer, "chorus_plant", ingredient(Items.CHORUS_PLANT), 150);
barrelCompost(writer, "kelp", ingredient(Items.KELP, Items.DRIED_KELP), 80);
barrelCompost(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 80);
barrelCompost(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 125);
barrelCompost(writer, "weeping_vines", ingredient(Items.WEEPING_VINES), 100);
barrelCompost(writer, "twisting_vines", ingredient(Items.TWISTING_VINES), 100);
// flesh
barrelCompost(writer, "rotten_flesh", ingredient(Items.ROTTEN_FLESH), 100);
barrelCompost(writer, "spider_eye", ingredient(Items.SPIDER_EYE), 80);
barrelCompost(writer, "fermented_spider_eye", ingredient(Items.FERMENTED_SPIDER_EYE), 100);
barrelCompost(writer, "string", ingredient(Items.STRING), 40);
barrelCompost(writer, "rabbit_foot", ingredient(Items.RABBIT_FOOT), 100);
// meats
barrelCompost(writer, "pork", ingredient(Items.PORKCHOP, Items.COOKED_PORKCHOP), 150);
barrelCompost(writer, "beef", ingredient(Items.BEEF, Items.COOKED_BEEF), 150);
barrelCompost(writer, "chicken", ingredient(Items.CHICKEN, Items.COOKED_CHICKEN), 125);
barrelCompost(writer, "mutton", ingredient(Items.MUTTON, Items.COOKED_MUTTON), 125);
barrelCompost(writer, "salmon", ingredient(Items.SALMON, Items.COOKED_SALMON), 125);
barrelCompost(writer, "rabbit", ingredient(Items.RABBIT, Items.COOKED_RABBIT), 100);
barrelCompost(writer, "cod", ingredient(Items.COD, Items.COOKED_COD), 100);
barrelCompost(writer, "tropical_fish", ingredient(Items.TROPICAL_FISH), 80);
barrelCompost(writer, "pufferfish", ingredient(Items.PUFFERFISH), 80);
barrelCompost(writer, "egg", ingredient(Items.EGG), 100);
// foods
barrelCompost(writer, "melon_slice", ingredient(Items.MELON_SLICE), 40);
barrelCompost(writer, "silk_worms", ingredient(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get()), 40);
barrelCompost(writer, "apple", ingredient(Items.APPLE), 100);
barrelCompost(writer, "cookie", ingredient(Items.COOKIE), 100);
barrelCompost(writer, "pumpkin_pie", ingredient(Items.PUMPKIN_PIE), 150);
barrelCompost(writer, "bread", ingredient(Items.BREAD), 125);
barrelCompost(writer, "mushroom_stew", ingredient(Items.MUSHROOM_STEW), 200);
barrelCompost(writer, "suspicious_stew", ingredient(Items.SUSPICIOUS_STEW), 200);
barrelCompost(writer, "beetroot_soup", ingredient(Items.BEETROOT_SOUP), 150);
barrelCompost(writer, "rabbit_stew", ingredient(Items.RABBIT_STEW), 200);
// lol
barrelCompost(writer, "golden_apples", ingredient(Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE), 1000);
}
private static void barrelCompost(Consumer<FinishedRecipe> writer, String id, Ingredient ingredient, int volume) {
writer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExDeorum.ID, "barrel_compost/" + id), ingredient, volume));
}
private static void barrelMixingRecipes(Consumer<FinishedRecipe> writer) {
// water
barrelMixing(writer, ingredient(EItems.DUST.get()), Fluids.WATER, Items.CLAY);
barrelMixing(writer, ingredient(Items.MILK_BUCKET), Fluids.WATER, Items.SLIME_BLOCK);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_MILK_BUCKET.get()), Fluids.WATER, Items.SLIME_BLOCK);
barrelMixing(writer, ingredient(Items.SNOWBALL), Fluids.WATER, Items.ICE);
barrelMixing(writer, ingredient(Items.LAVA_BUCKET), Fluids.WATER, Items.STONE);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_LAVA_BUCKET), Fluids.WATER, Items.STONE);
// lava
barrelMixing(writer, ingredient(EItems.WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK);
barrelMixing(writer, ingredient(Items.GLOWSTONE_DUST), Fluids.LAVA, Items.END_STONE);
barrelMixing(writer, ingredient(Items.WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN);
barrelMixing(writer, ingredient(Items.SLIME_BALL), Fluids.LAVA, Items.MAGMA_CREAM);
barrelMixing(writer, ingredient(Items.SOUL_SAND), Fluids.LAVA, Items.SOUL_SOIL);
// witch water
barrelMixing(writer, ingredient(Items.SAND), EFluids.WITCH_WATER.get(), Items.SOUL_SAND);
}
private static void barrelMixing(Consumer<FinishedRecipe> writer, Ingredient ingredient, Fluid fluidType, Item result) {
writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result)), ingredient, fluidType, 1000, result));
}
private static void barrelMixing(Consumer<FinishedRecipe> writer, String suffix, Ingredient ingredient, Fluid fluidType, Item result) {
writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result) + suffix), ingredient, fluidType, 1000, result));
}
}

View File

@ -1,61 +1,25 @@
/*
* Ex Deorum
* Copyright (c) 2023 thedarkcolour
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package thedarkcolour.exdeorum.data;
package thedarkcolour.exdeorum.data.recipe;
import com.mojang.datafixers.util.Either;
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.ItemTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Fluids;
import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator;
import net.minecraft.world.level.storage.loot.providers.number.ConstantValue;
import net.minecraft.world.level.storage.loot.providers.number.NumberProvider;
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
import net.minecraftforge.common.Tags;
import net.minecraftforge.common.crafting.ConditionalRecipe;
import net.minecraftforge.common.crafting.conditions.ICondition;
import net.minecraftforge.common.crafting.conditions.ModLoadedCondition;
import net.minecraftforge.common.crafting.conditions.NotCondition;
import net.minecraftforge.common.crafting.conditions.TagEmptyCondition;
import net.minecraftforge.registries.RegistryObject;
import org.apache.commons.lang3.mutable.MutableObject;
import thedarkcolour.exdeorum.ExDeorum;
import thedarkcolour.exdeorum.compat.ModIds;
import thedarkcolour.exdeorum.recipe.TagResultRecipe;
import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelCompostRecipe;
import thedarkcolour.exdeorum.recipe.barrel.FinishedBarrelMixingRecipe;
import thedarkcolour.exdeorum.recipe.crucible.FinishedCrucibleRecipe;
import thedarkcolour.exdeorum.recipe.hammer.FinishedHammerRecipe;
import thedarkcolour.exdeorum.data.ModCompatData;
import thedarkcolour.exdeorum.recipe.sieve.FinishedSieveRecipe;
import thedarkcolour.exdeorum.registry.EBlocks;
import thedarkcolour.exdeorum.registry.EFluids;
import thedarkcolour.exdeorum.registry.EItems;
import thedarkcolour.exdeorum.registry.ERecipeSerializers;
import thedarkcolour.exdeorum.tag.EItemTags;
import thedarkcolour.modkit.data.MKRecipeProvider;
@ -65,225 +29,11 @@ import java.util.function.Consumer;
import java.util.function.Supplier;
import static net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator.binomial;
import static net.minecraft.world.level.storage.loot.providers.number.UniformGenerator.between;
import static thedarkcolour.modkit.data.MKRecipeProvider.ingredient;
import static thedarkcolour.modkit.data.MKRecipeProvider.path;
class Recipes {
private static final Ingredient SPORES_AND_SEEDS = ingredient(EItems.GRASS_SEEDS, EItems.MYCELIUM_SPORES, EItems.WARPED_NYLIUM_SPORES, EItems.CRIMSON_NYLIUM_SPORES);
public static void addRecipes(Consumer<FinishedRecipe> writer, MKRecipeProvider recipes) {
craftingRecipes(writer, recipes);
smeltingRecipes(recipes);
sieveRecipes(writer);
crucibleRecipes(writer);
hammerRecipes(writer);
barrelCompostRecipes(writer);
barrelMixingRecipes(writer);
}
private static void craftingRecipes(Consumer<FinishedRecipe> writer, MKRecipeProvider recipes) {
// Crooks
shapedCrook(recipes, EItems.CROOK, ingredient(Tags.Items.RODS_WOODEN));
shapedCrook(recipes, EItems.BONE_CROOK, ingredient(Items.BONE));
// Hammers
shapedHammer(recipes, EItems.WOODEN_HAMMER, ingredient(ItemTags.PLANKS));
shapedHammer(recipes, EItems.STONE_HAMMER, ingredient(ItemTags.STONE_CRAFTING_MATERIALS));
shapedHammer(recipes, EItems.GOLDEN_HAMMER, ingredient(Tags.Items.INGOTS_GOLD));
shapedHammer(recipes, EItems.IRON_HAMMER, ingredient(Tags.Items.INGOTS_IRON));
shapedHammer(recipes, EItems.DIAMOND_HAMMER, ingredient(Tags.Items.GEMS_DIAMOND));
recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_HAMMER.get()), EItems.NETHERITE_HAMMER.get());
// Crucibles
uShaped(recipes, EItems.OAK_CRUCIBLE, ingredient(Items.OAK_LOG), ingredient(Items.OAK_SLAB));
uShaped(recipes, EItems.SPRUCE_CRUCIBLE, ingredient(Items.SPRUCE_LOG), ingredient(Items.SPRUCE_SLAB));
uShaped(recipes, EItems.BIRCH_CRUCIBLE, ingredient(Items.BIRCH_LOG), ingredient(Items.BIRCH_SLAB));
uShaped(recipes, EItems.JUNGLE_CRUCIBLE, ingredient(Items.JUNGLE_LOG), ingredient(Items.JUNGLE_SLAB));
uShaped(recipes, EItems.ACACIA_CRUCIBLE, ingredient(Items.ACACIA_LOG), ingredient(Items.ACACIA_SLAB));
uShaped(recipes, EItems.DARK_OAK_CRUCIBLE, ingredient(Items.DARK_OAK_LOG), ingredient(Items.DARK_OAK_SLAB));
uShaped(recipes, EItems.MANGROVE_CRUCIBLE, ingredient(Items.MANGROVE_LOG), ingredient(Items.MANGROVE_SLAB));
uShaped(recipes, EItems.CHERRY_CRUCIBLE, ingredient(Items.CHERRY_LOG), ingredient(Items.CHERRY_SLAB));
uShaped(recipes, EItems.BAMBOO_CRUCIBLE, ingredient(Items.BAMBOO_BLOCK), ingredient(Items.BAMBOO_SLAB));
uShaped(recipes, EItems.CRIMSON_CRUCIBLE, ingredient(Items.CRIMSON_STEM), ingredient(Items.CRIMSON_SLAB));
uShaped(recipes, EItems.WARPED_CRUCIBLE, ingredient(Items.WARPED_STEM), ingredient(Items.WARPED_SLAB));
uShaped(recipes, EItems.UNFIRED_PORCELAIN_CRUCIBLE, ingredient(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(EItems.PORCELAIN_CLAY_BALL.get()));
// Barrels
uShaped(recipes, EItems.OAK_BARREL, ingredient(Items.OAK_PLANKS), ingredient(Items.OAK_SLAB));
uShaped(recipes, EItems.SPRUCE_BARREL, ingredient(Items.SPRUCE_PLANKS), ingredient(Items.SPRUCE_SLAB));
uShaped(recipes, EItems.BIRCH_BARREL, ingredient(Items.BIRCH_PLANKS), ingredient(Items.BIRCH_SLAB));
uShaped(recipes, EItems.JUNGLE_BARREL, ingredient(Items.JUNGLE_PLANKS), ingredient(Items.JUNGLE_SLAB));
uShaped(recipes, EItems.ACACIA_BARREL, ingredient(Items.ACACIA_PLANKS), ingredient(Items.ACACIA_SLAB));
uShaped(recipes, EItems.DARK_OAK_BARREL, ingredient(Items.DARK_OAK_PLANKS), ingredient(Items.DARK_OAK_SLAB));
uShaped(recipes, EItems.MANGROVE_BARREL, ingredient(Items.MANGROVE_PLANKS), ingredient(Items.MANGROVE_SLAB));
uShaped(recipes, EItems.CHERRY_BARREL, ingredient(Items.CHERRY_PLANKS), ingredient(Items.CHERRY_SLAB));
uShaped(recipes, EItems.BAMBOO_BARREL, ingredient(Items.BAMBOO_PLANKS), ingredient(Items.BAMBOO_SLAB));
uShaped(recipes, EItems.CRIMSON_BARREL, ingredient(Items.CRIMSON_PLANKS), ingredient(Items.CRIMSON_SLAB));
uShaped(recipes, EItems.WARPED_BARREL, ingredient(Items.WARPED_PLANKS), ingredient(Items.WARPED_SLAB));
uShaped(recipes, EItems.STONE_BARREL, ingredient(Items.STONE), ingredient(Items.STONE_SLAB));
// Pebbles and ore chunks
recipes.grid2x2(Items.COBBLESTONE, ingredient(EItems.STONE_PEBBLE));
recipes.grid2x2(Items.ANDESITE, ingredient(EItems.ANDESITE_PEBBLE));
recipes.grid2x2(Items.DIORITE, ingredient(EItems.DIORITE_PEBBLE));
recipes.grid2x2(Items.GRANITE, ingredient(EItems.GRANITE_PEBBLE));
recipes.grid2x2(Items.COBBLED_DEEPSLATE, ingredient(EItems.DEEPSLATE_PEBBLE));
recipes.grid2x2(Items.TUFF, ingredient(EItems.TUFF_PEBBLE));
recipes.grid2x2(Items.CALCITE, ingredient(EItems.CALCITE_PEBBLE));
recipes.grid2x2(Items.BLACKSTONE, ingredient(EItems.BLACKSTONE_PEBBLE));
recipes.grid2x2(Items.BASALT, ingredient(EItems.BASALT_PEBBLE));
recipes.grid2x2(Items.IRON_ORE, ingredient(EItems.IRON_ORE_CHUNK));
recipes.grid2x2(Items.GOLD_ORE, ingredient(EItems.GOLD_ORE_CHUNK));
recipes.grid2x2(Items.COPPER_ORE, ingredient(EItems.COPPER_ORE_CHUNK));
recipes.grid2x2(Items.MOSS_BLOCK, ingredient(EItems.GRASS_SEEDS));
// Modded ores
grid2x2TagResult(writer, recipes, EItemTags.ORES_ALUMINUM, ingredient(EItems.ALUMINUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_COBALT, ingredient(EItems.COBALT_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_SILVER, ingredient(EItems.SILVER_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_LEAD, ingredient(EItems.LEAD_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_PLATINUM, ingredient(EItems.PLATINUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_NICKEL, ingredient(EItems.NICKEL_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_URANIUM, ingredient(EItems.URANIUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_OSMIUM, ingredient(EItems.OSMIUM_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_TIN, ingredient(EItems.TIN_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_ZINC, ingredient(EItems.ZINC_ORE_CHUNK));
grid2x2TagResult(writer, recipes, EItemTags.ORES_IRIDIUM, ingredient(EItems.IRIDIUM_ORE_CHUNK));
// Sieves
sieve(recipes, EItems.OAK_SIEVE, Items.OAK_PLANKS, Items.OAK_SLAB);
sieve(recipes, EItems.SPRUCE_SIEVE, Items.SPRUCE_PLANKS, Items.SPRUCE_SLAB);
sieve(recipes, EItems.BIRCH_SIEVE, Items.BIRCH_PLANKS, Items.BIRCH_SLAB);
sieve(recipes, EItems.JUNGLE_SIEVE, Items.JUNGLE_PLANKS, Items.JUNGLE_SLAB);
sieve(recipes, EItems.ACACIA_SIEVE, Items.ACACIA_PLANKS, Items.ACACIA_SLAB);
sieve(recipes, EItems.DARK_OAK_SIEVE, Items.DARK_OAK_PLANKS, Items.DARK_OAK_SLAB);
sieve(recipes, EItems.MANGROVE_SIEVE, Items.MANGROVE_PLANKS, Items.MANGROVE_SLAB);
sieve(recipes, EItems.CHERRY_SIEVE, Items.CHERRY_PLANKS, Items.CHERRY_SLAB);
sieve(recipes, EItems.BAMBOO_SIEVE, Items.BAMBOO_PLANKS, Items.BAMBOO_SLAB);
sieve(recipes, EItems.CRIMSON_SIEVE, Items.CRIMSON_PLANKS, Items.CRIMSON_SLAB);
sieve(recipes, EItems.WARPED_SIEVE, Items.WARPED_PLANKS, Items.WARPED_SLAB);
// Meshes
recipes.grid3x3(EItems.STRING_MESH.get(), ingredient(Tags.Items.STRING));
mesh(recipes, EItems.FLINT_MESH.get(), ingredient(Items.FLINT));
mesh(recipes, EItems.IRON_MESH.get(), ingredient(Tags.Items.INGOTS_IRON));
mesh(recipes, EItems.GOLDEN_MESH.get(), ingredient(Tags.Items.INGOTS_GOLD));
mesh(recipes, EItems.DIAMOND_MESH.get(), ingredient(Tags.Items.GEMS_DIAMOND));
recipes.netheriteUpgrade(RecipeCategory.MISC, ingredient(EItems.DIAMOND_MESH), EItems.NETHERITE_MESH.get());
// Watering cans
wateringCan(recipes, EItems.WOODEN_WATERING_CAN, ingredient(ItemTags.PLANKS));
wateringCan(recipes, EItems.STONE_WATERING_CAN, ingredient(ItemTags.STONE_TOOL_MATERIALS));
wateringCan(recipes, EItems.IRON_WATERING_CAN, ingredient(Tags.Items.INGOTS_IRON));
wateringCan(recipes, EItems.GOLDEN_WATERING_CAN, ingredient(Tags.Items.INGOTS_GOLD));
wateringCan(recipes, EItems.DIAMOND_WATERING_CAN, ingredient(Tags.Items.GEMS_DIAMOND));
recipes.netheriteUpgrade(RecipeCategory.TOOLS, ingredient(EItems.DIAMOND_WATERING_CAN), EItems.NETHERITE_WATERING_CAN.get());
// misc
recipes.shapelessCrafting(RecipeCategory.MISC, new ItemStack(EItems.PORCELAIN_CLAY_BALL.get()), ingredient(Items.CLAY_BALL), ingredient(Items.BONE_MEAL));
recipes.shapedCrafting(RecipeCategory.MISC, EItems.UNFIRED_PORCELAIN_BUCKET.get(), recipe -> {
recipe.define('#', EItems.PORCELAIN_CLAY_BALL);
recipe.pattern("# #");
recipe.pattern(" # ");
});
recipes.shapedCrafting(RecipeCategory.MISC, EItems.SCULK_CORE.get(), recipe -> {
recipe.define('#', Items.ECHO_SHARD);
recipe.define('O', Items.ENDER_PEARL);
recipe.pattern(" # ");
recipe.pattern("#O#");
recipe.pattern(" # ");
});
recipes.shapedCrafting(RecipeCategory.FOOD, EItems.END_CAKE.get(), recipe -> {
recipe.define('P', Items.ENDER_EYE);
recipe.define('S', Items.SUGAR);
recipe.define('E', Tags.Items.EGGS);
recipe.define('C', EItems.CRUSHED_END_STONE);
recipe.pattern("PPP");
recipe.pattern("SES");
recipe.pattern("CCC");
});
}
private static void grid2x2TagResult(Consumer<FinishedRecipe> writer, MKRecipeProvider recipes, TagKey<Item> resultTag, Ingredient ingredient) {
var ref = new MutableObject<FinishedRecipe>();
recipes.pushWriter(ref::setValue, newWriter -> {
recipes.shapedCrafting(resultTag.location().getPath() + "_tag", RecipeCategory.MISC, Items.AIR, recipe -> {
recipe.define('#', ingredient);
recipe.pattern("##");
recipe.pattern("##");
});
});
writer.accept(new TagResultRecipe.Finished(resultTag, ref.getValue()));
}
private static void shapedCrook(MKRecipeProvider recipes, RegistryObject<? extends Item> crook, Ingredient stick) {
recipes.shapedCrafting(RecipeCategory.TOOLS, crook.get(), recipe -> {
recipe.define('x', stick);
recipe.pattern("xx");
recipe.pattern(" x");
recipe.pattern(" x");
});
}
private static void shapedHammer(MKRecipeProvider recipes, RegistryObject<? extends Item> hammer, Ingredient material) {
recipes.shapedCrafting(RecipeCategory.TOOLS, hammer.get(), recipe -> {
recipe.define('m', material);
recipe.define('s', Tags.Items.RODS_WOODEN);
recipe.pattern(" m ");
recipe.pattern(" sm");
recipe.pattern("s ");
});
}
private static void uShaped(MKRecipeProvider recipes, RegistryObject<? extends Item> result, Ingredient sides, Ingredient middle) {
recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> {
recipe.define('s', sides);
recipe.define('m', middle);
recipe.pattern("s s");
recipe.pattern("s s");
recipe.pattern("sms");
});
}
private static void sieve(MKRecipeProvider recipes, Supplier<? extends Item> result, Item planks, Item slab) {
recipes.shapedCrafting(RecipeCategory.MISC, result.get(), recipe -> {
recipe.define('O', planks);
recipe.define('_', slab);
recipe.define('I', Tags.Items.RODS_WOODEN);
recipe.pattern("O O");
recipe.pattern("O_O");
recipe.pattern("I I");
});
}
private static void mesh(MKRecipeProvider recipes, Item result, Ingredient ingredient) {
recipes.shapedCrafting(RecipeCategory.MISC, result, recipe -> {
recipe.define('#', ingredient);
recipe.define('S', ingredient(Tags.Items.STRING));
recipe.pattern("S#S");
recipe.pattern("#S#");
recipe.pattern("S#S");
});
}
private static void wateringCan(MKRecipeProvider recipes, Supplier<? extends Item> result, Ingredient shell) {
recipes.shapedCrafting(RecipeCategory.TOOLS, result.get(), recipe -> {
recipe.define('#', shell);
recipe.define('B', Items.BOWL);
recipe.pattern("# ");
recipe.pattern("#B#");
recipe.pattern(" # ");
});
}
private static void smeltingRecipes(MKRecipeProvider recipes) {
recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_CRUCIBLE), EItems.PORCELAIN_CRUCIBLE.get(), 0.1f);
recipes.smelting(ingredient(EItems.UNFIRED_PORCELAIN_BUCKET), EItems.PORCELAIN_BUCKET.get(), 0.1f);
recipes.foodCooking(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get(), 0.1f);
}
private static void sieveRecipes(Consumer<FinishedRecipe> writer) {
class SieveRecipes {
static void sieveRecipes(Consumer<FinishedRecipe> writer) {
var allMeshes = List.of(EItems.STRING_MESH, EItems.FLINT_MESH, EItems.IRON_MESH, EItems.GOLDEN_MESH, EItems.DIAMOND_MESH, EItems.NETHERITE_MESH);
// Dirt -> String mesh
@ -610,6 +360,49 @@ class Recipes {
addDrop.accept(Items.PRISMARINE_CRYSTALS, chance(0.12f));
});
// Red Sand -> String mesh
forMesh(writer, ingredient(Items.RED_SAND), EItems.STRING_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.CACTUS, chance(0.12f));
addDrop.accept(Items.DEAD_BUSH, chance(0.07f));
addDrop.accept(Items.GOLD_NUGGET, chance(0.09f));
addDrop.accept(Items.REDSTONE, chance(0.08f));
addDrop.accept(Items.RAW_GOLD, chance(0.03f));
});
forMesh(writer, ingredient(Items.RED_SAND), EItems.FLINT_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.CACTUS, chance(0.12f));
addDrop.accept(Items.DEAD_BUSH, chance(0.07f));
addDrop.accept(Items.GOLD_NUGGET, chance(0.12f));
addDrop.accept(Items.REDSTONE, chance(0.09f));
addDrop.accept(Items.RAW_GOLD, chance(0.04f));
});
forMesh(writer, ingredient(Items.RED_SAND), EItems.IRON_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.CACTUS, chance(0.12f));
addDrop.accept(Items.DEAD_BUSH, chance(0.07f));
addDrop.accept(Items.GOLD_NUGGET, chance(0.09f));
addDrop.accept(Items.REDSTONE, chance(0.11f));
addDrop.accept(Items.RAW_GOLD, chance(0.06f));
});
forMesh(writer, ingredient(Items.RED_SAND), EItems.GOLDEN_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.CACTUS, chance(0.12f));
addDrop.accept(Items.DEAD_BUSH, chance(0.07f));
addDrop.accept(Items.GOLD_NUGGET, chance(0.19f));
addDrop.accept(Items.REDSTONE, chance(0.07f));
addDrop.accept(Items.RAW_GOLD, chance(0.11f));
});
forMesh(writer, ingredient(Items.RED_SAND), EItems.DIAMOND_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.CACTUS, chance(0.10f));
addDrop.accept(Items.DEAD_BUSH, chance(0.03f));
addDrop.accept(Items.GOLD_NUGGET, chance(0.14f));
addDrop.accept(Items.REDSTONE, chance(0.14f));
addDrop.accept(Items.RAW_GOLD, chance(0.08f));
});
forMesh(writer, ingredient(Items.RED_SAND), EItems.NETHERITE_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.CACTUS, chance(0.12f));
addDrop.accept(Items.GOLD_NUGGET, chance(0.15f));
addDrop.accept(Items.REDSTONE, chance(0.17f));
addDrop.accept(Items.RAW_GOLD, chance(0.10f));
});
forMesh(writer, ingredient(EItems.DUST.get()), EItems.STRING_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.GUNPOWDER, chance(0.1f));
addDrop.accept(Items.BONE_MEAL, chance(0.1f));
@ -618,6 +411,7 @@ class Recipes {
addDrop.accept(Items.BLAZE_POWDER, chance(0.03f));
addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.06f), modInstalled(ModIds.ENDERIO));
addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.05f), modInstalled(ModIds.EXTREME_REACTORS));
});
forMesh(writer, ingredient(EItems.DUST.get()), EItems.FLINT_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.GUNPOWDER, chance(0.11f));
@ -627,6 +421,7 @@ class Recipes {
addDrop.accept(Items.BLAZE_POWDER, chance(0.04f));
addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.07f), modInstalled(ModIds.ENDERIO));
addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.055f), modInstalled(ModIds.EXTREME_REACTORS));
});
forMesh(writer, ingredient(EItems.DUST.get()), EItems.IRON_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.GUNPOWDER, chance(0.13f));
@ -637,6 +432,7 @@ class Recipes {
addDrop.accept(Items.IRON_NUGGET, chance(0.06f));
addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.09f), modInstalled(ModIds.ENDERIO));
addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.08f), modInstalled(ModIds.EXTREME_REACTORS));
});
forMesh(writer, ingredient(EItems.DUST.get()), EItems.GOLDEN_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.GUNPOWDER, chance(0.13f));
@ -648,6 +444,7 @@ class Recipes {
addDrop.accept(Items.RAW_GOLD, chance(0.02f));
addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.11f), modInstalled(ModIds.ENDERIO));
addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.10f), modInstalled(ModIds.EXTREME_REACTORS));
});
forMesh(writer, ingredient(EItems.DUST.get()), EItems.DIAMOND_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.GUNPOWDER, chance(0.14f));
@ -658,6 +455,7 @@ class Recipes {
addDrop.accept(Items.GOLD_NUGGET, chance(0.08f));
addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.12f), modInstalled(ModIds.ENDERIO));
addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.12f), modInstalled(ModIds.EXTREME_REACTORS));
});
forMesh(writer, ingredient(EItems.DUST.get()), EItems.NETHERITE_MESH, (addDrop, addTagDrop, addConditionalDrop) -> {
addDrop.accept(Items.GUNPOWDER, chance(0.14f));
@ -669,6 +467,7 @@ class Recipes {
addDrop.accept(Items.IRON_NUGGET, chance(0.08f));
addConditionalDrop.accept(ModCompatData.GRAINS_OF_INFINITY.get(), chance(0.135f), modInstalled(ModIds.ENDERIO));
addConditionalDrop.accept(ModCompatData.YELLORITE_DUST.get(), chance(0.14f), modInstalled(ModIds.EXTREME_REACTORS));
});
// Crushed Deepslate -> String mesh
@ -1031,10 +830,18 @@ class Recipes {
return binomial(1, p);
}
private static ICondition tagNotEmpty(TagKey<Item> tag) {
return new NotCondition(new TagEmptyCondition(tag.location()));
}
private static ICondition modInstalled(String modid) {
return new ModLoadedCondition(modid);
}
private static void forMesh(Consumer<FinishedRecipe> writer, Ingredient block, RegistryObject<? extends Item> mesh, ForMeshContext addDrops) {
var folder = mesh.getId().getPath().replace("_mesh", "/");
var basePath = path(block.getItems()[0].getItem()) + "/" + folder;
addDrops.accept(
(result, resultAmount) -> sieveRecipe(writer, basePath + path(result), block, mesh, result, resultAmount),
(resultTag, resultAmount) -> sieveRecipeTag(writer, basePath + resultTag.location().getPath().concat("_tag"), block, mesh, resultTag, resultAmount),
@ -1066,7 +873,7 @@ class Recipes {
private static void sieveRecipeTag(Consumer<FinishedRecipe> writer, String name, Ingredient block, Supplier<? extends Item> mesh, TagKey<Item> result, NumberProvider resultAmount) {
writer.accept(new FinishedSieveRecipe(new ResourceLocation(ExDeorum.ID, "sieve/" + name), mesh.get(), block, Either.right(result), resultAmount));
}
private static void sieveConditional(Consumer<FinishedRecipe> writer, String name, Ingredient block, Supplier<? extends Item> mesh, Either<Item, TagKey<Item>> result, NumberProvider resultAmount, ICondition condition) {
var path = new ResourceLocation(ExDeorum.ID, "sieve/" + name);
ConditionalRecipe.builder()
@ -1074,197 +881,4 @@ class Recipes {
.addRecipe(new FinishedSieveRecipe(path, mesh.get(), block, result, resultAmount))
.build(writer, path);
}
private static void crucibleRecipes(Consumer<FinishedRecipe> writer) {
lavaCrucible(writer, "cobblestone", ingredient(Tags.Items.COBBLESTONE), 250);
lavaCrucible(writer, "stone", ingredient(Tags.Items.STONE), 250);
lavaCrucible(writer, "gravel", ingredient(Tags.Items.GRAVEL), 250);
lavaCrucible(writer, "netherrack", ingredient(Tags.Items.NETHERRACK), 500);
waterCrucible(writer, "saplings", ingredient(ItemTags.SAPLINGS), 100);
waterCrucible(writer, "leaves", ingredient(ItemTags.LEAVES), 250);
waterCrucible(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100);
waterCrucible(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 200);
waterCrucible(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100);
waterCrucible(writer, "lily_pad", ingredient(Items.LILY_PAD), 150);
waterCrucible(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 100);
waterCrucible(writer, "vine", ingredient(Items.VINE), 100);
waterCrucible(writer, "seeds_and_spores", SPORES_AND_SEEDS, 50);
waterCrucible(writer, "seeds", ingredient(Tags.Items.SEEDS), 50);
waterCrucible(writer, "grass", ingredient(Items.GRASS, Items.TALL_GRASS), 100);
waterCrucible(writer, "grass_block", ingredient(Items.GRASS_BLOCK), 150);
waterCrucible(writer, "sweet_berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 50);
waterCrucible(writer, "melon_slice", ingredient(Items.MELON_SLICE), 50);
waterCrucible(writer, "potato", ingredient(Items.POTATO), 100);
waterCrucible(writer, "carrot", ingredient(Items.CARROT), 100);
waterCrucible(writer, "beetroot", ingredient(Items.BEETROOT), 100);
waterCrucible(writer, "apple", ingredient(Items.APPLE), 100);
waterCrucible(writer, "cactus", ingredient(Items.CACTUS), 250);
waterCrucible(writer, "pumpkin", ingredient(Items.PUMPKIN), 250);
waterCrucible(writer, "melon", ingredient(Items.MELON), 250);
waterCrucible(writer, "seagrass", ingredient(Items.SEAGRASS), 100);
waterCrucible(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 200);
waterCrucible(writer, "moss", ingredient(Items.MOSS_BLOCK), 150);
waterCrucible(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100);
waterCrucible(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 150);
}
private static void lavaCrucible(Consumer<FinishedRecipe> writer, String id, Ingredient ingredient, int volume) {
writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "lava_crucible/" + id), ERecipeSerializers.LAVA_CRUCIBLE.get(), ingredient, Fluids.LAVA, volume));
}
private static void waterCrucible(Consumer<FinishedRecipe> writer, String id, Ingredient ingredient, int volume) {
writer.accept(new FinishedCrucibleRecipe(new ResourceLocation(ExDeorum.ID, "water_crucible/" + id), ERecipeSerializers.WATER_CRUCIBLE.get(), ingredient, Fluids.WATER, volume));
}
private static void hammerRecipes(Consumer<FinishedRecipe> writer) {
// Cobblestone -> Gravel -> Sand -> Dust
hammerRecipe(writer, "gravel", ingredient(Items.COBBLESTONE, Items.DIORITE, Items.GRANITE, Items.ANDESITE), Blocks.GRAVEL);
hammerRecipe(writer, "sand", ingredient(Items.GRAVEL), Blocks.SAND);
hammerRecipe(writer, "dust", ingredient(Items.SAND, Items.RED_SAND), EBlocks.DUST.get());
hammerRecipe(writer, "crushed_deepslate", ingredient(Blocks.DEEPSLATE, Blocks.COBBLED_DEEPSLATE), EBlocks.CRUSHED_DEEPSLATE.get());
hammerRecipe(writer, "crushed_netherrack", ingredient(Blocks.NETHERRACK), EBlocks.CRUSHED_NETHERRACK.get());
hammerRecipe(writer, "crushed_blackstone", ingredient(Blocks.BLACKSTONE), EBlocks.CRUSHED_BLACKSTONE.get());
hammerRecipe(writer, "crushed_end_stone", ingredient(Blocks.END_STONE), EBlocks.CRUSHED_END_STONE.get());
hammerRecipe(writer, "crushing_sandstone", ingredient(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), Items.SAND);
hammerRecipe(writer, "crushing_red_sandstone", ingredient(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), Items.RED_SAND);
hammerRecipe(writer, "crushing_stone_bricks", ingredient(Items.STONE_BRICKS), Items.CRACKED_STONE_BRICKS);
hammerRecipe(writer, "stone_pebbles", ingredient(Items.STONE, Items.STONE_BRICKS, Items.CHISELED_STONE_BRICKS, Items.CRACKED_STONE_BRICKS), EItems.STONE_PEBBLE.get(), new UniformGenerator(ConstantValue.exactly(1), ConstantValue.exactly(6)));
hammerRecipe(writer, "basalt", ingredient(Items.POLISHED_BASALT, Items.SMOOTH_BASALT), Items.BASALT);
hammerRecipe(writer, "tube_coral", ingredient(Items.TUBE_CORAL_BLOCK), Items.TUBE_CORAL);
hammerRecipe(writer, "brain_coral", ingredient(Items.BRAIN_CORAL_BLOCK), Items.BRAIN_CORAL);
hammerRecipe(writer, "bubble_coral", ingredient(Items.BUBBLE_CORAL_BLOCK), Items.BUBBLE_CORAL);
hammerRecipe(writer, "fire_coral", ingredient(Items.FIRE_CORAL_BLOCK), Items.FIRE_CORAL);
hammerRecipe(writer, "horn_coral", ingredient(Items.HORN_CORAL_BLOCK), Items.HORN_CORAL);
hammerRecipe(writer, "tube_coral_fan", ingredient(Items.TUBE_CORAL), Items.TUBE_CORAL_FAN);
hammerRecipe(writer, "brain_coral_fan", ingredient(Items.BRAIN_CORAL), Items.BRAIN_CORAL_FAN);
hammerRecipe(writer, "bubble_coral_fan", ingredient(Items.BUBBLE_CORAL), Items.BUBBLE_CORAL_FAN);
hammerRecipe(writer, "fire_coral_fan", ingredient(Items.FIRE_CORAL), Items.FIRE_CORAL_FAN);
hammerRecipe(writer, "horn_coral_fan", ingredient(Items.HORN_CORAL), Items.HORN_CORAL_FAN);
hammerRecipe(writer, "prismarine", ingredient(Items.PRISMARINE, Items.PRISMARINE_BRICKS, Items.DARK_PRISMARINE), Items.PRISMARINE_SHARD, between(1, 4));
}
private static void hammerRecipe(Consumer<FinishedRecipe> writer, String name, Ingredient block, ItemLike result) {
hammerRecipe(writer, name, block, result, ConstantValue.exactly(1f));
}
private static void hammerRecipe(Consumer<FinishedRecipe> writer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) {
writer.accept(new FinishedHammerRecipe(new ResourceLocation(ExDeorum.ID, "hammer/" + name), block, result.asItem(), resultAmount));
}
private static void barrelCompostRecipes(Consumer<FinishedRecipe> writer) {
// plants
barrelCompost(writer, "saplings", ingredient(ItemTags.SAPLINGS), 125);
barrelCompost(writer, "leaves", ingredient(ItemTags.LEAVES), 125);
barrelCompost(writer, "small_flowers", ingredient(ItemTags.SMALL_FLOWERS), 100);
barrelCompost(writer, "tall_flowers", ingredient(ItemTags.TALL_FLOWERS), 150);
barrelCompost(writer, "mushrooms", ingredient(Tags.Items.MUSHROOMS), 100);
barrelCompost(writer, "lily_pad", ingredient(Items.LILY_PAD), 100);
barrelCompost(writer, "sugar_cane", ingredient(Items.SUGAR_CANE), 80);
barrelCompost(writer, "vine", ingredient(Items.VINE), 100);
barrelCompost(writer, "grass", ingredient(Items.GRASS, Items.FERN), 100);
barrelCompost(writer, "tall_grass", ingredient(Items.TALL_GRASS, Items.LARGE_FERN), 150);
barrelCompost(writer, "seagrass", ingredient(Items.SEAGRASS), 80);
barrelCompost(writer, "nether_wart", ingredient(Items.NETHER_WART), 100);
barrelCompost(writer, "seeds", ingredient(Tags.Items.SEEDS), 80);
barrelCompost(writer, "wheat", ingredient(Tags.Items.CROPS_WHEAT), 80);
barrelCompost(writer, "berries", ingredient(Items.SWEET_BERRIES, Items.GLOW_BERRIES), 80);
barrelCompost(writer, "melon", ingredient(Items.MELON), 200);
barrelCompost(writer, "cake", ingredient(Items.CAKE), 500);
barrelCompost(writer, "pumpkin", ingredient(Items.PUMPKIN), 500);
barrelCompost(writer, "carrots", ingredient(Items.CARROT), 100);
barrelCompost(writer, "potatoes", ingredient(Items.POTATO, Items.BAKED_POTATO, Items.POISONOUS_POTATO), 80);
barrelCompost(writer, "beetroot", ingredient(Items.BEETROOT), 80);
barrelCompost(writer, "moss_block", ingredient(Items.MOSS_BLOCK), 150);
barrelCompost(writer, "moss_carpet", ingredient(Items.MOSS_CARPET), 100);
barrelCompost(writer, "spores_and_seeds", SPORES_AND_SEEDS, 80);
barrelCompost(writer, "bamboo", ingredient(Items.BAMBOO), 100);
barrelCompost(writer, "cactus", ingredient(Items.CACTUS), 125);
barrelCompost(writer, "dead_bush", ingredient(Items.DEAD_BUSH), 80);
barrelCompost(writer, "chorus_flower", ingredient(Items.CHORUS_FLOWER), 150);
barrelCompost(writer, "chorus_fruit", ingredient(Items.CHORUS_FRUIT), 80);
barrelCompost(writer, "chorus_plant", ingredient(Items.CHORUS_PLANT), 150);
barrelCompost(writer, "kelp", ingredient(Items.KELP, Items.DRIED_KELP), 80);
barrelCompost(writer, "sea_pickle", ingredient(Items.SEA_PICKLE), 80);
barrelCompost(writer, "spore_blossom", ingredient(Items.SPORE_BLOSSOM), 125);
barrelCompost(writer, "weeping_vines", ingredient(Items.WEEPING_VINES), 100);
barrelCompost(writer, "twisting_vines", ingredient(Items.TWISTING_VINES), 100);
// flesh
barrelCompost(writer, "rotten_flesh", ingredient(Items.ROTTEN_FLESH), 100);
barrelCompost(writer, "spider_eye", ingredient(Items.SPIDER_EYE), 80);
barrelCompost(writer, "fermented_spider_eye", ingredient(Items.FERMENTED_SPIDER_EYE), 100);
barrelCompost(writer, "string", ingredient(Items.STRING), 40);
barrelCompost(writer, "rabbit_foot", ingredient(Items.RABBIT_FOOT), 100);
// meats
barrelCompost(writer, "pork", ingredient(Items.PORKCHOP, Items.COOKED_PORKCHOP), 150);
barrelCompost(writer, "beef", ingredient(Items.BEEF, Items.COOKED_BEEF), 150);
barrelCompost(writer, "chicken", ingredient(Items.CHICKEN, Items.COOKED_CHICKEN), 125);
barrelCompost(writer, "mutton", ingredient(Items.MUTTON, Items.COOKED_MUTTON), 125);
barrelCompost(writer, "salmon", ingredient(Items.SALMON, Items.COOKED_SALMON), 125);
barrelCompost(writer, "rabbit", ingredient(Items.RABBIT, Items.COOKED_RABBIT), 100);
barrelCompost(writer, "cod", ingredient(Items.COD, Items.COOKED_COD), 100);
barrelCompost(writer, "tropical_fish", ingredient(Items.TROPICAL_FISH), 80);
barrelCompost(writer, "pufferfish", ingredient(Items.PUFFERFISH), 80);
barrelCompost(writer, "egg", ingredient(Items.EGG), 100);
// foods
barrelCompost(writer, "melon_slice", ingredient(Items.MELON_SLICE), 40);
barrelCompost(writer, "silk_worms", ingredient(EItems.SILK_WORM.get(), EItems.COOKED_SILK_WORM.get()), 40);
barrelCompost(writer, "apple", ingredient(Items.APPLE), 100);
barrelCompost(writer, "cookie", ingredient(Items.COOKIE), 100);
barrelCompost(writer, "pumpkin_pie", ingredient(Items.PUMPKIN_PIE), 150);
barrelCompost(writer, "bread", ingredient(Items.BREAD), 125);
barrelCompost(writer, "mushroom_stew", ingredient(Items.MUSHROOM_STEW), 200);
barrelCompost(writer, "suspicious_stew", ingredient(Items.SUSPICIOUS_STEW), 200);
barrelCompost(writer, "beetroot_soup", ingredient(Items.BEETROOT_SOUP), 150);
barrelCompost(writer, "rabbit_stew", ingredient(Items.RABBIT_STEW), 200);
// lol
barrelCompost(writer, "golden_apples", ingredient(Items.GOLDEN_APPLE, Items.ENCHANTED_GOLDEN_APPLE), 1000);
}
private static void barrelCompost(Consumer<FinishedRecipe> writer, String id, Ingredient ingredient, int volume) {
writer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExDeorum.ID, "barrel_compost/" + id), ingredient, volume));
}
private static void barrelMixingRecipes(Consumer<FinishedRecipe> writer) {
// water
barrelMixing(writer, ingredient(EItems.DUST.get()), Fluids.WATER, Items.CLAY);
barrelMixing(writer, ingredient(Items.MILK_BUCKET), Fluids.WATER, Items.SLIME_BLOCK);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_MILK_BUCKET.get()), Fluids.WATER, Items.SLIME_BLOCK);
barrelMixing(writer, ingredient(Items.SNOWBALL), Fluids.WATER, Items.ICE);
barrelMixing(writer, ingredient(Items.LAVA_BUCKET), Fluids.WATER, Items.STONE);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_LAVA_BUCKET), Fluids.WATER, Items.STONE);
// lava
barrelMixing(writer, ingredient(EItems.WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WITCH_WATER_BUCKET), Fluids.LAVA, Items.NETHERRACK);
barrelMixing(writer, ingredient(Items.GLOWSTONE_DUST), Fluids.LAVA, Items.END_STONE);
barrelMixing(writer, ingredient(Items.WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN);
barrelMixing(writer, "_from_porcelain_bucket", ingredient(EItems.PORCELAIN_WATER_BUCKET), Fluids.LAVA, Items.OBSIDIAN);
barrelMixing(writer, ingredient(Items.SLIME_BALL), Fluids.LAVA, Items.MAGMA_CREAM);
barrelMixing(writer, ingredient(Items.SOUL_SAND), Fluids.LAVA, Items.SOUL_SOIL);
// witch water
barrelMixing(writer, ingredient(Items.SAND), EFluids.WITCH_WATER.get(), Items.SOUL_SAND);
}
private static void barrelMixing(Consumer<FinishedRecipe> writer, Ingredient ingredient, Fluid fluidType, Item result) {
writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result)), ingredient, fluidType, 1000, result));
}
// todo replace with fluid mixing recipe type
private static void barrelMixing(Consumer<FinishedRecipe> writer, String suffix, Ingredient ingredient, Fluid fluidType, Item result) {
writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExDeorum.ID, "barrel_mixing/" + path(result) + suffix), ingredient, fluidType, 1000, result));
}
private static ICondition tagNotEmpty(TagKey<Item> tag) {
return new NotCondition(new TagEmptyCondition(tag.location()));
}
private static ICondition modInstalled(String modid) {
return new ModLoadedCondition(modid);
}
}

View File

@ -162,8 +162,12 @@ public class WateringCanItem extends Item {
}
if (!fluidHandler.getFluidInTank(0).isEmpty()) {
if (usableInMachines || !(player instanceof FakePlayer)) {
var realPlayer = !(player instanceof FakePlayer);
if (realPlayer) {
player.startUsingItem(hand);
} else if (this.usableInMachines) {
onUseTick(level, player, itemInHand, 72000);
}
return InteractionResultHolder.consume(itemInHand);
@ -176,7 +180,7 @@ public class WateringCanItem extends Item {
public void onUseTick(Level level, LivingEntity living, ItemStack stack, int remainingTicks) {
var useTicks = 72000 - remainingTicks;
if (useTicks >= STARTUP_TIME) {
if (useTicks >= STARTUP_TIME || living instanceof FakePlayer) {
stack.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).ifPresent(fluidHandler -> {
if (!fluidHandler.getFluidInTank(0).isEmpty()) {
// do watering can
@ -191,7 +195,7 @@ public class WateringCanItem extends Item {
if (useTicks % WATERING_INTERVAL == 0) {
tryWatering((ServerLevel) level, pos, state);
if (!renewing || fluidHandler.getFluidInTank(0).getAmount() != capacity) {
if (!this.renewing || fluidHandler.getFluidInTank(0).getAmount() != capacity) {
if (!(living instanceof Player player && player.getAbilities().instabuild)) {
((CapabilityProvider) fluidHandler).drain();
}

View File

@ -32,6 +32,7 @@ import net.minecraft.util.GsonHelper;
import net.minecraft.world.Container;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.Recipe;
import net.minecraft.world.item.crafting.RecipeManager;
@ -46,6 +47,7 @@ import net.minecraftforge.common.util.Lazy;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.registries.ForgeRegistries;
import org.jetbrains.annotations.Nullable;
import thedarkcolour.exdeorum.compat.ModdedTags;
import thedarkcolour.exdeorum.recipe.barrel.BarrelCompostRecipe;
import thedarkcolour.exdeorum.recipe.barrel.BarrelMixingRecipe;
import thedarkcolour.exdeorum.recipe.crucible.CrucibleRecipe;
@ -291,7 +293,7 @@ public final class RecipeUtil {
}
public static boolean isTagEmpty(TagKey<Item> tag) {
return BuiltInRegistries.ITEM.getTag(tag).map(set -> !set.iterator().hasNext()).orElse(true);
return BuiltInRegistries.ITEM.getTag(tag).map(set -> !set.iterator().hasNext()).orElse(ModdedTags.getPreferredOre(tag) == Items.AIR);
}
private record SieveCacheKey(Item mesh, Item ingredient) {