class DistributedPiratesTutorialWorld(
        DistributedInstanceBase.DistributedInstanceBase):
    notify = directNotify.newCategory('DistributedPiratesTutorialWorld')

    def __init__(self, cr):
        DistributedInstanceBase.DistributedInstanceBase.__init__(self, cr)
        self.tutorialHandler = None
        self.tutorialHandlerId = 0

    def setTutorialHandlerId(self, doId):
        self.tutorialHandlerId = doId

        def tutorialHandlerExists(tutorialHandler):
            self.tutorialHandler = tutorialHandler
            self.tutorialHandler.setInstance(self)

        self.cr.relatedObjectMgr.requestObjects(
            [self.tutorialHandlerId], eachCallback=tutorialHandlerExists)

    def addWorldInterest(self, area=None):
        DistributedInstanceBase.DistributedInstanceBase.addWorldInterest(
            self, area)
        if area:
            area.turnOn(localAvatar)

    addWorldInterest = report(types=['frameCount', 'args'],
                              dConfigParam='connector')(addWorldInterest)

    def removeWorldInterest(self, area=None):
        if not area and area.gridVisContext:
            area = None

        DistributedInstanceBase.DistributedInstanceBase.removeWorldInterest(
            self, area)

    removeWorldInterest = report(types=['frameCount', 'args'],
                                 dConfigParam='connector')(removeWorldInterest)

    def turnOff(self, cacheIslands=[]):
        self._turnOffIslands(cacheIslands)
        DistributedInstanceBase.DistributedInstanceBase.turnOff(
            self, cacheIslands)

    turnOff = report(types=['frameCount', 'args'],
                     dConfigParam='connector')(turnOff)

    def turnOn(self, av=None):
        DistributedInstanceBase.DistributedInstanceBase.turnOn(self, av)
        self._turnOnIslands()

    turnOn = report(types=['frameCount', 'args'],
                    dConfigParam='connector')(turnOn)
    def handleAvatarTeleportResponse(self, avId, available, shardId, instanceDoId, areaDoId):
        if not avId == self.teleportQueryId:
            self.clearTeleportQueryId()
            return None
        
        self.clearTeleportQueryId()
        handle = self.cr.identifyAvatar(avId)
        if handle:
            avName = handle.getName()
        else:
            return None
        if available == PiratesGlobals.TAAvailable:
            
            def teleportConfirmation(confirmed, shardId = shardId, instanceDoID = instanceDoId, avId = avId, avatarParentId = areaDoId):
                if confirmed:
                    self.requestTeleportToAvatar(shardId, instanceDoId, avatarId = avId, avatarParentId = areaDoId)
                

            teleportConfirmation = report(types = [
                'args',
                'deltaStamp'], dConfigParam = 'teleport')(teleportConfirmation)
            localAvatar.setTeleportFlag(PiratesGlobals.TFSameArea, localAvatar.confirmNotSameAreaTeleportToPlayer, [
                areaDoId])
            localAvatar.confirmTeleport(teleportConfirmation, feedback = True)
            localAvatar.clearTeleportFlag(PiratesGlobals.TFSameArea)
        else:
            flag = PiratesGlobals.decodeTeleportFlag(available)
            if flag == PiratesGlobals.TAIgnore:
                pass
            1
            if flag in PiratesGlobals.TFNoTeleportToReasons:
                localAvatar.guiMgr.createWarning(PiratesGlobals.TFNoTeleportToReasons[flag] % avName, duration = 10)
    def handleAvatarTeleportQuery(self, requesterId, requesterBandMgrId, requesterBandId, requesterGuildId, requesterShardId):
        handle = self.cr.identifyAvatar(requesterId)
        if not handle:
            return None
        
        if self.cr.identifyFriend(requesterId):
            if requesterId in localAvatar.ignoreList or self.cr.avatarFriendsManager.checkIgnored(requesterId):
                handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(PiratesGlobals.TFIgnore), 0, 0, 0, sendToId = requesterId)
                return None
            
        if localAvatar.ship and len(localAvatar.ship.crew) >= localAvatar.ship.getMaxCrew():
            handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(PiratesGlobals.TFOnShip), 0, 0, 0, sendToId = requesterId)
            return None
        
        avName = handle.getName()
        
        def confirmed(canTeleportTo, avId, failedFlag, avName = avName):
            if canTeleportTo:
                if self.cr.getActiveWorld() and self.cr.distributedDistrict and localAvatar.getParentObj():
                    handle.sendTeleportResponse(PiratesGlobals.TAAvailable, self.cr.distributedDistrict.doId, self.cr.getActiveWorld().doId, localAvatar.getParentObj().doId, sendToId = requesterId)
                else:
                    handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(PiratesGlobals.TFUnavailable), 0, 0, 0, sendToId = requesterId)
            elif localAvatar.failedTeleportMessageOk(requesterId):
                localAvatar.setSystemMessage(requesterId, OTPLocalizer.WhisperFailedVisit % avName)
            
            handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(failedFlag), 0, 0, 0, sendToId = requesterId)

        confirmed = report(types = [
            'args',
            'deltaStamp'], dConfigParam = 'teleport')(confirmed)
        localAvatar.confirmTeleportTo(confirmed, requesterId, avName, requesterBandMgrId, requesterBandId, requesterGuildId)
Example #4
0
    def handleAvatarTeleportQuery(self, requesterId, requesterBandMgrId,
                                  requesterBandId, requesterGuildId,
                                  requesterShardId):
        handle = self.cr.identifyAvatar(requesterId)
        if not handle:
            return None

        if self.cr.identifyFriend(requesterId):
            if requesterId in localAvatar.ignoreList or self.cr.avatarFriendsManager.checkIgnored(
                    requesterId):
                handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(
                    PiratesGlobals.TFIgnore),
                                            0,
                                            0,
                                            0,
                                            sendToId=requesterId)
                return None

        avName = handle.getName()

        def confirmed(canTeleportTo, avId, failedFlag, avName=avName):
            if canTeleportTo:
                if self.cr.getActiveWorld(
                ) and self.cr.distributedDistrict and localAvatar.getParentObj(
                ):
                    handle.sendTeleportResponse(
                        PiratesGlobals.TAAvailable,
                        self.cr.distributedDistrict.doId,
                        self.cr.getActiveWorld().doId,
                        localAvatar.getParentObj().doId,
                        sendToId=requesterId)
                else:
                    handle.sendTeleportResponse(
                        PiratesGlobals.encodeTeleportFlag(
                            PiratesGlobals.TFUnavailable),
                        0,
                        0,
                        0,
                        sendToId=requesterId)
            elif localAvatar.failedTeleportMessageOk(requesterId):
                localAvatar.setSystemMessage(
                    requesterId, OTPLocalizer.WhisperFailedVisit % avName)

            handle.sendTeleportResponse(
                PiratesGlobals.encodeTeleportFlag(failedFlag),
                0,
                0,
                0,
                sendToId=requesterId)

        confirmed = report(types=['args', 'deltaStamp'],
                           dConfigParam='teleport')(confirmed)
        localAvatar.confirmTeleportTo(confirmed, requesterId, avName,
                                      requesterBandMgrId, requesterBandId,
                                      requesterGuildId)
Example #5
0
    def setArea(self, worldStack, areaDoId, autoFadeIn = True):
        self.cr.setWorldStack(worldStack, event = 'WorldOpen')
        
        def areaFinishedCallback(area):
            self.pendingArea = None
            self.loadAreaFinished(area, autoFadeIn)

        areaFinishedCallback = report(types = [
            'frameCount',
            'args'], dConfigParam = 'connector')(areaFinishedCallback)
        self.cr.relatedObjectMgr.abortRequest(self.pendingArea)
        self.pendingArea = self.cr.relatedObjectMgr.requestObjects([
            areaDoId], eachCallback = areaFinishedCallback)
    def setArea(self, worldStack, areaDoId, autoFadeIn=True):
        self.cr.setWorldStack(worldStack, event='WorldOpen')

        def areaFinishedCallback(area):
            self.pendingArea = None
            self.loadAreaFinished(area, autoFadeIn)

        areaFinishedCallback = report(
            types=['frameCount',
                   'args'], dConfigParam='connector')(areaFinishedCallback)
        self.cr.relatedObjectMgr.abortRequest(self.pendingArea)
        self.pendingArea = self.cr.relatedObjectMgr.requestObjects(
            [areaDoId], eachCallback=areaFinishedCallback)
    def setArea(self, worldLocationId, worldLocationZone, areaDoId, autoFadeIn = True):
        localAvatar.setInterest(worldLocationId, worldLocationZone, [
            'instanceInterest'])

        def areaFinishedCallback(area):
            self.pendingArea = None
            self.loadAreaFinished(area, autoFadeIn)

        areaFinishedCallback = report(types = [
            'frameCount'], dConfigParam = 'connector')(areaFinishedCallback)
        if self.pendingArea:
            self.cr.relatedObjectMgr.abortRequest(self.pendingArea)

        self.pendingArea = self.cr.relatedObjectMgr.requestObjects([
            areaDoId], eachCallback = areaFinishedCallback)
class DistributedWelcomeWorld(DistributedInstanceBase.DistributedInstanceBase):
    notify = directNotify.newCategory('DistributedWelcomeWorld')

    def handleOnStage(self):
        DistributedInstanceBase.DistributedInstanceBase.handleOnStage(self)
        base.cr.timeOfDayManager.setEnvironment(TODGlobals.ENV_DEFAULT)

    handleOnStage = report(types=['args'],
                           dConfigParam=['dteleport'])(handleOnStage)

    def getWorldPos(self, node):
        if not node.isEmpty() and self.isOnStage():
            return node.getPos(self)

    def getAggroRadius(self):
        return EnemyGlobals.MAX_SEARCH_RADIUS

    def localAvEnterDeath(self, av):
        DistributedInstanceBase.DistributedInstanceBase.localAvEnterDeath(
            self, av)
        self.d_localAvatarDied()

    localAvEnterDeath = report(types=['frameCount'],
                               dConfigParam='jail')(localAvEnterDeath)
Example #9
0
class DistributedWelcomeWorld(DistributedInstanceBase.DistributedInstanceBase):
    notify = directNotify.newCategory('DistributedWelcomeWorld')

    def announceGenerate(self):
        DistributedInstanceBase.DistributedInstanceBase.announceGenerate(self)
        if not self.playerControlledObj.hasParent():
            self.playerControlledObj.reparentTo(self)

    def delete(self):
        self.ignore('sendingLocalAvatarToJail')
        DistributedInstanceBase.DistributedInstanceBase.delete(self)

    def addWorldInterest(self, area=None):
        DistributedInstanceBase.DistributedInstanceBase.addWorldInterest(
            self, area)
        if area:
            area.turnOn(localAvatar)

    def removeWorldInterest(self, area=None):
        if not area and area.gridVisContext:
            area = None

        DistributedInstanceBase.DistributedInstanceBase.removeWorldInterest(
            self, area)

    def turnOff(self, cacheIslands=[]):
        DistributedInstanceBase.DistributedInstanceBase.turnOff(
            self, cacheIslands)

    def turnOn(self, av=None):
        DistributedInstanceBase.DistributedInstanceBase.turnOn(self, None)
        self._turnOnIslands()
        base.cr.timeOfDayManager.setEnvironment(TODGlobals.ENV_DEFAULT)

    def getWorldPos(self, node):
        if not node.isEmpty() and self.isOn():
            return node.getPos(self)

    def getAggroRadius(self):
        return EnemyGlobals.MAX_SEARCH_RADIUS

    def localAvEnterDeath(self, av):
        DistributedInstanceBase.DistributedInstanceBase.localAvEnterDeath(
            self, av)
        self.d_localAvatarDied()

    localAvEnterDeath = report(types=['frameCount'],
                               dConfigParam='jail')(localAvEnterDeath)
Example #10
0
    def loadAreaFinished(self, area, autoFadeIn=True):
        def leaveTunnel():
            areaIndex = self.getAreaIndex(area)
            entranceNode = self.areaNode[areaIndex]
            entryLocator = area.find('**/' + entranceNode + '*')
            localAvatar.reparentTo(entryLocator)
            localAvatar.setPos(0, 0, 0)
            if not autoFadeIn:
                if localAvatar.style.tutorial == PiratesGlobals.TUT_KILLED_1_SKELETON:
                    localAvatar.setX(30)
                    localAvatar.setH(90)

            else:
                localAvatar.setH(-90)
            localAvatar.wrtReparentTo(area)
            if autoFadeIn:

                def leaveTunnelFinished():
                    localAvatar.b_clearTeleportFlag(PiratesGlobals.TFInTunnel)
                    if localAvatar.gameFSM.preTunnelState:
                        localAvatar.b_setGameState(
                            localAvatar.gameFSM.preTunnelState)
                        if localAvatar.gameFSM.preTunnelState == 'Battle':
                            localAvatar.guiMgr.combatTray.toggleWeapon(
                                localAvatar.currentWeaponId,
                                localAvatar.currentWeaponSlotId)

                    else:
                        localAvatar.b_setGameState('LandRoam')

                self.acceptOnce('LeaveTunnelFinished', leaveTunnelFinished)
                base.localAvatar.b_setGameState('LeaveTunnel')
            else:
                self.sendUpdate('sendLeaveTunnelDone')
            self.fadeInAmbient(self.floorIndex)

        leaveTunnel = report(types=['frameCount', 'printInterests'],
                             dConfigParam='connector')(leaveTunnel)
        base.cr.setAllInterestsCompleteCallback(leaveTunnel)
        transform = localAvatar.getTransform(self)
        DistributedGAConnector.DistributedGAConnector.loadAreaFinished(
            self, area, autoFadeIn)
        self.lastFloorTime = globalClock.getFrameTime()
        self.loadedAreaDoId = area.doId
        localAvatar.setTransform(self, transform)
        localAvatar.wrtReparentTo(area)
        area.handleEnterGameArea(None)
Example #11
0
    def loadAreaFinished(self, area, autoFadeIn = True):
        
        def handleFinished():
            for currHandle in self.ownHandles:
                self.cr.removeTaggedInterest(currHandle)
            
            self.ownHandles = []

        self.acceptOnce('EnterTunnelFinished', handleFinished)
        
        def leaveTunnel():
            if autoFadeIn:
                
                def leaveTunnelFinished():
                    self._inTransition = False
                    area.forceManagePass(localAvatar)
                    localAvatar.sendCurrentPosition()

                self.acceptOnce('LeaveTunnelFinished', leaveTunnelFinished)
                localAvatar.b_setGameState('LeaveTunnel', [
                    self,
                    area,
                    not autoFadeIn])
            else:
                
                def leaveTunnelFinished():
                    self.sendUpdate('sendLeaveTunnelDone')
                    area.forceManagePass(localAvatar)
                    localAvatar.sendCurrentPosition()

                localAvatar.b_setGameState('LeaveTunnel', [
                    self,
                    area,
                    not autoFadeIn])
                self.cr.setAllInterestsCompleteCallback(leaveTunnelFinished)
            area.handleEnterGameArea()
            self.fadeInAmbient(self.floorIndex)

        leaveTunnel = report(types = [
            'deltaStamp',
            'args'], dConfigParam = 'connector')(leaveTunnel)
        world = area.getParentObj()
        world.goOnStage()
        area.goOnStage()
        self.cr.setAllInterestsCompleteCallback(leaveTunnel)
Example #12
0
    def loadAreaFinished(self, area, autoFadeIn = True):
        
        def handleFinished():
            for currHandle in self.ownHandles:
                self.cr.removeTaggedInterest(currHandle)
            
            self.ownHandles = []

        self.acceptOnce('EnterTunnelFinished', handleFinished)
        
        def leaveTunnel():
            if autoFadeIn:
                
                def leaveTunnelFinished():
                    self._inTransition = False
                    area.forceManagePass(localAvatar)
                    localAvatar.sendCurrentPosition()

                self.acceptOnce('LeaveTunnelFinished', leaveTunnelFinished)
                localAvatar.b_setGameState('LeaveTunnel', [
                    self,
                    area,
                    not autoFadeIn])
            else:
                
                def leaveTunnelFinished():
                    self.sendUpdate('sendLeaveTunnelDone')
                    area.forceManagePass(localAvatar)
                    localAvatar.sendCurrentPosition()

                localAvatar.b_setGameState('LeaveTunnel', [
                    self,
                    area,
                    not autoFadeIn])
                self.cr.setAllInterestsCompleteCallback(leaveTunnelFinished)
            area.handleEnterGameArea()
            self.fadeInAmbient(self.floorIndex)

        leaveTunnel = report(types = [
            'deltaStamp',
            'args'], dConfigParam = 'connector')(leaveTunnel)
        world = area.getParentObj()
        world.goOnStage()
        area.goOnStage()
        self.cr.setAllInterestsCompleteCallback(leaveTunnel)
    def loadAreaFinished(self, area, autoFadeIn=True):
        def leaveTunnel():
            areaIndex = self.getAreaIndex(area)
            entranceNode = self.areaNode[areaIndex]
            entryLocator = area.find("**/" + entranceNode + "*")
            localAvatar.reparentTo(entryLocator)
            localAvatar.setPos(0, 0, 0)
            if not autoFadeIn:
                if localAvatar.style.tutorial == PiratesGlobals.TUT_KILLED_1_SKELETON:
                    localAvatar.setX(30)
                    localAvatar.setH(90)

            else:
                localAvatar.setH(-90)
            localAvatar.wrtReparentTo(area)
            if autoFadeIn:

                def leaveTunnelFinished():
                    localAvatar.b_clearTeleportFlag(PiratesGlobals.TFInTunnel)
                    if localAvatar.gameFSM.preTunnelState:
                        localAvatar.b_setGameState(localAvatar.gameFSM.preTunnelState)
                        if localAvatar.gameFSM.preTunnelState == "Battle":
                            localAvatar.guiMgr.combatTray.toggleWeapon(
                                localAvatar.currentWeaponId, localAvatar.currentWeaponSlotId
                            )

                    else:
                        localAvatar.b_setGameState("LandRoam")

                self.acceptOnce("LeaveTunnelFinished", leaveTunnelFinished)
                base.localAvatar.b_setGameState("LeaveTunnel")
            else:
                self.sendUpdate("sendLeaveTunnelDone")
            self.fadeInAmbient(self.floorIndex)

        leaveTunnel = report(types=["frameCount", "printInterests"], dConfigParam="connector")(leaveTunnel)
        base.cr.setAllInterestsCompleteCallback(leaveTunnel)
        transform = localAvatar.getTransform(self)
        DistributedGAConnector.DistributedGAConnector.loadAreaFinished(self, area, autoFadeIn)
        self.lastFloorTime = globalClock.getFrameTime()
        self.loadedAreaDoId = area.doId
        localAvatar.setTransform(self, transform)
        localAvatar.wrtReparentTo(area)
        area.handleEnterGameArea(None)
    def queryAvatarForTeleport(self, avId):
        self.setTeleportQueryId(avId)

        def teleportConfirmation(confirmed, avId=avId):
            if confirmed:
                handle = self.cr.identifyAvatar(avId)
                if handle:
                    shardId = self.cr.distributedDistrict.doId
                    if not localAvatar.getBandId():
                        pass
                    (bandMgr, bandId) = (0, 0)
                    guildId = localAvatar.getGuildId()
                    handle.sendTeleportQuery(avId, bandMgr, bandId, guildId,
                                             shardId)

        teleportConfirmation = report(
            types=['args', 'deltaStamp'],
            dConfigParam='teleport')(teleportConfirmation)
        localAvatar.confirmTeleport(teleportConfirmation, feedback=True)
Example #15
0
    def handleAvatarTeleportResponse(self, avId, available, shardId,
                                     instanceDoId, areaDoId):
        if not avId == self.teleportQueryId:
            self.clearTeleportQueryId()
            return None

        self.clearTeleportQueryId()
        handle = self.cr.identifyAvatar(avId)
        if handle:
            avName = handle.getName()
        else:
            return None
        if available == PiratesGlobals.TAAvailable:

            def teleportConfirmation(confirmed,
                                     shardId=shardId,
                                     instanceDoID=instanceDoId,
                                     avId=avId,
                                     avatarParentId=areaDoId):
                if confirmed:
                    self.requestTeleportToAvatar(shardId,
                                                 instanceDoId,
                                                 avatarId=avId,
                                                 avatarParentId=areaDoId)

            teleportConfirmation = report(
                types=['args', 'deltaStamp'],
                dConfigParam='teleport')(teleportConfirmation)
            localAvatar.setTeleportFlag(
                PiratesGlobals.TFSameArea,
                localAvatar.confirmNotSameAreaTeleportToPlayer, [areaDoId])
            localAvatar.confirmTeleport(teleportConfirmation, feedback=True)
            localAvatar.clearTeleportFlag(PiratesGlobals.TFSameArea)
        else:
            flag = PiratesGlobals.decodeTeleportFlag(available)
            if flag == PiratesGlobals.TAIgnore:
                pass
            1
            if flag in PiratesGlobals.TFNoTeleportToReasons:
                localAvatar.guiMgr.createWarning(
                    PiratesGlobals.TFNoTeleportToReasons[flag] % avName,
                    duration=10)
    def queryAvatarForTeleport(self, avId):
        self.setTeleportQueryId(avId)
        
        def teleportConfirmation(confirmed, avId = avId):
            if confirmed:
                handle = self.cr.identifyAvatar(avId)
                if handle:
                    shardId = self.cr.distributedDistrict.doId
                    if not localAvatar.getBandId():
                        pass
                    (bandMgr, bandId) = (0, 0)
                    guildId = localAvatar.getGuildId()
                    handle.sendTeleportQuery(avId, bandMgr, bandId, guildId, shardId)
                
            

        teleportConfirmation = report(types = [
            'args',
            'deltaStamp'], dConfigParam = 'teleport')(teleportConfirmation)
        localAvatar.confirmTeleport(teleportConfirmation, feedback = True)
Example #17
0
    def setArea(self,
                worldLocationId,
                worldLocationZone,
                areaDoId,
                autoFadeIn=True):
        localAvatar.setInterest(worldLocationId, worldLocationZone,
                                ['instanceInterest'])

        def areaFinishedCallback(area):
            self.pendingArea = None
            self.loadAreaFinished(area, autoFadeIn)

        areaFinishedCallback = report(
            types=['frameCount'],
            dConfigParam='connector')(areaFinishedCallback)
        if self.pendingArea:
            self.cr.relatedObjectMgr.abortRequest(self.pendingArea)

        self.pendingArea = self.cr.relatedObjectMgr.requestObjects(
            [areaDoId], eachCallback=areaFinishedCallback)
Example #18
0
    def placeInWorld(self):
        def stepObjHere(tunnelObj):
            self.pendingStepObj = None
            area = base.cr.getDo(self.questStep.getOriginDoId())
            areaUid = area.getUniqueId()
            areaNodeName = tunnelObj.getAreaNodeNameFromAreaUid(areaUid)
            areaNode = area.getConnectorNodeNamed(areaNodeName)
            self.reparentTo(areaNode)
            self.setPosHpr(0, 0, 0, 0, 0, 0)
            self.setPos(self, self.LOD_CENTER_OFFSET_X, 0, 5)
            self.wrtReparentTo(area)

        stepObjHere = report(types=['frameCount', 'args'],
                             dConfigParam='quest-indicator')(stepObjHere)
        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None

        self.pendingStepObj = base.cr.relatedObjectMgr.requestObjects(
            [self.questStep.getStepDoId()], eachCallback=stepObjHere)
    def placeInWorld(self):
        
        def stepObjHere(stepObj):
            self.pendingStepObj = None
            
            def performReparent(tunnelObj = stepObj):
                if tunnelObj == stepObj:
                    areaIndex = tunnelObj.getAreaIndexFromDoId(self.questStep.getOriginDoId())
                    if areaIndex != None:
                        (pos, hpr) = tunnelObj.getConnectorNodePosHpr(areaIndex)
                        t = TransformState.makePosHpr(pos, hpr)
                        ti = t.invertCompose(TransformState.makeIdentity())
                        self.reparentTo(tunnelObj)
                        self.setPos(ti.getPos())
                        self.setHpr(ti.getHpr())
                        self.setPos(self, self.LOD_CENTER_OFFSET_X, 0, 5)
                        parent = base.cr.doId2do[self.questStep.getOriginDoId()]
                        self.wrtReparentTo(parent)
                        self.arrowNode = tunnelObj.attachNewNode('arrowNode')
                        self.arrowNode.setPos(ti.getPos())
                    
                

            if not stepObj.isConnectorLoaded():
                self.acceptOnce('tunnelSetLinks', performReparent)
            else:
                performReparent()

        stepObjHere = report(types = [
            'frameCount',
            'args'], dConfigParam = 'quest-indicator')(stepObjHere)
        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None
        
        self.pendingStepObj = base.cr.relatedObjectMgr.requestObjects([
            self.questStep.getStepDoId()], eachCallback = stepObjHere)
    def placeInWorld(self):
        def stepObjHere(stepObj):
            self.pendingStepObj = None

            def performReparent(tunnelObj=stepObj):
                if tunnelObj == stepObj:
                    areaIndex = tunnelObj.getAreaIndexFromDoId(
                        self.questStep.getOriginDoId())
                    if areaIndex != None:
                        (pos,
                         hpr) = tunnelObj.getConnectorNodePosHpr(areaIndex)
                        t = TransformState.makePosHpr(pos, hpr)
                        ti = t.invertCompose(TransformState.makeIdentity())
                        self.reparentTo(tunnelObj)
                        self.setPos(ti.getPos())
                        self.setHpr(ti.getHpr())
                        self.setPos(self, self.LOD_CENTER_OFFSET_X, 0, 5)
                        parent = base.cr.doId2do[
                            self.questStep.getOriginDoId()]
                        self.wrtReparentTo(parent)
                        self.arrowNode = tunnelObj.attachNewNode('arrowNode')
                        self.arrowNode.setPos(ti.getPos())

            if not stepObj.isConnectorLoaded():
                self.acceptOnce('tunnelSetLinks', performReparent)
            else:
                performReparent()

        stepObjHere = report(types=['frameCount', 'args'],
                             dConfigParam='quest-indicator')(stepObjHere)
        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None

        self.pendingStepObj = base.cr.relatedObjectMgr.requestObjects(
            [self.questStep.getStepDoId()], eachCallback=stepObjHere)
