39 va_start(args, eventcode);
44 op = va_arg(args,
object *);
46 (*(*gh).second)(&rt, eventcode, op);
53 (*(*gh).second)(&rt, eventcode);
59 (*(*gh).second)(&rt, eventcode);
65 op = va_arg(args,
object *);
66 op2 = va_arg(args,
object *);
68 (*(*gh).second)(&rt, eventcode, op, op2);
74 op = va_arg(args,
object *);
75 op2 = va_arg(args,
object *);
77 (*(*gh).second)(&rt, eventcode, op, op2);
83 pl = va_arg(args,
player *);
84 buf = va_arg(args,
char *);
86 (*(*gh).second)(&rt, eventcode, pl, buf);
92 pl = va_arg(args,
player *);
93 buf = va_arg(args,
char *);
95 (*(*gh).second)(&rt, eventcode, pl, buf);
101 op = va_arg(args,
object *);
104 (*(*gh).second)(&rt, eventcode, op, map);
110 op = va_arg(args,
object *);
113 (*(*gh).second)(&rt, eventcode, op, map);
121 (*(*gh).second)(&rt, eventcode, map);
127 op = va_arg(args,
object *);
129 (*(*gh).second)(&rt, eventcode, op);
135 op = va_arg(args,
object *);
136 buf = va_arg(args,
char *);
137 i = va_arg(args,
int);
139 (*(*gh).second)(&rt, eventcode, op, buf, i);
145 op = va_arg(args,
object *);
146 buf = va_arg(args,
const char *);
147 op2 = va_arg(args,
object *);
149 (*(*gh).second)(&rt, eventcode, op, buf, op2);
155 op = va_arg(args,
object *);
156 buf = va_arg(args,
char *);
158 (*(*gh).second)(&rt, eventcode, op, buf);
164 op = va_arg(args,
object *);
165 buf = va_arg(args,
char *);
167 (*(*gh).second)(&rt, eventcode, op, buf);
175 (*(*gh).second)(&rt, eventcode, map);
183 (*(*gh).second)(&rt, eventcode, map);
191 (*(*gh).second)(&rt, eventcode, map);
199 op = va_arg(args,
object *);
200 op2 = va_arg(args,
object *);
201 uint64_t price = va_arg(args, uint64_t);
203 (*(*gh).second)(&rt, eventcode, op, op2, price);
216 object *inv = op->
inv;
226 static int do_execute_event(
object *op,
int eventcode,
object *activator,
object *third,
const char *message,
int fix,
talk_info *talk) {
228 bool debug_events = (getenv(
"CF_DEBUG_EVENTS") != NULL);
238 LOG(
llevDebug,
"********** EVENT HANDLER **********\n");
240 if (activator != NULL)
245 if (tmp->title != NULL)
247 if (tmp->slaying != NULL)
249 if (tmp->name != NULL)
253 if (tmp->title == NULL) {
255 LOG(
llevError,
"Event object without title at %d/%d in map %s\n", env->
x, env->
y, env->
map ? env->
map->
name :
"(null map)");
258 }
else if (tmp->slaying == NULL) {
260 LOG(
llevError,
"Event object without slaying at %d/%d in map %s\n", env->
x, env->
y, env->
map ? env->
map->
name :
"(null map)");
267 LOG(
llevError,
"The requested handler doesn't exist: %s at %d/%d in map %s\n", tmp->title, env->
x, env->
y, env->
map ? env->
map->
name :
"(null map)");
275 rv = (*(*handler).second)(&rvt, op, activator, third, message, fix, tmp, talk);
281 LOG(
llevDebug,
"Removing unique event %s\n", tmp->slaying);
301 LOG(
llevDebug,
"events: registered object handler %s\n",
id);
306 LOG(
llevDebug,
"events: unregistered object handler %s\n",
id);
310 return do_execute_event(op, eventcode, activator, third, message, fix, NULL);
#define EVENT_SAY
Someone speaks.
void events_register_object_handler(const char *id, f_plug_event handler)
Register an object event handler.
#define EVENT_REMOVE
A Player character has been removed.
static int do_execute_event(object *op, int eventcode, object *activator, object *third, const char *message, int fix, talk_info *talk)
void LOG(LogLevel logLevel, const char *format,...)
Logs a message to stderr, or to file.
#define EVENT_LOGOUT
Player logout.
#define EVENT_MAPUNLOAD
A map is freed (includes swapping out)
static std::map< event_registration, f_plug_event > global_handlers[NR_EVENTS]
To turn on verbose messages about events in the debug log, set the CF_DEBUG_EVENTS environment variab...
void object_remove(object *op)
This function removes the object op from the linked list of objects which it is currently tied to...
object * below
Pointer to the object stacked below this one.
static event_registration eg
#define NR_EVENTS
Number of events, maximum code + 1.
#define EVENT_LOGIN
Player login.
int16_t y
Position in the map for this object.
#define FREE_OBJ_NO_DESTROY_CALLBACK
Do not run the destroy callback.
#define object_was_destroyed(op, old_tag)
Checks if an object still exists.
#define EVENT_KICK
A player was Kicked by a DM.
Global type definitions and header inclusions.
void events_execute_global_event(int eventcode,...)
Execute a global event.
static std::shared_ptr< inja::Environment > env
Rendering environment.
void object_free(object *ob, int flags)
Frees everything allocated by an object, removes it from the list of used objects, and puts it on the list of free objects.
#define BITMASK_VALID
Bit indicating if the event bitmask is valid or not.
#define EVENT_CRASH
Triggered when the server crashes.
unsigned long event_registration
Registration identifier type.
Structure used to build up dialog information when a player says something.
const char * text
What the player actually said.
#define QUERY_FLAG(xyz, p)
#define EVENT_MAPRESET
A map is resetting.
#define EVENT_BORN
A new character has been created.
#define EVENT_GKILL
Triggered when anything got killed by anyone.
#define FOR_INV_FINISH()
Finishes FOR_INV_PREPARE().
#define EVENT_CLOCK
Global time event.
#define EVENT_MAPREADY
A map is ready, either first load or after reload.
uint64_t event_bitmask
Bitmask of events this object has a handler for, see events.h.
#define EVENT_TELL
A player 'tell' something.
#define EVENT_MAPLEAVE
A player left a map.
object * object_get_env_recursive(object *op)
Utility function.
uint32_t tag_t
Object tag, unique during the whole game.
#define EVENT_PLAYER_DEATH
Global Death event.
#define EVENT_USER
User-defined event.
struct mapstruct * map
Pointer to the map in which this object is present.
#define EVENT_GSOLD
Player sold object in shop, but global.
#define EVENT_MAPENTER
A player entered a map.
int(* f_plug_event)(int *type,...)
Function to call to handle global or object-related events.
static std::map< std::string, f_plug_event > object_handlers
sstring name
The name of the object, obviously...
Only for debugging purposes.
uint8_t type
PLAYER, BULLET, etc.
#define BITMASK_EVENT(evt)
Convert an event to its bit.
static void ensure_bitmask(object *op)
void events_unregister_global_handler(int eventcode, event_registration id)
Remove a global event handler.
object * inv
Pointer to the first object in the inventory.
struct object * who
Player saying something.
Lauwenmark: an invisible object holding a plugin event hook.
int events_execute_object_event(object *op, int eventcode, object *activator, object *third, const char *message, int fix)
Execute an event on the specified object.
#define EVENT_MAPLOAD
A map is loaded (pristine state)
void events_unregister_object_handler(const char *id)
Remove an object event handler.
event_registration events_register_global_handler(int eventcode, f_plug_event hook)
Register a global event handler.
#define EVENT_MUZZLE
A player was Muzzled (no_shout set).
int events_execute_object_user(object *op, object *activator, object *third, const char *message, int fix)
Execute an EVENT_USER on the specified object.
uint8_t subtype
Subtype of object.
#define EVENT_SHOUT
A player 'shout' something.
tag_t count
Unique object number for this object.
#define FLAG_UNIQUE
Item is really unique (UNIQUE_ITEMS)
static event_registration next_event_registration
#define FOR_INV_PREPARE(op_, it_)
Constructs a loop iterating over the inventory of an object.
char * name
Name of map as given by its creator.
#define EVENT_GBOUGHT
Player bought object in shop, but global.
int events_execute_object_say(object *npc, talk_info *talk)
Execute an EVENT_SAY on the specified object.