Skip to content

Commit

Permalink
Merge branch 'mc1.18/fabric/dev' into mc1.19/fabric/dev
Browse files Browse the repository at this point in the history
# Conflicts:
#	gradle.properties
#	src/main/java/com/simibubi/create/compat/emi/CreateEmiPlugin.java
  • Loading branch information
IThundxr committed Mar 2, 2024
2 parents 0e01509 + 149c42f commit d3845a8
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 14 deletions.
61 changes: 50 additions & 11 deletions src/main/java/com/simibubi/create/compat/emi/CreateEmiPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import com.simibubi.create.compat.emi.recipes.fan.FanWashingEmiRecipe;
import com.simibubi.create.compat.rei.ConversionRecipe;
import com.simibubi.create.compat.rei.ToolboxColoringRecipeMaker;
import com.simibubi.create.content.decoration.palettes.AllPaletteStoneTypes;
import com.simibubi.create.content.equipment.blueprint.BlueprintScreen;
import com.simibubi.create.content.equipment.toolbox.ToolboxBlock;
import com.simibubi.create.content.fluids.VirtualFluid;
Expand All @@ -63,23 +64,26 @@
import com.simibubi.create.foundation.item.ItemHelper;
import com.simibubi.create.foundation.item.TagDependentIngredientItem;

import com.tterrag.registrate.fabric.SimpleFlowableFluid;
import com.tterrag.registrate.util.nullness.NonnullType;

import dev.emi.emi.api.EmiApi;
import dev.emi.emi.api.EmiPlugin;
import dev.emi.emi.api.EmiRegistry;
import dev.emi.emi.api.recipe.EmiCraftingRecipe;
import dev.emi.emi.api.recipe.EmiRecipe;
import dev.emi.emi.api.recipe.EmiRecipeCategory;
import dev.emi.emi.api.recipe.EmiWorldInteractionRecipe;
import dev.emi.emi.api.render.EmiRenderable;
import dev.emi.emi.api.stack.EmiIngredient;
import dev.emi.emi.api.stack.EmiStack;
import dev.emi.emi.api.widget.Bounds;
import io.github.fabricators_of_create.porting_lib.transfer.MutableContainerItemContext;
import io.github.fabricators_of_create.porting_lib.transfer.TransferUtil;
import io.github.fabricators_of_create.porting_lib.util.FluidStack;
import net.fabricmc.fabric.api.transfer.v1.context.ContainerItemContext;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidConstants;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage;
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant;
import net.fabricmc.fabric.api.transfer.v1.storage.Storage;
import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction;
import net.fabricmc.loader.api.FabricLoader;
Expand All @@ -102,9 +106,13 @@
import net.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.item.crafting.ShapelessRecipe;
import net.minecraft.world.item.crafting.SmokingRecipe;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.level.material.Fluids;

import org.jetbrains.annotations.NotNull;