Example #21
0
class QuestIndicatorNodeIntDoor(QuestIndicatorNode):
    
    def __init__(self, questStep):
        self.pendingStepObj = None
        QuestIndicatorNode.__init__(self, 'IntDoorIndicator', [
            5], questStep)
        self.nearEffect = None

    
    def delete(self):
        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None
        
        QuestIndicatorNode.delete(self)
        if self.nearEffect:
            self.nearEffect.cleanUpEffect()
        
        self.nearEffect = None

    
    def placeInWorld(self):
        
        def stepObjHere(stepObj):
            self.pendingStepObj = None
            self.reparentTo(stepObj)
            self.setPos(0, 0, 0)
            self.setHpr(0, 0, 0)
            self.setScale(render, 1)

        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None
        
        self.pendingStepObj = base.cr.relatedObjectMgr.requestObjects([
            self.questStep.getStepDoId()], eachCallback = stepObjHere)

    
    def loadZoneLevel(self, level):
        QuestIndicatorNode.loadZoneLevel(self, level)
        if level == 0:
            self.request('At')
        
        if level == 1:
            self.request('Near')
        

    
    def unloadZoneLevel(self, level):
        QuestIndicatorNode.unloadZoneLevel(self, level)
        if level == 0:
            self.request('Near')
        
        if level == 1:
            self.request('Off')
        

    
    def enterOff(self):
        QuestIndicatorNode.enterOff(self)
        self.stopNearEffect()

    enterOff = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(enterOff)
    
    def enterNear(self):
        self.startNearEffect()

    enterNear = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(enterNear)
    
    def exitNear(self):
        self.stopNearEffect()

    exitNear = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(exitNear)
    
    def enterAt(self):
        pass

    
    def exitAt(self):
        pass

    
    def showEffect(self):
        QuestIndicatorNode.showEffect(self)
        self.startNearEffect()

    
    def hideEffect(self):
        QuestIndicatorNode.hideEffect(self)
        self.stopNearEffect()

    
    def startNearEffect(self):
        if self.muted:
            return None
        
        if not self.nearEffect:
            self.nearEffect = RayOfLight()
            self.nearEffect.setBottomRayEnabled(self.wantBottomEffect)
            self.nearEffect.reparentTo(self)
            self.nearEffect.startLoop()
        

    startNearEffect = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(startNearEffect)
    
    def stopNearEffect(self):
        if self.nearEffect:
            self.nearEffect.stopLoop()
            self.nearEffect = None
        

    stopNearEffect = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(stopNearEffect)
Example #22
0
class PiratesClientRepository(OTPClientRepository):
    notify = directNotify.newCategory('PiratesClientRepository')
    SupportTutorial = 0
    GameGlobalsId = OTP_DO_ID_PIRATES
    StopVisibilityEvent = 'pirates-stop-visibility'

    def __init__(self, serverVersion, launcher=None):
        self.loadingScreen = base.loadingScreen
        self.loadingScreen.parent = self
        self.accept('connectionIssue', self.loadingScreen.hide)
        self.accept('connectionRetrying', self.loadingScreen.show)
        OTPClientRepository.__init__(self,
                                     serverVersion,
                                     launcher,
                                     playGame=PlayGame.PlayGame)
        self.createAvatarClass = DistributedPlayerPirate.DistributedPlayerPirate
        self.tradeManager = None
        self.pvpManager = None
        self.csm = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_CLIENT_SERVICES_MANAGER,
            'ClientServicesManager')
        #self.avatarManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_AVATAR_MANAGER, 'DistributedAvatarManager')
        #self.chatManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_CHAT_MANAGER, 'DistributedChatManager')
        #self.crewMatchManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_CREW_MATCH_MANAGER, 'DistributedCrewMatchManager')
        #self.avatarFriendsManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_AVATAR_FRIENDS_MANAGER, 'PCAvatarFriendsManager')
        #self.playerFriendsManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PLAYER_FRIENDS_MANAGER, 'PCPlayerFriendsManager')
        #self.guildManager = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_GUILD_MANAGER, 'PCGuildManager')
        #self.speedchatRelay = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_SPEEDCHAT_RELAY, 'PiratesSpeedchatRelay')
        #self.shipLoader = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_SHIP_MANAGER, 'DistributedShipLoader')
        #self.matchMaker = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_MATCH_MAKER, 'DistributedMatchMaker')
        base.loadingScreen.tick()
        #self.codeRedemption = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_CODE_REDEMPTION, 'CodeRedemption')
        base.loadingScreen.tick()
        #self.settingsMgr = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_PIRATES_SETTINGS_MANAGER, 'PiratesSettingsMgr')
        #self.statusDatabase = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_STATUS_DATABASE, 'StatusDatabase')
        self.wantSeapatch = base.config.GetBool('want-seapatch', 1)
        self.wantSpecialEffects = base.config.GetBool('want-special-effects',
                                                      1)
        self.wantMakeAPirate = base.config.GetBool('wantMakeAPirate', 0)
        self.forceTutorial = base.config.GetBool('force-tutorial', 0)
        self.skipTutorial = base.config.GetBool('skip-tutorial', 0)
        self.tutorialObject = None
        self.avChoiceDoneEvent = None
        self.avChoice = None
        self.avCreate = None
        self.currentCutscene = None
        self.activeWorld = None
        self.oldWorld = None
        self.teleportMgr = None
        self.treasureMap = None
        self.newsManager = None
        self.distributedDistrict = None
        self.district = None
        self.profileMgr = None
        self.battleMgr = BattleManager.BattleManager(self)
        self.combatAnims = CombatAnimations.CombatAnimations()
        self.interactionMgr = InteractionManager.InteractionManager()
        self.currCamParent = None
        self.uidMgr = UniqueIdManager.UniqueIdManager(self)
        self.fakeMSP = None
        self.questDynMap = QuestLadderDynMap.QuestLadderDynMap()
        self.questDependency = QuestLadderDependency()
        self.questChoiceSibsMap = QuestChoiceDynMap()
        base.loadingScreen.beginStep('MasterHumans', 52, 45)
        self.humanHigh = [MasterHuman.MasterHuman(), MasterHuman.MasterHuman()]
        self.humanHigh[0].billboardNode.removeNode()
        self.humanHigh[1].billboardNode.removeNode()
        self.humanHigh[0].style = HumanDNA.HumanDNA('m')
        self.humanHigh[1].style = HumanDNA.HumanDNA('f')
        self.humanHigh[0].generateHuman('m')
        base.loadingScreen.tick()
        self.humanHigh[1].generateHuman('f')
        base.loadingScreen.tick()
        self.humanHigh[0].ignoreAll()
        self.humanHigh[1].ignoreAll()
        self.humanHigh[0].stopBlink()
        self.humanHigh[1].stopBlink()
        self.humanLow = [MasterHuman.MasterHuman(), MasterHuman.MasterHuman()]
        self.humanLow[0].billboardNode.removeNode()
        self.humanLow[1].billboardNode.removeNode()
        self.humanLow[0].style = HumanDNA.HumanDNA('m')
        self.humanLow[1].style = HumanDNA.HumanDNA('f')
        self.humanLow[0].generateHuman('m')
        base.loadingScreen.tick()
        self.humanLow[1].generateHuman('f')
        base.loadingScreen.tick()
        base.loadingScreen.endStep('MasterHumans')
        self.humanLow[0].ignoreAll()
        self.humanLow[1].ignoreAll()
        self.humanLow[0].stopBlink()
        self.humanLow[1].stopBlink()
        for i in range(2):
            self.humanLow[i]._Actor__sortedLODNames = ['500']
            del self.humanLow[i]._Actor__partBundleDict['2000']
            del self.humanLow[i]._Actor__partBundleDict['1000']
            self.humanLow[i].getLOD('2000').detachNode()
            self.humanLow[i].getLOD('1000').detachNode()
            self.humanLow[i].getLODNode().clearSwitches()
            self.humanLow[i].getLODNode().addSwitch(10000, 0)

        if base.options.getCharacterDetailSetting() == 0:
            self.human = self.humanLow
        else:
            self.human = self.humanHigh
        A = AvatarTypes
        del A
        self.preloadedCutscenes = {}
        self.defaultShard = 0
        if __dev__:
            __builtin__.go = self.getDo
            self.effectTypes = {
                'damageSmoke': ['BlackSmoke'],
                'damageFire': ['Fire'],
                'cannonDeckFire': ['CannonSmokeSimple', 'CannonBlastSmoke'],
                'cannonBSFire': [
                    'MuzzleFlameBS', 'CannonSmokeSimpleBS',
                    'CannonBlastSmokeBS', 'GrapeshotEffectBS'
                ],
                'cannonHit': ['SimpleSmokeCloud', 'ExplosionFlip'],
                'cannonSplash': ['CannonSplash']
            }
            self.effectToggles = {}

        self.cannonballCollisionDebug = 1
        self.npcManager = NPCManager.NPCManager()
        self.accountDetailRecord = AccountDetailRecord()

    def gotoFirstScreen(self):
        base.loadingScreen.beginStep('PrepLogin', 9, 0.14000000000000001)
        self.startReaderPollTask()
        #self.startHeartbeat()
        base.loadingScreen.tick()
        self.loginFSM.request('login')
        base.loadingScreen.tick()
        base.loadingScreen.endStep('PrepLogin')

    gotoFirstScreen = report(types=['args', 'deltaStamp'],
                             dConfigParam='teleport')(gotoFirstScreen)

    def getOldWorld(self):
        return self.oldWorld

    def getActiveWorld(self):
        return self.activeWorld

    def preloadCutscene(self, name):
        if name not in self.preloadedCutscenes:
            newCutscene = Cutscene.Cutscene(self, name)
            self.preloadedCutscenes[name] = newCutscene

    def getPreloadedCutsceneInfo(self, name):
        return self.preloadedCutscenes.get(name)

    def cleanupPreloadedCutscene(self, name):
        plCutscene = self.preloadedCutscenes.get(name)
        if plCutscene:
            if not plCutscene.isEmpty():
                plCutscene.destroy()

            del self.preloadedCutscenes[name]

    def setActiveWorld(self, world):
        if self.activeWorld != world:
            self.oldWorld = self.activeWorld

        self.activeWorld = world

    setActiveWorld = report(types=['args', 'deltaStamp'],
                            dConfigParam='teleport')(setActiveWorld)

    def getWaterHeight(self, node):
        if self.wantSeapatch and self.activeWorld:
            water = self.activeWorld.getWater()
            if water:
                return water.calcHeight(node=node)

        else:
            return 0.0

    def isOceanEnabled(self):
        if self.wantSeapatch and self.activeWorld and self.activeWorld.hasWater(
        ):
            return self.activeWorld.getWater().enabled

        return 0

    def enterChooseAvatar(self, avList):
        base.loadingScreen.beginStep('AvChooser', 14, 10)
        self.sendSetAvatarIdMsg(0)
        self.handler = self.handleMessageType
        if __dev__:
            bp.loginCfg()
            config_slot = base.config.GetInt('login-pirate-slot', -1)
            if config_slot >= 0 and len(avList) > 0:
                config_subId = base.config.GetInt('login-pirate-subId',
                                                  avList.keys()[0])
                slots = avList.get(config_subId, [])
                if config_slot in range(len(slots)):
                    potAv = slots[config_slot]
                    if isinstance(potAv, PotentialAvatar):
                        base.cr.loadingScreen.hide()
                        ConfigVariableInt('login-pirate-slot').setValue(-1)
                        base.loadingScreen.endStep('AvChooser')
                        base.cr.avatarManager.sendRequestPlayAvatar(
                            potAv.id, config_subId)
                        self.handleAvatarChoice('chose', config_subId,
                                                config_slot)
                        return None

        self.avChoiceDoneEvent = 'avatarChooserDone'
        self.avChoice = AvatarChooser(self.loginFSM, self.avChoiceDoneEvent)
        base.loadingScreen.tick()
        self.avChoice.load()
        base.loadingScreen.tick()
        self.avChoice.enter()
        base.loadingScreen.tick()
        self.accept(self.avChoiceDoneEvent, self.__handleAvatarChooserDone)
        base.loadingScreen.endStep('AvChooser')
        base.cr.loadingScreen.hide()

    enterChooseAvatar = report(types=['args', 'deltaStamp'],
                               dConfigParam='teleport')(enterChooseAvatar)

    def __handleAvatarChooserDone(self, doneStatus):
        done = doneStatus['mode']
        if done == 'exit':
            self.notify.info('handleAvatarChooserDone: shutting down')
            self.loginFSM.request('shutdown')
            return None

        (subId, slot) = self.avChoice.getChoice()
        self.avChoice.exit()
        self.handleAvatarChoice(done, subId, slot)

    __handleAvatarChooserDone = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(__handleAvatarChooserDone)

    def handleAvatarChoice(self, done, subId, slot):
        access = self.accountDetailRecord.subDetails[subId].subAccess
        base.setEmbeddedFrameMode(access)
        if done == 'chose':
            av = self.avList[subId][slot]
            if av.dna.getTutorial() < 3 and self.skipTutorial == 0:
                self.tutorial = 1
            else:
                self.tutorial = 0
            self.loadingScreen.beginStep('waitForAv')
            self.loginFSM.request('waitForSetAvatarResponse', [av])
        elif done == 'create':
            self.loginFSM.request('createAvatar',
                                  [self.avList[subId], slot, subId])

    def exitChooseAvatar(self):
        self.handler = None
        if self.avChoice:
            self.avChoice.exit()
            self.avChoice.unload()
            self.avChoice = None

        if self.avChoiceDoneEvent:
            self.ignore(self.avChoiceDoneEvent)
            self.avChoiceDoneEvent = None

    exitChooseAvatar = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(exitChooseAvatar)

    def enterCreateAvatar(self, avList, index, subId):
        self.tutorial = 0
        self.avCreate = MakeAPirate(avList, 'makeAPirateComplete', subId,
                                    index, self.isPaid())
        self.avCreate.load()
        self.avCreate.enter()
        self.accept('makeAPirateComplete', self.__handleMakeAPirate)

    enterCreateAvatar = report(types=['args', 'deltaStamp'],
                               dConfigParam='teleport')(enterCreateAvatar)

    def handleAvatarCreated(self, newPotAv, avatarId, subId):
        newPotAv.id = avatarId
        self.loginFSM.request('waitForSetAvatarResponse', [newPotAv])

    handleAvatarCreated = report(types=['args', 'deltaStamp'],
                                 dConfigParam='teleport')(handleAvatarCreated)

    def __handleMakeAPirate(self):
        done = self.avCreate.getDoneStatus()
        if done == 'cancel':
            self.avCreate.exit()
            self.loginFSM.request('chooseAvatar', [self.avList])
        elif done == 'created':
            self.handleAvatarCreated(self.avCreate.newPotAv,
                                     self.avCreate.avId, self.avCreate.subId)
        else:
            self.notify.error('Invalid doneStatus from MakeAPirate: ' +
                              str(done))

    __handleMakeAPirate = report(types=['args', 'deltaStamp'],
                                 dConfigParam='teleport')(__handleMakeAPirate)

    def exitCreateAvatar(self):
        if self.skipTutorial:
            self.ignore('makeAPirateComplete')
            self.ignore('nameShopPost')
            self.ignore('nameShopCreateAvatar')
            self.avCreate.exit()
            self.avCreate.unload()
            self.avCreate = None
            self.handler = None

        self.ignore('createdNewAvatar')

    exitCreateAvatar = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(exitCreateAvatar)

    def handleCreateAvatarResponse(self, avId):
        self.avId = avId
        newPotAv = PotentialAvatar(self.avId, [self.newName, '', '', ''],
                                   self.newDNA, self.newPosition, 1)
        self.loginFSM.request('waitForSetAvatarResponse', [newPotAv])

    def avatarListFailed(self, reason):
        dialogClass = OTPGlobals.getGlobalDialogClass()
        self.avatarListFailedBox = dialogClass(
            message=PLocalizer.CRAvatarListFailed,
            doneEvent='avatarListFailedAck',
            text_wordwrap=18,
            style=OTPDialog.Acknowledge)
        self.avatarListFailedBox.show()
        self.acceptOnce('avatarListFailedAck',
                        self.__handleAvatarListFailedAck)

    avatarListFailed = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(avatarListFailed)

    def __handleAvatarListFailedAck(self):
        self.ignore('avatarListFailedAck')
        self.avatarListFailedBox.cleanup()
        self.loginFSM.request('shutdown')

    __handleAvatarListFailedAck = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(__handleAvatarListFailedAck)

    def avatarList(self, avatars):
        self.ignore('avatarListFailed')
        self.ignore('avatarList')
        self.avList = avatars
        if self.loginFSM.getCurrentState().getName() == 'chooseAvatar':
            self.avChoice.updateAvatarList()
        else:
            self.loginFSM.request('chooseAvatar', [self.avList])

    avatarList = report(types=['args', 'deltaStamp'],
                        dConfigParam='teleport')(avatarList)

    def handleGetAvatarsRespMsg(self, di):
        pass

    handleGetAvatarsRespMsg = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(handleGetAvatarsRespMsg)

    def handleGetAvatarsResp2Msg(self, di):
        pass

    handleGetAvatarsResp2Msg = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(handleGetAvatarsResp2Msg)

    def handleAvatarResponseMsg(self, di):
        self.loadingScreen.endStep('waitForAv')
        self.cleanupWaitingForDatabase()
        avatarId = di.getUint32()
        returnCode = di.getUint8()
        if returnCode == 0:
            dclass = self.dclassesByName['DistributedPlayerPirate']
            NametagGlobals.setMasterArrowsOn(0)
            self.loadingScreen.show(waitForLocation=True, expectedLoadScale=4)
            self.loadingScreen.beginStep('LocalAvatar', 36, 120)
            localAvatar = LocalPirate(self)
            localAvatar.dclass = dclass
            if __dev__:
                __builtins__['lu'] = self.getDo

            localAvatar.doId = avatarId
            self.localAvatarDoId = avatarId
            self.doId2do[avatarId] = localAvatar
            parentId = None
            zoneId = None
            localAvatar.setLocation(parentId, zoneId)
            localAvatar.generate()
            localAvatar.updateAllRequiredFields(dclass, di)
            locUID = localAvatar.getReturnLocation()
            if __dev__ and not getBase().config.GetBool(
                    'login-location-used-pcr', False):
                bp.loginCfg()
                ConfigVariableBool('login-location-used-pcr').setValue(True)
                config_location = getBase().config.GetString(
                    'login-location', '').lower()
                config_location_uid = PLocalizer.LocationUids.get(
                    config_location)
                if config_location and config_location_uid:
                    locUID = config_location_uid
                    localAvatar.setReturnLocation(locUID)

            if locUID:
                self.loadingScreen.showTarget(locUID)
                self.loadingScreen.showHint(locUID)
            else:
                locUID = '1150922126.8dzlu'
                localAvatar.setReturnLocation(locUID)
                self.loadingScreen.showTarget(jail=True)
            self.loadingScreen.endStep('LocalAvatar')
            self.loginFSM.request('playingGame')
        else:
            self.notify.error('Bad avatar: return code %d' % returnCode)

    handleAvatarResponseMsg = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(handleAvatarResponseMsg)

    def enterWaitForDeleteAvatarResponse(self, potentialAvatar):
        raise StandardError, 'This should be handled within AvatarChooser.py'

    enterWaitForDeleteAvatarResponse = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(enterWaitForDeleteAvatarResponse)

    def exitWaitForDeleteAvatarResponse(self):
        raise StandardError, 'This should be handled within AvatarChooser.py'

    exitWaitForDeleteAvatarResponse = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(exitWaitForDeleteAvatarResponse)

    def sendUpdateToGlobalDoId(self, dclassName, fieldName, doId, args):
        dcfile = self.getDcFile()
        dclass = dcfile.getClassByName(dclassName)
        dg = dclass.clientFormatUpdate(fieldName, doId, args)
        self.send(dg)

    sendUpdateToGlobalDoId = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(sendUpdateToGlobalDoId)

    def sendMsgToTravelAgent(self, fieldName, args):
        self.sendUpdateToGlobalDoId(
            'DistributedTravelAgent', fieldName,
            OtpDoGlobals.OTP_DO_ID_PIRATES_TRAVEL_AGENT, args)

    sendMsgToTravelAgent = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(sendMsgToTravelAgent)

    def enterPlayingGame(self):
        OTPClientRepository.enterPlayingGame(self)
        if __dev__ and config.GetDouble('want-dev-hotkeys', 0):

            def toggleKraken():
                if base.localAvatar:
                    if base.localAvatar.ship:
                        messenger.send('magicWord', [
                            '~kraken',
                            base.localAvatar.getDoId(), base.localAvatar.zoneId
                        ])

            self.accept(PiratesGlobals.KrakenHotkey, toggleKraken)

        def logout():
            if not base.config.GetBool('location-kiosk', 0) and hasattr(
                    base, 'localAvatar') and localAvatar.getCanLogout():
                self._userLoggingOut = True
                self.gameFSM.request('closeShard', ['waitForAvatarList'])

        self._userLoggingOut = False
        self.accept(PiratesGlobals.LogoutHotkey, logout)
        if __dev__ and config.GetDouble('want-dev-hotkeys', 0):

            def deployShip():
                messenger.send('magicWord', [
                    '~deployShip',
                    base.localAvatar.getDoId(), base.localAvatar.zoneId
                ])

            self.accept(PiratesGlobals.ShipHotkey, deployShip)

        if localAvatar.style.getTutorial(
        ) < PiratesGlobals.TUT_MET_JOLLY_ROGER and self.skipTutorial == 0:
            localAvatar.teleportToType = PiratesGlobals.INSTANCE_TUTORIAL
            localAvatar.teleportToName = WorldGlobals.PiratesTutorialSceneFileBase
            self.sendMsgToTravelAgent('requestInitLocUD', ['unused', 0])
        elif localAvatar.onWelcomeWorld and self.defaultShard != 0 and config.GetBool(
                'want-welcome-worlds', 0):
            localAvatar.teleportToType = PiratesGlobals.INSTANCE_WELCOME
            localAvatar.teleportToName = 'Welcome World'
            self.sendMsgToTravelAgent('requestInitLocUD', ['unused', 0])
        else:
            desiredShard = self.defaultShard
            localAvatar.teleportToType = PiratesGlobals.INSTANCE_MAIN
            localAvatar.teleportToName = WorldGlobals.PiratesWorldSceneFileBase
            self.sendMsgToTravelAgent('requestInitLocUD',
                                      ['unused', desiredShard])
        base.loadingScreen.beginStep('beginTeleport', 11, 32)

    enterPlayingGame = report(types=['args', 'deltaStamp', 'module'],
                              dConfigParam='teleport')(enterPlayingGame)

    def playingGameLocReceived(self, shardId, zoneId):
        self.gameFSM.request('waitOnEnterResponses',
                             [shardId, zoneId, zoneId, -1])

    playingGameLocReceived = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(playingGameLocReceived)

    def exitPlayingGame(self):
        self.notify.info('exitPlayingGame')
        ivalMgr.interrupt()
        self.notify.info('sending clientLogout')
        messenger.send('clientLogout')
        if config.GetDouble('want-dev-hotkeys', 0):
            self.ignore(PiratesGlobals.KrakenHotkey)
            self.ignore(PiratesGlobals.ShipHotkey)
            self.ignore(PiratesGlobals.LogoutHotkey)

        self.uidMgr.reset()
        if self.distributedDistrict:
            self.distributedDistrict.worldCreator.cleanupAllAreas()

        for (doId, obj) in self.doId2do.items():
            if not isinstance(obj, LocalPirate) and not isinstance(
                    obj, DistributedDistrict.DistributedDistrict):
                if hasattr(self, 'disableObject'):
                    self.disableObject(doId)

            hasattr(self, 'disableObject')

        if hasattr(base, 'localAvatar'):
            camera.reparentTo(render)
            camera.setPos(0, 0, 0)
            camera.setHpr(0, 0, 0)

        base.transitions.noTransitions()
        if self._userLoggingOut:
            self.detectLeaks(okTasks=[
                'physics-avatar', 'memory-monitor-task', 'multitexFlatten'
            ],
                             okEvents=[
                                 'destroy-ToontownLoadingScreenTitle',
                                 'destroy-ToontownLoadingScreenTip',
                                 'destroy-ToontownLoadingScreenWaitBar', 'f12',
                                 'f7', 'close_main_window', 'open_main_window',
                                 PiratesGlobals.LogoutHotkey
                             ])

        OTPClientRepository.exitPlayingGame(self)

    exitPlayingGame = report(types=['args', 'deltaStamp'],
                             dConfigParam='teleport')(exitPlayingGame)

    def enterTutorialQuestion(self, hoodId, zoneId, avId):
        self.__requestTutorial(hoodId, zoneId, avId)

    enterTutorialQuestion = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(enterTutorialQuestion)

    def handleTutorialQuestion(self, msgType, di):
        if msgType == CLIENT_CREATE_OBJECT_REQUIRED:
            self.handleGenerateWithRequired(di)
        elif msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER:
            self.handleGenerateWithRequiredOther(di)
        elif msgType == CLIENT_OBJECT_UPDATE_FIELD:
            self.handleUpdateField(di)
        elif msgType == CLIENT_OBJECT_DISABLE:
            self.handleDisable(di)
        elif msgType == CLIENT_OBJECT_DISABLE_OWNER:
            self.handleDisableOwner(di)
        elif msgType == CLIENT_OBJECT_DELETE_RESP:
            self.handleDelete(di)
        elif msgType == CLIENT_GET_AVATAR_DETAILS_RESP:
            self.handleGetAvatarDetailsResp(di)
        else:
            self.handleUnexpectedMsgType(msgType, di)

    handleTutorialQuestion = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(handleTutorialQuestion)

    def exitTutorialQuestion(self):
        self.handler = None
        self.handlerArgs = None
        self.ignore('startTutorial')
        taskMgr.remove('waitingForTutorial')

    exitTutorialQuestion = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(exitTutorialQuestion)

    def __requestTutorial(self, hoodId, zoneId, avId):
        self.acceptOnce('startTutorial', self.__handleStartTutorial, [avId])
        messenger.send('requestTutorial')

    __requestTutorial = report(types=['args', 'deltaStamp'],
                               dConfigParam='teleport')(__requestTutorial)

    def __handleStartTutorial(self, avId, zoneId):
        pass  # TODO

    def isShardInterestOpen(self):
        return False  # TODO: When should this return true? :(
