Esempio n. 1
0
 def AddSoundToEffect(self, effect, turretSet):
     if len(effect.stretch) < 1:
         return
     srcAudio = audio2.AudEmitter('effect_source_%s' % str(id(self)))
     destAudio = audio2.AudEmitter('effect_dest_%s' % str(id(self)))
     if turretSet.hasCyclingFiringPos:
         sndStretchList = effect.stretch
     else:
         sndStretchList = effect.stretch[:1]
     for sndStretch in sndStretchList:
         if sndStretch.stretchObject:
             sourceAudioLocation = sndStretch.stretchObject
         else:
             sourceAudioLocation = sndStretch.sourceObject
         if sourceAudioLocation:
             obs = trinity.TriObserverLocal()
             obs.front = (0.0, -1.0, 0.0)
             obs.observer = srcAudio
             del sourceAudioLocation.observers[:]
             sourceAudioLocation.observers.append(obs)
         if sndStretch.destObject:
             obs = trinity.TriObserverLocal()
             obs.front = (0.0, -1.0, 0.0)
             obs.observer = destAudio
             del sndStretch.destObject.observers[:]
             sndStretch.destObject.observers.append(obs)
         for eachSet in sndStretch.curveSets:
             for eachCurve in eachSet.curves:
                 if eachCurve.__typename__ == 'TriEventCurve':
                     if eachCurve.name == 'audioEventsSource':
                         eachCurve.eventListener = srcAudio
                     elif eachCurve.name == 'audioEventsDest':
                         eachCurve.eventListener = destAudio
 def AddSoundToEffect(self):
     shipID = self.GetEffectShipID()
     shipBall = self.GetEffectShipBall()
     targetID = self.GetEffectTargetID()
     targetBall = self.GetEffectTargetBall()
     if shipBall is None or targetBall is None:
         return
     srcAudio = audio2.AudEmitter('effect_source_' + str(shipID))
     destAudio = audio2.AudEmitter('effect_dest_' + str(targetID))
     srcRadius = shipBall.radius
     destRadius = targetBall.radius
     srcAttenuation = pow(srcRadius, 0.95) * 33
     destAttenuation = pow(destRadius, 0.95) * 33
     srcAudio.SetAttenuationScalingFactor(srcAttenuation)
     destAudio.SetAttenuationScalingFactor(destAttenuation)
     if self.gfx.sourceObject:
         obs = trinity.TriObserverLocal()
         obs.front = (0.0, -1.0, 0.0)
         obs.observer = srcAudio
         self.gfx.sourceObject.observers.append(obs)
     if self.gfx.destObject:
         obs = trinity.TriObserverLocal()
         obs.front = (0.0, -1.0, 0.0)
         obs.observer = destAudio
         self.gfx.destObject.observers.append(obs)
     for eachSet in self.gfx.curveSets:
         for eachCurve in eachSet.curves:
             if eachCurve.__typename__ == 'TriEventCurve':
                 if eachCurve.name == 'audioEventsSource':
                     eachCurve.eventListener = srcAudio
                 elif eachCurve.name == 'audioEventsDest':
                     eachCurve.eventListener = destAudio
Esempio n. 3
0
def CreateEmitterForBooster(
        model,
        boosterSize,
        isAudioBoosterLocator=lambda n: n.name == BOOSTER_AUDIO_LOCATOR_NAME):
    locs = filter(isAudioBoosterLocator, model.locators)
    if not locs:
        return None
    if len(locs) > 1:
        L.error(
            'Found %s locs, needed 1. Content should be validated against this!',
            len(locs))
    audLocator = locs[0]
    observer = trinity.TriObserverLocal()
    transform = audLocator.transform
    observer.front = (-transform[2][0], -transform[2][1], -transform[2][2])
    observer.position = (transform[3][0], transform[3][1], transform[3][2])
    audioService = sm.GetService('audio')
    if audioService.GetDopplerEmittersUsage() and boosterSize in ('f', 'c',
                                                                  'bs'):
        rtpcChangeDuration = 17
        emitterName = 'ship_%s_booster' % id(model)
        rtpcName = 'doppler_shift_booster_' + boosterSize
        emitter = audio2.AudEmitterDoppler(emitterName, rtpcName,
                                           rtpcChangeDuration)
    else:
        emitter = audio2.AudEmitter('ship_%s_booster' % id(model))
    audparam = audio2.AudParameter()
    audparam.name = u'ship_speed'
    emitter.parameters.append(audparam)
    observer.observer = emitter
    model.observers.append(observer)
    model.audioSpeedParameter = audparam
    return emitter
