Unicopia/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java

62 lines
2 KiB
Java
Raw Normal View History

package com.minelittlepony.unicopia.mixin;
import java.util.Optional;
import javax.annotation.Nullable;
2021-06-21 22:05:40 +02:00
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
2021-06-21 22:05:40 +02:00
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.callback.CallbackInfoReturnable;
import com.minelittlepony.unicopia.item.toxin.Toxic;
import com.minelittlepony.unicopia.item.toxin.ToxicHolder;
import com.minelittlepony.unicopia.item.toxin.Toxics;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.FoodComponent;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
@Mixin(Item.class)
abstract class MixinItem implements ToxicHolder {
2021-06-21 22:05:40 +02:00
private boolean foodLoaded;
@Nullable
private FoodComponent originalFoodComponent;
2021-06-21 22:05:40 +02:00
@Shadow
private @Final FoodComponent foodComponent;
@Override
public Optional<Toxic> getToxic() {
2021-06-21 22:05:40 +02:00
if (!foodLoaded) {
foodLoaded = true;
originalFoodComponent = ((Item)(Object)this).getFoodComponent();
}
2021-06-21 22:05:40 +02:00
foodComponent = originalFoodComponent;
Optional<Toxic> toxic = Toxics.REGISTRY.stream()
.filter(i -> i.matches((Item)(Object)this))
.map(t -> {
if (originalFoodComponent == null) {
t.getFoodComponent().ifPresent(s -> foodComponent = s);
}
return t;
}).findFirst();
if (!toxic.isPresent() && ((Item)(Object)this).getFoodComponent() != null) {
return Optional.of(Toxics.EDIBLE);
}
return toxic;
}
@Inject(method = "finishUsing", at = @At("HEAD"), cancellable = true)
private void finishUsing(ItemStack stack, World world, LivingEntity entity, CallbackInfoReturnable<ItemStack> info) {
2021-06-21 22:05:40 +02:00
getToxic().ifPresent(t -> t.finishUsing(stack, world, entity));
}
}