On Tue, 4 Jun 1996, Tarot wrote:
> Ok, call me a moron, but does anyone know why this code (from the end of
> fight.c) causes the mud to crash?
>
> /* Auto DHIT */
> if (GET_LEVEL(ch) >= 15 && GET_CLASS(ch) == CLASS_WARRIOR && !IS_NPC(ch))
> hit(ch, FIGHTING(ch), TYPE_UNDEFINED);
> /* end of Auto DHIT */
> hit(ch, FIGHTING(ch), TYPE_UNDEFINED);
> if (MOB_FLAGGED(ch, MOB_SPEC) && mob_index[GET_MOB_RNUM(ch)].func !=
> NULL) (mob_index[GET_MOB_RNUM(ch)].func) (ch, ch, 0, "");
> I think I might have missed something earlyer in the code, but not quite
> sure. I player hits and then Dhits then the prompt appears and the mud crashes.
Hehe, well, the obvious thing I'd suggest is to make a check like
if FIGHTING(ch)
blah blah, for each of the hit() calls..
The reason why the mud crashes is 99% sure because of you not checking. I
can't remember if the perform_violence() routine checks for the fact
wether or not you're fighting at the beginning, but even if it does so,
here is the reason why you crash:
By calling perform_violence (which was set up as a single attack procedure)
you'r char is 'cleared', as beeing able to fight.
then you call the first hit(), and it does the hit stuff.. but
coincidence does, that the mob/char you fight dies (which means the
char_data structire FIGHTING(ch) is reffering to, no longer exists), so
now you call it once again (dual hit:), and as you call the hit()
procedure with somethign that does not exist (In real code I just think
it refferences to a code segment which the program no longer owns), the
mud will SEGFAULT..
bottom line, add a if(FIGHTING(ch)) at each hit() call..
Regards,
Con.
d.
--
Rasmus Rønlev DOEK'94 WWW: http://www.econ.cbs.dk/people/raro94ab
Student instructor MUD: exiled.mud.circlemud.org 5000
199.199.16.100 5000
Student, B.Sc in Computer Science and Business Administration.
This archive was generated by hypermail 2b30 : 12/18/00 PST