mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-23 21:38:00 +01:00
Use the id of the food group as the name rather than the tag
This commit is contained in:
parent
3bc1628fd4
commit
a87257de83
7 changed files with 160 additions and 94 deletions
|
@ -30,23 +30,23 @@ public record DietProfile(
|
|||
float defaultMultiplier,
|
||||
float foragingMultiplier,
|
||||
List<Multiplier> multipliers,
|
||||
List<Effect> effects,
|
||||
Optional<Effect> defaultEffect
|
||||
List<FoodGroupEffects> effects,
|
||||
Optional<FoodGroupEffects> defaultEffect
|
||||
) {
|
||||
public static final DietProfile EMPTY = new DietProfile(1, 1, List.of(), List.of(), Optional.empty());
|
||||
public static final Codec<DietProfile> CODEC = RecordCodecBuilder.create(instance -> instance.group(
|
||||
Codec.FLOAT.fieldOf("default_multiplier").forGetter(DietProfile::defaultMultiplier),
|
||||
Codec.FLOAT.fieldOf("foraging_multiplier").forGetter(DietProfile::foragingMultiplier),
|
||||
Codec.list(Multiplier.CODEC).fieldOf("multipliers").forGetter(DietProfile::multipliers),
|
||||
Codec.list(Effect.PROFILE_CODEC).fieldOf("effects").forGetter(DietProfile::effects),
|
||||
Effect.CODEC.optionalFieldOf("default_effect").forGetter(DietProfile::defaultEffect)
|
||||
Codec.list(FoodGroupEffects.CODEC).fieldOf("effects").forGetter(DietProfile::effects),
|
||||
FoodGroupEffects.CODEC.optionalFieldOf("default_effect").forGetter(DietProfile::defaultEffect)
|
||||
).apply(instance, DietProfile::new));
|
||||
|
||||
public DietProfile(PacketByteBuf buffer) {
|
||||
this(buffer.readFloat(), buffer.readFloat(),
|
||||
buffer.readList(Multiplier::new),
|
||||
buffer.readList(b -> new Effect(b, FoodGroupKey.LOOKUP)),
|
||||
buffer.readOptional(b -> new Effect(b, FoodGroupKey.LOOKUP))
|
||||
buffer.readList(b -> new FoodGroupEffects(b, FoodGroupKey.LOOKUP)),
|
||||
buffer.readOptional(b -> new FoodGroupEffects(b, FoodGroupKey.LOOKUP))
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -81,7 +81,7 @@ public record DietProfile(
|
|||
}
|
||||
|
||||
public Optional<Effect> findEffect(ItemStack stack) {
|
||||
return effects.stream().filter(m -> m.test(stack)).findFirst().or(this::defaultEffect);
|
||||
return effects.stream().filter(m -> m.test(stack)).findFirst().or(this::defaultEffect).map(Effect.class::cast);
|
||||
}
|
||||
|
||||
static boolean isForaged(ItemStack stack) {
|
||||
|
|
|
@ -37,10 +37,10 @@ public class DietsLoader implements IdentifiableResourceReloadListener {
|
|||
Map<Identifier, Effect> foodGroups = new HashMap<>();
|
||||
for (var group : loadData(manager, prepareExecutor, "diets/food_groups").entrySet()) {
|
||||
try {
|
||||
Effect.CODEC.parse(JsonOps.INSTANCE, group.getValue())
|
||||
FoodGroup.CODEC.parse(JsonOps.INSTANCE, group.getValue())
|
||||
.resultOrPartial(error -> LOGGER.error("Could not load food group {}: {}", group.getKey(), error))
|
||||
.ifPresent(value -> {
|
||||
foodGroups.put(group.getKey(), value);
|
||||
foodGroups.put(group.getKey(), new FoodGroup(group.getKey(), value));
|
||||
});
|
||||
} catch (Throwable t) {
|
||||
LOGGER.error("Could not load food effects {}", group.getKey(), t);
|
||||
|
|
|
@ -2,60 +2,31 @@ package com.minelittlepony.unicopia.diet;
|
|||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
import com.minelittlepony.unicopia.entity.player.Pony;
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||
|
||||
import net.minecraft.client.item.TooltipContext;
|
||||
import net.minecraft.item.FoodComponent;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.UseAction;
|
||||
import net.minecraft.util.Util;
|
||||
|
||||
public record Effect(
|
||||
List<FoodGroupKey> tags,
|
||||
Optional<FoodComponent> foodComponent,
|
||||
Ailment ailment
|
||||
) implements Predicate<ItemStack> {
|
||||
public static final Effect EMPTY = new Effect(List.of(), Optional.empty(), Ailment.EMPTY);
|
||||
public static final Codec<Effect> CODEC = RecordCodecBuilder.create(instance -> instance.group(
|
||||
FoodGroupKey.TAG_CODEC.listOf().fieldOf("tags").forGetter(Effect::tags),
|
||||
FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(Effect::foodComponent),
|
||||
Ailment.CODEC.fieldOf("ailment").forGetter(Effect::ailment)
|
||||
).apply(instance, Effect::new));
|
||||
public static final Codec<Effect> PROFILE_CODEC = RecordCodecBuilder.create(instance -> instance.group(
|
||||
FoodGroupKey.CODEC.listOf().fieldOf("tags").forGetter(Effect::tags),
|
||||
FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(Effect::foodComponent),
|
||||
Ailment.CODEC.fieldOf("ailment").forGetter(Effect::ailment)
|
||||
).apply(instance, Effect::new));
|
||||
public interface Effect extends Predicate<ItemStack> {
|
||||
Effect EMPTY = new FoodGroupEffects(List.of(), Optional.empty(), Ailment.EMPTY);
|
||||
|
||||
public Effect(PacketByteBuf buffer, Function<Identifier, FoodGroupKey> lookup) {
|
||||
this(buffer.readList(b -> lookup.apply(b.readIdentifier())), buffer.readOptional(FoodAttributes::read), new Ailment(buffer));
|
||||
}
|
||||
List<FoodGroupKey> tags();
|
||||
|
||||
public void afflict(Pony pony, ItemStack stack) {
|
||||
ailment().effects().afflict(pony.asEntity(), stack);
|
||||
}
|
||||
Optional<FoodComponent> foodComponent();
|
||||
|
||||
public void appendTooltip(ItemStack stack, List<Text> tooltip, TooltipContext context) {
|
||||
int size = tooltip.size();
|
||||
tags.forEach(tag -> {
|
||||
if (tag.contains(stack)) {
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable(Util.createTranslationKey("tag", tag.id()))).formatted(Formatting.GRAY));
|
||||
}
|
||||
});
|
||||
if (tooltip.size() == size) {
|
||||
Ailment ailment();
|
||||
|
||||
default void appendTooltip(ItemStack stack, List<Text> tooltip, TooltipContext context) {
|
||||
if (!test(stack)) {
|
||||
if (stack.isFood()) {
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable("tag.unicopia.food_types.misc")).formatted(Formatting.GRAY));
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable("food_group.unicopia.misc")).formatted(Formatting.GRAY));
|
||||
} else if (stack.getUseAction() == UseAction.DRINK) {
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable("tag.unicopia.food_types.drinks")).formatted(Formatting.GRAY));
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable("food_group.unicopia.drinks")).formatted(Formatting.GRAY));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,14 +38,14 @@ public record Effect(
|
|||
}
|
||||
}
|
||||
|
||||
public void toBuffer(PacketByteBuf buffer) {
|
||||
buffer.writeCollection(tags, (b, t) -> b.writeIdentifier(t.id()));
|
||||
buffer.writeOptional(foodComponent, FoodAttributes::write);
|
||||
ailment.toBuffer(buffer);
|
||||
default void toBuffer(PacketByteBuf buffer) {
|
||||
buffer.writeCollection(tags(), (b, t) -> b.writeIdentifier(t.id()));
|
||||
buffer.writeOptional(foodComponent(), FoodAttributes::write);
|
||||
ailment().toBuffer(buffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(ItemStack stack) {
|
||||
return tags.stream().anyMatch(tag -> tag.contains(stack));
|
||||
default boolean test(ItemStack stack) {
|
||||
return tags().stream().anyMatch(tag -> tag.contains(stack));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
package com.minelittlepony.unicopia.diet;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||
|
||||
import net.minecraft.client.item.TooltipContext;
|
||||
import net.minecraft.item.FoodComponent;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.Util;
|
||||
|
||||
public record FoodGroup(
|
||||
Identifier id,
|
||||
List<FoodGroupKey> tags,
|
||||
Optional<FoodComponent> foodComponent,
|
||||
Ailment ailment) implements Effect {
|
||||
public static final Codec<FoodGroupEffects> CODEC = RecordCodecBuilder.create(instance -> instance.group(
|
||||
FoodGroupKey.TAG_CODEC.listOf().fieldOf("tags").forGetter(FoodGroupEffects::tags),
|
||||
FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(FoodGroupEffects::foodComponent),
|
||||
Ailment.CODEC.fieldOf("ailment").forGetter(FoodGroupEffects::ailment)
|
||||
).apply(instance, FoodGroupEffects::new));
|
||||
|
||||
public FoodGroup(Identifier id, Effect effect) {
|
||||
this(id, effect.tags(), effect.foodComponent(), effect.ailment());
|
||||
}
|
||||
|
||||
public FoodGroup(PacketByteBuf buffer) {
|
||||
this(buffer.readIdentifier(), new FoodGroupEffects(buffer, FoodGroupKey.TAG_ID_LOOKUP));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendTooltip(ItemStack stack, List<Text> tooltip, TooltipContext context) {
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable(Util.createTranslationKey("food_group", id()))).formatted(Formatting.GRAY));
|
||||
Effect.super.appendTooltip(stack, tooltip, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void toBuffer(PacketByteBuf buffer) {
|
||||
buffer.writeIdentifier(id());
|
||||
Effect.super.toBuffer(buffer);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
package com.minelittlepony.unicopia.diet;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import com.mojang.serialization.Codec;
|
||||
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
||||
|
||||
import net.minecraft.client.item.TooltipContext;
|
||||
import net.minecraft.item.FoodComponent;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.network.PacketByteBuf;
|
||||
import net.minecraft.text.Text;
|
||||
import net.minecraft.util.Formatting;
|
||||
import net.minecraft.util.Identifier;
|
||||
import net.minecraft.util.Util;
|
||||
|
||||
public record FoodGroupEffects(
|
||||
List<FoodGroupKey> tags,
|
||||
Optional<FoodComponent> foodComponent,
|
||||
Ailment ailment
|
||||
) implements Effect {
|
||||
public static final Codec<FoodGroupEffects> CODEC = RecordCodecBuilder.create(instance -> instance.group(
|
||||
FoodGroupKey.CODEC.listOf().fieldOf("tags").forGetter(FoodGroupEffects::tags),
|
||||
FoodAttributes.CODEC.optionalFieldOf("food_component").forGetter(FoodGroupEffects::foodComponent),
|
||||
Ailment.CODEC.fieldOf("ailment").forGetter(FoodGroupEffects::ailment)
|
||||
).apply(instance, FoodGroupEffects::new));
|
||||
|
||||
public FoodGroupEffects(PacketByteBuf buffer, Function<Identifier, FoodGroupKey> lookup) {
|
||||
this(buffer.readList(b -> lookup.apply(b.readIdentifier())), buffer.readOptional(FoodAttributes::read), new Ailment(buffer));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void appendTooltip(ItemStack stack, List<Text> tooltip, TooltipContext context) {
|
||||
tags.forEach(tag -> {
|
||||
if (tag.contains(stack)) {
|
||||
tooltip.add(Text.literal(" ").append(Text.translatable(Util.createTranslationKey("tag", tag.id()))).formatted(Formatting.GRAY));
|
||||
}
|
||||
});
|
||||
Effect.super.appendTooltip(stack, tooltip, context);
|
||||
}
|
||||
}
|
|
@ -1,8 +1,11 @@
|
|||
package com.minelittlepony.unicopia.diet;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
|
@ -47,12 +50,15 @@ public class PonyDiets implements DietView {
|
|||
}
|
||||
|
||||
public PonyDiets(PacketByteBuf buffer) {
|
||||
this(buffer.readMap(b -> b.readRegistryValue(Race.REGISTRY), DietProfile::new), buffer.readMap(PacketByteBuf::readIdentifier, b -> new Effect(b, FoodGroupKey.TAG_ID_LOOKUP)));
|
||||
this(
|
||||
buffer.readMap(b -> b.readRegistryValue(Race.REGISTRY), DietProfile::new),
|
||||
buffer.readCollection(ArrayList::new, FoodGroup::new).stream().collect(Collectors.toMap(FoodGroup::id, Function.identity()))
|
||||
);
|
||||
}
|
||||
|
||||
public void toBuffer(PacketByteBuf buffer) {
|
||||
buffer.writeMap(diets, (b, r) -> b.writeRegistryValue(Race.REGISTRY, r), (b, e) -> e.toBuffer(b));
|
||||
buffer.writeMap(effects, PacketByteBuf::writeIdentifier, (b, e) -> e.toBuffer(b));
|
||||
buffer.writeCollection(effects.values(), (b, e) -> e.toBuffer(b));
|
||||
}
|
||||
|
||||
private DietProfile getDiet(Pony pony) {
|
||||
|
@ -77,7 +83,7 @@ public class PonyDiets implements DietView {
|
|||
@Override
|
||||
public void finishUsing(ItemStack stack, World world, LivingEntity entity) {
|
||||
if (initEdibility(stack, entity)) {
|
||||
Pony.of(entity).ifPresent(pony -> getEffects(stack, pony).afflict(pony, stack));
|
||||
Pony.of(entity).ifPresent(pony -> getEffects(stack, pony).ailment().effects().afflict(pony.asEntity(), stack));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -619,42 +619,41 @@
|
|||
"unicopia.diet.hunger": "Hunger Ratio: %s%%",
|
||||
"unicopia.diet.saturation": "Saturation Ratio: %s%%",
|
||||
|
||||
"tag.unicopia.food_types.rotten_meat": "Rotting Meat",
|
||||
"tag.unicopia.food_types.raw_meat": "Fresh Meat",
|
||||
"tag.unicopia.food_types.cooked_meat": "Prepared Meat",
|
||||
"tag.c.raw_fish": "Fresh Fish",
|
||||
"tag.c.cooked_fish": "Prepared Fish",
|
||||
"tag.c.raw_insect": "Bugs & Insects",
|
||||
"tag.unicopia.food_types.cooked_insect": "Cooked Bugs & Insects",
|
||||
"tag.unicopia.food_types.nuts_and_seeds": "Nuts & Seeds",
|
||||
"tag.unicopia.container_with_love": "Love",
|
||||
"tag.unicopia.food_types.rocks": "Rocks",
|
||||
"tag.unicopia.food_types.pinecone": "Nuts & Seeds",
|
||||
"tag.unicopia.food_types.bat_ponys_delight": "Bat Pony Treats",
|
||||
"tag.unicopia.food_types.cooked_sea_vegitable": "Prepared Fish Food",
|
||||
"tag.unicopia.food_types.raw_sea_vegitable": "Fresh Fish Food",
|
||||
"tag.unicopia.food_types.shells": "Sea Shells",
|
||||
"tag.unicopia.food_types.shelly": "Sea Shells",
|
||||
"tag.unicopia.food_types.candy": "Candy",
|
||||
"tag.unicopia.food_types.desserts": "Desserts",
|
||||
"tag.unicopia.food_types.fruit": "Fruit",
|
||||
"tag.unicopia.food_types.baked_goods": "Baked Goods",
|
||||
"tag.unicopia.food_types.misc": "Misc",
|
||||
"tag.unicopia.food_types.fruits_and_vegetables": "Fruits & Vegetables",
|
||||
"tag.unicopia.food_types.drinks": "Drinks",
|
||||
"tag.minecraft.leaves": "Leaves",
|
||||
|
||||
"tag.unicopia.food_types.forage_edible_filling": "Bulky Plant Matter",
|
||||
"tag.unicopia.food_types.forage_edible": "Plant Matter",
|
||||
"tag.unicopia.food_types.forage_nauseating": "Nauseating",
|
||||
"tag.unicopia.food_types.forage_prickly": "Prickly",
|
||||
"tag.unicopia.food_types.forage_risky": "Unsafe",
|
||||
"tag.unicopia.food_types.forage_strengthening": "Strength Enhancing",
|
||||
"tag.unicopia.food_types.forage_severely_prickly": "Very Prickly",
|
||||
"tag.unicopia.food_types.forage_severely_nauseating": "Sickening",
|
||||
"tag.unicopia.food_types.forage_radioactive": "Glowy",
|
||||
"tag.unicopia.food_types.forage_dangerous": "Dangerous",
|
||||
"tag.unicopia.food_types.forage_blinding": "Toxic",
|
||||
"food_group.unicopia.meat.rotten": "Rotting Meat",
|
||||
"food_group.unicopia.meat.raw": "Fresh Meat",
|
||||
"food_group.unicopia.meat.cooked": "Prepared Meat",
|
||||
"food_group.unicopia.fish.raw": "Fresh Fish",
|
||||
"food_group.unicopia.fish.cooked": "Prepared Fish",
|
||||
"food_group.unicopia.insect.raw": "Bugs & Insects",
|
||||
"food_group.unicopia.fish.cooked": "Cooked Bugs & Insects",
|
||||
"food_group.unicopia.nuts_and_seeds": "Nuts & Seeds",
|
||||
"food_group.unicopia.love": "Love",
|
||||
"food_group.unicopia.rocks": "Rocks",
|
||||
"food_group.unicopia.pinecone": "Nuts & Seeds",
|
||||
"food_group.unicopia.bat_ponys_delight": "Bat Pony Treats",
|
||||
"food_group.unicopia.sea_vegitable.cooked": "Prepared Fish Food",
|
||||
"food_group.unicopia.sea_vegitable.raw": "Fresh Fish Food",
|
||||
"food_group.unicopia.shells": "Sea Shells",
|
||||
"food_group.unicopia.shelly": "Sea Shells",
|
||||
"food_group.unicopia.candy": "Candy",
|
||||
"food_group.unicopia.desserts": "Desserts",
|
||||
"food_group.unicopia.fruit": "Fruit",
|
||||
"food_group.unicopia.baked_goods": "Baked Goods",
|
||||
"food_group.unicopia.misc": "Misc",
|
||||
"food_group.unicopia.fruits_and_vegetables": "Fruits & Vegetables",
|
||||
"food_group.unicopia.drinks": "Drinks",
|
||||
"food_group.unicopia.foraging.edible_filling": "Bulky Plant Matter",
|
||||
"food_group.unicopia.foraging.edible": "Plant Matter",
|
||||
"food_group.unicopia.foraging.nauseating": "Nauseating",
|
||||
"food_group.unicopia.foraging.prickly": "Prickly",
|
||||
"food_group.unicopia.foraging.risky": "Unsafe",
|
||||
"food_group.unicopia.foraging.strengthening": "Strength Enhancing",
|
||||
"food_group.unicopia.foraging.severely_prickly": "Very Prickly",
|
||||
"food_group.unicopia.foraging.severely_nauseating": "Sickening",
|
||||
"food_group.unicopia.foraging.radioactive": "Glowy",
|
||||
"food_group.unicopia.foraging.dangerous": "Dangerous",
|
||||
"food_group.unicopia.foraging.blinding": "Toxic",
|
||||
"food_group.unicopia.foraging.leafy_greens": "Leafy Greens",
|
||||
|
||||
"toxicity.safe.name": "Safe",
|
||||
"toxicity.mild.name": "Mildly Toxic",
|
||||
|
|
Loading…
Reference in a new issue