92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
from panda3d.core import *
|
|
from direct.fsm.FSM import FSM
|
|
from direct.showbase import PythonUtil
|
|
from direct.interval.MetaInterval import Sequence
|
|
from toontown.parties.PartyGlobals import DanceReverseLoopAnims, ToonDancingStates
|
|
|
|
class PartyDanceActivityToonFSM(FSM):
|
|
notify = directNotify.newCategory('PartyDanceActivityToonFSM')
|
|
|
|
def __init__(self, avId, activity, h):
|
|
FSM.__init__(self, self.__class__.__name__)
|
|
self.notify.debug('init : avId = %s, activity = %s ' % (avId, activity))
|
|
self.avId = avId
|
|
self.activity = activity
|
|
self.isLocal = avId == base.localAvatar.doId
|
|
self.toon = self.activity.getAvatar(self.avId)
|
|
self.toonH = h
|
|
self.danceNode = None
|
|
self.danceMoveSequence = None
|
|
self.lastAnim = None
|
|
self.defaultTransitions = {'Init': ['Run', 'DanceMove', 'Cleanup'],
|
|
'DanceMove': ['Run', 'DanceMove', 'Cleanup'],
|
|
'Run': ['Run', 'DanceMove', 'Cleanup'],
|
|
'Cleanup': []}
|
|
self.enteredAlready = False
|
|
return
|
|
|
|
def destroy(self):
|
|
self.toon = None
|
|
if self.danceNode is not None:
|
|
self.danceNode.removeNode()
|
|
self.danceNode = None
|
|
self.activity = None
|
|
self.avId = None
|
|
return
|
|
|
|
def enterInit(self, *args):
|
|
if not self.enteredAlready:
|
|
self.danceNode = NodePath('danceNode-%s' % self.avId)
|
|
self.danceNode.reparentTo(render)
|
|
self.danceNode.setPos(0, 0, 0)
|
|
self.danceNode.setH(self.toonH)
|
|
pos = self.toon.getPos(self.danceNode)
|
|
self.toon.reparentTo(self.danceNode)
|
|
self.toon.setPos(pos)
|
|
self.enteredAlready = True
|
|
|
|
def exitInit(self):
|
|
pass
|
|
|
|
def enterCleanup(self, *args):
|
|
if hasattr(base.cr.playGame.hood, 'loader'):
|
|
pos = self.toon.getPos(self.activity.getParentNodePath())
|
|
hpr = self.toon.getHpr(self.activity.getParentNodePath())
|
|
self.toon.reparentTo(self.activity.getParentNodePath())
|
|
self.toon.setPos(pos)
|
|
self.toon.setHpr(hpr)
|
|
if self.danceNode is not None:
|
|
self.danceNode.removeNode()
|
|
self.danceNode = None
|
|
self.enteredAlready = False
|
|
return
|
|
|
|
def exitCleanup(self):
|
|
pass
|
|
|
|
def enterDanceMove(self, anim = ''):
|
|
if self.lastAnim is None and anim == '':
|
|
self.toon.loop('victory', fromFrame=98, toFrame=122)
|
|
else:
|
|
if anim == '':
|
|
anim = self.lastAnim
|
|
if anim in DanceReverseLoopAnims:
|
|
self.danceMoveSequence = Sequence(self.toon.actorInterval(anim, loop=0), self.toon.actorInterval(anim, loop=0, playRate=-1.0))
|
|
self.danceMoveSequence.loop()
|
|
else:
|
|
self.toon.loop(anim)
|
|
self.lastAnim = anim
|
|
return
|
|
|
|
def exitDanceMove(self):
|
|
if self.danceMoveSequence and self.danceMoveSequence.isPlaying():
|
|
self.danceMoveSequence.pause()
|
|
self.danceMoveSequence = None
|
|
return
|
|
|
|
def enterRun(self, *args):
|
|
if self.toon.getCurrentAnim() != 'run':
|
|
self.toon.loop('run')
|
|
|
|
def exitRun(self):
|
|
pass
|