更新日志
公开的 BTC Studio 扩展的发布说明。每个版本都会列出扩展名称、版本号以及对服务器所有者而言发生了哪些变化,按时间由新到旧排列,并附有指向该版本发布页和扩展文档的链接。
付费扩展仅链接到其文档;下载仍在商店中提供。私有扩展不在此列出。
2026-10-16
Dungeon v1.2
所有变更都列在 Dungeon 更新日志中。已有的副本在使用新字段之前不会有任何变化。
- 需要 GUI(OmniGUI)0.20: 副本排行榜使用 GUI 0.20 的排行榜来源,旧版 GUI 无法加载。请先更新 GUI。
- 共享战利品: 新增 Dungeon Loot Table 条目,供箱子(
lootTableRef)和怪物(lootTable)使用。箱子在首次打开时抽取一次,怪物在死亡时抽取。 - 更多箱子:
additionalLocations可以用一个 Dungeon Loot Chest 条目放置多个箱子(在生成型副本中会被忽略)。Loot Chest Trigger 新增particleEffect,X、Y、Z 轴可分别设置。 - 波次与缩放: Dungeon Mob Spawn 新增
waves、maxSimultaneous、随玩家人数缩放(perExtraPlayer、maxCount、playerCountSource)、spawnParticle,以及触发器onWaveCleared和onCleared。新事件 On Dungeon Mobs Cleared,可在所有怪物被击败后打开门或让箱子出现。 - 限制: 新增 Dungeon Restrictions 条目(鞘翅、船或矿车、末影珍珠、紫颂果、激流、被禁用的命令、拒绝消息、绕过权限),并带有
gameMode、limitInteractions(允许的交互、受保护的实体)和messageRepeatDelay。激流和紫颂果在点击时就被拒绝。只有绕过权限能豁免玩家:除非该节点设为false,否则 op 默认拥有它。 - 统计: 每名玩家 22 项统计,按 artifact 累计并可跨 artifact 求总和:造成和承受的伤害(只算真正损失的生命值)、击杀、已清理的波次和房间、游玩时间、死亡、纪录等。
statsMobScope选择计入的怪物。让玩家离开运行的死亡不再计为runs_left。新 factdungeon_stat;占位符dungeon_stat_<key>[_raw]、dungeon_total_<key>和dungeon_inst_<id>_<key>;片段content.dungeon_stats.duration_format和content.dungeon_stats.missing_value。 - 排行榜: 新条目
dungeon_leaderboard_source(LIFETIME或CURRENT_RUN、rankBy、values、durationFormat、decimals),接入 GUI 排行榜的source字段。 - 重新连接:
reconnectGrace(默认 2 分钟)。断线的成员保留位置,并从原来的状态继续(侧边栏、隐藏状态、游戏模式)。超时后他离开运行,下次加入时回到入口位置。 - MMOProfiles: 选择档案后,会重新应用返回入口位置和原游戏模式。
- 菜单: Dungeon Category 的槽位字段
unlockedLore和lockedLore现在是unlockLore和lockLore。旧页面仍可读取;两者同时存在时新键优先。 - 面向附加组件的 API 破坏性变更:
DungeonArtifactData、DungeonStats和PlayerDungeonStats移到了包btcrenaud.dungeons.core,DungeonArtifactEntry.getPlayerStats和update的签名也已更改。针对 Dungeon 1.1.x 编译的附加组件必须重新编译。
GUI v0.20
- 归还战利品: simple 布局上的
dropOnClose会在菜单关闭时归还玩家没有取走的物品,或放进去的物品。closeDelivery可选GIVE_OR_DROP(默认:放入物品栏,放不下的掉在脚边)或DROP。默认关闭。 - 随机物品:
rollPerSlot为每个重复的槽位各抽取一个随机物品,而不是所有槽位共用一次抽取;新增的liveItem会在每次刷新时重新抽取。 - 空名称被忽略: 名称为空的物品会保留自己的名称,而不是显示为没有名称。
- 来自其他扩展的排行榜行:
gui_leaderboard新增source字段。行由来源条目提供,涵盖所有玩家(无论在线与否),例如 Dungeon 的来源。行文本可使用{score}、{score_raw}和{value_<key>}。来源提供的文本是纯文本:看起来像 MiniMessage 标签的名字(例如<red>)不再改变排名顺序。
MythicMobs v0.12
- 仅对部分玩家可见的怪物:
spawn_mythicmobs_mob和mythic_spawner新增visibilityCriteria字段。怪物仅对满足 criteria 的玩家可见、可被锁定、可被伤害,criteria 会持续重新评估(visibilityRefreshInterval,默认 1 秒)。visibilityGroup现在会实时跟随,而不是在刷出时固定。 collidable(spawn_mythicmobs_mob、mythic_spawner,默认true):false会为所有人取消碰撞和推挤。- 放弃:
spawn_mythicmobs_mob新增abandonRange和abandonDelay字段。若在延迟时间内没有任何被允许的玩家处于范围内,怪物会被移除(abandonRange为0即关闭)。网页编辑器会把新的 Duration 预填为 1 秒:请检查abandonDelay。 despawn_mythicmobs_mob: 新增scope字段,ALL(默认,与以前一致)或VISIBLE_TO_PLAYER(只移除该玩家看得到的怪物)。- 保护: 与受限怪物相关的所有伤害(近战、投射物、MythicMobs 技能、火焰)都会对未被允许的玩家屏蔽,反之亦然。投射物会穿过,怪物也会放弃未被允许的目标。
- MythicMobs 条件
typewritervisible(别名twvisible):将它在 targeter 中(conditions=[ - twvisible true ])或作为TargetCondition添加到不造成伤害的技能(药水、投掷等)上,这些技能就会跳过看不到怪物的玩家。当你的 MythicMobs 文件使用它时,扩展会在启动时执行一次/mm reload。 - 源条目被删除的怪物会对所有人保持隐藏。
- 限制: 碰撞是全有或全无;不造成伤害的技能在没有
twvisible时不会被过滤;远离怪物处的声音和粒子不会被隐藏。
Shops v1.12
- 已针对 GUI 0.20 重新构建,现在需要 GUI 0.20:旧版本在 GUI 0.20 下无法打开其菜单。其他内容没有变化。
Quest Codex v2.16
- 已针对 GUI 0.20 重新构建,现在需要 GUI 0.20:旧版本在 GUI 0.20 下无法打开其菜单。其他内容没有变化。
Corpse v0.7
- 已针对 GUI 0.20 重新构建,现在需要 GUI 0.20:旧版本在 GUI 0.20 下无法打开其菜单。其他内容没有变化。
Numerical Storage v0.15
- 已针对 GUI 0.20 重新构建,现在需要 GUI 0.20:旧版本在 GUI 0.20 下无法打开其菜单。其他内容没有变化。
2026-10-12
Dungeon v1.1.1
- Paper 26.x,
WORLD_PER_RUN: 一次运行可能会失败,并提示The server did not create world 'dungeon_classic_...'。模板的副本沿用了模板的世界 ID(data/paper/metadata.dat),因此服务器将其当作重复项拒绝。现在副本会获得自己的 ID。
2026-10-08
Dungeon v1.1
围绕运行(run)全面重做:隔离的世界、生成的地下城、每次运行专属的 NPC 以及原版生物。从 0.10 更新之前,请阅读迁移说明;所有变更都列在 Dungeon 更新日志中。
- 运行: 每次运行都有自己的状态和日志。启动运行要么全部成功,要么全部不生效,失败时会退还入场费用。
/tw reload和 Publish 会接管正在进行的运行,而不是结束它们。 - 隔离: 每个地下城有三种模式(
SLIME_CLONE、WORLD_PER_RUN、SHARED_WORLD_SLOTS),或选择AUTO。 - 生成的地下城: 房间模板、连接器、池、生成器和词缀,并提供用于门和标记的游戏内编辑器。
- NPC 与生物: 可由任意实体定义创建每次运行专属的 NPC,仅对该运行的成员显示;原版战斗生物每次运行生成一次,并设有存活数量上限。
- 文本: 每条玩家文本都是可编辑的片段。仅支持 Paper。
- 命令回复:
/tw dungeon命令的每条回复(包括管理命令)都是可编辑的 snippet(content.dungeon_command.)。 - 统计数据: 安装了 MMOProfiles 时按其档案保存,否则按玩家保存。
- Paper 26.x 世界: 按 Paper 26.x 方式存放的世界(
dimensions/minecraft/<名称>)现在可被SHARED_WORLD_SLOTS找到,并可被WORLD_PER_RUN复制。
MythicMobs NPC v5.0
- 地下城中的 NPC: 关闭
ticking时,由 Dungeon 1.0 放置的 NPC 仅对其所在运行的成员显示,点击会向正确的玩家提供一次交互。 - Bone Visibility Data 和 Attachment Data 现在会应用到 NPC 模型,无论
ticking开启还是关闭,并在每次重生后再次应用。 - Play Animation:
force现在会停止该动作在该 NPC 上启动的其他动画;speed小于或等于 0 时以正常速度播放。 - MythicMob Skill Objective:
skillName现在通过 MythicMobs 机制typewriterSkill{name=..}(别名twskill)工作,需将其添加到技能中,然后执行/mm reload。进度存储在fact中,之前的进度会自动迁移。该机制在从网页编辑器发布后依然保留;完全停止并重新启动 Typewriter 后,控制台会要求执行/mm reload。 - 战利品目标: 战利品的物品名称和生物名称现在以其颜色清晰显示(之前是技术性文本),完成标记 ✔ 与其他目标类扩展保持一致。
MMOItems v2.4
- Advanced Tooltip Config: 现在会读取
overrideDefaultLore。当它关闭、系统被禁用或条目缺失时,整个 MMOItems lore 显示在同一页,不分页也不比较。 - Lore 标签: MMOItems lore 格式的标签(
<page_break>,<category_image>,<pagination_indicator>,<comparison_indicator>,<requirement_met>,<requirement_not_met>,<total_pages>,<current_page>,<comparison_value>,<comparison_sign>)现在总会被替换或移除,玩家不会再看到原始文本。 - 创造模式: 分页和高级 lore 仅在生存和冒险模式下生效。在创造模式下,MMOItems 的 lore 保持原样(包括标签),因为创造模式客户端会把物品按其显示的样子发回,改写 lore 会改变真实物品。
- 在网页编辑器中创建该条目时,字段会以可用的值开始(
isEnabled、overrideDefaultLore和enableComparisonTags开启,paginationKeybind为SWAP_OFFHAND,comparisonKeybind为SNEAK,statsStartOnPage为 2,符号和提示为默认值)。
Shops v1.11
perPlayer现在为每位玩家提供各自独立的每件物品库存;重置会为所有人补货。限制保留其自身的作用范围。defaultRefreshTicks和物品的refreshTicks会在显示的库存发生变化时重绘已打开的商店(仅限有限库存;商店上设为0表示不自动检查)。- 物品的
guiSlot会在每一页将物品固定在内容区域的固定槽位;无法放置的物品会被移到空闲格子,或在控制台中报告。 - 关闭
sellAllEnabled后,现在会以cannotSellMessage拒绝全部出售操作。 - 命令回复、趋势图标、Limited/Unlimited Lore、价格行、默认名称、无价格文本和时长格式现在都可编辑;默认冷却中的“天”写作
d(之前为j)。
GUI v0.19
gui_settings的audioDefaults现在作为后备值生效:Open GUI 操作中留空的音效会逐个音效地从中取值。- 只要
showDefaultButtons开启(默认),可滚动布局就会获得默认箭头:每个没有buttons条目的方向各一个,仅在内容可朝该方向滚动时显示,且绝不会出现在已被占用的格子上。现有的可滚动菜单会新增箭头;将showDefaultButtons设为 false 即可保持原样。 - 可滚动布局新增
defaultStep字段,并新增gui_settings的scrollArrows列表(direction、item、name、x、y),用于更改默认箭头。 gui_settings新增texts:Confirm 和 Cancel 按钮以及存储进度行均可编辑。“Confirmer”改为“Confirm”。修复了显示为乱码的面包屑分隔符。
Quest Codex v2.15
typewriter.codex.open权限现在由扩展声明,默认仅限管理员,因此会显示在 LuckPerms 等权限插件中。- 导航标签、排序标签、默认菜单标题和未知分类消息现在都可编辑(
navLabels、sortTexts、mainMenuTitle、trackedQuestsTitle、unknownCategoryMessage)。
Vote System v0.9
- Vote Config 现在会被读取:
cooldownSeconds大于 0 时,玩家在该秒数之后可以再次投票(计数为累计),debug会记录被接受和被拒绝的投票。 - 在冷却功能出现之前保存的投票,其日期记为更新后的首次接触时间,因此它们的冷却从那时开始计算。
/tw vote命令的回复是可编辑的 snippet(content.vote.)。- MiniMessage 颜色: 关闭消息、新的
blockedMessage以及 Vote Message 的两条文本现在会在解析占位符后按 MiniMessage 读取(此前标签会原样显示)。命令的默认回复带有颜色。 - 被拒绝的投票确实被拒绝: Vote Action 的
triggers和modifiers仅在投票被记录时运行;拒绝时不再显示接受消息,也不会重复触发。拒绝时会显示closedMessage(结束日期之后)或新的blockedMessage(冷却结束之前),并触发新的refusedTriggers。debug开启时,每次拒绝都会写入日志。 - 新增占位符
vote_has_voted_<id>和vote_closed_<id>(1或0),以及vote_remaining_<id>(距结束日期的秒数,没有日期则为0)。
Discord v0.13
- Webhook Fact Event 的
triggers现在会在 webhook 发布之后运行,针对其 fact 变更被发布的玩家。 - Webhook Fact Event 新增
triggerCooldownSeconds(默认1):同一玩家两次触发triggers之间的循环防护;设为0则禁用。
Custom Biome v0.9
- Explore Biome Objective 现在可以正常工作:玩家进入生物群系时会读取
biomes和requireAll,新的triggers字段会在目标完成且处于活动状态时运行 entry。该目标自行记录发现,无需 Enter Biome Event。 /tw biome命令的回复和生物群系占位符的unknown文本是可编辑的 snippet(content.custombiome.)。- **Paper 26.3:**自定义生物群系可再次注册;在 26.3 上它们无法加载(实时注入和数据包回退均失败)。
Numerical Storage v0.14
- 菜单和每个子菜单的
optionalButtons现在会被绘制:仅用于显示的物品位于其slots,并会替换布局在同一槽位中放置的内容。 profileMode现在使用 MMOProfiles:每个 MMOProfiles 档案一个余额。没有 MMOProfiles 时是玩家自己的余额。有 MMOProfiles 但没有活动档案时(选择档案期间,或/mmoprofiles quit之后),显示的余额为 0,写入会被拒绝:管理命令和菜单操作会用可编辑的noActiveProfileMessage(位于adminMessages)回复,并且不写入任何内容。档案的利息在选择该档案时结算。- 管理命令的回复可编辑(
adminMessages);占位符文本和时长格式是 snippet(numericalstorage.placeholder.、numericalstorage.duration.)。 - 占位符会在加入时加载存储,因此在缓存尚未预热时显示已保存的余额,而不是空余额。
- 占位符和等级升级按钮现在跟随
profileMode;/tw ns add/remove会用可编辑的消息回复无效的数额或缺少的 artifact。
Puzzle v0.6
isShared现在会共享一个组(谜题fact所属的组)的进度:第一次解开即对整个组生效,fact 只会被触发一次,每位成员各获得一次完成消息、onComplete和链步骤(离开的成员会在返回时获得)。- 玩家最多获得一次谜题完成,即使更换了组,直到与其相关的管理员重置发生。
/typewriter puzzle admin reset <player> <id>会为整个组重新开启一个共享谜题。 - 共享谜题现在需要 Puzzle Artifact: 没有它,重启会再次发放完成奖励,回退到旧版本则会丢失共享记录。
- 玩家文本和命令回复现在可编辑:每个谜题和 Puzzle Menu 的消息是条目字段,
/tw puzzle的回复是 snippet(content.puzzle.)。默认为法语的文本现在是英语;已保存法语文本的页面会保留原文本。 - 已修复,客户端方块: 已绘制的方块不再因点击被取消而消失。每次点击被取消后一个 tick,面板都会重新绘制(Laser Grid 的镜子在右键点击时消失而不是旋转,Block Push 的方块在推动被拒绝时消失,Memory、Pattern、Item Frame 和 Pedestal 的点击也是如此)。
- 已修复,Block Push: 被推回起始格的方块不再弹开并消失,方块被推过目标洞并离开后,该目标洞会重新绘制。被拒绝的推动现在每个方块和目标格只计一次错误,而不是每次点击一次,因此对着墙壁按住点击不会耗尽
maxAttempts。请让世界中的起始格保持为空(空气)。allowPull仍然没有效果(未实现)。 - 已修复,Lever Order: 静置时为开启的拉杆在顺序错误后会回到原来的位置,切换也能看到。失败冷却期间的点击不再触及真实的拉杆。
- 已修复,已解开的谜题: 已解开的 Block Push、Combination Lock、Lever Order 或 Laser Grid 会变为惰性(无面板、无被取消的交互),玩家回到其受众时不再吞掉其拉杆和按钮的点击。已解开的 Pedestal 不再吞掉物品的拾取。
- Laser Grid:光束现在从方块中心穿过,并恰好在每面镜子上转向(以前有偏移)。
beamDensity是每个方块的粒子数,转角顶点始终会绘制。 - Laser Grid,
maxBeamLength:新字段,默认 64 格(0 或更小等于 64,绝不无限)。光束更长的棋盘必须调高该值。光束从不加载区块:它会在已加载世界的边缘停止。 - Combination Lock: 数字从 0 开始编号(列出的第一个位置是数字 0);帮助文本现在用示例说明了这一点。
code中超出数字范围的值现在会在控制台记录警告,而不是悄悄忽略所有按压。
Corpse v0.6
- 世界过滤:
corpse_settings上的allowedWorlds和excludedWorlds决定死亡会在哪些世界留下尸体。允许列表为空表示所有世界。支持*和?通配符(dungeon_*)、世界名称和维度键(minecraft:the_nether),且排除始终优先。在允许的世界之外,死亡保持原版行为。 filteredWorldDeath: 在被过滤器拒绝的世界中,VANILLA_DEATH_SCREEN(默认)保持普通的 Minecraft 死亡(身体和死亡画面由客户端绘制),INSTANT_RESPAWN则让玩家在下一个 tick 重生,没有死亡画面。物品和经验像原版一样掉落。当两个列表都为空时没有效果。- 所有文本均可编辑: 消息、菜单标签和材质、路标格式及其八个方向箭头、
/corpses的回复、尸体的默认名称,以及找回目标的文本。玩家的名称会被转义,永远不会变成可点击的标签。 - 新设置
interactionReach(6 格;服务器此前不检查点击的距离)、interactionCooldownMillis和unknownWorldLabel。定义现在也可以用维度键选择,/corpses list的标题可以编辑。/corpses list和clear作用于整个服务器。 新增可选的outOfReachMessage(默认为空:不发消息)。 - 物品丢失与复制检查: 已复查死亡、拾取和存储;下面的修复堵住了发现的所有丢失或复制途径。
- 已修复,死亡: 被其他插件取消的死亡(图腾、复活)不再取走玩家的装备;
keepInventory和keepLevel会被遵守(开启keepInventory时没有尸体),其他插件为玩家保留的物品不再被复制到尸体中。如果无法创建尸体,物品会正常掉落。 - 已修复,搜刮: 背包已满时取走物品,不再复制已放入的那部分;两次争抢同一具尸体的点击,也不会再把其内容发放两次。
- 已修复,存储: 重启不再带回已被取走的物品;无法读取或只写了一半的存储文件不再清空已存储的尸体。恢复的尸体会保留姿势、发光、名称和动画(不含主人的皮肤和盔甲)。
- 重生消息、路标和目标使用最新的尸体,搜刮菜单会在打开前发出警告,而不是在第一次点击之后。
MythicMobs v0.11
mythic_spawner.group现在会被读取:只有该组的成员才会激活刷怪器,criteria针对该组进行检查,每个组都有自己的预热和冷却;当没有成员在线时,该组的状态会被丢弃。- 任务追踪器中 MythicMob Kill Objective 的那一行可通过 snippet
advancedQuest.display和advancedQuest.completed编辑。
Enchantment Creator v0.11
- Agricultural Harvest 现在会读取方块破坏事件,并收获被破坏方块周围的成熟作物(
radius上限为 8),而不是玩家注视的方块。 - Agricultural Harvest:新增字段
particle、particleCount、sound、soundVolume和soundPitch。 - 玩家在
/enchantcreator give中输入的内容(附魔名称)会在回复中按原样显示,不会被解析为格式。
TextDisplayDialogue v2.4
- 可编辑的文本: 15 个片段现在都会被读取。Spoken、Option、Player option 对话以及过场动画字幕的布局、说话者名称、文本行、提示、选项行和选项前缀都可在
plugins/Typewriter/snippets中编辑;默认值与之前的显示一致。 - 计时器占位符:
%typewriter_textdisplaydialogue_timer%现已在 PlaceholderAPI 中注册,可在对话之外使用(没有计时器运行时为0)。 - 新增两条可编辑的消息:
textdisplay.inventory.blocked(对话期间物品栏被锁定)和textdisplay.error.init(显示无法启动);片段为空时不显示该消息。初始化错误的原因现在只写入服务器日志,不再向玩家显示任何异常详情。Player option 对话现在也读取textdisplay.speaker.format和textdisplay.option.*片段(默认显示相同)。 - 移除
audioProfile:textdisplay_spoken的这个字段从未被读取。 - 仅支持 Paper: 不支持 Folia。
已从文档中移除
- BTC Nameplates: 已并入 UiCore(相同的 entry,
/nameplates);旧页面会重定向到 UiCore。 - MMO Profile: 已废弃,从未发布;其页面已移除。
2026-10-02
MythicMobs NPC v4.9.1
针对 Paper 26.x 上的交互、动画和过场动画的修复。
- 点击: 右键点击在 Paper 26.x 上重新可用,
LEFT_CLICK和ALL现在同样会触发。一次点击只会触发一次对话,不会触发两次,并且/tw reload不再因NoClassDefFoundError而破坏点击。 - Play Animation: 速度留空的动作过去会冻结在第一帧;现在以正常速度播放。它也适用于关闭了
ticking的 NPC,会叠加在待机、行走和 MythicMobs 技能动画之上播放,并且在模型尚未加载时会等待模型。 - 在另一个世界中的过场动画: 实体过场动画的 NPC 会留在玩家之前所在的世界,因此要启动几次后才会显示。现在首次启动就会显示,并带有其动画。
- 过场动画中的移动: 行走更流畅,不再在待机与行走之间来回切换,近距离也不再出现 ModelEngine 闪烁。
- 清理: 过场动画结束后,不可见的 NPC 载体不再在世界中堆积。
CraftEngine v1.1
- 任务区域受众:
dispose()始终会清空其状态并重置释放标志,因此/tw reload不再泄漏持有先前扩展类加载器的监听器。
2026-09-19
GUI v0.18
- 槽位重叠警告现在会指明
gap,并提醒它是步长而不是间距:gap: 1表示相邻的槽位,而不是每个槽位之间空一格。重复的槽位与放置在其两个副本之间的装饰物发生冲突,是该警告最常见的原因。 - 按照 Quest Codex 0.3.0 之前的公式(当时应用的步长为
gap + 1)编写的菜单正是在这里受到影响(参见 Quest Codex v2.14)。
Quest Codex v2.14
- 记录了 Quest Codex 0.3.0 中从未公布的一项破坏性变更。 在此之前,codex 标记使用自己的重复公式,其中
gap是间距(步长为gap + 1)。自 0.3.0 起,它们使用 GUI 引擎的公式,其中gap是步长:从 x=2 开始的count: 3, direction: right, gap: 1现在得到 x=2, 3, 4,而不是 2, 4, 6。 - 因此,在 0.3.0 之前编写的菜单会让其标记相隔一个槽位,并可能与它们之间的装饰物发生冲突。若要恢复原来的间距,请将步长加倍:
gap: 1改为gap: 2。 步长语义保持不变。 - 带索引的标记现在会将
gap与count和repeatY一起重置,因此菜单验证不会再对它们报告孤立的重复项。 - 基于 GUI v0.18 构建。
2026-09-14
GUI v0.17
gap为0时不再把每个重复的副本都堆叠在原点单元格上。网页编辑器会将未改动的gap序列化为0:带有count: 7和direction: right的QUEST_SLOT会在同一个位置产生七个标记,并出现一条你从未写过的 “Slot overlap” 警告。现在gap会像count和repeatY一样被强制为至少1。- 修复位于共享的槽位重复代码中,因此 Quest Codex 和 Shops 无需重新构建即可获得它。
Shops v1.10
- 以物易物:用物品支付的价格。 新的
priceMode: ITEMS以一件或多件物品而不是货币来出售商品。物品上的itemPrice列出费用(物品及每购买一个单位所需的数量);商店上的defaultItemPrice涵盖每一个未声明价格的ITEMS商品。商品自己的列表会替换商店的列表,而不会叠加。 - 任何地方都没有价格的
ITEMS商品会被拒绝并记录日志,绝不会白送。在移除任何东西之前,会先针对整个物品栏模拟付款,并首先检查是否有空间容纳所购物品,因为以物易物没有退款。 - 新增
cannotAffordItemsMessage(令牌{missing}、{amount})和{item_price}lore 令牌,每个所需物品一行。在此类商品上,{buy}和{sell}行会被丢弃,buy_price/sell_price占位符读取为一个破折号。 - “购买最大数量” 适用于以物易物的商品。
ITEMS商品无法折换成货币卖回:其卖出价为零。 - 基于 GUI v0.17 重新构建。
2026-09-09
Puzzle v0.5
- 已修复:扩展重载后出现
PuzzleRenderers的NoClassDefFoundError。 该扩展在引擎插件上注册了两个 Bukkit 监听器却从未移除,因此旧实例会针对已关闭的类加载器继续触发。现在在扩展关闭时会注销这两个监听器,这也避免了每次重载都多堆积一份副本。 - 在扩展关闭时已经安排好的视觉刷新,不再会触发在失效的类加载器上加载类。
2026-09-08
Shops v1.9
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
- 基于 GUI v0.16 构建。
Discord v0.12
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Companion v0.10
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Corpse v0.5
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Custom Biome v0.8
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
InputTracker v0.5
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Numerical Storage v0.13
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Puzzle v0.4
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Vanilla v1.4
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 目标进度文本(采集、计数和事实检查目标)现在会结合玩家进行解析,因此其中的占位符会针对该玩家解析。
Vote System v0.8
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
Enchantment Creator v0.10
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 机制动作现在通过 Typewriter 自己的同步分发器来调度,而不是通过扩展私有的调度器辅助类。
MMO Inventory v0.7
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
MythicMobs v0.10
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
GUI v0.16
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 修复了排行榜行描述的是查看者的问题:排名玩家对应的行现在会针对该玩家而不是打开菜单的人来解析其物品、名称和 lore 的
Var,因此每一行不再显示查看者的值。世界、分组和离线的行会回退为查看者。
Quest Codex v2.13
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
- 基于 GUI v0.16 构建。
Tracking v0.11
- 基于 Typewriter 引擎
0.9.0-beta-177重新构建。 - 无行为变更。
2026-09-06
Shops v1.8
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
- 基于 GUI v0.15 构建。
Discord v0.11
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Companion v0.9
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Corpse v0.4
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 尸体名牌现在使用引擎的
CustomNameProperty。 - 基于 GUI v0.15 构建。
Custom Biome v0.7
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
InputTracker v0.4
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Numerical Storage v0.12
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Puzzle v0.3
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Vanilla v1.3
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 实体活动(视觉探测、跟随、环绕、躲避、听觉、嗅觉、巡逻等)已移植到 0.9 引擎的活动生命周期。条目名称保持不变。
Vote System v0.7
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 破坏性变更:
vote_action字段已重命名。option被optionIndex取代,这是一个从 0 开始的普通数字。请在每个现有的vote_action上重新选择该选项。 - 破坏性变更:
vote_message字段已拆分。message被notVotedMessage和alreadyVotedMessage取代;将第二个留空,则不会向已经投过票的玩家发送消息。 vote_data现在默认将artifactId设为vote_storage:请设置一个固定的名称,以便在重载后保留选票。- 新的
vote_config(带有debug和cooldownSeconds)、vote_fact和vote_cast_event条目会出现在编辑器中。
Dialog Menu v0.7
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Enchantment Creator v0.9
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
MMO Inventory v0.6
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
MythicMobs v0.9
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
GUI v0.15
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
Quest Codex v2.12
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
- 基于 GUI v0.15 构建。
Protection v1.3
- 已弃用:这是 Protection 的最终版本。 对于新的部署,Typewriter 的原生区域系统是其替代品。
- 该扩展会为现有服务器保留,并且不会再获得新功能。
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。
Tracking v0.10
- 基于 Typewriter 引擎
0.9.0-beta-176重新构建。 - 无行为变更。
2026-08-29
GUI v0.14
- 事实排行榜。 新的
gui_leaderboard定义会根据一个或多个事实的值对玩家、世界或 Typewriter 分组进行排名,并由任意open_gui池中新的leaderboard布局渲染。行接受{rank}、{name}、{score}、{group}、{world}和{score_<fact_id>}。 - 新的
gui_leaderboard_population构件会保存离线玩家最后已知的值,因此排行榜的排名不再局限于当前在线的玩家。 - 存储槽位上新的
dropOnClose会在关闭、按 Esc 和断线时,把剩余内容丢在玩家脚下。 - 修复了
temporary存储槽位从不被清空的问题,以及对匹配的光标物品进行 Shift + 右键点击时是取出而不是存入的问题。 - 空白的
viewPermission/clickPermission不再被当作权限:网页编辑器保存的未设置的门槛,过去会对所有非管理员隐藏该槽位或标签页。 - 启动验证现在识别
leaderboard布局,并会报告位于物品栏之外的排名区域。
Quest Codex v2.11
- 基于 GUI v0.14 重新构建。
Shops v1.7
- 基于 GUI v0.14 重新构建。
Corpse v0.3
- 基于 GUI v0.14 重新构建。
Numerical Storage v0.11
- 基于 GUI v0.14 重新构建。
2026-08-24
Shops v1.6
- 新的管理员命令树
/tw shop admin:商店列表、定义检查、玩家会话控制、运行时重置、直接的物品库存管理以及交易历史。 - 新的
typewriter.shop.admin权限(仅限 OP)。typewriter.shop.open默认仍然对玩家开放。 - 手动重置与自动重置的行为一致,并会重新计算下一次计划的重置。
- 修复了公共命令权限的注册,使非管理员可以打开商店。
2026-08-16
Discord v0.10
- 事实 Webhook。 新的
webhook_fact_event会把事实的变化发布到任意webhook_definition目标,适用于玩家、Typewriter 分组和全局范围,并带有可选的受众、数值条件、消息和嵌入模板、论坛主题以及身份组提及。分组和全局范围会对观察同一事实的玩家的回调进行去重。 - Discord 链接完全可选:没有
discord_link_manifest时,扩展不再初始化 Discord 桥接,也不再解析 JDA 类。 - 被禁用或不完整的 JDA 现在由客户端报告,而不是在服务器线程上抛出
NoClassDefFoundError。 - 公开版本现在捆绑了 JDA 6.5.0 及其运行时依赖。
2026-08-21
GUI v0.13
- 实时槽位物品。
itemProvider会在渲染时重建槽位的物品、名称和 lore。布局的槽位只会被解析一次,并且每次渲染时都返回同一份列表,因此 lore 中的占位符或倒计时只被解析一次就被冻结了——autoRefreshTicks会一直重绘一个完全相同的物品栏。 - 同一时间只能有一个窗口处于打开过程中。
GuiFactory.open()会在一个 tick 之后才完成,因此在此之前顶部物品栏仍然是之前的视图,每次渲染都决定重新打开。第二次打开会关闭第一个窗口,该关闭被当作真正的关闭,于是会话被销毁而其菜单仍留在屏幕上——此后每个按钮都失效了。 - 持续时间为
0的动画不再被视为动画。面板会在每个槽位上标注一个默认的动画块,因此装饰物品被绘制在索引 0 处,而它们所安排的重新渲染与待处理的打开发生了竞争。 - 带标签的按钮会保留作者自己的交互。 填写
buttonType过去会丢弃整个交互列表,因此没有任何解析器认领的标记——前缀错误、大小写错误,或拥有它的扩展不在该界面上——会变成一个点击时毫无反应的物品,控制台里也没有任何提示。
Quest Codex v2.10
- 无法绘制的菜单会在启动时报告,此时控制台仍在被阅读,而不是在点击时静默失败。每条消息都会说明修复方法,而不是症状。
- 对在
open_gui底盘之前编写的页面进行一次性转换。 布局池已从category_menu移到被引用的open_gui条目中,因此按旧模式编写的页面保留着引擎不再读取的布局:在面板中配置完整,却什么也不渲染。 - 成就标题会经过真正的 MiniMessage 到 JSON 的转换,因此写在任务标题中的格式会保留到它所生成的成就中。
- 需要 OmniGUI v0.13。
Puzzle v0.2
- 每个谜题上新增
activationRadius,默认为16格。谜题只会为站在其自身位置所在世界、且距其中某个位置在该半径之内的玩家渲染和运行。0只会禁用距离检查——世界检查始终适用。 - 已修复:谜题会在每个维度中被绘制。 客户端侧的方块和粒子带有坐标但没有世界,因此在主世界配置的激光网格,会被绘制在位于下界、末地或其访问的任何其他世界中的玩家面前。
- 已修复:玩家一加入其受众,谜题就会开始,无论距离多远。记忆序列可能会向数千格之外或另一个世界中的人播放其整个图案。现在序列会在玩家到达棋盘时才开始。
- 走开会清除客户端上的棋盘并取消待处理的动画。尝试次数额度、失败冷却、
timeLimit和lifespan会在玩家到达时而不是在加入受众时启动。
Custom Biome v0.6
- 破坏性变更:
biome_audience已被移除。 它通过读取世界自身的生物群系来回答“该玩家是否在该生物群系中”,而客户端侧的覆盖层从不会改变它——因此对于此扩展绘制的每个生物群系,无论玩家在屏幕上看到什么,它都回答为假。没有任何配置能让它起作用。 - 两个条目取代了它:
biome_overlay_audience(该玩家是否带有该覆盖层)和biome_region_audience(该玩家是否在该区域内,包括世界)。使用biome_audience的页面必须重新指向其中之一。 - 区域受众不仅匹配坐标,还会匹配世界,因此在某个世界中定义的区域不再匹配另一个世界中的相同坐标。
ignoreY会把区域变成一个无限高的柱体。 /tw biome region <entry>会根据你当前的 WorldEdit 选区填写条目的两个角,而不是手动输入坐标。- 按玩家的覆盖层会按区块和所有者进行追踪:多个覆盖层可以覆盖同一个区块,其中一个生效,并且清除它会恢复该区块的真实生物群系,而不是上一次绘制的调色板。
Shops v1.5
- 基于 OmniGUI v0.13 重新构建。
GuiSlot新增了一个渲染时的itemProvider参数,这改变了其调用方所链接的构造函数,因此在更新后的 GUI 引擎上,一打开商店 v1.4 的 JAR 就会抛出NoSuchMethodError——物品栏始终不会出现。 - 无行为变更。这两个版本需要配套使用:v1.4 无法在 OmniGUI v0.13 上运行,v1.5 也无法在 v0.12 上运行。
Numerical Storage v0.10
- 基于 OmniGUI v0.13 重新构建,原因同样是
GuiSlot签名的变化:v0.9 的 JAR 在打开存储菜单时会抛出NoSuchMethodError,菜单始终不会出现。 - 无行为变更,也不需要第二次迁移:schema v2 的存储会按 v0.9 写入时的原样读回。
Corpse v0.2
- 基于 OmniGUI v0.13 重新构建,原因同样是
GuiSlot签名的变化:v0.1 的 JAR 在搜刮尸体时会抛出NoSuchMethodError,因此搜刮菜单始终打不开,尸体就那样躺着,其物品栏无法触及。 - 无行为变更。已存储的尸体、其物品栏及其保护规则会像以前一样读回。
2026-08-12
GUI v0.12
- 扩展菜单。
open_gui上的extendToPlayerInventory会把玩家自己的 36 个槽位变成四行额外的菜单行,形成 10 行的画布。该投影仅在客户端侧:真实的物品栏从不会被写入,并且在菜单关闭时恢复。 - 根布局的 id 以
_extended结尾时,会自行启用该投影,因此共享底盘可以同时提供普通和扩展两种变体,而无需每个菜单都重复该标志。 DynamicMarkers会在解析之前,将重复的内容标记转换为带索引的标记(QUEST_SLOT#0、QUEST_SLOT#1……),这样各个扩展就不必再各自保留一份这些语义的私有副本。- 槽位重复现在有边界并会被报告:位于网格之外的位置会被丢弃,并被记录,附带布局 id 和被拒绝的坐标。当设置了
count/gap/repeatY而没有direction时,编辑器会发出警告,对于未知的方向则会报错。 - 记录了
gap是步长(1 = 相邻),以及repeatY沿着与direction垂直的轴重复。 - 修复了
mainLayoutId的继承:子级上的空白值过去会压过继承而来的值,因此继承了整个底盘的页面会解析出一个不存在的布局并渲染为空——没有任何按钮可以接收点击。 - 槽位遮蔽现在只有单一的所有者:当两个槽位争夺同一个单元格时,携带行为的那个获胜,在渲染和点击时都是如此,并且冲突只会被记录一次。
- 启动验证现在只报告真正失败的内容。 那些标记可选内容缺失的检查已被移除——
frame.view.unresolved、slot.outOfFrame、layout.unreferenced——因为在模板架构中,它们描述的是设计而不是缺陷。保留下来的检查会指出某个已写明的意图失败了:视图指向了不存在的布局、槽位超出了物品栏、同一布局中两个相同性质的槽位发生冲突。
Shops v1.4
- 标签页模式。
baseMenuId会让商店成为共享菜单的一个标签页:其布局池和视图会合并到底盘之下,并带有views、defaultViewId和一个内容矩形(contentX、contentY、contentColumns、contentRows)。留空时,商店的打开方式与之前完全相同。 - 扩展底盘支持:在扩展外壳内打开的商店现在会获得 10 行的画布。
- 新增
defaultNameFormat和defaultLoreFormat。未声明名称或 lore 的物品会继承商店的格式;声明了自己名称或 lore 的物品则保持不变——商店格式只填补空白,绝不会覆盖作者的措辞。 - 两者接受相同的令牌:
{item}、{buy}、{sell}、{stock}、{stock_max}、{currency}。请求不可用价格的 lore 行会被丢弃,而不是渲染为空。 - 新增
ShopTransactionEvent,在购买或出售完成后触发一次。它是其他扩展接入的切入点——例如 Discord 转发、审计日志——而 Shops 并不知道它们的存在。仅作通知,绝不可取消。 - 新增
notificationWebhookId。Shops 不解析它,也不知道 webhook 是什么;该 id 随事件一起传递。抛出异常的监听器会被报告,而交易依然有效——没有任何东西会撤销一次已付款的购买。 - 修复了清空了标记的布局被从池中丢弃的问题:完全由标记构成的商店界面,或仍为空的标签页,会悄无声息地消失。
Quest Codex v2.9
- 扩展底盘的提升现在通过继承而不是字面的布局 id 来实现。根名称不是
shell_root的底盘过去会丢失其扩展外观,并且锚定在底部区域的每个控件在渲染时都会消失——因而无法点击。 - 该扩展现在基于发布批次的 GUI 引擎构建,而不是某个固定的较旧 jar。它此前被冻结在引擎的 v0.11 上,因此该版本之后的每一项新增内容都对它不可见。
Discord v0.9
- 该扩展现在叫 Discord,而不是 Community。 目录、包和扩展名称随之更改。条目名称保持不变,因为页面会对其进行序列化。
DiscordClientService已从链接功能中移出,成为独立的包:聊天同步、控制台和 bug 报告都使用它,因此它从来就不应属于账号链接。- Webhook 现在是条目。
webhook_definition一次性声明一个 Discord 目标,并在所有地方引用它。聊天同步、账号链接和 bug 报告过去各自携带 URL、用户名和头像的副本——更换频道意味着要编辑每个清单,而且无法保证它们指向同一个地方。 WebhookService是一个任何扩展都可以注入的单例。HTTP 客户端过去是在初始化器中手工构建并交给每个服务的,因此外部的任何东西都无法发送消息。- Bug 报告失去了它的第二个开关:空的目标就是禁用状态。
- 迁移。 在此版本之前编写的页面会在首次启动时被转换:每个不同的目标对应一个
webhook_definition——配置完全相同的清单共用一个条目——并且清单会被重新指向它。每个被重写的页面都会先备份到backup/community-webhook-v1/下。转换是由结构而不是由版本号驱动的,因此运行两次不会有任何变化。被关闭的清单会在一个禁用的目标上保留其 URL,而不是丢失它。 - 商店公告。
shop_notification_manifest描述商店交易到达 Discord 后的呈现方式。目标被有意地排除在外——它属于商店。因此一种呈现方式可服务于每个商店,而每个商店仍然发布到各自的频道。需要 Shops 扩展,但并不依赖它。
Puzzle v0.1
- 首次发布。
- 九种谜题类型,每种都是带有自己受众、进度和触发器的 Typewriter 目标:推方块、基座献祭、记忆序列、拉杆顺序、图案摆放、物品展示框旋转、密码锁、激光网格和合作压力板。
- 谜题绘制的一切都是客户端侧的——方块、幽灵预览、高亮和激光束都会发送给正在解谜的玩家。两位玩家可以在同一块棋盘上解谜而看不到彼此的进度,并且世界永远不会被修改。
- 每个谜题共享的生命周期:
timeLimit、maxAttempts、cooldownOnFail、resetOnWrong、lifespan、提示,以及onStart/onComplete/onFail/onTimeout/onLifespanExpire触发器。 isShared会把谜题从私有进度切换为整个小组共同推进的一块棋盘。puzzle_chain会按顺序运行多个谜题,并在序列解开后触发;resetOnFail决定犯错是否会让玩家回到起点。puzzle_artifact会持久化谜题状态,因此在尝试中途重启不会抹去进度。puzzle_solved_fact和puzzle_active_fact向你的其余内容公开进度;puzzle_menu在聊天中列出谜题及其状态。- 兼容 Folia:每一次世界读写都在拥有该谜题的区域上运行。
Corpse v0.1
- 首次发布。
- 尸体会像引擎自己的实体展示一样,按每位观看者渲染一次,因此附近的每个人都能看到它们,并且在 BetterModel、BTC Mob NPC 和 MythicMobs NPC 后端上,模型动画和名牌会持续更新。
- 可在 Folia 上运行:所有调度都通过兼容 Folia 的调度器进行,并且物品掉落、经验球和粒子都在拥有该尸体的区域上运行。
- 尸体所持有的物品栏在重启、崩溃或重载后依然保留。尸体在可用时存储在 MySQL 中,否则存储在插件文件夹中,并在启动时恢复。
onlyOwnerCanLoot会被强制执行,并且搜刮是按尸体自己的实体 id 匹配的,而不是四格范围内的任意右键点击。- 每次死亡会按世界和优先级选取尸体定义,其存续时间会在该尸体上一次性解析。
on_corpse_spawn、on_corpse_loot和on_corpse_expire事件会经过引擎的触发器管线,并将尸体的所有者、战利品和位置作为上下文发布。displayName、showDisplayName、dropOnInteract、renderArmor、playDeathAnimation和deathAnimationName都会被遵循,并且大多数设置是动态值,因此可以由占位符和事实驱动。- 带有可配置颜色的客户端渲染发光轮廓,并且尸体音效按附近玩家发送,而不是全世界广播。
has_corpse和corpse_count事实、corpse_owner_audience受众、显示到玩家自己尸体的距离和方向的corpse_waypoint、corpse_recovery_objective,以及带有list和clear子命令的corpse_admin_command。- 一个战利品保护窗口,窗口结束后,尸体会向所有人开放。
- 搜刮菜单是一个 GUI Extension 菜单,而不是带有自己点击监听器的裸物品栏,因此它继承了引擎的点击路由、菜单历史和扩展物品栏投影。因此需要 GUI Extension。
Custom Biome v0.5
- 自定义生物群系即刻生效。 定义在保存后会立即注册到实时注册表中,而不是仅在服务器重启之后。生成的数据包现在是持久化层,而不再是唯一的途径。
- 修复了生成的数据包被服务器忽略的问题:其 pack format 被硬编码为一个旧值,并且被写入了服务器从不读取的文件夹。
- 修复了
baseBiome除平原之外没有任何效果的问题。生物群系现在基于服务器持有的基础生物群系构建,并使用其自身的编解码器编码,因此怪物生成、特征和雕刻器是被继承而不是丢失。 - 修复了生物群系变更在世界中戳出空洞的问题:刷新时发送了区块卸载数据包,而服务器从未跟随重新发送。现在客户端会收到根据真实区块数据构建的生物群系更新。
- 修复了
leave_biome_event从不触发的问题。进入和离开的监听器会相互覆盖对方的状态,因此结果取决于注册顺序。 - 修复了绘制时会写入一列中的每一个方块,而不是每 4x4x4 单元格写一个,并且是从调用线程中进行的问题。现在写入会被安排在拥有每个区块的区域上。
- 服务器会拒绝序列化的生物群系现在会在注册时被拒绝,并指明有问题的值。此前它会被接受,然后导致每位玩家的登录失败。
- 按玩家的生物群系覆盖层(
player_biome_overlay_action):向一位玩家显示不同的生物群系,而不触碰世界,也不影响其他任何人。 - 区域绘制(
paint_biome_region_action)带有快照,并有restore_biome_action用于恢复区域。 biome_transition_cinematic:在过场动画过程中改变玩家所见的生物群系。custom_biome_preset:在生物群系之间共享颜色和视觉属性,并可按定义覆盖。explore_biome_objective和biome_discovery_fact:通过访问生物群系完成的任务。- 每个读取条目都新增了
source选项,用于在玩家所见内容与世界实际包含的内容之间做出选择。 - 移除了
/tw biome setcolor(它会创建从未被持久化的一次性生物群系)以及HASH事实模式(其值在重启后并不稳定)。 - 扩展 jar 从 2.6 MB 缩小到 230 KB:它不再包含服务器已经提供的库。
Enchantment Creator v0.8
- 机制上的
levelMode会将runOnLevel比较为精确等级、最低等级(AT_LEAST)或最高等级(AT_MOST)。此前只能进行精确匹配。 eventPhase会在当前的 Bukkit 事件期间运行机制的动作,因此取消事件或更改伤害会真正生效。对于排队的 Typewriter 交互,请将其设为 false。clientSideEffects变得能够感知客户端,并带有一个client_particle_effect动作:自定义的 BTC 构件在可用时使用基于 PacketEvents 的渲染器,公开的 Paper 构件则使用按玩家范围的 Bukkit 后备方案。- 注册表键现在派生自
id。在加载现有页面和物品时,之前的name会作为旧版别名保留,因此无需重新编写任何内容。 - 公开构件有意不带有 BTC-CORE 或 BTC Velocity 依赖:它运行于 Paper 1.21.x 和 Java 21,由 JDK 25 构建,目标为 Java 21 字节码。
Numerical Storage v0.9
- 交易配置上的
transactionMode:INTERNAL保持 PlaceholderAPI 加控制台命令的路径,VAULT则直接通过 Vault Economy API,并忽略amountPlaceholder和各个命令字段。 addCommand和removeCommand的文档此前写反了。addCommand完成向存储中的存入,并在持久化变更之前检查;removeCommand完成取出。- 持久化现在是异步的,带有按构件的变更锁和短期缓存,因此并发的存入不会再相互竞争。
- 存储文件迁移到技术性构件路径下的 JSON schema 版本 2。基于旧的语义化
artifactId的旧版文件会备份到backups/numericalstorage/下,并在首次访问时迁移——升级之前请备份 Typewriter 的assets/目录。 artifactId是一个生成的技术标识符:将其留空,Typewriter 会自动填写。- 占位符接受显式的定义参数(
%typewriter_ns_balance_bank%),这消除了当定义 ID 本身包含下划线时,旧的按下划线拆分所带来的歧义。 - 安装 Profiles 集成时,可使用可选的感知档案的键。
2026-08-07
Quest Codex v2.8
- 真正的 Minecraft 成就。 新的
advancement_definition条目会把真实的成就写入扩展自有的数据包中,因此它们会带着自己的标签页、树、边框和提示出现在原版成就界面中。parent引用另一个定义,因此树会在节点编辑器中绘制。 grant_advancement会授予成就或收回成就,并沿着父级链向上处理,因此子成就绝不会在未获得的父成就之下被获得。autoGrant会让成就在玩家的第一个 tick 就被获得。对于根成就,这使得其标签页在任何东西被获得之前就已经存在。- 修复了任务顺序:嵌套的任务会从它自己的子分类读取顺序,没有显式顺序的任务不再挤在一起,并且添加任务不再抹去它原有的顺序。
- 任务标记支持分页,排序模式是按玩家的,并且多任务追踪在重新连接后依然保持玩家所选的顺序。
GUI v0.11
- 物品提示,在 GUI 配置条目上带有
hideVanillaItemStats开关。 - 分页布局可以通过新的
INDICATOR角色携带页码指示器。 - 菜单会在服务器启动时验证:槽位越界、缺失模板或未知的按钮类型,会在玩家打开菜单之前就在控制台中指出。
<shift:N>无需 CraftEngine 即可解析,通过捆绑的 Magic Digit 字体实现。count和repeatY被记录为槽位重复次数,而不是堆叠数量。
Shops v1.3
- 商店不再能让玩家的余额降到零以下。过去有三条独立的路径允许这种情况。
- 无法读取的余额不再被读作零,并且会解析
12.5k这样的格式化余额。
2026-08-03
Quest Codex v2.7
- 新增路径点显示模式:
WORLD_DIRECTIONAL会沿着目的地的真实方向,把标记投影到玩家眼睛周围的一个球面上,TARGET_ANCHORED会把它们放在目标上,ADAPTIVE则在两者之间平滑过渡。HUD_LOCKED仍是默认值,因此现有页面不受影响。 - 新增恒定的视觉大小和角度去重叠,使得当多个目的地处于同一条视线上时,标记仍然清晰可读。
- 新增对单个路径点条目的多目标渲染,带有新的
ALL和ONE_PER_QUEST被追踪目标选择方式,以及maxTargets上限。 - 修复了路径点忽略多任务追踪的问题:次要被追踪任务的目标从未被解析,因此只有主要任务会产生标记。
- 新增
quest_codex_locator_bar,在 Minecraft 1.21.6+ 上将相同的已解析目标渲染为原版定位栏的圆点,而无需生成任何实体。
2026-08-02
Quest Codex v2.6
- 新增对被中断的 Typewriter 对话和过场动画的持久化恢复,包括最新的过场动画帧。当 Typewriter 在玩家断线后发出拆除事件时,恢复现在会保留已捕获的快照。
- 新增持久化的多任务追踪,带有被追踪任务菜单、专用占位符,以及一个公开的双任务路径点测试用例。
- 新增仅文本的客户端路径点,带有可配置的图标文本、居中的方块展示、居中的信标旋转、水平目标对齐、平滑插值、靠近目标时的放置,以及可配置的水平可见锥角。
- 在首次公开部署之前,移除了旧版的物品展示和方向箭头路径点图层。
GUI v0.10
- 新增 Flex 和 Composite 布局引擎,用于响应式的槽位放置和合成的菜单图层。
- 新增可重复使用的、可寻址的视图,带有继承的布局池、默认视图、面包屑导航、视图标签,以及可选的历史集成。
- 新增感知视图的 schema 迁移和 QuestCodex 集成,以及 Maven 发布元数据。
- 修复了视图切换时重建菜单出现关闭/重新打开闪烁的问题,并使物品栏关闭兼容 Folia。
Shops v1.2
- 针对 OmniGUI v0.10 重新构建并验证了公开的 Shop Extension。
- 保留了现有的动态商店布局、导航历史、填充物处理、库存和限购规则,以及自定义商店按钮处理器。
- 从 Shop Extension v1.1 升级无需迁移。
MythicMobsNPC Extension v0.4.6
- 修复了在不带任何动画的模型上,缩放更改被忽略的问题,与 BetterModel 扩展的情况相同。
- 原版怪物变种(猫、狐狸、狼、村民等)现在会在控制台中报告一次,而不是被静默忽略:这些属于 MythicMobs 的配置,由它掌管怪物的身份,并会在每次重生时将其覆盖。
- 修复了单个失败的数据条目会取消同一批次中发送的所有其他条目的问题,这可能导致 NPC 没有应用任何已配置的数据。
- 发光效果和装备现在作用于模型上,而不仅仅是怪物上。怪物的身体被隐藏在模型之后,因此只在怪物上设置它们时不会有任何可见效果。
- 当模型没有物品骨骼时,装备现在会在控制台中报告,而不是静默地什么也不做。
- 火焰现在每秒重新施加一次,因此不会再自行熄灭,并且当 BetterModel 隐藏了绘制火焰的身体时,它现在会给出说明。
- 修复了当 NPC 行走或沿着道路网络跟随时名牌出现卡顿的问题:文本展示现在会在更新之间进行插值,而不是分步传送。
BetterModel Extension v1.3
- 修复了在不带任何动画的模型上,模型缩放被忽略的问题。BetterModel 只会在动画运行时才重新计算模型的变换,因此运行时应用的缩放更改从未到达静态模型。扩展现在会自行强制重新计算。
- 同样的修复也适用于模型偏移,它经过相同的代码路径。
- 实体数据条目现在真正作用到模型上,而不是被丢弃。支持:发光效果、药水效果颜色(渲染为物品着色)、亮度、公告牌约束、插值时长、平移、3D 缩放、方框大小、装备和着火。
- 新增
bettermodel_bone_appearance,它是发光、着色、附魔光效和亮度设置的按骨骼版本,使用与bettermodel_bone_visibility相同的条件系统。 - 装备会映射到 BetterModel 的手部和头部物品骨骼。盔甲槽位会在控制台中被报告一次,而不是被静默忽略,因为模型的躯干和腿部带有它自己的几何体。
- 不均匀的 3D 缩放现在会发出警告,而不是静默地只使用单个轴:BetterModel 只支持均匀缩放。
- 任何对 3D 模型没有意义的数据条目(姿势、怪物变种、繁殖状态……)现在会在控制台中报告一次,而不是被悄悄丢弃。
- 发光、着色、亮度、公告牌、平移和装备现在在资源包重载或重生后依然保留,而不是恢复为模型的默认外观。
- 当模型没有带有
ri、li或ph标签的骨骼时,装备现在会在控制台中报告,而不是静默地什么也不做——这通常是物品不显示的原因。 - 火焰现在绘制在 NPC 的交互实体上,而不是模型骨骼上:客户端会根据实体的碰撞箱缩放火焰,而展示实体没有碰撞箱,因此火焰曾被渲染为零大小。
Nexo Extension v1.0
- 新增事实,用于检查玩家手持、物品栏中携带、注视或站立的物品。
- 新增变量,给出所注视的物品、方块和家具的 ID 及属性。
- 新增给予和移除物品的动作,两者都基于 Nexo 物品 ID 工作。
- 新增物品拾取、丢弃和消耗事件。
- 新增自定义方块和家具的交互与伤害事件,以及一个战利品掉落事件。
- 事件现在会把它们的数据(方块 ID、位置、手持物品)传递给接下来运行的内容,因此对话或动作可以直接使用它们。
CraftEngine Extension v1.0
- 任务目标现在可以工作了。它们可以附加到任务上,会保存进度,并且可以在完成时触发一个序列。
- 新增关于冷却、手持和携带的物品,以及玩家所注视的方块或家具的事实。
- 新增变量,给出 ID、物品属性和已加载内容的列表。
- 新增给予和移除物品的动作,两者都基于 CraftEngine 物品 ID 工作。
- 新增物品拾取、丢弃和消耗事件。
- 新增放置尝试和击打家具的事件。
- 事件现在会把它们的数据传递给接下来运行的内容。
ItemsAdder Extension v1.0
- 方块和家具事件现在直接读取 ItemsAdder,而不是从原版事件中猜测,这使它们更加可靠,并消除了可能导致遗漏或重复触发的短暂延迟。
- 新增关于手持和携带的物品、剩余使用次数、自定义耐久、HUD 可见性和作物生长的事实。
- 新增变量,给出 ID、物品属性和字体图片。
- 新增给予和移除物品的动作,两者都基于 ItemsAdder 物品 ID 工作。
- 新增物品拾取、丢弃和消耗事件。
- 新增交互事件、家具的放置前事件,以及自定义实体死亡事件。
- 事件现在会把它们的数据传递给接下来运行的内容。
2026-07-26
Quest Codex v2.5
- 新增通过
quest_codex_tracking_artifact条目实现的持久化多任务追踪。 - 新增
@tracked分类菜单模式和TRACKED_QUEST_SLOT动态标记。 - 新增
/tw codex tracked和内部的codex:trackedGUI 命令。 - 新增 PlaceholderAPI 占位符,涵盖被追踪任务的数量、上限、主要任务、带索引的被追踪任务、状态、目标和优先级。
- 记录了公开页面包的布局:主清单、静态追踪构件、任务定义和 GUI 设置。
GUI v0.9
- 新增对内联存储和旧版分页字段的公开页面 schema 自动迁移。
- 记录了紧凑的
storagePool/storageId和navigationButtonsschema,用于减少 Typewriter 编辑器发布时的卡顿。 - 阐明了面向大型 QuestCodex 菜单的、推荐的被引用菜单模式。