Add Copper Watering Can

This commit is contained in:
thedarkcolour 2026-05-15 14:21:42 -07:00
parent fab7353e78
commit d8720840f3
16 changed files with 88 additions and 29 deletions

View File

@ -1,6 +1,7 @@
## Ex Deorum 4.0
- Added Pale Oak Crucible, Sieve, Compressed Sieve, and Barrel
- Added Creaking Core to turn Pale Oak Log into Creaking Heart
- Added Copper Watering Can in parity with Vanilla's new copper tools
- Added new Moss Block sieve drops:
- Pale Oak Sapling now drops from all meshes
- Bush now drops from Flint Mesh

View File

@ -1,2 +1,2 @@
// 26.1.2 2026-05-15T13:35:45.55322574 ModKit Language: en_us for mod 'exdeorum'
994c3e75819f30f5398e9ddf6b3ace1e04caccfc assets/exdeorum/lang/en_us.json
// 26.1.2 2026-05-15T14:18:28.254105946 ModKit Language: en_us for mod 'exdeorum'
b152b07fb635f093011eb25daea6d773eb07bf76 assets/exdeorum/lang/en_us.json

View File

@ -1,4 +1,4 @@
// 26.1.2 2026-05-15T13:35:45.564024987 ModKit Recipes for mod 'exdeorum'
// 26.1.2 2026-05-15T14:18:28.258585953 ModKit Recipes for mod 'exdeorum'
0060d0e16dba2df44cc115f8ed68ef5dc52c74f1 data/exdeorum/advancement/recipes/building_blocks/andesite.json
b9c5d12771d724cd646e637641da7a4d6b0a6bbf data/exdeorum/advancement/recipes/building_blocks/basalt.json
d87a237248c140367dbfb748d45f532534e5b45c data/exdeorum/advancement/recipes/building_blocks/blackstone.json
@ -205,6 +205,7 @@ fa317e0e8887b640978d7b3cf13a894c01918752 data/exdeorum/advancement/recipes/tools
6da1d5298bda12a9b9037871e99d0ec6997b23cc data/exdeorum/advancement/recipes/tools/compressed_netherite_hammer.json
6eccf976923f18bea6072818b804dae52e1588da data/exdeorum/advancement/recipes/tools/compressed_stone_hammer.json
ca061bf2d0df36d7e73c3d115a7ee909eae5d978 data/exdeorum/advancement/recipes/tools/compressed_wooden_hammer.json
d614acd345ba5d6ec095f116b0499079de2e1b7a data/exdeorum/advancement/recipes/tools/copper_watering_can.json
3024e4883143c79e5ca1b787b1b6f882c31df9dd data/exdeorum/advancement/recipes/tools/crook.json
5611c6255c467b58903146b6aa45c04b2333b6f5 data/exdeorum/advancement/recipes/tools/diamond_hammer.json
e6a4a0f007a873628ad73e63fda13e5d41140343 data/exdeorum/advancement/recipes/tools/diamond_watering_can.json
@ -1225,6 +1226,7 @@ f75f50de4e82c951d409cf2ee2c9ef36fb530681 data/exdeorum/recipe/compressed_stone_h
a96c72e752d046013e08ad0647a4e1315edac0af data/exdeorum/recipe/cooked_silkworm_from_campfire_cooking.json
0ac4b2838492d19d35923e15c6fd6e09d2fa1667 data/exdeorum/recipe/cooked_silkworm_from_smoking.json
65684fe56a6af62a689c2b13844cc27cefaafeb9 data/exdeorum/recipe/copper_ore.json
ee0a2755375533b3b246d643adcb6d0b00c1f291 data/exdeorum/recipe/copper_watering_can.json
9e43f8e85af0e75617f824566b580f3f731c7c05 data/exdeorum/recipe/creaking_core.json
cceee6f7baeb4725a3ac6568f869f9724e2a21b9 data/exdeorum/recipe/crimson_barrel.json
f7caaff7a9c182901eaff290b6d61382efa279bb data/exdeorum/recipe/crimson_compressed_sieve.json

View File

