From 44c56a974c428379ebf82386aac7b7443fd82a7d Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Wed, 19 Nov 2008 18:30:16 +0000 Subject: [PATCH] Mantis#2656. Thank you kindly, Nlin for a patch that: Attached patch implements llCollisionSound. Thanks T. Sado. --- OpenSim/Data/MySQL/MySQLRegionData.cs | 9 +++++ .../Data/MySQL/Resources/022_RegionStore.sql | 6 +++ .../Data/SQLite/Resources/015_RegionStore.sql | 6 +++ OpenSim/Data/SQLite/SQLiteRegionData.cs | 10 +++++ .../Environment/Scenes/SceneObjectPart.cs | 37 ++++++++++++++++++- .../Shared/Api/Implementation/LSL_Api.cs | 18 ++++++++- 6 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 OpenSim/Data/MySQL/Resources/022_RegionStore.sql create mode 100644 OpenSim/Data/SQLite/Resources/015_RegionStore.sql diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index effe10b95d..1daefe446d 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -981,6 +981,9 @@ namespace OpenSim.Data.MySQL createCol(prims, "ClickAction", typeof (Byte)); createCol(prims, "Material", typeof (Byte)); + createCol(prims, "CollisionSound", typeof(String)); + createCol(prims, "CollisionSoundVolume", typeof(Double)); + // Add in contraints prims.PrimaryKey = new DataColumn[] {prims.Columns["UUID"]}; @@ -1271,6 +1274,9 @@ namespace OpenSim.Data.MySQL if (!row.IsNull("ClickAction")) prim.ClickAction = Convert.ToByte(row["ClickAction"]); + prim.CollisionSound = new UUID(row["CollisionSound"].ToString()); + prim.CollisionSoundVolume = Convert.ToSingle(row["CollisionSoundVolume"]); + return prim; } @@ -1589,6 +1595,9 @@ namespace OpenSim.Data.MySQL row["ClickAction"] = clickAction; row["Material"] = prim.Material; + + row["CollisionSound"] = prim.CollisionSound.ToString(); + row["CollisionSoundVolume"] = prim.CollisionSoundVolume; } /// diff --git a/OpenSim/Data/MySQL/Resources/022_RegionStore.sql b/OpenSim/Data/MySQL/Resources/022_RegionStore.sql new file mode 100644 index 0000000000..af4fdce36a --- /dev/null +++ b/OpenSim/Data/MySQL/Resources/022_RegionStore.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE prims ADD COLUMN CollisionSound char(36) not null default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN CollisionSoundVolume float not null default 0.0; + +COMMIT; diff --git a/OpenSim/Data/SQLite/Resources/015_RegionStore.sql b/OpenSim/Data/SQLite/Resources/015_RegionStore.sql new file mode 100644 index 0000000000..f9c0eea7d4 --- /dev/null +++ b/OpenSim/Data/SQLite/Resources/015_RegionStore.sql @@ -0,0 +1,6 @@ +BEGIN; + +ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000'; +ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0; + +COMMIT; diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs index 4ce343ae1e..a959d564df 100644 --- a/OpenSim/Data/SQLite/SQLiteRegionData.cs +++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs @@ -877,6 +877,9 @@ namespace OpenSim.Data.SQLite createCol(prims, "Material", typeof(Byte)); + createCol(prims, "CollisionSound", typeof(String)); + createCol(prims, "CollisionSoundVolume", typeof(Double)); + // Add in contraints prims.PrimaryKey = new DataColumn[] {prims.Columns["UUID"]}; @@ -1237,6 +1240,10 @@ namespace OpenSim.Data.SQLite prim.ObjectSaleType = Convert.ToByte(row["SaleType"]); prim.Material = Convert.ToByte(row["Material"]); + + prim.CollisionSound = new UUID(row["CollisionSound"].ToString()); + prim.CollisionSoundVolume = Convert.ToSingle(row["CollisionSoundVolume"]); + return prim; } @@ -1564,6 +1571,9 @@ namespace OpenSim.Data.SQLite row["SalePrice"] = prim.SalePrice; row["Material"] = prim.Material; + + row["CollisionSound"] = prim.CollisionSound.ToString(); + row["CollisionSoundVolume"] = prim.CollisionSoundVolume; } /// diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index c7862ec4c7..a626fa300d 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 968581b900..a06ed9bdc6 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)