Mantis#1616. Applied Melanie's patch. This may or may

not break trunk.
0.6.0-stable
Charles Krinke 2008-06-28 16:08:12 +00:00
parent 86defd0a69
commit 9a0ef22ed9
24 changed files with 372 additions and 200 deletions

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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
}

View File

@ -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)
{

View File

@ -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);
}
}

View File

@ -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)
{
}

View File

@ -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);

View File

@ -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 TriggerOnRezEvent(uint localID, LLUUID itemID, int param)
public void TriggerStartScript(uint localID, LLUUID itemID)
{
handlerOnRezEvent = OnRezEvent;
if (handlerOnRezEvent != null)
handlerStartScript = OnStartScript;
if (handlerStartScript != null)
{
handlerOnRezEvent(localID, itemID, param);
handlerStartScript(localID, itemID);
}
}
public void TriggerStopScript(uint localID, LLUUID itemID)
{
handlerStopScript = OnStopScript;
if (handlerStopScript != null)
{
handlerStopScript(localID, itemID);
}
}

View File

@ -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;

View File

@ -46,7 +46,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <summary>
/// Start all the scripts in the scene which should be started.
/// </summary>
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<IScriptModule>();
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);
}
}
}

View File

@ -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);
}

View File

@ -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;

View File

@ -38,115 +38,32 @@ namespace OpenSim.Region.Environment.Scenes
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Start a given script.
/// </summary>
/// <param name="localID">
/// A <see cref="System.UInt32"/>
/// </param>
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.
// /// </summary>
// /// <param name="localID">
// /// A <see cref="System.UInt32"/>
// /// </param>
// 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);
// }
// }
/// <summary>
/// Start the scripts contained in all the prims in this group.
/// </summary>
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);
}
}
}
/// <summary>
/// Start the scripts contained in all the prims in this group.
/// </summary>
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();
}
}
}
/// <summary>
/// Start a given script.
/// </summary>
/// <param name="localID">
/// A <see cref="System.UInt32"/>
/// </param>
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);
}
}
/// <summary>
///
/// </summary>

View File

@ -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
/// <summary>
@ -136,16 +134,6 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary>
protected bool m_isSelected = false;
/// <summary>
/// Set start parameter for on_rez event and llGetStartParameter()
/// </summary>
[XmlIgnore]
public int StartParameter
{
get { return m_startparameter; }
set { m_startparameter = value; }
}
/// <summary>
/// Number of prims in this group
/// </summary>
@ -937,7 +925,7 @@ namespace OpenSim.Region.Environment.Scenes
{
foreach (SceneObjectPart part in m_parts.Values)
{
part.StopScripts();
part.RemoveScriptInstances();
List<ScenePresence> avatars = Scene.GetScenePresences();
for (int i = 0; i < avatars.Count; i++)

View File

@ -137,7 +137,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <summary>
/// Start all the scripts contained in this prim's inventory
/// </summary>
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);
}
}
}
}
/// <summary>
/// Start all the scripts contained in this prim's inventory
/// </summary>
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
/// <summary>
/// Stop all the scripts in this prim.
/// </summary>
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
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
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
/// <param name="itemId">
/// A <see cref="LLUUID"/>
/// </param>
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.
/// </summary>
/// <param name="itemId"></param>
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<TaskInventoryItem> il = new List<TaskInventoryItem>(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;
}
/// <summary>
/// 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.

View File

@ -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)
{
}

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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)");

View File

@ -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)

View File

@ -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(

View File

@ -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<XEngine> m_ScriptEngines =
new List<XEngine>();
@ -93,6 +94,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
private Dictionary<LLUUID, List<LLUUID> > m_DomainScripts =
new Dictionary<LLUUID, List<LLUUID> >();
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<IScriptModule>(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<LLUUID> assetIDList = new List<LLUUID>(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<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>();
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)