创建:交易大厅账本

创建:交易大厅账本

一个用于“Create: Trading Floor”的插件,用于追踪每个玩家完成的交易数量。

交易大厅账本

交易大厅账本是 机械动力:交易大厅 的轻量级附属模组,用于追踪每位玩家通过交易站完成的交易次数,并提供与 FTB 任务及 KubeJS 的集成功能。

功能特性

  • 使用 Mixin 技术检测通过交易站完成的交易。
  • 按玩家记录交易次数,并持久化保存至磁盘。
  • 即使玩家离线也能正常记录。
  • 触发自定义 Forge 事件 (TradingTradeEvent),KubeJS 可监听到此事件。
  • 提供 /tf_trades 命令,用于查看当前交易次数及距离下一个里程碑的进度。

运行机制

交易次数将归属于放置交易站的玩家。每成功完成一次交易,该玩家账户中的交易次数便会增加。

模组会在 Forge 事件总线上触发名为 TradingTradeEvent 的自定义事件。该事件会公开以下信息:

  • 与交易站关联的玩家。
  • 该玩家累计的交易次数。

利用 KubeJS 和 EventJS,您可以监听此事件,从而实现自定义任务、奖励、成就、排行榜或任何其他游戏机制。

命令

/tf_trades

显示您当前的交易次数以及距离下一个里程碑的进度。里程碑并非模组内置功能,需通过您的 KubeJS 脚本自行定义。

依赖要求

  • Forge 1.20.1
  • 机械动力:交易大厅

可选依赖

  • KubeJS + EventJS — 监听 TradingTradeEvent 并实现自定义逻辑。
  • FTB 任务 — 将交易次数整合到任务进度系统中。

鸣谢与许可协议

本附属模组借鉴并改编了原 机械动力:交易大厅 项目(作者:CakeGit)的部分源代码,该项目基于 MIT 许可协议发布。

版权所有 (c) 2024 CakeGit

原始源代码:https://github.com/cakeGit/Create-Trading-Floor

本模组附带了所需的 MIT 版权声明及许可协议文本。

示例:使用 KubeJS 实现 FTB 任务集成
// kubejs/server_scripts/trading_floor_quests.js

// 里程碑:[交易次数,任务任务 ID] const MILESTONES = [ [5, '57F4FE71F78DFA05'], [100, '33FCBCE23CA8214A'], [500, '2372061A10003C77'], ];

NativeEvents.onEvent( Java.loadClass('com.cak.tradingfloor.fix.TradingTradeEvent'), event => { const player = event.player; const total = event.totalTrades;

    for (const [required, taskId] of MILESTONES) {
        if (total === required) {
            player.server.runCommandSilent(
                `ftbquests change_progress ${player.name.string} complete ${taskId}`
            );
            console.info(`[TradingFloorFix] 玩家 ${player.name.string} 已达到里程碑 ${required}`);
        }
    }
}

);

ServerEvents.commandRegistry(event => { const { commands: Commands } = event; event.register( Commands.literal('tf_trades') .executes(ctx => { const player = ctx.source.playerOrException; const TradeEventBridge = Java.loadClass('com.cak.tradingfloor.fix.TradeEventBridge'); const count = TradeEventBridge.getTradeCount(player.server, player.uuid); const next = MILESTONES.find(([req]) => req > count);

            const nextComponent = next
                ? Text.translatable('tradingfloorfix.trades.next', Text.of(`§e${next[0] - count}`))
                : Text.translatable('tradingfloorfix.trades.done');

            player.tell(
                Text.translatable('tradingfloorfix.trades.count',
                    Text.of(`§e${count}`),
                    nextComponent
                ).withStyle('aqua')
            );
            return 1;
        })
);

});