class DistributedMainWorld(DistributedInstanceBase):
    notify = directNotify.newCategory('DistributedMainWorld')
    
    def __init__(self, cr):
        DistributedInstanceBase.__init__(self, cr)
        self.setName('MainWorld')
        self.pvpRespawnCall = None

    
    def disable(self):
        if self.pvpRespawnCall:
            self.pvpRespawnCall.destroy()
            self.pvpRespawnCall = None
        
        DistributedInstanceBase.disable(self)

    
    def delete(self):
        self.ignore('sendingLocalAvatarToJail')
        DistributedInstanceBase.delete(self)

    
    def handleOffStage(self, cacheAreas = []):
        self.disableFireworkShow()
        DistributedInstanceBase.handleOffStage(self, cacheAreas)

    handleOffStage = report(types = [
        'args'], dConfigParam = [
        'dteleport'])(handleOffStage)
    
    def handleOnStage(self):
        DistributedInstanceBase.handleOnStage(self)
        base.cr.timeOfDayManager.setEnvironment(TODGlobals.ENV_DEFAULT)

    handleOnStage = report(types = [
        'args'], dConfigParam = [
        'dteleport'])(handleOnStage)
    
    def localAvEnterDeath(self, av):
        DistributedInstanceBase.localAvEnterDeath(self, av)
        self.d_localAvatarDied()
        if av.getSiegeTeam():
            self._startPvpRespawn(PVPGlobals.MainWorldAvRespawnDelay)
        

    localAvEnterDeath = report(types = [
        'frameCount'], dConfigParam = 'jail')(localAvEnterDeath)
    
    def _startPvpRespawn(self, delay):
        self.pvpRespawnCall = DelayedCall(self._doPvpRespawn, name = 'PVPrespawn', delay = delay)

    
    def _doPvpRespawn(self):
        
        try:
            pass
        except:
            return None

        if hasattr(localAvatar, 'ship') and localAvatar.ship and not localAvatar.ship.isSailable():
            self._startPvpRespawn(0.20000000000000001)
            return None
        
        self.hideDeathLoadingScreen(localAvatar)
        localAvatar.b_setGameState('LandRoam')

    
    def localAvExitDeath(self, av):
        DistributedInstanceBase.localAvExitDeath(self, av)

    localAvExitDeath = report(types = [
        'frameCount'], dConfigParam = 'jail')(localAvExitDeath)
    
    def getWorldPos(self, node):
        if not node.isEmpty() and self.isOnStage():
            return node.getPos(self)
        

    
    def getAggroRadius(self):
        return EnemyGlobals.MAX_SEARCH_RADIUS

    
    def enableFireworkShow(self, timestamp = 0.0, showType = None):
        if showType != None:
            if not self.fireworkShowMgr:
                self.fireworkShowMgr = FireworkShowManager()
                self.fireworkShowMgr.enable(showType, timestamp)
            
        elif base.fourthOfJuly:
            if not self.fireworkShowMgr:
                self.fireworkShowMgr = FireworkShowManager()
                self.fireworkShowMgr.enable(FireworkShowType.FourthOfJuly, timestamp)
            
        

    
    def disableFireworkShow(self):
        if self.fireworkShowMgr:
            self.fireworkShowMgr.disable()
            self.fireworkShowMgr = None
        

    if __dev__:
        
        def printIslands(self):
            for (doId, island) in self.islands.iteritems():
                print doId, `island`
class QuestIndicatorNodeExtDoor(QuestIndicatorGridNode):
    
    def __init__(self, questStep):
        self.nearEffect = None
        QuestIndicatorGridNode.__init__(self, 'ExtDoorIndicator', [
            10,
            150], questStep)

    
    def delete(self):
        QuestIndicatorGridNode.delete(self)
        if self.nearEffect:
            self.nearEffect.cleanUpEffect()
        
        self.nearEffect = None

    delete = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(delete)
    
    def enterOff(self):
        QuestIndicatorGridNode.enterOff(self)
        self.stopNearEffect()

    enterOff = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(enterOff)
    
    def enterNear(self):
        QuestIndicatorGridNode.enterNear(self)
        self.startNearEffect()

    
    def exitNear(self):
        QuestIndicatorGridNode.exitNear(self)
        self.stopNearEffect()

    
    def stepObjArrived(self, stepObj):
        QuestIndicatorGridNode.stepObjArrived(self, stepObj)
        if self.getCurrentOrNextState() in ('Near',):
            self.startNearEffect()
        

    stepObjArrived = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(stepObjArrived)
    
    def stepObjLeft(self):
        QuestIndicatorGridNode.stepObjLeft(self)
        self.stopNearEffect()

    stepObjLeft = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(stepObjLeft)
    
    def showEffect(self):
        QuestIndicatorGridNode.showEffect(self)
        self.startNearEffect()

    showEffect = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(showEffect)
    
    def hideEffect(self):
        QuestIndicatorGridNode.hideEffect(self)
        self.stopNearEffect()

    hideEffect = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(hideEffect)
    
    def startNearEffect(self):
        if self.muted:
            return None
        
        if not self.nearEffect:
            self.nearEffect = RayOfLight()
            self.nearEffect.setBottomRayEnabled(self.wantBottomEffect)
            self.nearEffect.setPos(Point3(0, 5, 0))
            self.nearEffect.startLoop()
        
        if self.stepObj:
            self.nearEffect.reparentTo(self.stepObj)
        

    startNearEffect = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(startNearEffect)
    
    def stopNearEffect(self):
        if self.nearEffect:
            self.nearEffect.stopLoop()
            self.nearEffect = None
        

    stopNearEffect = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(stopNearEffect)
        shipId = colEntry.getFromNodePath().getNetTag('shipId')
        shipId = int(shipId)
        sphereId = colEntry.getIntoNodePath().getNetTag('deploySphereId')
        sphereId = int(sphereId)
        self.d_shipExitedSphere(shipId, sphereId)

    
    def handleShipEnterMinSphere(self, colEntry):
        if localAvatar.ship and localAvatar.ship.steeringAvId == localAvatar.doId:
            if localAvatar.guiMgr.lockInstructionMessage(self, PLocalizer.CoralReefWarning, messageCategory = MessageGlobals.MSG_CAT_SHORE_CLOSE):
                self.lockedMessage = 1
            
        

    handleShipEnterMinSphere = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(handleShipEnterMinSphere)
    
    def handleShipExitMinSphere(self, colEntry):
        if self.lockedMessage == 1:
            localAvatar.guiMgr.unlockInstructionMessage(self)
            self.lockedMessage = 0
        

    handleShipExitMinSphere = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(handleShipExitMinSphere)
    
    def handleShipEnterSoftBarrier(self, colEntry):
        shipId = colEntry.getFromNodePath().getNetTag('shipId')
        shipId = int(shipId)
Example #26
0
class DistributedTreasureMapInstance(
        DistributedInstanceWorld.DistributedInstanceWorld,
        QuestHolder.QuestHolder, FSM.FSM):
    notify = directNotify.newCategory('DistributedTreasureMapInstance')

    def __init__(self, cr):
        DistributedInstanceWorld.DistributedInstanceWorld.__init__(self, cr)
        FSM.FSM.__init__(self, 'DistributedTreasureMapInstance')
        QuestHolder.QuestHolder.__init__(self)
        self.pendingObjectiveRequest = None
        self.pendingShipRequest = None
        self.objectives = []

    def announceGenerate(self):
        DistributedInstanceWorld.DistributedInstanceWorld.announceGenerate(
            self)
        base.cr.treasureMap = self
        localAvatar.guiMgr.crewHUD.setTM(True)
        localAvatar.guiMgr.showTMUI(self)
        localAvatar.guiMgr.hideTrackedQuestInfo()
        localAvatar.b_setTeleportFlag(PiratesGlobals.TFTreasureMap)
        localAvatar.guiMgr.disableLookoutPanel(True)

    def disable(self):
        base.cr.treasureMap = None
        FSM.FSM.cleanup(self)
        localAvatar.guiMgr.crewHUD.setTM(False)
        localAvatar.guiMgr.hideTMUI()
        if localAvatar.guiMgr.crewHUD.crew:
            localAvatar.guiMgr.crewHUD.leaveCrew()

        localAvatar.guiMgr.crewHUD.setHUDOn()
        localAvatar.guiMgr.showTrackedQuestInfo()
        localAvatar.b_clearTeleportFlag(PiratesGlobals.TFTreasureMap)
        localAvatar.guiMgr.disableLookoutPanel(False)
        if self.pendingObjectiveRequest:
            base.cr.relatedObjectMgr.abortRequest(self.pendingObjectiveRequest)
            self.pendingObjectiveRequest = None

        if self.pendingShipRequest:
            base.cr.relatedObjectMgr.abortRequest(self.pendingShipRequest)
            self.pendingShipRequest = None

        DistributedInstanceWorld.DistributedInstanceWorld.disable(self)

    def enterWaitClientsReady(self):
        pass

    def setBarrierData(self, data):
        DistributedInstanceWorld.DistributedInstanceWorld.setBarrierData(
            self, data)
        self.doneBarrier(self.uniqueName('allAvatarsReady'))

    setBarrierData = report(types=['frameCount', 'deltaStamp', 'args'],
                            dConfigParam='blackpearl')(setBarrierData)

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterReward(self):
        pass

    def exitReward(self):
        pass

    def filterReward(self, request, args=[]):
        if request in ['Completed']:
            return self.defaultFilter(request, args)

    def enterNotCompleted(self):
        pass

    def exitNotCompleted(self):
        pass

    def filterNotCompleted(self, request, args=[]):
        if request in ['Completed']:
            return self.defaultFilter(request, args)

    def enterCompleted(self):
        pass

    def exitCompleted(self):
        pass

    def getItemList(self):
        return self.getObjectives()

    def getObjectives(self):
        return self.objectives

    def setObjectives(self, objectives):
        self.objectives = []
        for currObjective in objectives:
            self.objectives.append({
                'Type': 'ObjectId',
                'Value': currObjective
            })
            self.pendingObjectiveRequest = base.cr.relatedObjectMgr.requestObjects(
                [currObjective], eachCallback=self.tagAsObjective)

        print 'got new objectives list %s' % objectives
        messenger.send(self.getItemChangeMsg())

    def getItemChangeMsg(self):
        return self.taskName('objectiveChanged')

    def tagAsObjective(self, quest):
        quest.type = DistributedQuest.QUEST_TYPE_TM

    def setTMComplete(self, instanceResults, playerResults):
        guiMgr = base.localAvatar.guiMgr
        guiMgr.hideTrays()
        guiMgr.hideTMUI()
        guiMgr.showTMCompleteUI(self, playerResults)

    def createNewItem(self,
                      item,
                      parent,
                      itemType=None,
                      columnWidths=[],
                      color=None):
        return MiniQuestItemGui(item, parent)

    def requestTreasureMapLeave(self):
        localAvatar.guiMgr.crewHUD.leaveCrew()
        localAvatar.guiMgr.hideTMCompleteUI()
        localAvatar.guiMgr.showTrays()
        self.sendUpdate('requestLeave', [0])

    def requestLeaveApproved(self, parentId, zoneId, shipId):
        localAvatar.setInterest(parentId, zoneId, ['tmExit'])
        self.pendingShipRequest = base.cr.relatedObjectMgr.requestObjects(
            [shipId], eachCallback=self.goToShip)

    def goToShip(self, pendingObj):
        pendingObj.localAvatarBoardShip()
        self.cr.teleportMgr.initiateTeleport(
            PiratesGlobals.INSTANCE_TM, WorldGlobals.PiratesWorldSceneFileBase)
        shipId = colEntry.getFromNodePath().getNetTag('shipId')
        shipId = int(shipId)
        sphereId = colEntry.getIntoNodePath().getNetTag('deploySphereId')
        sphereId = int(sphereId)
        self.d_shipExitedSphere(shipId, sphereId)

    
    def handleShipEnterMinSphere(self, colEntry):
        if localAvatar.ship and localAvatar.ship.steeringAvId == localAvatar.doId:
            if localAvatar.guiMgr.lockInstructionMessage(self, PLocalizer.CoralReefWarning, messageCategory = MessageGlobals.MSG_CAT_SHORE_CLOSE):
                self.lockedMessage = 1
            
        

    handleShipEnterMinSphere = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(handleShipEnterMinSphere)
    
    def handleShipExitMinSphere(self, colEntry):
        if self.lockedMessage == 1:
            localAvatar.guiMgr.unlockInstructionMessage(self)
            self.lockedMessage = 0
        

    handleShipExitMinSphere = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(handleShipExitMinSphere)
    
    def handleShipEnterSoftBarrier(self, colEntry):
        shipId = colEntry.getFromNodePath().getNetTag('shipId')
        shipId = int(shipId)
Example #28
0
class AnimationMixer:
    __metaclass__ = MixerType
    notify = DirectNotifyGlobal.directNotify.newCategory('AnimationMixer')
    NA_INDEX = -1
    LOOP_INDEX = 0
    ACTION_INDEX = 1
    LOOP = {
        'NA': NA_INDEX,
        'LOOP': LOOP_INDEX }
    ACTION = {
        'NA': NA_INDEX,
        'ACTION': ACTION_INDEX }
    sectionNames = [
        None]
    partNameLists = {
        None: [] }
    AnimRankings = { }
    defaultBlendT = 0.14999999999999999
    
    def __init__(self, actor):
        self.actor = actor
        channelCount = max(*self.ACTION.values())
        channelCount = max(channelCount, *self.LOOP.values()) + 1
        self.partMixers = {}
        for part in self.sectionNames:
            self.partMixers[part] = PartMixer(self, channelCount, actor, self.getPartsNameList(part))
        self.ownedIvals = []

    
    def __str__(self):
        outStr = '(%s: %s)\n' % (self.__class__.__name__, `self.actor`)
        for sectionName in self.partMixers:
            outStr += '%s\n' % str(self.partMixers[sectionName])
        
        outStr += '\nOwned Intervals\n-------------------------------\n'
        for ival in self.ownedIvals:
            outStr += `ival` + ': isPlaying = ' + `ival.isPlaying()` + '\n'
        
        return outStr

    
    def getPartsNameList(self, sectionName):
        outList = []
        if sectionName is None or set(sectionName) == set(self.sectionNames):
            return None
        elif isinstance(sectionName, types.StringType):
            sectionNames = [
                sectionName]
        elif isinstance(sectionName, types.ListType):
            sectionNames = sectionName
        else:
            sectionNames = []
        for section in sectionNames:
            partList = self.partNameLists.get(section)
            if partList:
                outList.extend(partList)
        
        return outList

    
    def getSectionList(self, sectionName):
        if not sectionName:
            return self.sectionNames
        elif isinstance(sectionName, types.StringType):
            return [
                sectionName]
        elif isinstance(sectionName, types.ListType):
            return sectionName
        else:
            return []

    
    def addIvalToOwnedList(self, ival):
        self.ownedIvals = _[1]
        self.ownedIvals.append(ival)

    
    def __getPlayIval(self, newAnim, partName = None, fromFrame = None, toFrame = None, blendInT = defaultBlendT, blendOutT = defaultBlendT, duration = 0.0, blendInto = None):
        sectionNames = self.getSectionList(partName)
        rankings = self.AnimRankings.get(newAnim)
        if rankings:
            loopRanks = self.LOOP.values()
            ival = Parallel()
            for section in sectionNames:
                rank = rankings[self.sectionNameIds[section]]
                if rank in loopRanks:
                    pass
                1
                if rank > self.NA_INDEX:
                    pDuration = duration
                    partNames = self.getPartsNameList(section)
                    if not pDuration:
                        pDuration = Actor.getDuration(self.actor, newAnim, partNames, fromFrame, toFrame)
                    
                    if pDuration == None:
                        continue
                    
                    if pDuration == 0.0:
                        continue
                    
                    playRate = Actor.getPlayRate(self.actor, newAnim, partNames)
                    if playRate:
                        pDuration /= abs(playRate)
                    
                    if pDuration < blendInT + blendOutT:
                        blendInT = pDuration / 2
                        blendOutT = pDuration / 2
                    
                    ival.append(self.partMixers[section].getPlayIval(rank, newAnim, pDuration, blendInT = blendInT, blendOutT = blendOutT, blendInto = blendInto))
            
            if len(ival):
                return ival
            
        

    _AnimationMixer__getPlayIval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__getPlayIval)
    
    def __getLoopIval(self, newAnim, rate = 1.0, partName = None, fromFrame = None, toFrame = None, blendT = defaultBlendT, blendDelay = 0):
        sectionNames = self.getSectionList(partName)
        rankings = self.AnimRankings.get(newAnim)
        if rankings:
            loopRanks = self.LOOP.values()
            loopRanks.sort(reverse = True)
            ival = Parallel()
            for section in sectionNames:
                rank = rankings[self.sectionNameIds[section]]
                if rank not in loopRanks:
                    for loopRank in loopRanks:
                        if loopRank < rank:
                            break
                            continue
                    
                    rank = loopRank
                
                if rank > self.NA_INDEX:
                    loopIval = self.partMixers[section].getLoopIval(rank, newAnim, blendT, blendDelay)
                    if loopIval:
                        ival.append(loopIval)
                    
            
            if len(ival):
                return ival
            
        

    _AnimationMixer__getLoopIval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__getLoopIval)
    
    def __getPoseIval(self, newAnim, partName = None, frame = 0, blendT = defaultBlendT):
        sectionNames = self.getSectionList(partName)
        rankings = self.AnimRankings.get(newAnim)
        if rankings:
            loopIndices = self.LOOP.values()
            loopIndices.sort()
            ival = Parallel()
            for section in sectionNames:
                rank = rankings[self.sectionNameIds[section]]
                loopRank = loopIndices[0]
                for loopIndex in loopIndices:
                    if rank >= loopIndex:
                        loopRank = loopIndex
                        continue
                
                rank = loopRank
                if rank > self.NA_INDEX:
                    loopIval = self.partMixers[section].getLoopIval(rank, newAnim, blendT, blendDelay = 0)
                    if loopIval:
                        ival.append(loopIval)
                    
            
            if len(ival):
                return ival
            
        

    _AnimationMixer__getPoseIval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__getPoseIval)
    
    def _AnimationMixer__processActorInterval(self, actorInterval, partName, blendInT, blendOutT, blendInto):
        if not isinstance(actorInterval, ActorInterval) and self.actor is not actorInterval.actor or hasattr(actorInterval, 'animMixed'):
            return actorInterval
        
        newAnim = actorInterval.animName
        sectionName = self.getSectionList(partName)
        partName = self.getPartsNameList(sectionName)
        fromFrame = actorInterval.startFrame
        toFrame = actorInterval.endFrame
        duration = actorInterval.duration
        ival = self._AnimationMixer__getPlayIval(newAnim, sectionName, fromFrame, toFrame, blendInT, blendOutT, duration, blendInto)
        if ival:
            actorInterval.resetControls(partName)
            actorInterval = Parallel(ival, actorInterval)
            actorInterval.animMixed = True
        
        return actorInterval

    
    def loop(self, newAnim, rate = 1.0, restart = True, partName = None, fromFrame = None, toFrame = None, blendT = defaultBlendT, blendDelay = 0):
        ival = self._AnimationMixer__getLoopIval(newAnim, rate, partName, fromFrame, toFrame, blendT, blendDelay)
        if ival:
            partName = self.getPartsNameList(self.getSectionList(partName))
            self.actor.setPlayRate(rate, newAnim, partName)
            Actor.loop(self.actor, newAnim, restart = restart, partName = partName, fromFrame = fromFrame, toFrame = toFrame)
            ival.start()
            ival.setT(0.01)
            self.addIvalToOwnedList(ival)
        

    loop = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(loop)
    
    def play(self, newAnim, partName = None, fromFrame = None, toFrame = None, blendInT = defaultBlendT, blendOutT = defaultBlendT, blendInto = None):
        partNames = self.getPartsNameList(self.getSectionList(partName))
        ival = self._AnimationMixer__getPlayIval(newAnim, partName, fromFrame, toFrame, blendInT, blendOutT, blendInto = blendInto)
        if ival:
            Actor.play(self.actor, newAnim, partName = partNames, fromFrame = fromFrame, toFrame = toFrame)
            ival.start()
            ival.setT(0.01)
            self.addIvalToOwnedList(ival)
        

    play = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(play)
    
    def pingpong(self, newAnim, rate = 1.0, partName = None, fromFrame = None, toFrame = None, blendT = defaultBlendT):
        ival = self._AnimationMixer__getLoopIval(newAnim, rate, partName, fromFrame, toFrame, blendT)
        if ival:
            partName = self.getPartsNameList(self.getSectionList(partName))
            self.actor.setPlayRate(rate, newAnim, partName)
            Actor.pingpong(self.actor, newAnim, partName = partName, fromFrame = fromFrame, toFrame = toFrame)
            ival.start()
            ival.setT(0.01)
            self.addIvalToOwnedList(ival)
        

    pingpong = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(pingpong)
    
    def pose(self, newAnim, frame, partName = None, blendT = defaultBlendT):
        ival = self._AnimationMixer__getPoseIval(newAnim, partName, frame, blendT)
        if ival:
            partName = self.getPartsNameList(self.getSectionList(partName))
            Actor.pose(self.actor, newAnim, frame = frame, partName = partName)
            ival.start()
            ival.setT(0.01)
            self.addIvalToOwnedList(ival)
        

    pose = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(pose)
    
    def actorInterval(self, actorInterval, partName, blendInT = defaultBlendT, blendOutT = defaultBlendT, blendInto = None):
        return self._AnimationMixer__processActorInterval(actorInterval, partName, blendInT, blendOutT, blendInto)

    actorInterval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(actorInterval)
    
    def stop(self, animName = None, partName = None):
        Actor.stop(self.actor, animName, partName)

    stop = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(stop)
    
    def cleanup(self):
        for ival in self.ownedIvals:
            ival.finish()
        
        self.ownedIvals = []
        for sectionName in self.partMixers:
            self.partMixers[sectionName].cleanup()
        
        Actor.stop(self.actor)
        Actor.setControlEffect(self.actor, None, 0.0)

    cleanup = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(cleanup)
    
    def delete(self):
        self.cleanup()
        for sectionName in self.partMixers:
            self.partMixers[sectionName].delete()
        
        self.actor = None
        self.partMixers = { }
