feat(scene): implement saving for scene component

Keep in mind that the movement itself isn't acknowledged by the server yet.
However, teleport transitions are now persistent.
This commit is contained in:
xeon
2026-02-04 15:38:39 +03:00
parent 66dff8ddb1
commit 23f9797a8a
3 changed files with 32 additions and 0 deletions

View File

@@ -2,6 +2,8 @@ pub const Login = struct {};
pub const ChangeSceneBegin = struct {}; pub const ChangeSceneBegin = struct {};
pub const CurrentSceneModified = struct {};
pub const CharBagTeamModified = struct { pub const CharBagTeamModified = struct {
team_index: usize, team_index: usize,
modification: enum { modification: enum {

View File

@@ -11,6 +11,7 @@ pub fn onSceneSetTrackPoint(
assets: *const Assets, assets: *const Assets,
scene: Player.Component(.scene), scene: Player.Component(.scene),
change_scene_tx: logic.event.Sender(.change_scene_begin), change_scene_tx: logic.event.Sender(.change_scene_begin),
cur_scene_modified_tx: logic.event.Sender(.current_scene_modified),
) !void { ) !void {
const log = std.log.scoped(.scene_set_track_point); const log = std.log.scoped(.scene_set_track_point);
@@ -45,6 +46,7 @@ pub fn onSceneSetTrackPoint(
validation_config.position.z, validation_config.position.z,
}; };
try cur_scene_modified_tx.send(.{});
try change_scene_tx.send(.{}); try change_scene_tx.send(.{});
log.info( log.info(

View File

@@ -36,3 +36,31 @@ pub fn saveCharBagTeams(
}, },
}; };
} }
pub fn saveCurrentScene(
_: logic.event.Receiver(.current_scene_modified),
scene: Player.Component(.scene),
player_id: logic.World.PlayerId,
io: Io,
) !void {
const data_dir = fs.persistence.openPlayerDataDir(io, player_id.uid.view()) catch |err| switch (err) {
error.Canceled => |e| return e,
else => |e| {
log.err(
"failed to open data dir for player with uid {s}: {t}",
.{ player_id.uid.view(), e },
);
return;
},
};
defer data_dir.close(io);
fs.persistence.saveSceneComponent(io, data_dir, scene.data) catch |err| switch (err) {
error.Canceled => |e| return e,
else => |e| {
log.err("save failed: {t}", .{e});
return;
},
};
}