LSL add a translation layer btw lsl permitions and internal permissions
parent
d1df9c9ee5
commit
7ef657c415
|
@ -115,6 +115,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
protected float m_ScriptDistanceFactor = 1.0f;
|
||||
protected float m_MinTimerInterval = 0.5f;
|
||||
protected float m_recoilScaleFactor = 0.0f;
|
||||
protected bool m_AllowGodFunctions;
|
||||
|
||||
protected double m_timer = Util.GetTimeStampMS();
|
||||
protected bool m_waitingForScriptAnswer = false;
|
||||
|
@ -340,7 +341,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
// Rezzing an object with a velocity can create recoil. This feature seems to have been
|
||||
// removed from recent versions of SL. The code computes recoil (vel*mass) and scales
|
||||
// it by this factor. May be zero to turn off recoil all together.
|
||||
m_recoilScaleFactor = m_ScriptEngine.Config.GetFloat("RecoilScaleFactor", m_recoilScaleFactor);
|
||||
m_recoilScaleFactor = seConfig.GetFloat("RecoilScaleFactor", m_recoilScaleFactor);
|
||||
m_AllowGodFunctions = seConfig.GetBoolean("AllowGodFunctions", false);
|
||||
}
|
||||
|
||||
if (m_notecardLineReadCharsMax > 65535)
|
||||
|
@ -4841,8 +4843,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
byte[] bucket = new byte[1];
|
||||
bucket[0] = (byte)item.Type;
|
||||
//byte[] objBytes = agentItem.ID.GetBytes();
|
||||
//Array.Copy(objBytes, 0, bucket, 1, 16);
|
||||
|
||||
GridInstantMessage msg = new GridInstantMessage(World,
|
||||
m_host.OwnerID, m_host.Name, destId,
|
||||
|
@ -11161,8 +11161,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
ScenePresence presence = World.GetScenePresence(objID);
|
||||
if (presence != null)
|
||||
{
|
||||
// As per LSL Wiki, there is no difference between sitting
|
||||
// and standing avatar since server 1.36
|
||||
LSL_Vector lower;
|
||||
LSL_Vector upper;
|
||||
|
||||
|
@ -12667,74 +12665,132 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
return new LSL_List(outlist);
|
||||
}
|
||||
|
||||
private const uint fullperms = (uint)PermissionMask.All; // no export for now
|
||||
|
||||
private int PermissionMaskToLSLPerm(uint value)
|
||||
{
|
||||
value &= fullperms;
|
||||
if (value == fullperms)
|
||||
return ScriptBaseClass.PERM_ALL;
|
||||
if( value == 0)
|
||||
return 0;
|
||||
|
||||
int ret = 0;
|
||||
|
||||
if ((value & (uint)PermissionMask.Copy) != 0)
|
||||
ret |= ScriptBaseClass.PERM_COPY;
|
||||
|
||||
if ((value & (uint)PermissionMask.Modify) != 0)
|
||||
ret |= ScriptBaseClass.PERM_MODIFY;
|
||||
|
||||
if ((value & (uint)PermissionMask.Move) != 0)
|
||||
ret |= ScriptBaseClass.PERM_MOVE;
|
||||
|
||||
if ((value & (uint)PermissionMask.Transfer) != 0)
|
||||
ret |= ScriptBaseClass.PERM_TRANSFER;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
private uint LSLPermToPermissionMask(int lslperm, uint oldvalue)
|
||||
{
|
||||
lslperm &= ScriptBaseClass.PERM_ALL;
|
||||
if (lslperm == ScriptBaseClass.PERM_ALL)
|
||||
return oldvalue |= fullperms;
|
||||
|
||||
oldvalue &= ~fullperms;
|
||||
if(lslperm != 0)
|
||||
{
|
||||
if ((lslperm & ScriptBaseClass.PERM_COPY) != 0)
|
||||
oldvalue |= (uint)PermissionMask.Copy;
|
||||
|
||||
if ((lslperm & ScriptBaseClass.PERM_MODIFY) != 0)
|
||||
oldvalue |= (uint)PermissionMask.Modify;
|
||||
|
||||
if ((lslperm & ScriptBaseClass.PERM_MOVE) != 0)
|
||||
oldvalue |= (uint)PermissionMask.Move;
|
||||
|
||||
if ((lslperm & ScriptBaseClass.PERM_TRANSFER) != 0)
|
||||
oldvalue |= (uint)PermissionMask.Transfer;
|
||||
}
|
||||
|
||||
return oldvalue;
|
||||
}
|
||||
|
||||
private int fixedCopyTransfer(int value)
|
||||
{
|
||||
if ((value & (ScriptBaseClass.PERM_COPY | ScriptBaseClass.PERM_TRANSFER)) == 0)
|
||||
value |= ScriptBaseClass.PERM_TRANSFER;
|
||||
return value;
|
||||
}
|
||||
|
||||
public LSL_Integer llGetObjectPermMask(int mask)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
int permmask = 0;
|
||||
|
||||
if (mask == ScriptBaseClass.MASK_BASE)//0
|
||||
switch(mask)
|
||||
{
|
||||
permmask = (int)m_host.BaseMask;
|
||||
}
|
||||
case ScriptBaseClass.MASK_BASE:
|
||||
return PermissionMaskToLSLPerm(m_host.BaseMask);
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_OWNER)//1
|
||||
{
|
||||
permmask = (int)m_host.OwnerMask;
|
||||
}
|
||||
case ScriptBaseClass.MASK_OWNER:
|
||||
return PermissionMaskToLSLPerm(m_host.OwnerMask);
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_GROUP)//2
|
||||
{
|
||||
permmask = (int)m_host.GroupMask;
|
||||
}
|
||||
case ScriptBaseClass.MASK_GROUP:
|
||||
return PermissionMaskToLSLPerm(m_host.GroupMask);
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_EVERYONE)//3
|
||||
{
|
||||
permmask = (int)m_host.EveryoneMask;
|
||||
}
|
||||
case ScriptBaseClass.MASK_EVERYONE:
|
||||
return PermissionMaskToLSLPerm(m_host.EveryoneMask);
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_NEXT)//4
|
||||
{
|
||||
permmask = (int)m_host.NextOwnerMask;
|
||||
case ScriptBaseClass.MASK_NEXT:
|
||||
return PermissionMaskToLSLPerm(m_host.NextOwnerMask);
|
||||
}
|
||||
|
||||
return permmask;
|
||||
return -1;
|
||||
}
|
||||
|
||||
public void llSetObjectPermMask(int mask, int value)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
|
||||
if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
|
||||
if (!m_AllowGodFunctions || !World.Permissions.IsAdministrator(m_host.OwnerID))
|
||||
return;
|
||||
|
||||
// not even admins have right to violate basic rules
|
||||
if (mask != ScriptBaseClass.MASK_BASE)
|
||||
{
|
||||
if (World.Permissions.IsAdministrator(m_host.OwnerID))
|
||||
{
|
||||
if (mask == ScriptBaseClass.MASK_BASE)//0
|
||||
{
|
||||
m_host.BaseMask = (uint)value;
|
||||
mask &= PermissionMaskToLSLPerm(m_host.BaseMask);
|
||||
if (mask != ScriptBaseClass.MASK_OWNER)
|
||||
mask &= PermissionMaskToLSLPerm(m_host.OwnerMask);
|
||||
}
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_OWNER)//1
|
||||
switch (mask)
|
||||
{
|
||||
m_host.OwnerMask = (uint)value;
|
||||
}
|
||||
case ScriptBaseClass.MASK_BASE:
|
||||
value = fixedCopyTransfer(value);
|
||||
m_host.BaseMask = LSLPermToPermissionMask(value, m_host.BaseMask);
|
||||
break;
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_GROUP)//2
|
||||
{
|
||||
m_host.GroupMask = (uint)value;
|
||||
}
|
||||
case ScriptBaseClass.MASK_OWNER:
|
||||
value = fixedCopyTransfer(value);
|
||||
m_host.OwnerMask = LSLPermToPermissionMask(value, m_host.OwnerMask);
|
||||
break;
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_EVERYONE)//3
|
||||
{
|
||||
m_host.EveryoneMask = (uint)value;
|
||||
}
|
||||
case ScriptBaseClass.MASK_GROUP:
|
||||
m_host.GroupMask = LSLPermToPermissionMask(value, m_host.GroupMask);
|
||||
break;
|
||||
|
||||
else if (mask == ScriptBaseClass.MASK_NEXT)//4
|
||||
{
|
||||
m_host.NextOwnerMask = (uint)value;
|
||||
}
|
||||
}
|
||||
case ScriptBaseClass.MASK_EVERYONE:
|
||||
m_host.EveryoneMask = LSLPermToPermissionMask(value, m_host.EveryoneMask);
|
||||
break;
|
||||
|
||||
case ScriptBaseClass.MASK_NEXT:
|
||||
value = fixedCopyTransfer(value);
|
||||
m_host.NextOwnerMask = LSLPermToPermissionMask(value, m_host.NextOwnerMask);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
m_host.ParentGroup.AggregatePerms();
|
||||
}
|
||||
|
||||
public LSL_Integer llGetInventoryPermMask(string itemName, int mask)
|
||||
|
@ -12748,53 +12804,68 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
|||
|
||||
switch (mask)
|
||||
{
|
||||
case 0:
|
||||
return (int)item.BasePermissions;
|
||||
case 1:
|
||||
return (int)item.CurrentPermissions;
|
||||
case 2:
|
||||
return (int)item.GroupPermissions;
|
||||
case 3:
|
||||
return (int)item.EveryonePermissions;
|
||||
case 4:
|
||||
return (int)item.NextPermissions;
|
||||
case ScriptBaseClass.MASK_BASE:
|
||||
return PermissionMaskToLSLPerm(item.BasePermissions);
|
||||
case ScriptBaseClass.MASK_OWNER:
|
||||
return PermissionMaskToLSLPerm(item.CurrentPermissions);
|
||||
case ScriptBaseClass.MASK_GROUP:
|
||||
return PermissionMaskToLSLPerm(item.GroupPermissions);
|
||||
case ScriptBaseClass.MASK_EVERYONE:
|
||||
return PermissionMaskToLSLPerm(item.EveryonePermissions);
|
||||
case ScriptBaseClass.MASK_NEXT:
|
||||
return PermissionMaskToLSLPerm(item.NextPermissions);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
public void llSetInventoryPermMask(string itemName, int mask, int value)
|
||||
{
|
||||
m_host.AddScriptLPS(1);
|
||||
if(!m_AllowGodFunctions || !World.Permissions.IsAdministrator(m_host.OwnerID))
|
||||
return;
|
||||
|
||||
if (m_ScriptEngine.Config.GetBoolean("AllowGodFunctions", false))
|
||||
{
|
||||
if (World.Permissions.IsAdministrator(m_host.OwnerID))
|
||||
{
|
||||
TaskInventoryItem item = m_host.Inventory.GetInventoryItem(itemName);
|
||||
|
||||
if (item != null)
|
||||
{
|
||||
if (mask != ScriptBaseClass.MASK_BASE)
|
||||
{
|
||||
mask &= PermissionMaskToLSLPerm(item.BasePermissions);
|
||||
if (mask != ScriptBaseClass.MASK_OWNER)
|
||||
mask &= PermissionMaskToLSLPerm(item.CurrentPermissions);
|
||||
}
|
||||
|
||||
/*
|
||||
if(item.Type == (int)(AssetType.Settings))
|
||||
value |= ScriptBaseClass.PERM_COPY;
|
||||
*/
|
||||
|
||||
switch (mask)
|
||||
{
|
||||
case 0:
|
||||
item.BasePermissions = (uint)value;
|
||||
case ScriptBaseClass.MASK_BASE:
|
||||
value = fixedCopyTransfer(value);
|
||||
item.BasePermissions = LSLPermToPermissionMask(value, item.BasePermissions);
|
||||
break;
|
||||
case 1:
|
||||
item.CurrentPermissions = (uint)value;
|
||||
case ScriptBaseClass.MASK_OWNER:
|
||||
value = fixedCopyTransfer(value);
|
||||
item.CurrentPermissions = LSLPermToPermissionMask(value, item.CurrentPermissions);
|
||||
break;
|
||||
case 2:
|
||||
item.GroupPermissions = (uint)value;
|
||||
case ScriptBaseClass.MASK_GROUP:
|
||||
item.GroupPermissions = LSLPermToPermissionMask(value, item.GroupPermissions);
|
||||
break;
|
||||
case 3:
|
||||
item.EveryonePermissions = (uint)value;
|
||||
case ScriptBaseClass.MASK_EVERYONE:
|
||||
item.EveryonePermissions = LSLPermToPermissionMask(value, item.EveryonePermissions);
|
||||
break;
|
||||
case 4:
|
||||
item.NextPermissions = (uint)value;
|
||||
case ScriptBaseClass.MASK_NEXT:
|
||||
value = fixedCopyTransfer(value);
|
||||
item.NextPermissions = LSLPermToPermissionMask(value, item.NextPermissions);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_host.ParentGroup.InvalidateDeepEffectivePerms();
|
||||
m_host.ParentGroup.AggregatePerms();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue