mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-27 15:17:59 +01:00
Implement toxicity for ingredients (I may remove this in favour of flattening)
This commit is contained in:
parent
c2967cfe3c
commit
070aeaefe3
12 changed files with 151 additions and 102 deletions
|
@ -35,6 +35,10 @@ public interface UTags {
|
|||
Tag<Item> SCOOTALOO_SPIRIT = register("scootaloo_spirit");
|
||||
Tag<Item> SWEETIE_BELLE_SPIRIT = register("sweetie_belle_spirit");
|
||||
|
||||
Tag<Item> NON_TOXIC = register("non_toxic");
|
||||
Tag<Item> FAIRLY_TOXIC = register("fairly_toxic");
|
||||
Tag<Item> SEVERELY_TOXIC = register("severely_toxic");
|
||||
|
||||
static Tag<Item> register(String name) {
|
||||
return TagRegistry.item(new Identifier("unicopia", name));
|
||||
}
|
||||
|
|
|
@ -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<Predicate> predicates;
|
||||
|
||||
private final Lazy<List<ItemStack>> matchingStacks;
|
||||
private final Lazy<net.minecraft.recipe.Ingredient> 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<Ingredient> many(JsonArray arr) {
|
||||
|
|
|
@ -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<ItemStack> getMatchingStacks() {
|
||||
return Stream.empty();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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" }
|
||||
}
|
||||
|
|
|
@ -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" }
|
||||
}
|
||||
|
|
|
@ -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" }
|
||||
}
|
||||
|
|
|
@ -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" }
|
||||
}
|
||||
|
|
|
@ -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" }
|
||||
}
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"replace": false,
|
||||
"values": [
|
||||
"minecraft:allium",
|
||||
"minecraft:white_tulip"
|
||||
]
|
||||
}
|
16
src/main/resources/data/unicopia/tags/items/non_toxic.json
Normal file
16
src/main/resources/data/unicopia/tags/items/non_toxic.json
Normal file
|
@ -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"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"replace": false,
|
||||
"values": [
|
||||
"minecraft:fern",
|
||||
"minecraft:dead_bush",
|
||||
"minecraft:poppy",
|
||||
"minecraft:oxey_daisy",
|
||||
"minecraft:large_fern"
|
||||
]
|
||||
}
|
Loading…
Reference in a new issue