diff --git a/dependencies.gradle b/dependencies.gradle index 15f990317..8aa316484 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -42,7 +42,8 @@ dependencies { compileOnly(libs.theoneprobe) compileOnly(libs.kubejs) - compileOnly("maven.modrinth:create:1.21.1-6.0.0") + // Create + implementation(libs.create) // compileOnly("org.sinytra.forgified-fabric-api:fabric-api-base:0.4.42+d1308ded19") // compileOnly("org.sinytra.forgified-fabric-api:fabric-renderer-api-v1:3.4.0+acb05a3919") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3778f844c..0c7227b80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,6 +17,7 @@ lombok = "8.7.1" machete = "1.+" anvillib = "1.1.0+build.97" curios = "9.0.15+1.21.1" +create = "1.21.1-6.0.0" [libraries] neoForge = { group = "net.neoforged", name = "neoforge", version.ref = "neoForge" } @@ -35,6 +36,7 @@ kubejs = { group = "dev.latvian.mods", name = "kubejs-neoforge", version.ref = " patchouli = { group = "vazkii.patchouli", name = "Patchouli", version.ref = "patchouli" } anvillib = { group = "dev.anvilcraft.lib", name = "anvillib-neoforge-1.21.1", version.ref = "anvillib" } curios = { group = "top.theillusivec4.curios", name = "curios-neoforge", version.ref = "curios" } +create = { group = "maven.modrinth", name = "create", version.ref = "create" } [plugins] diff --git a/src/generated/resources/assets/anvilcraft/lang/en_ud.json b/src/generated/resources/assets/anvilcraft/lang/en_ud.json index 25887663c..a90e6fe01 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_ud.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_ud.json @@ -365,6 +365,7 @@ "item.anvilcraft.cocoa_butter": "ɹǝʇʇnᗺ ɐoɔoƆ", "item.anvilcraft.cocoa_liquor": "ɹonbıꞀ ɐoɔoƆ", "item.anvilcraft.cocoa_powder": "ɹǝpʍoԀ ɐoɔoƆ", + "item.anvilcraft.cogwheel_amulet": "ʇǝןnɯⱯ ןǝǝɥʍboƆ", "item.anvilcraft.comrade_amulet": "ʇǝןnɯⱯ ǝpɐɹɯoƆ", "item.anvilcraft.comrade_amulet.tooltip": ":sɹǝʎɐןd pǝubıS", "item.anvilcraft.copper_nugget": "ʇǝbbnN ɹǝddoƆ", diff --git a/src/generated/resources/assets/anvilcraft/lang/en_us.json b/src/generated/resources/assets/anvilcraft/lang/en_us.json index a2065c8cf..5fbb35cf3 100644 --- a/src/generated/resources/assets/anvilcraft/lang/en_us.json +++ b/src/generated/resources/assets/anvilcraft/lang/en_us.json @@ -365,6 +365,7 @@ "item.anvilcraft.cocoa_butter": "Cocoa Butter", "item.anvilcraft.cocoa_liquor": "Cocoa Liquor", "item.anvilcraft.cocoa_powder": "Cocoa Powder", + "item.anvilcraft.cogwheel_amulet": "Cogwheel Amulet", "item.anvilcraft.comrade_amulet": "Comrade Amulet", "item.anvilcraft.comrade_amulet.tooltip": "Signed players:", "item.anvilcraft.copper_nugget": "Copper Nugget", diff --git a/src/generated/resources/assets/anvilcraft/models/item/cogwheel_amulet.json b/src/generated/resources/assets/anvilcraft/models/item/cogwheel_amulet.json new file mode 100644 index 000000000..bba2ac2de --- /dev/null +++ b/src/generated/resources/assets/anvilcraft/models/item/cogwheel_amulet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "anvilcraft:item/cogwheel_amulet" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/cogwheel_amulet.json b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/cogwheel_amulet.json new file mode 100644 index 000000000..c4d3832f9 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/advancement/recipe/jewel_crafting/cogwheel_amulet.json @@ -0,0 +1,21 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_the_recipe": { + "conditions": { + "recipe": "anvilcraft:jewel_crafting/cogwheel_amulet" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "anvilcraft:jewel_crafting/cogwheel_amulet" + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/cogwheel_amulet.json b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/cogwheel_amulet.json new file mode 100644 index 000000000..0d4f44436 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/recipe/jewel_crafting/cogwheel_amulet.json @@ -0,0 +1,72 @@ +{ + "type": "anvilcraft:jewel_crafting", + "ingredients": [ + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "anvilcraft:silver_block" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "create:precision_mechanism" + }, + { + "item": "anvilcraft:royal_steel_ingot" + } + ], + "result": { + "count": 1, + "id": "anvilcraft:cogwheel_amulet" + } +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java index ca04ec0ae..508ccb7a2 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java @@ -13,6 +13,7 @@ import dev.dubhe.anvilcraft.recipe.anvil.cache.RecipeCaches; import dev.dubhe.anvilcraft.util.AmuletUtil; import dev.dubhe.anvilcraft.util.InventoryUtil; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -77,17 +78,7 @@ public static void onJoinedServer(PlayerEvent.PlayerLoggedInEvent event) { public static void onPlayerUsingTotem(LivingUseTotemEvent event) { if (event.getEntity() instanceof ServerPlayer player && player.getInventory().contains(ModItems.AMULET_BOX.asStack())) { Inventory inventory = player.getInventory(); - - boolean isConsumeAmuletBox; - if (inventory.contains(Items.TOTEM_OF_UNDYING.getDefaultInstance())) { - inventory.removeItem(Items.TOTEM_OF_UNDYING.getDefaultInstance()); - isConsumeAmuletBox = false; - } else { - inventory.removeItem(ModItems.AMULET_BOX.asStack()); - isConsumeAmuletBox = true; - } - - AmuletUtil.startRaffle(player, event.getSource(), isConsumeAmuletBox); + AmuletUtil.startRaffle(player, event.getSource(), !inventory.contains(Items.TOTEM_OF_UNDYING.getDefaultInstance())); } } @@ -107,6 +98,14 @@ public static void onPlayerHurt(LivingIncomingDamageEvent event) { event.getContainer().setNewDamage(0); } + if ( + Optional.ofNullable(sources.damageTypes.getKey(source.type())) + .orElse(ResourceLocation.fromNamespaceAndPath("minecraft", "empty")).getNamespace().contains("create") + && player.getData(ModDataAttachments.CREATE_MASTER) + ) { + event.getContainer().setNewDamage(0); + } + ItemStack comrade = InventoryUtil.getFirstItem(inventory, ModItems.COMRADE_AMULET); try { UUID causingEntityUUID = Objects.requireNonNull(source.getEntity()).getUUID(); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java b/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java index 3a6520989..19359821a 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModDataAttachments.java @@ -39,8 +39,8 @@ public class ModDataAttachments { public static final Supplier> STEEL_HEAD = ATTACHMENT_TYPES.register( "steel_head", () -> AttachmentType.builder(() -> false).serialize(Codec.BOOL).build()); - //public static final Supplier> CREATE_MASTER = ATTACHMENT_TYPES.register( - // "create_master", () -> AttachmentType.builder(() -> false).serialize(Codec.BOOL).build()); + public static final Supplier> CREATE_MASTER = ATTACHMENT_TYPES.register( + "create_master", () -> AttachmentType.builder(() -> false).serialize(Codec.BOOL).build()); public static final Supplier> AMULET_RAFFLE_PROBABILITY = ATTACHMENT_TYPES.register( "amulet_raffle_probability", () -> AttachmentType.builder(CompoundTag::new).serialize(CompoundTag.CODEC).build()); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java b/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java index bce810f36..ece898f21 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/ModItems.java @@ -7,6 +7,7 @@ import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.block.state.Color; import dev.dubhe.anvilcraft.data.AnvilCraftDatagen; +import dev.dubhe.anvilcraft.integration.create.CreateIntegration; import dev.dubhe.anvilcraft.item.AmethystAxeItem; import dev.dubhe.anvilcraft.item.AmethystHoeItem; import dev.dubhe.anvilcraft.item.AmethystPickaxeItem; @@ -30,6 +31,7 @@ import dev.dubhe.anvilcraft.item.amulet.AbstractAmuletItem; import dev.dubhe.anvilcraft.item.amulet.AnvilAmuletItem; import dev.dubhe.anvilcraft.item.amulet.CatAmuletItem; +import dev.dubhe.anvilcraft.item.amulet.CogwheelAmuletItem; import dev.dubhe.anvilcraft.item.amulet.ComradeAmuletItem; import dev.dubhe.anvilcraft.item.amulet.DogAmuletItem; import dev.dubhe.anvilcraft.item.amulet.EmeraldAmuletItem; @@ -80,10 +82,13 @@ import net.minecraft.world.item.ShovelItem; import net.minecraft.world.item.SwordItem; import net.minecraft.world.item.crafting.Ingredient; +import net.neoforged.fml.loading.LoadingModList; import net.neoforged.neoforge.client.model.generators.ItemModelBuilder; import net.neoforged.neoforge.client.model.generators.ModelFile; import net.neoforged.neoforge.common.Tags; +import java.util.function.Supplier; + import static dev.dubhe.anvilcraft.AnvilCraft.REGISTRATE; @SuppressWarnings({"unused", "CodeBlock2Expr"}) @@ -561,11 +566,15 @@ public static ItemEntry createAmuletItem( "anvil", AnvilAmuletItem::new, builder -> builder.requires(Items.ANVIL) ); - //public static final ItemEntry COGWHEEL_AMULET = - // createAmuletItem( - // "cogwheel", CogwheelAmuletItem::new, - // builder -> builder.requires(AllItems.PRECISION_MECHANISM, 16) - // ); + public static final ItemEntry COGWHEEL_AMULET; + static { + Supplier> cogwheelAmuletSupplier = () -> CreateIntegration.COGWHEEL_AMULET; + if (LoadingModList.get().getModFileById("create") != null) { + COGWHEEL_AMULET = cogwheelAmuletSupplier.get(); + } else { + COGWHEEL_AMULET = null; + } + } public static final ItemEntry COMRADE_AMULET = createAmuletItem( "comrade", ComradeAmuletItem::new, diff --git a/src/main/java/dev/dubhe/anvilcraft/integration/create/CreateIntegration.java b/src/main/java/dev/dubhe/anvilcraft/integration/create/CreateIntegration.java index b1e0edce4..631cb7723 100644 --- a/src/main/java/dev/dubhe/anvilcraft/integration/create/CreateIntegration.java +++ b/src/main/java/dev/dubhe/anvilcraft/integration/create/CreateIntegration.java @@ -1,19 +1,27 @@ package dev.dubhe.anvilcraft.integration.create; +import com.simibubi.create.AllItems; import com.simibubi.create.api.boiler.BoilerHeater; import com.simibubi.create.api.registry.SimpleRegistry; +import com.tterrag.registrate.util.entry.ItemEntry; import dev.dubhe.anvilcraft.api.integration.Integration; import dev.dubhe.anvilcraft.block.GlowingMetalBlock; import dev.dubhe.anvilcraft.block.HeaterBlock; import dev.dubhe.anvilcraft.block.IncandescentMetalBlock; import dev.dubhe.anvilcraft.block.RedhotMetalBlock; import dev.dubhe.anvilcraft.init.ModBlocks; +import dev.dubhe.anvilcraft.init.ModItems; +import dev.dubhe.anvilcraft.item.amulet.CogwheelAmuletItem; +import dev.dubhe.anvilcraft.recipe.JewelCraftingRecipe; import net.minecraft.core.BlockPos; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; +import static dev.dubhe.anvilcraft.AnvilCraft.REGISTRATE; + @Integration("create") public class CreateIntegration { private static final BoilerHeater HEATER = CreateIntegration::heater; @@ -59,4 +67,15 @@ public float getHeat(Level level, BlockPos blockPos, BlockState blockState) { return this.level; } } + + public static final ItemEntry COGWHEEL_AMULET = REGISTRATE + .item("cogwheel_amulet", CogwheelAmuletItem::new) + .properties(properties -> properties.stacksTo(1)) + .recipe((ctx, provider) -> JewelCraftingRecipe.builder() + .requires(ModBlocks.SILVER_BLOCK, 4) + .requires(AllItems.PRECISION_MECHANISM, 16) + .requires(ModItems.ROYAL_STEEL_INGOT) + .result(new ItemStack(ctx.get())) + .save(provider)) + .register(); } diff --git a/src/main/java/dev/dubhe/anvilcraft/integration/curios/CuriosIntegration.java b/src/main/java/dev/dubhe/anvilcraft/integration/curios/CuriosIntegration.java index 6596372dc..54005b7af 100644 --- a/src/main/java/dev/dubhe/anvilcraft/integration/curios/CuriosIntegration.java +++ b/src/main/java/dev/dubhe/anvilcraft/integration/curios/CuriosIntegration.java @@ -11,6 +11,7 @@ import net.minecraft.client.model.geom.builders.LayerDefinition; import net.minecraft.world.item.ItemStack; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.loading.LoadingModList; import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; import net.neoforged.neoforge.client.event.EntityRenderersEvent; import org.jetbrains.annotations.NotNull; @@ -46,8 +47,25 @@ private void registerCapabilities(RegisterCapabilitiesEvent event) { ModItems.ANVIL_HAMMER, ModItems.ROYAL_ANVIL_HAMMER, ModItems.EMBER_ANVIL_HAMMER, - ModItems.IONOCRAFT_BACKPACK + ModItems.IONOCRAFT_BACKPACK, + ModItems.ANVIL_AMULET, + ModItems.CAT_AMULET, + ModItems.COMRADE_AMULET, + ModItems.DOG_AMULET, + ModItems.EMERALD_AMULET, + ModItems.FEATHER_AMULET, + ModItems.RUBY_AMULET, + ModItems.SAPPHIRE_AMULET, + ModItems.SILENCE_AMULET, + ModItems.TOPAZ_AMULET ); + if (LoadingModList.get().getModFileById("create") != null) { + event.registerItem( + CuriosCapability.ITEM, + (stack, context) -> () -> stack, + ModItems.COGWHEEL_AMULET + ); + } } private boolean isAnvilHammerWearing(ICuriosItemHandler itemHandler) { diff --git a/src/main/java/dev/dubhe/anvilcraft/item/amulet/AbstractAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/amulet/AbstractAmuletItem.java index 94a4758c7..34ba91abd 100644 --- a/src/main/java/dev/dubhe/anvilcraft/item/amulet/AbstractAmuletItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/item/amulet/AbstractAmuletItem.java @@ -13,6 +13,7 @@ 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.CREATE_MASTER; import static dev.dubhe.anvilcraft.init.ModDataAttachments.DISCOUNT_RATE; import static dev.dubhe.anvilcraft.init.ModDataAttachments.IMMUNE_TO_LIGHTNING; import static dev.dubhe.anvilcraft.init.ModDataAttachments.NO_FALL_DAMAGE; @@ -58,6 +59,9 @@ public static void resetWorkingAmuletData(@NotNull LivingEntity entity){ if (entity.hasData(STEEL_HEAD)) { entity.setData(STEEL_HEAD, false); } + if (entity.hasData(CREATE_MASTER)) { + entity.setData(CREATE_MASTER, false); + } if (entity.hasData(SCARE_ENTITIES)) { CompoundTag root = entity.getData(ModDataAttachments.SCARE_ENTITIES); root.putBoolean("skeletons", false); diff --git a/src/main/java/dev/dubhe/anvilcraft/item/amulet/CogwheelAmuletItem.java b/src/main/java/dev/dubhe/anvilcraft/item/amulet/CogwheelAmuletItem.java index 249e54bb4..ef207dc84 100644 --- a/src/main/java/dev/dubhe/anvilcraft/item/amulet/CogwheelAmuletItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/item/amulet/CogwheelAmuletItem.java @@ -1,15 +1,20 @@ package dev.dubhe.anvilcraft.item.amulet; +import dev.dubhe.anvilcraft.init.ModDataAttachments; 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; -// Unregistered public class CogwheelAmuletItem extends AbstractAmuletItem { public CogwheelAmuletItem(Properties properties) { super(properties); } @Override - void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) {} + void UpdateAccessory(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if (entity instanceof Player player) { + player.setData(ModDataAttachments.CREATE_MASTER, true); + } + } } diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/ClientPacketListenerMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/ClientPacketListenerMixin.java new file mode 100644 index 000000000..3bd1b58de --- /dev/null +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/ClientPacketListenerMixin.java @@ -0,0 +1,45 @@ +package dev.dubhe.anvilcraft.mixin; + +import dev.dubhe.anvilcraft.init.ModItems; +import dev.dubhe.anvilcraft.util.InventoryUtil; +import net.minecraft.client.multiplayer.ClientPacketListener; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +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.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Optional; + +@Mixin(ClientPacketListener.class) +public class ClientPacketListenerMixin { + @Redirect( + method = "findTotem", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/item/ItemStack;is(Lnet/minecraft/world/item/Item;)Z" + ) + ) + private static boolean alsoCheckAmuletBox(ItemStack instance, Item item) { + return instance.is(item) || instance.is(ModItems.AMULET_BOX); + } + @Inject( + method = "findTotem", + at = @At("RETURN"), + cancellable = true + ) + private static void returnCorrect(Player player, CallbackInfoReturnable cir) { + ItemStack result = cir.getReturnValue(); + if (result.is(ModItems.AMULET_BOX)) { + cir.setReturnValue( + Optional.of(InventoryUtil.getFirstItem(player.getInventory(), Items.TOTEM_OF_UNDYING)) + .filter(stack -> stack != ItemStack.EMPTY) + .orElse(result) + ); + } + } +} diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/LivingEntityMixin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/LivingEntityMixin.java index eef5a1217..50c6d2d4c 100644 --- a/src/main/java/dev/dubhe/anvilcraft/mixin/LivingEntityMixin.java +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/LivingEntityMixin.java @@ -1,12 +1,16 @@ package dev.dubhe.anvilcraft.mixin; import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import dev.dubhe.anvilcraft.init.ModItems; import dev.dubhe.anvilcraft.init.ModLootTables; +import dev.dubhe.anvilcraft.util.InventoryUtil; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; 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.item.Items; @@ -14,14 +18,19 @@ import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; 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.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.Optional; + @Mixin(LivingEntity.class) public abstract class LivingEntityMixin extends Entity { + @Shadow public abstract ItemStack getOffhandItem(); private LivingEntityMixin(EntityType entityType, Level level) { super(entityType, level); @@ -56,7 +65,6 @@ private void dropBeheadingLoot( private boolean alsoCheckAmuletBox(ItemStack instance, Item item) { return instance.is(item) || instance.is(ModItems.AMULET_BOX); } - @ModifyArg( method = "checkTotemDeathProtection", at = @At( @@ -67,7 +75,6 @@ private boolean alsoCheckAmuletBox(ItemStack instance, Item item) { private Object alsoAwardAmuletBoxStat(Object value, @Local ItemStack stack) { return stack.getItem(); } - @ModifyArg( method = "checkTotemDeathProtection", at = @At( @@ -81,4 +88,45 @@ private Object alsoAwardAmuletBoxStat(Object value, @Local ItemStack stack) { private ItemStack onlyUseTotemToTrigger(ItemStack stack) { return Items.TOTEM_OF_UNDYING.getDefaultInstance(); } + @ModifyVariable( + method = "checkTotemDeathProtection", + at = @At( + value = "STORE", + ordinal = 1 + ), + ordinal = 0 + ) + private ItemStack firstUseTotem( + ItemStack originalCopy, @Local(name = "itemstack1") ItemStack original, @Share("consumed") LocalRef ref + ) { + ref.set(original); + if (originalCopy.is(Items.TOTEM_OF_UNDYING)) { + return originalCopy; + } else if (originalCopy.is(ModItems.AMULET_BOX.asItem())) { + if (this.getOffhandItem().is(Items.TOTEM_OF_UNDYING)) { + ref.set(this.getOffhandItem()); + } else if (((Object) this) instanceof Player player) { + Optional optional = Optional.of(InventoryUtil.getFirstItem(player.getInventory(), Items.TOTEM_OF_UNDYING)) + .filter(stack -> stack != ItemStack.EMPTY); + if (optional.isPresent()) { + ref.set(optional.get()); + } else { + return originalCopy; + } + } else { + return originalCopy; + } + } else { + return originalCopy; + } + + return ref.get(); + } + @Redirect( + method = "checkTotemDeathProtection", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/ItemStack;shrink(I)V") + ) + private void shrinkCorrect(ItemStack instance, int decrement, @Share("consumed") LocalRef ref) { + ref.get().shrink(decrement); + } } diff --git a/src/main/java/dev/dubhe/anvilcraft/mixin/plugin/AnvilCraftMixinPlugin.java b/src/main/java/dev/dubhe/anvilcraft/mixin/plugin/AnvilCraftMixinPlugin.java index fdee7042d..be12f2e6e 100644 --- a/src/main/java/dev/dubhe/anvilcraft/mixin/plugin/AnvilCraftMixinPlugin.java +++ b/src/main/java/dev/dubhe/anvilcraft/mixin/plugin/AnvilCraftMixinPlugin.java @@ -11,7 +11,7 @@ public class AnvilCraftMixinPlugin implements IMixinConfigPlugin { private static boolean hasZetaPiston = false; - private static final boolean hasCreate = false; + private static boolean hasCreate = false; private static boolean hasReiScreen = false; private boolean isLoaded(String clazz) { @@ -26,6 +26,7 @@ public void onLoad(String mixinPackage) { != null; hasZetaPiston = this.isLoaded("org/violetmoon/zeta/piston/ZetaPistonStructureResolver.class"); hasReiScreen = this.isLoaded("me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.class"); + hasCreate = this.isLoaded("com/simibubi/create/Create"); } @Override diff --git a/src/main/java/dev/dubhe/anvilcraft/util/AmuletUtil.java b/src/main/java/dev/dubhe/anvilcraft/util/AmuletUtil.java index 7ed095a06..45ae2d809 100644 --- a/src/main/java/dev/dubhe/anvilcraft/util/AmuletUtil.java +++ b/src/main/java/dev/dubhe/anvilcraft/util/AmuletUtil.java @@ -17,10 +17,12 @@ import net.minecraft.world.damagesource.DamageTypes; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; +import net.neoforged.fml.loading.LoadingModList; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.Collections; +import java.util.Objects; import java.util.Optional; import java.util.function.BiPredicate; @@ -60,19 +62,12 @@ public enum Type { .isPresent(), ModItems.ANVIL_AMULET ), - //COGWHEEL( - // "cogwheel", (sources, source) -> - // source.type().equals(sources.damageTypes.get(AllDamageTypes.CRUSH)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.CUCKOO_SURPRISE)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.FAN_FIRE)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.FAN_LAVA)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.DRILL)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.ROLLER)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.SAW)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.POTATO_CANNON)) - // || source.type().equals(sources.damageTypes.get(AllDamageTypes.RUN_OVER)), - // ModItems.COGWHEEL_AMULET - //), + COGWHEEL( + "cogwheel", (sources, source) -> + LoadingModList.get().getModFileById("create") != null + || Objects.requireNonNull(sources.damageTypes.getKey(source.type())).getNamespace().contains("create"), + ModItems.COGWHEEL_AMULET + ), COMRADE( "comrade", (sources, source) -> { if (source.getEntity() instanceof Player murder && source.getDirectEntity() instanceof Player victim) { @@ -183,7 +178,11 @@ public static void setRaffleProbability(Player player, Type type, NonNullUnaryOp @SuppressWarnings("BooleanMethodIsAlwaysInverted") public static boolean hasAmuletInInventory(Player player, Type type) { - return player.getInventory().hasAnyOf(Collections.singleton(type.getEntry().asItem())); + try { + return player.getInventory().hasAnyOf(Collections.singleton(Objects.requireNonNull(type.getEntry()).asItem())); + } catch (NullPointerException ignored) { + return false; + } } public static void startRaffle(ServerPlayer player, DamageSource source, boolean isConsumeAmuletBox) { @@ -198,7 +197,10 @@ public static void startRaffle(ServerPlayer player, DamageSource source, boolean player.getInventory().add(type.getEntry().asStack()); } } else { - AmuletUtil.setRaffleProbability(player, source, value -> Math.min(value + 5, 50)); + AmuletUtil.setRaffleProbability( + player, source, + value -> Math.min(value + (isConsumeAmuletBox ? 20 : 5), 50) + ); } } } diff --git a/src/main/resources/anvilcraft.mixins.json b/src/main/resources/anvilcraft.mixins.json index 7c5321210..ddc9d0e69 100644 --- a/src/main/resources/anvilcraft.mixins.json +++ b/src/main/resources/anvilcraft.mixins.json @@ -49,6 +49,7 @@ ], "client": [ "ClientLevelMixin", + "ClientPacketListenerMixin", "GameRendererMixin", "GuiGraphicsMixin", "ItemInHandRendererMixin", diff --git a/src/main/resources/assets/anvilcraft/lang/zh_cn.json b/src/main/resources/assets/anvilcraft/lang/zh_cn.json index 54c4144af..bfef03745 100644 --- a/src/main/resources/assets/anvilcraft/lang/zh_cn.json +++ b/src/main/resources/assets/anvilcraft/lang/zh_cn.json @@ -364,6 +364,7 @@ "item.anvilcraft.cocoa_butter": "可可脂", "item.anvilcraft.cocoa_liquor": "可可液块", "item.anvilcraft.cocoa_powder": "可可粉", + "item.anvilcraft.cogwheel_amulet": "齿轮护符", "item.anvilcraft.comrade_amulet": "战友护符", "item.anvilcraft.comrade_amulet.tooltip": "已签名的玩家:", "item.anvilcraft.copper_nugget": "铜粒", diff --git a/src/main/resources/data/anvilcraft/curios/entities/player.json b/src/main/resources/data/anvilcraft/curios/entities/player.json index 4816a2167..787c37625 100644 --- a/src/main/resources/data/anvilcraft/curios/entities/player.json +++ b/src/main/resources/data/anvilcraft/curios/entities/player.json @@ -4,6 +4,7 @@ "minecraft:player" ], "slots": [ - "head" + "head", + "necklace" ] } \ No newline at end of file diff --git a/src/main/resources/data/curios/tags/item/necklace.json b/src/main/resources/data/curios/tags/item/necklace.json new file mode 100644 index 000000000..39e4f0bdd --- /dev/null +++ b/src/main/resources/data/curios/tags/item/necklace.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "#anvilcraft:amulet", + { "id": "anvilcraft:cogwheel_amulet", "required": false } + ] +} \ No newline at end of file