class DistributedTeleportMgr(DistributedObject.DistributedObject):
    notify = directNotify.newCategory('DistributedTeleportMgr')

    def __init__(self, cr):
        DistributedObject.DistributedObject.__init__(self, cr)
        self.instanceType = None
        self.fromInstanceType = None
        self.lastLocalTeleportLoc = None
        self.teleportQueryId = None
        self.inInstanceType = PiratesGlobals.INSTANCE_MAIN
        self.instanceName = WorldGlobals.PiratesWorldSceneFileBase
        self.doneCallback = None
        self.startedCallback = None
        self.oldWorld = None
        self.requestData = None
        self.localTeleportId = None
        self.localTeleportingObj = None
        self.localTeleportCallback = None
        self.localTeleportDestPos = None
        self.popupDialog = None
        self.doEffect = False
        self.stowawayEffect = False
        self.miniLog = None
        self.teleportQueue = []
        self.teleportQueueProcess = None

    def generate(self):
        DistributedObject.DistributedObject.generate(self)
        base.cr.teleportMgr = self

    def requestTeleportToFishingShip(self):
        self.cr.teleportMgr.sendUpdate('requestTeleportToFishingShip')

    def requestTeleportToFishingShip(self):
        self.cr.teleportMgr.sendUpdate('requestTeleportToFishingShip')

    def localTeleportToId(self,
                          locationId,
                          teleportingObj=None,
                          destPos=None,
                          callback=None,
                          objectLocation=None,
                          showLoadingScreen=True):
        if showLoadingScreen:
            self.cr.loadingScreen.show(waitForLocation=True)

        if locationId in base.cr.doId2do and base.cr.doId2do[
                locationId].dclass.getName() == 'DistributedOceanGrid':
            logBlock(
                1, 'localTeleportToId(%s,%s,%s,%s,%s,%s) to ocean grid\n\n' %
                (locationId, teleportingObj, destPos, callback, objectLocation,
                 showLoadingScreen) + str(StackTrace()))

        self.localTeleportId = locationId
        self.localTeleportingObj = teleportingObj
        self.localTeleportCallback = callback
        self.localTeleportDestPos = destPos
        destObj = self.cr.doId2do.get(locationId)
        if destObj:
            self._localTeleportToIdInterestComplete()
            self.notify.debug(
                'destination object %s found, teleporting to there now' %
                locationId)
        elif objectLocation:
            self._localTeleportToIdResponse(objectLocation[0],
                                            objectLocation[1])
            self.notify.debug(
                'destination object %s not found, but location %s given' %
                (locationId, objectLocation))
        else:
            self.sendUpdate('requestTargetsLocation', [int(locationId)])
            self.notify.debug(
                'destination object %s not found, querying AI for its location'
                % locationId)

    localTeleportToId = report(types=['args', 'deltaStamp'],
                               dConfigParam=['teleport', 'shipboardreport'
                                             ])(localTeleportToId)

    def _localTeleportToIdResponse(self, parentId, zoneId):
        if parentId != 0 and zoneId != 0:
            if self.cr.doId2do.get(parentId):
                localAvatar.setInterest(
                    parentId, zoneId, ['localTeleportToId'],
                    'localTeleportToIdInterestAddComplete')
                self.acceptOnce('localTeleportToIdInterestAddComplete',
                                self._localTeleportToIdInterestComplete)
                self.notify.debug(
                    'parent %s of destination object found, setting up interest'
                    % parentId)
            else:
                self.notify.warning(
                    'parent %s of destination object not found, teleport failure'
                    % parentId)
        else:
            self.failTeleport(parentId, zoneId)

    _localTeleportToIdResponse = report(
        types=['args', 'deltaStamp'],
        dConfigParam=['teleport',
                      'shipboardreport'])(_localTeleportToIdResponse)

    def failTeleport(self,
                     parentId=None,
                     zoneId=None,
                     message=PLocalizer.TeleportToPlayerFailMessage):
        self.sendUpdate('requestClearPreventDamage')
        fallbackAreaId = localAvatar.getReturnLocation()
        if fallbackAreaId != '':
            areaDoId = base.cr.uidMgr.getDoId(fallbackAreaId)
            self.clearAmInTeleport()
            if areaDoId:
                destPos = base.cr.activeWorld.getPlayerSpawnPt(areaDoId)
                if destPos and self.localTeleportingObj:
                    self.localTeleportToId(areaDoId, self.localTeleportingObj,
                                           destPos)
                else:
                    self.initiateTeleport(
                        PiratesGlobals.INSTANCE_MAIN,
                        WorldGlobals.PiratesWorldSceneFileBase,
                        doEffect=False)
            else:
                self.initiateTeleport(PiratesGlobals.INSTANCE_MAIN,
                                      WorldGlobals.PiratesWorldSceneFileBase,
                                      doEffect=False)
            self._DistributedTeleportMgr__createDialog(message)
        else:
            self.notify.warning(
                "  teleport to object (%s %s) AND 'return location' %s failed"
                % (parentId, zoneId, fallbackAreaId))

    def failTeleportRequest(self, reasonBit):
        if reasonBit >= 0:
            localAvatar.guiMgr.createWarning(
                PiratesGlobals.TFNoTeleportReasons.get(
                    BitMask32.bit(reasonBit),
                    PLocalizer.TeleportGenericFailMessage))
        else:
            self._DistributedTeleportMgr__createDialog(
                PLocalizer.TeleportToPlayerFailMessage)

    def _DistributedTeleportMgr__cleanupDialog(self, value=None):
        if self.popupDialog:
            self.popupDialog.destroy()
            del self.popupDialog
            self.popupDialog = None

    def _DistributedTeleportMgr__createDialog(self, message):
        if message:
            popupDialogText = message
            if self.popupDialog:
                self._DistributedTeleportMgr__cleanupDialog()

            self.popupDialog = PDialog.PDialog(
                text=popupDialogText,
                style=OTPDialog.Acknowledge,
                command=self._DistributedTeleportMgr__cleanupDialog)

    def _localTeleportToIdDone(self):
        self.cr.loadingScreen.scheduleHide(
            base.cr.getAllInterestsCompleteEvent())
        curParent = localAvatar.getParentObj()
        if isinstance(curParent, ZoneLOD.ZoneLOD):
            localAvatar.enterZoneLOD(curParent)

        if self.localTeleportCallback:
            self.localTeleportCallback()

        self.localTeleportId = None
        self.localTeleportingObj = None
        self.localTeleportCallback = None
        self.localTeleportDestPos = None
        localAvatar.guiMgr.socialPanel.updateAll()

    _localTeleportToIdDone = report(
        types=['args', 'deltaStamp'],
        dConfigParam=['teleport', 'shipboardreport'])(_localTeleportToIdDone)

    def disable(self):
        DistributedObject.DistributedObject.disable(self)
        messenger.send('destroyCrewMatchInvite')
        taskMgr.removeTasksMatching('teleportRemoveInterest')
        taskMgr.removeTasksMatching('teleportAddInterest')
        taskMgr.removeTasksMatching(self.uniqueName('localTeleportPos'))
        taskMgr.removeTasksMatching(self.uniqueName('fadeDone'))
        self.requestData = None
        self.ignoreAll()
        if base.cr.teleportMgr == self:
            base.cr.teleportMgr = None

        requestData = self.requestData
        self.requestData = None
        if self.teleportQueueProcess:
            taskMgr.remove(self.teleportQueueProcess)

    def requestTeleport(self,
                        instanceType,
                        instanceName,
                        shardId=0,
                        locationUid='',
                        instanceDoId=0,
                        doneCallback=None,
                        startedCallback=None,
                        gameType=-1,
                        friendDoId=0,
                        friendAreaDoId=0,
                        doEffect=True):
        self.requestData = ((instanceType, instanceName), {
            'shardId': shardId,
            'locationUid': locationUid,
            'instanceDoId': instanceDoId,
            'doneCallback': doneCallback,
            'startedCallback': startedCallback,
            'gameType': gameType,
            'friendDoId': friendDoId,
            'friendAreaDoId': friendAreaDoId,
            'doEffect': doEffect
        })
        localAvatar.confirmTeleport(self.teleportConfirmation, feedback=True)

    requestTeleport = report(types=['args', 'deltaStamp'],
                             dConfigParam=['teleport'])(requestTeleport)

    def teleportConfirmation(self, confirmed):
        if confirmed:
            requestData = self.requestData
            self.initiateTeleport(*requestData[0], **requestData[0])
            locationUid = requestData[1]['locationUid']
            base.cr.loadingScreen.showTarget(locationUid)
            base.cr.loadingScreen.showHint(locationUid)

        self.requestData = None

    def requestTeleportToAvatar(self, shardId, instanceDoId, avatarId,
                                avatarParentId):
        self.requestTeleport(PiratesGlobals.INSTANCE_MAIN,
                             '',
                             shardId,
                             '',
                             instanceDoId,
                             friendDoId=avatarId,
                             friendAreaDoId=avatarParentId)

    requestTeleportToAvatar = report(types=['args', 'deltaStamp'],
                                     dConfigParam=['teleport'
                                                   ])(requestTeleportToAvatar)

    def queryAvatarForTeleport(self, avId):
        self.setTeleportQueryId(avId)

        def teleportConfirmation(confirmed, avId=avId):
            if confirmed:
                handle = self.cr.identifyAvatar(avId)
                if handle:
                    shardId = self.cr.distributedDistrict.doId
                    if not localAvatar.getBandId():
                        pass
                    (bandMgr, bandId) = (0, 0)
                    guildId = localAvatar.getGuildId()
                    handle.sendTeleportQuery(avId, bandMgr, bandId, guildId,
                                             shardId)

        teleportConfirmation = report(
            types=['args', 'deltaStamp'],
            dConfigParam='teleport')(teleportConfirmation)
        localAvatar.confirmTeleport(teleportConfirmation, feedback=True)

    queryAvatarForTeleport = report(types=['args', 'deltaStamp'],
                                    dConfigParam=['teleport'
                                                  ])(queryAvatarForTeleport)

    def handleAvatarTeleportQuery(self, requesterId, requesterBandMgrId,
                                  requesterBandId, requesterGuildId,
                                  requesterShardId):
        handle = self.cr.identifyAvatar(requesterId)
        if not handle:
            return None

        if self.cr.identifyFriend(requesterId):
            if requesterId in localAvatar.ignoreList or self.cr.avatarFriendsManager.checkIgnored(
                    requesterId):
                handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(
                    PiratesGlobals.TFIgnore),
                                            0,
                                            0,
                                            0,
                                            sendToId=requesterId)
                return None

        if localAvatar.ship and len(
                localAvatar.ship.crew) >= localAvatar.ship.getMaxCrew():
            handle.sendTeleportResponse(PiratesGlobals.encodeTeleportFlag(
                PiratesGlobals.TFOnShip),
                                        0,
                                        0,
                                        0,
                                        sendToId=requesterId)
            return None

        avName = handle.getName()

        def confirmed(canTeleportTo, avId, failedFlag, avName=avName):
            if canTeleportTo:
                if self.cr.getActiveWorld(
                ) and self.cr.distributedDistrict and localAvatar.getParentObj(
                ):
                    handle.sendTeleportResponse(
                        PiratesGlobals.TAAvailable,
                        self.cr.distributedDistrict.doId,
                        self.cr.getActiveWorld().doId,
                        localAvatar.getParentObj().doId,
                        sendToId=requesterId)
                else:
                    handle.sendTeleportResponse(
                        PiratesGlobals.encodeTeleportFlag(
                            PiratesGlobals.TFUnavailable),
                        0,
                        0,
                        0,
                        sendToId=requesterId)
            elif localAvatar.failedTeleportMessageOk(requesterId):
                localAvatar.setSystemMessage(
                    requesterId, OTPLocalizer.WhisperFailedVisit % avName)

            handle.sendTeleportResponse(
                PiratesGlobals.encodeTeleportFlag(failedFlag),
                0,
                0,
                0,
                sendToId=requesterId)

        confirmed = report(types=['args', 'deltaStamp'],
                           dConfigParam='teleport')(confirmed)
        localAvatar.confirmTeleportTo(confirmed, requesterId, avName,
                                      requesterBandMgrId, requesterBandId,
                                      requesterGuildId)

    handleAvatarTeleportQuery = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(handleAvatarTeleportQuery)

    def handleAvatarTeleportResponse(self, avId, available, shardId,
                                     instanceDoId, areaDoId):
        if not avId == self.teleportQueryId:
            self.clearTeleportQueryId()
            return None

        self.clearTeleportQueryId()
        handle = self.cr.identifyAvatar(avId)
        if handle:
            avName = handle.getName()
        else:
            return None
        if available == PiratesGlobals.TAAvailable:
            self.requestTeleportToAvatar(shardId,
                                         instanceDoId,
                                         avatarId=avId,
                                         avatarParentId=areaDoId)
        else:
            flag = PiratesGlobals.decodeTeleportFlag(available)
            if flag == PiratesGlobals.TAIgnore:
                pass
            1
            if flag in PiratesGlobals.TFNoTeleportToReasons:
                localAvatar.guiMgr.createWarning(
                    PiratesGlobals.TFNoTeleportToReasons[flag] % avName,
                    duration=10)

    handleAvatarTeleportResponse = report(
        types=['args', 'deltaStamp'],
        dConfigParam=['teleport'])(handleAvatarTeleportResponse)

    def initiateTeleport(self,
                         instanceType,
                         instanceName,
                         shardId=0,
                         locationUid='',
                         instanceDoId=0,
                         doneCallback=None,
                         startedCallback=None,
                         gameType=-1,
                         friendDoId=0,
                         friendAreaDoId=0,
                         doEffect=True,
                         queue=False,
                         stowawayEffect=False):
        if friendDoId:
            self.d_requestPlayerTeleport(friendDoId, shardId)
        elif instanceName == '':
            self.notify.error(
                'cannot perform this teleport without instanceName')

        self.d_requestInstanceTeleport(instanceType, instanceName)
        return None
        currInteractive = base.cr.interactionMgr.getCurrentInteractive()
        if currInteractive:
            currInteractive.requestExit()

        if self.cr.activeWorld:
            fromInstanceType = self.cr.activeWorld.getType()
        else:
            fromInstanceType = PiratesGlobals.INSTANCE_NONE
        if instanceType not in [
                PiratesGlobals.INSTANCE_MAIN, PiratesGlobals.INSTANCE_WELCOME
        ] and fromInstanceType not in [
                PiratesGlobals.INSTANCE_MAIN, PiratesGlobals.INSTANCE_GENERIC,
                PiratesGlobals.INSTANCE_NONE
        ]:
            if not base.config.GetBool('can-break-teleport-rules', 0):
                import pdb as pdb
                pdb.set_trace()
                return None

        if self.amInTeleport():
            if queue:
                self.queueInitiateTeleport(instanceType, instanceName, shardId,
                                           locationUid, instanceDoId,
                                           doneCallback, startedCallback,
                                           gameType, friendDoId,
                                           friendAreaDoId, doEffect,
                                           stowawayEffect)
                return None

            return None

        self.setAmInTeleport()
        if instanceType == PiratesGlobals.INSTANCE_MAIN and not locationUid:
            locationUid = localAvatar.getReturnLocation()

        localAvatar.teleportFriendDoId = friendDoId
        self.doEffect = doEffect
        self.stowawayEffect = stowawayEffect
        self.sendUpdate('initiateTeleport', [
            instanceType, fromInstanceType, shardId, locationUid, instanceDoId,
            instanceName, gameType, friendDoId, friendAreaDoId
        ])
        self.doneCallback = doneCallback
        self.startedCallback = startedCallback
        self.teleportInit(instanceType, fromInstanceType, instanceName)

    initiateTeleport = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(initiateTeleport)

    def queueInitiateTeleport(self,
                              instanceType,
                              instanceName,
                              shardId=0,
                              locationUid='',
                              instanceDoId=0,
                              doneCallback=None,
                              startedCallback=None,
                              gameType=-1,
                              friendDoId=0,
                              friendAreaDoId=0,
                              doEffect=True,
                              stowawayEffect=False):
        teleInfo = [
            instanceType, instanceName, shardId, locationUid, instanceDoId,
            doneCallback, startedCallback, gameType, friendDoId,
            friendAreaDoId, doEffect, stowawayEffect
        ]
        self.teleportQueue.append(teleInfo)

        def processTeleportQueue(task=None):
            if self.amInTeleport():
                return Task.again

            if not self.teleportQueue:
                return Task.done

            teleportInfo = self.teleportQueue.pop(0)
            self.initiateTeleport(*teleportInfo)
            if self.teleportQueue:
                return Task.again

            return Task.done

        self.teleportQueueProcess = taskMgr.doMethodLater(
            1, processTeleportQueue, 'processTeleportQueue')

    def amInTeleport(self):
        return localAvatar.testTeleportFlag(PiratesGlobals.TFInTeleport)

    def setAmInTeleport(self):
        localAvatar.b_setTeleportFlag(PiratesGlobals.TFInTeleport)
        localAvatar.b_clearTeleportFlag(PiratesGlobals.TFLookoutJoined)

    def clearAmInTeleport(self):
        localAvatar.clearTeleportFlag(PiratesGlobals.TFInInitTeleport)
        localAvatar.b_clearTeleportFlag(PiratesGlobals.TFInTeleport)

    def setTeleportQueryId(self, avId):
        self.teleportQueryId = avId

    setTeleportQueryId = report(types=['args', 'deltaStamp'],
                                dConfigParam='teleport')(setTeleportQueryId)

    def clearTeleportQueryId(self):
        self.teleportQueryId = 0

    clearTeleportQueryId = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(clearTeleportQueryId)

    def initiateTeleportAI(self, instanceType, instanceName):
        self.teleportInit(instanceType, instanceName)

    initiateTeleportAI = report(types=['args', 'deltaStamp'],
                                dConfigParam='teleport')(initiateTeleportAI)

    def teleportInit(self,
                     instanceType,
                     fromInstanceType,
                     instanceName,
                     gameType=None):
        self.clearTeleportQueryId()
        self.oldWorld = base.cr.activeWorld
        self.instanceType = instanceType
        self.fromInstanceType = fromInstanceType
        self.instanceName = instanceName
        self.gameType = gameType
        self.miniLog = MiniLog('TeleportLog')
        MiniLogSentry(self.miniLog, 'teleportInit', instanceType,
                      fromInstanceType, instanceName, gameType)

    teleportInit = report(types=['args', 'deltaStamp'],
                          dConfigParam='teleport')(teleportInit)

    def teleportHasBegun(self, instanceType, fromInstanceType, instanceName,
                         gameType):
        if not self.miniLog:
            self.miniLog = MiniLog('TeleportLog')

        s = MiniLogSentry(self.miniLog, 'teleportHasBegun', instanceType,
                          fromInstanceType, instanceName, gameType)
        if self.startedCallback:
            self.startedCallback()
            self.startedCallback = None

        if self.oldWorld == None or self.oldWorld.isEmpty():
            self.teleportInit(instanceType, fromInstanceType, instanceName,
                              gameType)

    teleportHasBegun = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(teleportHasBegun)

    def getRemoveInterestEventName(self):
        return self.uniqueName('teleportRemoveInterest')

    def getAddInterestEventName(self):
        return self.uniqueName('teleportAddInterest')

    def forceTeleportStart(self, instanceName, tzDoId, thDoId, worldGridDoId,
                           tzParent, tzZone):
        s = MiniLogSentry(self.miniLog, 'forceTeleportStart', instanceName,
                          tzDoId, thDoId, worldGridDoId, tzParent, tzZone)
        self.setAmInTeleport()
        localAvatar.guiMgr.request('Cutscene')
        if not base.transitions.fadeOutActive():
            base.transitions.fadeOut()

        if self.fromInstanceType == PiratesGlobals.INSTANCE_MAIN:
            self.inInstanceType = PiratesGlobals.INSTANCE_MAIN
        else:
            self.inInstanceType = self.instanceType
        if self.fromInstanceType == PiratesGlobals.INSTANCE_PVP:
            localAvatar.clearTeleportFlag(PiratesGlobals.TFInPVP)
        elif self.fromInstanceType == PiratesGlobals.INSTANCE_TUTORIAL:
            localAvatar.clearTeleportFlag(PiratesGlobals.TFInTutorial)

        def fadeDone():
            base.cr.loadingScreen.show()
            s = MiniLogSentry(self.miniLog, 'fadeDone')
            curParent = localAvatar.getParentObj()
            parentIsZoneLOD = isinstance(curParent, ZoneLOD.ZoneLOD)
            if parentIsZoneLOD:
                localAvatar.leaveZoneLOD(curParent)
                curParent.turnOff()

            if self.cr.doId2do.get(tzParent) == None:
                self.failTeleport(None, None,
                                  PLocalizer.TeleportGenericFailMessage)
            else:
                self.teleportAddInterestTZ(instanceName, tzDoId, thDoId,
                                           worldGridDoId, tzParent, tzZone)

        localAvatar.guiMgr.request('Interactive')
        taskMgr.removeTasksMatching(self.uniqueName('fadeDone'))
        taskMgr.doMethodLater(1,
                              fadeDone,
                              self.uniqueName('fadeDone'),
                              extraArgs=[])

    forceTeleportStart = report(types=['args', 'deltaStamp'],
                                dConfigParam='teleport')(forceTeleportStart)

    def teleportAddInterestTZ(self, instanceName, tzDoId, thDoId,
                              worldGridDoId, tzParent, tzZone):
        s = MiniLogSentry(self.miniLog, 'teleportAddInterestTZ', instanceName,
                          tzDoId, thDoId, worldGridDoId, tzParent, tzZone)
        addEvent = self.getAddInterestEventName()
        self.accept(addEvent,
                    self.teleportAddInterestCompleteTZ,
                    extraArgs=[tzDoId, thDoId, worldGridDoId])
        localAvatar.setInterest(tzParent, tzZone, ['TZInterest'], addEvent)
        self.instanceName = instanceName

    def requestRespawn(self):
        self.sendUpdate('requestLocalTeleport')

    def teleportAddInterestCompleteTZ(self, tzDoId, thDoId, worldGridDoId):
        s = MiniLogSentry(self.miniLog, 'teleportAddInterestCompleteTZ',
                          tzDoId, thDoId, worldGridDoId)
        base.cr.relatedObjectMgr.requestObjects(
            [tzDoId],
            eachCallback=lambda param1, param2=thDoId: self.teleportZoneExists(
                param1, param2))

    teleportAddInterestCompleteTZ = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(teleportAddInterestCompleteTZ)

    def teleportZoneExists(self, teleportZone, thDoId):
        s = MiniLogSentry(self.miniLog, 'teleportZoneExists', teleportZone,
                          thDoId)
        base.cr.relatedObjectMgr.requestObjects(
            [thDoId],
            eachCallback=lambda param1, param2=teleportZone: self.
            teleportHandlerExists(param1, param2))

    teleportZoneExists = report(types=['args', 'deltaStamp'],
                                dConfigParam='teleport')(teleportZoneExists)

    def teleportHandlerExists(self, teleportHandler, teleportZone):
        s = MiniLogSentry(self.miniLog, 'teleportHandlerExists',
                          teleportHandler, teleportZone)
        teleportHandler.instanceName = self.instanceName
        teleportHandler.instanceType = self.instanceType
        teleportHandler.doneCallback = self.doneCallback
        self.doneCallback = None
        teleportHandler.oldWorld = self.oldWorld
        self.oldWorld = None
        teleportHandler.miniLog = self.miniLog
        self.miniLog = None
        teleportHandler.startTeleport()

    teleportHandlerExists = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(teleportHandlerExists)

    def createSpawnInterests(self, parents, callback, destGrid,
                             teleportingObj):
        s = MiniLogSentry(self.miniLog, 'createSpawnInterests', parents,
                          callback.__name__, destGrid, teleportingObj)
        parentsLen = len(parents)
        if self.miniLog:
            self.miniLog.appendLine('parents - %s' % (parents, ))
            self.miniLog.appendLine('destGrid - %s' % (destGrid, ))

        if parentsLen == 0:
            logBlock(2, self.miniLog)
            callback(destGrid, teleportingObj)
        else:
            parentObj = base.cr.doId2do.get(parents[0])
            if parentObj:
                callback(parentObj, teleportingObj)
            elif parentsLen > 2 and base.cr.doId2do.has_key(parents[2]):
                base.cr.relatedObjectMgr.requestObjects(
                    [parents[0]],
                    eachCallback=lambda param1=None, param2=teleportingObj:
                    callback(param1, param2))
                localAvatar.setInterest(parents[2], parents[1],
                                        ['instanceInterest'])
            elif parentsLen > 2:
                parentParentId = parents[2]
                parentParentZone = parents[1]
            else:
                parentParentId = '<None Given>'
                parentParentZone = '<None Given>'
            parentId = parents[0]
            self.notify.warning(
                ('createSpawnInterests: parent %s of parent %s in zone %s ' +
                 'does not exist locally, aborting teleport') %
                (parentParentId, parentId, parentParentZone))
            self.failTeleport(None, None,
                              PLocalizer.TeleportGenericFailMessage)

    createSpawnInterests = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(createSpawnInterests)

    def initiateCrossShardDeploy(self,
                                 shardId=0,
                                 islandUid='',
                                 shipId=0,
                                 doneCallback=None,
                                 startedCallback=None,
                                 doEffect=True):
        if not islandUid or not shipId:
            return None

        currInteractive = base.cr.interactionMgr.getCurrentInteractive()
        if currInteractive:
            currInteractive.requestExit()

        if self.cr.activeWorld:
            fromInstanceType = self.cr.activeWorld.getType()
        else:
            fromInstanceType = PiratesGlobals.INSTANCE_NONE
        if self.amInTeleport():
            return None

        self.setAmInTeleport()
        self.doEffect = doEffect
        self.sendUpdate('requestCrossShardDeploy',
                        [shardId, islandUid, shipId])
        self.doneCallback = doneCallback
        self.startedCallback = startedCallback
        self.teleportInit(PiratesGlobals.INSTANCE_MAIN, fromInstanceType,
                          'Main World')

    def d_requestShardTeleport(self, shardId, skipConfirm=False):
        def teleportConfirmation(confirmed):
            if confirmed:
                self.sendUpdate('requestShardTeleport', [shardId])

        if skipConfirm:
            teleportConfirmation(True)
        else:
            localAvatar.confirmTeleport(teleportConfirmation, feedback=True)

    def d_requestPlayerTeleport(self, targetAvId, shardId, skipConfirm=False):
        def teleportConfirmation(confirmed):
            if confirmed:
                self.sendUpdate('requestPlayerTeleport', [targetAvId, shardId])

        if skipConfirm:
            teleportConfirmation(True)
        else:
            localAvatar.confirmTeleport(teleportConfirmation, feedback=True)

    def d_requestIslandTeleport(self, islandUid, skipConfirm=False):
        def teleportConfirmation(confirmed):
            if confirmed:
                self.sendUpdate('requestIslandTeleport', [islandUid])

        if skipConfirm:
            teleportConfirmation(True)
        else:
            localAvatar.confirmTeleport(teleportConfirmation, feedback=True)

    def d_requestInstanceTeleport(self,
                                  instanceType,
                                  instanceName,
                                  skipConfirm=False):
        def teleportConfirmation(confirmed):
            if confirmed:
                self.sendUpdate('requestInstanceTeleport',
                                [instanceType, instanceName])

        if skipConfirm:
            teleportConfirmation(True)
        else:
            localAvatar.confirmTeleport(teleportConfirmation, feedback=True)

    def notifyFriendVisit(self, avId):
        av = base.cr.identifyAvatar(avId)
        if av:
            avName = av.getName()
        else:
            avName = PLocalizer.Someone
        localAvatar.setSystemMessage(
            avId, OTPLocalizer.WhisperComingToVisit % avName)
        localAvatar.guiMgr.messageStack.addTextMessage(
            OTPLocalizer.WhisperComingToVisit % avName, icon=('friends', None))
