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.
if (shutdownCircuit)
{
OnConnectionClosed(this);
if (OnConnectionClosed != null)
OnConnectionClosed(this);
}
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 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 delegate void ObjectBeingRemovedFromScene(SceneObjectGroup obj);
@ -211,6 +213,7 @@ namespace OpenSim.Region.Environment.Scenes
public delegate void ParcelPrimCountTainted();
public event ParcelPrimCountTainted OnParcelPrimCountTainted;
public event GetScriptRunning OnGetScriptRunning;
/// <summary>
/// RegisterCapsEvent is called by Scene after the Caps object
@ -368,9 +371,17 @@ namespace OpenSim.Region.Environment.Scenes
private ScriptColliding handlerCollidingStart = null;
private ScriptColliding handlerColliding = null;
private ScriptColliding handlerCollidingEnd = null;
private GetScriptRunning handlerGetScriptRunning = 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)
{
handlerScriptChangedEvent = OnScriptChangedEvent;

View File

@ -445,7 +445,6 @@ namespace OpenSim.Region.Environment.Scenes
}
else
{
Console.WriteLine("Non-Prim item ==>");
itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
}
@ -896,6 +895,9 @@ namespace OpenSim.Region.Environment.Scenes
if (group != null)
{
TaskInventoryItem item = group.GetInventoryItem(localID, itemID);
if (item == null)
return;
if (item.Type == 10)
{
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)
{
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);
}
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.Shared;
namespace OpenSim.Region.ScriptEngine.Common
{
@ -36,6 +37,5 @@ namespace OpenSim.Region.ScriptEngine.Common
ExecutorBase Exec { get; }
string Source { get; set; }
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.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
@ -79,7 +80,8 @@ namespace OpenSim.Region.ScriptEngine.Common
m_localID = localID;
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 + "]");
@ -759,256 +761,95 @@ namespace OpenSim.Region.ScriptEngine.Common
public LSL_String llDetectedName(int number)
{
m_host.AddScriptLPS(1);
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 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];
}
}
}
}
}
}
}
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return String.Empty;
}
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;
return d.Name;
}
public LSL_String llDetectedKey(int number)
{
m_host.AddScriptLPS(1);
UUID SensedUUID = uuidDetectedKey(number);
if (SensedUUID == UUID.Zero)
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return String.Empty;
return SensedUUID.ToString();
return d.Key.ToString();
}
public LSL_String llDetectedOwner(int number)
{
// returns UUID of owner of object detected
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject ==null)
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return String.Empty;
UUID SensedUUID = uuidDetectedKey(number);
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;
return d.Owner.ToString();
}
public LSL_Integer llDetectedType(int number)
{
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject == null)
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return 0;
int mask = 0;
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;
return new LSL_Integer(d.Type);
}
public LSL_Vector llDetectedPos(int number)
{
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject == null)
return new LSL_Vector(0, 0, 0);
return new LSL_Vector(
SensedObject.AbsolutePosition.X,
SensedObject.AbsolutePosition.Y,
SensedObject.AbsolutePosition.Z);
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return new LSL_Vector();
return d.Position;
}
public LSL_Vector llDetectedVel(int number)
{
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject == null)
return new LSL_Vector(0, 0, 0);
return new LSL_Vector(
SensedObject.Velocity.X,
SensedObject.Velocity.Y,
SensedObject.Velocity.Z);
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return new LSL_Vector();
return d.Velocity;
}
public LSL_Vector llDetectedGrab(int number)
{
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject == null)
DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (parms == null)
return new LSL_Vector(0, 0, 0);
return new LSL_Vector(
SensedObject.AbsolutePosition.X,
SensedObject.AbsolutePosition.Y,
SensedObject.AbsolutePosition.Z);
return parms.OffsetPos;
}
public LSL_Rotation llDetectedRot(int number)
{
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject == null)
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return new LSL_Rotation();
return new LSL_Rotation(
SensedObject.Rotation.X,
SensedObject.Rotation.Y,
SensedObject.Rotation.Z,
SensedObject.Rotation.W);
return d.Rotation;
}
public LSL_Integer llDetectedGroup(int number)
{
m_host.AddScriptLPS(1);
UUID SensedUUID = uuidDetectedKey(number);
if (SensedUUID == UUID.Zero)
DetectParams d = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (d == null)
return new LSL_Integer(0);
ScenePresence presence = World.GetScenePresence(SensedUUID);
IClientAPI client = presence.ControllingClient;
if (m_host.GroupID == client.ActiveGroupId)
if (m_host.GroupID == d.Group)
return new LSL_Integer(1);
else
return new LSL_Integer(0);
}
public LSL_Integer llDetectedLinkNumber(int number)
{
m_host.AddScriptLPS(1);
EntityBase SensedObject = entityDetectedKey(number);
if (SensedObject == null)
return 0;
return m_host.LinkNum;
DetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number);
if (parms == null)
return new LSL_Integer(0);
return new LSL_Integer(parms.LinkNum);
}
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));
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 OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared;
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
@ -68,13 +69,6 @@ namespace OpenSim.Region.ScriptEngine.Common
return lease;
}
public EventQueueManager.Queue_llDetectParams_Struct _llDetectParams;
EventQueueManager.Queue_llDetectParams_Struct IScript.llDetectParams
{
get { return _llDetectParams; }
set { _llDetectParams = value; }
}
private Executor m_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)
{
// 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)
{
// 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
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct();
detstruct._key = new LSL_Types.key[1];
detstruct._key2 = new LSL_Types.key[1];
detstruct._string = new string[1];
detstruct._Vector3 = new LSL_Types.Vector3[1];
detstruct._Vector32 = new LSL_Types.Vector3[1];
detstruct._Quaternion = new LSL_Types.Quaternion[1];
detstruct._int = new int[1];
ScenePresence av = myScriptEngine.World.GetScenePresence(remoteClient.AgentId);
if (av != null)
DetectParams[] det = new DetectParams[1];
det[0] = new DetectParams();
det[0].Key = remoteClient.AgentId;
det[0].Populate(myScriptEngine.World);
if (originalID == 0)
{
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
detstruct._string[0] = remoteClient.Name;
detstruct._int[0] = 0;
detstruct._Quaternion[0] = new LSL_Types.Quaternion(av.Rotation.X,av.Rotation.Y,av.Rotation.Z,av.Rotation.W);
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);
SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
if (part == null)
return;
det[0].LinkNum = part.LinkNum;
}
else
{
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
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);
SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
det[0].LinkNum = originalPart.LinkNum;
}
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)
{
// Add to queue for all scripts in ObjectID object
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct();
detstruct._key = new LSL_Types.key[1];
detstruct._key2 = new LSL_Types.key[1];
detstruct._string = new string[1];
detstruct._Vector3 = new LSL_Types.Vector3[1];
detstruct._Vector32 = new LSL_Types.Vector3[1];
detstruct._Quaternion = new LSL_Types.Quaternion[1];
detstruct._int = new int[1];
ScenePresence av = myScriptEngine.World.GetScenePresence(remoteClient.AgentId);
if (av != null)
DetectParams[] det = new DetectParams[1];
det[0] = new DetectParams();
det[0].Key = remoteClient.AgentId;
det[0].Populate(myScriptEngine.World);
if (originalID == 0)
{
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
detstruct._string[0] = remoteClient.Name;
detstruct._int[0] = 0;
detstruct._Quaternion[0] = new LSL_Types.Quaternion(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W);
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);
SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID);
if (part == null)
return;
det[0].LinkNum = part.LinkNum;
}
else
{
detstruct._key[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
detstruct._key2[0] = new LSL_Types.key(remoteClient.AgentId.ToString());
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);
SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID);
det[0].LinkNum = originalPart.LinkNum;
}
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)
@ -228,7 +248,11 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
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
@ -239,225 +263,196 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public void state_exit(uint localID)
{
// Add to queue for all scripts in ObjectID object
myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "state_exit", EventQueueManager.llDetectNull, new object[] { });
}
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) });
myScriptEngine.PostObjectEvent(localID, new EventParams(
"state_exit", new object[] { },
new DetectParams[0]));
}
public void collision_start(uint localID, ColliderArgs col)
{
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct();
detstruct._string = new string[col.Colliders.Count];
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];
// Add to queue for all scripts in ObjectID object
List<DetectParams> det = new List<DetectParams>();
int i = 0;
foreach (DetectedObject detobj in col.Colliders)
{
detstruct._key[i] = new LSL_Types.key(detobj.keyUUID.ToString());
detstruct._key2[i] = new LSL_Types.key(detobj.ownerUUID.ToString());
detstruct._Quaternion[i] = new LSL_Types.Quaternion(detobj.rotQuat.X, detobj.rotQuat.Y, detobj.rotQuat.Z, detobj.rotQuat.W);
detstruct._string[i] = detobj.nameStr;
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++;
DetectParams d = new DetectParams();
d.Key =detobj.keyUUID;
d.Populate(myScriptEngine.World);
det.Add(d);
}
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)
{
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct();
detstruct._string = new string[col.Colliders.Count];
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];
// Add to queue for all scripts in ObjectID object
List<DetectParams> det = new List<DetectParams>();
int i = 0;
foreach (DetectedObject detobj in col.Colliders)
{
detstruct._key[i] = new LSL_Types.key(detobj.keyUUID.ToString());
detstruct._key2[i] = new LSL_Types.key(detobj.ownerUUID.ToString());
detstruct._Quaternion[i] = new LSL_Types.Quaternion(detobj.rotQuat.X, detobj.rotQuat.Y, detobj.rotQuat.Z, detobj.rotQuat.W);
detstruct._string[i] = detobj.nameStr;
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++;
DetectParams d = new DetectParams();
d.Key =detobj.keyUUID;
d.Populate(myScriptEngine.World);
det.Add(d);
}
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)
{
EventQueueManager.Queue_llDetectParams_Struct detstruct = new EventQueueManager.Queue_llDetectParams_Struct();
detstruct._string = new string[col.Colliders.Count];
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];
// Add to queue for all scripts in ObjectID object
List<DetectParams> det = new List<DetectParams>();
int i = 0;
foreach (DetectedObject detobj in col.Colliders)
{
detstruct._key[i] = new LSL_Types.key(detobj.keyUUID.ToString());
detstruct._key2[i] = new LSL_Types.key(detobj.ownerUUID.ToString());
detstruct._Quaternion[i] = new LSL_Types.Quaternion(detobj.rotQuat.X, detobj.rotQuat.Y, detobj.rotQuat.Z, detobj.rotQuat.W);
detstruct._string[i] = detobj.nameStr;
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++;
DetectParams d = new DetectParams();
d.Key =detobj.keyUUID;
d.Populate(myScriptEngine.World);
det.Add(d);
}
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)
{
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)
{
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
public void timer(uint localID, UUID itemID)
{
//myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, String.Empty);
}
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)
{
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)
{
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)
{
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)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_rot_target", EventQueueManager.llDetectNull);
}
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);
myScriptEngine.PostObjectEvent(localID, new EventParams(
"not_at_rot_target",new object[0],
new DetectParams[0]));
}
public void attach(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "attach", EventQueueManager.llDetectNull);
}
public void dataserver(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "dataserver", EventQueueManager.llDetectNull);
}
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)
{
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)
{
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)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "object_rez", EventQueueManager.llDetectNull);
}
public void remote_data(uint localID, UUID itemID)
{
myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "remote_data", EventQueueManager.llDetectNull);
}
// Handled by long commands
public void http_response(uint localID, UUID itemID)
{
// myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "http_response", EventQueueManager.llDetectNull);
}
/// <summary>

