Merge branch 'careminster-presence-refactor' of ssh://3dhosting.de/var/git/careminster into careminster-presence-refactor

avinationmerge
meta7 2010-08-22 09:32:49 -07:00
commit 8a1640f0a1
4 changed files with 136 additions and 51 deletions

View File

@ -2734,32 +2734,57 @@ namespace OpenSim.Region.ClientStack.LindenUDP
packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
packet.QueryReplies =
new DirPlacesReplyPacket.QueryRepliesBlock[data.Length];
packet.StatusData = new DirPlacesReplyPacket.StatusDataBlock[
data.Length];
packet.AgentData.AgentID = AgentId;
packet.QueryData[0].QueryID = queryID;
DirPlacesReplyPacket.QueryRepliesBlock[] replies =
new DirPlacesReplyPacket.QueryRepliesBlock[0];
DirPlacesReplyPacket.StatusDataBlock[] status =
new DirPlacesReplyPacket.StatusDataBlock[0];
int i = 0;
foreach (DirPlacesReplyData d in data)
{
packet.QueryReplies[i] =
new DirPlacesReplyPacket.QueryRepliesBlock();
packet.StatusData[i] = new DirPlacesReplyPacket.StatusDataBlock();
packet.QueryReplies[i].ParcelID = d.parcelID;
packet.QueryReplies[i].Name = Utils.StringToBytes(d.name);
packet.QueryReplies[i].ForSale = d.forSale;
packet.QueryReplies[i].Auction = d.auction;
packet.QueryReplies[i].Dwell = d.dwell;
packet.StatusData[i].Status = d.Status;
i++;
int idx = replies.Length;
Array.Resize(ref replies, idx + 1);
Array.Resize(ref status, idx + 1);
replies[idx] = new DirPlacesReplyPacket.QueryRepliesBlock();
status[idx] = new DirPlacesReplyPacket.StatusDataBlock();
replies[idx].ParcelID = d.parcelID;
replies[idx].Name = Utils.StringToBytes(d.name);
replies[idx].ForSale = d.forSale;
replies[idx].Auction = d.auction;
replies[idx].Dwell = d.dwell;
status[idx].Status = d.Status;
packet.QueryReplies = replies;
packet.StatusData = status;
if (packet.Length >= 1000)
{
OutPacket(packet, ThrottleOutPacketType.Task);
packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
packet.AgentData.AgentID = AgentId;
packet.QueryData[0].QueryID = queryID;
replies = new DirPlacesReplyPacket.QueryRepliesBlock[0];
status = new DirPlacesReplyPacket.StatusDataBlock[0];
}
}
OutPacket(packet, ThrottleOutPacketType.Task);
if (replies.Length > 0)
OutPacket(packet, ThrottleOutPacketType.Task);
}
public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)

View File

@ -658,6 +658,7 @@ namespace OpenSim.Region.Framework.Scenes
m_persistAfter *= 10000000;
m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
IConfig packetConfig = m_config.Configs["PacketPool"];
if (packetConfig != null)
@ -692,9 +693,9 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
catch
catch (Exception e)
{
m_log.Warn("[SCENE]: Failed to load StartupConfig");
m_log.Error("[SCENE]: Failed to load StartupConfig: " + e.ToString());
}
#endregion Region Config

View File

