/**************************************************************************/
// support.cpp - see below
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with the dawn license *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
**************************************************************************/
/***************************************************************************
* FILE: support.cpp - Code primarily relating to jobs support does. *
* - letgaining code
* - lethero code
* - automated letgaining code.. etc.
***************************************************************************/
#include "include.h"
#include "support.h"
#include "olc.h"
#include "channels.h"
// prototypes
letgain_data *find_letgain( char *name);
void save_letgain_db( void);
/**************************************************************************/
void do_letgain( char_data *ch, char *argument )
{
char arg[MIL],buf[MSL];
char_data *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
ch->println("Letgain whom?");
return;
}
if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if ( IS_LETGAINED(victim) )
{
ch->println("They can gain levels and exp already.");
// give them a permit - incase we ban later
SET_BIT(victim->act,PLR_PERMIT);
}
else
{
SET_BIT(victim->act, PLR_CAN_ADVANCE);
if (IS_SILENT(ch))
{
victim->println("You have been letgained by an anonymous immortal/noble!");
sprintf(buf,"$N silently gives %s the ability to progress.",victim->name);
wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
ch->println("They can now progress. - silent letgain - (pfile automatically updated)");
}
else
{
victim->printlnf("You have been letgained by %s!", ch->name);
sprintf(buf,"$N gives %s the ability to progress.",victim->name);
wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
ch->println("They can now progress. (pfile automatically updated)");
}
victim->println("`RMake sure you have read HELP PKILL - as if you kill another player");
victim->println("`Rfor ooc reasons the moot can be -500 xp or higher!");
// give them a permit - incase we ban someone from their site later
SET_BIT(victim->act,PLR_PERMIT);
}
save_char_obj( victim );
// check the offline letgain database if it needs updating
{
letgain_data *node;
// find the node
node=find_letgain(victim->name);
if (node){
// update the node
REMOVE_BIT(node->flags, LETGAIN_REQUESTED);
SET_BIT(node->flags, LETGAIN_GRANTED);
REMOVE_BIT(node->flags, LETGAIN_PENDING);
replace_string(node->answered_by,TRUE_CH(ch)->name);
replace_string(node->granted_short,victim->short_descr);
node->granted_moot=-1;
node->granted_date=current_time;
save_letgain_db();
}
}
return;
}
/**************************************************************************/
void do_lethero( char_data *ch, char *argument )
{
char arg[MIL],buf[MSL];
char_data *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
ch->println("Lethero whom?");
return;
}
if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if ( IS_SET(victim->act, PLR_CAN_HERO) )
{
ch->println("They can hero already.");
}
else
{
SET_BIT(victim->act, PLR_CAN_HERO);
victim->println("You have been lethero'ed!!!");
sprintf(buf,"$N gives %s the ability to progress to HERO!!!",victim->name);
wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
}
ch->println("They can now obtain level hero - (pfile automatically updated)");
save_char_obj( victim );
return;
}
/**************************************************************************/
void do_nsupport( char_data *ch, char *argument )
{
char arg[MIL];
char_data *victim;
if (!IS_ADMIN(ch)
&& !IS_SET(TRUE_CH(ch)->pcdata->council, COUNCIL_HEADSUPPORT))
{
ch->println("Newbie support can only be used by admin or headsupport.");
return;
}
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
ch->println("Set as newbie support on whom?");
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if(IS_IMMORTAL(victim)){
ch->println("Immortals automatically hear newbietalk and can help newbies.");
return;
}
if ( IS_SET(victim->comm, COMM_NEWBIE_SUPPORT) )
{
REMOVE_BIT(victim->comm, COMM_NEWBIE_SUPPORT);
ch->printlnf("Newbie support turned off for %s.", PERS(victim, ch));
}else{
SET_BIT(victim->comm, COMM_NEWBIE_SUPPORT);
ch->printlnf("Newbie support turned on for %s.", PERS(victim, ch));
}
save_char_obj( victim );
return;
}
/**************************************************************************/
void do_unletgain( char_data *ch, char *argument )
{
char arg[MIL],buf[MSL];
char_data *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
ch->println("Unletgain whom?");
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if ( !IS_LETGAINED(victim) )
{
ch->println("They haven't been letgained yet.");
}
else
{
REMOVE_BIT(victim->act, PLR_CAN_ADVANCE);
victim->println("You are no longer letgained!");
ch->println("They are no longer letgained.");
sprintf(buf,"$N removes %s the ability to progress.",victim->name);
wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
// remove their ban permit just incase
REMOVE_BIT(victim->act,PLR_PERMIT);
}
save_char_obj( victim );
return;
}
/**************************************************************************/
void do_unlethero( char_data *ch, char *argument )
{
char arg[MIL],buf[MSL];
char_data *victim;
one_argument( argument, arg );
if ( arg[0] == '\0' )
{
ch->println("Unlethero whom?");
return;
}
if ( ( victim = get_char_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if ( !IS_SET(victim->act, PLR_CAN_HERO) )
{
ch->println("They haven't been lethero'ed yet.");
}
else
{
REMOVE_BIT(victim->act, PLR_CAN_HERO);
victim->println("You are no longer lethero'ed!");
ch->println("They are no longer lethero'ed.");
sprintf(buf,"$N removes %s the ability to progress to hero!",victim->name);
wiznet(buf,ch,NULL,WIZ_PENALTIES,WIZ_SECURE,0);
}
save_char_obj( victim );
return;
}
/**************************************************************************/
void do_checkhelp( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("NOHELP INFO"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " NO_HELP_FILE );
add_buf(output, "\r\n You can select the number of loglines, type checkhelp <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " NO_HELP_FILE);
}
else
{
sprintf(buf, "tail -n %d " NO_HELP_FILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the error "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " NO_HELP_FILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_checkooc( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("OOC LOGFILE"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " OOC_LOGFILE);
add_buf(output, "\r\n You can select the number of loglines, type checkooc <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " OOC_LOGFILE );
}
else
{
sprintf(buf, "tail -n %d " OOC_LOGFILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the ooc "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " OOC_LOGFILE);
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
sprintf( buf2,"Current time: %s Your Login Time: %s\r\n",
shorttime(NULL), shorttime(&ch->logon));
add_buf(output,buf2);
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_checkmoblog( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("MOBLOG LOGFILE"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " MOBLOG_LOGFILE);
add_buf(output, "\r\n You can select the number of loglines, type checkmoblog <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " MOBLOG_LOGFILE );
}
else
{
sprintf(buf, "tail -n %d " MOBLOG_LOGFILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the moblog "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " OOC_LOGFILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_checknsupport( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
if (!IS_ADMIN(ch)
&& !IS_SET(TRUE_CH(ch)->pcdata->council, COUNCIL_HEADSUPPORT)
&& !IS_SET(TRUE_CH(ch)->pcdata->council, COUNCIL_HEADLAW))
{
ch->println("Checknsupport can only be used by the support and law councils or admin.");
return;
}
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("NSUPPORT LOGFILE"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " NEWBIE_SUPPORT_LOG_FILE );
add_buf(output, "\r\n You can select the number of loglines, type checknsupport <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " NEWBIE_SUPPORT_LOG_FILE );
}
else
{
sprintf(buf, "tail -n %d " NEWBIE_SUPPORT_LOG_FILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the nsupport "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " NEWBIE_SUPPORT_LOG_FILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_telnetga(char_data *ch, char *)
{
if (IS_NPC(ch))
return;
if (IS_SET(ch->comm,COMM_TELNET_GA))
{
ch->println("Telnet GA (Go Ahead) is no longer sent.");
REMOVE_BIT(ch->comm,COMM_TELNET_GA);
}
else
{
ch->println("Telnet GA (Go Ahead) is now sent.");
SET_BIT(ch->comm,COMM_TELNET_GA);
}
}
/**************************************************************************/
void do_checkntalk( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("NTALK LOGFILE"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " NTALK_LOGFILE );
add_buf(output, "\r\n You can select the number of loglines, type checkntalk <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " NTALK_LOGFILE );
}
else
{
sprintf(buf, "tail -n %d " NTALK_LOGFILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the error "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " NTALK_LOGFILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_checktypos( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("TYPO INFO"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " TYPO_FILE);
add_buf(output, "\r\n You can select the number of loglines, type checktypo <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " TYPO_FILE );
}
else
{
sprintf(buf, "tail -n %d " TYPO_FILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the error "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " TYPO_FILE);
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
// create skill_type GIO lookup table
GIO_START(letgain_data)
GIO_STRH(name, "Name ")
GIO_INTH(id, "Id ")
GIO_STRH(current_short, "Current_short ")
GIO_STRH(requested_short, "Req_short ")
GIO_STRH(requested_long, "Req_long ")
GIO_INTH(requested_date, "Req_date ")
GIO_SHINTH(requested_level, "Req_level ")
GIO_SHINTH(requested_alliance, "Req_alliance ")
GIO_SHINTH(requested_tendency, "Req_tendency ")
GIO_WFLAGH(flags, "Flags " , letgain_db_flags)
GIO_STRH(answered_by, "Answered_by ")
GIO_INTH(granted_date, "Grant_date ")
GIO_SHINTH(granted_moot, "Grant_moot ")
GIO_STRH(granted_short, "Grant_short ")
GIO_STRH(granted_long, "Grant_long ")
GIO_INTH(letgain_date, "Letgain_date ")
GIO_STRH(denied_reason, "Denied_Reason ")
GIO_STRH(history, "History ")
GIO_FINISH
/**************************************************************************/
// loads in the letgain database
void load_letgain_db( void)
{
logf("===Loading letgain database from %s...", LETGAINDB_FILE);
if(file_exists(LETGAINDB_FILE)){
GIOLOAD_LIST(letgain_list, letgain_data, LETGAINDB_FILE);
}else{
logf("Letgain database file not present - this is normal if no "
"players have requested on offline letgain yet.");
}
log_string ("load_letgain_db(): finished");
}
/**************************************************************************/
// saves the letgain database
void save_letgain_db( void)
{
logf("===Saving letgain database to %s.", LETGAINDB_FILE);
GIOSAVE_LIST(letgain_list, letgain_data, LETGAINDB_FILE, true);
logf("Letgain DB save completed.");
}
/**************************************************************************/
// returns a pointer to a letgain node
letgain_data *find_letgain( char *name)
{
letgain_data *node;
for (node = letgain_list; node; node= node->next){
if(!str_cmp(name,node->name)){
return node;
}
}
return NULL;
}
/**************************************************************************/
// lists letgains
void do_list_letgains( char_data *ch, char *argument )
{
letgain_data *node;
int count;
if(!IS_NULLSTR(argument))
{
ch->titlebar("LIST LETGAINS - DETAILS");
for (node = letgain_list;
node && str_cmp(node->name,argument);
node= node->next)
{
}
if(node){
ch->printlnf("`=RName: `=r%s", node->name);
ch->printlnf("`=RCreated: `=r%-24.24s", (char*)ctime((time_t*)&node->id));
if(!IS_NULLSTR(node->answered_by)){
ch->printlnf("`=RAnswered By: `=r%s", node->answered_by);
}
ch->printlnf("`=RShort at time of requesting: `x%s",
!IS_NULLSTR(node->current_short)?node->current_short:"(none)");
if(!IS_NULLSTR(node->requested_long)){
ch->printlnf("`=RLong at time of requesting: `x\r\n%s",
node->requested_long);
}else{
ch->println("`=RLong at time of requesting: `x(none)");
}
ch->printlnf("`=RLevel at time of requesting: `x%d",
node->requested_level);
ch->printlnf("`=RAlliance at time of requesting: `x%d",
node->requested_alliance);
ch->printlnf("`=RTendency at time of requesting: `x%d",
node->requested_tendency);
ch->printlnf("`=RRequested Short: `x%s",
!IS_NULLSTR(node->requested_short)?node->requested_short:"(none)");
if(!IS_NULLSTR(node->granted_short))
ch->printlnf("`=RGranted short: `=r%s", node->granted_short);
ch->printlnf("`=RGranted Moot: `=r%d", node->granted_moot);
if(!IS_NULLSTR(node->denied_reason)){
ch->println("`=RReason given for declining: `=r");
ch->wrapln(node->denied_reason);
}
ch->printlnf("`=RFlags: `x%s", flag_string( letgain_db_flags, node->flags) );
if(node->letgain_date)
ch->printlnf("`=Rletgain date: `=R%-24.24s", (char*)ctime(&node->letgain_date));
}else{
ch->printlnf("couldn't find any '%s' in the letgain database.",
argument);
}
return;
}
ch->titlebar("LIST LETGAINS");
ch->titlebar("requested");
ch->printlnf(" %-13s lvl %s", "name", "date");
count=0;
for (node = letgain_list; node; node= node->next){
if(IS_SET(node->flags, LETGAIN_REQUESTED)){
ch->printlnf("`x%-2d> %-13s`S-`G%2d`x%-19.19s`S-`B%s`x",
++count, node->name, node->requested_level,
ctime( &node->requested_date),
node->requested_short);
}
}
ch->titlebar("accepted, waiting for login");
ch->printlnf(" %-13s %s moot_amount by", "name", "date");
count=0;
for (node = letgain_list; node; node= node->next){
if(node->requested_date< (current_time - (60*60*24*14))){
continue;
}
if(IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_GRANTED)){
ch->printlnf("%-2d> %-13s %-24.24s %4d %s",
++count, node->name,
ctime( &node->requested_date),
node->granted_moot,
node->answered_by);
}
}
ch->titlebar("declined, waiting for login");
ch->printlnf(" %-13s %s moot_amount by", "name", "date");
count=0;
for (node = letgain_list; node; node= node->next){
if(node->requested_date< (current_time - (60*60*24*14))){
continue;
}
if(IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_DECLINED)){
ch->printlnf("%-2d> %-13s %-24.24s %4d %s",
++count, node->name,
ctime( &node->requested_date),
node->granted_moot,
node->answered_by);
}
}
ch->titlebar("declined, waiting for reapplication");
ch->printlnf(" %-13s %s moot_amount by", "name", "date");
count=0;
for (node = letgain_list; node; node= node->next){
if(node->requested_date< (current_time - (60*60*24*14))){
continue;
}
if(!IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_DECLINED)){
ch->printlnf("%-2d> %-13s %-24.24s %4d %s",
++count, node->name,
ctime( &node->requested_date),
node->granted_moot,
node->answered_by);
}
}
ch->titlebar("accepted and letgained.");
ch->printlnf(" %-13s %s moot_amount by", "name", "date");
count=0;
for (node = letgain_list; node && count<=10; node= node->next){
if(!IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_GRANTED)){
ch->printlnf("%-2d> %-13s %-24.24s %4d %s",
++count, node->name,
ctime( &node->requested_date),
node->granted_moot,
node->answered_by);
}
}
ch->println("type listlet <playername> for more details on a single player.");
}
/**************************************************************************/
// handle accepted offline letgains
void do_offlineletgain( char_data *ch, char *argument )
{
letgain_data *node;
char name[MIL], amount[MIL];
int value;
argument = one_argument( argument, name);
argument = one_argument( argument, amount);
// trim the spaces to the right of the optional new name
while ( !IS_NULLSTR(argument) && is_space(argument[str_len(argument)-1]))
{
argument[str_len(argument)-1]='\0';
}
if(IS_NULLSTR(name) || IS_NULLSTR(amount) ){
ch->println("Syntax: offlineletgain <name> <moot amount> [new_short]");
ch->println(" new_short is an optional new short description.");
ch->println("use declineletgain to deny a letgain request.");
return;
}
if(!is_number(amount)){
ch->println("Syntax: offlineletgain <name> <moot amount> [new_short]");
ch->println(" new_short is an optional new short description.");
ch->println("Moot amount must be a number.");
return;
}
value=atoi(amount);
if(value<0 || value>4000){
ch->println("Moot value not in range 0 to 4000.");
return;
}
// find the node
node=find_letgain(name);
if (!node){
ch->printlnf("There is noone in the letgain database with a name of '%s'.",
name);
return;
}
// update the node
REMOVE_BIT(node->flags, LETGAIN_REQUESTED);
REMOVE_BIT(node->flags, LETGAIN_DECLINED);
SET_BIT(node->flags, LETGAIN_GRANTED);
SET_BIT(node->flags, LETGAIN_PENDING);
replace_string(node->answered_by,TRUE_CH(ch)->name);
replace_string(node->granted_short,argument);
node->granted_moot=value;
node->granted_date=current_time;
ch->printlnf("Offline letgain on %s granted with a %d moot.",
node->name, node->granted_moot);
save_letgain_db();
}
/**************************************************************************/
// decline letgain
void do_declineletgain( char_data *ch, char *argument )
{
letgain_data *node;
char name[MIL];
argument = one_argument( argument, name);
if(IS_NULLSTR(name) || IS_NULLSTR(argument) ){
ch->println("Syntax: declineletgain <name> <reason>");
ch->println("use offlineletgain to accept a letgain request.");
return;
}
if(is_number(argument)){
ch->println("Syntax: declineletgain <name> <reason>");
ch->println("The reason must be a text message.");
return;
}
// find the node
node=find_letgain(name);
if (!node){
ch->printlnf("There is noone in the letgain database with a name of '%s'.",
name);
return;
}
// update the node
REMOVE_BIT(node->flags, LETGAIN_REQUESTED);
REMOVE_BIT(node->flags, LETGAIN_GRANTED);
SET_BIT(node->flags, LETGAIN_DECLINED);
SET_BIT(node->flags, LETGAIN_PENDING);
replace_string(node->denied_reason,argument);
replace_string(node->answered_by, TRUE_CH(ch)->name);
node->granted_moot=0;
ch->printlnf("Offlinet letgain on %s `Rdeclined`x.", node->name);
save_letgain_db();
}
/**************************************************************************/
// used by players to request a letgain
void do_requestletgain( char_data *ch, char *argument )
{
letgain_data *node;
static letgain_data zero_node;
if ( IS_NPC(ch) )
{
ch->println("Players only sorry.");
return;
}
if ( IS_LETGAINED(ch) )
{
ch->println("You are already letgained.");
return;
}
if(IS_NULLSTR(argument)){
ch->println("syntax: requestletgain <short description>");
ch->println("e.g. `=Crequestletgain a tall elf with black hair`x");
ch->println("`RNOTE: BEFORE USING THIS COMMAND`x");
ch->wrapln("You should have a proper long description "
"(`=Chelp long`x), sent you history already (`=Chelp history`x), also "
"the short description you request must be suitable with "
"`=Chelp short`x... if `RANY`x of the above 3 things (long, history "
"and short) do them `RFIRST!!!`x.");
return;
}
// trim the spaces to the right of the short
while ( !IS_NULLSTR(argument) && is_space(argument[str_len(argument)-1]))
{
argument[str_len(argument)-1]='\0';
}
// check we have a short left
if(argument[0] == '\0' )
{
ch->println("You must put in a short description.");
do_requestletgain(ch,"");
return;
}
// make sure first char is lowercase
argument[0] = LOWER(argument[0]);
if (str_len(argument)>55){
ch->println("That short descriptions too LONG... try something shorter.");
return;
}
// find the node
node=find_letgain(TRUE_CH(ch)->name);
if (!node){
// add a new node to the head of the linked list
node=new letgain_data;
*node=zero_node;
node->next=letgain_list;
letgain_list=node;
replace_string(node->name,TRUE_CH(ch)->name);
}else{
// remove any things from the old letgain
replace_string(node->denied_reason,"");
ch->println("Updating letgain request with new info.");
}
REMOVE_BIT(node->flags, LETGAIN_GRANTED);
REMOVE_BIT(node->flags, LETGAIN_PENDING);
REMOVE_BIT(node->flags, LETGAIN_DECLINED);
SET_BIT(node->flags, LETGAIN_REQUESTED);
node->requested_date=current_time;
node->id=ch->id;
node->granted_moot=0;
node->requested_level=ch->level;
node->requested_alliance=ch->alliance;
node->requested_tendency=ch->tendency;
replace_string(node->requested_long, ch->description);
replace_string(node->requested_short, argument);
replace_string(node->current_short, ch->short_descr);
replace_string(node->requested_long, ch->description);
replace_string(node->granted_short, "");
replace_string(node->granted_long, "");
replace_string(node->answered_by, "");
ch->wraplnf("A letgain request has been put in for %s, "
"asking for the short description of '%s'",
ch->name,
node->requested_short);
ch->wrapln("`RNOTE: `xYou should have a proper long description "
"(`=Chelp long`x), sent you history already (`=Chelp history`x), and the "
"short description you have requested must be suitable with "
"`=Chelp short`x... if `RANY`x of the above 3 things (long, history "
"and short) have not been done or are incorrect type "
"`=Ccancelletgain`x now! and try again once you have done the 3 things.");
save_letgain_db();
}
/**************************************************************************/
// used by players to request a letgain
void do_cancelletgain( char_data *ch, char *)
{
letgain_data *node, *prev, *current;
if ( IS_NPC(ch) )
{
ch->println("Players only sorry.");
return;
}
if ( IS_LETGAINED(ch) )
{
ch->println("You are already letgained.");
return;
}
// find the node
node=find_letgain(TRUE_CH(ch)->name);
if (!node){
ch->println("You are not currently in the letgain database.");
return;
}else{
ch->println("Your request to be letgained has been canceled.");
if(node==letgain_list){ // remove from head
letgain_list=letgain_list->next;
}else{
prev=letgain_list;
for(current=letgain_list->next; current; current=current->next){
if(node==current)
break;
prev=current;
}
if(current){
prev->next=current->next;
delete current; // should deallocate the memory but who cares :)
}
}
}
}
/**************************************************************************/
void check_offline_letgain(char_data *ch)
{
letgain_data *node;
if ( IS_NPC(ch) ){
ch->println("check_offline_letgain should only be called on players.");
return;
}
if ( IS_LETGAINED(ch) ){
return;
}
// find them in the letgain database
node=find_letgain(ch->name);
if(!node){
return;
}
int autolet=game_settings->automatic_offlineletgain_after_x_days;
// unprocessed requests
if(IS_SET(node->flags, LETGAIN_REQUESTED)){
if(autolet>0 && (node->requested_date+ (autolet* 24*3600))<current_time){
// automatically letgain those who have requested the letgain
// ages ago.
REMOVE_BIT(node->flags, LETGAIN_REQUESTED);
SET_BIT(node->flags, LETGAIN_PENDING);
SET_BIT(node->flags,LETGAIN_GRANTED);
node->granted_moot=-2;
replace_string(node->answered_by, "(auto)");
ch->println("");
ch->wrapln("`YYou have been automatically letgained by the mud "
"because your request hasn't been processed by an immortal within the "
"required time.`1`RNote: This doesn't guarantee that your character "
"is acceptable, and some aspects of your character may have to be "
"changed at a later date.`x");
}else{
ch->println("");
ch->wrapln("`YThere is an unprocessed letgain request for your "
"character in the system... If you aren't automatically letgained "
"within 2 days of requesting a letgain, ask an immortal about it.`x");
ch->println("");
return;
}
}
if(!IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_DECLINED))
{
ch->println("");
ch->printf("`RWe currently have a declined letgain request in "
"the autoletgain database for your character... "
"It was declined with the following reason given:`x\r\n");
ch->wraplnf("`W%s`x\r\n", node->denied_reason);
ch->wrapln("`RYou are welcome to reapply using "
"the `=Crequestletgain`R command (once you have fixed what is ever necessary), "
"or use the `=Ccancelletgain`R command to stop this message appearing when you login.`x");
ch->println("");
return;
}
if(IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_DECLINED)){
ch->println("\r\n\r\n\r\n\r\n");
ch->printf("`RYour letgain request has been processed, "
"It was declined for the following reason:\r\n");
ch->wraplnf("`W%s`x", node->denied_reason);
ch->wrapln("`RYou are welcome to reapply using "
"the `=Crequestletgain`R command (once you have fixed what is ever necessary), "
"or use the `=Ccancelletgain`R command to stop this message appearing when you login.`x");
ch->println("");
REMOVE_BIT(node->flags, LETGAIN_PENDING);
save_letgain_db();
return;
}
if(IS_SET(node->flags, LETGAIN_PENDING)
&& IS_SET(node->flags,LETGAIN_GRANTED))
{// letgain them
SET_BIT(ch->act, PLR_CAN_ADVANCE);
REMOVE_BIT(node->flags, LETGAIN_PENDING);
logf("check_offline_letgain(): Letgaining %s\n",ch->name);
if(node->granted_moot!=-2){
ch->println("\r\n\r\n\r\n\r\n");
}
ch->println("`BCongratulations!`x You have been letgained while you were offline!");
if(node->granted_moot>0){
ch->printlnf("`GFor your efforts you were granted a rps experience bonus of %d!`x",
node->granted_moot);
gain_exp(ch, node->granted_moot);
ch->pcdata->rp_points+=node->granted_moot;
}
// only update their short description if they haven't had it changed since they
// started the letgain process.
if(!str_cmp(ch->short_descr, node->current_short))
{
if(!IS_NULLSTR(node->granted_short)){
replace_string(ch->short_descr, node->granted_short);
ch->wraplnf("`MYour short description has been changed to '`x%s`M'`x",
ch->short_descr);
}else{
replace_string(ch->short_descr, node->requested_short);
if(node->granted_moot==-2){ // automated letgain
ch->wraplnf("`YThe short description has been "
"changed to '`x%s`Y'`x", ch->short_descr);
}else{
ch->wraplnf("`YThe short description you requested was accepted and "
"your short therefore has been changed to '`x%s`Y'`x",
ch->short_descr);
}
}
}
ch->println("");
REMOVE_BIT(node->flags, LETGAIN_PENDING);
save_letgain_db();
return;
}
}
/**************************************************************************/
// used by imms to clear a letgain record
void do_clearletgain( char_data *ch, char *argument )
{
letgain_data *node, *prev, *current;
if ( IS_NPC(ch) )
{
ch->println("Players only sorry.");
return;
}
if(IS_NULLSTR(argument)){
ch->println("Syntax: clearletgain <playername>");
ch->println("This removes their entry from the letgain database.");
return;
}
// find the node
node=find_letgain(argument);
if (!node){
ch->printlnf("'%s' is not currently in the letgain database.", argument);
return;
}else{
ch->printlnf("'%s' has been removed from the letgain database.", argument);
if(node==letgain_list){ // remove from head
letgain_list=letgain_list->next;
}else{
prev=letgain_list;
for(current=letgain_list->next; current; current=current->next){
if(node==current)
break;
prev=current;
}
if(current){
prev->next=current->next;
delete current; // should deallocate the memory but who cares :)
}
}
}
}
/**************************************************************************/
void do_charnotes( char_data *ch, char *argument )
{
char_data *victim;
int diff;
char arg[MIL], buf[MSL], fbuf[MSL], tbuf[MIL];
if (!IS_IMMORTAL(ch))
{
do_huh(ch,"");
return;
}
argument = one_argument( argument, arg );
if(IS_NULLSTR(arg))
{
ch->println("Syntax: charnotes <playername>");
ch->println("Use this command to view a characters notes - use editcharnotes to edit.");
return;
}
if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
// display the info
ch->println("`s=============================================================================`x");
sprintf (tbuf,"%d",victim->level);
sprintf (buf, "`=r(Letgained: `x%s `=rLevel: `x%s `=rRace: `x%s `=rClass: `x%s`=r)",
(IS_LETGAINED(victim)?"y":"n"),
(IS_IMMORTAL(ch) || victim==ch)?tbuf:"?",
race_table[victim->race]->name,
class_table[victim->clss].name);
diff= 69 + str_len(buf);
diff-= c_str_len(buf); // how many colour codes in string
diff-= str_len(victim->name);
sprintf (fbuf, "`=rCharnotes: `x%s %%%ds`x\r\n", victim->name, diff);
sprintf(tbuf,fbuf,buf);
diff= c_str_len(tbuf);
// reformat if too long
if (diff>79)
{
sprintf (tbuf,"%d",victim->level);
sprintf (buf, "`=r(LGed: `x%s `=rLevel: `x%s `=rRace: `x%s `=rClass: `x%s`=r)",
(IS_LETGAINED(victim)?"y":"n"),
(IS_IMMORTAL(ch) || victim==ch)?tbuf:"?",
race_table[victim->race]->name,
class_table[victim->clss].name);
diff= 69 + str_len(buf);
diff-= c_str_len(buf); // how many colour codes in string
diff-= str_len(victim->name);
sprintf (fbuf, "`=rCharnotes: `x%s %%%ds`x\r\n", victim->name, diff);
sprintf(tbuf,fbuf,buf);
}
ch->print(tbuf);
ch->println("`s=============================================================================`x");
ch->printlnf("`=rShort description: `=R%s`x", victim->short_descr);
ch->printf("`=rNotes: `=R%s%s`x",
IS_NULLSTR(victim->pcdata->charnotes)? "" : "\r\n",
IS_NULLSTR(victim->pcdata->charnotes)? "(none)\r\n":victim->pcdata->charnotes);
ch->println("`s=============================================================================`x");
}
/**************************************************************************/
void do_editcharnotes( char_data *ch, char *argument )
{
char_data *victim;
char arg[MIL];
if (!IS_IMMORTAL(ch))
{
do_huh(ch,"");
return;
}
argument = one_argument( argument, arg );
if(IS_NULLSTR(arg))
{
ch->println("Syntax: editcharnotes <playername>");
ch->println("Use this command to edit a characters notes - use charnotes to view.");
return;
}
if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if ((get_trust(victim)>= get_trust(ch))&& (ch != victim))
{
ch->println("You can't edit charnotes on someone a higher level or equal to you.");
return;
}
string_append(ch, &victim->pcdata->charnotes);
return;
}
/**************************************************************************/
int race_lookup (const char *name);
/**************************************************************************/
void do_dlook( char_data *ch, char *argument )
{
char arg[MIL], buf[MSL], fbuf[MSL], tbuf[MIL];
char_data *victim;
int diff;
one_argument( argument, arg );
if (!IS_NOBLE(ch) && !IS_IMMORTAL(ch) || arg[0] == '\0')
{
victim= ch;
}
else
{
if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL )
{
ch->println("They aren't here.");
return;
}
if ( IS_NPC(victim) )
{
ch->println("Not on NPC's.");
return;
}
if ( !IS_IMMORTAL(ch) && IS_ICIMMORTAL(victim))
{
ch->println("You can't dlook immortals sorry.");
return;
}
}
// display the info
ch->println("`s=============================================================================`x");
// prevent seeing non creation selectable races etc for others from nonimms
int race_value=victim->race;
if(!IS_IMMORTAL(ch) && victim!=ch){
if(!race_table[race_value]->creation_selectable()){
race_value=race_lookup("human");
}
}
sprintf (tbuf,"%d",victim->level);
sprintf (buf, "`=r(Letgained: `x%s `=rLevel: `x%s `=rRace: `x%s `=rClass: `x%s`=r)",
(IS_LETGAINED(victim)?"y":"n"),
(IS_IMMORTAL(ch) || victim==ch)?tbuf:"?",
race_table[race_value]->name,
class_table[victim->clss].name);
diff= 69 + str_len(buf);
diff-= c_str_len(buf); // how many colour codes in string
diff-= str_len(victim->name);
sprintf (fbuf, "`=rDlook: `x%s %%%ds`x\r\n",
mxp_create_tag(ch, FORMATF("ch-uid_name %d", victim->uid), victim->name), diff);
sprintf(tbuf,fbuf,buf);
diff= c_str_len(tbuf);
// reformat if too long
if (diff>79)
{
sprintf (tbuf,"%d",victim->level);
sprintf (buf, "`=r(LGed: `x%s `=rLevel: `x%s `=rRace: `x%s `=rClass: `x%s`=r)",
(IS_LETGAINED(victim)?"y":"n"),
(IS_IMMORTAL(ch) || victim==ch)?tbuf:"?",
race_table[victim->race]->name,
class_table[victim->clss].name);
diff= 69 + str_len(buf);
diff-= c_str_len(buf); // how many colour codes in string
diff-= str_len(victim->name);
sprintf (fbuf, "`=rDlook: `x%s %%%ds`x\r\n",
mxp_create_tag(ch, FORMATF("ch-uid_name %d", victim->uid), victim->name)
, diff);
sprintf(tbuf,fbuf,buf);
}
ch->print(tbuf);
ch->println("`s=============================================================================`x");
// nobles and imms can see other's alliance/tendency
if (( IS_IMMORTAL(ch) || IS_NOBLE(ch)) && ch != victim ) {
ch->printlnf( "`=rAlliance: `x%d `=rTendency: `x%d",
victim->alliance, victim->tendency );
ch->println( "`s========================================="
"====================================`x" );
}
ch->printlnf("`=rShort description: `=R%s`x", victim->short_descr);
ch->printf("`=rLong description: `=R%s%s`x",
IS_NULLSTR(victim->description)? "" : "\r\n",
IS_NULLSTR(victim->description)? "(none)\r\n":victim->description);
ch->println("`s=============================================================================`x");
if ((IS_NOBLE(ch) || IS_IMMORTAL(ch)) && arg[0] == '\0' )
{
ch->println("`x You can see someone elses description by typing `=Cdlook <playername>`x");
ch->println("`s=============================================================================`x");
}
if(!IS_NPC(ch)){
ch->printf("`=rCharacter History: `=R%s%s`x",
IS_NULLSTR(victim->pcdata->history)? "" : "\r\n",
IS_NULLSTR(victim->pcdata->history)? "(none)\r\n":victim->pcdata->history);
ch->println("`s=============================================================================`x");
}
}
/**************************************************************************/
void do_checkmultilog( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("MULTILOG RECORDS"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " MULTILOG_FILE );
add_buf(output, "\r\n You can select the number of loglines, type checkmultilog <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " MULTILOG_FILE );
}
else
{
sprintf(buf, "tail -n %d " MULTILOG_FILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " MULTILOG_FILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
// display the coding log
#define CODELOG_FILE CODE_LOGS_DIR "code.txt"
void do_checkcode( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("CODING LOG"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail " CODELOG_FILE " -n 20");
add_buf(output, "\r\n You can select the number of loglines, type checkcode <number of lines>");
add_buf(output, "\r\n (A maximum of 40 lines will be displayed at any given time)");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " CODELOG_FILE );
}
else
{
sprintf(buf, "tail -n %d " CODELOG_FILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the error "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " CODELOG_FILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_checknewbie( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("NEWBIETALK LOGFILE"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " NEWBIE_LOGFILE );
add_buf(output, "\r\n You can select the number of loglines, type checknewbie <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " NEWBIE_LOGFILE );
}
else
{
sprintf(buf, "tail -n %d " NEWBIE_LOGFILE " | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " NEWBIE_LOGFILE );
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_bardify( char_data *ch, char *argument )
{
char arg1[MIL];
char_data *victim;
argument = one_argument( argument, arg1 );
if ( arg1[0] == '\0')
{
ch->println( "Syntax: bardify <player>" );
return;
}
if ( ( victim = get_char_world( ch, arg1 ) ) == NULL )
{
ch->println( "They aren't playing." );
return;
}
if ( IS_NPC( victim ))
{
ch->println( "You can't bardify an NPC!" );
return;
}
if ( HAS_CONFIG( victim, CONFIG_BARD_COUNCIL ))
{
REMOVE_CONFIG( victim, CONFIG_BARD_COUNCIL );
ch->printlnf( "%s is no longer in the Bard Council.", victim->name );
}
else
{
SET_CONFIG( victim, CONFIG_BARD_COUNCIL );
ch->printlnf( "%s is now in the Bard Council.", victim->name );
}
save_char_obj(victim);
return;
}
/**************************************************************************/
// equips a character, updated for dawn 1.7 by Kal
// set to MAX_LEVEL by default
void do_outfit( char_data *ch, char *)
{
OBJ_DATA *obj;
OBJ_INDEX_DATA *objindex;
int i,sn,vnum;
bool equiped=false;
if(GAMESETTING(GAMESET_OUTFIT_DISABLED)){
ch->println("Sorry, the outfit command is unavailable.");
return;
}
if (!IS_NEWBIE(ch)|| IS_NPC(ch)){
ch->println("Outfit can only be used while you are a newbie.");
return;
}
// a light
if ( ( obj = get_eq_char( ch, WEAR_LIGHT ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_LIGHT;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_LIGHT );
equiped=true;
ch->println("You have mysteriously been equipped with a light.");
}else{
logf("do_outfit(): couldn't find light vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit light object vnum %d, "
"report to admin if you want this fixed.", vnum);
}
}
}
// about body
if ( ( obj = get_eq_char( ch, WEAR_TORSO ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_VEST;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_TORSO );
equiped=true;
ch->println("You have mysteriously been equipped with something for the body.");
}else{
logf("do_outfit(): couldn't find vest vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit vest object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// sleeves
if ( ( obj = get_eq_char( ch, WEAR_ARMS ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_SLEEVES;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_ARMS );
equiped=true;
ch->println("You have mysteriously been equipped with something for the arms.");
}else{
logf("do_outfit(): couldn't find sleeves vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit sleeves object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// cap
if ( ( obj = get_eq_char( ch, WEAR_HEAD ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_CAP;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_HEAD );
equiped=true;
ch->println("You have mysteriously been equipped with something for the head.");
}else{
logf("do_outfit(): couldn't find cap vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit cap object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// gloves
if ( ( obj = get_eq_char( ch, WEAR_HANDS ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_GLOVES;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_HANDS );
equiped=true;
ch->println("You have mysteriously been equipped with something for the hands.");
}else{
logf("do_outfit(): couldn't find gloves vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit gloves object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// leggings
if ( ( obj = get_eq_char( ch, WEAR_LEGS ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_LEGGINGS;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_LEGS );
equiped=true;
ch->println("You have mysteriously been equipped with something for the legs.");
}else{
logf("do_outfit(): couldn't find leggings vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit leggings object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// boots
if ( ( obj = get_eq_char( ch, WEAR_FEET ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_BOOTS;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_FEET );
equiped=true;
ch->println("You have mysteriously been equipped with something for the feet.");
}else{
logf("do_outfit(): couldn't find boots vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit boots object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// belt
if ( ( obj = get_eq_char( ch, WEAR_WAIST ) ) == NULL ){
vnum=OBJ_VNUM_OUTFIT_BELT;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_WAIST );
equiped=true;
ch->println("You have mysteriously been equipped with something for the waist.");
}else{
logf("do_outfit(): couldn't find belt vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit belt object vnum %d, "
"report to admin if you want this fixed..", vnum);
}
}
}
// do the weapon thing
if ((obj = get_eq_char(ch,WEAR_WIELD)) == NULL)
{
sn = 0;
vnum = OBJ_VNUM_OUTFIT_SWORD; // just in case!
for (i = 0; weapon_table[i].name != NULL; i++)
{
if (weapon_table[i].gsn
&& ch->pcdata->learned[sn] < ch->pcdata->learned[*weapon_table[i].gsn])
{
sn=*weapon_table[i].gsn;
if(weapon_table[i].vnum_offset>=0){
vnum=*((int*)(((char*) game_settings)+(weapon_table[i].vnum_offset)));
}
}
}
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object(objindex);
obj_to_char(obj,ch);
equip_char(ch,obj,WEAR_WIELD);
equiped=true;
ch->println("You have mysteriously been equipped with a weapon.");
}else{
logf("do_outfit(): couldn't find weapon object vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit weapon object vnum %d, "
"report to admin if you want this fixed.", vnum);
}
}
}
if (((obj = get_eq_char(ch,WEAR_WIELD)) == NULL
|| !IS_WEAPON_STAT(obj,WEAPON_TWO_HANDS))
&& (obj = get_eq_char( ch, WEAR_SHIELD ) ) == NULL
&& (obj = get_eq_char( ch, WEAR_SECONDARY) ) == NULL )
{
vnum=OBJ_VNUM_OUTFIT_SHIELD;
objindex=get_obj_index(vnum);
if(objindex){
obj = create_object( objindex);
obj->cost = 0;
obj_to_char( obj, ch );
equip_char( ch, obj, WEAR_SHIELD );
equiped=true;
ch->println("You have mysteriously been equipped with a shield.");
}else{
logf("do_outfit(): couldn't find shield vnum %d", vnum);
if(GAMESETTING4(GAMESET4_REPORT_MISSING_OUTFIT_ITEMS_TO_PLAYERS)){
ch->wraplnf("We can't seem to find the outfit shield object vnum %d, "
"report to admin if you want this fixed.", vnum);
}
}
}
if(!equiped){
ch->println("You already have all the equipment that outfit can give you.");
}
}
/**************************************************************************/
// displays the clan banking log
void do_checkclanbank( char_data *ch, char *argument)
{
char buf[MSL], buf2[MSL];
char arg1 [MIL];
BUFFER *output;
output= new_buf();
sprintf( buf,"`?%s`x", makef_titlebar("CLANBANKING INFO"));
add_buf(output,buf);
// now display the specified number of lines of the log file.
argument = one_argument( argument, arg1 );
if (IS_NULLSTR(arg1))
{
sprintf(buf, "tail -n 10 " CLANBANKING_FILE);
add_buf(output, "\r\n You can select the number of loglines, type checkclanbank <number of lines>");
}
else if (is_number ( arg1 ))
{
int value = atoi(arg1);
if (value<1 || value>20000)
{
add_buf(output,"\r\n`RNumber of lines to tail must be between 1 and 20000.`x\r\n");
sprintf(buf, "tail -n 10 " CLANBANKING_FILE);
}
else
{
sprintf(buf, "tail -n %d " CLANBANKING_FILE" | head -n 40", value);
}
}
else
{
add_buf(output, "\r\n`RThe only parameter for this command must be a "
"numeric value\r\nfor the number of lines of the error "
"log you wish to see.`x\r\n");
sprintf(buf, "tail -n 10 " CLANBANKING_FILE);
}
sprintf( buf2,"\r\n`^%s`x", makef_titlebar("Piping:`x %s", buf));
add_buf(output,buf2);
add_buf(output,get_piperesult(buf));
ch->sendpage(buf_string(output));
free_buf(output);
return;
}
/**************************************************************************/
void do_continue( char_data *ch, char *argument )
{
// do nothing, this function is used to absorb the word continue
return;
}
/**************************************************************************/
void do_hlook( char_data *ch, char *argument )
{
char arg[MIL];
char_data *victim;
one_argument( argument, arg );
if(!IS_IMMORTAL(ch)){
victim=ch;
}else if(IS_NULLSTR(arg)){
ch->println("Use `=Chlook self`x to view your own history.");
ch->println("Use `=Chlook <playername>`x to view anothers history.");
return;
}else if ( ( victim = get_whovis_player_world( ch, arg ) ) == NULL ){
ch->printlnf("'%s' isn't here.", arg);
return;
}
if ( IS_NPC(victim) ){
ch->println("Not on NPC's.");
return;
}
// display the info
ch->println("`s=============================================================================`x");
ch->printlnf("`=rPlayer Name: `=R%s`x", victim->name);
ch->printlnf("`=rCharacter History: `=R%s%s`x",
IS_NULLSTR(victim->pcdata->history)? "" : "\r\n",
IS_NULLSTR(victim->pcdata->history)? "(none)":victim->pcdata->history);
ch->println("`s=============================================================================`x");
}
/**************************************************************************/
/**************************************************************************/