163 lines
6.1 KiB
Python
163 lines
6.1 KiB
Python
|
from panda3d.core import *
|
||
|
from toontown.toonbase import ToontownGlobals
|
||
|
import Playground
|
||
|
from toontown.building import Elevator
|
||
|
from toontown.toontowngui import TTDialog
|
||
|
from toontown.toonbase import TTLocalizer
|
||
|
from toontown.racing import RaceGlobals
|
||
|
from direct.fsm import State
|
||
|
from toontown.safezone import PicnicBasket
|
||
|
from toontown.safezone import GolfKart
|
||
|
from direct.task.Task import Task
|
||
|
|
||
|
class OZPlayground(Playground.Playground):
|
||
|
waterLevel = -0.53
|
||
|
|
||
|
def __init__(self, loader, parentFSM, doneEvent):
|
||
|
Playground.Playground.__init__(self, loader, parentFSM, doneEvent)
|
||
|
self.parentFSM = parentFSM
|
||
|
self.picnicBasketBlockDoneEvent = 'picnicBasketBlockDone'
|
||
|
self.cameraSubmerged = -1
|
||
|
self.toonSubmerged = -1
|
||
|
self.fsm.addState(State.State('picnicBasketBlock', self.enterPicnicBasketBlock, self.exitPicnicBasketBlock, ['walk']))
|
||
|
state = self.fsm.getStateNamed('walk')
|
||
|
state.addTransition('picnicBasketBlock')
|
||
|
self.picnicBasketDoneEvent = 'picnicBasketDone'
|
||
|
|
||
|
def load(self):
|
||
|
Playground.Playground.load(self)
|
||
|
|
||
|
def unload(self):
|
||
|
Playground.Playground.unload(self)
|
||
|
|
||
|
def enter(self, requestStatus):
|
||
|
Playground.Playground.enter(self, requestStatus)
|
||
|
|
||
|
def exit(self):
|
||
|
Playground.Playground.exit(self)
|
||
|
taskMgr.remove('oz-check-toon-underwater')
|
||
|
taskMgr.remove('oz-check-cam-underwater')
|
||
|
self.loader.hood.setNoFog()
|
||
|
|
||
|
def enterStart(self):
|
||
|
self.cameraSubmerged = 0
|
||
|
self.toonSubmerged = 0
|
||
|
taskMgr.add(self.__checkToonUnderwater, 'oz-check-toon-underwater')
|
||
|
taskMgr.add(self.__checkCameraUnderwater, 'oz-check-cam-underwater')
|
||
|
|
||
|
def __checkCameraUnderwater(self, task):
|
||
|
if camera.getZ(render) < self.waterLevel:
|
||
|
self.__submergeCamera()
|
||
|
else:
|
||
|
self.__emergeCamera()
|
||
|
return Task.cont
|
||
|
|
||
|
def __checkToonUnderwater(self, task):
|
||
|
if base.localAvatar.getZ() < -4.0:
|
||
|
self.__submergeToon()
|
||
|
else:
|
||
|
self.__emergeToon()
|
||
|
return Task.cont
|
||
|
|
||
|
def __submergeCamera(self):
|
||
|
if self.cameraSubmerged == 1:
|
||
|
return
|
||
|
self.loader.hood.setUnderwaterFog()
|
||
|
base.playSfx(self.loader.underwaterSound, looping=1, volume=0.8)
|
||
|
self.cameraSubmerged = 1
|
||
|
|
||
|
def __emergeCamera(self):
|
||
|
if self.cameraSubmerged == 0:
|
||
|
return
|
||
|
self.loader.hood.setNoFog()
|
||
|
self.loader.underwaterSound.stop()
|
||
|
self.cameraSubmerged = 0
|
||
|
|
||
|
def __submergeToon(self):
|
||
|
if self.toonSubmerged == 1:
|
||
|
return
|
||
|
base.playSfx(self.loader.submergeSound)
|
||
|
if base.config.GetBool('disable-flying-glitch') == 0:
|
||
|
self.fsm.request('walk')
|
||
|
self.walkStateData.fsm.request('swimming', [self.loader.swimSound])
|
||
|
pos = base.localAvatar.getPos(render)
|
||
|
base.localAvatar.d_playSplashEffect(pos[0], pos[1], self.waterLevel)
|
||
|
self.toonSubmerged = 1
|
||
|
|
||
|
def __emergeToon(self):
|
||
|
if self.toonSubmerged == 0:
|
||
|
return
|
||
|
self.walkStateData.fsm.request('walking')
|
||
|
self.toonSubmerged = 0
|
||
|
|
||
|
def enterTeleportIn(self, requestStatus):
|
||
|
reason = requestStatus.get('reason')
|
||
|
if reason == RaceGlobals.Exit_Barrier:
|
||
|
requestStatus['nextState'] = 'popup'
|
||
|
self.dialog = TTDialog.TTDialog(text=TTLocalizer.KartRace_RaceTimeout, command=self.__cleanupDialog, style=TTDialog.Acknowledge)
|
||
|
elif reason == RaceGlobals.Exit_Slow:
|
||
|
requestStatus['nextState'] = 'popup'
|
||
|
self.dialog = TTDialog.TTDialog(text=TTLocalizer.KartRace_RacerTooSlow, command=self.__cleanupDialog, style=TTDialog.Acknowledge)
|
||
|
elif reason == RaceGlobals.Exit_BarrierNoRefund:
|
||
|
requestStatus['nextState'] = 'popup'
|
||
|
self.dialog = TTDialog.TTDialog(text=TTLocalizer.KartRace_RaceTimeoutNoRefund, command=self.__cleanupDialog, style=TTDialog.Acknowledge)
|
||
|
self.toonSubmerged = -1
|
||
|
taskMgr.remove('oz-check-toon-underwater')
|
||
|
Playground.Playground.enterTeleportIn(self, requestStatus)
|
||
|
|
||
|
def teleportInDone(self):
|
||
|
self.toonSubmerged = -1
|
||
|
taskMgr.add(self.__checkToonUnderwater, 'oz-check-toon-underwater')
|
||
|
Playground.Playground.teleportInDone(self)
|
||
|
|
||
|
def __cleanupDialog(self, value):
|
||
|
if self.dialog:
|
||
|
self.dialog.cleanup()
|
||
|
self.dialog = None
|
||
|
if hasattr(self, 'fsm'):
|
||
|
self.fsm.request('walk', [1])
|
||
|
return
|
||
|
|
||
|
def enterPicnicBasketBlock(self, picnicBasket):
|
||
|
base.localAvatar.laffMeter.start()
|
||
|
base.localAvatar.b_setAnimState('off', 1)
|
||
|
base.localAvatar.cantLeaveGame = 1
|
||
|
self.accept(self.picnicBasketDoneEvent, self.handlePicnicBasketDone)
|
||
|
self.trolley = PicnicBasket.PicnicBasket(self, self.fsm, self.picnicBasketDoneEvent, picnicBasket.getDoId(), picnicBasket.seatNumber)
|
||
|
self.trolley.load()
|
||
|
self.trolley.enter()
|
||
|
|
||
|
def exitPicnicBasketBlock(self):
|
||
|
base.localAvatar.laffMeter.stop()
|
||
|
base.localAvatar.cantLeaveGame = 0
|
||
|
self.ignore(self.trolleyDoneEvent)
|
||
|
self.trolley.unload()
|
||
|
self.trolley.exit()
|
||
|
del self.trolley
|
||
|
|
||
|
def detectedPicnicTableSphereCollision(self, picnicBasket):
|
||
|
self.fsm.request('picnicBasketBlock', [picnicBasket])
|
||
|
|
||
|
def handleStartingBlockDone(self, doneStatus):
|
||
|
self.notify.debug('handling StartingBlock done event')
|
||
|
where = doneStatus['where']
|
||
|
if where == 'reject':
|
||
|
self.fsm.request('walk')
|
||
|
elif where == 'exit':
|
||
|
self.fsm.request('walk')
|
||
|
elif where == 'racetrack':
|
||
|
self.doneStatus = doneStatus
|
||
|
messenger.send(self.doneEvent)
|
||
|
else:
|
||
|
self.notify.error('Unknown mode: ' + where + ' in handleStartingBlockDone')
|
||
|
|
||
|
def handlePicnicBasketDone(self, doneStatus):
|
||
|
self.notify.debug('handling picnic basket done event')
|
||
|
mode = doneStatus['mode']
|
||
|
if mode == 'reject':
|
||
|
self.fsm.request('walk')
|
||
|
elif mode == 'exit':
|
||
|
self.fsm.request('walk')
|
||
|
else:
|
||
|
self.notify.error('Unknown mode: ' + mode + ' in handlePicnicBasketDone')
|