Initial move to the fabric fluid API (#2465)
This commit is contained in:
parent
482fe4f01f
commit
fd9d776b43
23 changed files with 239 additions and 211 deletions
|
@ -28,6 +28,7 @@ import net.fabricmc.api.EnvType;
|
||||||
import net.fabricmc.api.ModInitializer;
|
import net.fabricmc.api.ModInitializer;
|
||||||
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents;
|
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerBlockEntityEvents;
|
||||||
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
|
import net.fabricmc.fabric.api.event.world.WorldTickCallback;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidStorage;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
@ -36,6 +37,7 @@ import reborncore.api.ToolManager;
|
||||||
import reborncore.api.blockentity.UnloadHandler;
|
import reborncore.api.blockentity.UnloadHandler;
|
||||||
import reborncore.common.RebornCoreCommands;
|
import reborncore.common.RebornCoreCommands;
|
||||||
import reborncore.common.RebornCoreConfig;
|
import reborncore.common.RebornCoreConfig;
|
||||||
|
import reborncore.common.blockentity.MachineBaseBlockEntity;
|
||||||
import reborncore.common.blocks.BlockWrenchEventHandler;
|
import reborncore.common.blocks.BlockWrenchEventHandler;
|
||||||
import reborncore.common.config.Configuration;
|
import reborncore.common.config.Configuration;
|
||||||
import reborncore.common.crafting.ingredient.IngredientManager;
|
import reborncore.common.crafting.ingredient.IngredientManager;
|
||||||
|
@ -48,6 +50,7 @@ import reborncore.common.powerSystem.PowerSystem;
|
||||||
import reborncore.common.recipes.PaddedShapedRecipe;
|
import reborncore.common.recipes.PaddedShapedRecipe;
|
||||||
import reborncore.common.util.CalenderUtils;
|
import reborncore.common.util.CalenderUtils;
|
||||||
import reborncore.common.util.GenericWrenchHelper;
|
import reborncore.common.util.GenericWrenchHelper;
|
||||||
|
import reborncore.common.util.Tank;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
@ -115,6 +118,13 @@ public class RebornCore implements ModInitializer {
|
||||||
if (blockEntity instanceof UnloadHandler) ((UnloadHandler) blockEntity).onUnload();
|
if (blockEntity instanceof UnloadHandler) ((UnloadHandler) blockEntity).onUnload();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
FluidStorage.SIDED.registerFallback((world, pos, state, be, direction) -> {
|
||||||
|
if (be instanceof MachineBaseBlockEntity machineBase) {
|
||||||
|
return machineBase.getTank();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
|
||||||
LOGGER.info("Reborn core is done for now, now to let other mods have their turn...");
|
LOGGER.info("Reborn core is done for now, now to let other mods have their turn...");
|
||||||
LOADED = true;
|
LOADED = true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -74,7 +74,7 @@ public class RenderUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void renderGuiTank(Tank tank, double x, double y, double zLevel, double width, double height) {
|
public static void renderGuiTank(Tank tank, double x, double y, double zLevel, double width, double height) {
|
||||||
renderGuiTank(tank.getFluidInstance(), tank.getCapacity(), tank.getFluidAmount(), x, y, zLevel, width, height);
|
renderGuiTank(tank.getFluidInstance(), tank.getFluidValueCapacity(), tank.getFluidAmount(), x, y, zLevel, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void renderGuiTank(FluidInstance fluid, FluidValue capacity, FluidValue amount, double x, double y, double zLevel,
|
public static void renderGuiTank(FluidInstance fluid, FluidValue capacity, FluidValue amount, double x, double y, double zLevel,
|
||||||
|
|
|
@ -27,6 +27,7 @@ package reborncore.client.gui.guibuilder;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.mojang.blaze3d.systems.RenderSystem;
|
import com.mojang.blaze3d.systems.RenderSystem;
|
||||||
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
|
import net.fabricmc.fabric.api.client.render.fluid.v1.FluidRenderHandlerRegistry;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.client.fluid.FluidVariantRendering;
|
||||||
import net.fabricmc.loader.api.FabricLoader;
|
import net.fabricmc.loader.api.FabricLoader;
|
||||||
import net.minecraft.client.MinecraftClient;
|
import net.minecraft.client.MinecraftClient;
|
||||||
import net.minecraft.client.gui.DrawableHelper;
|
import net.minecraft.client.gui.DrawableHelper;
|
||||||
|
@ -56,6 +57,7 @@ import reborncore.common.fluid.FluidValue;
|
||||||
import reborncore.common.fluid.container.FluidInstance;
|
import reborncore.common.fluid.container.FluidInstance;
|
||||||
import reborncore.common.powerSystem.PowerSystem;
|
import reborncore.common.powerSystem.PowerSystem;
|
||||||
import reborncore.common.powerSystem.PowerSystem.EnergySystem;
|
import reborncore.common.powerSystem.PowerSystem.EnergySystem;
|
||||||
|
import reborncore.common.util.FluidTextHelper;
|
||||||
import reborncore.common.util.StringUtils;
|
import reborncore.common.util.StringUtils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -712,14 +714,14 @@ public class GuiBuilder {
|
||||||
* @param height int Height of fluid to draw
|
* @param height int Height of fluid to draw
|
||||||
* @param maxCapacity int Maximum capacity of tank
|
* @param maxCapacity int Maximum capacity of tank
|
||||||
*/
|
*/
|
||||||
public void drawFluid(MatrixStack matrixStack, GuiBase<?> gui, FluidInstance fluid, int x, int y, int width, int height, int maxCapacity) {
|
public void drawFluid(MatrixStack matrixStack, GuiBase<?> gui, FluidInstance fluid, int x, int y, int width, int height, long maxCapacity) {
|
||||||
if (fluid.getFluid() == Fluids.EMPTY) {
|
if (fluid.getFluid() == Fluids.EMPTY) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
RenderSystem.setShaderTexture(0, SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE);
|
RenderSystem.setShaderTexture(0, SpriteAtlasTexture.BLOCK_ATLAS_TEXTURE);
|
||||||
y += height;
|
y += height;
|
||||||
final Sprite sprite = FluidRenderHandlerRegistry.INSTANCE.get(fluid.getFluid()).getFluidSprites(gui.getMachine().getWorld(), gui.getMachine().getPos(), fluid.getFluid().getDefaultState())[0];
|
final Sprite sprite = FluidVariantRendering.getSprite(fluid.getVariant());
|
||||||
int color = FluidRenderHandlerRegistry.INSTANCE.get(fluid.getFluid()).getFluidColor(gui.getMachine().getWorld(), gui.getMachine().getPos(), fluid.getFluid().getDefaultState());
|
int color = FluidVariantRendering.getColor(fluid.getVariant());
|
||||||
|
|
||||||
final int drawHeight = (int) (fluid.getAmount().getRawValue() / (maxCapacity * 1F) * height);
|
final int drawHeight = (int) (fluid.getAmount().getRawValue() / (maxCapacity * 1F) * height);
|
||||||
final int iconHeight = sprite.getHeight();
|
final int iconHeight = sprite.getHeight();
|
||||||
|
@ -801,7 +803,7 @@ public class GuiBuilder {
|
||||||
gui.drawTexture(matrixStack, x, y, 150 + 23, 122, 3, 26);
|
gui.drawTexture(matrixStack, x, y, 150 + 23, 122, 3, 26);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected int percentage(int MaxValue, int CurrentValue) {
|
protected int percentage(long MaxValue, long CurrentValue) {
|
||||||
if (CurrentValue == 0) {
|
if (CurrentValue == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,11 +24,16 @@
|
||||||
|
|
||||||
package reborncore.common.blockentity;
|
package reborncore.common.blockentity;
|
||||||
|
|
||||||
|
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.storage.Storage;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil;
|
||||||
import net.minecraft.block.entity.BlockEntity;
|
import net.minecraft.block.entity.BlockEntity;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.util.math.Direction;
|
import net.minecraft.util.math.Direction;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
import reborncore.common.fluid.FluidUtil;
|
import reborncore.common.fluid.FluidUtil;
|
||||||
import reborncore.common.util.NBTSerializable;
|
import reborncore.common.util.NBTSerializable;
|
||||||
import reborncore.common.util.Tank;
|
import reborncore.common.util.Tank;
|
||||||
|
@ -82,23 +87,21 @@ public class FluidConfiguration implements NBTSerializable {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Tank tank = getTank(machineBase, facing);
|
@Nullable
|
||||||
|
Storage<FluidVariant> tank = getTank(machineBase, facing);
|
||||||
if (autoInput() && fluidConfig.getIoConfig().isInsert()) {
|
if (autoInput() && fluidConfig.getIoConfig().isInsert()) {
|
||||||
FluidUtil.transferFluid(tank, machineBase.getTank(), machineBase.fluidTransferAmount());
|
StorageUtil.move(tank, machineBase.getTank(), fv -> true, machineBase.fluidTransferAmount().getRawValue(), null);
|
||||||
}
|
}
|
||||||
if (autoOutput() && fluidConfig.getIoConfig().isExtact()) {
|
if (autoOutput() && fluidConfig.getIoConfig().isExtact()) {
|
||||||
FluidUtil.transferFluid(machineBase.getTank(), tank, machineBase.fluidTransferAmount());
|
StorageUtil.move(machineBase.getTank(), tank, fv -> true, machineBase.fluidTransferAmount().getRawValue(), null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Tank getTank(MachineBaseBlockEntity machine, Direction facing) {
|
@Nullable
|
||||||
|
private Storage<FluidVariant> getTank(MachineBaseBlockEntity machine, Direction facing) {
|
||||||
BlockPos pos = machine.getPos().offset(facing);
|
BlockPos pos = machine.getPos().offset(facing);
|
||||||
BlockEntity blockEntity = machine.getWorld().getBlockEntity(pos);
|
return FluidStorage.SIDED.find(machine.getWorld(), pos, facing.getOpposite());
|
||||||
if (blockEntity instanceof MachineBaseBlockEntity) {
|
|
||||||
return ((MachineBaseBlockEntity) blockEntity).getTank();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean autoInput() {
|
public boolean autoInput() {
|
||||||
|
|
|
@ -54,37 +54,11 @@ public class FluidUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getFluidName(@NotNull FluidInstance fluidInstance) {
|
public static String getFluidName(@NotNull FluidInstance fluidInstance) {
|
||||||
|
// TODO: use FluidVariantRendering
|
||||||
return getFluidName(fluidInstance.getFluid());
|
return getFluidName(fluidInstance.getFluid());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getFluidName(@NotNull Fluid fluid) {
|
public static String getFluidName(@NotNull Fluid fluid) {
|
||||||
return StringUtils.capitalize(Registry.FLUID.getId(fluid).getPath());
|
return StringUtils.capitalize(Registry.FLUID.getId(fluid).getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void transferFluid(Tank source, Tank destination, FluidValue amount) {
|
|
||||||
if (source == null || destination == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (source.getFluid() == Fluids.EMPTY || source.getFluidAmount().isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (destination.getFluid() != Fluids.EMPTY && source.getFluid() != destination.getFluid()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
FluidValue transferAmount = source.getFluidAmount().min(amount);
|
|
||||||
if (destination.getFreeSpace().equalOrMoreThan(transferAmount)) {
|
|
||||||
FluidInstance fluidInstance = destination.getFluidInstance();
|
|
||||||
if (fluidInstance.isEmpty()) {
|
|
||||||
fluidInstance = new FluidInstance(source.getFluid(), transferAmount);
|
|
||||||
} else {
|
|
||||||
fluidInstance.addAmount(transferAmount);
|
|
||||||
}
|
|
||||||
source.setFluidAmount(source.getFluidAmount().subtract(transferAmount));
|
|
||||||
destination.setFluidInstance(fluidInstance);
|
|
||||||
|
|
||||||
if (source.getFluidAmount().equals(FluidValue.EMPTY)) {
|
|
||||||
source.setFluid(Fluids.EMPTY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,26 +28,32 @@ import com.google.common.base.Objects;
|
||||||
import com.google.gson.JsonElement;
|
import com.google.gson.JsonElement;
|
||||||
import com.google.gson.JsonObject;
|
import com.google.gson.JsonObject;
|
||||||
import com.google.gson.JsonSyntaxException;
|
import com.google.gson.JsonSyntaxException;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidConstants;
|
||||||
import net.minecraft.util.JsonHelper;
|
import net.minecraft.util.JsonHelper;
|
||||||
|
import reborncore.common.util.FluidTextHelper;
|
||||||
|
|
||||||
public final class FluidValue {
|
public final class FluidValue {
|
||||||
|
|
||||||
public static final FluidValue EMPTY = new FluidValue(0);
|
public static final FluidValue EMPTY = new FluidValue(0);
|
||||||
public static final FluidValue BUCKET_QUARTER = new FluidValue(250);
|
public static final FluidValue BUCKET_QUARTER = new FluidValue(FluidConstants.BUCKET / 4);
|
||||||
public static final FluidValue BUCKET = new FluidValue(1000);
|
public static final FluidValue BUCKET = new FluidValue(FluidConstants.BUCKET);
|
||||||
public static final FluidValue INFINITE = new FluidValue(Integer.MAX_VALUE);
|
public static final FluidValue INFINITE = new FluidValue(Long.MAX_VALUE);
|
||||||
|
|
||||||
private final int rawValue;
|
private final long rawValue;
|
||||||
|
|
||||||
private FluidValue(final int rawValue) {
|
private static FluidValue fromMillibuckets(long millibuckets) {
|
||||||
|
return new FluidValue(millibuckets * 81);
|
||||||
|
}
|
||||||
|
|
||||||
|
private FluidValue(long rawValue) {
|
||||||
this.rawValue = rawValue;
|
this.rawValue = rawValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FluidValue multiply(int value) {
|
public FluidValue multiply(long value) {
|
||||||
return fromRaw(rawValue * value);
|
return fromRaw(rawValue * value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public FluidValue fraction(int divider) {return fromRaw(rawValue / divider);}
|
public FluidValue fraction(long divider) {return fromRaw(rawValue / divider);}
|
||||||
|
|
||||||
public FluidValue add(FluidValue fluidValue) {
|
public FluidValue add(FluidValue fluidValue) {
|
||||||
return fromRaw(rawValue + fluidValue.rawValue);
|
return fromRaw(rawValue + fluidValue.rawValue);
|
||||||
|
@ -83,12 +89,12 @@ public final class FluidValue {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return rawValue + " Mb";
|
return FluidTextHelper.getValueDisplay(this) + " Mb";
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO move away from using this
|
//TODO move away from using this
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public int getRawValue() {
|
public long getRawValue() {
|
||||||
return rawValue;
|
return rawValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,7 +112,7 @@ public final class FluidValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public static FluidValue fromRaw(int rawValue) {
|
public static FluidValue fromRaw(long rawValue) {
|
||||||
if (rawValue < 0) {
|
if (rawValue < 0) {
|
||||||
rawValue = 0;
|
rawValue = 0;
|
||||||
}
|
}
|
||||||
|
@ -119,10 +125,13 @@ public final class FluidValue {
|
||||||
if (jsonObject.has("buckets")) {
|
if (jsonObject.has("buckets")) {
|
||||||
int buckets = JsonHelper.getInt(jsonObject, "buckets");
|
int buckets = JsonHelper.getInt(jsonObject, "buckets");
|
||||||
return BUCKET.multiply(buckets);
|
return BUCKET.multiply(buckets);
|
||||||
|
} else if (jsonObject.has("droplets")) {
|
||||||
|
long droplets = JsonHelper.getLong(jsonObject, "droplets");
|
||||||
|
return fromRaw(droplets);
|
||||||
}
|
}
|
||||||
} else if (jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isNumber()) {
|
} else if (jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isNumber()) {
|
||||||
//TODO add a warning here
|
//TODO add a warning here
|
||||||
return fromRaw(jsonElement.getAsJsonPrimitive().getAsInt());
|
return fromMillibuckets(jsonElement.getAsJsonPrimitive().getAsInt());
|
||||||
}
|
}
|
||||||
throw new JsonSyntaxException("Could not parse fluid value");
|
throw new JsonSyntaxException("Could not parse fluid value");
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
package reborncore.common.fluid.container;
|
package reborncore.common.fluid.container;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
|
||||||
import net.minecraft.fluid.Fluid;
|
import net.minecraft.fluid.Fluid;
|
||||||
import net.minecraft.fluid.Fluids;
|
import net.minecraft.fluid.Fluids;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
|
@ -39,6 +40,7 @@ public class FluidInstance implements NBTSerializable {
|
||||||
|
|
||||||
public static final FluidInstance EMPTY = new FluidInstance(Fluids.EMPTY, FluidValue.EMPTY);
|
public static final FluidInstance EMPTY = new FluidInstance(Fluids.EMPTY, FluidValue.EMPTY);
|
||||||
|
|
||||||
|
// TODO: move to FluidVariant
|
||||||
protected Fluid fluid;
|
protected Fluid fluid;
|
||||||
protected FluidValue amount;
|
protected FluidValue amount;
|
||||||
protected NbtCompound tag;
|
protected NbtCompound tag;
|
||||||
|
@ -113,7 +115,7 @@ public class FluidInstance implements NBTSerializable {
|
||||||
public NbtCompound write() {
|
public NbtCompound write() {
|
||||||
NbtCompound tag = new NbtCompound();
|
NbtCompound tag = new NbtCompound();
|
||||||
tag.putString(FLUID_KEY, Registry.FLUID.getId(fluid).toString());
|
tag.putString(FLUID_KEY, Registry.FLUID.getId(fluid).toString());
|
||||||
tag.putInt(AMOUNT_KEY, amount.getRawValue());
|
tag.putLong(AMOUNT_KEY, amount.getRawValue());
|
||||||
if (this.tag != null && !this.tag.isEmpty()) {
|
if (this.tag != null && !this.tag.isEmpty()) {
|
||||||
tag.put(TAG_KEY, this.tag);
|
tag.put(TAG_KEY, this.tag);
|
||||||
}
|
}
|
||||||
|
@ -123,7 +125,7 @@ public class FluidInstance implements NBTSerializable {
|
||||||
@Override
|
@Override
|
||||||
public void read(NbtCompound tag) {
|
public void read(NbtCompound tag) {
|
||||||
fluid = Registry.FLUID.get(new Identifier(tag.getString(FLUID_KEY)));
|
fluid = Registry.FLUID.get(new Identifier(tag.getString(FLUID_KEY)));
|
||||||
amount = FluidValue.fromRaw(tag.getInt(AMOUNT_KEY));
|
amount = FluidValue.fromRaw(tag.getLong(AMOUNT_KEY));
|
||||||
if (tag.contains(TAG_KEY)) {
|
if (tag.contains(TAG_KEY)) {
|
||||||
this.tag = tag.getCompound(TAG_KEY);
|
this.tag = tag.getCompound(TAG_KEY);
|
||||||
}
|
}
|
||||||
|
@ -137,4 +139,9 @@ public class FluidInstance implements NBTSerializable {
|
||||||
public boolean isFluidEqual(FluidInstance instance) {
|
public boolean isFluidEqual(FluidInstance instance) {
|
||||||
return (isEmpty() && instance.isEmpty()) || fluid.equals(instance.getFluid());
|
return (isEmpty() && instance.isEmpty()) || fluid.equals(instance.getFluid());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public FluidVariant getVariant() {
|
||||||
|
if (isEmpty()) return FluidVariant.blank();
|
||||||
|
else return FluidVariant.of(fluid, tag);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -1,95 +0,0 @@
|
||||||
/*
|
|
||||||
* This file is part of RebornCore, licensed under the MIT License (MIT).
|
|
||||||
*
|
|
||||||
* Copyright (c) 2021 TeamReborn
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in all
|
|
||||||
* copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
* SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package reborncore.common.fluid.container;
|
|
||||||
|
|
||||||
import net.minecraft.fluid.Fluid;
|
|
||||||
import net.minecraft.item.ItemStack;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import reborncore.common.fluid.FluidValue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
* Based of Slilk's API but with some breaking changes
|
|
||||||
|
|
||||||
* Direction has been replaced with a generic type, this allows for things like ItemStack to be easily passed along
|
|
||||||
* Some methods such as getCapacity have been tweaked to also provide the type
|
|
||||||
* Some methods have got default implementations making it a lot easier to implement without the worry for bugs
|
|
||||||
* The multiple fluids thing has gone, it is still possible to one fluid per side if wanted as the type is passed around everywhere
|
|
||||||
* A lot of the "helper" methods have been removed, these should really go in boilerplate classes and not the in raw api
|
|
||||||
* removed the docs as cba to write them
|
|
||||||
|
|
||||||
*/
|
|
||||||
public interface GenericFluidContainer<T> {
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
static GenericFluidContainer<ItemStack> fromStack(@NotNull ItemStack itemStack) {
|
|
||||||
if (itemStack.getItem() instanceof GenericFluidContainer) {
|
|
||||||
//noinspection unchecked
|
|
||||||
return (GenericFluidContainer<ItemStack>) itemStack.getItem();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setFluid(T type, @NotNull FluidInstance instance);
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
FluidInstance getFluidInstance(T type);
|
|
||||||
|
|
||||||
FluidValue getCapacity(T type);
|
|
||||||
|
|
||||||
default boolean canHold(T type, Fluid fluid) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
default FluidValue getCurrentFluidAmount(T type) {
|
|
||||||
return getFluidInstance(type).getAmount();
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean canInsertFluid(T type, @NotNull Fluid fluid, FluidValue amount) {
|
|
||||||
if (!canHold(type, fluid)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
FluidInstance currentFluid = getFluidInstance(type);
|
|
||||||
return currentFluid.isEmpty() || currentFluid.getFluid() == fluid && currentFluid.getAmount().add(amount).lessThan(getCapacity(type));
|
|
||||||
}
|
|
||||||
|
|
||||||
default boolean canExtractFluid(T type, @NotNull Fluid fluid, FluidValue amount) {
|
|
||||||
return getFluidInstance(type).getFluid() == fluid && amount.lessThanOrEqual(getFluidInstance(type).getAmount());
|
|
||||||
}
|
|
||||||
|
|
||||||
default void insertFluid(T type, @NotNull Fluid fluid, FluidValue amount) {
|
|
||||||
if (canInsertFluid(type, fluid, amount)) {
|
|
||||||
setFluid(type, getFluidInstance(type).addAmount(amount));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
default void extractFluid(T type, @NotNull Fluid fluid, FluidValue amount) {
|
|
||||||
if (canExtractFluid(type, fluid, amount)) {
|
|
||||||
setFluid(type, getFluidInstance(type).subtractAmount(amount));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -72,9 +72,9 @@ public enum ObjectBufferUtils {
|
||||||
}),
|
}),
|
||||||
|
|
||||||
FLUID_VALUE(FluidValue.class, (value, buffer) -> {
|
FLUID_VALUE(FluidValue.class, (value, buffer) -> {
|
||||||
buffer.writeInt(value.getRawValue());
|
buffer.writeLong(value.getRawValue());
|
||||||
}, buffer -> {
|
}, buffer -> {
|
||||||
return FluidValue.fromRaw(buffer.readInt());
|
return FluidValue.fromRaw(buffer.readLong());
|
||||||
}),
|
}),
|
||||||
|
|
||||||
COMPOUND_TAG(NbtCompound.class, (value, buffer) -> {
|
COMPOUND_TAG(NbtCompound.class, (value, buffer) -> {
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
package reborncore.common.util;
|
||||||
|
|
||||||
|
import com.google.common.math.LongMath;
|
||||||
|
import reborncore.common.fluid.FluidValue;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A few helpers to display fluids.
|
||||||
|
*/
|
||||||
|
public class FluidTextHelper {
|
||||||
|
public static String getValueDisplay(FluidValue value) {
|
||||||
|
return getUnicodeMillibuckets(value.getRawValue(), false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a unicode string representing a fraction, like ¹⁄₈₁.
|
||||||
|
*/
|
||||||
|
public static String getUnicodeFraction(long numerator, long denominator, boolean simplify) {
|
||||||
|
if (numerator < 0 || denominator < 0)
|
||||||
|
throw new IllegalArgumentException("Numerator and denominator must be non negative.");
|
||||||
|
|
||||||
|
if (simplify && denominator != 0) {
|
||||||
|
long g = LongMath.gcd(numerator, denominator);
|
||||||
|
numerator /= g;
|
||||||
|
denominator /= g;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder numString = new StringBuilder();
|
||||||
|
|
||||||
|
while (numerator > 0) {
|
||||||
|
numString.append(SUPERSCRIPT[(int) (numerator % 10)]);
|
||||||
|
numerator /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder denomString = new StringBuilder();
|
||||||
|
|
||||||
|
while (denominator > 0) {
|
||||||
|
denomString.append(SUBSCRIPT[(int) (denominator % 10)]);
|
||||||
|
denominator /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
return numString.reverse().toString() + FRACTION_BAR + denomString.reverse().toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a non negative fluid amount in droplets to a unicode string
|
||||||
|
* representing the amount in millibuckets. For example, passing 163 will result
|
||||||
|
* in
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* 2 ¹⁄₈₁
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* .
|
||||||
|
*/
|
||||||
|
public static String getUnicodeMillibuckets(long droplets, boolean simplify) {
|
||||||
|
String result = "" + droplets / 81;
|
||||||
|
|
||||||
|
if (droplets % 81 != 0) {
|
||||||
|
result += " " + getUnicodeFraction(droplets % 81, 81, simplify);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final char[] SUPERSCRIPT = new char[] { '\u2070', '\u00b9', '\u00b2', '\u00b3', '\u2074', '\u2075', '\u2076', '\u2077', '\u2078',
|
||||||
|
'\u2079' };
|
||||||
|
private static final char FRACTION_BAR = '\u2044';
|
||||||
|
private static final char[] SUBSCRIPT = new char[] { '\u2080', '\u2081', '\u2082', '\u2083', '\u2084', '\u2085', '\u2086', '\u2087', '\u2088',
|
||||||
|
'\u2089' };
|
||||||
|
|
||||||
|
private FluidTextHelper() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -24,36 +24,36 @@
|
||||||
|
|
||||||
package reborncore.common.util;
|
package reborncore.common.util;
|
||||||
|
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.fluid.FluidVariant;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.storage.StoragePreconditions;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.storage.base.SingleSlotStorage;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.transaction.TransactionContext;
|
||||||
|
import net.fabricmc.fabric.api.transfer.v1.transaction.base.SnapshotParticipant;
|
||||||
import net.minecraft.fluid.Fluid;
|
import net.minecraft.fluid.Fluid;
|
||||||
import net.minecraft.fluid.Fluids;
|
import net.minecraft.fluid.Fluids;
|
||||||
import net.minecraft.nbt.NbtCompound;
|
import net.minecraft.nbt.NbtCompound;
|
||||||
import net.minecraft.util.Identifier;
|
import net.minecraft.util.Identifier;
|
||||||
import net.minecraft.util.math.Direction;
|
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import org.apache.commons.lang3.Validate;
|
import org.apache.commons.lang3.Validate;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import reborncore.client.screen.builder.Syncable;
|
import reborncore.client.screen.builder.Syncable;
|
||||||
import reborncore.common.blockentity.MachineBaseBlockEntity;
|
import reborncore.common.blockentity.MachineBaseBlockEntity;
|
||||||
import reborncore.common.fluid.FluidValue;
|
import reborncore.common.fluid.FluidValue;
|
||||||
import reborncore.common.fluid.container.FluidInstance;
|
import reborncore.common.fluid.container.FluidInstance;
|
||||||
import reborncore.common.fluid.container.GenericFluidContainer;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
public class Tank implements GenericFluidContainer<Direction>, Syncable {
|
@SuppressWarnings({"deprecation", "UnstableApiUsage"})
|
||||||
|
public class Tank extends SnapshotParticipant<FluidInstance> implements Syncable, SingleSlotStorage<FluidVariant> {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
@NotNull
|
@NotNull
|
||||||
private FluidInstance fluidInstance = new FluidInstance();
|
private FluidInstance fluidInstance = new FluidInstance();
|
||||||
private final FluidValue capacity;
|
private final FluidValue capacity;
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private Direction side = null;
|
|
||||||
|
|
||||||
private final MachineBaseBlockEntity blockEntity;
|
private final MachineBaseBlockEntity blockEntity;
|
||||||
|
|
||||||
public Tank(String name, FluidValue capacity, MachineBaseBlockEntity blockEntity) {
|
public Tank(String name, FluidValue capacity, MachineBaseBlockEntity blockEntity) {
|
||||||
|
@ -65,7 +65,7 @@ public class Tank implements GenericFluidContainer<Direction>, Syncable {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public FluidInstance getFluidInstance() {
|
public FluidInstance getFluidInstance() {
|
||||||
return getFluidInstance(side);
|
return fluidInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
@ -73,12 +73,12 @@ public class Tank implements GenericFluidContainer<Direction>, Syncable {
|
||||||
return getFluidInstance().getFluid();
|
return getFluidInstance().getFluid();
|
||||||
}
|
}
|
||||||
|
|
||||||
public FluidValue getCapacity() {
|
public FluidValue getFluidValueCapacity() {
|
||||||
return capacity;
|
return capacity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public FluidValue getFreeSpace() {
|
public FluidValue getFreeSpace() {
|
||||||
return getCapacity().subtract(getFluidAmount());
|
return getFluidValueCapacity().subtract(getFluidAmount());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean canFit(Fluid fluid, FluidValue amount) {
|
public boolean canFit(Fluid fluid, FluidValue amount) {
|
||||||
|
@ -90,7 +90,7 @@ public class Tank implements GenericFluidContainer<Direction>, Syncable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFull() {
|
public boolean isFull() {
|
||||||
return !getFluidInstance().isEmpty() && getFluidInstance().getAmount().equalOrMoreThan(getCapacity());
|
return !getFluidInstance().isEmpty() && getFluidInstance().getAmount().equalOrMoreThan(getFluidValueCapacity());
|
||||||
}
|
}
|
||||||
|
|
||||||
public final NbtCompound write(NbtCompound nbt) {
|
public final NbtCompound write(NbtCompound nbt) {
|
||||||
|
@ -121,17 +121,6 @@ public class Tank implements GenericFluidContainer<Direction>, Syncable {
|
||||||
fluidInstance.setFluid(f);
|
fluidInstance.setFluid(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
public Direction getSide() {
|
|
||||||
return side;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSide(
|
|
||||||
@Nullable
|
|
||||||
Direction side) {
|
|
||||||
this.side = side;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void getSyncPair(List<Pair<Supplier<?>, Consumer<?>>> pairList) {
|
public void getSyncPair(List<Pair<Supplier<?>, Consumer<?>>> pairList) {
|
||||||
pairList.add(Pair.of(() -> Registry.FLUID.getId(fluidInstance.getFluid()).toString(), (Consumer<String>) o -> fluidInstance.setFluid(Registry.FLUID.get(new Identifier(o)))));
|
pairList.add(Pair.of(() -> Registry.FLUID.getId(fluidInstance.getFluid()).toString(), (Consumer<String>) o -> fluidInstance.setFluid(Registry.FLUID.get(new Identifier(o)))));
|
||||||
|
@ -142,25 +131,86 @@ public class Tank implements GenericFluidContainer<Direction>, Syncable {
|
||||||
return getFluidInstance().getAmount();
|
return getFluidInstance().getAmount();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
public void setFluid(@NotNull FluidInstance instance) {
|
||||||
public void setFluid(@Nullable Direction type, @NotNull FluidInstance instance) {
|
|
||||||
fluidInstance = instance;
|
fluidInstance = instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public FluidInstance getFluidInstance(@Nullable Direction type) {
|
|
||||||
return fluidInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setFluidInstance(@NotNull FluidInstance fluidInstance) {
|
public void setFluidInstance(@NotNull FluidInstance fluidInstance) {
|
||||||
this.fluidInstance = fluidInstance;
|
this.fluidInstance = fluidInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FluidValue getCapacity(@Nullable Direction type) {
|
public long insert(FluidVariant insertedVariant, long maxAmount, TransactionContext transaction) {
|
||||||
return capacity;
|
StoragePreconditions.notBlankNotNegative(insertedVariant, maxAmount);
|
||||||
|
FluidVariant currentVariant = getResource();
|
||||||
|
|
||||||
|
if (currentVariant.equals(insertedVariant) || currentVariant.isBlank()) {
|
||||||
|
long insertedAmount = Math.min(maxAmount, getCapacity() - getAmount());
|
||||||
|
|
||||||
|
if (insertedAmount > 0) {
|
||||||
|
updateSnapshots(transaction);
|
||||||
|
|
||||||
|
// Just in case.
|
||||||
|
if (currentVariant.isBlank()) fluidInstance.setAmount(FluidValue.EMPTY);
|
||||||
|
|
||||||
|
fluidInstance.setFluid(insertedVariant.getFluid());
|
||||||
|
fluidInstance.setTag(insertedVariant.getNbt());
|
||||||
|
fluidInstance.addAmount(FluidValue.fromRaw(insertedAmount));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return insertedAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long extract(FluidVariant extractedVariant, long maxAmount, TransactionContext transaction) {
|
||||||
|
StoragePreconditions.notBlankNotNegative(extractedVariant, maxAmount);
|
||||||
|
FluidVariant currentVariant = getResource();
|
||||||
|
|
||||||
|
if (extractedVariant.equals(currentVariant)) {
|
||||||
|
long extractedAmount = Math.min(maxAmount, getAmount());
|
||||||
|
|
||||||
|
if (extractedAmount > 0) {
|
||||||
|
updateSnapshots(transaction);
|
||||||
|
|
||||||
|
fluidInstance.subtractAmount(FluidValue.fromRaw(extractedAmount));
|
||||||
|
}
|
||||||
|
|
||||||
|
return extractedAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isResourceBlank() {
|
||||||
|
return getResource().isBlank();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FluidVariant getResource() {
|
||||||
|
return fluidInstance.getVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getAmount() {
|
||||||
|
return fluidInstance.getAmount().getRawValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long getCapacity() {
|
||||||
|
return getFluidValueCapacity().getRawValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FluidInstance createSnapshot() {
|
||||||
|
return fluidInstance.copy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void readSnapshot(FluidInstance snapshot) {
|
||||||
|
setFluidInstance(snapshot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ import reborncore.common.blockentity.MachineBaseBlockEntity;
|
||||||
import reborncore.common.fluid.FluidUtil;
|
import reborncore.common.fluid.FluidUtil;
|
||||||
import reborncore.common.fluid.FluidValue;
|
import reborncore.common.fluid.FluidValue;
|
||||||
import reborncore.common.fluid.container.FluidInstance;
|
import reborncore.common.fluid.container.FluidInstance;
|
||||||
|
import reborncore.common.util.FluidTextHelper;
|
||||||
import reborncore.common.util.RebornInventory;
|
import reborncore.common.util.RebornInventory;
|
||||||
import reborncore.common.util.Tank;
|
import reborncore.common.util.Tank;
|
||||||
import techreborn.init.TRBlockEntities;
|
import techreborn.init.TRBlockEntities;
|
||||||
|
@ -56,7 +57,7 @@ import java.util.List;
|
||||||
|
|
||||||
public class TankUnitBaseBlockEntity extends MachineBaseBlockEntity implements InventoryProvider, IToolDrop, IListInfoProvider, BuiltScreenHandlerProvider {
|
public class TankUnitBaseBlockEntity extends MachineBaseBlockEntity implements InventoryProvider, IToolDrop, IListInfoProvider, BuiltScreenHandlerProvider {
|
||||||
protected Tank tank;
|
protected Tank tank;
|
||||||
private int serverMaxCapacity = -1;
|
private long serverMaxCapacity = -1;
|
||||||
|
|
||||||
protected RebornInventory<TankUnitBaseBlockEntity> inventory = new RebornInventory<>(2, "TankInventory", 64, this);
|
protected RebornInventory<TankUnitBaseBlockEntity> inventory = new RebornInventory<>(2, "TankInventory", 64, this);
|
||||||
|
|
||||||
|
@ -169,7 +170,7 @@ public class TankUnitBaseBlockEntity extends MachineBaseBlockEntity implements I
|
||||||
info.add(
|
info.add(
|
||||||
new TranslatableText("techreborn.tooltip.unit.capacity")
|
new TranslatableText("techreborn.tooltip.unit.capacity")
|
||||||
.formatted(Formatting.GRAY)
|
.formatted(Formatting.GRAY)
|
||||||
.append(new LiteralText(String.valueOf(this.tank.getCapacity()))
|
.append(new LiteralText(String.valueOf(this.tank.getFluidValueCapacity()))
|
||||||
.formatted(Formatting.GOLD))
|
.formatted(Formatting.GOLD))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -186,11 +187,11 @@ public class TankUnitBaseBlockEntity extends MachineBaseBlockEntity implements I
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync between server/client if configs are mis-matched.
|
// Sync between server/client if configs are mis-matched.
|
||||||
public int getMaxCapacity() {
|
public long getMaxCapacity() {
|
||||||
return this.tank.getCapacity().getRawValue();
|
return this.tank.getFluidValueCapacity().getRawValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaxCapacity(int maxCapacity) {
|
public void setMaxCapacity(long maxCapacity) {
|
||||||
FluidInstance instance = tank.getFluidInstance();
|
FluidInstance instance = tank.getFluidInstance();
|
||||||
this.tank = new Tank("TankStorage", FluidValue.fromRaw(maxCapacity), this);
|
this.tank = new Tank("TankStorage", FluidValue.fromRaw(maxCapacity), this);
|
||||||
this.tank.setFluidInstance(instance);
|
this.tank.setFluidInstance(instance);
|
||||||
|
@ -202,9 +203,4 @@ public class TankUnitBaseBlockEntity extends MachineBaseBlockEntity implements I
|
||||||
public Tank getTank() {
|
public Tank getTank() {
|
||||||
return tank;
|
return tank;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public void setTank(Tank tank) {
|
|
||||||
this.tank.setFluid(null, tank.getFluidInstance());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,7 +91,7 @@ public class TankUnitBlock extends BlockMachineBase {
|
||||||
if(amountInTank.equalOrMoreThan(FluidValue.BUCKET)){
|
if(amountInTank.equalOrMoreThan(FluidValue.BUCKET)){
|
||||||
|
|
||||||
// Amount to transfer is whatever is lower (stack count or tank level)
|
// Amount to transfer is whatever is lower (stack count or tank level)
|
||||||
int amountTransferBuckets = Math.min(amountInTank.getRawValue() / FluidValue.BUCKET.getRawValue(), stackInHand.getCount());
|
int amountTransferBuckets = (int) Math.min(amountInTank.getRawValue() / FluidValue.BUCKET.getRawValue(), stackInHand.getCount());
|
||||||
|
|
||||||
// Remove items from player
|
// Remove items from player
|
||||||
stackInHand.decrement(amountTransferBuckets);
|
stackInHand.decrement(amountTransferBuckets);
|
||||||
|
|
|
@ -60,7 +60,7 @@ public class GuiDieselGenerator extends GuiBase<BuiltScreenHandler> {
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
||||||
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,7 +68,7 @@ public class GuiFluidReplicator extends GuiBase<BuiltScreenHandler> {
|
||||||
super.drawForeground(matrixStack, mouseX, mouseY);
|
super.drawForeground(matrixStack, mouseX, mouseY);
|
||||||
final GuiBase.Layer layer = GuiBase.Layer.FOREGROUND;
|
final GuiBase.Layer layer = GuiBase.Layer.FOREGROUND;
|
||||||
|
|
||||||
builder.drawTank(matrixStack, this, 99, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 99, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 76, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 76, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
if (blockEntity.isMultiblockValid()) {
|
if (blockEntity.isMultiblockValid()) {
|
||||||
addHologramButton(6, 4, 212, layer).clickHandler(this::onClick);
|
addHologramButton(6, 4, 212, layer).clickHandler(this::onClick);
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class GuiGasTurbine extends GuiBase<BuiltScreenHandler> {
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
||||||
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ public class GuiIndustrialGrinder extends GuiBase<BuiltScreenHandler> {
|
||||||
final Layer layer = Layer.FOREGROUND;
|
final Layer layer = Layer.FOREGROUND;
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 105, 47, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 105, 47, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawTank(matrixStack, this, 53, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 53, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
if (blockEntity.isMultiblockValid()) {
|
if (blockEntity.isMultiblockValid()) {
|
||||||
addHologramButton(6, 4, 212, layer).clickHandler(this::onClick);
|
addHologramButton(6, 4, 212, layer).clickHandler(this::onClick);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -71,7 +71,7 @@ public class GuiIndustrialSawmill extends GuiBase<BuiltScreenHandler> {
|
||||||
final Layer layer = Layer.FOREGROUND;
|
final Layer layer = Layer.FOREGROUND;
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 105, 47, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 105, 47, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawTank(matrixStack, this, 53, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 53, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
if (blockEntity.isMultiblockValid()) {
|
if (blockEntity.isMultiblockValid()) {
|
||||||
addHologramButton(6, 4, 212, layer).clickHandler(this::onClick);
|
addHologramButton(6, 4, 212, layer).clickHandler(this::onClick);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -63,7 +63,7 @@ public class GuiPlasmaGenerator extends GuiBase<BuiltScreenHandler> {
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
||||||
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class GuiSemifluidGenerator extends GuiBase<BuiltScreenHandler> {
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
||||||
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ public class GuiTankUnit extends GuiBase<BuiltScreenHandler> {
|
||||||
textRenderer.draw(matrixStack, new TranslatableText("gui.techreborn.tank.amount"), 10, 50, 4210752);
|
textRenderer.draw(matrixStack, new TranslatableText("gui.techreborn.tank.amount"), 10, 50, 4210752);
|
||||||
textRenderer.draw(matrixStack, fluid.getAmount().toString(), 10, 60, 4210752);
|
textRenderer.draw(matrixStack, fluid.getAmount().toString(), 10, 60, 4210752);
|
||||||
|
|
||||||
String percentFilled = String.valueOf((int) ((double) fluid.getAmount().getRawValue() / (double) tankEntity.getTank().getCapacity().getRawValue() * 100));
|
String percentFilled = String.valueOf((int) ((double) fluid.getAmount().getRawValue() / (double) tankEntity.getTank().getFluidValueCapacity().getRawValue() * 100));
|
||||||
|
|
||||||
textRenderer.draw(matrixStack, new TranslatableText("gui.techreborn.unit.used").append(percentFilled + "%"), 10, 70, 4210752);
|
textRenderer.draw(matrixStack, new TranslatableText("gui.techreborn.unit.used").append(percentFilled + "%"), 10, 70, 4210752);
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ public class GuiThermalGenerator extends GuiBase<BuiltScreenHandler> {
|
||||||
|
|
||||||
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(10), 100, 83, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer);
|
||||||
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
builder.drawMultiEnergyBar(matrixStack, this, 130, 28, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer);
|
||||||
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getCapacity(), blockEntity.tank.isEmpty(), layer);
|
builder.drawTank(matrixStack, this, 44, 25, mouseX, mouseY, blockEntity.tank.getFluidInstance(), blockEntity.tank.getFluidValueCapacity(), blockEntity.tank.isEmpty(), layer);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,13 +29,12 @@ import net.minecraft.fluid.Fluid;
|
||||||
import net.minecraft.fluid.Fluids;
|
import net.minecraft.fluid.Fluids;
|
||||||
import net.minecraft.inventory.Inventory;
|
import net.minecraft.inventory.Inventory;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.util.math.Direction;
|
|
||||||
import net.minecraft.util.registry.Registry;
|
import net.minecraft.util.registry.Registry;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import reborncore.common.fluid.FluidValue;
|
import reborncore.common.fluid.FluidValue;
|
||||||
import reborncore.common.fluid.container.FluidInstance;
|
import reborncore.common.fluid.container.FluidInstance;
|
||||||
import reborncore.common.fluid.container.GenericFluidContainer;
|
|
||||||
import reborncore.common.fluid.container.ItemFluidInfo;
|
import reborncore.common.fluid.container.ItemFluidInfo;
|
||||||
|
import reborncore.common.util.Tank;
|
||||||
import reborncore.mixin.common.AccessorFluidBlock;
|
import reborncore.mixin.common.AccessorFluidBlock;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -55,11 +54,11 @@ public class FluidUtils {
|
||||||
return Registry.FLUID.stream().collect(Collectors.toList());
|
return Registry.FLUID.stream().collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean drainContainers(GenericFluidContainer<Direction> tank, Inventory inventory, int inputSlot, int outputSlot) {
|
public static boolean drainContainers(Tank tank, Inventory inventory, int inputSlot, int outputSlot) {
|
||||||
return drainContainers(tank, inventory, inputSlot, outputSlot, false);
|
return drainContainers(tank, inventory, inputSlot, outputSlot, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean drainContainers(GenericFluidContainer<Direction> tank, Inventory inventory, int inputSlot, int outputSlot, boolean voidFluid) {
|
public static boolean drainContainers(Tank tank, Inventory inventory, int inputSlot, int outputSlot, boolean voidFluid) {
|
||||||
ItemStack inputStack = inventory.getStack(inputSlot);
|
ItemStack inputStack = inventory.getStack(inputSlot);
|
||||||
ItemStack outputStack = inventory.getStack(outputSlot);
|
ItemStack outputStack = inventory.getStack(outputSlot);
|
||||||
|
|
||||||
|
@ -71,11 +70,11 @@ public class FluidUtils {
|
||||||
|
|
||||||
if (!outputStack.isEmpty() && !outputStack.isItemEqual(itemFluidInfo.getEmpty())) return false;
|
if (!outputStack.isEmpty() && !outputStack.isItemEqual(itemFluidInfo.getEmpty())) return false;
|
||||||
|
|
||||||
FluidInstance tankFluidInstance = tank.getFluidInstance(null);
|
FluidInstance tankFluidInstance = tank.getFluidInstance();
|
||||||
Fluid tankFluid = tankFluidInstance.getFluid();
|
Fluid tankFluid = tankFluidInstance.getFluid();
|
||||||
|
|
||||||
if (tankFluidInstance.isEmpty() || tankFluid == itemFluidInfo.getFluid(inputStack)) {
|
if (tankFluidInstance.isEmpty() || tankFluid == itemFluidInfo.getFluid(inputStack)) {
|
||||||
FluidValue freeSpace = tank.getCapacity(null).subtract(tankFluidInstance.getAmount());
|
FluidValue freeSpace = tank.getFluidValueCapacity().subtract(tankFluidInstance.getAmount());
|
||||||
|
|
||||||
if (freeSpace.equalOrMoreThan(FluidValue.BUCKET) || voidFluid) {
|
if (freeSpace.equalOrMoreThan(FluidValue.BUCKET) || voidFluid) {
|
||||||
inputStack.decrement(1);
|
inputStack.decrement(1);
|
||||||
|
@ -94,13 +93,13 @@ public class FluidUtils {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean fillContainers(GenericFluidContainer<Direction> source, Inventory inventory, int inputSlot, int outputSlot) {
|
public static boolean fillContainers(Tank source, Inventory inventory, int inputSlot, int outputSlot) {
|
||||||
ItemStack inputStack = inventory.getStack(inputSlot);
|
ItemStack inputStack = inventory.getStack(inputSlot);
|
||||||
ItemStack outputStack = inventory.getStack(outputSlot);
|
ItemStack outputStack = inventory.getStack(outputSlot);
|
||||||
|
|
||||||
if (!FluidUtils.isContainerEmpty(inputStack)) return false;
|
if (!FluidUtils.isContainerEmpty(inputStack)) return false;
|
||||||
ItemFluidInfo itemFluidInfo = (ItemFluidInfo) inputStack.getItem();
|
ItemFluidInfo itemFluidInfo = (ItemFluidInfo) inputStack.getItem();
|
||||||
FluidInstance sourceFluid = source.getFluidInstance(null);
|
FluidInstance sourceFluid = source.getFluidInstance();
|
||||||
|
|
||||||
if (sourceFluid.getFluid() == Fluids.EMPTY || sourceFluid.getAmount().lessThan(FluidValue.BUCKET)) {
|
if (sourceFluid.getFluid() == Fluids.EMPTY || sourceFluid.getAmount().lessThan(FluidValue.BUCKET)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue