toontown-just-works/toontown/racing/DistributedStartingBlockAI.py
2024-07-07 18:08:39 -05:00

124 lines
4.5 KiB
Python

from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from toontown.racing.KartShopGlobals import KartGlobals
from toontown.racing import RaceGlobals
class DistributedStartingBlockAI(DistributedObjectAI):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedStartingBlockAI")
def __init__(self, air):
DistributedObjectAI.__init__(self, air)
self.air = air
self.pad = None
self.currentMovie = False
self.avId = 0
self.posHpr = [0, 0, 0, 0, 0, 0]
def setPadDoId(self, padDoId):
self.pad = self.air.doId2do[padDoId]
def getPadDoId(self):
return self.pad.getDoId()
def setPosHpr(self, x, y, z, h, p, r):
self.posHpr = [x, y, z, h, p, r]
def getPosHpr(self):
return self.posHpr
def setPadLocationId(self, padLocationId):
self.padLocationId = padLocationId
def getPadLocationId(self):
return self.padLocationId
def requestEnter(self):
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId)
if not av:
return
if not av.hasKart():
self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eNoKart])
return
if av.getTickets() < RaceGlobals.getEntryFee(self.pad.trackId, self.pad.trackType):
self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eTickets])
return
if self.pad.state == 'AllAboard' or self.pad.state == 'WaitBoarding' :
self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eBoardOver])
return
if self.avId != 0:
if self.avId == avId:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to board the same starting block twice!')
self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eOccupied])
return
self.b_setOccupied(avId)
self.b_setMovie(KartGlobals.ENTER_MOVIE)
def rejectEnter(self, errCode):
pass
def requestExit(self):
avId = self.air.getAvatarIdFromSender()
if avId != self.avId:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to get off a starting block they\'re not on!')
self.b_setMovie(KartGlobals.EXIT_MOVIE)
def setOccupied(self, avId):
self.avId = avId
self.pad.updateTimer()
def d_setOccupied(self, avId):
self.sendUpdate('setOccupied', [avId])
def b_setOccupied(self, avId):
self.setOccupied(avId)
self.d_setOccupied(avId)
def setMovie(self, movie):
self.currentMovie = movie
self.pad.updateMovieState()
def d_setMovie(self, movie):
self.sendUpdate('setMovie', [movie])
def b_setMovie(self, movie):
self.setMovie(movie)
self.d_setMovie(movie)
def movieFinished(self):
avId = self.air.getAvatarIdFromSender()
if self.avId != avId:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to end movie of another toon!')
return
if not self.currentMovie:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to end non-existent movie!')
return
if self.currentMovie == KartGlobals.EXIT_MOVIE:
self.b_setOccupied(0)
self.b_setMovie(0)
class DistributedViewingBlockAI(DistributedStartingBlockAI):
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedViewingBlockAI")
def __init__(self, air):
DistributedStartingBlockAI.__init__(self, air)
self.air = air
def requestEnter(self):
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do[avId]
if not av.hasKart():
self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eNoKart])
return
if self.avId != 0:
if self.avId == avId:
self.air.writeServerEvent('suspicious', avId, 'Toon tried to board the same starting block twice!')
self.sendUpdateToAvatarId(avId, 'rejectEnter', [KartGlobals.ERROR_CODE.eOccupied])
return
self.b_setOccupied(avId)
self.b_setMovie(KartGlobals.ENTER_MOVIE)
taskMgr.doMethodLater(30, DistributedViewingBlockAI.b_setMovie, 'removePlayer%i' % self.doId, [self, KartGlobals.EXIT_MOVIE])
def requestExit(self):
DistributedStartingBlockAI.requestExit(self)
taskMgr.remove('removePlayer%i' % self.doId)