class DistributedGAInterior(DistributedGameArea, DistributedCartesianGrid, MappableGrid):
    notify = directNotify.newCategory('DistributedGAInterior')
    
    def __init__(self, cr):
        DistributedGameArea.__init__(self, cr)
        DistributedCartesianGrid.__init__(self, cr)
        MappableGrid.__init__(self)
        self.intervals = []
        self.fadeInTrack = None
        self.autoFadeIn = True
        self.musicName = None

    
    def announceGenerate(self):
        DistributedGameArea.announceGenerate(self)
        DistributedCartesianGrid.announceGenerate(self)
        self.getParentObj().setWorldGrid(self)
        self.loadModel()
        for obj in self.geom.findAllMatches('**/=ignore-lighting'):
            obj.setLightOff(1000)
        
        doorPlanes = self.geom.findAllMatches('**/door_collision_planar_*;+s')
        doorPlanes.stash()
        base.worldCreator.registerSpecialNodes(self, self.uniqueId)
        self.builder.loadObjects()
        self.enableFloors()
        self.initBlockers(self)
        self.startCustomEffects()
        self.builder.resumeSFX()
        self.closeSfx = loadSfx(SoundGlobals.SFX_DOOR_SLAM)

    
    def disable(self):
        self.stopCustomEffects()
        self.builder.pauseSFX()
        self.unloadConnectors()
        if self.fadeInTrack:
            self.fadeInTrack.pause()
        
        self.fadeInTrack = None
        self.ignoreAll()
        DistributedGameArea.disable(self)
        DistributedCartesianGrid.disable(self)
        del self.closeSfx

    
    def delete(self):
        del self.coll
        self.geom.removeNode()
        if self.modelPath != 'models/buildings/navy_jail_interior':
            self.handleExitGameArea(None)
        
        self.fadeOutSoundAndMusic()
        self.disableFloors()
        for anim in self.intervals:
            if anim:
                anim.pause()
                del anim
                continue
        
        self.intervals = []
        DistributedGameArea.delete(self)
        DistributedCartesianGrid.delete(self)

    
    def isGrid(self):
        return DistributedCartesianGrid.isGrid(self)

    
    def setConnectorId(self, connectorId):
        self.connectorId = connectorId

    setConnectorId = report(types = [
        'frameCount',
        'args'], dConfigParam = [
        'jail',
        'teleport'])(setConnectorId)
    
    def enableFloors(self):
        return None
        floorName = 'floor_interior'
        self.uniqueFloorName = self.uniqueName(floorName)
        collNodes = self.findAllMatches('**/+CollisionNode')
        for collNode in collNodes:
            curMask = collNode.node().getIntoCollideMask()
            if curMask.hasBitsInCommon(PiratesGlobals.FloorBitmask):
                collNode.setName(self.uniqueFloorName)
                self.setupCannonballLandColl(collNode, PiratesGlobals.TargetBitmask | curMask, 0)
                continue
        
        self.accept('enterFloor' + self.uniqueFloorName, self.handleEnterGameArea)
        self.accept('exitFloor' + self.uniqueFloorName, self.handleExitGameArea)

    
    def disableFloors(self):
        return None
        if self.uniqueFloorName:
            self.ignore('enterFloor' + self.uniqueFloorName)
            self.ignore('exitFloor' + self.uniqueFloorName)
        

    
    def handleEnterGameArea(self, collEntry = None):
        self.setupMinimap()
        if self.minimap and localAvatar.getMinimapObject():
            self.minimap.addObject(localAvatar.getMinimapObject())
            localAvatar.guiMgr.setMinimap(self.minimap)
        
        DistributedGameArea.handleEnterGameArea(self, collEntry)

    handleEnterGameArea = report(types = [
        'frameCount'], dConfigParam = ('jail', 'minimap'))(handleEnterGameArea)
    
    def setLocation(self, parentId, zoneId):
        DistributedGameArea.setLocation(self, parentId, zoneId)

    
    def handleExitGameArea(self, collEntry):
        if collEntry:
            return None
        
        DistributedGameArea.handleExitGameArea(self, collEntry)

    handleExitGameArea = report(types = [
        'frameCount',
        'args'], dConfigParam = ('jail', 'minimap'))(handleExitGameArea)
    
    def loadModelParts(self):
        if self.modelPath.startswith('models/islands/pir_m_are_isl_'):
            self.geom = loader.loadModel(self.modelPath)
            return None
        
        modelBaseName = self.modelPath.split('_zero')[0]
        terrainModel = loader.loadModel(modelBaseName + '_terrain', okMissing = True)
        if terrainModel:
            self.geom = terrainModel
        else:
            self.geom = loader.loadModel(self.modelPath)
            return None
        terrainDetailModel = loader.loadModel(modelBaseName + '_terrain_detail', okMissing = True)
        if terrainDetailModel:
            self.notify.debug('loading _terrain_detail')
            terrainDetailModel.getChild(0).reparentTo(self.geom)
        
        pierModel = loader.loadModel(modelBaseName + 'pier', okMissing = True)
        if pierModel:
            self.notify.debug('loading pier')
            pierModel.getChild(0).reparentTo(self.geom)
        
        fortModel = loader.loadModel(modelBaseName + '_fort', okMissing = True)
        if fortModel:
            self.notify.debug('loading _fort')
            fortModel.getChild(0).reparentTo(self.geom)
        
        logModel = loader.loadModel(modelBaseName + '_logs', okMissing = True)
        if logModel:
            self.notify.debug('loading _logs')
            logModel.getChild(0).reparentTo(self.geom)
        
        vegeWallModel = loader.loadModel(modelBaseName + '_nat_wall', okMissing = True)
        if vegeWallModel:
            self.notify.debug('loading _nat_wall')
            vegeWallModel.getChild(0).reparentTo(self.geom)
        
        vegModel = loader.loadModel(modelBaseName + '_veg', okMissing = True)
        if vegModel:
            self.notify.debug('loading _veg')
            vegModel.getChild(0).reparentTo(self.geom)
        
        rockModel = loader.loadModel(modelBaseName + '_rocks', okMissing = True)
        if rockModel:
            self.notify.debug('loading _rocks')
            rockModel.getChild(0).reparentTo(self.geom)
        
        mapNode = self.getMapNode()
        if mapNode and not mapNode.isEmpty():
            mapNode.hide()
        

    
    def loadModel(self):
        if 'interior' not in self.modelPath:
            self.loadModelParts()
        else:
            self.geom = loader.loadModel(self.modelPath)
        self.geom.findAllMatches('**/door_hole*').setColorScale(Vec4(0, 0, 0, 1))
        self.geom.reparentTo(self)
        self.geom.hide(OTPRender.MainCameraBitmask)
        self.geom.showThrough(OTPRender.EnviroCameraBitmask)
        coll = self.geom.findAllMatches('**/+CollisionNode')
        self.coll = coll
        locatorNodes = self.geom.findAllMatches('**/portal_interior_*')
        locatorNodes.wrtReparentTo(self)
        self.locatorNodes = locatorNodes
        self.portalNodes = self.geom.findAllMatches('**/portal_[0-9]')
        self.initBlockers(self.geom)

    
    def setName(self, name):
        self.name = name

    
    def getTeam(self):
        return PiratesGlobals.ISLAND_TEAM

    
    def updateAvReturnLocation(self, av):
        av.d_requestReturnLocation(self.doId)

    updateAvReturnLocation = report(types = [
        'frameCount'], dConfigParam = 'jail')(updateAvReturnLocation)
    
    def enterInteriorFromDoor(self, doorIndex):
        base.cr.loadingScreen.showTarget(self.uniqueId)
        base.cr.loadingScreen.show()
        doorIndexStr = ''
        if doorIndex > 0:
            doorIndexStr = '_' + str(doorIndex + 1)
        
        self.doorLeftStr = '**/door_left' + doorIndexStr
        self.doorRightStr = '**/door_right' + doorIndexStr
        self.doorLocatorStr = '**/door_locator' + doorIndexStr
        doorLeft = self.geom.find(self.doorLeftStr)
        doorRight = self.geom.find(self.doorRightStr)
        self.openDoorIval = Parallel()
        self.closeDoorIval = Parallel()
        self.tOpen = 0.5
        if doorLeft:
            self.openDoorIval.append(LerpHprInterval(doorLeft, self.tOpen, Vec3(-90, 0, 0)))
            self.closeDoorIval.append(LerpHprInterval(doorLeft, self.tOpen, Vec3(0, 0, 0)))
        
        if doorRight:
            self.openDoorIval.append(LerpHprInterval(doorRight, self.tOpen, Vec3(90, 0, 0)))
            self.closeDoorIval.append(LerpHprInterval(doorRight, self.tOpen, Vec3(0, 0, 0)))
        
        doorLocator = self.geom.find(self.doorLocatorStr)
        if doorLocator.isEmpty():
            doorLocator = self.geom.find(self.doorLeftStr)
            if doorLocator.isEmpty():
                doorLocator = self.geom.find(self.doorRightStr)
            
        
        localAvatar.reparentTo(doorLocator)
        localAvatar.setPos(0, 10, 0)
        localAvatar.setHpr(0, 0, 0)
        localAvatar.wrtReparentTo(self)
        localAvatar.setP(0)
        localAvatar.setR(0)
        localAvatar.setScale(1)
        self.handleEnterGameArea(None)
        base.loadingScreen.tick()
        messenger.send('doorToInteriorFadeIn', [
            self.uniqueId])
        base.loadingScreen.tick()
        if self.autoFadeIn:
            fadeInFunc = Func(base.transitions.fadeIn, self.tOpen)
            playerStateFunc = Func(localAvatar.gameFSM.request, 'LandRoam')
        else:
            
            def Nothing():
                pass

            fadeInFunc = Func(Nothing)
        if self.autoFadeIn:
            sf = Sequence(Func(self.requestDoorInteract), fadeInFunc, self.openDoorIval, self.closeDoorIval, Func(self.closeSfx.play), Func(self.requestPlayerStateFunc))
        else:
            sf = Sequence(Func(self.requestDoorInteract), fadeInFunc, self.openDoorIval, self.closeDoorIval, Func(self.requestPlayerStateFunc))
        self.fadeInTrack = sf
        self.fadeInTrack.start()
        base.cr.loadingScreen.hide()

    
    def requestPlayerStateFunc(self):
        if localAvatar.getGameState() in [
            'Injured']:
            return None
        
        if self.autoFadeIn:
            localAvatar.gameFSM.request('LandRoam')
        

    
    def requestDoorInteract(self):
        if localAvatar.getGameState() in [
            'Injured']:
            return None
        
        localAvatar.gameFSM.request('DoorInteract')

    
    def handleChildArrive(self, childObj, zoneId):
        DistributedGameArea.handleChildArrive(self, childObj, zoneId)
        DistributedCartesianGrid.handleChildArrive(self, childObj, zoneId)
        if childObj.isLocal():
            self.updateAvReturnLocation(childObj)
            self.builder.checkForHolidayObjects()
            self.requestSoundAndMusic()
            if not self.footstepSound:
                localAvatar.setAreaFootstep('Wood')
            
            self.setupMinimap()
            if self.minimap and localAvatar.getMinimapObject():
                self.minimap.addObject(localAvatar.getMinimapObject())
                localAvatar.guiMgr.setMinimap(self.minimap)
            
        

    handleChildArrive = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'connector')(handleChildArrive)
    
    def handleChildLeave(self, childObj, zoneId):
        DistributedGameArea.handleChildLeave(self, childObj, zoneId)
        DistributedCartesianGrid.handleChildLeave(self, childObj, zoneId)
        if childObj.isLocal():
            localAvatar.guiMgr.clearMinimap(self.minimap)
            self.destroyMinimap()
            self.fadeOutSoundAndMusic()
        

    
    def loadConnectors(self):
        if 'interior' in self.modelPath and 'fortCharles_zero' in self.modelPath and 'kingshead_zero' in self.modelPath or 'pir_m_bld_int_tavernA_oneDoor' in self.modelPath:
            return None
        
        DistributedGameArea.loadConnectors(self)

    loadConnectors = report(types = [
        'frameCount',
        'args'], dConfigParam = [
        'jail',
        'teleport'])(loadConnectors)
    
    def unloadConnectors(self):
        if 'interior' in self.modelPath and 'fortCharles_zero' in self.modelPath and 'kingshead_zero' in self.modelPath or 'pir_m_bld_int_tavernA_oneDoor' in self.modelPath:
            return None
        
        DistributedGameArea.unloadConnectors(self)

    unloadConnectors = report(types = [
        'frameCount',
        'args'], dConfigParam = [
        'jail',
        'teleport'])(unloadConnectors)
    
    def setAutoFadeInOnEnter(self, autoFadeIn):
        self.autoFadeIn = autoFadeIn

    
    def getTeleportDestPosH(self, index = 0):
        pt = self._getTunnelSpawnPos(index)
        if pt == None:
            pt = self._getDoorSpawnPos(index)
        
        return (pt[0], pt[1], pt[2], 0)

    
    def _getDoorSpawnPos(self, index = 0):
        doorIndexStr = ''
        if index > 0:
            index = '_' + str(index + 1)
        
        doorLocatorStr = '**/door_locator' + doorIndexStr
        doorLocator = self.find(doorLocatorStr)
        if doorLocator.isEmpty():
            doorLocator = self.find(self.doorLeftStr)
            if doorLocator.isEmpty():
                doorLocator = self.find(self.doorRightStr)
            
        
        return self.getRelativePoint(doorLocator, Point3(0, 10, 0))

    
    def handleOnStage(self):
        self.unstash()
        self.loadConnectors()
        DistributedGameArea.handleOnStage(self)
        DistributedCartesianGrid.handleOnStage(self)

    handleOnStage = report(types = [
        'args'], dConfigParam = [
        'dteleport'])(handleOnStage)
    
    def handleOffStage(self, av = None):
        self.stash()
        DistributedGameArea.handleOffStage(self)
        DistributedCartesianGrid.handleOffStage(self)

    handleOffStage = report(types = [
        'args'], dConfigParam = [
        'dteleport'])(handleOffStage)
    
    def getLevel(self):
        return 1

    
    def handleLowTerrainDetail(self):
        grids = self.findAllMatches('**/Grid-*')
        for dl in self.builder.dynamicLights:
            if dl.type != 0:
                for gi in range(0, grids.getNumPaths()):
                    geomParent = grids[gi].getChild(0)
                    geomParent.setLightOff(dl.lightNodePath)
                    for ci in range(0, geomParent.getNumChildren()):
                        geoms = geomParent.getChild(ci)
                        geoms.setLightOff(dl.lightNodePath)
                    
                
        

    
    def requestSoundAndMusic(self):
        self.ambientName = SoundGlobals.getAmbientFromStr(self.modelPath)
        if not self.ambientName == SoundGlobals.AMBIENT_JUNGLE and self.ambientName == SoundGlobals.AMBIENT_CAVE or self.ambientName == SoundGlobals.AMBIENT_SWAMP:
            base.ambientMgr.requestFadeIn(self.ambientName, finalVolume = PiratesGlobals.DEFAULT_AMBIENT_VOLUME)
        
        if self.musicName:
            base.musicMgr.requestFadeOut(self.musicName)
            self.musicName = None
        
        if self.uniqueId == LocationIds.RAMBLESHACK_INSIDE and localAvatar.getTutorialState() < 2:
            self.musicName = SoundGlobals.MUSIC_COMBAT_A
            base.musicMgr.request(self.musicName, priority = 1, volume = 0.29999999999999999)
        elif 'tavern' in self.modelPath:
            self.musicName = random.choice((SoundGlobals.MUSIC_TAVERN_A, SoundGlobals.MUSIC_TAVERN_B, SoundGlobals.MUSIC_TAVERN_C))
            base.musicMgr.request(self.musicName, priority = 1, volume = 0.5)
        

    
    def fadeOutSoundAndMusic(self):
        if hasattr(self, 'ambientName'):
            if not self.ambientName == SoundGlobals.AMBIENT_JUNGLE and self.ambientName == SoundGlobals.AMBIENT_CAVE:
                pass
            if not (self.ambientName == SoundGlobals.AMBIENT_SWAMP):
                base.ambientMgr.requestFadeOut(self.ambientName)
            
        if self.musicName:
            base.musicMgr.requestFadeOut(self.musicName)
            self.musicName = None
        

    
    def setupMinimap(self):
        if not (self.minimap) and self.getMapNode():
            self.minimap = InteriorMap(self)
        

    setupMinimap = report(types = [
        'frameCount',
        'args'], dConfigParam = 'minimap')(setupMinimap)
    
    def destroyMinimap(self):
        if self.minimap:
            self.minimap.destroy()
            self.minimap = None
        

    destroyMinimap = report(types = [
        'frameCount',
        'args'], dConfigParam = 'minimap')(destroyMinimap)
    
    def getGridParameters(self):
        return (self.cellWidth, self.viewingRadius)

    
    def getTunnelNodes(self):
        return self.locatorNodes

    
    def isInInvasion(self):
        return False

    
    def getArmorScale(self):
        return 1.0
class QuestIndicatorGridNode(QuestIndicatorNode):
    
    def __init__(self, name, zoneRadii, questStep):
        self.pendingStepObj = None
        self.stepObj = None
        QuestIndicatorNode.__init__(self, name, zoneRadii, questStep)

    
    def delete(self):
        self.ignoreAll()
        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None
        
        QuestIndicatorNode.delete(self)

    delete = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(delete)
    
    def placeInWorld(self):
        if self.stepObj:
            self.reparentTo(self.stepObj)
            self.setPos(0, 0, 0)
            self.setHpr(0, 0, 0)
            self.setScale(render, 1)
        elif self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None
        
        questStepDoId = self.questStep.getStepDoId()
        self.pendingStepObj = base.cr.relatedObjectMgr.requestObjects([
            questStepDoId], eachCallback = self.stepObjArrived)
        if self.stepObj:
            return None
        
        originObj = base.cr.doId2do.get(self.questStep.getOriginDoId())
        if originObj:
            posH = self.questStep.getPosH()
            pos = posH[:3]
            h = posH[3]
            self.reparentTo(originObj)
            self.setPos(*pos)
            self.setHpr(h, 0, 0)
            self.setScale(render, 1)
        

    placeInWorld = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(placeInWorld)
    
    def loadZoneLevel(self, level):
        QuestIndicatorNode.loadZoneLevel(self, level)
        if level == 0:
            self.request('At')
        
        if level == 1:
            self.request('Near')
        
        if level == 2:
            self.request('Far')
        

    loadZoneLevel = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(loadZoneLevel)
    
    def unloadZoneLevel(self, level):
        QuestIndicatorNode.unloadZoneLevel(self, level)
        if level == 0:
            self.request('Near')
        
        if level == 1:
            self.request('Far')
        
        if level == 2:
            self.request('Off')
        

    unloadZoneLevel = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(unloadZoneLevel)
    
    def enterFar(self):
        QuestIndicatorNode.enterFar(self)

    enterFar = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(enterFar)
    
    def exitFar(self):
        QuestIndicatorNode.exitFar(self)

    exitFar = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(exitFar)
    
    def enterNear(self):
        QuestIndicatorNode.enterNear(self)

    enterNear = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(enterNear)
    
    def exitNear(self):
        QuestIndicatorNode.exitNear(self)

    exitNear = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(exitNear)
    
    def enterAt(self):
        QuestIndicatorNode.enterAt(self)

    enterAt = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(enterAt)
    
    def exitAt(self):
        QuestIndicatorNode.exitAt(self)

    exitAt = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(exitAt)
    
    def _reparentFarEffectToSelf(self):
        if self.farEffect:
            self.farEffect.wrtReparentTo(self)
        

    _reparentFarEffectToSelf = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(_reparentFarEffectToSelf)
    
    def _reparentFarEffectToOriginObj(self, stepObj):
        if self.farEffect:
            self.farEffect.wrtReparentTo(stepObj.getParent())
        

    _reparentFarEffectToOriginObj = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(_reparentFarEffectToOriginObj)
    
    def stepObjArrived(self, stepObj):
        self.pendingStepObj = None
        self.stepObj = stepObj
        self.accept(stepObj.getDisableEvent(), self.stepObjLeft)
        self.placeInWorld()

    stepObjArrived = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(stepObjArrived)
    
    def stepObjLeft(self):
        self.stepObj = None
        self.placeInWorld()

    stepObjLeft = report(types = [
        'frameCount',
        'args'], dConfigParam = 'quest-indicator')(stepObjLeft)
