From 5e0d956b3787d80f2bf4a1039c8c665cb2d2ce2e Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Wed, 22 Jul 2020 18:31:22 -0400 Subject: [PATCH] Add Veridium Poisoning --- .../energonrelics/EnergonRelics.java | 3 + .../mixin/BrewingRecipeRegistryAccessor.java | 15 +++++ .../mixin/MixinLivingEntity.java | 61 ++++++++++++++++++ .../energonrelics/potion/CustomPotions.java | 53 +++++++++++++++ .../assets/energonrelics/lang/en_us.json | 7 +- .../mob_effect/veridium_poisoning.png | Bin 0 -> 7390 bytes src/main/resources/energonrelics.mixins.json | 2 + 7 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/thebrokenrail/energonrelics/mixin/BrewingRecipeRegistryAccessor.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/mixin/MixinLivingEntity.java create mode 100644 src/main/java/com/thebrokenrail/energonrelics/potion/CustomPotions.java create mode 100644 src/main/resources/assets/energonrelics/textures/mob_effect/veridium_poisoning.png diff --git a/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java b/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java index 21e5f02..9b64cc5 100644 --- a/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java +++ b/src/main/java/com/thebrokenrail/energonrelics/EnergonRelics.java @@ -17,6 +17,7 @@ import com.thebrokenrail.energonrelics.block.SwitchBlock; import com.thebrokenrail.energonrelics.block.util.SimpleBlock; import com.thebrokenrail.energonrelics.item.MultimeterItem; import com.thebrokenrail.energonrelics.item.NetworkChipItem; +import com.thebrokenrail.energonrelics.potion.CustomPotions; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -104,5 +105,7 @@ public class EnergonRelics implements ModInitializer { BLOCK_BREAKER_BLOCK.register("block_breaker"); Registry.register(Registry.ITEM, new Identifier(NAMESPACE, "veridium_powder"), VERIDIUM_POWDER_ITEM); + + CustomPotions.register(); } } diff --git a/src/main/java/com/thebrokenrail/energonrelics/mixin/BrewingRecipeRegistryAccessor.java b/src/main/java/com/thebrokenrail/energonrelics/mixin/BrewingRecipeRegistryAccessor.java new file mode 100644 index 0000000..ed6e2be --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/mixin/BrewingRecipeRegistryAccessor.java @@ -0,0 +1,15 @@ +package com.thebrokenrail.energonrelics.mixin; + +import net.minecraft.item.Item; +import net.minecraft.potion.Potion; +import net.minecraft.recipe.BrewingRecipeRegistry; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(BrewingRecipeRegistry.class) +public interface BrewingRecipeRegistryAccessor { + @Invoker + static void callRegisterPotionRecipe(Potion input, Item item, Potion output) { + throw new UnsupportedOperationException(); + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinLivingEntity.java b/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinLivingEntity.java new file mode 100644 index 0000000..764d073 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/mixin/MixinLivingEntity.java @@ -0,0 +1,61 @@ +package com.thebrokenrail.energonrelics.mixin; + +import com.thebrokenrail.energonrelics.potion.CustomPotions; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.attribute.EntityAttribute; +import net.minecraft.entity.attribute.EntityAttributes; +import net.minecraft.entity.data.DataTracker; +import net.minecraft.entity.data.TrackedData; +import net.minecraft.entity.data.TrackedDataHandlerRegistry; +import net.minecraft.entity.effect.StatusEffect; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(LivingEntity.class) +public abstract class MixinLivingEntity { + @Unique + private static final TrackedData HAS_VERIDIUM_POISONING = DataTracker.registerData(LivingEntity.class, TrackedDataHandlerRegistry.BOOLEAN); + + @Shadow + public abstract boolean hasStatusEffect(StatusEffect effect); + + @Shadow + public abstract void setHealth(float health); + + @Shadow + public abstract float getHealth(); + + @Inject(at = @At("RETURN"), method = "initDataTracker") + public void initDataTracker(CallbackInfo info) { + ((LivingEntity) (Object) this).getDataTracker().startTracking(HAS_VERIDIUM_POISONING, false); + } + + @Inject(at = @At("RETURN"), method = "onTrackedDataSet") + public void onTrackedDataSet(TrackedData data, CallbackInfo info) { + if (HAS_VERIDIUM_POISONING.equals(data)) { + setHealth(getHealth()); + } + } + + @Inject(at = @At("HEAD"), method = "tick") + public void tick(CallbackInfo info) { + if (!((LivingEntity) (Object) this).getEntityWorld().isClient()) { + boolean hasVeridiumPoisoning = hasStatusEffect(CustomPotions.VERIDIUM_POISONING_EFFECT.statusEffect); + if (((LivingEntity) (Object) this).getDataTracker().get(HAS_VERIDIUM_POISONING) != hasVeridiumPoisoning) { + ((LivingEntity) (Object) this).getDataTracker().set(HAS_VERIDIUM_POISONING, hasVeridiumPoisoning); + } + } + } + + @Inject(at = @At("HEAD"), method = "getAttributeValue", cancellable = true) + public void getAttributeValue(EntityAttribute attribute, CallbackInfoReturnable info) { + if (EntityAttributes.GENERIC_MAX_HEALTH.equals(attribute) && ((LivingEntity) (Object) this).getDataTracker().get(HAS_VERIDIUM_POISONING)) { + info.setReturnValue(0.5d); + } + } +} diff --git a/src/main/java/com/thebrokenrail/energonrelics/potion/CustomPotions.java b/src/main/java/com/thebrokenrail/energonrelics/potion/CustomPotions.java new file mode 100644 index 0000000..427aa35 --- /dev/null +++ b/src/main/java/com/thebrokenrail/energonrelics/potion/CustomPotions.java @@ -0,0 +1,53 @@ +package com.thebrokenrail.energonrelics.potion; + +import com.thebrokenrail.energonrelics.EnergonRelics; +import com.thebrokenrail.energonrelics.mixin.BrewingRecipeRegistryAccessor; +import net.minecraft.entity.effect.StatusEffect; +import net.minecraft.entity.effect.StatusEffectInstance; +import net.minecraft.entity.effect.StatusEffectType; +import net.minecraft.item.Items; +import net.minecraft.potion.Potion; +import net.minecraft.potion.Potions; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +public class CustomPotions { + public static class CustomPotion { + private static class CustomStatusEffect extends StatusEffect { + private CustomStatusEffect(StatusEffectType type, int color) { + super(type, color); + } + } + + public final StatusEffect statusEffect; + private final Potion potion; + private final Potion longPotion; + + private CustomPotion(StatusEffect statusEffect, Potion potion, Potion longPotion) { + this.statusEffect = statusEffect; + this.potion = potion; + this.longPotion = longPotion; + } + } + + public static CustomPotion VERIDIUM_POISONING_EFFECT; + + public static void register() { + VERIDIUM_POISONING_EFFECT = registerEffect("veridium_poisoning", 16711909); + registerBrewingRecipes(); + } + + @SuppressWarnings("SameParameterValue") + private static CustomPotion registerEffect(String name, int color) { + StatusEffect effect = Registry.register(Registry.STATUS_EFFECT, new Identifier(EnergonRelics.NAMESPACE, name), new CustomPotion.CustomStatusEffect(StatusEffectType.HARMFUL, color)); + Potion potion = Registry.register(Registry.POTION, new Identifier(EnergonRelics.NAMESPACE, name), new Potion(EnergonRelics.NAMESPACE + '.' + name, new StatusEffectInstance(effect, 1800))); + Potion longPotion = Registry.register(Registry.POTION, new Identifier(EnergonRelics.NAMESPACE, "long_" + name), new Potion(EnergonRelics.NAMESPACE + '.' + name, new StatusEffectInstance(effect, 4800))); + return new CustomPotion(effect, potion, longPotion); + } + + private static void registerBrewingRecipes() { + BrewingRecipeRegistryAccessor.callRegisterPotionRecipe(Potions.AWKWARD, EnergonRelics.VERIDIUM_POWDER_ITEM, VERIDIUM_POISONING_EFFECT.potion); + BrewingRecipeRegistryAccessor.callRegisterPotionRecipe(VERIDIUM_POISONING_EFFECT.potion, Items.REDSTONE, VERIDIUM_POISONING_EFFECT.longPotion); + } + +} diff --git a/src/main/resources/assets/energonrelics/lang/en_us.json b/src/main/resources/assets/energonrelics/lang/en_us.json index 8527f62..a760265 100644 --- a/src/main/resources/assets/energonrelics/lang/en_us.json +++ b/src/main/resources/assets/energonrelics/lang/en_us.json @@ -28,5 +28,10 @@ "death.attack.energonrelics.defensive_laser.player": "%s was evaporated by a laser whilst fighting %s", "block.energonrelics.research_complex_generator": "Research Complex Generator", "block.energonrelics.block_breaker": "Block Breaker", - "item.energonrelics.veridium_powder": "Veridium Powder" + "item.energonrelics.veridium_powder": "Veridium Powder", + "effect.energonrelics.veridium_poisoning": "Veridium Poisoning", + "item.minecraft.potion.effect.energonrelics.veridium_poisoning": "Potion of Veridium Poisoning", + "item.minecraft.splash_potion.effect.energonrelics.veridium_poisoning": "Splash Potion of Veridium Poisoning", + "item.minecraft.lingering_potion.effect.energonrelics.veridium_poisoning": "Lingering Potion of Veridium Poisoning", + "item.minecraft.tipped_arrow.effect.energonrelics.veridium_poisoning": "Arrow of Veridium Poisoning" } \ No newline at end of file diff --git a/src/main/resources/assets/energonrelics/textures/mob_effect/veridium_poisoning.png b/src/main/resources/assets/energonrelics/textures/mob_effect/veridium_poisoning.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd5ecd82b0f81e26917e8317676eb872ab825ca GIT binary patch literal 7390 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