a few changes to script engines releasecontrols

This commit is contained in:
UbitUmarov
2020-02-20 08:20:15 +00:00
parent 8d8b5b756f
commit d7671f3c01
2 changed files with 37 additions and 34 deletions

View File

@@ -459,23 +459,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
}
private void ReleaseControls()
private void ReleaseControlsorPermissions(bool fullpermissions)
{
SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
if (part != null)
if (part != null && part.TaskInventory != null)
{
int permsMask;
UUID permsGranter;
part.TaskInventory.LockItemsForRead(true);
if (!part.TaskInventory.ContainsKey(ItemID))
part.TaskInventory.LockItemsForWrite(true);
if (!part.TaskInventory.TryGetValue(ItemID, out TaskInventoryItem item))
{
part.TaskInventory.LockItemsForRead(false);
part.TaskInventory.LockItemsForWrite(false);
return;
}
permsGranter = part.TaskInventory[ItemID].PermsGranter;
permsMask = part.TaskInventory[ItemID].PermsMask;
part.TaskInventory.LockItemsForRead(false);
permsGranter = item.PermsGranter;
permsMask = item.PermsMask;
if(fullpermissions)
{
item.PermsGranter = UUID.Zero;
item.PermsMask = 0;
}
else
item.PermsMask = permsMask & ~(ScriptBaseClass.PERMISSION_TAKE_CONTROLS | ScriptBaseClass.PERMISSION_CONTROL_CAMERA);
part.TaskInventory.LockItemsForWrite(false);
if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
{
@@ -488,7 +495,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
public void DestroyScriptInstance()
{
ReleaseControls();
ReleaseControlsorPermissions(false);
AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
if (part != null)
@@ -1062,12 +1069,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
bool running = Running;
RemoveState();
ReleaseControls();
ReleaseControlsorPermissions(true);
Stop(timeout);
SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
part.CollisionSound = UUID.Zero;
AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
@@ -1097,12 +1102,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
// bool running = Running;
RemoveState();
ReleaseControls();
ReleaseControlsorPermissions(true);
m_Script.ResetVars();
SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
part.CollisionSound = UUID.Zero;
AsyncCommandManager.RemoveScript(Engine, LocalID, ItemID);
@@ -1114,8 +1117,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
StartParam = 0;
State = "default";
part.SetScriptEvents(ItemID,
(int)m_Script.GetStateEventFlags(State));
part.SetScriptEvents(ItemID, m_Script.GetStateEventFlags(State));
if (m_CurrentEvent != "state_entry" || oldState != "default")
{