Poodletooth-iLand/toontown/racing/DistributedStartingBlock.py

695 lines
30 KiB
Python

from direct.distributed.ClockDelta import *
from direct.interval.IntervalGlobal import *
from toontown.building.ElevatorConstants import *
from toontown.building.ElevatorUtils import *
from toontown.building import DistributedElevatorExt
from toontown.building import DistributedElevator
from toontown.toonbase import ToontownGlobals
from direct.fsm import ClassicFSM
from direct.fsm import State
from direct.gui import DirectGui
from toontown.hood import ZoneUtil
from toontown.toonbase import TTLocalizer
from toontown.toontowngui import TTDialog
from direct.distributed import DistributedObject
from direct.distributed import DistributedSmoothNode
from direct.actor import Actor
from direct.fsm.FSM import FSM
from direct.showbase import PythonUtil
from toontown.toonbase.ToontownTimer import ToontownTimer
from toontown.racing.Kart import Kart
from toontown.racing.KartShopGlobals import KartGlobals
from toontown.racing import RaceGlobals
from toontown.toontowngui.TTDialog import TTGlobalDialog
class DistributedStartingBlock(DistributedObject.DistributedObject, FSM):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedStartingBlock')
sphereRadius = 1.5
id = 0
cameraPos = Point3(0, -23, 10)
cameraHpr = Point3(0, -10, 0)
SFX_BaseDir = 'phase_6/audio/sfx/'
SFX_KartAppear = SFX_BaseDir + 'KART_Appear.ogg'
defaultTransitions = {'Off': ['EnterMovie'],
'EnterMovie': ['Off', 'Waiting', 'ExitMovie'],
'Waiting': ['ExitMovie', 'Off'],
'ExitMovie': ['Off', 'ExitMovie']}
def __init__(self, cr):
DistributedObject.DistributedObject.__init__(self, cr)
FSM.__init__(self, 'staringBlock_%s_FSM' % DistributedStartingBlock.id)
self.avId = 0
self.av = None
self.lastAvId = 0
self.avatar = None
self.kartPad = None
self.collNode = None
self.movieNode = None
self.movieTrack = None
self.collSphere = None
self.collNodePath = None
self.localToonKarting = 0
self.kartNode = None
self.kart = None
self.holeActor = None
self.exitRequested = False
if (__debug__):
self.testLOD = False
self.id = DistributedStartingBlock.id
DistributedStartingBlock.id += 1
return
def disable(self):
FSM.cleanup(self)
self.ignore(self.uniqueName('enterStartingBlockSphere'))
self.ignore('stoppedAsleep')
self.setOccupied(0)
self.avId = 0
self.nodePath.detachNode()
self.kartPad = None
if self.holeActor:
self.holeActor.cleanup()
self.holeActor = None
DistributedObject.DistributedObject.disable(self)
return
def delete(self):
if hasattr(self, 'dialog'):
if not self.dialog.removed():
self.dialog.ignoreAll()
if not self.dialog.isEmpty():
self.dialog.cleanup()
del self.dialog
self.finishMovie()
if hasattr(self, 'cancelButton'):
self.cancelButton.destroy()
del self.cancelButton
del self.kartPad
if self.nodePath:
self.nodePath.removeNode()
del self.nodePath
DistributedObject.DistributedObject.delete(self)
def generateInit(self):
self.notify.debugStateCall(self)
DistributedObject.DistributedObject.generateInit(self)
self.nodePath = NodePath(self.uniqueName('StartingBlock'))
self.collSphere = CollisionSphere(0, 0, 0, self.sphereRadius)
self.collSphere.setTangible(0)
self.collNode = CollisionNode(self.uniqueName('StartingBlockSphere'))
self.collNode.setCollideMask(ToontownGlobals.WallBitmask)
self.collNode.addSolid(self.collSphere)
self.collNodePath = self.nodePath.attachNewNode(self.collNode)
def announceGenerate(self):
self.notify.debugStateCall(self)
DistributedObject.DistributedObject.announceGenerate(self)
self.nodePath.reparentTo(render)
self.accept(self.uniqueName('enterStartingBlockSphere'), self.__handleEnterSphere)
if (__debug__):
if self.testLOD:
self.__generateKartAppearTrack()
def setPadDoId(self, padDoId):
if padDoId in self.cr.doId2do:
self.setPad(self.cr.doId2do[padDoId])
else:
self.acceptOnce('generate-%d' % padDoId, self.setPad)
def setPad(self, pad):
self.kartPad = pad
self.kartPad.addStartingBlock(self)
def setPosHpr(self, x, y, z, h, p, r):
self.notify.debugStateCall(self)
self.nodePath.setPosHpr(x, y, z, h + 180, 0, 0)
def setPadLocationId(self, padLocationId):
self.notify.debugStateCall(self)
self.movieNode = self.nodePath.attachNewNode(self.uniqueName('MovieNode'))
self.exitMovieNode = self.movieNode
if padLocationId % 2:
self.movieNode.setPosHpr(3.0, 0, 0, 90.0, 0, 0)
else:
self.movieNode.setPosHpr(-3.0, 0, 0, -90.0, 0, 0)
def setActive(self, isTangible):
self.collSphere.setTangible(isTangible)
def __handleEnterSphere(self, collEntry):
if base.localAvatar.doId == self.lastAvId and globalClock.getFrameCount() <= self.lastFrame + 1:
self.notify.debug('Ignoring duplicate entry for avatar.')
return
if base.localAvatar.hp > 0:
def handleEnterRequest(self = self):
self.ignore('stoppedAsleep')
if hasattr(self.dialog, 'doneStatus') and self.dialog.doneStatus == 'ok':
self.d_requestEnter()
elif self.cr and not self.isDisabled():
self.cr.playGame.getPlace().setState('walk')
else:
self.notify.warning('Warning! Object has already been disabled.')
self.dialog.ignoreAll()
self.dialog.cleanup()
del self.dialog
self.cr.playGame.getPlace().fsm.request('stopped')
self.accept('stoppedAsleep', handleEnterRequest)
doneEvent = 'enterRequest|dialog'
if self.kartPad.isPractice():
msg = TTLocalizer.StartingBlock_EnterPractice
else:
raceName = TTLocalizer.KartRace_RaceNames[self.kartPad.trackType]
numTickets = RaceGlobals.getEntryFee(self.kartPad.trackId, self.kartPad.trackType)
msg = TTLocalizer.StartingBlock_EnterNonPractice % (raceName, numTickets)
self.dialog = TTGlobalDialog(msg, doneEvent, 4)
self.dialog.accept(doneEvent, handleEnterRequest)
def d_movieFinished(self):
self.notify.debugStateCall(self)
self.sendUpdate('movieFinished', [])
def d_requestEnter(self):
self.notify.debugStateCall(self)
self.sendUpdate('requestEnter')
def d_requestExit(self):
self.notify.debugStateCall(self)
self.exitRequested = True
self.hideGui()
self.sendUpdate('requestExit', [])
def rejectEnter(self, errCode):
self.notify.debugStateCall(self)
def handleTicketError(self = self):
self.ignore('stoppedAsleep')
self.dialog.ignoreAll()
self.dialog.cleanup()
del self.dialog
self.cr.playGame.getPlace().setState('walk')
doneEvent = 'errorCode|dialog'
if errCode == KartGlobals.ERROR_CODE.eTickets:
msg = TTLocalizer.StartingBlock_NotEnoughTickets
self.dialog = TTGlobalDialog(msg, doneEvent, 2)
self.dialog.accept(doneEvent, handleTicketError)
self.accept('stoppedAsleep', handleTicketError)
elif errCode == KartGlobals.ERROR_CODE.eBoardOver:
msg = TTLocalizer.StartingBlock_NoBoard
self.dialog = TTGlobalDialog(msg, doneEvent, 2)
self.dialog.accept(doneEvent, handleTicketError)
self.accept('stoppedAsleep', handleTicketError)
elif errCode == KartGlobals.ERROR_CODE.eNoKart:
msg = TTLocalizer.StartingBlock_NoKart
self.dialog = TTGlobalDialog(msg, doneEvent, 2)
self.dialog.accept(doneEvent, handleTicketError)
self.accept('stoppedAsleep', handleTicketError)
elif errCode == KartGlobals.ERROR_CODE.eOccupied:
msg = TTLocalizer.StartingBlock_Occupied
self.dialog = TTGlobalDialog(msg, doneEvent, 2)
self.dialog.accept(doneEvent, handleTicketError)
self.accept('stoppedAsleep', handleTicketError)
elif errCode == KartGlobals.ERROR_CODE.eTrackClosed:
msg = TTLocalizer.StartingBlock_TrackClosed
self.dialog = TTGlobalDialog(msg, doneEvent, 2)
self.dialog.accept(doneEvent, handleTicketError)
self.accept('stoppedAsleep', handleTicketError)
else:
self.cr.playGame.getPlace().setState('walk')
def finishMovie(self):
if self.movieTrack:
self.movieTrack.finish()
self.movieTrack = None
return
def setOccupied(self, avId):
self.notify.debug('%d setOccupied: %d' % (self.doId, avId))
if self.av != None:
self.finishMovie()
if not self.av.isEmpty() and not self.av.isDisabled():
self.av.loop('neutral')
self.av.setParent(ToontownGlobals.SPRender)
self.av.startSmooth()
self.finishMovie()
if self.kart:
self.kart.delete()
self.kart = None
if self.kartNode:
self.kartNode.removeNode()
self.kartNode = None
self.placedAvatar = 0
self.ignore(self.av.uniqueName('disable'))
self.av = None
wasLocalToon = self.localToonKarting
self.lastAvId = self.avId
self.lastFrame = globalClock.getFrameCount()
self.avId = avId
self.localToonKarting = 0
if self.avId == 0:
self.collSphere.setTangible(0)
self.request('Off')
else:
self.collSphere.setTangible(1)
av = self.cr.doId2do.get(self.avId)
self.placedAvatar = 0
if self.avId == base.localAvatar.doId:
self.localToonKarting = 1
if av != None:
self.av = av
self.av.stopSmooth()
self.placedAvatar = 0
self.acceptOnce(self.av.uniqueName('disable'), self.__avatarGone)
self.kartNode = render.attachNewNode(self.av.uniqueName('KartNode'))
self.kartNode.setPosHpr(self.nodePath.getPos(render), self.nodePath.getHpr(render))
self.kart = Kart()
self.kart.baseScale = 1.6
self.kart.setDNA(self.av.getKartDNA())
self.kart.generateKart()
self.kart.resetGeomPos()
self.av.wrtReparentTo(self.nodePath)
self.av.setAnimState('neutral', 1.0)
if not self.localToonKarting:
av.stopSmooth()
self.__placeAvatar()
self.avParent = av.getParent()
else:
self.notify.warning('Unknown avatar %d in kart block %d ' % (self.avId, self.doId))
self.avId = 0
if wasLocalToon and not self.localToonKarting:
place = base.cr.playGame.getPlace()
if place:
if self.exitRequested:
place.setState('walk')
else:
def handleDialogOK(self = self):
self.ignore('stoppedAsleep')
place.setState('walk')
self.dialog.ignoreAll()
self.dialog.cleanup()
del self.dialog
doneEvent = 'kickedOutDialog'
msg = TTLocalizer.StartingBlock_KickSoloRacer
self.dialog = TTGlobalDialog(msg, doneEvent, style=1)
self.dialog.accept(doneEvent, handleDialogOK)
self.accept('stoppedAsleep', handleDialogOK)
return
def __avatarGone(self):
self.notify.debugStateCall(self)
self.setOccupied(0)
def __placeAvatar(self):
self.notify.debugStateCall(self)
if not self.placedAvatar:
self.placedAvatar = 1
self.av.setPosHpr(0, 0, 0, 0, 0, 0)
def setMovie(self, mode):
self.notify.debugStateCall(self)
if self.avId == 0:
return
self.finishMovie()
if mode == 0:
pass
elif mode == KartGlobals.ENTER_MOVIE:
self.request('EnterMovie')
elif mode == KartGlobals.EXIT_MOVIE:
self.request('ExitMovie')
def makeGui(self):
self.notify.debugStateCall(self)
if hasattr(self, 'cancelButton'):
return
fishGui = loader.loadModel('phase_4/models/gui/fishingGui')
self.cancelButton = DirectGui.DirectButton(relief=None, scale=0.67, pos=(1.16, 0, -0.9), text=('', TTLocalizer.FishingExit, TTLocalizer.FishingExit), text_align=TextNode.ACenter, text_fg=Vec4(1, 1, 1, 1), text_shadow=Vec4(0, 0, 0, 1), text_pos=(0.0, -0.12), textMayChange=0, text_scale=0.1, image=(fishGui.find('**/exit_buttonUp'), fishGui.find('**/exit_buttonDown'), fishGui.find('**/exit_buttonRollover')), text_font=ToontownGlobals.getInterfaceFont(), command=self.d_requestExit)
self.cancelButton.hide()
return
def showGui(self):
self.notify.debugStateCall(self)
if hasattr(self.kartPad, 'state'):
if not self.kartPad.state == 'WaitCountdown':
return
self.cancelButton.show()
def hideGui(self):
self.notify.debugStateCall(self)
if not hasattr(self, 'cancelButton'):
return
self.cancelButton.hide()
def generateToonMoveTrack(self):
hpr = self.movieNode.getHpr(render)
heading = PythonUtil.fitDestAngle2Src(self.av.getH(render), hpr[0])
hpr.setX(heading)
self.av.setAnimState('run', 1.0)
toonTrack = Sequence(Wait(0.5), Parallel(LerpPosInterval(self.av, 1.0, Point3(self.movieNode.getX(self.avParent), self.movieNode.getY(self.avParent), 0)), LerpHprInterval(self.av, 1.0, hpr=hpr, other=render)), Func(self.av.loop, 'neutral'))
return toonTrack
def generateKartAppearTrack(self):
if not self.av:
if not self.kartNode:
self.kartNode = render.attachNewNode(str(self) + 'kartNode')
self.kartNode.setPosHpr(self.nodePath.getPos(render), self.nodePath.getHpr(render))
self.kart.setScale(0.85)
self.kart.reparentTo(self.kartNode)
return Parallel()
self.kart.setScale(0.1)
kartTrack = Parallel(
Sequence(
ActorInterval(self.av, 'feedPet'),
Func(self.av.loop, 'neutral')),
Sequence(
Func(self.kart.setActiveShadow, False),
Func(self.kart.reparentTo, self.av.rightHand),
Wait(2.1),
Func(self.kart.wrtReparentTo, render),
Func(self.kart.setShear, 0, 0, 0),
Parallel(
LerpHprInterval(self.kart, hpr=self.kartNode.getHpr(render), duration=1.2),
ProjectileInterval(self.kart, endPos=self.kartNode.getPos(render), duration=1.2, gravityMult=0.45)),
Wait(0.2),
Func(self.kart.setActiveShadow, True),
Sequence(
LerpScaleInterval(self.kart, scale=Point3(1.1, 1.1, 0.1), duration=0.2),
LerpScaleInterval(self.kart, scale=Point3(0.9, 0.9, 0.1), duration=0.1),
LerpScaleInterval(self.kart, scale=Point3(1.0, 1.0, 0.1), duration=0.1),
LerpScaleInterval(self.kart, scale=Point3(1.0, 1.0, 1.1), duration=0.2),
LerpScaleInterval(self.kart, scale=Point3(1.0, 1.0, 0.9), duration=0.1),
LerpScaleInterval(self.kart, scale=Point3(1.0, 1.0, 1.0), duration=0.1),
Func(self.kart.wrtReparentTo, self.kartNode))))
return kartTrack
def generateToonJumpTrack(self):
base.sb = self
def getToonJumpTrack(av, kart):
def getJumpDest(av = av, node = kart.toonNode[0]):
dest = node.getPos(av.getParent())
return dest
def getJumpHpr(av = av, node = kart.toonNode[0]):
hpr = node.getHpr(av.getParent())
return hpr
toonJumpTrack = Parallel(
ActorInterval(av, 'jump'),
Sequence(Wait(0.43),
Parallel(
LerpHprInterval(av, hpr=getJumpHpr, duration=0.9),
ProjectileInterval(av, endPos=getJumpDest, duration=0.9))))
return toonJumpTrack
def getToonSitTrack(av):
toonSitTrack = Sequence(ActorInterval(av, 'sit-start'), Func(av.loop, 'sit'))
return toonSitTrack
toonJumpTrack = getToonJumpTrack(self.av, self.kart)
toonSitTrack = getToonSitTrack(self.av)
jumpTrack = Sequence(
Parallel(
toonJumpTrack,
Sequence(
Wait(1),
toonSitTrack)),
Func(self.av.setPosHpr, 0, 0.45, -.25, 0, 0, 0),
Func(self.av.reparentTo, self.kart.toonSeat))
return jumpTrack
def generateToonReverseJumpTrack(self):
def getToonJumpTrack(av, destNode):
def getJumpDest(av = av, node = destNode):
dest = node.getPos(av.getParent())
return dest
def getJumpHpr(av = av, node = destNode):
hpr = node.getHpr(av.getParent())
return hpr
toonJumpTrack = Parallel(ActorInterval(av, 'jump'), Sequence(Wait(0.1), Parallel(LerpHprInterval(av, hpr=getJumpHpr, duration=0.9), ProjectileInterval(av, endPos=getJumpDest, duration=0.9))))
return toonJumpTrack
toonJumpTrack = getToonJumpTrack(self.av, self.exitMovieNode)
jumpTrack = Sequence(toonJumpTrack, Func(self.av.loop, 'neutral'), Func(self.av.reparentTo, render), Func(self.av.setPosHpr, self.exitMovieNode, 0, 0, 0, 0, 0, 0))
return jumpTrack
def generateCameraMoveTrack(self):
self.cPos = camera.getPos(self.av)
self.cHpr = camera.getHpr(self.av)
camera.wrtReparentTo(self.nodePath)
cameraTrack = LerpPosHprInterval(camera, 1.5, self.cameraPos, self.cameraHpr)
return cameraTrack
def generateCameraReturnMoveTrack(self):
cameraTrack = Sequence(Func(camera.wrtReparentTo, self.av), LerpPosHprInterval(camera, 1.5, self.cPos, self.cHpr))
return cameraTrack
def generateKartDisappearTrack(self):
def getHoleTrack(hole, holeParent):
holeTrack = Sequence(
Wait(0.2),
Func(hole.setBin, 'shadow', 0),
Func(hole.setDepthTest, 0),
Func(hole.setDepthWrite, 0),
Func(hole.reparentTo, holeParent),
Func(hole.setPos, holeParent, Point3(0, 0.0, -.6)),
ActorInterval(hole, 'hole', startTime=3.4, endTime=3.1),
Wait(0.4),
ActorInterval(hole, 'hole', startTime=3.1, endTime=3.4))
return holeTrack
def getKartShrinkTrack(kart):
pos = kart.getPos()
pos.addZ(-1.0)
kartTrack = Sequence(LerpScaleInterval(kart, scale=Point3(1.0, 1.0, 0.9), duration=0.1), LerpScaleInterval(kart, scale=Point3(1.0, 1.0, 1.1), duration=0.1), LerpScaleInterval(kart, scale=Point3(1.0, 1.0, 0.1), duration=0.2), LerpScaleInterval(kart, scale=Point3(0.9, 0.9, 0.1), duration=0.1), LerpScaleInterval(kart, scale=Point3(1.1, 1.1, 0.1), duration=0.1), LerpScaleInterval(kart, scale=Point3(0.1, 0.1, 0.1), duration=0.2), Wait(0.2), LerpPosInterval(kart, pos=pos, duration=0.2), Func(kart.hide))
return kartTrack
if not self.holeActor:
self.holeActor = Actor.Actor('phase_3.5/models/props/portal-mod', {'hole': 'phase_3.5/models/props/portal-chan'})
holeTrack = getHoleTrack(self.holeActor, self.kartNode)
shrinkTrack = getKartShrinkTrack(self.kart)
kartTrack = Parallel(shrinkTrack, holeTrack)
return kartTrack
def enterOff(self):
self.notify.debug('%d enterOff: Entering the Off State.' % self.doId)
self.hideGui()
def exitOff(self):
self.notify.debug('%d exitOff: Exiting the Off State.' % self.doId)
def enterEnterMovie(self):
self.notify.debug('%d enterEnterMovie: Entering the Enter Movie State.' % self.doId)
if base.config.GetBool('want-qa-regression', 0):
raceName = TTLocalizer.KartRace_RaceNames[self.kartPad.trackType]
self.notify.info('QA-REGRESSION: KARTING: %s' % raceName)
toonTrack = self.generateToonMoveTrack()
kartTrack = self.generateKartAppearTrack()
jumpTrack = self.generateToonJumpTrack()
name = self.av.uniqueName('EnterRaceTrack')
if self.av is not None and self.localToonKarting:
kartAppearSfx = base.loadSfx(self.SFX_KartAppear)
cameraTrack = self.generateCameraMoveTrack()
engineStartTrack = self.kart.generateEngineStartTrack()
self.finishMovie()
self.movieTrack = Sequence(Parallel(cameraTrack, toonTrack), Parallel(SoundInterval(kartAppearSfx), Sequence(kartTrack, jumpTrack, engineStartTrack, Func(self.makeGui), Func(self.showGui), Func(self.request, 'Waiting'), Func(self.d_movieFinished))), name=name, autoFinish=1)
self.exitRequested = False
else:
self.finishMovie()
self.movieTrack = Sequence(toonTrack, kartTrack, jumpTrack, name=name, autoFinish=1)
self.movieTrack.start()
return
def exitEnterMovie(self):
self.notify.debug('%d exitEnterMovie: Exiting the Enter Movie State.' % self.doId)
def enterWaiting(self):
self.notify.debug('%d enterWaiting: Entering the Waiting State.' % self.doId)
def exitWaiting(self):
self.notify.debug('%d exitWaiting: Exiting the Waiting State.' % self.doId)
def enterExitMovie(self):
self.notify.debug('%d enterExitMovie: Entering the Exit Movie State.' % self.doId)
self.hideGui()
jumpTrack = self.generateToonReverseJumpTrack()
kartTrack = self.generateKartDisappearTrack()
self.finishMovie()
self.movieTrack = Sequence(Func(self.kart.kartLoopSfx.stop), jumpTrack, kartTrack, name=self.av.uniqueName('ExitRaceTrack'), autoFinish=1)
if self.av is not None and self.localToonKarting:
cameraTrack = self.generateCameraReturnMoveTrack()
self.movieTrack.append(cameraTrack)
self.movieTrack.append(Func(self.d_movieFinished))
self.movieTrack.start()
return
def exitExitMovie(self):
self.notify.debug('%d exitExitMovie: Exiting the Exit Movie State.' % self.doId)
def doExitToRaceTrack(self):
self.hideGui()
self.finishMovie()
oldBlockPos = self.kartNode.getPos(render)
self.kartNode.setPos(self.kartNode, 0, 40, 0)
newBlockPos = self.kartNode.getPos(render)
oldBlockScale = self.kartNode.getScale()
self.kart.LODnode.setSwitch(0, 60, 0)
self.kartNode.setPos(render, oldBlockPos)
blockLerpIval = LerpPosInterval(self.kartNode, pos=newBlockPos, duration=2.0)
scaleLerpIval = LerpScaleInterval(self.kartNode, scale=oldBlockScale * 0.2, duration=2.0)
engineStopTrack = self.kart.generateEngineStopTrack(2)
self.finishMovie()
self.movieTrack = Parallel()
if self.av == base.localAvatar:
self.movieTrack.insert(0, Func(base.transitions.irisOut, 1.5, 0))
(self.movieTrack.append(engineStopTrack),)
taskMgr.doMethodLater(1.6, self.bulkLoad, 'loadIt', extraArgs=[])
self.movieTrack.append(Sequence(Parallel(blockLerpIval, scaleLerpIval), Func(self.kartNode.hide), Func(self.kartNode.setPos, render, oldBlockPos), Func(self.kartNode.setScale, oldBlockScale)))
self.movieTrack.start()
def bulkLoad(self):
zoneId = 0 #TODO: get zoneId for certain tracks
base.loader.beginBulkLoad('atRace', TTLocalizer.StartingBlock_Loading, 60, 1, TTLocalizer.TIP_KARTING, zoneId)
class DistributedViewingBlock(DistributedStartingBlock):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedViewingBlock')
sphereRadius = 6
def __init__(self, cr):
DistributedStartingBlock.__init__(self, cr)
self.timer = None
return
def delete(self):
if self.timer is not None:
self.timer.destroy()
del self.timer
DistributedStartingBlock.delete(self)
return
def generateInit(self):
self.notify.debugStateCall(self)
DistributedObject.DistributedObject.generateInit(self)
self.nodePath = NodePath(self.uniqueName('StartingBlock'))
self.collSphere = CollisionSphere(-1, 6.75, -1, self.sphereRadius)
self.collSphere.setTangible(0)
self.collNode = CollisionNode(self.uniqueName('StartingBlockSphere'))
self.collNode.setCollideMask(ToontownGlobals.WallBitmask)
self.collNode.addSolid(self.collSphere)
self.collNodePath = self.nodePath.attachNewNode(self.collNode)
def announceGenerate(self):
self.notify.debugStateCall(self)
DistributedObject.DistributedObject.announceGenerate(self)
self.nodePath.reparentTo(render)
self.accept(self.uniqueName('enterStartingBlockSphere'), self.__handleEnterSphere)
if (__debug__):
if self.testLOD:
self.__generateKartAppearTrack()
def setPadLocationId(self, padLocationId):
self.notify.debugStateCall(self)
self.movieNode = self.nodePath.attachNewNode(self.uniqueName('MovieNode'))
self.exitMovieNode = self.nodePath.attachNewNode(self.uniqueName('ExitMovieNode'))
if padLocationId % 2:
self.movieNode.setPosHpr(0, 6.5, 0, 0, 0, 0)
else:
self.movieNode.setPosHpr(0, -6.5, 0, 0, 0, 0)
self.exitMovieNode.setPosHpr(3, 6.5, 0, 270, 0, 0)
self.collNodePath.reparentTo(self.movieNode)
def __handleEnterSphere(self, collEntry):
if base.localAvatar.doId == self.lastAvId and globalClock.getFrameCount() <= self.lastFrame + 1:
self.notify.debug('Ignoring duplicate entry for avatar.')
return
if base.localAvatar.hp > 0:
def handleEnterRequest(self = self):
self.ignore('stoppedAsleep')
if hasattr(self.dialog, 'doneStatus') and self.dialog.doneStatus == 'ok':
self.d_requestEnter()
else:
self.cr.playGame.getPlace().setState('walk')
self.dialog.ignoreAll()
self.dialog.cleanup()
del self.dialog
self.cr.playGame.getPlace().fsm.request('stopped')
self.accept('stoppedAsleep', handleEnterRequest)
doneEvent = 'enterRequest|dialog'
msg = TTLocalizer.StartingBlock_EnterShowPad
self.dialog = TTGlobalDialog(msg, doneEvent, 4)
self.dialog.accept(doneEvent, handleEnterRequest)
def generateCameraMoveTrack(self):
self.cPos = camera.getPos(self.av)
self.cHpr = camera.getHpr(self.av)
cameraPos = Point3(23, -10, 7)
cameraHpr = Point3(65, -10, 0)
camera.wrtReparentTo(self.nodePath)
cameraTrack = LerpPosHprInterval(camera, 1.5, cameraPos, cameraHpr)
return cameraTrack
def makeGui(self):
self.notify.debugStateCall(self)
if self.timer is not None:
return
self.timer = ToontownTimer()
self.timer.setScale(0.3)
self.timer.setPos(1.16, 0, -.73)
self.timer.hide()
DistributedStartingBlock.makeGui(self)
return
def showGui(self):
self.notify.debugStateCall(self)
self.timer.show()
DistributedStartingBlock.showGui(self)
def hideGui(self):
self.notify.debugStateCall(self)
if not hasattr(self, 'timer') or self.timer is None:
return
self.timer.reset()
self.timer.hide()
DistributedStartingBlock.hideGui(self)
return
def countdown(self):
countdownTime = KartGlobals.COUNTDOWN_TIME - globalClockDelta.localElapsedTime(self.kartPad.getTimestamp(self.avId))
self.timer.countdown(countdownTime)
def enterEnterMovie(self):
self.notify.debug('%d enterEnterMovie: Entering the Enter Movie State.' % self.doId)
if base.config.GetBool('want-qa-regression', 0):
raceName = TTLocalizer.KartRace_RaceNames[self.kartPad.trackType]
self.notify.info('QA-REGRESSION: KARTING: %s' % raceName)
pos = self.nodePath.getPos(render)
hpr = self.nodePath.getHpr(render)
pos.addZ(1.7)
hpr.addX(270)
self.kartNode.setPosHpr(pos, hpr)
toonTrack = self.generateToonMoveTrack()
kartTrack = self.generateKartAppearTrack()
jumpTrack = self.generateToonJumpTrack()
name = self.av.uniqueName('EnterRaceTrack')
if self.av is not None and self.localToonKarting:
cameraTrack = self.generateCameraMoveTrack()
self.finishMovie()
self.movieTrack = Sequence(Parallel(cameraTrack, Sequence()), kartTrack, jumpTrack, Func(self.makeGui), Func(self.showGui), Func(self.countdown), Func(self.request, 'Waiting'), Func(self.d_movieFinished), name=name, autoFinish=1)
else:
self.finishMovie()
self.movieTrack = Sequence(toonTrack, kartTrack, jumpTrack, name=name, autoFinish=1)
self.movieTrack.start()
self.exitRequested = True
return