Example #32
0
class DistributedCartesianGrid(DistributedNode, CartesianGridBase):
    notify = directNotify.newCategory('DistributedCartesianGrid')
    notify.setDebug(0)
    VisualizeGrid = config.GetBool('visualize-cartesian-grid', 0)
    RuleSeparator = ':'

    def __init__(self, cr):
        DistributedNode.__init__(self, cr)
        self.visAvatar = None
        self.gridVisContext = None
        self._onOffState = False

    def generate(self):
        DistributedNode.generate(self)

    def disable(self):
        DistributedNode.disable(self)
        self.stopProcessVisibility()

    def delete(self):
        DistributedNode.delete(self)
        taskMgr.remove(self.taskName('processVisibility'))

    def isGridParent(self):
        return 1

    def setCellWidth(self, width):
        self.cellWidth = width

    def setParentingRules(self, style, rule):
        rules = rule.split(self.RuleSeparator)
        self.style = style
        self.startingZone = int(rules[0])
        self.gridSize = int(rules[1])
        self.viewingRadius = int(rules[2])
        cx = self.cellWidth * self.gridSize / 2.0
        self.centerPos = Vec3(cx, cx, 0)

    def getCenterPos(self):
        return self.centerPos

    def handleChildArrive(self, child, zoneId):
        DistributedNode.handleChildArrive(self, child, zoneId)
        if zoneId >= self.startingZone:
            if not child.gridParent:
                child.gridParent = GridParent(child)

            child.gridParent.setGridParent(self, zoneId)
        elif child.gridParent:
            child.gridParent.delete()
            child.gridParent = None

    def handleChildArriveZone(self, child, zoneId):
        DistributedNode.handleChildArrive(self, child, zoneId)
        if zoneId >= self.startingZone:
            if not child.gridParent:
                child.gridParent = GridParent(child)

            child.gridParent.setGridParent(self, zoneId)
        elif child.gridParent:
            child.gridParent.delete()
            child.gridParent = None

    def handleChildLeave(self, child, zoneId):
        if child.gridParent:
            child.gridParent.delete()
            child.gridParent = None

    def startProcessVisibility(self, avatar):
        if not self._onOffState:
            return None

        if self.cr.noNewInterests():
            self.notify.warning(
                'startProcessVisibility(%s): tried to open a new interest during logout'
                % self.doId)
            return None

        taskMgr.remove(self.taskName('processVisibility'))
        self.acceptOnce(self.cr.StopVisibilityEvent,
                        self.stopProcessVisibility)
        self.visAvatar = avatar
        self.visZone = None
        self.visDirty = True
        taskMgr.add(self.processVisibility, self.taskName('processVisibility'))
        self.processVisibility(0)

    startProcessVisibility = report(types=['deltaStamp', 'avLocation', 'args'],
                                    dConfigParam=['connector', 'shipboard'
                                                  ])(startProcessVisibility)

    def stopProcessVisibility(self, clearAll=False, event=None):
        self.ignore(self.cr.StopVisibilityEvent)
        taskMgr.remove(self.taskName('processVisibility'))
        if event is not None:
            eventGroup = EventGroup('DistCartesianGrid.stopProcessVis',
                                    doneEvent=event)

        if self.gridVisContext is not None:
            if event is not None:
                removeEvent = eventGroup.newEvent('%s.removeInterest' %
                                                  self.doId)
            else:
                removeEvent = None
            self.cr.removeInterest(self.gridVisContext, removeEvent)
            self.gridVisContext = None
        elif event is not None:
            messenger.send(event)

        self.visAvatar = None
        self.visZone = None
        if clearAll:
            if event is not None:
                parentEvent = eventGroup.newEvent('%s.parent.removeInterest' %
                                                  self.doId)
            else:
                parentEvent = None
            if hasattr(self.cr.doId2do[self.parentId], 'worldGrid'):
                self.cr.doId2do[self.parentId].worldGrid.stopProcessVisibility(
                    event=parentEvent)

    stopProcessVisibility = report(types=['deltaStamp', 'avLocation', 'args'],
                                   dConfigParam=['connector', 'shipboard'
                                                 ])(stopProcessVisibility)

    def processVisibility(self, task):
        if self.visAvatar == None:
            return Task.done

        if self.visAvatar.isDisabled():
            self.visAvatar = None
            return Task.done

        if self.visAvatar.gameFSM.state == 'Cutscene':
            return Task.cont

        pos = self.visAvatar.getPos(self)
        dx = self.cellWidth * self.gridSize * 0.5
        x = pos[0] + dx
        y = pos[1] + dx
        col = x // self.cellWidth
        row = y // self.cellWidth
        if row < 0 and col < 0 and row > self.gridSize or col > self.gridSize:
            if self.gridVisContext:
                self.cr.removeInterest(self.gridVisContext)
                self.visZone = None
                self.gridVisContext = None

            return Task.cont

        zoneId = int(self.startingZone + row * self.gridSize + col)
        if zoneId == self.visZone:
            if self.visDirty:
                messenger.send(self.uniqueName('visibility'))
                self.visDirty = False

            return Task.cont
        else:
            self.visZone = zoneId
            if not self.gridVisContext:
                self.gridVisContext = self.cr.addInterest(
                    self.getDoId(),
                    self.visZone,
                    self.uniqueName('visibility'),
                    event=self.uniqueName('visibility'))
            else:
                event = None
                if self.visDirty:
                    event = self.uniqueName('visibility')

                self.cr.alterInterest(self.gridVisContext,
                                      self.getDoId(),
                                      self.visZone,
                                      event=event)
                parentId = self.visAvatar.parentId
                oldZoneId = self.visAvatar.zoneId
                if parentId == self.doId:
                    messenger.send('avatarZoneChanged',
                                   [self.visAvatar, self.doId, zoneId])

            self.visDirty = False
            return Task.cont

    def addObjectToGrid(self, av):
        pos = av.getPos(self)
        zoneId = self.getZoneFromXYZ(pos)
        messenger.send('avatarZoneChanged', [av, self.doId, zoneId])

    def removeObjectFromGrid(self, av):
        if av.getParent().compareTo(self) == 0:
            av.detachNode()

    def handleAvatarZoneChange(self, av, zoneId):
        if not self.isValidZone(zoneId):
            return None

        av.b_setLocation(self.doId, zoneId)

    def turnOff(self):
        self._onOffState = False
        self.stopProcessVisibility()

    def turnOn(self, av=None):
        self._onOffState = True
        if av:
            self.startProcessVisibility(av)

    def setWorldContext(self, worldContext):
        pass

    def clearWorldContext(self, event=None):
        pass
Example #33
0
class DistributedGATunnel(DistributedGAConnector.DistributedGAConnector):
    notify = directNotify.newCategory('DistributedGATunnel')

    def __init__(self, cr):
        DistributedGAConnector.DistributedGAConnector.__init__(
            self, cr, 'DistributedGATunnel')
        self.builder = GridAreaBuilder.GridAreaBuilder(self)
        self.loadSphere = [None, None]
        self.unloadSphere = None
        self.connectorNodes = ['portal_connector_1', 'portal_connector_2']
        self.ambientNames = [None, None]
        self.avatarZoneContext = None
        self.ownContext = None
        self.floorIndex = -1
        self.lastFloor = -1
        self.lastFloorTime = 0
        self.loadedAreaDoId = 0
        self.floorNames = []
        self.quickLoadActive = False

    def generate(self):
        DistributedGAConnector.DistributedGAConnector.generate(self)
        self._DistributedGATunnel__startProcessVisibility()

    def announceGenerate(self):
        DistributedGAConnector.DistributedGAConnector.announceGenerate(self)
        self.geom.hide(OTPRender.MainCameraBitmask)
        self.geom.showThrough(OTPRender.EnviroCameraBitmask)

    def disable(self):
        DistributedGAConnector.DistributedGAConnector.disable(self)

    def delete(self):
        self._DistributedGATunnel__stopProcessVisibility()
        if self.ownContext:
            self.cr.removeInterest(self.ownContext)
            self.ownContext = None

        for sphere in self.loadSphere:
            if sphere:
                sphere.removeNode()
                continue

        del self.loadSphere
        self.fadeoutAllAmbient()
        DistributedGAConnector.DistributedGAConnector.delete(self)
        self.builder.delete()

    def loadModel(self):
        DistributedGAConnector.DistributedGAConnector.loadModel(self)

    def _DistributedGATunnel__startProcessVisibility(self):
        if not (self.avatarZoneContext) and self.isGenerated():
            self.avatarZoneContext = self.cr.addInterest(
                self.getDoId(), 500, self.uniqueName('visibility'))

    def _DistributedGATunnel__stopProcessVisibility(self):
        if self.avatarZoneContext:
            self.cr.removeInterest(self.avatarZoneContext)
            self.avatarZoneContext = None

    def setupCollisions(self):
        if self.floorNames == []:
            self.floorNames = [
                'collision_floor_1', 'collision_floor_2',
                'collision_floor_middle'
            ]

        floors = []
        for i in range(len(self.floorNames)):
            floorName = self.floorNames[i]
            floor = self.find('**/' + floorName)
            uniqueFloorName = self.uniqueName(floorName)
            floor.setName(uniqueFloorName)
            self.floorNames[i] = uniqueFloorName
            self.accept('enterFloor' + uniqueFloorName,
                        self._DistributedGATunnel__handleOnFloor,
                        extraArgs=[i])

    def unloadWorldFinished(self, areaDoId):
        DistributedGAConnector.DistributedGAConnector.unloadWorldFinished(
            self, areaDoId)
        self.loadArea(self.floorIndex, False)

    unloadWorldFinished = report(types=['frameCount', 'printInterests'],
                                 dConfigParam='connector')(unloadWorldFinished)

    def fadeOutAmbient(self, index):
        if self.ambientNames[index]:
            base.ambientMgr.requestFadeOut(self.ambientNames[index],
                                           duration=0.01)

        if self.ambientNames[1 - index]:
            base.ambientMgr.requestChangeVolume(self.ambientNames[1 - index],
                                                duration=0,
                                                finalVolume=0)

    def fadeInAmbient(self, index):
        if self.ambientNames[index]:
            base.ambientMgr.requestChangeVolume(
                self.ambientNames[index],
                duration=0.10000000000000001,
                finalVolume=PiratesGlobals.DEFAULT_AMBIENT_VOLUME_NEAR)

    def __handleOnFloor(self, areaIndex, collEntry):
        if (not collEntry or areaIndex in (0, 1)
            ) and not localAvatar.testTeleportFlag(PiratesGlobals.TFInTunnel):
            if not self.ownContext:
                (parent, zone) = self.getLocation()
                self.ownContext = self.cr.addInterest(parent, zone,
                                                      'tunnelSelfInterest')

            def enterTunnelFinished():
                if localAvatar.getGameState() in ('EnterTunnel', 'Off',
                                                  'Dialog', 'Cutscene',
                                                  'LandRoam'):
                    localAvatar.b_setLocation(self.doId, 500)
                    self.floorIndex = 1 - areaIndex
                    self.unloadLoadedArea()
                    if localAvatar.gameFSM.preTunnelState:
                        localAvatar.b_setGameState(
                            localAvatar.gameFSM.preTunnelState)
                    else:
                        localAvatar.b_setGameState('LandRoam')

            if collEntry != None:
                area = self.getLoadedArea()
                if not area:
                    self.notify.warning(
                        '***JCW*** No loaded area in GATunnel: %s' %
                        self.getUniqueId())
                    self.notify.warning('***JCW*** Areas: %s, %s' %
                                        (self.areaUid[0], self.areaUid[1]))
                    self.notify.warning(
                        '***JCW*** Ignoring __handleOnFloor(%s) event' %
                        areaIndex)
                    return None

                entranceNode = self.areaNode[areaIndex]
                entryLocator = area.find('**/' + entranceNode + '*')
                if entryLocator.isEmpty():
                    return None

                camera.wrtReparentTo(render)
                localAvatar.lookAt(entryLocator, -50, 0,
                                   localAvatar.getZ(entryLocator))
                camera.wrtReparentTo(localAvatar)
                self.acceptOnce('EnterTunnelFinished', enterTunnelFinished)
                localAvatar.gameFSM.preTunnelState = localAvatar.getGameState()
                localAvatar.b_setGameState('EnterTunnel')
            else:
                base.transitions.fadeOut(0.75, Func(enterTunnelFinished))
            localAvatar.motionFSM.off()
            localAvatar.b_setTeleportFlag(PiratesGlobals.TFInTunnel)

    _DistributedGATunnel__handleOnFloor = report(
        types=['frameCount',
               'printInterests'], dConfigParam='connector')(__handleOnFloor)

    def loadAreaFinished(self, area, autoFadeIn=True):
        def leaveTunnel():
            areaIndex = self.getAreaIndex(area)
            entranceNode = self.areaNode[areaIndex]
            entryLocator = area.find('**/' + entranceNode + '*')
            localAvatar.reparentTo(entryLocator)
            localAvatar.setPos(0, 0, 0)
            if not autoFadeIn:
                if localAvatar.style.tutorial == PiratesGlobals.TUT_KILLED_1_SKELETON:
                    localAvatar.setX(30)
                    localAvatar.setH(90)

            else:
                localAvatar.setH(-90)
            localAvatar.wrtReparentTo(area)
            if autoFadeIn:

                def leaveTunnelFinished():
                    localAvatar.b_clearTeleportFlag(PiratesGlobals.TFInTunnel)
                    if localAvatar.gameFSM.preTunnelState:
                        localAvatar.b_setGameState(
                            localAvatar.gameFSM.preTunnelState)
                        if localAvatar.gameFSM.preTunnelState == 'Battle':
                            localAvatar.guiMgr.combatTray.toggleWeapon(
                                localAvatar.currentWeaponId,
                                localAvatar.currentWeaponSlotId)

                    else:
                        localAvatar.b_setGameState('LandRoam')

                self.acceptOnce('LeaveTunnelFinished', leaveTunnelFinished)
                base.localAvatar.b_setGameState('LeaveTunnel')
            else:
                self.sendUpdate('sendLeaveTunnelDone')
            self.fadeInAmbient(self.floorIndex)

        leaveTunnel = report(types=['frameCount', 'printInterests'],
                             dConfigParam='connector')(leaveTunnel)
        base.cr.setAllInterestsCompleteCallback(leaveTunnel)
        transform = localAvatar.getTransform(self)
        DistributedGAConnector.DistributedGAConnector.loadAreaFinished(
            self, area, autoFadeIn)
        self.lastFloorTime = globalClock.getFrameTime()
        self.loadedAreaDoId = area.doId
        localAvatar.setTransform(self, transform)
        localAvatar.wrtReparentTo(area)
        area.handleEnterGameArea(None)

    loadAreaFinished = report(types=['frameCount', 'printInterests'],
                              dConfigParam='connector')(loadAreaFinished)

    def handleChildArrive(self, childObj, zoneId):
        DistributedGAConnector.DistributedGAConnector.handleChildArrive(
            self, childObj, zoneId)
        if childObj.isLocal():
            childObj.wrtReparentTo(self)

    handleChildArrive = report(types=['frameCount'],
                               dConfigParam='connector')(handleChildArrive)

    def handleChildLeave(self, childObj, zoneId):
        DistributedGAConnector.DistributedGAConnector.handleChildLeave(
            self, childObj, zoneId)
        if childObj.isLocal():
            if self.ownContext:
                self.cr.removeInterest(self.ownContext)
                self.ownContext = None

    handleChildLeave = report(types=['frameCount'],
                              dConfigParam='connector')(handleChildLeave)

    def fadeoutAllAmbient(self):
        if self.lastFloor >= 0:
            for ambientName in self.ambientNames:
                if ambientName:
                    base.ambientMgr.requestFadeOut(ambientName)
                    continue

    def setLinks(self, isExterior, exteriorUid, links):
        DistributedGAConnector.DistributedGAConnector.setLinks(
            self, isExterior, exteriorUid, links)
        self.calcAmbientNames()

    def calcOneAmbientName(self, area):
        retval = None
        if area:
            parts = area.split('_')
            retval = SoundGlobals.getAmbientFromStr(parts[-1])

        return retval

    def calcAmbientNames(self):
        for i in xrange(2):
            area = self.areaNode[i]
            ambientName = self.calcOneAmbientName(area)
            self.ambientNames[i] = ambientName

        if not self.ambientNames[0] and not self.ambientNames[1]:
            self.ambientNames[1] = SoundGlobals.getAmbientFromStr(
                self.modelPath)
            self.notify.debug('Assuming self.ambientNames[1] = %s' %
                              self.ambientNames[1])

    def quickLoadOtherSide(self):
        base.cr.loadingScreen.show(waitForLocation=True)
        if self.floorIndex != -1:
            self._DistributedGATunnel__handleOnFloor(self.floorIndex, None)

    def turnOn(self):
        DistributedGAConnector.DistributedGAConnector.turnOn(self)
        self._DistributedGATunnel__startProcessVisibility()

    turnOn = report(types=['frameCount'], dConfigParam='connector')(turnOn)

    def turnOff(self):
        self._DistributedGATunnel__stopProcessVisibility()
        DistributedGAConnector.DistributedGAConnector.turnOff(self)

    turnOff = report(types=['frameCount'], dConfigParam='connector')(turnOff)

    def isGridParent(self):
        return 0
Example #34
0
class ReducedAnimationMixer(AnimationMixer):
    
    def __init__(self, actor):
        AnimationMixer.__init__(self, actor)
        self.actionAnim = None
        self.loopAnim = None
        self.loopOp = None
        self.loopArgs = ()
        self.loopKw = { }
        self._ReducedAnimationMixer__actionContext = 0

    __init__ = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__init__)
    
    def __str__(self):
        outStr = '(%s: %s)\n' % (self.__class__.__name__, `self.actor`)
        outStr += 'actionAnim: %s\n' % (self.actionAnim,)
        if self.loopOp:
            outStr += 'loopStatus: %s(%s, %s, %s)\n' % (self.loopOp.__name__, self.loopAnim, self.loopArgs, self.loopKw)
        else:
            outStr += 'loopStatus: None\n'
        outStr += '\nOwned Intervals\n-------------------------------\n'
        for ival in self.ownedIvals:
            outStr += `ival` + ': isPlaying = ' + `ival.isPlaying()` + '\n'
        
        return outStr

    
    def nextActionContext(self):
        self._ReducedAnimationMixer__actionContext += 1
        return self._ReducedAnimationMixer__actionContext

    
    def setAction(self, anim, context):
        if context >= self._ReducedAnimationMixer__actionContext:
            self.actionAnim = anim
            self.actor.setControlEffect(anim, 1)
        

    setAction = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(setAction)
    
    def clearAction(self, context):
        if context >= self._ReducedAnimationMixer__actionContext:
            if self.actionAnim:
                self.stop(self.actionAnim)
            
            self.actionAnim = None
            self._ReducedAnimationMixer__startLoopIfAble()
        

    clearAction = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(clearAction)
    
    def setLoop(self, loopOp, anim, *args, **kw):
        self.clearLoop()
        self.loopOp = loopOp
        self.loopAnim = anim
        self.loopArgs = args
        self.loopKw = kw
        self._ReducedAnimationMixer__startLoopIfAble()
        self.actor.setControlEffect(anim, 1)

    setLoop = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(setLoop)
    
    def __startLoopIfAble(self):
        if not (self.actionAnim) and self.loopOp:
            self.loopOp(self.actor, self.loopAnim, *self.loopArgs, **self.loopArgs)
        

    _ReducedAnimationMixer__startLoopIfAble = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__startLoopIfAble)
    
    def clearLoop(self):
        if self.loopAnim:
            self.loopAnim = None
            self.loopOp = None
        

    clearLoop = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(clearLoop)
    
    def __getPlayIval(self, newAnim, fromFrame, toFrame, duration = 0):
        pDuration = duration
        if not pDuration:
            pDuration = Actor.getDuration(self.actor, newAnim, None, fromFrame, toFrame)
        
        if pDuration == None:
            return Sequence()
        
        if pDuration == 0.0:
            return Sequence()
        
        playRate = Actor.getPlayRate(self.actor, newAnim)
        if playRate:
            pDuration /= abs(playRate)
        
        context = self.nextActionContext()
        return Sequence(Func(self.setAction, newAnim, context), Wait(pDuration + 1), Func(self.clearAction, context))

    _ReducedAnimationMixer__getPlayIval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__getPlayIval)
    
    def __processActorInterval(self, actorInterval):
        actorInterval.resetControls(None)
        context = self.nextActionContext()
        return Sequence(Func(self.setAction, actorInterval.animName, context), actorInterval, Func(self.clearAction, context))

    _ReducedAnimationMixer__processActorInterval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(__processActorInterval)
    
    def play(self, newAnim, fromFrame = None, toFrame = None, blendInT = 0, blendOutT = 0, blendInto = None):
        ival = self._ReducedAnimationMixer__getPlayIval(newAnim, fromFrame, toFrame)
        if ival:
            Actor.play(self.actor, newAnim, fromFrame = fromFrame, toFrame = toFrame)
            ival.start()
            ival.setT(0.01)
            self.addIvalToOwnedList(ival)
        

    play = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(play)
    
    def loop(self, newAnim, rate = 1.0, restart = True, fromFrame = None, toFrame = None, blendT = 0, blendDelay = 0):
        self.setLoop(Actor.loop, newAnim, restart = restart, fromFrame = fromFrame, toFrame = toFrame)
        Actor.loop(self.actor, newAnim, restart = restart, fromFrame = fromFrame, toFrame = toFrame)
        self.actor.setPlayRate(rate, newAnim)

    loop = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(loop)
    
    def pingpong(self, newAnim, rate = 1.0, fromFrame = None, toFrame = None, blendT = 0):
        self.setLoop(Actor.pingpong, newAnim, fromFrame = fromFrame, toFrame = toFrame)
        Actor.pingpong(self.actor, newAnim, fromFrame = fromFrame, toFrame = toFrame)
        self.actor.setPlayRate(rate, newAnim)

    pingpong = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(pingpong)
    
    def pose(self, newAnim, frame, partName = None, blendT = 0):
        self.setLoop(Actor.pose, newAnim, frame)
        Actor.pose(self.actor, newAnim, frame)

    pose = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(pose)
    
    def actorInterval(self, actorInterval, partName = None, blendInT = 0, blendOutT = 0, blendInto = None):
        return self._ReducedAnimationMixer__processActorInterval(actorInterval)

    actorInterval = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(actorInterval)
    
    def cleanup(self):
        self.clearAction(self.nextActionContext())
        self.clearLoop()
        AnimationMixer.cleanup(self)
        Actor.setControlEffect(self.actor, None, 1.0)

    cleanup = report(types = [
        'deltaStamp',
        'args'], dConfigParam = 'animmixer')(cleanup)