Esempio n. 4
0
 def AddSoundToEffect(self, scaler):
     import effects
     if effects.FX_TF_POSITION_TARGET & self.transformFlags:
         effectBall = self.GetEffectTargetBall()
     else:
         effectBall = self.GetEffectShipBall()
     shipID = self.GetEffectShipID()
     entity = audio2.AudEmitter('effect_' + str(shipID) + '_' +
                                self.__guid__)
     if self.gfx:
         srcRadius = effectBall.radius
     else:
         srcRadius = self.sourceObject.boundingSphereRadius
     attenuation = pow(srcRadius, 0.95) * 33 * scaler
     entity.SetAttenuationScalingFactor(attenuation)
     self.observer = trinity.TriObserverLocal()
     self.observer.observer = entity
     if self.gfx.__bluetype__ in ('trinity.EveTransform',
                                  'trinity.EveStation2'):
         self.gfx.observers.append(self.observer)
     else:
         self.sourceObject.observers.append(self.observer)
     for curve in self.gfx.Find('trinity.TriEventCurve'):
         if curve.name == 'audioEvents':
             curve.eventListener = entity
Esempio n. 5
0
    def Prepare(self):
        shipID = self.ballIDs[0]
        shipBall = self.fxSequencer.GetBall(shipID)
        if shipBall is None:
            raise RuntimeError('EMPWave: no ball found')
        if self.moduleTypeID == 0:
            self.moduleTypeID = 15957
        graphicID = cfg.invtypes.Get(self.moduleTypeID).graphicID
        if graphicID is None:
            raise RuntimeError('EMPWave: no graphic ID')
        gfxString = util.GraphicFile(graphicID)
        self.gfx = trinity.Load(gfxString)
        if self.gfx is None:
            raise RuntimeError('EMPWave: no effect found')
        entity = audio2.AudEmitter('effect_' + str(shipID))
        obs = trinity.TriObserverLocal()
        obs.observer = entity
        if self.gfx.__bluetype__ in ('trinity.EveTransform', ):
            self.gfx.observers.append(obs)
        for curveSet in self.gfx.curveSets:
            for curve in curveSet.curves:
                if curve.__typename__ == 'TriEventCurve' and curve.name == 'audioEvents':
                    curve.eventListener = entity

        self.gfxModel = trinity.EveRootTransform()
        radius = self.fxSequencer.GetTypeAttribute(
            self.moduleTypeID, const.attributeEmpFieldRange)
        self.gfxModel.scaling = (radius / 1000, radius / 1000, radius / 1000)
        self.radius = radius
        self.gfxModel.name = self.__guid__
        self.gfxModel.children.append(self.gfx)
        self.gfxModel.translationCurve = shipBall
        scene = self.fxSequencer.GetScene()
        scene.objects.append(self.gfxModel)
Esempio n. 6
0
    def AddIncursionStationSoundIfApplicableThread(self):
        count = 0
        success = False
        while success == False and count < 60:
            blue.synchro.SleepWallclock(1000)
            count += 1
            if session.stationid is None:
                success = True
                break
            try:
                if not self.stationAudioPlaying:
                    scene = sm.GetService('sceneManager').GetRegisteredScene(
                        'default')
                    stationModel = scene.objects[0]
                    addedSound = self.GetSoundUrlByKey('hangar')
                    if addedSound is not None:
                        triObserver = trinity.TriObserverLocal()
                        generalAudioEntity = audio2.AudEmitter('Story_general')
                        triObserver.observer = generalAudioEntity
                        stationModel.observers.append(triObserver)
                        generalAudioEntity.SendEvent(unicode(addedSound[6:]))
                        self.stationAudioPlaying = True
                        success = True
            except:
                self.LogInfo(
                    'Could not add incursion station sound trying again in 1 second'
                )

        if success == False:
            self.LogError(
                'Incursion station audio could not be added after 60 tries')
        self.addStationSoundThreadRunning = False
