#MUDPyE - (M)ulti-(U)ser (D)imension (Py)thon (E)ngine
#Copyright (C) 2005 Corey Staten
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#Send feedback/questions to MUDPyE@gmail.com
from mpmudobject import Ex
#Callbacks are in the form [timer, resetTimer, callbackID, argument]
#timer-Time left until callback activates.
#resetTimer-If greater than 0, timer will reset to this once callback is activated.
#funcName-Function to be called on target object.
#kwargs-Arguments to pass to function.
class CallbackHandler(object):
def __init__(self, mudWorld):
self.mudWorld = mudWorld
self.callbackList = []
def AddCallback(self, timer, resetTimer, objRef, funcName, kwargs):
callback = [timer, resetTimer, objRef, funcName, kwargs]
self.callbackList.append(callback)
return callback
def DelCallback(self, callback):
try:
self.callbackList.remove(callback)
except IndexError:
self.mudWorld.loggers["mud.scripterror"].warning("Attempt to delete non-existant callback.")
def ProcessTime(self, units):
self.callbackList.sort()
working = True
for callback in self.callbackList:
callback[0] -= units
execCallbacks = [callback for callback in self.callbackList if (callback[0] <= 0)]
while len(execCallbacks) > 0:
for callback in execCallbacks:
#Kill invalid callbacks.
if self.mudWorld.objDB.db.has_key(object.__getattribute__(callback[2], "objID")):
Ex(callback[2], callback[3], **callback[4])
if callback[1] > 0:
callback[0] += callback[1]
else:
self.callbackList.remove(callback)
else:
self.callbackList.remove(callback)
execCallbacks = [callback for callback in self.callbackList if (callback[0] <= 0)]