Example #35
0
class GameFSMShip(FSM.FSM):
    def __init__(self, ship):
        FSM.FSM.__init__(self, 'GameFSMShip')
        self.ship = ship
        self.risingIval = None
        self.sinkIval = None
        self.fadeIval = None
        self.currentMusic = None
        self.grappleSfx = None
        self.targetSphereStr = 'grappleTargetSphere'
        self.targets = []
        self.pendingAddTarget = None

    def cleanup(self):
        if self.pendingAddTarget:
            base.cr.relatedObjectMgr.abortRequest(self.pendingAddTarget)
            self.pendingAddTarget = None

        self.removeTargets()
        if self.risingIval:
            self.risingIval.finish()
            self.risingIval = None

        if self.sinkIval:
            self.sinkIval.finish()
            self.sinkIval = None

        if self.fadeIval:
            self.fadeIval.finish()
            self.fadeIval = None

        FSM.FSM.cleanup(self)
        self.ship = None

    def enterNeutral(self):
        pass

    def exitNeutral(self):
        pass

    def enterSpawn(self):
        pass

    def exitSpawn(self):
        pass

    def enterAdrift(self):
        pass

    def exitAdrift(self):
        pass

    def enterAISteering(self, avId):
        self.ship.startSmooth()
        self.ship.clientSteeringBegin(avId)

    def exitAISteering(self):
        self.ship.stopSmooth()
        self.ship.clientSteeringEnd()

    def enterClientSteering(self, avId):
        self.ship.clientSteeringBegin(avId)

    enterClientSteering = report(types=['frameCount', 'deltaStamp', 'args'],
                                 dConfigParam='shipboard')(enterClientSteering)

    def exitClientSteering(self):
        if self.ship.wheel and self.ship.wheel[1]:
            if base.cr.interactionMgr.getCurrentInteractive() is self:
                self.ship.wheel[1].requestExit()
            else:
                self.ship.wheel[1].refreshState()

        self.ship.clientSteeringEnd()

    exitClientSteering = report(types=['frameCount', 'deltaStamp', 'args'],
                                dConfigParam='shipboard')(exitClientSteering)

    def enterDocked(self):
        self.ship.rollupSails()

    def exitDocked(self):
        pass

    def enterPinned(self):
        self.ship.actorNode.getPhysicsObject().setVelocity(Vec3.zero())
        if self.ship.isInCrew(localAvatar.doId):
            base.musicMgr.requestFadeOut(self.currentMusic)
            self.currentMusic = SoundGlobals.MUSIC_AMBUSH
            base.musicMgr.request(self.currentMusic, priority=1)

        self.ship.rollupSails()
        self.ship.disableWheelInteraction()

    def exitPinned(self):
        self.fadeOutMusicIfInCrew()
        self.ship.enableWheelInteraction()

    def enterEnsnared(self):
        if self.ship.isInCrew(localAvatar.doId):
            base.musicMgr.requestFadeOut(self.currentMusic)
            self.currentMusic = SoundGlobals.MUSIC_SHIP_ENSNARED
            base.musicMgr.request(self.currentMusic, priority=1)

        if self.risingIval:
            self.risingIval.finish()
            self.risingIval = None

        sinking = Sequence(
            LerpPosInterval(self.ship, 1.0, Point3(0.0, 0, -3.0)))
        listing = Sequence(LerpHprInterval(self.ship, 1.0, Vec3(0, 0, 10)))
        self.sinkIval = Parallel(sinking, listing)
        self.sinkIval.start()

    def exitEnsnared(self):
        self.fadeOutMusicIfInCrew()
        if self.sinkIval:
            self.sinkIval.finish()
            self.sinkIval = None

        rising = Sequence(LerpPosInterval(self.ship, 1.0, Point3(0, 0, 0)))
        unlisting = Sequence(LerpHprInterval(self.ship, 1.0, Vec3(0, 0, 0)))
        self.riseIval = Parallel(rising, unlisting)
        self.riseIval.start()

    def enterShoveOff(self):
        pass

    def exitShoveOff(self):
        pass

    def enterFollow(self):
        self.ship.startSmooth()

    def exitFollow(self):
        self.ship.stopSmooth()

    def enterFadeOut(self):
        self.ship.model.modelRoot.setTransparency(1, 100000)
        self.fadeIval = LerpColorScaleInterval(self.ship.model.modelRoot, 5,
                                               Vec4(1.0, 1.0, 1.0, 0.0))
        self.fadeIval.start()

    def exitFadeOut(self):
        if self.fadeIval:
            self.fadeIval.finish()
            self.fadeIval = None

    def enterSinking(self):
        actorNode = self.ship.getActorNode()
        if actorNode:
            actorNode.getPhysicsObject().setVelocity(Vec3.zero())

        self.ship.registerMainBuiltFunction(self.ship.sinkingBegin)
        if self.ship.isInCrew(localAvatar.doId):
            base.musicMgr.requestFadeOut(self.currentMusic)
            self.currentMusic = SoundGlobals.MUSIC_DEATH
            base.musicMgr.request(self.currentMusic, priority=2, looping=0)

    def exitSinking(self):
        self.ship.sinkingEnd()
        self.fadeOutMusicIfInCrew()

    def enterSunk(self):
        pass

    def enterRecoverFromSunk(self):
        self.ship.recoverFromSunk()

    def enterInBoardingPosition(self):
        pass

    def exitInBoardingPosition(self):
        pass

    def enterPathFollow(self):
        self.ship.startSmooth()

    def exitPathFollow(self):
        self.ship.stopSmooth()

    def enterCannonDefenseFollowPath(self):
        self.ship.startSmooth()

    def exitCannonDefenseFollowPath(self):
        self.ship.stopSmooth()

    def enterPatrol(self):
        self.ship.startSmooth()

    def exitPatrol(self):
        self.ship.stopSmooth()

    def enterAttackChase(self):
        self.ship.startSmooth()

    def exitAttackChase(self):
        self.ship.stopSmooth()

    def enterOff(self):
        self.ship.stopAutoSailing()

    def exitOff(self):
        messenger.send('shipStateOn-%s' % self.ship.doId, [self.ship])

    def enterPutAway(self):
        self.ship.stopAutoSailing()

    def exitPutAway(self):
        pass

    def enterScriptedMovement(self):
        self.ship.startSmooth()

    def exitScriptedMovement(self):
        self.ship.stopSmooth()

    def initAudio(self):
        base.ambientMgr.requestFadeIn(SoundGlobals.AMBIENT_SHIP)
        self.currentMusic = random.choice(
            (SoundGlobals.MUSIC_SAILING_A, SoundGlobals.MUSIC_SAILING_B,
             SoundGlobals.MUSIC_SAILING_C))
        base.musicMgr.request(self.currentMusic,
                              priority=0,
                              volume=0.59999999999999998)

    def clearAudio(self):
        base.ambientMgr.requestFadeOut(SoundGlobals.AMBIENT_SHIP)
        base.musicMgr.requestFadeOut(self.currentMusic)

    def stopCurrentMusic(self):
        if self.currentMusic:
            base.musicMgr.requestFadeOut(self.currentMusic)

        self.currentMusic = None

    def startCurrentMusic(self, music=None):
        if music and self.currentMusic != music:
            self.currentMusic = music

        if self.currentMusic:
            base.musicMgr.request(self.currentMusic)

    def fadeOutMusicIfInCrew(self):

        try:
            if self.ship.isInCrew(localAvatar.doId):
                self.stopCurrentMusic()
        except NameError:
            self.stopCurrentMusic()

    def createGrappleProximitySphere(self):
        self.grappleProximityStr = self.ship.uniqueName('grappleProximity')
        collSphere = CollisionSphere(0, 0, 0, 200)
        collSphere.setTangible(0)
        collSphereNode = CollisionNode(self.grappleProximityStr)
        collSphereNode.addSolid(collSphere)
        collSphereNode.setCollideMask(PiratesGlobals.ShipCollideBitmask)
        collSphereNodePath = self.ship.attachNewNode(collSphereNode)
        self.grappleProximityCollision = collSphereNodePath
        self.stashGrappleProximitySphere()

    def stashGrappleProximitySphere(self):
        self.grappleProximityCollision.stash()

    def unstashGrappleProximitySphere(self):
        self.grappleProximityCollision.unstash()

    def enterWaitingForGrapple(self):
        self.notify.debug('enterWaitingForGrapple')
        self.ship.removeWake()
        if self.ship.boardableShipId == None:
            return None

        self.unstashGrappleProximitySphere()
        self.removeTargets()
        self.pendingAddTarget = base.cr.relatedObjectMgr.requestObjects(
            [self.ship.boardableShipId], eachCallback=self.addTargets)
        if localAvatar.ship and localAvatar.ship.doId == self.ship.boardableShipId:
            localAvatar.guiMgr.messageStack.addTextMessage(
                PLocalizer.FlagshipWaitingForGrappleInstructions)

    def exitWaitingForGrapple(self):
        self.ship.removeTarget()

    def addTargets(self, boardableShip):
        if localAvatar.ship != boardableShip:
            return None

        attackX = boardableShip.getX(self.ship)
        gStr = '**/grapple_right_*'
        xOffset = -5.0
        if attackX < 0:
            gStr = '**/grapple_left_*'
            xOffset = 5.0

        locators = self.ship.findLocators(gStr + ';+s')
        for locator in locators:
            target = loader.loadModel('models/effects/selectionCursor')
            target.setColorScale(0, 1, 0, 1)
            self.ship.addGrappleTarget(target, locator, xOffset)
            target.setTwoSided(1)
            target.setBillboardPointEye()
            target.setFogOff()
            (scaleA, scaleB) = (10, 16)
            target.setScale(scaleA)
            t = 0.5
            ival = Sequence(
                LerpScaleInterval(target,
                                  2 * t,
                                  Vec3(scaleB, scaleB, scaleB),
                                  blendType='easeInOut'),
                LerpScaleInterval(target,
                                  t,
                                  Vec3(scaleA, scaleA, scaleA),
                                  blendType='easeInOut'))
            ival.loop()
            collSphere = CollisionSphere(0, 0, 0, 10)
            collSphere.setTangible(1)
            collSphereNode = CollisionNode('grappleTargetSphere')
            collSphereNode.addSolid(collSphere)
            collSphereNode.setTag('objType',
                                  str(PiratesGlobals.COLL_GRAPPLE_TARGET))
            collSphereNode.setTag('shipId', str(self.ship.doId))
            collSphereNode.setTag('targetId', locator.getName())
            collSphereNode.setCollideMask(PiratesGlobals.TargetBitmask)
            collSphereNodePath = self.ship.getModelRoot().attachNewNode(
                collSphereNode)
            collSphereNodePath.setPos(target.getPos())
            collSphereNodePath.setTag('targetIndex', str(len(self.targets)))
            self.targets.append([target, ival, collSphereNodePath])

        self.accept('enterGrappleTargetSphere', self.handleTargetHit)

    def removeTargets(self):
        for (target, ival, csnp) in self.targets:
            target.removeNode()
            csnp.removeNode()
            if ival:
                ival.pause()
                del ival
                continue

        self.targets = []
        self.ignore('entergrappleTargetSphere')

    def handleTargetHit(self, collEntry):
        print '**********HANDLE TARGET HIT*****************'

    def enterGrappleLerping(self):
        self.notify.debug('enterGrappleLerping')
        self.ship.startSmooth()
        self.grappleSfx = loadSfx(SoundGlobals.SFX_SHIP_GRAPPLE)
        base.playSfx(self.grappleSfx, looping=1)
        grappler = base.cr.doId2do.get(self.ship.boardableShipId)
        if grappler:
            grappler.grappledShip(self.ship)

    def exitGrappleLerping(self):
        self.ship.stopSmooth()
        self.ship.removeTarget()
        if self.grappleSfx:
            self.grappleSfx.stop()
            self.grappleSfx = None

    def enterInPosition(self):
        self.notify.debug('enterInPosition')
        self.removeTargets()
        myShip = localAvatar.getShip()
        if myShip and myShip.doId == self.ship.boardableShipId:
            if myShip.isCaptain(localAvatar.doId):
                localAvatar.guiMgr.messageStack.addTextMessage(
                    PLocalizer.FlagshipInPositionInstructionsCaptain)
                myShip.showBoardingChoice(self.ship)
            else:
                localAvatar.guiMgr.messageStack.addTextMessage(
                    PLocalizer.FlagshipInPositionInstructionsCrew)

    def exitInPosition(self):
        self.ship.removeTarget()
        myShip = localAvatar.getShip()
        if myShip and myShip.doId == self.ship.boardableShipId:
            if myShip.isCaptain(localAvatar.doId):
                myShip.removeBoardingChoice()

    def enterBoarded(self):
        self.ship.disableOnDeckInteractions()

    def exitBoarded(self):
        pass

    def enterDefeated(self):
        self.explosionIval = None
        if self.ship:
            self.notify.debug('%s enterDefeated' % self.ship.doId)
            self.ship.removeTarget()
            if self.ship.getModelRoot():
                pos = self.ship.getClosestBoardingPos()
                if base.options.getSpecialEffectsSetting(
                ) >= base.options.SpecialEffectsHigh:
                    effectsIval = Parallel()
                    explosionEffect = Explosion.getEffect()
                    if explosionEffect:
                        explosionEffect.reparentTo(self.ship.getModelRoot())
                        explosionEffect.setPos(self.ship.getModelRoot(), pos)
                        explosionEffect.setEffectScale(1.0)
                        effectsIval.append(Func(explosionEffect.play))

                    shipSplintersAEffect = ShipSplintersA.getEffect()
                    if shipSplintersAEffect:
                        shipSplintersAEffect.wrtReparentTo(
                            self.ship.getModelRoot())
                        shipSplintersAEffect.setPos(self.ship.getModelRoot(),
                                                    pos)
                        effectsIval.append(Func(shipSplintersAEffect.play))

                    effect1 = FlamingDebris.getEffect()
                    if effect1:
                        effect1.wrtReparentTo(self.ship.getModelRoot())
                        effect1.setPos(self.ship.getModelRoot(), pos)
                        effect1.velocityX = 25
                        effect1.velocityY = 0
                        effectsIval.append(Func(effect1.play))

                    effect2 = FlamingDebris.getEffect()
                    if effect2:
                        effect2.wrtReparentTo(self.ship.getModelRoot())
                        effect2.setPos(self.ship.getModelRoot(), pos)
                        effect2.velocityX = 0
                        effect2.velocityY = 25
                        effectsIval.append(Func(effect2.play))

                    self.explosionIval = Sequence(Wait(4.0), effectsIval)
                    self.explosionIval.start()

    def enterKrakenPinned(self):
        if self.ship.model:
            self.ship.model.modelRoot.setR(10)

    def exitKrakenPinned(self):
        if self.ship.model:
            self.ship.model.modelRoot.setR(0)

    def exitDefeated(self):
        self.notify.debug('%s exitDefeated' % self.ship.doId)
        if self.explosionIval:
            self.explosionIval.pause()
            self.explosionIval = None

    def enterInactive(self):
        pass

    def exitInactive(self):
        pass

    def enterCaptured(self):
        if self.ship:
            self.notify.debug('%s enterCaptured' % self.ship.doId)
            self.ship.removeTarget()

    def exitCaptured(self):
        if self.ship:
            self.notify.debug('%s exitCaptured' % self.ship.doId)
class DistributedShipDeployer(DistributedNode, GridChild):
    
    def __init__(self, cr):
        DistributedNode.__init__(self, cr)
        NodePath.__init__(self, 'ShipDeployer')
        GridChild.__init__(self)
        self.minRadius = 0
        self.spacing = 0
        self.maxRadius = 0
        self.heading = 0
        self.minSphere = None
        self.maxSphereSoft = None
        self.maxSphereHard = None
        self.deploySpheres = []
        self.lockedMessage = 0
        self.outerBarrierState = True

    
    def announceGenerate(self):
        DistributedNode.announceGenerate(self)
        self.reparentTo(self.getParentObj())
        self.createSpheres()
        self.enableDeploySpheres(False)
        self.accept(self.uniqueName('enterShipDeploySphere'), self.handleShipCollideEnter)
        self.accept(self.uniqueName('exitShipDeploySphere'), self.handleShipCollideExit)
        self.accept(self.uniqueName('enterShipDeploy-MaxSphereSoft'), self.handleShipEnterSoftBarrier)
        self.accept(self.uniqueName('exitShipDeploy-MaxSphereSoft'), self.handleShipExitSoftBarrier)
        self.accept(self.uniqueName('enterShipDeploy-MaxSphereHard'), self.handleShipEnterHardBarrier)
        self.accept(self.uniqueName('exitShipDeploy-MaxSphereHard'), self.handleShipExitHardBarrier)
        self.accept(self.uniqueName('enterShipDeploy-MinSphere'), self.handleShipEnterMinSphere)
        self.accept(self.uniqueName('exitShipDeploy-MinSphere'), self.handleShipExitMinSphere)
        self.accept('settingLocalShip', self.unlockMessages)

    announceGenerate = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(announceGenerate)
    
    def disable(self):
        self.ignore(self.uniqueName('enterShipDeploySphere'))
        self.ignore(self.uniqueName('exitShipDeploySphere'))
        self.ignore(self.uniqueName('enterShipDeploy-MaxSphereSoft'))
        self.ignore(self.uniqueName('exitShipDeploy-MaxSphereSoft'))
        self.ignore(self.uniqueName('enterShipDeploy-MaxSphereHard'))
        self.ignore(self.uniqueName('exitShipDeploy-MaxSphereHard'))
        self.ignore(self.uniqueName('enterShipDeploy-MinSphere'))
        self.ignore(self.uniqueName('exitShipDeploy-MinSphere'))
        self.ignore('settingLocalShip')
        self.unlockMessages()
        self.removeChildren()
        self.minSphere = None
        self.maxSphereSoft = None
        self.maxSphereHard = None
        self.deploySpheres = []
        DistributedNode.disable(self)

    disable = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(disable)
    
    def delete(self):
        DistributedNode.delete(self)
        GridChild.delete(self)

    
    def unlockMessages(self, data = None):
        if self.lockedMessage:
            localAvatar.guiMgr.unlockInstructionMessage(self)
        

    
    def setMinRadius(self, radius):
        self.minRadius = radius

    
    def setMaxRadius(self, radius):
        self.maxRadius = radius

    
    def setSpacing(self, spacing):
        self.spacing = spacing

    
    def setHeading(self, heading):
        self.heading = heading

    
    def d_shipEnteredSphere(self, shipId, sphereId):
        self.sendUpdate('shipEnteredSphere', [
            shipId,
            sphereId])

    
    def d_shipExitedSphere(self, shipId, sphereId):
        self.sendUpdate('shipExitedSphere', [
            shipId,
            sphereId])

    
    def d_shipExitedBarrier(self, shipId):
        self.sendUpdate('shipExitedBarrier', [
            shipId])

    
    def createSpheres(self):
        self.createMinSphere()
        self.createMaxSpheres()
        self.createDeploySpheres()

    createSpheres = report(types = [
        'frameCount',
        'args'], dConfigParam = 'shipboard')(createSpheres)
    
    def createMinSphere(self):
        cSphere = CollisionSphere(0, 0, 0, self.minRadius)
        cSphere.setTangible(1)
        cSphereNode = CollisionNode(self.uniqueName('ShipDeploy-MinSphere'))
        cSphereNode.setFromCollideMask(BitMask32.allOff())
        cSphereNode.setIntoCollideMask(PiratesGlobals.ShipCollideBitmask)
        cSphereNode.addSolid(cSphere)
        self.minSphere = self.attachNewNode(cSphereNode)

    
    def createMaxSpheres(self):
        cSphere = CollisionSphere(0, 0, 0, self.maxRadius)
        cSphere.setTangible(0)
        cSphereNode = CollisionNode(self.uniqueName('ShipDeploy-MaxSphereSoft'))
        cSphereNode.setFromCollideMask(BitMask32.allOff())
        cSphereNode.setIntoCollideMask(PiratesGlobals.ShipCollideBitmask)
        cSphereNode.addSolid(cSphere)
        self.maxSphereSoft = self.attachNewNode(cSphereNode)
        cSphere = CollisionSphere(0, 0, 0, self.maxRadius)
        cSphere.setTangible(1)
        cSphereNode = CollisionNode(self.uniqueName('ShipDeploy-MaxSphereHard'))
        cSphereNode.setFromCollideMask(BitMask32.allOff())
        cSphereNode.setIntoCollideMask(PiratesGlobals.ShipDeployBitmask)
        cSphereNode.addSolid(cSphere)
        self.maxSphereHard = self.attachNewNode(cSphereNode)

    
    def createDeploySpheres(self):
        deployRingRadius = self.minRadius + self.spacing / 2.0
        C = 2 * math.pi * deployRingRadius
        numSpheres = int(C / self.spacing)
        stepAngle = 360.0 / numSpheres
        
        def getSpherePos(sphereId):
            h = sphereId * stepAngle + 90.0 + self.heading
            angle = h * math.pi / 180.0
            pos = Point3(math.cos(angle), math.sin(angle), 0) * deployRingRadius
            return pos

        for x in xrange(numSpheres):
            pos = getSpherePos(x)
            cSphere = CollisionSphere(pos[0], pos[1], pos[2], self.spacing / 2.0)
            cSphere.setTangible(0)
            cSphereNode = CollisionNode(self.uniqueName('ShipDeploySphere'))
            cSphereNode.addSolid(cSphere)
            cSphereNode.setFromCollideMask(BitMask32.allOff())
            cSphereNode.setIntoCollideMask(PiratesGlobals.ShipCollideBitmask)
            sphere = self.attachNewNode(cSphereNode)
            sphere.setTag('deploySphereId', `x`)
            self.deploySpheres.append(sphere)
        

    
    def showSpheres(self):
        self.minSphere.show()
        self.maxSphereSoft.show()
        self.maxSphereHard.show()
        for sphere in self.deploySpheres:
            sphere.show()
        

    
    def hideSpheres(self):
        self.minSphere.hide()
        self.maxSphereSoft.hide()
        self.maxSphereHard.hide()
        for sphere in self.deploySpheres:
            sphere.hide()
        

    
    def handleShipCollideEnter(self, colEntry):
        shipId = colEntry.getFromNodePath().getNetTag('shipId')
        shipId = int(shipId)
        sphereId = colEntry.getIntoNodePath().getNetTag('deploySphereId')
        sphereId = int(sphereId)
        self.d_shipEnteredSphere(shipId, sphereId)
        for sphere in self.deploySpheres:
            sphere.stash()
        
        padding = 3
        numSpheres = len(self.deploySpheres)
        for sphere in lambda [outmost-iterable]: for s in [outmost-iterable]:
class DistributedInteractive(DistributedNode, InteractiveBase, DistributedLocatableObject, GridChild):
    notify = DirectNotifyGlobal.directNotify.newCategory('DistributedInteractive')
    
    def __init__(self, cr):
        DistributedNode.__init__(self, cr)
        InteractiveBase.__init__(self)
        DistributedLocatableObject.__init__(self, cr)
        GridChild.__init__(self)
        self.interactGUI = None
        self.hideHpMeterFlag = 0
        self.userId = 0
        self.uniqueId = None

    
    def delete(self):
        DistributedNode.delete(self)
        InteractiveBase.delete(self)
        DistributedLocatableObject.delete(self)
        GridChild.delete(self)

    
    def generate(self):
        DistributedNode.generate(self)
        InteractiveBase.generate(self)
        DistributedLocatableObject.generate(self)

    
    def disable(self):
        DistributedNode.disable(self)
        InteractiveBase.disable(self)
        DistributedLocatableObject.disable(self)

    
    def announceGenerate(self):
        DistributedNode.announceGenerate(self)
        DistributedLocatableObject.announceGenerate(self)

    
    def isBattleable(self):
        return 0

    
    def requestInteraction(self, avId, interactType = 0, instant = 0):
        if self.cr:
            self.sendUpdate('requestInteraction', [
                base.localAvatar.doId,
                interactType,
                instant])
            self.cr.interactionMgr.stop()
            self.request('Waiting')
        

    requestInteraction = report(types = [
        'frameCount',
        'deltaStamp'], dConfigParam = 'shipboard')(requestInteraction)
    
    def setLocation(self, parentId, zoneId):
        DistributedNode.setLocation(self, parentId, zoneId)

    
    def requestExit(self):
        self.sendUpdate('requestExit')
        self.refreshState()

    
    def demandExit(self):
        self.sendUpdate('demandExit')
        self.refreshState()

    
    def refreshState(self):
        if self.hasProximityCollision and self.allowInteract and not (self.ignoreProximity) and not self.proximityCollisionNodePath.isEmpty():
            distance = self.proximityCollisionNodePath.getDistance(localAvatar)
            proxSphereRadius = self.proximityCollisionNodePath.getScale()[0]
            avRadius = 1.3999999999999999
            if distance <= proxSphereRadius + avRadius:
                self.request('Proximity')
            else:
                self.request('Idle')
        else:
            self.request('Idle')

    
    def acceptInteraction(self):
        self.request('Use')

    
    def rejectInteraction(self):
        self.cr.interactionMgr.start()
        self.refreshState()

    
    def rejectExit(self):
        pass

    
    def offerOptions(self, optionIds, statusCodes):
        if self.interactGUI:
            self.notify.warning('offerOptions: old interact GUI still around')
            self.interactGUI.destroy()
            self.interactGUI = None
        
        self.interactGUI = InteractGUI.InteractGUI()
        title = self.getMenuTitle()
        self.interactGUI.setOptions(title, optionIds, statusCodes, self.b_selectOption)

    
    def b_selectOption(self, optionId):
        self.d_selectOption(optionId)
        self.selectOption(optionId)

    
    def d_selectOption(self, optionId):
        self.sendUpdate('selectOption', [
            optionId])

    
    def selectOption(self, optionId):
        if self.interactGUI:
            self.interactGUI.destroy()
            self.interactGUI = None
        

    
    def getMenuTitle(self):
        return ''

    
    def setUserId(self, avId):
        self.userId = avId

    
    def getUserId(self):
        return self.userId

    
    def setUniqueId(self, uid):
        if self.uniqueId != '' and uid != self.uniqueId:
            base.cr.uidMgr.removeUid(self.uniqueId)
        
        self.uniqueId = uid
        base.cr.uidMgr.addUid(self.uniqueId, self.getDoId())

    
    def getUniqueId(self):
        return self.uniqueId

    
    def getWorld(self):
        return base.cr.activeWorld

    
    def isInvisibleGhost(self):
        return 0
Example #38
0
class QuestIndicatorNodeQuestNode(QuestIndicatorNode):
    def __init__(self, questStep):
        self.pendingStepObj = None
        QuestIndicatorNode.__init__(self, 'QuestNodeIndicator',
                                    questStep.nodeSizes, questStep)

    def delete(self):
        if self.pendingStepObj:
            base.cr.relatedObjectMgr.abortRequest(self.pendingStepObj)
            self.pendingStepObj = None

        self.ignore('tunnelSetLinks')
        QuestIndicatorNode.delete(self)

    def placeInWorld(self):
        originObj = base.cr.doId2do.get(self.questStep.getOriginDoId())
        if originObj:
            posH = self.questStep.getPosH()
            pos = posH[:3]
            h = posH[3]
            self.reparentTo(originObj)
            self.setPos(*pos)
            self.setHpr(h, 0, 0)
            self.setZoneLODOffset(1, Point3(*self.questStep.getNearOffset()))

    placeInWorld = report(types=['frameCount', 'args'],
                          dConfigParam='quest-indicator')(placeInWorld)

    def loadZoneLevel(self, level):
        if level == 0:
            self.request('At')
        elif level == 1:
            self.request('Near')
        elif level == 2:
            self.request('Far')

    def unloadZoneLevel(self, level, cacheObs=False):
        if level == 0:
            self.request('Near')
        elif level == 1:
            self.request('Far')
        elif level == 2:
            self.request('Off')

    def enterFar(self):
        QuestIndicatorNode.enterFar(self)
        if self.farEffect:
            self.farEffect.setPos(*self.questStep.getNearVis())

    def exitFar(self):
        QuestIndicatorNode.exitFar(self)

    def enterNear(self):
        self.startFarEffect()

    def exitNear(self):
        self.stopFarEffect()

    def enterAt(self):
        pass

    def exitAt(self):
        pass

    def startFarEffect(self):
        QuestIndicatorNode.startFarEffect(self)
        if self.farEffect:
            self.farEffect.setPos(0, 0, -3.5)

    startFarEffect = report(types=['frameCount', 'args'],
                            dConfigParam='quest-indicator')(startFarEffect)

    def updateGuiHints(self, questId):
        pass