@ -1,4 +1,4 @@
// 26.1.2 2026-05-15T13:35:45.554995054 ModKit Item Models for mod 'exdeorum'
// 26.1.2 2026-05-15T14:18:28.254818863 ModKit Item Models for mod 'exdeorum'
8cfb1fdb327d53288205eb62b8b7857eafa2a091 assets/exdeorum/items/acacia_barrel.json
8c5b35194de98a2325ed84334623e72596e50b0f assets/exdeorum/items/acacia_compressed_sieve.json
930e698609436fdf71a3ab0b738f7566adfe15c7 assets/exdeorum/items/acacia_crucible.json
@ -63,6 +63,7 @@ e6d96fa05cd3c8ebaa5f2e0d3e67ba04f203b741 assets/exdeorum/items/compressed_stone_
f1cd9e3ce836021d8e435bc206fc8e62c242a615 assets/exdeorum/items/compressed_wooden_hammer.json
52de2263e21e688edae120e80bac0f15a95397c9 assets/exdeorum/items/cooked_silkworm.json
1d5add85d17aa829a184d469690e654f9fdbf5ef assets/exdeorum/items/copper_ore_chunk.json
fa738eef9f6a69809026ec7523f75a96d041c571 assets/exdeorum/items/copper_watering_can.json
e109bde87167aec1b6cf7d5d6c1ca50824f974c2 assets/exdeorum/items/creaking_core.json
535f3bf29763fe534df092396589e75f41ff25bd assets/exdeorum/items/crimson_barrel.json
2ea9c91eacc0413d3ba0794bef229f502d076eb0 assets/exdeorum/items/crimson_compressed_sieve.json
@ -303,6 +304,7 @@ fa43f2736b5d430be09a4040699d50f4716422d0 assets/exdeorum/models/item/compressed_
8ee0cde55fd9244eff5b9ed65e8027ba89362c03 assets/exdeorum/models/item/compressed_wooden_hammer.json
2738250c8aaede17c32c2df28612bfd70145a158 assets/exdeorum/models/item/cooked_silkworm.json
f611abadb3d337ab6a40255116e974e6f5b6edf2 assets/exdeorum/models/item/copper_ore_chunk.json
37ed28bbc7ef4bb58d972a1cdc98dc1c936b8682 assets/exdeorum/models/item/copper_watering_can.json
9303141f016767327bc7e8de59fa58bc26529a05 assets/exdeorum/models/item/creaking_core.json
d6109df4904776aca591e7dfc8ee8da50664e1df assets/exdeorum/models/item/crimson_barrel.json
b240f3070b3c93e54ddbf02bf2c3f6876a28a4bc assets/exdeorum/models/item/crimson_compressed_sieve.json

View File

@ -0,0 +1,6 @@
{
"model": {
"type": "minecraft:model",
"model": "exdeorum:item/copper_watering_can"
}
}

View File

@ -301,6 +301,7 @@
"item.exdeorum.compressed_wooden_hammer": "Compressed Wooden Hammer",
"item.exdeorum.cooked_silkworm": "Cooked Silkworm",
"item.exdeorum.copper_ore_chunk": "Copper Ore Chunk",
"item.exdeorum.copper_watering_can": "Copper Watering Can",
"item.exdeorum.creaking_core": "Creaking Core",
"item.exdeorum.crimson_barrel": "Crimson Barrel",
"item.exdeorum.crimson_compressed_sieve": "Crimson Compressed Sieve",

View File

@ -0,0 +1,6 @@
{
"parent": "item/handheld",
"textures": {
"layer0": "exdeorum:item/copper_watering_can"
}
}

View File

@ -0,0 +1,32 @@
{
"parent": "minecraft:recipes/root",
"criteria": {
"has_item": {
"conditions": {
"items": [
{
"items": "#c:ingots/copper"
}
]
},
"trigger": "minecraft:inventory_changed"
},
"has_the_recipe": {
"conditions": {
"recipe": "exdeorum:copper_watering_can"
},
"trigger": "minecraft:recipe_unlocked"
}
},
"requirements": [
[
"has_the_recipe",
"has_item"
]
],
"rewards": {
"recipes": [
"exdeorum:copper_watering_can"
]
}
}

View File

@ -0,0 +1,16 @@
{
"type": "minecraft:crafting_shaped",
"category": "equipment",
"key": {
"#": "#c:ingots/copper",
"B": "minecraft:bowl"
},
"pattern": [
"# ",
"#B#",
" # "
],
"result": {
"id": "exdeorum:copper_watering_can"
}
}

View File

@ -26,12 +26,14 @@ import net.minecraft.client.resources.model.sprite.Material;
import net.minecraft.core.Holder;
import net.minecraft.core.registries.Registries;
import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.levelgen.presets.WorldPreset;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.event.config.ModConfigEvent;
import net.neoforged.neoforge.client.event.*;
import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent;
import net.neoforged.neoforge.common.NeoForge;
import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.server.ServerLifecycleHooks;
import thedarkcolour.exdeorum.ExDeorum;
import thedarkcolour.exdeorum.asm.ASMHooks;
@ -69,14 +71,7 @@ public class ClientHandler {
private static void registerClientExtensions(RegisterClientExtensionsEvent event) {
event.registerFluidType(new WitchWaterFluid.ClientExtensions(), EFluids.WITCH_WATER_TYPE.get());
event.registerItem(new WateringCanItem.ClientExtensions(),
EItems.WOODEN_WATERING_CAN.get(),
EItems.STONE_WATERING_CAN.get(),
EItems.IRON_WATERING_CAN.get(),
EItems.GOLDEN_WATERING_CAN.get(),
EItems.DIAMOND_WATERING_CAN.get(),
EItems.NETHERITE_WATERING_CAN.get()
);
event.registerItem(new WateringCanItem.ClientExtensions(), EItems.WATERING_CANS.stream().map(DeferredItem::asItem).toArray(Item[]::new));
}
private static void registerFluidModels(RegisterFluidModelsEvent event) {
@ -93,7 +88,7 @@ public class ClientHandler {
}
private static void addClientReloadListeners(AddClientReloadListenersEvent event) {
event.addListener(ExDeorum.loc("render_util"), (ResourceManagerReloadListener) resourceManager -> RenderUtil.reload());
event.addListener(ExDeorum.loc("render_util"), (ResourceManagerReloadListener) _ -> RenderUtil.reload());
}
private static void registerMenuScreens(RegisterMenuScreensEvent event) {
@ -120,11 +115,11 @@ public class ClientHandler {
private static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) {
event.registerBlockEntityRenderer(EBlockEntities.INFESTED_LEAVES.get(), InfestedLeavesRenderer::new);
event.registerBlockEntityRenderer(EBlockEntities.BARREL.get(), BarrelRenderer::new);
event.registerBlockEntityRenderer(EBlockEntities.LAVA_CRUCIBLE.get(), ctx -> new CrucibleRenderer());
event.registerBlockEntityRenderer(EBlockEntities.WATER_CRUCIBLE.get(), ctx -> new CrucibleRenderer());
event.registerBlockEntityRenderer(EBlockEntities.SIEVE.get(), ctx -> new SieveRenderer<>(0.75f, 15f));
event.registerBlockEntityRenderer(EBlockEntities.MECHANICAL_SIEVE.get(), ctx -> new SieveRenderer<>(0.75f, 15f));
event.registerBlockEntityRenderer(EBlockEntities.COMPRESSED_SIEVE.get(), ctx -> new CompressedSieveRenderer<>(0.5625f, 16f));
event.registerBlockEntityRenderer(EBlockEntities.LAVA_CRUCIBLE.get(), _ -> new CrucibleRenderer());
event.registerBlockEntityRenderer(EBlockEntities.WATER_CRUCIBLE.get(), _ -> new CrucibleRenderer());
event.registerBlockEntityRenderer(EBlockEntities.SIEVE.get(), _ -> new SieveRenderer<>(0.75f, 15f));
event.registerBlockEntityRenderer(EBlockEntities.MECHANICAL_SIEVE.get(), _ -> new SieveRenderer<>(0.75f, 15f));
event.registerBlockEntityRenderer(EBlockEntities.COMPRESSED_SIEVE.get(), _ -> new CompressedSieveRenderer<>(0.5625f, 16f));
}
// Sets Ex Deorum world type as default

View File

@ -170,7 +170,7 @@ public class ExDeorumJeiPlugin implements IModPlugin {
registration.addItemStackInfo(List.of(new ItemStack(EItems.INFESTED_LEAVES.get()), new ItemStack(EItems.SILKWORM.get())), Component.translatable(TranslationKeys.SILK_WORM_JEI_INFO));
registration.addItemStackInfo(CompatUtil.getAvailableSieves(true, false).stream().map(ItemStack::new).toList(), Component.translatable(TranslationKeys.SIEVE_JEI_INFO));
registration.addItemStackInfo(List.of(new ItemStack(EItems.STRING_MESH.get()), new ItemStack(EItems.STRING_MESH.get()), new ItemStack(EItems.FLINT_MESH.get()), new ItemStack(EItems.IRON_MESH.get()), new ItemStack(EItems.GOLDEN_MESH.get()), new ItemStack(EItems.DIAMOND_MESH.get()), new ItemStack(EItems.NETHERITE_MESH.get())), Component.translatable(TranslationKeys.SIEVE_MESH_JEI_INFO));
registration.addItemStackInfo(List.of(WateringCanItem.getFull(EItems.WOODEN_WATERING_CAN), WateringCanItem.getFull(EItems.STONE_WATERING_CAN), WateringCanItem.getFull(EItems.IRON_WATERING_CAN), WateringCanItem.getFull(EItems.GOLDEN_WATERING_CAN), WateringCanItem.getFull(EItems.DIAMOND_WATERING_CAN), WateringCanItem.getFull(EItems.NETHERITE_WATERING_CAN)), Component.translatable(TranslationKeys.WATERING_CAN_JEI_INFO));
registration.addItemStackInfo(EItems.WATERING_CANS.stream().map(WateringCanItem::getFull).toList(), Component.translatable(TranslationKeys.WATERING_CAN_JEI_INFO));
var witchWaterInfo = Component.translatable(TranslationKeys.WITCH_WATER_JEI_INFO);
registration.addItemStackInfo(List.of(new ItemStack(EItems.WITCH_WATER_BUCKET.get()), new ItemStack(EItems.PORCELAIN_WITCH_WATER_BUCKET.get())), witchWaterInfo);
registration.addIngredientInfo(new FluidStack(EFluids.WITCH_WATER.get(), 1000), NeoForgeTypes.FLUID_STACK, witchWaterInfo);

View File

@ -41,6 +41,7 @@ class ItemModels {
models.handheld(EItems.WOODEN_WATERING_CAN);
models.handheld(EItems.STONE_WATERING_CAN);
models.handheld(EItems.COPPER_WATERING_CAN);
models.handheld(EItems.IRON_WATERING_CAN);
models.handheld(EItems.GOLDEN_WATERING_CAN);
models.handheld(EItems.DIAMOND_WATERING_CAN);

View File

@ -346,6 +346,7 @@ public class Recipes {
// Watering cans
wateringCan(recipes, EItems.WOODEN_WATERING_CAN, recipes.ingredient(ItemTags.PLANKS));
wateringCan(recipes, EItems.STONE_WATERING_CAN, recipes.ingredient(ItemTags.STONE_TOOL_MATERIALS));
wateringCan(recipes, EItems.COPPER_WATERING_CAN, recipes.ingredient(Tags.Items.INGOTS_COPPER));
wateringCan(recipes, EItems.IRON_WATERING_CAN, recipes.ingredient(Tags.Items.INGOTS_IRON));
wateringCan(recipes, EItems.GOLDEN_WATERING_CAN, recipes.ingredient(Tags.Items.INGOTS_GOLD));
wateringCan(recipes, EItems.DIAMOND_WATERING_CAN, recipes.ingredient(Tags.Items.GEMS_DIAMOND));

View File

@ -34,6 +34,7 @@ import net.minecraft.util.Unit;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.gamerules.GameRules;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
@ -283,18 +284,12 @@ public final class EventHandler {
event.registerBlockEntity(Capabilities.Item.BLOCK, EBlockEntities.WATER_CRUCIBLE.get(), (crucible, direction) -> new LegacyItemHandlerTransfer(crucible.getItem()));
event.registerBlockEntity(Capabilities.Fluid.BLOCK, EBlockEntities.WATER_CRUCIBLE.get(), (crucible, direction) -> new LegacyFluidTankTransfer(crucible.getTank()));
event.registerItem(Capabilities.Fluid.ITEM, (stack, ctx) -> ctx == null ? null : new LegacyFluidItemAccessTransfer(ctx, PorcelainBucket.ItemHandler::new),
event.registerItem(Capabilities.Fluid.ITEM, (_, ctx) -> new LegacyFluidItemAccessTransfer(ctx, PorcelainBucket.ItemHandler::new),
EItems.PORCELAIN_BUCKET,
EItems.PORCELAIN_WATER_BUCKET,
EItems.PORCELAIN_LAVA_BUCKET,
EItems.PORCELAIN_MILK_BUCKET,
EItems.PORCELAIN_WITCH_WATER_BUCKET);
event.registerItem(Capabilities.Fluid.ITEM, (stack, ctx) -> ctx == null ? null : new LegacyFluidItemAccessTransfer(ctx, WateringCanItem.FluidHandler::new),
EItems.WOODEN_WATERING_CAN,
EItems.STONE_WATERING_CAN,
EItems.IRON_WATERING_CAN,
EItems.GOLDEN_WATERING_CAN,
EItems.DIAMOND_WATERING_CAN,
EItems.NETHERITE_WATERING_CAN);
event.registerItem(Capabilities.Fluid.ITEM, (_, ctx) -> new LegacyFluidItemAccessTransfer(ctx, WateringCanItem.FluidHandler::new), EItems.WATERING_CANS.toArray(ItemLike[]::new));
}
}

View File

@ -52,6 +52,7 @@ public class EItems {
// Watering cans
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 = register("stone_watering_can", properties -> new WateringCanItem(1000, properties.stacksTo(1)));
public static final DeferredItem<Item> COPPER_WATERING_CAN = register("copper_watering_can", properties -> new WateringCanItem(2000, properties.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 = register("golden_watering_can", properties -> new WateringCanItem(4000, properties.stacksTo(1)));
public static final DeferredItem<Item> DIAMOND_WATERING_CAN = register("diamond_watering_can", properties -> new WideWateringCanItem(false, properties.stacksTo(1)));
@ -170,6 +171,7 @@ public class EItems {
public static final DeferredItem<BlockItem> END_CAKE = registerItemBlock(EBlocks.END_CAKE);
public static final DeferredItem<BlockItem> INFESTED_LEAVES = registerItemBlock(EBlocks.INFESTED_LEAVES);
public static final List<DeferredItem<Item>> WATERING_CANS = List.of(WOODEN_WATERING_CAN, STONE_WATERING_CAN, COPPER_WATERING_CAN, IRON_WATERING_CAN, GOLDEN_WATERING_CAN, DIAMOND_WATERING_CAN, NETHERITE_WATERING_CAN);
public static void addItemsToMainTab(CreativeModeTab.Output output) {
for (var material : Iterables.concat(CompatUtil.getAvailableBarrels(true), CompatUtil.getAvailableSieves(true, false), CompatUtil.getAvailableCompressedSieves(true))) {
@ -219,8 +221,7 @@ public class EItems {
output.accept(COOKED_SILKWORM.get());
output.accept(CROOK.get());
output.accept(BONE_CROOK.get());
var wateringCans = List.of(WOODEN_WATERING_CAN, STONE_WATERING_CAN, IRON_WATERING_CAN, GOLDEN_WATERING_CAN, DIAMOND_WATERING_CAN, NETHERITE_WATERING_CAN);
for (var wateringCan : wateringCans) {
for (var wateringCan : WATERING_CANS) {
var full = WateringCanItem.getFull(wateringCan);
output.accept(wateringCan.get());
output.accept(full);

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B