from server import logic_server class LogicNode(object): """basic node that allows the communication between logic nodes and Logic server """ def __init__(self): self._logic_server = logic_server self._registered_events = {} # All base nodes will have method that will do nothing, unless defined # if you wanna remove this, due to performance, do not call LogicNode.__init__(self) # instead just register self._logic_server to logic_server and empty dict do self._registerd_events # plus other values defined here, if applicable # Or just return True from on_tick self.schedule_time_event(self.on_tick, on_event_trigger="on_logicnode_tick") self.trigEv("on_logicnode_create", self) self._logic_server.parent_object(self) # Internal methods def _resolve_event(self, event, *args, **kwargs): if event in self._registered_events: ev = self._registered_events[event] rtn = ev(event, *args, **kwargs) return rtn # API methods def register_event_responder(self, event, func): """registers event responder.""" assert event not in self._registered_events, "Event already registered!" self._registered_events[event] = func def unregister_responder(self, event): del self._registered_events[event] def trigger_event(self, event, *args, **kwargs): """triggers an event on the AI scale. However, it should be note that the object who triggered will also check for it's own events! This is useful when you need to AI to give command to itself. """ self._logic_server.trigger(event, *args, **kwargs) def schedule_time_event(self, func, delay=None, on_event_trigger=None, pass_args=(), pass_keywords={}): """schedules time event on the server. Can be either one time only, or reoccuring.""" self._logic_server.schedule(self, func, delay, on_event_trigger, *pass_args, **pass_keywords) def unschedule_time_event(self, func): """unschedules time event on the server""" self._logic_server.unschedule(self, func) # Short forms of API methods def regEv(self, event, func): self.register_event_responder(event, func) def unregEv(self, event): self.unregister_responder(event) def trigEv(self, event, *args, **kwargs): self.trigger_event(event, *args, **kwargs) def schedEv(self, func, d=None, trigger=None, p_args=(), p_kwargs={}): self.schedule_time_event(func, d, trigger, p_args, p_kwargs) def unschedEv(self, func): self.unschedule_time_event(func) # Abstract methods # These should be filled with relevant data by the subclass def on_tick(self, *args, **kwargs): return True