diff --git a/README.md b/README.md index d647a22..a91f5c3 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,13 @@ tracked per attacking player and ailment; their configured minimum is 60 ticks ( ## Admin commands -`/ascendailments apply ...` supports all seven effects and `/ascendailments clear ` removes the library's +`/ascendailments apply ...` supports all eight effects and `/ascendailments clear ` removes the library's effects and metadata. Permission level 2 is required. Durations are ticks; amplifier arguments use vanilla's zero-based convention. + +## Creative test items + +The Tools & Utilities creative tab contains one glowing debug stick for each of the eight ailments. A successful +direct hit applies the named effect through the normal source-aware API. Soul Rot, Bleed, and Fracture add their +configured stacks; the other effects use `taggedWeaponEffectDurationTicks`. The sticks have no recipes and only apply +effects when wielded by a player in Creative Mode, including on multiplayer and dedicated servers. diff --git a/src/main/java/net/fretux/ailments/AscendAilments.java b/src/main/java/net/fretux/ailments/AscendAilments.java index b41e264..bf2c66d 100644 --- a/src/main/java/net/fretux/ailments/AscendAilments.java +++ b/src/main/java/net/fretux/ailments/AscendAilments.java @@ -5,6 +5,7 @@ import net.fretux.ailments.command.AilmentCommands; import net.fretux.ailments.compat.AscendCompat; import net.fretux.ailments.config.AilmentsConfig; import net.fretux.ailments.registry.ModEffects; +import net.fretux.ailments.registry.ModItems; import net.fretux.ailments.network.AilmentNetwork; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.RegisterCommandsEvent; @@ -23,6 +24,7 @@ public final class AscendAilments { public AscendAilments(FMLJavaModLoadingContext context) { IEventBus modBus = context.getModEventBus(); ModEffects.register(modBus); + ModItems.register(modBus); AilmentNetwork.register(); modBus.addListener(this::commonSetup); // Gameplay settings belong to the server and are synchronized to multiplayer clients by Forge. diff --git a/src/main/java/net/fretux/ailments/item/DebugAilmentStickItem.java b/src/main/java/net/fretux/ailments/item/DebugAilmentStickItem.java new file mode 100644 index 0000000..4d9ba5f --- /dev/null +++ b/src/main/java/net/fretux/ailments/item/DebugAilmentStickItem.java @@ -0,0 +1,53 @@ +package net.fretux.ailments.item; + +import net.fretux.ailments.api.AilmentApi; +import net.fretux.ailments.api.AilmentApplication; +import net.fretux.ailments.api.AilmentType; +import net.fretux.ailments.config.AilmentsConfig; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +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.TooltipFlag; +import net.minecraft.world.level.Level; + +import javax.annotation.Nullable; +import java.util.List; + +/** Creative-only test item that applies one ailment through the authoritative public API. */ +public final class DebugAilmentStickItem extends Item { + private final AilmentType ailmentType; + + public DebugAilmentStickItem(AilmentType ailmentType, Properties properties) { + super(properties); + this.ailmentType = ailmentType; + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + if (target.level().isClientSide || !(attacker instanceof Player player) || !player.isCreative()) return false; + + return switch (ailmentType) { + case SOUL_ROT, BLEED, FRACTURE -> + AilmentApi.applyEffect(target, attacker, AilmentApplication.stack(ailmentType)); + case FEAR, CHARM, TAUNT, OVERCHARM, WINDED -> + AilmentApi.applyEffect(target, attacker, ailmentType, + AilmentsConfig.value(AilmentsConfig.TAGGED_WEAPON_EFFECT_DURATION), 0); + }; + } + + @Override + public boolean isFoil(ItemStack stack) { + return true; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, + TooltipFlag tooltipFlag) { + tooltip.add(Component.translatable("item.ascend_ailments.debug_stick.tooltip") + .withStyle(ChatFormatting.GRAY)); + super.appendHoverText(stack, level, tooltip, tooltipFlag); + } +} diff --git a/src/main/java/net/fretux/ailments/registry/ModItems.java b/src/main/java/net/fretux/ailments/registry/ModItems.java new file mode 100644 index 0000000..2cf00c4 --- /dev/null +++ b/src/main/java/net/fretux/ailments/registry/ModItems.java @@ -0,0 +1,59 @@ +package net.fretux.ailments.registry; + +import net.fretux.ailments.AscendAilments; +import net.fretux.ailments.api.AilmentType; +import net.fretux.ailments.item.DebugAilmentStickItem; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Rarity; +import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import java.util.List; + +/** Item registration for development tools that are intentionally unavailable in survival progression. */ +public final class ModItems { + public static final DeferredRegister ITEMS = + DeferredRegister.create(ForgeRegistries.ITEMS, AscendAilments.MOD_ID); + + public static final RegistryObject SOUL_ROT_DEBUG_STICK = debugStick("soul_rot", AilmentType.SOUL_ROT); + public static final RegistryObject BLEED_DEBUG_STICK = debugStick("bleed", AilmentType.BLEED); + public static final RegistryObject FRACTURE_DEBUG_STICK = debugStick("fracture", AilmentType.FRACTURE); + public static final RegistryObject FEAR_DEBUG_STICK = debugStick("fear", AilmentType.FEAR); + public static final RegistryObject CHARM_DEBUG_STICK = debugStick("charm", AilmentType.CHARM); + public static final RegistryObject TAUNT_DEBUG_STICK = debugStick("taunt", AilmentType.TAUNT); + public static final RegistryObject OVERCHARM_DEBUG_STICK = debugStick("overcharm", AilmentType.OVERCHARM); + public static final RegistryObject WINDED_DEBUG_STICK = debugStick("winded", AilmentType.WINDED); + + private static final List> DEBUG_STICKS = List.of( + SOUL_ROT_DEBUG_STICK, + BLEED_DEBUG_STICK, + FRACTURE_DEBUG_STICK, + FEAR_DEBUG_STICK, + CHARM_DEBUG_STICK, + TAUNT_DEBUG_STICK, + OVERCHARM_DEBUG_STICK, + WINDED_DEBUG_STICK + ); + + public static void register(IEventBus modBus) { + ITEMS.register(modBus); + modBus.addListener(ModItems::addCreativeItems); + } + + private static RegistryObject debugStick(String effectName, AilmentType ailmentType) { + return ITEMS.register(effectName + "_debug_stick", + () -> new DebugAilmentStickItem(ailmentType, + new Item.Properties().stacksTo(1).rarity(Rarity.EPIC))); + } + + private static void addCreativeItems(BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) + DEBUG_STICKS.forEach(event::accept); + } + + private ModItems() {} +} diff --git a/src/main/resources/assets/ascend_ailments/lang/en_us.json b/src/main/resources/assets/ascend_ailments/lang/en_us.json index f1b33c5..2764d89 100644 --- a/src/main/resources/assets/ascend_ailments/lang/en_us.json +++ b/src/main/resources/assets/ascend_ailments/lang/en_us.json @@ -7,6 +7,15 @@ "effect.ascend_ailments.taunt": "Taunt", "effect.ascend_ailments.overcharm": "Overcharm", "effect.ascend_ailments.winded": "Winded", + "item.ascend_ailments.soul_rot_debug_stick": "Soul Rot Debug Stick", + "item.ascend_ailments.bleed_debug_stick": "Bleed Debug Stick", + "item.ascend_ailments.fracture_debug_stick": "Fracture Debug Stick", + "item.ascend_ailments.fear_debug_stick": "Fear Debug Stick", + "item.ascend_ailments.charm_debug_stick": "Charm Debug Stick", + "item.ascend_ailments.taunt_debug_stick": "Taunt Debug Stick", + "item.ascend_ailments.overcharm_debug_stick": "Overcharm Debug Stick", + "item.ascend_ailments.winded_debug_stick": "Winded Debug Stick", + "item.ascend_ailments.debug_stick.tooltip": "Applies this ailment on hit; only works in Creative Mode.", "gui.ascend_ailments.hemorrhage": "Hemorrhage", "death.attack.bleed": "%1$s bled out", "death.attack.bleed.player": "%1$s bled out while fighting %2$s" diff --git a/src/main/resources/assets/ascend_ailments/models/item/bleed_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/bleed_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/bleed_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/charm_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/charm_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/charm_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/fear_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/fear_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/fear_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/fracture_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/fracture_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/fracture_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/overcharm_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/overcharm_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/overcharm_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/soul_rot_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/soul_rot_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/soul_rot_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/taunt_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/taunt_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/taunt_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/assets/ascend_ailments/models/item/winded_debug_stick.json b/src/main/resources/assets/ascend_ailments/models/item/winded_debug_stick.json new file mode 100644 index 0000000..5d2d5aa --- /dev/null +++ b/src/main/resources/assets/ascend_ailments/models/item/winded_debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} diff --git a/src/main/resources/data/ascend_ailments/tags/entity_types/soulless.json b/src/main/resources/data/ascend_ailments/tags/entity_types/soulless.json new file mode 100644 index 0000000..8bf06a4 --- /dev/null +++ b/src/main/resources/data/ascend_ailments/tags/entity_types/soulless.json @@ -0,0 +1,19 @@ +{ + "replace": false, + "values": [ + "minecraft:drowned", + "minecraft:giant", + "minecraft:husk", + "minecraft:phantom", + "minecraft:skeleton", + "minecraft:skeleton_horse", + "minecraft:stray", + "minecraft:wither", + "minecraft:wither_skeleton", + "minecraft:zoglin", + "minecraft:zombie", + "minecraft:zombie_horse", + "minecraft:zombie_villager", + "minecraft:zombified_piglin" + ] +} diff --git a/src/main/resources/data/ascend_ailments/tags/entity_types/sturdy.json b/src/main/resources/data/ascend_ailments/tags/entity_types/sturdy.json new file mode 100644 index 0000000..3f6fb94 --- /dev/null +++ b/src/main/resources/data/ascend_ailments/tags/entity_types/sturdy.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:iron_golem" + ] +}