瀏覽代碼

Added FluidSupportProvider

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel 5 年之前
父節點
當前提交
3d906ba0fd

+ 1 - 0
.github/workflows/curseforge.yml

@@ -19,3 +19,4 @@ jobs:
         run: ./gradlew clean build releaseOnCf --refresh-dependencies --stacktrace
         env:
           danielshe_curse_api_key: ${{ secrets.CF_API_KEY }}
+          BRANCH_NAME: ${{ github.ref }}

+ 12 - 3
build.gradle

@@ -114,14 +114,23 @@ task remapMavenJar(type: RemapJarTask, dependsOn: jar) {
 
 def releaseChangelog = "No changelog"
 
-/* Thank you modmenu */
+/* Thank you modmenu & fablabs */
 task releaseOnCf {
     def df = new SimpleDateFormat("yyyy-MM-dd HH:mm")
     df.setTimeZone(TimeZone.getTimeZone("UTC"))
-    def currentBranch = "git rev-parse --abbrev-ref HEAD".execute().in.readLines().join('\n')
+    def currentBranch
+    if (System.env.BRANCH_NAME) {
+        branch = System.env.BRANCH_NAME
+        branch = branch.substring(branch.lastIndexOf("/")+1)
+    } else {
+        branch = "git rev-parse --abbrev-ref HEAD".execute().in.text.trim()
+    }
+    if (currentBranch == "HEAD") {
+        branch = "git rev-parse --short HEAD".execute().in.text.trim()
+    }
     def time = df.format(new Date())
     def changes = new StringBuilder()
-    changes << "<h2>REI v$project.version for $project.supported_version</h2>Updated at <b>$time</b>.<br><a href=\"https://www.github.com/shedaniel/RoughlyEnoughItems/commits/$currentBranch\">Click here for changelog</a>"
+    changes << "<h2>REI v$project.version for $project.supported_version</h2>Updated at <b>$time</b>.<br><a href=\"https://www.github.com/shedaniel/RoughlyEnoughItems/commits/$branch\">Click here for changelog</a>"
     def proc = "git log --max-count=200 --pretty=format:\"%s\"".execute()
     proc.in.eachLine { line ->
         def processedLine = line.toString()

+ 1 - 1
gradle.properties

@@ -1,4 +1,4 @@
-mod_version=4.1.10-unstable
+mod_version=4.1.12-unstable
 supported_version=20w16a
 minecraft_version=20w16a
 yarn_version=20w16a+build.1

+ 30 - 16
src/main/java/me/shedaniel/rei/api/EntryStack.java

@@ -27,19 +27,20 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import me.shedaniel.math.Point;
 import me.shedaniel.math.Rectangle;
+import me.shedaniel.rei.api.fluid.FluidSupportProvider;
 import me.shedaniel.rei.api.widgets.Tooltip;
 import me.shedaniel.rei.impl.EmptyEntryStack;
 import me.shedaniel.rei.impl.FluidEntryStack;
 import me.shedaniel.rei.impl.ItemEntryStack;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.fluid.Fluid;
-import net.minecraft.item.BucketItem;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemConvertible;
 import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.nbt.StringNbtReader;
 import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.registry.Registry;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
@@ -65,6 +66,10 @@ public interface EntryStack {
         return new FluidEntryStack(fluid, amount);
     }
     
+    static EntryStack create(Fluid fluid, double amount) {
+        return new FluidEntryStack(fluid, amount);
+    }
+    
     static EntryStack create(ItemStack stack) {
         return new ItemEntryStack(stack);
     }
@@ -124,32 +129,41 @@ public interface EntryStack {
         }
     }
     
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
     static EntryStack copyFluidToBucket(EntryStack stack) {
-        if (stack.getType() != Type.FLUID)
-            throw new IllegalArgumentException("EntryStack must be fluid!");
-        Fluid fluid = stack.getFluid();
-        Item item = fluid.getBucketItem();
-        if (item == null)
-            return EntryStack.empty();
-        return EntryStack.create(item);
+        return copyFluidToItem(stack);
+    }
+    
+    static EntryStack copyFluidToItem(EntryStack stack) {
+        return FluidSupportProvider.INSTANCE.fluidToItem(stack);
     }
     
+    @Deprecated
+    @ApiStatus.ScheduledForRemoval
     static EntryStack copyBucketToFluid(EntryStack stack) {
-        if (stack.getType() != Type.ITEM)
-            throw new IllegalArgumentException("EntryStack must be item!");
-        Item item = stack.getItem();
-        if (item instanceof BucketItem)
-            return EntryStack.create(((BucketItem) item).fluid, 1000);
-        return EntryStack.empty();
+        return copyItemToFluid(stack);
+    }
+    
+    static EntryStack copyItemToFluid(EntryStack stack) {
+        return FluidSupportProvider.INSTANCE.itemToFluid(stack);
     }
     
     Optional<Identifier> getIdentifier();
     
     EntryStack.Type getType();
     
-    int getAmount();
+    default int getAmount() {
+        return MathHelper.floor(getFloatingAmount());
+    }
+    
+    double getFloatingAmount();
+    
+    default void setAmount(int amount) {
+        setFloatingAmount(amount);
+    }
     
-    void setAmount(int amount);
+    void setFloatingAmount(double amount);
     
     boolean isEmpty();
     

+ 34 - 0
src/main/java/me/shedaniel/rei/api/fluid/FluidSupportProvider.java

@@ -0,0 +1,34 @@
+package me.shedaniel.rei.api.fluid;
+
+import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.impl.FluidSupportProviderImpl;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * Experimental library, scheduled to change if needed.
+ */
+@ApiStatus.Experimental
+public interface FluidSupportProvider {
+    FluidSupportProvider INSTANCE = new FluidSupportProviderImpl();
+    
+    void registerFluidProvider(@NotNull FluidProvider provider);
+    
+    @NotNull
+    EntryStack fluidToItem(@NotNull EntryStack fluidStack);
+    
+    @NotNull
+    EntryStack itemToFluid(@NotNull EntryStack itemStack);
+    
+    interface FluidProvider {
+        @NotNull
+        default EntryStack fluidToItem(@NotNull EntryStack fluidStack) {
+            return EntryStack.empty();
+        }
+        
+        @NotNull
+        default EntryStack itemToFluid(@NotNull EntryStack itemStack) {
+            return EntryStack.empty();
+        }
+    }
+}

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java

@@ -725,7 +725,7 @@ public class EntryListWidget extends WidgetWithBounds {
                 EntryStack entry = getCurrentEntry().copy();
                 if (!entry.isEmpty()) {
                     if (entry.getType() == EntryStack.Type.FLUID)
-                        entry = EntryStack.copyFluidToBucket(entry);
+                        entry = EntryStack.copyFluidToItem(entry);
                     if (entry.getType() == EntryStack.Type.ITEM)
                         entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
                     ClientHelper.getInstance().tryCheatingEntry(entry);

+ 1 - 1
src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java

@@ -296,7 +296,7 @@ public class FavoritesListWidget extends WidgetWithBounds {
                 EntryStack entry = getCurrentEntry().copy();
                 if (!entry.isEmpty()) {
                     if (entry.getType() == EntryStack.Type.FLUID)
-                        entry = EntryStack.copyFluidToBucket(entry);
+                        entry = EntryStack.copyFluidToItem(entry);
                     if (entry.getType() == EntryStack.Type.ITEM)
                         entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
                     ClientHelper.getInstance().tryCheatingEntry(entry);

+ 6 - 1
src/main/java/me/shedaniel/rei/impl/EmptyEntryStack.java

@@ -57,7 +57,12 @@ public class EmptyEntryStack implements EntryStack {
     }
     
     @Override
-    public void setAmount(int amount) {
+    public double getFloatingAmount() {
+        return 0;
+    }
+    
+    @Override
+    public void setFloatingAmount(double amount) {
     
     }
     

+ 14 - 10
src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java

@@ -52,15 +52,19 @@ import java.util.*;
 @ApiStatus.Internal
 public class FluidEntryStack extends AbstractEntryStack {
     private static final Map<Fluid, Pair<Sprite, Integer>> FLUID_SPRITE_CACHE = new HashMap<>();
-    private static final int EMPTY_AMOUNT = -1319182373;
+    private static final double EMPTY_AMOUNT = -1319182373;
     private Fluid fluid;
-    private int amount;
+    private double amount;
     
     public FluidEntryStack(Fluid fluid) {
         this(fluid, EMPTY_AMOUNT);
     }
     
     public FluidEntryStack(Fluid fluid, int amount) {
+        this(fluid, (double) amount);
+    }
+    
+    public FluidEntryStack(Fluid fluid, double amount) {
         this.fluid = fluid;
         this.amount = amount;
     }
@@ -93,13 +97,13 @@ public class FluidEntryStack extends AbstractEntryStack {
     }
     
     @Override
-    public int getAmount() {
+    public double getFloatingAmount() {
         return amount;
     }
     
     @Override
-    public void setAmount(int amount) {
-        this.amount = amount == EMPTY_AMOUNT ? EMPTY_AMOUNT : Math.max(amount, 0);
+    public void setFloatingAmount(double amount) {
+        this.amount = amount <= 0 ? EMPTY_AMOUNT : amount;
         if (isEmpty()) {
             fluid = Fluids.EMPTY;
         }
@@ -127,35 +131,35 @@ public class FluidEntryStack extends AbstractEntryStack {
     @Override
     public boolean equalsIgnoreTagsAndAmount(EntryStack stack) {
         if (stack.getType() != Type.FLUID)
-            return false;
+            return EntryStack.copyFluidToItem(this).equalsIgnoreTagsAndAmount(stack);
         return fluid == stack.getFluid();
     }
     
     @Override
     public boolean equalsIgnoreTags(EntryStack stack) {
         if (stack.getType() != Type.FLUID)
-            return false;
+            return EntryStack.copyFluidToItem(this).equalsIgnoreTags(stack);
         return fluid == stack.getFluid() && amount == stack.getAmount();
     }
     
     @Override
     public boolean equalsIgnoreAmount(EntryStack stack) {
         if (stack.getType() != Type.FLUID)
-            return false;
+            return EntryStack.copyFluidToItem(this).equalsIgnoreAmount(stack);
         return fluid == stack.getFluid();
     }
     
     @Override
     public boolean equalsAll(EntryStack stack) {
         if (stack.getType() != Type.FLUID)
-            return false;
+            return EntryStack.copyFluidToItem(this).equalsAll(stack);
         return fluid == stack.getFluid() && amount == stack.getAmount();
     }
     
     @Override
     public int hashOfAll() {
         int result = hashIgnoreAmountAndTags();
-        result = 31 * result + amount;
+        result = 31 * result + Double.hashCode(amount);
         return result;
     }
     

+ 49 - 0
src/main/java/me/shedaniel/rei/impl/FluidSupportProviderImpl.java

@@ -0,0 +1,49 @@
+package me.shedaniel.rei.impl;
+
+import com.google.common.collect.Lists;
+import me.shedaniel.rei.api.EntryStack;
+import me.shedaniel.rei.api.fluid.FluidSupportProvider;
+import org.jetbrains.annotations.ApiStatus;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.List;
+import java.util.Objects;
+
+@ApiStatus.Experimental
+@ApiStatus.Internal
+public class FluidSupportProviderImpl implements FluidSupportProvider {
+    private final List<FluidProvider> providers = Lists.newArrayList();
+    
+    public void reset() {
+        providers.clear();
+    }
+    
+    @Override
+    public void registerFluidProvider(@NotNull FluidProvider provider) {
+        providers.add(Objects.requireNonNull(provider, "Registered provider is null!"));
+    }
+    
+    @Override
+    public @NotNull EntryStack fluidToItem(@NotNull EntryStack fluidStack) {
+        if (fluidStack.isEmpty()) return EntryStack.empty();
+        if (fluidStack.getType() != EntryStack.Type.FLUID)
+            throw new IllegalArgumentException("EntryStack must be fluid!");
+        for (FluidProvider provider : providers) {
+            EntryStack stack = Objects.requireNonNull(provider.fluidToItem(fluidStack), provider.getClass() + " is creating null objects for fluidToItem!");
+            if (!stack.isEmpty()) return stack;
+        }
+        return EntryStack.empty();
+    }
+    
+    @Override
+    public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) {
+        if (itemStack.isEmpty()) return EntryStack.empty();
+        if (itemStack.getType() != EntryStack.Type.ITEM)
+            throw new IllegalArgumentException("EntryStack must be item!");
+        for (FluidProvider provider : providers) {
+            EntryStack stack = Objects.requireNonNull(provider.itemToFluid(itemStack), provider.getClass() + " is creating null objects for itemToFluid!");
+            if (!stack.isEmpty()) return stack;
+        }
+        return EntryStack.empty();
+    }
+}

+ 15 - 4
src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java

@@ -40,6 +40,7 @@ import net.minecraft.item.ItemStack;
 import net.minecraft.nbt.CompoundTag;
 import net.minecraft.nbt.Tag;
 import net.minecraft.util.Identifier;
+import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.registry.Registry;
 import org.jetbrains.annotations.ApiStatus;
 import org.jetbrains.annotations.Nullable;
@@ -76,11 +77,21 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt
         return itemStack.getCount();
     }
     
+    @Override
+    public double getFloatingAmount() {
+        return itemStack.getCount();
+    }
+    
     @Override
     public void setAmount(int amount) {
         itemStack.setCount(amount);
     }
     
+    @Override
+    public void setFloatingAmount(double amount) {
+        itemStack.setCount(MathHelper.floor(amount));
+    }
+    
     @Override
     public boolean isEmpty() {
         return itemStack.isEmpty();
@@ -103,14 +114,14 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt
     @Override
     public boolean equalsIgnoreTagsAndAmount(EntryStack stack) {
         if (stack.getType() != Type.ITEM)
-            return false;
+            return EntryStack.copyItemToFluid(this).equalsIgnoreTagsAndAmount(stack);
         return itemStack.getItem() == stack.getItem();
     }
     
     @Override
     public boolean equalsAll(EntryStack stack) {
         if (stack.getType() != Type.ITEM)
-            return false;
+            return EntryStack.copyItemToFluid(this).equalsAll(stack);
         if (itemStack.getItem() != stack.getItem() || getAmount() != stack.getAmount())
             return false;
         return ItemStack.areTagsEqual(itemStack, stack.getItemStack());
@@ -119,7 +130,7 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt
     @Override
     public boolean equalsIgnoreAmount(EntryStack stack) {
         if (stack.getType() != Type.ITEM)
-            return false;
+            return EntryStack.copyItemToFluid(this).equalsIgnoreAmount(stack);
         if (itemStack.getItem() != stack.getItem())
             return false;
         ItemStack otherStack = stack.getItemStack();
@@ -173,7 +184,7 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt
     @Override
     public boolean equalsIgnoreTags(EntryStack stack) {
         if (stack.getType() != Type.ITEM)
-            return false;
+            return EntryStack.copyItemToFluid(this).equalsIgnoreTags(stack);
         if (itemStack.getItem() != stack.getItem())
             return false;
         return getAmount() == stack.getAmount();

+ 2 - 0
src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java

@@ -29,6 +29,7 @@ import com.google.common.collect.Sets;
 import me.shedaniel.math.Rectangle;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.api.fluid.FluidSupportProvider;
 import me.shedaniel.rei.api.plugins.REIPluginV0;
 import me.shedaniel.rei.api.subsets.SubsetsRegistry;
 import me.shedaniel.rei.impl.subsets.SubsetsRegistryImpl;
@@ -283,6 +284,7 @@ public class RecipeHelperImpl implements RecipeHelper {
         this.liveRecipeGenerators.clear();
         this.autoTransferHandlers.clear();
         ((SubsetsRegistryImpl) SubsetsRegistry.INSTANCE).reset();
+        ((FluidSupportProviderImpl) FluidSupportProvider.INSTANCE).reset();
         ((DisplayHelperImpl) DisplayHelper.getInstance()).resetData();
         ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache();
         BaseBoundsHandler baseBoundsHandler = new BaseBoundsHandlerImpl();

+ 10 - 0
src/main/java/me/shedaniel/rei/impl/RenderingEntry.java

@@ -47,11 +47,21 @@ public abstract class RenderingEntry extends DrawableHelper implements EntryStac
         return 0;
     }
     
+    @Override
+    public double getFloatingAmount() {
+        return 0;
+    }
+    
     @Override
     public void setAmount(int amount) {
     
     }
     
+    @Override
+    public void setFloatingAmount(double amount) {
+    
+    }
+    
     @Override
     public boolean isEmpty() {
         return false;

+ 20 - 0
src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java

@@ -30,6 +30,7 @@ import me.shedaniel.math.Point;
 import me.shedaniel.math.Rectangle;
 import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.*;
+import me.shedaniel.rei.api.fluid.FluidSupportProvider;
 import me.shedaniel.rei.api.plugins.REIPluginV0;
 import me.shedaniel.rei.api.widgets.Panel;
 import me.shedaniel.rei.api.widgets.Tooltip;
@@ -78,6 +79,7 @@ import net.minecraft.tag.BlockTags;
 import net.minecraft.util.Identifier;
 import net.minecraft.util.math.MathHelper;
 import net.minecraft.util.registry.Registry;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.*;
@@ -386,6 +388,24 @@ public class DefaultPlugin implements REIPluginV0 {
         recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING);
         recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING);
         recipeHelper.registerScreenClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING);
+        FluidSupportProvider.INSTANCE.registerFluidProvider(new FluidSupportProvider.FluidProvider() {
+            @Override
+            public @NotNull EntryStack fluidToItem(@NotNull EntryStack fluidStack) {
+                Fluid fluid = fluidStack.getFluid();
+                Item item = fluid.getBucketItem();
+                if (item == null)
+                    return EntryStack.empty();
+                return EntryStack.create(item);
+            }
+            
+            @Override
+            public @NotNull EntryStack itemToFluid(@NotNull EntryStack itemStack) {
+                Item item = itemStack.getItem();
+                if (item instanceof BucketItem)
+                    return EntryStack.create(((BucketItem) item).fluid, 1000);
+                return EntryStack.empty();
+            }
+        });
 //        SubsetsRegistry subsetsRegistry = SubsetsRegistry.INSTANCE;
 //        subsetsRegistry.registerPathEntry("roughlyenoughitems:food", EntryStack.create(Items.MILK_BUCKET));
 //        subsetsRegistry.registerPathEntry("roughlyenoughitems:food/roughlyenoughitems:cookies", EntryStack.create(Items.COOKIE));

二進制
src/main/resources/icon.png