View File

@ -137,32 +137,10 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public uint localID;
public UUID itemID;
public string functionName;
public Queue_llDetectParams_Struct llDetectParams;
public DetectParams[] llDetectParams;
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
#region " Initialization / Startup "
@ -322,7 +300,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// <param name="localID">Region object ID</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>
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
//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="FunctionName">Name of the function, will be state + "_event_" + FunctionName</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);

View File

@ -57,7 +57,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public EventQueueManager m_EventQueueManager; // Executes events, handles script threads
public ScriptManager m_ScriptManager; // Load, unload and execute scripts
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 IConfigSource ConfigSource;
@ -121,7 +120,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
// We need to start it
m_ScriptManager = newScriptManager;
m_AppDomainManager = new AppDomainManager(this);
m_ASYNCLSLCommandManager = new AsyncCommandManager(this);
if (m_MaintenanceThread == null)
m_MaintenanceThread = new MaintenanceThread();
@ -172,7 +170,6 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
if (m_EventManager != null) m_EventManager.ReadConfig();
if (m_ScriptManager != null) m_ScriptManager.ReadConfig();
if (m_AppDomainManager != null) m_AppDomainManager.ReadConfig();
if (m_ASYNCLSLCommandManager != null) m_ASYNCLSLCommandManager.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)
{
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)
{
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
}
}

