diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 8ce4d4fe99..2052deda66 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -25,24 +25,19 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -using System; -using System.ComponentModel; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Xml; -using System.Xml.Serialization; using OpenMetaverse; using OpenMetaverse.Packets; using OpenSim.Framework; using OpenSim.Region.Framework.Interfaces; -using OpenSim.Region.PhysicsModules.SharedBase; using OpenSim.Region.Framework.Scenes.Serialization; +using OpenSim.Region.PhysicsModules.SharedBase; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Threading; +using System.Xml; using PermissionMask = OpenSim.Framework.PermissionMask; -using OpenSim.Services.Interfaces; namespace OpenSim.Region.Framework.Scenes { @@ -148,7 +143,9 @@ namespace OpenSim.Region.Framework.Scenes path_update = 1UL << 40, anytouch = touch | touch_end | touch_start, - anyTarget = at_target | not_at_target | at_rot_target | not_at_rot_target + anyTarget = at_target | not_at_target | at_rot_target | not_at_rot_target, + anyobjcollision = collision | collision_end | collision_start, + anylandcollision = land_collision | land_collision_end | land_collision_start } public struct scriptPosTarget diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 0287352b1d..1556d8aef1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -2942,15 +2942,17 @@ namespace OpenSim.Region.Framework.Scenes if (soundinfolist.Count > 0) CollisionSounds.PartCollisionSound(this, soundinfolist); } - + EventManager eventmanager = ParentGroup.Scene.EventManager; + if ((ScriptEvents & scriptEvents.anyobjcollision) != 0) + { + SendCollisionEvent(scriptEvents.collision_start, startedColliders, eventmanager.TriggerScriptCollidingStart); + if (!VolumeDetectActive) + SendCollisionEvent(scriptEvents.collision , m_lastColliders , eventmanager.TriggerScriptColliding); + SendCollisionEvent(scriptEvents.collision_end , endedColliders , eventmanager.TriggerScriptCollidingEnd); + } - SendCollisionEvent(scriptEvents.collision_start, startedColliders, eventmanager.TriggerScriptCollidingStart); - if (!VolumeDetectActive) - SendCollisionEvent(scriptEvents.collision , m_lastColliders , eventmanager.TriggerScriptColliding); - SendCollisionEvent(scriptEvents.collision_end , endedColliders , eventmanager.TriggerScriptCollidingEnd); - - if (!VolumeDetectActive) + if (!VolumeDetectActive && (ScriptEvents & scriptEvents.anylandcollision) != 0) { if (startLand) SendLandCollisionEvent(scriptEvents.land_collision_start, eventmanager.TriggerScriptLandCollidingStart); diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index fde8dbf641..0a9a7e1730 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -343,6 +343,7 @@ namespace OpenSim.Region.Framework.Scenes } private List m_lastColliders = new List(); + private bool m_lastLandCollide; private TeleportFlags m_teleportFlags; public TeleportFlags TeleportFlags @@ -6652,16 +6653,23 @@ namespace OpenSim.Region.Framework.Scenes { try { + bool thisHitLand = false; + bool startLand = false; + bool endedLand = false; + List thisHitColliders = new List(); List endedColliders = new List(); List startedColliders = new List(); if (coldata.Count == 0) { - if (m_lastColliders.Count == 0) + if (m_lastColliders.Count == 0 && !m_lastLandCollide) return; // nothing to do - for(int i = 0; i < m_lastColliders.Count; ++i) + endedLand = m_lastLandCollide; + m_lastLandCollide = false; + + for (int i = 0; i < m_lastColliders.Count; ++i) endedColliders.Add(m_lastColliders[i]); m_lastColliders.Clear(); @@ -6676,20 +6684,42 @@ namespace OpenSim.Region.Framework.Scenes foreach (uint id in coldata.Keys) { - thisHitColliders.Add(id); - if (!m_lastColliders.Contains(id)) + if(id == 0) { - startedColliders.Add(id); - curcontact = coldata[id]; - if (Math.Abs(curcontact.RelativeSpeed) > 0.2) + thisHitLand = true; + if (!m_lastLandCollide) { - soundinfo = new CollisionForSoundInfo() + startLand = true; + curcontact = coldata[id]; + if (Math.Abs(curcontact.RelativeSpeed) > 0.2) { - colliderID = id, - position = curcontact.Position, - relativeVel = curcontact.RelativeSpeed - }; - soundinfolist.Add(soundinfo); + soundinfo = new CollisionForSoundInfo() + { + colliderID = id, + position = curcontact.Position, + relativeVel = curcontact.RelativeSpeed + }; + soundinfolist.Add(soundinfo); + } + } + } + else + { + thisHitColliders.Add(id); + if (!m_lastColliders.Contains(id)) + { + startedColliders.Add(id); + curcontact = coldata[id]; + if (Math.Abs(curcontact.RelativeSpeed) > 0.2) + { + soundinfo = new CollisionForSoundInfo() + { + colliderID = id, + position = curcontact.Position, + relativeVel = curcontact.RelativeSpeed + }; + soundinfolist.Add(soundinfo); + } } } } @@ -6698,9 +6728,18 @@ namespace OpenSim.Region.Framework.Scenes { foreach (uint id in coldata.Keys) { - thisHitColliders.Add(id); - if (!m_lastColliders.Contains(id)) - startedColliders.Add(id); + if (id == 0) + { + thisHitLand = true; + if (!m_lastLandCollide) + startLand = true; + } + else + { + thisHitColliders.Add(id); + if (!m_lastColliders.Contains(id)) + startedColliders.Add(id); + } } } // calculate things that ended colliding @@ -6722,23 +6761,35 @@ namespace OpenSim.Region.Framework.Scenes m_lastColliders.Remove(localID); } + if (m_lastLandCollide && !thisHitLand) + endedLand = true; + + m_lastLandCollide = thisHitLand; + if (soundinfolist.Count > 0) CollisionSounds.AvatarCollisionSound(this, soundinfolist); } + List attachements = GetAttachments(); for (int i = 0; i< attachements.Count; ++i) { SceneObjectGroup att = attachements[i]; - SendCollisionEvent(att, scriptEvents.collision_start, startedColliders, m_scene.EventManager.TriggerScriptCollidingStart); - SendCollisionEvent(att, scriptEvents.collision , m_lastColliders , m_scene.EventManager.TriggerScriptColliding); - SendCollisionEvent(att, scriptEvents.collision_end , endedColliders , m_scene.EventManager.TriggerScriptCollidingEnd); + if ((att.ScriptEvents & scriptEvents.anyobjcollision) != 0) + { + SendCollisionEvent(att, scriptEvents.collision_start, startedColliders, m_scene.EventManager.TriggerScriptCollidingStart); + SendCollisionEvent(att, scriptEvents.collision , m_lastColliders , m_scene.EventManager.TriggerScriptColliding); + SendCollisionEvent(att, scriptEvents.collision_end , endedColliders , m_scene.EventManager.TriggerScriptCollidingEnd); + } - if (startedColliders.Contains(0)) - SendLandCollisionEvent(att, scriptEvents.land_collision_start, m_scene.EventManager.TriggerScriptLandCollidingStart); - if (m_lastColliders.Contains(0)) - SendLandCollisionEvent(att, scriptEvents.land_collision, m_scene.EventManager.TriggerScriptLandColliding); - if (endedColliders.Contains(0)) - SendLandCollisionEvent(att, scriptEvents.land_collision_end, m_scene.EventManager.TriggerScriptLandCollidingEnd); + if ((att.ScriptEvents & scriptEvents.anylandcollision) != 0) + { + if (startLand) + SendLandCollisionEvent(att, scriptEvents.land_collision_start, m_scene.EventManager.TriggerScriptLandCollidingStart); + if (m_lastLandCollide) + SendLandCollisionEvent(att, scriptEvents.land_collision, m_scene.EventManager.TriggerScriptLandColliding); + if (endedLand) + SendLandCollisionEvent(att, scriptEvents.land_collision_end, m_scene.EventManager.TriggerScriptLandCollidingEnd); + } } } catch { }