/* RT Enter portals */ void do_enter( CHAR_DATA *ch, char *argument) { ROOM_INDEX_DATA *location; if ( ch->fighting != NULL ) return; /* nifty portal stuff */ if (argument[0] != '\0') { ROOM_INDEX_DATA *old_room; OBJ_DATA *portal; CHAR_DATA *fch, *fch_next; old_room = ch->in_room; portal = get_obj_list( ch, argument, ch->in_room->contents ); if (portal == NULL) { send_to_char("You don't see that here.\n\r",ch); return; } if (portal->item_type != ITEM_PORTAL || (IS_SET(portal->value[1],EX_CLOSED) && !IS_TRUSTED(ch,KNIGHT))) { send_to_char("You can't seem to find a way in.\n\r",ch); return; } if (!IS_TRUSTED(ch,KNIGHT) && !IS_SET(portal->value[2],GATE_NOCURSE) && IS_AFFECTED(ch,AFF_CURSE) ) { send_to_char("Something prevents you from leaving...\n\r",ch); return; } if (IS_SET(portal->value[2],GATE_RANDOM) || portal->value[3] == -1) { location = get_random_room(ch); portal->value[3] = location->vnum; /* for record keeping :) */ } else if (IS_SET(portal->value[2],GATE_BUGGY) && (number_percent() < 5)) location = get_random_room(ch); else location = get_room_index(portal->value[3]); if (location == NULL || location == old_room || !can_see_room(ch,location) || (room_is_private(ch,location) && !IS_TRUSTED(ch,IMPLEMENTOR))) { act("$p doesn't seem to go anywhere.",ch,portal,NULL,TO_CHAR); return; } if (IS_NPC(ch) && IS_SET(ch->act,ACT_AGGRESSIVE) && IS_SET(location->room_flags,ROOM_LAW)) { send_to_char("Something prevents you from leaving...\n\r",ch); return; } act("$n steps into $p.",ch,portal,NULL,TO_ROOM); if (IS_SET(portal->value[2],GATE_NORMAL_EXIT)) act("You enter $p.",ch,portal,NULL,TO_CHAR); else act("You walk through $p and find yourself somewhere else...", ch,portal,NULL,TO_CHAR); char_from_room(ch); char_to_room(ch, location); if (IS_SET(portal->value[2],GATE_GOWITH)) /* take the gate along */ { obj_from_room(portal); obj_to_room(portal,location); } if (IS_SET(portal->value[2],GATE_NORMAL_EXIT)) act("$n has arrived.",ch,portal,NULL,TO_ROOM); else act("$n has arrived through $p.",ch,portal,NULL,TO_ROOM); do_look(ch,"auto"); /* charges */ if (portal->value[0] > 0) { portal->value[0]--; if (portal->value[0] == 0) portal->value[0] = -1; } /* protect against circular follows */ if (old_room == location) return; for ( fch = old_room->people; fch != NULL; fch = fch_next ) { fch_next = fch->next_in_room; if (portal == NULL || portal->value[0] == -1) /* no following through dead portals */ continue; if ( fch->master == ch && IS_AFFECTED(fch,AFF_CHARM) && fch->position < POS_STANDING) do_stand(fch,""); if ( fch->master == ch && fch->position == POS_STANDING) { if (IS_SET(ch->in_room->room_flags,ROOM_LAW) && (IS_NPC(fch) && IS_SET(fch->act,ACT_AGGRESSIVE))) { act("You can't bring $N into the city.", ch,NULL,fch,TO_CHAR); act("You aren't allowed in the city.", fch,NULL,NULL,TO_CHAR); continue; } act( "You follow $N.", fch, NULL, ch, TO_CHAR ); do_enter(fch,argument); } } if (portal != NULL && portal->value[0] == -1) { act("$p fades out of existence.",ch,portal,NULL,TO_CHAR); if (ch->in_room == old_room) act("$p fades out of existence.",ch,portal,NULL,TO_ROOM); else if (old_room->people != NULL) { act("$p fades out of existence.", old_room->people,portal,NULL,TO_CHAR); act("$p fades out of existence.", old_room->people,portal,NULL,TO_ROOM); } extract_obj(portal); } /* * If someone is following the char, these triggers get activated * for the followers before the char, but it's safer this way... */ if ( IS_NPC( ch ) && HAS_TRIGGER( ch, TRIG_ENTRY ) ) mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_ENTRY ); if ( !IS_NPC( ch ) ) mp_greet_trigger( ch ); return; } send_to_char("Nope, can't do it.\n\r",ch); return; }
void do_at(struct char_data *ch, const char *argument) { struct room_index_data *location = NULL; struct room_index_data *original; struct char_data *wch = NULL; struct char_data *vch = NULL; struct gameobject *on; char arg[MAX_INPUT_LENGTH]; char cmd[MAX_STRING_LENGTH]; DENY_NPC(ch) argument = one_argument(argument, arg); if (arg[0] == '\0' || argument[0] == '\0' || arg[0] == '?' || !str_cmp(arg, "help")) { show_help(ch->desc, "at_imm_command", NULL); return; } if (!str_prefix(arg, "random")) { struct area_data *area; char check[MAX_INPUT_LENGTH]; argument = one_argument(argument, arg); area = NULL; one_argument(argument, check); if (!str_prefix(check, "area")) { argument = one_argument(argument, check); area = ch->in_room->area; } if (!str_prefix(arg, "room")) { location = get_random_room(ch, area); } else if (!str_prefix(arg, "mob")) { vch = get_random_npc(ch, area); location = vch->in_room; } else if (!str_prefix(arg, "char") || !str_prefix(arg, "player")) { vch = get_random_pc(ch, area); location = vch->in_room; } } else { location = find_location(ch, arg); } if (location == NULL) { send_to_char("No such location.\n\r", ch); return; } if (!is_room_owner(ch, location) && room_is_private(location) && get_trust(ch) < LEVEL_IMMORTAL) { send_to_char("That room is private right now.\n\r", ch); return; } original = ch->in_room; on = ch->on; char_from_room(ch); char_to_room(ch, location); if (vch != NULL) { if (expand_cmd(vch, argument, cmd, '@')) interpret(ch, cmd); } else { interpret(ch, argument); } /* * See if 'ch' still exists before continuing! * Handles 'at XXXX quit' case. */ for (wch = char_list; wch != NULL; wch = wch->next) { if (wch == ch) { char_from_room(ch); char_to_room(ch, original); ch->on = on; break; } } return; }