I’m not sure if anyone’s doing something like this already (or if there’s a better way to do it), but here’s what I’m doing for my event system. I find that keeping the arguments contained in an object and passing the object to the functions is a lot nicer than sending the arguments on their own, especially if you need to alter the arguments later.
Every event inherits ‘Event’. To fire an event, call Fire(), which uses messenger to send the event and passes the event object as an argument.
class Event():
Eventname = 'Event'
def __init__(self, eventName = Eventname):
self.eventName = eventName
def GetEventName(self):
return self.eventName
def Fire(self, task = None):
messenger.send(self.eventName, [self])
Here’s some example other events.
from event.Event import Event
class PlayerEvent(Event):
EventName = 'PlayerEvent'
def __init__(self, player, eventName = EventName):
Event.__init__(self, eventName)
self.player = player
def GetPlayer(self):
return self.player
class PlayerDeathEvent(PlayerEvent):
EventName = 'PlayerDeathEvent'
def __init__(self, player, attacker, wasHeadshot):
PlayerEvent.__init__(self, player, PlayerDeathEvent.EventName)
self.attacker = attacker
self.wasHeadshot = wasHeadshot
def GetVictim(self):
return self.player
def GetAttacker(self):
return self.attacker
def WasHeadshot(self):
return self.wasHeadshot
class PlayerRespawnEvent(PlayerEvent):
EventName = 'PlayerRespawnEvent'
def __init__(self, player, pos):
PlayerEvent.__init__(self, player, PlayerRespawnEvent.EventName)
self.pos = pos
def GetPos(self):
return self.pos
class PlayerJoinEvent(PlayerEvent):
EventName = 'PlayerJoinEvent'
def __init__(self, player, pid, name, playingState):
PlayerEvent.__init__(self, player, PlayerJoinEvent.EventName)
self.pid = pid
self.name = name
self.playingState = playingState
def GetPid(self):
return self.pid
def GetName(self):
return self.name
def GetPlayingState(self):
return self.playingState
class PlayerDisconnectEvent(PlayerEvent):
EventName = 'PlayerDisconnectEvent'
def __init__(self, player):
PlayerEvent.__init__(self, player, PlayerDisconnectEvent.EventName)
class PlayerSelectedEvent(PlayerEvent):
EventName = 'PlayerSelectedEvent'
def __init__(self, player):
PlayerEvent.__init__(self, player, PlayerSelectedEvent.EventName)
class PlayerAttackEvent(PlayerEvent):
EventName = 'PlayerAttackEvent'
def __init__(self, player, victim, damage, wasHeadshot):
PlayerEvent.__init__(self, player, PlayerAttackEvent.EventName)
self.victim = victim
self.damage = damage
self.wasHeadshot = wasHeadshot
def GetAttacker(self):
return self.player
def GetVictim(self):
return self.victim
def GetDamage(self):
return self.damage
def WasHeadshot(self):
return self.wasHeadshot
class PlayerHitEvent(PlayerEvent):
EventName = 'PlayerHitEvent'
def __init__(self, player, victim, wasHeadshot):
PlayerEvent.__init__(self, player, PlayerHitEvent.EventName)
self.victim = victim
self.wasHeadshot = wasHeadshot
def GetAttacker(self):
return self.player
def GetVictim(self):
return self.victim
def GetDamage(self):
return self.damage
def WasHeadshot(self):
return self.wasHeadshot
class PlayerHealthEvent(PlayerEvent):
EventName = 'PlayerHealthEvent'
def __init__(self, player, health):
PlayerEvent.__init__(self, player, PlayerHealthEvent.EventName)
self.health = health
def GetHealth(self):
return self.health
class PlayerReloadEvent(PlayerEvent):
EventName = 'PlayerReloadEvent'
def __init__(self, player, health):
PlayerEvent.__init__(self, player, PlayerReloadEvent.EventName)
self.health = health
def GetHealth(self):
return self.health
To listen for events, do something like this:
self.accept(PlayerRespawnEvent.EventName, self.OnPlayerRespawnEvent)
self.accept(PlayerDeathEvent.EventName, self.OnPlayerDeathEvent)
def OnPlayerRespawnEvent(self, event):
player = event.GetPlayer()
...
def OnPlayerDeathEvent(self, event):
player = event.GetPlayer()
attacker = event.GetAttacker()
wasHS = event.WasHeadshot()
...