Convergence is almost complete. This brings the diff between the API to < 10k

and makes it use a common set of types in both engine. Fixes the issues with
running both engines and HTTP requests / listens / timers etc..
Also fixes a couple of minor Scene issues and a CTB by nullref.
0.6.0-stable
Melanie Thielker 2008-09-25 05:13:44 +00:00
parent 5edaddce6d
commit f3c8963c86
30 changed files with 388 additions and 1721 deletions

View File

@ -502,7 +502,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// horribly tangly. Hopefully it should be possible to greatly simplify it. // horribly tangly. Hopefully it should be possible to greatly simplify it.
if (shutdownCircuit) if (shutdownCircuit)
{ {
OnConnectionClosed(this); if (OnConnectionClosed != null)
OnConnectionClosed(this);
} }
else else
{ {

View File

@ -1,38 +0,0 @@
/*
* 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 OpenMetaverse;
namespace OpenSim.Region.Environment.Interfaces
{
public interface IScriptModule : IRegionModule
{
bool GetScriptRunning(UUID objectID, UUID itemID);
}
}

View File

@ -192,6 +192,8 @@ namespace OpenSim.Region.Environment.Scenes
public event ScriptTimerEvent OnScriptTimerEvent; public event ScriptTimerEvent OnScriptTimerEvent;
public delegate void EstateToolsTimeUpdate(ulong regionHandle, bool FixedTime, bool EstateSun, float LindenHour); public delegate void EstateToolsTimeUpdate(ulong regionHandle, bool FixedTime, bool EstateSun, float LindenHour);
public delegate void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID);
public event EstateToolsTimeUpdate OnEstateToolsTimeUpdate; public event EstateToolsTimeUpdate OnEstateToolsTimeUpdate;
public delegate void ObjectBeingRemovedFromScene(SceneObjectGroup obj); public delegate void ObjectBeingRemovedFromScene(SceneObjectGroup obj);
@ -211,6 +213,7 @@ namespace OpenSim.Region.Environment.Scenes
public delegate void ParcelPrimCountTainted(); public delegate void ParcelPrimCountTainted();
public event ParcelPrimCountTainted OnParcelPrimCountTainted; public event ParcelPrimCountTainted OnParcelPrimCountTainted;
public event GetScriptRunning OnGetScriptRunning;
/// <summary> /// <summary>
/// RegisterCapsEvent is called by Scene after the Caps object /// RegisterCapsEvent is called by Scene after the Caps object
@ -368,9 +371,17 @@ namespace OpenSim.Region.Environment.Scenes
private ScriptColliding handlerCollidingStart = null; private ScriptColliding handlerCollidingStart = null;
private ScriptColliding handlerColliding = null; private ScriptColliding handlerColliding = null;
private ScriptColliding handlerCollidingEnd = null; private ScriptColliding handlerCollidingEnd = null;
private GetScriptRunning handlerGetScriptRunning = null;
private SunLindenHour handlerSunGetLindenHour = null; private SunLindenHour handlerSunGetLindenHour = null;
public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
{
handlerGetScriptRunning = OnGetScriptRunning;
if (handlerGetScriptRunning != null)
handlerGetScriptRunning(controllingClient, objectID, itemID);
}
public void TriggerOnScriptChangedEvent(uint localID, uint change) public void TriggerOnScriptChangedEvent(uint localID, uint change)
{ {
handlerScriptChangedEvent = OnScriptChangedEvent; handlerScriptChangedEvent = OnScriptChangedEvent;

View File

@ -445,7 +445,6 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
Console.WriteLine("Non-Prim item ==>");
itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions; itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
} }
@ -896,6 +895,9 @@ namespace OpenSim.Region.Environment.Scenes
if (group != null) if (group != null)
{ {
TaskInventoryItem item = group.GetInventoryItem(localID, itemID); TaskInventoryItem item = group.GetInventoryItem(localID, itemID);
if (item == null)
return;
if (item.Type == 10) if (item.Type == 10)
{ {
EventManager.TriggerRemoveScript(localID, itemID); EventManager.TriggerRemoveScript(localID, itemID);
@ -2311,16 +2313,6 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T
} }
public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
{
IScriptModule scriptModule = RequestModuleInterface<IScriptModule>();
if (scriptModule == null)
return;
controllingClient.SendScriptRunningReply(objectID, itemID,
scriptModule.GetScriptRunning(objectID, itemID));
}
public void SetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID, bool running) public void SetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID, bool running)
{ {
SceneObjectPart part = GetSceneObjectPart(objectID); SceneObjectPart part = GetSceneObjectPart(objectID);
@ -2388,5 +2380,10 @@ System.Console.WriteLine("Item asset {0}, request asset {1}", prevItem.AssetID.T
} }
m_innerScene.DetachSingleAttachmentToInv(itemID, remoteClient); m_innerScene.DetachSingleAttachmentToInv(itemID, remoteClient);
} }
public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
{
EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID);
}
} }
} }

View File

@ -26,6 +26,7 @@
*/ */
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common namespace OpenSim.Region.ScriptEngine.Common
{ {
@ -36,6 +37,5 @@ namespace OpenSim.Region.ScriptEngine.Common
ExecutorBase Exec { get; } ExecutorBase Exec { get; }
string Source { get; set; } string Source { get; set; }
void Start(BuilIn_Commands BuiltIn_Commands); void Start(BuilIn_Commands BuiltIn_Commands);
EventQueueManager.Queue_llDetectParams_Struct llDetectParams { get; set; }
} }
} }

View File

@ -45,6 +45,7 @@ using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.Physics.Manager; using OpenSim.Region.Physics.Manager;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger; using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
@ -79,7 +80,8 @@ namespace OpenSim.Region.ScriptEngine.Common
m_localID = localID; m_localID = localID;
m_itemID = itemID; m_itemID = itemID;
AsyncCommands = m_ScriptEngine.m_ASYNCLSLCommandManager; AsyncCommands = new AsyncCommandManager(m_ScriptEngine);
//m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); //m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]");
@ -759,256 +761,95 @@ namespace OpenSim.Region.ScriptEngine.Common
public LSL_String llDetectedName(int number) public LSL_String llDetectedName(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SenseList != null) if (d == null)
{
if ((number >= 0) && (number < SenseList.Length))
{
UUID SensedUUID = (UUID)SenseList.Data[number];
return resolveName(SensedUUID);
}
}
else
{
ScriptManager sm;
IScript script = null;
if ((sm = m_ScriptEngine.m_ScriptManager) != null)
{
if (sm.Scripts.ContainsKey(m_localID))
{
if ((script = sm.GetScript(m_localID, m_itemID)) != null)
{
//System.Console.WriteLine(number + " - " + script.llDetectParams._key.Length);
if (script.llDetectParams._string != null)
{
if (script.llDetectParams._string.Length > number)
{
if (script.llDetectParams._string[number] != null)
{
return script.llDetectParams._string[number];
}
}
}
}
}
}
}
return String.Empty; return String.Empty;
} return d.Name;
public UUID uuidDetectedKey(int number)
{
LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID);
if (SenseList != null)
{
if ((number >= 0) && (number < SenseList.Length))
{
UUID SensedUUID = (UUID)SenseList.Data[number];
return SensedUUID;
}
}
else
{
ScriptManager sm;
IScript script = null;
if ((sm = m_ScriptEngine.m_ScriptManager) != null)
{
if (sm.Scripts.ContainsKey(m_localID))
{
if ((script = sm.GetScript(m_localID, m_itemID)) != null)
{
//System.Console.WriteLine(number + " - " + script.llDetectParams._key.Length);
if (script.llDetectParams._key.Length > number)
{
if (script.llDetectParams._key[number])
{
return new UUID(script.llDetectParams._key[number]);
}
}
}
}
}
}
return UUID.Zero;
}
public EntityBase entityDetectedKey(int number)
{
LSL_List SenseList = AsyncCommands.SensorRepeatPlugin.GetSensorList(m_localID, m_itemID);
if (SenseList != null)
{
if ((number >= 0) && (number < SenseList.Length))
{
UUID SensedUUID = (UUID)SenseList.Data[number];
EntityBase SensedObject = null;
lock (World.Entities)
{
World.Entities.TryGetValue(SensedUUID, out SensedObject);
}
return SensedObject;
}
}
else
{
ScriptManager sm;
IScript script = null;
if ((sm = m_ScriptEngine.m_ScriptManager) != null)
{
if (sm.Scripts.ContainsKey(m_localID))
{
if ((script = sm.GetScript(m_localID, m_itemID)) != null)
{
//System.Console.WriteLine(number + " - " + script.llDetectParams._key.Length);
if (script.llDetectParams._key.Length > number)
{
if (script.llDetectParams._key[number])
{
UUID SensedUUID = new UUID(script.llDetectParams._key[number]);
EntityBase SensedObject = null;
lock (World.Entities)
{
World.Entities.TryGetValue(SensedUUID, out SensedObject);
}
return SensedObject;
}
}
}
}
}
}
return null;
} }
public LSL_String llDetectedKey(int number) public LSL_String llDetectedKey(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID SensedUUID = uuidDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedUUID == UUID.Zero) if (d == null)
return String.Empty; return String.Empty;
return SensedUUID.ToString(); return d.Key.ToString();
} }
public LSL_String llDetectedOwner(int number) public LSL_String llDetectedOwner(int number)
{ {
// returns UUID of owner of object detected
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject ==null) if (d == null)
return String.Empty; return String.Empty;
UUID SensedUUID = uuidDetectedKey(number); return d.Owner.ToString();
if (World.GetScenePresence(SensedUUID) == null)
{
// sensed object is not an avatar
// so get the owner of the sensed object
SceneObjectPart SOP = World.GetSceneObjectPart(SensedUUID);
if (SOP != null) { return SOP.ObjectOwner.ToString(); }
}
else
{
// sensed object is an avatar, and so must be its own owner
return SensedUUID.ToString();
}
return String.Empty;
} }
public LSL_Integer llDetectedType(int number) public LSL_Integer llDetectedType(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject == null) if (d == null)
return 0; return 0;
int mask = 0; return new LSL_Integer(d.Type);
UUID SensedUUID = uuidDetectedKey(number);
LSL_Vector ZeroVector = new LSL_Vector(0, 0, 0);
if (World.GetScenePresence(SensedUUID) != null) mask |= 0x01; // actor
if (SensedObject.Velocity.Equals(ZeroVector))
mask |= 0x04; // passive non-moving
else
mask |= 0x02; // active moving
if (SensedObject is IScript) mask |= 0x08; // Scripted. It COULD have one hidden ...
return mask;
} }
public LSL_Vector llDetectedPos(int number) public LSL_Vector llDetectedPos(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject == null) if (d == null)
return new LSL_Vector(0, 0, 0); return new LSL_Vector();
return new LSL_Vector( return d.Position;
SensedObject.AbsolutePosition.X,
SensedObject.AbsolutePosition.Y,
SensedObject.AbsolutePosition.Z);
} }
public LSL_Vector llDetectedVel(int number) public LSL_Vector llDetectedVel(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject == null) if (d == null)
return new LSL_Vector(0, 0, 0); return new LSL_Vector();
return new LSL_Vector( return d.Velocity;
SensedObject.Velocity.X,
SensedObject.Velocity.Y,
SensedObject.Velocity.Z);
} }
public LSL_Vector llDetectedGrab(int number) public LSL_Vector llDetectedGrab(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject == null) if (parms == null)
return new LSL_Vector(0, 0, 0); return new LSL_Vector(0, 0, 0);
return new LSL_Vector( return parms.OffsetPos;
SensedObject.AbsolutePosition.X,
SensedObject.AbsolutePosition.Y,
SensedObject.AbsolutePosition.Z);
} }
public LSL_Rotation llDetectedRot(int number) public LSL_Rotation llDetectedRot(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject == null) if (d == null)
return new LSL_Rotation(); return new LSL_Rotation();
return new LSL_Rotation( return d.Rotation;
SensedObject.Rotation.X,
SensedObject.Rotation.Y,
SensedObject.Rotation.Z,
SensedObject.Rotation.W);
} }
public LSL_Integer llDetectedGroup(int number) public LSL_Integer llDetectedGroup(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
UUID SensedUUID = uuidDetectedKey(number); DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedUUID == UUID.Zero) if (d == null)
return new LSL_Integer(0); return new LSL_Integer(0);
ScenePresence presence = World.GetScenePresence(SensedUUID); if (m_host.GroupID == d.Group)
IClientAPI client = presence.ControllingClient;
if (m_host.GroupID == client.ActiveGroupId)
return new LSL_Integer(1); return new LSL_Integer(1);
else
return new LSL_Integer(0); return new LSL_Integer(0);
} }
public LSL_Integer llDetectedLinkNumber(int number) public LSL_Integer llDetectedLinkNumber(int number)
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number); DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (SensedObject == null) if (parms == null)
return 0; return new LSL_Integer(0);
return m_host.LinkNum;
return new LSL_Integer(parms.LinkNum);
} }
public LSL_Vector llDetectedTouchBinormal(int index) public LSL_Vector llDetectedTouchBinormal(int index)

