Abermud Central is pretty much an abandoned site, but someone posted this code months ago that I just noticed: Damian Miller's Event Handler Code for iDiRT 1.82 All I ask is if you use this that you give me a little credit,
Makefile add events.o to MUDDOBJS events.h #ifndef _EVENTS_H_ #define _EVENTS_H_ typedef struct _event_sys { struct _event_sys *next; Boolean use; char name[50]; time_t timer; time_t reset_timer; void (*output_func)(); }_EVENT_SYS; void load_events(); void do_events(); void eventscom (); #endif events.c #include "kernel.h" #include "mud.h" #include "log.h" #include "bootstrap.h" #include "sendsys.h" #include "mobile.h" #include "timing.h" #include "locations.h" #include "objsys.h" #include "bprintf.h" #include "events.h" #include "parse.h" #include "utils.h" _EVENT_SYS *ehead, *etail; typedef _EVENT_SYS *eventsys; void event_healall(); void add_event(char *name, Boolean use, time_t t, void (*d)()) { _EVENT_SYS *ecur; if(ehead==NULL) { ehead = NEW(_EVENT_SYS, 1); etail = ehead; ecur = ehead; } else { etail->next = NEW(_EVENT_SYS, 1); etail = etail->next; } strcpy(etail->name, name); etail->use = use; etail->reset_timer = t; etail->output_func = d; etail->next = NULL; } void do_events () { _EVENT_SYS *event; for (event = ehead; event != NULL; event = event->next) { if (event->use == True) { ++event->timer; if (event->timer >= event->reset_timer) { (void) event->output_func(); event->timer = 0; } } } } //Load the events into the system. void load_events () { // Name Use? Reset Function add_event("healall", True, 300, event_healall); } //A command to show events in the mud. void eventscom () { _EVENT_SYS *event; char tleft[64]; int count; if (plev (mynum) < LVL_ARCHWIZARD) { erreval (); return; } bprintf ("&+RTimed &+Cevents &+cin the &+Gland &+cof &+m%s&+c.\n", COL_NAME); bprintf ("&+r-------------------------------------------------------------------------------\n"); bprintf ("&+W%-12s %-6s %-9s\n", "Name", "Active", "Time Left"); bprintf ("&+r-------------------------------------------------------------------------------\n"); for (event = ehead, count = 0; event != NULL; event = event->next, ++count) { strcpy (tleft, sec_to_hhmmss (event->reset_timer - event->timer)); bprintf ("&+g%-12s %-6s %-9s\n", capitalize(event->name), event->use == True ? "Yes" : "No", tleft); } bprintf ("&+r-------------------------------------------------------------------------------\n"); bprintf ("&+cTotal &+YEvents&+C: &+g%d\n", count); } /************************************************************ * Start of events, lets hope all these are nice * ************************************************************/ void event_healall () { int i; int j = 0; for (i = 0; i < max_players; ++i) { if (is_in_game (i) && pfighting (i) < 0 && plev (i) < LVL_WIZARD && ((pstr (i) < maxstrength (i) || pmagic (i) < maxmagic (i)) || (pstr (i) < maxstrength (i) && pmagic (i) < maxmagic (i)))) { setpstr (i, maxstrength (i)); setpmagic (i, maxmagic (i)); ++j; sendf (i, "&+m%s &+cunleashes a healing spell over the world.\n", MUD_NAME); } } if(!j==0) send_msg (DEST_ALL, MODE_QUIET, LVL_WIZARD, LVL_MAX, mynum, NOBODY, "&+r[&+gEvent: &+CAuto &+YHeal All&+r]\n"); } open up main.c and add this at the bottom of the includes: #include "events.h" then look for the on_timer(); and below it add: do_events(); save and exit. open up bootstrap.c and include events.h then in boot_world() add: load_events(); add the verb "events" to verbs.src then add #include "events.h" to parse.c and somewhere where you put your commands add: case VERB_EVENTS: eventscom(); break; save and exit. and you got my event code. do a make clean or rm -rf *.o first
Posted by abermud
at 11:43 AM CST