1
- use pumpkin_config:: ADVANCED_CONFIG ;
1
+ use pumpkin_config:: advanced_config ;
2
2
use pumpkin_nbt:: compound:: NbtCompound ;
3
3
use std:: fs:: { File , create_dir_all} ;
4
4
use std:: io;
@@ -38,11 +38,9 @@ impl PlayerDataStorage {
38
38
}
39
39
}
40
40
41
- let config = & ADVANCED_CONFIG . player_data ;
42
-
43
41
Self {
44
42
data_path : path,
45
- save_enabled : config . save_player_data ,
43
+ save_enabled : advanced_config ( ) . player_data . save_player_data ,
46
44
}
47
45
}
48
46
@@ -63,43 +61,37 @@ impl PlayerDataStorage {
63
61
/// # Returns
64
62
///
65
63
/// A Result containing either the player's NBT data or an error.
66
- pub async fn load_player_data ( & self , uuid : & Uuid ) -> Result < NbtCompound , PlayerDataError > {
64
+ pub fn load_player_data ( & self , uuid : & Uuid ) -> Result < ( bool , NbtCompound ) , PlayerDataError > {
67
65
// If player data saving is disabled, return empty data
68
66
if !self . save_enabled {
69
- return Ok ( NbtCompound :: new ( ) ) ;
67
+ return Ok ( ( false , NbtCompound :: new ( ) ) ) ;
70
68
}
71
69
72
70
// If not in cache, load from disk
73
71
let path = self . get_player_data_path ( uuid) ;
74
72
if !path. exists ( ) {
75
73
log:: debug!( "No player data file found for {}" , uuid) ;
76
- return Ok ( NbtCompound :: new ( ) ) ;
74
+ return Ok ( ( false , NbtCompound :: new ( ) ) ) ;
77
75
}
78
76
79
- // Offload file I/O to a separate tokio task
80
- let uuid_copy = * uuid;
81
- let nbt = tokio:: task:: spawn_blocking ( move || -> Result < NbtCompound , PlayerDataError > {
82
- match File :: open ( & path) {
83
- Ok ( file) => {
84
- // Read directly from the file with GZip decompression
85
- pumpkin_nbt:: nbt_compress:: read_gzip_compound_tag ( file)
86
- . map_err ( |e| PlayerDataError :: Nbt ( e. to_string ( ) ) )
87
- }
88
- Err ( e) => Err ( PlayerDataError :: Io ( e) ) ,
77
+ let file = match File :: open ( & path) {
78
+ Ok ( file) => file,
79
+ Err ( e) => {
80
+ log:: error!( "Failed to open player data file for {}: {}" , uuid, e) ;
81
+ return Err ( PlayerDataError :: Io ( e) ) ;
89
82
}
90
- } )
91
- . await
92
- . unwrap_or_else ( |e| {
93
- log:: error!(
94
- "Task error when loading player data for {}: {}" ,
95
- uuid_copy,
96
- e
97
- ) ;
98
- Err ( PlayerDataError :: Nbt ( format ! ( "Task join error: {e}" ) ) )
99
- } ) ?;
83
+ } ;
100
84
101
- log:: debug!( "Loaded player data for {} from disk" , uuid) ;
102
- Ok ( nbt)
85
+ match pumpkin_nbt:: nbt_compress:: read_gzip_compound_tag ( file) {
86
+ Ok ( nbt) => {
87
+ log:: debug!( "Loaded player data for {} from disk" , uuid) ;
88
+ Ok ( ( true , nbt) )
89
+ }
90
+ Err ( e) => {
91
+ log:: error!( "Failed to read player data for {}: {}" , uuid, e) ;
92
+ Err ( PlayerDataError :: Nbt ( e. to_string ( ) ) )
93
+ }
94
+ }
103
95
}
104
96
105
97
/// Saves player data to NBT file and updates cache.
@@ -115,64 +107,36 @@ impl PlayerDataStorage {
115
107
/// # Returns
116
108
///
117
109
/// A Result indicating success or the error that occurred.
118
- pub async fn save_player_data (
119
- & self ,
120
- uuid : & Uuid ,
121
- data : NbtCompound ,
122
- ) -> Result < ( ) , PlayerDataError > {
110
+ pub fn save_player_data ( & self , uuid : & Uuid , data : NbtCompound ) -> Result < ( ) , PlayerDataError > {
123
111
// Skip saving if disabled in config
124
112
if !self . save_enabled {
125
113
return Ok ( ( ) ) ;
126
114
}
127
115
128
116
let path = self . get_player_data_path ( uuid) ;
129
117
130
- // Run disk I/O in a separate tokio task
131
- let uuid_copy = * uuid;
132
- let data_clone = data;
133
-
134
- match tokio:: spawn ( async move {
135
- // Ensure parent directory exists
136
- if let Some ( parent) = path. parent ( ) {
137
- if let Err ( e) = create_dir_all ( parent) {
138
- log:: error!(
139
- "Failed to create player data directory for {}: {}" ,
140
- uuid_copy,
141
- e
142
- ) ;
143
- return Err ( PlayerDataError :: Io ( e) ) ;
144
- }
118
+ // Ensure parent directory exists
119
+ if let Some ( parent) = path. parent ( ) {
120
+ if let Err ( e) = create_dir_all ( parent) {
121
+ log:: error!( "Failed to create player data directory for {}: {}" , uuid, e) ;
122
+ return Err ( PlayerDataError :: Io ( e) ) ;
145
123
}
124
+ }
146
125
147
- // Create the file and write directly with GZip compression
148
- match File :: create ( & path) {
149
- Ok ( file) => {
150
- if let Err ( e) =
151
- pumpkin_nbt:: nbt_compress:: write_gzip_compound_tag ( & data_clone, file)
152
- {
153
- log:: error!(
154
- "Failed to write compressed player data for {}: {}" ,
155
- uuid_copy,
156
- e
157
- ) ;
158
- Err ( PlayerDataError :: Nbt ( e. to_string ( ) ) )
159
- } else {
160
- log:: debug!( "Saved player data for {} to disk" , uuid_copy) ;
161
- Ok ( ( ) )
162
- }
163
- }
164
- Err ( e) => {
165
- log:: error!( "Failed to create player data file for {}: {}" , uuid_copy, e) ;
166
- Err ( PlayerDataError :: Io ( e) )
126
+ // Create the file and write directly with GZip compression
127
+ match File :: create ( & path) {
128
+ Ok ( file) => {
129
+ if let Err ( e) = pumpkin_nbt:: nbt_compress:: write_gzip_compound_tag ( & data, file) {
130
+ log:: error!( "Failed to write compressed player data for {}: {}" , uuid, e) ;
131
+ Err ( PlayerDataError :: Nbt ( e. to_string ( ) ) )
132
+ } else {
133
+ log:: debug!( "Saved player data for {} to disk" , uuid) ;
134
+ Ok ( ( ) )
167
135
}
168
136
}
169
- } )
170
- . await
171
- {
172
- Ok ( result) => result,
173
137
Err ( e) => {
174
- log:: error!( "Task panicked while saving player data for {}: {}" , uuid, e) ;
175
- Err ( PlayerDataError :: Nbt ( format ! ( "Task join error: {e}" ) ) )
138
+ log:: error!( "Failed to create player data file for {}: {}" , uuid, e) ;
139
+ Err ( PlayerDataError :: Io ( e ) )
176
140
}
177
141
}
178
142
}
0 commit comments