From 070aeaefe3aae228aea3ea2d77ae29f152ca6301 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sat, 2 May 2020 00:38:37 +0200 Subject: [PATCH] Implement toxicity for ingredients (I may remove this in favour of flattening) --- .../com/minelittlepony/unicopia/UTags.java | 4 ++ .../recipe/ingredient/Ingredient.java | 55 +++++++----------- .../recipe/ingredient/ToxicityPredicate.java | 58 +++++++++++++++++++ .../unicopia/toxin/Toxicity.java | 15 ++++- .../unicopia/recipes/flim_flam_cider.json | 5 +- .../data/unicopia/recipes/salad_fair.json | 20 ++----- .../data/unicopia/recipes/salad_lethal.json | 24 ++------ .../data/unicopia/recipes/salad_safe.json | 14 ++--- .../data/unicopia/recipes/salad_severe.json | 25 ++------ .../unicopia/tags/items/fairly_toxic.json | 7 +++ .../data/unicopia/tags/items/non_toxic.json | 16 +++++ .../unicopia/tags/items/severely_toxic.json | 10 ++++ 12 files changed, 151 insertions(+), 102 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/recipe/ingredient/ToxicityPredicate.java create mode 100644 src/main/resources/data/unicopia/tags/items/fairly_toxic.json create mode 100644 src/main/resources/data/unicopia/tags/items/non_toxic.json create mode 100644 src/main/resources/data/unicopia/tags/items/severely_toxic.json diff --git a/src/main/java/com/minelittlepony/unicopia/UTags.java b/src/main/java/com/minelittlepony/unicopia/UTags.java index 08b04854..1ae8e324 100644 --- a/src/main/java/com/minelittlepony/unicopia/UTags.java +++ b/src/main/java/com/minelittlepony/unicopia/UTags.java @@ -35,6 +35,10 @@ public interface UTags { Tag SCOOTALOO_SPIRIT = register("scootaloo_spirit"); Tag SWEETIE_BELLE_SPIRIT = register("sweetie_belle_spirit"); + Tag NON_TOXIC = register("non_toxic"); + Tag FAIRLY_TOXIC = register("fairly_toxic"); + Tag SEVERELY_TOXIC = register("severely_toxic"); + static Tag register(String name) { return TagRegistry.item(new Identifier("unicopia", name)); } diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/Ingredient.java b/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/Ingredient.java index ffed6241..b89b9c37 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/Ingredient.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/Ingredient.java @@ -7,7 +7,7 @@ import java.util.stream.Stream; import javax.annotation.concurrent.Immutable; -import com.google.common.collect.Streams; +import com.google.common.collect.Lists; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; @@ -19,29 +19,20 @@ import net.minecraft.util.PacketByteBuf; @Immutable public class Ingredient { - public static final Ingredient EMPTY = new Ingredient(Predicate.EMPTY, Predicate.EMPTY, Predicate.EMPTY, Predicate.EMPTY); + public static final Ingredient EMPTY = new Ingredient(Predicate.EMPTY, Predicate.EMPTY, Predicate.EMPTY, Predicate.EMPTY, Predicate.EMPTY); - private final Predicate stack; - private final Predicate tag; - private final Predicate spell; - private final Predicate enchantment; + private final List predicates; private final Lazy> matchingStacks; private final Lazy preview; - Ingredient(Predicate stack, Predicate tag, Predicate spell, Predicate enchantment) { - this.stack = stack; - this.tag = tag; - this.spell = spell; - this.enchantment = enchantment; + Ingredient(Predicate... predicates) { + this.predicates = Lists.newArrayList(predicates); this.matchingStacks = new Lazy<>(() -> { - return Streams.concat( - stack.getMatchingStacks(), - tag.getMatchingStacks(), - spell.getMatchingStacks(), - enchantment.getMatchingStacks() - ).filter(s -> matches(s, 1)) - .collect(Collectors.toList()); + return this.predicates.stream() + .flatMap(Predicate::getMatchingStacks) + .filter(s -> matches(s, 1)) + .collect(Collectors.toList()); }); this.preview = new Lazy<>(() -> { return net.minecraft.recipe.Ingredient.ofStacks(getMatchingStacks().toArray(ItemStack[]::new)); @@ -57,26 +48,19 @@ public class Ingredient { } public ItemStack getStack(Random random) { - ItemStack output = ItemStack.EMPTY.copy(); - stack.applyModifiers(output, random); - tag.applyModifiers(output, random); - spell.applyModifiers(output, random); - enchantment.applyModifiers(output, random); - return output; + ItemStack[] output = new ItemStack[] { ItemStack.EMPTY.copy() }; + + predicates.forEach(p -> output[0] = p.applyModifiers(output[0], random)); + + return output[0]; } public boolean matches(ItemStack other, int materialMult) { - return stack.matches(other, materialMult) - && tag.matches(other, materialMult) - && spell.matches(other, materialMult) - && enchantment.matches(other, materialMult); + return predicates.stream().allMatch(p -> p.matches(other, materialMult)); } public void write(PacketByteBuf buf) { - stack.write(buf); - tag.write(buf); - spell.write(buf); - enchantment.write(buf); + predicates.forEach(p -> p.write(buf)); } public static Ingredient read(PacketByteBuf buf) { @@ -84,7 +68,8 @@ public class Ingredient { StackPredicate.read(buf), TagPredicate.read(buf), SpellPredicate.read(buf), - EnchantmentPredicate.read(buf)); + EnchantmentPredicate.read(buf), + ToxicityPredicate.read(buf)); } public static Ingredient one(JsonElement json) { @@ -94,6 +79,7 @@ public class Ingredient { ChoicePredicate.read(json.getAsJsonArray()), Predicate.EMPTY, Predicate.EMPTY, + Predicate.EMPTY, Predicate.EMPTY); } @@ -102,7 +88,8 @@ public class Ingredient { StackPredicate.read(obj), TagPredicate.read(obj), SpellPredicate.read(obj), - EnchantmentPredicate.read(obj)); + EnchantmentPredicate.read(obj), + ToxicityPredicate.read(obj)); } public static DefaultedList many(JsonArray arr) { diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/ToxicityPredicate.java b/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/ToxicityPredicate.java new file mode 100644 index 00000000..198c458e --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/recipe/ingredient/ToxicityPredicate.java @@ -0,0 +1,58 @@ +package com.minelittlepony.unicopia.recipe.ingredient; + +import java.util.Random; +import java.util.stream.Stream; + +import com.google.gson.JsonObject; +import com.minelittlepony.unicopia.toxin.Toxicity; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.PacketByteBuf; + +/** + * A predicate that tests for a specific spell on an input when matching. + * Appends that spell to the output when crafting. + */ +class ToxicityPredicate implements Ingredient.Predicate { + static Ingredient.Predicate read(PacketByteBuf buf) { + int ordinal = buf.readInt(); + if (ordinal == 0) { + return EMPTY; + } + return new ToxicityPredicate(Toxicity.values()[ordinal - 1]); + } + + static Ingredient.Predicate read(JsonObject json) { + if (!json.has("toxicity")) { + return EMPTY; + } + + return new ToxicityPredicate(Toxicity.byName(json.get("toxicity").getAsString())); + } + + private final Toxicity toxicity; + + ToxicityPredicate(Toxicity toxicity) { + this.toxicity = toxicity; + } + + @Override + public ItemStack applyModifiers(ItemStack output, Random random) { + return toxicity.ontoStack(output); + } + + @Override + public boolean matches(ItemStack stack, int materialMult) { + return Toxicity.fromStack(stack) == toxicity; + } + + @Override + public void write(PacketByteBuf buf) { + buf.writeInt(toxicity.ordinal() + 1); + } + + @Override + public Stream getMatchingStacks() { + return Stream.empty(); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/toxin/Toxicity.java b/src/main/java/com/minelittlepony/unicopia/toxin/Toxicity.java index 005d9e1e..fea8313f 100644 --- a/src/main/java/com/minelittlepony/unicopia/toxin/Toxicity.java +++ b/src/main/java/com/minelittlepony/unicopia/toxin/Toxicity.java @@ -11,7 +11,7 @@ import net.minecraft.entity.effect.StatusEffectInstance; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; @@ -59,6 +59,11 @@ public enum Toxicity implements Toxin { return text; } + public ItemStack ontoStack(ItemStack stack) { + stack.getOrCreateTag().putString("toxicity", name()); + return stack; + } + @Override public void afflict(PlayerEntity player, Toxicity toxicity, ItemStack stack) { if (toxicWhenRaw()) { @@ -74,11 +79,15 @@ public enum Toxicity implements Toxin { public static Toxicity fromStack(ItemStack stack) { if (stack.hasTag()) { - CompoundTag tag = stack.getSubTag("toxicity"); + Tag tag = stack.getTag().get("toxicity"); if (tag != null) { - return REGISTRY.getOrDefault(tag.asString(), SAFE); + return byName(tag.asString()); } } return SAFE; } + + public static Toxicity byName(String name) { + return REGISTRY.getOrDefault(name.toUpperCase(), SAFE); + } } diff --git a/src/main/resources/data/unicopia/recipes/flim_flam_cider.json b/src/main/resources/data/unicopia/recipes/flim_flam_cider.json index 864113ca..c5e2fa12 100644 --- a/src/main/resources/data/unicopia/recipes/flim_flam_cider.json +++ b/src/main/resources/data/unicopia/recipes/flim_flam_cider.json @@ -1,6 +1,5 @@ { - "type": "minecraft:crafting_shaped", - + "type": "unicopia:crafting_shaped", "pattern": [ "A B", " J ", @@ -20,5 +19,5 @@ { "item": "minecraft:apple" } ] }, - "result": { "item": "unicopia:apple_cider" } + "result": { "item": "unicopia:apple_cider", "toxicity": "fair" } } diff --git a/src/main/resources/data/unicopia/recipes/salad_fair.json b/src/main/resources/data/unicopia/recipes/salad_fair.json index d6a0906b..ce951b30 100644 --- a/src/main/resources/data/unicopia/recipes/salad_fair.json +++ b/src/main/resources/data/unicopia/recipes/salad_fair.json @@ -1,5 +1,5 @@ { - "type": "minecraft:crafting_shaped", + "type": "unicopia:crafting_shaped", "pattern": [ "FFF", "FFF", @@ -10,20 +10,10 @@ { "item": "minecraft:bowl" } ], "F": [ - { "item": "minecraft:double_plant", "data": 0 }, - { "item": "minecraft:double_plant", "data": 1 }, - { "item": "minecraft:tallgrass", "data": 1 }, - { "item": "minecraft:double_plant", "data": 5 }, - { "item": "unicopia:alfalfa_leaves" }, - { "item": "minecraft:red_flower", "data": 1 }, - { "item": "minecraft:red_flower", "data": 2 }, - { "item": "minecraft:red_flower", "data": 3 }, - { "item": "minecraft:red_flower", "data": 4 }, - { "item": "minecraft:red_flower", "data": 5 }, - { "item": "minecraft:red_flower", "data": 6 }, - { "item": "minecraft:red_flower", "data": 7 }, - { "item": "minecraft:yellow_flower", "data": 0 } + { "tag": "#unicopia:non_toxic" }, + { "tag": "#unicopia:fairly_toxic" }, + { "item": "unicopia:alfalfa_leaves" } ] }, - "result": { "item": "unicopia:salad", "data": 2, "count": 1 } + "result": { "item": "unicopia:salad", "toxicity": "fair" } } diff --git a/src/main/resources/data/unicopia/recipes/salad_lethal.json b/src/main/resources/data/unicopia/recipes/salad_lethal.json index fca2ce60..536d72de 100644 --- a/src/main/resources/data/unicopia/recipes/salad_lethal.json +++ b/src/main/resources/data/unicopia/recipes/salad_lethal.json @@ -1,5 +1,5 @@ { - "type": "minecraft:crafting_shaped", + "type": "unicopia:crafting_shaped", "pattern": [ "FFF", "FFF", @@ -13,24 +13,12 @@ { "item": "minecraft:golden_apple", "data": 0 }, { "item": "unicopia:zap_apple", "data": 0 }, { "item": "unicopia:corrupted_gem" }, - { "item": "minecraft:double_plant", "data": 0 }, - { "item": "minecraft:double_plant", "data": 1 }, - { "item": "minecraft:tallgrass", "data": 1 }, - { "item": "minecraft:tallgrass", "data": 2 }, - { "item": "minecraft:double_plant", "data": 4 }, - { "item": "minecraft:double_plant", "data": 5 }, + { "tag": "#unicopia:non_toxic" }, + { "tag": "#unicopia:fairly_toxic" }, + { "tag": "#unicopia:severely_toxic" }, { "item": "unicopia:alfalfa_leaves" }, - { "item": "minecraft:red_flower", "data": 0 }, - { "item": "minecraft:red_flower", "data": 1 }, - { "item": "minecraft:red_flower", "data": 2 }, - { "item": "minecraft:red_flower", "data": 3 }, - { "item": "minecraft:red_flower", "data": 4 }, - { "item": "minecraft:red_flower", "data": 5 }, - { "item": "minecraft:red_flower", "data": 6 }, - { "item": "minecraft:red_flower", "data": 7 }, - { "item": "minecraft:red_flower", "data": 8 }, - { "item": "minecraft:yellow_flower", "data": 0 } + { "item": "unicopia:wheat_worms" } ] }, - "result": { "item": "unicopia:salad", "data": 4, "count": 1 } + "result": { "item": "unicopia:salad", "toxicity": "lethal" } } diff --git a/src/main/resources/data/unicopia/recipes/salad_safe.json b/src/main/resources/data/unicopia/recipes/salad_safe.json index 99665850..5da5d8a7 100644 --- a/src/main/resources/data/unicopia/recipes/salad_safe.json +++ b/src/main/resources/data/unicopia/recipes/salad_safe.json @@ -1,5 +1,5 @@ { - "type": "minecraft:crafting_shaped", + "type": "unicopia:crafting_shaped", "pattern": [ "FFF", "FFF", @@ -10,15 +10,9 @@ { "item": "minecraft:bowl" } ], "F": [ - { "item": "minecraft:double_plant", "data": 0 }, - { "item": "minecraft:tallgrass", "data": 1 }, - { "item": "unicopia:alfalfa_leaves" }, - { "item": "minecraft:red_flower", "data": 3 }, - { "item": "minecraft:red_flower", "data": 4 }, - { "item": "minecraft:red_flower", "data": 5 }, - { "item": "minecraft:red_flower", "data": 7 }, - { "item": "minecraft:yellow_flower", "data": 0 } + { "tag": "#unicopia:non_toxic" }, + { "item": "unicopia:alfalfa_leaves" } ] }, - "result": { "item": "unicopia:salad", "data": 0, "count": 1 } + "result": { "item": "unicopia:salad", "toxicity": "safe" } } diff --git a/src/main/resources/data/unicopia/recipes/salad_severe.json b/src/main/resources/data/unicopia/recipes/salad_severe.json index f22dfd04..7f1a4589 100644 --- a/src/main/resources/data/unicopia/recipes/salad_severe.json +++ b/src/main/resources/data/unicopia/recipes/salad_severe.json @@ -1,5 +1,5 @@ { - "type": "minecraft:crafting_shaped", + "type": "unicopia:crafting_shaped", "pattern": [ "FFF", "FFF", @@ -10,25 +10,12 @@ { "item": "minecraft:bowl" } ], "F": [ - { "item": "minecraft:double_plant", "data": 0 }, - { "item": "minecraft:double_plant", "data": 1 }, - { "item": "minecraft:tallgrass", "data": 1 }, - { "item": "minecraft:double_plant", "data": 3 }, - { "item": "minecraft:double_plant", "data": 4 }, - { "item": "minecraft:double_plant", "data": 5 }, + { "tag": "#unicopia:non_toxic" }, + { "tag": "#unicopia:fairly_toxic" }, + { "tag": "#unicopia:severely_toxic" }, { "item": "unicopia:alfalfa_leaves" }, - { "item": "unicopia:wheat_worms" }, - { "item": "minecraft:red_flower", "data": 0 }, - { "item": "minecraft:red_flower", "data": 1 }, - { "item": "minecraft:red_flower", "data": 2 }, - { "item": "minecraft:red_flower", "data": 3 }, - { "item": "minecraft:red_flower", "data": 4 }, - { "item": "minecraft:red_flower", "data": 5 }, - { "item": "minecraft:red_flower", "data": 6 }, - { "item": "minecraft:red_flower", "data": 7 }, - { "item": "minecraft:red_flower", "data": 8 }, - { "item": "minecraft:yellow_flower", "data": 0 } + { "item": "unicopia:wheat_worms" } ] }, - "result": { "item": "unicopia:salad", "data": 3, "count": 1 } + "result": { "item": "unicopia:salad", "toxicity": "severe" } } diff --git a/src/main/resources/data/unicopia/tags/items/fairly_toxic.json b/src/main/resources/data/unicopia/tags/items/fairly_toxic.json new file mode 100644 index 00000000..223db762 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/fairly_toxic.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "values": [ + "minecraft:allium", + "minecraft:white_tulip" + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/non_toxic.json b/src/main/resources/data/unicopia/tags/items/non_toxic.json new file mode 100644 index 00000000..e0f4bf14 --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/non_toxic.json @@ -0,0 +1,16 @@ +{ + "replace": false, + "values": [ + "minecraft:grass", + "minecraft:dandelion", + "minecraft:blue_orchid", + "minecraft:azure_bluet", + "minecraft:red_tulip", + "minecraft:orange_tulip", + "minecraft:pink_tulip", + "minecraft:cornflower", + "minecraft:rose_bush", + "minecraft:peony", + "tall_grass" + ] +} diff --git a/src/main/resources/data/unicopia/tags/items/severely_toxic.json b/src/main/resources/data/unicopia/tags/items/severely_toxic.json new file mode 100644 index 00000000..26039d7a --- /dev/null +++ b/src/main/resources/data/unicopia/tags/items/severely_toxic.json @@ -0,0 +1,10 @@ +{ + "replace": false, + "values": [ + "minecraft:fern", + "minecraft:dead_bush", + "minecraft:poppy", + "minecraft:oxey_daisy", + "minecraft:large_fern" + ] +}