8080 'OnEntitySpawned' ,
8181 'OnLevelInit' ,
8282 'OnLevelShutdown' ,
83+ 'OnMapEnd' ,
8384 'OnNetworkidValidated' ,
8485 'OnPluginLoaded' ,
8586 'OnPluginUnloaded' ,
104105 'on_entity_output_listener_manager' ,
105106 'on_entity_pre_spawned_listener_manager' ,
106107 'on_entity_spawned_listener_manager' ,
108+ 'on_map_end_listener_manager' ,
107109 'on_level_init_listener_manager' ,
108110 'on_level_shutdown_listener_manager' ,
109111 'on_network_id_validated_listener_manager' ,
126128on_convar_changed_listener_manager = ListenerManager ()
127129on_plugin_loaded_manager = ListenerManager ()
128130on_plugin_unloaded_manager = ListenerManager ()
131+ on_map_end_listener_manager = ListenerManager ()
129132
130133_check_for_update = ConVar (
131134 'sp_check_for_update' ,
@@ -355,12 +358,23 @@ class OnPluginUnloaded(ListenerManagerDecorator):
355358 manager = on_plugin_unloaded_manager
356359
357360
361+ class OnMapEnd (ListenerManagerDecorator ):
362+ """Register/unregister a map end listener."""
363+
364+ manager = on_map_end_listener_manager
365+
366+ # Guard variable to ensure this listener gets called only once per map.
367+ _level_initialized = False
368+
369+
358370# =============================================================================
359371# >> CALLBACKS
360372# =============================================================================
361373@OnLevelInit
362374def _on_level_init (map_name ):
363375 """Called when a new map gets initialized."""
376+ OnMapEnd ._level_initialized = True
377+
364378 if not _check_for_update .get_int ():
365379 return
366380
@@ -381,6 +395,20 @@ def _on_level_init(map_name):
381395 VERSION , version , is_unversioned ())
382396
383397
398+ @OnLevelShutdown
399+ def _on_level_shutdown ():
400+ """Called on level end."""
401+ # Was no map initialized?
402+ if not OnMapEnd ._level_initialized :
403+ return
404+
405+ # Notify all registred callbacks
406+ on_map_end_listener_manager .notify ()
407+
408+ # Make sure we don't get called more than once per map change
409+ OnMapEnd ._level_initialized = False
410+
411+
384412@PreHook (memory .get_virtual_function (cvar , 'CallGlobalChangeCallbacks' ))
385413def _pre_call_global_change_callbacks (args ):
386414 """Called when a ConVar has been changed."""
0 commit comments