ToonTownRewritten/toontown/building/DistributedBossElevatorAI.py

74 lines
3 KiB
Python

from otp.ai.AIBase import *
from toontown.toonbase import ToontownGlobals
from direct.distributed.ClockDelta import *
from ElevatorConstants import *
import DistributedElevatorAI
import DistributedElevatorExtAI
from direct.fsm import ClassicFSM
from direct.fsm import State
from direct.task import Task
from direct.directnotify import DirectNotifyGlobal
from toontown.suit import DistributedSellbotBossAI
class DistributedBossElevatorAI(DistributedElevatorExtAI.DistributedElevatorExtAI):
def __init__(self, air, bldg, zone, antiShuffle = 0, minLaff = 0):
DistributedElevatorExtAI.DistributedElevatorExtAI.__init__(self, air, bldg, numSeats=8, antiShuffle=antiShuffle, minLaff=minLaff)
self.zone = zone
self.type = ELEVATOR_VP
self.countdownTime = ElevatorData[self.type]['countdown']
def elevatorClosed(self):
numPlayers = self.countFullSeats()
if numPlayers > 0:
bossZone = self.bldg.createBossOffice(self.seats)
for seatIndex in range(len(self.seats)):
avId = self.seats[seatIndex]
if avId:
self.sendUpdateToAvatarId(avId, 'setBossOfficeZone', [bossZone])
self.clearFullNow(seatIndex)
else:
self.notify.warning('The elevator left, but was empty.')
self.fsm.request('closed')
def sendAvatarsToDestination(self, avIdList):
if len(avIdList) > 0:
bossZone = self.bldg.createBossOffice(avIdList)
for avId in avIdList:
if avId:
self.sendUpdateToAvatarId(avId, 'setBossOfficeZoneForce', [bossZone])
def enterClosing(self):
DistributedElevatorAI.DistributedElevatorAI.enterClosing(self)
taskMgr.doMethodLater(ElevatorData[self.type]['closeTime'], self.elevatorClosedTask, self.uniqueName('closing-timer'))
def enterClosed(self):
DistributedElevatorExtAI.DistributedElevatorExtAI.enterClosed(self)
self.fsm.request('opening')
def enterOpening(self):
DistributedElevatorAI.DistributedElevatorAI.enterOpening(self)
taskMgr.doMethodLater(ElevatorData[self.type]['openTime'], self.waitEmptyTask, self.uniqueName('opening-timer'))
def checkBoard(self, av):
dept = ToontownGlobals.cogHQZoneId2deptIndex(self.zone)
if av.hp < self.minLaff:
return REJECT_MINLAFF
if not av.readyForPromotion(dept):
return REJECT_PROMOTION
return 0
def requestBoard(self, *args):
self.notify.debug('requestBoard')
avId = self.air.getAvatarIdFromSender()
av = self.air.doId2do.get(avId)
if av:
boardResponse = self.checkBoard(av)
newArgs = (avId,) + args + (boardResponse,)
if boardResponse == 0:
self.acceptingBoardersHandler(*newArgs)
else:
self.rejectingBoardersHandler(*newArgs)
else:
self.notify.warning('avid: %s does not exist, but tried to board an elevator' % avId)