diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 4faef3667..d8bed9636 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -359,6 +359,7 @@ "item.anvilcraft.ember_metal_shovel": "ןǝʌoɥS ןɐʇǝW ɹǝqɯƎ", "item.anvilcraft.ember_metal_sword": "pɹoʍS ןɐʇǝW ɹǝqɯƎ", "item.anvilcraft.ember_metal_upgrade_smithing_template": "ǝʇɐןdɯǝ⟘ buıɥʇıɯS ǝpɐɹbd∩ ןɐʇǝW ɹǝqɯƎ", + "item.anvilcraft.emerald_amulet": "ʇǝןnɯⱯ pןɐɹǝɯƎ", "item.anvilcraft.fire_reforging.tooltip": "ɐʌɐן ɹo ǝɹıɟ uı buıpuǝɯ :buıbɹoɟǝᴚ", "item.anvilcraft.flour": "ɹnoןℲ", "item.anvilcraft.geode": "ǝpoǝ⅁", @@ -411,7 +412,9 @@ "item.anvilcraft.royal_steel_sword": "pɹoʍS ןǝǝʇS ןɐʎoᴚ", "item.anvilcraft.royal_steel_upgrade_smithing_template": "ǝʇɐןdɯǝ⟘ buıɥʇıɯS ǝpɐɹbd∩ ןǝǝʇS ןɐʎoᴚ", "item.anvilcraft.ruby": "ʎqnᴚ", + "item.anvilcraft.ruby_amulet": "ʇǝןnɯⱯ ʎqnᴚ", "item.anvilcraft.sapphire": "ǝɹıɥddɐS", + "item.anvilcraft.sapphire_amulet": "ʇǝןnɯⱯ ǝɹıɥddɐS", "item.anvilcraft.sea_heart_shell": "ןןǝɥS ʇɹɐǝH ɐǝS", "item.anvilcraft.sea_heart_shell_shard": "pɹɐɥS ןןǝɥS ʇɹɐǝH ɐǝS", "item.anvilcraft.seeds_pack": "ʞɔɐԀ spǝǝS", @@ -424,6 +427,7 @@ "item.anvilcraft.titanium_ingot": "ʇobuI ɯnıuɐʇı⟘", "item.anvilcraft.titanium_nugget": "ʇǝbbnN ɯnıuɐʇı⟘", "item.anvilcraft.topaz": "zɐdo⟘", + "item.anvilcraft.topaz_amulet": "ʇǝןnɯⱯ zɐdo⟘", "item.anvilcraft.tungsten_ingot": "ʇobuI uǝʇsbun⟘", "item.anvilcraft.tungsten_nugget": "ʇǝbbnN uǝʇsbun⟘", "item.anvilcraft.uranium_ingot": "ʇobuI ɯnıuɐɹ∩", @@ -651,7 +655,7 @@ "tooltip.anvilcraft.item.tempering_glass": "ʇɔǝןןoɔ uo pǝɹınbǝɹ sןooʇ oN 'ɟooɹd uoısoןdxƎ", "tooltip.anvilcraft.item.topaz": "buıuʇɥbıן ɟo ɹǝʍod ǝɥʇ buıuıɐʇuoƆ", "tooltip.anvilcraft.item.transmission_pole": "8 ɟo ɥʇbuǝן uoıssıɯsuɐɹʇ ɐ ɥʇıʍ pıɹb ɹǝʍod ɐ pןınᗺ", - "tooltip.anvilcraft.jade.item_detector": "%d :ǝbuɐɹ uoıʇɔǝʇǝᗡ", + "tooltip.anvilcraft.jade.item_detector": "%d :ǝbuɐᴚ uoıʇɔǝʇǝᗡ", "tooltip.anvilcraft.jade.power_information": "Mʞ %d/%d :pıɹ⅁ ɹǝʍoԀ", "tooltip.anvilcraft.jade.ruby_prism.power": "%d :ןǝʌǝן ɹǝsɐꞀ" } \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index bb5b15360..3af4ffc7d 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -359,6 +359,7 @@ "item.anvilcraft.ember_metal_shovel": "Ember Metal Shovel", "item.anvilcraft.ember_metal_sword": "Ember Metal Sword", "item.anvilcraft.ember_metal_upgrade_smithing_template": "Ember Metal Upgrade Smithing Template", + "item.anvilcraft.emerald_amulet": "Emerald Amulet", "item.anvilcraft.fire_reforging.tooltip": "Reforging: mending in fire or lava", "item.anvilcraft.flour": "Flour", "item.anvilcraft.geode": "Geode", @@ -411,7 +412,9 @@ "item.anvilcraft.royal_steel_sword": "Royal Steel Sword", "item.anvilcraft.royal_steel_upgrade_smithing_template": "Royal Steel Upgrade Smithing Template", "item.anvilcraft.ruby": "Ruby", + "item.anvilcraft.ruby_amulet": "Ruby Amulet", "item.anvilcraft.sapphire": "Sapphire", + "item.anvilcraft.sapphire_amulet": "Sapphire Amulet", "item.anvilcraft.sea_heart_shell": "Sea Heart Shell", "item.anvilcraft.sea_heart_shell_shard": "Sea Heart Shell Shard", "item.anvilcraft.seeds_pack": "Seeds Pack", @@ -424,6 +427,7 @@ "item.anvilcraft.titanium_ingot": "Titanium Ingot", "item.anvilcraft.titanium_nugget": "Titanium Nugget", "item.anvilcraft.topaz": "Topaz", + "item.anvilcraft.topaz_amulet": "Topaz Amulet", "item.anvilcraft.tungsten_ingot": "Tungsten Ingot", "item.anvilcraft.tungsten_nugget": "Tungsten Nugget", "item.anvilcraft.uranium_ingot": "Uranium Ingot", @@ -651,7 +655,7 @@ "tooltip.anvilcraft.item.tempering_glass": "Explosion proof, No tools required on collect", "tooltip.anvilcraft.item.topaz": "Containing the power of lightning", "tooltip.anvilcraft.item.transmission_pole": "Build a power grid with a transmission length of 8", - "tooltip.anvilcraft.jade.item_detector": "Detection range: %d", + "tooltip.anvilcraft.jade.item_detector": "Detection Range: %d", "tooltip.anvilcraft.jade.power_information": "Power Grid: %d/%d kW", "tooltip.anvilcraft.jade.ruby_prism.power": "Laser level: %d" } \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/models/item/emerald_amulet.json b/src/generated/resources/assets/anvilcraft/models/item/emerald_amulet.json new file mode 100644 index 000000000..8b18e9ad9 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/emerald_amulet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "anvilcraft:item/emerald_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/models/item/ruby_amulet.json b/src/generated/resources/assets/anvilcraft/models/item/ruby_amulet.json new file mode 100644 index 000000000..58e4af175 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/ruby_amulet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "anvilcraft:item/ruby_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/models/item/sapphire_amulet.json b/src/generated/resources/assets/anvilcraft/models/item/sapphire_amulet.json new file mode 100644 index 000000000..9728e5d3f --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/sapphire_amulet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "anvilcraft:item/sapphire_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/anvilcraft/models/item/topaz_amulet.json b/src/generated/resources/assets/anvilcraft/models/item/topaz_amulet.json new file mode 100644 index 000000000..acacd8082 --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/topaz_amulet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "anvilcraft:item/topaz_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/emerald_amulet.json b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/emerald_amulet.json new file mode 100644 index 000000000..9f791a991 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/emerald_amulet.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:jewel_crafting/emerald_amulet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:jewel_crafting/emerald_amulet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/ruby_amulet.json b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/ruby_amulet.json new file mode 100644 index 000000000..bd57b35e6 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/ruby_amulet.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:jewel_crafting/ruby_amulet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:jewel_crafting/ruby_amulet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/sapphire_amulet.json b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/sapphire_amulet.json new file mode 100644 index 000000000..d5e326672 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/sapphire_amulet.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:jewel_crafting/sapphire_amulet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:jewel_crafting/sapphire_amulet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/topaz_amulet.json b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/topaz_amulet.json new file mode 100644 index 000000000..678c5f79d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/topaz_amulet.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:jewel_crafting/topaz_amulet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:jewel_crafting/topaz_amulet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/emerald_amulet.json b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/emerald_amulet.json new file mode 100644 index 000000000..d3b849e4f --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/emerald_amulet.json @@ -0,0 +1,27 @@ +{ + "type": "anvilcraft:jewel_crafting", + "ingredients": [ + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "minecraft:emerald_block" + }, + { + "item": "anvilcraft:royal_steel_ingot" + } + ], + "result": { + "count": 1, + "id": "anvilcraft:emerald_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/ruby_amulet.json b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/ruby_amulet.json new file mode 100644 index 000000000..3eecef547 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/ruby_amulet.json @@ -0,0 +1,27 @@ +{ + "type": "anvilcraft:jewel_crafting", + "ingredients": [ + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:ruby_block" + }, + { + "item": "anvilcraft:royal_steel_ingot" + } + ], + "result": { + "count": 1, + "id": "anvilcraft:ruby_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/sapphire_amulet.json b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/sapphire_amulet.json new file mode 100644 index 000000000..0a380b33d --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/sapphire_amulet.json @@ -0,0 +1,27 @@ +{ + "type": "anvilcraft:jewel_crafting", + "ingredients": [ + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:sapphire_block" + }, + { + "item": "anvilcraft:royal_steel_ingot" + } + ], + "result": { + "count": 1, + "id": "anvilcraft:sapphire_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/topaz_amulet.json b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/topaz_amulet.json new file mode 100644 index 000000000..c916ff085 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/topaz_amulet.json @@ -0,0 +1,27 @@ +{ + "type": "anvilcraft:jewel_crafting", + "ingredients": [ + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:topaz_block" + }, + { + "item": "anvilcraft:royal_steel_ingot" + } + ], + "result": { + "count": 1, + "id": "anvilcraft:topaz_amulet" + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java b/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java index 6683c7e47..0f732f5b0 100644 --- a/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java +++ b/src/main/java/dev/dubhe/anvilcraft/AnvilCraft.java @@ -8,6 +8,7 @@ import dev.dubhe.anvilcraft.init.ModBlocks; import dev.dubhe.anvilcraft.init.ModCommands; import dev.dubhe.anvilcraft.init.ModComponents; +import dev.dubhe.anvilcraft.init.ModDataAttachments; import dev.dubhe.anvilcraft.init.ModDispenserBehavior; import dev.dubhe.anvilcraft.init.ModEnchantmentEffectComponents; import dev.dubhe.anvilcraft.init.ModEnchantmentEffects; @@ -77,6 +78,7 @@ public AnvilCraft(IEventBus modEventBus) { ModComponents.register(modEventBus); ModVillagers.register(modEventBus); ModRecipeTypes.register(modEventBus); + ModDataAttachments.register(modEventBus); ModInspections.initialize(); ModLootContextParamSets.registerAll(); diff --git a/src/main/java/dev/dubhe/anvilcraft/data/recipe/JewelCraftingRecipeLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/recipe/JewelCraftingRecipeLoader.java index 17faed500..c86746193 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/recipe/JewelCraftingRecipeLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/recipe/JewelCraftingRecipeLoader.java @@ -3,9 +3,11 @@ import com.tterrag.registrate.providers.RegistrateRecipeProvider; import dev.dubhe.anvilcraft.init.ModBlocks; import dev.dubhe.anvilcraft.init.ModItemTags; +import dev.dubhe.anvilcraft.init.ModItems; import dev.dubhe.anvilcraft.recipe.JewelCraftingRecipe; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; public class JewelCraftingRecipeLoader { public static void init(RegistrateRecipeProvider provider) { @@ -29,5 +31,33 @@ public static void init(RegistrateRecipeProvider provider) { .requires(ModItemTags.TITANIUM_INGOTS) .result(new ItemStack(Items.ELYTRA)) .save(provider); + + JewelCraftingRecipe.builder() + .requires(ModBlocks.SILVER_BLOCK, 4) + .requires(Blocks.EMERALD_BLOCK) + .requires(ModItems.ROYAL_STEEL_INGOT) + .result(new ItemStack(ModItems.EMERALD_AMULET.asItem())) + .save(provider); + + JewelCraftingRecipe.builder() + .requires(ModBlocks.SILVER_BLOCK, 4) + .requires(ModBlocks.TOPAZ_BLOCK) + .requires(ModItems.ROYAL_STEEL_INGOT) + .result(new ItemStack(ModItems.TOPAZ_AMULET.asItem())) + .save(provider); + + JewelCraftingRecipe.builder() + .requires(ModBlocks.SILVER_BLOCK, 4) + .requires(ModBlocks.RUBY_BLOCK) + .requires(ModItems.ROYAL_STEEL_INGOT) + .result(new ItemStack(ModItems.RUBY_AMULET.asItem())) + .save(provider); + + JewelCraftingRecipe.builder() + .requires(ModBlocks.SILVER_BLOCK, 4) + .requires(ModBlocks.SAPPHIRE_BLOCK) + .requires(ModItems.ROYAL_STEEL_INGOT) + .result(new ItemStack(ModItems.SAPPHIRE_AMULET.asItem())) + .save(provider); } } diff --git a/src/main/java/dev/dubhe/anvilcraft/event/LivingEntityEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/LivingEntityEventListener.java new file mode 100644 index 000000000..006ccd68d --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/event/LivingEntityEventListener.java @@ -0,0 +1,24 @@ +package dev.dubhe.anvilcraft.event; + +import dev.dubhe.anvilcraft.AnvilCraft; +import net.minecraft.tags.DamageTypeTags; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.entity.living.LivingDamageEvent; +import org.jetbrains.annotations.NotNull; + +import static dev.dubhe.anvilcraft.init.ModDataAttachments.IMMUNE_TO_LIGHTNING; + +@EventBusSubscriber(modid = AnvilCraft.MOD_ID) +public class LivingEntityEventListener { + @SubscribeEvent + public static void PreEntityHurt(@NotNull LivingDamageEvent.Pre event){ + if(event.getSource().is(DamageTypeTags.IS_LIGHTNING) + && event.getEntity().hasData(IMMUNE_TO_LIGHTNING)){ + if(event.getEntity().getData(IMMUNE_TO_LIGHTNING)){ + event.getContainer().setNewDamage(0); + } + } + + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java b/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java new file mode 100644 index 000000000..2c7dd3738 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java @@ -0,0 +1,31 @@ +package dev.dubhe.anvilcraft.init; + +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +import java.util.function.Supplier; + +import static dev.dubhe.anvilcraft.AnvilCraft.MOD_ID; + +public class ModDataAttachments { + private static final DeferredRegister> ATTACHMENT_TYPES = + DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, MOD_ID); + + public static final Supplier> AMULET_COUNT = ATTACHMENT_TYPES.register( + "amulet_count", () -> AttachmentType.builder(() -> 0).build()); + + public static final Supplier> AMULET_MAX = ATTACHMENT_TYPES.register( + "amulet_max", () -> AttachmentType.builder(() -> 1).build()); + + public static final Supplier> DISCOUNT_RATE = ATTACHMENT_TYPES.register( + "discount_rate", () -> AttachmentType.builder(() -> 0f).build()); + + public static final Supplier> IMMUNE_TO_LIGHTNING = ATTACHMENT_TYPES.register( + "immune_to_lightning", () -> AttachmentType.builder(() -> false).build()); + + public static void register(IEventBus eventBus) { + ATTACHMENT_TYPES.register(eventBus); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java b/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java index abadc2734..4de4008df 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java @@ -22,6 +22,7 @@ import dev.dubhe.anvilcraft.item.EmberMetalShovelItem; import dev.dubhe.anvilcraft.item.EmberMetalSwordItem; import dev.dubhe.anvilcraft.item.EmberMetalUpgradeTemplateItem; +import dev.dubhe.anvilcraft.item.EmeraldAmuletItem; import dev.dubhe.anvilcraft.item.EmptyCapacitorItem; import dev.dubhe.anvilcraft.item.GeodeItem; import dev.dubhe.anvilcraft.item.GuideBookItem; @@ -35,9 +36,12 @@ import dev.dubhe.anvilcraft.item.RoyalShovelItem; import dev.dubhe.anvilcraft.item.RoyalSwordItem; import dev.dubhe.anvilcraft.item.RoyalUpgradeTemplateItem; +import dev.dubhe.anvilcraft.item.RubyAmuletItem; +import dev.dubhe.anvilcraft.item.SapphireAmuletItem; import dev.dubhe.anvilcraft.item.SeedsPackItem; import dev.dubhe.anvilcraft.item.StructureToolItem; import dev.dubhe.anvilcraft.item.SuperHeavyItem; +import dev.dubhe.anvilcraft.item.TopazAmuletItem; import dev.dubhe.anvilcraft.item.TopazItem; import dev.dubhe.anvilcraft.item.UtusanItem; import dev.dubhe.anvilcraft.util.ModelProviderUtil; @@ -418,6 +422,22 @@ public class ModItems { .model((ctx, provider) -> { }) .register(); + + public static final ItemEntry EMERALD_AMULET = REGISTRATE + .item("emerald_amulet", EmeraldAmuletItem::new) + //这里不知道加个什么tag好 .tag(ModItemTags.???) + .register(); + public static final ItemEntry TOPAZ_AMULET = REGISTRATE + .item("topaz_amulet", TopazAmuletItem::new) + .register(); + public static final ItemEntry RUBY_AMULET = REGISTRATE + .item("ruby_amulet", RubyAmuletItem::new) + .register(); + public static final ItemEntry SAPPHIRE_AMULET = REGISTRATE + .item("sapphire_amulet", SapphireAmuletItem::new) + .register(); + + public static final ItemEntry CAPACITOR = REGISTRATE .item("capacitor", CapacitorItem::new) .model((ctx, provider) -> { diff --git a/src/main/java/dev/dubhe/anvilcraft/item/AbstractAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/AbstractAmuletItem.java new file mode 100644 index 000000000..044407d67 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/item/AbstractAmuletItem.java @@ -0,0 +1,46 @@ +package dev.dubhe.anvilcraft.item; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.NotNull; + +import static dev.dubhe.anvilcraft.init.ModDataAttachments.AMULET_COUNT; +import static dev.dubhe.anvilcraft.init.ModDataAttachments.AMULET_MAX; +import static dev.dubhe.anvilcraft.init.ModDataAttachments.DISCOUNT_RATE; +import static dev.dubhe.anvilcraft.init.ModDataAttachments.IMMUNE_TO_LIGHTNING; + +public abstract class AbstractAmuletItem extends Item { + + public AbstractAmuletItem(Properties properties) { + super(properties); + } + + abstract void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected); + + @Override + public void inventoryTick(@NotNull ItemStack stack, @NotNull Level level, @NotNull Entity entity, int slotId, boolean isSelected) { + super.inventoryTick(stack, level, entity, slotId, isSelected); + if(!(stack.getItem() instanceof AbstractAmuletItem)) return; + if(!(entity instanceof Player)) return; + if (entity.getData(AMULET_COUNT) < entity.getData(AMULET_MAX)){ + UpdateAccessory(stack, level, entity, slotId, isSelected); + entity.setData(AMULET_COUNT, entity.getData(AMULET_COUNT) + 1); + } + } + + public static void resetWorkingAmuletData(@NotNull LivingEntity entity){ + if(entity.hasData(AMULET_COUNT)) + entity.setData(AMULET_COUNT, 0); + if(entity.hasData(DISCOUNT_RATE)) { + entity.setData(DISCOUNT_RATE, 0f); + } + if(entity.hasData(IMMUNE_TO_LIGHTNING)) { + entity.setData(IMMUNE_TO_LIGHTNING, false); + } + + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/item/EmeraldAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/EmeraldAmuletItem.java new file mode 100644 index 000000000..c713e1a0e --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/item/EmeraldAmuletItem.java @@ -0,0 +1,22 @@ +package dev.dubhe.anvilcraft.item; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import static dev.dubhe.anvilcraft.init.ModDataAttachments.DISCOUNT_RATE; + +public class EmeraldAmuletItem extends AbstractAmuletItem{ + public EmeraldAmuletItem(Properties properties) { + super(properties); + } + + @Override + void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if(entity instanceof Player player){ + //如果要直接加村庄英雄:player.addEffect(new MobEffectInstance(MobEffects.HERO_OF_THE_VILLAGE, 1, 2, false, false)); + player.setData(DISCOUNT_RATE, 0.3f); + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/item/RubyAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/RubyAmuletItem.java new file mode 100644 index 000000000..82c37f528 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/item/RubyAmuletItem.java @@ -0,0 +1,31 @@ +package dev.dubhe.anvilcraft.item; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class RubyAmuletItem extends AbstractAmuletItem{ + public RubyAmuletItem(Properties properties) { + super(properties); + } + + @Override + void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if(entity instanceof LivingEntity livingEntity){ + if(!livingEntity.isInLava()){ + MobEffectInstance effect = livingEntity.getEffect(MobEffects.FIRE_RESISTANCE); + if (effect == null){ + livingEntity.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, 2, 0, false, false)); + } + else if(effect.getDuration() < 3600){ + livingEntity.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, + effect.getDuration() + 2 , effect.getAmplifier(), + effect.isAmbient(), effect.isVisible())); + } + } + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/item/SapphireAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/SapphireAmuletItem.java new file mode 100644 index 000000000..10e802b7f --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/item/SapphireAmuletItem.java @@ -0,0 +1,31 @@ +package dev.dubhe.anvilcraft.item; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class SapphireAmuletItem extends AbstractAmuletItem{ + public SapphireAmuletItem(Properties properties) { + super(properties); + } + + @Override + void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if(entity instanceof LivingEntity livingEntity){ + if(!livingEntity.isInWater()){ + MobEffectInstance effect = livingEntity.getEffect(MobEffects.CONDUIT_POWER); + if (effect == null){ + livingEntity.addEffect(new MobEffectInstance(MobEffects.CONDUIT_POWER, 2, 0, false, false)); + } + else if(effect.getDuration() < 3600){ + livingEntity.addEffect(new MobEffectInstance(MobEffects.CONDUIT_POWER, + effect.getDuration() + 2 , effect.getAmplifier(), + effect.isAmbient(), effect.isVisible())); + } + } + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/item/TopazAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/TopazAmuletItem.java new file mode 100644 index 000000000..eeffe0966 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/item/TopazAmuletItem.java @@ -0,0 +1,22 @@ +package dev.dubhe.anvilcraft.item; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import static dev.dubhe.anvilcraft.init.ModDataAttachments.IMMUNE_TO_LIGHTNING; + +public class TopazAmuletItem extends AbstractAmuletItem{ + public TopazAmuletItem(Properties properties) { + super(properties); + } + + @Override + void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + //这个可能主要是从另一边(实体被闪电击中)的事件监听效果那边写的,同样用的是data attachment + if(entity instanceof LivingEntity){ + entity.setData(IMMUNE_TO_LIGHTNING, true); + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/InventoryMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/InventoryMixin.java new file mode 100644 index 000000000..3115e5535 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/InventoryMixin.java @@ -0,0 +1,25 @@ +package dev.dubhe.anvilcraft.mixin; + +import dev.dubhe.anvilcraft.item.AbstractAmuletItem; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.entity.player.Player; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Inventory.class) +abstract class InventoryMixin { + @Shadow @Final public Player player; + + @Inject( + method = "tick", + at = @At(value = "HEAD"), + cancellable = true + ) + private void PreInventoryTick(CallbackInfo ci){ + AbstractAmuletItem.resetWorkingAmuletData(this.player); + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/VillagerMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/VillagerMixin.java new file mode 100644 index 000000000..c89f158f1 --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/VillagerMixin.java @@ -0,0 +1,42 @@ +package dev.dubhe.anvilcraft.mixin; + +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.npc.AbstractVillager; +import net.minecraft.world.entity.npc.Villager; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.trading.MerchantOffer; +import net.minecraft.world.level.Level; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static dev.dubhe.anvilcraft.init.ModDataAttachments.DISCOUNT_RATE; + +@Mixin(Villager.class) +abstract public class VillagerMixin extends AbstractVillager { + public VillagerMixin(EntityType entityType, Level level) { + super(entityType, level); + } + + @Inject( + method = "updateSpecialPrices", + at = + @At( + value = "TAIL"), + //"INVOKE", + //target = "Lnet/minecraft/world/entity/npc/Villager;getPlayerReputation(Lnet/minecraft/world/entity/player/Player;)I"), + cancellable = true) + private void updateAmuletSpecialPrices(Player player, CallbackInfo ci){ + //如果需要不叠加,就加上&& !player.hasEffect(MobEffects.HERO_OF_THE_VILLAGE) + if(player.hasData(DISCOUNT_RATE)){ + double d = player.getData(DISCOUNT_RATE); + if(d == 0f) return; + for (MerchantOffer merchantOffer : this.getOffers()) { + int k = (int)Math.floor(d * merchantOffer.getBaseCostA().getCount()); + merchantOffer.addToSpecialPriceDiff(-Math.max(k, 1)); + } + } + + } +} diff --git a/src/main/resources/anvilcraft.mixins.json b/src/main/resources/anvilcraft.mixins.json index ca4df8db0..01bec8a61 100644 --- a/src/main/resources/anvilcraft.mixins.json +++ b/src/main/resources/anvilcraft.mixins.json @@ -18,6 +18,7 @@ "ExplosionMixin", "FlyingHitEntityMixin", "HopperBlockMixin", + "InventoryMixin", "ItemEntityMixin", "PistonBaseBlockMixin", "PistonMovingBlockEntityMixin", @@ -25,6 +26,7 @@ "PlayerHitEntityMixin", "RecipeManagerMixin", "ServerLevelMixin", + "VillagerMixin", "accessor.BaseSpawnerAccessor", "forge.FallingBlockEntityMixin", "forge.LevelChunkMixin",