from panda3d.core import * from direct.interval.IntervalGlobal import * from direct.showbase import DirectObject from toontown.toonbase import ToontownGlobals from direct.directnotify import DirectNotifyGlobal import types class MovingPlatform(DirectObject.DirectObject, NodePath): notify = DirectNotifyGlobal.directNotify.newCategory('MovingPlatform') def __init__(self): self.hasLt = 0 DirectObject.DirectObject.__init__(self) NodePath.__init__(self) def setupCopyModel(self, parentToken, model, floorNodeName = None, parentingNode = None): if floorNodeName is None: floorNodeName = 'floor' if type(parentToken) == types.IntType: parentToken = ToontownGlobals.SPDynamic + parentToken self.parentToken = parentToken self.name = 'MovingPlatform-%s' % parentToken self.assign(hidden.attachNewNode(self.name)) self.model = model.copyTo(self) self.ownsModel = 1 floorList = self.model.findAllMatches('**/%s' % floorNodeName) if len(floorList) == 0: MovingPlatform.notify.warning('no floors in model') return for floor in floorList: floor.setName(self.name) if parentingNode == None: parentingNode = self base.cr.parentMgr.registerParent(self.parentToken, parentingNode) self.parentingNode = parentingNode self.accept('enter%s' % self.name, self.__handleEnter) self.accept('exit%s' % self.name, self.__handleExit) return def destroy(self): base.cr.parentMgr.unregisterParent(self.parentToken) self.ignoreAll() if self.hasLt: self.__releaseLt() if self.ownsModel: self.model.removeNode() del self.model if hasattr(self, 'parentingNode') and self.parentingNode is self: del self.parentingNode def getEnterEvent(self): return '%s-enter' % self.name def getExitEvent(self): return '%s-exit' % self.name def releaseLocalToon(self): if self.hasLt: self.__releaseLt() def __handleEnter(self, collEntry): self.notify.debug('on movingPlatform %s' % self.name) self.__grabLt() messenger.send(self.getEnterEvent()) def __handleExit(self, collEntry): self.notify.debug('off movingPlatform %s' % self.name) self.__releaseLt() messenger.send(self.getExitEvent()) def __handleOnFloor(self, collEntry): if collEntry.getIntoNode().getName() == self.name: self.__handleEnter(collEntry) def __handleOffFloor(self, collEntry): if collEntry.getIntoNode().getName() == self.name: self.__handleExit(collEntry) def __grabLt(self): base.localAvatar.b_setParent(self.parentToken) self.hasLt = 1 def __releaseLt(self): if base.localAvatar.getParent().compareTo(self.parentingNode) == 0: base.localAvatar.b_setParent(ToontownGlobals.SPRender) base.localAvatar.controlManager.currentControls.doDeltaPos() self.hasLt = 0