public void llSetCameraParams(LSL_List rules)
{
if (!ScriptProtection.CheckThreatLevel(ThreatLevel.None, "LSL", m_host, "LSL", m_itemID)) return;
// our key in the object we are in
UUID invItemID = InventorySelf();
if (invItemID == UUID.Zero) return;
// the object we are in
UUID objectID = m_host.ParentUUID;
if (objectID == UUID.Zero) return;
UUID agentID;
lock (m_host.TaskInventory)
{
// we need the permission first, to know which avatar we want to set the camera for
agentID = m_host.TaskInventory[invItemID].PermsGranter;
if (agentID == UUID.Zero) return;
if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return;
}
IScenePresence presence = World.GetScenePresence(agentID);
// we are not interested in child-agents
if (presence.IsChildAgent) return;
SortedDictionary<int, float> parameters = new SortedDictionary<int, float>();
object[] data = rules.Data;
for (int i = 0; i < data.Length; ++i)
{
int type = Convert.ToInt32(data[i++].ToString());
if (i >= data.Length) break; // odd number of entries => ignore the last
// some special cases: Vector parameters are split into 3 float parameters (with type+1, type+2, type+3)
if (type == ScriptBaseClass.CAMERA_FOCUS ||
type == ScriptBaseClass.CAMERA_FOCUS_OFFSET ||
type == ScriptBaseClass.CAMERA_POSITION)
{
LSL_Vector v = (LSL_Vector)data[i];
parameters.Add(type + 1, (float)v.x);
parameters.Add(type + 2, (float)v.y);
parameters.Add(type + 3, (float)v.z);
}
else
{
if (data[i] is LSL_Float)
parameters.Add(type, (float)((LSL_Float)data[i]).value);
else if (data[i] is LSL_Integer)
parameters.Add(type, ((LSL_Integer)data[i]).value);
else parameters.Add(type, Convert.ToSingle(data[i]));
}
}
if (parameters.Count > 0) presence.ControllingClient.SendSetFollowCamProperties(objectID, parameters);
}