add LinksetData support. Untested and still does not store in dbs. Not as spec. See mantis 9081 (runprebuild)

This commit is contained in:
UbitUmarov
2024-02-06 23:45:11 +00:00
parent 00e9e3c77a
commit 2e26b8a8bb
12 changed files with 621 additions and 95 deletions

View File

@@ -361,7 +361,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{
Name = "XMRInstanceSuperAssembly"
};
AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
//AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
AssemblyBuilder assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndCollect);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("XMRInstanceSuperModule");
TypeBuilder typeBuilder = moduleBuilder.DefineType("XMRInstanceSuperType", TypeAttributes.Public | TypeAttributes.Class);
typeBuilder.SetParent(typeof(XMRInstance));
@@ -904,8 +905,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
TraceCalls("[YEngine]: YEngine.PostScriptEvent({0},{1})", itemID.ToString(), parms.EventName);
instance.PostEvent(parms);
return true;
return instance.PostEvent(parms);
}
public void CancelScriptEvent(UUID itemID, string eventName)
@@ -952,6 +952,32 @@ namespace OpenSim.Region.ScriptEngine.Yengine
return PostPrimEvent(part, parms);
}
public bool PostObjectLinksetDataEvent(uint localID, int action, ReadOnlySpan<char> name, ReadOnlySpan<char> value)
{
if (m_Exiting)
return false;
if (m_HeapSize < name.Length + value.Length)
return false;
SceneObjectPart part = m_Scene.GetSceneObjectPart(localID);
if (part is null || part.ParentGroup is null)
return false;
EventParams parms = new("linkset_data", new object[] {
new LSL_Integer(action),
new LSL_String(name.ToString()),
value.Length == 0 ? LSL_String.Empty : new LSL_String(value.ToString())
},
Array.Empty<DetectParams>());;
bool posted = false;
foreach (SceneObjectPart primpart in part.ParentGroup.Parts)
posted |= PostPrimEvent(primpart, parms);
return posted;
}
private bool PostPrimEvent(SceneObjectPart part, EventParams parms)
{
UUID partUUID = part.UUID;
@@ -974,10 +1000,11 @@ namespace OpenSim.Region.ScriptEngine.Yengine
if(objInstArray.Length <= 0)
return false;
bool posted = false;
foreach (XMRInstance inst in objInstArray)
inst.PostEvent(parms);
posted |= inst.PostEvent(parms);
return true;
return posted;
}
public DetectParams GetDetectParams(UUID itemID, int number)

View File

@@ -26,16 +26,11 @@
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Scenes;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.ScriptEngine.Shared;
using OpenSim.Region.ScriptEngine.Interfaces;
using log4net;
//using log4net;
using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;

View File

@@ -52,13 +52,13 @@ namespace OpenSim.Region.ScriptEngine.Yengine
* @brief This can be called in any thread (including the script thread itself)
* to queue event to script for processing.
*/
public void PostEvent(EventParams evt)
public bool PostEvent(EventParams evt)
{
if (!m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode evc))
return;
return false;
if (!m_HaveEventHandlers[(int)evc]) // don't bother if we don't have such a handler in any state
return;
return false;
// Put event on end of event queue.
bool startIt = false;
@@ -80,7 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
m_EventQueue.AddFirst(llns);
}
}
return;
return true;
}
}
@@ -101,7 +101,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
{
double now = Util.GetTimeStamp();
if (now < m_nextEventTime)
return;
return false;
m_nextEventTime = now + m_minEventDelay;
break;
}
@@ -110,12 +110,12 @@ namespace OpenSim.Region.ScriptEngine.Yengine
const int canignore = ~(CHANGED_SCALE | CHANGED_POSITION);
int change = (int)evt.Params[0];
if(change == 0) // what?
return;
return false;
if((change & canignore) == 0)
{
double now = Util.GetTimeStamp();
if (now < m_nextEventTime)
return;
return false;
m_nextEventTime = now + m_minEventDelay;
}
break;
@@ -128,14 +128,14 @@ namespace OpenSim.Region.ScriptEngine.Yengine
if(evc == ScriptEventCode.timer)
{
if (m_EventCounts[(int)evc] >= 1)
return;
return false;
m_EventCounts[(int)evc]++;
m_EventQueue.AddLast(new LinkedListNode<EventParams>(evt));
}
else
{
if (m_EventCounts[(int)evc] >= MAXEVENTQUEUE)
return;
return false;
m_EventCounts[(int)evc]++;
@@ -221,6 +221,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine
m_SleepUntil = DateTime.MinValue;
m_Engine.WakeFromSleep(this);
}
return true;
}
public void CancelEvent(string eventName)