83 lines
2.5 KiB
Python
83 lines
2.5 KiB
Python
|
from otp.ai.AIBaseGlobal import *
|
||
|
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 DistributedAnimatedPropAI(DistributedObjectAI.DistributedObjectAI):
|
||
|
|
||
|
def __init__(self, air, propId):
|
||
|
DistributedObjectAI.DistributedObjectAI.__init__(self, air)
|
||
|
self.fsm = ClassicFSM.ClassicFSM('DistributedAnimatedPropAI', [
|
||
|
State.State('off', self.enterOff, self.exitOff, [
|
||
|
'playing']),
|
||
|
State.State('attract', self.enterAttract, self.exitAttract, [
|
||
|
'playing']),
|
||
|
State.State('playing', self.enterPlaying, self.exitPlaying, [
|
||
|
'attract'])], 'off', 'off')
|
||
|
self.fsm.enterInitialState()
|
||
|
self.propId = propId
|
||
|
self.avatarId = 0
|
||
|
|
||
|
def delete(self):
|
||
|
self.fsm.requestFinalState()
|
||
|
del self.fsm
|
||
|
DistributedObjectAI.DistributedObjectAI.delete(self)
|
||
|
|
||
|
def getPropId(self):
|
||
|
return self.propId
|
||
|
|
||
|
def getAvatarInteract(self):
|
||
|
return self.avatarId
|
||
|
|
||
|
def getInitialState(self):
|
||
|
return [
|
||
|
self.fsm.getCurrentState().getName(), globalClockDelta.getRealNetworkTime()]
|
||
|
|
||
|
def getOwnerDoId(self):
|
||
|
return self.ownerDoId
|
||
|
|
||
|
def requestInteract(self):
|
||
|
avatarId = self.air.getAvatarIdFromSender()
|
||
|
stateName = self.fsm.getCurrentState().getName()
|
||
|
if stateName != 'playing':
|
||
|
self.sendUpdate('setAvatarInteract', [avatarId])
|
||
|
self.avatarId = avatarId
|
||
|
self.fsm.request('playing')
|
||
|
else:
|
||
|
self.sendUpdateToAvatarId(avatarId, 'rejectInteract', [])
|
||
|
|
||
|
def requestExit(self):
|
||
|
avatarId = self.air.getAvatarIdFromSender()
|
||
|
if avatarId == self.avatarId:
|
||
|
stateName = self.fsm.getCurrentState().getName()
|
||
|
if stateName == 'playing':
|
||
|
self.sendUpdate('avatarExit', [avatarId])
|
||
|
self.fsm.request('attract')
|
||
|
|
||
|
def getState(self):
|
||
|
return [
|
||
|
self.fsm.getCurrentState().getName(), globalClockDelta.getRealNetworkTime()]
|
||
|
|
||
|
def d_setState(self, state):
|
||
|
self.sendUpdate('setState', [state, globalClockDelta.getRealNetworkTime()])
|
||
|
|
||
|
def enterOff(self):
|
||
|
pass
|
||
|
|
||
|
def exitOff(self):
|
||
|
pass
|
||
|
|
||
|
def enterAttract(self):
|
||
|
self.d_setState('attract')
|
||
|
|
||
|
def exitAttract(self):
|
||
|
pass
|
||
|
|
||
|
def enterPlaying(self):
|
||
|
self.d_setState('playing')
|
||
|
|
||
|
def exitPlaying(self):
|
||
|
pass
|