132 lines
4.6 KiB
Python
132 lines
4.6 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
|
||
|
if not self.kartPad:
|
||
|
self.handleUnexpectedCleanup()
|
||
|
return
|
||
|
self.kartPad.kartMovieDone()
|
||
|
return
|
||
|
|
||
|
def cleanupAvatar(self):
|
||
|
self.ignore(self.unexpectedEvent)
|
||
|
if not self.kartPad:
|
||
|
self.handleUnexpectedCleanup()
|
||
|
return
|
||
|
self.kartPad.removeAvBlock(self.avId, self)
|
||
|
self.avId = 0
|
||
|
self.isActive = True
|
||
|
self.d_setOccupied(0)
|
||
|
|
||
|
def handleUnexpectedCleanup(self):
|
||
|
self.notify.warning('KartPad has already been cleaned up')
|
||
|
from toontown.hood import GSHoodDataAI
|
||
|
if hasattr(simbase.air, 'hoods') and simbase.air.hoods:
|
||
|
for hood in simbase.air.hoods:
|
||
|
if isinstance(hood, GSHoodDataAI.GSHoodDataAI):
|
||
|
hood.logPossibleRaceCondition(self)
|
||
|
|
||
|
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)
|