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