Esempio n. 7
0
    def GetAudioBus(self, is3D=False):
        """
            This method opens an audio bus and starts the bussing plugin for piping sounds into WWise.
            
            ARGUMENTS:
                is3D    (defaults to false) A bool that signifies if the sound played will be localized or 2D
        
            RETURNS:
                An audio emitter object that must be retained for the lifetime of the audio bus
                A channel number for the output to be bussed into.
        """
        for outputChannel, emitterWeakRef in self.busChannels.iteritems():
            if emitterWeakRef is None:
                emitter = audio2.AudEmitter('Bus Channel: ' +
                                            str(outputChannel))
                if is3D:
                    emitter.SendEvent(
                        unicode('Play_3d_audio_stream_' + str(outputChannel)))
                else:
                    emitter.SendEvent(
                        unicode('Play_2d_audio_stream_' + str(outputChannel)))
                self.busChannels[outputChannel] = weakref.ref(
                    emitter, self.AudioBusDeathCallback)
                return (emitter, outputChannel)

        self.LogError('Bus voice starvation!')
        return (None, -1)
Esempio n. 8
0
 def ShowSiteDuringSweep(self, locatorData, scene, siteData, sleepTimeSec,
                         soundLocators, vectorCurve):
     ball = locatorData.ballRef()
     if ball is None:
         return
     audio = audio2.AudEmitter('sensor_overlay_site_%s' %
                               str(siteData.siteID))
     obs = trinity.TriObserverLocal()
     obs.front = (0.0, -1.0, 0.0)
     obs.observer = audio
     vectorSequencer = trinity.TriVectorSequencer()
     vectorSequencer.operator = trinity.TRIOP_MULTIPLY
     vectorSequencer.functions.append(ball)
     vectorSequencer.functions.append(vectorCurve)
     tr = trinity.EveRootTransform()
     tr.name = 'sensorSuiteSoundLocator_%s' % str(siteData.siteID)
     tr.translationCurve = vectorSequencer
     tr.observers.append(obs)
     scene.objects.append(tr)
     soundLocators.append(tr)
     uthread2.SleepSim(sleepTimeSec)
     if siteData.GetSiteType() == ANOMALY:
         audio.SendEvent('ui_scanner_result_anomaly')
     elif siteData.GetSiteType() == SIGNATURE:
         audio.SendEvent('ui_scanner_result_signature')
     locatorData.bracket.DoEntryAnimation(enable=False)
     locatorData.bracket.state = uiconst.UI_DISABLED
 def PlaySoundFX(self, targetObject, spewCone):
     position, direction = spewCone
     audioEmitter = audio2.AudEmitter(targetObject.name + '_src')
     translatedPosition = geo2.Vec3Add(targetObject.worldPosition, position)
     audioEmitter.SetPosition(direction, translatedPosition)
     audioEmitter.SetAttenuationScalingFactor(10000)
     audioEmitter.SendEvent('scattering_spew_play')
