Poodletooth-iLand/toontown/cogdominium/CogdoGameGatherable.py

120 lines
4 KiB
Python

from pandac.PandaModules import CollisionSphere, CollisionNode
from pandac.PandaModules import NodePath, BitMask32
from direct.showbase.DirectObject import DirectObject
from direct.interval.MetaInterval import Sequence
from direct.interval.FunctionInterval import Func, Wait
from direct.interval.IntervalGlobal import LerpFunc
from toontown.toonbase import ToontownGlobals
import CogdoUtil
class CogdoGameGatherable(NodePath, DirectObject):
EnterEventName = 'CogdoGameGatherable_Enter'
def __init__(self, serialNum, model, triggerRadius, triggerOffset = (0, 0, 0), animate = True, animDuration = 0.2, instanceModel = True, name = 'CogdoGameGatherable'):
NodePath.__init__(self, '%s-%d' % (name, serialNum))
self.serialNum = serialNum
self._animate = animate
if instanceModel:
model.instanceTo(self)
self._model = self
else:
self._model = model
self._model.reparentTo(self)
self._model.setPosHpr(0, 0, 0, 0, 0, 0)
self._animDuration = animDuration
self._animSeq = None
self._initCollisions(triggerRadius, triggerOffset)
self._update = None
self._wasPickedUp = False
return
def _initCollisions(self, triggerRadius, triggerOffset):
self.collSphere = CollisionSphere(triggerOffset[0], triggerOffset[1], triggerOffset[2], triggerRadius)
self.collSphere.setTangible(0)
self.collNode = CollisionNode(self.getName())
self.collNode.addSolid(self.collSphere)
self.collNodePath = self.attachNewNode(self.collNode)
def destroy(self):
self.disable()
del self._model
if self._animSeq is not None:
self._animSeq.finish()
self._animSeq = None
self.collNodePath.removeNode()
self.removeNode()
return
def enable(self):
self.accept('enter' + self.getName(), self._handleEnterCollision)
self.collNode.setIntoCollideMask(ToontownGlobals.WallBitmask)
def disable(self):
self.ignoreAll()
self.collNode.setIntoCollideMask(BitMask32(0))
def show(self):
if not self.wasPickedUp():
NodePath.show(self)
self.enable()
def hide(self):
self.disable()
NodePath.hide(self)
def _handleEnterCollision(self, collEntry):
messenger.send(CogdoGameGatherable.EnterEventName, [self])
def wasPickedUp(self):
return self._wasPickedUp
def wasPickedUpByToon(self):
pass
def update(self, dt):
pass
def getModel(self):
return self._model
def pickUp(self, toon, elapsedSeconds = 0.0):
self._wasPickedUp = True
if self._animSeq is not None:
self._animSeq.finish()
self._animSeq = None
if self._animate:
def lerpFlyToToon(t):
vec = toon.getPos(render) - self.getPos(render)
vec[2] += toon.getHeight()
self.setPos(self.getPos() + vec * t)
self.setScale(1.0 - t * 0.8)
self._animSeq = Sequence(LerpFunc(lerpFlyToToon, fromData=0.0, toData=1.0, duration=self._animDuration), Wait(0.1), Func(self.hide))
self._animSeq.start(elapsedSeconds)
else:
self.hide()
return
class CogdoMemo(CogdoGameGatherable):
EnterEventName = 'CogdoMemo_Enter'
def __init__(self, serialNum, model = None, pitch = 0, triggerRadius = 1.0, spinRate = 60):
if model is None:
model = CogdoUtil.loadModel('joke', 'shared')
model.setP(pitch)
self._spinRate = spinRate
CogdoGameGatherable.__init__(self, serialNum, model, triggerRadius, name='CogdoMemo')
return
def destroy(self):
del self._spinRate
CogdoGameGatherable.destroy(self)
def update(self, dt):
CogdoGameGatherable.update(self, dt)
self.setH(self.getH() + self._spinRate * dt)
def _handleEnterCollision(self, collEntry):
messenger.send(CogdoMemo.EnterEventName, [self])