class PiratesClientRepository(OTPClientRepository):
    notify = directNotify.newCategory('PiratesClientRepository')
    SupportTutorial = 0
    GameGlobalsId = OTP_DO_ID_PIRATES
    StopVisibilityEvent = 'pirates-stop-visibility'

    def __init__(self, serverVersion, launcher=None):
        self.loadingScreen = base.loadingScreen
        self.loadingScreen.parent = self
        self.accept('connectionIssue', self.loadingScreen.hide)
        self.accept('connectionRetrying', self.loadingScreen.show)
        OTPClientRepository.__init__(self,
                                     serverVersion,
                                     launcher,
                                     playGame=PlayGame.PlayGame)
        self.createAvatarClass = DistributedPlayerPirate.DistributedPlayerPirate
        self.tradeManager = None
        self.pvpManager = None
        self.CentralLogger = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_CENTRAL_LOGGER, 'CentralLogger')
        self.avatarManager = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_AVATAR_MANAGER,
            'DistributedAvatarManager')
        self.chatManager = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_CHAT_MANAGER, 'DistributedChatManager')
        self.crewMatchManager = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_CREW_MATCH_MANAGER,
            'DistributedCrewMatchManager')
        self.avatarFriendsManager = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_AVATAR_FRIENDS_MANAGER,
            'PCAvatarFriendsManager')
        self.playerFriendsManager = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PLAYER_FRIENDS_MANAGER,
            'PCPlayerFriendsManager')
        self.guildManager = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_GUILD_MANAGER, 'PCGuildManager')
        self.speedchatRelay = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_SPEEDCHAT_RELAY,
            'PiratesSpeedchatRelay')
        self.shipLoader = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_SHIP_MANAGER,
            'DistributedShipLoader')
        self.travelAgent = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_TRAVEL_AGENT,
            'DistributedTravelAgent')
        base.loadingScreen.tick()
        self.matchMaker = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_MATCH_MAKER,
            'DistributedMatchMaker')
        base.loadingScreen.tick()
        self.codeRedemption = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_CODE_REDEMPTION, 'CodeRedemption')
        base.loadingScreen.tick()
        self.settingsMgr = self.generateGlobalObject(
            OtpDoGlobals.OTP_DO_ID_PIRATES_SETTINGS_MANAGER,
            'PiratesSettingsMgr')
        #self.statusDatabase = self.generateGlobalObject(OtpDoGlobals.OTP_DO_ID_STATUS_DATABASE, 'StatusDatabase')
        self.wantSeapatch = base.config.GetBool('want-seapatch', 1)
        self.wantSpecialEffects = base.config.GetBool('want-special-effects',
                                                      1)
        self.wantMakeAPirate = base.config.GetBool('wantMakeAPirate', 0)
        self.forceTutorial = base.config.GetBool('force-tutorial', 0)
        self.skipTutorial = base.config.GetBool('skip-tutorial', 0)
        self.tutorialObject = None
        self.avChoiceDoneEvent = None
        self.avChoice = None
        self.avCreate = None
        self.currentCutscene = None
        self.activeWorld = None
        self.teleportMgr = None
        self.treasureMap = None
        self.newsManager = None
        self.distributedDistrict = None
        self.district = None
        self.profileMgr = None
        self.battleMgr = BattleManager.BattleManager(self)
        self.combatAnims = CombatAnimations.CombatAnimations()
        self.interactionMgr = InteractionManager.InteractionManager()
        self.currCamParent = None
        self.uidMgr = UniqueIdManager.UniqueIdManager(self)
        self.fakeMSP = None
        self.questDynMap = QuestLadderDynMap.QuestLadderDynMap()
        self.questDependency = QuestLadderDependency()
        self.questChoiceSibsMap = QuestChoiceDynMap()
        base.loadingScreen.beginStep('MasterHumans', 52, 45)
        self.humanHigh = [MasterHuman.MasterHuman(), MasterHuman.MasterHuman()]
        self.humanHigh[0].billboardNode.removeNode()
        self.humanHigh[1].billboardNode.removeNode()
        self.humanHigh[0].style = HumanDNA.HumanDNA('m')
        self.humanHigh[1].style = HumanDNA.HumanDNA('f')
        self.humanHigh[0].generateHuman('m')
        base.loadingScreen.tick()
        self.humanHigh[1].generateHuman('f')
        base.loadingScreen.tick()
        self.humanHigh[0].ignoreAll()
        self.humanHigh[1].ignoreAll()
        self.humanHigh[0].stopBlink()
        self.humanHigh[1].stopBlink()
        self.humanLow = [MasterHuman.MasterHuman(), MasterHuman.MasterHuman()]
        self.humanLow[0].billboardNode.removeNode()
        self.humanLow[1].billboardNode.removeNode()
        self.humanLow[0].style = HumanDNA.HumanDNA('m')
        self.humanLow[1].style = HumanDNA.HumanDNA('f')
        self.humanLow[0].generateHuman('m')
        base.loadingScreen.tick()
        self.humanLow[1].generateHuman('f')
        base.loadingScreen.tick()
        base.loadingScreen.endStep('MasterHumans')
        self.humanLow[0].ignoreAll()
        self.humanLow[1].ignoreAll()
        self.humanLow[0].stopBlink()
        self.humanLow[1].stopBlink()
        for i in range(2):
            self.humanLow[i]._Actor__sortedLODNames = ['500']
            del self.humanLow[i]._Actor__partBundleDict['2000']
            del self.humanLow[i]._Actor__partBundleDict['1000']
            self.humanLow[i].getLOD('2000').detachNode()
            self.humanLow[i].getLOD('1000').detachNode()
            self.humanLow[i].getLODNode().clearSwitches()
            self.humanLow[i].getLODNode().addSwitch(10000, 0)

        if base.options.getCharacterDetailSetting() == 0:
            self.human = self.humanLow
        else:
            self.human = self.humanHigh
        A = AvatarTypes
        del A
        self.preloadedCutscenes = {}
        self.defaultShard = 0
        NametagGlobals.setMasterArrowsOn(0)
        self._tagsToInterests = {}
        self._interestsToTags = {}
        self._worldStack = []
        if __dev__:
            __builtin__.go = self.getDo
            __builtin__.gov = self.getOwnerView
            import pdb as pdb
            __builtin__.trace = pdb.set_trace
            __builtin__.pm = pdb.pm
            self.effectTypes = {
                'damageSmoke': ['BlackSmoke'],
                'damageFire': ['Fire'],
                'cannonDeckFire': ['CannonSmokeSimple', 'CannonBlastSmoke'],
                'cannonBSFire': [
                    'MuzzleFlameBS', 'CannonSmokeSimpleBS',
                    'CannonBlastSmokeBS', 'GrapeshotEffectBS'
                ],
                'cannonHit': ['SimpleSmokeCloud', 'ExplosionFlip'],
                'cannonSplash': ['CannonSplash']
            }
            self.effectToggles = {}

        self.cannonballCollisionDebug = 1
        self.npcManager = NPCManager.NPCManager()
        PotionGlobals.updatePotionBuffDuration(
            C_SUMMON_CHICKEN, config.GetInt('summon-duration-chicken', 300))
        PotionGlobals.updatePotionBuffDuration(
            C_SUMMON_MONKEY, config.GetInt('summon-duration-monkey', 300))
        PotionGlobals.updatePotionBuffDuration(
            C_SUMMON_WASP, config.GetInt('summon-duration-wasp', 300))
        PotionGlobals.updatePotionBuffDuration(
            C_SUMMON_DOG, config.GetInt('summon-duration-dog', 300))

    def __repr__(self):
        return 'PiratesClientRepository'

    def gotoFirstScreen(self):
        base.loadingScreen.beginStep('PrepLogin', 9, 0.14000000000000001)
        self.startReaderPollTask()
        self.startHeartbeat()
        base.loadingScreen.tick()
        self.loginFSM.request('login')
        base.loadingScreen.tick()
        base.loadingScreen.endStep('PrepLogin')

    gotoFirstScreen = report(types=['args', 'deltaStamp'],
                             dConfigParam='teleport')(gotoFirstScreen)

    def getActiveWorld(self):
        return self.activeWorld

    def preloadCutscene(self, name):
        if name not in self.preloadedCutscenes:
            newCutscene = Cutscene.Cutscene(self, name)
            self.preloadedCutscenes[name] = newCutscene

    def getPreloadedCutsceneInfo(self, name):
        return self.preloadedCutscenes.get(name)

    def cleanupPreloadedCutscene(self, name):
        plCutscene = self.preloadedCutscenes.get(name)
        if plCutscene:
            if not plCutscene.isEmpty():
                plCutscene.destroy()

            del self.preloadedCutscenes[name]

    def setActiveWorld(self, world):
        self.activeWorld = world

    setActiveWorld = report(types=['args', 'deltaStamp'],
                            dConfigParam='teleport')(setActiveWorld)

    def clearActiveWorld(self, world):
        if self.activeWorld:
            if world is self.activeWorld or self.activeWorld.isEmpty():
                self.activeWorld = None

    clearActiveWorld = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(clearActiveWorld)

    def getWaterHeight(self, node):
        if self.wantSeapatch and self.activeWorld:
            water = self.activeWorld.getWater()
            if water:
                return water.calcHeight(node=node)

        else:
            return 0.0

    def isOceanEnabled(self):
        if self.wantSeapatch and self.activeWorld and self.activeWorld.hasWater(
        ):
            return self.activeWorld.getWater().enabled

        return 0

    def enterChooseAvatar(self, avList):
        base.loadingScreen.beginStep('AvChooser', 14, 10)
        self.sendSetAvatarIdMsg(0)
        self.handler = self.handleMessageType
        if __dev__:
            bp.loginCfg()
            config_slot = base.config.GetInt('login-pirate-slot', -1)
            if config_slot >= 0 and len(avList) > 0:
                config_subId = base.config.GetInt('login-pirate-subId',
                                                  avList.keys()[0])
                slots = avList.get(config_subId, [])
                if config_slot in range(len(slots)):
                    potAv = slots[config_slot]
                    if isinstance(potAv, PotentialAvatar):
                        base.cr.loadingScreen.hide()
                        ConfigVariableInt('login-pirate-slot').setValue(-1)
                        base.loadingScreen.endStep('AvChooser')
                        base.cr.avatarManager.sendRequestPlayAvatar(
                            potAv.id, config_subId)
                        self.handleAvatarChoice('chose', config_subId,
                                                config_slot)
                        return None

        self.avChoiceDoneEvent = 'avatarChooserDone'
        self.avChoice = AvatarChooser(self.loginFSM, self.avChoiceDoneEvent)
        base.loadingScreen.tick()
        self.avChoice.load()
        base.loadingScreen.tick()
        self.avChoice.enter()
        base.loadingScreen.tick()
        self.accept(self.avChoiceDoneEvent,
                    self._PiratesClientRepository__handleAvatarChooserDone)
        base.loadingScreen.endStep('AvChooser')
        base.cr.loadingScreen.hide()

    enterChooseAvatar = report(types=['args', 'deltaStamp'],
                               dConfigParam='teleport')(enterChooseAvatar)

    def __handleAvatarChooserDone(self, doneStatus):
        done = doneStatus['mode']
        if done == 'exit':
            self.notify.info('handleAvatarChooserDone: shutting down')
            self.loginFSM.request('shutdown')
            return None

        (subId, slot) = self.avChoice.getChoice()
        self.avChoice.exit()
        self.handleAvatarChoice(done, subId, slot)

    _PiratesClientRepository__handleAvatarChooserDone = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(__handleAvatarChooserDone)

    def handleAvatarChoice(self, done, subId, slot):
        access = self.accountDetailRecord.subDetails[subId].subAccess
        base.setEmbeddedFrameMode(access)
        if done == 'chose':
            av = self.avList[subId][slot]
            if av.dna.getTutorial() < 3 and self.skipTutorial == 0:
                self.tutorial = 1
            else:
                self.tutorial = 0
            self.loadingScreen.beginStep('waitForAv')
            self.loginFSM.request('waitForSetAvatarResponse', [av])
        elif done == 'create':
            self.loginFSM.request('createAvatar',
                                  [self.avList[subId], slot, subId])

    def exitChooseAvatar(self):
        self.handler = None
        if self.avChoice:
            self.avChoice.exit()
            self.avChoice.unload()
            self.avChoice = None

        if self.avChoiceDoneEvent:
            self.ignore(self.avChoiceDoneEvent)
            self.avChoiceDoneEvent = None

    exitChooseAvatar = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(exitChooseAvatar)

    def enterCreateAvatar(self, avList, index, subId):
        self.handler = self.handleCreateAvatar
        if self.skipTutorial:
            self.tutorial = 0
            self.avCreate = MakeAPirate(avList, 'makeAPirateComplete', subId,
                                        index, self.isPaid())
            self.avCreate.load()
            self.avCreate.enter()
            self.accept('makeAPirateComplete',
                        self._PiratesClientRepository__handleMakeAPirate)
            self.accept('nameShopCreateAvatar', self.sendCreateAvatarMsg)
        else:
            self.tutorial = 1
            dna = HumanDNA.HumanDNA()
            newPotAv = PotentialAvatar(0, ['dbp', '', '', ''], dna, index, 0)
            self.avatarManager.sendRequestCreateAvatar(subId)
            self.accept('createdNewAvatar', self.handleAvatarCreated,
                        [newPotAv])

    enterCreateAvatar = report(types=['args', 'deltaStamp'],
                               dConfigParam='teleport')(enterCreateAvatar)

    def handleAvatarCreated(self, newPotAv, avatarId, subId):
        newPotAv.id = avatarId
        self.loginFSM.request('waitForSetAvatarResponse', [newPotAv])

    handleAvatarCreated = report(types=['args', 'deltaStamp'],
                                 dConfigParam='teleport')(handleAvatarCreated)

    def __handleMakeAPirate(self):
        done = self.avCreate.getDoneStatus()
        if done == 'cancel':
            self.avCreate.exit()
            self.loginFSM.request('chooseAvatar', [self.avList])
        elif done == 'created':
            self.handleAvatarCreated(self.avCreate.newPotAv,
                                     self.avCreate.avId, self.avCreate.subId)
        else:
            self.notify.error('Invalid doneStatus from MakeAPirate: ' +
                              str(done))

    _PiratesClientRepository__handleMakeAPirate = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(__handleMakeAPirate)

    def exitCreateAvatar(self):
        if self.skipTutorial:
            self.ignore('makeAPirateComplete')
            self.ignore('nameShopPost')
            self.ignore('nameShopCreateAvatar')
            self.avCreate.exit()
            self.avCreate.unload()
            self.avCreate = None
            self.handler = None

        self.ignore('createdNewAvatar')

    exitCreateAvatar = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(exitCreateAvatar)

    def handleCreateAvatar(self, msgType, di):
        if msgType == CLIENT_CREATE_AVATAR_RESP:
            self.handleCreateAvatarResponseMsg(di)
        else:
            self.handleMessageType(msgType, di)

    handleCreateAvatar = report(types=['args', 'deltaStamp'],
                                dConfigParam='teleport')(handleCreateAvatar)

    def handleCreateAvatarResponseMsg(self, di):
        echoContext = di.getUint16()
        returnCode = di.getUint8()
        if returnCode == 0:
            self.avId = di.getUint32()
            newPotAv = PotentialAvatar(self.avId, [self.newName, '', '', ''],
                                       self.newDNA, self.newPosition, 1)
            self.loginFSM.request('waitForSetAvatarResponse', [newPotAv])
        else:
            self.notify.error('name rejected')

    handleCreateAvatarResponseMsg = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(handleCreateAvatarResponseMsg)

    def sendGetAvatarsMsg(self):
        self.accept('avatarListFailed', self.avatarListFailed)
        self.accept('avatarList', self.avatarList)
        self.avatarManager.sendRequestAvatarList()
        self.defaultShard = 0

    sendGetAvatarsMsg = report(types=['args', 'deltaStamp'],
                               dConfigParam='teleport')(sendGetAvatarsMsg)

    def avatarListFailed(self, reason):
        self.ignore('avatarListFailed')
        self.ignore('avatarList')
        dialogClass = OTPGlobals.getGlobalDialogClass()
        self.avatarListFailedBox = dialogClass(
            message=PLocalizer.CRAvatarListFailed,
            doneEvent='avatarListFailedAck',
            text_wordwrap=18,
            style=OTPDialog.Acknowledge)
        self.avatarListFailedBox.show()
        self.acceptOnce(
            'avatarListFailedAck',
            self._PiratesClientRepository__handleAvatarListFailedAck)

    avatarListFailed = report(types=['args', 'deltaStamp'],
                              dConfigParam='teleport')(avatarListFailed)

    def __handleAvatarListFailedAck(self):
        self.ignore('avatarListFailedAck')
        self.avatarListFailedBox.cleanup()
        self.loginFSM.request('shutdown')

    _PiratesClientRepository__handleAvatarListFailedAck = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(__handleAvatarListFailedAck)

    def avatarList(self, avatars):
        self.ignore('avatarListFailed')
        self.ignore('avatarList')
        self.avList = {}
        for (subId, avData) in avatars.items():
            data = []
            self.avList[subId] = data
            for av in avData:
                if av == OTPGlobals.AvatarSlotAvailable:
                    data.append(OTPGlobals.AvatarSlotAvailable)
                    continue
                if av == OTPGlobals.AvatarSlotUnavailable:
                    data.append(OTPGlobals.AvatarSlotUnavailable)
                    continue
                if av == OTPGlobals.AvatarPendingCreate:
                    data.append(OTPGlobals.AvatarPendingCreate)
                    continue
                avNames = [av['name'], av['wishName'], '', '']
                aName = 0
                pa = PotentialAvatar(
                    av['id'],
                    avNames,
                    av['dna'],
                    av['slot'],
                    aName,
                    av['creator'] == self.accountDetailRecord.playerAccountId,
                    av['shared'],
                    av['online'],
                    wishState=av['wishState'],
                    wishName=av['wishName'],
                    defaultShard=av['defaultShard'],
                    lastLogout=av['lastLogout'])
                data.append(pa)

        if self.loginFSM.getCurrentState().getName() == 'chooseAvatar':
            self.avChoice.updateAvatarList()
        else:
            self.loginFSM.request('chooseAvatar', [self.avList])

    avatarList = report(types=['args', 'deltaStamp'],
                        dConfigParam='teleport')(avatarList)

    def handleGetAvatarsRespMsg(self, di):
        pass

    handleGetAvatarsRespMsg = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(handleGetAvatarsRespMsg)

    def handleGetAvatarsResp2Msg(self, di):
        pass

    handleGetAvatarsResp2Msg = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(handleGetAvatarsResp2Msg)

    def handleAvatarResponseMsg(self, di):
        self.loadingScreen.endStep('waitForAv')
        avatarId = di.getUint32()
        returnCode = di.getUint8()
        if returnCode == 0:
            self.loadingScreen.show(waitForLocation=True, expectedLoadScale=4)
            self.loadingScreen.beginStep('LocalAvatar', 36, 120)
            localAvatar = LocalPirate(self)
            localAvatar.dclass = self.dclassesByName['DistributedPlayerPirate']
            localAvatar.doId = avatarId
            self.localAvatarDoId = avatarId
            self.doId2do[avatarId] = localAvatar
            localAvatar.setLocation(parentId=None, zoneId=None)
            localAvatar.generate()
            localAvatar.updateAllRequiredFields(localAvatar.dclass, di)
            self.loadingScreen.endStep('LocalAvatar')
            self.loginFSM.request('playingGame')
        else:
            self.notify.error('Bad avatar: return code %d' % returnCode)

    handleAvatarResponseMsg = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(handleAvatarResponseMsg)

    def enterWaitForDeleteAvatarResponse(self, potentialAvatar):
        raise StandardError, 'This should be handled within AvatarChooser.py'

    enterWaitForDeleteAvatarResponse = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(enterWaitForDeleteAvatarResponse)

    def exitWaitForDeleteAvatarResponse(self):
        raise StandardError, 'This should be handled within AvatarChooser.py'

    exitWaitForDeleteAvatarResponse = report(
        types=['args', 'deltaStamp'],
        dConfigParam='teleport')(exitWaitForDeleteAvatarResponse)

    def enterPlayingGame(self):
        OTPClientRepository.enterPlayingGame(self)
        self.doDetectLeaks = False
        self.shardFSM = ShardFSM(self)
        if localAvatar.style.getTutorial(
        ) < PiratesGlobals.TUT_MET_JOLLY_ROGER and not (self.skipTutorial):
            self.travelAgent.d_requestTutorialTeleport()
        elif localAvatar.onWelcomeWorld and not (self.defaultShard):
            self.travelAgent.d_requestWelcomeWorldTeleport()
        elif self.defaultShard:
            self.travelAgent.d_requestLoginTeleport(self.defaultShard)
        elif self.avPlayedRecently:
            self.travelAgent.d_requestLoginTeleport(localAvatar.defaultShard)
        else:
            self.travelAgent.d_requestLoginTeleport()

    enterPlayingGame = report(types=['args', 'deltaStamp', 'module'],
                              dConfigParam='teleport')(enterPlayingGame)

    def playingGameLocReceived(self, shardId, zoneId):
        self.gameFSM.request('waitOnEnterResponses',
                             [shardId, zoneId, zoneId, -1])

    playingGameLocReceived = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(playingGameLocReceived)

    def exitPlayingGame(self):
        self.shardFSM.request('Off')
        ivalMgr.interrupt()
        base.ambientMgr.delete()
        base.musicMgr.delete()
        messenger.send('clientLogout')
        for (doId, obj) in self.doId2do.items():
            if not isinstance(obj, LocalPirate) and not isinstance(
                    obj, DistributedDistrict.DistributedDistrict):
                if hasattr(self, 'disableObject'):
                    self.disableObject(doId)

            hasattr(self, 'disableObject')

        camera.reparentTo(render)
        camera.setPos(0, 0, 0)
        camera.setHpr(0, 0, 0)
        base.transitions.noTransitions()
        OTPClientRepository.exitPlayingGame(self)
        self.detectLeaks(okTasks=[
            'physics-avatar', 'memory-monitor-task', 'multitexFlatten'
        ],
                         okEvents=[
                             'destroy-ToontownLoadingScreenTitle',
                             'destroy-ToontownLoadingScreenTip',
                             'destroy-ToontownLoadingScreenWaitBar',
                             PiratesGlobals.LogoutHotkey,
                             PiratesGlobals.HideGuiHotkey,
                             PiratesGlobals.OptionsHotkey, 'close_main_window',
                             'open_main_window', 'texture_state_changed',
                             'connectionIssue', 'connectionRetrying',
                             self.getConnectedEvent()
                         ])

    exitPlayingGame = report(types=['args', 'deltaStamp'],
                             dConfigParam='teleport')(exitPlayingGame)

    def enterTutorialQuestion(self, hoodId, zoneId, avId):
        self._PiratesClientRepository__requestTutorial(hoodId, zoneId, avId)

    enterTutorialQuestion = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(enterTutorialQuestion)

    def handleTutorialQuestion(self, msgType, di):
        if msgType == CLIENT_CREATE_OBJECT_REQUIRED:
            self.handleGenerateWithRequired(di)
        elif msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER:
            self.handleGenerateWithRequiredOther(di)
        elif msgType == CLIENT_OBJECT_UPDATE_FIELD:
            self.handleUpdateField(di)
        elif msgType == CLIENT_OBJECT_DISABLE:
            self.handleDisable(di)
        elif msgType == CLIENT_OBJECT_DISABLE_OWNER:
            self.handleDisableOwner(di)
        elif msgType == CLIENT_OBJECT_DELETE_RESP:
            self.handleDelete(di)
        elif msgType == CLIENT_GET_AVATAR_DETAILS_RESP:
            self.handleGetAvatarDetailsResp(di)
        else:
            self.handleUnexpectedMsgType(msgType, di)

    handleTutorialQuestion = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(handleTutorialQuestion)

    def exitTutorialQuestion(self):
        self.handler = None
        self.handlerArgs = None
        self.ignore('startTutorial')
        taskMgr.remove('waitingForTutorial')

    exitTutorialQuestion = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(exitTutorialQuestion)

    def __requestTutorial(self, hoodId, zoneId, avId):
        self.acceptOnce('startTutorial',
                        self._PiratesClientRepository__handleStartTutorial,
                        [avId])
        messenger.send('requestTutorial')

    _PiratesClientRepository__requestTutorial = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(__requestTutorial)

    def __handleStartTutorial(self, avId, zoneId):
        self.gameFSM.request('playGame', [Tutorial, zoneId, avId])

    _PiratesClientRepository__handleStartTutorial = report(
        types=['args',
               'deltaStamp'], dConfigParam='teleport')(__handleStartTutorial)

    def enterWaitOnEnterResponses(self, shardId, hoodId, zoneId, avId):
        self.cleanGameExit = False
        self.handler = self.handleWaitOnEnterResponses
        self.handlerArgs = {'hoodId': hoodId, 'zoneId': zoneId, 'avId': avId}
        self.distributedDistrict = self.activeDistrictMap.get(shardId)
        self.waitForDatabaseTimeout(requestName='WaitOnEnterResponses')
        self.handleSetShardComplete()

    enterWaitOnEnterResponses = report(
        types=['args', 'deltaStamp',
               'module'], dConfigParam='teleport')(enterWaitOnEnterResponses)

    def handleSetShardComplete(self):
        hoodId = self.handlerArgs['hoodId']
        zoneId = self.handlerArgs['zoneId']
        avId = self.handlerArgs['avId']
        self.uberZoneInterest = self.addInterest(
            base.localAvatar.getDefaultShard(), OTPGlobals.UberZone,
            'uberZone', 'uberZoneInterestComplete')
        self.acceptOnce('uberZoneInterestComplete',
                        self.uberZoneInterestComplete)
        self.waitForDatabaseTimeout(20, requestName='waitingForUberZone')

    handleSetShardComplete = report(
        types=['args', 'deltaStamp',
               'module'], dConfigParam='teleport')(handleSetShardComplete)

    def gotTimeSync(self):
        self.notify.info('gotTimeSync')
        self.ignore('gotTimeSync')
        self._PiratesClientRepository__gotTimeSync = 1
        self.moveOnFromUberZone()

    gotTimeSync = report(types=['args', 'deltaStamp'],
                         dConfigParam='teleport')(gotTimeSync)

    def moveOnFromUberZone(self):
        if not self._PiratesClientRepository__gotTimeSync:
            self.notify.info('Waiting for time sync.')
            return None

        hoodId = self.handlerArgs['hoodId']
        zoneId = self.handlerArgs['zoneId']
        avId = self.handlerArgs['avId']

    moveOnFromUberZone = report(types=['args', 'deltaStamp'],
                                dConfigParam='teleport')(moveOnFromUberZone)

    def enterGameOff(self):
        pass

    def exitGameOff(self):
        pass

    def getFriendFlags(self, doId):
        return 0

    def isFriend(self, doId):
        if not self.avatarFriendsManager.isFriend(doId):
            pass
        return self.playerFriendsManager.isFriend(doId)

    def isFriendOnline(self, doId):
        info = self.identifyFriend(doId)
        if info:
            return info.isOnline()