212 lines
6.9 KiB
Python
212 lines
6.9 KiB
Python
from direct.distributed.ClockDelta import *
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.showbase import DirectObject
|
|
import DistributedDoorEntityBase
|
|
from direct.distributed import DistributedObjectAI
|
|
from otp.level import DistributedEntityAI
|
|
from direct.fsm import FourStateAI
|
|
from direct.fsm import ClassicFSM
|
|
from direct.fsm import State
|
|
from direct.task import Task
|
|
|
|
class Lock(DistributedDoorEntityBase.LockBase, DirectObject.DirectObject, FourStateAI.FourStateAI):
|
|
|
|
def __init__(self, door, lockIndex, event, isUnlocked):
|
|
self.door = door
|
|
self.lockIndex = lockIndex
|
|
FourStateAI.FourStateAI.__init__(self, self.stateNames, durations=self.stateDurations)
|
|
self.unlockEvent = None
|
|
self.setUnlockEvent(event)
|
|
self.setIsUnlocked(isUnlocked)
|
|
return
|
|
|
|
def getLockState(self):
|
|
return self.stateIndex
|
|
|
|
def setup(self):
|
|
pass
|
|
|
|
def takedown(self):
|
|
self.ignoreAll()
|
|
FourStateAI.FourStateAI.delete(self)
|
|
del self.door
|
|
|
|
def setUnlockEvent(self, event):
|
|
if self.unlockEvent:
|
|
self.ignore(self.unlockEvent)
|
|
self.unlockEvent = self.door.getOutputEventName(event)
|
|
if self.unlockEvent:
|
|
self.accept(self.unlockEvent, self.setIsUnlocked)
|
|
|
|
def distributeStateChange(self):
|
|
self.door.sendLocksState()
|
|
|
|
def setIsUnlocked(self, isUnlocked):
|
|
self.setIsOn(isUnlocked)
|
|
if not isUnlocked:
|
|
self.door.locking()
|
|
|
|
def setLockState(self, stateIndex):
|
|
if self.stateIndex != stateIndex:
|
|
self.fsm.request(self.states[stateIndex])
|
|
|
|
def isUnlocked(self):
|
|
return self.isOn()
|
|
|
|
|
|
class DistributedDoorEntityAI(DistributedDoorEntityBase.DistributedDoorEntityBase, DistributedEntityAI.DistributedEntityAI, FourStateAI.FourStateAI):
|
|
|
|
def __init__(self, level, entId, zoneId = None):
|
|
self.entId = entId
|
|
self._isGenerated = 0
|
|
self.isOpenInput = None
|
|
DistributedEntityAI.DistributedEntityAI.__init__(self, level, entId)
|
|
self.stateDurations[2] = self.secondsOpen
|
|
FourStateAI.FourStateAI.__init__(self, self.stateNames, durations=self.stateDurations)
|
|
self.setup()
|
|
if zoneId is not None:
|
|
self.generateWithRequired(zoneId)
|
|
return
|
|
|
|
def generateWithRequired(self, zoneId):
|
|
DistributedEntityAI.DistributedEntityAI.generateWithRequired(self, zoneId)
|
|
self._isGenerated = 1
|
|
|
|
def delete(self):
|
|
self.takedown()
|
|
FourStateAI.FourStateAI.delete(self)
|
|
DistributedEntityAI.DistributedEntityAI.delete(self)
|
|
|
|
def getLocksState(self):
|
|
stateBits = 0
|
|
if hasattr(self, 'locks'):
|
|
stateBits = self.locks[0].getLockState() & 15 | self.locks[1].getLockState() << 4 & 240 | self.locks[2].getLockState() << 8 & 3840
|
|
return stateBits
|
|
|
|
def sendLocksState(self):
|
|
if self._isGenerated:
|
|
self.sendUpdate('setLocksState', [self.getLocksState()])
|
|
|
|
def getDoorState(self):
|
|
r = (self.stateIndex, globalClockDelta.getRealNetworkTime())
|
|
return r
|
|
|
|
def getName(self):
|
|
return 'door-%s' % (self.entId,)
|
|
|
|
def setup(self):
|
|
if not hasattr(self, 'unlock0Event'):
|
|
self.unlock0Event = None
|
|
if not hasattr(self, 'unlock1Event'):
|
|
self.unlock1Event = None
|
|
if not hasattr(self, 'unlock2Event'):
|
|
self.unlock2Event = None
|
|
if not hasattr(self, 'unlock3Event'):
|
|
self.unlock3Event = None
|
|
if not hasattr(self, 'isLock0Unlocked'):
|
|
self.isLock0Unlocked = None
|
|
if not hasattr(self, 'isLock1Unlocked'):
|
|
self.isLock1Unlocked = None
|
|
if not hasattr(self, 'isLock2Unlocked'):
|
|
self.isLock2Unlocked = None
|
|
if not hasattr(self, 'isLock3Unlocked'):
|
|
self.isLock3Unlocked = None
|
|
self.locks = [Lock(self, 0, self.unlock0Event, self.isLock0Unlocked), Lock(self, 1, self.unlock1Event, self.isLock1Unlocked), Lock(self, 2, self.unlock2Event, self.isLock2Unlocked)]
|
|
del self.unlock0Event
|
|
del self.unlock1Event
|
|
del self.unlock2Event
|
|
del self.unlock3Event
|
|
del self.isLock0Unlocked
|
|
del self.isLock1Unlocked
|
|
del self.isLock2Unlocked
|
|
del self.isLock3Unlocked
|
|
if hasattr(self, 'isOpenEvent'):
|
|
self.setIsOpenEvent(self.isOpenEvent)
|
|
del self.isOpenEvent
|
|
if hasattr(self, 'isOpen'):
|
|
self.setIsOpen(self.isOpen)
|
|
del self.isOpen
|
|
return
|
|
|
|
def takedown(self):
|
|
self.ignoreAll()
|
|
for i in self.locks:
|
|
i.takedown()
|
|
|
|
del self.locks
|
|
|
|
setScale = DistributedDoorEntityBase.stubFunction
|
|
setColor = DistributedDoorEntityBase.stubFunction
|
|
setModel = DistributedDoorEntityBase.stubFunction
|
|
|
|
def setIsOpenEvent(self, event):
|
|
if self.isOpenEvent:
|
|
self.ignore(self.isOpenEvent)
|
|
self.isOpenEvent = self.getOutputEventName(event)
|
|
if self.isOpenEvent:
|
|
self.accept(self.isOpenEvent, self.setIsOpen)
|
|
|
|
def changedOnState(self, isOn):
|
|
if hasattr(self, 'entId'):
|
|
messenger.send(self.getOutputEventName(), [not isOn])
|
|
|
|
def setIsOpen(self, isOpen):
|
|
self.setIsOn(not isOpen)
|
|
|
|
def getIsOpen(self):
|
|
return not self.getIsOn()
|
|
|
|
def setSecondsOpen(self, secondsOpen):
|
|
if self.secondsOpen != secondsOpen:
|
|
self.secondsOpen = secondsOpen
|
|
if secondsOpen < 0.0:
|
|
secondsOpen = None
|
|
self.stateDurations[2] = secondsOpen
|
|
return
|
|
|
|
def locking(self):
|
|
if self.stateIndex == 1 or self.stateIndex == 2:
|
|
self.fsm.request(self.states[3])
|
|
|
|
def setUnlock0Event(self, event):
|
|
self.locks[0].setUnlockEvent(event)
|
|
|
|
def setUnlock1Event(self, event):
|
|
self.locks[1].setUnlockEvent(event)
|
|
|
|
def setUnlock2Event(self, event):
|
|
self.locks[2].setUnlockEvent(event)
|
|
|
|
def setUnlock3Event(self, event):
|
|
pass
|
|
|
|
def setIsLock0Unlocked(self, unlocked):
|
|
self.locks[0].setIsUnlocked(unlocked)
|
|
|
|
def setIsLock1Unlocked(self, unlocked):
|
|
self.locks[1].setIsUnlocked(unlocked)
|
|
|
|
def setIsLock2Unlocked(self, unlocked):
|
|
self.locks[2].setIsUnlocked(unlocked)
|
|
|
|
def setIsLock3Unlocked(self, unlocked):
|
|
pass
|
|
|
|
def isUnlocked(self):
|
|
isUnlocked = self.locks[0].isUnlocked() and self.locks[1].isUnlocked() and self.locks[2].isUnlocked()
|
|
return isUnlocked
|
|
|
|
def distributeStateChange(self):
|
|
if self._isGenerated:
|
|
self.sendUpdate('setDoorState', self.getDoorState())
|
|
|
|
def requestOpen(self):
|
|
if self.isUnlocked():
|
|
if self.fsm.getCurrentState() is not self.states[2]:
|
|
self.fsm.request(self.states[1])
|
|
|
|
if __dev__:
|
|
|
|
def attribChanged(self, attrib, value):
|
|
self.takedown()
|
|
self.setup()
|