View File

@ -577,7 +577,7 @@ namespace OpenSim.Region.ScriptEngine.Common
{ {
UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, new UUID(channel)); UUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, new UUID(channel));
object[] resobj = new object[] { new LSL_Types.LSLInteger(1), new LSL_Types.LSLString(channelID.ToString()), new LSL_Types.LSLString(UUID.Zero.ToString()), new LSL_Types.LSLString(String.Empty), new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(String.Empty) }; object[] resobj = new object[] { new LSL_Types.LSLInteger(1), new LSL_Types.LSLString(channelID.ToString()), new LSL_Types.LSLString(UUID.Zero.ToString()), new LSL_Types.LSLString(String.Empty), new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(String.Empty) };
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "remote_data", EventQueueManager.llDetectNull, resobj); m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "remote_data", new DetectParams[0], resobj);
} }
} }

View File

@ -30,6 +30,7 @@ using System.Runtime.Remoting.Lifetime;
using System.Threading; using System.Threading;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared;
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat; using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger; using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
@ -68,13 +69,6 @@ namespace OpenSim.Region.ScriptEngine.Common
return lease; return lease;
} }
public EventQueueManager.Queue_llDetectParams_Struct _llDetectParams;
EventQueueManager.Queue_llDetectParams_Struct IScript.llDetectParams
{
get { return _llDetectParams; }
set { _llDetectParams = value; }
}
private Executor m_Exec; private Executor m_Exec;
ExecutorBase IScript.Exec ExecutorBase IScript.Exec

View File

