diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index 6d8d481a63..32a2debf0a 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -2771,6 +2771,65 @@ namespace OpenSim.Region.Environment.Scenes m_eventManager.TriggerOnScriptChangedEvent(localID, change); } + public bool pipeEventsForScript(uint localID) + { + SceneObjectPart part = GetSceneObjectPart(localID); + if (part != null) + { + LLVector3 pos = part.GetWorldPosition(); + ILandObject parcel = LandChannel.getLandObject(pos.X, pos.Y); + if (parcel != null) + { + if ((parcel.landData.landFlags & (uint)Parcel.ParcelFlags.AllowOtherScripts) != 0) + { + return true; + } + else if ((parcel.landData.landFlags & (uint)Parcel.ParcelFlags.AllowGroupScripts) != 0) + { + if (part.OwnerID == parcel.landData.ownerID || (parcel.landData.isGroupOwned && part.GroupID == parcel.landData.groupID) || PermissionsMngr.GenericEstatePermission(part.OwnerID)) + { + return true; + } + else + { + return false; + } + } + else + { + if (part.OwnerID == parcel.landData.ownerID) + { + return true; + } + else + { + return false; + } + } + } + else + { + + if (pos.X > 0f && pos.X < Constants.RegionSize && pos.Y > 0f && pos.Y < Constants.RegionSize) + { + // The only time parcel != null when an object is inside a region is when + // there is nothing behind the landchannel. IE, no land plugin loaded. + return true; + } + else + { + // The object is outside of this region. Stop piping events to it. + return false; + } + } + + } + else + { + return false; + } + } + #endregion #region InnerScene wrapper methods diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs index d77f69854e..30b3e8f724 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueThreadClass.cs @@ -272,15 +272,19 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase // + ", QIS.functionName: " + // QIS.functionName); #endif - LastExecutionStarted = DateTime.Now.Ticks; - KillCurrentScript = false; - InExecution = true; - m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, - QIS.itemID, - QIS.functionName, - QIS.llDetectParams, - QIS.param); - InExecution = false; + // Only pipe event if land supports it. + if (m_ScriptEngine.World.pipeEventsForScript(QIS.localID)) + { + LastExecutionStarted = DateTime.Now.Ticks; + KillCurrentScript = false; + InExecution = true; + m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, + QIS.itemID, + QIS.functionName, + QIS.llDetectParams, + QIS.param); + InExecution = false; + } } catch (Exception e) {