diff --git a/lib/trinkets-dummy-3.10.0.jar b/lib/trinkets-dummy-3.10.0.jar new file mode 100644 index 00000000..44e64ce1 Binary files /dev/null and b/lib/trinkets-dummy-3.10.0.jar differ diff --git a/lib/trinkets-dummy-3.8.0.jar b/lib/trinkets-dummy-3.8.0.jar deleted file mode 100644 index 1e65318d..00000000 Binary files a/lib/trinkets-dummy-3.8.0.jar and /dev/null differ diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java index ba58462c..ec12c12a 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellCraftingRecipe.java @@ -7,7 +7,6 @@ import java.util.stream.Collectors; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; -import com.minelittlepony.unicopia.container.inventory.SpellbookInventory; import com.minelittlepony.unicopia.item.EnchantableItem; import com.minelittlepony.unicopia.recipe.URecipes; import com.minelittlepony.unicopia.util.InventoryUtil; @@ -93,20 +92,20 @@ public class SpellCraftingRecipe implements SpellbookRecipe { } @Override - public boolean matches(SpellbookInventory inventory, World world) { + public boolean matches(Input inventory, World world) { - if (!material.test(inventory.getItemToModify())) { + if (!material.test(inventory.stackToModify())) { return false; } if (requiredItems.isEmpty()) { - return requiredTraits.test(inventory.getTraits()); + return requiredTraits.test(inventory.traits()); } var outstandingRequirements = new ArrayList<>(requiredItems); var ingredients = InventoryUtil.slots(inventory) - .filter(slot -> !inventory.getStack(slot).isEmpty()) - .map(slot -> Pair.of(slot, inventory.getStack(slot))) + .filter(slot -> !inventory.getStackInSlot(slot).isEmpty()) + .map(slot -> Pair.of(slot, inventory.getStackInSlot(slot))) .collect(Collectors.toList()); outstandingRequirements.removeIf(requirement -> { @@ -125,7 +124,7 @@ public class SpellCraftingRecipe implements SpellbookRecipe { } @Override - public ItemStack craft(SpellbookInventory inventory, WrapperLookup registries) { + public ItemStack craft(Input inventory, WrapperLookup registries) { return getResult(registries).copy(); } diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellDuplicatingRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellDuplicatingRecipe.java index fffa8c0b..66812dda 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellDuplicatingRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellDuplicatingRecipe.java @@ -1,7 +1,6 @@ package com.minelittlepony.unicopia.ability.magic.spell.crafting; import com.minelittlepony.unicopia.ability.magic.spell.effect.SpellType; -import com.minelittlepony.unicopia.container.inventory.SpellbookInventory; import com.minelittlepony.unicopia.item.*; import com.minelittlepony.unicopia.recipe.URecipes; import com.minelittlepony.unicopia.util.InventoryUtil; @@ -41,10 +40,10 @@ public record SpellDuplicatingRecipe (IngredientWithSpell material) implements S } @Override - public boolean matches(SpellbookInventory inventory, World world) { - ItemStack stack = inventory.getItemToModify(); + public boolean matches(Input inventory, World world) { + ItemStack stack = inventory.stackToModify(); return InventoryUtil.stream(inventory) - .limit(inventory.size() - 1) + .limit(inventory.getSize() - 1) .filter(i -> !i.isEmpty()) .noneMatch(i -> !i.isOf(UItems.GEMSTONE) || !EnchantableItem.isEnchanted(i)) && material.test(stack) @@ -52,7 +51,7 @@ public record SpellDuplicatingRecipe (IngredientWithSpell material) implements S } @Override - public ItemStack craft(SpellbookInventory inventory, WrapperLookup registries) { + public ItemStack craft(Input inventory, WrapperLookup registries) { return InventoryUtil.stream(inventory) .filter(i -> i.isOf(UItems.GEMSTONE)) .filter(EnchantableItem::isEnchanted) diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java index 9a41928b..a07e0942 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellEnhancingRecipe.java @@ -1,7 +1,6 @@ package com.minelittlepony.unicopia.ability.magic.spell.crafting; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; -import com.minelittlepony.unicopia.container.inventory.SpellbookInventory; import com.minelittlepony.unicopia.item.*; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -38,16 +37,16 @@ public record SpellEnhancingRecipe (IngredientWithSpell material) implements Spe } @Override - public boolean matches(SpellbookInventory inventory, World world) { - ItemStack stack = inventory.getItemToModify(); + public boolean matches(Input inventory, World world) { + ItemStack stack = inventory.stackToModify(); return material.test(stack) && EnchantableItem.isEnchanted(stack); } @Override - public ItemStack craft(SpellbookInventory inventory, WrapperLookup registries) { - return SpellTraits.of(inventory.getItemToModify()) - .add(inventory.getTraits()) - .applyTo(inventory.getItemToModify()); + public ItemStack craft(Input inventory, WrapperLookup registries) { + return SpellTraits.of(inventory.stackToModify()) + .add(inventory.traits()) + .applyTo(inventory.stackToModify()); } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java index 49b781aa..15e3a3ca 100644 --- a/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/ability/magic/spell/crafting/SpellbookRecipe.java @@ -2,16 +2,17 @@ package com.minelittlepony.unicopia.ability.magic.spell.crafting; import java.util.List; +import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.ability.magic.spell.trait.Trait; -import com.minelittlepony.unicopia.container.inventory.SpellbookInventory; import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.recipe.URecipes; import net.minecraft.item.ItemStack; import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.input.RecipeInput; -public interface SpellbookRecipe extends Recipe { +public interface SpellbookRecipe extends Recipe { @Override default RecipeType getType() { return URecipes.SPELLBOOK; @@ -52,4 +53,37 @@ public interface SpellbookRecipe extends Recipe { mystery(stacks.toArray(ItemStack[]::new)); } } + + public record Input(ItemStack stackToModify, ItemStack[] stacks, float[] factors, SpellTraits traits, int gemSlotIndex) implements RecipeInput { + @Override + public ItemStack getStackInSlot(int slot) { + return stacks[slot]; + } + + public float getFactor(int slot) { + return factors[slot]; + } + + @Override + public int getSize() { + return stacks.length; + } + + public boolean hasIngredients() { + for (int i = 0; i < gemSlotIndex; i++) { + if (!getStackInSlot(i).isEmpty()) { + return true; + } + } + return false; + } + + public ItemStack getFallbackStack() { + if (stackToModify().isOf(UItems.GEMSTONE) || stackToModify().isOf(UItems.BOTCHED_GEM)) { + return traits().applyTo(UItems.BOTCHED_GEM.getDefaultStack()); + } + + return ItemStack.EMPTY; + } + } } diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index d1eaedc3..65388c91 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -7,7 +7,6 @@ import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe; import com.minelittlepony.unicopia.compat.trinkets.TrinketsDelegate; import com.minelittlepony.unicopia.container.inventory.*; import com.minelittlepony.unicopia.entity.player.Pony; -import com.minelittlepony.unicopia.item.UItems; import com.minelittlepony.unicopia.recipe.URecipes; import com.mojang.datafixers.util.Pair; @@ -188,13 +187,14 @@ public class SpellbookScreenHandler extends ScreenHandler { context.run((world, pos) -> { if (!world.isClient && !gemSlot.getStack().isEmpty()) { Comparator> comparator = Comparator.comparing(e -> e.value().getPriority()); + SpellbookRecipe.Input input = this.input.createInput(); ItemStack resultStack = input.hasIngredients() ? world.getServer().getRecipeManager() .getAllMatches(URecipes.SPELLBOOK, input, world) .stream().sorted(comparator) .findFirst() .filter(recipe -> result.shouldCraftRecipe(world, (ServerPlayerEntity)this.inventory.player, recipe)) .map(recipe -> recipe.value().craft(input, world.getRegistryManager())) - .orElseGet(this::getFallbackStack) : ItemStack.EMPTY; + .orElseGet(input::getFallbackStack) : ItemStack.EMPTY; outputSlot.setStack(resultStack); setPreviousTrackedSlot(outputSlot.id, resultStack); @@ -203,15 +203,6 @@ public class SpellbookScreenHandler extends ScreenHandler { }); } - private ItemStack getFallbackStack() { - ItemStack gemStack = gemSlot.getStack(); - if (gemStack.isOf(UItems.GEMSTONE) || gemStack.isOf(UItems.BOTCHED_GEM)) { - return input.getTraits().applyTo(UItems.BOTCHED_GEM.getDefaultStack()); - } - - return ItemStack.EMPTY; - } - @Override public boolean canInsertIntoSlot(ItemStack stack, Slot slot) { return slot != null && slot.canInsert(stack) && slot.isEnabled(); diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java index 259e05f6..025d21ac 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java @@ -1,15 +1,15 @@ package com.minelittlepony.unicopia.container.inventory; +import com.minelittlepony.unicopia.ability.magic.spell.crafting.SpellbookRecipe; import com.minelittlepony.unicopia.ability.magic.spell.trait.SpellTraits; import com.minelittlepony.unicopia.container.SpellbookScreenHandler; import com.minelittlepony.unicopia.util.InventoryUtil; import net.minecraft.inventory.CraftingInventory; import net.minecraft.item.ItemStack; -import net.minecraft.recipe.input.RecipeInput; import net.minecraft.screen.slot.Slot; -public class SpellbookInventory extends CraftingInventory implements RecipeInput { +public class SpellbookInventory extends CraftingInventory { private final SpellbookScreenHandler handler; public SpellbookInventory(SpellbookScreenHandler handler, int width, int height) { @@ -21,15 +21,6 @@ public class SpellbookInventory extends CraftingInventory implements RecipeInput return handler.gemSlot.getStack(); } - public boolean hasIngredients() { - for (int i = 0; i < handler.GEM_SLOT_INDEX; i++) { - if (!getStack(i).isEmpty()) { - return true; - } - } - return false; - } - public float getFactor(int slot) { Slot s = handler.slots.get(slot); return s instanceof SpellbookSlot ? ((SpellbookSlot)s).getWeight() : 0; @@ -42,13 +33,13 @@ public class SpellbookInventory extends CraftingInventory implements RecipeInput ); } - @Override - public ItemStack getStackInSlot(int slot) { - return this.getStack(slot); - } - - @Override - public int getSize() { - return size(); + public SpellbookRecipe.Input createInput() { + float[] factors = new float[size()]; + ItemStack[] stacks = new ItemStack[size()]; + for (int i = 0; i < size(); i++) { + factors[i] = getFactor(i); + stacks[i] = getStack(i); + } + return new SpellbookRecipe.Input(getItemToModify(), stacks, factors, getTraits(), handler.GEM_SLOT_INDEX); } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java index 05841cc2..71f12563 100644 --- a/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java +++ b/src/main/java/com/minelittlepony/unicopia/datagen/providers/recipe/CuttingBoardRecipeJsonBuilder.java @@ -26,7 +26,6 @@ import net.minecraft.recipe.Recipe; import net.minecraft.recipe.RecipeSerializer; import net.minecraft.recipe.RecipeType; import net.minecraft.recipe.input.CraftingRecipeInput; -import net.minecraft.recipe.input.RecipeInput; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKeys; @@ -170,16 +169,5 @@ public class CuttingBoardRecipeJsonBuilder { @Override public RecipeType getType() { return TYPE; } - - static class CuttingInput implements RecipeInput { - @Override - public ItemStack getStackInSlot(int slot) { - return null; - } - @Override - public int getSize() { - return 0; - } - } } } diff --git a/src/main/java/com/minelittlepony/unicopia/recipe/TransformCropsRecipe.java b/src/main/java/com/minelittlepony/unicopia/recipe/TransformCropsRecipe.java index d7fdaad4..bfbb0af1 100644 --- a/src/main/java/com/minelittlepony/unicopia/recipe/TransformCropsRecipe.java +++ b/src/main/java/com/minelittlepony/unicopia/recipe/TransformCropsRecipe.java @@ -11,8 +11,6 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import io.netty.buffer.ByteBuf; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.inventory.SingleStackInventory; import net.minecraft.item.ItemStack; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; @@ -127,41 +125,20 @@ public class TransformCropsRecipe implements Recipe= SIDE_LENGTH && height >= SIDE_LENGTH; } - public static record PlacementArea (Pony pony, BlockPos position) implements SingleStackInventory, RecipeInput { - @Override - public void markDirty() { } - - @Override - public ItemStack getStack() { - return ItemStack.EMPTY; - } - - @Override - public ItemStack decreaseStack(int var1) { - return ItemStack.EMPTY; - } - - @Override - public void setStack(ItemStack var1) { } - + public static record PlacementArea (Pony pony, BlockPos position) implements RecipeInput { @Override public boolean isEmpty() { - return SingleStackInventory.super.isEmpty(); - } - - @Override - public boolean canPlayerUse(PlayerEntity player) { return false; } @Override public ItemStack getStackInSlot(int slot) { - return getStack(slot); + return ItemStack.EMPTY; } @Override public int getSize() { - return size(); + return 0; } } diff --git a/src/main/java/com/minelittlepony/unicopia/util/InventoryUtil.java b/src/main/java/com/minelittlepony/unicopia/util/InventoryUtil.java index 035e1f0d..3effe008 100644 --- a/src/main/java/com/minelittlepony/unicopia/util/InventoryUtil.java +++ b/src/main/java/com/minelittlepony/unicopia/util/InventoryUtil.java @@ -5,16 +5,25 @@ import java.util.stream.Stream; import net.minecraft.inventory.Inventory; import net.minecraft.item.ItemStack; +import net.minecraft.recipe.input.RecipeInput; public interface InventoryUtil { static Stream stream(Inventory inventory) { return slots(inventory).map(inventory::getStack); } + static Stream stream(RecipeInput inventory) { + return slots(inventory).map(inventory::getStackInSlot); + } + static Stream slots(Inventory inventory) { return Stream.iterate(0, i -> i < inventory.size(), i -> i + 1); } + static Stream slots(RecipeInput inventory) { + return Stream.iterate(0, i -> i < inventory.getSize(), i -> i + 1); + } + static int getOpenSlot(Inventory inventory) { for (int i = 0; i < inventory.size(); i++) { if (inventory.getStack(i).isEmpty()) {