Esempio n. 10
0
    def _SpawnExplosion(self, warheadIdx):
        if not self.model:
            self.LogWarn('Missile::_SpawnExplosion no model')
            return
        explosionPosition = self._GetExplosionPosition(warheadIdx)
        self.warheadsReleased += 1
        if self.exploded:
            return
        if self.warheadsReleased == self.totalWarheadCount:
            if self.model:
                self.model.target = None
                self.model.explosionCallback = None
                self.RemoveAndClearModel(self.model,
                                         self.globalsGlob.GetScene())
                self.model = None
            if self.delayedBall:
                self.globalsGlob.DestroyClientBall(self.delayedBall)
                self.delayedBall = None
            self.exploded = True
        actualModel = self.explosionManager.GetExplosion(
            self.explosionPath, preloaded=True, callback=self.CleanupExplosion)
        if actualModel is None:
            self.LogError('missile::LoadModel failed to get explosion ' +
                          str(self.explosionPath))
            self.explosionManager.Cancel(self.explosionPath, 1)
            return
        explosionBall = None
        if self.enabled:
            explosionBall = self.globalsGlob.SpawnClientBall(explosionPosition)
            actualModel.translationCurve = explosionBall
            rndRotation = geo2.QuaternionRotationSetYawPitchRoll(
                random.random() * 2.0 * math.pi,
                random.random() * 2.0 * math.pi,
                random.random() * 2.0 * math.pi)
            actualModel.rotation = rndRotation
            scene = self.globalsGlob.GetScene()
            if scene is not None:
                scene.objects.append(actualModel)
                audio = audio2.AudEmitter('effect_source_%s' % str(id(self)))
                obs = trinity.TriObserverLocal()
                obs.front = (0.0, -1.0, 0.0)
                obs.observer = audio
                del actualModel.observers[:]
                actualModel.observers.append(obs)

                def AudioSetup(*args):
                    for eachSet in actualModel.active.curveSets:
                        for eachCurve in eachSet.curves:
                            if eachCurve.__typename__ == 'TriEventCurve':
                                audio.SendEvent(eachCurve.GetKeyValue(0))
                                break

                loadedEventHandler = blue.BlueEventToPython()
                loadedEventHandler.handler = AudioSetup
                actualModel.loadedCallback = loadedEventHandler
            shakeMagnitude = min(actualModel.boundingSphereRadius, 250)
            shakeMagnitude = max(shakeMagnitude, 50)
            self.globalsGlob.ShakeCamera(shakeMagnitude, explosionPosition)
Esempio n. 11
0
 def _SetupMissileBoosterAudio(self, wh, useDopplerEmitter):
     del wh.observers[:]
     observer = trinity.TriObserverLocal()
     if useDopplerEmitter:
         emitter = audio2.AudEmitterDoppler('ship_%s_warhead' % id(wh), 'doppler_shift_d', 100)
     else:
         emitter = audio2.AudEmitter('ship_%s_booster' % id(wh))
     observer.observer = emitter
     emitter.SendEvent(u'ship_booster_angel_d_play')
     wh.observers.append(observer)
Esempio n. 12
0
def SetupAudioEntity(model):
    """
    Creates a generalized audio emitter that objects can use to play random
    audio events on a space object.
    
    :return: AudEmitter
    :raises: AttributeError if model does not support observers.
    """
    triObserver = trinity.TriObserverLocal()
    result = audio2.AudEmitter('spaceObject_%s_general' % id(model))
    triObserver.observer = result
    model.observers.append(triObserver)
    return result
Esempio n. 13
0
 def AddSoundToEffect(self, scaler=1.0, model=None):
     shipID = self.GetEffectShipID()
     emitter_name = 'effect_' + str(shipID) + '_' + self.__guid__
     self.CheckForExistingObserver(model, emitter_name)
     if self.observer is None:
         self.observer = trinity.TriObserverLocal()
         entity = audio2.AudEmitter(emitter_name)
         self.observer.observer = entity
         if model is None:
             model = self.gfx
         self.AttachObserverToModel(model)
         self.AttachObserverToTriEventCurve()
         if hasattr(self.observer,
                    'observer') and self.observer.observer is not None:
             self.ScaleEffectAudioEmitter(self.observer.observer, scaler)
Esempio n. 14
0
    def GetAudioBus(self, is3D = False, rate = 44100):
        isLowRate = rate == 44100
        for outputChannel, emitterWeakRef in self.busChannels.iteritems():
            channelLowRate = outputChannel >= 4
            if isLowRate == channelLowRate and emitterWeakRef is None:
                emitter = audio2.AudEmitter('Bus Channel: ' + str(outputChannel))
                if is3D:
                    emitter.SendEvent(unicode('Play_3d_audio_stream_' + str(outputChannel)))
                else:
                    emitter.SendEvent(unicode('Play_2d_audio_stream_' + str(outputChannel)))
                self.busChannels[outputChannel] = weakref.ref(emitter, self.AudioBusDeathCallback)
                return (emitter, outputChannel)

        self.LogError('Bus voice starvation!')
        return (None, -1)
