Page 1 of 1

Creating events of variable name without using the decorator?

Posted: Wed Dec 31, 2014 11:52 am
by Mahi
I have a block of code that needs to be executed upon each event firing, and each event being handled exactly the same except for one string, the event's name.
Simple example:

Syntax: Select all

from events import Event

@Event
def player_spawn(game_event):
f('player_spawn', my_global, game_event.get_int('userid'))

@Event
def player_jump(game_event):
f('player_jump', my_global, game_event.get_int('userid')

@Event
def player_hurt(game_event):
f('player_hurt', my_global, game_event.get_int('userid')

Except I need this for 10 more events and the function body isn't quite as simple as that.
Is there a way to dynamically create these events, say, from a list (or tuple or w/e) of strings?

Syntax: Select all

for ename in ('player_spawn', 'player_jump', 'player_hurt', 'player_death', ...):
def ef(game_event):
f(ename, my_global, game_event.get_int('userid')
register_event(ef, ename)

Posted: Wed Dec 31, 2014 2:38 pm
by satoon101
https://github.com/Source-Python-Dev-Team/Source.Python/blob/master/addons/source-python/packages/source-python/events/manager.py#L56

We haven't gotten around to making the wiki page for game_event_manager, but the following should help give a basic understanding of what you are looking to do:

Syntax: Select all

from events.manager import game_event_manager

def multi_events(game_event):
call_function(game_event.get_name(), my_global, game_event.get_int('userid'))

for event_name in ('player_spawn', 'player_jump', 'player_hurt', 'player_death'):
game_event_manager.register_for_event(event_name, multi_events)


Since this doesn't use the decorator, you will have to manually unregister each event when your plugin is unloaded.

Posted: Wed Dec 31, 2014 7:29 pm
by satoon101
Oops, I used the wrong name. It's event_registry you want to use, not game_event_manager. Everything else in the example remains the same.

Posted: Thu Jan 01, 2015 11:26 am
by Predz
I have done already in my Warcraft Source version if you would like to see.

Syntax: Select all

from events.manager import event_registry

from filters.players import PlayerIter

from warcraft._libs.logging import Log
from warcraft._libs.player import getPlayer
from warcraft._libs.registry import Registry

## Handler Class (List Inheritance)
## ------------------
class _Handler():
events = []

def update(self):
for event in Registry.events:
self.add(event)

def add(self, event):
if not event in self.events:
self.events.append(event)
event_registry.register_for_event(event, checker)

def remove(self, event):
if event in self.events:
self.events.remove(event)
event_registry.unregister_for_event(event, checker)
else:
Log('Cannot remove event ('+event+') from list, because it does not exist.')
Handler = _Handler()

def checker(game_event):
name = game_event.get_name()
## .......

Posted: Thu Jan 01, 2015 1:09 pm
by satoon101
Why don't you make _Handler inherit from list (or better yet, from set)? Or really, I imagine Registry itself could possibly do that instead.

Posted: Thu Jan 01, 2015 3:55 pm
by Mahi
satoon101 wrote:https://github.com/Source-Python-Dev-Team/Source.Python/blob/master/addons/source-python/packages/source-python/events/manager.py#L56

We haven't gotten around to making the wiki page for game_event_manager, but the following should help give a basic understanding of what you are looking to do:

Syntax: Select all

from events.manager import game_event_manager

def multi_events(game_event):
call_function(game_event.get_name(), my_global, game_event.get_int('userid'))

for event_name in ('player_spawn', 'player_jump', 'player_hurt', 'player_death'):
game_event_manager.register_for_event(event_name, multi_events)


Since this doesn't use the decorator, you will have to manually unregister each event when your plugin is unloaded.


Tyvm, did the job. :smile:

Posted: Thu Jan 01, 2015 4:19 pm
by Predz
satoon101 wrote:Why don't you make _Handler inherit from list (or better yet, from set)? Or really, I imagine Registry itself could possibly do that instead.


It was meant to inherit from list, hence the comment above. I just haven't got round to changing it yet. But didn't think about inheriting from set :D

Also, yes I could just register events inside the Registry module, but I wanted some way to document which events had been registered specifically to this plugin.