diff --git a/src/main/java/com/minelittlepony/unicopia/entity/Ponylike.java b/src/main/java/com/minelittlepony/unicopia/entity/Ponylike.java index b8dc64b5..adcfa9e2 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/Ponylike.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/Ponylike.java @@ -8,7 +8,6 @@ import com.minelittlepony.unicopia.util.NbtSerialisable; import net.minecraft.entity.Entity; import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.item.ItemStack; public interface Ponylike extends NbtSerialisable, Updatable { Race getSpecies(); @@ -47,13 +46,6 @@ public interface Ponylike extends NbtSerialisable, Updatable { return false; } - /** - * Called when this player finishes eating food. - */ - default void onUse(ItemStack stack) { - - } - /** * Called when this entity jumps */ diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java index 20020450..024efd19 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/PlayerImpl.java @@ -8,7 +8,6 @@ import com.minelittlepony.unicopia.ability.AbilityDispatcher; import com.minelittlepony.unicopia.enchanting.PageOwner; import com.minelittlepony.unicopia.entity.FlightControl; import com.minelittlepony.unicopia.entity.Trap; -import com.minelittlepony.unicopia.item.UEffects; import com.minelittlepony.unicopia.magic.Affinity; import com.minelittlepony.unicopia.magic.AttachedMagicEffect; import com.minelittlepony.unicopia.magic.HeldMagicEffect; @@ -18,6 +17,8 @@ import com.minelittlepony.unicopia.magic.spell.SpellRegistry; import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.EffectSync; import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; +import com.minelittlepony.unicopia.toxin.Toxicity; +import com.minelittlepony.unicopia.toxin.Toxin; import com.minelittlepony.util.BasicEasingInterpolator; import com.minelittlepony.util.IInterpolator; import com.mojang.datafixers.util.Either; @@ -28,12 +29,9 @@ import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.data.DataTracker; import net.minecraft.entity.data.TrackedData; import net.minecraft.entity.data.TrackedDataHandlerRegistry; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity.SleepFailureReason; import net.minecraft.entity.projectile.ProjectileEntity; -import net.minecraft.item.FoodComponent; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.network.ServerPlayerEntity; @@ -42,7 +40,6 @@ import net.minecraft.util.Hand; import net.minecraft.util.Unit; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.world.Difficulty; public class PlayerImpl implements Pony, MagicReserves { @@ -365,28 +362,9 @@ public class PlayerImpl implements Pony, MagicReserves { } @Override - public void onUse(ItemStack stack) { + public void onEat(ItemStack stack) { if (getSpecies() == Race.CHANGELING) { - PlayerEntity player = getOwner(); - - FoodComponent food = stack.getItem().getFoodComponent(); - - if (food != null) { - int health = food.getHunger(); - float saturation = food.getSaturationModifier(); - - player.getHungerManager().add(-health/2, -saturation/2); - - player.addStatusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 100, 3, true, true)); - } else { - player.addStatusEffect(new StatusEffectInstance(StatusEffects.NAUSEA, 200, 3, true, true)); - } - - if (player.world.getDifficulty() != Difficulty.PEACEFUL && player.world.random.nextInt(20) == 0) { - player.addStatusEffect(new StatusEffectInstance(UEffects.FOOD_POISONING, 3, 2, true, true)); - } - - player.addStatusEffect(new StatusEffectInstance(StatusEffects.WEAKNESS, 2000, 2, true, true)); + Toxin.POISON.afflict(getOwner(), Toxicity.SAFE, stack); } } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 0fbd993c..ecb46936 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -15,6 +15,7 @@ import com.mojang.authlib.GameProfile; import com.mojang.datafixers.util.Either; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemStack; import net.minecraft.util.Unit; import net.minecraft.util.math.BlockPos; @@ -75,6 +76,11 @@ public interface Pony extends Caster, RaceContainer, */ float onImpact(float distance); + /** + * Called whenever the player eats something. + */ + void onEat(ItemStack food); + /** * Attempts to sleep in a bed. * diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java index 781cfa71..faaf536a 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinLivingEntity.java @@ -41,15 +41,6 @@ abstract class MixinLivingEntity extends Entity implements PonyContainer { @@ -40,6 +41,14 @@ abstract class MixinPlayerEntity extends LivingEntity implements PonyContainer

info) { + if (stack.isFood()) { + get().onEat(stack); + } + } + @Inject(method = "trySleep(Lnet/minecraft/util/math/BlockPos;)Lcom/mojang/datafixers/util/Either;", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/com/minelittlepony/unicopia/toxin/Toxin.java b/src/main/java/com/minelittlepony/unicopia/toxin/Toxin.java index 0385753b..3b2c108e 100644 --- a/src/main/java/com/minelittlepony/unicopia/toxin/Toxin.java +++ b/src/main/java/com/minelittlepony/unicopia/toxin/Toxin.java @@ -1,22 +1,38 @@ package com.minelittlepony.unicopia.toxin; +import com.minelittlepony.unicopia.item.UEffects; + import net.minecraft.entity.effect.StatusEffect; import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.FoodComponent; import net.minecraft.item.ItemStack; +import net.minecraft.world.Difficulty; @FunctionalInterface public interface Toxin { Predicate ONE_EVERY_30_TICKS = (player, toxicity, stack) -> player.world.random.nextInt(30) == 0; + Toxin FOOD = (player, toxicity, stack) -> toxicity.afflict(player, toxicity, stack); Toxin DAMAGE = ONE_EVERY_30_TICKS.then(of(StatusEffects.INSTANT_DAMAGE, 1, 1)); Toxin RADIOACTIVITY = ONE_EVERY_30_TICKS.then(of(StatusEffects.GLOWING, 10, 1)); Toxin NAUSEA = of(StatusEffects.NAUSEA, 30, 1); Toxin WEAK_NAUSEA = of(StatusEffects.NAUSEA, 3, 1); Toxin STRENGTH = of(StatusEffects.STRENGTH, 30, 1); Toxin BLINDNESS = of(StatusEffects.BLINDNESS, 30, 1); - Toxin FOOD = (player, toxicity, stack) -> toxicity.afflict(player, toxicity, stack); + Toxin POISON = (player, toxicity, stack) -> { + FoodComponent food = stack.getItem().getFoodComponent(); + + player.getHungerManager().add(-food.getHunger()/2, -food.getSaturationModifier()/2); + afflict(player, StatusEffects.NAUSEA, 1700, 10); + + if (player.world.getDifficulty() != Difficulty.PEACEFUL && player.world.random.nextInt(20) == 0) { + afflict(player, UEffects.FOOD_POISONING, 150, 2); + } + + afflict(player, StatusEffects.WEAKNESS, 2000, 20); + }; void afflict(PlayerEntity player, Toxicity toxicity, ItemStack stack); @@ -29,9 +45,11 @@ public interface Toxin { } static Toxin of(StatusEffect effect, int duration, int amplifier) { - return (player, toxicity, stack) -> { - player.addStatusEffect(new StatusEffectInstance(effect, duration, amplifier, false, false)); - }; + return (player, toxicity, stack) -> afflict(player, effect, duration, amplifier); + } + + static void afflict(PlayerEntity player, StatusEffect effect, int duration, int amplifier) { + player.addStatusEffect(new StatusEffectInstance(effect, duration, amplifier, false, false)); } interface Predicate {