mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-12-23 03:35:12 -06:00
91 lines
3.5 KiB
Python
91 lines
3.5 KiB
Python
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed.DistributedObjectAI import DistributedObjectAI
|
|
from direct.distributed.ClockDelta import *
|
|
from direct.fsm import ClassicFSM, State
|
|
from direct.task import Task
|
|
import ButterflyGlobals, random
|
|
|
|
class DistributedButterflyAI(DistributedObjectAI):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory("DistributedButterflyAI")
|
|
|
|
def __init__(self, air, playground, area, ownerId):
|
|
DistributedObjectAI.__init__(self, air)
|
|
self.playground = playground
|
|
self.area = area
|
|
self.ownerId = ownerId
|
|
self.fsm = ClassicFSM.ClassicFSM('DistributedButterfliesAI', [State.State('off', self.enterOff, self.exitOff, ['Flying', 'Landed']), State.State('Flying', self.enterFlying, self.exitFlying, ['Landed']), State.State('Landed', self.enterLanded, self.exitLanded, ['Flying'])], 'off', 'off')
|
|
self.fsm.enterInitialState()
|
|
self.curPos, self.curIndex, self.destPos, self.destIndex, self.time = ButterflyGlobals.getFirstRoute(self.playground, self.area, self.ownerId)
|
|
return None
|
|
|
|
def delete(self):
|
|
ButterflyGlobals.recycleIndex(self.curIndex, self.playground, self.area, self.ownerId)
|
|
ButterflyGlobals.recycleIndex(self.destIndex, self.playground, self.area, self.ownerId)
|
|
self.fsm.request('off')
|
|
del self.fsm
|
|
DistributedObjectAI.delete(self)
|
|
|
|
def d_setState(self, stateIndex, curIndex, destIndex, time):
|
|
self.sendUpdate('setState', [stateIndex,
|
|
curIndex,
|
|
destIndex,
|
|
time,
|
|
globalClockDelta.getRealNetworkTime()])
|
|
|
|
def getArea(self):
|
|
return [self.playground, self.area]
|
|
|
|
def getState(self):
|
|
return [self.stateIndex,
|
|
self.curIndex,
|
|
self.destIndex,
|
|
self.time,
|
|
globalClockDelta.getRealNetworkTime()]
|
|
|
|
def start(self):
|
|
self.fsm.request('Flying')
|
|
|
|
def avatarEnter(self):
|
|
if self.fsm.getCurrentState().getName() == 'Landed':
|
|
self.__ready()
|
|
return None
|
|
|
|
def enterOff(self):
|
|
self.stateIndex = ButterflyGlobals.OFF
|
|
return None
|
|
|
|
def exitOff(self):
|
|
return None
|
|
|
|
def enterFlying(self):
|
|
self.stateIndex = ButterflyGlobals.FLYING
|
|
ButterflyGlobals.recycleIndex(self.curIndex, self.playground, self.area, self.ownerId)
|
|
self.d_setState(ButterflyGlobals.FLYING, self.curIndex, self.destIndex, self.time)
|
|
taskMgr.doMethodLater(self.time, self.__handleArrival, self.uniqueName('butter-flying'))
|
|
return None
|
|
|
|
def exitFlying(self):
|
|
taskMgr.remove(self.uniqueName('butter-flying'))
|
|
return None
|
|
|
|
def __handleArrival(self, task):
|
|
self.curPos = self.destPos
|
|
self.curIndex = self.destIndex
|
|
self.fsm.request('Landed')
|
|
return Task.done
|
|
|
|
def enterLanded(self):
|
|
self.stateIndex = ButterflyGlobals.LANDED
|
|
self.time = random.random() * ButterflyGlobals.MAX_LANDED_TIME
|
|
self.d_setState(ButterflyGlobals.LANDED, self.curIndex, self.destIndex, self.time)
|
|
taskMgr.doMethodLater(self.time, self.__ready, self.uniqueName('butter-ready'))
|
|
return None
|
|
|
|
def exitLanded(self):
|
|
taskMgr.remove(self.uniqueName('butter-ready'))
|
|
return None
|
|
|
|
def __ready(self, task = None):
|
|
self.destPos, self.destIndex, self.time = ButterflyGlobals.getNextPos(self.curPos, self.playground, self.area, self.ownerId)
|
|
self.fsm.request('Flying')
|
|
return Task.done
|