/*~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~- ~ Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, ~ ~ Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. ~ ~ ~ ~ Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael ~ ~ Chastain, Michael Quan, and Mitchell Tse. ~ ~ ~ ~ Ack 2.2 improvements copyright (C) 1994 by Stephen Dooley ~ ~ ACK!MUD is modified Merc2.0/2.1/2.2 code (c)Stephen Zepp 1998 Ver: 4.3 ~ ~ ~ ~ In order to use any part of this PA Diku Mud, you must comply with ~ ~ both the original Diku license in 'license.doc' as well the Merc ~ ~ license in 'license.txt', and the Ack!Mud license in 'ack_license.txt'.~ ~ In particular, you may not remove any of these copyright notices. ~ ~ ~ ~ _______ _____ ~ ~ / __ /\ / ___ \ 222222 PA_MUD by Amnon Kruvi ~ ~ /______/ / / /___\ \ 2 PA_MUD is modified ~ ~ / _______/ / _______ \ 2 Ack!Mud, v4.3 ~ ~ /_/ /_/ \_\ 2 ~ ~ 2 ~ ~ 2222222 ~ ~ ~ ~ ~ ~ Years of work have been invested to create DIKU, Merc, Ack and PA. ~ ~ Please show your respect by following the licenses, and issuing ~ ~ credits where due. ~ ~ ~ ~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-~-*/ #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <assert.h> #include <unistd.h> #include <string.h> #include "ack.h" #include "tables.h" #include <math.h> #include <ctype.h> void do_sdelete( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA *d; char strsave[MAX_INPUT_LENGTH]; char arg1[MAX_INPUT_LENGTH]; char *pArg; char cEnd; char buf[MAX_INPUT_LENGTH]; int min,i; if ( ch->pcdata->queue ) return; if ( ch->fighttimer > 0 ) { send_to_char( "Not while you're fighting!\n\r", ch ); return; } strcpy(buf,ch->name); sprintf( strsave, "%s%s%s%s", PLAYER_DIR, initial( buf ), "/", capitalize( buf ) ); pArg = arg1; while ( isspace(*argument) ) argument++; cEnd = ' '; if ( *argument =='\'' || *argument == '"' ) cEnd = *argument++; while ( *argument != '\0' ) { if ( *argument == cEnd ) { argument++; break; } *pArg++ = *argument++; } *pArg = '\0'; if ( ( ch->pcdata->pwd != '\0' ) && ( arg1[0] == '\0' ) ) { send_to_char( "Syntax: pdelete (password)\n\r", ch ); return; } if ( ( ch->pcdata->pwd != '\0' ) && ( strcmp( crypt( arg1, ch->pcdata->pwd ), ch->pcdata->pwd ) ) ) { WAIT_STATE( ch, 40 ); send_to_char( "Wrong password. Wait 10 seconds.\n\r", ch ); sprintf( buf, "%s attempted to pdelete, but used the wrong password!", ch->name ); log_f( buf ); return; } if ( ch->pcdata->alliance != -1 ) { if ( !str_cmp(ch->name,alliance_table[ch->pcdata->alliance].leader) && alliance_table[ch->pcdata->alliance].members > 1 ) { send_to_char( "You can't pdelete while you're the leader of an alliance. Uset Setowner to give it to someone else.\n\r", ch ); return; } alliance_table[ch->pcdata->alliance].members--; save_alliances(); } ch->trust = 0; min = 0; for ( i=0;i<100;i++ ) { if ( min == -1 ) if ( ( score_table[i].kills < ch->pcdata->pkills || ( score_table[i].kills == ch->pcdata->pkills &&score_table[min].buildings < ch->pcdata->bkills ) || ( score_table[i].kills == ch->pcdata->pkills &&score_table[min].buildings == ch->pcdata->bkills && score_table[i].time < my_get_hours(ch,FALSE) ) ) ) min = i; if ( ( score_table[i].kills < score_table[min].kills || ( score_table[i].kills == score_table[min].kills &&score_table[min].buildings < score_table[i].buildings ) || ( score_table[i].kills == score_table[i].kills &&score_table[min].buildings == score_table[i].buildings && score_table[i].time < score_table[min].time ) ) ) min = i; if ( score_table[i].name == NULL ) { min = i; break; } } if ( min >= 0 && min <= 99 ) { if ( score_table[min].name != NULL ) free_string(score_table[min].name); if ( score_table[min].killedby != NULL ) free_string(score_table[min].killedby); score_table[min].name = str_dup(ch->name); score_table[min].killedby = str_dup("Deleted"); score_table[min].kills = ch->pcdata->pkills; score_table[min].buildings = ch->pcdata->bkills; score_table[min].time = my_get_hours(ch,FALSE); save_scores(); } { BUILDING_DATA *bld = first_building; BUILDING_DATA *bld_next = bld; OBJ_DATA *obj = first_obj; OBJ_DATA *obj_next = obj; CHAR_DATA *wch; for ( bld = first_building;bld;bld = bld_next ) { bld_next = bld->next; if ( !str_cmp(bld->owned,ch->name) ) extract_building(bld,TRUE); } save_buildings(); for ( obj = first_obj;obj;obj = obj_next ) { obj_next = obj->next; if ( !str_cmp(obj->owner,ch->name) || (obj->carried_by && obj->carried_by == ch) ) extract_obj(obj); } if ( ch == map_ch[ch->x][ch->y][ch->z] ) map_ch[ch->x][ch->y][ch->z] = ch->next_in_room; else for ( wch = map_ch[ch->x][ch->y][ch->z];wch;wch = wch->next_in_room ) if ( wch->next_in_room == ch ) wch->next_in_room = ch->next_in_room; } update_ranks(ch); ch->played = 0; if ( ch->played_tot > 2 * 3600 ) ch->played_tot = 2 * 3600; ch->position = POS_STANDING; ch->max_hit = STARTING_HP; ch->hit = STARTING_HP; ch->quest_points = 0; ch->effect = 0; ch->effect2 = 0; ch->poison = 0; ch->rank = 0; ch->pcdata->pkills = 0; ch->pcdata->tpkills = 0; ch->pcdata->bkills = 0; ch->pcdata->tbkills = 0; ch->pcdata->deaths = 0; ch->pcdata->blost = 0; ch->pcdata->pbhits = 0; ch->pcdata->pbdeaths = 0; ch->pcdata->nukemwins = 0; ch->pcdata->dead = FALSE; for ( i=0;i<MAX_SKILL;i++ ) ch->pcdata->skill[i] = 0; ch->pcdata->alliance = -1; ch->pcdata->prof_points = 0; ch->pcdata->prof_ttl = 0; ch->pcdata->experience = 0; ch->pcdata->deleted = TRUE; if ( !IS_SET(ch->pcdata->pflags,PLR_PDELETER) && my_get_hours(ch,TRUE) > 6 ) SET_BIT(ch->pcdata->pflags,PLR_PDELETER); save_char_obj(ch); // unlink(strsave); send_to_char("Character reset.\n\rIf you wish to recreate, relog under the same username (@@eAlts are NOT allowed!@@N).\n\r",ch); sprintf( buf, "%s has pdeleted!", ch->name ); log_f( buf ); sprintf( buf, "@@d%s has @@RDELETED!@@N\r\n", ch->name ); info(buf,81); sprintf( buf, "%s has left " mudnamenocolor "!", ch->name ); info( buf, 1 ); d = ch->desc; extract_char( ch, TRUE ); if ( d != NULL ) close_socket( d ); return; } void do_nuke( CHAR_DATA *ch, char *argument) { DESCRIPTOR_DATA *d; bool found = FALSE; char strsave[MAX_INPUT_LENGTH]; CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "@@dSyntax:nuke <character name>@@N \n\r", ch ); return; } if ( ( victim = get_ch (arg) ) == NULL ) { DESCRIPTOR_DATA d2; found = load_char_obj( &d2, arg, FALSE ); if (!found) { sprintf( buf, "No pFile found for '%s'.\n\r", capitalize( arg ) ); send_to_char( buf, ch ); free_char( d2.character ); return; } else { victim = d2.character; d2.character = NULL; victim->desc = NULL; } } if ( (victim == ch) || (get_trust(victim) > get_trust(ch)) ) { send_to_char( "Yah, right.\n\r", ch ); return; } strcpy(buf,victim->name); sprintf( strsave, "%s%s%s%s", PLAYER_DIR, initial( buf ), "/", capitalize( buf ) ); unlink(strsave); if ( victim->pcdata->alliance != -1 ) { alliance_table[victim->pcdata->alliance].members--; save_alliances(); } { BUILDING_DATA *bld = first_building; BUILDING_DATA *bld_next = bld; OBJ_DATA *obj = first_obj; OBJ_DATA *obj_next = obj; CHAR_DATA *wch; for ( bld = first_building;bld;bld = bld_next ) { bld_next = bld->next; if ( !str_cmp(bld->owned,victim->name) ) extract_building(bld,TRUE); } save_buildings(); for ( obj = first_obj;obj;obj = obj_next ) { obj_next = obj->next; if ( !str_cmp(obj->owner,victim->name) ) extract_obj(obj); } if ( victim == map_ch[victim->x][victim->y][victim->z] ) map_ch[victim->x][victim->y][victim->z] = victim->next_in_room; else for ( wch = map_ch[victim->x][victim->y][victim->z];wch;wch = wch->next_in_room ) if ( wch->next_in_room == victim ) wch->next_in_room = victim->next_in_room; } d = victim->desc; if ( d != NULL ) { close_socket( d ); extract_char( victim, TRUE ); } else { free_char(victim); victim = NULL; } sprintf( buf,"%d", web_data.tot_players-1); update_web_data(WEB_DATA_TOT_PLAYERS,buf); return; }