@ -1,234 +0,0 @@
/*
* 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.Collections;
using System.Threading;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins;
using Timer=OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins.Timer;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
{
/// <summary>
/// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc.
/// </summary>
public class AsyncCommandManager : iScriptEngineFunctionModule
{
private static Thread cmdHandlerThread;
private static int cmdHandlerThreadCycleSleepms;
public ScriptEngine m_ScriptEngine;
private Timer m_Timer;
private HttpRequest m_HttpRequest;
private Listener m_Listener;
private SensorRepeat m_SensorRepeat;
private XmlRequest m_XmlRequest;
private Dataserver m_Dataserver;
public Dataserver DataserverPlugin
{
get { return m_Dataserver; }
}
public Timer TimerPlugin
{
get { return m_Timer; }
}
public HttpRequest HttpRequestPlugin
{
get { return m_HttpRequest; }
}
public Listener ListenerPlugin
{
get { return m_Listener; }
}
public SensorRepeat SensorRepeatPlugin
{
get { return m_SensorRepeat; }
}
public XmlRequest XmlRequestPlugin
{
get { return m_XmlRequest; }
}
public AsyncCommandManager(ScriptEngine _ScriptEngine)
{
m_ScriptEngine = _ScriptEngine;
ReadConfig();
// Create instances of all plugins
m_Timer = new Timer(this);
m_HttpRequest = new HttpRequest(this);
m_Listener = new Listener(this);
m_SensorRepeat = new SensorRepeat(this);
m_XmlRequest = new XmlRequest(this);
m_Dataserver = new Dataserver(this);
StartThread();
}
private static void StartThread()
{
if (cmdHandlerThread == null)
{
// Start the thread that will be doing the work
cmdHandlerThread = new Thread(CmdHandlerThreadLoop);
cmdHandlerThread.Name = "AsyncLSLCmdHandlerThread";
cmdHandlerThread.Priority = ThreadPriority.BelowNormal;
cmdHandlerThread.IsBackground = true;
cmdHandlerThread.Start();
ThreadTracker.Add(cmdHandlerThread);
}
}
public void ReadConfig()
{
cmdHandlerThreadCycleSleepms = m_ScriptEngine.ScriptConfigSource.GetInt("AsyncLLCommandLoopms", 100);
}
~AsyncCommandManager()
{
// Shut down thread
try
{
if (cmdHandlerThread != null)
{
if (cmdHandlerThread.IsAlive == true)
{
cmdHandlerThread.Abort();
//cmdHandlerThread.Join();
}
}
}
catch
{
}
}
private static void CmdHandlerThreadLoop()
{
while (true)
{
try
{
while (true)
{
Thread.Sleep(cmdHandlerThreadCycleSleepms);
//lock (ScriptEngine.ScriptEngines)
//{
foreach (ScriptEngine se in new ArrayList(ScriptEngine.ScriptEngines))
{
se.m_ASYNCLSLCommandManager.DoOneCmdHandlerPass();
}
//}
// Sleep before next cycle
//Thread.Sleep(cmdHandlerThreadCycleSleepms);
}
}
catch
{
}
}
}
internal void DoOneCmdHandlerPass()
{
// Check timers
m_Timer.CheckTimerEvents();
// Check HttpRequests
m_HttpRequest.CheckHttpRequests();
// Check XMLRPCRequests
m_XmlRequest.CheckXMLRPCRequests();
// Check Listeners
m_Listener.CheckListeners();
// Check Sensors
m_SensorRepeat.CheckSenseRepeaterEvents();
// Check dataserver
m_Dataserver.ExpireRequests();
}
/// <summary>
/// Remove a specific script (and all its pending commands)
/// </summary>
/// <param name="localID"></param>
/// <param name="itemID"></param>
public void RemoveScript(uint localID, UUID itemID)
{
// Remove a specific script
// Remove from: Timers
m_Timer.UnSetTimerEvents(localID, itemID);
// Remove from: HttpRequest
IHttpRequests iHttpReq =
m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>();
iHttpReq.StopHttpRequest(localID, itemID);
IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
comms.DeleteListener(itemID);
IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
xmlrpc.DeleteChannels(itemID);
xmlrpc.CancelSRDRequests(itemID);
// Remove Sensors
m_SensorRepeat.UnSetSenseRepeaterEvents(localID, itemID);
// Remove queries
m_Dataserver.RemoveEvents(localID, itemID);
}
#region Check llRemoteData channels
#endregion
#region Check llListeners
#endregion
/// <summary>
/// If set to true then threads and stuff should try to make a graceful exit
/// </summary>
public bool PleaseShutdown
{
get { return _PleaseShutdown; }
set { _PleaseShutdown = value; }
}
private bool _PleaseShutdown = false;
}
}

View File

@ -1,127 +0,0 @@
/*
* 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 System.Collections;
using System.Collections.Generic;
using OpenMetaverse;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins
{
public class Dataserver
{
public AsyncCommandManager m_CmdManager;
private Dictionary<string, DataserverRequest> DataserverRequests =
new Dictionary<string, DataserverRequest>();
public Dataserver(AsyncCommandManager CmdManager)
{
m_CmdManager = CmdManager;
}
private class DataserverRequest
{
public uint localID;
public UUID itemID;
public UUID ID;
public string handle;
public DateTime startTime;
}
public UUID RegisterRequest(uint localID, UUID itemID,
string identifier)
{
lock (DataserverRequests)
{
if (DataserverRequests.ContainsKey(identifier))
return UUID.Zero;
DataserverRequest ds = new DataserverRequest();
ds.localID = localID;
ds.itemID = itemID;
ds.ID = UUID.Random();
ds.handle = identifier;
ds.startTime = DateTime.Now;
DataserverRequests[identifier]=ds;
return ds.ID;
}
}
public void DataserverReply(string identifier, string reply)
{
DataserverRequest ds;
lock (DataserverRequests)
{
if (!DataserverRequests.ContainsKey(identifier))
return;
ds=DataserverRequests[identifier];
DataserverRequests.Remove(identifier);
}
m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToObjectQueue(
ds.localID, "dataserver", EventQueueManager.llDetectNull,
new Object[] { new LSL_Types.LSLString(ds.ID.ToString()),
new LSL_Types.LSLString(reply)});
}
public void RemoveEvents(uint localID, UUID itemID)
{
lock (DataserverRequests)
{
foreach (DataserverRequest ds in new List<DataserverRequest>(DataserverRequests.Values))
{
if (ds.itemID == itemID)
DataserverRequests.Remove(ds.handle);
}
}
}
public void ExpireRequests()
{
lock (DataserverRequests)
{
foreach (DataserverRequest ds in new List<DataserverRequest>(DataserverRequests.Values))
{
if (ds.startTime > DateTime.Now.AddSeconds(30))
DataserverRequests.Remove(ds.handle);
}
}
}
}
}

View File

@ -1,98 +0,0 @@
/*
* 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.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Scripting.HttpRequest;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins
{
public class HttpRequest
{
public AsyncCommandManager m_CmdManager;
public HttpRequest(AsyncCommandManager CmdManager)
{
m_CmdManager = CmdManager;
}
public void CheckHttpRequests()
{
if (m_CmdManager.m_ScriptEngine.World == null)
return;
IHttpRequests iHttpReq =
m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>();
HttpRequestClass httpInfo = null;
if (iHttpReq != null)
httpInfo = iHttpReq.GetNextCompletedRequest();
while (httpInfo != null)
{
//m_ScriptEngine.Log.Info("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status);
// Deliver data to prim's remote_data handler
//
// TODO: Returning null for metadata, since the lsl function
// only returns the byte for HTTP_BODY_TRUNCATED, which is not
// implemented here yet anyway. Should be fixed if/when maxsize
// is supported
bool handled = false;
iHttpReq.RemoveCompletedRequest(httpInfo.reqID);
foreach (ScriptEngine sman in ScriptEngine.ScriptEngines)
{
if (sman.m_ScriptManager.GetScript(httpInfo.localID, httpInfo.itemID) != null)
{
object[] resobj = new object[]
{
new LSL_Types.LSLString(httpInfo.reqID.ToString()), new LSL_Types.LSLInteger(httpInfo.status), null, new LSL_Types.LSLString(httpInfo.response_body)
};
sman.m_EventQueueManager.AddToScriptQueue(
httpInfo.localID, httpInfo.itemID, "http_response", EventQueueManager.llDetectNull, resobj
);
handled = true;
break;
//Thread.Sleep(2500);
}
}
if (!handled)
{
Console.WriteLine("Unhandled http_response: " + httpInfo.reqID);
}
httpInfo = iHttpReq.GetNextCompletedRequest();
}
}
}
}

View File

@ -1,76 +0,0 @@
/*
* 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 OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Scripting.WorldComm;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins
{
public class Listener
{
// private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public AsyncCommandManager m_CmdManager;
public Listener(AsyncCommandManager CmdManager)
{
m_CmdManager = CmdManager;
}
public void CheckListeners()
{
if (m_CmdManager.m_ScriptEngine.World == null)
return;
IWorldComm comms = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
if (comms != null)
{
while (comms.HasMessages())
{
ListenerInfo lInfo = comms.GetNextMessage();
if (m_CmdManager.m_ScriptEngine.m_ScriptManager.GetScript(
lInfo.GetLocalID(), lInfo.GetItemID()) != null)
{
//Deliver data to prim's listen handler
object[] resobj = new object[]
{
//lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage()
new LSL_Types.LSLInteger(lInfo.GetChannel()), new LSL_Types.LSLString(lInfo.GetName()), new LSL_Types.LSLString(lInfo.GetID().ToString()), new LSL_Types.LSLString(lInfo.GetMessage())
};
m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
lInfo.GetLocalID(), lInfo.GetItemID(), "listen", EventQueueManager.llDetectNull, resobj
);
}
// else
// m_log.Info("[ScriptEngineBase.AsyncCommandPlugins: received a listen event for a (no longer) existing script ("+lInfo.GetLocalID().AsString()+")");
}
}
}
}
}

View File

@ -1,334 +0,0 @@
/*
* 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.
*/
//#define SPAM
using System;
using System.Collections.Generic;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins
{
public class SensorRepeat
{
public AsyncCommandManager m_CmdManager;
public SensorRepeat(AsyncCommandManager CmdManager)
{
m_CmdManager = CmdManager;
}
public Dictionary<uint, Dictionary<UUID, LSL_Types.list>> SenseEvents =
new Dictionary<uint, Dictionary<UUID, LSL_Types.list>>();
private Object SenseLock = new Object();
//
// SenseRepeater and Sensors
//
private class SenseRepeatClass
{
public uint localID;
public UUID itemID;
public double interval;
public DateTime next;
public string name;
public UUID keyID;
public int type;
public double range;
public double arc;
public SceneObjectPart host;
}
private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>();
private object SenseRepeatListLock = new object();
public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID,
string name, UUID keyID, int type, double range, double arc, double sec, SceneObjectPart host)
{
#if SPAM
Console.WriteLine("SetSensorEvent");
#endif
// Always remove first, in case this is a re-set
UnSetSenseRepeaterEvents(m_localID, m_itemID);
if (sec == 0) // Disabling timer
return;
// Add to timer
SenseRepeatClass ts = new SenseRepeatClass();
ts.localID = m_localID;
ts.itemID = m_itemID;
ts.interval = sec;
ts.name = name;
ts.keyID = keyID;
ts.type = type;
ts.range = range;
ts.arc = arc;
ts.host = host;
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
lock (SenseRepeatListLock)
{
SenseRepeaters.Add(ts);
}
}
public void UnSetSenseRepeaterEvents(uint m_localID, UUID m_itemID)
{
// Remove from timer
lock (SenseRepeatListLock)
{
List<SenseRepeatClass> NewSensors = new List<SenseRepeatClass>();
foreach (SenseRepeatClass ts in SenseRepeaters)
{
if (ts.localID != m_localID && ts.itemID != m_itemID)
{
NewSensors.Add(ts);
}
}
SenseRepeaters.Clear();
SenseRepeaters = NewSensors;
}
}
public void CheckSenseRepeaterEvents()
{
// Nothing to do here?
if (SenseRepeaters.Count == 0)
return;
lock (SenseRepeatListLock)
{
// Go through all timers
foreach (SenseRepeatClass ts in SenseRepeaters)
{
// Time has passed?
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
{
SensorSweep(ts);
// set next interval
ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
}
}
} // lock
}
public void SenseOnce(uint m_localID, UUID m_itemID,
string name, UUID keyID, int type,
double range, double arc, SceneObjectPart host)
{
// Add to timer
SenseRepeatClass ts = new SenseRepeatClass();
ts.localID = m_localID;
ts.itemID = m_itemID;
ts.interval = 0;
ts.name = name;
ts.keyID = keyID;
ts.type = type;
ts.range = range;
ts.arc = arc;
ts.host = host;
SensorSweep(ts);
}
public LSL_Types.list GetSensorList(uint m_localID, UUID m_itemID)
{
lock (SenseLock)
{
Dictionary<UUID, LSL_Types.list> Obj = null;
if (!SenseEvents.TryGetValue(m_localID, out Obj))
{
#if SPAM
m_CmdManager.m_ScriptEngine.Log.Info("[AsyncLSL]: GetSensorList missing localID: " + m_localID);
#endif
return null;
}
lock (Obj)
{
// Get script
LSL_Types.list SenseList = null;
if (!Obj.TryGetValue(m_itemID, out SenseList))
{
#if SPAM
m_CmdManager.m_ScriptEngine.Log.Info("[AsyncLSL]: GetSensorList missing itemID: " + m_itemID);
#endif
return null;
}
return SenseList;
}
}
}
private void SensorSweep(SenseRepeatClass ts)
{
//m_ScriptEngine.Log.Info("[AsyncLSL]:Enter SensorSweep");
SceneObjectPart SensePoint = ts.host;
if (SensePoint == null)
{
#if SPAM
//m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep (SensePoint == null) for "+ts.itemID.ToString());
#endif
return;
}
//m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep Scan");
Vector3 sensorPos = SensePoint.AbsolutePosition;
Vector3 regionPos = new Vector3(m_CmdManager.m_ScriptEngine.World.RegionInfo.RegionLocX * Constants.RegionSize, m_CmdManager.m_ScriptEngine.World.RegionInfo.RegionLocY * Constants.RegionSize, 0);
Vector3 fromRegionPos = sensorPos + regionPos;
Quaternion q = SensePoint.RotationOffset;
LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W);
LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r);
double mag_fwd = LSL_Types.Vector3.Mag(forward_dir);
// Here we should do some smart culling ...
// math seems quicker than strings so try that first
LSL_Types.list SensedObjects = new LSL_Types.list();
LSL_Types.Vector3 ZeroVector = new LSL_Types.Vector3(0, 0, 0);
foreach (EntityBase ent in m_CmdManager.m_ScriptEngine.World.Entities.Values)
{
Vector3 toRegionPos = ent.AbsolutePosition + regionPos;
double dis = Math.Abs((double)Util.GetDistanceTo(toRegionPos, fromRegionPos));
if (dis <= ts.range)
{
// In Range, is it the right Type ?
int objtype = 0;
if (m_CmdManager.m_ScriptEngine.World.GetScenePresence(ent.UUID) != null) objtype |= 0x01; // actor
if (ent.Velocity.Equals(ZeroVector))
objtype |= 0x04; // passive non-moving
else
objtype |= 0x02; // active moving
if (ent is IScript) objtype |= 0x08; // Scripted. It COULD have one hidden ...
if (((ts.type & objtype) != 0) || ((ts.type & objtype) == ts.type))
{
// docs claim AGENT|ACTIVE should find agent objects OR active objects
// so the bitwise AND with object type should be non-zero
// Right type too, what about the other params , key and name ?
bool keep = true;
if (ts.arc < Math.PI)
{
// not omni-directional. Can you see it ?
// vec forward_dir = llRot2Fwd(llGetRot())
// vec obj_dir = toRegionPos-fromRegionPos
// dot=dot(forward_dir,obj_dir)
// mag_fwd = mag(forward_dir)
// mag_obj = mag(obj_dir)
// ang = acos(dot /(mag_fwd*mag_obj))
double ang_obj = 0;
try
{
Vector3 diff = toRegionPos - fromRegionPos;
LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z);
double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir);
double mag_obj = LSL_Types.Vector3.Mag(obj_dir);
ang_obj = Math.Acos(dot / (mag_fwd * mag_obj));
}
catch
{
}
if (ang_obj > ts.arc) keep = false;
}
if (keep && (ts.keyID != UUID.Zero) && (ts.keyID != ent.UUID))
{
keep = false;
}
if (keep && (ts.name.Length > 0))
{
string avatarname=null;
string objectname=null;
string entname =ent.Name;
// try avatar username surname
CachedUserInfo profile = m_CmdManager.m_ScriptEngine.World.CommsManager.UserProfileCacheService.GetUserDetails(ent.UUID);
if (profile != null && profile.UserProfile != null)
{
avatarname = profile.UserProfile.FirstName + " " + profile.UserProfile.SurName;
}
// try an scene object
SceneObjectPart SOP = m_CmdManager.m_ScriptEngine.World.GetSceneObjectPart(ent.UUID);
if (SOP != null)
{
objectname = SOP.Name;
}
if ((ts.name != entname) && (ts.name != avatarname) && (ts.name != objectname))
{
keep = false;
}
}
if (keep == true) SensedObjects.Add(ent.UUID);
}
}
}
#if SPAM
//m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep SenseLock");
#endif
lock (SenseLock)
{
// Create object if it doesn't exist
if (SenseEvents.ContainsKey(ts.localID) == false)
{
SenseEvents.Add(ts.localID, new Dictionary<UUID, LSL_Types.list>());
}
// clear if previous traces exist
Dictionary<UUID, LSL_Types.list> Obj;
SenseEvents.TryGetValue(ts.localID, out Obj);
if (Obj.ContainsKey(ts.itemID) == true)
Obj.Remove(ts.itemID);
// note list may be zero length
Obj.Add(ts.itemID, SensedObjects);
if (SensedObjects.Length == 0)
{
// send a "no_sensor"
// Add it to queue
m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "no_sensor", EventQueueManager.llDetectNull,
new object[] { });
}
else
{
m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "sensor", EventQueueManager.llDetectNull,
new object[] { new LSL_Types.LSLInteger(SensedObjects.Length) });
}
m_CmdManager.m_ScriptEngine.World.EventManager.TriggerTimerEvent(ts.localID, ts.interval);
}
}
}
}

View File