Esempio n. 15
0
 def GetGeneralAudioEntity(self):
     if self.generalAudioEntity is None:
         if self.model is not None and hasattr(self.model, 'observers'):
             triObserver = trinity.TriObserverLocal()
             self.generalAudioEntity = audio2.AudEmitter('spaceObject_' +
                                                         str(self.id) +
                                                         '_general')
             triObserver.observer = self.generalAudioEntity
             self.audioEntities.append(self.generalAudioEntity)
             self.model.observers.append(triObserver)
         else:
             self.LogWarn(
                 self.id,
                 'unable to construct generalized audio entity - model has no observers property'
             )
     return self.generalAudioEntity
Esempio n. 16
0
 def SetupComponent(self, entity, component):
     self.audioEmitterComponentsByScene[entity.scene.sceneID][
         entity.entityID] = component
     component.positionObserver = None
     if component.groupName is None:
         component.emitter = audio2.AudEmitter('AudEmitter_' +
                                               str(entity.entityID))
         positionComponent = entity.GetComponent('position')
         if positionComponent:
             self.audioEmitterPositionsByComponent[
                 component] = positionComponent
             component.positionObserver = GameWorld.PlacementObserverWrapper(
                 component.emitter)
             positionComponent.RegisterPlacementObserverWrapper(
                 component.positionObserver)
     else:
         groupedEntities = self.audioEmitterComponentGroupsByScene[
             entity.scene.sceneID][component.groupName]
         if len(groupedEntities) == 0:
             component.emitter = audio2.AudEmitterMulti(
                 'Multi_' + str(component.groupName))
             component.positionObserver = GameWorld.MultiPlacementObserverWrapper(
                 component.emitter)
         else:
             component.emitter = groupedEntities[0].emitter
             component.positionObserver = groupedEntities[
                 0].positionObserver
         groupedEntities.append(component)
         positionComponent = entity.GetComponent('position')
         if positionComponent:
             component.positionObserver.AddPositionComponent(
                 positionComponent)
     if component.initialEventName:
         component.emitter.SendEvent(unicode(component.initialEventName))
     if component.initialSoundID:
         sound = cfg.sounds.GetIfExists(component.initialSoundID)
         if sound:
             component.emitter.SendEvent(unicode(sound.soundFile[6:]))
Esempio n. 17
0
def CreateEmitterForBooster(
        model,
        isAudioBoosterLocator=lambda n: n.name == BOOSTER_AUDIO_LOCATOR_NAME):
    locs = filter(isAudioBoosterLocator, model.locators)
    if not locs:
        return None
    if len(locs) > 1:
        L.error(
            'Found %s locs, needed 1. Content should be validated against this!',
            len(locs))
    audLocator = locs[0]
    observer = trinity.TriObserverLocal()
    transform = audLocator.transform
    observer.front = (-transform[2][0], -transform[2][1], -transform[2][2])
    observer.position = (transform[3][0], transform[3][1], transform[3][2])
    emitter = audio2.AudEmitter('ship_%s_booster' % id(model))
    audparam = audio2.AudParameter()
    audparam.name = u'ship_speed'
    emitter.parameters.append(audparam)
    observer.observer = emitter
    model.observers.append(observer)
    model.audioSpeedParameter = audparam
    return emitter
