> From: Tom Dailey <tomd@waymark.net>
<SNIP>
> The following is the code from within the function: Any help is
> appreciated...we're stuck on this buf var because
> it seems to be overflowing.
It wasn't a buf overflow it was this:
<snip unneeded code>
> if(!vict) {
> if(GET_POS(ch) == POS_FIGHTING) { vict = FIGHTING(ch); }
> else {
> for (vict = world[ch->in_room].people; vict; vict =
vict->next_in_room) {
> if (FIGHTING(vict) == ch && !number(0, 3)) { break; }
> }
> }
<snipped rest of code>
Thre problem was that you were only setting the vict cariable to whoever the
char was fighting. This caused a problem when you tried throwing a potion
while not fighting, ie, the following line tried calling a vict variable that
wasn't initalized all the time:
> sprintf(buf, "You throw %s and it shatters on %s!\r\n",
> obj->short_description, GET_NAME(vict));
I added a warning against that, and changed a bunch of your
sprintf..send_to_char to act
here is the fixed version
-Astaroth
ACMD(do_throw)
{
int dam, spell, level;
struct char_data *vict;
struct obj_data *obj;
two_arguments(argument, buf, arg);
if(!*buf && !*arg) {
send_to_char("Usage: Throw <item> [target]\r\n", ch);
return;
}
if(!has_skill(ch, SKILL_THROW)) {
send_to_char("You do not know how to throw things with any accuracy.\r\n",
ch);
return;
}
generic_find(buf, FIND_OBJ_INV, ch, 0, &obj);
if(!obj) {
send_to_char("You do not appear to have that.\r\n", ch);
return;
}
if(*arg) {
if(!(vict = get_char_room_vis(ch, arg))) {
send_to_char("They dont seem to be here.\r\n", ch);
return;
}
}
switch(GET_OBJ_TYPE(obj)) {
case ITEM_THROWN:
if(!vict) {
send_to_char("Throw it at whom?\r\n", ch);
return;
}
if(skill_check(ch, SKILL_THROW, 0, FALSE)) {
dam = dice(GET_OBJ_VAL(obj, 1), GET_OBJ_VAL(obj, 2));
sprintf(buf, "Damage: %d\r\n", dam);
send_to_char(buf, ch);
damage(ch, vict, dam, TYPE_HIT);
} else {
act("You throw $p at $N, but miss.", FALSE, ch, obj, vict, TO_CHAR);
act("$n throw $p at $N, but misses.", TRUE, ch, obj, vict, TO_ROOM);
}
if(GET_OBJ_VAL(obj, 0) <= 1)
extract_obj(obj);
else
GET_OBJ_VAL(obj, 0) -= 1;
break;
case ITEM_POTION:
spell = GET_OBJ_VAL(obj, 1);
level = GET_OBJ_VAL(obj, 0);
if(spell == PRAYER_EARTHQUAKE || spell == SPELL_BLACK_RAIN) {
if(!(skill_check(ch, SKILL_THROW, 5, 0))) {
act("You throw $p and it shatters with just a puff of smoke.", FALSE,
ch, obj, 0, TO_CHAR);
act("$n throws $p and it shatters with just a puff of smoke.", FALSE,
ch, obj, 0, TO_ROOM);
} else {
act("You throw $p and it shatters on the ground!", FALSE, ch, obj, 0,
TO_CHAR);
act("$n throws $p and it shatters on the ground!", TRUE, ch, obj, 0,
TO_ROOM);
mag_areas(level, ch, spell, SAVING_SPELL);
}
} else {
if(!vict) {
if(GET_POS(ch) == POS_FIGHTING)
vict = FIGHTING(ch);
else {
for (vict = world[ch->in_room].people; vict; vict =
vict->next_in_room) {
if (FIGHTING(vict) == ch && !number(0, 3))
break;
}
if (!vict) { /* If there is still no victim... */
send_to_char("You aren't fighting anyone!\r\n", ch);
return;
}
}
}
if(!(skill_check(ch, SKILL_THROW, 0, 0))) {
act("You fumble $p while trying to throw it!", FALSE, ch, obj, 0,
TO_CHAR);
act("$n fumbles $p while trying to throw it!", FALSE, ch, obj, 0,
TO_ROOM);
} else {
act("You throw $p and it shatters on $N!", FALSE, ch, obj, vict,
TO_CHAR);
act("$n throws $p and it shatters on $N!", TRUE, ch, obj, vict,
TO_ROOM);
mag_damage(level, ch, vict, spell, SAVING_SPELL);
}
}
extract_obj(obj);
break;
default:
/* I moved this down here so you wouldn't fail the check before.
Now you can have throwable items besides potions... */
send_to_char("You can't throw that.\r\n", ch);
break;
}
WAIT_STATE(ch, PULSE_VIOLENCE*2); /* I moved this down here because it was
common to your two cases */
if (FIGHTING(vict) != ch) /* Start them fighting, if they aren't already */
FIGHTING(vict) == ch;
}
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST