XFEstudio/MCIndustry / scripts/blocks/磁驱传输器.js

const batchSize = 10;

// ItemBridge.setStats() 只按 transportTime 计算单件速度;初始化完成后将
// 数据库面板中的速度替换为实际的“每批数量 × 每秒批数”。
Events.on(ContentInitEvent, cons(() => {
    const magneticBridge = Vars.content.getByName(
        ContentType.block,
        modName + "-磁驱传输器"
    );

    if(magneticBridge == null){
        Log.err("找不到磁驱传输器内容:" + modName + "-磁驱传输器");
        return;
    }

    magneticBridge.stats.remove(Stat.itemsMoved);
    magneticBridge.stats.add(
        Stat.itemsMoved,
        batchSize * 60 / magneticBridge.transportTime,
        StatUnit.itemsSecond
    );

    // ItemBridge 原版每次只处理 1 件物品。这里保留它的计时、供电与连接
    // 规则,但把一次传输事件改成最多搬运 10 件物品。
    magneticBridge.buildType = prov(() => extend(
        ItemBridge.ItemBridgeBuild,
        magneticBridge,
        {
            updateTransport(other){
                this.transportCounter += this.edelta();

                while(this.transportCounter >= magneticBridge.transportTime){
                    const item = this.items.first();

                    if(item != null && other.acceptItem(this, item)){
                        // 两端都是同一种 ItemBridge;按对端的总容量截断批量,
                        // 再用一次 handleStack 完成真正的成组传输。
                        const amount = Math.min(
                            batchSize,
                            this.items.get(item),
                            magneticBridge.itemCapacity - other.items.total()
                        );

                        if(amount > 0){
                            this.items.remove(item, amount);
                            other.handleStack(item, amount, this);
                            this.moved = true;
                        }
                    }

                    this.transportCounter -= magneticBridge.transportTime;
                }
            },

            // 无有效链接时,ItemBridge 会向相邻建筑卸货。原版这里同样只有
            // 1 件/tick,因此必须一起扩展,否则整条线路仍会卡在约 60 件/秒。
            doDump(){
                for(let i = 0; i < batchSize; i++){
                    if(!this.dump()) break;
                }
            }
        }
    ));
}));