From 6813fe2fecf9a8618cc92abf2a4343991caaabdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=86=AC=E7=85=9C?= <10185101162@stu.ecnu.edu.cn> Date: Mon, 10 Mar 2025 22:55:54 +0800 Subject: [PATCH] =?UTF-8?q?feat[salt]:=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=94=99=E8=AF=AF=E7=9A=84=E5=91=BD=E5=90=8D=EF=BC=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9B=90=E7=9F=BF=E7=9A=84=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=92=8C=E9=85=8D=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wild_wind/common/init/ModBlocks.java | 4 +- .../wild_wind/datagen/ModRecipeProvider.java | 44 +++++++++++++++++-- .../datagen/loot/ModBlockLootSubProvider.java | 25 ++++++++++- .../datagen/tag/ModBlockTagsProvider.java | 2 +- .../ModConfiguredFeatureRegistry.java | 27 +++++++++++- .../worldgen/ModPlacedFeatureRegistry.java | 20 ++++++++- 6 files changed, 109 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/polaris2023/wild_wind/common/init/ModBlocks.java b/src/main/java/org/polaris2023/wild_wind/common/init/ModBlocks.java index 1905fc2c..2c39f5d3 100644 --- a/src/main/java/org/polaris2023/wild_wind/common/init/ModBlocks.java +++ b/src/main/java/org/polaris2023/wild_wind/common/init/ModBlocks.java @@ -410,10 +410,10 @@ public class ModBlocks { @I18n(en_us = "Baobab Wall Sign", zh_cn = "墙上的猴面包木告示牌", zh_tw = "牆上的猴麵包木告示牌", descriptionId = "block.wild_wind.baobab_wall_sign") public static final DeferredBlock BAOBAB_WALL_SIGN = register("baobab_wall_sign", props -> new WallSignBlock(ModWoodSettings.BAOBAB.woodType, props), BlockBehaviour.Properties.ofFullCopy(Blocks.ACACIA_WALL_SIGN).lootFrom(BAOBAB_SIGN)); - @I18n(en_us = "Baobab Hanging Sign", zh_cn = "猴面包木悬挂式告示牌", zh_tw = "猴麵包木懸挂式告示牌") + @I18n(en_us = "Baobab Hanging Sign", zh_cn = "悬挂式猴面包木告示牌", zh_tw = "懸挂式猴麵包木告示牌") public static final DeferredBlock BAOBAB_HANGING_SIGN = register("baobab_hanging_sign", props -> new CeilingHangingSignBlock(ModWoodSettings.BAOBAB.woodType, props), BlockBehaviour.Properties.ofFullCopy(Blocks.ACACIA_HANGING_SIGN)); - @I18n(en_us = "Baobab Wall Hanging Sign", zh_cn = "墙上的猴面包木悬挂式告示牌", zh_tw = "牆上的猴麵包木懸挂式告示牌", descriptionId = "block.wild_wind.baobab_wall_hanging_sign") + @I18n(en_us = "Baobab Wall Hanging Sign", zh_cn = "墙上的悬挂式猴面包木告示牌", zh_tw = "牆上的懸挂式猴麵包木告示牌", descriptionId = "block.wild_wind.baobab_wall_hanging_sign") public static final DeferredBlock BAOBAB_WALL_HANGING_SIGN = register("baobab_wall_hanging_sign", props -> new WallHangingSignBlock(ModWoodSettings.BAOBAB.woodType, props), BlockBehaviour.Properties.ofFullCopy(Blocks.ACACIA_WALL_HANGING_SIGN).lootFrom(BAOBAB_HANGING_SIGN)); public static final DeferredItem BAOBAB_LOG_ITEM = diff --git a/src/main/java/org/polaris2023/wild_wind/datagen/ModRecipeProvider.java b/src/main/java/org/polaris2023/wild_wind/datagen/ModRecipeProvider.java index 9c369cac..3c949893 100644 --- a/src/main/java/org/polaris2023/wild_wind/datagen/ModRecipeProvider.java +++ b/src/main/java/org/polaris2023/wild_wind/datagen/ModRecipeProvider.java @@ -72,7 +72,7 @@ protected void addSmeltingRecipes() { SimpleCookingRecipeBuilder smelting = smelting(Items.TERRACOTTA, RecipeCategory.BUILDING_BLOCKS, ModBlocks.GLAZED_TERRACOTTA.get(),0.35F); add(smelting); - + smeltingAndBlasting(Ingredient.of(ModBlocks.SALT_ORE_ITEM.get(), ModBlocks.DEEPSLATE_SALT_ORE_ITEM.get()), RecipeCategory.MISC, ModBaseItems.SALT.get(), 0.7F); } public static Criterion has(ItemLike... likes) { @@ -162,10 +162,7 @@ protected static void unlockedBy(T t, TagKey tag t.unlockedBy(("has" + "_" + tag.location()).toLowerCase(Locale.ROOT), has(tag)); } - - protected void addShapelessRecipe() { - add(shapeless(RecipeCategory.FOOD, ModBaseFoods.FISH_CHOWDER.get(), 1, fish_chowder -> { unlockedBy(fish_chowder, ModBaseFoods.RAW_TROUT.get(), Items.COD, Items.SALMON); unlockedBy(fish_chowder, Items.BROWN_MUSHROOM, Items.RED_MUSHROOM); @@ -302,6 +299,15 @@ public static SimpleCookingRecipeBuilder smelting( .unlockedBy(BuiltInRegistries.ITEM.getKey(item).toString(), has(item)); } + public static SimpleCookingRecipeBuilder blasting( + Ingredient input, RecipeCategory category, ItemLike result, float exp, int cookingTime + ) { + ItemStack[] items = input.getItems(); + Item item = items[0].getItem(); + return SimpleCookingRecipeBuilder.blasting(input, category, result, exp, cookingTime) + .unlockedBy(BuiltInRegistries.ITEM.getKey(item).toString(), has(item)); + } + public static SimpleCookingRecipeBuilder smoking( Ingredient input, RecipeCategory category, ItemLike result, float exp, int cookingTime ) { @@ -346,12 +352,23 @@ public static SimpleCookingRecipeBuilder smelting( .unlockedBy(BuiltInRegistries.ITEM.getKey(input.asItem()).toString(), has(input)); } + public static SimpleCookingRecipeBuilder blasting( + ItemLike input, RecipeCategory category, ItemLike result, float exp, int cookingTime) { + return SimpleCookingRecipeBuilder.blasting(Ingredient.of(input), category, result, exp, cookingTime) + .unlockedBy(BuiltInRegistries.ITEM.getKey(input.asItem()).toString(), has(input)); + } + public static SimpleCookingRecipeBuilder smoking( ItemLike input, RecipeCategory category, ItemLike result, float exp, int cookingTime) { return SimpleCookingRecipeBuilder.smoking(Ingredient.of(input), category, result, exp, cookingTime) .unlockedBy(BuiltInRegistries.ITEM.getKey(input.asItem()).toString(), has(input)); } + public void smeltingAndBlasting(Ingredient input, RecipeCategory category, ItemLike result, float exp) { + add(smelting(input, category, result, exp)); + add(blasting(input, category, result, exp), "blasting/"); + } + public void smeltingAndSmoking(Ingredient input, RecipeCategory category, ItemLike result, float exp) { add(smelting(input, category, result, exp)); add(smoking(input, category, result, exp), "smoking/"); @@ -377,6 +394,12 @@ public static SimpleCookingRecipeBuilder smoking( return smoking(input, category, result, exp, 200); } + public static SimpleCookingRecipeBuilder blasting( + Ingredient input, RecipeCategory category, ItemLike result, float exp + ) { + return blasting(input, category, result, exp, 200); + } + public void smeltingAndSmoking( ItemLike input, RecipeCategory category, ItemLike result, float exp ) { @@ -384,6 +407,13 @@ public void smeltingAndSmoking( add(smoking(input, category, result, exp), "smoking/"); } + public void smeltingAndBlasting( + ItemLike input, RecipeCategory category, ItemLike result, float exp + ) { + add(smelting(input, category, result, exp)); + add(blasting(input, category, result, exp), "blasting/"); + } + public void smeltingSmokingAndCampfire(ItemLike input, RecipeCategory category, ItemLike result, float exp) { add(smelting(input, category, result, exp)); add(smoking(input, category, result, exp), "smoking/"); @@ -402,6 +432,12 @@ public static SimpleCookingRecipeBuilder smoking( return smoking(input, category, result, exp, 200); } + public static SimpleCookingRecipeBuilder blasting( + ItemLike input, RecipeCategory category, ItemLike result, float exp + ) { + return blasting(input, category, result, exp, 200); + } + public void add(RecipeBuilder builder) { list.put(BuiltInRegistries.ITEM.getKey(builder.getResult()), builder); } diff --git a/src/main/java/org/polaris2023/wild_wind/datagen/loot/ModBlockLootSubProvider.java b/src/main/java/org/polaris2023/wild_wind/datagen/loot/ModBlockLootSubProvider.java index 76b4522f..2caa804a 100644 --- a/src/main/java/org/polaris2023/wild_wind/datagen/loot/ModBlockLootSubProvider.java +++ b/src/main/java/org/polaris2023/wild_wind/datagen/loot/ModBlockLootSubProvider.java @@ -2,11 +2,19 @@ import com.google.common.collect.ImmutableSet; import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.storage.loot.LootTable; +import net.minecraft.world.level.storage.loot.entries.LootItem; +import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount; +import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; import org.polaris2023.wild_wind.common.init.ModBlocks; import org.polaris2023.wild_wind.common.init.ModInitializer; import org.polaris2023.wild_wind.common.init.items.ModBaseItems; @@ -40,8 +48,8 @@ public void generate() { this.dropSelf(ModBlocks.CONCRETE.get()); this.dropSelf(ModBlocks.GLAZED_TERRACOTTA.get()); this.dropSelf(ModBlocks.SALT_BLOCK.get()); - this.dropOther(ModBlocks.SALT_ORE.get(), ModBaseItems.SALT.get()); - this.dropOther(ModBlocks.DEEPSLATE_SALT_ORE.get(), ModBaseItems.SALT.get()); + this.add(ModBlocks.SALT_ORE.get(), this.createSaltOreDrops(ModBlocks.SALT_ORE.get())); + this.add(ModBlocks.DEEPSLATE_SALT_ORE.get(), this.createSaltOreDrops(ModBlocks.DEEPSLATE_SALT_ORE.get())); this.dropSelf(ModBlocks.AZALEA_LOG.get()); this.dropSelf(ModBlocks.STRIPPED_AZALEA_LOG.get()); this.dropSelf(ModBlocks.AZALEA_WOOD.get()); @@ -70,4 +78,17 @@ public void generate() { this.dropSelf(ModBlocks.PALM_SAPLING.get()); this.dropSelf(ModBlocks.BAOBAB_SAPLING.get()); } + + protected LootTable.Builder createSaltOreDrops(Block block) { + HolderLookup.RegistryLookup registrylookup = this.registries.lookupOrThrow(Registries.ENCHANTMENT); + return this.createSilkTouchDispatchTable( + block, + this.applyExplosionDecay( + block, + LootItem.lootTableItem(ModBaseItems.SALT) + .apply(SetItemCountFunction.setCount(UniformGenerator.between(4.0F, 9.0F))) + .apply(ApplyBonusCount.addOreBonusCount(registrylookup.getOrThrow(Enchantments.FORTUNE))) + ) + ); + } } diff --git a/src/main/java/org/polaris2023/wild_wind/datagen/tag/ModBlockTagsProvider.java b/src/main/java/org/polaris2023/wild_wind/datagen/tag/ModBlockTagsProvider.java index 73c757d2..3c63e234 100644 --- a/src/main/java/org/polaris2023/wild_wind/datagen/tag/ModBlockTagsProvider.java +++ b/src/main/java/org/polaris2023/wild_wind/datagen/tag/ModBlockTagsProvider.java @@ -39,7 +39,7 @@ protected void addTags(HolderLookup.Provider provider) { tag(BlockTags.SNOW_LAYER_CANNOT_SURVIVE_ON).add(ModBlocks.BRITTLE_ICE.get()); //Mineable - tag(BlockTags.MINEABLE_WITH_PICKAXE).add(ModBlocks.BRITTLE_ICE.get(), ModBlocks.SALT_ORE.get()); + tag(BlockTags.MINEABLE_WITH_PICKAXE).add(ModBlocks.BRITTLE_ICE.get(), ModBlocks.SALT_ORE.get(), ModBlocks.DEEPSLATE_SALT_ORE.get()); tag(BlockTags.MINEABLE_WITH_AXE).add(ModBlocks.PALM_CROWN.get()); tag(ModBlockTags.AZALEA_LOGS).add(ModBlocks.AZALEA_LOG.get(), ModBlocks.AZALEA_WOOD.get(), ModBlocks.STRIPPED_AZALEA_LOG.get(), ModBlocks.STRIPPED_AZALEA_WOOD.get()); diff --git a/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModConfiguredFeatureRegistry.java b/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModConfiguredFeatureRegistry.java index 02b600ca..cbf60cc5 100644 --- a/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModConfiguredFeatureRegistry.java +++ b/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModConfiguredFeatureRegistry.java @@ -4,6 +4,7 @@ import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.data.worldgen.features.FeatureUtils; import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate; @@ -11,7 +12,10 @@ import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.configurations.DiskConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; import net.minecraft.world.level.levelgen.feature.stateproviders.RuleBasedBlockStateProvider; +import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; import org.polaris2023.wild_wind.common.init.ModBlocks; import org.polaris2023.wild_wind.common.init.ModFeatures; import org.polaris2023.wild_wind.util.Helpers; @@ -19,8 +23,15 @@ import java.util.List; public class ModConfiguredFeatureRegistry { - public static final ResourceKey> BRITTLE_ICE = ResourceKey.create(Registries.CONFIGURED_FEATURE, Helpers.location("brittle_ice")); - public static final ResourceKey> DISK_BRITTLE_ICE = ResourceKey.create(Registries.CONFIGURED_FEATURE, Helpers.location("disk_brittle_ice")); + private static final RuleTest STONE_ORE_REPLACEABLES = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); + private static final RuleTest DEEPSLATE_ORE_REPLACEABLES = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); + + public static final ResourceKey> BRITTLE_ICE = create("brittle_ice"); + public static final ResourceKey> DISK_BRITTLE_ICE = create("disk_brittle_ice"); + + //Ore + public static final ResourceKey> ORE_SALT = create("ore_salt"); + public static final ResourceKey> ORE_SALT_BURIED = create("ore_salt_buried"); public static void bootstrap(BootstrapContext> context) { FeatureUtils.register(context, BRITTLE_ICE, ModFeatures.BRITTLE_ICE, NoneFeatureConfiguration.NONE); @@ -29,5 +40,17 @@ public static void bootstrap(BootstrapContext> context) BlockPredicate.matchesBlocks(List.of(Blocks.ICE, ModBlocks.BRITTLE_ICE.get())), UniformInt.of(4, 6), 1 )); + FeatureUtils.register(context, ORE_SALT, Feature.ORE, new OreConfiguration(List.of( + OreConfiguration.target(STONE_ORE_REPLACEABLES, ModBlocks.SALT_ORE.get().defaultBlockState()), + OreConfiguration.target(DEEPSLATE_ORE_REPLACEABLES, ModBlocks.DEEPSLATE_SALT_ORE.get().defaultBlockState()) + ), 7)); + FeatureUtils.register(context, ORE_SALT_BURIED, Feature.ORE, new OreConfiguration(List.of( + OreConfiguration.target(STONE_ORE_REPLACEABLES, ModBlocks.SALT_ORE.get().defaultBlockState()), + OreConfiguration.target(DEEPSLATE_ORE_REPLACEABLES, ModBlocks.DEEPSLATE_SALT_ORE.get().defaultBlockState()) + ), 7, 1.0F)); + } + + private static ResourceKey> create(String name) { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, Helpers.location(name)); } } diff --git a/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModPlacedFeatureRegistry.java b/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModPlacedFeatureRegistry.java index e87cf289..e7a354b4 100644 --- a/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModPlacedFeatureRegistry.java +++ b/src/main/java/org/polaris2023/wild_wind/datagen/worldgen/ModPlacedFeatureRegistry.java @@ -14,8 +14,12 @@ import java.util.List; public class ModPlacedFeatureRegistry { - public static final ResourceKey BRITTLE_ICE = ResourceKey.create(Registries.PLACED_FEATURE, Helpers.location("brittle_ice")); - public static final ResourceKey DISK_BRITTLE_ICE = ResourceKey.create(Registries.PLACED_FEATURE, Helpers.location("disk_brittle_ice")); + public static final ResourceKey BRITTLE_ICE = create("brittle_ice"); + public static final ResourceKey DISK_BRITTLE_ICE = create("disk_brittle_ice"); + + //Ore + public static final ResourceKey ORE_SALT = create("ore_salt"); + public static final ResourceKey ORE_SALT_BURIED = create("ore_salt_buried"); public static void bootstrap(BootstrapContext context) { HolderGetter> configuredFeaturesLookup = context.lookup(Registries.CONFIGURED_FEATURE); @@ -27,9 +31,21 @@ public static void bootstrap(BootstrapContext context) { context, DISK_BRITTLE_ICE, configuredFeaturesLookup.getOrThrow(ModConfiguredFeatureRegistry.DISK_BRITTLE_ICE), orePlacement(CountPlacement.of(6), HeightmapPlacement.onHeightmap(Heightmap.Types.OCEAN_FLOOR_WG)) ); + PlacementUtils.register( + context, ORE_SALT, configuredFeaturesLookup.getOrThrow(ModConfiguredFeatureRegistry.ORE_SALT), + orePlacement(CountPlacement.of(2), HeightRangePlacement.triangle(VerticalAnchor.absolute(-32), VerticalAnchor.absolute(32))) + ); + PlacementUtils.register( + context, ORE_SALT_BURIED, configuredFeaturesLookup.getOrThrow(ModConfiguredFeatureRegistry.ORE_SALT_BURIED), + orePlacement(CountPlacement.of(2), HeightRangePlacement.uniform(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(64))) + ); } private static List orePlacement(PlacementModifier countPlacement, PlacementModifier heightRange) { return List.of(countPlacement, InSquarePlacement.spread(), heightRange, BiomeFilter.biome()); } + + private static ResourceKey create(String name) { + return ResourceKey.create(Registries.PLACED_FEATURE, Helpers.location(name)); + } }