diff --git a/gamesv/src/logic/event/kinds.zig b/gamesv/src/logic/event/kinds.zig index 8f5bbc4..ae3944d 100644 --- a/gamesv/src/logic/event/kinds.zig +++ b/gamesv/src/logic/event/kinds.zig @@ -2,6 +2,8 @@ pub const Login = struct {}; pub const ChangeSceneBegin = struct {}; +pub const CurrentSceneModified = struct {}; + pub const CharBagTeamModified = struct { team_index: usize, modification: enum { diff --git a/gamesv/src/logic/messaging/map_mark.zig b/gamesv/src/logic/messaging/map_mark.zig index db7bbcc..1b28e74 100644 --- a/gamesv/src/logic/messaging/map_mark.zig +++ b/gamesv/src/logic/messaging/map_mark.zig @@ -11,6 +11,7 @@ pub fn onSceneSetTrackPoint( assets: *const Assets, scene: Player.Component(.scene), change_scene_tx: logic.event.Sender(.change_scene_begin), + cur_scene_modified_tx: logic.event.Sender(.current_scene_modified), ) !void { const log = std.log.scoped(.scene_set_track_point); @@ -45,6 +46,7 @@ pub fn onSceneSetTrackPoint( validation_config.position.z, }; + try cur_scene_modified_tx.send(.{}); try change_scene_tx.send(.{}); log.info( diff --git a/gamesv/src/logic/systems/player_saves.zig b/gamesv/src/logic/systems/player_saves.zig index 46a6e1e..e5752f2 100644 --- a/gamesv/src/logic/systems/player_saves.zig +++ b/gamesv/src/logic/systems/player_saves.zig @@ -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; + }, + }; +}