public class CreateEmiPlugin implements EmiPlugin {
public static final Map<ResourceLocation, EmiRecipeCategory> ALL = new LinkedHashMap<>();

Expand Down Expand Up @@ -275,6 +283,12 @@ public void register(EmiRegistry registry) {
addAll(registry, AllRecipeTypes.ITEM_APPLICATION, ManualItemApplicationEmiRecipe::new);
addAll(registry, AllRecipeTypes.MECHANICAL_CRAFTING, MECHANICAL_CRAFTING, MechanicalCraftingEmiRecipe::new);

// In World Interaction recipes
addFluidInteractionRecipe(registry, "create/limestone", AllFluids.HONEY.get(),
Fluids.LAVA, AllPaletteStoneTypes.LIMESTONE.getBaseBlock().get());
addFluidInteractionRecipe(registry, "create/chocolate", AllFluids.CHOCOLATE.get(),
Fluids.LAVA, AllPaletteStoneTypes.SCORIA.getBaseBlock().get());

// Introspective recipes based on present stacks need to make sure
// all stacks are populated by other plugins
registry.addDeferredRecipes(this::addDeferredRecipes);
Expand All @@ -295,15 +309,40 @@ private <T extends Recipe<?>> void addAll(EmiRegistry registry, AllRecipeTypes t
}
}

/**
* Register an In World Interaction recipe
*
* @param registry EmiRegistry
* @param outputId The block being outputted in the form of `modid/block` an example for stone would be `minecraft/stone`
* @param left The stack that will be shown in the left input
* @param right The stack that will be shown in the right input
* @param output The stack that will be outputted from this interaction recipe
*/
private void addFluidInteractionRecipe(@NotNull EmiRegistry registry, String outputId, Fluid left, Fluid right, Block output) {
// EmiStack doesnt accept flowing fluids, must always be a source
if (left instanceof SimpleFlowableFluid.Flowing flowing)
left = flowing.getSource();
if (right instanceof SimpleFlowableFluid.Flowing flowing)
right = flowing.getSource();

// fabric: 81000 droplets = 1000 mb
registry.addRecipe(EmiWorldInteractionRecipe.builder()
.id(Create.asResource("/world/fluid_interaction/" + outputId))
.leftInput(EmiStack.of(left, 81000))
.rightInput(EmiStack.of(right, 81000), false)
.output(EmiStack.of(output))
.build()
);
}

private void addDeferredRecipes(Consumer<EmiRecipe> consumer) {
List<FluidVariant> fluids = EmiApi.getIndexStacks().stream()
.filter(s -> s.getKey() instanceof FluidVariant)
.map(s -> (FluidVariant) s.getKey())
List<Fluid> fluids = EmiApi.getIndexStacks().stream()
.filter(s -> s.getKey() instanceof Fluid)
.map(s -> (Fluid) s.getKey())
.distinct()
.toList();
for (EmiStack stack : EmiApi.getIndexStacks()) {
if (stack.getKey() instanceof ItemVariant iv) {
Item i = iv.getItem();
if (stack.getKey() instanceof Item i) {
ItemStack is = stack.getItemStack();
if (i instanceof PotionItem) {
FluidStack potion = PotionFluidHandler.getFluidFromPotionItem(is);
Expand All @@ -326,14 +365,14 @@ private void addDeferredRecipes(Consumer<EmiRecipe> consumer) {
.build()));
continue;
}
for (FluidVariant fluid : fluids) {
if (i == Items.GLASS_BOTTLE && fluid.getFluid() == Fluids.WATER) {
for (Fluid fluid : fluids) {
if (i == Items.GLASS_BOTTLE && fluid == Fluids.WATER) {
continue;
}
// This will miss fluid containers that hold a minimum of over 1000 L, but perhaps that's preferable.
FluidStack fs = new FluidStack(fluid, FluidConstants.BUCKET);
ItemStack copy = is.copy();
ContainerItemContext ctx = ContainerItemContext.withConstant(copy);
MutableContainerItemContext ctx = new MutableContainerItemContext(copy);
Storage<FluidVariant> storage = ctx.find(FluidStorage.ITEM);
if (storage != null && GenericItemFilling.isFluidHandlerValid(copy, storage)) {
long inserted = 0;
Expand All @@ -358,7 +397,7 @@ private void addDeferredRecipes(Consumer<EmiRecipe> consumer) {
}
}
ItemStack copy = is.copy();
ContainerItemContext ctx = ContainerItemContext.withConstant(copy);
MutableContainerItemContext ctx = new MutableContainerItemContext(copy);
Storage<FluidVariant> storage = ctx.find(FluidStorage.ITEM);
if (storage != null) {
FluidStack extracted = TransferUtil.extractAnyFluid(storage, FluidConstants.BUCKET);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,12 @@ public static void addStochasticTooltip(List<Widget> itemStacks, List<Processing
itemStacks.stream().filter(widget -> widget instanceof Slot).forEach(widget -> {
Slot slot = (Slot) widget;

int slotIndex = itemStacks.indexOf(widget);

ClientEntryStacks.setTooltipProcessor(slot.getCurrentEntry(), (entryStack, tooltip) -> {
// if (slotIndex < startIndex)
// return;
ProcessingOutput output = results.get(/*slotIndex - startIndex*/0);
if (slotIndex < startIndex)
return tooltip;
ProcessingOutput output = results.get(slotIndex - startIndex);
float chance = output.getChance();
if (chance != 1)
tooltip.add(Lang.translateDirect("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,10 @@ public static boolean checkForFunnels(BeltInventory beltInventory, TransportedIt
funnelBE.onTransfer(toInsert);
currentItem.stack = remainder;
beltInventory.belt.sendData();
// fabric: fully inserted, early exit to avoid inserting an empty stack on next loop
if (remainder.isEmpty()) {
return false;
}
if (blocking)
return true;
}
Expand Down

0 comments on commit d3845a8

Please sign in to comment.