@ -1,139 +0,0 @@
/*
* 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 System.Collections;
using System.Collections.Generic;
using OpenMetaverse;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins
{
public class Timer
{
public AsyncCommandManager m_CmdManager;
public Timer(AsyncCommandManager CmdManager)
{
m_CmdManager = CmdManager;
}
//
// TIMER
//
private class TimerClass
{
public uint localID;
public UUID itemID;
//public double interval;
public long interval;
//public DateTime next;
public long next;
}
private List<TimerClass> Timers = new List<TimerClass>();
private object TimerListLock = new object();
public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec)
{
// Console.WriteLine("SetTimerEvent");
// Always remove first, in case this is a re-set
UnSetTimerEvents(m_localID, m_itemID);
if (sec == 0) // Disabling timer
return;
// Add to timer
TimerClass ts = new TimerClass();
ts.localID = m_localID;
ts.itemID = m_itemID;
ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait
// 2193386136332921 ticks
// 219338613 seconds
//ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
ts.next = DateTime.Now.Ticks + ts.interval;
lock (TimerListLock)
{
Timers.Add(ts);
}
}
public void UnSetTimerEvents(uint m_localID, UUID m_itemID)
{
// Remove from timer
lock (TimerListLock)
{
foreach (TimerClass ts in new ArrayList(Timers))
{
if (ts.localID == m_localID && ts.itemID == m_itemID)
Timers.Remove(ts);
}
}
// Old method: Create new list
//List<TimerClass> NewTimers = new List<TimerClass>();
//foreach (TimerClass ts in Timers)
//{
// if (ts.localID != m_localID && ts.itemID != m_itemID)
// {
// NewTimers.Add(ts);
// }
//}
//Timers.Clear();
//Timers = NewTimers;
//}
}
public void CheckTimerEvents()
{
// Nothing to do here?
if (Timers.Count == 0)
return;
lock (TimerListLock)
{
// Go through all timers
foreach (TimerClass ts in Timers)
{
// Time has passed?
if (ts.next < DateTime.Now.Ticks)
{
// Console.WriteLine("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next);
// Add it to queue
m_CmdManager.m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", EventQueueManager.llDetectNull,
null);
m_CmdManager.m_ScriptEngine.World.EventManager.TriggerTimerEvent(ts.localID, ((double)ts.interval / 10000000));
// set next interval
//ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
ts.next = DateTime.Now.Ticks + ts.interval;
}
}
}
}
}
}

View File

@ -1,130 +0,0 @@
/*
* 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.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Scripting.XMLRPC;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.AsyncCommandPlugins
{
public class XmlRequest
{
public AsyncCommandManager m_CmdManager;
public XmlRequest(AsyncCommandManager CmdManager)
{
m_CmdManager = CmdManager;
}
public void CheckXMLRPCRequests()
{
if (m_CmdManager.m_ScriptEngine.World == null)
return;
IXMLRPC xmlrpc = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
if (null == xmlrpc)
return;
// Process the completed request queue
RPCRequestInfo rInfo = xmlrpc.GetNextCompletedRequest();
while (rInfo != null)
{
bool handled = false;
// Request must be taken out of the queue in case there is no handler, otherwise we loop infinitely
xmlrpc.RemoveCompletedRequest(rInfo.GetMessageID());
// And since the xmlrpc request queue is actually shared among all regions on the simulator, we need
// to look in each one for the appropriate handler
foreach (ScriptEngine sman in ScriptEngine.ScriptEngines) {
if (sman.m_ScriptManager.GetScript(rInfo.GetLocalID(),rInfo.GetItemID()) != null) {
//Deliver data to prim's remote_data handler
object[] resobj = new object[]
{
new LSL_Types.LSLInteger(2), new LSL_Types.LSLString(rInfo.GetChannelKey().ToString()), new LSL_Types.LSLString(rInfo.GetMessageID().ToString()), new LSL_Types.LSLString(String.Empty),
new LSL_Types.LSLInteger(rInfo.GetIntValue()),
new LSL_Types.LSLString(rInfo.GetStrVal())
};
sman.m_EventQueueManager.AddToScriptQueue(
rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", EventQueueManager.llDetectNull, resobj
);
handled = true;
}
}
if (! handled)
{
Console.WriteLine("Unhandled xml_request: " + rInfo.GetItemID());
}
rInfo = xmlrpc.GetNextCompletedRequest();
}
// Process the send queue
SendRemoteDataRequest srdInfo = xmlrpc.GetNextCompletedSRDRequest();
while (srdInfo != null)
{
bool handled = false;
// Request must be taken out of the queue in case there is no handler, otherwise we loop infinitely
xmlrpc.RemoveCompletedSRDRequest(srdInfo.GetReqID());
// And this is another shared queue... so we check each of the script engines for a handler
foreach (ScriptEngine sman in ScriptEngine.ScriptEngines)
{
if (sman.m_ScriptManager.GetScript(srdInfo.m_localID,srdInfo.m_itemID) != null) {
//Deliver data to prim's remote_data handler
object[] resobj = new object[]
{
new LSL_Types.LSLInteger(3), new LSL_Types.LSLString(srdInfo.channel.ToString()), new LSL_Types.LSLString(srdInfo.GetReqID().ToString()), new LSL_Types.LSLString(String.Empty),
new LSL_Types.LSLInteger(srdInfo.idata),
new LSL_Types.LSLString(srdInfo.sdata)
};
sman.m_EventQueueManager.AddToScriptQueue(
srdInfo.m_localID, srdInfo.m_itemID, "remote_data", EventQueueManager.llDetectNull, resobj
);
handled = true;
}
}
if (! handled)
{
Console.WriteLine("Unhandled xml_srdrequest: " + srdInfo.GetReqID());
}
srdInfo = xmlrpc.GetNextCompletedSRDRequest();
}
}
}
}

View File

@ -114,83 +114,103 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public void changed(uint localID, uint change) public void changed(uint localID, uint change)
{ {
// Add to queue for all scripts in localID, Object pass change. // Add to queue for all scripts in localID, Object pass change.
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "changed", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLInteger(change) }); myScriptEngine.PostObjectEvent(localID, new EventParams(
"changed",new object[] { new LSL_Types.LSLInteger(change) },
new DetectParams[0]));
} }
public void state_entry(uint localID) public void state_entry(uint localID)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "state_entry", EventQueueManager.llDetectNull, new object[] { }); myScriptEngine.PostObjectEvent(localID, new EventParams(
"state_entry",new object[] { },
new DetectParams[0]));
} }
public void touch_start(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient) public void touch_start(uint localID, uint originalID, Vector3 offsetPos,
IClientAPI remoteClient)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct(); DetectParams[] det = new DetectParams[1];
detstruct._key = new LSL_Types.key[1]; det[0] = new DetectParams();
detstruct._key2 = new LSL_Types.key[1]; det[0].Key = remoteClient.AgentId;
detstruct._string = new string[1]; det[0].Populate(myScriptEngine.World);
detstruct._Vector3 = new LSL_Types.Vector3[1];
detstruct._Vector32 = new LSL_Types.Vector3[1]; if (originalID == 0)
detstruct._Quaternion = new LSL_Types.Quaternion[1];
detstruct._int = new int[1];
ScenePresence av = myScriptEngine.World.GetScenePresence(remoteClient.AgentId);
if (av != null)
{ {
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); if (part == null)
detstruct._string[0] = remoteClient.Name; return;
detstruct._int[0] = 0;
detstruct._Quaternion[0] = new LSL_Types.Quaternion(av.Rotation.X,av.Rotation.Y,av.Rotation.Z,av.Rotation.W); det[0].LinkNum = part.LinkNum;
detstruct._Vector3[0] = new LSL_Types.Vector3(av.AbsolutePosition.X,av.AbsolutePosition.Y,av.AbsolutePosition.Z);
detstruct._Vector32[0] = new LSL_Types.Vector3(av.Velocity.X,av.Velocity.Y,av.Velocity.Z);
} }
else else
{ {
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); det[0].LinkNum = originalPart.LinkNum;
detstruct._string[0] = remoteClient.Name;
detstruct._int[0] = 0;
detstruct._Quaternion[0] = new LSL_Types.Quaternion(0, 0, 0, 1);
detstruct._Vector3[0] = new LSL_Types.Vector3(0, 0, 0);
detstruct._Vector32[0] = new LSL_Types.Vector3(0, 0, 0);
} }
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", detstruct, new object[] { new LSL_Types.LSLInteger(1) });
myScriptEngine.PostObjectEvent(localID, new EventParams(
"touch_start", new Object[] { new LSL_Types.LSLInteger(1) },
det));
}
public void touch(uint localID, uint originalID, Vector3 offsetPos,
IClientAPI remoteClient)
{
// Add to queue for all scripts in ObjectID object
DetectParams[] det = new DetectParams[1];
det[0] = new DetectParams();
det[0].Key = remoteClient.AgentId;
det[0].Populate(myScriptEngine.World);
det[0].OffsetPos = new LSL_Types.Vector3(offsetPos.X,
offsetPos.Y,
offsetPos.Z);
if (originalID == 0)
{
SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
if (part == null)
return;
det[0].LinkNum = part.LinkNum;
}
else
{
SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
det[0].LinkNum = originalPart.LinkNum;
}
myScriptEngine.PostObjectEvent(localID, new EventParams(
"touch", new Object[] { new LSL_Types.LSLInteger(1) },
det));
} }
public void touch_end(uint localID, uint originalID, IClientAPI remoteClient) public void touch_end(uint localID, uint originalID, IClientAPI remoteClient)
{ {
// Add to queue for all scripts in ObjectID object // Add to queue for all scripts in ObjectID object
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct(); DetectParams[] det = new DetectParams[1];
detstruct._key = new LSL_Types.key[1]; det[0] = new DetectParams();
detstruct._key2 = new LSL_Types.key[1]; det[0].Key = remoteClient.AgentId;
detstruct._string = new string[1]; det[0].Populate(myScriptEngine.World);
detstruct._Vector3 = new LSL_Types.Vector3[1];
detstruct._Vector32 = new LSL_Types.Vector3[1]; if (originalID == 0)
detstruct._Quaternion = new LSL_Types.Quaternion[1];
detstruct._int = new int[1];
ScenePresence av = myScriptEngine.World.GetScenePresence(remoteClient.AgentId);
if (av != null)
{ {
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); if (part == null)
detstruct._string[0] = remoteClient.Name; return;
detstruct._int[0] = 0;
detstruct._Quaternion[0] = new LSL_Types.Quaternion(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W); det[0].LinkNum = part.LinkNum;
detstruct._Vector3[0] = new LSL_Types.Vector3(av.AbsolutePosition.X, av.AbsolutePosition.Y, av.AbsolutePosition.Z);
detstruct._Vector32[0] = new LSL_Types.Vector3(av.Velocity.X, av.Velocity.Y, av.Velocity.Z);
} }
else else
{ {
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString()); det[0].LinkNum = originalPart.LinkNum;
detstruct._string[0] = remoteClient.Name;
detstruct._int[0] = 0;
detstruct._Quaternion[0] = new LSL_Types.Quaternion(0, 0, 0, 1);
detstruct._Vector3[0] = new LSL_Types.Vector3(0, 0, 0);
detstruct._Vector32[0] = new LSL_Types.Vector3(0, 0, 0);
} }
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_end", detstruct, new object[] { new LSL_Types.LSLInteger(1) });
myScriptEngine.PostObjectEvent(localID, new EventParams(
"touch_end", new Object[] { new LSL_Types.LSLInteger(1) },
det));
} }
public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine) public void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine)
@ -228,7 +248,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public void money(uint localID, UUID agentID, int amount) public void money(uint localID, UUID agentID, int amount)
{ {
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "money", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLString(agentID.ToString()), new LSL_Types.LSLInteger(amount) }); myScriptEngine.PostObjectEvent(localID, new EventParams(
"money", new object[] {
new LSL_Types.LSLString(agentID.ToString()),
new LSL_Types.LSLInteger(amount) },
new DetectParams[0]));
} }
// TODO: Replace placeholders below // TODO: Replace placeholders below
@ -239,225 +263,196 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public void state_exit(uint localID) public void state_exit(uint localID)
{ {
// Add to queue for all scripts in ObjectID object myScriptEngine.PostObjectEvent(localID, new EventParams(
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "state_exit", EventQueueManager.llDetectNull, new object[] { }); "state_exit", new object[] { },
} new DetectParams[0]));
public void touch(uint localID, uint originalID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch", EventQueueManager.llDetectNull);
}
public void touch_end(uint localID, uint originalID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch_end", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLInteger(1) });
} }
public void collision_start(uint localID, ColliderArgs col) public void collision_start(uint localID, ColliderArgs col)
{ {
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct(); // Add to queue for all scripts in ObjectID object
detstruct._string = new string[col.Colliders.Count]; List<DetectParams> det = new List<DetectParams>();
detstruct._Quaternion = new LSL_Types.Quaternion[col.Colliders.Count];
detstruct._int = new int[col.Colliders.Count];
detstruct._key = new LSL_Types.key[col.Colliders.Count];
detstruct._key2 = new LSL_Types.key[col.Colliders.Count];
detstruct._Vector3 = new LSL_Types.Vector3[col.Colliders.Count];
detstruct._Vector32 = new LSL_Types.Vector3[col.Colliders.Count];
detstruct._bool = new bool[col.Colliders.Count];
int i = 0;
foreach (DetectedObject detobj in col.Colliders) foreach (DetectedObject detobj in col.Colliders)
{ {
detstruct._key[i] = new LSL_Types.key(detobj.keyUUID.ToString()); DetectParams d = new DetectParams();
detstruct._key2[i] = new LSL_Types.key(detobj.ownerUUID.ToString()); d.Key =detobj.keyUUID;
detstruct._Quaternion[i] = new LSL_Types.Quaternion(detobj.rotQuat.X, detobj.rotQuat.Y, detobj.rotQuat.Z, detobj.rotQuat.W); d.Populate(myScriptEngine.World);
detstruct._string[i] = detobj.nameStr; det.Add(d);
detstruct._int[i] = detobj.colliderType;
detstruct._Vector3[i] = new LSL_Types.Vector3(detobj.posVector.X, detobj.posVector.Y, detobj.posVector.Z);
detstruct._Vector32[i] = new LSL_Types.Vector3(detobj.velVector.X, detobj.velVector.Y, detobj.velVector.Z);
detstruct._bool[i] = true; // Apparently the script engine uses this to see if this is a valid entry...
i++;
} }
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "collision_start", detstruct, new object[] { new LSL_Types.LSLInteger(col.Colliders.Count) }); if (det.Count > 0)
myScriptEngine.PostObjectEvent(localID, new EventParams(
"collision_start",
new Object[] { new LSL_Types.LSLInteger(det.Count) },
det.ToArray()));
} }
public void collision(uint localID, ColliderArgs col) public void collision(uint localID, ColliderArgs col)
{ {
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct(); // Add to queue for all scripts in ObjectID object
detstruct._string = new string[col.Colliders.Count]; List<DetectParams> det = new List<DetectParams>();
detstruct._Quaternion = new LSL_Types.Quaternion[col.Colliders.Count];
detstruct._int = new int[col.Colliders.Count];
detstruct._key = new LSL_Types.key[col.Colliders.Count];
detstruct._key2 = new LSL_Types.key[col.Colliders.Count];
detstruct._Vector3 = new LSL_Types.Vector3[col.Colliders.Count];
detstruct._Vector32 = new LSL_Types.Vector3[col.Colliders.Count];
detstruct._bool = new bool[col.Colliders.Count];
int i = 0;
foreach (DetectedObject detobj in col.Colliders) foreach (DetectedObject detobj in col.Colliders)
{ {
detstruct._key[i] = new LSL_Types.key(detobj.keyUUID.ToString()); DetectParams d = new DetectParams();
detstruct._key2[i] = new LSL_Types.key(detobj.ownerUUID.ToString()); d.Key =detobj.keyUUID;
detstruct._Quaternion[i] = new LSL_Types.Quaternion(detobj.rotQuat.X, detobj.rotQuat.Y, detobj.rotQuat.Z, detobj.rotQuat.W); d.Populate(myScriptEngine.World);
detstruct._string[i] = detobj.nameStr; det.Add(d);
detstruct._int[i] = detobj.colliderType;
detstruct._Vector3[i] = new LSL_Types.Vector3(detobj.posVector.X, detobj.posVector.Y, detobj.posVector.Z);
detstruct._Vector32[i] = new LSL_Types.Vector3(detobj.velVector.X, detobj.velVector.Y, detobj.velVector.Z);
detstruct._bool[i] = true; // Apparently the script engine uses this to see if this is a valid entry... i++;
} }
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "collision", detstruct, new object[] { new LSL_Types.LSLInteger(col.Colliders.Count) });
if (det.Count > 0)
myScriptEngine.PostObjectEvent(localID, new EventParams(
"collision", new Object[] { new LSL_Types.LSLInteger(det.Count) },
det.ToArray()));
} }
public void collision_end(uint localID, ColliderArgs col) public void collision_end(uint localID, ColliderArgs col)
{ {
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct(); // Add to queue for all scripts in ObjectID object
detstruct._string = new string[col.Colliders.Count]; List<DetectParams> det = new List<DetectParams>();
detstruct._Quaternion = new LSL_Types.Quaternion[col.Colliders.Count];
detstruct._int = new int[col.Colliders.Count];
detstruct._key = new LSL_Types.key[col.Colliders.Count];
detstruct._key2 = new LSL_Types.key[col.Colliders.Count];
detstruct._Vector3 = new LSL_Types.Vector3[col.Colliders.Count];
detstruct._Vector32 = new LSL_Types.Vector3[col.Colliders.Count];
detstruct._bool = new bool[col.Colliders.Count];
int i = 0;
foreach (DetectedObject detobj in col.Colliders) foreach (DetectedObject detobj in col.Colliders)
{ {
detstruct._key[i] = new LSL_Types.key(detobj.keyUUID.ToString()); DetectParams d = new DetectParams();
detstruct._key2[i] = new LSL_Types.key(detobj.ownerUUID.ToString()); d.Key =detobj.keyUUID;
detstruct._Quaternion[i] = new LSL_Types.Quaternion(detobj.rotQuat.X, detobj.rotQuat.Y, detobj.rotQuat.Z, detobj.rotQuat.W); d.Populate(myScriptEngine.World);
detstruct._string[i] = detobj.nameStr; det.Add(d);
detstruct._int[i] = detobj.colliderType;
detstruct._Vector3[i] = new LSL_Types.Vector3(detobj.posVector.X, detobj.posVector.Y, detobj.posVector.Z);
detstruct._Vector32[i] = new LSL_Types.Vector3(detobj.velVector.X, detobj.velVector.Y, detobj.velVector.Z);
detstruct._bool[i] = true; // Apparently the script engine uses this to see if this is a valid entry...
i++;
} }
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "collision_end", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLInteger(col.Colliders.Count) });
if (det.Count > 0)
myScriptEngine.PostObjectEvent(localID, new EventParams(
"collision_end",
new Object[] { new LSL_Types.LSLInteger(det.Count) },
det.ToArray()));
} }
public void land_collision_start(uint localID, UUID itemID) public void land_collision_start(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_start", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"land_collision_start",
new object[0],
new DetectParams[0]));
} }
public void land_collision(uint localID, ColliderArgs col) public void land_collision(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "land_collision", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"land_collision",
new object[0],
new DetectParams[0]));
} }
public void land_collision_end(uint localID, UUID itemID) public void land_collision_end(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_end", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"land_collision_end",
new object[0],
new DetectParams[0]));
} }
// Handled by long commands // Handled by long commands
public void timer(uint localID, UUID itemID) public void timer(uint localID, UUID itemID)
{ {
//myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, String.Empty);
} }
public void listen(uint localID, UUID itemID) public void listen(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "listen", EventQueueManager.llDetectNull);
}
public void on_rez(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "on_rez", EventQueueManager.llDetectNull);
}
public void sensor(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "sensor", EventQueueManager.llDetectNull);
}
public void no_sensor(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "no_sensor", EventQueueManager.llDetectNull);
} }
public void control(uint localID, UUID itemID, UUID agentID, uint held, uint change) public void control(uint localID, UUID itemID, UUID agentID, uint held, uint change)
{ {
if ((change == 0) && (myScriptEngine.m_EventQueueManager.CheckEeventQueueForEvent(localID,"control"))) return; if ((change == 0) && (myScriptEngine.m_EventQueueManager.CheckEeventQueueForEvent(localID,"control"))) return;
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "control", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLString(agentID.ToString()), new LSL_Types.LSLInteger(held), new LSL_Types.LSLInteger(change)}); myScriptEngine.PostObjectEvent(localID, new EventParams(
"control",new object[] {
new LSL_Types.LSLString(agentID.ToString()),
new LSL_Types.LSLInteger(held),
new LSL_Types.LSLInteger(change)},
new DetectParams[0]));
} }
public void email(uint localID, UUID itemID) public void email(uint localID, UUID itemID, string timeSent,
string address, string subject, string message, int numLeft)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "email", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"email",new object[] {
new LSL_Types.LSLString(timeSent),
new LSL_Types.LSLString(address),
new LSL_Types.LSLString(subject),
new LSL_Types.LSLString(message),
new LSL_Types.LSLInteger(numLeft)},
new DetectParams[0]));
} }
public void at_target(uint localID, uint handle, Vector3 targetpos, Vector3 atpos) public void at_target(uint localID, uint handle, Vector3 targetpos,
Vector3 atpos)
{ {
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "at_target", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLInteger(handle), new LSL_Types.Vector3(targetpos.X,targetpos.Y,targetpos.Z), new LSL_Types.Vector3(atpos.X,atpos.Y,atpos.Z) }); myScriptEngine.PostObjectEvent(localID, new EventParams(
"at_target", new object[] {
new LSL_Types.LSLInteger(handle),
new LSL_Types.Vector3(targetpos.X,targetpos.Y,targetpos.Z),
new LSL_Types.Vector3(atpos.X,atpos.Y,atpos.Z) },
new DetectParams[0]));
} }
public void not_at_target(uint localID) public void not_at_target(uint localID)
{ {
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "not_at_target", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"not_at_target",new object[0],
new DetectParams[0]));
} }
public void at_rot_target(uint localID, UUID itemID) public void at_rot_target(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_rot_target", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"at_rot_target",new object[0],
new DetectParams[0]));
} }
public void not_at_rot_target(uint localID, UUID itemID) public void not_at_rot_target(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_rot_target", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
} "not_at_rot_target",new object[0],
new DetectParams[0]));
public void run_time_permissions(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "run_time_permissions", EventQueueManager.llDetectNull);
}
public void changed(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "changed", EventQueueManager.llDetectNull);
} }
public void attach(uint localID, UUID itemID) public void attach(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "attach", EventQueueManager.llDetectNull);
} }
public void dataserver(uint localID, UUID itemID) public void dataserver(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "dataserver", EventQueueManager.llDetectNull);
} }
public void link_message(uint localID, UUID itemID) public void link_message(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "link_message", EventQueueManager.llDetectNull);
} }
public void moving_start(uint localID, UUID itemID) public void moving_start(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_start", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"moving_start",new object[0],
new DetectParams[0]));
} }
public void moving_end(uint localID, UUID itemID) public void moving_end(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_end", EventQueueManager.llDetectNull); myScriptEngine.PostObjectEvent(localID, new EventParams(
"moving_end",new object[0],
new DetectParams[0]));
} }
public void object_rez(uint localID, UUID itemID) public void object_rez(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "object_rez", EventQueueManager.llDetectNull);
} }
public void remote_data(uint localID, UUID itemID) public void remote_data(uint localID, UUID itemID)
{ {
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "remote_data", EventQueueManager.llDetectNull);
} }
// Handled by long commands // Handled by long commands
public void http_response(uint localID, UUID itemID) public void http_response(uint localID, UUID itemID)
{ {
// myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "http_response", EventQueueManager.llDetectNull);
} }
/// <summary> /// <summary>

View File

@ -137,32 +137,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public uint localID; public uint localID;
public UUID itemID; public UUID itemID;
public string functionName; public string functionName;
public Queue_llDetectParams_Struct llDetectParams; public DetectParams[] llDetectParams;
public object[] param; public object[] param;
} }
/// <summary>
/// Shared empty llDetectNull
/// </summary>
public readonly static Queue_llDetectParams_Struct llDetectNull = new Queue_llDetectParams_Struct();
/// <summary>
/// Structure to hold data for llDetect* commands
/// </summary>
[Serializable]
public struct Queue_llDetectParams_Struct
{
// More or less just a placeholder for the actual moving of additional data
// should be fixed to something better :)
public LSL_Types.key[] _key; // detected key
public LSL_Types.key[] _key2; // ownerkey
public LSL_Types.Quaternion[] _Quaternion;
public LSL_Types.Vector3[] _Vector3; // Pos
public LSL_Types.Vector3[] _Vector32; // Vel
public bool[] _bool;
public int[] _int;
public string[] _string;
}
#endregion #endregion
#region " Initialization / Startup " #region " Initialization / Startup "
@ -322,7 +300,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// <param name="localID">Region object ID</param> /// <param name="localID">Region object ID</param>
/// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
/// <param name="param">Array of parameters to match event mask</param> /// <param name="param">Array of parameters to match event mask</param>
public bool AddToObjectQueue(uint localID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) public bool AddToObjectQueue(uint localID, string FunctionName, DetectParams[] qParams, params object[] param)
{ {
// Determine all scripts in Object and add to their queue // Determine all scripts in Object and add to their queue
//myScriptEngine.log.Info("[" + ScriptEngineName + "]: EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); //myScriptEngine.log.Info("[" + ScriptEngineName + "]: EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName);
@ -353,7 +331,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// <param name="itemID">Region script ID</param> /// <param name="itemID">Region script ID</param>
/// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param>
/// <param name="param">Array of parameters to match event mask</param> /// <param name="param">Array of parameters to match event mask</param>
public bool AddToScriptQueue(uint localID, UUID itemID, string FunctionName, Queue_llDetectParams_Struct qParams, params object[] param) public bool AddToScriptQueue(uint localID, UUID itemID, string FunctionName, DetectParams[] qParams, params object[] param)
{ {
List<UUID> keylist = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); List<UUID> keylist = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID);

View File

@ -57,7 +57,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public EventQueueManager m_EventQueueManager; // Executes events, handles script threads public EventQueueManager m_EventQueueManager; // Executes events, handles script threads
public ScriptManager m_ScriptManager; // Load, unload and execute scripts public ScriptManager m_ScriptManager; // Load, unload and execute scripts
public AppDomainManager m_AppDomainManager; // Handles loading/unloading of scripts into AppDomains public AppDomainManager m_AppDomainManager; // Handles loading/unloading of scripts into AppDomains
public AsyncCommandManager m_ASYNCLSLCommandManager; // Asyncronous LSL commands (commands that returns with an event)
public static MaintenanceThread m_MaintenanceThread; // Thread that does different kinds of maintenance, for example refreshing config and killing scripts that has been running too long public static MaintenanceThread m_MaintenanceThread; // Thread that does different kinds of maintenance, for example refreshing config and killing scripts that has been running too long
public IConfigSource ConfigSource; public IConfigSource ConfigSource;
@ -121,7 +120,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
// We need to start it // We need to start it
m_ScriptManager = newScriptManager; m_ScriptManager = newScriptManager;
m_AppDomainManager = new AppDomainManager(this); m_AppDomainManager = new AppDomainManager(this);
m_ASYNCLSLCommandManager = new AsyncCommandManager(this);
if (m_MaintenanceThread == null) if (m_MaintenanceThread == null)
m_MaintenanceThread = new MaintenanceThread(); m_MaintenanceThread = new MaintenanceThread();
@ -172,7 +170,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
if (m_EventManager != null) m_EventManager.ReadConfig(); if (m_EventManager != null) m_EventManager.ReadConfig();
if (m_ScriptManager != null) m_ScriptManager.ReadConfig(); if (m_ScriptManager != null) m_ScriptManager.ReadConfig();
if (m_AppDomainManager != null) m_AppDomainManager.ReadConfig(); if (m_AppDomainManager != null) m_AppDomainManager.ReadConfig();
if (m_ASYNCLSLCommandManager != null) m_ASYNCLSLCommandManager.ReadConfig();
if (m_MaintenanceThread != null) m_MaintenanceThread.ReadConfig(); if (m_MaintenanceThread != null) m_MaintenanceThread.ReadConfig();
} }
@ -196,15 +193,33 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public bool PostObjectEvent(uint localID, EventParams p) public bool PostObjectEvent(uint localID, EventParams p)
{ {
return m_EventQueueManager.AddToObjectQueue(localID, p.EventName, EventQueueManager.llDetectNull, p.Params); return m_EventQueueManager.AddToObjectQueue(localID, p.EventName, p.DetectParams, p.Params);
} }
public bool PostScriptEvent(UUID itemID, EventParams p) public bool PostScriptEvent(UUID itemID, EventParams p)
{ {
uint localID = m_ScriptManager.GetLocalID(itemID); uint localID = m_ScriptManager.GetLocalID(itemID);
return m_EventQueueManager.AddToScriptQueue(localID, itemID, p.EventName, EventQueueManager.llDetectNull, p.Params); return m_EventQueueManager.AddToScriptQueue(localID, itemID, p.EventName, p.DetectParams, p.Params);
} }
public DetectParams GetDetectParams(UUID itemID, int number)
{
uint localID = m_ScriptManager.GetLocalID(itemID);
if (localID == 0)
return null;
IScript Script = m_ScriptManager.GetScript(localID, itemID);
if (Script == null)
return null;
DetectParams[] det = m_ScriptManager.GetDetectParams(Script);
if (number < 0 || number >= det.Length)
return null;
return det[number];
}
#endregion #endregion
} }
} }

View File

@ -33,6 +33,7 @@ using System.Runtime.Serialization.Formatters.Binary;
using System.Threading; using System.Threading;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
{ {
@ -65,6 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
private int LoadUnloadMaxQueueSize; private int LoadUnloadMaxQueueSize;
private Object scriptLock = new Object(); private Object scriptLock = new Object();
private bool m_started = false; private bool m_started = false;
private Dictionary<IScript, DetectParams[]> detparms = new Dictionary<IScript, DetectParams[]>();
// Load/Unload structure // Load/Unload structure
private struct LUStruct private struct LUStruct
@ -228,6 +230,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
if (item.Action == LUType.Unload) if (item.Action == LUType.Unload)
{ {
_StopScript(item.localID, item.itemID); _StopScript(item.localID, item.itemID);
RemoveScript(item.localID, item.itemID);
} }
else if (item.Action == LUType.Load) else if (item.Action == LUType.Load)
{ {
@ -318,7 +321,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// <param name="itemID">Script ID</param> /// <param name="itemID">Script ID</param>
/// <param name="FunctionName">Name of function</param> /// <param name="FunctionName">Name of function</param>
/// <param name="args">Arguments to pass to function</param> /// <param name="args">Arguments to pass to function</param>
internal void ExecuteEvent(uint localID, UUID itemID, string FunctionName, EventQueueManager.Queue_llDetectParams_Struct qParams, object[] args) internal void ExecuteEvent(uint localID, UUID itemID, string FunctionName, DetectParams[] qParams, object[] args)
{ {
//cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined //cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined
///#if DEBUG ///#if DEBUG
@ -337,8 +340,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// Console.WriteLine("ScriptEngine: Executing event: " + FunctionName); /// Console.WriteLine("ScriptEngine: Executing event: " + FunctionName);
///#endif ///#endif
// Must be done in correct AppDomain, so leaving it up to the script itself // Must be done in correct AppDomain, so leaving it up to the script itself
Script.llDetectParams = qParams; detparms[Script] = qParams;
Script.Exec.ExecuteEvent(FunctionName, args); Script.Exec.ExecuteEvent(FunctionName, args);
detparms.Remove(Script);
} }
public uint GetLocalID(UUID itemID) public uint GetLocalID(UUID itemID)
@ -430,6 +434,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public void RemoveScript(uint localID, UUID itemID) public void RemoveScript(uint localID, UUID itemID)
{ {
if (localID == 0)
localID = GetLocalID(itemID);
// Don't have that object? // Don't have that object?
if (Scripts.ContainsKey(localID) == false) if (Scripts.ContainsKey(localID) == false)
return; return;
@ -486,5 +493,13 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
// set { _PleaseShutdown = value; } // set { _PleaseShutdown = value; }
//} //}
//private bool _PleaseShutdown = false; //private bool _PleaseShutdown = false;
public DetectParams[] GetDetectParams(IScript script)
{
if (detparms.ContainsKey(script))
return detparms[script];
return null;
}
} }
} }

View File

@ -30,6 +30,7 @@ using Nini.Config;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common namespace OpenSim.Region.ScriptEngine.Common
@ -42,28 +43,29 @@ namespace OpenSim.Region.ScriptEngine.Common
void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine); void OnRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine);
void OnRemoveScript(uint localID, UUID itemID); void OnRemoveScript(uint localID, UUID itemID);
void state_exit(uint localID); void state_exit(uint localID);
void touch(uint localID, uint originalID, UUID itemID); void touch(uint localID, uint originalID, Vector3 offsetPos,
void touch_end(uint localID, uint originalID, UUID itemID); IClientAPI remoteClient);
void touch_end(uint localID, uint originalID, IClientAPI remoteClient);
void collision_start(uint localID, ColliderArgs col); void collision_start(uint localID, ColliderArgs col);
void collision(uint localID, ColliderArgs col); void collision(uint localID, ColliderArgs col);
void collision_end(uint localID, ColliderArgs col); void collision_end(uint localID, ColliderArgs col);
void land_collision_start(uint localID, UUID itemID); // void land_collision_start(uint localID, UUID itemID);
void land_collision(uint localID, ColliderArgs col); // void land_collision(uint localID, ColliderArgs col);
void land_collision_end(uint localID, UUID itemID); // void land_collision_end(uint localID, UUID itemID);
void timer(uint localID, UUID itemID); void timer(uint localID, UUID itemID);
void listen(uint localID, UUID itemID); void listen(uint localID, UUID itemID);
void on_rez(uint localID, UUID itemID); // void on_rez(uint localID, UUID itemID);
void sensor(uint localID, UUID itemID); // void sensor(uint localID, UUID itemID);
void no_sensor(uint localID, UUID itemID); // void no_sensor(uint localID, UUID itemID);
void control(uint localID, UUID itemID, UUID agentID, uint held, uint change); void control(uint localID, UUID itemID, UUID agentID, uint held, uint change);
void money(uint LocalID, UUID agentID, int amount); void money(uint LocalID, UUID agentID, int amount);
void email(uint localID, UUID itemID); // void email(uint localID, UUID itemID);
void at_target(uint localID, uint handle, Vector3 targetpos, Vector3 atpos); void at_target(uint localID, uint handle, Vector3 targetpos, Vector3 atpos);
void not_at_target(uint localID); void not_at_target(uint localID);
void at_rot_target(uint localID, UUID itemID); void at_rot_target(uint localID, UUID itemID);
void not_at_rot_target(uint localID, UUID itemID); void not_at_rot_target(uint localID, UUID itemID);
void run_time_permissions(uint localID, UUID itemID); // void run_time_permissions(uint localID, UUID itemID);
void changed(uint localID, UUID itemID); // void changed(uint localID, UUID itemID);
void attach(uint localID, UUID itemID); void attach(uint localID, UUID itemID);
void dataserver(uint localID, UUID itemID); void dataserver(uint localID, UUID itemID);
void link_message(uint localID, UUID itemID); void link_message(uint localID, UUID itemID);

View File

@ -33,6 +33,7 @@ using OpenSim.Framework;
using OpenSim.Region.Environment.Scenes; using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.ScriptEngine.Common; using OpenSim.Region.ScriptEngine.Common;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
namespace OpenSim.Region.ScriptEngine.DotNetEngine namespace OpenSim.Region.ScriptEngine.DotNetEngine
@ -139,10 +140,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// Fire the first start-event // Fire the first start-event
int eventFlags = m_scriptEngine.m_ScriptManager.GetStateEventFlags(localID, itemID); int eventFlags = m_scriptEngine.m_ScriptManager.GetStateEventFlags(localID, itemID);
m_host.SetScriptEvents(itemID, eventFlags); m_host.SetScriptEvents(itemID, eventFlags);
m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", EventQueueManager.llDetectNull, new object[] { }); m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new DetectParams[0], new object[] { });
if (postOnRez) if (postOnRez)
{ {
m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "on_rez", EventQueueManager.llDetectNull, new object[] { new LSL_Types.LSLInteger(startParam) }); m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "on_rez", new DetectParams[0], new object[] { new LSL_Types.LSLInteger(startParam) });
} }
} }
catch (Exception e) // LEGIT: User Scripting catch (Exception e) // LEGIT: User Scripting
@ -174,7 +175,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
//#endif //#endif
// Stop long command on script // Stop long command on script
m_scriptEngine.m_ASYNCLSLCommandManager.RemoveScript(localID, itemID); AsyncCommandManager.RemoveScript(m_scriptEngine, localID, itemID);
IScript LSLBC = GetScript(localID, itemID); IScript LSLBC = GetScript(localID, itemID);
if (LSLBC == null) if (LSLBC == null)

View File

@ -54,47 +54,47 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public IEventReceiver m_ScriptEngine; public IEventReceiver m_ScriptEngine;
private IScene m_Scene; private IScene m_Scene;
private static Dictionary<IScene, Dataserver> m_Dataserver = private static Dictionary<IEventReceiver, Dataserver> m_Dataserver =
new Dictionary<IScene, Dataserver>(); new Dictionary<IEventReceiver, Dataserver>();
private static Dictionary<IScene, Timer> m_Timer = private static Dictionary<IEventReceiver, Timer> m_Timer =
new Dictionary<IScene, Timer>(); new Dictionary<IEventReceiver, Timer>();
private static Dictionary<IScene, Listener> m_Listener = private static Dictionary<IEventReceiver, Listener> m_Listener =
new Dictionary<IScene, Listener>(); new Dictionary<IEventReceiver, Listener>();
private static Dictionary<IScene, HttpRequest> m_HttpRequest = private static Dictionary<IEventReceiver, HttpRequest> m_HttpRequest =
new Dictionary<IScene, HttpRequest>(); new Dictionary<IEventReceiver, HttpRequest>();
private static Dictionary<IScene, SensorRepeat> m_SensorRepeat = private static Dictionary<IEventReceiver, SensorRepeat> m_SensorRepeat =
new Dictionary<IScene, SensorRepeat>(); new Dictionary<IEventReceiver, SensorRepeat>();
private static Dictionary<IScene, XmlRequest> m_XmlRequest = private static Dictionary<IEventReceiver, XmlRequest> m_XmlRequest =
new Dictionary<IScene, XmlRequest>(); new Dictionary<IEventReceiver, XmlRequest>();
public Dataserver DataserverPlugin public Dataserver DataserverPlugin
{ {
get { return m_Dataserver[m_Scene]; } get { return m_Dataserver[m_ScriptEngine]; }
} }
public Timer TimerPlugin public Timer TimerPlugin
{ {
get { return m_Timer[m_Scene]; } get { return m_Timer[m_ScriptEngine]; }
} }
public HttpRequest HttpRequestPlugin public HttpRequest HttpRequestPlugin
{ {
get { return m_HttpRequest[m_Scene]; } get { return m_HttpRequest[m_ScriptEngine]; }
} }
public Listener ListenerPlugin public Listener ListenerPlugin
{ {
get { return m_Listener[m_Scene]; } get { return m_Listener[m_ScriptEngine]; }
} }
public SensorRepeat SensorRepeatPlugin public SensorRepeat SensorRepeatPlugin
{ {
get { return m_SensorRepeat[m_Scene]; } get { return m_SensorRepeat[m_ScriptEngine]; }
} }
public XmlRequest XmlRequestPlugin public XmlRequest XmlRequestPlugin
{ {
get { return m_XmlRequest[m_Scene]; } get { return m_XmlRequest[m_ScriptEngine]; }
} }
public IEventReceiver[] ScriptEngines public IEventReceiver[] ScriptEngines
@ -107,26 +107,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_ScriptEngine = _ScriptEngine; m_ScriptEngine = _ScriptEngine;
m_Scene = m_ScriptEngine.World; m_Scene = m_ScriptEngine.World;
if (m_Scenes.Count == 0)
ReadConfig();
if (!m_Scenes.Contains(m_Scene)) if (!m_Scenes.Contains(m_Scene))
m_Scenes.Add(m_Scene); m_Scenes.Add(m_Scene);
if (!m_ScriptEngines.Contains(m_ScriptEngine)) if (!m_ScriptEngines.Contains(m_ScriptEngine))
m_ScriptEngines.Add(m_ScriptEngine); m_ScriptEngines.Add(m_ScriptEngine);
ReadConfig();
// Create instances of all plugins // Create instances of all plugins
if (!m_Dataserver.ContainsKey(m_Scene)) if (!m_Dataserver.ContainsKey(m_ScriptEngine))
m_Dataserver[m_Scene] = new Dataserver(this); m_Dataserver[m_ScriptEngine] = new Dataserver(this);
if (!m_Timer.ContainsKey(m_Scene)) if (!m_Timer.ContainsKey(m_ScriptEngine))
m_Timer[m_Scene] = new Timer(this); m_Timer[m_ScriptEngine] = new Timer(this);
if (!m_HttpRequest.ContainsKey(m_Scene)) if (!m_HttpRequest.ContainsKey(m_ScriptEngine))
m_HttpRequest[m_Scene] = new HttpRequest(this); m_HttpRequest[m_ScriptEngine] = new HttpRequest(this);
if (!m_Listener.ContainsKey(m_Scene)) if (!m_Listener.ContainsKey(m_ScriptEngine))
m_Listener[m_Scene] = new Listener(this); m_Listener[m_ScriptEngine] = new Listener(this);
if (!m_SensorRepeat.ContainsKey(m_Scene)) if (!m_SensorRepeat.ContainsKey(m_ScriptEngine))
m_SensorRepeat[m_Scene] = new SensorRepeat(this); m_SensorRepeat[m_ScriptEngine] = new SensorRepeat(this);
if (!m_XmlRequest.ContainsKey(m_Scene)) if (!m_XmlRequest.ContainsKey(m_ScriptEngine))
m_XmlRequest[m_Scene] = new XmlRequest(this); m_XmlRequest[m_ScriptEngine] = new XmlRequest(this);
StartThread(); StartThread();
} }
@ -145,7 +146,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
} }
public void ReadConfig() private void ReadConfig()
{ {
// cmdHandlerThreadCycleSleepms = m_ScriptEngine.Config.GetInt("AsyncLLCommandLoopms", 100); // cmdHandlerThreadCycleSleepms = m_ScriptEngine.Config.GetInt("AsyncLLCommandLoopms", 100);
// TODO: Make this sane again // TODO: Make this sane again
@ -195,18 +196,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
private static void DoOneCmdHandlerPass() private static void DoOneCmdHandlerPass()
{ {
foreach (IScene s in m_Scenes) // Check Listeners
m_Listener[m_ScriptEngines[0]].CheckListeners();
// Check HttpRequests
m_HttpRequest[m_ScriptEngines[0]].CheckHttpRequests();
// Check XMLRPCRequests
m_XmlRequest[m_ScriptEngines[0]].CheckXMLRPCRequests();
foreach (IEventReceiver s in m_ScriptEngines)
{ {
// Check timers // Check timers
m_Timer[s].CheckTimerEvents(); m_Timer[s].CheckTimerEvents();
// Check HttpRequests
m_HttpRequest[s].CheckHttpRequests();
// Check XMLRPCRequests
m_XmlRequest[s].CheckXMLRPCRequests();
// Check Listeners
m_Listener[s].CheckListeners();
// Check Sensors // Check Sensors
m_SensorRepeat[s].CheckSenseRepeaterEvents(); m_SensorRepeat[s].CheckSenseRepeaterEvents();
// Check dataserver // Check dataserver
m_Dataserver[s].ExpireRequests(); m_Dataserver[s].ExpireRequests();
} }
@ -217,38 +223,38 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
/// </summary> /// </summary>
/// <param name="localID"></param> /// <param name="localID"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
public static void RemoveScript(IScene scene, uint localID, UUID itemID) public static void RemoveScript(IEventReceiver engine, uint localID, UUID itemID)
{ {
// Remove a specific script // Remove a specific script
// Remove dataserver events // Remove dataserver events
m_Dataserver[scene].RemoveEvents(localID, itemID); m_Dataserver[engine].RemoveEvents(localID, itemID);
// Remove from: Timers // Remove from: Timers
m_Timer[scene].UnSetTimerEvents(localID, itemID); m_Timer[engine].UnSetTimerEvents(localID, itemID);
// Remove from: HttpRequest // Remove from: HttpRequest
IHttpRequests iHttpReq = IHttpRequests iHttpReq =
scene.RequestModuleInterface<IHttpRequests>(); engine.World.RequestModuleInterface<IHttpRequests>();
iHttpReq.StopHttpRequest(localID, itemID); iHttpReq.StopHttpRequest(localID, itemID);
IWorldComm comms = scene.RequestModuleInterface<IWorldComm>(); IWorldComm comms = engine.World.RequestModuleInterface<IWorldComm>();
comms.DeleteListener(itemID); comms.DeleteListener(itemID);
IXMLRPC xmlrpc = scene.RequestModuleInterface<IXMLRPC>(); IXMLRPC xmlrpc = engine.World.RequestModuleInterface<IXMLRPC>();
xmlrpc.DeleteChannels(itemID); xmlrpc.DeleteChannels(itemID);
xmlrpc.CancelSRDRequests(itemID); xmlrpc.CancelSRDRequests(itemID);
// Remove Sensors // Remove Sensors
m_SensorRepeat[scene].UnSetSenseRepeaterEvents(localID, itemID); m_SensorRepeat[engine].UnSetSenseRepeaterEvents(localID, itemID);
} }
public static Object[] GetSerializationData(IScene scene, UUID itemID) public static Object[] GetSerializationData(IEventReceiver engine, UUID itemID)
{ {
List<Object> data = new List<Object>(); List<Object> data = new List<Object>();
Object[] listeners=m_Listener[scene].GetSerializationData(itemID); Object[] listeners=m_Listener[engine].GetSerializationData(itemID);
if (listeners.Length > 0) if (listeners.Length > 0)
{ {
data.Add("listener"); data.Add("listener");
@ -256,7 +262,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
data.AddRange(listeners); data.AddRange(listeners);
} }
Object[] timers=m_Timer[scene].GetSerializationData(itemID); Object[] timers=m_Timer[engine].GetSerializationData(itemID);
if (timers.Length > 0) if (timers.Length > 0)
{ {
data.Add("timer"); data.Add("timer");
@ -264,7 +270,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
data.AddRange(timers); data.AddRange(timers);
} }
Object[] sensors=m_SensorRepeat[scene].GetSerializationData(itemID); Object[] sensors=m_SensorRepeat[engine].GetSerializationData(itemID);
if (sensors.Length > 0) if (sensors.Length > 0)
{ {
data.Add("sensor"); data.Add("sensor");
@ -275,7 +281,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return data.ToArray(); return data.ToArray();
} }
public static void CreateFromData(IScene scene, uint localID, public static void CreateFromData(IEventReceiver engine, uint localID,
UUID itemID, UUID hostID, Object[] data) UUID itemID, UUID hostID, Object[] data)
{ {
int idx = 0; int idx = 0;
@ -297,15 +303,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
switch (type) switch (type)
{ {
case "listener": case "listener":
m_Listener[scene].CreateFromData(localID, itemID, m_Listener[engine].CreateFromData(localID, itemID,
hostID, item); hostID, item);
break; break;
case "timer": case "timer":
m_Timer[scene].CreateFromData(localID, itemID, m_Timer[engine].CreateFromData(localID, itemID,
hostID, item); hostID, item);
break; break;
case "sensor": case "sensor":
m_SensorRepeat[scene].CreateFromData(localID, m_SensorRepeat[engine].CreateFromData(localID,
itemID, hostID, item); itemID, hostID, item);
break; break;
} }

View File

@ -58,7 +58,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
while (httpInfo != null) while (httpInfo != null)
{ {
//m_ScriptEngine.Log.Info("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status); //System.Console.WriteLine("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status);
// Deliver data to prim's remote_data handler // Deliver data to prim's remote_data handler
// //
@ -77,7 +77,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
new LSL_Types.LSLString(httpInfo.response_body) new LSL_Types.LSLString(httpInfo.response_body)
}; };
foreach (IScriptEngine e in m_CmdManager.ScriptEngines) foreach (IEventReceiver e in m_CmdManager.ScriptEngines)
{ {
if (e.PostObjectEvent(httpInfo.localID, if (e.PostObjectEvent(httpInfo.localID,
new EventParams("http_response", new EventParams("http_response",

View File

@ -29,6 +29,7 @@ using System;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Scripting.WorldComm; using OpenSim.Region.Environment.Modules.Scripting.WorldComm;
using OpenSim.Region.ScriptEngine.Interfaces;
using OpenSim.Region.ScriptEngine.Shared; using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api; using OpenSim.Region.ScriptEngine.Shared.Api;
@ -66,10 +67,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
new LSL_Types.LSLString(lInfo.GetMessage()) new LSL_Types.LSLString(lInfo.GetMessage())
}; };
m_CmdManager.m_ScriptEngine.PostScriptEvent( foreach (IEventReceiver e in m_CmdManager.ScriptEngines)
lInfo.GetItemID(), new EventParams( {
"listen", resobj, e.PostScriptEvent(
new DetectParams[0])); lInfo.GetItemID(), new EventParams(
"listen", resobj,
new DetectParams[0]));
}
} }
} }
} }

View File

@ -156,28 +156,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
SensorSweep(ts); SensorSweep(ts);
} }
public LSL_Types.list GetSensorList(uint m_localID, UUID m_itemID)
{
lock (SenseLock)
{
Dictionary<UUID, LSL_Types.list> Obj = null;
if (!SenseEvents.TryGetValue(m_localID, out Obj))
{
return null;
}
lock (Obj)
{
// Get script
LSL_Types.list SenseList = null;
if (!Obj.TryGetValue(m_itemID, out SenseList))
{
return null;
}
return SenseList;
}
}
}
private void SensorSweep(SenseRepeatClass ts) private void SensorSweep(SenseRepeatClass ts)
{ {
SceneObjectPart SensePoint = ts.host; SceneObjectPart SensePoint = ts.host;

View File

@ -108,7 +108,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
// Time has passed? // Time has passed?
if (ts.next < DateTime.Now.Ticks) if (ts.next < DateTime.Now.Ticks)
{ {
// Console.WriteLine("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next); //Console.WriteLine("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next);
// Add it to queue // Add it to queue
m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID,
new EventParams("timer", new Object[0], new EventParams("timer", new Object[0],

View File

@ -71,7 +71,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
new LSL_Types.LSLString(rInfo.GetStrVal()) new LSL_Types.LSLString(rInfo.GetStrVal())
}; };
foreach (IScriptEngine e in m_CmdManager.ScriptEngines) foreach (IEventReceiver e in m_CmdManager.ScriptEngines)
{ {
if (e.PostScriptEvent( if (e.PostScriptEvent(
rInfo.GetItemID(), new EventParams( rInfo.GetItemID(), new EventParams(
@ -100,7 +100,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
new LSL_Types.LSLString(srdInfo.sdata) new LSL_Types.LSLString(srdInfo.sdata)
}; };
foreach (IScriptEngine e in m_CmdManager.ScriptEngines) foreach (IEventReceiver e in m_CmdManager.ScriptEngines)
{ {
if (e.PostScriptEvent( if (e.PostScriptEvent(
srdInfo.m_itemID, new EventParams( srdInfo.m_itemID, new EventParams(

View File

@ -246,7 +246,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
ScriptSerializer.Deserialize(xml, this); ScriptSerializer.Deserialize(xml, this);
AsyncCommandManager.CreateFromData(m_Engine.World, AsyncCommandManager.CreateFromData(m_Engine,
m_LocalID, m_ItemID, m_ObjectID, m_LocalID, m_ItemID, m_ObjectID,
PluginData); PluginData);
@ -336,7 +336,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void DestroyScriptInstance() public void DestroyScriptInstance()
{ {
ReleaseControls(); ReleaseControls();
AsyncCommandManager.RemoveScript(m_Engine.World, m_LocalID, m_ItemID); AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
} }
public void RemoveState() public void RemoveState()
@ -554,7 +554,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// m_Engine.Log.DebugFormat("[Script] Script {0}.{1} state set to {2}", // m_Engine.Log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
// m_PrimName, m_ScriptName, data.Params[0].ToString()); // m_PrimName, m_ScriptName, data.Params[0].ToString());
m_State=data.Params[0].ToString(); m_State=data.Params[0].ToString();
AsyncCommandManager.RemoveScript(m_Engine.World, AsyncCommandManager.RemoveScript(m_Engine,
m_LocalID, m_ItemID); m_LocalID, m_ItemID);
SceneObjectPart part = m_Engine.World.GetSceneObjectPart( SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
@ -690,7 +690,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID); SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
part.GetInventoryItem(m_ItemID).PermsMask = 0; part.GetInventoryItem(m_ItemID).PermsMask = 0;
part.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero; part.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero;
AsyncCommandManager.RemoveScript(m_Engine.World, m_LocalID, m_ItemID); AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
m_EventQueue.Clear(); m_EventQueue.Clear();
m_Script.ResetVars(); m_Script.ResetVars();
m_State = "default"; m_State = "default";
@ -715,7 +715,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID); SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
part.GetInventoryItem(m_ItemID).PermsMask = 0; part.GetInventoryItem(m_ItemID).PermsMask = 0;
part.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero; part.GetInventoryItem(m_ItemID).PermsGranter = UUID.Zero;
AsyncCommandManager.RemoveScript(m_Engine.World, m_LocalID, m_ItemID); AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
m_EventQueue.Clear(); m_EventQueue.Clear();
m_Script.ResetVars(); m_Script.ResetVars();
@ -772,7 +772,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
return; return;
} }
PluginData = AsyncCommandManager.GetSerializationData(m_Engine.World, m_ItemID); PluginData = AsyncCommandManager.GetSerializationData(m_Engine, m_ItemID);
string xml = ScriptSerializer.Serialize(this); string xml = ScriptSerializer.Serialize(this);

View File

@ -50,7 +50,7 @@ using OpenSim.Region.ScriptEngine.Interfaces;
namespace OpenSim.Region.ScriptEngine.XEngine namespace OpenSim.Region.ScriptEngine.XEngine
{ {
public class XEngine : IScriptModule, IScriptEngine public class XEngine : IRegionModule, IScriptEngine
{ {
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@ -75,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
#pragma warning restore 414 #pragma warning restore 414
private int m_EventLimit; private int m_EventLimit;
private bool m_KillTimedOutScripts; private bool m_KillTimedOutScripts;
bool m_firstStart = true; // bool m_firstStart = true;
private static List<XEngine> m_ScriptEngines = private static List<XEngine> m_ScriptEngines =
new List<XEngine>(); new List<XEngine>();
@ -205,8 +205,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_ScriptEngines.Add(this); m_ScriptEngines.Add(this);
} }
scene.RegisterModuleInterface<IScriptModule>(this);
// Needs to be here so we can queue the scripts that need starting // Needs to be here so we can queue the scripts that need starting
// //
m_Scene.EventManager.OnRezScript += OnRezScript; m_Scene.EventManager.OnRezScript += OnRezScript;
@ -230,6 +228,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_Scene.EventManager.OnScriptReset += OnScriptReset; m_Scene.EventManager.OnScriptReset += OnScriptReset;
m_Scene.EventManager.OnStartScript += OnStartScript; m_Scene.EventManager.OnStartScript += OnStartScript;
m_Scene.EventManager.OnStopScript += OnStopScript; m_Scene.EventManager.OnStopScript += OnStopScript;
m_Scene.EventManager.OnGetScriptRunning += OnGetScriptRunning;
m_Scene.EventManager.OnShutdown += OnShutdown; m_Scene.EventManager.OnShutdown += OnShutdown;
if (m_SleepTime > 0) if (m_SleepTime > 0)
@ -357,14 +356,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (m_CurrentCompile == null) if (m_CurrentCompile == null)
{ {
if (m_firstStart) // if (m_firstStart)
{ // {
m_firstStart = false; // m_firstStart = false;
m_CurrentCompile = m_ThreadPool.QueueWorkItem( // m_CurrentCompile = m_ThreadPool.QueueWorkItem(
new WorkItemCallback(this.DoScriptWait), // new WorkItemCallback(this.DoScriptWait),
new Object[0]); // new Object[0]);
return; // return;
} // }
m_CurrentCompile = m_ThreadPool.QueueWorkItem( m_CurrentCompile = m_ThreadPool.QueueWorkItem(
new WorkItemCallback(this.DoOnRezScriptQueue), new WorkItemCallback(this.DoOnRezScriptQueue),
@ -375,7 +374,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public Object DoScriptWait(Object dummy) public Object DoScriptWait(Object dummy)
{ {
Thread.Sleep(30000); Thread.Sleep(10000);
lock (m_CompileQueue) lock (m_CompileQueue)
{ {
@ -884,11 +883,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return instance.StartParam; return instance.StartParam;
} }
public bool GetScriptRunning(UUID objectID, UUID itemID)
{
return GetScriptState(itemID);
}
public void OnShutdown() public void OnShutdown()
{ {
List<IScriptInstance> instances = new List<IScriptInstance>(); List<IScriptInstance> instances = new List<IScriptInstance>();
@ -922,5 +916,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return null; return null;
return instance.GetApi(name); return instance.GetApi(name);
} }
public void OnGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID)
{
IScriptInstance instance = GetInstance(itemID);
if (instance == null)
return;
controllingClient.SendScriptRunningReply(objectID, itemID,
GetScriptState(itemID));
}
} }
} }

View File

@ -1952,6 +1952,7 @@
<Reference name="OpenSim.Region.Physics.Manager" /> <Reference name="OpenSim.Region.Physics.Manager" />
<Reference name="OpenSim.Framework.Console"/> <Reference name="OpenSim.Framework.Console"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared"/> <Reference name="OpenSim.Region.ScriptEngine.Shared"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api"/>
<Reference name="Nini.dll" /> <Reference name="Nini.dll" />
<Reference name="RAIL.dll"/> <Reference name="RAIL.dll"/>
<Reference name="OpenSim.Framework.Console"/> <Reference name="OpenSim.Framework.Console"/>
@ -1990,6 +1991,7 @@
<Reference name="OpenSim.Region.Environment" /> <Reference name="OpenSim.Region.Environment" />
<Reference name="OpenSim.Region.ScriptEngine.Common"/> <Reference name="OpenSim.Region.ScriptEngine.Common"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared"/> <Reference name="OpenSim.Region.ScriptEngine.Shared"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api"/>
<Reference name="Microsoft.JScript"/> <Reference name="Microsoft.JScript"/>
<Reference name="Nini.dll" /> <Reference name="Nini.dll" />
<Reference name="log4net.dll"/> <Reference name="log4net.dll"/>