historical/toontown-classic.git/toontown/racing/DistributedStartingBlockAI.py
2024-01-16 11:20:27 -06:00

122 lines
4.1 KiB
Python

from otp.ai.AIBase import *
from toontown.toonbase import ToontownGlobals
from direct.distributed.ClockDelta import *
from direct.distributed import DistributedObjectAI
from toontown.building.ElevatorConstants import *
from toontown.building import DistributedElevatorExtAI
from direct.fsm import ClassicFSM
from direct.fsm import State
from direct.showbase.DirectObject import DirectObject
from toontown.racing.KartShopGlobals import KartGlobals
if __debug__:
import pdb
class DistributedStartingBlockAI(DistributedObjectAI.DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedStartingBlockAI')
def __init__(self, air, kartPad, x, y, z, h, p, r, padLocationId):
DistributedObjectAI.DistributedObjectAI.__init__(self, air)
self.avId = 0
self.isActive = True
self.kartPad = kartPad
self.unexpectedEvent = None
self.padLocationId = padLocationId
self.posHpr = (x,
y,
z,
h,
p,
r)
self.currentMovie = None
return
def delete(self):
self.avId = 0
self.kartPad = None
DistributedObjectAI.DistributedObjectAI.delete(self)
return
def getPadDoId(self):
return self.kartPad.getDoId()
def getPadLocationId(self):
return self.padLocationId
def getPosHpr(self):
return self.posHpr
def setActive(self, isActive):
self.isActive = isActive
def requestEnter(self, paid):
avId = self.air.getAvatarIdFromSender()
if self.isActive and self.avId == 0:
success = self.kartPad.addAvBlock(avId, self, paid)
self.notify.debug('requestEnter: avId %s wants to enter the kart block.' % avId)
if success == KartGlobals.ERROR_CODE.success:
self.avId = avId
self.isActive = False
self.unexpectedEvent = self.air.getAvatarExitEvent(self.avId)
self.acceptOnce(self.unexpectedEvent, self.unexpectedExit)
self.d_setOccupied(self.avId)
self.d_setMovie(KartGlobals.ENTER_MOVIE)
else:
self.sendUpdateToAvatarId(avId, 'rejectEnter', [success])
else:
if hasattr(self.kartPad, 'state') and self.kartPad.state in ['WaitBoarding', 'AllAboard']:
errorCode = KartGlobals.ERROR_CODE.eBoardOver
else:
errorCode = KartGlobals.ERROR_CODE.eOccupied
self.sendUpdateToAvatarId(avId, 'rejectEnter', [errorCode])
def requestExit(self):
avId = self.air.getAvatarIdFromSender()
self.notify.debug('requestExit: avId %s wants to exit the Kart Block.' % avId)
success = self.validate(avId, self.avId == avId, 'requestExit: avId is not occupying this kart block.')
if not success:
return
self.normalExit()
def movieFinished(self):
if self.currentMovie == KartGlobals.EXIT_MOVIE:
self.cleanupAvatar()
self.currentMovie = None
self.kartPad.kartMovieDone()
return
def cleanupAvatar(self):
self.ignore(self.unexpectedEvent)
self.kartPad.removeAvBlock(self.avId, self)
self.avId = 0
self.isActive = True
self.d_setOccupied(0)
def normalExit(self):
self.d_setMovie(KartGlobals.EXIT_MOVIE)
def raceExit(self):
self.cleanupAvatar()
self.movieFinished()
def unexpectedExit(self):
self.cleanupAvatar()
self.movieFinished()
self.unexpectedEvent = None
return
def d_setOccupied(self, avId):
self.sendUpdate('setOccupied', [avId])
def d_setMovie(self, mode):
self.currentMovie = mode
self.sendUpdate('setMovie', [mode])
class DistributedViewingBlockAI(DistributedStartingBlockAI):
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedViewingBlockAI')
def __init__(self, air, kartPad, x, y, z, h, p, r, padLocationId):
DistributedStartingBlockAI.__init__(self, air, kartPad, x, y, z, h, p, r, padLocationId)
def delete(self):
DistributedStartingBlockAI.delete(self)