ToonTownRewritten/toontown/building/DistributedDoorAI.py

264 lines
8.9 KiB
Python

from otp.ai.AIBaseGlobal import *
from direct.task.Task import Task
from direct.distributed.ClockDelta import *
from direct.directnotify import DirectNotifyGlobal
from direct.fsm import ClassicFSM, State
from direct.distributed import DistributedObjectAI
from direct.fsm import State
class DistributedDoorAI(DistributedObjectAI.DistributedObjectAI):
def __init__(self, air, blockNumber, doorType, doorIndex = 0, lockValue = 0, swing = 3):
DistributedObjectAI.DistributedObjectAI.__init__(self, air)
self.block = blockNumber
self.swing = swing
self.otherDoor = None
self.doorType = doorType
self.doorIndex = doorIndex
self.setDoorLock(lockValue)
self.fsm = ClassicFSM.ClassicFSM('DistributedDoorAI_right', [State.State('off', self.enterOff, self.exitOff, ['closing',
'closed',
'opening',
'open']),
State.State('closing', self.enterClosing, self.exitClosing, ['closed', 'opening']),
State.State('closed', self.enterClosed, self.exitClosed, ['opening']),
State.State('opening', self.enterOpening, self.exitOpening, ['open']),
State.State('open', self.enterOpen, self.exitOpen, ['closing', 'open'])], 'off', 'off')
self.fsm.enterInitialState()
self.exitDoorFSM = ClassicFSM.ClassicFSM('DistributedDoorAI_left', [State.State('off', self.exitDoorEnterOff, self.exitDoorExitOff, ['closing',
'closed',
'opening',
'open']),
State.State('closing', self.exitDoorEnterClosing, self.exitDoorExitClosing, ['closed', 'opening']),
State.State('closed', self.exitDoorEnterClosed, self.exitDoorExitClosed, ['opening']),
State.State('opening', self.exitDoorEnterOpening, self.exitDoorExitOpening, ['open']),
State.State('open', self.exitDoorEnterOpen, self.exitDoorExitOpen, ['closing', 'open'])], 'off', 'off')
self.exitDoorFSM.enterInitialState()
self.doLaterTask = None
self.exitDoorDoLaterTask = None
self.avatarsWhoAreEntering = {}
self.avatarsWhoAreExiting = {}
return
def delete(self):
taskMgr.remove(self.uniqueName('door_opening-timer'))
taskMgr.remove(self.uniqueName('door_open-timer'))
taskMgr.remove(self.uniqueName('door_closing-timer'))
taskMgr.remove(self.uniqueName('exit_door_open-timer'))
taskMgr.remove(self.uniqueName('exit_door_closing-timer'))
taskMgr.remove(self.uniqueName('exit_door_opening-timer'))
self.ignoreAll()
del self.block
del self.swing
del self.doorType
del self.fsm
del self.exitDoorFSM
del self.otherDoor
DistributedObjectAI.DistributedObjectAI.delete(self)
def getDoorIndex(self):
return self.doorIndex
def setSwing(self, swing):
self.swing = swing
def getSwing(self):
return self.swing
def getDoorType(self):
return self.doorType
def getZoneIdAndBlock(self):
r = [self.zoneId, self.block]
return r
def setOtherDoor(self, door):
self.otherDoor = door
def getZoneId(self):
return self.zoneId
def getState(self):
return [self.fsm.getCurrentState().getName(), globalClockDelta.getRealNetworkTime()]
def getExitDoorState(self):
return [self.exitDoorFSM.getCurrentState().getName(), globalClockDelta.getRealNetworkTime()]
def isOpen(self):
state = self.fsm.getCurrentState().getName()
return state == 'open' or state == 'opening'
def isClosed(self):
return not self.isOpen()
def setDoorLock(self, locked):
self.lockedDoor = locked
def isLockedDoor(self):
if config.GetBool('no-locked-doors', 0):
return 0
else:
return self.lockedDoor
def sendReject(self, avatarID, lockedVal):
self.sendUpdateToAvatarId(avatarID, 'rejectEnter', [lockedVal])
def requestEnter(self):
avatarID = self.air.getAvatarIdFromSender()
lockedVal = self.isLockedDoor()
if lockedVal:
self.sendReject(avatarID, lockedVal)
else:
self.enqueueAvatarIdEnter(avatarID)
self.sendUpdateToAvatarId(avatarID, 'setOtherZoneIdAndDoId', [self.otherDoor.getZoneId(), self.otherDoor.getDoId()])
def enqueueAvatarIdEnter(self, avatarID):
if not self.avatarsWhoAreEntering.has_key(avatarID):
self.avatarsWhoAreEntering[avatarID] = 1
self.sendUpdate('avatarEnter', [avatarID])
self.openDoor(self.fsm)
def openDoor(self, doorFsm):
stateName = doorFsm.getCurrentState().getName()
if stateName == 'open':
doorFsm.request('open')
elif stateName != 'opening':
doorFsm.request('opening')
def requestExit(self):
avatarID = self.air.getAvatarIdFromSender()
self.sendUpdate('avatarExit', [avatarID])
self.enqueueAvatarIdExit(avatarID)
def enqueueAvatarIdExit(self, avatarID):
if self.avatarsWhoAreEntering.has_key(avatarID):
del self.avatarsWhoAreEntering[avatarID]
elif not self.avatarsWhoAreExiting.has_key(avatarID):
self.avatarsWhoAreExiting[avatarID] = 1
self.openDoor(self.exitDoorFSM)
def requestSuitEnter(self, avatarID):
self.enqueueAvatarIdEnter(avatarID)
def requestSuitExit(self, avatarID):
self.sendUpdate('avatarExit', [avatarID])
self.enqueueAvatarIdExit(avatarID)
def d_setState(self, state):
self.sendUpdate('setState', [state, globalClockDelta.getRealNetworkTime()])
def d_setExitDoorState(self, state):
self.sendUpdate('setExitDoorState', [state, globalClockDelta.getRealNetworkTime()])
def enterOff(self):
pass
def exitOff(self):
pass
def openTask(self, task):
self.fsm.request('closing')
return Task.done
def enterClosing(self):
self.d_setState('closing')
self.doLaterTask = taskMgr.doMethodLater(1, self.closingTask, self.uniqueName('door_closing-timer'))
def exitClosing(self):
if self.doLaterTask:
taskMgr.remove(self.doLaterTask)
self.doLaterTask = None
return
def closingTask(self, task):
self.fsm.request('closed')
return Task.done
def enterClosed(self):
self.d_setState('closed')
def exitClosed(self):
pass
def enterOpening(self):
self.d_setState('opening')
self.doLaterTask = taskMgr.doMethodLater(1, self.openingTask, self.uniqueName('door_opening-timer'))
def exitOpening(self):
if self.doLaterTask:
taskMgr.remove(self.doLaterTask)
self.doLaterTask = None
return
def openingTask(self, task):
self.fsm.request('open')
return Task.done
def enterOpen(self):
self.d_setState('open')
self.avatarsWhoAreEntering = {}
self.doLaterTask = taskMgr.doMethodLater(1, self.openTask, self.uniqueName('door_open-timer'))
def exitOpen(self):
if self.doLaterTask:
taskMgr.remove(self.doLaterTask)
self.doLaterTask = None
return
def exitDoorEnterOff(self):
pass
def exitDoorExitOff(self):
pass
def exitDoorOpenTask(self, task):
self.exitDoorFSM.request('closing')
return Task.done
def exitDoorEnterClosing(self):
self.d_setExitDoorState('closing')
self.exitDoorDoLaterTask = taskMgr.doMethodLater(1, self.exitDoorClosingTask, self.uniqueName('exit_door_closing-timer'))
def exitDoorExitClosing(self):
if self.exitDoorDoLaterTask:
taskMgr.remove(self.exitDoorDoLaterTask)
self.exitDoorDoLaterTask = None
return
def exitDoorClosingTask(self, task):
self.exitDoorFSM.request('closed')
return Task.done
def exitDoorEnterClosed(self):
self.d_setExitDoorState('closed')
def exitDoorExitClosed(self):
if self.exitDoorDoLaterTask:
taskMgr.remove(self.exitDoorDoLaterTask)
self.exitDoorDoLaterTask = None
return
def exitDoorEnterOpening(self):
self.d_setExitDoorState('opening')
self.exitDoorDoLaterTask = taskMgr.doMethodLater(1, self.exitDoorOpeningTask, self.uniqueName('exit_door_opening-timer'))
def exitDoorExitOpening(self):
if self.exitDoorDoLaterTask:
taskMgr.remove(self.exitDoorDoLaterTask)
self.exitDoorDoLaterTask = None
return
def exitDoorOpeningTask(self, task):
self.exitDoorFSM.request('open')
return Task.done
def exitDoorEnterOpen(self):
self.d_setExitDoorState('open')
self.avatarsWhoAreExiting = {}
self.exitDoorDoLaterTask = taskMgr.doMethodLater(1, self.exitDoorOpenTask, self.uniqueName('exit_door_open-timer'))
def exitDoorExitOpen(self):
if self.exitDoorDoLaterTask:
taskMgr.remove(self.exitDoorDoLaterTask)
self.exitDoorDoLaterTask = None
return