diff -burpN swrfuss/src//act_comm.c swrfussdev/src//act_comm.c
--- swrfuss/src//act_comm.c 2009-01-02 13:46:40.000000000 -0500
+++ swrfussdev/src//act_comm.c 2009-07-20 04:44:24.000000000 -0400
@@ -33,6 +33,7 @@ void send_obj_page_to_char( CHAR_DATA *
void send_room_page_to_char( CHAR_DATA * ch, ROOM_INDEX_DATA * idx, char page );
void send_page_to_char( CHAR_DATA * ch, MOB_INDEX_DATA * idx, char page );
void send_control_page_to_char( CHAR_DATA * ch, char page );
+void account_save( ACCOUNT_DATA *account );
/*
* Local functions.
@@ -1373,6 +1374,7 @@ void do_quit( CHAR_DATA * ch, const char
*/
int x, y;
int level;
+ struct tm *tms;
if( IS_NPC( ch ) && IS_SET( ch->act, ACT_POLYMORPHED ) )
{
@@ -1419,6 +1421,14 @@ void do_quit( CHAR_DATA * ch, const char
act( AT_BYE, "$n has left the game.", ch, NULL, NULL, TO_ROOM );
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 );
+ }
+
sprintf( log_buf, "%s has quit.", ch->name );
quitting_char = ch;
save_char_obj( ch );
@@ -1426,6 +1436,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 swrfuss/src//comm.c swrfussdev/src//comm.c
--- swrfuss/src//comm.c 2009-05-14 06:29:41.000000000 -0400
+++ swrfussdev/src//comm.c 2009-07-21 10:42:21.000000000 -0400
@@ -108,6 +108,10 @@ void display_prompt args( ( DESCRIPTOR_D
void set_pager_input args( ( DESCRIPTOR_DATA * d, char *argument ) );
bool pager_output args( ( DESCRIPTOR_DATA * d ) );
void mail_count args( ( 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 main( int argc, char **argv )
{
@@ -455,8 +459,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 );
@@ -516,6 +521,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;
}
}
}
@@ -667,7 +681,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;
@@ -760,6 +774,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 )
@@ -1459,6 +1478,13 @@ void nanny( DESCRIPTOR_DATA * d, const c
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" ) )
@@ -1946,6 +1972,10 @@ void nanny( DESCRIPTOR_DATA * d, const c
{
*/ sprintf( log_buf, "%s@%s new %s.", ch->name, d->host,
race_table[ch->race].race_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 swrfuss/src//handler.c swrfussdev/src//handler.c
--- swrfuss/src//handler.c 2008-12-18 17:19:03.000000000 -0500
+++ swrfussdev/src//handler.c 2009-07-20 05:26:22.000000000 -0400
@@ -50,6 +50,7 @@ obj_ret global_objcode;
OBJ_DATA *group_object( OBJ_DATA * obj1, OBJ_DATA * obj2 );
void update_room_reset( CHAR_DATA *ch, bool setting );
void delete_reset( RESET_DATA *pReset );
+void account_menu( DESCRIPTOR_DATA * d );
void room_explode_1( OBJ_DATA * obj, CHAR_DATA * xch, ROOM_INDEX_DATA * room, int blast )
{
@@ -1716,6 +1717,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( "Extract_char: char's descriptor points to another char", 0 );
else
diff -burpN swrfuss/src//hotboot.c swrfussdev/src//hotboot.c
--- swrfuss/src//hotboot.c 2008-12-18 17:19:03.000000000 -0500
+++ swrfussdev/src//hotboot.c 2009-07-20 05:26:48.000000000 -0400
@@ -70,6 +70,8 @@ void update_room_reset( CHAR_DATA *ch, b
extern ROOM_INDEX_DATA *room_index_hash[MAX_KEY_HASH];
extern int port; /* Port number to be used */
+void account_save args( ( ACCOUNT_DATA *account ) );
+ACCOUNT_DATA *account_fread( const char *name );
/*
* Save the world's ship files
@@ -432,6 +434,7 @@ void save_mobile( FILE * fp, CHAR_DATA *
void save_world( CHAR_DATA * ch )
{
+ ACCOUNT_DATA *account;
FILE *mobfp;
FILE *objfp;
FILE *shipfp;
@@ -444,6 +447,9 @@ void save_world( CHAR_DATA * ch )
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" ) ) == NULL )
{
@@ -1039,7 +1045,7 @@ void do_hotboot( CHAR_DATA * ch, const c
{
/* For test purposes
flush_buffer(d, TRUE);*/
- fprintf( fp, "%d %d %d %d %d %s %s\n", d->can_compress, d->descriptor, och->in_room->vnum, d->port, d->idle, och->name, d->host );
+ fprintf( fp, "%d %d %d %d %d %s %s %s\n", d->can_compress, d->descriptor, 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
*/
@@ -1105,6 +1111,7 @@ void hotboot_recover( void )
DESCRIPTOR_DATA *d = NULL;
FILE *fp;
char name[100];
+ char account[MAX_STRING_LENGTH];
char host[MAX_STRING_LENGTH];
int desc, room, dport, idle, dcompress, maxp = 0;
bool fOld;
@@ -1123,7 +1130,7 @@ void hotboot_recover( void )
{
d = NULL;
- fscanf( fp, "%d %d %d %d %d %s %s\n", &dcompress, &desc, &room, &dport, &idle, name, host );
+ fscanf( fp, "%d %d %d %d %d %s %s %s\n", &dcompress, &desc, &room, &dport, &idle, name, account, host );
if( desc == -1 || feof( fp ) )
break;
@@ -1147,7 +1154,7 @@ void hotboot_recover( void )
CREATE( d->mccp, MCCP, 1 );
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;
@@ -1158,6 +1165,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;
LINK( d, first_descriptor, last_descriptor, next, prev );
diff -burpN swrfuss/src//Makefile swrfussdev/src//Makefile
--- swrfuss/src//Makefile 2009-05-14 06:29:41.000000000 -0400
+++ swrfussdev/src//Makefile 2009-07-20 05:42:17.000000000 -0400
@@ -22,7 +22,7 @@ L_FLAGS = $(PROF) $(NEED_MATH) -lz $(NEE
W_FLAGS = -Wall -Werror -Wshadow -Wformat-security -Winline -Wpointer-arith -Wcast-align -Wredundant-decls -Wwrite-strings
-C_FILES = act_comm.c act_info.c act_move.c act_obj.c act_wiz.c boards.c bounty.c \
+C_FILES = account.c act_comm.c act_info.c act_move.c act_obj.c act_wiz.c boards.c bounty.c \
build.c clans.c color.c comm.c comments.c const.c db.c fight.c \
handler.c hashstr.c hotboot.c interp.c magic.c makeobjs.c mccp.c \
misc.c mssp.c mud_comm.c mud_prog.c player.c reset.c save.c sha256.c shops.c \
diff -burpN swrfuss/src//mud.h swrfussdev/src//mud.h
--- swrfuss/src//mud.h 2009-05-30 16:48:19.000000000 -0400
+++ swrfussdev/src//mud.h 2009-07-20 05:25:25.000000000 -0400
@@ -116,6 +116,8 @@ typedef struct cmd_type CMDTYPE;
typedef struct killed_data KILLED_DATA;
typedef struct wizent WIZENT;
typedef struct specfun_list SPEC_LIST;
+typedef struct account_character_data ACCOUNT_CHARACTER_DATA;
+typedef struct account_data ACCOUNT_DATA;
/*
* Function types.
@@ -218,6 +220,7 @@ typedef ch_ret SPELL_FUN( int sn, int le
#define LEVEL_AVATAR (MAX_LEVEL - 5)
#include "hotboot.h"
+#include "account.h"
#define LEVEL_LOG LEVEL_LESSER
#define LEVEL_HIGOD LEVEL_GOD
@@ -373,7 +376,11 @@ typedef enum
CON_GET_WANT_RIPANSI, CON_TITLE, CON_PRESS_ENTER,
CON_WAIT_1, CON_WAIT_2, CON_WAIT_3,
CON_ACCEPTED, CON_GET_PKILL, CON_READ_IMOTD,
- CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING
+ CON_COPYOVER_RECOVER, CON_PLAYING = 0, CON_EDITING,
+ 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;
/*
@@ -401,6 +408,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;
@@ -3222,6 +3230,8 @@ extern CHAR_DATA *quitting_char;
extern CHAR_DATA *loading_char;
extern CHAR_DATA *saving_char;
extern OBJ_DATA *all_obj;
+extern ACCOUNT_DATA *first_account;
+extern ACCOUNT_DATA *last_account;
extern time_t current_time;
extern bool fLogAll;
@@ -3835,6 +3845,7 @@ DECLARE_SPELL_FUN( spell_cure_addiction
*/
#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 */
@@ -4397,7 +4408,7 @@ void check_requests args( ( void ) );
void write_corpses( CHAR_DATA * ch, const char *name );
void save_char_obj args( ( CHAR_DATA * ch ) );
void save_clone 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 swrfuss/src//save.c swrfussdev/src//save.c
--- swrfuss/src//save.c 2009-04-12 06:39:25.000000000 -0400
+++ swrfussdev/src//save.c 2009-07-20 05:24:03.000000000 -0400
@@ -694,7 +694,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 swrfuss/src//startup swrfussdev/src//startup
--- swrfuss/src//startup 2008-12-18 17:19:03.000000000 -0500
+++ swrfussdev/src//startup 2009-07-20 04:40:02.000000000 -0400
@@ -1,7 +1,7 @@
#! /bin/csh -f
# Set the port number.
-set port = 4020
+set port = 5555
if ( "$1" != "" ) set port="$1"
# Change to area directory.