Refactoring llTriggerSoundLimited with a new method on ISoundModule, as the LL Wiki spec for llTriggerSoundLimited states an axis-aligned bounding box, not radial constraint

integration
SignpostMarv 2012-10-16 13:11:17 +01:00 committed by Justin Clark-Casey (justincc)
parent 56965dd959
commit a9999a9676
3 changed files with 36 additions and 6 deletions

View File

@ -334,6 +334,36 @@ namespace OpenSim.Region.CoreModules.World.Sound
} }
} }
public void TriggerSoundLimited(UUID objectID, UUID sound,
double volume, Vector3 min, Vector3 max)
{
if (sound == UUID.Zero)
return;
SceneObjectPart part;
if (!m_scene.TryGetSceneObjectPart(objectID, out part))
return;
m_scene.ForEachRootScenePresence(delegate(ScenePresence sp)
{
double dis = Util.GetDistanceTo(sp.AbsolutePosition,
part.AbsolutePosition);
if (dis > MaxDistance) // Max audio distance
return;
else if (!Util.IsInsideBox(sp.AbsolutePosition, min, max))
return;
// Scale by distance
double thisSpGain = volume * ((MaxDistance - dis) / MaxDistance);
sp.ControllingClient.SendTriggeredSound(sound, part.OwnerID,
part.UUID, part.ParentGroup.UUID,
m_scene.RegionInfo.RegionHandle,
part.AbsolutePosition, (float)thisSpGain);
});
}
#endregion #endregion
} }
} }

View File

@ -111,5 +111,8 @@ namespace OpenSim.Region.Framework.Interfaces
void SendSound(UUID objectID, UUID sound, double volume, void SendSound(UUID objectID, UUID sound, double volume,
bool triggered, byte flags, float radius, bool useMaster, bool triggered, byte flags, float radius, bool useMaster,
bool isMaster); bool isMaster);
void TriggerSoundLimited(UUID objectID, UUID sound, double volume,
Vector3 min, Vector3 max);
} }
} }

View File

@ -5876,12 +5876,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
if (m_SoundModule != null) if (m_SoundModule != null)
{ {
double radius1 = VecDist(m_host.GetWorldPosition(), top_north_east); m_SoundModule.TriggerSoundLimited(m_host.UUID,
double radius2 = VecDist(m_host.GetWorldPosition(), bottom_south_west); KeyOrName(sound, AssetType.Sound), volume,
double radius = Math.Abs(radius1 - radius2); bottom_south_west, top_north_east);
m_SoundModule.SendSound(m_host.UUID,
KeyOrName(sound, AssetType.Sound), volume, true, 0,
(float)radius, false, false);
} }
} }