From: Michael Osias <mosias@us.ibm.com>
This patch implements llMessageLinked. I had to make a change to llGetLinkNumber to return m_host.LinkNum + 1 for link sets of more than 1 prim, or 0 for a single object, since according to: http://rpgstats.com/wiki/index.php?title=LlMessageLinked linksets with 2 or more prims start the link numbering at 1, but a single prims link number is 0.0.6.0-stable
parent
0609970f2e
commit
2eda6a1296
|
@ -42,6 +42,5 @@ namespace OpenSim.Region.Environment.Interfaces
|
||||||
void DeleteListener(LLUUID itemID);
|
void DeleteListener(LLUUID itemID);
|
||||||
uint PeekNextMessageLocalID();
|
uint PeekNextMessageLocalID();
|
||||||
LLUUID PeekNextMessageItemID();
|
LLUUID PeekNextMessageItemID();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,6 +75,7 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
private ListenerManager m_listenerManager;
|
private ListenerManager m_listenerManager;
|
||||||
private Queue m_pendingQ;
|
private Queue m_pendingQ;
|
||||||
private Queue m_pending;
|
private Queue m_pending;
|
||||||
|
|
||||||
public WorldCommModule()
|
public WorldCommModule()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -112,6 +113,11 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
client.OnChatFromViewer += DeliverClientMessage;
|
client.OnChatFromViewer += DeliverClientMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
*
|
||||||
|
* Listener Stuff
|
||||||
|
*
|
||||||
|
* *****************************************************************/
|
||||||
private void DeliverClientMessage(Object sender, ChatFromViewerArgs e)
|
private void DeliverClientMessage(Object sender, ChatFromViewerArgs e)
|
||||||
{
|
{
|
||||||
DeliverMessage(e.Sender.AgentId.ToString(),
|
DeliverMessage(e.Sender.AgentId.ToString(),
|
||||||
|
@ -179,7 +185,7 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
|
|
||||||
m_scene.Entities.TryGetValue(li.GetHostID(), out sPart);
|
m_scene.Entities.TryGetValue(li.GetHostID(), out sPart);
|
||||||
|
|
||||||
if(sPart != null)
|
if (sPart != null)
|
||||||
{
|
{
|
||||||
// Dont process if this message is from itself!
|
// Dont process if this message is from itself!
|
||||||
if (li.GetHostID().ToString().Equals(sourceItemID) ||
|
if (li.GetHostID().ToString().Equals(sourceItemID) ||
|
||||||
|
@ -291,7 +297,7 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
|
|
||||||
lock (m_pending.SyncRoot)
|
lock (m_pending.SyncRoot)
|
||||||
{
|
{
|
||||||
li = (ListenerInfo) m_pending.Dequeue();
|
li = (ListenerInfo)m_pending.Dequeue();
|
||||||
}
|
}
|
||||||
|
|
||||||
return li;
|
return li;
|
||||||
|
@ -306,12 +312,13 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
{
|
{
|
||||||
return ((ListenerInfo)m_pending.Peek()).GetItemID();
|
return ((ListenerInfo)m_pending.Peek()).GetItemID();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// hostID: the ID of the ScenePart
|
/**********************************************************
|
||||||
// itemID: the ID of the script host engine
|
*
|
||||||
// localID: local ID of host engine
|
* Even more listener stuff
|
||||||
|
*
|
||||||
|
* ********************************************************/
|
||||||
public class ListenerManager
|
public class ListenerManager
|
||||||
{
|
{
|
||||||
//private Dictionary<int, ListenerInfo> m_listeners;
|
//private Dictionary<int, ListenerInfo> m_listeners;
|
||||||
|
@ -434,9 +441,9 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
{
|
{
|
||||||
ListenerInfo li = (ListenerInfo)en.Value;
|
ListenerInfo li = (ListenerInfo)en.Value;
|
||||||
|
|
||||||
if (li.GetHostID().Equals(listenerKey))
|
if (li.IsActive())
|
||||||
{
|
{
|
||||||
if (li.IsActive())
|
if (li.GetHostID().Equals(listenerKey))
|
||||||
{
|
{
|
||||||
if (channel == li.GetChannel())
|
if (channel == li.GetChannel())
|
||||||
{
|
{
|
||||||
|
@ -575,4 +582,5 @@ namespace OpenSim.Region.Environment.Modules
|
||||||
return m_id;
|
return m_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,7 +57,7 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
private uint m_localID;
|
private uint m_localID;
|
||||||
private LLUUID m_itemID;
|
private LLUUID m_itemID;
|
||||||
private bool throwErrorOnNotImplemented = true;
|
private bool throwErrorOnNotImplemented = true;
|
||||||
|
|
||||||
public LSL_BuiltIn_Commands(ScriptEngineBase.ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID)
|
public LSL_BuiltIn_Commands(ScriptEngineBase.ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID)
|
||||||
{
|
{
|
||||||
m_ScriptEngine = ScriptEngine;
|
m_ScriptEngine = ScriptEngine;
|
||||||
|
@ -1633,7 +1633,15 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
public int llGetLinkNumber()
|
public int llGetLinkNumber()
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
return m_host.LinkNum;
|
|
||||||
|
if (m_host.ParentGroup.Children.Count > 0)
|
||||||
|
{
|
||||||
|
return m_host.LinkNum + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face)
|
public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face)
|
||||||
|
@ -1945,9 +1953,174 @@ namespace OpenSim.Region.ScriptEngine.Common
|
||||||
m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID);
|
m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llMessageLinked(int linknum, int num, string str, string id)
|
public void llMessageLinked(int linknum, int num, string msg, string id)
|
||||||
{
|
{
|
||||||
|
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
|
|
||||||
|
uint partLocalID;
|
||||||
|
LLUUID partItemID;
|
||||||
|
|
||||||
|
switch ((int)linknum)
|
||||||
|
{
|
||||||
|
|
||||||
|
case (int)BuiltIn_Commands_BaseClass.LINK_ROOT:
|
||||||
|
|
||||||
|
SceneObjectPart part = m_host.ParentGroup.RootPart;
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in part.TaskInventory.Values)
|
||||||
|
{
|
||||||
|
if (item.Type == 10)
|
||||||
|
{
|
||||||
|
partLocalID = part.LocalId;
|
||||||
|
partItemID = item.ItemID;
|
||||||
|
|
||||||
|
object[] resobj = new object[]
|
||||||
|
{
|
||||||
|
m_host.LinkNum, num, msg, id
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
|
||||||
|
partLocalID, partItemID, "link_message", EventQueueManager.llDetectNull, resobj
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (int)BuiltIn_Commands_BaseClass.LINK_SET:
|
||||||
|
|
||||||
|
Console.WriteLine("LINK_SET");
|
||||||
|
|
||||||
|
foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts())
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in partInst.TaskInventory.Values)
|
||||||
|
{
|
||||||
|
if (item.Type == 10)
|
||||||
|
{
|
||||||
|
partLocalID = partInst.LocalId;
|
||||||
|
partItemID = item.ItemID;
|
||||||
|
Object[] resobj = new object[]
|
||||||
|
{
|
||||||
|
m_host.LinkNum, num, msg, id
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
|
||||||
|
partLocalID, partItemID, "link_message", EventQueueManager.llDetectNull, resobj
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (int)BuiltIn_Commands_BaseClass.LINK_ALL_OTHERS:
|
||||||
|
|
||||||
|
foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts())
|
||||||
|
{
|
||||||
|
|
||||||
|
if (partInst.LocalId != m_host.LocalId)
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in partInst.TaskInventory.Values)
|
||||||
|
{
|
||||||
|
if (item.Type == 10)
|
||||||
|
{
|
||||||
|
partLocalID = partInst.LocalId;
|
||||||
|
partItemID = item.ItemID;
|
||||||
|
Object[] resobj = new object[]
|
||||||
|
{
|
||||||
|
m_host.LinkNum, num, msg, id
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
|
||||||
|
partLocalID, partItemID, "link_message", EventQueueManager.llDetectNull, resobj
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (int)BuiltIn_Commands_BaseClass.LINK_ALL_CHILDREN:
|
||||||
|
|
||||||
|
foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts())
|
||||||
|
{
|
||||||
|
|
||||||
|
if (partInst.LocalId != m_host.ParentGroup.RootPart.LocalId)
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in partInst.TaskInventory.Values)
|
||||||
|
{
|
||||||
|
if (item.Type == 10)
|
||||||
|
{
|
||||||
|
partLocalID = partInst.LocalId;
|
||||||
|
partItemID = item.ItemID;
|
||||||
|
Object[] resobj = new object[]
|
||||||
|
{
|
||||||
|
m_host.LinkNum, num, msg, id
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
|
||||||
|
partLocalID, partItemID, "link_message", EventQueueManager.llDetectNull, resobj
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case (int)BuiltIn_Commands_BaseClass.LINK_THIS:
|
||||||
|
|
||||||
|
Object[] respObjThis = new object[]
|
||||||
|
{
|
||||||
|
m_host.LinkNum, num, msg, id
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
|
||||||
|
m_localID, m_itemID, "link_message", EventQueueManager.llDetectNull, respObjThis
|
||||||
|
);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts())
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((partInst.LinkNum + 1) == linknum)
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach (TaskInventoryItem item in partInst.TaskInventory.Values)
|
||||||
|
{
|
||||||
|
if (item.Type == 10)
|
||||||
|
{
|
||||||
|
partLocalID = partInst.LocalId;
|
||||||
|
partItemID = item.ItemID;
|
||||||
|
Object[] resObjDef = new object[]
|
||||||
|
{
|
||||||
|
m_host.LinkNum, num, msg, id
|
||||||
|
};
|
||||||
|
|
||||||
|
m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(
|
||||||
|
partLocalID, partItemID, "link_message", EventQueueManager.llDetectNull, resObjDef
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local)
|
public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local)
|
||||||
|
|
Loading…
Reference in New Issue