View File

@ -33,6 +33,7 @@ using System.Runtime.Serialization.Formatters.Binary;
using System.Threading;
using OpenMetaverse;
using OpenSim.Region.Environment.Scenes;
using OpenSim.Region.ScriptEngine.Shared;
namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
{
@ -65,6 +66,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
private int LoadUnloadMaxQueueSize;
private Object scriptLock = new Object();
private bool m_started = false;
private Dictionary<IScript, DetectParams[]> detparms = new Dictionary<IScript, DetectParams[]>();
// Load/Unload structure
private struct LUStruct
@ -228,6 +230,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
if (item.Action == LUType.Unload)
{
_StopScript(item.localID, item.itemID);
RemoveScript(item.localID, item.itemID);
}
else if (item.Action == LUType.Load)
{
@ -318,7 +321,7 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// <param name="itemID">Script ID</param>
/// <param name="FunctionName">Name of 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
///#if DEBUG
@ -337,8 +340,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
/// Console.WriteLine("ScriptEngine: Executing event: " + FunctionName);
///#endif
// 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);
detparms.Remove(Script);
}
public uint GetLocalID(UUID itemID)
@ -430,6 +434,9 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
public void RemoveScript(uint localID, UUID itemID)
{
if (localID == 0)
localID = GetLocalID(itemID);
// Don't have that object?
if (Scripts.ContainsKey(localID) == false)
return;
@ -486,5 +493,13 @@ namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase
// set { _PleaseShutdown = value; }
//}
//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.Region.Environment.Scenes;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
using OpenSim.Region.ScriptEngine.Shared;
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 OnRemoveScript(uint localID, UUID itemID);
void state_exit(uint localID);
void touch(uint localID, uint originalID, UUID itemID);
void touch_end(uint localID, uint originalID, UUID itemID);
void touch(uint localID, uint originalID, Vector3 offsetPos,
IClientAPI remoteClient);
void touch_end(uint localID, uint originalID, IClientAPI remoteClient);
void collision_start(uint localID, ColliderArgs col);
void collision(uint localID, ColliderArgs col);
void collision_end(uint localID, ColliderArgs col);
void land_collision_start(uint localID, UUID itemID);
void land_collision(uint localID, ColliderArgs col);
void land_collision_end(uint localID, UUID itemID);
// void land_collision_start(uint localID, UUID itemID);
// void land_collision(uint localID, ColliderArgs col);
// void land_collision_end(uint localID, UUID itemID);
void timer(uint localID, UUID itemID);
void listen(uint localID, UUID itemID);
void on_rez(uint localID, UUID itemID);
void sensor(uint localID, UUID itemID);
void no_sensor(uint localID, UUID itemID);
// void on_rez(uint localID, UUID itemID);
// void 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 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 not_at_target(uint localID);
void 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 changed(uint localID, UUID itemID);
// void run_time_permissions(uint localID, UUID itemID);
// void changed(uint localID, UUID itemID);
void attach(uint localID, UUID itemID);
void dataserver(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.ScriptEngine.Common;
using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Shared.Api;
using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
namespace OpenSim.Region.ScriptEngine.DotNetEngine
@ -139,10 +140,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
// Fire the first start-event
int eventFlags = m_scriptEngine.m_ScriptManager.GetStateEventFlags(localID, itemID);
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)
{
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
@ -174,7 +175,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
//#endif
// Stop long command on script
m_scriptEngine.m_ASYNCLSLCommandManager.RemoveScript(localID, itemID);
AsyncCommandManager.RemoveScript(m_scriptEngine, localID, itemID);
IScript LSLBC = GetScript(localID, itemID);
if (LSLBC == null)

View File

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

View File

@ -58,7 +58,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
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
//
@ -77,7 +77,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
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,
new EventParams("http_response",

View File

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

View File

@ -156,28 +156,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
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)
{
SceneObjectPart SensePoint = ts.host;

View File

@ -108,7 +108,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
// Time has passed?
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
m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID,
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())
};
foreach (IScriptEngine e in m_CmdManager.ScriptEngines)
foreach (IEventReceiver e in m_CmdManager.ScriptEngines)
{
if (e.PostScriptEvent(
rInfo.GetItemID(), new EventParams(
@ -100,7 +100,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
new LSL_Types.LSLString(srdInfo.sdata)
};
foreach (IScriptEngine e in m_CmdManager.ScriptEngines)
foreach (IEventReceiver e in m_CmdManager.ScriptEngines)
{
if (e.PostScriptEvent(
srdInfo.m_itemID, new EventParams(

View File

@ -246,7 +246,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
ScriptSerializer.Deserialize(xml, this);
AsyncCommandManager.CreateFromData(m_Engine.World,
AsyncCommandManager.CreateFromData(m_Engine,
m_LocalID, m_ItemID, m_ObjectID,
PluginData);
@ -336,7 +336,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void DestroyScriptInstance()
{
ReleaseControls();
AsyncCommandManager.RemoveScript(m_Engine.World, m_LocalID, m_ItemID);
AsyncCommandManager.RemoveScript(m_Engine, m_LocalID, m_ItemID);
}
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_PrimName, m_ScriptName, data.Params[0].ToString());
m_State=data.Params[0].ToString();
AsyncCommandManager.RemoveScript(m_Engine.World,
AsyncCommandManager.RemoveScript(m_Engine,
m_LocalID, m_ItemID);
SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
@ -690,7 +690,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
part.GetInventoryItem(m_ItemID).PermsMask = 0;
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_Script.ResetVars();
m_State = "default";
@ -715,7 +715,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
part.GetInventoryItem(m_ItemID).PermsMask = 0;
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_Script.ResetVars();
@ -772,7 +772,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
return;
}
PluginData = AsyncCommandManager.GetSerializationData(m_Engine.World, m_ItemID);
PluginData = AsyncCommandManager.GetSerializationData(m_Engine, m_ItemID);
string xml = ScriptSerializer.Serialize(this);

View File

@ -50,7 +50,7 @@ using OpenSim.Region.ScriptEngine.Interfaces;
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);
@ -75,7 +75,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
#pragma warning restore 414
private int m_EventLimit;
private bool m_KillTimedOutScripts;
bool m_firstStart = true;
// bool m_firstStart = true;
private static List<XEngine> m_ScriptEngines =
new List<XEngine>();
@ -205,8 +205,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_ScriptEngines.Add(this);
}
scene.RegisterModuleInterface<IScriptModule>(this);
// Needs to be here so we can queue the scripts that need starting
//
m_Scene.EventManager.OnRezScript += OnRezScript;
@ -230,6 +228,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
m_Scene.EventManager.OnScriptReset += OnScriptReset;
m_Scene.EventManager.OnStartScript += OnStartScript;
m_Scene.EventManager.OnStopScript += OnStopScript;
m_Scene.EventManager.OnGetScriptRunning += OnGetScriptRunning;
m_Scene.EventManager.OnShutdown += OnShutdown;
if (m_SleepTime > 0)
@ -357,14 +356,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (m_CurrentCompile == null)
{
if (m_firstStart)
{
m_firstStart = false;
m_CurrentCompile = m_ThreadPool.QueueWorkItem(
new WorkItemCallback(this.DoScriptWait),
new Object[0]);
return;
}
// if (m_firstStart)
// {
// m_firstStart = false;
// m_CurrentCompile = m_ThreadPool.QueueWorkItem(
// new WorkItemCallback(this.DoScriptWait),
// new Object[0]);
// return;
// }
m_CurrentCompile = m_ThreadPool.QueueWorkItem(
new WorkItemCallback(this.DoOnRezScriptQueue),
@ -375,7 +374,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
public Object DoScriptWait(Object dummy)
{
Thread.Sleep(30000);
Thread.Sleep(10000);
lock (m_CompileQueue)
{
@ -884,11 +883,6 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return instance.StartParam;
}
public bool GetScriptRunning(UUID objectID, UUID itemID)
{
return GetScriptState(itemID);
}
public void OnShutdown()
{
List<IScriptInstance> instances = new List<IScriptInstance>();
@ -922,5 +916,14 @@ namespace OpenSim.Region.ScriptEngine.XEngine
return null;
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.Framework.Console"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api"/>
<Reference name="Nini.dll" />
<Reference name="RAIL.dll"/>
<Reference name="OpenSim.Framework.Console"/>
@ -1990,6 +1991,7 @@
<Reference name="OpenSim.Region.Environment" />
<Reference name="OpenSim.Region.ScriptEngine.Common"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared"/>
<Reference name="OpenSim.Region.ScriptEngine.Shared.Api"/>
<Reference name="Microsoft.JScript"/>
<Reference name="Nini.dll" />
<Reference name="log4net.dll"/>