Implement seapony diets

This commit is contained in:
Sollace 2023-11-10 14:11:53 +00:00
parent e49828fea1
commit 38422bda42
No known key found for this signature in database
GPG key ID: E52FACE7B5C773DB
14 changed files with 61 additions and 45 deletions

View file

@ -31,7 +31,7 @@ public class ChangeFormAbility implements Ability<Hit> {
@Override
public boolean canUse(Race.Composite race) {
return race.potential() != null;
return race.potential() != null && race.potential() != race.physical();
}
@Override

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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<ItemStack> use(World world, PlayerEntity player, Hand hand) {
if (!Pony.of(player).getObservedSpecies().hasIronGut()) {
return TypedActionResult.fail(player.getStackInHand(hand));

View file

@ -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> useAction,
Optional<FoodComponent> component,
Function<LivingEntity, Optional<FoodComponent>> food,
Ailment.Set ailment
) {
public void appendTooltip(PlayerEntity player, List<Text> tooltip, TooltipContext context) {
@ -36,6 +39,7 @@ public record Toxic (
private final Ailment def;
private final Map<Race, Ailment> overrides = new HashMap<>();
private Optional<UseAction> action = Optional.of(UseAction.EAT);
private final Map<Race, FoodComponent> components = new HashMap<>();
private Optional<FoodComponent> 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<Toxic> buildOptional() {

View file

@ -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);
}

View file

@ -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<ToxicRegistryEntry> 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);

View file

@ -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<ItemStack> 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));
}

View file

@ -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) {
public Toxic getToxic(ItemStack stack, @Nullable LivingEntity entity) {
if (entity != null) {
setFoodComponent(originalFoodComponent.get());
return Toxics.lookup(this);
}
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<ItemStack> info) {
getToxic(stack).finishUsing(stack, world, entity);
getToxic(stack, entity).finishUsing(stack, world, entity);
}
@Inject(method = "use", at = @At("HEAD"), cancellable = true)

View file

@ -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<Text> tooltip, TooltipContext context, CallbackInfo into) {
getToxic(stack).appendTooltip(MinecraftClient.getInstance().player, tooltip, context);
getToxic(stack, MinecraftClient.getInstance().player).appendTooltip(MinecraftClient.getInstance().player, tooltip, context);
}
}

View file

@ -1,8 +0,0 @@
{
"replace": false,
"values": [
"unicopia:mango",
"unicopia:banana",
"unicopia:pineapple"
]
}

View file

@ -1,6 +0,0 @@
{
"replace": false,
"values": [
"unicopia:pineapple"
]
}

View file

@ -1,6 +1,6 @@
{
"replace": false,
"values": [
"unicopia:banana"
"minecraft:dried_kelp_block"
]
}

View file

@ -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 }
]
}