from direct.directnotify import DirectNotifyGlobal
from direct.distributed.DistributedObjectAI import DistributedObjectAI
from direct.task import Task
import PartyGlobals

class DistributedPartyCannonAI(DistributedObjectAI):
    notify = DirectNotifyGlobal.directNotify.newCategory("DistributedPartyCannonAI")
    
    def __init__(self, air):
        DistributedObjectAI.__init__(self, air)
        self.actId = 0
        self.posHpr = [0, 0, 0, 0, 0, 0]
        self.avId = 0

        
    def delete(self):
        taskMgr.remove('removeToon%d' % self.doId)
        DistributedObjectAI.delete(self)
        
    def setActivityDoId(self, actId):
        self.actId = actId
        
    def getActivityDoId(self):
        return self.actId

    def setPosHpr(self, x, y, z, h, p, r):
        self.posHpr = [x, y, z, h, p, r]
        
    def getPosHpr(self):
        return self.posHpr

    def requestEnter(self):
        if not self.avId:
            self.avId = self.air.getAvatarIdFromSender()
            self.d_setMovie(PartyGlobals.CANNON_MOVIE_LOAD, self.avId)

    def requestExit(self):
        avId = self.air.getAvatarIdFromSender()
        if self.avId == avId:
            self.sendUpdate('setCannonExit', [avId])
            self.avId = 0

    def d_setMovie(self, movie, avId):
        self.sendUpdate('setMovie', [movie, avId])

    def setCannonPosition(self, rot, angle):
        avId = self.air.getAvatarIdFromSender()
        if avId == self.avId:
            self.sendUpdate('updateCannonPosition', [avId, rot, angle])

    def setCannonLit(self, rot, angle):
        avId = self.air.getAvatarIdFromSender()
        if avId == self.avId:
            activity = self.air.doId2do[self.actId]
            activity.b_setCannonWillFire(self.doId, rot, angle, avId)
            self.d_setMovie(PartyGlobals.CANNON_MOVIE_CLEAR, avId)
            self.sendUpdate('setCannonExit', [avId])
            self.avId = 0

    def setFired(self):
        self.air.writeServerEvent('suspicious',self.air.getAvatarIdFromSender(),'Toon tried to call unused setFired!')

    def setLanded(self, toonId):
        avId = self.air.getAvatarIdFromSender()
        if toonId != avId:
            self.air.writeServerEvent('suspicious',avId,'Toon claimed to be another toon in cannon!')
            return
        self.d_setMovie(PartyGlobals.CANNON_MOVIE_LANDED, avId)

    def setTimeout(self):
        avId = self.air.getAvatarIdFromSender()
        if avId != self.avId:
            self.air.writeServerEvent('suspicious',avId,'Toon tried to start timer for someone else!')
        taskMgr.doMethodLater(PartyGlobals.CANNON_TIMEOUT, self.__removeToon, 'removeToon%d' % self.doId, extraArgs=[avId])
        
        
    def __removeToon(self, avId):
        if avId != self.avId:
            return
        self.avId = 0
        self.d_setMovie(PartyGlobals.CANNON_MOVIE_FORCE_EXIT, avId)
        self.sendUpdate('setCannonExit', [avId])