diff -burpN smaugfuss/src//act_comm.c smaugfussdev/src//act_comm.c --- smaugfuss/src//act_comm.c 2009-07-21 11:53:56.000000000 -0400 +++ smaugfussdev/src//act_comm.c 2009-07-21 11:35:24.000000000 -0400 @@ -27,6 +27,7 @@ void talk_channel( CHAR_DATA * ch, const char *argument, int channel, const char *verb ); char *scramble( const char *argument, int modifier ); const char *drunk_speech( const char *argument, CHAR_DATA * ch ); +void account_save( ACCOUNT_DATA *account ); /* Text scrambler -- Altrag */ char *scramble( const char *argument, int modifier ) @@ -1775,6 +1776,7 @@ void do_quit( CHAR_DATA* ch, const char* { char log_buf[MAX_STRING_LENGTH]; int x, y; + struct tm *tms; int level; if( IS_NPC( ch ) ) @@ -1828,6 +1830,14 @@ void do_quit( CHAR_DATA* ch, const char* act( AT_BYE, "$n has left the game.", ch, NULL, NULL, TO_CANSEE ); set_char_color( AT_GREY, ch ); + if( ch->desc && ch->desc->account && !IS_IMMORTAL( ch ) ) + { + tms = localtime( ¤t_time ); + tms->tm_min += ACCOUNT_TIMER; + ch->desc->account->timer = mktime( tms ); + account_save( ch->desc->account ); + } + snprintf( log_buf, MAX_STRING_LENGTH, "%s has quit (Room %d).", ch->name, ( ch->in_room ? ch->in_room->vnum : -1 ) ); quitting_char = ch; save_char_obj( ch ); @@ -1847,6 +1857,8 @@ void do_quit( CHAR_DATA* ch, const char* saving_char = NULL; level = get_trust( ch ); + if( ch->desc ) + ch->desc->connected = CON_ACCOUNT_PENDING; /* * After extract_char the ch is no longer valid! */ diff -burpN smaugfuss/src//comm.c smaugfussdev/src//comm.c --- smaugfuss/src//comm.c 2009-05-18 01:56:00.000000000 -0400 +++ smaugfussdev/src//comm.c 2009-07-21 11:36:42.000000000 -0400 @@ -148,6 +148,10 @@ void display_prompt( DESCRIPTOR_DATA * d void set_pager_input( DESCRIPTOR_DATA * d, char *argument ); bool pager_output( DESCRIPTOR_DATA * d ); void mail_count( CHAR_DATA * ch ); +void account_dispose args( ( ACCOUNT_DATA *account ) ); +void account_nanny args( ( DESCRIPTOR_DATA *d, char *argument ) ); +void account_save args( ( ACCOUNT_DATA *account ) ); +bool account_add_character args ( ( ACCOUNT_DATA *account, const char *name, bool pending, bool newcharacter ) ); int port; @@ -799,8 +803,9 @@ void game_loop( void ) close_socket( d, TRUE ); continue; } - else if( ( !d->character && d->idle > 360 ) /* 2 mins */ - || ( d->connected != CON_PLAYING && d->idle > 1200 ) /* 5 mins */ + else if( ( !d->character && d->connected != CON_ACCOUNT_PENDING && d->idle > 360 ) /* 2 mins */ + || ( d->connected != CON_PLAYING && d->connected != CON_ACCOUNT_PENDING && d->idle > 1200 ) /* 5 mins */ + || ( d->connected == CON_ACCOUNT_PENDING && d->idle > 12000) || d->idle > 28800 ) /* 2 hrs */ { write_to_descriptor( d, "Idle timeout... disconnecting.\r\n", 0 ); @@ -866,6 +871,15 @@ void game_loop( void ) case CON_EDITING: edit_buffer( d->character, cmdline ); break; + case CON_GET_OLD_ACCOUNT_PASSWORD: + case CON_COMFIRM_NEW_ACCOUNT: + case CON_ACCOUNT_ADD_CHARACTER_PASSWORD: + case CON_GET_NEW_ACCOUNT_PASSWORD: + case CON_COMFIRM_ACCOUNT_PASSWORD: + case CON_GET_ACCOUNT: + case CON_ACCOUNT_PENDING: + account_nanny( d, cmdline ); + break; } } } @@ -1026,7 +1040,7 @@ void new_descriptor( int new_desc ) CREATE( dnew, DESCRIPTOR_DATA, 1 ); dnew->next = NULL; dnew->descriptor = desc; - dnew->connected = CON_GET_NAME; + dnew->connected = CON_GET_ACCOUNT; dnew->outsize = 2000; dnew->idle = 0; dnew->lines = 0; @@ -1117,6 +1131,11 @@ void new_descriptor( int new_desc ) void free_desc( DESCRIPTOR_DATA * d ) { close( d->descriptor ); + if( d->account ) + { + account_save( d->account ); + account_dispose( d->account ); + } STRFREE( d->host ); DISPOSE( d->outbuf ); if( d->pagebuf ) @@ -1824,6 +1843,13 @@ void nanny_get_name( DESCRIPTOR_DATA * d return; } + if( !str_cmp( argument, "account" ) ) + { + write_to_buffer( d, "Enter account name: ", 0 ); + d->connected = CON_GET_ACCOUNT; + return; + } + argument[0] = UPPER( argument[0] ); if( !str_cmp( argument, "MSSP-REQUEST" ) ) @@ -2367,6 +2393,10 @@ void nanny_get_want_ripansi( DESCRIPTOR_ } snprintf( log_buf, MAX_STRING_LENGTH, "%s@%s new %s %s.", ch->name, d->host, race_table[ch->race]->race_name, class_table[ch->Class]->who_name ); + + account_add_character(d->account, ch->name, FALSE, TRUE); + account_save( d->account ); + log_string_plus( log_buf, LOG_COMM, sysdata.log_level ); to_channel( log_buf, CHANNEL_MONITOR, "Monitor", LEVEL_IMMORTAL ); write_to_buffer( d, "Press [ENTER] ", 0 ); diff -burpN smaugfuss/src//handler.c smaugfussdev/src//handler.c --- smaugfuss/src//handler.c 2008-09-02 02:32:58.000000000 -0400 +++ smaugfussdev/src//handler.c 2009-07-21 11:37:10.000000000 -0400 @@ -41,6 +41,7 @@ OBJ_DATA *group_object( OBJ_DATA * obj1, void update_room_reset( CHAR_DATA *ch, bool setting ); bool in_magic_container( OBJ_DATA * obj ); void delete_reset( RESET_DATA * pReset ); +void account_menu( DESCRIPTOR_DATA * d ); /* 50 nested loops should be enough till the end of time, unless someone forgot to deallocate :P - Luc 06/2007 */ @@ -2595,6 +2596,14 @@ void extract_char( CHAR_DATA * ch, bool if( ch->desc ) { + if( ch->desc->account ) + { + account_menu( ch->desc ); + send_to_desc_color( "\n&WAccount&z:&W", ch->desc ); + ch->desc->character = NULL; + ch->desc = NULL; + return; + } if( ch->desc->character != ch ) bug( "%s: char's descriptor points to another char", __FUNCTION__ ); else diff -burpN smaugfuss/src//hotboot.c smaugfussdev/src//hotboot.c --- smaugfuss/src//hotboot.c 2008-09-02 02:32:58.000000000 -0400 +++ smaugfussdev/src//hotboot.c 2009-07-21 11:38:07.000000000 -0400 @@ -45,6 +45,8 @@ bool write_to_descriptor_old( int desc, void update_room_reset( CHAR_DATA *ch, bool setting ); extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH]; +void account_save args( ( ACCOUNT_DATA *account ) ); +ACCOUNT_DATA *account_fread( const char *name ); /* * Save the world's objects and mobs in their current positions -- Scion @@ -122,6 +124,7 @@ void save_mobile( FILE * fp, CHAR_DATA * void save_world( void ) { + ACCOUNT_DATA *account; FILE *mobfp; FILE *objfp; int mobfile = 0; @@ -132,6 +135,9 @@ void save_world( void ) log_string( "Preserving world state...." ); + for( account = first_account; account; account = account->next ) + account_save( account ); + snprintf( filename, 256, "%s%s", SYSTEM_DIR, MOB_FILE ); if( !( mobfp = fopen( filename, "w" ) ) ) { @@ -660,8 +666,8 @@ void do_hotboot( CHAR_DATA* ch, const ch } else { - fprintf( fp, "%d %d %d %d %d %s %s\n", d->descriptor, - d->can_compress, och->in_room->vnum, d->port, d->idle, och->name, d->host ); + fprintf( fp, "%d %d %d %d %d %s %s %s\n", d->descriptor, + d->can_compress, och->in_room->vnum, d->port, d->idle, och->name, d->account ? d->account->name : "None", d->host ); /* * One of two places this gets changed */ @@ -733,6 +739,7 @@ void hotboot_recover( void ) FILE *fp; char name[100]; char host[MAX_STRING_LENGTH]; + char account[MAX_STRING_LENGTH]; int desc, dcompress, room, dport, idle, maxp = 0; bool fOld; @@ -750,7 +757,7 @@ void hotboot_recover( void ) { d = NULL; - fscanf( fp, "%d %d %d %d %d %s %s\n", &desc, &dcompress, &room, &dport, &idle, name, host ); + fscanf( fp, "%d %d %d %d %d %s %s %s\n", &desc, &dcompress, &room, &dport, &idle, name, account, host ); if( desc == -1 || feof( fp ) ) break; @@ -774,7 +781,7 @@ void hotboot_recover( void ) d->next = NULL; d->descriptor = desc; - d->connected = CON_GET_NAME; + d->connected = CON_GET_ACCOUNT; d->outsize = 2000; d->idle = 0; d->lines = 0; @@ -787,6 +794,7 @@ void hotboot_recover( void ) CREATE( d->outbuf, char, d->outsize ); d->host = STRALLOC( host ); + d->account = account_fread( account ); d->port = dport; d->idle = idle; CREATE( d->mccp, MCCP, 1 ); diff -burpN smaugfuss/src//Makefile smaugfussdev/src//Makefile --- smaugfuss/src//Makefile 2009-05-14 05:59:26.000000000 -0400 +++ smaugfussdev/src//Makefile 2009-07-21 11:07:23.000000000 -0400 @@ -25,7 +25,7 @@ L_FLAGS = $(PROF) $(SOLARIS_LINK) -lz $( #D_FLAGS : For the DNS Slave process. No need in linking all the extra libs for this. D_FLAGS = -g2 -O $(PROF) $(SOLARIS_LINK) -C_FILES = act_comm.c act_info.c act_move.c act_obj.c act_wiz.c ban.c boards.c \ +C_FILES = account.c act_comm.c act_info.c act_move.c act_obj.c act_wiz.c ban.c boards.c \ build.c calendar.c chess.c clans.c color.c comm.c comments.c const.c db.c deity.c \ dns.c fight.c handler.c hashstr.c hint.c hotboot.c imm_host.c interp.c \ liquids.c magic.c makeobjs.c mapout.c mapper.c mccp.c \ diff -burpN smaugfuss/src//mud.h smaugfussdev/src//mud.h --- smaugfuss/src//mud.h 2009-05-14 05:59:26.000000000 -0400 +++ smaugfussdev/src//mud.h 2009-07-21 11:34:43.000000000 -0400 @@ -160,6 +160,8 @@ typedef struct variable_data VARIABLE_DA typedef struct game_board_data GAME_BOARD_DATA; typedef struct mpsleep_data MPSLEEP_DATA; typedef struct lmsg_data LMSG_DATA; +typedef struct account_character_data ACCOUNT_CHARACTER_DATA; +typedef struct account_data ACCOUNT_DATA; /* * Function types. @@ -385,6 +387,7 @@ struct extended_bitvector #include "color.h" #include "dns.h" #include "hotboot.h" +#include "account.h" #include "calendar.h" /* AFKMud Calendar Replacement - Samson */ #include "weather.h" /* Weather System Replacement - Kayle */ #include "liquids.h" /* SMAUG Liquidtable Replacement - Nopey */ @@ -745,7 +748,14 @@ typedef enum /* Uncomment this section if using Samson's Shell Code */ /* CON_FORKED, CON_IAFORKED, */ - CON_EDITING + CON_EDITING, + +/* Account System code */ + CON_COMFIRM_NEW_ACCOUNT, CON_GET_OLD_ACCOUNT_PASSWORD, + CON_ACCOUNT_PENDING, CON_ACCOUNT_ADD_CHARACTER_PASSWORD, + CON_GET_NEW_ACCOUNT_PASSWORD, CON_COMFIRM_ACCOUNT_PASSWORD, + CON_GET_ACCOUNT + } connection_types; /* @@ -775,6 +785,7 @@ struct descriptor_data DESCRIPTOR_DATA *snoop_by; CHAR_DATA *character; CHAR_DATA *original; + ACCOUNT_DATA *account; struct mccp_data *mccp; /* Mud Client Compression Protocol */ bool can_compress; const char *host; @@ -3620,6 +3631,8 @@ extern IMMORTAL_HOST *immortal_host_end; extern AUCTION_DATA *auction; extern struct act_prog_data *mob_act_list; +extern ACCOUNT_DATA *first_account; +extern ACCOUNT_DATA *last_account; /* * Command functions. @@ -4217,6 +4230,7 @@ DECLARE_SPELL_FUN( spell_sacral_divinity */ #define PLAYER_DIR "../player/" /* Player files */ #define BACKUP_DIR "../backup/" /* Backup Player files */ +#define ACCOUNT_DIR "../accounts/" /* Directory for accounts */ #define GOD_DIR "../gods/" /* God Info Dir */ #define BOARD_DIR "../boards/" /* Board data dir */ #define CLAN_DIR "../clans/" /* Clan data dir */ @@ -4829,7 +4843,7 @@ ch_ret chain_spells( int sn, int level, #define OS_CARRY 0 #define OS_CORPSE 1 void save_char_obj args( ( CHAR_DATA * ch ) ); -bool load_char_obj args( ( DESCRIPTOR_DATA * d, char *name, bool preload, bool copyover ) ); +bool load_char_obj args( ( DESCRIPTOR_DATA * d, const char *name, bool preload, bool copyover ) ); void set_alarm args( ( long seconds ) ); void requip_char args( ( CHAR_DATA * ch ) ); void fwrite_obj args( ( CHAR_DATA * ch, OBJ_DATA * obj, FILE * fp, int iNest, short os_type, bool hotboot ) ); diff -burpN smaugfuss/src//save.c smaugfussdev/src//save.c --- smaugfuss/src//save.c 2009-07-09 04:49:08.000000000 -0400 +++ smaugfussdev/src//save.c 2009-07-21 11:34:19.000000000 -0400 @@ -746,7 +746,7 @@ void fwrite_obj( CHAR_DATA * ch, OBJ_DAT /* * Load a char and inventory into a new ch structure. */ -bool load_char_obj( DESCRIPTOR_DATA * d, char *name, bool preload, bool copyover ) +bool load_char_obj( DESCRIPTOR_DATA * d, const char *name, bool preload, bool copyover ) { char strsave[MAX_INPUT_LENGTH]; CHAR_DATA *ch; diff -burpN smaugfuss/src//startup smaugfussdev/src//startup --- smaugfuss/src//startup 2008-09-21 02:30:00.000000000 -0400 +++ smaugfussdev/src//startup 2009-07-21 11:46:30.000000000 -0400 @@ -1,7 +1,7 @@ #! /bin/csh -f # Set the port number. -set port = 1073 +set port = 1072 if ( "$1" != "" ) set port="$1" # Change to area directory.