aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs8
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs60
2 files changed, 65 insertions, 3 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 20b52b7..2b19ae1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2553,6 +2553,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2553 2553
2554 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 2554 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
2555 { 2555 {
2556 llReleaseControls();
2557
2556 m_host.TaskInventory[invItemID].PermsGranter=UUID.Zero; 2558 m_host.TaskInventory[invItemID].PermsGranter=UUID.Zero;
2557 m_host.TaskInventory[invItemID].PermsMask=0; 2559 m_host.TaskInventory[invItemID].PermsMask=0;
2558 2560
@@ -2564,6 +2566,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2564 return; 2566 return;
2565 } 2567 }
2566 2568
2569 if ( m_host.TaskInventory[invItemID].PermsGranter != agentID || (perm & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
2570 llReleaseControls();
2571
2567 m_host.AddScriptLPS(1); 2572 m_host.AddScriptLPS(1);
2568 2573
2569 if (m_host.ParentGroup.RootPart.IsAttachment && agent == m_host.ParentGroup.RootPart.AttachedAvatar) 2574 if (m_host.ParentGroup.RootPart.IsAttachment && agent == m_host.ParentGroup.RootPart.AttachedAvatar)
@@ -2648,6 +2653,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2648 client.OnScriptAnswer-=handleScriptAnswer; 2653 client.OnScriptAnswer-=handleScriptAnswer;
2649 m_waitingForScriptAnswer=false; 2654 m_waitingForScriptAnswer=false;
2650 2655
2656 if((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
2657 llReleaseControls();
2658
2651 m_host.TaskInventory[invItemID].PermsMask=answer; 2659 m_host.TaskInventory[invItemID].PermsMask=answer;
2652 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 2660 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
2653 "run_time_permissions", new Object[] { 2661 "run_time_permissions", new Object[] {
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index da55858..dd1bfaa 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -77,6 +77,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
77 private int m_MaxScriptQueue; 77 private int m_MaxScriptQueue;
78 private bool m_SaveState = true; 78 private bool m_SaveState = true;
79 private bool m_ShuttingDown = false; 79 private bool m_ShuttingDown = false;
80 private int m_ControlEventsInQueue = 0;
81 private int m_LastControlLevel = 0;
80 82
81 private Dictionary<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>(); 83 private Dictionary<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>();
82 84
@@ -320,6 +322,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
320 } 322 }
321 } 323 }
322 324
325 private void ReleaseControls()
326 {
327 SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
328 if (part != null && part.TaskInventory.ContainsKey(m_ItemID))
329 {
330 UUID permsGranter = part.TaskInventory[m_ItemID].PermsGranter;
331 int permsMask = part.TaskInventory[m_ItemID].PermsMask;
332
333 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
334 {
335
336 ScenePresence presence = m_Engine.World.GetScenePresence(permsGranter);
337 if (presence != null)
338 presence.UnRegisterControlEventsToScript(m_LocalID, m_ItemID);
339 }
340 }
341 }
342
343 public void DestroyScriptInstance()
344 {
345 ReleaseControls();
346 }
347
323 public void RemoveState() 348 public void RemoveState()
324 { 349 {
325 string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly), 350 string savedState = Path.Combine(Path.GetDirectoryName(m_Assembly),
@@ -439,7 +464,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
439 if (m_EventQueue.Count >= m_MaxScriptQueue) 464 if (m_EventQueue.Count >= m_MaxScriptQueue)
440 return; 465 return;
441 466
442 m_EventQueue.Enqueue(data);
443 if (data.EventName == "timer") 467 if (data.EventName == "timer")
444 { 468 {
445 if (m_TimerQueued) 469 if (m_TimerQueued)
@@ -447,8 +471,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
447 m_TimerQueued = true; 471 m_TimerQueued = true;
448 } 472 }
449 473
450 if (!m_RunEvents) 474 if (data.EventName == "control")
451 return; 475 {
476 int held = ((LSL_Types.LSLInteger)data.Params[1]).value;
477 int changed= ((LSL_Types.LSLInteger)data.Params[2]).value;
478
479 // If the last message was a 0 (nothing held)
480 // and this one is also nothing held, drop it
481 //
482 if (m_LastControlLevel == held && held == 0)
483 return;
484
485 // If there is one or more queued, then queue
486 // only changed ones, else queue unconditionally
487 //
488 if (m_ControlEventsInQueue > 0)
489 {
490 if (m_LastControlLevel == held)
491 return;
492 }
493
494 m_LastControlLevel = held;
495 m_ControlEventsInQueue++;
496 }
497
498 m_EventQueue.Enqueue(data);
452 499
453 if (m_CurrentResult == null) 500 if (m_CurrentResult == null)
454 { 501 {
@@ -475,6 +522,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
475 } 522 }
476 if (data.EventName == "timer") 523 if (data.EventName == "timer")
477 m_TimerQueued = false; 524 m_TimerQueued = false;
525 if (data.EventName == "control")
526 {
527 if (m_ControlEventsInQueue > 0)
528 m_ControlEventsInQueue--;
529 }
478 } 530 }
479 531
480 //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this); 532 //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this);
@@ -616,6 +668,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
616 bool running = Running; 668 bool running = Running;
617 669
618 RemoveState(); 670 RemoveState();
671 ReleaseControls();
619 672
620 Stop(0); 673 Stop(0);
621 SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID); 674 SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);
@@ -641,6 +694,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
641 // bool running = Running; 694 // bool running = Running;
642 695
643 RemoveState(); 696 RemoveState();
697 ReleaseControls();
644 698
645 m_Script.ResetVars(); 699 m_Script.ResetVars();
646 SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID); 700 SceneObjectPart part=m_Engine.World.GetSceneObjectPart(m_LocalID);