Creating events of variable name without using the decorator?

Please post any questions about developing your plugin here. Please use the search function before posting!
User avatar
Mahi
Senior Member
Posts: 236
Joined: Wed Aug 29, 2012 8:39 pm
Location: Finland

Creating events of variable name without using the decorator?

Postby Mahi » Wed Dec 31, 2014 11:52 am

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)
User avatar
satoon101
Project Leader
Posts: 2703
Joined: Sat Jul 07, 2012 1:59 am

Postby satoon101 » Wed Dec 31, 2014 2:38 pm

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.
Image
User avatar
satoon101
Project Leader
Posts: 2703
Joined: Sat Jul 07, 2012 1:59 am

Postby satoon101 » Wed Dec 31, 2014 7:29 pm

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.
Image
Predz
Senior Member
Posts: 158
Joined: Wed Aug 08, 2012 9:05 pm
Location: Bristol, United Kingdom

Postby Predz » Thu Jan 01, 2015 11:26 am

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()
## .......
User avatar
satoon101
Project Leader
Posts: 2703
Joined: Sat Jul 07, 2012 1:59 am

Postby satoon101 » Thu Jan 01, 2015 1:09 pm

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.
Image
User avatar
Mahi
Senior Member
Posts: 236
Joined: Wed Aug 29, 2012 8:39 pm
Location: Finland

Postby Mahi » Thu Jan 01, 2015 3:55 pm

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:
Predz
Senior Member
Posts: 158
Joined: Wed Aug 08, 2012 9:05 pm
Location: Bristol, United Kingdom

Postby Predz » Thu Jan 01, 2015 4:19 pm

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.

Return to “Plugin Development Support”

Who is online

Users browsing this forum: No registered users and 95 guests