Skip to content

修复铜工作盆(FluidLogistics)产出流体时丢失品质 - #1

Open
lnsanes wants to merge 1 commit into
SSWTLZZ69:mainfrom
lnsanes:fix/copper-basin-fluid-quality
Open

lnsanes wants to merge 1 commit into
SSWTLZZ69:mainfrom
lnsanes:fix/copper-basin-fluid-quality

Conversation

@lnsanes

@lnsanes lnsanes commented Oct 20, 2026

Copy link
Copy Markdown

现象

动力搅拌器处理铜工作盆(FluidLogistics 的 Copper Basin)时,配方产物为流体会丢失品质;Create 原版工作盆不受影响。整合包侧反馈单 MQSM7F。

根因

BasinBlockEntityMixin 的品质注入挂在 Create 原版 BasinBlockEntity#acceptOutputs 的 HEAD 上。而 FluidLogistics 的 CopperBasinBlockEntity extends BasinBlockEntity 覆写了该方法:

public boolean acceptOutputs(List<ItemStack> outputItems, List<FluidStack> outputFluids, boolean simulate) {
    if (outputFluids.isEmpty()) return super.acceptOutputs(outputItems, outputFluids, simulate);
    this.outputTank.allowInsertion();
    try {
        if (!super.acceptOutputs(outputItems, Collections.emptyList(), true)) return false;   // 流体被剥掉
        if (!acceptFluidsIntoOutputTank(outputFluids, true, targetTank)) return false;
        ...
        if (!super.acceptOutputs(outputItems, Collections.emptyList(), false)) return false;  // 又是空列表
        return acceptFluidsIntoOutputTank(outputFluids, false, targetTank);
    } finally { this.outputTank.forbidInsertion(); }
}

父类的注入因此永远拿到空流体列表,!hasQualityCapableOutput(空) && !hasQualityFluidSource(consumedFluids) 成立时直接 return true 跳过——品质被静默丢弃。

修法

新增 CopperBasinBlockEntityMixin,在子类 acceptOutputs 的 HEAD 主动走一次同样的上下文:

@Mixin(value = CopperBasinBlockEntity.class, remap = false)
public abstract class CopperBasinBlockEntityMixin {
    @Inject(method = "acceptOutputs", at = @At("HEAD"), cancellable = true, remap = false)
    private void qualityFoodFluids$applyCopperBasinFluidQuality(List<ItemStack> outputItems,
                                                                List<FluidStack> outputFluids,
                                                                boolean simulate,
                                                                CallbackInfoReturnable<Boolean> callback) {
        if (!BasinRecipeQualityContext.applyToOutputs((BasinBlockEntity) (Object) this, outputItems, outputFluids, simulate)) {
            callback.setReturnValue(false);
        }
    }
}

此时 outputFluids 仍是 BasinRecipe 传进来的可变原列表,applyToOutputs 会把带品质的 FluidStack 写回该列表。返回值语义与 BasinBlockEntityMixin 保持一致——上下文判定不通过时取消本次接受。

可选依赖处理

FluidLogistics 不是必需依赖,因此 QualityFoodFluidsMixinPlugin 增加判断:

if (mixinClassName.endsWith("CopperBasinBlockEntityMixin")) {
    return isLoaded("fluidlogistics") && isLoaded("create");
}

缺少 FluidLogistics 时该 Mixin 不应用,不会因目标类不存在而报错。

改动清单

文件 改动
mixin/CopperBasinBlockEntityMixin.java 新增
src/main/resources/quality_food_fluids.mixins.json 在 mixins 数组登记
mixin/QualityFoodFluidsMixinPlugin.java 增加 fluidlogistics + create 判断
build.gradle 增加 create-fluidlogistics 的 compileOnly 依赖

验证

  • 该逻辑已在整合包 v0.5.0.15 以字节码补丁的等价形式实测通过:铜工作盆 + 动力搅拌器,用 cosmopolitan 冰淇淋配方(带品质水果 1 + 冰块 1 + 糖 1 + 750mB 牛奶 → 750mB 冰淇淋流体),产出流体带品质。
  • 本地未跑完整 gradlew build:改动不涉及新增外部 API 调用(applyToOutputs 是本项目已有方法),编译行为与既有 BasinBlockEntityMixin 一致;建议在合并前跑一次构建确认。

影响

只作用于铜工作盆产出流体的配方,Create 原版工作盆行为不变;输入流体带品质的配方同样覆盖。

BasinBlockEntityMixin 的品质注入挂在 Create 原版 BasinBlockEntity#acceptOutputs 的 HEAD 上,而 FluidLogistics 的 CopperBasinBlockEntity 覆写了该方法:有流体产物时把流体从 super 调用里剥掉(传 Collections.emptyList()),改由 acceptFluidsIntoOutputTank 自己灌进 outputTank。父类的注入因此永远拿到空流体列表,守卫条件两个都不成立时直接放行,品质被静默跳过。

新增 CopperBasinBlockEntityMixin,在子类 acceptOutputs 的 HEAD 主动调用 BasinRecipeQualityContext.applyToOutputs,让品质写回 outputFluids,铜工作盆随后灌罐即为带品质流体。返回值语义与父类保持一致:上下文判定不通过时取消本次接受。

FluidLogistics 为可选依赖:QualityFoodFluidsMixinPlugin 增加判断,只有 fluidlogistics 与 create 同时加载时才应用该 Mixin;build.gradle 增加对应的 compileOnly 依赖。

影响:只作用于铜工作盆产出流体的配方,Create 原版工作盆行为不变;输入流体带品质的配方同样覆盖。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant