ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/server/login.C
(Generate patch)

Comparing deliantra/server/server/login.C (file contents):
Revision 1.4 by root, Mon Aug 28 07:07:42 2006 UTC vs.
Revision 1.11 by root, Sun Sep 3 22:45:57 2006 UTC

1/* 1/*
2 * static char *rcsid_login_c = 2 * static char *rcsid_login_c =
3 * "$Id: login.C,v 1.4 2006/08/28 07:07:42 root Exp $"; 3 * "$Id: login.C,v 1.11 2006/09/03 22:45:57 root Exp $";
4 */ 4 */
5 5
6/* 6/*
7 CrossFire, A Multiplayer game for X-windows 7 CrossFire, A Multiplayer game for X-windows
8 8
59/* If we are not exiting the game (ie, this is sort of a backup save), then 59/* If we are not exiting the game (ie, this is sort of a backup save), then
60 * don't change the location back to the village. Note that there are other 60 * don't change the location back to the village. Note that there are other
61 * options to have backup saves be done at the starting village 61 * options to have backup saves be done at the starting village
62 */ 62 */
63 if (!flag) { 63 if (!flag) {
64 strcpy(pl->maplevel, first_map_path); 64 strcpy(pl->maplevel, first_map_path);
65 if(pl->ob->map!=NULL) 65 if(pl->ob->map!=NULL)
66 pl->ob->map = NULL; 66 pl->ob->map = NULL;
67 pl->ob->x = -1; 67 pl->ob->x = -1;
68 pl->ob->y = -1; 68 pl->ob->y = -1;
69 } 69 }
70 if(!save_player(pl->ob,flag)) { 70 if(!save_player(pl->ob,flag)) {
71 LOG(llevError, "(failed) "); 71 LOG(llevError, "(failed) ");
72 new_draw_info(NDI_UNIQUE, 0,pl->ob,"Emergency save failed, checking score..."); 72 new_draw_info(NDI_UNIQUE, 0,pl->ob,"Emergency save failed, checking score...");
73 } 73 }
93void delete_character(const char *name, int newchar) { 93void delete_character(const char *name, int newchar) {
94 char buf[MAX_BUF]; 94 char buf[MAX_BUF];
95 95
96 sprintf(buf,"%s/%s/%s.pl",settings.localdir,settings.playerdir,name); 96 sprintf(buf,"%s/%s/%s.pl",settings.localdir,settings.playerdir,name);
97 if(unlink(buf)== -1) 97 if(unlink(buf)== -1)
98 LOG(llevDebug, "Cannot delete character file %s: %s\n", buf, strerror_local(errno)); 98 LOG(llevDebug, "Cannot delete character file %s: %s\n", buf, strerror(errno));
99 if (newchar) { 99 if (newchar) {
100 sprintf(buf,"%s/%s/%s",settings.localdir,settings.playerdir,name); 100 sprintf(buf,"%s/%s/%s",settings.localdir,settings.playerdir,name);
101 /* this effectively does an rm -rf on the directory */ 101 /* this effectively does an rm -rf on the directory */
102 remove_directory(buf); 102 remove_directory(buf);
103 } 103 }
104} 104}
105 105
106/* This verify that a character of name exits, and that it matches 106/* This verify that a character of name exits, and that it matches
107 * password. It return 0 if there is match, 1 if no such player, 107 * password. It return 0 if there is match, 1 if no such player,
113 char buf[MAX_BUF]; 113 char buf[MAX_BUF];
114 int comp; 114 int comp;
115 FILE *fp; 115 FILE *fp;
116 116
117 if (strpbrk(name, "/.\\") != NULL) { 117 if (strpbrk(name, "/.\\") != NULL) {
118 LOG(llevError, "Username contains illegal characters: %s\n", name); 118 LOG(llevError, "Username contains illegal characters: %s\n", name);
119 return 1; 119 return 1;
120 } 120 }
121 121
122 snprintf(buf, sizeof(buf), "%s/%s/%s/%s.pl", settings.localdir, settings.playerdir, name, name); 122 snprintf(buf, sizeof(buf), "%s/%s/%s/%s.pl", settings.localdir, settings.playerdir, name, name);
123 if (strlen(buf) >= sizeof(buf)-1) { 123 if (strlen(buf) >= sizeof(buf)-1) {
124 LOG(llevError, "Username too long: %s\n", name); 124 LOG(llevError, "Username too long: %s\n", name);
125 return 1; 125 return 1;
126 } 126 }
127 127
128 if ((fp=open_and_uncompress(buf,0,&comp))==NULL) return 1; 128 if ((fp=open_and_uncompress(buf,0,&comp))==NULL) return 1;
129 129
130 /* Read in the file until we find the password line. Our logic could 130 /* Read in the file until we find the password line. Our logic could
131 * be a bit better on cleaning up the password from the file, but since 131 * be a bit better on cleaning up the password from the file, but since
132 * it is written by the program, I think it is fair to assume that the 132 * it is written by the program, I think it is fair to assume that the
133 * syntax should be pretty standard. 133 * syntax should be pretty standard.
134 */ 134 */
135 while (fgets(buf, MAX_BUF-1, fp) != NULL) { 135 while (fgets(buf, MAX_BUF-1, fp) != NULL) {
136 if (!strncmp(buf,"password ",9)) { 136 if (!strncmp(buf,"password ",9)) {
137 buf[strlen(buf)-1]=0; /* remove newline */ 137 buf[strlen(buf)-1]=0; /* remove newline */
138 if (check_password(password, buf+9)) { 138 if (check_password(password, buf+9)) {
139 close_and_delete(fp, comp); 139 close_and_delete(fp, comp);
140 return 0; 140 return 0;
141 } 141 }
142 else { 142 else {
143 close_and_delete(fp, comp); 143 close_and_delete(fp, comp);
144 return 2; 144 return 2;
145 } 145 }
146 } 146 }
147 } 147 }
148 LOG(llevDebug,"Could not find a password line in player %s\n", name); 148 LOG(llevDebug,"Could not find a password line in player %s\n", name);
149 close_and_delete(fp, comp); 149 close_and_delete(fp, comp);
150 return 1; 150 return 1;
151} 151}
162 162
163int check_name(player *me,const char *name) { 163int check_name(player *me,const char *name) {
164 player *pl; 164 player *pl;
165 165
166 for(pl=first_player;pl!=NULL;pl=pl->next) 166 for(pl=first_player;pl!=NULL;pl=pl->next)
167 if(pl!=me&&pl->ob->name!=NULL&&!strcmp(pl->ob->name,name)) { 167 if(pl!=me&&pl->ob->name!=NULL&&!strcmp(pl->ob->name,name)) {
168 new_draw_info(NDI_UNIQUE, 0,me->ob,"That name is already in use."); 168 new_draw_info(NDI_UNIQUE, 0,me->ob,"That name is already in use.");
169 return 0; 169 return 0;
170 } 170 }
171 171
172 if (*name=='\0') { 172 if (*name=='\0') {
173 new_draw_info(NDI_UNIQUE, 0,me->ob,"Null names are not allowed."); 173 new_draw_info(NDI_UNIQUE, 0,me->ob,"Null names are not allowed.");
174 return 0; 174 return 0;
175 } 175 }
176 176
177 if(!playername_ok(name)) { 177 if(!playername_ok(name)) {
178 new_draw_info(NDI_UNIQUE, 0,me->ob,"That name contains illegal characters."); 178 new_draw_info(NDI_UNIQUE, 0,me->ob,"That name contains illegal characters.");
179 return 0; 179 return 0;
180 } 180 }
181 if (strlen(name) >= MAX_NAME) { 181 if (strlen(name) >= MAX_NAME) {
182 new_draw_info(NDI_UNIQUE, 0,me->ob,"That name is too long."); 182 new_draw_info(NDI_UNIQUE, 0,me->ob,"That name is too long.");
183 return 0; 183 return 0;
184 } 184 }
185 185
186 return 1; 186 return 1;
187} 187}
188 188
195 return 0; 195 return 0;
196 } else { 196 } else {
197 stat(savedir, buf); 197 stat(savedir, buf);
198 if (!S_ISDIR(buf->st_mode)) 198 if (!S_ISDIR(buf->st_mode))
199 if (mkdir(savedir, SAVE_DIR_MODE)) 199 if (mkdir(savedir, SAVE_DIR_MODE))
200 { 200 {
201 LOG(llevError, "Unable to create player savedir %s: %s\n", savedir, strerror_local(errno)); 201 LOG(llevError, "Unable to create player savedir %s: %s\n", savedir, strerror(errno));
202 return 0; 202 return 0;
203 } 203 }
204 free(buf); 204 free(buf);
205 } 205 }
206 return 1; 206 return 1;
207} 207}
208 208
209void destroy_object (object *op) 209void destroy_object (object *op)
210{ 210{
211 object *tmp; 211 object *tmp;
212 while ((tmp = op->inv)) 212 while ((tmp = op->inv))
213 destroy_object (tmp); 213 destroy_object (tmp);
214 214
215 if (!QUERY_FLAG(op, FLAG_REMOVED)) 215 if (!QUERY_FLAG(op, FLAG_REMOVED))
216 remove_ob(op); 216 remove_ob(op);
217 free_object(op); 217 free_object(op);
218} 218}
219 219
220/* 220/*
221 * If flag is set, it's only backup, ie dont remove objects from inventory 221 * If flag is set, it's only backup, ie dont remove objects from inventory
223 * will be saved at the emergency save location. 223 * will be saved at the emergency save location.
224 * Returns non zero if successful. 224 * Returns non zero if successful.
225 */ 225 */
226 226
227int save_player(object *op, int flag) { 227int save_player(object *op, int flag) {
228 FILE *fp;
229 char filename[MAX_BUF], *tmpfilename,backupfile[MAX_BUF];
230 object *tmp, *container=NULL; 228 object *tmp, *container=NULL;
231 player *pl = op->contr; 229 player *pl = op->contr;
232 int i,wiz=QUERY_FLAG(op,FLAG_WIZ); 230 int i,wiz=QUERY_FLAG(op,FLAG_WIZ);
233 long checksum; 231 long checksum;
234#ifdef BACKUP_SAVE_AT_HOME 232#ifdef BACKUP_SAVE_AT_HOME
252 250
253 /* Prevent accidental saves if connection is reset after player has 251 /* Prevent accidental saves if connection is reset after player has
254 * mostly exited. 252 * mostly exited.
255 */ 253 */
256 if (pl->state != ST_PLAYING && pl->state != ST_GET_PARTY_PASSWORD) 254 if (pl->state != ST_PLAYING && pl->state != ST_GET_PARTY_PASSWORD)
257 return 0; 255 return 0;
256
257 INVOKE_PLAYER (SAVE, op->contr);
258 258
259 if (flag == 0) 259 if (flag == 0)
260 terminate_all_pets(op); 260 terminate_all_pets(op);
261 261
262 /* Delete old style file */ 262 object_freezer freezer;
263 sprintf(filename,"%s/%s/%s.pl",settings.localdir,settings.playerdir,op->name);
264 unlink(filename);
265 263
266 sprintf(filename,"%s/%s/%s/%s.pl",settings.localdir,settings.playerdir,op->name,op->name);
267 make_path_to_file(filename);
268
269 tmpfilename = tempnam_local(settings.tmpdir,NULL);
270 fp=fopen(tmpfilename, "w");
271 if(!fp) {
272 new_draw_info(NDI_UNIQUE, 0,op, "Can't open file for save.");
273 LOG(llevDebug,"Can't open file for save (%s).\n",tmpfilename);
274 free(tmpfilename);
275 return 0;
276 }
277
278/* Eneq(@csd.uu.se): If we have an open container hide it. */ 264 /* Eneq(@csd.uu.se): If we have an open container hide it. */
279 if (op->container) { 265 if (op->container)
266 {
280 container=op->container; 267 container = op->container;
281 op->container=NULL; 268 op->container = NULL;
282 } 269 }
283 270
284 INVOKE_PLAYER (SAVE, op->contr, ARG_STRING (filename));
285
286 object_freezer freezer (filename);
287
288 fprintf(fp,"password %s\n",pl->password); 271 fprintf(freezer,"password %s\n",pl->password);
272
289 if (settings.set_title == TRUE) 273 if (settings.set_title == TRUE)
290 if(pl->own_title[0]!='\0') 274 if(pl->own_title[0]!='\0')
291 fprintf(fp,"title %s\n",pl->own_title); 275 fprintf(freezer,"title %s\n",pl->own_title);
292 276
293 fprintf(fp,"explore %d\n",pl->explore); 277 fprintf(freezer,"explore %d\n",pl->explore);
294 fprintf(fp,"gen_hp %d\n",pl->gen_hp); 278 fprintf(freezer,"gen_hp %d\n",pl->gen_hp);
295 fprintf(fp,"gen_sp %d\n",pl->gen_sp); 279 fprintf(freezer,"gen_sp %d\n",pl->gen_sp);
296 fprintf(fp,"gen_grace %d\n",pl->gen_grace); 280 fprintf(freezer,"gen_grace %d\n",pl->gen_grace);
297 fprintf(fp,"listening %d\n",pl->listening); 281 fprintf(freezer,"listening %d\n",pl->listening);
298 fprintf(fp,"shoottype %d\n",pl->shoottype); 282 fprintf(freezer,"shoottype %d\n",pl->shoottype);
299 fprintf(fp,"bowtype %d\n",pl->bowtype); 283 fprintf(freezer,"bowtype %d\n",pl->bowtype);
300 fprintf(fp,"petmode %d\n",pl->petmode); 284 fprintf(freezer,"petmode %d\n",pl->petmode);
301 fprintf(fp,"peaceful %d\n",pl->peaceful); 285 fprintf(freezer,"peaceful %d\n",pl->peaceful);
302 fprintf(fp,"no_shout %d\n",pl->no_shout); 286 fprintf(freezer,"no_shout %d\n",pl->no_shout);
303 fprintf(fp,"digestion %d\n",pl->digestion); 287 fprintf(freezer,"digestion %d\n",pl->digestion);
304 fprintf(fp,"pickup %d\n", pl->mode); 288 fprintf(freezer,"pickup %d\n", pl->mode);
305 fprintf(fp,"outputs_sync %d\n", pl->outputs_sync); 289 fprintf(freezer,"outputs_sync %d\n", pl->outputs_sync);
306 fprintf(fp,"outputs_count %d\n", pl->outputs_count); 290 fprintf(freezer,"outputs_count %d\n", pl->outputs_count);
307 /* Match the enumerations but in string form */ 291 /* Match the enumerations but in string form */
308 fprintf(fp,"usekeys %s\n", pl->usekeys==key_inventory?"key_inventory": 292 fprintf(freezer,"usekeys %s\n", pl->usekeys==key_inventory?"key_inventory":
309 (pl->usekeys==keyrings?"keyrings":"containers")); 293 (pl->usekeys==keyrings?"keyrings":"containers"));
310 /* Match the enumerations but in string form */ 294 /* Match the enumerations but in string form */
311 fprintf(fp,"unapply %s\n", pl->unapply==unapply_nochoice?"unapply_nochoice": 295 fprintf(freezer,"unapply %s\n", pl->unapply==unapply_nochoice?"unapply_nochoice":
312 (pl->unapply==unapply_never?"unapply_never":"unapply_always")); 296 (pl->unapply==unapply_never?"unapply_never":"unapply_always"));
313
314
315 297
316#ifdef BACKUP_SAVE_AT_HOME 298#ifdef BACKUP_SAVE_AT_HOME
317 if (op->map!=NULL && flag==0) 299 if (op->map!=NULL && flag==0)
318#else 300#else
319 if (op->map!=NULL) 301 if (op->map!=NULL)
320#endif 302#endif
321 fprintf(fp,"map %s\n",op->map->path); 303 fprintf(freezer,"map %s\n",op->map->path);
322 else 304 else
323 fprintf(fp,"map %s\n",settings.emergency_mapname); 305 fprintf(freezer,"map %s\n",settings.emergency_mapname);
324 306
325 fprintf(fp,"savebed_map %s\n", pl->savebed_map); 307 fprintf(freezer,"savebed_map %s\n", pl->savebed_map);
326 fprintf(fp,"bed_x %d\nbed_y %d\n", pl->bed_x, pl->bed_y); 308 fprintf(freezer,"bed_x %d\nbed_y %d\n", pl->bed_x, pl->bed_y);
327 fprintf(fp,"weapon_sp %f\n",pl->weapon_sp); 309 fprintf(freezer,"weapon_sp %f\n",pl->weapon_sp);
328 fprintf(fp,"Str %d\n",pl->orig_stats.Str); 310 fprintf(freezer,"Str %d\n",pl->orig_stats.Str);
329 fprintf(fp,"Dex %d\n",pl->orig_stats.Dex); 311 fprintf(freezer,"Dex %d\n",pl->orig_stats.Dex);
330 fprintf(fp,"Con %d\n",pl->orig_stats.Con); 312 fprintf(freezer,"Con %d\n",pl->orig_stats.Con);
331 fprintf(fp,"Int %d\n",pl->orig_stats.Int); 313 fprintf(freezer,"Int %d\n",pl->orig_stats.Int);
332 fprintf(fp,"Pow %d\n",pl->orig_stats.Pow); 314 fprintf(freezer,"Pow %d\n",pl->orig_stats.Pow);
333 fprintf(fp,"Wis %d\n",pl->orig_stats.Wis); 315 fprintf(freezer,"Wis %d\n",pl->orig_stats.Wis);
334 fprintf(fp,"Cha %d\n",pl->orig_stats.Cha); 316 fprintf(freezer,"Cha %d\n",pl->orig_stats.Cha);
335 317
336 fprintf(fp,"lev_array %d\n",op->level>10?10:op->level); 318 fprintf(freezer,"lev_array %d\n",op->level>10?10:op->level);
337 for(i=1;i<=pl->last_level&&i<=10;i++) { 319 for(i=1;i<=pl->last_level&&i<=10;i++) {
338 fprintf(fp,"%d\n",pl->levhp[i]); 320 fprintf(freezer,"%d\n",pl->levhp[i]);
339 fprintf(fp,"%d\n",pl->levsp[i]); 321 fprintf(freezer,"%d\n",pl->levsp[i]);
340 fprintf(fp,"%d\n",pl->levgrace[i]); 322 fprintf(freezer,"%d\n",pl->levgrace[i]);
341 } 323 }
342 324
343 freezer.put (fp, op->contr); 325 freezer.put (op->contr);
344 326
345 fprintf(fp,"endplst\n"); 327 fprintf(freezer,"endplst\n");
346 328
347 SET_FLAG(op, FLAG_NO_FIX_PLAYER); 329 SET_FLAG(op, FLAG_NO_FIX_PLAYER);
348 CLEAR_FLAG(op, FLAG_WIZ); 330 CLEAR_FLAG(op, FLAG_WIZ);
349#ifdef BACKUP_SAVE_AT_HOME 331#ifdef BACKUP_SAVE_AT_HOME
350 if (flag) { 332 if (flag) {
354 op->y = -1; 336 op->y = -1;
355 } 337 }
356 /* Save objects, but not unpaid objects. Don't remove objects from 338 /* Save objects, but not unpaid objects. Don't remove objects from
357 * inventory. 339 * inventory.
358 */ 340 */
359 save_object(fp, freezer, op, 2); 341 save_object(freezer, op, 2);
360 if (flag) { 342 if (flag) {
361 op->x = backup_x; 343 op->x = backup_x;
362 op->y = backup_y; 344 op->y = backup_y;
363 } 345 }
364#else 346#else
365 save_object(fp, freezer, op, 3); /* don't check and don't remove */ 347 save_object(freezer, op, 3); /* don't check and don't remove */
366#endif 348#endif
349
350 char filename[MAX_BUF];
351 sprintf(filename,"%s/%s/%s/%s.pl",settings.localdir,settings.playerdir,&op->name,&op->name);
352 make_path_to_file(filename);
353 freezer.save (filename);
367 354
368 CLEAR_FLAG(op, FLAG_NO_FIX_PLAYER); 355 CLEAR_FLAG(op, FLAG_NO_FIX_PLAYER);
369 356
370 if(!flag) 357 if(!flag)
371 while ((tmp = op->inv)) 358 while ((tmp = op->inv))
372 destroy_object (tmp); 359 destroy_object (tmp);
373
374 if (fclose(fp) == EOF) { /* make sure the write succeeded */
375 new_draw_info(NDI_UNIQUE, 0,op, "Can't save character.");
376 unlink(tmpfilename);
377 free(tmpfilename);
378 return 0;
379 }
380
381 checksum = 0;
382 sprintf(backupfile, "%s.tmp", filename);
383 rename(filename, backupfile);
384 fp = fopen(filename,"w");
385 if(!fp) {
386 new_draw_info(NDI_UNIQUE, 0,op, "Can't open file for save.");
387 unlink(tmpfilename);
388 free(tmpfilename);
389 return 0;
390 }
391 fprintf(fp,"checksum %lx\n",checksum);
392 copy_file(tmpfilename, fp);
393 unlink(tmpfilename);
394 free(tmpfilename);
395 if (fclose(fp) == EOF) { /* got write error */
396 new_draw_info(NDI_UNIQUE, 0,op, "Can't close file for save.");
397 rename(backupfile, filename); /* Restore the original */
398 return 0;
399 }
400 else
401 unlink(backupfile);
402 360
403 /* Eneq(@csd.uu.se): Reveal the container if we have one. */ 361 /* Eneq(@csd.uu.se): Reveal the container if we have one. */
404 if (flag&&container!=NULL) 362 if (flag && container!=NULL)
405 op->container = container; 363 op->container = container;
406 364
407 if (wiz) SET_FLAG(op,FLAG_WIZ); 365 if (wiz) SET_FLAG (op, FLAG_WIZ);
366
408 if(!flag) 367 if(!flag)
409 esrv_send_inventory(op, op); 368 esrv_send_inventory(op, op);
410
411 chmod(filename,SAVE_MODE);
412 369
413 return 1; 370 return 1;
414} 371}
415 372
416void copy_file(const char *filename, FILE *fpout) {
417 FILE *fp;
418 char buf[MAX_BUF];
419 if((fp = fopen(filename,"r")) == NULL)
420 return;
421 while(fgets(buf,MAX_BUF,fp)!=NULL)
422 fputs(buf,fpout);
423 fclose(fp);
424}
425
426
427void check_login(object *op) { 373void check_login(object *op) {
428 FILE *fp;
429 char filename[MAX_BUF]; 374 char filename[MAX_BUF];
430 char buf[MAX_BUF],bufall[MAX_BUF]; 375 char buf[MAX_BUF],bufall[MAX_BUF];
431 int i,value,comp; 376 int i,value,comp;
432 long checksum = 0; 377 long checksum = 0;
433 player *pl = op->contr; 378 player *pl = op->contr;
434 int correct = 0; 379 int correct = 0;
435 time_t elapsed_save_time=0;
436 struct stat statbuf;
437 380
438 strcpy (pl->maplevel,first_map_path); 381 strcpy (pl->maplevel,first_map_path);
439
440 /* First, lets check for newest form of save */
441 sprintf(filename,"%s/%s/%s/%s.pl",settings.localdir,settings.playerdir,op->name,op->name); 382 sprintf(filename,"%s/%s/%s/%s.pl",settings.localdir,settings.playerdir,&op->name,&op->name);
442 if (access(filename, F_OK)==-1) {
443 /* not there, Try the old style */
444 383
445 sprintf(filename,"%s/%s/%s.pl",settings.localdir,settings.playerdir,op->name); 384 object_thawer thawer (filename);
446 /* Ok - old style exists. Lets make the new style directory */
447 if (access(filename, F_OK)==0) {
448 sprintf(buf,"%s/%s/%s",settings.localdir,settings.playerdir,op->name);
449 make_path_to_file(buf);
450 }
451 }
452
453 /* If no file, must be a new player, so lets get confirmation of 385 /* If no file, must be a new player, so lets get confirmation of
454 * the password. Return control to the higher level dispatch, 386 * the password. Return control to the higher level dispatch,
455 * since the rest of this just deals with loading of the file. 387 * since the rest of this just deals with loading of the file.
456 */ 388 */
457 if ((fp=open_and_uncompress(filename,1,&comp)) == NULL) { 389 if (!thawer) {
458 confirm_password(op); 390 confirm_password(op);
459 return; 391 return;
460 } 392 }
461 if (fstat(fileno(fp), &statbuf)) {
462 LOG(llevError,"Unable to stat %s?\n", filename);
463 elapsed_save_time=0;
464 } else {
465 elapsed_save_time = time(NULL) - statbuf.st_mtime;
466 if (elapsed_save_time<0) {
467 LOG(llevError,"Player file %s was saved in the future? (%d time)\n", filename, elapsed_save_time);
468 elapsed_save_time=0;
469 }
470 }
471 393
472 object_thawer thawer (filename);
473
474 if(fgets(bufall,MAX_BUF,fp) != NULL) { 394 if(fgets(bufall,MAX_BUF,thawer) != NULL) {
475 if(!strncmp(bufall,"checksum ",9)) { 395 if(!strncmp(bufall,"checksum ",9)) {
476 checksum = strtol(bufall+9,(char **) NULL, 16); 396 checksum = strtol(bufall+9,(char **) NULL, 16);
477 (void) fgets(bufall,MAX_BUF,fp); 397 (void) fgets(bufall,MAX_BUF,thawer);
478 } 398 }
479 if(sscanf(bufall,"password %s\n",buf)) { 399 if(sscanf(bufall,"password %s\n",buf)) {
480 /* New password scheme: */ 400 /* New password scheme: */
481 correct=check_password(pl->write_buf+1,buf); 401 correct=check_password(pl->write_buf+1,buf);
482 } 402 }
483 /* Old password mode removed - I have no idea what it 403 /* Old password mode removed - I have no idea what it
484 * was, and the current password mechanism has been used 404 * was, and the current password mechanism has been used
485 * for at least several years. 405 * for at least several years.
486 */ 406 */
487 } 407 }
488 if (!correct) { 408 if (!correct) {
489 new_draw_info(NDI_UNIQUE, 0,op," "); 409 new_draw_info(NDI_UNIQUE, 0,op," ");
490 new_draw_info(NDI_UNIQUE, 0,op,"Wrong Password!"); 410 new_draw_info(NDI_UNIQUE, 0,op,"Wrong Password!");
491 new_draw_info(NDI_UNIQUE, 0,op," "); 411 new_draw_info(NDI_UNIQUE, 0,op," ");
492 FREE_AND_COPY(op->name, "noname"); 412 op->name =
493 FREE_AND_COPY(op->name_pl, "noname"); 413 op->name_pl = "noname";
494 op->contr->socket.password_fails++; 414 op->contr->socket.password_fails++;
495 if (op->contr->socket.password_fails >= MAX_PASSWORD_FAILURES) { 415 if (op->contr->socket.password_fails >= MAX_PASSWORD_FAILURES) {
496 new_draw_info(NDI_UNIQUE, 0,op, 416 new_draw_info(NDI_UNIQUE, 0,op,
497 "You gave an incorrect password too many times, you will now be dropped from the server."); 417 "You gave an incorrect password too many times, you will now be dropped from the server.");
498 LOG(llevInfo, "A player connecting from %s has been dropped for password failure\n", 418 LOG(llevInfo, "A player connecting from %s has been dropped for password failure\n",
499 op->contr->socket.host); 419 op->contr->socket.host);
500 op->contr->socket.status = Ns_Dead; /* the socket loop should handle the rest for us */ 420 op->contr->socket.status = Ns_Dead; /* the socket loop should handle the rest for us */
501 } 421 }
502 else get_name(op); 422 else get_name(op);
503 return; /* Once again, rest of code just loads the char */ 423 return; /* Once again, rest of code just loads the char */
504 } 424 }
505 425
506#ifdef SAVE_INTERVAL 426#ifdef SAVE_INTERVAL
507 pl->last_save_time=time(NULL); 427 pl->last_save_time=time(NULL);
508#endif /* SAVE_INTERVAL */ 428#endif /* SAVE_INTERVAL */
509 pl->party = NULL; 429 pl->party = NULL;
510 if (settings.search_items == TRUE) 430 if (settings.search_items == TRUE)
511 pl->search_str[0]='\0'; 431 pl->search_str[0]='\0';
512 pl->name_changed=1; 432 pl->name_changed=1;
513 pl->orig_stats.Str=0; 433 pl->orig_stats.Str=0;
514 pl->orig_stats.Dex=0; 434 pl->orig_stats.Dex=0;
515 pl->orig_stats.Con=0; 435 pl->orig_stats.Con=0;
516 pl->orig_stats.Int=0; 436 pl->orig_stats.Int=0;
520 strcpy(pl->savebed_map, first_map_path); 440 strcpy(pl->savebed_map, first_map_path);
521 pl->bed_x=0, pl->bed_y=0; 441 pl->bed_x=0, pl->bed_y=0;
522 pl->spellparam[0] = '\0'; 442 pl->spellparam[0] = '\0';
523 443
524 /* Loop through the file, loading the rest of the values */ 444 /* Loop through the file, loading the rest of the values */
525 while (fgets(bufall,MAX_BUF,fp)!=NULL) { 445 while (fgets(bufall,MAX_BUF,thawer)!=NULL) {
526 sscanf(bufall,"%s %d\n",buf,&value); 446 sscanf(bufall,"%s %d\n",buf,&value);
527 if (!strcmp(buf,"endplst")) 447 if (!strcmp(buf,"endplst"))
528 break; 448 break;
529 else if (!strcmp(buf,"oid")) 449 else if (!strcmp(buf,"oid"))
530 thawer.get (pl, value); 450 thawer.get (pl, value);
531 else if (!strcmp(buf,"title") && settings.set_title == TRUE) 451 else if (!strcmp(buf,"title") && settings.set_title == TRUE)
532 sscanf(bufall,"title %[^\n]",pl->own_title); 452 sscanf(bufall,"title %[^\n]",pl->own_title);
533 else if (!strcmp(buf,"explore")) 453 else if (!strcmp(buf,"explore"))
534 pl->explore = value; 454 pl->explore = value;
535 else if (!strcmp(buf,"gen_hp")) 455 else if (!strcmp(buf,"gen_hp"))
536 pl->gen_hp=value; 456 pl->gen_hp=value;
537 else if (!strcmp(buf,"shoottype")) 457 else if (!strcmp(buf,"shoottype"))
538 pl->shoottype=(rangetype)value; 458 pl->shoottype=(rangetype)value;
539 else if (!strcmp(buf,"bowtype")) 459 else if (!strcmp(buf,"bowtype"))
540 pl->bowtype=(bowtype_t)value; 460 pl->bowtype=(bowtype_t)value;
541 else if (!strcmp(buf,"petmode")) 461 else if (!strcmp(buf,"petmode"))
542 pl->petmode=(petmode_t)value; 462 pl->petmode=(petmode_t)value;
543 else if (!strcmp(buf,"gen_sp")) 463 else if (!strcmp(buf,"gen_sp"))
544 pl->gen_sp=value; 464 pl->gen_sp=value;
545 else if (!strcmp(buf,"gen_grace")) 465 else if (!strcmp(buf,"gen_grace"))
546 pl->gen_grace=value; 466 pl->gen_grace=value;
547 else if (!strcmp(buf,"listening")) 467 else if (!strcmp(buf,"listening"))
548 pl->listening=value; 468 pl->listening=value;
549 else if (!strcmp(buf,"peaceful")) 469 else if (!strcmp(buf,"peaceful"))
550 pl->peaceful=value; 470 pl->peaceful=value;
551 else if (!strcmp(buf,"no_shout")) 471 else if (!strcmp(buf,"no_shout"))
552 pl->no_shout=value; 472 pl->no_shout=value;
553 else if (!strcmp(buf,"digestion")) 473 else if (!strcmp(buf,"digestion"))
554 pl->digestion=value; 474 pl->digestion=value;
555 else if (!strcmp(buf,"pickup")) 475 else if (!strcmp(buf,"pickup"))
556 pl->mode=value; 476 pl->mode=value;
557 else if (!strcmp(buf,"outputs_sync")) 477 else if (!strcmp(buf,"outputs_sync"))
558 pl->outputs_sync = value; 478 pl->outputs_sync = value;
559 else if (!strcmp(buf,"outputs_count")) 479 else if (!strcmp(buf,"outputs_count"))
560 pl->outputs_count = value; 480 pl->outputs_count = value;
561 else if (!strcmp(buf,"map")) 481 else if (!strcmp(buf,"map"))
562 sscanf(bufall,"map %s", pl->maplevel); 482 sscanf(bufall,"map %s", pl->maplevel);
563 else if (!strcmp(buf,"savebed_map")) 483 else if (!strcmp(buf,"savebed_map"))
564 sscanf(bufall,"savebed_map %s", pl->savebed_map); 484 sscanf(bufall,"savebed_map %s", pl->savebed_map);
565 else if (!strcmp(buf,"bed_x")) 485 else if (!strcmp(buf,"bed_x"))
566 pl->bed_x=value; 486 pl->bed_x=value;
567 else if (!strcmp(buf,"bed_y")) 487 else if (!strcmp(buf,"bed_y"))
568 pl->bed_y=value; 488 pl->bed_y=value;
569 else if (!strcmp(buf,"weapon_sp")) 489 else if (!strcmp(buf,"weapon_sp"))
570 sscanf(buf,"weapon_sp %f",&pl->weapon_sp); 490 sscanf(buf,"weapon_sp %f",&pl->weapon_sp);
571 else if (!strcmp(buf,"Str")) 491 else if (!strcmp(buf,"Str"))
572 pl->orig_stats.Str=value; 492 pl->orig_stats.Str=value;
573 else if (!strcmp(buf,"Dex")) 493 else if (!strcmp(buf,"Dex"))
574 pl->orig_stats.Dex=value; 494 pl->orig_stats.Dex=value;
575 else if (!strcmp(buf,"Con")) 495 else if (!strcmp(buf,"Con"))
576 pl->orig_stats.Con=value; 496 pl->orig_stats.Con=value;
577 else if (!strcmp(buf,"Int")) 497 else if (!strcmp(buf,"Int"))
578 pl->orig_stats.Int=value; 498 pl->orig_stats.Int=value;
579 else if (!strcmp(buf,"Pow")) 499 else if (!strcmp(buf,"Pow"))
580 pl->orig_stats.Pow=value; 500 pl->orig_stats.Pow=value;
581 else if (!strcmp(buf,"Wis")) 501 else if (!strcmp(buf,"Wis"))
582 pl->orig_stats.Wis=value; 502 pl->orig_stats.Wis=value;
583 else if (!strcmp(buf,"Cha")) 503 else if (!strcmp(buf,"Cha"))
584 pl->orig_stats.Cha=value; 504 pl->orig_stats.Cha=value;
585 else if (!strcmp(buf,"usekeys")) { 505 else if (!strcmp(buf,"usekeys")) {
586 if (!strcmp(bufall+8,"key_inventory\n")) 506 if (!strcmp(bufall+8,"key_inventory\n"))
587 pl->usekeys=key_inventory; 507 pl->usekeys=key_inventory;
588 else if (!strcmp(bufall+8,"keyrings\n")) 508 else if (!strcmp(bufall+8,"keyrings\n"))
589 pl->usekeys=keyrings; 509 pl->usekeys=keyrings;
590 else if (!strcmp(bufall+8,"containers\n")) 510 else if (!strcmp(bufall+8,"containers\n"))
591 pl->usekeys=containers; 511 pl->usekeys=containers;
592 else LOG(llevDebug,"load_player: got unknown usekeys type: %s\n", bufall+8); 512 else LOG(llevDebug,"load_player: got unknown usekeys type: %s\n", bufall+8);
593 } 513 }
594 else if (!strcmp(buf,"unapply")) { 514 else if (!strcmp(buf,"unapply")) {
595 if (!strcmp(bufall+8,"unapply_nochoice\n")) 515 if (!strcmp(bufall+8,"unapply_nochoice\n"))
596 pl->unapply=unapply_nochoice; 516 pl->unapply=unapply_nochoice;
597 else if (!strcmp(bufall+8,"unapply_never\n")) 517 else if (!strcmp(bufall+8,"unapply_never\n"))
598 pl->unapply=unapply_never; 518 pl->unapply=unapply_never;
599 else if (!strcmp(bufall+8,"unapply_always\n")) 519 else if (!strcmp(bufall+8,"unapply_always\n"))
600 pl->unapply=unapply_always; 520 pl->unapply=unapply_always;
601 else LOG(llevDebug,"load_player: got unknown unapply type: %s\n", bufall+8); 521 else LOG(llevDebug,"load_player: got unknown unapply type: %s\n", bufall+8);
602 } 522 }
603 else if (!strcmp(buf,"lev_array")){ 523 else if (!strcmp(buf,"lev_array")){
604 for(i=1;i<=value;i++) { 524 for(i=1;i<=value;i++)
605 int j; 525 {
606 fscanf(fp,"%d\n",&j); 526 char line[128];
607 pl->levhp[i]=j; 527 fgets (line, 128, thawer); pl->levhp[i] = atoi (line);
608 fscanf(fp,"%d\n",&j); 528 fgets (line, 128, thawer); pl->levsp[i] = atoi (line);
609 pl->levsp[i]=j; 529 fgets (line, 128, thawer); pl->levgrace[i] = atoi (line);
610 fscanf(fp,"%d\n",&j); 530 }
611 pl->levgrace[i]=j;
612 }
613 /* spell_array code removed - don't know when that was last used. 531 /* spell_array code removed - don't know when that was last used.
614 * Even the load code below will someday be replaced by spells being 532 * Even the load code below will someday be replaced by spells being
615 * objects. 533 * objects.
616 */ 534 */
617 } else if (!strcmp(buf,"known_spell")) { 535 } else if (!strcmp(buf,"known_spell")) {
618#if 0 536#if 0
619 /* Logic is left here in case someone wants to try 537 /* Logic is left here in case someone wants to try
620 * and write code to update to spell objects. 538 * and write code to update to spell objects.
621 */ 539 */
622 char *cp=strchr(bufall,'\n'); 540 char *cp=strchr(bufall,'\n');
623 *cp='\0'; 541 *cp='\0';
624 cp=strchr(bufall,' '); 542 cp=strchr(bufall,' ');
625 cp++; 543 cp++;
626 for(i=0;i<NROFREALSPELLS;i++) 544 for(i=0;i<NROFREALSPELLS;i++)
627 if(!strcmp(spells[i].name,cp)) { 545 if(!strcmp(spells[i].name,cp)) {
628 pl->known_spells[pl->nrofknownspells++]=i; 546 pl->known_spells[pl->nrofknownspells++]=i;
629 break; 547 break;
630 } 548 }
631 if(i==NROFREALSPELLS) 549 if(i==NROFREALSPELLS)
632 LOG(llevDebug, "Error: unknown spell (%s)\n",cp); 550 LOG(llevDebug, "Error: unknown spell (%s)\n",cp);
633#endif 551#endif
634 } 552 }
635 } /* End of loop loading the character file */ 553 } /* End of loop loading the character file */
636 leave_map(op); 554 leave_map(op);
637 op->speed=0; 555 op->speed=0;
638 update_ob_speed(op); 556 update_ob_speed(op);
639 reset_object(op); 557 reset_object(op);
640 op->contr = pl; 558 op->contr = pl;
641 pl->ob = op; 559 pl->ob = op;
642 560
643 /* this loads the standard objects values. */ 561 /* this loads the standard objects values. */
644 load_object(fp, thawer, op, LO_NEWFILE,0); 562 load_object (thawer, op, 0);
645 close_and_delete(fp, comp);
646 563
647 CLEAR_FLAG(op, FLAG_NO_FIX_PLAYER); 564 CLEAR_FLAG(op, FLAG_NO_FIX_PLAYER);
648 565
649 strncpy(pl->title, op->arch->clone.name, sizeof(pl->title)-1); 566 strncpy(pl->title, op->arch->clone.name, sizeof(pl->title)-1);
650 pl->title[sizeof(pl->title)-1] = '\0'; 567 pl->title[sizeof(pl->title)-1] = '\0';
655 * First, we check for partial path, then check to see if the full 572 * First, we check for partial path, then check to see if the full
656 * path (for unique player maps) 573 * path (for unique player maps)
657 */ 574 */
658 if (check_path(pl->maplevel,1)==-1) { 575 if (check_path(pl->maplevel,1)==-1) {
659 if (check_path(pl->maplevel,0)==-1) { 576 if (check_path(pl->maplevel,0)==-1) {
660 strcpy(pl->maplevel, pl->savebed_map); 577 strcpy(pl->maplevel, pl->savebed_map);
661 op->x = pl->bed_x, op->y = pl->bed_y; 578 op->x = pl->bed_x, op->y = pl->bed_y;
662 } 579 }
663 }
664
665 /* If player saved beyond some time ago, and the feature is
666 * enabled, put the player back on his savebed map.
667 */
668 if ((settings.reset_loc_time >0) && (elapsed_save_time > settings.reset_loc_time)) {
669 strcpy(pl->maplevel, pl->savebed_map);
670 op->x = pl->bed_x, op->y = pl->bed_y;
671 } 580 }
672 581
673 /* make sure he's a player--needed because of class change. */ 582 /* make sure he's a player--needed because of class change. */
674 op->type = PLAYER; 583 op->type = PLAYER;
675 584
696 605
697 /* if it's a dragon player, set the correct title here */ 606 /* if it's a dragon player, set the correct title here */
698 if (is_dragon_pl(op) && op->inv != NULL) { 607 if (is_dragon_pl(op) && op->inv != NULL) {
699 object *tmp, *abil=NULL, *skin=NULL; 608 object *tmp, *abil=NULL, *skin=NULL;
700 for (tmp=op->inv; tmp!=NULL; tmp=tmp->below) { 609 for (tmp=op->inv; tmp!=NULL; tmp=tmp->below) {
701 if (tmp->type == FORCE) { 610 if (tmp->type == FORCE) {
702 if (strcmp(tmp->arch->name, "dragon_ability_force")==0) 611 if (strcmp(tmp->arch->name, "dragon_ability_force")==0)
703 abil = tmp; 612 abil = tmp;
704 else if (strcmp(tmp->arch->name, "dragon_skin_force")==0) 613 else if (strcmp(tmp->arch->name, "dragon_skin_force")==0)
705 skin = tmp; 614 skin = tmp;
706 } 615 }
707 } 616 }
708 set_dragon_name(op, abil, skin); 617 set_dragon_name(op, abil, skin);
709 } 618 }
710 619
711 new_draw_info(NDI_UNIQUE, 0,op,"Welcome Back!"); 620 new_draw_info(NDI_UNIQUE, 0,op,"Welcome Back!");
712 new_draw_info_format(NDI_UNIQUE | NDI_ALL | NDI_DK_ORANGE, 5, NULL, 621 new_draw_info_format(NDI_UNIQUE | NDI_ALL | NDI_DK_ORANGE, 5, NULL,
713 "%s has entered the game.",pl->ob->name); 622 "%s has entered the game.", &pl->ob->name);
714 623
715 INVOKE_PLAYER (LOAD, pl, ARG_STRING (filename)); 624 INVOKE_PLAYER (LOAD, pl, ARG_STRING (filename));
716 INVOKE_PLAYER (LOGIN, pl); 625 INVOKE_PLAYER (LOGIN, pl);
717 626
718 op->contr->socket.update_look=1; 627 op->contr->socket.update_look=1;
721 * logic for that to take place. If player is permanently 630 * logic for that to take place. If player is permanently
722 * dead, and not using permadeath mode, the kill_player will 631 * dead, and not using permadeath mode, the kill_player will
723 * set the play_again flag, so return. 632 * set the play_again flag, so return.
724 */ 633 */
725 if (op->stats.hp<0) { 634 if (op->stats.hp<0) {
726 new_draw_info(NDI_UNIQUE, 0,op,"Your character was dead last your played."); 635 new_draw_info(NDI_UNIQUE, 0,op,"Your character was dead last your played.");
727 kill_player(op); 636 kill_player(op);
728 if (pl->state != ST_PLAYING) return; 637 if (pl->state != ST_PLAYING) return;
729 } 638 }
730 LOG(llevInfo,"LOGIN: Player named %s from ip %s\n", op->name, 639 LOG(llevInfo,"LOGIN: Player named %s from ip %s\n", &op->name, op->contr->socket.host);
731 op->contr->socket.host);
732 640
733 /* Do this after checking for death - no reason sucking up bandwidth if 641 /* Do this after checking for death - no reason sucking up bandwidth if
734 * the data isn't needed. 642 * the data isn't needed.
735 */ 643 */
736 esrv_new_player(op->contr,op->weight+op->carrying); 644 esrv_new_player(op->contr,op->weight+op->carrying);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines