diff options
author | Alan Webb | 2009-08-03 21:43:08 -0400 |
---|---|---|
committer | dr scofield (aka dirk husemann) | 2009-08-04 11:41:06 +0200 |
commit | 9ffe4d850e9ccf2fc40901e186af3d38c31b9a6d (patch) | |
tree | 8f63928743d5383254bb934f58f3369c0492007e | |
parent | starting to refactor path generation out of prim extrusion (diff) | |
download | opensim-SC-9ffe4d850e9ccf2fc40901e186af3d38c31b9a6d.zip opensim-SC-9ffe4d850e9ccf2fc40901e186af3d38c31b9a6d.tar.gz opensim-SC-9ffe4d850e9ccf2fc40901e186af3d38c31b9a6d.tar.bz2 opensim-SC-9ffe4d850e9ccf2fc40901e186af3d38c31b9a6d.tar.xz |
This change adds support for the attach event in scripts.
[1] Added a new OnAttach event to Scene/EventManager
[2] Hooked up existing attach event handler in XEngine.
[3] Modified SceneGraph and Scene.Inventory to trigger
attach events at the appropriate places. I was forced
to distribut the changes across two files because of
the way attach processing is distributed across the
two files.
[4] In the case of RezSingleAttachmentFromInventory it is
necessary to handle event scheduling in a special way.
There is no synchronous path available, so the fact
that this object is attached, and who it is attached to,
is cached when the ScriptInstance is created. When
the script is started, the attached handler is driven
after on_rez (but before changed, this should be reviewed).
Signed-off-by: dr scofield (aka dirk husemann) <drscofield@xyzzyxyzzy.net>
5 files changed, 41 insertions, 0 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 4b3e45f..086496e 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -298,6 +298,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
298 | public delegate void EmptyScriptCompileQueue(int numScriptsFailed, string message); | 298 | public delegate void EmptyScriptCompileQueue(int numScriptsFailed, string message); |
299 | public event EmptyScriptCompileQueue OnEmptyScriptCompileQueue; | 299 | public event EmptyScriptCompileQueue OnEmptyScriptCompileQueue; |
300 | 300 | ||
301 | /// <summary> | ||
302 | /// Called whenever an object is attached, or detached | ||
303 | /// from an in-world presence. | ||
304 | /// </summary> | ||
305 | public delegate void Attach(uint localID, UUID itemID, UUID avatarID); | ||
306 | public event Attach OnAttach; | ||
307 | |||
301 | public class MoneyTransferArgs : EventArgs | 308 | public class MoneyTransferArgs : EventArgs |
302 | { | 309 | { |
303 | public UUID sender; | 310 | public UUID sender; |
@@ -438,6 +445,15 @@ namespace OpenSim.Region.Framework.Scenes | |||
438 | 445 | ||
439 | private EmptyScriptCompileQueue handlerEmptyScriptCompileQueue = null; | 446 | private EmptyScriptCompileQueue handlerEmptyScriptCompileQueue = null; |
440 | 447 | ||
448 | private Attach handlerOnAttach = null; | ||
449 | |||
450 | public void TriggerOnAttach(uint localID, UUID itemID, UUID avatarID) | ||
451 | { | ||
452 | handlerOnAttach = OnAttach; | ||
453 | if (handlerOnAttach != null) | ||
454 | handlerOnAttach(localID, itemID, avatarID); | ||
455 | } | ||
456 | |||
441 | public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) | 457 | public void TriggerGetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) |
442 | { | 458 | { |
443 | handlerGetScriptRunning = OnGetScriptRunning; | 459 | handlerGetScriptRunning = OnGetScriptRunning; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 15009a3..facd301 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -2574,6 +2574,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2574 | EventManager.TriggerStopScript(part.LocalId, itemID); | 2574 | EventManager.TriggerStopScript(part.LocalId, itemID); |
2575 | } | 2575 | } |
2576 | 2576 | ||
2577 | internal void SendAttachEvent(uint localID, UUID itemID, UUID avatarID) | ||
2578 | { | ||
2579 | EventManager.TriggerOnAttach(localID, itemID, avatarID); | ||
2580 | } | ||
2581 | |||
2577 | public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID, | 2582 | public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID, |
2578 | uint AttachmentPt) | 2583 | uint AttachmentPt) |
2579 | { | 2584 | { |
@@ -2684,6 +2689,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2684 | remoteClient.SendRemoveInventoryItem(inventoryID); | 2689 | remoteClient.SendRemoveInventoryItem(inventoryID); |
2685 | } | 2690 | } |
2686 | } | 2691 | } |
2692 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); | ||
2687 | } | 2693 | } |
2688 | 2694 | ||
2689 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | 2695 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 3f63481..5752a88 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -489,6 +489,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
489 | // Calls attach with a Zero position | 489 | // Calls attach with a Zero position |
490 | // | 490 | // |
491 | AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false); | 491 | AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false); |
492 | m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromAssetID(), remoteClient.AgentId); | ||
492 | } | 493 | } |
493 | 494 | ||
494 | public SceneObjectGroup RezSingleAttachment( | 495 | public SceneObjectGroup RezSingleAttachment( |
@@ -537,6 +538,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
537 | group = (SceneObjectGroup)entity; | 538 | group = (SceneObjectGroup)entity; |
538 | if (group.GetFromAssetID() == itemID) | 539 | if (group.GetFromAssetID() == itemID) |
539 | { | 540 | { |
541 | m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero); | ||
540 | group.DetachToInventoryPrep(); | 542 | group.DetachToInventoryPrep(); |
541 | m_log.Debug("[DETACH]: Saving attachpoint: " + | 543 | m_log.Debug("[DETACH]: Saving attachpoint: " + |
542 | ((uint)group.GetAttachmentPoint()).ToString()); | 544 | ((uint)group.GetAttachmentPoint()).ToString()); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 42d61a7..586f926 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -89,6 +89,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
89 | private long m_eventDelayTicks = 0; | 89 | private long m_eventDelayTicks = 0; |
90 | private long m_nextEventTimeTicks = 0; | 90 | private long m_nextEventTimeTicks = 0; |
91 | private bool m_startOnInit = true; | 91 | private bool m_startOnInit = true; |
92 | private bool m_isAttachment = false; | ||
93 | private UUID m_attachedAvatar = UUID.Zero; | ||
92 | private StateSource m_stateSource; | 94 | private StateSource m_stateSource; |
93 | private bool m_postOnRez; | 95 | private bool m_postOnRez; |
94 | private bool m_startedFromSavedState = false; | 96 | private bool m_startedFromSavedState = false; |
@@ -232,6 +234,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
232 | m_MaxScriptQueue = maxScriptQueue; | 234 | m_MaxScriptQueue = maxScriptQueue; |
233 | m_stateSource = stateSource; | 235 | m_stateSource = stateSource; |
234 | m_postOnRez = postOnRez; | 236 | m_postOnRez = postOnRez; |
237 | m_isAttachment = part.IsAttachment; | ||
238 | m_attachedAvatar = part.AttachedAvatar; | ||
235 | m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; | 239 | m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; |
236 | 240 | ||
237 | if (part != null) | 241 | if (part != null) |
@@ -379,6 +383,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
379 | new Object[] {new LSL_Types.LSLInteger(m_StartParam)}, new DetectParams[0])); | 383 | new Object[] {new LSL_Types.LSLInteger(m_StartParam)}, new DetectParams[0])); |
380 | } | 384 | } |
381 | 385 | ||
386 | if (m_isAttachment) | ||
387 | { | ||
388 | PostEvent(new EventParams("attach", | ||
389 | new object[] { new LSL_Types.LSLString(m_attachedAvatar.ToString()) }, new DetectParams[0])); | ||
390 | } | ||
391 | |||
382 | if (m_stateSource == StateSource.NewRez) | 392 | if (m_stateSource == StateSource.NewRez) |
383 | { | 393 | { |
384 | // m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script"); | 394 | // m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script"); |
@@ -403,6 +413,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
403 | new Object[] {new LSL_Types.LSLInteger(m_StartParam)}, new DetectParams[0])); | 413 | new Object[] {new LSL_Types.LSLInteger(m_StartParam)}, new DetectParams[0])); |
404 | } | 414 | } |
405 | 415 | ||
416 | if (m_isAttachment) | ||
417 | { | ||
418 | PostEvent(new EventParams("attach", | ||
419 | new object[] { new LSL_Types.LSLString(m_attachedAvatar.ToString()) }, new DetectParams[0])); | ||
420 | } | ||
421 | |||
406 | } | 422 | } |
407 | } | 423 | } |
408 | 424 | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index 3b9ff2e..7142c8c 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs | |||
@@ -53,6 +53,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
53 | myScriptEngine = _ScriptEngine; | 53 | myScriptEngine = _ScriptEngine; |
54 | 54 | ||
55 | m_log.Info("[XEngine] Hooking up to server events"); | 55 | m_log.Info("[XEngine] Hooking up to server events"); |
56 | myScriptEngine.World.EventManager.OnAttach += attach; | ||
56 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | 57 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; |
57 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; | 58 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; |
58 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; | 59 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; |