From b70da6ac1955ada29e1cb4dbe9aeb915735ec686 Mon Sep 17 00:00:00 2001 From: Teravus Ovares Date: Wed, 30 Apr 2008 16:52:12 +0000 Subject: * Patch by Melanie. Implements proper objectflags on child objects. Thanks Melanie! RE: 0001079: r4387. touch() event does not fire when touch script is in root prim and child prims are touched --- .../Region/Environment/Scenes/SceneObjectGroup.cs | 107 +++------------------ 1 file changed, 15 insertions(+), 92 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs') diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index c28e66f..863146c 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -96,8 +96,6 @@ namespace OpenSim.Region.Environment.Scenes private LLVector3 lastPhysGroupPos; private LLQuaternion lastPhysGroupRot; - private scriptEvents m_aggregateScriptEvents = scriptEvents.None; - /// /// The constituent parts of this group /// @@ -716,7 +714,7 @@ namespace OpenSim.Region.Environment.Scenes m_rootPart.SetParentLocalId(0); m_rootPart.SetAttachmentPoint((byte)0); m_rootPart.m_IsAttachment = false; - m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_scene.m_physicalPrim); + m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); AttachToBackup(); m_rootPart.ScheduleFullUpdate(); m_rootPart.ClearUndoState(); @@ -737,7 +735,7 @@ namespace OpenSim.Region.Environment.Scenes //m_rootPart.SetAttachmentPoint((byte)0); m_rootPart.m_IsAttachment = false; AbsolutePosition = m_rootPart.m_attachedPos; - //m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_scene.m_physicalPrim); + //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim); //AttachToBackup(); //m_rootPart.ScheduleFullUpdate(); @@ -943,100 +941,25 @@ namespace OpenSim.Region.Environment.Scenes d.AddActiveScripts(count); } - public void RemoveScriptEvents(LLUUID scriptid) - { - lock (m_scriptEvents) - { - if (m_scriptEvents.ContainsKey(scriptid)) - { - scriptEvents oldparts = scriptEvents.None; - oldparts = (scriptEvents) m_scriptEvents[scriptid]; - - // remove values from aggregated script events - m_aggregateScriptEvents &= ~oldparts; - m_scriptEvents.Remove(scriptid); - } - } - aggregateScriptEvents(); - } - - public void SetScriptEvents(LLUUID scriptid, int events) - { - scriptEvents oldparts; - lock (m_scriptEvents) - { - if (m_scriptEvents.ContainsKey(scriptid)) - { - oldparts = m_scriptEvents[scriptid]; - - // remove values from aggregated script events - m_aggregateScriptEvents &= ~oldparts; - m_scriptEvents[scriptid] = (scriptEvents) events; - } - else - { - m_scriptEvents.Add(scriptid, (scriptEvents) events); - } - } - - aggregateScriptEvents(); - } - public void aggregateScriptEvents() { - // Aggregate script events - lock (m_scriptEvents) - { - foreach (scriptEvents s in m_scriptEvents.Values) - { - m_aggregateScriptEvents |= s; - } - } - uint objectflagupdate = m_rootPart.ObjectFlags; - - if ( - ((m_aggregateScriptEvents & scriptEvents.touch) != 0) || - ((m_aggregateScriptEvents & scriptEvents.touch_end) != 0) || - ((m_aggregateScriptEvents & scriptEvents.touch_start) != 0) - ) - { - objectflagupdate |= (uint) LLObject.ObjectFlags.Touch; - } - else - { - objectflagupdate &= ~(uint) LLObject.ObjectFlags.Touch; - } + uint objectflagupdate=(uint)RootPart.GetEffectiveObjectFlags(); - if ((m_aggregateScriptEvents & scriptEvents.money) != 0) - { - objectflagupdate |= (uint) LLObject.ObjectFlags.Money; - } - else - { - objectflagupdate &= ~(uint) LLObject.ObjectFlags.Money; - } + scriptEvents aggregateScriptEvents=0; - if ( - ((m_aggregateScriptEvents & scriptEvents.collision) != 0) || - ((m_aggregateScriptEvents & scriptEvents.collision_end) != 0) || - ((m_aggregateScriptEvents & scriptEvents.collision_start) != 0) - ) - { - // subscribe to physics updates. - } - else - { - // unsubscribe to physics updates. - } lock (m_parts) { foreach (SceneObjectPart part in m_parts.Values) { - part.ObjectFlags = objectflagupdate; + if(part == null) + continue; + if(part != RootPart) + part.ObjectFlags = objectflagupdate; + aggregateScriptEvents |= part.m_aggregateScriptEvents; } } - if ((m_aggregateScriptEvents & scriptEvents.at_target) != 0) + if ((aggregateScriptEvents & scriptEvents.at_target) != 0) { m_scriptListens_atTarget = true; } @@ -1045,7 +968,7 @@ namespace OpenSim.Region.Environment.Scenes m_scriptListens_atTarget = false; } - if ((m_aggregateScriptEvents & scriptEvents.not_at_target) != 0) + if ((aggregateScriptEvents & scriptEvents.not_at_target) != 0) { m_scriptListens_notAtTarget = true; } @@ -1082,12 +1005,12 @@ namespace OpenSim.Region.Environment.Scenes { if (m_parts.Count > 1) { - m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_physicalPrim); + m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_physicalPrim); foreach (SceneObjectPart part in m_parts.Values) { if (part.LocalId != m_rootPart.LocalId) { - part.ApplyPhysics(m_rootPart.ObjectFlags, m_physicalPrim); + part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_physicalPrim); } // Hack to get the physics scene geometries in the right spot ResetChildPrimPhysicsPositions(); @@ -1095,7 +1018,7 @@ namespace OpenSim.Region.Environment.Scenes } else { - m_rootPart.ApplyPhysics(m_rootPart.ObjectFlags, m_physicalPrim); + m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_physicalPrim); } } } @@ -1333,7 +1256,7 @@ namespace OpenSim.Region.Environment.Scenes else { part.RemFlag(LLObject.ObjectFlags.Phantom); - if ((part.ObjectFlags & (int) LLObject.ObjectFlags.Physics) != 0) + if ((part.GetEffectiveObjectFlags() & (int) LLObject.ObjectFlags.Physics) != 0) { part.DoPhysicsPropertyUpdate(true, false); } -- cgit v1.1