From ddc2f2ccd3566a9a4a3631c872979aa6830dbcfe Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Sun, 28 Aug 2016 08:45:09 +0100 Subject: mantis: 8008 unscripted child prim collisions didn't trigger scripted root prim collision events; collision sounds had incorrect aggregateevents call and default sounds where muted. Future optimization needed and Testing --- OpenSim/Region/Framework/Scenes/CollisionSounds.cs | 5 +++-- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 20 ++++++++++++++++++++ OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 6 ++---- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 4 files changed, 26 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs index 078449b..84817a0 100644 --- a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs +++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs @@ -129,8 +129,6 @@ namespace OpenSim.Region.Framework.Scenes return; float volume = part.CollisionSoundVolume; - if (volume == 0.0f) - return; UUID soundID = part.CollisionSound; @@ -150,6 +148,9 @@ namespace OpenSim.Region.Framework.Scenes break; } + if (volume == 0.0f) + return; + bool doneownsound = false; int thisMaterial = (int)part.Material; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 9b7374c..b7c5b6b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2112,6 +2112,12 @@ namespace OpenSim.Region.Framework.Scenes d.AddActiveScripts(count); } + private const scriptEvents PhysicsNeeedSubsEvents = ( + scriptEvents.collision | scriptEvents.collision_start | scriptEvents.collision_end | + scriptEvents.land_collision | scriptEvents.land_collision_start | scriptEvents.land_collision_end); + + private scriptEvents lastRootPartPhysEvents = 0; + public void aggregateScriptEvents() { PrimFlags objectflagupdate = (PrimFlags)RootPart.GetEffectiveObjectFlags(); @@ -2148,6 +2154,20 @@ namespace OpenSim.Region.Framework.Scenes m_scene.RemoveGroupTarget(this); } + scriptEvents rootPartPhysEvents = RootPart.AggregateScriptEvents; + rootPartPhysEvents &= PhysicsNeeedSubsEvents; + if (rootPartPhysEvents != lastRootPartPhysEvents) + { + lastRootPartPhysEvents = rootPartPhysEvents; + for (int i = 0; i < parts.Length; i++) + { + SceneObjectPart part = parts[i]; + if (part == null) + continue; + part.UpdatePhysicsSubscribedEvents(); + } + } + ScheduleGroupForFullUpdate(); } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index dd20a2f..fcc3463 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -1534,7 +1534,6 @@ namespace OpenSim.Region.Framework.Scenes else m_collisionSoundType = 1; - aggregateScriptEvents(); } } @@ -5033,7 +5032,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter } - private void UpdatePhysicsSubscribedEvents() + internal void UpdatePhysicsSubscribedEvents() { PhysicsActor pa = PhysActor; if (pa == null) @@ -5107,8 +5106,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop; } - UpdatePhysicsSubscribedEvents(); - LocalFlags = (PrimFlags)objectflagupdate; if (ParentGroup != null && ParentGroup.RootPart == this) @@ -5119,6 +5116,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter { // m_log.DebugFormat( // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); + UpdatePhysicsSubscribedEvents(); ScheduleFullUpdate(); } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 914644a..50ee9d4 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -1246,7 +1246,7 @@ namespace OpenSim.Region.Framework.Scenes physActor_OnPhysicsRequestingCameraData; partPhysActor.OnPhysicsRequestingCameraData += physActor_OnPhysicsRequestingCameraData; - } + } } ParentUUID = UUID.Zero; } -- cgit v1.1