From 44c56a974c428379ebf82386aac7b7443fd82a7d Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Wed, 19 Nov 2008 18:30:16 +0000 Subject: Mantis#2656. Thank you kindly, Nlin for a patch that: Attached patch implements llCollisionSound. Thanks T. Sado. --- .../Region/Environment/Scenes/SceneObjectPart.cs | 37 +++++++++++++++++++++- .../Shared/Api/Implementation/LSL_Api.cs | 18 ++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index c7862ec..a626fa3 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -201,6 +201,10 @@ namespace OpenSim.Region.Environment.Scenes private Vector3 m_cameraAtOffset = new Vector3(0.0f, 0.0f, 0.0f); private bool m_forceMouselook = false; + // TODO: Collision sound should have default. + private UUID m_collisionSound = UUID.Zero; + private float m_collisionSoundVolume = 0.0f; + #endregion Fields #region Constructors @@ -952,6 +956,22 @@ if (m_shape != null) { set { m_sitAnimation = value; } } + public UUID CollisionSound + { + get { return m_collisionSound; } + set + { + m_collisionSound = value; + aggregateScriptEvents(); + } + } + + public float CollisionSoundVolume + { + get { return m_collisionSoundVolume; } + set { m_collisionSoundVolume = value; } + } + #endregion Public Properties with only Get @@ -1607,6 +1627,12 @@ if (m_shape != null) { if (m_parentGroup.IsDeleted) return; + // play the sound. + if (startedColliders.Count > 0 && CollisionSound != UUID.Zero && CollisionSoundVolume > 0.0f) + { + SendSound(CollisionSound.ToString(), CollisionSoundVolume, true, (byte)0); + } + if ((m_parentGroup.RootPart.ScriptEvents & scriptEvents.collision_start) != 0) { // do event notification @@ -3233,7 +3259,8 @@ if (m_shape != null) { if ( ((AggregateScriptEvents & scriptEvents.collision) != 0) || ((AggregateScriptEvents & scriptEvents.collision_end) != 0) || - ((AggregateScriptEvents & scriptEvents.collision_start) != 0) + ((AggregateScriptEvents & scriptEvents.collision_start) != 0) || + (CollisionSound != null && CollisionSound != UUID.Zero) ) { // subscribe to physics updates. @@ -3252,6 +3279,13 @@ if (m_shape != null) { PhysActor.OnCollisionUpdate -= PhysicsCollision; } } + + if (m_parentGroup == null) + { + ScheduleFullUpdate(); + return; + } + if ((GetEffectiveObjectFlags() & (uint)PrimFlags.Scripted) != 0) { m_parentGroup.Scene.EventManager.OnScriptTimerEvent += handleTimerAccounting; @@ -3363,3 +3397,4 @@ if (m_shape != null) { + diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 968581b..a06ed9b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -3490,7 +3490,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public void llCollisionSound(string impact_sound, double impact_volume) { m_host.AddScriptLPS(1); - NotImplemented("llCollisionSound"); + //NotImplemented("llCollisionSound"); + + // TODO: Parameter check logic required. + UUID soundId = UUID.Zero; + if (!UUID.TryParse(impact_sound, out soundId)) + { + foreach (TaskInventoryItem item in m_host.TaskInventory.Values) + { + if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) + { + soundId = item.AssetID; + break; + } + } + } + m_host.CollisionSound = soundId; + m_host.CollisionSoundVolume = (float)impact_volume; } public void llCollisionSprite(string impact_sprite) -- cgit v1.1