/***************************************************************************
* Mud20 1.0 by Todd H. Johnson (Kregor) a derivative of the Open Gaming *
* License by Wizards of the Coast. All comments referring to D20, OGL, *
* and SRD refer to the System Reference Document for the Open Gaming *
* system. Any inclusion of these derivatives must include credit to the *
* Mud20 system, the full and complete Open Gaming LIcense, and credit to *
* the respective authors. See ../doc/srd.txt for more information. *
* *
* Emud 2.2 by Igor van den Hoven, Michiel Lange, and Martin Bethlehem. *
* *
* MrMud 1.4 by David Bills, Dug Michael and Martin Gallwey *
* *
* Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* Original Diku Mud copyright (C) 1990 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeld, Tom Madsen, and Katje Nyboe. *
***************************************************************************/
/***************************************************************************
* mob_commands.c: Command functions for mob programs *
***************************************************************************/
#include "mud.h"
/*
* Swaps given room exits
*/
void do_mpswap( CHAR_DATA *ch, char *argument )
{
EXIT_DATA *pExit;
RESET_DATA *pReset;
char arg[MAX_INPUT_LENGTH];
int dir1, dir2;
push_call("do_mpswap(%p,%p",ch, argument);
argument = one_argument(argument, arg);
dir1 = direction_door(arg);
dir2 = direction_door(argument);
if (dir1 == -1 || dir2 == -1 || dir1 == dir2)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument <mpswap %s %s>", arg, argument);
}
else
{
ch_printf_color(ch, "Syntax: mpswap <dir1> <dir2>\n\r");
}
pop_call();
return;
}
pExit = ch->in_room->exit[dir1];
ch->in_room->exit[dir1] = ch->in_room->exit[dir2];
ch->in_room->exit[dir2] = pExit;
for (pReset = ch->in_room->area->first_reset ; pReset ; pReset = pReset->next)
{
if (is_room_reset(pReset, ch->in_room))
{
if (is_door_reset(pReset, dir1))
{
pReset->arg2 = dir2;
}
else if (is_door_reset(pReset, dir2))
{
pReset->arg2 = dir1;
}
}
}
pop_call();
return;
}
void do_maze( CHAR_DATA *ch, char *argument )
{
int x, y, z, size;
int room, start_room, door;
push_call("do_maze(%p,%p)",ch,argument);
if (sscanf(argument, "%d %d %d %d", &x, &y, &z, &size) != 4)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Syntax <maze %s>", argument);
}
else
{
send_to_char( "Format: MAZE <X size> <Y size> <Z size> <Total Rooms>\n\r", ch);
}
pop_call();
return;
}
if (x < 1 || y < 1 || z < 1 || x * y * z < 4 || x * y * z > 8000 || size < 2 || size > 100)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Coordinates <maze %s>", argument);
}
else
{
ch_printf_color(ch, "Invalid maze coordinates.\n\r");
}
pop_call();
return;
}
for (room = start_room = ch->in_room->vnum ; room < start_room + size ; room++)
{
for (door = 0 ; door < 6 ; door++)
{
if (room_index[room] && room_index[room]->exit[door] && room_index[room]->exit[door]->vnum <= 0)
{
room_index[room]->exit[door]->exit_info = 0;
room_index[room]->exit[door]->key = 0;
room_index[room]->exit[door]->pvnum = 0;
STRFREE(room_index[room]->exit[door]->keyword);
STRFREE(room_index[room]->exit[door]->description);
room_index[room]->exit[door]->keyword = STRDUPE(str_empty);
room_index[room]->exit[door]->description = STRDUPE(str_empty);
set_exit(room, door, -1);
}
}
}
mazegen(ch, 0, 0, 0, x, y, z, size, 0, number_bits(16), -1);
if (!IS_NPC(ch) && ch->level >= LEVEL_IMMORTAL)
{
send_to_char( "Maze generated.\n\r", ch);
}
pop_call();
return;
}
void mazegen( CHAR_DATA *ch, int cx, int cy, int cz, int x, int y, int z, int size, int count, int seed, int last_door)
{
int door, room, next_room, cnt;
push_call("mazegen(%p,%p,%p,%p,%p,%p)",ch,x,y,z,size,count,seed);
if (count >= size-1)
{
pop_call();
return;
}
room = ((count + seed) % size) + ch->in_room->vnum;
for (cnt = 0 ; cnt < 1000 ; cnt++)
{
door = number_door();
if (door == last_door)
{
continue;
}
if (room_index[room] && room_index[room]->exit[door] && room_index[room]->exit[door]->vnum > 0)
{
continue;
}
switch (door)
{
case 0: if (cy+1 >= y) continue; break;
case 1: if (cx+1 >= x) continue; break;
case 2: if (cy-1 < 0) continue; break;
case 3: if (cx-1 < 0) continue; break;
case 4: if (cz+1 >= z) continue; break;
case 5: if (cz-1 < 0) continue; break;
}
break;
}
if (cnt == 1000)
{
log_printf("Failed to create a maze: room vnum: %d", room);
pop_call();
return;
}
switch (door)
{
case 0: cy++; break;
case 1: cx++; break;
case 2: cy--; break;
case 3: cx--; break;
case 4: cz++; break;
case 5: cz--; break;
}
count++;
next_room = ((count + seed) % size) + ch->in_room->vnum;
last_door = rev_dir[door];
set_exit(room, door, next_room);
set_exit(next_room, last_door, room);
mazegen(ch, cx, cy, cz, x, y, z, size, count, seed, last_door);
pop_call();
return;
}
void do_mpdelay( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
char arg1[MAX_INPUT_LENGTH];
sh_int delay;
push_call("do_mpdelay(%p,%p",ch, argument);
argument = one_argument_nolower(argument, arg1);
if (!IS_NPC(ch) || arg1[0] == '\0' || argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Syntax <mpdelay %s %s>", arg1, argument);
}
else
{
send_to_char("NPC ONLY: Syntax: mpdelay <victim> <time> <index> <$X>\n\r", ch);
}
pop_call();
return;
}
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
log_build_printf(ch->pIndexData->vnum, "Target not found <mpdelay %s %s>", arg1, argument);
pop_call();
return;
}
if (!IS_NPC(victim))
{
log_build_printf(ch->pIndexData->vnum, "Target is a player <mpdelay %s %s>", arg1, argument);
pop_call();
return;
}
argument = one_argument_nolower(argument, arg1);
delay = atol(arg1);
if (delay >= 60)
{
victim->timer = delay / 60;
victim->wait = 0;
}
else
{
victim->timer = 0;
victim->wait = delay * 2;
}
argument = one_argument_nolower(argument, arg1);
victim->npcdata->delay_index = atol(arg1);
strcpy(arg1, argument);
if (!strcasecmp(arg1, "null"))
{
STRFREE(victim->npcdata->remember);
victim->npcdata->remember = STRDUPE(str_empty);
}
else
{
STRFREE(victim->npcdata->remember);
victim->npcdata->remember = STRALLOC(arg1);
}
pop_call();
return;
}
/*
* Added obj prog support for mptrigger
*/
void do_mptrigger( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *victim;
OBJ_DATA *obj;
char arg1[MAX_INPUT_LENGTH];
push_call("do_mptrigger(%p,%p",ch, argument);
argument = one_argument_nolower(argument, arg1);
if (arg1[0] == '\0' || argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Syntax <mptrigger %s %s>", arg1, argument);
}
else
{
send_to_char("Syntax: mptrigger <victim> <wordlist>\n\r", ch);
}
pop_call();
return;
}
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
if ((obj = get_obj_here_even_blinded(ch, arg1)) == NULL)
{
pop_call();
return;
}
else
{
oprog_trigger_trigger(argument, obj, ch);
}
}
if (MP_VALID_MOB(victim))
{
mprog_trigger_trigger(argument, victim, ch);
}
pop_call();
return;
}
void do_mpcalculate( CHAR_DATA *ch, char *argument)
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char arg4[MAX_INPUT_LENGTH];
push_call("do_mpcalculate(%p,%p)",ch, argument);
if (IS_NPC(ch))
{
sprintf(arg4, "%lld", mathexp(ch, argument));
STRFREE(ch->npcdata->remember);
ch->npcdata->remember = STRALLOC(arg4);
}
else
{
ch_printf_color(ch, "%s = %lld\n\r", argument, mathexp(ch, argument));
}
pop_call();
return;
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
argument = one_argument(argument, arg3);
if (*arg1 == '\0' || *arg2 == '\0' || *arg2 == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Syntax <mpcalculate %s %s %s>", arg1, arg2, arg3);
}
else
{
send_to_char("Syntax: mpcalculate <value> <+ - / * %> <value>\n\r", ch);
}
pop_call();
return;
}
if (!is_number(arg1) || !is_number(arg3))
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Syntax <mpcalculate %s %s %s>", arg1, arg2, arg3);
}
else
{
send_to_char("You must use numbers to calculate.\n\r", ch);
}
pop_call();
return;
}
arg4[0] = '\0';
switch (arg2[0])
{
case '+':
sprintf(arg4, "%lld", atoll(arg1) + atoll(arg3));
break;
case '-':
sprintf(arg4, "%lld", atoll(arg1) - atoll(arg3));
break;
case '*':
sprintf(arg4, "%lld", atoll(arg1) * atoll(arg3));
break;
case '/':
if (atoll(arg3) == 0)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Division Zero <mpcalculate %s %s %s>", arg1, arg2, arg3);
}
else
{
send_to_char("You formulate infinity, and store it deep inside you.\n\r", ch);
}
pop_call();
return;
}
sprintf(arg4, "%lld", atoll(arg1) / atoll(arg3));
break;
case '%':
sprintf(arg4, "%lld", atoll(arg1) % atoll(arg3));
break;
default:
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad Operator <mpcalculate %s %s %s>", arg1, arg2, arg3);
}
else
{
send_to_char("Unknown operator.\n\r", ch);
}
pop_call();
return;
}
if (IS_NPC(ch))
{
STRFREE(ch->npcdata->remember);
ch->npcdata->remember = STRALLOC(arg4);
}
else
{
ch_printf_color(ch, "%s %s %s = %s\n\r", arg1, arg2, arg3, arg4);
}
if (argument[0] != '\0')
{
sprintf(arg1, "%s %s", arg4, argument);
pop_call();
return do_mpcalculate(ch, arg1);
}
pop_call();
return;
}
void do_mplog( CHAR_DATA *ch, char *argument )
{
push_call("do_mplog(%p,%p",ch, argument);
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "MPLOG %s", argument);
}
else
{
log_printf("[%s] MPLOG %s", ch->name, argument);
}
pop_call();
return;
}
/*
* Set some area (zone) related stuff
*/
void do_mpzset(CHAR_DATA *ch, char *argument)
{
AREA_DATA *tarea;
char arg1[MAX_INPUT_LENGTH];
push_call("do_mpzset(%p,%p)",ch);
argument = one_argument_nolower(argument, arg1);
if (arg1[0] == '\0' || argument[0] == '\0')
{
send_to_char("Syntax: mpzset <field> <argument>\n\r", ch);
send_to_char(" Field being one of:\n\r", ch);
send_to_char(" resetmsg, quest\n\r", ch);
pop_call();
return;
}
tarea = ch->in_room->area;
if (!strcasecmp(arg1, "resetmsg"))
{
if (strcasecmp(argument, "null"))
{
RESTRING(tarea->resetmsg, argument);
}
else
{
RESTRING(tarea->resetmsg, "");
}
pop_call();
return;
}
if (!strcasecmp(arg1, "quest" ) )
{
int firstBit,len,value;
strcpy(arg1, argument);
if (sscanf(arg1, "%d %d %d", &firstBit, &len, &value) != 3)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad parameters <mpzset quest %s>", arg1);
}
pop_call();
return;
}
if (IS_NPC(ch))
{
set_quest_bits(&ch->pIndexData->area->area_quest, firstBit, len, value);
}
else
{
set_quest_bits(&ch->in_room->area->area_quest, firstBit, len, value);
}
pop_call();
return;
}
do_mpzset(ch, "");
pop_call();
return;
}
/*
* Brand new mpdamage with damage types, selective
* targeting of groups, and special damage string - Kregor
*/
void do_mpdamage( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim, *victim_next;
int dam_lo, dam_hi, dam_all, dam_tar, dam_pcs, sn;
push_call("do_mpdamage(%p,%p)",ch,argument);
argument = one_argument_nolower(argument, arg);
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument <mpdamage>" );
}
else
{
send_to_char("Syntax: mpdamage <victim|all|pcs|foe> <num dice> <size dice> <dam type> <message>\n\r", ch);
}
pop_call();
return;
}
dam_all = !strcasecmp(arg, "all");
dam_pcs = !strcasecmp(arg, "pcs");
dam_tar = !strcasecmp(arg, "foe");
if (dam_all || dam_pcs)
{
victim = NULL;
}
else if (dam_tar)
{
if ((victim = who_fighting(ch)) == NULL)
{
pop_call();
return;
}
}
else if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
pop_call();
return;
}
if (victim == ch)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "victim == ch <mpdamage %s %s>", arg, argument );
}
pop_call();
return;
}
argument = one_argument_nolower(argument, arg);
dam_lo = atol(arg);
argument = one_argument_nolower(argument, arg);
dam_hi = atol(arg);
argument = one_argument_nolower(argument, arg);
if (!strcasecmp(arg, "pierce"))
sn = gsn_pierce_hit;
else if (!strcasecmp(arg, "slash"))
sn = gsn_slash_hit;
else if (!strcasecmp(arg, "bash"))
sn = gsn_bash_hit;
else if (!strcasecmp(arg, "acid"))
sn = gsn_acid_hit;
else if (!strcasecmp(arg, "cold"))
sn = gsn_frost_hit;
else if (!strcasecmp(arg, "electric"))
sn = gsn_shock_hit;
else if (!strcasecmp(arg, "fire"))
sn = gsn_fire_hit;
else if (!strcasecmp(arg, "sonic"))
sn = gsn_sonic_hit;
else if (!strcasecmp(arg, "divine"))
sn = gsn_divine_hit;
else if (!strcasecmp(arg, "force"))
sn = gsn_force_hit;
else
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "mpdamage: no dam_type argument" );
}
else
{
send_to_char("bad dam_type: <pierce|slash|bash|acid|cold|electric|fire|sonic|divine|force>\n\r", ch);
}
pop_call();
return;
}
if (argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument <mpdamage: %s %d %d %s>", dam_all ? "all" : victim->name, dam_lo, dam_hi, argument);
}
else
{
do_mpdamage(ch, "");
}
pop_call();
return;
}
strcpy(mpdamstring, argument);
if (!dam_all && !dam_pcs)
{
damage( ch, victim, dice(dam_lo, dam_hi), sn, NULL );
mpdamstring[0] = '\0';
pop_call();
return;
}
for (victim = ch->in_room->first_person ; victim ; victim = victim_next)
{
victim_next = victim->next_in_room;
if (can_mass_attack(ch, victim))
{
if (dam_all || !IS_NPC(victim))
{
damage( ch, victim, dice(dam_lo, dam_hi), sn, NULL );
}
}
}
mpdamstring[0] = '\0';
pop_call();
return;
}
/*
* Infect a character with disease - Kregor
*/
void do_mpinfect( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim, *victim_next;
int dam_all, dam_tar, dam_pcs, disease;
push_call("do_mpinfect(%p,%p)",ch,argument);
argument = one_argument_nolower(argument, arg);
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Improper arguments <mpinfect>" );
}
else
{
send_to_char("Syntax: mpinfect <victim|all|pcs|foe> <'disease name'>\n\r", ch);
}
pop_call();
return;
}
dam_all = !strcasecmp(arg, "all");
dam_pcs = !strcasecmp(arg, "pcs");
dam_tar = !strcasecmp(arg, "foe");
if (dam_all || dam_pcs)
{
victim = NULL;
}
else if (dam_tar)
{
if ((victim = who_fighting(ch)) == NULL)
{
pop_call();
return;
}
}
else if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
pop_call();
return;
}
if (victim == ch)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "victim == ch <mpinfect %s %s>", arg, argument );
}
pop_call();
return;
}
if (argument[0] == '\0' || (disease = lookup_disease(argument)) == -1)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument <mpinfect: %s %s>", dam_all ? "all" : victim->name, argument);
}
else if (argument[0] != '\0')
{
ch_printf(ch, "mpinfect: bad disease name %s\n\r", argument);
}
else
{
do_mpinfect(ch, "");
}
pop_call();
return;
}
if (!dam_all && !dam_pcs)
{
infect_char(NULL, victim, disease);
pop_call();
return;
}
for (victim = ch->in_room->first_person ; victim ; victim = victim_next)
{
victim_next = victim->next_in_room;
if (can_mass_attack(ch, victim))
{
if (dam_all || !IS_NPC(victim))
{
infect_char(NULL, victim, disease);
}
}
}
pop_call();
return;
}
/*
* Poison a character - Kregor
*/
void do_mppoison( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim, *victim_next;
int dam_all, dam_tar, dam_pcs, poison;
push_call("do_mppoison(%p,%p)",ch,argument);
argument = one_argument_nolower(argument, arg);
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Improper arguments <mppoison>" );
}
else
{
send_to_char("Syntax: mppoison <victim|all|pcs|foe> <'poison name'>\n\r", ch);
}
pop_call();
return;
}
dam_all = !strcasecmp(arg, "all");
dam_pcs = !strcasecmp(arg, "pcs");
dam_tar = !strcasecmp(arg, "foe");
if (dam_all || dam_pcs)
{
victim = NULL;
}
else if (dam_tar)
{
if ((victim = who_fighting(ch)) == NULL)
{
pop_call();
return;
}
}
else if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
pop_call();
return;
}
if (victim == ch)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "victim == ch <mppoison %s %s>", arg, argument );
}
pop_call();
return;
}
if (argument[0] == '\0' || (poison = lookup_poison(argument)) == -1)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument <mppoison: %s %s>", dam_all ? "all" : victim->name, argument);
}
else if (argument[0] != '\0')
{
ch_printf(ch, "mppoison: bad poison name %s\n\r", argument);
}
else
{
do_mppoison(ch, "");
}
pop_call();
return;
}
if (!dam_all && !dam_pcs)
{
poison_attack(ch, victim, poison);
pop_call();
return;
}
for (victim = ch->in_room->first_person ; victim ; victim = victim_next)
{
victim_next = victim->next_in_room;
if (can_mass_attack(ch, victim))
{
if (dam_all || !IS_NPC(victim))
{
poison_attack(ch, victim, poison);
}
}
}
pop_call();
return;
}
/*
* set an affect on an object
*/
void do_mpaset( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
AFFECT_DATA af;
CHAR_DATA *victim;
int value, type;
int duration = -1;
push_call("do_mpaset(%p,%p)",ch,argument);
argument = one_argument(argument, arg1);
argument = one_argument(argument, arg2);
argument = one_argument(argument, arg3);
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument <mpaset: %s %s %s>", arg1, arg2, arg3);
}
else
{
ch_printf_color(ch, "Syntax: mpaset [on victim] <object> <apply> <value> [duration]\n\r");
}
pop_call();
return;
}
if (!strcasecmp(arg1, "on"))
{
if ((victim = get_char_room_even_blinded(ch, arg2)) == NULL)
{
ch_printf_color(ch, "They're not here.\n\r");
pop_call();
return;
}
argument = one_argument( argument, arg1 );
{
if ((obj = get_obj_carry_even_blinded(victim, arg3)) == NULL)
{
if ((obj = get_obj_wear_even_blinded(victim, arg3)) == NULL)
{
ch_printf_color(ch, "They're not carrying that.\n\r");
pop_call();
return;
}
}
}
argument = one_argument(argument, arg2);
argument = one_argument(argument, arg3);
}
if ((obj = get_obj_here_even_blinded(ch, arg1)) == NULL)
{
pop_call();
return;
}
if ((type = get_flag(arg2, a_types)) == -1)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad type <mpaset: %s %s %s>", arg1, arg2, arg3);
}
else
{
ch_printf_color(ch, "Syntax: mpaset <object> <%s> <value>\n\r", give_flags(a_types));
}
pop_call();
return;
}
if (!is_number(arg3))
{
ch_printf_color(ch, "Value must be a number.\n\r");
pop_call();
return;
}
value = atol(arg3);
if (*argument && atoi(argument) > 0)
{
duration = atoi(argument);
}
af.type = gsn_object_rape;
af.duration = duration;
af.modifier = value;
af.bitvector = 0;
af.bittype = AFFECT_TO_NONE;
af.location = type;
af.level = 0;
affect_to_obj(ch, obj, &af);
pop_call();
return;
}
/*
* lets the mobile attack any player or mobile without murder
*/
void do_mpkill( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
CHAR_DATA *victim;
push_call("do_mpkill(%p,%p)",ch,argument);
if (!IS_NPC(ch))
{
pop_call();
return;
}
one_argument( argument, arg );
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument <mpkill>" );
pop_call();
return;
}
pop_call();
return;
}
if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
pop_call();
return;
}
if (victim == ch)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "victim == ch <mpkill %s>", arg );
}
pop_call();
return;
}
if (in_combat(ch))
{
pop_call();
return;
}
if (in_combat (victim))
{
char_to_combat (ch, victim->in_battle);
set_fighting(ch, victim);
act ("$n rushes headlong into the fray!", ch, NULL, victim, TO_ROOM);
pop_call();
return;
}
initiate_combat (ch, victim);
act ("$n initiates combat against you.", ch, NULL, victim, TO_VICT);
act ("$n initiates combat against $N.", ch, NULL, victim, TO_NOTVICT);
pop_call();
return;
pop_call();
return;
}
/*
* repeats intercepted command in intercept_prog
*/
void do_mpunintercept( CHAR_DATA *ch, char *argument )
{
CHAR_DATA *actor;
push_call("do_mpunintercept(%p,%p) <%s, %s>",ch,argument,ch->name,argument);
if (!IS_NPC(ch))
{
pop_call();
return;
}
if ((actor = ch->npcdata->prog_char) == NULL)
{
log_build_printf(ch->pIndexData->vnum, "mpunintercept with no actor. Is this an intercept_prog?");
pop_call();
return;
}
if (!ch->npcdata->prog_cmd)
{
log_build_printf(ch->pIndexData->vnum, "mpunintercept with no command string. Is this an intercept_prog?");
pop_call();
return;
}
if (actor->in_room != ch->in_room)
{
pop_call();
return;
}
interpret(actor, ch->npcdata->prog_cmd);
ch->npcdata->prog_char = NULL;
STRFREE(ch->npcdata->prog_cmd);
pop_call();
return;
}
/*
* destroys an object worn or in inventory using obj name,
* all.obj or all. on self or [victim]
*/
void do_mpjunk( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
OBJ_DATA *obj_next;
CHAR_DATA *victim;
push_call("do_mpjunk(%p,%p) <%s, %s>",ch,argument,ch->name,argument);
argument = one_argument( argument, arg );
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument <mpjunk>" );
}
pop_call();
return;
}
if (argument[0] == '\0')
{
victim = ch;
}
else
{
if ((victim = get_char_room_even_blinded(ch, argument)) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "NULL target for mpjunk %s", argument );
}
pop_call();
return;
}
}
if (strcasecmp(arg, "all") && str_prefix("all.", arg))
{
if ((obj = get_obj_wear_even_blinded(victim, arg)) != NULL)
{
junk_obj( obj );
}
else if ((obj = get_obj_carry_even_blinded(victim, arg)) != NULL)
{
junk_obj( obj );
}
pop_call();
return;
}
else
{
for (obj = victim->first_carrying ; obj != NULL ; obj = obj_next)
{
obj_next = obj->next_content;
if (arg[3] == '\0' || is_name(&arg[4], obj->name))
{
junk_obj( obj );
}
}
}
pop_call();
return;
}
void do_mpjunk_person( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
OBJ_DATA *obj;
OBJ_DATA *obj_next;
CHAR_DATA *victim;
push_call("do_mpjunk_person(%p,%p)",ch,argument);
argument = one_argument( argument, arg );
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument <mpjunkperson>" );
}
pop_call();
return;
}
if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
pop_call();
return;
}
one_argument( argument, arg );
if (strcasecmp(arg, "all") && str_prefix("all.", arg))
{
if ((obj = get_obj_wear_even_blinded(victim, arg)) != NULL)
{
junk_obj( obj );
}
else if ((obj = get_obj_carry_even_blinded(victim, arg)) != NULL)
{
junk_obj( obj );
}
pop_call();
return;
}
else
{
for (obj = victim->first_carrying ; obj != NULL ; obj = obj_next)
{
obj_next = obj->next_content;
if (arg[3] == '\0' || is_name(&arg[4], obj->name))
{
junk_obj( obj );
}
}
}
pop_call();
return;
}
/*
* prints the argument to all the rooms aroud the mobile
*/
void do_mpasound( CHAR_DATA *ch, char *argument )
{
EXIT_DATA *pExit;
int door, temp_vnum;
bool removed = FALSE;
char buf[MAX_STRING_LENGTH];
push_call("do_mpasound(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument <mpasound>" );
pop_call();
return;
}
}
if (IS_ACT(ch, ACT_SECRETIVE))
{
REMOVE_BIT(ch->act, ACT_SECRETIVE);
removed = TRUE;
}
temp_vnum = ch->in_room->vnum;
for (door = 0 ; door <= 5 ; door++)
{
if ((pExit = get_exit(temp_vnum, door)) != NULL)
{
ch->in_room = room_index[pExit->to_room];
sprintf(buf, "%s to %s.", argument, rev_dir_name[door]);
act( buf, ch, NULL, NULL, TO_ROOM );
}
}
ch->in_room = room_index[temp_vnum];
if (IS_NPC(ch))
{
if (removed)
SET_BIT(ch->act, ACT_SECRETIVE);
pop_call();
return;
}
pop_call();
return;
}
/*
* prints the message to everyone in the room other
* than the mob and victim
*/
void do_mpechoaround( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
CHAR_DATA *victim;
bool removed = FALSE;
push_call("do_mpechoaround(%p,%p [%s])",ch,argument,argument);
argument = one_argument( argument, arg );
if (arg[0] == '\0')
{
pop_call();
return;
}
if (IS_ACT(ch, ACT_SECRETIVE))
{
REMOVE_BIT(ch->act, ACT_SECRETIVE);
removed = TRUE;
}
if ((victim = get_char_room_even_blinded(ch, arg)) != NULL)
{
act( argument, ch, NULL, victim, TO_NOTVICT );
act( argument, ch, NULL, victim, TO_CHAR );
}
if (IS_NPC(ch))
{
if (removed)
SET_BIT(ch->act, ACT_SECRETIVE);
pop_call();
return;
}
pop_call();
return;
}
/*
* prints the message to only the victim
*/
void do_mpechoat( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
CHAR_DATA *victim;
bool removed = FALSE;
push_call("do_mpechoat(%p,%p)",ch,argument);
argument = one_argument( argument, arg );
if (arg[0] == '\0' || argument[0] == '\0')
{
pop_call();
return;
}
if (IS_ACT(ch, ACT_SECRETIVE))
{
REMOVE_BIT(ch->act, ACT_SECRETIVE);
removed = TRUE;
}
if ((victim = get_char_room_even_blinded(ch, arg)) != NULL)
{
if (victim == ch)
{
act( argument, ch, NULL, NULL, TO_CHAR);
}
else
{
act( argument, ch, NULL, victim, TO_VICT);
}
}
if (IS_NPC(ch))
{
if (removed)
SET_BIT(ch->act, ACT_SECRETIVE);
pop_call();
return;
}
pop_call();
return;
}
/*
* prints the message to the room at large
*/
void do_mpecho( CHAR_DATA *ch, char *argument )
{
bool removed = FALSE;
push_call("do_mpecho(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
pop_call();
return;
}
if (IS_ACT(ch, ACT_SECRETIVE))
{
REMOVE_BIT(ch->act, ACT_SECRETIVE);
removed = TRUE;
}
if (!IS_NPC(ch))
{
act( argument, ch, NULL, NULL, TO_CHAR );
}
act( argument, ch, NULL, NULL, TO_ROOM );
if (IS_NPC(ch))
{
if (removed)
SET_BIT(ch->act, ACT_SECRETIVE);
pop_call();
return;
}
pop_call();
return;
}
/*
* Print the message to every awake player in the area
* add "sleepers" to echo to sleeping chars,
* add "outdoors" to echo to only outdoors chars,
* add "indoors" to echo to only indoors chars.
*/
void do_mpareaecho( CHAR_DATA *ch, char *argument )
{
PLAYER_GAME *pch;
char arg[MAX_INPUT_LENGTH];
int echo_type;
bool removed = FALSE;
push_call("do_mpareaecho(%p,%p)",ch,argument);
if (ch->in_room->area->nplayer == 0 || argument[0] == '\0')
{
pop_call();
return;
}
if (IS_ACT(ch, ACT_SECRETIVE))
{
REMOVE_BIT(ch->act, ACT_SECRETIVE);
removed = TRUE;
}
if (!str_prefix("sleepers", argument))
{
echo_type = 1;
}
else if (!str_prefix("outdoors", argument))
{
echo_type = 2;
}
else if (!str_prefix("indoors", argument))
{
echo_type = 3;
}
else
{
echo_type = 0;
}
if (echo_type > 0)
{
argument = one_argument_nolower(argument, arg);
}
for (pch = mud->f_player ; pch ; pch = pch->next)
{
if (pch->ch->in_room->area == ch->in_room->area)
{
switch (echo_type)
{
case 1:
if (IS_AWAKE(pch->ch))
{
continue;
}
break;
case 2:
if (!IS_AWAKE(pch->ch) || !IS_OUTSIDE(pch->ch) || NO_WEATHER_SECT(pch->ch->in_room->sector_type))
{
continue;
}
break;
case 3:
if (!IS_AWAKE(pch->ch) || IS_OUTSIDE(pch->ch) || !NO_WEATHER_SECT(pch->ch->in_room->sector_type))
{
continue;
}
break;
default:
if (!IS_AWAKE(pch->ch))
{
continue;
}
break;
}
ch_printf_color(pch->ch, "%s\n\r", ansi_translate_text(pch->ch, ansi_justify(argument, get_page_width(pch->ch))));
}
}
if (IS_NPC(ch))
{
if (removed)
SET_BIT(ch->act, ACT_SECRETIVE);
pop_call();
return;
}
pop_call();
return;
}
/*
* load an item or mobile. All items are loaded into inventory.
*/
void do_mpmload( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
MOB_INDEX_DATA *pMobIndex;
CHAR_DATA *victim;
push_call("do_mpmload(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0' || !is_number(arg))
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument: <mpmload %s>", arg );
}
pop_call();
return;
}
if ((pMobIndex = get_mob_index(atol(arg))) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad vnum: <mpmload %s>", arg );
}
pop_call();
return;
}
victim = create_mobile( pMobIndex );
victim->npcdata->mloaded = TRUE;
char_to_room( victim, ch->in_room->vnum, FALSE );
pop_call();
return;
}
void do_mpoload( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
OBJ_INDEX_DATA *pObjIndex;
OBJ_DATA *obj;
bool load_to_room = FALSE;
bool wear_on_load = FALSE;
push_call("do_mpoload(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
one_argument( argument, arg2 );
if (arg1[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument: <mpoload %s>", arg1 );
}
pop_call();
return;
}
switch (arg2[0])
{
case 'r':
load_to_room = TRUE;
break;
case 'w':
wear_on_load = TRUE;
break;
case '\0':
break;
default:
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad argument: <mpoload %s %s>", arg1, arg2 );
}
pop_call();
return;
}
if ((pObjIndex = get_obj_index(atol(arg1))) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad vnum: <mpoload %s>", arg1 );
}
pop_call();
return;
}
obj = create_object( pObjIndex, 0 );
if (!CAN_WEAR(obj, CAN_WEAR_TAKE) || load_to_room)
{
obj->sac_timer = OBJ_SAC_TIME;
obj_to_room(obj, ch->in_room->vnum);
}
else
{
obj_to_char(obj, ch);
if (wear_on_load)
{
wear_obj(ch, obj, FALSE, WEAR_NONE, FALSE);
}
}
pop_call();
return;
}
/*
* purge a mob, obj, entire room, or entire area
*/
void do_mppurge( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
CHAR_DATA *victim;
OBJ_DATA *obj;
push_call("do_mppurge(%p,%p)",ch,argument);
one_argument( argument, arg );
if (arg[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument: <mppurge>");
}
pop_call();
return;
}
if (!strcasecmp(arg, "on"))
{
argument = one_argument(argument, arg);
if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "obj 'on' NULL target: <mppurge>");
pop_call();
return;
}
if ((obj = get_obj_carry_even_blinded(victim, argument)) == NULL)
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "NULL obj on target: <mppurge>");
pop_call();
return;
}
if (obj->item_type != ITEM_CORPSE_PC)
{
if (ch->desc)
ch_printf_color(ch, "You purge %s\n\r", obj->name);
junk_obj( obj );
}
else
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Attempe to purge PC corpse: <mppurge>");
}
else
{
send_to_char("Cannot purge a PC corpse.\n\r", ch);
}
}
pop_call();
return;
}
if (strcasecmp(arg, "all") && strcasecmp(arg, "area") && str_prefix("all.", arg))
{
if ((victim = get_char_room_even_blinded(ch, arg)) == NULL || victim == supermob)
{
if ((obj = get_obj_here(ch, arg)) != NULL)
{
if (obj->item_type != ITEM_CORPSE_PC)
{
if (ch->desc)
ch_printf_color(ch, "You purge %s\n\r", obj->name);
junk_obj( obj );
}
else
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Attempe to purge PC corpse: <mppurge>");
}
else
{
send_to_char("Cannot purge a PC corpse.\n\r", ch);
}
}
}
else
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "NULL target: <mppurge>");
}
pop_call();
return;
}
if (!IS_NPC(victim))
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Target is a PC <mppurge %s>", arg );
}
pop_call();
return;
}
if (victim == supermob)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Trying to purge SuperMob! <mppurge %s>", arg );
}
pop_call();
return;
}
/*
Use the junk room - Scandum
*/
if (ch->desc)
ch_printf_color(ch, "You purge %s\n\r", victim->name);
junk_mob(victim);
pop_call();
return;
}
if (!strcasecmp(arg, "all") || !str_prefix("all.", arg))
{
CHAR_DATA *vnext;
OBJ_DATA *obj_next;
for (victim = ch->in_room->first_person ; victim ; victim = vnext)
{
vnext = victim->next_in_room;
if (IS_NPC(victim) && victim != ch && victim != supermob)
{
if (arg[3] == '\0' || is_name(&arg[4], victim->name))
{
if (ch->desc)
ch_printf_color(ch, "You purge %s\n\r", victim->name);
junk_mob(victim);
}
}
}
for (obj = ch->in_room->first_content ; obj ; obj = obj_next)
{
obj_next = obj->next_content;
if (obj->item_type != ITEM_CORPSE_PC)
{
if (arg[3] == '\0' || is_name(&arg[4], obj->name))
{
if (ch->desc)
ch_printf_color(ch, "You purge %s\n\r", obj->name);
junk_obj( obj );
}
}
}
pop_call();
return;
}
else
{
CHAR_DATA *vnext;
OBJ_DATA *obj_next;
int room, room_start;
/*
Purge every room in the area, nolonger jams on null rooms - Scandum
*/
room_start = ch->in_room->vnum;
for (room = room_index[room_start]->area->low_r_vnum ; room <= room_index[room_start]->area->hi_r_vnum ; room++)
{
if (room_index[room] == NULL)
{
continue;
}
if (room_index[room_start]->area != room_index[room]->area)
{
break;
}
char_from_room(ch);
char_to_room(ch, room, FALSE);
for (victim = ch->in_room->first_person ; victim != NULL ; victim = vnext)
{
vnext = victim->next_in_room;
if (IS_NPC(victim) && victim != ch && victim != supermob)
{
junk_mob(victim);
}
}
for (obj = ch->in_room->first_content ; obj ; obj = obj_next)
{
obj_next = obj->next_content;
if (obj->item_type != ITEM_CORPSE_PC)
{
junk_obj( obj );
}
}
}
char_from_room(ch);
char_to_room(ch, room_start, FALSE);
if (ch->desc)
ch_printf_color(ch, "You purge the entire area of %s\n\r", room_index[room_start]->area->name);
}
pop_call();
return;
}
/*
* sends the mobile to given location
*/
void do_mpgoto( CHAR_DATA *ch, char *argument )
{
int location;
push_call("do_mpgoto(%p,%p)",ch,argument);
if (argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "- No argument <mpgoto>" );
}
pop_call();
return;
}
if ((location = find_mp_location(ch, argument)) == -1)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad location: <mpgoto %s>", argument );
}
pop_call();
return;
}
if (is_mounting(ch))
{
transference(ch->mounting, location);
}
transference(ch, location);
pop_call();
return;
}
/*
* execute command at another location.
*/
void do_mpat( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
int location, original;
CHAR_DATA *mount;
OBJ_DATA *furniture = NULL;
push_call("do_mpat(%p,%p)",ch,argument);
if (!IS_NPC(ch) && in_combat(ch))
{
pop_call();
return;
}
argument = one_argument_nolower(argument, arg);
if (arg[0] == '\0' || argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "No argument: <mpat>" );
}
pop_call();
return;
}
if ((location = find_mp_location(ch, arg)) == -1)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad location: <mpat %s %s>", arg, argument );
}
pop_call();
return;
}
mount = ch->mounting;
original = ch->in_room->vnum;
if (ch->furniture)
{
furniture = ch->furniture;
user_from_furniture(ch);
}
char_from_room( ch );
char_to_room( ch, location, FALSE );
do_mpdo(ch, argument);
if (ch && ch->name)
{
char_from_room(ch);
char_to_room(ch, original, FALSE);
if (furniture)
user_to_furniture(ch, furniture);
ch->mounting = mount;
}
pop_call();
return;
}
/*
* transfer person. [all] and [allgame] are additional parameters
* [pet] or [group] after the command transfers the target's pet or group.
*/
void do_mptransfer( CHAR_DATA *ch, char *argument )
{
char arg1[ MAX_INPUT_LENGTH ];
char arg2[ MAX_INPUT_LENGTH ];
char arg3[ MAX_INPUT_LENGTH ];
int location;
CHAR_DATA *victim, *next_victim;
CHAR_DATA *rch, *rch_next;
push_call("do_mptransfer(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if (ch->in_room == NULL)
{
pop_call();
return;
}
if (arg1[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad parameters <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
/* test for numerical name */
if (*arg1 >= '0' && *arg1 <= '9' && *arg2=='\0' )
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad parameters <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
/*
* Thanks to Grodyn for the optional location parameter.
*/
if (arg2[0] == '\0' || !strcasecmp(arg2, "pet") || !strcasecmp(arg2, "group"))
{
location = ch->in_room->vnum;
}
else
{
if ((location = find_mp_location(ch, arg2)) == -1)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "unknown location <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
if (location == ch->in_room->vnum)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "already there <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
}
if (!strcasecmp(arg1, "all" ))
{
CHAR_DATA *next_victim;
if (arg2[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad argument <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
for (victim = ch->in_room->first_person ; victim != NULL ; victim = next_victim)
{
next_victim = victim->next_in_room;
if (NEW_AUTH(ch))
continue;
if (victim != ch)
{
transference( victim, location );
}
}
pop_call();
return;
}
if (!strcasecmp(arg1, "pcs"))
{
if (arg2[0]=='\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad argument <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
for (victim = ch->in_room->first_person ; victim ; victim = next_victim)
{
next_victim = victim->next_in_room;
if (NEW_AUTH(victim))
continue;
if (victim != ch && (!IS_NPC(victim) || IS_AFFECTED(victim, AFF_DOMINATE) || (IS_SET(victim->act, ACT_PET) && victim->master)))
{
transference( victim, location );
}
}
pop_call();
return;
}
if (!strcasecmp(arg1, "area"))
{
DESCRIPTOR_DATA *d;
if (arg2[0]=='\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad argument <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
for (d = mud->f_desc ; d ; d = d->next)
{
if (d->connected != CON_PLAYING && d->connected != CON_EDITING)
continue;
if ((victim = d->character) == NULL)
continue;
if (victim->in_room == NULL || victim->in_room->area != ch->in_room->area)
continue;
if (NEW_AUTH(victim))
continue;
if (victim != ch && (!IS_NPC(victim) || IS_AFFECTED(victim, AFF_DOMINATE) || (IS_SET(victim->act, ACT_PET) && victim->master)))
{
transference( victim, location );
}
}
pop_call();
return;
}
if (arg2[0] == '\0' || !strcasecmp(arg2, "pet") || !strcasecmp(arg2, "group"))
{
if ((victim = get_char_area_even_blinded(ch, arg1)) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "target not found <mptransfer %s>", arg1);
}
pop_call();
return;
}
}
else
{
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "target not found <mptransfer %s %s>", arg1, arg2);
}
pop_call();
return;
}
}
if (victim->in_room == NULL)
{
pop_call();
return;
}
if (NEW_AUTH(victim))
{
if (!IS_NPC(ch))
{
send_to_char("That character is not yet authorized.\n\r", ch);
}
pop_call();
return;
}
if (victim != ch)
{
if (is_mounting(victim))
{
transference(victim->mounting, location);
}
if (!strcasecmp(arg2, "pet") || !strcasecmp(arg3, "pet"))
{
for (rch = victim->in_room->first_person ; rch ; rch = rch->next_in_room)
{
rch_next = rch->next_in_room;
if (is_master(rch, victim))
{
transference(rch, location);
}
}
}
if (!strcasecmp(arg2, "group") || !strcasecmp(arg3, "group"))
{
for (rch = victim->in_room->first_person ; rch ; rch = rch->next_in_room)
{
rch_next = rch->next_in_room;
if (is_master(rch, victim))
{
transference(rch, location);
}
if (is_same_group(rch, victim))
{
transference(rch, location);
}
}
}
transference(victim, location);
}
else
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "target is self <mptransfer %s %s>", arg1, arg2);
}
}
pop_call();
return;
}
void do_mpdo( CHAR_DATA *ch, char *argument )
{
char arg[MAX_INPUT_LENGTH];
int value;
push_call("mpdo(%p,%p)",ch,argument);
if (!MP_VALID_MOB(ch))
{
interpret(ch, argument);
}
else
{
argument = one_argument_nolower(argument, arg);
if ((value = find_command(arg, MAX_LEVEL - 1)) > -1)
{
(*cmd_table[value].do_fun) (ch, argument);
}
else if (!check_social(ch, arg, argument))
{
log_build_printf(ch->pIndexData->vnum, "unknown command: %s", arg);
}
}
pop_call();
return;
}
/*
force someone to do something. must be mortal level
and the all argument only affects those in the room with the mobile
*/
void do_mpforce( CHAR_DATA *ch, char *argument )
{
char arg[ MAX_INPUT_LENGTH ];
push_call("do_mpforce(%p,%p)",ch,argument);
argument = one_argument( argument, arg );
if (arg[0] == '\0' || argument[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad syntax <mpforce %s %s>", arg, argument);
}
pop_call();
return;
}
if (!strcasecmp(arg, "all"))
{
CHAR_DATA *vch;
CHAR_DATA *vch_next;
for (vch = ch->in_room->first_person ; vch != NULL ; vch = vch_next)
{
vch_next = vch->next_in_room;
if (!IS_NPC(ch) && !IS_NPC(vch) && IS_PLR(vch, PLR_HOLYLIGHT))
{
ch_printf_color(ch, "%s is a god, you cannot force them to do anything.\n\r",capitalize(vch->name));
continue;
}
if (vch != ch && !IS_SET(vch->act, ACT_MOBINVIS))
{
if (vch->desc) SET_BIT(CH(vch->desc)->pcdata->interp, INTERP_FORCE);
do_mpdo(vch, argument);
if (vch->desc) REMOVE_BIT(CH(vch->desc)->pcdata->interp, INTERP_FORCE);
}
}
}
else
{
CHAR_DATA *victim;
if ((victim = get_char_room_even_blinded(ch, arg)) == NULL)
{
pop_call();
return;
}
if (victim == ch)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "mpforce: forcing oneself");
}
pop_call();
return;
}
if (!IS_NPC(ch) && !IS_NPC(victim) && IS_PLR(ch, PLR_HOLYLIGHT))
{
ch_printf_color(ch,"%s is a God, and thus cannot be forced.\n\r",capitalize(victim->name));
pop_call();
return;
}
if (victim->desc) SET_BIT(CH(victim->desc)->pcdata->interp, INTERP_FORCE);
do_mpdo(victim, argument);
if (victim->desc) REMOVE_BIT(CH(victim->desc)->pcdata->interp, INTERP_FORCE);
}
pop_call();
return;
}
/*
* Added group argument 9/29/08 - Kregor
*/
void do_mpmset( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
PLAYER_GAME *gch;
push_call("do_mpmset(%p,%p)",ch,argument);
if (!IS_NPC(ch))
{
send_to_char("Use mset instead.\n\r", ch);
pop_call();
return;
}
argument = one_argument( argument, arg1 );
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
log_build_printf(ch->pIndexData->vnum, "mset_char on nonexistent target");
pop_call();
return;
}
one_argument( argument, arg2 );
/*
group argument will not count NPCs, or immortals
*/
if (!strcasecmp(arg2, "group"))
{
argument = one_argument( argument, arg2 );
for (gch = mud->f_player ; gch ; gch = gch->next)
{
if (IS_NPC(gch->ch))
continue;
if (IS_IMMORTAL(gch->ch))
continue;
if (gch->ch == victim)
continue;
if (!is_same_group(victim, gch->ch))
continue;
mset_char(ch, gch->ch, argument, TRUE);
}
}
mset_char(ch, victim, argument, TRUE);
pop_call();
return;
}
void do_mposet( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
OBJ_DATA *obj;
CHAR_DATA *victim;
push_call("do_mposet(%p,%p)",ch,argument);
if (!IS_NPC(ch))
{
send_to_char("Use oset instead.\n\r", ch);
pop_call();
return;
}
if (!strcasecmp(arg1, "on"))
{
argument = one_argument( argument, arg1 );
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
ch_printf_color(ch, "They're not here.\n\r");
pop_call();
return;
}
argument = one_argument( argument, arg1 );
{
if ((obj = get_obj_carry_even_blinded(victim, arg1)) == NULL)
{
if ((obj = get_obj_wear_even_blinded(victim, arg1)) == NULL)
{
ch_printf_color(ch, "They're not carrying that.\n\r");
pop_call();
return;
}
}
}
}
else if ((obj = get_obj_here_even_blinded(ch, arg1)) == NULL)
{
log_build_printf(ch->pIndexData->vnum, "oset_obj on nonexistent target");
pop_call();
return;
}
oset_obj(ch, obj, argument, TRUE);
pop_call();
return;
}
/*
* Added group argument 9/29/08 - Kregor
*/
void do_mpmadd( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
PLAYER_GAME *gch;
push_call("do_mpmadd(%p,%p)",ch,argument);
if (!IS_NPC(ch))
{
send_to_char("Use madd instead.\n\r", ch);
pop_call();
return;
}
argument = one_argument( argument, arg1 );
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
log_build_printf(ch->pIndexData->vnum, "madd_char on nonexistent target");
pop_call();
return;
}
one_argument( argument, arg2 );
/*
group argument will not count NPCs, or immortals
*/
if (!strcasecmp(arg2, "group"))
{
argument = one_argument( argument, arg2 );
for (gch = mud->f_player ; gch ; gch = gch->next)
{
if (IS_NPC(gch->ch))
continue;
if (IS_IMMORTAL(gch->ch))
continue;
if (gch->ch == victim)
continue;
if (!is_same_group(victim, gch->ch))
continue;
madd_char(ch, gch->ch, argument);
}
}
madd_char(ch, victim, argument);
pop_call();
return;
}
void do_mpoadd( CHAR_DATA *ch, char *argument )
{
char arg1 [MAX_INPUT_LENGTH];
char arg2 [MAX_INPUT_LENGTH];
char arg3 [MAX_INPUT_LENGTH];
OBJ_DATA *obj;
CHAR_DATA *victim;
int value;
push_call("do_mpoadd(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
strcpy( arg3, argument );
if (arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0')
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad parameters <mpoadd %s %s %s>", arg1, arg2, arg3);
}
pop_call();
return;
}
if (!strcasecmp(arg1, "on"))
{
argument = one_argument( argument, arg1 );
if ((victim = get_char_room_even_blinded(ch, arg1)) == NULL)
{
ch_printf_color(ch, "They're not here.\n\r");
pop_call();
return;
}
argument = one_argument( argument, arg1 );
{
if ((obj = get_obj_carry_even_blinded(victim, arg1)) == NULL)
{
if ((obj = get_obj_wear_even_blinded(victim, arg1)) == NULL)
{
ch_printf_color(ch, "They're not carrying that.\n\r");
pop_call();
return;
}
}
}
}
if ((obj = get_obj_here_even_blinded(ch, arg1)) == NULL)
{
pop_call();
return;
}
/*
Snarf the value (which need not be numeric).
*/
value = is_number( arg3 ) ? atol( arg3 ) : -1;
/*
Set something.
*/
if ( !strcasecmp( arg1, "charges" ) )
{
switch(obj->item_type)
{
case ITEM_WAND:
case ITEM_STAFF:
break;
default:
pop_call();
return;
}
obj->value[1] = URANGE(0, obj->value[1] + value, obj->value[2]);
pop_call();
return;
}
if (!strcasecmp(arg2, "cost"))
{
obj->cost = URANGE(0, obj->cost + value, 1 << 31);
pop_call();
return;
}
if ( !strcasecmp( arg2, "level" ) )
{
obj->level = URANGE(1, obj->level + value, LEVEL_HERO);
pop_call();
return;
}
if ( !strcasecmp( arg2, "quest" ) )
{
int firstBit,len;
if(sscanf(arg3,"%d %d %d",&firstBit,&len,&value)!=3)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "bad parameters <mpoadd quest %s>", arg3);
}
pop_call();
return;
}
value += get_quest_bits( obj->obj_quest, firstBit, len);
set_quest_bits( &obj->obj_quest, firstBit, len, value);
pop_call();
return;
}
if ( !strcasecmp( arg2, "size" ) )
{
obj->size = URANGE(SIZE_FINE, obj->size + value, SIZE_GARGANTUAN);
pop_call();
return;
}
if ( !strcasecmp( arg2, "timer" ) )
{
value += obj->timer;
value = URANGE(0, value, 32000);
obj->timer = value;
pop_call();
return;
}
if ( !strcasecmp( arg2, "value0" ) || !strcasecmp( arg2, "v0" ) )
{
obj->value[0] = URANGE(0, obj->value[0] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value1" ) || !strcasecmp( arg2, "v1" ) )
{
obj->value[1] = URANGE(0, obj->value[1] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value2" ) || !strcasecmp( arg2, "v2" ) )
{
obj->value[2] = URANGE(0, obj->value[2] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value3" ) || !strcasecmp( arg2, "v3" ) )
{
obj->value[3] = URANGE(0, obj->value[3] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value4" ) || !strcasecmp( arg2, "v4" ) )
{
obj->value[4] = URANGE(0, obj->value[4] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value5" ) || !strcasecmp( arg2, "v5" ) )
{
obj->value[5] = URANGE(0, obj->value[5] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value6" ) || !strcasecmp( arg2, "v6" ) )
{
obj->value[6] = URANGE(0, obj->value[6] + value, 100);
pop_call();
return;
}
if ( !strcasecmp( arg2, "value7" ) || !strcasecmp( arg2, "v7" ) )
{
obj->value[7] = URANGE(0, obj->value[7] + value, 100);
pop_call();
return;
}
if (!strcasecmp(arg2, "weight"))
{
obj->weight = URANGE(0, obj->weight + value, 32000);
pop_call();
return;
}
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Unknown argument: <mpoadd %s %s %s>", arg1, arg2, arg3);
}
pop_call();
return;
}
/*
* mpgorand <startroom> <endroom> <offset> <skipsize>
*
* say, you have a 4x4 area from room #6400 to #6415 arranged like:
*
* 6400 6401 6402 6403
* 6404 6405 6406 6407
* 6408 6409 6410 6411
* 6412 6413 6414 6415
*
* then "mpgorand 6400 6415 0 4" would put the mobile in one of the
* the following rooms: 6400 6404 6408 6412
*
* then "mpgorand 6400 6415 3 4" would put the mobile in one of the
* the following rooms: 6403 6407 6411 6415
*/
void do_mpgorand( CHAR_DATA *ch, char *argument )
{
int cnt, is_gate, startroom, endroom, offset, skipsize, rvnum, beginroom;
push_call("do_mpgorand(%p,%p)",ch,argument);
if (sscanf(argument," %d %d %d %d", &startroom, &endroom, &offset, &skipsize) != 4)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Bad syntax: <mpgorand %s>", argument);
}
else
{
ch_printf_color(ch, "Syntax: mpgorand <firstRoom> <lastRoom> <offset> <skipSize>\n\r");
}
pop_call();
return;
}
is_gate = endroom - startroom;
rvnum = number_range(0, is_gate - offset);
beginroom = startroom + offset + rvnum ;
rvnum = beginroom;
if (skipsize <= 0 || rvnum > endroom || rvnum < startroom || get_room_index(startroom) == NULL)
{
if (IS_NPC(ch))
{
log_build_printf(ch->pIndexData->vnum, "Mpgorand - bad arguments.");
}
pop_call();
return;
}
for (cnt = 0 ; cnt < is_gate ; cnt++)
{
if (rvnum > endroom)
{
rvnum = rvnum - endroom + startroom;
}
if (get_room_index(rvnum) != NULL)
{
if (is_gate > 1000)
{
if (is_room_good_for_teleport(ch, rvnum))
{
break;
}
}
else
{
break;
}
}
rvnum += skipsize;
}
if (cnt == is_gate)
{
log_printf("transference: failed after %d loops", is_gate);
}
else
{
transference(ch, rvnum);
}
pop_call();
return;
}
void transference( CHAR_DATA *victim, int location )
{
CHAR_DATA *mount;
push_call("transference(%p,%p)",victim,location);
mount = victim->mounting;
char_from_room( victim );
char_to_room( victim, location, TRUE );
victim->mounting = mount;
pop_call();
return;
}
/*
* For setting crafts and knowledge skills thru mob quests
* syntax: mppractice victim skill_name max
*/
void do_mppractice( CHAR_DATA * ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int sn, max, adept;
char *skill_name;
push_call("do_mppractice(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if (!IS_NPC(ch))
{
send_to_char( "Only mobiles can use this command.\n\r", ch );
pop_call();
return;
}
if( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
{
log_printf( "%s: bad parameters <mppractice %s %s %s>", ch->name, arg1, arg2, arg3);
pop_call();
return;
}
if ( ( victim = get_char_room_even_blinded( ch, arg1 ) ) == NULL )
{
log_printf( "%s: mppractice: No target", ch->name );
pop_call();
return;
}
if( ( sn = skill_lookup( arg2 ) ) < 0 )
{
log_printf( "%s: mppractice: Invalid spell/skill name", ch->name );
pop_call();
return;
}
if( skill_table[sn].skilltype != FSKILL_CRAFT && skill_table[sn].skilltype != FSKILL_KNOWLEDGE )
{
log_printf( "%s: mppractice: sn not a craft or knowledge skill", ch->name );
pop_call();
return;
}
if( IS_NPC( victim ) )
{
log_printf( "%s: mppractice: Can't train a mob", ch->name );
pop_call();
return;
}
skill_name = skill_table[sn].name;
max = atoi( arg3 );
if( ( max < 0 ) || ( max > 100 ) )
{
sprintf( buf, "%s: mp_practice: Invalid maxpercent: %d", ch->name, max );
log_printf( buf );
pop_call();
return;
}
/*
* adept is how high the player can learn it
*/
adept = victim->level + 3;
if (multi(victim , sn) == -1)
{
adept /= 2;
}
if( ( victim->learned[sn] >= adept ) || ( victim->learned[sn] >= max ) )
{
ch_printf_color(victim, "%s shows some knowledge of %s, but yours is clearly superior.\n\r", get_name(ch), skill_name );
pop_call();
return;
}
/*
* past here, victim learns something
*/
ch_printf_color(victim, "%s demonstrates %s to you. You feel more learned in this subject.\n\r", get_name(ch), skill_name );
log_printf( "%s: mppractice: %s has gained one point in %s", ch->name, victim, skill_name );
victim->learned[sn] += 1;
if( victim->learned[sn] >= adept )
{
victim->learned[sn] = adept;
ch_printf_color( victim, "You have learned all you can for now on this subject.\n\r" );
}
pop_call();
return;
}
/*
* syntax: mpsetfeat victim feat_name <"ignore" to ignore prerequisites>
*/
void do_mpsetfeat( CHAR_DATA * ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
char arg3[MAX_INPUT_LENGTH];
char buf[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int sn;
char *skill_name;
push_call("do_mpsetfeat(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
argument = one_argument( argument, arg3 );
if( arg1[0] == '\0' || arg2[0] == '\0' )
{
log_printf( "%s: bad parameters <mpsetfeat %s %s %s>", ch->name, arg1, arg2, arg3);
pop_call();
return;
}
if ( ( victim = get_char_room_even_blinded( ch, arg1 ) ) == NULL )
{
log_printf( "%s: mpsetfeat: No target", ch->name );
pop_call();
return;
}
if( ( sn = skill_lookup( arg2 ) ) < 0 )
{
log_printf( "%s: mpsetfeat: Invalid spell/skill name", ch->name );
pop_call();
return;
}
if( skill_table[sn].skilltype != FSKILL_FEAT && skill_table[sn].skilltype != FSKILL_WEAPON )
{
log_printf( "%s: mpsetfeat: sn not a feat or weapon prof.", ch->name );
pop_call();
return;
}
if( IS_NPC( victim ) )
{
log_printf( "%s: mpsetfeat %s: Can't train a mob", ch->name, victim->name );
pop_call();
return;
}
skill_name = skill_table[sn].name;
/*
* still has to have a prereqs unless "ignore" is in command
*/
if( arg3[0] == '\0' || strcasecmp(arg3, "ignore") )
{
if (!can_train_feat(victim, sn, TRUE))
{
sprintf( buf, "%s: mpsetfeat %s: target missing prerequisites.", ch->name, victim->name );
log_printf( buf );
pop_call();
return;
}
}
/*
* still has to have a feat point to train it
*/
if( ch->pcdata->feat_pts <= 0 )
{
ch_printf_color(victim, "You lack the feat point to learn %s from %s.\n\r", skill_name, get_name(ch) );
sprintf( buf, "%s: mpsetfeat %s: target lacks a feat pt.", ch->name, victim->name );
log_printf( buf );
pop_call();
return;
}
/*
* past here, victim learns something
*/
ch_printf_color(victim, "%s demonstrates the art of %s to you.\n\r", get_name(ch), skill_name );
log_printf( "%s: mpsetfeat: %s has gained one point in %s", ch->name, victim, skill_name );
if (learned(victim,sn) == 1)
victim->learned[sn] = 2;
else
victim->learned[sn] += 1;
victim->pcdata->feat_pts -= 1;
victim->pcdata->skill_level[victim->level][sn] += 1;
pop_call();
return;
}
/*
* syntax: mpclearfeat victim feat_name
*/
void do_mpclearfeat( CHAR_DATA * ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
char arg2[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
int sn, points;
char *skill_name;
push_call("do_mpclearfeat(%p,%p)",ch,argument);
argument = one_argument( argument, arg1 );
argument = one_argument( argument, arg2 );
if( arg1[0] == '\0' || arg2[0] == '\0' )
{
log_printf( "%s: bad parameters <mpclearfeat %s %s>", ch->name, arg1, arg2);
pop_call();
return;
}
if ( ( victim = get_char_room_even_blinded( ch, arg1 ) ) == NULL )
{
log_printf( "%s: mpclearfeat: No target", ch->name );
pop_call();
return;
}
if( ( sn = skill_lookup( arg2 ) ) < 0 )
{
log_printf( "%s: mpclearfeat: Invalid spell/skill name", ch->name );
pop_call();
return;
}
/* Make sure we don't try to clear default feats, only trained ones */
if( ch->learned[sn] == 0 )
{
log_printf( "%s: mpclearfeat %s: no points in feat", ch->name, victim->name );
pop_call();
return;
}
if( skill_table[sn].skilltype != FSKILL_FEAT && skill_table[sn].skilltype != FSKILL_WEAPON )
{
log_printf( "%s: mpclearfeat %s: sn not a feat or weapon proficiency", ch->name, victim->name );
pop_call();
return;
}
if( IS_NPC( victim ) )
{
log_printf( "%s: mpclearfeat %s: Can't set a mob", ch->name, victim->name );
pop_call();
return;
}
skill_name = skill_table[sn].name;
points = ch->learned[sn];
/*
* lose the feat, get the feat points back
*/
victim->learned[sn] = 0;
victim->pcdata->feat_pts += points;
log_printf( "%s: mpclearfeat: %s has had their points in %s reset", ch->name, victim, skill_name );
pop_call();
return;
}
/*
* Set the walking path of a mobile.
* uses the funcitons in pathfind.c - Kregor 6/22/07
*/
void do_mpwalkto( CHAR_DATA *ch, char *argument )
{
int area_size, vnum;
ROOM_INDEX_DATA *room;
push_call("do_mpwalkto(%p,%p)",ch,argument);
if (!IS_NPC(ch))
{
pop_call();
return;
}
if (!is_number(argument))
{
log_build_printf(ch->in_room->vnum, "do_mpwalkto: argument must be a number");
pop_call();
return;
}
vnum = atol (argument);
if ((room = get_room_index(vnum)) == NULL)
{
log_build_printf(ch->in_room->vnum, "do_mpwalkto: invalid room vnum");
pop_call();
return;
}
if (ch->in_room == room)
{
pop_call();
return;
}
if (ch->in_room->area != room->area)
{
pop_call();
return;
}
if ((area_size = ch->in_room->area->hi_r_vnum - ch->in_room->area->low_r_vnum) >= 2000)
{
log_build_printf(ch->in_room->vnum, "do_mpwalkto: Area too big");
pop_call();
return;
}
ch->walkto = vnum;
pop_call();
return;
}
/*
* Taken from do_follow, for mobile progs bypasses
* PC restrictions, and also groups mobile with the
* group leader of the target - Kregor
*/
void do_mpfollow (CHAR_DATA * ch, char *argument)
{
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *victim;
push_call("do_follow(%p,%p)",ch,argument);
one_argument (argument, arg);
if (!IS_NPC(ch))
{
pop_call();
return;
}
if (arg[0] == '\0')
{
pop_call();
return;
}
if ((victim = get_char_room_even_blinded (ch, arg)) == NULL)
{
pop_call();
return;
}
if (victim == ch)
{
if (ch->master == NULL)
{
pop_call();
return;
}
stop_follower(ch);
pop_call();
return;
}
if (ch->master != NULL)
{
stop_follower (ch);
}
add_follower (ch, victim);
if (victim->leader)
ch->leader = victim->leader;
else
ch->leader = victim;
pop_call();
return;
}
/*
* lock or unlock a door or container without a key - Kregor
*/
void do_mplock( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
int door;
OBJ_DATA *obj;
EXIT_DATA *pExit;
push_call("do_mplock(%p,%p)",ch,argument);
smash_tilde( argument );
strcpy( arg, argument );
if (arg[0] == '\0')
{
send_to_char( "Syntax: mplock <object|direction>\n\r",ch );
pop_call();
return;
}
if ((obj = get_obj_here(ch, arg)) != NULL)
{
switch (obj->item_type)
{
case ITEM_CONTAINER:
case ITEM_SHEATH:
case ITEM_SPELLPOUCH:
case ITEM_CART:
case ITEM_QUIVER:
SET_BIT(obj->value[1], CONT_LOCKED);
break;
default:
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "mplock: Invalid object type");
else
ch_printf_color(ch, "Invalid object type.\n\r");
break;
}
pop_call();
return;
}
door = direction_door(arg);
if (door < 0)
{
door = atol(arg);
}
if (door < 0 || door > 5)
{
send_to_char ("Invalid exit direction.\n\r",ch);
pop_call();
return;
}
if ((pExit = ch->in_room->exit[door]) == NULL)
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "mplock: Invalid direction %s", arg);
send_to_char( "There is no exit in that direction.\n\r", ch);
pop_call();
return;
}
if (!IS_SET(pExit->exit_info, EX_ISDOOR))
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "mplock: door not set %s", arg);
send_to_char( "There is no door in that direction.\n\r", ch);
pop_call();
return;
}
SET_BIT(pExit->exit_info, EX_CLOSED);
SET_BIT(pExit->exit_info, EX_LOCKED);
pop_call();
return;
}
void do_mpunlock( CHAR_DATA *ch, char *argument )
{
char arg [MAX_INPUT_LENGTH];
int door;
OBJ_DATA *obj;
EXIT_DATA *pExit;
push_call("do_mpunlock(%p,%p)",ch,argument);
smash_tilde( argument );
strcpy( arg, argument );
if (arg[0] == '\0')
{
send_to_char( "Syntax: mpunlock <object|direction>\n\r",ch );
pop_call();
return;
}
if ((obj = get_obj_here(ch, arg)) != NULL)
{
switch (obj->item_type)
{
case ITEM_CONTAINER:
case ITEM_SHEATH:
case ITEM_SPELLPOUCH:
case ITEM_QUIVER:
case ITEM_CART:
REMOVE_BIT(obj->value[1], CONT_LOCKED);
break;
default:
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "mpunlock: Invalid object type");
else
ch_printf_color(ch, "Invalid object type.\n\r");
break;
}
pop_call();
return;
}
door = direction_door(arg);
if (door < 0)
{
door = atol(arg);
}
if (door < 0 || door > 5)
{
send_to_char ("Invalid exit direction.\n\r",ch);
pop_call();
return;
}
if ((pExit = ch->in_room->exit[door]) == NULL)
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "mpunlock: Invalid direction %s", arg);
send_to_char( "There is no exit in that direction.\n\r", ch);
pop_call();
return;
}
if (!IS_SET(pExit->exit_info, EX_ISDOOR))
{
if (IS_NPC(ch))
log_build_printf(ch->pIndexData->vnum, "mpunlock: door not set %s", arg);
send_to_char( "There is no door in that direction.\n\r", ch);
pop_call();
return;
}
REMOVE_BIT(pExit->exit_info, EX_LOCKED);
pop_call();
return;
}