135 lines
4.5 KiB
Python
135 lines
4.5 KiB
Python
from panda3d.core import *
|
|
import Playground
|
|
from direct.task.Task import Task
|
|
import random
|
|
from direct.fsm import ClassicFSM, State
|
|
from direct.actor import Actor
|
|
from toontown.toonbase import ToontownGlobals
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from toontown.hood import Place
|
|
|
|
class DDPlayground(Playground.Playground):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('DDPlayground')
|
|
|
|
def __init__(self, loader, parentFSM, doneEvent):
|
|
Playground.Playground.__init__(self, loader, parentFSM, doneEvent)
|
|
self.cameraSubmerged = -1
|
|
self.toonSubmerged = -1
|
|
self.activityFsm = ClassicFSM.ClassicFSM('Activity', [State.State('off', self.enterOff, self.exitOff, ['OnBoat']), State.State('OnBoat', self.enterOnBoat, self.exitOnBoat, ['off'])], 'off', 'off')
|
|
self.activityFsm.enterInitialState()
|
|
|
|
def load(self):
|
|
Playground.Playground.load(self)
|
|
|
|
def unload(self):
|
|
del self.activityFsm
|
|
Playground.Playground.unload(self)
|
|
|
|
def enter(self, requestStatus):
|
|
self.nextSeagullTime = 0
|
|
taskMgr.add(self.__seagulls, 'dd-seagulls')
|
|
self.loader.hood.setWhiteFog()
|
|
Playground.Playground.enter(self, requestStatus)
|
|
|
|
def exit(self):
|
|
Playground.Playground.exit(self)
|
|
taskMgr.remove('dd-check-toon-underwater')
|
|
taskMgr.remove('dd-check-cam-underwater')
|
|
taskMgr.remove('dd-seagulls')
|
|
self.loader.hood.setNoFog()
|
|
|
|
def enterStart(self):
|
|
self.cameraSubmerged = 0
|
|
self.toonSubmerged = 0
|
|
taskMgr.add(self.__checkToonUnderwater, 'dd-check-toon-underwater')
|
|
taskMgr.add(self.__checkCameraUnderwater, 'dd-check-cam-underwater')
|
|
|
|
def enterDoorOut(self):
|
|
taskMgr.remove('dd-check-toon-underwater')
|
|
|
|
def exitDoorOut(self):
|
|
pass
|
|
|
|
def enterDoorIn(self, requestStatus):
|
|
Playground.Playground.enterDoorIn(self, requestStatus)
|
|
taskMgr.add(self.__checkToonUnderwater, 'dd-check-toon-underwater')
|
|
|
|
def __checkCameraUnderwater(self, task):
|
|
if camera.getZ(render) < 1.0:
|
|
self.__submergeCamera()
|
|
else:
|
|
self.__emergeCamera()
|
|
return Task.cont
|
|
|
|
def __checkToonUnderwater(self, task):
|
|
if base.localAvatar.getZ() < -2.3314585:
|
|
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.loader.seagullSound.stop()
|
|
taskMgr.remove('dd-seagulls')
|
|
self.cameraSubmerged = 1
|
|
|
|
def __emergeCamera(self):
|
|
if self.cameraSubmerged == 0:
|
|
return
|
|
self.loader.hood.setWhiteFog()
|
|
self.loader.underwaterSound.stop()
|
|
self.nextSeagullTime = random.random() * 8.0
|
|
taskMgr.add(self.__seagulls, 'dd-seagulls')
|
|
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], 1.675)
|
|
self.toonSubmerged = 1
|
|
|
|
def __emergeToon(self):
|
|
if self.toonSubmerged == 0:
|
|
return
|
|
self.walkStateData.fsm.request('walking')
|
|
self.toonSubmerged = 0
|
|
|
|
def __seagulls(self, task):
|
|
if task.time < self.nextSeagullTime:
|
|
return Task.cont
|
|
base.playSfx(self.loader.seagullSound)
|
|
self.nextSeagullTime = task.time + random.random() * 4.0 + 8.0
|
|
return Task.cont
|
|
|
|
def enterTeleportIn(self, requestStatus):
|
|
self.toonSubmerged = -1
|
|
taskMgr.remove('dd-check-toon-underwater')
|
|
Playground.Playground.enterTeleportIn(self, requestStatus)
|
|
|
|
def teleportInDone(self):
|
|
self.toonSubmerged = -1
|
|
taskMgr.add(self.__checkToonUnderwater, 'dd-check-toon-underwater')
|
|
Playground.Playground.teleportInDone(self)
|
|
|
|
def enterOff(self):
|
|
return None
|
|
|
|
def exitOff(self):
|
|
return None
|
|
|
|
def enterOnBoat(self):
|
|
base.localAvatar.b_setParent(ToontownGlobals.SPDonaldsBoat)
|
|
base.playSfx(self.loader.waterSound, looping=1)
|
|
|
|
def exitOnBoat(self):
|
|
base.localAvatar.b_setParent(ToontownGlobals.SPRender)
|
|
self.loader.waterSound.stop()
|