Esempio n. 18
0
    def ShowActiveShip(self):
        if getattr(self, '__alreadyShowingActiveShip', False):
            log.LogTraceback(
                "We're already in the process of showing the active ship")
            return
        self.__alreadyShowingActiveShip = True
        try:
            scene = getattr(self, 'hangarScene', None)
            if scene:
                for each in scene.objects:
                    if getattr(each, 'name', None) == str(self.activeShip):
                        scene.objects.remove(each)

            try:
                techLevel = self.godma.GetTypeAttribute(
                    self.activeShipItem.typeID, const.attributeTechLevel)
                if techLevel == 3.0:
                    try:
                        dogmaItem = self.clientDogmaIM.GetDogmaLocation(
                        ).dogmaItems.get(self.activeShipItem.itemID, None)
                        if dogmaItem is None:
                            log.LogTraceback(
                                'Trying to show t3 ship which is not in dogma')
                            return
                        subSystemIds = {}
                        for fittedItem in dogmaItem.GetFittedItems(
                        ).itervalues():
                            if fittedItem.categoryID == const.categorySubSystem:
                                subSystemIds[
                                    fittedItem.groupID] = fittedItem.typeID

                        newModel = self.t3ShipSvc.GetTech3ShipFromDict(
                            dogmaItem.typeID, subSystemIds)
                    except:
                        log.LogException('failed bulding modular ship')
                        sys.exc_clear()
                        return

                else:
                    modelPath = cfg.invtypes.Get(
                        self.activeShipItem.typeID).GraphicFile()
                    newFilename = modelPath.lower().replace(
                        ':/model', ':/dx9/model')
                    newFilename = newFilename.replace('.blue', '.red')
                    newModel = trinity.Load(newFilename)
                self.generalAudioEntity = None
                if newModel is not None and hasattr(newModel, 'observers'):
                    triObserver = trinity.TriObserverLocal()
                    self.generalAudioEntity = audio2.AudEmitter(
                        'spaceObject_' + str(self.activeShipItem.itemID) +
                        '_general')
                    triObserver.observer = self.generalAudioEntity
                    newModel.observers.append(triObserver)
            except Exception as e:
                log.LogException(str(e))
                sys.exc_clear()
                return

            newModel.FreezeHighDetailMesh()
            self.PositionShipModel(newModel)
            if hasattr(newModel, 'ChainAnimationEx'):
                newModel.ChainAnimationEx('NormalLoop', 0, 0, 1.0)
            self.activeShip = self.activeShipItem.itemID
            self.activeshipmodel = newModel
            newModel.display = 1
            newModel.name = str(self.activeShipItem.itemID)
            if self.clientDogmaIM.GetDogmaLocation().dogmaItems[
                    util.GetActiveShip()].groupID != const.groupCapsule:
                scene.objects.append(newModel)
                self.generalAudioEntity.SendEvent(
                    unicode('hangar_spin_switch_ship_play'))
            sm.ScatterEvent('OnActiveShipModelChange', newModel,
                            self.activeShipItem.itemID)
        finally:
            self.__alreadyShowingActiveShip = False
Esempio n. 19
0
def SetupAudioEntity(model):
    triObserver = trinity.TriObserverLocal()
    result = audio2.AudEmitter('spaceObject_%s_general' % id(model))
    triObserver.observer = result
    model.observers.append(triObserver)
    return result
