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 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 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 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 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 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 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 _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 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 SetupSharedEmitterForAudioEvent(model, eventName): """ Takes a model and an event and looks into the MultiEvent list of the AudManager to see if the multi emitter already exists. If it exists then it gets the emitter and attaches it to a TriObserverLocal and adds it to the observer list of the model. If there is no emitter found it will create a new emitter and attach that to the TriObserverLocal and add that to the observer list. :param model: A SpaceObject that has to have an observers list :param eventName: A string containing the name of the event that will be sent to the emitter upon creation. """ triObserver = trinity.TriObserverLocal() emitter = GetSharedAudioEmitter(eventName) triObserver.observer = emitter model.observers.append(triObserver)
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 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')
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 SetupSharedEmitterForAudioEvent(model, eventName): triObserver = trinity.TriObserverLocal() emitter = GetSharedAudioEmitter(eventName) triObserver.observer = emitter model.observers.append(triObserver)
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))