@ -422,6 +422,9 @@ namespace OpenSim.Region.Framework.Scenes
public void ResumeScripts()
{
if (m_scene.RegionInfo.RegionSettings.DisableScripts)
return;
foreach (SceneObjectPart part in m_parts.Values)
{
part.Inventory.ResumeScripts();

View File

@ -5122,7 +5122,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
else if (src.Data[index] is LSL_Float)
return Convert.ToDouble(((LSL_Float) src.Data[index]).value);
else if (src.Data[index] is LSL_String)
return Convert.ToDouble(Regex.Replace(((LSL_String)src.Data[index]).m_string, "[^0-9]", ""));
{
string str = ((LSL_String) src.Data[index]).m_string;
Match m = Regex.Match(str, "^\\s*(-?\\+?[,0-9]+\\.?[0-9]*)");
if (m != Match.Empty)
{
str = m.Value;
double d = 0.0;
if (!Double.TryParse(str, out d))
return 0.0;
return d;
}
return 0.0;
}
return Convert.ToDouble(src.Data[index]);
}
catch (FormatException)
@ -7823,55 +7836,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
UUID objID = UUID.Zero;
LSL_List result = new LSL_List();
// If the ID is not valid, return null result
if (!UUID.TryParse(obj, out objID))
{
result.Add(new LSL_Vector());
result.Add(new LSL_Vector());
return result;
}
// Check if this is an attached prim. If so, replace
// the UUID with the avatar UUID and report it's bounding box
SceneObjectPart part = World.GetSceneObjectPart(objID);
if (part != null && part.ParentGroup.IsAttachment)
objID = part.ParentGroup.RootPart.AttachedAvatar;
// Find out if this is an avatar ID. If so, return it's box
ScenePresence presence = World.GetScenePresence(objID);
if (presence != null)
{
if (presence.ParentID == 0) // not sat on an object
// As per LSL Wiki, there is no difference between sitting
// and standing avatar since server 1.36
LSL_Vector lower;
LSL_Vector upper;
if (presence.Animator.Animations.DefaultAnimation.AnimID
== AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
{
LSL_Vector lower;
LSL_Vector upper;
if (presence.Animator.Animations.DefaultAnimation.AnimID
== AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
{
// This is for ground sitting avatars
float height = presence.Appearance.AvatarHeight / 2.66666667f;
lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
}
else
{
// This is for standing/flying avatars
float height = presence.Appearance.AvatarHeight / 2.0f;
lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
}
result.Add(lower);
result.Add(upper);
return result;
// This is for ground sitting avatars
float height = presence.Appearance.AvatarHeight / 2.66666667f;
lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
}
else
{
// sitting on an object so we need the bounding box of that
// which should include the avatar so set the UUID to the
// UUID of the object the avatar is sat on and allow it to fall through
// to processing an object
SceneObjectPart p = World.GetSceneObjectPart(presence.ParentID);
objID = p.UUID;
// This is for standing/flying avatars
float height = presence.Appearance.AvatarHeight / 2.0f;
lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
}
// Adjust to the documented error offsets (see LSL Wiki)
lower += new LSL_Vector(0.05f, 0.05f, 0.05f);
upper -= new LSL_Vector(0.05f, 0.05f, 0.05f);
if (lower.x > upper.x)
lower.x = upper.x;
if (lower.y > upper.y)
lower.y = upper.y;
if (lower.z > upper.z)
lower.z = upper.z;
result.Add(lower);
result.Add(upper);
return result;
}
SceneObjectPart part = World.GetSceneObjectPart(objID);
part = World.GetSceneObjectPart(objID);
// Currently only works for single prims without a sitting avatar
if (part != null)
{
Vector3 halfSize = part.Scale / 2.0f;
LSL_Vector lower = new LSL_Vector(halfSize.X * -1.0f, halfSize.Y * -1.0f, halfSize.Z * -1.0f);
LSL_Vector upper = new LSL_Vector(halfSize.X, halfSize.Y, halfSize.Z);
float minX;
float maxX;
float minY;
float maxY;
float minZ;
float maxZ;
// This BBox is in sim coordinates, with the offset being
// a contained point.
Vector3[] offsets = World.GetCombinedBoundingBox(new List<SceneObjectGroup> { part.ParentGroup },
out minX, out maxX, out minY, out maxY, out minZ, out maxZ);
minX -= offsets[0].X;
maxX -= offsets[0].X;
minY -= offsets[0].Y;
maxY -= offsets[0].Y;
minZ -= offsets[0].Z;
maxZ -= offsets[0].Z;
LSL_Vector lower;
LSL_Vector upper;
// Adjust to the documented error offsets (see LSL Wiki)
lower = new LSL_Vector(minX + 0.05f, minY + 0.05f, minZ + 0.05f);
upper = new LSL_Vector(maxX - 0.05f, maxY - 0.05f, maxZ - 0.05f);
if (lower.x > upper.x)
lower.x = upper.x;
if (lower.y > upper.y)
lower.y = upper.y;
if (lower.z > upper.z)
lower.z = upper.z;
result.Add(lower);
result.Add(upper);
return result;