Esempio n. 20
0
    def ShowActiveShip(self):
        if getattr(self, '__alreadyShowingActiveShip', False):
            log.LogTraceback(
                "We're already in the process of showing the active ship")
            return
        self.__alreadyShowingActiveShip = True
        try:
            scene = getattr(self, 'hangarScene', None)
            if scene:
                for each in scene.objects:
                    if getattr(each, 'name', None) == str(self.activeShip):
                        scene.objects.remove(each)

            try:
                if IsModularShip(self.activeShipItem.typeID):
                    try:
                        dogmaItem = self.clientDogmaIM.GetDogmaLocation(
                        ).dogmaItems.get(self.activeShipItem.itemID, None)
                        if dogmaItem is None:
                            log.LogTraceback(
                                'Trying to show t3 ship which is not in dogma')
                            return
                        subSystemIds = {}
                        for fittedItem in dogmaItem.GetFittedItems(
                        ).itervalues():
                            if fittedItem.categoryID == const.categorySubSystem:
                                subSystemIds[
                                    fittedItem.groupID] = fittedItem.typeID

                        newModel = self.t3ShipSvc.GetTech3ShipFromDict(
                            dogmaItem.typeID, subSystemIds)
                    except:
                        log.LogException('failed bulding modular ship')
                        sys.exc_clear()
                        return

                else:
                    shipDna = gfxutils.BuildSOFDNAFromTypeID(
                        self.activeShipItem.typeID)
                    if shipDna is not None:
                        sof = sm.GetService('sofService').spaceObjectFactory
                        newModel = sof.BuildFromDNA(shipDna)
                self.generalAudioEntity = None
                if newModel is not None and hasattr(newModel, 'observers'):
                    triObserver = trinity.TriObserverLocal()
                    self.generalAudioEntity = audio2.AudEmitter(
                        'spaceObject_' + str(self.activeShipItem.itemID) +
                        '_general')
                    triObserver.observer = self.generalAudioEntity
                    newModel.observers.append(triObserver)
            except Exception as e:
                log.LogException(str(e))
                sys.exc_clear()
                return

            newModel.FreezeHighDetailMesh()
            self.PositionShipModel(newModel)
            self.activeShip = self.activeShipItem.itemID
            self.SetupAnimation(newModel, self.activeShipItem)
            self.activeshipmodel = newModel
            newModel.display = 1
            newModel.name = str(self.activeShipItem.itemID)
            if self.clientDogmaIM.GetDogmaLocation().dogmaItems[
                    util.GetActiveShip()].groupID != const.groupCapsule:
                scene.objects.append(newModel)
                self.generalAudioEntity.SendEvent(
                    unicode('hangar_spin_switch_ship_play'))
            sm.ScatterEvent('OnActiveShipModelChange', newModel,
                            self.activeShipItem.itemID)
        finally:
            self.__alreadyShowingActiveShip = False
Esempio n. 21
0
    def FitBoosters(self, alwaysOn=False, enableTrails=True):
        if self.typeID is None:
            return
        if self.raceID is None:
            self.LogError(
                'SpaceObject type %s has invaldi raceID (not set!) ' %
                self.typeID)
            self.raceID = gfxRaceGeneric
        boosterResPath = BOOSTER_GFX_SND_RESPATHS[self.raceID][0]
        boosterSoundName = BOOSTER_GFX_SND_RESPATHS[self.raceID][1]
        boosterFxObj = trinity.Load(boosterResPath)
        if boosterFxObj is None:
            return
        if self.model is None:
            log.LogWarn(
                'No model to fit boosters to on spaceobject with id = ' +
                str(self.id))
            return
        if not hasattr(self.model, 'boosters'):
            log.LogWarn(
                'Model has no attribute boosters on spaceobject with id = ' +
                str(self.id))
            return
        self.model.boosters = boosterFxObj
        self.model.boosters.maxVel = self.maxVelocity
        self.model.RebuildBoosterSet()
        self.model.boosters.alwaysOn = alwaysOn
        if not enableTrails:
            self.model.boosters.trails = None
        boosterAudioLocators = filter(
            lambda node: node.name.startswith('locator_audio_booster'),
            self.model.locators)
        tmpEntity = None
        tmpParameter = None
        for audLocator in boosterAudioLocators:
            tlpo = trinity.TriObserverLocal()
            transform = audLocator.transform
            tlpo.front = (-transform[2][0], -transform[2][1], -transform[2][2])
            tlpo.position = (transform[3][0], transform[3][1], transform[3][2])
            if tmpEntity is None:
                tmpEntity = audio2.AudEmitter('ship_' + str(self.id) +
                                              '_booster')
                tmpParameter = audio2.AudParameter()
                tmpParameter.name = u'ship_speed'
                tmpEntity.parameters.append(tmpParameter)
                self.shipSpeedParameter = tmpParameter
            tlpo.observer = tmpEntity
            self.audioEntities.append(tmpEntity)
            self.model.observers.append(tlpo)

        boosterSize = 'f'
        if self.radius > 99:
            boosterSize = 'c'
            if self.radius > 309:
                boosterSize = 'bs'
                if self.radius > 1500:
                    boosterSize = 'dr'
                    if self.radius > 5000:
                        boosterSize = 't'
        self.boosterAudioEvent = '_'.join(
            [boosterSoundName, boosterSize, 'play'])
        if tmpEntity is not None:
            self.model.audioSpeedParameter = self.shipSpeedParameter
            baseVelocity = 1
            if util.IsNPC(self.id):
                baseVelocity = sm.StartService('godma').GetTypeAttribte(
                    self.typeID, const.attributeEntityCruiseSpeed)
            else:
                baseVelocity = sm.StartService('godma').GetTypeAttribute(
                    self.typeID, const.attributeMaxVelocity)
            if baseVelocity is None:
                baseVelocity = 1.0
            self.model.maxSpeed = baseVelocity
            tmpEntity.SendEvent(unicode(self.boosterAudioEvent))
Esempio n. 22
0
    def ShowActiveShip(self):
        if sm.GetService('viewState').IsCurrentViewSecondary():
            return
        if getattr(self, '__alreadyShowingActiveShip', False):
            return
        setattr(self, '__alreadyShowingActiveShip', True)
        try:
            modelToRemove = None
            if self.hangarScene:
                for each in self.hangarScene.objects:
                    if getattr(each, 'name', None) == str(self.activeShip):
                        modelToRemove = each

            techLevel = self.godma.GetTypeAttribute(self.activeShipItem.typeID,
                                                    const.attributeTechLevel)
            if techLevel == 3.0:
                try:
                    dogmaItem = self.clientDogmaIM.GetDogmaLocation(
                    ).dogmaItems.get(self.activeShipItem.itemID, None)
                    if dogmaItem is None:
                        log.LogTraceback(
                            'Trying to show t3 ship which is not in dogma')
                        return
                    subSystemIds = {}
                    for fittedItem in dogmaItem.GetFittedItems().itervalues():
                        if fittedItem.categoryID == const.categorySubSystem:
                            subSystemIds[
                                fittedItem.groupID] = fittedItem.typeID

                    newModel = self.t3ShipSvc.GetTech3ShipFromDict(
                        dogmaItem.typeID, subSystemIds)
                except:
                    log.LogException('failed bulding modular ship')
                    sys.exc_clear()
                    return

            else:
                modelPath = cfg.invtypes.Get(
                    self.activeShipItem.typeID).GraphicFile()
                newFilename = modelPath.lower().replace(
                    ':/model', ':/dx9/model')
                newFilename = newFilename.replace('.blue', '.red')
                newModel = trinity.Load(newFilename)
            self.generalAudioEntity = None
            if newModel is not None and hasattr(newModel, 'observers'):
                triObserver = trinity.TriObserverLocal()
                self.generalAudioEntity = audio2.AudEmitter(
                    'spaceObject_' + str(self.activeShipItem.itemID) +
                    '_general')
                triObserver.observer = self.generalAudioEntity
                newModel.observers.append(triObserver)
            sm.ScatterEvent('OnActiveShipModelChange', newModel,
                            self.activeShipItem.itemID)
            newModel.FreezeHighDetailMesh()
            zoomTo = self.GetZoomValues(newModel, 0)
            if not self.staticEnv and hasattr(newModel, 'ChainAnimationEx'):
                newModel.ChainAnimationEx('NormalLoop', 0, 0, 1.0)
            self.activeShip = self.activeShipItem.itemID
            self.activeshipmodel = newModel
            self.AdjustHangarScale()
            newModel.name = str(self.activeShipItem.itemID)
            if not self.staticEnv and zoomTo > self.lastShipzoomTo and self.hangarScene is not None and modelToRemove is not None:
                uthread.new(self.DelayedSwap, self.hangarScene, modelToRemove,
                            newModel)
            else:
                newModel.display = 1
                if modelToRemove is not None:
                    self.hangarScene.objects.remove(modelToRemove)
                self.hangarScene.objects.append(newModel)
            self.generalAudioEntity.SendEvent(
                unicode('hangar_spin_switch_ship_play'))
            self.lastShipzoomTo = zoomTo
            self.Zoom(zoomTo)
            if self.staticEnv:
                self.RenderStaticEnvironment()
            else:
                self.RenderDynamicEnvironment()
        except Exception as e:
            log.LogException(str(e))
            sys.exc_clear()
        finally:
            delattr(self, '__alreadyShowingActiveShip')