diff --git a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java index ead40298..4c841b1a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/ChangeFormAbility.java @@ -31,7 +31,7 @@ public class ChangeFormAbility implements Ability { @Override public boolean canUse(Race.Composite race) { - return race.potential() != null; + return race.potential() != null && race.potential() != race.physical(); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java b/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java index a9394c3c..23fa0dd1 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/DrinkableItem.java @@ -2,11 +2,8 @@ package com.minelittlepony.unicopia.item; import java.util.Optional; -import com.minelittlepony.unicopia.item.toxin.ToxicHolder; - import net.minecraft.advancement.criterion.Criteria; import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.server.network.ServerPlayerEntity; @@ -21,18 +18,13 @@ public class DrinkableItem extends Item { @Override public ItemStack finishUsing(ItemStack stack, World world, LivingEntity user) { + super.finishUsing(stack, world, user); if (user instanceof ServerPlayerEntity) { ServerPlayerEntity serverPlayerEntity = (ServerPlayerEntity)user; Criteria.CONSUME_ITEM.trigger(serverPlayerEntity, stack); serverPlayerEntity.incrementStat(Stats.USED.getOrCreateStat(this)); } - ((ToxicHolder)this).getToxic(stack).finishUsing(stack, world, user); - - if (user instanceof PlayerEntity && !((PlayerEntity)user).getAbilities().creativeMode) { - stack.decrement(1); - } - return stack.isEmpty() ? Optional.ofNullable(getRecipeRemainder()).map(Item::getDefaultStack).orElse(ItemStack.EMPTY) : stack; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java index e2e60e79..ea0c241e 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java +++ b/src/main/java/com/minelittlepony/unicopia/item/ZapAppleItem.java @@ -118,7 +118,7 @@ public class ZapAppleItem extends Item implements ChameleonItem, ToxicHolder, Mu } @Override - public Toxic getToxic(ItemStack stack) { + public Toxic getToxic(ItemStack stack, LivingEntity entity) { return hasAppearance(stack) ? Toxics.SEVERE_INNERT : Toxics.FORAGE_EDIBLE; } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java index 0433df21..ccd9aade 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Ailment.java @@ -31,11 +31,6 @@ public record Ailment ( } } - public ItemStack finishUsing(ItemStack stack, World world, LivingEntity entity) { - effect().afflict((PlayerEntity)entity, stack); - return stack; - } - public TypedActionResult use(World world, PlayerEntity player, Hand hand) { if (!Pony.of(player).getObservedSpecies().hasIronGut()) { return TypedActionResult.fail(player.getStackInHand(hand)); diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java index 2395e8ba..2a57be3d 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxic.java @@ -1,8 +1,11 @@ package com.minelittlepony.unicopia.item.toxin; import java.util.*; +import java.util.function.Function; import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.entity.player.Pony; + import net.minecraft.client.item.TooltipContext; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; @@ -14,7 +17,7 @@ import net.minecraft.world.World; public record Toxic ( Optional useAction, - Optional component, + Function> food, Ailment.Set ailment ) { public void appendTooltip(PlayerEntity player, List tooltip, TooltipContext context) { @@ -36,6 +39,7 @@ public record Toxic ( private final Ailment def; private final Map overrides = new HashMap<>(); private Optional action = Optional.of(UseAction.EAT); + private final Map components = new HashMap<>(); private Optional component = Optional.empty(); public Builder(Ailment def) { @@ -52,13 +56,23 @@ public record Toxic ( return this; } + public Builder food(Race race, FoodComponent food) { + components.put(race, food); + return this; + } + public Builder with(Race race, Ailment ailment) { overrides.put(race, ailment); return this; } public Toxic build() { - return new Toxic(action, component, Ailment.Set.of(def, overrides)); + return new Toxic(action, entity -> { + if (entity instanceof PlayerEntity player) { + return Optional.ofNullable(components.get(Pony.of(player).getObservedSpecies())).or(() -> component); + } + return component; + }, Ailment.Set.of(def, overrides)); } public Optional buildOptional() { diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java index 466b7b15..a873170c 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/ToxicHolder.java @@ -1,7 +1,10 @@ package com.minelittlepony.unicopia.item.toxin; +import org.jetbrains.annotations.Nullable; + +import net.minecraft.entity.LivingEntity; import net.minecraft.item.*; public interface ToxicHolder { - Toxic getToxic(ItemStack stack); + Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java index 82157234..f8b64265 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java +++ b/src/main/java/com/minelittlepony/unicopia/item/toxin/Toxics.java @@ -3,6 +3,7 @@ package com.minelittlepony.unicopia.item.toxin; import com.minelittlepony.unicopia.*; import com.minelittlepony.unicopia.util.RegistryUtils; +import net.minecraft.entity.LivingEntity; import net.minecraft.item.FoodComponent; import net.minecraft.registry.Registry; @@ -16,7 +17,7 @@ import org.jetbrains.annotations.Nullable; public interface Toxics { Registry REGISTRY = RegistryUtils.createSimple(Unicopia.id("toxic")); - Toxic EMPTY = new Toxic(Optional.empty(), Optional.empty(), Ailment.Set.EMPTY); + Toxic EMPTY = new Toxic(Optional.empty(), entity -> Optional.empty(), Ailment.Set.EMPTY); Toxic SEVERE_INNERT = Toxic.innert(Toxicity.SEVERE); @@ -144,20 +145,28 @@ public interface Toxics { .with(Race.BAT, of(Toxicity.SAFE, Toxin.BAT_PONY_INTOXICATION)) ); + Toxic RAW_SEA_VEGITABLES = register("raw_sea_vegitable", new Toxic.Builder(Ailment.INNERT) + .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE) + ); + + Toxic COOKED_SEA_VEGITABLES = register("cooked_sea_vegitable", new Toxic.Builder(Ailment.INNERT) + .food(Race.SEAPONY, UFoodComponents.RANDOM_FOLIAGE_FILLING) + ); + static void bootstrap() {} static Toxic register(String name, Toxic.Builder builder) { return Registry.register(REGISTRY, Unicopia.id(name), new ToxicRegistryEntry(builder.build(), UTags.item("food_types/" + name))).value(); } - static Toxic lookup(ItemDuck item) { + static Toxic lookup(ItemDuck item, @Nullable LivingEntity entity) { @Nullable FoodComponent food = item.asItem().getFoodComponent(); return REGISTRY.stream() .filter(i -> i.matches(item.asItem())) .map(ToxicRegistryEntry::value) .map(t -> { if (food == null) { - t.component().ifPresent(item::setFoodComponent); + t.food().apply(entity).ifPresent(item::setFoodComponent); } return t; }).findFirst().orElse(food == null ? Toxics.EMPTY : Toxics.EDIBLE); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java index 3cc48210..63e33c3a 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBlockItem.java @@ -25,12 +25,14 @@ abstract class MixinBlockItem extends Item implements ToxicHolder { @Override public UseAction getUseAction(ItemStack stack) { - return getToxic(stack).useAction().orElseGet(() -> super.getUseAction(stack)); + return getToxic(stack, null).useAction().orElseGet(() -> super.getUseAction(stack)); } @Override public TypedActionResult use(World world, PlayerEntity player, Hand hand) { - return getToxic(player.getStackInHand(hand)).ailment().get(player) + return getToxic(player.getStackInHand(hand), player) + .ailment() + .get(player) .map(t -> t.use(world, player, hand)) .orElseGet(() -> super.use(world, player, hand)); } diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java index d4924f25..160d8368 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinItem.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; +import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; @@ -43,14 +44,16 @@ abstract class MixinItem implements ItemDuck { public abstract void setFoodComponent(FoodComponent food); @Override - public Toxic getToxic(ItemStack stack) { - setFoodComponent(originalFoodComponent.get()); - return Toxics.lookup(this); + public Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity) { + if (entity != null) { + setFoodComponent(originalFoodComponent.get()); + } + return Toxics.lookup(this, entity); } - @Inject(method = "finishUsing", at = @At("HEAD"), cancellable = true) + @Inject(method = "finishUsing", at = @At("HEAD")) private void finishUsing(ItemStack stack, World world, LivingEntity entity, CallbackInfoReturnable info) { - getToxic(stack).finishUsing(stack, world, entity); + getToxic(stack, entity).finishUsing(stack, world, entity); } @Inject(method = "use", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java index 5196f529..9918c27c 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/client/MixinItem.java @@ -21,6 +21,6 @@ import net.minecraft.world.World; abstract class MixinItem implements ToxicHolder { @Inject(method = "appendTooltip", at = @At("RETURN")) private void onAppendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context, CallbackInfo into) { - getToxic(stack).appendTooltip(MinecraftClient.getInstance().player, tooltip, context); + getToxic(stack, MinecraftClient.getInstance().player).appendTooltip(MinecraftClient.getInstance().player, tooltip, context); } } diff --git a/src/main/resources/data/c/tags/items/fruit.json b/src/main/resources/data/c/tags/items/fruit.json deleted file mode 100644 index 6cd22ee2..00000000 --- a/src/main/resources/data/c/tags/items/fruit.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "replace": false, - "values": [ - "unicopia:mango", - "unicopia:banana", - "unicopia:pineapple" - ] -} diff --git a/src/main/resources/data/c/tags/items/pineapple.json b/src/main/resources/data/c/tags/items/pineapple.json deleted file mode 100644 index 60c5a61e..00000000 --- a/src/main/resources/data/c/tags/items/pineapple.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "replace": false, - "values": [ - "unicopia:pineapple" - ] -} diff --git a/src/main/resources/data/c/tags/items/banana.json b/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json similarity index 56% rename from src/main/resources/data/c/tags/items/banana.json rename to src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json index f2e0bcc6..1eb87a74 100644 --- a/src/main/resources/data/c/tags/items/banana.json +++ b/src/main/resources/data/unicopia/tags/items/food_types/cooked_sea_vegitable.json @@ -1,6 +1,6 @@ { "replace": false, "values": [ - "unicopia:banana" + "minecraft:dried_kelp_block" ] } diff --git a/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json b/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json new file mode 100644 index 00000000..c0298e4a --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/food_types/raw_sea_vegitable.json @@ -0,0 +1,12 @@ +{ + "replace": false, + "values": [ + "minecraft:kelp", + "minecraft:dried_kelp", + "minecraft:seagrass", + "minecraft:sea_pickle", + { "id": "farmersdelight:melon_popsicle", "required": false }, + { "id": "farmersdelight:kelp_roll", "required": false }, + { "id": "farmersdelight:kelp_roll_slice", "required": false } + ] +}