oldschool-toontown/toontown/racing/DistributedStartingBlockAI.py
2019-11-02 18:27:54 -04:00

131 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)