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
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
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
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)
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
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)
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')
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)
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)
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
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)
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)
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
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:]))
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
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
def SetupAudioEntity(model): triObserver = trinity.TriObserverLocal() result = audio2.AudEmitter('spaceObject_%s_general' % id(model)) triObserver.observer = result model.observers.append(triObserver) return result
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
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))
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')