#
Server Replay
这是一个完全服务端实现的 Replay Mod 和 Flashback,该模组允许你
在服务器上同时录制多个在线玩家,或多个区块区域。这样将会
生成回放文件,随后可使用 replay mod 或 flashback 进行渲染。
相比客户端的 Replay Mod 或 Flashback 录制方式,
服务端录制有很多优点:
来暂停和恢复录制器
不过,也有一些缺点和已知问题:
一些自行实现数据包的复杂模组可能不兼容。
此模组需要 fabric launcher、fabric-api 和 fabric-kotlin。
在服务器上有两种录制方式,你可以将其配置为
跟随并从玩家视角进行录制。
或者,你也可以录制一片静态区块区域。
> 注意:
> 本文档针对该模组的最新版本,较旧
> 版本请查看其他分支
本节文档将简要引导你完成一个基础配置。
同时也包含一些重要信息。
要在你的服务器上录制某个玩家,你可以运行 `/replay start players
`,例如:
/replay start players senseiwells
/replay start players @a
/replay start players @a[gamemode=survival]
玩家录制器会绑定到该玩家,并会按照
服务器视距进行录制。
如果玩家离线或服务器停止,回放会自动停止并保存。
如果你想手动停止录制,也可以运行 `/replay stop players
`,
使用这个命令时你也可以选择停止录制但不保存,例如:
/replay stop players senseiwells
/replay stop players @r
/replay stop players senseiwells false
回放随后会保存到你 "playerrecordingpath" 指定的路径中,
并存放在一个以玩家 uuid 命名的文件夹内。
默认情况下,路径为 ./recordings/players//.mcpr。
然后你可以将该文件放入客户端的 ./replay_recordings 中,并使用 replay mod 打开。
> 警告:
> 尝试录制 carpet bot 或其他非真实玩家可能会导致不可预期的行为。
> 如果你想录制大面积区块区域,请改用区块录制器!
> 注意:
> 虽然该模组会录制你指定的区块,但 Minecraft 客户端不会渲染最外层区块。
> 所以,如果你想录制一片可见区块区域,你必须在边界上额外加一圈区块。例如,要录制从 -5, -5 到 5, 5 的可见区域,你实际上必须录制 -6, -6 到 6, 6。
要在你的服务器上录制一片区块区域,你可以运行 /replay start chunks from to in named ,例如:
/replay start chunks from -5 -5 to 5 5 in minecraft:overworld named MyChunkRecording
/replay start chunks from 54 67 to 109 124
/replay start chunks from 30 30 to 60 60 in minecraft:the_nether
或者你也可以指定一个中心区块及其周围半径来进行录制:/replay start chunks around radius in named ,例如:
/replay start chunks around 0 0 radius 5
/replay start chunks around 67 12 radius 16 in minecraft:overworld named Perimeter Recorder
区块录制器是静态的,无法移动,它会录制指定的区块。
需要特别注意的是,在回放开始时,指定的区块
会被加载(如果有需要还会生成)。
不过在这之后,区块录制器不会主动加载这些区块。
你还可以通过
"chunkrecorderload_radius" 设置进一步配置这一行为,它会设置一个初始加载半径上限,
超出该半径但被录制的区块
需要被“自然”加载后才会被录制。
如果服务器停止,回放会自动停止并保存。
如果你想手动停止录制,也可以通过录制器名称来停止指定
录制器,使用命令 /replay stop chunks named ,例如:
/replay stop chunks named "Perimeter Recorder" false
/replay stop chunks named MyChunkRecording
回放随后会保存到你 "chunkrecordingpath" 指定的路径中,
并存放在一个以区块录制器名称命名的文件夹内。
默认情况下,路径为 ./recordings/chunks//.mcpr。
然后你可以将该文件放入客户端的 ./replay_recordings 中,并使用 replay mod 打开。
ServerReplay 支持 flashback(适用于较新的版本),也支持 replay mod 回放格式。
默认情况下,所有录制都会使用 replay mod 的
格式;不过,你可以在游戏中运行以下命令进行更改:
/replay encoding default set flashback
/replay encoding default set replay_mod
> 注意:
> 你可以同时使用 flashback 和 replay-mod 录制同一个玩家的视角。
> 做法是先将默认编码设置为 flashback,开始一次录制,
> 然后将编码设置为 replay_mod,再开始另一次录制。
>
> 区块录制同样可以这样做,但每个录制器都必须使用唯一名称。
当一个回放录制完成后,你可以完全在服务端进行观看。
观看回放的玩家会在观看期间完全从实际服务器中移除,
并被视为离线状态。
本质上,这只是“运行”了另一个向客户端发送数据包的服务器。它与主服务器
异步运行,因此对性能几乎没有影响。
当一个回放录制完成后,你可以点击聊天栏中的绿色文本来查看
刚刚结束的回放。
查看区块回放的命令是:/replay view chunks ,查看玩家回放的命令是:
/replay view players ,例如:
/replay view player "d4fca8c4-e083-4300-9a73-bf438847861c" "2024-05-11--19-19-55"
/replay view chunks "Chunks (183, 166) to (203, 186)" "2024-05-11--19-19-55"
然后你会被传送到这个新的“服务器”中,回放将开始播放。
在观看回放时,你只能使用一组有限的命令,包括:
/replay view pause 暂停当前回放的播放。/replay view unpause 继续当前回放的播放。/replay view speed 设置当前回放的播放速度。/replay view restart 重新开始播放当前回放。/replay view close 关闭当前回放并将你带回服务器。/replay view progress 隐藏或显示进度 Boss 栏。如果你在观看回放时断开连接,那么你在重新登录后会被带回服务器。
如果配置中启用了 "allowdownloadingreplays",
并且服务器 IP 和下载端口设置正确,你就可以从服务器下载任意回放。
你可以使用 /replay download 命令获取下载指定回放的 URL,例如:
/replay download players d4fca8c4-e083-4300-9a73-bf438847861c "2024-05-11--19-19-55"
/replay download chunks "Chunks (183, 166) to (203, 186)" "2024-05-11--19-19-55"
这会向你发送一条聊天消息;你可以点击提供的链接来下载文件。
关于所有命令的说明:玩家必须拥有 op(等级 4),或者如果你
安装了权限模组(例如 LuckPerms),玩家也可以
通过权限 server-replay.commands.replay 来访问这些命令。
` 手动为给定玩家开始回放录制。
/replay start chunks from to in named 手动开始录制给定的区块区域,如果未指定维度,则会使用命令执行者
当前所在的维度,名称决定了回放文件将在录制路径中的保存位置。
/replay start chunks around radius in named 这与上面的命令作用相同;不过,你可以改为指定某个区块及其周围半径。
` 手动停止给定玩家的回放录制,
你可以选择传入是否保存回放;默认值为 true。
/replay stop chunks from to in 手动停止给定区块区域的回放录制,如果未指定维度,则会使用命令执行者
当前所在的维度,你也可以选择传入是否保存回放;默认值为 true。
/replay stop chunks named 这让你实现与上面命令相同的功能;不过,你可以通过名称指定该区块区域。
/replay stop [chunks|players] all 手动停止所有区块或玩家回放,你也可以选择是否保存回放;默认值为 true。
/replay status 发送一条状态消息,说明回放功能是否启用,并列出所有当前正在录制的玩家和区块、它们已录制的时长以及文件大小。
/replay reload 重新加载 replay mod 的配置文件。/replay encoding default set 设置要录制的回放类型,可选 flashback 或 replay_mod
启动服务器后,会在路径
`./config/server-replay/config.json` 中生成一个新文件,默认内容如下:
{
"default_encoding": "replay_mod",
"world_name": "World",
"server_name": "Server",
"chunk_recording_path": "./recordings/chunks",
"player_recording_path": "./recordings/players",
"player_recording_name": "{uuid}",
"max_file_size": "0 B",
"restart_after_max_file_size": false,
"max_duration": "0s",
"restart_after_max_duration": false,
"recover_unsaved_replays": true,
"delete_replays_after_duration": "0s",
"log_deleted_replays": true,
"chunk_recorder_load_radius": -1,
"chunk_recording_strategy": "always",
"pause_notify_players": true,
"notify_admins_of_status": true,
"include_resource_packs": true,
"ignore_custom_payloads": false,
"ignore_sound_packets": false,
"ignore_light_packets": true,
"ignore_chat_packets": false,
"ignore_action_bar_packets": false,
"ignore_scoreboard_packets": false,
"optimize_explosion_packets": true,
"optimize_entity_packets": false,
"record_hotbar": false,
"record_voice_chat": false,
"replay_server_ip": null,
"allow_downloading_replays": false,
"automatically_record": false,
"player_predicate": {
"type": "none"
},
"chunks": []
}
| 配置项 | 说明 |
|---|---|
"default_encoding" |
用于录制回放的编码格式,可选 "replaymod" 或 "flashback"。默认值(未指定时)为 "replaymod"。
|
| "world_name" |
将显示在回放文件中的世界名称。
|
| "server_name" |
将显示在回放文件中的服务器名称。
|
| "playerrecordingpath" |
你希望保存玩家录制文件的路径。
|
| "chunkrecordingpath" |
你希望保存区块录制文件的路径。
|
| "playerrecordingname" |
这决定了每位玩家录制目录的名称。默认设置为 "{uuid}",即使用玩家的 uuid。你也可以使用 "{username}" 插入玩家名称。例如可以设为:"Recordings for: {username} ({uuid})"。
|
| "maxfilesize" |
这会为回放指定一个 maxfilesize,当达到该限制时录制会自动停止。这个文件大小指的是原始录制大小,而不是 最终压缩后的回放大小;通常最终压缩后的回放文件会小得多。
|
| "restartaftermaxfilesize" |
如果设置了 maxfilesize 且达到该限制,那么回放录制将自动重新开始并创建一个新的回放文件。
|
| "max_duration" |
设置回放的最长持续时间,一旦回放录制达到指定时长就会停止。格式为数字加单位(也可以包含多个单位),例如 "4h 35m 2.1s"。将其设置为 "0s" 可禁用最长时长限制。注意:如果录制器处于暂停状态,其时长不会增加。
|
| "restartaftermax_duration" |
如果设置了 max_duration 且达到该限制,那么回放录制将自动重新开始并创建一个新的回放文件。
|
| "recoverunsavedreplays" |
这会尝试恢复任何未保存的回放,例如当服务器崩溃,或在回放停止/保存完成之前服务器就停止时。虽然这不能保证回放文件一定不会损坏,但它会尽可能抢救可恢复的数据。
|
| "deletereplaysafter_duration" |
删除旧回放文件的时间阈值。这是从文件上次修改起经过的时长。持续时间格式与 max_duration 选项相同,例如 "5d 10h"。将其设置为 "0s" 可禁用。
|
| "logdeletedreplays" |
当回放因过期而被删除时,是否在服务器日志中输出记录。需要启用 deletereplaysafter_duration 此项才会生效。
|
| "fixeddaylightcycle" |
如果你不希望长时间延时摄影中出现持续的昼夜循环,可以在回放中固定昼夜时间。该值应设置为一天中的时间刻(tick),例如 6000(正午)。要禁用固定昼夜循环,请将该值设为 -1。
|
| "chunkrecorderload_radius" |
这会设置默认的区块录制器加载半径,当你想录制非常大的区域且不希望所有录制区块一次性全部加载时,这会很有用。
例如,如果你正在录制一个 13x13 的区块区域,你可以将半径设为 3,那么最中心的 7x7 区域会被初始加载,其余区块则会在它们被“自然”加载时再被录制。
将其设置为 -1 可加载所有区块。
|
| "chunkrecordingstrategy" |
这定义了区块录制器的录制方式,共有 4 个选项:
"always" - 即使区块已卸载也始终录制(仿佛它们仍处于加载状态)"chunk_loaded" - 仅当该区域内任意区块被加载时才录制,如果所有区块都已卸载则暂停录制"chunkcontainsplayer" - 仅当该区域内有玩家时才录制这些区块(仅 flashback)"chunkcontainsnonspectatorplayer" - 与上面类似,但只针对非旁观者玩家(仅 flashback)|
| "pausenotifyplayers" |
如果 chunkrecordingstrategy 设置为了允许录制器自动暂停的选项,并且启用了此项,那么当某个区块区域的录制被暂停或恢复时,所有在线玩家都会收到通知。
|
| "notifyadminsof_status" |
启用后,会在回放开始、回放结束以及回放保存完成时通知管理员,同时也会通知发生的任何错误。
|
| "includeresourcepacks" |
如果启用,所有服务端资源包都会被复制进回放文件中,以确保正确播放。禁用后会减小文件大小,但在观看回放时它会尝试从原始来源下载资源包,无法保证一定能正常工作。(仅 replay mod)
|
| "ignorecustompayloads" |
如果启用,所有自定义负载(模组数据包)都会被忽略。如果其他模组的数据包导致录制出现问题,可以启用此项。
|
| "ignoresoundpackets" |
如果你正在为延时摄影录制大面积区域,那么通常不太可能需要录制声音,因为这些内容会占用大量存储空间。
|
| "ignorelightpackets" |
光照既会在客户端计算,也会在服务端计算,因此光照数据包大多是冗余的。
|
| "ignorechatpackets" |
如果聊天数据包(来自服务器和其他玩家)对你的回放并非必要,启用此项可阻止其被录制。
|
| "ignoreactionbar_packets" |
如果动作栏数据包对你的回放并非必要,启用此项可阻止其被录制。
|
| "ignorescoreboardpackets" |
阻止记分板数据包被录制(例如,如果你有一个显示挖掘次数的记分板,那么它将不会显示,玩家分数也不会被录制)。
|
| "optimizeexplosionpackets" |
通过不向客户端发送爆炸数据包,而只发送爆炸粒子和声音,可以大幅减小文件大小。
|
| "optimizeentitypackets" |
通过让客户端处理某些实体的逻辑(例如投射物和 TNT),可以减小文件大小。不过这可能会带来一些不一致,但通常影响很小。
|
| "record_hotbar" |
这会为玩家录制启用快捷栏记录,从而获得更好的第一人称体验。(仅 flashback)
|
| "recordvoicechat" |
如果你安装了 simple-voice-chat 模组,这将启用语音聊天录制支持。使用 flashback 观看时可开箱即用;但如果你要在 replay-mod 中回看回放,则必须安装 replay-voice-chat。
|
| "replayserverip" |
如果你的服务器使用了自定义服务端资源包,并且你希望能够在服务端回放查看器中查看这些资源包,则必须设置此项。如果你希望允许用户下载回放,这也是必须的。
这里应填写你服务器的公网 IP 地址。
|
| "allowdownloadingreplays" |
决定用户是否能够下载已录制的回放。
|
| "automatically_record" |
是否根据 "player_predicate" 和/或 "chunks" 配置自动录制玩家或区块。启用后,任何满足已定义谓词的玩家都会被自动录制,而配置中定义的任何区块也会在服务器启动时自动开始录制。
|
| "player_predicate" |
用于自动录制玩家的谓词,更多信息请见 [Predicates](#predicates-config) 章节。
|
| "chunks" |
服务器启动时要自动录制的区块列表,更多信息请见 [Chunks](#chunks-config) 章节。
|
你可以定义在服务器启动时,或在
启用 ServerReplay 时自动开始录制的区块区域。
每个区块定义都必须包含:"name"、"dimension"、"fromx"、"tox"、"fromz" 和 "toz"。例如:
{
// ...
"chunks": [
{
"name": "My Chunks",
"dimension": "minecraft:overworld",
"from_x": -5,
"from_z": -5,
"to_x": 5,
"to_z": 5
},
{
"name": "My Nether Chunks",
"dimension": "minecraft:the_nether",
"from_x": 100,
"from_z": 50,
"to_x": 90,
"to_z": 60
}
// ...
]
}
你可以定义一个谓词,用来决定服务器上的哪些玩家
会被自动录制。
你可以通过指定玩家是否拥有特定 uuid、
名称、位于特定队伍,或者是否为管理员来实现。
定义好谓词后,你必须在游戏内运行 /replay reload,然后玩家必须
重新登录,系统才会对符合谓词条件的玩家进行录制。
最基础的选项是录制所有玩家,这种情况下你可以使用:
{
// ...
"player_predicate": {
"type": "all"
}
}
如果你只想录制具有特定名称或 uuid 的玩家,可以这样做:
{
// ...
"player_predicate": {
"type": "has_name",
"names": [
"senseiwells",
"foobar"
]
}
}
{
// ...
"player_predicate": {
"type": "has_uuid",
"uuids": [
"41048400-886d-497d-9d97-9fe7c9b63afa",
"71266dbd-db0a-484a-b859-3f135590d7a9",
"47d072ca-d7a2-467c-9b60-de501907e91d",
"0e324e7f-e78e-4777-b501-7ae08a65b1eb",
"7d9e24c2-9d0f-479f-81c7-27389624ebb2"
]
}
}
如果你只想录制管理员:
{
// ...
"player_predicate": {
"type": "has_op",
"level": 4
}
}
如果你只想录制特定队伍中的玩家,这对于允许玩家在游戏内
被添加或移除特别有用,因为你只需要把玩家加入某个队伍,然后让他们重新登录:
{
// ...
"player_predicate": {
"type": "in_team",
"teams": [
"Red",
"Blue",
"Spectators"
]
}
}
你还可以对谓词取反,使用 not,以及使用 or 和 and 进行组合。
例如,如果你想录制所有非管理员,并且名字不是 senseiwells,也不在 red 队中的玩家:
{
// ...
"player_predicate": {
"type": "and",
"predicates": [
{
"type": "not",
"predicate": {
"type": "has_op",
"level": 4
}
},
{
"type": "not",
"predicate": {
"type": "or",
"predicates": [
{
"type": "has_name",
"names": [
"senseiwells"
]
},
{
"type": "in_team",
"teams": [
"Red"
]
}
]
}
}
]
}
}
如果你使用了 carpet mod 并且可以生成假人玩家,你可能会希望将它们排除在录制之外。
你可以使用 is_fake 谓词来实现:
{
// ...
"player_predicate": {
"type": "not",
"predicate": {
"type": "is_fake"
}
}
}
帮助测试 flashback 支持!
友情链接: 网易我的世界 | 泰拉瑞亚 | ocent云计算 | 米饭Minecraft插件文档 | 友链合作
历史访问人数:172,082 | 历史访问人次:272,268
今日访问人数:9,060 | 今日访问人次:10,161
昨日访问人数:23,567 | 昨日访问人次:27,193
Copyright © 2019-2026 我的世界服务器列表站. All rights reserved.
❤ Powered by GermMC 京ICP备17023959号-6