From 9a0ef22ed979433f4d017a252173f38fe5e56892 Mon Sep 17 00:00:00 2001 From: Charles Krinke Date: Sat, 28 Jun 2008 16:08:12 +0000 Subject: Mantis#1616. Applied Melanie's patch. This may or may not break trunk. --- OpenSim/Framework/IClientAPI.cs | 6 + OpenSim/Grid/ScriptServer/ScriptServerMain.cs | 2 +- OpenSim/Region/Application/OpenSimBase.cs | 3 +- .../Region/ClientStack/LindenUDP/LLClientView.cs | 29 +++- .../Region/Environment/Interfaces/IScriptModule.cs | 38 +++++ .../Environment/Modules/World/NPC/NPCAvatar.cs | 6 + .../Modules/World/Permissions/PermissionsModule.cs | 3 +- OpenSim/Region/Environment/Scenes/EventManager.cs | 37 +++-- OpenSim/Region/Environment/Scenes/InnerScene.cs | 2 +- .../Region/Environment/Scenes/Scene.Inventory.cs | 60 +++++-- OpenSim/Region/Environment/Scenes/Scene.cs | 6 +- .../Environment/Scenes/SceneExternalChecks.cs | 1 + .../Scenes/SceneObjectGroup.Inventory.cs | 91 +---------- .../Region/Environment/Scenes/SceneObjectGroup.cs | 14 +- .../Scenes/SceneObjectPart.Inventory.cs | 70 +++++---- .../Region/Examples/SimpleModule/MyNpcCharacter.cs | 6 + .../ScriptEngine/Common/LSL_BuiltIn_Commands.cs | 4 +- .../Common/ScriptEngineBase/EventManager.cs | 2 +- .../ScriptEngine/Common/ScriptServerInterfaces.cs | 2 +- .../ScriptEngine/Interfaces/IScriptEngine.cs | 1 + .../ScriptEngine/RemoteServer/EventManager.cs | 2 +- .../Shared/Api/Implementation/LSL_Api.cs | 3 +- .../Region/ScriptEngine/XEngine/EventManager.cs | 9 -- OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 175 +++++++++++++++++++-- 24 files changed, 372 insertions(+), 200 deletions(-) create mode 100644 OpenSim/Region/Environment/Interfaces/IScriptModule.cs diff --git a/OpenSim/Framework/IClientAPI.cs b/OpenSim/Framework/IClientAPI.cs index a646224..9307aef 100644 --- a/OpenSim/Framework/IClientAPI.cs +++ b/OpenSim/Framework/IClientAPI.cs @@ -643,6 +643,8 @@ namespace OpenSim.Framework public delegate void EstateDebugRegionRequest(IClientAPI remoteClient, LLUUID invoice, LLUUID senderID, bool scripted, bool collisionEvents, bool physics); public delegate void EstateTeleportOneUserHomeRequest(IClientAPI remoteClient, LLUUID invoice, LLUUID senderID, LLUUID prey); public delegate void ScriptReset(IClientAPI remoteClient, LLUUID objectID, LLUUID itemID); + public delegate void GetScriptRunning(IClientAPI remoteClient, LLUUID objectID, LLUUID itemID); + public delegate void SetScriptRunning(IClientAPI remoteClient, LLUUID objectID, LLUUID itemID, bool running); public interface IClientAPI { @@ -839,6 +841,8 @@ namespace OpenSim.Framework event RequestObjectPropertiesFamily OnObjectGroupRequest; event ScriptReset OnScriptReset; + event GetScriptRunning OnGetScriptRunning; + event SetScriptRunning OnSetScriptRunning; event UpdateVector OnAutoPilotGo; // [Obsolete("IClientAPI.OutPacket SHOULD NOT EXIST outside of LLClientView please refactor appropriately.")] @@ -1015,6 +1019,8 @@ namespace OpenSim.Framework void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia); + void SendScriptRunningReply(LLUUID objectID, LLUUID itemID, bool running); + void SendAsset(AssetRequestToClient req); void SendTexture(AssetBase TextureAsset); diff --git a/OpenSim/Grid/ScriptServer/ScriptServerMain.cs b/OpenSim/Grid/ScriptServer/ScriptServerMain.cs index 9de250b..844f27d 100644 --- a/OpenSim/Grid/ScriptServer/ScriptServerMain.cs +++ b/OpenSim/Grid/ScriptServer/ScriptServerMain.cs @@ -93,7 +93,7 @@ namespace OpenSim.Grid.ScriptServer if (Command == "OnRezScript") { - Engine.EventManager().OnRezScript((uint)p[0], new LLUUID((string)p[1]), (string)p[2]); + Engine.EventManager().OnRezScript((uint)p[0], new LLUUID((string)p[1]), (string)p[2], 0, false); } } diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 06b4de7..a32210b 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs @@ -535,7 +535,7 @@ namespace OpenSim } // We need to do this after we've initialized the scripting engines. - scene.StartScripts(); + scene.CreateScriptInstances(); scene.loadAllLandObjectsFromStorage(regionInfo.originRegionID); scene.EventManager.TriggerParcelPrimCountUpdate(); @@ -729,3 +729,4 @@ namespace OpenSim } + diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 0294ca7..cd3efe3 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -277,6 +277,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP private RequestObjectPropertiesFamily handlerObjectGroupRequest = null; private ScriptReset handlerScriptReset = null; + private GetScriptRunning handlerGetScriptRunning = null; + private SetScriptRunning handlerSetScriptRunning = null; private UpdateVector handlerAutoPilotGo = null; /* Properties */ @@ -921,6 +923,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP public event EstateDebugRegionRequest OnEstateDebugRegionRequest; public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; public event ScriptReset OnScriptReset; + public event GetScriptRunning OnGetScriptRunning; + public event SetScriptRunning OnSetScriptRunning; public event UpdateVector OnAutoPilotGo; #region Scene/Avatar to Client @@ -6187,7 +6191,20 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_log.Warn("[CLIENT]: unhandled InventoryDescent packet"); break; case PacketType.GetScriptRunning: - m_log.Warn("[CLIENT]: unhandled GetScriptRunning packet"); + GetScriptRunningPacket scriptRunning = (GetScriptRunningPacket)Pack; + handlerGetScriptRunning = OnGetScriptRunning; + if (handlerGetScriptRunning != null) + { + handlerGetScriptRunning(this, scriptRunning.Script.ObjectID, scriptRunning.Script.ItemID); + } + break; + case PacketType.SetScriptRunning: + SetScriptRunningPacket setScriptRunning = (SetScriptRunningPacket)Pack; + handlerSetScriptRunning = OnSetScriptRunning; + if (handlerSetScriptRunning != null) + { + handlerSetScriptRunning(this, setScriptRunning.Script.ObjectID, setScriptRunning.Script.ItemID, setScriptRunning.Script.Running); + } break; default: m_log.Warn("[CLIENT]: unhandled packet " + Pack.ToString()); @@ -6390,6 +6407,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP OutPacket(lsrp, ThrottleOutPacketType.Task); } + public void SendScriptRunningReply(LLUUID objectID, LLUUID itemID, bool running) + { + ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket(); + scriptRunningReply.Script.ObjectID = objectID; + scriptRunningReply.Script.ItemID = itemID; + scriptRunningReply.Script.Running = running; + + OutPacket(scriptRunningReply, ThrottleOutPacketType.Task); + } + public void SendAsset(AssetRequestToClient req) { diff --git a/OpenSim/Region/Environment/Interfaces/IScriptModule.cs b/OpenSim/Region/Environment/Interfaces/IScriptModule.cs new file mode 100644 index 0000000..7aecaf7 --- /dev/null +++ b/OpenSim/Region/Environment/Interfaces/IScriptModule.cs @@ -0,0 +1,38 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSim Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System; +using OpenSim.Framework; +using libsecondlife; + +namespace OpenSim.Region.Environment.Interfaces +{ + public interface IScriptModule : IRegionModule + { + bool GetScriptRunning(LLUUID objectID, LLUUID itemID); + } +} diff --git a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs index 83d4603..5d94407 100644 --- a/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/Environment/Modules/World/NPC/NPCAvatar.cs @@ -291,6 +291,8 @@ namespace OpenSim.Region.Environment.Modules.World.NPC public event EstateDebugRegionRequest OnEstateDebugRegionRequest; public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; public event ScriptReset OnScriptReset; + public event GetScriptRunning OnGetScriptRunning; + public event SetScriptRunning OnSetScriptRunning; public event UpdateVector OnAutoPilotGo; #pragma warning restore 67 @@ -783,6 +785,10 @@ namespace OpenSim.Region.Environment.Modules.World.NPC { } + public void SendScriptRunningReply(LLUUID objectID, LLUUID itemID, bool running) + { + } + public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia) { } diff --git a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs index d6ee739..6cf2f29 100644 --- a/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs +++ b/OpenSim/Region/Environment/Modules/World/Permissions/PermissionsModule.cs @@ -300,6 +300,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions LLObject.ObjectFlags.ObjectMove | // tells client that you can move the object (only, no mod) LLObject.ObjectFlags.ObjectTransfer | // tells the client that you can /take/ the object if you don't own it LLObject.ObjectFlags.ObjectYouOwner | // Tells client that you're the owner of the object + LLObject.ObjectFlags.ObjectAnyOwner | // Tells client that someone owns the object LLObject.ObjectFlags.ObjectOwnerModify | // Tells client that you're the owner of the object LLObject.ObjectFlags.ObjectYouOfficer // Tells client that you've got group object editing permission. Used when ObjectGroupOwned is set ); @@ -307,7 +308,7 @@ namespace OpenSim.Region.Environment.Modules.World.Permissions // Creating the three ObjectFlags options for this method to choose from. // Customize the OwnerMask uint objectOwnerMask = ApplyObjectModifyMasks(task.OwnerMask, objflags); - objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectYouOwner | (uint)LLObject.ObjectFlags.ObjectOwnerModify; + objectOwnerMask |= (uint)LLObject.ObjectFlags.ObjectYouOwner | (uint)LLObject.ObjectFlags.ObjectAnyOwner | (uint)LLObject.ObjectFlags.ObjectOwnerModify; // Customize the GroupMask // uint objectGroupMask = ApplyObjectModifyMasks(task.GroupMask, objflags); diff --git a/OpenSim/Region/Environment/Scenes/EventManager.cs b/OpenSim/Region/Environment/Scenes/EventManager.cs index 5c750e4..f3af0d1 100644 --- a/OpenSim/Region/Environment/Scenes/EventManager.cs +++ b/OpenSim/Region/Environment/Scenes/EventManager.cs @@ -95,17 +95,22 @@ namespace OpenSim.Region.Environment.Scenes public event OnPermissionErrorDelegate OnPermissionError; - public delegate void NewRezScript(uint localID, LLUUID itemID, string script); - public delegate void RezEvent(uint localID, LLUUID itemID, int param); + public delegate void NewRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez); public event NewRezScript OnRezScript; - public event RezEvent OnRezEvent; - public delegate void RemoveScript(uint localID, LLUUID itemID); public event RemoveScript OnRemoveScript; + public delegate void StartScript(uint localID, LLUUID itemID); + + public event StartScript OnStartScript; + + public delegate void StopScript(uint localID, LLUUID itemID); + + public event StopScript OnStopScript; + public delegate bool SceneGroupMoved(LLUUID groupID, LLVector3 delta); public event SceneGroupMoved OnSceneGroupMove; @@ -332,8 +337,9 @@ namespace OpenSim.Region.Environment.Scenes private ObjectDeGrabDelegate handlerObjectDeGrab = null; //OnObjectDeGrab; private ScriptResetDelegate handlerScriptReset = null; // OnScriptReset private NewRezScript handlerRezScript = null; //OnRezScript; - private RezEvent handlerOnRezEvent = null; //OnRezEvent; private RemoveScript handlerRemoveScript = null; //OnRemoveScript; + private StartScript handlerStartScript = null; //OnStartScript; + private StopScript handlerStopScript = null; //OnStopScript; private SceneGroupMoved handlerSceneGroupMove = null; //OnSceneGroupMove; private SceneGroupGrabed handlerSceneGroupGrab = null; //OnSceneGroupGrab; private LandObjectAdded handlerLandObjectAdded = null; //OnLandObjectAdded; @@ -523,21 +529,30 @@ namespace OpenSim.Region.Environment.Scenes } } - public void TriggerRezScript(uint localID, LLUUID itemID, string script) + public void TriggerRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez) { handlerRezScript = OnRezScript; if (handlerRezScript != null) { - handlerRezScript(localID, itemID, script); + handlerRezScript(localID, itemID, script, startParam, postOnRez); + } + } + + public void TriggerStartScript(uint localID, LLUUID itemID) + { + handlerStartScript = OnStartScript; + if (handlerStartScript != null) + { + handlerStartScript(localID, itemID); } } - public void TriggerOnRezEvent(uint localID, LLUUID itemID, int param) + public void TriggerStopScript(uint localID, LLUUID itemID) { - handlerOnRezEvent = OnRezEvent; - if (handlerOnRezEvent != null) + handlerStopScript = OnStopScript; + if (handlerStopScript != null) { - handlerOnRezEvent(localID, itemID, param); + handlerStopScript(localID, itemID); } } diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs index fd8e2f8..d553f4b 100644 --- a/OpenSim/Region/Environment/Scenes/InnerScene.cs +++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs @@ -1522,7 +1522,7 @@ namespace OpenSim.Region.Environment.Scenes copy.UpdateGroupRotation(new LLQuaternion(rot.x, rot.y, rot.z, rot.w)); } - copy.StartScripts(); + copy.CreateScriptInstances(0, false); copy.HasGroupChanged = true; copy.ScheduleGroupForFullUpdate(); return copy; diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs index f030e12..d134ea3 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs @@ -46,7 +46,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// Start all the scripts in the scene which should be started. /// - public void StartScripts() + public void CreateScriptInstances() { m_log.Info("[PRIM INVENTORY]: Starting scripts in scene"); @@ -54,7 +54,7 @@ namespace OpenSim.Region.Environment.Scenes { if (group is SceneObjectGroup) { - ((SceneObjectGroup) group).StartScripts(); + ((SceneObjectGroup) group).CreateScriptInstances(0, false); } } } @@ -234,6 +234,10 @@ namespace OpenSim.Region.Environment.Scenes AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data); AssetCache.AddAsset(asset); + if (isScriptRunning) + { + part.RemoveScriptInstance(item.ItemID); + } // Update item with new asset item.AssetID = asset.FullID; group.UpdateInventoryItem(item); @@ -242,8 +246,7 @@ namespace OpenSim.Region.Environment.Scenes // Trigger rerunning of script (use TriggerRezScript event, see RezScript) if (isScriptRunning) { - group.StopScript(part.LocalId, item.ItemID); - group.StartScript(part.LocalId, item.ItemID); + part.CreateScriptInstance(item.ItemID, 0, false); } } @@ -1219,7 +1222,8 @@ namespace OpenSim.Region.Environment.Scenes if (ExternalChecks.ExternalChecksCanRunScript(item.ID, part.UUID, remoteClient.AgentId)) { part.ParentGroup.AddInventoryItem(remoteClient, localID, item, copyID); - part.ParentGroup.StartScript(localID, copyID); + // TODO: set this to "true" when scripts in inventory have persistent state to fire on_rez + part.CreateScriptInstance(copyID, 0, false); part.GetProperties(remoteClient); // m_log.InfoFormat("[PRIMINVENTORY]: " + @@ -1280,7 +1284,7 @@ namespace OpenSim.Region.Environment.Scenes if (ExternalChecks.ExternalChecksCanRunScript(taskItem.AssetID, part.UUID, remoteClient.AgentId)) { - part.StartScript(taskItem); + part.CreateScriptInstance(taskItem, 0, false); } } } @@ -1312,6 +1316,13 @@ namespace OpenSim.Region.Environment.Scenes return; } + // Must own the object, and have modify rights + if(srcPart.OwnerID != destPart.OwnerID) + return; + + if((destPart.OwnerMask & (uint)PermissionMask.Modify) == 0) + return; + if (destPart.ScriptAccessPin != pin) { m_log.WarnFormat( @@ -1362,17 +1373,13 @@ namespace OpenSim.Region.Environment.Scenes destTaskItem.InvType = srcTaskItem.InvType; destTaskItem.Type = srcTaskItem.Type; - // need something like destPart.AddInventoryItemExclusive(destTaskItem); - // this function is supposed to silently overwrite an existing script with the same name - - destPart.AddInventoryItem(destTaskItem); + destPart.AddInventoryItemExclusive(destTaskItem); if ( running > 0 ) { if (ExternalChecks.ExternalChecksCanRunScript(destTaskItem.AssetID, destPart.UUID, destPart.OwnerID)) { - // why doesn't the start_param propogate? - destPart.StartScript(destTaskItem, start_param); + destPart.CreateScriptInstance(destTaskItem, 0, false); } } @@ -1874,7 +1881,8 @@ namespace OpenSim.Region.Environment.Scenes //group.ApplyPhysics(m_physicalPrim); } - group.StartScripts(); + // TODO: make this true to fire on_rez when scripts have state while in inventory + group.CreateScriptInstances(0, false); if (!attachment) rootPart.ScheduleFullUpdate(); @@ -1919,9 +1927,6 @@ namespace OpenSim.Region.Environment.Scenes AddNewSceneObject(group, true); - // Set the startup parameter for on_rez event and llGetStartParameter() function - group.StartParameter = param; - // we set it's position in world. group.AbsolutePosition = pos; @@ -1970,7 +1975,7 @@ namespace OpenSim.Region.Environment.Scenes group.UpdateGroupRotation(rot); group.ApplyPhysics(m_physicalPrim); group.Velocity = vel; - group.StartScripts(param); + group.CreateScriptInstances(param, true); rootPart.ScheduleFullUpdate(); return rootPart.ParentGroup; } @@ -2120,5 +2125,26 @@ namespace OpenSim.Region.Environment.Scenes } + public void GetScriptRunning(IClientAPI controllingClient, LLUUID objectID, LLUUID itemID) + { + IScriptModule scriptModule = RequestModuleInterface(); + if(scriptModule == null) + return; + + controllingClient.SendScriptRunningReply(objectID, itemID, + scriptModule.GetScriptRunning(objectID, itemID)); + } + + public void SetScriptRunning(IClientAPI controllingClient, LLUUID objectID, LLUUID itemID, bool running) + { + SceneObjectPart part = GetSceneObjectPart(objectID); + if(part == null) + return; + + if(running) + EventManager.TriggerStartScript(part.LocalId, itemID); + else + EventManager.TriggerStopScript(part.LocalId, itemID); + } } } diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs index b7117df..291a7ae 100644 --- a/OpenSim/Region/Environment/Scenes/Scene.cs +++ b/OpenSim/Region/Environment/Scenes/Scene.cs @@ -553,7 +553,7 @@ namespace OpenSim.Region.Environment.Scenes { if (ent is SceneObjectGroup) { - ((SceneObjectGroup)ent).StopScripts(); + ((SceneObjectGroup)ent).RemoveScriptInstances(); } } } @@ -567,7 +567,7 @@ namespace OpenSim.Region.Environment.Scenes { if (ent is SceneObjectGroup) { - ((SceneObjectGroup)ent).StartScripts(); + ((SceneObjectGroup)ent).CreateScriptInstances(0, false); } } } @@ -2029,6 +2029,8 @@ namespace OpenSim.Region.Environment.Scenes client.OnObjectGroupRequest += m_innerScene.HandleObjectGroupUpdate; client.OnParcelReturnObjectsRequest += LandChannel.ReturnObjectsInParcel; client.OnScriptReset += ProcessScriptReset; + client.OnGetScriptRunning += GetScriptRunning; + client.OnSetScriptRunning += SetScriptRunning; // EventManager.TriggerOnNewClient(client); } diff --git a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs index dba10df..c7d1ce2 100644 --- a/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs +++ b/OpenSim/Region/Environment/Scenes/SceneExternalChecks.cs @@ -72,6 +72,7 @@ namespace OpenSim.Region.Environment.Scenes (uint)LLObject.ObjectFlags.ObjectMove | (uint)LLObject.ObjectFlags.ObjectTransfer | (uint)LLObject.ObjectFlags.ObjectYouOwner | + (uint)LLObject.ObjectFlags.ObjectAnyOwner | (uint)LLObject.ObjectFlags.ObjectOwnerModify | (uint)LLObject.ObjectFlags.ObjectYouOfficer; diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs index aea433e..799cb41 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.Inventory.cs @@ -39,115 +39,32 @@ namespace OpenSim.Region.Environment.Scenes private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); /// - /// Start a given script. - /// - /// - /// A - /// - public void StartScript(uint localID, LLUUID itemID) - { - SceneObjectPart part = GetChildPart(localID); - if (part != null) - { - - part.StartScript(itemID); - - } - else - { - m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}", - localID, Name, UUID, itemID); - } - } - -// /// Start a given script. -// /// -// /// -// /// A -// /// -// public void StartScript(LLUUID partID, LLUUID itemID) -// { -// SceneObjectPart part = GetChildPart(partID); -// if (part != null) -// { -// part.StartScript(itemID); -// } -// else -// { -// m_log.ErrorFormat( -// "[PRIM INVENTORY]: " + -// "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}", -// localID, Name, UUID, itemID); -// } -// } - - /// /// Start the scripts contained in all the prims in this group. /// - public void StartScripts() + public void CreateScriptInstances(int startParam, bool postOnRez) { // Don't start scripts if they're turned off in the region! if (!((m_scene.RegionInfo.EstateSettings.regionFlags & Simulator.RegionFlags.SkipScripts) == Simulator.RegionFlags.SkipScripts)) { foreach (SceneObjectPart part in m_parts.Values) { - part.StartScripts(); + part.CreateScriptInstances(startParam, postOnRez); } } } - /// - /// Start the scripts contained in all the prims in this group. - /// - public void StartScripts(int param) - { - // Don't start scripts if they're turned off in the region! - if (!((m_scene.RegionInfo.EstateSettings.regionFlags & Simulator.RegionFlags.SkipScripts) == Simulator.RegionFlags.SkipScripts)) - { - foreach (SceneObjectPart part in m_parts.Values) - { - part.StartScripts(param); - } - } - } - - public void StopScripts() + public void RemoveScriptInstances() { lock (m_parts) { foreach (SceneObjectPart part in m_parts.Values) { - part.StopScripts(); + part.RemoveScriptInstances(); } } } /// - /// Start a given script. - /// - /// - /// A - /// - public void StopScript(uint partID, LLUUID itemID) - { - SceneObjectPart part = GetChildPart(partID); - if (part != null) - { - part.StopScript(itemID); - part.RemoveScriptEvents(itemID); - } - else - { - m_log.ErrorFormat( - "[PRIM INVENTORY]: " + - "Couldn't find part {0} in object group {1}, {2} to stop script with ID {3}", - partID, Name, UUID, itemID); - } - } - - /// /// /// /// diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 4a24dad..ebefdce 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -114,8 +114,6 @@ namespace OpenSim.Region.Environment.Scenes private bool m_scriptListens_atTarget = false; private bool m_scriptListens_notAtTarget = false; - private int m_startparameter = 0; - #region Properties /// @@ -137,16 +135,6 @@ namespace OpenSim.Region.Environment.Scenes protected bool m_isSelected = false; /// - /// Set start parameter for on_rez event and llGetStartParameter() - /// - [XmlIgnore] - public int StartParameter - { - get { return m_startparameter; } - set { m_startparameter = value; } - } - - /// /// Number of prims in this group /// public int PrimCount @@ -937,7 +925,7 @@ namespace OpenSim.Region.Environment.Scenes { foreach (SceneObjectPart part in m_parts.Values) { - part.StopScripts(); + part.RemoveScriptInstances(); List avatars = Scene.GetScenePresences(); for (int i = 0; i < avatars.Count; i++) diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs index fbf2794..dc195f8 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs @@ -137,7 +137,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// Start all the scripts contained in this prim's inventory /// - public void StartScripts() + public void CreateScriptInstances(int startParam, bool postOnRez) { lock (m_taskInventory) { @@ -146,25 +146,7 @@ namespace OpenSim.Region.Environment.Scenes // XXX more hardcoding badness. Should be an enum in TaskInventoryItem if (10 == item.Type) { - StartScript(item); - } - } - } - } - - /// - /// Start all the scripts contained in this prim's inventory - /// - public void StartScripts(int param) - { - lock (m_taskInventory) - { - foreach (TaskInventoryItem item in m_taskInventory.Values) - { - // XXX more hardcoding badness. Should be an enum in TaskInventoryItem - if (10 == item.Type) - { - StartScript(item, param); + CreateScriptInstance(item, startParam, postOnRez); } } } @@ -173,7 +155,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// Stop all the scripts in this prim. /// - public void StopScripts() + public void RemoveScriptInstances() { lock (m_taskInventory) { @@ -181,7 +163,7 @@ namespace OpenSim.Region.Environment.Scenes { if (10 == item.Type) { - StopScript(item.ItemID); + RemoveScriptInstance(item.ItemID); RemoveScriptEvents(item.ItemID); } } @@ -193,13 +175,8 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void StartScript(TaskInventoryItem item, int param) - { - StartScript(item); - m_parentGroup.Scene.EventManager.TriggerOnRezEvent(LocalId, item.ItemID, param); - } - public void StartScript(TaskInventoryItem item) + public void CreateScriptInstance(TaskInventoryItem item, int startParam, bool postOnRez) { // m_log.InfoFormat( // "[PRIM INVENTORY]: " + @@ -223,7 +200,7 @@ namespace OpenSim.Region.Environment.Scenes else { string script = Helpers.FieldToUTF8String(asset.Data); - m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId,item.ItemID,script); + m_parentGroup.Scene.EventManager.TriggerRezScript(LocalId,item.ItemID,script, startParam, postOnRez); m_parentGroup.AddActiveScriptCount(1); ScheduleFullUpdate(); } @@ -237,13 +214,13 @@ namespace OpenSim.Region.Environment.Scenes /// /// A /// - public void StartScript(LLUUID itemId) + public void CreateScriptInstance(LLUUID itemId, int startParam, bool postOnRez) { lock (m_taskInventory) { if (m_taskInventory.ContainsKey(itemId)) { - StartScript(m_taskInventory[itemId]); + CreateScriptInstance(m_taskInventory[itemId], startParam, postOnRez); } else @@ -260,7 +237,7 @@ namespace OpenSim.Region.Environment.Scenes /// Stop a script which is in this prim's inventory. /// /// - public void StopScript(LLUUID itemId) + public void RemoveScriptInstance(LLUUID itemId) { if (m_taskInventory.ContainsKey(itemId)) { @@ -330,6 +307,35 @@ namespace OpenSim.Region.Environment.Scenes ParentGroup.HasGroupChanged = true; } + public void AddInventoryItemExclusive(TaskInventoryItem item) + { + item.ParentID = UUID; + item.ParentPartID = UUID; + + List il = new List(m_taskInventory.Values); + foreach(TaskInventoryItem i in il) + { + if(i.Name == item.Name) + { + if(i.Type == 10) + RemoveScriptInstance(i.ItemID); + RemoveInventoryItem(i.ItemID); + break; + } + } + + lock (m_taskInventory) + { + m_taskInventory.Add(item.ItemID, item); + TriggerScriptChangedEvent(Changed.INVENTORY); + } + + m_inventorySerial++; + //m_inventorySerial += 2; + HasInventoryChanged = true; + ParentGroup.HasGroupChanged = true; + } + /// /// Restore a whole collection of items to the prim's inventory at once. /// We assume that the items already have all their fields correctly filled out. diff --git a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs index 8a77b15..4379c44 100644 --- a/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs +++ b/OpenSim/Region/Examples/SimpleModule/MyNpcCharacter.cs @@ -196,6 +196,8 @@ namespace OpenSim.Region.Examples.SimpleModule public event EstateDebugRegionRequest OnEstateDebugRegionRequest; public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest; public event ScriptReset OnScriptReset; + public event GetScriptRunning OnGetScriptRunning; + public event SetScriptRunning OnSetScriptRunning; public event UpdateVector OnAutoPilotGo; #pragma warning restore 67 @@ -776,6 +778,10 @@ namespace OpenSim.Region.Examples.SimpleModule { } + public void SendScriptRunningReply(LLUUID objectID, LLUUID itemID, bool running) + { + } + public void SendAsset(AssetRequestToClient req) { } diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 6f4943d..c240573 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs @@ -2344,8 +2344,8 @@ namespace OpenSim.Region.ScriptEngine.Common public LSL_Types.LSLInteger llGetStartParameter() { m_host.AddScriptLPS(1); - // NotImplemented("llGetStartParameter"); - return m_host.ParentGroup.StartParameter; + NotImplemented("llGetStartParameter"); + return 0; } public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs index 5a3ebc7..93b68d4 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs @@ -186,7 +186,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_end", detstruct, new object[] { new LSL_Types.LSLInteger(1) }); } - public void OnRezScript(uint localID, LLUUID itemID, string script) + public void OnRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez) { Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + script.Length); diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs index 59f828d..f04ac01 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs @@ -39,7 +39,7 @@ namespace OpenSim.Region.ScriptEngine.Common public interface RemoteEvents { void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient); - void OnRezScript(uint localID, LLUUID itemID, string script); + void OnRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez); void OnRemoveScript(uint localID, LLUUID itemID); void state_exit(uint localID); void touch(uint localID, LLUUID itemID); diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs index 2fa67a4..579af31 100644 --- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptEngine.cs @@ -53,6 +53,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces void SetScriptState(LLUUID itemID, bool state); bool GetScriptState(LLUUID itemID); void SetState(LLUUID itemID, string newState); + int GetStartParameter(LLUUID itemID); DetectParams GetDetectParams(LLUUID item, int number); } diff --git a/OpenSim/Region/ScriptEngine/RemoteServer/EventManager.cs b/OpenSim/Region/ScriptEngine/RemoteServer/EventManager.cs index 54a6643..6924dd2 100644 --- a/OpenSim/Region/ScriptEngine/RemoteServer/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/RemoteServer/EventManager.cs @@ -77,7 +77,7 @@ namespace OpenSim.Region.ScriptEngine.RemoteServer } } - public void OnRezScript(uint localID, LLUUID itemID, string script) + public void OnRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez) { // WE ARE CREATING A NEW SCRIPT ... CREATE SCRIPT, GET A REMOTEID THAT WE MAP FROM LOCALID myScriptEngine.Log.Info("[RemoteEngine]: Creating new script (with connection)"); diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index afdd898..0320857 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -2200,8 +2200,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api public LSL_Types.LSLInteger llGetStartParameter() { m_host.AddScriptLPS(1); - // NotImplemented("llGetStartParameter"); - return m_host.ParentGroup.StartParameter; + return m_ScriptEngine.GetStartParameter(m_itemID); } public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index 8bfef79..3fd4942 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs @@ -53,7 +53,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine myScriptEngine.Log.Info("[XEngine] Hooking up to server events"); myScriptEngine.World.EventManager.OnObjectGrab += touch_start; myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; - myScriptEngine.World.EventManager.OnRezEvent += on_rez; myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; @@ -254,14 +253,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine // timer: not handled here // listen: not handled here - public void on_rez(uint localID, LLUUID itemID, int startParam) - { - myScriptEngine.PostObjectEvent(localID, new EventParams( - "on_rez",new object[] { - new LSL_Types.LSLInteger(startParam)}, - new DetectParams[0])); - } - public void control(uint localID, LLUUID itemID, LLUUID agentID, uint held, uint change) { myScriptEngine.PostObjectEvent(localID, new EventParams( diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index f025090..4c9ffd0 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -49,7 +49,7 @@ using OpenSim.Region.ScriptEngine.Interfaces; namespace OpenSim.Region.ScriptEngine.XEngine { - public class XEngine : IRegionModule, IScriptEngine + public class XEngine : IScriptModule, IScriptEngine { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -64,6 +64,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine private int m_EventLimit; private bool m_KillTimedOutScripts; public AsyncCommandManager m_AsyncCommands; + bool m_firstStart = true; private static List m_ScriptEngines = new List(); @@ -93,6 +94,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine private Dictionary > m_DomainScripts = new Dictionary >(); + private Queue m_CompileQueue = new Queue(100); + IWorkItemResult m_CurrentCompile = null; + public string ScriptEngineName { get { return "XEngine"; } @@ -202,6 +206,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_Scene.EventManager.OnRezScript += OnRezScript; m_Scene.EventManager.OnRemoveScript += OnRemoveScript; m_Scene.EventManager.OnScriptReset += OnScriptReset; + m_Scene.EventManager.OnStartScript += OnStartScript; + m_Scene.EventManager.OnStopScript += OnStopScript; m_AsyncCommands = new AsyncCommandManager(this); @@ -217,6 +223,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_ThreadPool.QueueWorkItem(new WorkItemCallback( this.DoBackup), new Object[] { saveTime }); } + + scene.RegisterModuleInterface(this); } public void PostInitialise() @@ -314,23 +322,90 @@ namespace OpenSim.Region.ScriptEngine.XEngine get { return m_MaxScriptQueue; } } - // - // Hooks - // - public void OnRezScript(uint localID, LLUUID itemID, string script) + public void OnRezScript(uint localID, LLUUID itemID, string script, int startParam, bool postOnRez) { -// m_ThreadPool.QueueWorkItem(new WorkItemCallback( -// this.DoOnRezScript), new Object[] -// { localID, itemID, script}); - DoOnRezScript(new Object[] { localID, itemID, script}); + Object[] parms = new Object[] + { localID, itemID, script, startParam, postOnRez}; + + lock(m_CompileQueue) + { + m_CompileQueue.Enqueue(parms); + if(m_CurrentCompile == null) + { + if(m_firstStart) + { + m_firstStart = false; + m_CurrentCompile = m_ThreadPool.QueueWorkItem( + new WorkItemCallback( + this.DoScriptWait), new Object[0]); + return; + } + m_CurrentCompile = m_ThreadPool.QueueWorkItem( + new WorkItemCallback( + this.DoOnRezScriptQueue), new Object[0]); + } + } } - private object DoOnRezScript(object parm) + public Object DoScriptWait(Object dummy) + { + Thread.Sleep(30000); + + lock(m_CompileQueue) + { + if(m_CompileQueue.Count > 0) + { + m_CurrentCompile = m_ThreadPool.QueueWorkItem( + new WorkItemCallback( + this.DoOnRezScriptQueue), new Object[0]); + } + else + { + m_CurrentCompile = null; + } + } + return null; + } + + public Object DoOnRezScriptQueue(Object dummy) + { + Object o; + lock(m_CompileQueue) + { + o = m_CompileQueue.Dequeue(); + if(o == null) + { + m_CurrentCompile = null; + return null; + } + } + + DoOnRezScript(o); + + lock(m_CompileQueue) + { + if(m_CompileQueue.Count > 0) + { + m_CurrentCompile = m_ThreadPool.QueueWorkItem( + new WorkItemCallback( + this.DoOnRezScriptQueue), new Object[0]); + } + else + { + m_CurrentCompile = null; + } + } + return null; + } + + private bool DoOnRezScript(object parm) { Object[] p = (Object[])parm; uint localID = (uint)p[0]; LLUUID itemID = (LLUUID)p[1]; string script =(string)p[2]; + int startParam = (int)p[3]; + bool postOnRez = (bool)p[4]; // Get the asset ID of the script, so we can check if we // already have it. @@ -427,7 +502,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine part.UUID, itemID, assetID, assembly, m_AppDomains[appDomain], part.ParentGroup.RootPart.Name, - item.Name, XScriptInstance.StateSource.NewRez); + item.Name, startParam, postOnRez, + XScriptInstance.StateSource.NewRez); m_log.DebugFormat("[XEngine] Loaded script {0}.{1}", part.ParentGroup.RootPart.Name, item.Name); @@ -505,6 +581,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine ResetScript(itemID); } + public void OnStartScript(uint localID, LLUUID itemID) + { + StartScript(itemID); + } + + public void OnStopScript(uint localID, LLUUID itemID) + { + StopScript(itemID); + } + private void CleanAssemblies() { List assetIDList = new List(m_Assemblies.Keys); @@ -674,7 +760,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine if (running) instance.Start(); else - instance.Stop(500); + instance.Stop(100); } } @@ -693,6 +779,20 @@ namespace OpenSim.Region.ScriptEngine.XEngine instance.ResetScript(); } + public void StartScript(LLUUID itemID) + { + XScriptInstance instance = GetInstance(itemID); + if (instance != null) + instance.Start(); + } + + public void StopScript(LLUUID itemID) + { + XScriptInstance instance = GetInstance(itemID); + if (instance != null) + instance.Stop(0); + } + public DetectParams GetDetectParams(LLUUID itemID, int idx) { XScriptInstance instance = GetInstance(itemID); @@ -723,6 +823,19 @@ namespace OpenSim.Region.ScriptEngine.XEngine return "default"; return instance.State; } + + public int GetStartParameter(LLUUID itemID) + { + XScriptInstance instance = GetInstance(itemID); + if (instance == null) + return 0; + return instance.StartParam; + } + + public bool GetScriptRunning(LLUUID objectID, LLUUID itemID) + { + return GetScriptState(itemID); + } } public class XScriptInstance @@ -745,6 +858,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine private string m_PrimName; private string m_ScriptName; private string m_Assembly; + private int m_StartParam = 0; + private Dictionary m_Apis = new Dictionary(); public enum StateSource @@ -823,9 +938,16 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_EventQueue.Clear(); } + public int StartParam + { + get { return m_StartParam; } + set { m_StartParam = value; } + } + public XScriptInstance(XEngine engine, uint localID, LLUUID objectID, LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom, - string primName, string scriptName, StateSource stateSource) + string primName, string scriptName, int startParam, + bool postOnRez, StateSource stateSource) { m_Engine = engine; @@ -836,6 +958,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine m_PrimName = primName; m_ScriptName = scriptName; m_Assembly = assembly; + m_StartParam = startParam; ApiManager am = new ApiManager(); @@ -918,6 +1041,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine { m_RunEvents = false; Start(); + if(postOnRez) + PostEvent(new EventParams("on_rez", + new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0])); } // we get new rez events on sim restart, too @@ -934,25 +1060,36 @@ namespace OpenSim.Region.ScriptEngine.XEngine else { m_Engine.Log.Error("[XEngine] Unable to load script state: Memory limit exceeded"); + Start(); PostEvent(new EventParams("state_entry", new Object[0], new DetectParams[0])); - Start(); + if(postOnRez) + PostEvent(new EventParams("on_rez", + new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0])); + } } catch (Exception e) { m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state from xml: {0}\n"+e.ToString(), xml); + Start(); PostEvent(new EventParams("state_entry", new Object[0], new DetectParams[0])); - Start(); + if(postOnRez) + PostEvent(new EventParams("on_rez", + new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0])); } } else { - m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found"); +// m_Engine.Log.ErrorFormat("[XEngine] Unable to load script state, file not found"); + Start(); PostEvent(new EventParams("state_entry", new Object[0], new DetectParams[0])); - Start(); + + if(postOnRez) + PostEvent(new EventParams("on_rez", + new Object[] {new LSL_Types.LSLInteger(startParam)}, new DetectParams[0])); } } @@ -1062,6 +1199,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine { // m_Engine.Log.DebugFormat("[XEngine] Posted event {2} in state {3} to {0}.{1}", // m_PrimName, m_ScriptName, data.EventName, m_State); + + if(!Running) + return; + lock (m_EventQueue) { if (m_EventQueue.Count >= m_Engine.MaxScriptQueue) -- cgit v1.1