- adding osGetAgents() which returns a list of all avatars in the region

in which the script is running.

 -  found a bag of space characters under my desk, thought i'd donate them
    to the JSON OSSL function (aka clean up)
0.6.5-rc1
Dr Scofield 2009-03-26 12:08:18 +00:00
parent 3ca1481c3d
commit c8aaf538e4
3 changed files with 79 additions and 46 deletions

View File

@ -582,6 +582,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return ""; return "";
} }
// Get a list of all the avatars/agents in the region
public LSL_List osGetAgents()
{
// threat level is None as we could get this information with an
// in-world script as well, just not as efficient
CheckThreatLevel(ThreatLevel.None, "osGetAgents");
LSL_List result = new LSL_List();
foreach (ScenePresence avatar in World.GetAvatars())
{
result.Add(avatar.Name);
}
return result;
}
// Adam's super super custom animation functions // Adam's super super custom animation functions
public void osAvatarPlayAnimation(string avatar, string animation) public void osAvatarPlayAnimation(string avatar, string animation)
{ {
@ -595,7 +610,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ScenePresence target = (ScenePresence)World.Entities[avatarID]; ScenePresence target = (ScenePresence)World.Entities[avatarID];
if (target != null) if (target != null)
{ {
UUID animID=UUID.Zero; UUID animID=UUID.Zero;
lock (m_host.TaskInventory) lock (m_host.TaskInventory)
{ {
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
@ -626,9 +641,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence) if (World.Entities.ContainsKey(avatarID) && World.Entities[avatarID] is ScenePresence)
{ {
ScenePresence target = (ScenePresence)World.Entities[avatarID]; ScenePresence target = (ScenePresence)World.Entities[avatarID];
if (target != null) if (target != null)
{ {
UUID animID=UUID.Zero; UUID animID=UUID.Zero;
lock (m_host.TaskInventory) lock (m_host.TaskInventory)
{ {
foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
@ -645,7 +660,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
target.RemoveAnimation(animation); target.RemoveAnimation(animation);
else else
target.RemoveAnimation(animID); target.RemoveAnimation(animID);
} }
} }
} }
@ -998,16 +1013,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// see http://www.json.org/ for more details on JSON // see http://www.json.org/ for more details on JSON
string currentKey=null; string currentKey = null;
Stack objectStack = new Stack(); // objects in JSON can be nested so we need to keep a track of this Stack objectStack = new Stack(); // objects in JSON can be nested so we need to keep a track of this
Hashtable jsondata = new Hashtable(); // the hashtable to be returned Hashtable jsondata = new Hashtable(); // the hashtable to be returned
int i=0; int i = 0;
try try
{ {
// iterate through the serialised stream of tokens and store at the right depth in the hashtable // iterate through the serialised stream of tokens and store at the right depth in the hashtable
// the top level hashtable may contain more nested hashtables within it each containing an objects representation // the top level hashtable may contain more nested hashtables within it each containing an objects representation
for (i=0;i<JSON.Length; i++) for (i = 0; i < JSON.Length; i++)
{ {
// m_log.Debug(""+JSON[i]); // m_log.Debug(""+JSON[i]);
@ -1017,12 +1032,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// create hashtable and add it to the stack or array if we are populating one, we can have a lot of nested objects in JSON // create hashtable and add it to the stack or array if we are populating one, we can have a lot of nested objects in JSON
Hashtable currentObject = new Hashtable(); Hashtable currentObject = new Hashtable();
if (objectStack.Count==0) // the stack should only be empty for the first outer object if (objectStack.Count == 0) // the stack should only be empty for the first outer object
{ {
objectStack.Push(jsondata); objectStack.Push(jsondata);
} }
else if (objectStack.Peek().ToString()=="System.Collections.ArrayList") else if (objectStack.Peek().ToString() == "System.Collections.ArrayList")
{ {
// add it to the parent array // add it to the parent array
((ArrayList)objectStack.Peek()).Add(currentObject); ((ArrayList)objectStack.Peek()).Add(currentObject);
@ -1036,26 +1051,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
// clear the key // clear the key
currentKey=null; currentKey = null;
break; break;
case '}': case '}':
// pop the hashtable off the stack // pop the hashtable off the stack
objectStack.Pop(); objectStack.Pop();
break; break;
case '"':// string boundary case '"':// string boundary
string tokenValue=""; string tokenValue = "";
i++; // move to next char i++; // move to next char
// just loop through until the next quote mark storing the string, ignore quotes with pre-ceding \ // just loop through until the next quote mark storing the string, ignore quotes with pre-ceding \
while (JSON[i]!='"') while (JSON[i] != '"')
{ {
tokenValue+=JSON[i]; tokenValue += JSON[i];
// handle escaped double quotes \" // handle escaped double quotes \"
if (JSON[i]=='\\' && JSON[i+1]=='"') if (JSON[i] == '\\' && JSON[i+1] == '"')
{ {
tokenValue+=JSON[i+1]; tokenValue += JSON[i+1];
i++; i++;
} }
i++; i++;
@ -1063,11 +1080,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
} }
// ok we've got a string, if we've got an array on the top of the stack then we store it // ok we've got a string, if we've got an array on the top of the stack then we store it
if (objectStack.Peek().ToString()=="System.Collections.ArrayList") if (objectStack.Peek().ToString() == "System.Collections.ArrayList")
{ {
((ArrayList)objectStack.Peek()).Add(tokenValue); ((ArrayList)objectStack.Peek()).Add(tokenValue);
} }
else if (currentKey==null) // no key stored and its not an array this must be a key so store it else if (currentKey == null) // no key stored and its not an array this must be a key so store it
{ {
currentKey = tokenValue; currentKey = tokenValue;
} }
@ -1076,20 +1093,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// we have a key so lets store this value // we have a key so lets store this value
((Hashtable)objectStack.Peek()).Add(currentKey,tokenValue); ((Hashtable)objectStack.Peek()).Add(currentKey,tokenValue);
// now lets clear the key, we're done with it and moving on // now lets clear the key, we're done with it and moving on
currentKey=null; currentKey = null;
} }
break; break;
case ':':// key : value separator case ':':// key : value separator
// just ignore // just ignore
break; break;
case ' ':// spaces case ' ':// spaces
// just ignore // just ignore
break; break;
case '[': // array start case '[': // array start
ArrayList currentArray = new ArrayList(); ArrayList currentArray = new ArrayList();
if (objectStack.Peek().ToString()=="System.Collections.ArrayList") if (objectStack.Peek().ToString() == "System.Collections.ArrayList")
{ {
((ArrayList)objectStack.Peek()).Add(currentArray); ((ArrayList)objectStack.Peek()).Add(currentArray);
} }
@ -1097,69 +1117,76 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
((Hashtable)objectStack.Peek()).Add(currentKey,currentArray); ((Hashtable)objectStack.Peek()).Add(currentKey,currentArray);
// clear the key // clear the key
currentKey=null; currentKey = null;
} }
objectStack.Push(currentArray); objectStack.Push(currentArray);
break; break;
case ',':// seperator case ',':// seperator
// just ignore // just ignore
break; break;
case ']'://Array end case ']'://Array end
// pop the array off the stack // pop the array off the stack
objectStack.Pop(); objectStack.Pop();
break; break;
case 't': // we've found a character start not in quotes, it must be a boolean true case 't': // we've found a character start not in quotes, it must be a boolean true
if (objectStack.Peek().ToString()=="System.Collections.ArrayList") if (objectStack.Peek().ToString() == "System.Collections.ArrayList")
{ {
((ArrayList)objectStack.Peek()).Add(true); ((ArrayList)objectStack.Peek()).Add(true);
} }
else else
{ {
((Hashtable)objectStack.Peek()).Add(currentKey,true); ((Hashtable)objectStack.Peek()).Add(currentKey,true);
currentKey=null; currentKey = null;
} }
//advance the counter to the letter 'e' //advance the counter to the letter 'e'
i = i+3; i = i + 3;
break; break;
case 'f': // we've found a character start not in quotes, it must be a boolean false case 'f': // we've found a character start not in quotes, it must be a boolean false
if (objectStack.Peek().ToString()=="System.Collections.ArrayList") if (objectStack.Peek().ToString() == "System.Collections.ArrayList")
{ {
((ArrayList)objectStack.Peek()).Add(false); ((ArrayList)objectStack.Peek()).Add(false);
} }
else else
{ {
((Hashtable)objectStack.Peek()).Add(currentKey,false); ((Hashtable)objectStack.Peek()).Add(currentKey,false);
currentKey=null; currentKey = null;
} }
//advance the counter to the letter 'e' //advance the counter to the letter 'e'
i = i+4; i = i + 4;
break; break;
case '\n':// carriage return case '\n':// carriage return
// just ignore // just ignore
break; break;
case '\r':// carriage return case '\r':// carriage return
// just ignore // just ignore
break; break;
default: default:
// ok here we're catching all numeric types int,double,long we might want to spit these up mr accurately // ok here we're catching all numeric types int,double,long we might want to spit these up mr accurately
// but for now we'll just do them as strings // but for now we'll just do them as strings
string numberValue=""; string numberValue = "";
// just loop through until the next known marker quote mark storing the string // just loop through until the next known marker quote mark storing the string
while (JSON[i] != '"' && JSON[i] != ',' && JSON[i] != ']' && JSON[i] != '}' && JSON[i] != ' ') while (JSON[i] != '"' && JSON[i] != ',' && JSON[i] != ']' && JSON[i] != '}' && JSON[i] != ' ')
{ {
numberValue+=""+JSON[i++]; numberValue += "" + JSON[i++];
} }
i--; // we want to process this caracter that marked the end of this string in the main loop i--; // we want to process this caracter that marked the end of this string in the main loop
// ok we've got a string, if we've got an array on the top of the stack then we store it // ok we've got a string, if we've got an array on the top of the stack then we store it
if (objectStack.Peek().ToString()=="System.Collections.ArrayList") if (objectStack.Peek().ToString() == "System.Collections.ArrayList")
{ {
((ArrayList)objectStack.Peek()).Add(numberValue); ((ArrayList)objectStack.Peek()).Add(numberValue);
} }
@ -1168,10 +1195,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// we have a key so lets store this value // we have a key so lets store this value
((Hashtable)objectStack.Peek()).Add(currentKey,numberValue); ((Hashtable)objectStack.Peek()).Add(currentKey,numberValue);
// now lets clear the key, we're done with it and moving on // now lets clear the key, we're done with it and moving on
currentKey=null; currentKey = null;
} }
break; break;
} }
} }
} }

View File

@ -69,6 +69,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
// Avatar Info Commands // Avatar Info Commands
string osGetAgentIP(string agent); string osGetAgentIP(string agent);
LSL_List osGetAgents();
// Teleport commands // Teleport commands
void osTeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat); void osTeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat);

View File

@ -175,6 +175,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
return m_OSSL_Functions.osGetAgentIP(agent); return m_OSSL_Functions.osGetAgentIP(agent);
} }
public LSL_List osGetAgents()
{
return m_OSSL_Functions.osGetAgents();
}
// Animation Functions // Animation Functions
public void osAvatarPlayAnimation(string avatar, string animation) public void osAvatarPlayAnimation(string avatar, string animation)