Name the fluid extractors after the item ones

This commit is contained in:
ABKQPO committed 2026-09-11 09:40:20 +08:00
1 parent 0edeef4f09
commit 1632ad762a
9 files changed
+53 -53

No files matched your search

@@ -23,9 +23,9 @@ import org.apache.logging.log4j.Logger;
import com.gtnewhorizon.structurelib.block.BlockHint;
import com.gtnewhorizon.structurelib.command.CommandConfigureChannels;
import com.gtnewhorizon.structurelib.command.CommandRegistryDebug;
import com.gtnewhorizon.structurelib.fluid.FluidContainerExtractors;
import com.gtnewhorizon.structurelib.fluid.FluidPlacementRegistry;
import com.gtnewhorizon.structurelib.fluid.FluidSourceProviders;
import com.gtnewhorizon.structurelib.fluid.FluidStackExtractors;
import com.gtnewhorizon.structurelib.item.ItemBlockHint;
import com.gtnewhorizon.structurelib.item.ItemConstructableTrigger;
import com.gtnewhorizon.structurelib.item.ItemFrontRotationTool;
@@ -116,7 +116,7 @@ public class StructureLib {
@Mod.EventHandler
public void preInit(FMLPreInitializationEvent e) {
InventoryUtility.init();
FluidContainerExtractors.init();
FluidStackExtractors.init();
FluidSourceProviders.init();
FluidPlacementRegistry.init();
ConfigurationHandler.INSTANCE.init(e.getSuggestedConfigurationFile());
@@ -17,10 +17,10 @@ import com.gtnewhorizon.structurelib.alignment.IAlignment;
import com.gtnewhorizon.structurelib.alignment.IAlignmentProvider;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.fluid.FluidBlockPlacement;
import com.gtnewhorizon.structurelib.fluid.FluidContainerExtractor;
import com.gtnewhorizon.structurelib.fluid.FluidContainerExtractors;
import com.gtnewhorizon.structurelib.fluid.FluidPlacementRegistry;
import com.gtnewhorizon.structurelib.fluid.FluidSourceProviders;
import com.gtnewhorizon.structurelib.fluid.FluidStackExtractor;
import com.gtnewhorizon.structurelib.fluid.FluidStackExtractors;
import com.gtnewhorizon.structurelib.fluid.IFluidSourceProvider;
import com.gtnewhorizon.structurelib.net.AlignmentMessage;
import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment;
@@ -421,8 +421,8 @@ public class StructureLibAPI {
* @param key unique key. Matches the key shown in the config gui.
* @param extractor the extractor
*/
public static void registerFluidContainerExtractor(String key, FluidContainerExtractor extractor) {
FluidContainerExtractors.register(key, extractor);
public static void registerFluidStackExtractor(String key, FluidStackExtractor extractor) {
FluidStackExtractors.register(key, extractor);
}
/**
@@ -10,10 +10,10 @@ import com.gtnewhorizon.structurelib.SortedRegistry;
/**
* The registry of everything that can hand out fluid on a player's behalf, plus the composition that autoplace uses.
* <p>
* This mirrors {@link FluidContainerExtractors}: it is a {@link SortedRegistry}, so the player can reorder or disable
* every provider in StructureLib's config, and the ordering can be synced to the server. Providers are asked in order,
* and whatever the player is carrying comes last, so a provider that holds a lot of fluid, e.g. an ME network, is
* drained before the player's buckets are emptied.
* This mirrors {@link FluidStackExtractors}: it is a {@link SortedRegistry}, so the player can reorder or disable every
* provider in StructureLib's config, and the ordering can be synced to the server. Providers are asked in order, and
* whatever the player is carrying comes last, so a provider that holds a lot of fluid, e.g. an ME network, is drained
* before the player's buckets are emptied.
*/
public class FluidSourceProviders {
@@ -8,14 +8,14 @@ import net.minecraftforge.fluids.FluidStack;
/**
* Extract fluid from a single item stack, e.g. a bucket or a cell.
* <p>
* Implementations are registered in {@link FluidContainerExtractors}. StructureLib ships implementations for Forge's
* Implementations are registered in {@link FluidStackExtractors}. StructureLib ships implementations for Forge's
* {@code IFluidContainerItem} and for {@code FluidContainerRegistry}, which together cover the vast majority of fluid
* containers. Register your own implementation when your containers expose their fluid by other means, e.g. fluid
* stored inside a backpack or inside a custom NBT layout.
* <p>
* All methods must be side effect free when a simulation is requested, and must never depend on a world.
*/
public interface FluidContainerExtractor {
public interface FluidStackExtractor {
/**
* Whether this extractor can work with given item stack. This must be a cheap, side effect free check.
@@ -26,17 +26,16 @@ import com.gtnewhorizon.structurelib.util.InventoryUtility.ItemStackExtractor;
* the fact that the registry is a {@link SortedRegistry}: entries can be reordered or disabled by the player in
* StructureLib's config, and the ordering can be synced to the server.
*/
public class FluidContainerExtractors {
public class FluidStackExtractors {
private static final SortedRegistry<FluidContainerExtractor> EXTRACTORS = new SortedRegistry<>(
"fluidcontainerextractors");
private static final SortedRegistry<FluidStackExtractor> EXTRACTORS = new SortedRegistry<>("fluidstackextractors");
static {
register("3000-forge-fluid-container-item", new ForgeFluidContainerItemExtractor());
register("5000-forge-fluid-container-registry", new ForgeFluidContainerRegistryExtractor());
}
private FluidContainerExtractors() {}
private FluidStackExtractors() {}
/**
* Dummy method to force the class to initialize, and with it the builtin extractors.
@@ -50,7 +49,7 @@ public class FluidContainerExtractors {
* @param key unique key. Matches the key shown in the config gui.
* @param val the extractor
*/
public static void register(String key, FluidContainerExtractor val) {
public static void register(String key, FluidStackExtractor val) {
EXTRACTORS.register(key, val);
}
@@ -160,7 +159,7 @@ public class FluidContainerExtractors {
*/
private static int takeFromStack(ItemStack stack, IInventory owner, int slot, FluidStack resource, int maxAmount,
boolean simulate, @Nullable EntityPlayerMP player) {
for (FluidContainerExtractor extractor : EXTRACTORS.getPlayerOrdering(player)) {
for (FluidStackExtractor extractor : EXTRACTORS.getPlayerOrdering(player)) {
if (!extractor.isValidSource(stack)) continue;
FluidStack request = new FluidStack(resource, maxAmount);
boolean converts = extractor.convertsContainer(stack, request);
@@ -217,7 +216,7 @@ public class FluidContainerExtractors {
* keep their own fluid inside their NBT, so they are drained in place, and only turn into another item when their
* item declares a container item.
*/
public static class ForgeFluidContainerItemExtractor implements FluidContainerExtractor {
public static class ForgeFluidContainerItemExtractor implements FluidStackExtractor {
@Override
public boolean isValidSource(ItemStack stack) {
@@ -254,7 +253,7 @@ public class FluidContainerExtractors {
* Builtin extractor for containers registered with Forge's {@code FluidContainerRegistry}, e.g. buckets. Such
* containers are consumed as a whole, and are replaced by their container item.
*/
public static class ForgeFluidContainerRegistryExtractor implements FluidContainerExtractor {
public static class ForgeFluidContainerRegistryExtractor implements FluidStackExtractor {
@Override
public boolean isValidSource(ItemStack stack) {
@@ -103,22 +103,22 @@ public interface IFluidSource {
/**
* Construct a fluid source from the fluid containers held by given player.
* <p>
* This will be backed by {@link FluidContainerExtractors}, which covers every fluid container registered with
* Forge, and every container type registered by another mod through
* {@link FluidContainerExtractors#register(String, FluidContainerExtractor)}.
* This will be backed by {@link FluidStackExtractors}, which covers every fluid container registered with Forge,
* and every container type registered by another mod through
* {@link FluidStackExtractors#register(String, FluidStackExtractor)}.
*/
static IFluidSource fromPlayer(EntityPlayerMP player) {
return (resource, simulate) -> FluidContainerExtractors.takeFromPlayer(player, resource, simulate);
return (resource, simulate) -> FluidStackExtractors.takeFromPlayer(player, resource, simulate);
}
/**
* Construct a fluid source from given inventory. Useful for multiblocks that want to drain fluid from a nearby
* machine instead of from the player.
* <p>
* This will be backed by {@link FluidContainerExtractors}.
* This will be backed by {@link FluidStackExtractors}.
*/
static IFluidSource fromInventory(IInventory inv) {
return (resource, simulate) -> FluidContainerExtractors.takeFromInventory(inv, resource, simulate);
return (resource, simulate) -> FluidStackExtractors.takeFromInventory(inv, resource, simulate);
}
/**
@@ -16,6 +16,7 @@ import net.minecraftforge.fluids.IFluidBlock;
import com.gtnewhorizon.gtnhlib.chat.customcomponents.ChatComponentFluid;
import com.gtnewhorizon.gtnhlib.chat.customcomponents.ChatComponentFluidName;
import com.gtnewhorizon.gtnhlib.util.numberformatting.NumberFormatUtil;
import com.gtnewhorizon.structurelib.ConfigurationHandler;
import com.gtnewhorizon.structurelib.StructureLib;
import com.gtnewhorizon.structurelib.StructureLibAPI;
@@ -181,12 +182,14 @@ public class FluidAutoplace {
}
/**
* A human readable description of what a structure element expects at one position, e.g. {@code Water (1000 mB)}.
* Returns a human-readable description of the structure element requirement.
*/
public static String describe(FluidBlockRequirement requirement) {
FluidStack stack = requirement.cost();
return StatCollector
.translateToLocalFormatted("structurelib.fluid.requirement", stack.getLocalizedName(), stack.amount);
return StatCollector.translateToLocalFormatted(
"structurelib.autoplace.requirement_fluid",
stack.getLocalizedName(),
NumberFormatUtil.formatFluid(stack.amount));
}
/**
@@ -53,6 +53,8 @@ structurelib.autoplace.error.no_simple_block=§cSuggested to place §r%s§c but
structurelib.autoplace.error.no_item_stack=§cSuggested to place block by using §r%s§c but none was found
structurelib.autoplace.warning.no_explicit_channel=§6This structure depends on nonexistent sub channel §r%s§6. Using master channel instead.
structurelib.autoplace.missing_block=§cMissing block: %s
structurelib.autoplace.missing_fluid=§cMissing fluid: %s (%s)
structurelib.autoplace.requirement_fluid=%s (%s)
structurelib.blockhint.desc.0=Helps while building
structurelib.blockhint.0.name=Hint 1 dot
@@ -191,6 +193,11 @@ structurelib.config.registries.stackextractors.tooltip=Controls which inventory-
structurelib.config.registries.inventoryproviders=Inventory Providers
structurelib.config.registries.inventoryproviders.tooltip=Controls which inventories functions are enabled during survival autoplace
structurelib.config.registries.fluidstackextractors=Fluid Stack Extractors
structurelib.config.registries.fluidstackextractors.tooltip=Controls which ways of pulling fluid out of an item are enabled during survival autoplace
structurelib.config.registries.fluidsourceproviders=Fluid Source Providers
structurelib.config.registries.fluidsourceproviders.tooltip=Controls which additional ways of getting fluid are used during survival autoplace, e.g. an ME network the player can reach with a wireless terminal. Whatever the player is carrying is always used after these.
structurelib.configgui.enabled=Enabled Entry
structurelib.configgui.disabled=Disabled Entry
structurelib.configgui.drag.tooltip=Drag this button to reorder this element.
@@ -200,19 +207,11 @@ structurelib.sortedregistry.inventoryproviders.5000-main-inventory.tooltip=36 sl
structurelib.sortedregistry.inventoryproviders.7000-ender-inventory=Ender Chest Inventory
structurelib.sortedregistry.inventoryproviders.7000-ender-inventory.tooltip=Links to your vanilla ender chest inventory. Require at least one "ender backpack like" item in main inventory to work.
structurelib.autoplace.missing_fluid=§cMissing fluid: %s (%s)
structurelib.fluid.requirement=%s (%s mB)
structurelib.sortedregistry.fluidstackextractors.3000-forge-fluid-container-item=Forge fluid container item
structurelib.sortedregistry.fluidstackextractors.3000-forge-fluid-container-item.tooltip=Containers implementing Forge's IFluidContainerItem, e.g. most modded cells. They hold their fluid in their own NBT, so they are drained in place.
structurelib.sortedregistry.fluidstackextractors.5000-forge-fluid-container-registry=Forge fluid container registry
structurelib.sortedregistry.fluidstackextractors.5000-forge-fluid-container-registry.tooltip=Containers registered with Forge's FluidContainerRegistry, e.g. buckets. They are consumed as a whole, and are replaced by their empty container.
structurelib.config.common.autoplace.tooltip=Configurations that control how survival autoplace places blocks.
structurelib.config.common.autoplace.fluidAutoplace.tooltip=Whether survival autoplace may place fluid blocks, e.g. the water a multiblock needs inside itself, by draining fluid from the player's fluid containers.\nA multiblock can also provide its own fluid source.\nThis only disables fluid blocks. Multiblocks keep working, they just cannot have those positions filled by autoplace.
structurelib.config.common.autoplace.fluidGateMode.tooltip=How careful autoplace is about placing a fluid into a structure that is not finished yet, as a fluid would flow out of it.\nNONE: place the fluid right away.\nLENIENT: only place the fluid when it cannot flow out of the structure.\nSTRICT: only place the fluid once every non fluid element of the structure is satisfied.
structurelib.sortedregistry.fluidcontainerextractors.3000-forge-fluid-container-item=Forge fluid container item
structurelib.sortedregistry.fluidcontainerextractors.3000-forge-fluid-container-item.tooltip=Containers implementing Forge's IFluidContainerItem, e.g. most modded cells. They hold their fluid in their own NBT, so they are drained in place.
structurelib.sortedregistry.fluidcontainerextractors.5000-forge-fluid-container-registry=Forge fluid container registry
structurelib.sortedregistry.fluidcontainerextractors.5000-forge-fluid-container-registry.tooltip=Containers registered with Forge's FluidContainerRegistry, e.g. buckets. They are consumed as a whole, and are replaced by their empty container.
structurelib.config.registries.fluidcontainerextractors=Fluid container extraction
structurelib.config.registries.fluidcontainerextractors.tooltip=Controls which ways of pulling fluid out of an item are enabled during survival autoplace
structurelib.config.registries.fluidsourceproviders=Fluid sources
structurelib.config.registries.fluidsourceproviders.tooltip=Controls which additional ways of getting fluid are used during survival autoplace, e.g. an ME network the player can reach with a wireless terminal. Whatever the player is carrying is always used after these.
@@ -51,6 +51,8 @@ structurelib.autoplace.error.not_enabled=§c这个多方块结构不支持在生
structurelib.autoplace.error.no_simple_block=§c建议放置 §r%s§c ,但没有找到它
structurelib.autoplace.error.no_item_stack=§c建议使用 §r%s§c 放置方块,但没有找到它
structurelib.autoplace.warning.no_explicit_channel=§6这个结构依赖于不存在的子信道 §r%s§6 。已使用主信道值替代。
structurelib.autoplace.missing_fluid=§c缺少流体:%s(%s)
structurelib.autoplace.requirement_fluid=%s(%s)
structurelib.blockhint.desc.0=帮助你搭建机器
structurelib.blockhint.0.name=提示方块:1号
@@ -189,6 +191,11 @@ structurelib.config.registries.stackextractors.tooltip=该注册表控制在生
structurelib.config.registries.inventoryproviders=物品栏定位
structurelib.config.registries.inventoryproviders.tooltip=该注册表控制在生存模式自动放置时,可用的物品栏来源。
structurelib.config.registries.fluidstackextractors=流体提取器
structurelib.config.registries.fluidstackextractors.tooltip=该注册表控制在生存模式自动放置时,如何从物品(如林业背包)提取流体库存。
structurelib.config.registries.fluidsourceproviders=流体栏定位
structurelib.config.registries.fluidsourceproviders.tooltip=该注册表控制在生存模式自动放置时,可用的流体来源。
structurelib.configgui.enabled=已启用
structurelib.configgui.disabled=已禁用
structurelib.configgui.drag.tooltip=拖动该按钮以重排。
@@ -198,19 +205,11 @@ structurelib.sortedregistry.inventoryproviders.5000-main-inventory.tooltip=不
structurelib.sortedregistry.inventoryproviders.7000-ender-inventory=末影箱
structurelib.sortedregistry.inventoryproviders.7000-ender-inventory.tooltip=当前玩家的末影箱。需要在主物品栏中存在类似于末影背包的东西才会实际生效。
structurelib.autoplace.missing_fluid=§c缺少流体:%s(%s)
structurelib.fluid.requirement=%s(%s mB)
structurelib.sortedregistry.fluidstackextractors.3000-forge-fluid-container-item=Forge 流体容器物品
structurelib.sortedregistry.fluidstackextractors.3000-forge-fluid-container-item.tooltip=实现 Forge 的 IFluidContainerItem 的容器,例如大多数模组流体容器。流体存于其 NBT 中,因此直接在原位抽取。
structurelib.sortedregistry.fluidstackextractors.5000-forge-fluid-container-registry=Forge 流体容器注册表
structurelib.sortedregistry.fluidstackextractors.5000-forge-fluid-container-registry.tooltip=注册到 Forge 的 FluidContainerRegistry 的容器,例如桶。整体消耗,并替换为其空容器。
structurelib.config.common.autoplace.tooltip=控制生存模式自动放置如何放置方块的配置项。
structurelib.config.common.autoplace.fluidAutoplace.tooltip=是否允许生存模式自动放置流体方块(例如多方块结构内部所需的水),从玩家的流体容器中抽取流体来支付。\n多方块结构也可以自行提供流体来源。\n此选项只关闭流体方块。多方块结构依旧可用,只是这些位置无法被自动放置填满。
structurelib.config.common.autoplace.fluidGateMode.tooltip=在结构尚未完成时,自动放置放置流体的小心程度(否则流体会从结构中流出)。\nNONE:立即放置。\nLENIENT:只有当流体无法流出结构时才放置。\nSTRICT:只有当结构中所有非流体元件都满足后才放置流体。
structurelib.sortedregistry.fluidcontainerextractors.3000-forge-fluid-container-item=Forge 流体容器物品
structurelib.sortedregistry.fluidcontainerextractors.3000-forge-fluid-container-item.tooltip=实现 Forge 的 IFluidContainerItem 的容器,例如大多数模组流体容器。流体存于其 NBT 中,因此直接在原位抽取。
structurelib.sortedregistry.fluidcontainerextractors.5000-forge-fluid-container-registry=Forge 流体容器注册表
structurelib.sortedregistry.fluidcontainerextractors.5000-forge-fluid-container-registry.tooltip=注册到 Forge 的 FluidContainerRegistry 的容器,例如桶。整体消耗,并替换为其空容器。
structurelib.config.registries.fluidcontainerextractors=流体容器提取
structurelib.config.registries.fluidcontainerextractors.tooltip=该注册表控制在生存模式自动放置时,可从物品中抽取流体的方式。
structurelib.config.registries.fluidsourceproviders=流体来源
structurelib.config.registries.fluidsourceproviders.tooltip=该注册表控制在生存模式自动放置时,额外从哪些途径获取流体(例如玩家可用无线终端接入的 ME 网络)。玩家随身携带的流体始终在这些之后使用。