From 7a6e40d88d6d1d1215339699b7424d684a449bcc Mon Sep 17 00:00:00 2001 From: Provismet <17149901+Provismet@users.noreply.github.com> Date: Thu, 25 Jul 2024 18:43:26 +0100 Subject: [PATCH] Add gamerule for lethal poison damage. --- .../assets/combat-plus-core/lang/en_us.json | 4 +++ .../damage_type/lethal_poison.json | 5 ++++ .../tags/damage_type/bypasses_armor.json | 5 ++++ .../mixin/PoisonStatusEffectMixin.java | 26 +++++++++++++++++++ .../utility/CPCDamageTypes.java | 17 ++++++++++++ .../CombatPlusCore/utility/CPCGameRules.java | 1 + .../datagen/CombatPlusCore/CPCDatagen.java | 9 +++++++ .../CombatPlusCore/DamageTypeGenerator.java | 19 ++++++++++++++ .../DamageTypeTagGenerator.java | 6 +++++ .../CombatPlusCore/LanguageGenerator.java | 13 ++++++++-- src/main/resources/combat-plus.accesswidener | 2 ++ src/main/resources/combat-plus.mixins.json | 1 + 12 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/main/generated/data/combat-plus/damage_type/lethal_poison.json create mode 100644 src/main/generated/data/minecraft/tags/damage_type/bypasses_armor.json create mode 100644 src/main/java/com/provismet/CombatPlusCore/mixin/PoisonStatusEffectMixin.java create mode 100644 src/main/java/com/provismet/CombatPlusCore/utility/CPCDamageTypes.java create mode 100644 src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeGenerator.java diff --git a/src/main/generated/assets/combat-plus-core/lang/en_us.json b/src/main/generated/assets/combat-plus-core/lang/en_us.json index bc391cd..cf3d108 100644 --- a/src/main/generated/assets/combat-plus-core/lang/en_us.json +++ b/src/main/generated/assets/combat-plus-core/lang/en_us.json @@ -1,7 +1,11 @@ { + "death.attack.lethal_poison": "%1$s couldn't find an antidote", + "death.attack.lethal_poison.item": "%1$s succumbed to poison whilst fighting %2$s using %3$s", + "death.attack.lethal_poison.player": "%1$s succumbed to poison whilst fighting %2$s", "enchantment.combat-plus.logger": "Example Enchantment", "gamerule.category.combat-plus": "Combat+", "gamerule.keepLoyaltyTridents": "Keep Loyalty Tridents", + "gamerule.lethalPoison": "Lethal Poison", "gamerule.pvpEnchantmentModifier": "PvP Enchantment Modifier", "gamerule.pvpEnchantmentModifier.description": "Modifies the effectiveness of certain damaging enchantments when used against players.", "gamerule.sweepingRequiresEnchantment": "Sweeping Requires Enchantment", diff --git a/src/main/generated/data/combat-plus/damage_type/lethal_poison.json b/src/main/generated/data/combat-plus/damage_type/lethal_poison.json new file mode 100644 index 0000000..2ea3adc --- /dev/null +++ b/src/main/generated/data/combat-plus/damage_type/lethal_poison.json @@ -0,0 +1,5 @@ +{ + "exhaustion": 0.1, + "message_id": "lethal_poison", + "scaling": "when_caused_by_living_non_player" +} \ No newline at end of file diff --git a/src/main/generated/data/minecraft/tags/damage_type/bypasses_armor.json b/src/main/generated/data/minecraft/tags/damage_type/bypasses_armor.json new file mode 100644 index 0000000..8f80018 --- /dev/null +++ b/src/main/generated/data/minecraft/tags/damage_type/bypasses_armor.json @@ -0,0 +1,5 @@ +{ + "values": [ + "combat-plus:lethal_poison" + ] +} \ No newline at end of file diff --git a/src/main/java/com/provismet/CombatPlusCore/mixin/PoisonStatusEffectMixin.java b/src/main/java/com/provismet/CombatPlusCore/mixin/PoisonStatusEffectMixin.java new file mode 100644 index 0000000..2d0c6dd --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/mixin/PoisonStatusEffectMixin.java @@ -0,0 +1,26 @@ +package com.provismet.CombatPlusCore.mixin; + +import com.provismet.CombatPlusCore.utility.CPCDamageTypes; +import com.provismet.CombatPlusCore.utility.CPCGameRules; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.effect.PoisonStatusEffect; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectCategory; +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.CallbackInfoReturnable; + +@Mixin(PoisonStatusEffect.class) +public abstract class PoisonStatusEffectMixin extends StatusEffect { + protected PoisonStatusEffectMixin (StatusEffectCategory category, int color) { + super(category, color); + } + + @Inject(method = "applyUpdateEffect", at=@At("HEAD")) + private void applyDamage (LivingEntity entity, int amplifier, CallbackInfoReturnable cir) { + if (entity.getHealth() <= 1 && entity.getWorld().getGameRules().getBoolean(CPCGameRules.LETHAL_POISON)) { + entity.damage(CPCDamageTypes.POISON.createDamageSource(entity.getDamageSources()), 1); + } + } +} diff --git a/src/main/java/com/provismet/CombatPlusCore/utility/CPCDamageTypes.java b/src/main/java/com/provismet/CombatPlusCore/utility/CPCDamageTypes.java new file mode 100644 index 0000000..0528a60 --- /dev/null +++ b/src/main/java/com/provismet/CombatPlusCore/utility/CPCDamageTypes.java @@ -0,0 +1,17 @@ +package com.provismet.CombatPlusCore.utility; + +import com.provismet.CombatPlusCore.CPCMain; +import com.provismet.lilylib.container.DamageTypeContainer; +import net.minecraft.entity.damage.DamageType; +import net.minecraft.registry.Registerable; + +public abstract class CPCDamageTypes { + public static final DamageTypeContainer POISON = new DamageTypeContainer( + CPCMain.identifier("lethal_poison"), + new DamageType("lethal_poison", 0.1f) + ); + + public static void bootstrap (Registerable registerable) { + registerable.register(POISON.getKey(), POISON.getDamageType()); + } +} diff --git a/src/main/java/com/provismet/CombatPlusCore/utility/CPCGameRules.java b/src/main/java/com/provismet/CombatPlusCore/utility/CPCGameRules.java index 423e279..ebb022f 100644 --- a/src/main/java/com/provismet/CombatPlusCore/utility/CPCGameRules.java +++ b/src/main/java/com/provismet/CombatPlusCore/utility/CPCGameRules.java @@ -16,6 +16,7 @@ public class CPCGameRules { public static final GameRules.Key SWEEPING_REQUIRES_ENCHANTMENT = GameRuleRegistry.register("sweepingRequiresEnchantment", CATEGORY, GameRuleFactory.createBooleanRule(false)); public static final GameRules.Key LOYALTY_STAYS_IN_HAND = GameRuleRegistry.register("keepLoyaltyTridents", CATEGORY, GameRuleFactory.createBooleanRule(false)); public static final GameRules.Key PVP_DAMAGE_MODIFIER = GameRuleRegistry.register("pvpEnchantmentModifier", CATEGORY, GameRuleFactory.createDoubleRule(0.5, 0)); + public static final GameRules.Key LETHAL_POISON = GameRuleRegistry.register("lethalPoison", CATEGORY, GameRuleFactory.createBooleanRule(false)); public static void init () { // Loads the class... diff --git a/src/main/java/com/provismet/datagen/CombatPlusCore/CPCDatagen.java b/src/main/java/com/provismet/datagen/CombatPlusCore/CPCDatagen.java index 0c71ba6..282a2e9 100644 --- a/src/main/java/com/provismet/datagen/CombatPlusCore/CPCDatagen.java +++ b/src/main/java/com/provismet/datagen/CombatPlusCore/CPCDatagen.java @@ -1,14 +1,18 @@ package com.provismet.datagen.CombatPlusCore; import com.provismet.CombatPlusCore.CPCMain; +import com.provismet.CombatPlusCore.utility.CPCDamageTypes; import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint; import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; +import net.minecraft.registry.RegistryBuilder; +import net.minecraft.registry.RegistryKeys; public class CPCDatagen implements DataGeneratorEntrypoint { @Override public void onInitializeDataGenerator (FabricDataGenerator fabricDataGenerator) { FabricDataGenerator.Pack pack = fabricDataGenerator.createPack(); pack.addProvider(EnchantmentGenerator::new); + pack.addProvider(DamageTypeGenerator::new); pack.addProvider(DamageTypeTagGenerator::new); pack.addProvider(ItemTagGenerator::new); pack.addProvider(EnchantmentTagGenerator::new); @@ -20,4 +24,9 @@ public void onInitializeDataGenerator (FabricDataGenerator fabricDataGenerator) FabricDataGenerator.Pack numbers = fabricDataGenerator.createBuiltinResourcePack(CPCMain.identifier("enchanted_numbers")); numbers.addProvider(NumberGenerator::new); } + + @Override + public void buildRegistry (RegistryBuilder registryBuilder) { + registryBuilder.addRegistry(RegistryKeys.DAMAGE_TYPE, CPCDamageTypes::bootstrap); + } } diff --git a/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeGenerator.java b/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeGenerator.java new file mode 100644 index 0000000..530355b --- /dev/null +++ b/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeGenerator.java @@ -0,0 +1,19 @@ +package com.provismet.datagen.CombatPlusCore; + +import com.provismet.CombatPlusCore.utility.CPCDamageTypes; +import com.provismet.lilylib.datagen.provider.LilyDamageTypeProvider; +import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; +import net.minecraft.registry.RegistryWrapper; + +import java.util.concurrent.CompletableFuture; + +public class DamageTypeGenerator extends LilyDamageTypeProvider { + protected DamageTypeGenerator (FabricDataOutput output, CompletableFuture registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected void generate (RegistryWrapper.WrapperLookup registries, DamageConsumer consumer) { + consumer.add(CPCDamageTypes.POISON); + } +} diff --git a/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeTagGenerator.java b/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeTagGenerator.java index b982fcd..29cedf5 100644 --- a/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeTagGenerator.java +++ b/src/main/java/com/provismet/datagen/CombatPlusCore/DamageTypeTagGenerator.java @@ -1,10 +1,12 @@ package com.provismet.datagen.CombatPlusCore; +import com.provismet.CombatPlusCore.utility.CPCDamageTypes; import com.provismet.CombatPlusCore.utility.tag.CPCDamageTypeTags; import com.provismet.lilylib.datagen.tag.LilyTagProviders; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.minecraft.entity.damage.DamageTypes; import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.tag.DamageTypeTags; import java.util.concurrent.CompletableFuture; @@ -19,5 +21,9 @@ protected void configure (RegistryWrapper.WrapperLookup wrapperLookup) { .add(DamageTypes.PLAYER_ATTACK) .add(DamageTypes.MOB_ATTACK) .add(DamageTypes.MOB_ATTACK_NO_AGGRO); + + + getOrCreateTagBuilder(DamageTypeTags.BYPASSES_ARMOR) + .add(CPCDamageTypes.POISON.getKey()); } } diff --git a/src/main/java/com/provismet/datagen/CombatPlusCore/LanguageGenerator.java b/src/main/java/com/provismet/datagen/CombatPlusCore/LanguageGenerator.java index 24d683c..b0710ce 100644 --- a/src/main/java/com/provismet/datagen/CombatPlusCore/LanguageGenerator.java +++ b/src/main/java/com/provismet/datagen/CombatPlusCore/LanguageGenerator.java @@ -1,14 +1,16 @@ package com.provismet.datagen.CombatPlusCore; +import com.provismet.CombatPlusCore.utility.CPCDamageTypes; +import com.provismet.CombatPlusCore.utility.CPCGameRules; import com.provismet.CombatPlusCore.utility.tag.CPCEnchantmentTags; import com.provismet.CombatPlusCore.utility.tag.CPCItemTags; +import com.provismet.lilylib.datagen.provider.LilyLanguageProvider; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; -import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider; import net.minecraft.registry.RegistryWrapper; import java.util.concurrent.CompletableFuture; -public class LanguageGenerator extends FabricLanguageProvider { +public class LanguageGenerator extends LilyLanguageProvider { protected LanguageGenerator (FabricDataOutput dataOutput, CompletableFuture registryLookup) { super(dataOutput, registryLookup); } @@ -20,6 +22,7 @@ public void generateTranslations (RegistryWrapper.WrapperLookup registryLookup, translationBuilder.add("gamerule.keepLoyaltyTridents", "Keep Loyalty Tridents"); translationBuilder.add("gamerule.pvpEnchantmentModifier", "PvP Enchantment Modifier"); translationBuilder.add("gamerule.pvpEnchantmentModifier.description", "Modifies the effectiveness of certain damaging enchantments when used against players."); + translationBuilder.add(CPCGameRules.LETHAL_POISON.getTranslationKey(), "Lethal Poison"); translationBuilder.add(CPCItemTags.MELEE_WEAPON, "Melee Weapons"); translationBuilder.add(CPCItemTags.DUAL_WEAPON, "Dual Weapons"); @@ -46,5 +49,11 @@ public void generateTranslations (RegistryWrapper.WrapperLookup registryLookup, translationBuilder.add("resourcepack.combat-plus.enchanted_numerals.description", "Numerals go up to level 255"); translationBuilder.add("resourcepack.combat-plus.enchanted_numbers", "Enchantment Numbers"); translationBuilder.add("resourcepack.combat-plus.enchanted_numbers.description", "Numerals are now numbers"); + + addDeathMessage(translationBuilder, CPCDamageTypes.POISON, + "%1$s couldn't find an antidote", + "%1$s succumbed to poison whilst fighting %2$s", + "%1$s succumbed to poison whilst fighting %2$s using %3$s" + ); } } diff --git a/src/main/resources/combat-plus.accesswidener b/src/main/resources/combat-plus.accesswidener index 06b09d4..e4bb5bd 100644 --- a/src/main/resources/combat-plus.accesswidener +++ b/src/main/resources/combat-plus.accesswidener @@ -1,5 +1,7 @@ accessWidener v2 named +accessible class net/minecraft/entity/effect/PoisonStatusEffect + accessible method net/minecraft/enchantment/Enchantment modifyValue (Lnet/minecraft/component/ComponentType;Lnet/minecraft/server/world/ServerWorld;ILnet/minecraft/item/ItemStack;Lorg/apache/commons/lang3/mutable/MutableFloat;)V accessible method net/minecraft/enchantment/Enchantment modifyValue (Lnet/minecraft/component/ComponentType;Lnet/minecraft/server/world/ServerWorld;ILnet/minecraft/item/ItemStack;Lnet/minecraft/entity/Entity;Lorg/apache/commons/lang3/mutable/MutableFloat;)V accessible method net/minecraft/enchantment/Enchantment modifyValue (Lnet/minecraft/component/ComponentType;Lnet/minecraft/server/world/ServerWorld;ILnet/minecraft/item/ItemStack;Lnet/minecraft/entity/Entity;Lnet/minecraft/entity/damage/DamageSource;Lorg/apache/commons/lang3/mutable/MutableFloat;)V diff --git a/src/main/resources/combat-plus.mixins.json b/src/main/resources/combat-plus.mixins.json index 6e8fd0f..7ab7e25 100644 --- a/src/main/resources/combat-plus.mixins.json +++ b/src/main/resources/combat-plus.mixins.json @@ -10,6 +10,7 @@ "MaceItemMixin", "MobEntityMixin", "PlayerEntityMixin", + "PoisonStatusEffectMixin", "SwordItemMixin", "TridentItemMixin" ],