* Rex merge, Environment/Scene

afrisby-3
Adam Frisby 2008-02-23 04:02:11 +00:00
parent 69c92d53cb
commit dd96983915
19 changed files with 7642 additions and 6458 deletions

View File

@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* *
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Xml; using System.Xml;
@ -40,11 +41,6 @@ namespace OpenSim.Region.Environment.Scenes
public AvatarAnimations() public AvatarAnimations()
{ {
}
public void LoadAnims()
{
//MainLog.Instance.Verbose("CLIENT", "Loading avatar animations");
using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml")) using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml"))
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
@ -53,25 +49,14 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (nod.Attributes["name"] != null) if (nod.Attributes["name"] != null)
{ {
AnimsLLUUID.Add(nod.Attributes["name"].Value, nod.InnerText); string name = (string)nod.Attributes["name"].Value;
LLUUID id = (LLUUID)nod.InnerText;
AnimsLLUUID.Add(name, id);
AnimsNames.Add(id, name);
} }
} }
} }
// MainLog.Instance.Verbose("CLIENT", "Loaded " + AnimsLLUUID.Count.ToString() + " animation(s)");
try
{
//Mantis: 0000224: 2755 - Enumeration Operation may not execute [immediate crash] (ODE/2750/WIN2003)
foreach (KeyValuePair<string, LLUUID> kp in ScenePresence.Animations.AnimsLLUUID)
{
AnimsNames.Add(kp.Value, kp.Key);
}
}
catch (InvalidOperationException)
{
MainLog.Instance.Warn("AVATAR", "Unable to load animation names for an Avatar");
}
} }
} }
} }

View File

@ -35,12 +35,24 @@ namespace OpenSim.Region.Environment.Scenes
public class AvatarAppearance public class AvatarAppearance
{ {
protected LLUUID m_scenePresenceID; protected LLUUID m_scenePresenceID;
public LLUUID ScenePresenceID
{
get { return m_scenePresenceID; }
set { m_scenePresenceID = value; }
}
protected int m_wearablesSerial = 1; protected int m_wearablesSerial = 1;
protected bool m_rexmode; //rex protected bool m_rexmode; //rex
protected string m_avatarStorageAddr; protected string m_avatarStorageAddr;
public int WearablesSerial
{
get { return m_wearablesSerial; }
set { m_wearablesSerial = value; }
}
protected byte[] m_visualParams; protected byte[] m_visualParams;
public byte[] VisualParams public byte[] VisualParams

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@ -34,8 +34,6 @@ namespace OpenSim.Region.Environment.Scenes
{ {
public abstract class EntityBase public abstract class EntityBase
{ {
protected List<EntityBase> m_children;
protected Scene m_scene; protected Scene m_scene;
public Scene Scene public Scene Scene
@ -116,33 +114,17 @@ namespace OpenSim.Region.Environment.Scenes
Rotation = new Quaternion(); Rotation = new Quaternion();
m_name = "(basic entity)"; m_name = "(basic entity)";
m_rotationalvelocity = new LLVector3(0, 0, 0); m_rotationalvelocity = new LLVector3(0, 0, 0);
m_children = new List<EntityBase>();
} }
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>
public virtual void UpdateMovement() public abstract void UpdateMovement();
{
foreach (EntityBase child in m_children)
{
child.UpdateMovement();
}
}
/// <summary> /// <summary>
/// Performs any updates that need to be done at each frame. This function is overridable from it's children. /// Performs any updates that need to be done at each frame.
/// </summary> /// </summary>
public virtual void Update() public abstract void Update();
{
// Do any per-frame updates needed that are applicable to every type of entity
foreach (EntityBase child in m_children)
{
child.Update();
}
}
/// <summary> /// <summary>
/// Copies the entity /// Copies the entity

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY

View File

@ -42,9 +42,12 @@ namespace OpenSim.Region.Environment.Scenes
public class InnerScene public class InnerScene
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#region Events #region Events
public event PhysicsCrash UnRecoverableError; public event PhysicsCrash UnRecoverableError;
private PhysicsCrash handler001 = null;
#endregion #endregion
@ -60,11 +63,15 @@ namespace OpenSim.Region.Environment.Scenes
protected RegionInfo m_regInfo; protected RegionInfo m_regInfo;
protected Scene m_parentScene; protected Scene m_parentScene;
protected PermissionManager PermissionsMngr; protected PermissionManager PermissionsMngr;
protected List<EntityBase> m_updateList = new List<EntityBase>();
protected int m_numRootAgents = 0; protected int m_numRootAgents = 0;
protected int m_numPrim = 0; protected int m_numPrim = 0;
protected int m_numChildAgents = 0; protected int m_numChildAgents = 0;
protected int m_physicalPrim = 0; protected int m_physicalPrim = 0;
protected int m_activeScripts = 0;
protected int m_scriptLPS = 0;
internal object m_syncRoot = new object(); internal object m_syncRoot = new object();
public PhysicsScene _PhyScene; public PhysicsScene _PhyScene;
@ -76,7 +83,7 @@ namespace OpenSim.Region.Environment.Scenes
m_parentScene = parent; m_parentScene = parent;
m_regInfo = regInfo; m_regInfo = regInfo;
PermissionsMngr = permissionsMngr; PermissionsMngr = permissionsMngr;
QuadTree = new BasicQuadTreeNode(null, "/0/", 0, 0, 256, 256); QuadTree = new BasicQuadTreeNode(null, "/0/", 0, 0, (short)Constants.RegionSize, (short)Constants.RegionSize);
QuadTree.Subdivide(); QuadTree.Subdivide();
QuadTree.Subdivide(); QuadTree.Subdivide();
} }
@ -141,11 +148,20 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
internal void UpdatePresences()
{
List<ScenePresence> updateScenePresences = GetScenePresences();
foreach (ScenePresence pres in updateScenePresences)
{
pres.Update();
}
}
internal float UpdatePhysics(double elapsed) internal float UpdatePhysics(double elapsed)
{ {
lock (m_syncRoot) lock (m_syncRoot)
{ {
return _PhyScene.Simulate((float) elapsed); return _PhyScene.Simulate((float)elapsed);
} }
} }
@ -170,6 +186,7 @@ namespace OpenSim.Region.Environment.Scenes
foreach (SceneObjectPart part in sceneObject.Children.Values) foreach (SceneObjectPart part in sceneObject.Children.Values)
{ {
part.LocalID = m_parentScene.PrimIDAllocate(); part.LocalID = m_parentScene.PrimIDAllocate();
} }
sceneObject.UpdateParentIDs(); sceneObject.UpdateParentIDs();
AddEntity(sceneObject); AddEntity(sceneObject);
@ -188,6 +205,29 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
internal void AddToUpdateList(EntityBase obj)
{
lock (m_updateList)
{
if (!m_updateList.Contains(obj))
{
m_updateList.Add(obj);
}
}
}
internal void ProcessUpdates()
{
lock (m_updateList)
{
for (int i = 0; i < m_updateList.Count; i++)
{
m_updateList[i].Update();
}
m_updateList.Clear();
}
}
public void AddPhysicalPrim(int number) public void AddPhysicalPrim(int number)
{ {
m_physicalPrim++; m_physicalPrim++;
@ -198,6 +238,16 @@ namespace OpenSim.Region.Environment.Scenes
m_physicalPrim--; m_physicalPrim--;
} }
public void AddToScriptLPS(int number)
{
m_scriptLPS += number;
}
public void AddActiveScripts(int number)
{
m_activeScripts += number;
}
public void RemovePrim(uint localID, LLUUID avatar_deleter) public void RemovePrim(uint localID, LLUUID avatar_deleter)
{ {
List<EntityBase> EntityList = GetEntities(); List<EntityBase> EntityList = GetEntities();
@ -206,9 +256,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (obj is SceneObjectGroup) if (obj is SceneObjectGroup)
{ {
if (((SceneObjectGroup) obj).LocalId == localID) if (((SceneObjectGroup)obj).LocalId == localID)
{ {
m_parentScene.RemoveEntity((SceneObjectGroup) obj); m_parentScene.RemoveEntity((SceneObjectGroup)obj);
m_numPrim--; m_numPrim--;
return; return;
} }
@ -216,6 +266,148 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void AttachObject(IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, LLQuaternion rot)
{
System.Console.WriteLine("Attaching object " + objectLocalID + " to " + AttachmentPt);
SceneObjectPart p = GetSceneObjectPart(objectLocalID);
ScenePresence av = null;
if (TryGetAvatar(remoteClient.AgentId, out av))
{
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
objupdate.RegionData.RegionHandle = m_regInfo.RegionHandle;
objupdate.RegionData.TimeDilation = ushort.MaxValue;
objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[2];
// avatar stuff - horrible group copypaste
objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock();
objupdate.ObjectData[0].PSBlock = new byte[0];
objupdate.ObjectData[0].ExtraParams = new byte[1];
objupdate.ObjectData[0].MediaURL = new byte[0];
objupdate.ObjectData[0].NameValue = new byte[0];
objupdate.ObjectData[0].Text = new byte[0];
objupdate.ObjectData[0].TextColor = new byte[4];
objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0, 0, 0);
objupdate.ObjectData[0].JointPivot = new LLVector3(0, 0, 0);
objupdate.ObjectData[0].Material = 4;
objupdate.ObjectData[0].TextureAnim = new byte[0];
objupdate.ObjectData[0].Sound = LLUUID.Zero;
objupdate.ObjectData[0].State = 0;
objupdate.ObjectData[0].Data = new byte[0];
objupdate.ObjectData[0].ObjectData = new byte[76];
objupdate.ObjectData[0].ObjectData[15] = 128;
objupdate.ObjectData[0].ObjectData[16] = 63;
objupdate.ObjectData[0].ObjectData[56] = 128;
objupdate.ObjectData[0].ObjectData[61] = 102;
objupdate.ObjectData[0].ObjectData[62] = 40;
objupdate.ObjectData[0].ObjectData[63] = 61;
objupdate.ObjectData[0].ObjectData[64] = 189;
objupdate.ObjectData[0].UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24);
objupdate.ObjectData[0].PathCurve = 16;
objupdate.ObjectData[0].ProfileCurve = 1;
objupdate.ObjectData[0].PathScaleX = 100;
objupdate.ObjectData[0].PathScaleY = 100;
objupdate.ObjectData[0].ParentID = 0;
objupdate.ObjectData[0].OwnerID = LLUUID.Zero;
objupdate.ObjectData[0].Scale = new LLVector3(1, 1, 1);
objupdate.ObjectData[0].PCode = 47;
objupdate.ObjectData[0].TextureEntry = ScenePresence.DefaultTexture;
objupdate.ObjectData[0].ID = av.LocalId;
objupdate.ObjectData[0].FullID = remoteClient.AgentId;
objupdate.ObjectData[0].ParentID = 0;
objupdate.ObjectData[0].NameValue =
Helpers.StringToField("FirstName STRING RW SV " + av.Firstname + "\nLastName STRING RW SV " + av.Lastname);
LLVector3 pos2 = av.AbsolutePosition;
// new LLVector3((float) Pos.X, (float) Pos.Y, (float) Pos.Z);
byte[] pb = pos2.GetBytes();
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
// primitive part
objupdate.ObjectData[1] = new ObjectUpdatePacket.ObjectDataBlock();
// SetDefaultPrimPacketValues
objupdate.ObjectData[1].PSBlock = new byte[0];
objupdate.ObjectData[1].ExtraParams = new byte[1];
objupdate.ObjectData[1].MediaURL = new byte[0];
objupdate.ObjectData[1].NameValue = new byte[0];
objupdate.ObjectData[1].Text = new byte[0];
objupdate.ObjectData[1].TextColor = new byte[4];
objupdate.ObjectData[1].JointAxisOrAnchor = new LLVector3(0, 0, 0);
objupdate.ObjectData[1].JointPivot = new LLVector3(0, 0, 0);
objupdate.ObjectData[1].Material = 3;
objupdate.ObjectData[1].TextureAnim = new byte[0];
objupdate.ObjectData[1].Sound = LLUUID.Zero;
objupdate.ObjectData[1].State = 0;
objupdate.ObjectData[1].Data = new byte[0];
objupdate.ObjectData[1].ObjectData = new byte[60];
objupdate.ObjectData[1].ObjectData[46] = 128;
objupdate.ObjectData[1].ObjectData[47] = 63;
// SetPrimPacketShapeData
PrimitiveBaseShape primData = p.Shape;
objupdate.ObjectData[1].TextureEntry = primData.TextureEntry;
objupdate.ObjectData[1].PCode = primData.PCode;
objupdate.ObjectData[1].State = (byte)(((byte)AttachmentPt) << 4);
objupdate.ObjectData[1].PathBegin = primData.PathBegin;
objupdate.ObjectData[1].PathEnd = primData.PathEnd;
objupdate.ObjectData[1].PathScaleX = primData.PathScaleX;
objupdate.ObjectData[1].PathScaleY = primData.PathScaleY;
objupdate.ObjectData[1].PathShearX = primData.PathShearX;
objupdate.ObjectData[1].PathShearY = primData.PathShearY;
objupdate.ObjectData[1].PathSkew = primData.PathSkew;
objupdate.ObjectData[1].ProfileBegin = primData.ProfileBegin;
objupdate.ObjectData[1].ProfileEnd = primData.ProfileEnd;
objupdate.ObjectData[1].Scale = primData.Scale;
objupdate.ObjectData[1].PathCurve = primData.PathCurve;
objupdate.ObjectData[1].ProfileCurve = primData.ProfileCurve;
objupdate.ObjectData[1].ProfileHollow = primData.ProfileHollow;
objupdate.ObjectData[1].PathRadiusOffset = primData.PathRadiusOffset;
objupdate.ObjectData[1].PathRevolutions = primData.PathRevolutions;
objupdate.ObjectData[1].PathTaperX = primData.PathTaperX;
objupdate.ObjectData[1].PathTaperY = primData.PathTaperY;
objupdate.ObjectData[1].PathTwist = primData.PathTwist;
objupdate.ObjectData[1].PathTwistBegin = primData.PathTwistBegin;
objupdate.ObjectData[1].ExtraParams = primData.ExtraParams;
objupdate.ObjectData[1].UpdateFlags = 276957500; // flags; // ??
objupdate.ObjectData[1].ID = p.LocalID;
objupdate.ObjectData[1].FullID = p.UUID;
objupdate.ObjectData[1].OwnerID = p.OwnerID;
objupdate.ObjectData[1].Text = Helpers.StringToField(p.Text);
objupdate.ObjectData[1].TextColor[0] = 255;
objupdate.ObjectData[1].TextColor[1] = 255;
objupdate.ObjectData[1].TextColor[2] = 255;
objupdate.ObjectData[1].TextColor[3] = 128;
objupdate.ObjectData[1].ParentID = objupdate.ObjectData[0].ID;
//objupdate.ObjectData[1].PSBlock = particleSystem;
//objupdate.ObjectData[1].ClickAction = clickAction;
objupdate.ObjectData[1].Radius = 20;
objupdate.ObjectData[1].NameValue =
Helpers.StringToField("AttachItemID STRING RW SV " + p.UUID);
LLVector3 pos = new LLVector3((float)0.0, (float)0.0, (float)0.0);
pb = pos.GetBytes();
Array.Copy(pb, 0, objupdate.ObjectData[1].ObjectData, 0, pb.Length);
byte[] brot = rot.GetBytes();
Array.Copy(brot, 0, objupdate.ObjectData[1].ObjectData, 36, brot.Length);
remoteClient.OutPacket(objupdate, ThrottleOutPacketType.Task);
}
else
{
m_log.Info("[SCENE]: Avatar " + remoteClient.AgentId + " not found");
}
}
public ScenePresence CreateAndAddScenePresence(IClientAPI client, bool child, AvatarAppearance appearance) public ScenePresence CreateAndAddScenePresence(IClientAPI client, bool child, AvatarAppearance appearance)
{ {
ScenePresence newAvatar = null; ScenePresence newAvatar = null;
@ -226,13 +418,13 @@ namespace OpenSim.Region.Environment.Scenes
if (child) if (child)
{ {
m_numChildAgents++; m_numChildAgents++;
MainLog.Instance.Verbose("SCENE", m_regInfo.RegionName + ": Creating new child agent."); m_log.Info("[SCENE]: " + m_regInfo.RegionName + ": Creating new child agent.");
} }
else else
{ {
m_numRootAgents++; m_numRootAgents++;
MainLog.Instance.Verbose("SCENE", m_regInfo.RegionName + ": Creating new root agent."); m_log.Info("[SCENE]: " + m_regInfo.RegionName + ": Creating new root agent.");
MainLog.Instance.Verbose("SCENE", m_regInfo.RegionName + ": Adding Physical agent."); m_log.Info("[SCENE]: " + m_regInfo.RegionName + ": Adding Physical agent.");
newAvatar.AddToPhysicalScene(); newAvatar.AddToPhysicalScene();
} }
@ -301,6 +493,12 @@ namespace OpenSim.Region.Environment.Scenes
public int GetChildAgentCount() public int GetChildAgentCount()
{ {
// some network situations come in where child agents get closed twice.
if (m_numChildAgents < 0)
{
m_numChildAgents = 0;
}
return m_numChildAgents; return m_numChildAgents;
} }
@ -319,6 +517,17 @@ namespace OpenSim.Region.Environment.Scenes
return m_physicalPrim; return m_physicalPrim;
} }
public int GetActiveScripts()
{
return m_activeScripts;
}
public int GetScriptLPS()
{
int returnval = m_scriptLPS;
m_scriptLPS = 0;
return returnval;
}
#endregion #endregion
#region Get Methods #region Get Methods
@ -389,8 +598,8 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
if (((SceneObjectGroup) ent).HasChildPrim(localID)) if (((SceneObjectGroup)ent).HasChildPrim(localID))
return (SceneObjectGroup) ent; return (SceneObjectGroup)ent;
} }
} }
return null; return null;
@ -404,8 +613,8 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
if (((SceneObjectGroup) ent).HasChildPrim(fullID)) if (((SceneObjectGroup)ent).HasChildPrim(fullID))
return (SceneObjectGroup) ent; return (SceneObjectGroup)ent;
} }
} }
return null; return null;
@ -420,7 +629,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
SceneObjectGroup reportingG = (SceneObjectGroup) ent; SceneObjectGroup reportingG = (SceneObjectGroup)ent;
EntityIntersection result = reportingG.TestIntersection(hray); EntityIntersection result = reportingG.TestIntersection(hray);
if (result.HitTF) if (result.HitTF)
{ {
@ -507,9 +716,10 @@ namespace OpenSim.Region.Environment.Scenes
public void physicsBasedCrash() public void physicsBasedCrash()
{ {
if (UnRecoverableError != null) handler001 = UnRecoverableError;
if (handler001 != null)
{ {
UnRecoverableError(); handler001();
} }
} }
@ -536,24 +746,24 @@ namespace OpenSim.Region.Environment.Scenes
// the initial update for and what we'll use to limit the // the initial update for and what we'll use to limit the
// space we check for new objects on movement. // space we check for new objects on movement.
if (presence.IsChildAgent) if (presence.IsChildAgent && m_parentScene.m_seeIntoRegionFromNeighbor)
{ {
//Vector3 avPosition = new Vector3(presence.AbsolutePosition.X,presence.AbsolutePosition.Y,presence.AbsolutePosition.Z); LLVector3 oLoc = ((SceneObjectGroup)ent).AbsolutePosition;
//LLVector3 oLoc = ((SceneObjectGroup)ent).AbsolutePosition; float distResult = (float)Util.GetDistanceTo(presence.AbsolutePosition, oLoc);
//Vector3 objPosition = new Vector3(oLoc.X,oLoc.Y,oLoc.Z);
//float distResult = Vector3Distance(avPosition, objPosition); //m_log.Info("[DISTANCE]: " + distResult.ToString());
//if (distResult > 512)
//{ if (distResult < presence.DrawDistance)
//int x = 0; {
//} // Send Only if we don't already know about it.
//if (distResult < presence.DrawDistance) // KnownPrim also makes the prim known when called.
//{ if (!presence.KnownPrim(((SceneObjectGroup)ent).UUID))
((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence); ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
//} }
} }
else else
{ {
((SceneObjectGroup) ent).ScheduleFullUpdateToAvatar(presence); ((SceneObjectGroup)ent).ScheduleFullUpdateToAvatar(presence);
} }
} }
} }
@ -602,7 +812,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
SceneObjectGroup group = GetGroupByPrim(ObjectID); SceneObjectGroup group = GetGroupByPrim(ObjectID);
if (group != null) if (group != null)
{
group.ServiceObjectPropertiesFamilyRequest(remoteClient, AgentID, RequestFlags); group.ServiceObjectPropertiesFamilyRequest(remoteClient, AgentID, RequestFlags);
}
} }
/// <summary> /// <summary>
@ -721,7 +933,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (PermissionsMngr.CanEditObject(remoteClient.AgentId, group.UUID)) if (PermissionsMngr.CanEditObject(remoteClient.AgentId, group.UUID))
{ {
group.UpdatePrimFlags(localID, (ushort) packet.Type, true, packet.ToBytes()); group.UpdatePrimFlags(localID, (ushort)packet.Type, true, packet.ToBytes());
} }
} }
} }
@ -735,6 +947,11 @@ namespace OpenSim.Region.Environment.Scenes
{ {
group.GrabMovement(offset, pos, remoteClient); group.GrabMovement(offset, pos, remoteClient);
} }
// This is outside the above permissions condition
// so that if the object is locked the client moving the object
// get's it's position on the simulator even if it was the same as before
// This keeps the moving user's client in sync with the rest of the world.
group.SendGroupTerseUpdate();
} }
} }
@ -816,9 +1033,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
if (((SceneObjectGroup) ent).LocalId == parentPrim) if (((SceneObjectGroup)ent).LocalId == parentPrim)
{ {
parenPrim = (SceneObjectGroup) ent; parenPrim = (SceneObjectGroup)ent;
break; break;
} }
} }
@ -833,9 +1050,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
if (((SceneObjectGroup) ent).LocalId == childPrims[i]) if (((SceneObjectGroup)ent).LocalId == childPrims[i])
{ {
children.Add((SceneObjectGroup) ent); children.Add((SceneObjectGroup)ent);
} }
} }
} }
@ -862,21 +1079,25 @@ namespace OpenSim.Region.Environment.Scenes
// be more efficient yet to keep this dictionary permanently on hand. // be more efficient yet to keep this dictionary permanently on hand.
Dictionary<uint, SceneObjectGroup> sceneObjects = new Dictionary<uint, SceneObjectGroup>(); Dictionary<uint, SceneObjectGroup> sceneObjects = new Dictionary<uint, SceneObjectGroup>();
List<EntityBase> EntitieList = GetEntities(); List<EntityBase> EntitieList = GetEntities();
foreach (EntityBase ent in EntitieList) foreach (EntityBase ent in EntitieList)
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
SceneObjectGroup obj = (SceneObjectGroup) ent; SceneObjectGroup obj = (SceneObjectGroup)ent;
sceneObjects.Add(obj.LocalId, obj); sceneObjects.Add(obj.LocalId, obj);
} }
} }
// Find the root prim among the prim ids we've been given // Find the root prim among the prim ids we've been given
for (int i = 0; i < primIds.Count; i++) for (int i = 0; i < primIds.Count; i++)
{ {
if (sceneObjects.ContainsKey(primIds[i])) if (sceneObjects.ContainsKey(primIds[i]))
{ {
parenPrim = sceneObjects[primIds[i]]; parenPrim = sceneObjects[primIds[i]];
primIds.RemoveAt(i); primIds.RemoveAt(i);
break; break;
@ -892,9 +1113,29 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Verbose("SCENE", // If the first scan failed, we need to do a /deep/ scan of the linkages. This is /really/ slow
"DelinkObjects(): Could not find a root prim out of {0} as given to a delink request!", // We know that this is not the root prim now essentially, so we don't have to worry about remapping
primIds); // which one is the root prim
bool delinkedSomething = false;
for (int i = 0; i < primIds.Count; i++)
{
foreach (SceneObjectGroup grp in sceneObjects.Values)
{
SceneObjectPart gPart = grp.GetChildPart(primIds[i]);
if (gPart != null)
{
grp.DelinkFromGroup(primIds[i]);
delinkedSomething = true;
}
}
}
if (!delinkedSomething)
{
m_log.InfoFormat("[SCENE]: " +
"DelinkObjects(): Could not find a root prim out of {0} as given to a delink request!",
primIds);
}
} }
} }
@ -913,9 +1154,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (ent is SceneObjectGroup) if (ent is SceneObjectGroup)
{ {
if (((SceneObjectGroup) ent).LocalId == originalPrim) if (((SceneObjectGroup)ent).LocalId == originalPrim)
{ {
originPrim = (SceneObjectGroup) ent; originPrim = (SceneObjectGroup)ent;
break; break;
} }
} }
@ -927,18 +1168,23 @@ namespace OpenSim.Region.Environment.Scenes
{ {
SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID); SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
copy.AbsolutePosition = copy.AbsolutePosition + offset; copy.AbsolutePosition = copy.AbsolutePosition + offset;
copy.ResetIDs();
lock (Entities) lock (Entities)
{ {
Entities.Add(copy.UUID, copy); Entities.Add(copy.UUID, copy);
} }
m_numPrim++; m_numPrim++;
copy.StartScripts();
copy.ScheduleGroupForFullUpdate(); copy.ScheduleGroupForFullUpdate();
m_parentScene.EventManager.TriggerOnAddEntity(copy.RootPart.LocalID); // rex, added m_parentScene.EventManager.TriggerOnAddEntity(copy.RootPart.LocalID); // rex, added
} }
} }
else else
{ {
MainLog.Instance.Warn("client", "Attempted to duplicate nonexistant prim"); m_log.WarnFormat("[SCENE]: Attempted to duplicate nonexistant prim id {0}", GroupID);
} }
} }
@ -955,7 +1201,7 @@ namespace OpenSim.Region.Environment.Scenes
return return
(float) (float)
Math.Sqrt((v1.x - v2.x)*(v1.x - v2.x) + (v1.y - v2.y)*(v1.y - v2.y) + (v1.z - v2.z)*(v1.z - v2.z)); Math.Sqrt((v1.x - v2.x) * (v1.x - v2.x) + (v1.y - v2.y) * (v1.y - v2.y) + (v1.z - v2.z) * (v1.z - v2.z));
} }
#endregion #endregion

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@ -26,6 +26,7 @@
* *
*/ */
using System;
using System.Collections.Generic; using System.Collections.Generic;
using libsecondlife; using libsecondlife;
using libsecondlife.Packets; using libsecondlife.Packets;
@ -34,17 +35,25 @@ using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using System; using System;
using Axiom.Math; using Axiom.Math;
using System.IO;
using System.Text;
using System.Xml;
using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.Scenes namespace OpenSim.Region.Environment.Scenes
{ {
public partial class Scene public partial class Scene
{ {
private static readonly log4net.ILog m_log
= log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary> /// <summary>
/// Start all the scripts in the scene which should be started. /// Start all the scripts in the scene which should be started.
/// </summary> /// </summary>
public void StartScripts() public void StartScripts()
{ {
MainLog.Instance.Verbose("PRIMINVENTORY", "Starting scripts in scene"); m_log.Info("[PRIM INVENTORY]: Starting scripts in scene");
foreach (SceneObjectGroup group in Entities.Values) foreach (SceneObjectGroup group in Entities.Values)
{ {
@ -60,7 +69,9 @@ namespace OpenSim.Region.Environment.Scenes
/// in which the item is to be placed.</param> /// in which the item is to be placed.</param>
public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
userInfo.AddItem(remoteClient.AgentId, item); userInfo.AddItem(remoteClient.AgentId, item);
@ -80,8 +91,8 @@ namespace OpenSim.Region.Environment.Scenes
if (!TryGetAvatar(avatarId, out avatar)) if (!TryGetAvatar(avatarId, out avatar))
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"AGENTINVENTORY", "Could not find avatar {0} to add inventory item", avatarId); "[AGENT INVENTORY]: Could not find avatar {0} to add inventory item", avatarId);
return; return;
} }
@ -167,8 +178,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"AGENTINVENTORY", "[AGENT INVENTORY]: " +
"Avatar {0} cannot be found to update its inventory item asset", "Avatar {0} cannot be found to update its inventory item asset",
avatarId); avatarId);
} }
@ -184,27 +195,46 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="primID">The prim which contains the item to update</param> /// <param name="primID">The prim which contains the item to update</param>
/// <param name="isScriptRunning">Indicates whether the script to update is currently running</param> /// <param name="isScriptRunning">Indicates whether the script to update is currently running</param>
/// <param name="data"></param> /// <param name="data"></param>
/// <returns>Asset LLUID created</returns>
public void CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, LLUUID itemId, public void CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, LLUUID itemId,
LLUUID primId, bool isScriptRunning, byte[] data) LLUUID primId, bool isScriptRunning, byte[] data)
{ {
// TODO Not currently doing anything with the isScriptRunning bool // Retrieve group
SceneObjectPart part = GetSceneObjectPart(primId);
SceneObjectGroup group = part.ParentGroup;
if (null == group)
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist",
itemId, primId);
MainLog.Instance.Verbose( return;
"PRIMINVENTORY", }
"Prim inventory script save functionality not yet implemented."
+ " remoteClient: {0}, itemID: {1}, primID: {2}, isScriptRunning: {3}",
remoteClient, itemId, primId, isScriptRunning);
// TODO
// Retrieve client LLUID
// Retrieve sog containing primID
// Retrieve item // Retrieve item
// Create new asset and add to cache TaskInventoryItem item = group.GetInventoryItem(part.LocalID, itemId);
if (null == item)
{
return;
}
// Create new asset
// XXX Hardcoding the numbers is a temporary measure - need an enumeration for this
// There may well be one in libsecondlife
AssetBase asset = CreateAsset(item.Name, item.Description, 10, 10, data);
AssetCache.AddAsset(asset);
// Update item with new asset // Update item with new asset
// Trigger SOG update (see RezScript) item.AssetID = asset.FullID;
group.UpdateInventoryItem(item);
group.GetProperties(remoteClient);
// Trigger rerunning of script (use TriggerRezScript event, see RezScript) // Trigger rerunning of script (use TriggerRezScript event, see RezScript)
// return new asset id if (isScriptRunning)
{
group.StopScript(part.LocalID, item.ItemID);
group.StartScript(part.LocalID, item.ItemID);
}
} }
/// <summary> /// <summary>
@ -222,8 +252,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to update its prim item asset", "Avatar {0} cannot be found to update its prim item asset",
avatarId); avatarId);
} }
@ -250,6 +280,7 @@ namespace OpenSim.Region.Environment.Scenes
if (userInfo != null && userInfo.RootFolder != null) if (userInfo != null && userInfo.RootFolder != null)
{ {
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null) if (item != null)
{ {
if (LLUUID.Zero == transactionID) if (LLUUID.Zero == transactionID)
@ -262,48 +293,24 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
AgentAssetTransactions transactions IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
= CommsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); if (agentTransactions != null)
if (transactions != null)
{ {
LLUUID assetID = LLUUID.Combine(transactionID, remoteClient.SecureSessionId); agentTransactions.HandleItemUpdateFromTransaction(
AssetBase asset remoteClient, transactionID, item);
= AssetCache.GetAsset(
assetID, (item.assetType == (int) AssetType.Texture ? true : false));
if (asset == null)
{
asset = transactions.GetTransactionAsset(transactionID);
}
if (asset != null && asset.FullID == assetID)
{
asset.Name = item.inventoryName;
asset.Description = item.inventoryDescription;
asset.InvType = (sbyte) item.invType;
asset.Type = (sbyte) item.assetType;
item.assetID = asset.FullID;
AssetCache.AddAsset(asset);
}
userInfo.UpdateItem(remoteClient.AgentId, item);
} }
} }
} }
else else
{ {
MainLog.Instance.Warn( m_log.Error(
"AGENTINVENTORY", "[AGENTINVENTORY]: Item ID " + itemID + " not found for an inventory item update.");
"Item ID " + itemID + " not found for an inventory item update.");
} }
} }
else else
{ {
MainLog.Instance.Warn( m_log.Error(
"AGENTINVENTORY", "[AGENT INVENTORY]: Agent ID " + remoteClient.AgentId + " not found for an inventory item update.");
"Agent ID " + remoteClient.AgentId + " not found for an inventory item update.");
} }
} }
@ -316,7 +323,7 @@ namespace OpenSim.Region.Environment.Scenes
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(oldAgentID); CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(oldAgentID);
if (userInfo == null) if (userInfo == null)
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find user " + oldAgentID.ToString()); m_log.Error("[AGENT INVENTORY]: Failed to find user " + oldAgentID.ToString());
return; return;
} }
@ -325,29 +332,33 @@ namespace OpenSim.Region.Environment.Scenes
item = userInfo.RootFolder.HasItem(oldItemID); item = userInfo.RootFolder.HasItem(oldItemID);
if (item == null) if (item == null)
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + oldItemID.ToString()); m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
return; return;
} }
} }
else else
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + oldItemID.ToString()); m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
return; return;
} }
} }
AssetBase asset
= AssetCache.GetAsset(
item.assetID, (item.assetType == (int)AssetType.Texture ? true : false));
AssetBase asset = AssetCache.CopyAsset(item.assetID); if (asset != null)
if (asset == null)
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find asset " + item.assetID.ToString()); // TODO: preserve current permissions?
return; CreateNewInventoryItem(
remoteClient, newFolderID, callbackID, asset, item.inventoryNextPermissions);
}
else
{
m_log.ErrorFormat(
"[AGENT INVENTORY]: Could not copy item {0} since asset {1} could not be found",
item.inventoryName, item.assetID);
} }
asset.Name = (newName.Length == 0) ? item.inventoryName : newName;
// TODO: preserve current permissions?
CreateNewInventoryItem(remoteClient, newFolderID, callbackID, asset, item.inventoryNextPermissions);
} }
private AssetBase CreateAsset(string name, string description, sbyte invType, sbyte assetType, byte[] data) private AssetBase CreateAsset(string name, string description, sbyte invType, sbyte assetType, byte[] data)
@ -389,14 +400,14 @@ namespace OpenSim.Region.Environment.Scenes
public void MoveInventoryItem(IClientAPI remoteClient, LLUUID folderID, LLUUID itemID, int length, public void MoveInventoryItem(IClientAPI remoteClient, LLUUID folderID, LLUUID itemID, int length,
string newName) string newName)
{ {
MainLog.Instance.Verbose( m_log.Info(
"AGENTINVENTORY", "[AGENT INVENTORY]: " +
"Moving item for " + remoteClient.AgentId.ToString()); "Moving item for " + remoteClient.AgentId.ToString());
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo == null) if (userInfo == null)
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find user " + remoteClient.AgentId.ToString()); m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
return; return;
} }
@ -405,7 +416,7 @@ namespace OpenSim.Region.Environment.Scenes
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null) if (item != null)
{ {
if (newName != "") if (newName != System.String.Empty)
{ {
item.inventoryName = newName; item.inventoryName = newName;
} }
@ -417,21 +428,31 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + itemID.ToString()); m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString());
return; return;
} }
} }
else else
{ {
MainLog.Instance.Warn("AGENTINVENTORY", "Failed to find item " + itemID.ToString() + ", no root folder"); m_log.Error("[AGENT INVENTORY]: Failed to find item " + itemID.ToString() + ", no root folder");
return; return;
} }
} }
/// <summary>
/// Create a new inventory item.
/// </summary>
/// <param name="remoteClient"></param>
/// <param name="folderID"></param>
/// <param name="callbackID"></param>
/// <param name="asset"></param>
/// <param name="nextOwnerMask"></param>
private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID, private void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID folderID, uint callbackID,
AssetBase asset, uint nextOwnerMask) AssetBase asset, uint nextOwnerMask)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
InventoryItemBase item = new InventoryItemBase(); InventoryItemBase item = new InventoryItemBase();
@ -450,13 +471,19 @@ namespace OpenSim.Region.Environment.Scenes
userInfo.AddItem(remoteClient.AgentId, item); userInfo.AddItem(remoteClient.AgentId, item);
remoteClient.SendInventoryItemCreateUpdate(item); remoteClient.SendInventoryItemCreateUpdate(item);
} }
else
{
m_log.WarnFormat(
"No user details associated with client {0} uuid {1} in CreateNewInventoryItem!",
remoteClient.Name, remoteClient.AgentId);
}
} }
/// <summary> /// <summary>
/// temporary method to test out creating new inventory items /// Create a new inventory item.
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
/// <param name="transActionID"></param> /// <param name="transactionID"></param>
/// <param name="folderID"></param> /// <param name="folderID"></param>
/// <param name="callbackID"></param> /// <param name="callbackID"></param>
/// <param name="description"></param> /// <param name="description"></param>
@ -465,14 +492,16 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="type"></param> /// <param name="type"></param>
/// <param name="wearableType"></param> /// <param name="wearableType"></param>
/// <param name="nextOwnerMask"></param> /// <param name="nextOwnerMask"></param>
public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transactionID, LLUUID folderID,
uint callbackID, string description, string name, sbyte invType, uint callbackID, string description, string name, sbyte invType,
sbyte assetType, sbyte assetType,
byte wearableType, uint nextOwnerMask) byte wearableType, uint nextOwnerMask)
{ {
if (transActionID == LLUUID.Zero) if (transactionID == LLUUID.Zero)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId); CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null) if (userInfo != null)
{ {
AssetBase asset = CreateAsset(name, description, invType, assetType, null); AssetBase asset = CreateAsset(name, description, invType, assetType, null);
@ -480,13 +509,69 @@ namespace OpenSim.Region.Environment.Scenes
CreateNewInventoryItem(remoteClient, folderID, callbackID, asset, nextOwnerMask); CreateNewInventoryItem(remoteClient, folderID, callbackID, asset, nextOwnerMask);
} }
else
{
m_log.ErrorFormat(
"userInfo for agent uuid {0} unexpectedly null in CreateNewInventoryItem",
remoteClient.AgentId);
}
} }
else else
{ {
CommsManager.TransactionsManager.HandleInventoryFromTransaction(remoteClient, transActionID, folderID, IAgentAssetTransactions agentTransactions = this.RequestModuleInterface<IAgentAssetTransactions>();
callbackID, description, name, invType, if (agentTransactions != null)
assetType, wearableType, nextOwnerMask); {
//System.Console.WriteLine("request to create inventory item from transaction " + transActionID); agentTransactions.HandleItemCreationFromTransaction(
remoteClient, transactionID, folderID, callbackID, description,
name, invType, assetType, wearableType, nextOwnerMask);
}
}
}
private void RemoveInventoryItem(IClientAPI remoteClient, LLUUID itemID)
{
CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo == null)
{
m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
return;
}
// is going through the root folder really the best way?
// this triggers a tree walk to find and remove the item. 8-(
// since this only happens in Trash (in theory) shouldn't we grab
// the trash folder directly instead of RootFolder?
if (userInfo.RootFolder != null)
{
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
if (item != null)
{
userInfo.DeleteItem(remoteClient.AgentId, item);
}
}
}
private void RemoveInventoryFolder(IClientAPI remoteClient, LLUUID folderID)
{
CachedUserInfo userInfo
= CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo == null)
{
m_log.Error("[AGENT INVENTORY]: Failed to find user " + remoteClient.AgentId.ToString());
return;
}
if (userInfo.RootFolder != null)
{
InventoryItemBase folder = userInfo.RootFolder.HasItem(folderID);
if (folder != null)
{
// doesn't work just yet, commented out. will fix in next patch.
// userInfo.DeleteItem(remoteClient.AgentId, folder);
}
} }
} }
@ -526,15 +611,16 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Warn( m_log.ErrorFormat(
"PRIMINVENTORY", "Inventory requested of prim {0} which doesn't exist", primLocalID); "[PRIM INVENTORY]: Inventory requested of prim {0} which doesn't exist", primLocalID);
} }
} }
/// <summary> /// <summary>
/// Remove an item from a prim (task) inventory /// Remove an item from a prim (task) inventory
/// </summary> /// </summary>
/// <param name="remoteClient"></param> /// <param name="remoteClient">Unused at the moment but retained since the avatar ID might
/// be necessary for a permissions check at some stage.</param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
/// <param name="localID"></param> /// <param name="localID"></param>
public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID) public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID)
@ -542,8 +628,8 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup group = GetGroupByPrim(localID); SceneObjectGroup group = GetGroupByPrim(localID);
if (group != null) if (group != null)
{ {
int type = group.RemoveInventoryItem(remoteClient, localID, itemID); int type = group.RemoveInventoryItem(localID, itemID);
group.GetProperites(remoteClient); group.GetProperties(remoteClient);
if (type == 10) if (type == 10)
{ {
EventManager.TriggerRemoveScript(localID, itemID); EventManager.TriggerRemoveScript(localID, itemID);
@ -551,8 +637,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Warn( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIM INVENTORY]: " +
"Removal of item {0} requested of prim {1} but this prim does not exist", "Removal of item {0} requested of prim {1} but this prim does not exist",
itemID, itemID,
localID); localID);
@ -575,16 +661,17 @@ namespace OpenSim.Region.Environment.Scenes
{ {
// TODO Retrieve itemID from client's inventory to pass on // TODO Retrieve itemID from client's inventory to pass on
//group.AddInventoryItem(remoteClient, primLocalID, null); //group.AddInventoryItem(remoteClient, primLocalID, null);
MainLog.Instance.Verbose( m_log.InfoFormat(
"PRIMINVENTORY", "[PRIM INVENTORY]: " +
"UpdateTaskInventory called with script {0}, folder {1}, primLocalID {2}, user {3}", "Non script prim inventory not yet implemented!"
+ "\nUpdateTaskInventory called with item {0}, folder {1}, primLocalID {2}, user {3}",
itemID, folderID, primLocalID, remoteClient.Name); itemID, folderID, primLocalID, remoteClient.Name);
} }
else else
{ {
MainLog.Instance.Warn( m_log.WarnFormat(
"PRIMINVENTORY", "[PRIM INVENTORY]: " +
"Update with script {0} requested of prim {1} for {2} but this prim does not exist", "Update with item {0} requested of prim {1} for {2} but this prim does not exist",
itemID, primLocalID, remoteClient.Name); itemID, primLocalID, remoteClient.Name);
} }
} }
@ -597,13 +684,23 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="localID"></param> /// <param name="localID"></param>
public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID) public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID)
{ {
CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
LLUUID copyID = LLUUID.Random(); LLUUID copyID = LLUUID.Random();
if (userInfo != null)
if (itemID != LLUUID.Zero)
{ {
if (userInfo.RootFolder != null) CachedUserInfo userInfo = CommsManager.UserProfileCacheService.GetUserDetails(remoteClient.AgentId);
if (userInfo != null && userInfo.RootFolder != null)
{ {
InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
// Try library
// XXX clumsy, possibly should be one call
if (null == item)
{
item = CommsManager.UserProfileCacheService.libraryRoot.HasItem(itemID);
}
if (item != null) if (item != null)
{ {
SceneObjectGroup group = GetGroupByPrim(localID); SceneObjectGroup group = GetGroupByPrim(localID);
@ -611,17 +708,16 @@ namespace OpenSim.Region.Environment.Scenes
{ {
group.AddInventoryItem(remoteClient, localID, item, copyID); group.AddInventoryItem(remoteClient, localID, item, copyID);
group.StartScript(localID, copyID); group.StartScript(localID, copyID);
group.GetProperites(remoteClient); group.GetProperties(remoteClient);
MainLog.Instance.Verbose( // m_log.InfoFormat("[PRIMINVENTORY]: " +
"PRIMINVENTORY", // "Rezzed script {0} into prim local ID {1} for user {2}",
"Rezzed script {0} into prim local ID {1} for user {2}", // item.inventoryName, localID, remoteClient.Name);
item.inventoryName, localID, remoteClient.Name);
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIM INVENTORY]: " +
"Could not rez script {0} into prim local ID {1} for user {2}" "Could not rez script {0} into prim local ID {1} for user {2}"
+ " because the prim could not be found in the region!", + " because the prim could not be found in the region!",
item.inventoryName, localID, remoteClient.Name); item.inventoryName, localID, remoteClient.Name);
@ -629,12 +725,20 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "Could not find script inventory item {0} to rez for {1}!", "[PRIM INVENTORY]: Could not find script inventory item {0} to rez for {1}!",
itemID, remoteClient.Name); itemID, remoteClient.Name);
} }
} }
} }
else // If the itemID is zero then the script has been rezzed directly in an object's inventory
{
// not yet implemented
// TODO Need to get more details from original RezScript packet
// XXX jc tmp
// AssetBase asset = CreateAsset("chimney sweep", "sailor.lsl", 10, 10, null);
// AssetCache.AddAsset(asset);
}
} }
/// <summary> /// <summary>
@ -655,7 +759,7 @@ namespace OpenSim.Region.Environment.Scenes
foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData)
{ {
EntityBase selectedEnt = null; EntityBase selectedEnt = null;
//MainLog.Instance.Verbose("CLIENT", "LocalID:" + Data.ObjectLocalID.ToString()); //m_log.Info("[CLIENT]: LocalID:" + Data.ObjectLocalID.ToString());
List<EntityBase> EntitieList = GetEntities(); List<EntityBase> EntitieList = GetEntities();
@ -776,6 +880,12 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public void RezSingleAttachment(IClientAPI remoteClient, LLUUID itemID, uint AttachmentPt,
uint ItemFlags, uint NextOwnerMask)
{
System.Console.WriteLine("RezSingleAttachment: unimplemented yet");
}
protected void ObjectAttach(IClientAPI remoteClient, uint localID, LLQuaternion rotation, byte attachPoint) protected void ObjectAttach(IClientAPI remoteClient, uint localID, LLQuaternion rotation, byte attachPoint)
{ {
System.Console.WriteLine("Attaching object " + localID + " to " + attachPoint); System.Console.WriteLine("Attaching object " + localID + " to " + attachPoint);
@ -860,11 +970,14 @@ namespace OpenSim.Region.Environment.Scenes
private void AddRezObject(string xmlData, LLVector3 pos) private void AddRezObject(string xmlData, LLVector3 pos)
{ {
SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData); SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
group.GenerateNewIDs(); group.ResetIDs();
AddEntity(group); AddEntity(group);
group.AbsolutePosition = pos; group.AbsolutePosition = pos;
SceneObjectPart rootPart = group.GetChildPart(group.UUID); SceneObjectPart rootPart = group.GetChildPart(group.UUID);
rootPart.ApplySanePermissions(); rootPart.TrimPermissions();
group.ApplyPhysics(m_physicalPrim);
group.StartScripts();
//bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim); //bool UsePhysics = (((rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) > 0)&& m_physicalPrim);
//if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) //if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
//{ //{
@ -881,6 +994,7 @@ namespace OpenSim.Region.Environment.Scenes
// rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); // rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
// } // }
//
rootPart.ScheduleFullUpdate(); rootPart.ScheduleFullUpdate();
} }
} }

View File

@ -106,7 +106,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (((SceneObjectGroup) ent).LocalId == primLocalID) if (((SceneObjectGroup) ent).LocalId == primLocalID)
{ {
((SceneObjectGroup) ent).GetProperites(remoteClient); ((SceneObjectGroup) ent).GetProperties(remoteClient);
((SceneObjectGroup) ent).IsSelected = true; ((SceneObjectGroup) ent).IsSelected = true;
LandManager.setPrimsTainted(); LandManager.setPrimsTainted();
break; break;
@ -138,9 +138,16 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public virtual void ProcessMoneyTransferRequest(LLUUID source, LLUUID destination, int amount, int transactiontype, string description)
{
EventManager.MoneyTransferArgs args = new EventManager.MoneyTransferArgs(
source, destination, amount, transactiontype, description);
EventManager.TriggerMoneyTransfer(this, args);
}
public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) public virtual void ProcessObjectGrab(uint localID, LLVector3 offsetPos, IClientAPI remoteClient)
{ {
EventManager.TriggerObjectGrab(localID, offsetPos, remoteClient);
List<EntityBase> EntitieList = GetEntities(); List<EntityBase> EntitieList = GetEntities();
@ -150,9 +157,21 @@ namespace OpenSim.Region.Environment.Scenes
{ {
SceneObjectGroup obj = ent as SceneObjectGroup; SceneObjectGroup obj = ent as SceneObjectGroup;
// Is this prim part of the group
if (obj.HasChildPrim(localID)) if (obj.HasChildPrim(localID))
{ {
// Currently only grab/touch for the single prim
// the client handles rez correctly
obj.ObjectGrabHandler(localID, offsetPos, remoteClient); obj.ObjectGrabHandler(localID, offsetPos, remoteClient);
// trigger event, one for each prim part in the group
// so that a touch to a non-root prim in a group will still
// trigger a touch_start for a script in the root prim
foreach (SceneObjectPart part in obj.Children.Values)
{
EventManager.TriggerObjectGrab(part.LocalID, part.OffsetPosition, remoteClient);
}
return; return;
} }
} }
@ -164,7 +183,7 @@ namespace OpenSim.Region.Environment.Scenes
//EventManager.TriggerAvatarPickerRequest(); //EventManager.TriggerAvatarPickerRequest();
List<AvatarPickerAvatar> AvatarResponses = new List<AvatarPickerAvatar>(); List<AvatarPickerAvatar> AvatarResponses = new List<AvatarPickerAvatar>();
AvatarResponses = CommsManager.GenerateAgentPickerRequestResponse(RequestID, query); AvatarResponses = m_sceneGridService.GenerateAgentPickerRequestResponse(RequestID, query);
AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply); AvatarPickerReplyPacket replyPacket = (AvatarPickerReplyPacket) PacketPool.Instance.GetPacket(PacketType.AvatarPickerReply);
// TODO: don't create new blocks if recycling an old packet // TODO: don't create new blocks if recycling an old packet
@ -176,7 +195,7 @@ namespace OpenSim.Region.Environment.Scenes
agentData.AgentID = avatarID; agentData.AgentID = avatarID;
agentData.QueryID = RequestID; agentData.QueryID = RequestID;
replyPacket.AgentData = agentData; replyPacket.AgentData = agentData;
byte[] bytes = new byte[AvatarResponses.Count*32]; //byte[] bytes = new byte[AvatarResponses.Count*32];
int i = 0; int i = 0;
foreach (AvatarPickerAvatar item in AvatarResponses) foreach (AvatarPickerAvatar item in AvatarResponses)

View File

@ -31,11 +31,14 @@ using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Terrain; using OpenSim.Region.Terrain;
using OpenSim.Region.Environment.Interfaces;
namespace OpenSim.Region.Environment.Scenes namespace OpenSim.Region.Environment.Scenes
{ {
public abstract class SceneBase : IScene public abstract class SceneBase : IScene
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#region Events #region Events
public event restart OnRestart; public event restart OnRestart;
@ -56,6 +59,7 @@ namespace OpenSim.Region.Environment.Scenes
protected RegionInfo m_regInfo; protected RegionInfo m_regInfo;
public TerrainEngine Terrain; public TerrainEngine Terrain;
public ITerrainChannel Heightmap;
protected EventManager m_eventManager; protected EventManager m_eventManager;
@ -164,8 +168,10 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="seconds"></param> /// <param name="seconds"></param>
public virtual void Restart(int seconds) public virtual void Restart(int seconds)
{ {
MainLog.Instance.Error("REGION", "passing Restart Message up the namespace"); m_log.Error("[REGION]: passing Restart Message up the namespace");
OnRestart(RegionInfo); restart handler001 = OnRestart;
if (handler001 != null)
handler001(RegionInfo);
} }
public virtual bool PresenceChildStatus(LLUUID avatarID) public virtual bool PresenceChildStatus(LLUUID avatarID)
@ -174,6 +180,11 @@ namespace OpenSim.Region.Environment.Scenes
} }
public abstract bool OtherRegionUp(RegionInfo thisRegion); public abstract bool OtherRegionUp(RegionInfo thisRegion);
public virtual string GetSimulatorVersion()
{
return "OpenSimulator v0.5 SVN";
}
#endregion #endregion
#region Shutdown #region Shutdown
@ -189,7 +200,7 @@ namespace OpenSim.Region.Environment.Scenes
} }
catch (Exception e) catch (Exception e)
{ {
MainLog.Instance.Error("SCENE", "SceneBase.cs: Close() - Failed with exception " + e.ToString()); m_log.Error("[SCENE]: SceneBase.cs: Close() - Failed with exception " + e.ToString());
} }
} }

View File

@ -38,8 +38,12 @@ namespace OpenSim.Region.Environment.Scenes
{ {
public delegate void KillObjectDelegate(uint localID); public delegate void KillObjectDelegate(uint localID);
public delegate void RemoveKnownRegionsFromAvatarList(LLUUID avatarID, List<ulong> regionlst);
public class SceneCommunicationService //one instance per region public class SceneCommunicationService //one instance per region
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected CommunicationsManager m_commsProvider; protected CommunicationsManager m_commsProvider;
protected RegionInfo m_regionInfo; protected RegionInfo m_regionInfo;
@ -47,14 +51,24 @@ namespace OpenSim.Region.Environment.Scenes
public event AgentCrossing OnAvatarCrossingIntoRegion; public event AgentCrossing OnAvatarCrossingIntoRegion;
public event ExpectUserDelegate OnExpectUser; public event ExpectUserDelegate OnExpectUser;
public event ExpectPrimDelegate OnExpectPrim;
public event CloseAgentConnection OnCloseAgentConnection; public event CloseAgentConnection OnCloseAgentConnection;
public event PrimCrossing OnPrimCrossingIntoRegion; public event PrimCrossing OnPrimCrossingIntoRegion;
public event RegionUp OnRegionUp; public event RegionUp OnRegionUp;
public event ChildAgentUpdate OnChildAgentUpdate; public event ChildAgentUpdate OnChildAgentUpdate;
public event RemoveKnownRegionsFromAvatarList OnRemoveKnownRegionFromAvatar;
private AgentCrossing handler001 = null; // OnAvatarCrossingIntoRegion;
private ExpectUserDelegate handler002 = null; // OnExpectUser;
private ExpectPrimDelegate handler003 = null; // OnExpectPrim;
private CloseAgentConnection handler004 = null; // OnCloseAgentConnection;
private PrimCrossing handler005 = null; // OnPrimCrossingIntoRegion;
private RegionUp handler006 = null; // OnRegionUp;
private ChildAgentUpdate handler007 = null; // OnChildAgentUpdate;
private RemoveKnownRegionsFromAvatarList handler008 = null; // OnRemoveKnownRegionFromAvatar;
public KillObjectDelegate KillObject; public KillObjectDelegate KillObject;
public string _debugRegionName = ""; public string _debugRegionName = String.Empty;
public string debugRegionName public string debugRegionName
{ {
@ -76,20 +90,20 @@ namespace OpenSim.Region.Environment.Scenes
if (regionCommsHost != null) if (regionCommsHost != null)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString()); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString());
regionCommsHost.debugRegionName = _debugRegionName; regionCommsHost.debugRegionName = _debugRegionName;
regionCommsHost.OnExpectPrim += IncomingPrimCrossing;
regionCommsHost.OnExpectUser += NewUserConnection; regionCommsHost.OnExpectUser += NewUserConnection;
regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing; regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing;
regionCommsHost.OnPrimCrossingIntoRegion += PrimCrossing;
regionCommsHost.OnCloseAgentConnection += CloseConnection; regionCommsHost.OnCloseAgentConnection += CloseConnection;
regionCommsHost.OnRegionUp += newRegionUp; regionCommsHost.OnRegionUp += newRegionUp;
regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate; regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate;
} }
else else
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: registered with gridservice and got null"); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: registered with gridservice and got null");
} }
} }
@ -100,8 +114,8 @@ namespace OpenSim.Region.Environment.Scenes
regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate; regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate;
regionCommsHost.OnRegionUp -= newRegionUp; regionCommsHost.OnRegionUp -= newRegionUp;
regionCommsHost.OnExpectUser -= NewUserConnection; regionCommsHost.OnExpectUser -= NewUserConnection;
regionCommsHost.OnExpectPrim -= IncomingPrimCrossing;
regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing; regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing;
regionCommsHost.OnPrimCrossingIntoRegion -= PrimCrossing;
regionCommsHost.OnCloseAgentConnection -= CloseConnection; regionCommsHost.OnCloseAgentConnection -= CloseConnection;
m_commsProvider.GridService.DeregisterRegion(m_regionInfo); m_commsProvider.GridService.DeregisterRegion(m_regionInfo);
regionCommsHost = null; regionCommsHost = null;
@ -118,27 +132,30 @@ namespace OpenSim.Region.Environment.Scenes
/// ///
protected void NewUserConnection(ulong regionHandle, AgentCircuitData agent) protected void NewUserConnection(ulong regionHandle, AgentCircuitData agent)
{ {
if (OnExpectUser != null) handler002 = OnExpectUser;
if (handler002 != null)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: OnExpectUser Fired for User:" + agent.firstname + " " + agent.lastname);
OnExpectUser(regionHandle, agent); handler002(regionHandle, agent);
} }
} }
protected bool newRegionUp(RegionInfo region) protected bool newRegionUp(RegionInfo region)
{ {
if (OnRegionUp != null) handler006 = OnRegionUp;
if (handler006 != null)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: newRegionUp Fired for User:" + region.RegionName); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: newRegionUp Fired for User:" + region.RegionName);
OnRegionUp(region); handler006(region);
} }
return true; return true;
} }
protected bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) protected bool ChildAgentUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData)
{ {
if (OnChildAgentUpdate != null) handler007 = OnChildAgentUpdate;
OnChildAgentUpdate(regionHandle, cAgentData); if (handler007 != null)
handler007(regionHandle, cAgentData);
return true; return true;
@ -146,26 +163,41 @@ namespace OpenSim.Region.Environment.Scenes
protected void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying) protected void AgentCrossing(ulong regionHandle, LLUUID agentID, LLVector3 position, bool isFlying)
{ {
if (OnAvatarCrossingIntoRegion != null) handler001 = OnAvatarCrossingIntoRegion;
if (handler001 != null)
{ {
OnAvatarCrossingIntoRegion(regionHandle, agentID, position, isFlying); handler001(regionHandle, agentID, position, isFlying);
} }
} }
protected void IncomingPrimCrossing(ulong regionHandle, LLUUID primID, String objXMLData)
{
handler003 = OnExpectPrim;
if (handler003 != null)
{
handler003(regionHandle, primID, objXMLData);
}
}
protected void PrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical) protected void PrimCrossing(ulong regionHandle, LLUUID primID, LLVector3 position, bool isPhysical)
{ {
if (OnPrimCrossingIntoRegion != null) handler005 = OnPrimCrossingIntoRegion;
if (handler005 != null)
{ {
OnPrimCrossingIntoRegion(regionHandle, primID, position, isPhysical); handler005(regionHandle, primID, position, isPhysical);
} }
} }
protected void CloseConnection(ulong regionHandle, LLUUID agentID) protected bool CloseConnection(ulong regionHandle, LLUUID agentID)
{ {
if (OnCloseAgentConnection != null) m_log.Info("[INTERREGION]: Incoming Agent Close Request for agent: " + agentID.ToString());
handler004 = OnCloseAgentConnection;
if (handler004 != null)
{ {
OnCloseAgentConnection(regionHandle, agentID); return handler004(regionHandle, agentID);
} }
return false;
} }
#endregion #endregion
@ -194,14 +226,14 @@ namespace OpenSim.Region.Environment.Scenes
private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, ulong regionHandle, private void InformClientOfNeighbourAsync(ScenePresence avatar, AgentCircuitData a, ulong regionHandle,
IPEndPoint endPoint) IPEndPoint endPoint)
{ {
MainLog.Instance.Notice("INTERGRID", "Starting to inform client about neighbours"); m_log.Info("[INTERGRID]: Starting to inform client about neighbours");
bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, a); bool regionAccepted = m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, a);
if (regionAccepted) if (regionAccepted)
{ {
avatar.ControllingClient.InformClientOfNeighbour(regionHandle, endPoint); avatar.ControllingClient.InformClientOfNeighbour(regionHandle, endPoint);
avatar.AddNeighbourRegion(regionHandle); avatar.AddNeighbourRegion(regionHandle);
MainLog.Instance.Notice("INTERGRID", "Completed inform client about neighbours"); m_log.Info("[INTERGRID]: Completed inform client about neighbours");
} }
} }
@ -286,17 +318,17 @@ namespace OpenSim.Region.Environment.Scenes
private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle) private void InformNeighboursThatRegionIsUpAsync(RegionInfo region, ulong regionhandle)
{ {
MainLog.Instance.Notice("INTERGRID", "Starting to inform neighbors that I'm here"); m_log.Info("[INTERGRID]: Starting to inform neighbors that I'm here");
bool regionAccepted = bool regionAccepted =
m_commsProvider.InterRegion.RegionUp((new SearializableRegionInfo(region)), regionhandle); m_commsProvider.InterRegion.RegionUp((new SearializableRegionInfo(region)), regionhandle);
if (regionAccepted) if (regionAccepted)
{ {
MainLog.Instance.Notice("INTERGRID", "Completed informing neighbors that I'm here"); m_log.Info("[INTERGRID]: Completed informing neighbors that I'm here");
} }
else else
{ {
MainLog.Instance.Notice("INTERGRID", "Failed to inform neighbors that I'm here"); m_log.Info("[INTERGRID]: Failed to inform neighbors that I'm here");
} }
} }
@ -306,7 +338,7 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void InformNeighborsThatRegionisUp(RegionInfo region) public void InformNeighborsThatRegionisUp(RegionInfo region)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>(); List<SimpleRegionInfo> neighbours = new List<SimpleRegionInfo>();
@ -327,7 +359,7 @@ namespace OpenSim.Region.Environment.Scenes
//bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region)); //bool val = m_commsProvider.InterRegion.RegionUp(new SearializableRegionInfo(region));
} }
public delegate void SendChildAgentDataUpdateDelegate(ulong regionHandle, ChildAgentDataUpdate cAgentData); public delegate void SendChildAgentDataUpdateDelegate(ChildAgentDataUpdate cAgentData, ScenePresence presence);
/// <summary> /// <summary>
/// This informs all neighboring regions about the settings of it's child agent. /// This informs all neighboring regions about the settings of it's child agent.
@ -336,19 +368,30 @@ namespace OpenSim.Region.Environment.Scenes
/// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc. /// This contains information, such as, Draw Distance, Camera location, Current Position, Current throttle settings, etc.
/// ///
/// </summary> /// </summary>
private void SendChildAgentDataUpdateAsync(ulong regionHandle, ChildAgentDataUpdate cAgentData) private void SendChildAgentDataUpdateAsync(ChildAgentDataUpdate cAgentData, ScenePresence presence)
{ {
MainLog.Instance.Notice("INTERGRID", "Informing a neighbor about my agent."); //m_log.Info("[INTERGRID]: Informing neighbors about my agent.");
bool regionAccepted = m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData); try
{
foreach (ulong regionHandle in presence.KnownChildRegions)
{
bool regionAccepted = m_commsProvider.InterRegion.ChildAgentUpdate(regionHandle, cAgentData);
if (regionAccepted) if (regionAccepted)
{ {
MainLog.Instance.Notice("INTERGRID", "Completed sending a neighbor an update about my agent"); //m_log.Info("[INTERGRID]: Completed sending a neighbor an update about my agent");
}
else
{
//m_log.Info("[INTERGRID]: Failed sending a neighbor an update about my agent");
}
}
} }
else catch (System.InvalidOperationException)
{ {
MainLog.Instance.Notice("INTERGRID", "Failed sending a neighbor an update about my agent"); // We're ignoring a collection was modified error because this data gets old and outdated fast.
} }
} }
private void SendChildAgentDataUpdateCompleted(IAsyncResult iar) private void SendChildAgentDataUpdateCompleted(IAsyncResult iar)
@ -357,15 +400,64 @@ namespace OpenSim.Region.Environment.Scenes
icon.EndInvoke(iar); icon.EndInvoke(iar);
} }
public void SendChildAgentDataUpdate(ulong regionHandle, ChildAgentDataUpdate cAgentData) public void SendChildAgentDataUpdate(ChildAgentDataUpdate cAgentData, ScenePresence presence)
{ {
// This assumes that we know what our neighbors are. // This assumes that we know what our neighbors are.
SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync; SendChildAgentDataUpdateDelegate d = SendChildAgentDataUpdateAsync;
d.BeginInvoke(regionHandle, cAgentData, d.BeginInvoke(cAgentData,presence,
SendChildAgentDataUpdateCompleted, SendChildAgentDataUpdateCompleted,
d); d);
} }
public delegate void SendCloseChildAgentDelegate( LLUUID agentID, List<ulong> regionlst);
/// <summary>
/// This Closes child agents on neighboring regions
/// Calls an asynchronous method to do so.. so it doesn't lag the sim.
/// </summary>
private void SendCloseChildAgentAsync(LLUUID agentID, List<ulong> regionlst)
{
foreach (ulong regionHandle in regionlst)
{
bool regionAccepted = m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID);
if (regionAccepted)
{
m_log.Info("[INTERGRID]: Completed sending agent Close agent Request to neighbor");
}
else
{
m_log.Info("[INTERGRID]: Failed sending agent Close agent Request to neighbor");
}
}
// We remove the list of known regions from the agent's known region list through an event
// to scene, because, if an agent logged of, it's likely that there will be no scene presence
// by the time we get to this part of the method.
handler008 = OnRemoveKnownRegionFromAvatar;
if (handler008 != null)
{
handler008(agentID, regionlst);
}
}
private void SendCloseChildAgentCompleted(IAsyncResult iar)
{
SendCloseChildAgentDelegate icon = (SendCloseChildAgentDelegate)iar.AsyncState;
icon.EndInvoke(iar);
}
public void SendCloseChildAgentConnections(LLUUID agentID, List<ulong> regionslst)
{
// This assumes that we know what our neighbors are.
SendCloseChildAgentDelegate d = SendCloseChildAgentAsync;
d.BeginInvoke(agentID, regionslst,
SendCloseChildAgentCompleted,
d);
}
/// <summary> /// <summary>
/// Helper function to request neighbors from grid-comms /// Helper function to request neighbors from grid-comms
@ -374,7 +466,7 @@ namespace OpenSim.Region.Environment.Scenes
/// <returns></returns> /// <returns></returns>
public virtual RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle) public virtual RegionInfo RequestNeighbouringRegionInfo(ulong regionHandle)
{ {
//MainLog.Instance.Verbose("INTER", debugRegionName + ": SceneCommunicationService: Sending Grid Services Request about neighbor " + regionHandle.ToString()); //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending Grid Services Request about neighbor " + regionHandle.ToString());
return m_commsProvider.GridService.RequestNeighbourInfo(regionHandle); return m_commsProvider.GridService.RequestNeighbourInfo(regionHandle);
} }
@ -403,6 +495,7 @@ namespace OpenSim.Region.Environment.Scenes
public virtual void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, LLVector3 position, public virtual void RequestTeleportToLocation(ScenePresence avatar, ulong regionHandle, LLVector3 position,
LLVector3 lookAt, uint flags) LLVector3 lookAt, uint flags)
{ {
bool destRegionUp = false;
if (regionHandle == m_regionInfo.RegionHandle) if (regionHandle == m_regionInfo.RegionHandle)
{ {
avatar.ControllingClient.SendTeleportLocationStart(); avatar.ControllingClient.SendTeleportLocationStart();
@ -420,26 +513,45 @@ namespace OpenSim.Region.Environment.Scenes
agent.InventoryFolder = LLUUID.Zero; agent.InventoryFolder = LLUUID.Zero;
agent.startpos = position; agent.startpos = position;
agent.child = true; agent.child = true;
avatar.Close();
m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent); if (reg.RemotingAddress != "" && reg.RemotingPort != 0)
m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId,
position, false);
AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo();
string capsPath = Util.GetCapsURL(avatar.ControllingClient.AgentId);
avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
capsPath);
avatar.MakeChildAgent();
if (KillObject != null)
{ {
KillObject(avatar.LocalId); // region is remote. see if it is up
m_commsProvider.InterRegion.CheckRegion(reg.RemotingAddress, reg.RemotingPort);
destRegionUp = m_commsProvider.InterRegion.Available;
} }
uint newRegionX = (uint) (regionHandle >> 40); else
uint newRegionY = (((uint) (regionHandle)) >> 8);
uint oldRegionX = (uint) (m_regionInfo.RegionHandle >> 40);
uint oldRegionY = (((uint) (m_regionInfo.RegionHandle)) >> 8);
if (Util.fast_distance2d((int) (newRegionX - oldRegionX), (int) (newRegionY - oldRegionY)) > 3)
{ {
CloseChildAgentConnections(avatar); // assume local regions are always up
destRegionUp = true;
}
if(destRegionUp)
{
avatar.Close();
m_commsProvider.InterRegion.InformRegionOfChildAgent(regionHandle, agent);
m_commsProvider.InterRegion.ExpectAvatarCrossing(regionHandle, avatar.ControllingClient.AgentId,
position, false);
AgentCircuitData circuitdata = avatar.ControllingClient.RequestClientInfo();
string capsPath = Util.GetCapsURL(avatar.ControllingClient.AgentId);
avatar.ControllingClient.SendRegionTeleport(regionHandle, 13, reg.ExternalEndPoint, 4, (1 << 4),
capsPath);
avatar.MakeChildAgent();
if (KillObject != null)
{
KillObject(avatar.LocalId);
}
uint newRegionX = (uint)(regionHandle >> 40);
uint newRegionY = (((uint)(regionHandle)) >> 8);
uint oldRegionX = (uint)(m_regionInfo.RegionHandle >> 40);
uint oldRegionY = (((uint)(m_regionInfo.RegionHandle)) >> 8);
if (Util.fast_distance2d((int)(newRegionX - oldRegionX), (int)(newRegionY - oldRegionY)) > 3)
{
SendCloseChildAgentConnections(avatar.UUID,avatar.GetKnownRegionList());
}
}
else
{
avatar.ControllingClient.SendTeleportFailed("Remote Region appears to be down");
} }
} }
} }
@ -456,24 +568,55 @@ namespace OpenSim.Region.Environment.Scenes
return m_commsProvider.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position, isFlying); return m_commsProvider.InterRegion.ExpectAvatarCrossing(regionhandle, agentID, position, isFlying);
} }
public bool PrimCrossToNeighboringRegion(ulong regionhandle, LLUUID primID, LLVector3 position, bool isPhysical) public bool PrimCrossToNeighboringRegion(ulong regionhandle, LLUUID primID, string objData)
{ {
return m_commsProvider.InterRegion.ExpectPrimCrossing(regionhandle, primID, position, isPhysical); return m_commsProvider.InterRegion.InformRegionOfPrimCrossing(regionhandle, primID, objData);
} }
public void CloseChildAgentConnections(ScenePresence presence)
{
foreach (ulong regionHandle in presence.KnownChildRegions)
{
m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle,
presence.ControllingClient.AgentId);
presence.RemoveNeighbourRegion(regionHandle);
}
}
public Dictionary<string, string> GetGridSettings() public Dictionary<string, string> GetGridSettings()
{ {
return m_commsProvider.GridService.GetGridSettings(); return m_commsProvider.GridService.GetGridSettings();
} }
public void LogOffUser(LLUUID userid, LLUUID regionid, ulong regionhandle, float posx, float posy, float posz)
{
m_commsProvider.LogOffUser(userid, regionid, regionhandle, posx, posy, posz);
}
public void ClearUserAgent(LLUUID avatarID)
{
m_commsProvider.UserService.clearUserAgent(avatarID);
}
public void AddNewUserFriend(LLUUID friendlistowner, LLUUID friend, uint perms)
{
m_commsProvider.AddNewUserFriend(friendlistowner, friend, perms);
}
public void UpdateUserFriendPerms(LLUUID friendlistowner, LLUUID friend, uint perms)
{
m_commsProvider.UpdateUserFriendPerms(friendlistowner, friend, perms);
}
public void RemoveUserFriend(LLUUID friendlistowner, LLUUID friend)
{
m_commsProvider.RemoveUserFriend(friendlistowner, friend);
}
public List<FriendListItem> GetUserFriendList(LLUUID friendlistowner)
{
return m_commsProvider.GetUserFriendList(friendlistowner);
}
public List<MapBlockData> RequestNeighbourMapBlocks(int minX, int minY, int maxX, int maxY)
{
return m_commsProvider.GridService.RequestNeighbourMapBlocks(minX, minY, maxX, maxY);
}
public List<AvatarPickerAvatar> GenerateAgentPickerRequestResponse(LLUUID queryID, string query)
{
return m_commsProvider.GenerateAgentPickerRequestResponse(queryID, query);
}
} }
} }

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@ -38,11 +38,18 @@ namespace OpenSim.Region.Environment.Scenes
public class SceneManager public class SceneManager
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public event RestartSim OnRestartSim; public event RestartSim OnRestartSim;
private readonly List<Scene> m_localScenes; private readonly List<Scene> m_localScenes;
private Scene m_currentScene = null; private Scene m_currentScene = null;
public List<Scene> Scenes
{
get { return m_localScenes; }
}
public Scene CurrentScene public Scene CurrentScene
{ {
get { return m_currentScene; } get { return m_currentScene; }
@ -98,8 +105,7 @@ namespace OpenSim.Region.Environment.Scenes
public void HandleRestart(RegionInfo rdata) public void HandleRestart(RegionInfo rdata)
{ {
MainLog.Instance.Error("SCENEMANAGER", m_log.Error("[SCENEMANAGER]: Got Restart message for region:" + rdata.RegionName + " Sending up to main");
"Got Restart message for region:" + rdata.RegionName + " Sending up to main");
int RegionSceneElement = -1; int RegionSceneElement = -1;
for (int i = 0; i < m_localScenes.Count; i++) for (int i = 0; i < m_localScenes.Count; i++)
{ {
@ -146,7 +152,7 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error("REGION", "Unable to notify Other regions of this Region coming up"); m_log.Error("[REGION]: Unable to notify Other regions of this Region coming up");
} }
} }
@ -181,6 +187,12 @@ namespace OpenSim.Region.Environment.Scenes
{ {
success = false; success = false;
} }
// Messy way of preventing us printing out the same help text for each scene
if (cmdparams.Length <= 0 || cmdparams[0] == "help")
{
break;
}
} }
return success; return success;
@ -297,29 +309,25 @@ namespace OpenSim.Region.Environment.Scenes
return false; return false;
} }
public void SetDebugPacketOnCurrentScene(LogBase log, int newDebug) public void SetDebugPacketOnCurrentScene(int newDebug)
{ {
ForEachCurrentScene(delegate(Scene scene) ForEachCurrentScene(delegate(Scene scene)
{ {
List<EntityBase> EntitieList = scene.GetEntities(); List<ScenePresence> scenePresences = scene.GetScenePresences();
foreach (EntityBase entity in EntitieList) foreach (ScenePresence scenePresence in scenePresences)
{ {
if (entity is ScenePresence) if (!scenePresence.IsChildAgent)
{ {
ScenePresence scenePrescence = entity as ScenePresence; m_log.ErrorFormat("Packet debug for {0} {1} set to {2}",
if (!scenePrescence.IsChildAgent) scenePresence.Firstname,
{ scenePresence.Lastname,
log.Error(String.Format("Packet debug for {0} {1} set to {2}", newDebug);
scenePrescence.Firstname,
scenePrescence.Lastname,
newDebug));
scenePrescence.ControllingClient.SetDebug(newDebug); scenePresence.ControllingClient.SetDebug(newDebug);
} }
} }
} });
});
} }
public List<ScenePresence> GetCurrentSceneAvatars() public List<ScenePresence> GetCurrentSceneAvatars()
@ -327,21 +335,17 @@ namespace OpenSim.Region.Environment.Scenes
List<ScenePresence> avatars = new List<ScenePresence>(); List<ScenePresence> avatars = new List<ScenePresence>();
ForEachCurrentScene(delegate(Scene scene) ForEachCurrentScene(delegate(Scene scene)
{ {
List<EntityBase> EntitieList = scene.GetEntities(); List<ScenePresence> scenePrescences = scene.GetScenePresences();
foreach (EntityBase entity in EntitieList) foreach (ScenePresence scenePrescence in scenePrescences)
{ {
if (entity is ScenePresence) if (!scenePrescence.IsChildAgent)
{ {
ScenePresence scenePrescence = entity as ScenePresence; avatars.Add(scenePrescence);
if (!scenePrescence.IsChildAgent) }
{ }
avatars.Add(scenePrescence); });
}
}
}
});
return avatars; return avatars;
} }

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@ -38,6 +38,8 @@ namespace OpenSim.Region.Environment.Scenes
{ {
public partial class SceneObjectGroup : EntityBase public partial class SceneObjectGroup : EntityBase
{ {
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary> /// <summary>
/// Start a given script. /// Start a given script.
/// </summary> /// </summary>
@ -53,21 +55,78 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIMINVENTORY]: " +
"Couldn't find part {0} in object group {1}, {2} to start script with ID {3}", "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}",
localID, Name, UUID, itemID); localID, Name, UUID, itemID);
} }
} }
// /// Start a given script.
// /// </summary>
// /// <param name="localID">
// /// A <see cref="System.UInt32"/>
// /// </param>
// public void StartScript(LLUUID partID, LLUUID itemID)
// {
// SceneObjectPart part = GetChildPart(partID);
// if (part != null)
// {
// part.StartScript(itemID);
// }
// else
// {
// m_log.ErrorFormat(
// "[PRIMINVENTORY]: " +
// "Couldn't find part {0} in object group {1}, {2} to start script with ID {3}",
// localID, Name, UUID, itemID);
// }
// }
/// <summary> /// <summary>
/// Start the scripts contained in all the prims in this group. /// Start the scripts contained in all the prims in this group.
/// </summary> /// </summary>
public void StartScripts() public void StartScripts()
{ {
foreach (SceneObjectPart part in m_parts.Values) // Don't start scripts if they're turned off in the region!
if (!((m_scene.RegionInfo.EstateSettings.regionFlags & Simulator.RegionFlags.SkipScripts) == Simulator.RegionFlags.SkipScripts))
{ {
part.StartScripts(); foreach (SceneObjectPart part in m_parts.Values)
{
part.StartScripts();
}
}
}
public void StopScripts()
{
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
{
part.StopScripts();
}
}
}
/// Start a given script.
/// </summary>
/// <param name="localID">
/// A <see cref="System.UInt32"/>
/// </param>
public void StopScript(uint partID, LLUUID itemID)
{
SceneObjectPart part = GetChildPart(partID);
if (part != null)
{
part.StopScript(itemID);
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Couldn't find part {0} in object group {1}, {2} to stop script with ID {3}",
partID, Name, UUID, itemID);
} }
} }
@ -85,8 +144,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIMINVENTORY]: " +
"Couldn't find part {0} in object group {1}, {2} to retreive prim inventory", "Couldn't find part {0} in object group {1}, {2} to retreive prim inventory",
localID, Name, UUID); localID, Name, UUID);
} }
@ -102,8 +161,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIMINVENTORY]: " +
"Couldn't find part {0} in object group {1}, {2} to request inventory data", "Couldn't find part {0} in object group {1}, {2} to request inventory data",
localID, Name, UUID); localID, Name, UUID);
} }
@ -120,36 +179,29 @@ namespace OpenSim.Region.Environment.Scenes
public bool AddInventoryItem(IClientAPI remoteClient, uint localID, public bool AddInventoryItem(IClientAPI remoteClient, uint localID,
InventoryItemBase item, LLUUID copyItemID) InventoryItemBase item, LLUUID copyItemID)
{ {
LLUUID newItemId = ((copyItemID != null) ? copyItemID : item.inventoryID); LLUUID newItemId = (!copyItemID.Equals(null)) ? copyItemID : item.inventoryID;
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
if (part != null) if (part != null)
{ {
TaskInventoryItem taskItem = new TaskInventoryItem(); TaskInventoryItem taskItem = new TaskInventoryItem();
taskItem.item_id = newItemId; taskItem.ItemID = newItemId;
taskItem.asset_id = item.assetID; taskItem.AssetID = item.assetID;
taskItem.name = item.inventoryName; taskItem.Name = item.inventoryName;
taskItem.desc = item.inventoryDescription; taskItem.Description = item.inventoryDescription;
taskItem.owner_id = item.avatarID; taskItem.OwnerID = item.avatarID;
taskItem.creator_id = item.creatorsID; taskItem.CreatorID = item.creatorsID;
taskItem.type = TaskInventoryItem.Types[item.assetType]; taskItem.Type = item.assetType;
taskItem.inv_type = TaskInventoryItem.InvTypes[item.invType]; taskItem.InvType = item.invType;
part.AddInventoryItem(taskItem); part.AddInventoryItem(taskItem);
// It might seem somewhat crude to update the whole group for a single prim inventory change,
// but it's possible that other prim inventory changes will take place before the region
// persistence thread visits this object. In the future, changes can be signalled at a more
// granular level, or we could let the datastore worry about whether prims have really
// changed since they were last persisted.
HasChanged = true;
return true; return true;
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIMINVENTORY]: " +
"Couldn't find prim local ID {0} in group {1}, {2} to add inventory item ID {3}", "Couldn't find prim local ID {0} in group {1}, {2} to add inventory item ID {3}",
localID, Name, UUID, newItemId); localID, Name, UUID, newItemId);
} }
@ -157,19 +209,62 @@ namespace OpenSim.Region.Environment.Scenes
return false; return false;
} }
public int RemoveInventoryItem(IClientAPI remoteClient, uint localID, LLUUID itemID) /// <summary>
/// Returns an existing inventory item. Returns the original, so any changes will be live.
/// </summary>
/// <param name="primID"></param>
/// <param name="itemID"></param>
/// <returns>null if the item does not exist</returns>
public TaskInventoryItem GetInventoryItem(uint primID, LLUUID itemID)
{
SceneObjectPart part = GetChildPart(primID);
if (part != null)
{
return part.GetInventoryItem(itemID);
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Couldn't find prim local ID {0} in prim {1}, {2} to get inventory item ID {3}",
primID, part.Name, part.UUID, itemID);
}
return null;
}
/// <summary>
/// Update an existing inventory item.
/// </summary>
/// <param name="item">The updated item. An item with the same id must already exist
/// in this prim's inventory</param>
/// <returns>false if the item did not exist, true if the update occurred succesfully</returns>
public bool UpdateInventoryItem(TaskInventoryItem item)
{
SceneObjectPart part = GetChildPart(item.ParentPartID);
if (part != null)
{
part.UpdateInventoryItem(item);
return true;
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Couldn't find prim ID {0} to update item {1}, {2}",
item.ParentPartID, item.Name, item.ItemID);
}
return false;
}
public int RemoveInventoryItem(uint localID, LLUUID itemID)
{ {
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
if (part != null) if (part != null)
{ {
int type = part.RemoveInventoryItem(remoteClient, localID, itemID); int type = part.RemoveInventoryItem(itemID);
// It might seem somewhat crude to update the whole group for a single prim inventory change,
// but it's possible that other prim inventory changes will take place before the region
// persistence thread visits this object. In the future, changes can be signalled at a more
// granular level, or we could let the datastore worry about whether prims have really
// changed since they were last persisted.
HasChanged = true;
return type; return type;
} }

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@ -33,6 +33,7 @@ using System.Xml.Serialization;
using libsecondlife; using libsecondlife;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Console; using OpenSim.Framework.Console;
using OpenSim.Region.Environment.Interfaces; using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Scenes.Scripting; using OpenSim.Region.Environment.Scenes.Scripting;
@ -41,7 +42,9 @@ namespace OpenSim.Region.Environment.Scenes
{ {
public partial class SceneObjectPart : IScriptHost public partial class SceneObjectPart : IScriptHost
{ {
private string m_inventoryFileName = ""; private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private string m_inventoryFileName = String.Empty;
/// <summary> /// <summary>
/// The inventory folder for this prim /// The inventory folder for this prim
@ -58,18 +61,6 @@ namespace OpenSim.Region.Environment.Scenes
set { m_folderID = value; } set { m_folderID = value; }
} }
/// <summary>
/// Holds in memory prim inventory
/// </summary>
protected IDictionary<LLUUID, TaskInventoryItem> m_taskInventory
= new Dictionary<LLUUID, TaskInventoryItem>();
[XmlIgnore]
public IDictionary<LLUUID, TaskInventoryItem> TaskInventory
{
get { return m_taskInventory; }
}
/// <summary> /// <summary>
/// Serial count for inventory file , used to tell if inventory has changed /// Serial count for inventory file , used to tell if inventory has changed
/// no need for this to be part of Database backup /// no need for this to be part of Database backup
@ -79,19 +70,73 @@ namespace OpenSim.Region.Environment.Scenes
public uint InventorySerial public uint InventorySerial
{ {
get { return m_inventorySerial; } get { return m_inventorySerial; }
set { m_inventorySerial = value; }
} }
/// <summary>
/// Holds in memory prim inventory
/// </summary>
protected TaskInventoryDictionary m_taskInventory = new TaskInventoryDictionary();
public TaskInventoryDictionary TaskInventory
{
get { return m_taskInventory; }
set { m_taskInventory = value; }
}
/// <summary>
/// Tracks whether inventory has changed since the last persistent backup
/// </summary>
private bool HasInventoryChanged;
/// <summary>
/// Reset LLUUIDs for all the items in the prim's inventory. This involves either generating
/// new ones or setting existing UUIDs to the correct parent UUIDs
/// </summary>
/// <param name="linkNum'>Link number for the part</param>
public void ResetInventoryIDs()
{
lock (TaskInventory)
{
IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values);
TaskInventory.Clear();
foreach (TaskInventoryItem item in items)
{
item.ResetIDs(UUID);
TaskInventory.Add(item.ItemID, item);
}
}
}
/// <summary> /// <summary>
/// Start all the scripts contained in this prim's inventory /// Start all the scripts contained in this prim's inventory
/// </summary> /// </summary>
public void StartScripts() public void StartScripts()
{ {
foreach (TaskInventoryItem item in m_taskInventory.Values) lock (m_taskInventory)
{ {
if ("lsltext" == item.type) foreach (TaskInventoryItem item in m_taskInventory.Values)
{ {
StartScript(item); // XXX more hardcoding badness. Should be an enum in TaskInventoryItem
if (10 == item.Type)
{
StartScript(item);
}
}
}
}
public void StopScripts()
{
lock (m_taskInventory)
{
foreach (TaskInventoryItem item in m_taskInventory.Values)
{
if (10 == item.Type)
{
StopScript(item.ItemID);
}
} }
} }
} }
@ -103,24 +148,33 @@ namespace OpenSim.Region.Environment.Scenes
/// <returns></returns> /// <returns></returns>
public void StartScript(TaskInventoryItem item) public void StartScript(TaskInventoryItem item)
{ {
// MainLog.Instance.Verbose( // m_log.InfoFormat(
// "PRIMINVENTORY", // "[PRIMINVENTORY]: " +
// "Starting script {0}, {1} in prim {2}, {3}", // "Starting script {0}, {1} in prim {2}, {3}",
// item.name, item.item_id, Name, UUID); // item.Name, item.ItemID, Name, UUID);
AddFlag(LLObject.ObjectFlags.Scripted);
AssetBase rezAsset = m_parentGroup.Scene.AssetCache.GetAsset(item.asset_id, false); if (!((m_parentGroup.Scene.RegionInfo.EstateSettings.regionFlags & Simulator.RegionFlags.SkipScripts) == Simulator.RegionFlags.SkipScripts))
{
AssetCache cache = m_parentGroup.Scene.AssetCache;
if (rezAsset != null) cache.GetAsset(item.AssetID, delegate(LLUUID assetID, AssetBase asset)
{ {
string script = Helpers.FieldToUTF8String(rezAsset.Data); if (null == asset)
m_parentGroup.Scene.EventManager.TriggerRezScript(LocalID, item.item_id, script); {
} m_log.ErrorFormat(
else "[PRIMINVENTORY]: " +
{ "Couldn't start script {0}, {1} since asset ID {2} could not be found",
MainLog.Instance.Error( item.Name, item.ItemID, item.AssetID);
"PRIMINVENTORY", }
"Couldn't start script {0}, {1} since asset ID {2} could not be found", else
item.name, item.item_id, item.asset_id); {
string script = Helpers.FieldToUTF8String(asset.Data);
m_parentGroup.Scene.EventManager.TriggerRezScript(LocalID,item.ItemID,script);
m_parentGroup.AddActiveScriptCount(1);
ScheduleFullUpdate();
}
}, false);
} }
} }
@ -131,19 +185,42 @@ namespace OpenSim.Region.Environment.Scenes
/// A <see cref="LLUUID"/> /// A <see cref="LLUUID"/>
/// </param> /// </param>
public void StartScript(LLUUID itemId) public void StartScript(LLUUID itemId)
{
lock (m_taskInventory)
{
if (m_taskInventory.ContainsKey(itemId))
{
StartScript(m_taskInventory[itemId]);
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
itemId, Name, UUID);
}
}
}
/// <summary>
/// Stop a script which is in this prim's inventory.
/// </summary>
/// <param name="itemId"></param>
public void StopScript(LLUUID itemId)
{ {
if (m_taskInventory.ContainsKey(itemId)) if (m_taskInventory.ContainsKey(itemId))
{ {
StartScript(m_taskInventory[itemId]); m_parentGroup.Scene.EventManager.TriggerRemoveScript(LocalID, itemId);
m_parentGroup.AddActiveScriptCount(-1);
} }
else else
{ {
MainLog.Instance.Error( m_log.ErrorFormat(
"PRIMINVENTORY", "[PRIMINVENTORY]: " +
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", "Couldn't stop script with ID {0} since it couldn't be found for prim {1}, {2}",
itemId, Name, UUID); itemId, Name, UUID);
} }
} }
/// <summary> /// <summary>
@ -152,54 +229,152 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="item"></param> /// <param name="item"></param>
public void AddInventoryItem(TaskInventoryItem item) public void AddInventoryItem(TaskInventoryItem item)
{ {
item.parent_id = m_folderID; item.ParentID = m_folderID;
item.creation_date = 1000; item.CreationDate = 1000;
item.ParentPartID = UUID; item.ParentPartID = UUID;
m_taskInventory.Add(item.item_id, item);
lock (m_taskInventory)
{
m_taskInventory.Add(item.ItemID, item);
TriggerScriptChangedEvent(Changed.INVENTORY);
}
m_inventorySerial++;
HasInventoryChanged = true;
}
/// <summary>
/// Restore a whole collection of items to the prim's inventory at once.
/// We assume that the items already have all their fields correctly filled out.
/// The items are not flagged for persistence to the database, since they are being restored
/// from persistence rather than being newly added.
/// </summary>
/// <param name="items"></param>
public void RestoreInventoryItems(ICollection<TaskInventoryItem> items)
{
lock (m_taskInventory)
{
foreach (TaskInventoryItem item in items)
{
m_taskInventory.Add(item.ItemID, item);
TriggerScriptChangedEvent(Changed.INVENTORY);
}
}
m_inventorySerial++; m_inventorySerial++;
} }
/// <summary> /// <summary>
/// Add a whole collection of items to the prim's inventory at once. We assume that the items already /// Returns an existing inventory item. Returns the original, so any changes will be live.
/// have all their fields correctly filled out.
/// </summary> /// </summary>
/// <param name="items"></param> /// <param name="itemID"></param>
public void AddInventoryItems(ICollection<TaskInventoryItem> items) /// <returns>null if the item does not exist</returns>
public TaskInventoryItem GetInventoryItem(LLUUID itemID)
{ {
foreach (TaskInventoryItem item in items) lock (m_taskInventory)
{ {
m_taskInventory.Add(item.item_id, item); if (m_taskInventory.ContainsKey(itemID))
{
return m_taskInventory[itemID];
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
itemID, Name, UUID);
}
} }
m_inventorySerial++; return null;
}
/// <summary>
/// Update an existing inventory item.
/// </summary>
/// <param name="item">The updated item. An item with the same id must already exist
/// in this prim's inventory.</param>
/// <returns>false if the item did not exist, true if the update occurred succesfully</returns>
public bool UpdateInventoryItem(TaskInventoryItem item)
{
lock (m_taskInventory)
{
if (m_taskInventory.ContainsKey(item.ItemID))
{
m_taskInventory[item.ItemID] = item;
m_inventorySerial++;
TriggerScriptChangedEvent(Changed.INVENTORY);
HasInventoryChanged = true;
return true;
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
item.ItemID, Name, UUID);
}
}
return false;
}
public void AddScriptLPS(int count)
{
m_parentGroup.AddScriptLPS(count);
} }
/// <summary> /// <summary>
/// Remove an item from this prim's inventory /// Remove an item from this prim's inventory
/// </summary> /// </summary>
/// <param name="remoteClient"></param>
/// <param name="localID"></param>
/// <param name="itemID"></param> /// <param name="itemID"></param>
/// <returns>Numeric asset type of the item removed.</returns> /// <returns>Numeric asset type of the item removed. Returns -1 if the item did not exist
public int RemoveInventoryItem(IClientAPI remoteClient, uint localID, LLUUID itemID) /// in this prim's inventory.</returns>
public int RemoveInventoryItem(LLUUID itemID)
{ {
if (localID == LocalID) lock (m_taskInventory)
{ {
if (m_taskInventory.ContainsKey(itemID)) if (m_taskInventory.ContainsKey(itemID))
{ {
string type = m_taskInventory[itemID].inv_type; int type = m_taskInventory[itemID].InvType;
m_taskInventory.Remove(itemID); m_taskInventory.Remove(itemID);
m_inventorySerial++; m_inventorySerial++;
if (type == "lsltext") TriggerScriptChangedEvent(Changed.INVENTORY);
HasInventoryChanged = true;
int scriptcount = 0;
lock (m_taskInventory)
{ {
return 10; foreach (TaskInventoryItem item in m_taskInventory.Values)
{
if (item.Type == 10)
{
scriptcount++;
}
}
} }
else if (scriptcount <= 0)
{ {
return 0; RemFlag(LLObject.ObjectFlags.Scripted);
ScheduleFullUpdate();
} }
ScheduleFullUpdate();
return type;
}
else
{
m_log.ErrorFormat(
"[PRIMINVENTORY]: " +
"Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
itemID, Name, UUID);
} }
} }
return -1; return -1;
} }
@ -212,7 +387,7 @@ namespace OpenSim.Region.Environment.Scenes
{ {
if (m_inventorySerial > 0) if (m_inventorySerial > 0)
{ {
client.SendTaskInventory(m_uuid, (short) m_inventorySerial, client.SendTaskInventory(m_uuid, (short)m_inventorySerial,
Helpers.StringToField(m_inventoryFileName)); Helpers.StringToField(m_inventoryFileName));
return true; return true;
} }
@ -227,38 +402,42 @@ namespace OpenSim.Region.Environment.Scenes
{ {
byte[] fileData = new byte[0]; byte[] fileData = new byte[0];
InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID); InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID);
foreach (TaskInventoryItem item in m_taskInventory.Values)
lock (m_taskInventory)
{ {
invString.AddItemStart(); foreach (TaskInventoryItem item in m_taskInventory.Values)
invString.AddNameValueLine("item_id", item.item_id.ToString()); {
invString.AddNameValueLine("parent_id", item.parent_id.ToString()); invString.AddItemStart();
invString.AddNameValueLine("item_id", item.ItemID.ToString());
invString.AddNameValueLine("parent_id", item.ParentID.ToString());
invString.AddPermissionsStart(); invString.AddPermissionsStart();
invString.AddNameValueLine("base_mask", "0x7FFFFFFF"); invString.AddNameValueLine("base_mask", "0x7FFFFFFF");
invString.AddNameValueLine("owner_mask", "0x7FFFFFFF"); invString.AddNameValueLine("owner_mask", "0x7FFFFFFF");
invString.AddNameValueLine("group_mask", "0x7FFFFFFF"); invString.AddNameValueLine("group_mask", "0x7FFFFFFF");
invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF"); invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF");
invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF"); invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF");
invString.AddNameValueLine("creator_id", item.creator_id.ToString()); invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
invString.AddNameValueLine("owner_id", item.owner_id.ToString()); invString.AddNameValueLine("owner_id", item.OwnerID.ToString());
invString.AddNameValueLine("last_owner_id", item.last_owner_id.ToString()); invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
invString.AddNameValueLine("group_id", item.group_id.ToString()); invString.AddNameValueLine("group_id", item.GroupID.ToString());
invString.AddSectionEnd(); invString.AddSectionEnd();
invString.AddNameValueLine("asset_id", item.asset_id.ToString()); invString.AddNameValueLine("asset_id", item.AssetID.ToString());
invString.AddNameValueLine("type", item.type); invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
invString.AddNameValueLine("inv_type", item.inv_type); invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
invString.AddNameValueLine("flags", "0x00"); invString.AddNameValueLine("flags", "0x00");
invString.AddNameValueLine("name", item.name + "|"); invString.AddNameValueLine("name", item.Name + "|");
invString.AddNameValueLine("desc", item.desc + "|"); invString.AddNameValueLine("desc", item.Description + "|");
invString.AddNameValueLine("creation_date", item.creation_date.ToString()); invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
invString.AddSectionEnd(); invString.AddSectionEnd();
}
} }
fileData = Helpers.StringToField(invString.BuildString); fileData = Helpers.StringToField(invString.BuildString);
// MainLog.Instance.Verbose( // m_log.InfoFormat(
// "PRIMINVENTORY", "RequestInventoryFile fileData: {0}", Helpers.FieldToUTF8String(fileData)); // "[PRIMINVENTORY]: RequestInventoryFile fileData: {0}", Helpers.FieldToUTF8String(fileData));
if (fileData.Length > 2) if (fileData.Length > 2)
{ {
@ -266,9 +445,26 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
/// <summary>
/// Process inventory backup
/// </summary>
/// <param name="datastore"></param>
public void ProcessInventoryBackup(IRegionDataStore datastore)
{
if (HasInventoryChanged)
{
lock (TaskInventory)
{
datastore.StorePrimInventory(UUID, TaskInventory.Values);
}
HasInventoryChanged = false;
}
}
public class InventoryStringBuilder public class InventoryStringBuilder
{ {
public string BuildString = ""; public string BuildString = String.Empty;
public InventoryStringBuilder(LLUUID folderID, LLUUID parentID) public InventoryStringBuilder(LLUUID folderID, LLUUID parentID)
{ {

View File

@ -39,8 +39,16 @@ namespace OpenSim.Region.Environment.Scenes
{ {
public class ScenePresence : EntityBase public class ScenePresence : EntityBase
{ {
public static AvatarAnimations Animations = null; // ~ScenePresence()
// {
// System.Console.WriteLine("[ScenePresence] Destructor called");
// }
private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public static AvatarAnimations Animations = new AvatarAnimations();
public static byte[] DefaultTexture; public static byte[] DefaultTexture;
public LLUUID currentParcelUUID = LLUUID.Zero; public LLUUID currentParcelUUID = LLUUID.Zero;
private List<LLUUID> m_animations = new List<LLUUID>(); private List<LLUUID> m_animations = new List<LLUUID>();
private List<int> m_animationSeqs = new List<int>(); private List<int> m_animationSeqs = new List<int>();
@ -57,6 +65,9 @@ namespace OpenSim.Region.Environment.Scenes
private LLVector3 m_requestedSitOffset = new LLVector3(); private LLVector3 m_requestedSitOffset = new LLVector3();
private float m_sitAvatarHeight = 2.0f; private float m_sitAvatarHeight = 2.0f;
private float m_godlevel = 0; private float m_godlevel = 0;
private LLVector3 m_LastChildAgentUpdatePosition = new LLVector3();
private int m_perfMonMS = 0;
private bool m_setAlwaysRun = false; private bool m_setAlwaysRun = false;
@ -69,6 +80,10 @@ namespace OpenSim.Region.Environment.Scenes
private bool m_newCoarseLocations = true; private bool m_newCoarseLocations = true;
private bool m_gotAllObjectsInScene = false; private bool m_gotAllObjectsInScene = false;
private bool m_lastPhysicsStoppedStatus = false;
private LLVector3 m_lastVelocity = LLVector3.Zero;
// Default AV Height // Default AV Height
private float m_avHeight = 127.0f; private float m_avHeight = 127.0f;
@ -90,6 +105,11 @@ namespace OpenSim.Region.Environment.Scenes
private LLQuaternion m_headrotation = new LLQuaternion(); private LLQuaternion m_headrotation = new LLQuaternion();
private byte m_state = (byte) 0; private byte m_state = (byte) 0;
//Reuse the LLVector3 instead of creating a new one on the UpdateMovement method
private LLVector3 movementvector = new LLVector3();
private List<LLUUID> m_knownPrimUUID = new List<LLUUID>();
// Agent's Draw distance. // Agent's Draw distance.
protected float m_DrawDistance = 0f; protected float m_DrawDistance = 0f;
@ -98,6 +118,8 @@ namespace OpenSim.Region.Environment.Scenes
private readonly List<ulong> m_knownChildRegions = new List<ulong>(); private readonly List<ulong> m_knownChildRegions = new List<ulong>();
//neighbouring regions we have enabled a child agent in //neighbouring regions we have enabled a child agent in
private SignificantClientMovement handler001 = null; //OnSignificantClientMovement;
/// <summary> /// <summary>
/// Implemented Control Flags /// Implemented Control Flags
@ -136,6 +158,17 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_physicsActor; } get { return m_physicsActor; }
} }
public bool KnownPrim(LLUUID primID)
{
if (m_knownPrimUUID.Contains(primID))
{
return true;
}
m_knownPrimUUID.Add(primID);
return false;
}
public bool Updated public bool Updated
{ {
set { m_updateflag = value; } set { m_updateflag = value; }
@ -331,14 +364,14 @@ namespace OpenSim.Region.Environment.Scenes
} }
catch (KeyNotFoundException) catch (KeyNotFoundException)
{ {
MainLog.Instance.Warn("AVATAR", "KeyNotFound Exception playing avatar stand animation"); m_log.Warn("[AVATAR]: KeyNotFound Exception playing avatar stand animation");
} }
m_animationSeqs.Add(1); m_animationSeqs.Add(1);
RegisterToEvents(); RegisterToEvents();
SetDirectionVectors(); SetDirectionVectors();
m_scene.LandManager.sendLandUpdate(this); m_scene.LandManager.sendLandUpdate(this, true);
} }
public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams, public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
@ -402,12 +435,16 @@ namespace OpenSim.Region.Environment.Scenes
public void SendPrimUpdates() public void SendPrimUpdates()
{ {
m_perfMonMS = System.Environment.TickCount;
if (!m_gotAllObjectsInScene) if (!m_gotAllObjectsInScene)
{ {
if (!m_isChildAgent || m_scene.m_sendTasksToChild) if (!m_isChildAgent || m_scene.m_seeIntoRegionFromNeighbor)
{ {
m_scene.SendAllSceneObjectsToClient(this); m_scene.SendAllSceneObjectsToClient(this);
m_gotAllObjectsInScene = true; m_gotAllObjectsInScene = true;
} }
} }
@ -460,6 +497,8 @@ namespace OpenSim.Region.Environment.Scenes
updateCount++; updateCount++;
} }
} }
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
public void forceAvatarMovement(Vector3 position, Quaternion rotation) public void forceAvatarMovement(Vector3 position, Quaternion rotation)
@ -487,7 +526,9 @@ namespace OpenSim.Region.Environment.Scenes
m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid); m_scene.CommsManager.UserProfileCacheService.UpdateUserInventory(m_uuid);
//if (!m_gotAllObjectsInScene) //if (!m_gotAllObjectsInScene)
//{ //{
//m_scene.SendAllSceneObjectsToClient(this); m_scene.SendAllSceneObjectsToClient(this);
m_scene.LandManager.sendLandUpdate(this, true);
//m_gotAllObjectsInScene = true; //m_gotAllObjectsInScene = true;
//} //}
} }
@ -577,6 +618,11 @@ namespace OpenSim.Region.Environment.Scenes
} }
} }
public List<ulong> GetKnownRegionList()
{
return m_knownChildRegions;
}
#endregion #endregion
#region Event Handlers #region Event Handlers
@ -630,6 +676,8 @@ namespace OpenSim.Region.Environment.Scenes
// Must check for standing up even when PhysicsActor is null, // Must check for standing up even when PhysicsActor is null,
// since sitting currently removes avatar from physical scene // since sitting currently removes avatar from physical scene
m_perfMonMS = System.Environment.TickCount;
uint flags = agentData.AgentData.ControlFlags; uint flags = agentData.AgentData.ControlFlags;
LLQuaternion bodyRotation = agentData.AgentData.BodyRotation; LLQuaternion bodyRotation = agentData.AgentData.BodyRotation;
@ -708,7 +756,14 @@ namespace OpenSim.Region.Environment.Scenes
if ((flags & (uint) DCF) != 0) if ((flags & (uint) DCF) != 0)
{ {
DCFlagKeyPressed = true; DCFlagKeyPressed = true;
agent_control_v3 += Dir_Vectors[i]; try
{
agent_control_v3 += Dir_Vectors[i];
}
catch (IndexOutOfRangeException)
{
// Why did I get this?
}
if ((m_movementflag & (uint) DCF) == 0) if ((m_movementflag & (uint) DCF) == 0)
{ {
m_movementflag += (byte) (uint) DCF; m_movementflag += (byte) (uint) DCF;
@ -742,6 +797,8 @@ namespace OpenSim.Region.Environment.Scenes
// Are the collision requirements fulfilled? // Are the collision requirements fulfilled?
bool colliding = (m_physicsActor.IsColliding == true); bool colliding = (m_physicsActor.IsColliding == true);
if (m_physicsActor.Flying && colliding && controlland) if (m_physicsActor.Flying && colliding && controlland)
{ {
StopFlying(); StopFlying();
@ -756,6 +813,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
m_scene.EventManager.TriggerOnClientMovement(this); m_scene.EventManager.TriggerOnClientMovement(this);
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
/// <summary> /// <summary>
@ -772,16 +831,28 @@ namespace OpenSim.Region.Environment.Scenes
// Reset sit target. // Reset sit target.
if (part.GetAvatarOnSitTarget() == UUID) if (part.GetAvatarOnSitTarget() == UUID)
part.SetAvatarOnSitTarget(LLUUID.Zero); part.SetAvatarOnSitTarget(LLUUID.Zero);
m_parentPosition = part.GetWorldPosition();
}
if (m_physicsActor == null)
{
AddToPhysicalScene();
} }
m_pos += m_parentPosition + new LLVector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); m_pos += m_parentPosition + new LLVector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
m_parentPosition = new LLVector3(); m_parentPosition = new LLVector3();
if (m_physicsActor == null)
AddToPhysicalScene();
m_parentID = 0; m_parentID = 0;
SendFullUpdateToAllClients(); SendFullUpdateToAllClients();
if (m_physicsActor != null)
{
SetHeight(m_avHeight);
}
} }
SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1); SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1);
@ -803,7 +874,6 @@ namespace OpenSim.Region.Environment.Scenes
// TODO: determine position to sit at based on scene geometry; don't trust offset from client // TODO: determine position to sit at based on scene geometry; don't trust offset from client
// see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
// Is a sit target available? // Is a sit target available?
Vector3 avSitOffSet = part.GetSitTargetPosition(); Vector3 avSitOffSet = part.GetSitTargetPosition();
Quaternion avSitOrientation = part.GetSitTargetOrientation(); Quaternion avSitOrientation = part.GetSitTargetOrientation();
@ -823,15 +893,12 @@ namespace OpenSim.Region.Environment.Scenes
autopilot = false; autopilot = false;
} }
pos = part.AbsolutePosition + offset; pos = part.AbsolutePosition + offset;
if (m_physicsActor != null) if (m_physicsActor != null)
{ {
//
// If we're not using the client autopilot, we're immediately warping the avatar to the location // If we're not using the client autopilot, we're immediately warping the avatar to the location
// We can remove the physicsActor until they stand up. // We can remove the physicsActor until they stand up.
//
m_sitAvatarHeight = m_physicsActor.Size.Z; m_sitAvatarHeight = m_physicsActor.Size.Z;
if (autopilot) if (autopilot)
@ -843,17 +910,13 @@ namespace OpenSim.Region.Environment.Scenes
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();
AbsolutePosition = pos + new LLVector3(0.0f, 0.0f, m_sitAvatarHeight); AbsolutePosition = pos + new LLVector3(0.0f, 0.0f, m_sitAvatarHeight);
} }
else
{
}
} }
else else
{ {
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();
} }
} // Physactor != null }
} // part != null }
avatarSitResponse.SitTransform.AutoPilot = autopilot; avatarSitResponse.SitTransform.AutoPilot = autopilot;
avatarSitResponse.SitTransform.SitPosition = offset; avatarSitResponse.SitTransform.SitPosition = offset;
@ -886,7 +949,7 @@ namespace OpenSim.Region.Environment.Scenes
} }
else else
{ {
MainLog.Instance.Warn("Sit requested on unknown object: " + targetID.ToString()); m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
} }
SendSitResponse(remoteClient, targetID, offset); SendSitResponse(remoteClient, targetID, offset);
} }
@ -989,8 +1052,18 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
protected void SetMovementAnimation(LLUUID anim, int seq) protected void SetMovementAnimation(LLUUID anim, int seq)
{ {
if (m_animations[0] != anim) try
{ {
if (m_animations[0] != anim)
{
m_animations[0] = anim;
m_animationSeqs[0] = seq;
SendAnimPack();
}
}
catch
{
m_log.Warn("[AVATAR]: SetMovementAnimation for avatar failed. Attempting recovery...");
m_animations[0] = anim; m_animations[0] = anim;
m_animationSeqs[0] = seq; m_animationSeqs[0] = seq;
SendAnimPack(); SendAnimPack();
@ -1002,6 +1075,8 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
protected void UpdateMovementAnimations(bool update_movementflag) protected void UpdateMovementAnimations(bool update_movementflag)
{ {
if (update_movementflag) if (update_movementflag)
{ {
// Are we moving? // Are we moving?
@ -1029,17 +1104,33 @@ namespace OpenSim.Region.Environment.Scenes
(m_movementflag & (uint) AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) (m_movementflag & (uint) AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
{ {
// Client is moving, and colliding and pressing the page up button but isn't flying // Client is moving, and colliding and pressing the page up button but isn't flying
SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1); try
{
SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
}
catch (KeyNotFoundException)
{ }
} }
else if (m_setAlwaysRun) else if (m_setAlwaysRun)
{ {
// We are running // We are running
SetMovementAnimation(Animations.AnimsLLUUID["RUN"], 1); try
{
SetMovementAnimation(Animations.AnimsLLUUID["RUN"], 1);
}
catch (KeyNotFoundException)
{ }
} }
else else
{ {
// We're moving, but we're not doing anything else.. so play the stand animation // We're moving, but we're not doing anything else.. so play the stand animation
SetMovementAnimation(Animations.AnimsLLUUID["WALK"], 1); try
{
SetMovementAnimation(Animations.AnimsLLUUID["WALK"], 1);
}
catch (KeyNotFoundException)
{ }
} }
} }
else else
@ -1071,10 +1162,17 @@ namespace OpenSim.Region.Environment.Scenes
else else
{ {
// We're not moving.. and we're not doing anything.. so play the stand animation // We're not moving.. and we're not doing anything.. so play the stand animation
SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1); try
{
SetMovementAnimation(Animations.AnimsLLUUID["STAND"], 1);
}
catch (KeyNotFoundException)
{ }
} }
} }
} }
} }
/// <summary> /// <summary>
@ -1087,6 +1185,9 @@ namespace OpenSim.Region.Environment.Scenes
Console.WriteLine("DEBUG: AddNewMovement: child agent"); Console.WriteLine("DEBUG: AddNewMovement: child agent");
return; return;
} }
m_perfMonMS = System.Environment.TickCount;
m_rotation = rotation; m_rotation = rotation;
NewForce newVelocity = new NewForce(); NewForce newVelocity = new NewForce();
Vector3 direc = rotation*vec; Vector3 direc = rotation*vec;
@ -1099,13 +1200,13 @@ namespace OpenSim.Region.Environment.Scenes
//bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
//bool colliding = (m_physicsActor.IsColliding==true); //bool colliding = (m_physicsActor.IsColliding==true);
//if (controlland) //if (controlland)
// MainLog.Instance.Verbose("AGENT","landCommand"); // m_log.Info("[AGENT]: landCommand");
//if (colliding ) //if (colliding )
// MainLog.Instance.Verbose("AGENT","colliding"); // m_log.Info("[AGENT]: colliding");
//if (m_physicsActor.Flying && colliding && controlland) //if (m_physicsActor.Flying && colliding && controlland)
//{ //{
// StopFlying(); // StopFlying();
// MainLog.Instance.Verbose("AGENT", "Stop FLying"); // m_log.Info("[AGENT]: Stop FLying");
//} //}
} }
else else
@ -1118,8 +1219,13 @@ namespace OpenSim.Region.Environment.Scenes
direc.z *= 3; direc.z *= 3;
//System.Console.WriteLine("Jump"); //System.Console.WriteLine("Jump");
// PreJump and jump happen too quickly. Many times prejump gets ignored. // PreJump and jump happen too quickly. Many times prejump gets ignored.
SetMovementAnimation(Animations.AnimsLLUUID["PREJUMP"], 1); try
SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1); {
SetMovementAnimation(Animations.AnimsLLUUID["PREJUMP"], 1);
SetMovementAnimation(Animations.AnimsLLUUID["JUMP"], 1);
}
catch (KeyNotFoundException)
{ }
} }
} }
} }
@ -1128,6 +1234,8 @@ namespace OpenSim.Region.Environment.Scenes
newVelocity.Y = direc.y; newVelocity.Y = direc.y;
newVelocity.Z = direc.z; newVelocity.Z = direc.z;
m_forcesList.Add(newVelocity); m_forcesList.Add(newVelocity);
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
#endregion #endregion
@ -1163,14 +1271,23 @@ namespace OpenSim.Region.Environment.Scenes
m_updateCount = 0; m_updateCount = 0;
} }
} }
else if (Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) // physics-related movement else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02)) // physics-related movement
{ {
// Send Terse Update to all clients updates lastPhysPos and m_lastVelocity
// doing the above assures us that we know what we sent the clients last
SendTerseUpdateToAllClients(); SendTerseUpdateToAllClients();
m_updateCount = 0; m_updateCount = 0;
lastPhysPos = AbsolutePosition;
} }
CheckForSignificantMovement();
// followed suggestion from mic bowman. reversed the two lines below.
CheckForBorderCrossing(); CheckForBorderCrossing();
CheckForSignificantMovement(); // sends update to the modules.
} }
} }
@ -1184,11 +1301,16 @@ namespace OpenSim.Region.Environment.Scenes
/// <param name="remoteClient"></param> /// <param name="remoteClient"></param>
public void SendTerseUpdateToClient(IClientAPI remoteClient) public void SendTerseUpdateToClient(IClientAPI remoteClient)
{ {
m_perfMonMS = System.Environment.TickCount;
LLVector3 pos = m_pos; LLVector3 pos = m_pos;
LLVector3 vel = Velocity; LLVector3 vel = Velocity;
LLQuaternion rot = new LLQuaternion(m_bodyRot.x, m_bodyRot.y, m_bodyRot.z, m_bodyRot.w); LLQuaternion rot = new LLQuaternion(m_bodyRot.x, m_bodyRot.y, m_bodyRot.z, m_bodyRot.w);
remoteClient.SendAvatarTerseUpdate(m_regionHandle, 64096, LocalId, new LLVector3(pos.X, pos.Y, pos.Z), remoteClient.SendAvatarTerseUpdate(m_regionHandle, (ushort)(m_scene.TimeDilation * (float)ushort.MaxValue), LocalId, new LLVector3(pos.X, pos.Y, pos.Z),
new LLVector3(vel.X, vel.Y, vel.Z), rot); new LLVector3(vel.X, vel.Y, vel.Z), rot);
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
m_scene.AddAgentUpdates(1);
} }
/// <summary> /// <summary>
@ -1196,11 +1318,21 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void SendTerseUpdateToAllClients() public void SendTerseUpdateToAllClients()
{ {
m_perfMonMS = System.Environment.TickCount;
m_scene.Broadcast(SendTerseUpdateToClient); m_scene.Broadcast(SendTerseUpdateToClient);
m_lastVelocity = m_velocity;
lastPhysPos = AbsolutePosition;
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
public void SendCoarseLocations() public void SendCoarseLocations()
{ {
m_perfMonMS = System.Environment.TickCount;
List<LLVector3> CoarseLocations = new List<LLVector3>(); List<LLVector3> CoarseLocations = new List<LLVector3>();
List<ScenePresence> avatars = m_scene.GetAvatars(); List<ScenePresence> avatars = m_scene.GetAvatars();
for (int i = 0; i < avatars.Count; i++) for (int i = 0; i < avatars.Count; i++)
@ -1212,6 +1344,8 @@ namespace OpenSim.Region.Environment.Scenes
} }
m_controllingClient.SendCoarseLocationUpdate(CoarseLocations); m_controllingClient.SendCoarseLocationUpdate(CoarseLocations);
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
public void CoarseLocationChange() public void CoarseLocationChange()
@ -1228,6 +1362,7 @@ namespace OpenSim.Region.Environment.Scenes
remoteAvatar.m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid, remoteAvatar.m_controllingClient.SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_uuid,
LocalId, m_pos, m_appearance.TextureEntry.ToBytes(), LocalId, m_pos, m_appearance.TextureEntry.ToBytes(),
m_parentID); m_parentID);
m_scene.AddAgentUpdates(1);
} }
/// <summary> /// <summary>
@ -1235,19 +1370,23 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void SendFullUpdateToAllClients() public void SendFullUpdateToAllClients()
{ {
m_perfMonMS = System.Environment.TickCount;
List<ScenePresence> avatars = m_scene.GetScenePresences(); List<ScenePresence> avatars = m_scene.GetScenePresences();
foreach (ScenePresence avatar in avatars) foreach (ScenePresence avatar in avatars)
{ {
SendFullUpdateToOtherClient(avatar); SendFullUpdateToOtherClient(avatar);
if (avatar.LocalId != LocalId) if (avatar.LocalId != LocalId)
{ {
if (!avatar.m_isChildAgent || m_scene.m_sendTasksToChild) if (!avatar.m_isChildAgent || m_scene.m_seeIntoRegionFromNeighbor)
{ {
avatar.SendFullUpdateToOtherClient(this); avatar.SendFullUpdateToOtherClient(this);
avatar.SendAppearanceToOtherAgent(this); avatar.SendAppearanceToOtherAgent(this);
} }
} }
} }
m_scene.AddAgentUpdates(avatars.Count);
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
/// <summary> /// <summary>
@ -1283,6 +1422,8 @@ namespace OpenSim.Region.Environment.Scenes
/// </summary> /// </summary>
public void SendAppearanceToAllOtherAgents() public void SendAppearanceToAllOtherAgents()
{ {
m_perfMonMS=System.Environment.TickCount;
m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
{ {
if (scenePresence.UUID != UUID) if (scenePresence.UUID != UUID)
@ -1290,6 +1431,7 @@ namespace OpenSim.Region.Environment.Scenes
m_appearance.SendAppearanceToOtherAgent(scenePresence); m_appearance.SendAppearanceToOtherAgent(scenePresence);
} }
}); });
m_scene.AddAgentTime(System.Environment.TickCount - m_perfMonMS);
} }
public void SendAppearanceToOtherAgent(ScenePresence avatar) public void SendAppearanceToOtherAgent(ScenePresence avatar)
@ -1341,12 +1483,36 @@ namespace OpenSim.Region.Environment.Scenes
if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > 0.5) if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > 0.5)
{ {
posLastSignificantMove = AbsolutePosition; posLastSignificantMove = AbsolutePosition;
if (OnSignificantClientMovement != null)
if (handler001 != null)
{ {
OnSignificantClientMovement(m_controllingClient); handler001(m_controllingClient);
m_scene.NotifyMyCoarseLocationChange(); m_scene.NotifyMyCoarseLocationChange();
} }
} }
// Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
if (Util.GetDistanceTo(AbsolutePosition,m_LastChildAgentUpdatePosition) > 32)
{
ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
cadu.ActiveGroupID=LLUUID.Zero.UUID;
cadu.AgentID = UUID.UUID;
cadu.alwaysrun = m_setAlwaysRun;
cadu.AVHeight = m_avHeight;
LLVector3 tempCameraCenter = new LLVector3(m_CameraCenter.x, m_CameraCenter.y, m_CameraCenter.z);
cadu.cameraPosition = new sLLVector3(tempCameraCenter);
cadu.drawdistance = m_DrawDistance;
cadu.godlevel = m_godlevel;
cadu.GroupAccess = 0;
cadu.Position = new sLLVector3(AbsolutePosition);
cadu.regionHandle = m_scene.RegionInfo.RegionHandle;
cadu.throttles = ControllingClient.GetThrottlesPacked(1f);
cadu.Velocity = new sLLVector3(Velocity);
m_scene.SendOutChildAgentUpdates(cadu,this);
m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
}
} }
#endregion #endregion
@ -1366,12 +1532,12 @@ namespace OpenSim.Region.Environment.Scenes
pos2.Y = pos2.Y + (vel.Y*timeStep); pos2.Y = pos2.Y + (vel.Y*timeStep);
pos2.Z = pos2.Z + (vel.Z*timeStep); pos2.Z = pos2.Z + (vel.Z*timeStep);
if ((pos2.X < 0) || (pos2.X > 256)) if ((pos2.X < 0) || (pos2.X > Constants.RegionSize))
{ {
CrossToNewRegion(); CrossToNewRegion();
} }
if ((pos2.Y < 0) || (pos2.Y > 256)) if ((pos2.Y < 0) || (pos2.Y > Constants.RegionSize))
{ {
CrossToNewRegion(); CrossToNewRegion();
} }
@ -1396,17 +1562,12 @@ namespace OpenSim.Region.Environment.Scenes
// distance into new region to place avatar // distance into new region to place avatar
const float enterDistance = 0.1f; const float enterDistance = 0.1f;
// region size
// TODO: this should be hard-coded in some common place
const float regionWidth = 256;
const float regionHeight = 256;
if (pos.X < boundaryDistance) if (pos.X < boundaryDistance)
{ {
neighbourx--; neighbourx--;
newpos.X = regionWidth - enterDistance; newpos.X = Constants.RegionSize - enterDistance;
} }
else if (pos.X > regionWidth - boundaryDistance) else if (pos.X > Constants.RegionSize - boundaryDistance)
{ {
neighbourx++; neighbourx++;
newpos.X = enterDistance; newpos.X = enterDistance;
@ -1415,16 +1576,16 @@ namespace OpenSim.Region.Environment.Scenes
if (pos.Y < boundaryDistance) if (pos.Y < boundaryDistance)
{ {
neighboury--; neighboury--;
newpos.Y = regionHeight - enterDistance; newpos.Y = Constants.RegionSize - enterDistance;
} }
else if (pos.Y > regionHeight - boundaryDistance) else if (pos.Y > Constants.RegionSize - boundaryDistance)
{ {
neighboury++; neighboury++;
newpos.Y = enterDistance; newpos.Y = enterDistance;
} }
LLVector3 vel = m_velocity; LLVector3 vel = m_velocity;
ulong neighbourHandle = Helpers.UIntsToLong((uint) (neighbourx*256), (uint) (neighboury*256)); ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * Constants.RegionSize), (uint)(neighboury * Constants.RegionSize));
SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle); SimpleRegionInfo neighbourRegion = m_scene.RequestNeighbouringRegionInfo(neighbourHandle);
if (neighbourRegion != null) if (neighbourRegion != null)
{ {
@ -1459,7 +1620,7 @@ namespace OpenSim.Region.Environment.Scenes
adb.AgentID = agentID; adb.AgentID = agentID;
adb.SessionID = sessionID; // More security adb.SessionID = sessionID; // More security
gdb.GodLevel = (byte) 100; gdb.GodLevel = (byte) 250;
gdb.Token = token; gdb.Token = token;
//respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock; //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
respondPacket.GrantData = gdb; respondPacket.GrantData = gdb;
@ -1471,27 +1632,35 @@ namespace OpenSim.Region.Environment.Scenes
/// This updates important decision making data about a child agent /// This updates important decision making data about a child agent
/// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region /// The main purpose is to figure out what objects to send to a child agent that's in a neighboring region
/// </summary> /// </summary>
public void ChildAgentDataUpdate(ChildAgentDataUpdate cAgentData) public void ChildAgentDataUpdate(ChildAgentDataUpdate cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
{ {
// //
int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
m_DrawDistance = cAgentData.drawdistance; m_DrawDistance = cAgentData.drawdistance;
m_pos = new LLVector3(cAgentData.Position.x, cAgentData.Position.y, cAgentData.Position.z); m_pos = new LLVector3(cAgentData.Position.x + shiftx, cAgentData.Position.y + shifty, cAgentData.Position.z);
// It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region
m_CameraCenter = m_CameraCenter =
new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z); new Vector3(cAgentData.cameraPosition.x, cAgentData.cameraPosition.y, cAgentData.cameraPosition.z);
m_godlevel = cAgentData.godlevel; m_godlevel = cAgentData.godlevel;
SetHeight(cAgentData.AVHeight);
ControllingClient.SetChildAgentThrottle(cAgentData.throttles); ControllingClient.SetChildAgentThrottle(cAgentData.throttles);
// Sends out the objects in the user's draw distance if m_sendTasksToChild is true.
if (m_scene.m_seeIntoRegionFromNeighbor)
m_scene.SendAllSceneObjectsToClient(this);
//cAgentData.AVHeight; //cAgentData.AVHeight;
//cAgentData.regionHandle; //cAgentData.regionHandle;
//m_velocity = cAgentData.Velocity; //m_velocity = cAgentData.Velocity;
} }
/// <summary>
///
/// </summary>
public static void LoadAnims()
{
}
/// <summary> /// <summary>
/// Handles part of the PID controller function for moving an avatar. /// Handles part of the PID controller function for moving an avatar.
/// </summary> /// </summary>
@ -1507,8 +1676,19 @@ namespace OpenSim.Region.Environment.Scenes
NewForce force = m_forcesList[i]; NewForce force = m_forcesList[i];
m_updateflag = true; m_updateflag = true;
try
Velocity = new LLVector3(force.X, force.Y, force.Z); {
movementvector.X = force.X;
movementvector.Y = force.Y;
movementvector.Z = force.Z;
Velocity = movementvector;
}
catch (System.NullReferenceException)
{
// Under extreme load, this returns a NullReference Exception that we can ignore.
// Ignoring this causes no movement to be sent to the physics engine...
// which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
}
m_newForce = true; m_newForce = true;
} }
for (int i = 0; i < m_forcesList.Count; i++) for (int i = 0; i < m_forcesList.Count; i++)
@ -1565,9 +1745,15 @@ namespace OpenSim.Region.Environment.Scenes
PhysicsVector pVec = PhysicsVector pVec =
new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
AbsolutePosition.Z); AbsolutePosition.Z);
if (m_avHeight == 127.0f)
m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec,LocalId); // rex, LocalId added {
m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients; m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, 1.56f));
}
else
{
m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, m_avHeight));
}
//m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate; m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
} }
@ -1580,7 +1766,25 @@ namespace OpenSim.Region.Environment.Scenes
internal void Close() internal void Close()
{ {
lock (m_knownPrimUUID)
{
m_knownPrimUUID.Clear();
}
lock (m_knownChildRegions)
{
m_knownChildRegions.Clear();
}
lock (m_updateTimes)
{
m_updateTimes.Clear();
}
lock (m_partsUpdateQueue)
{
m_partsUpdateQueue.Clear();
}
RemoveFromPhysicalScene(); RemoveFromPhysicalScene();
GC.Collect();
} }
} }
} }

View File

@ -68,7 +68,7 @@ namespace OpenSim.Region.Environment.Scenes
m_regInfo.RegionHandle, aPrimNode.OuterXml); m_regInfo.RegionHandle, aPrimNode.OuterXml);
if (newIDS) if (newIDS)
{ {
obj.GenerateNewIDs(); obj.ResetIDs();
} }
//if we want this to be a import method then we need new uuids for the object to avoid any clashes //if we want this to be a import method then we need new uuids for the object to avoid any clashes
//obj.RegenerateFullIDs(); //obj.RegenerateFullIDs();
@ -123,6 +123,33 @@ namespace OpenSim.Region.Environment.Scenes
file.Close(); file.Close();
} }
public string SavePrimGroupToXML2String(SceneObjectGroup grp)
{
string returnstring = "";
returnstring += "<scene>\n";
returnstring += grp.ToXmlString2();
returnstring += "</scene>\n";
return returnstring;
}
public void LoadGroupFromXml2String(string xmlString)
{
XmlDocument doc = new XmlDocument();
XmlNode rootNode;
XmlTextReader reader = new XmlTextReader(new StringReader(xmlString));
reader.WhitespaceHandling = WhitespaceHandling.None;
doc.Load(reader);
reader.Close();
rootNode = doc.FirstChild;
foreach (XmlNode aPrimNode in rootNode.ChildNodes)
{
CreatePrimFromXml(aPrimNode.OuterXml);
}
}
public void LoadPrimsFromXml2(string fileName) public void LoadPrimsFromXml2(string fileName)
{ {
XmlDocument doc = new XmlDocument(); XmlDocument doc = new XmlDocument();
@ -148,6 +175,8 @@ namespace OpenSim.Region.Environment.Scenes
public void CreatePrimFromXml(string xmlData) public void CreatePrimFromXml(string xmlData)
{ {
SceneObjectGroup obj = new SceneObjectGroup(xmlData); SceneObjectGroup obj = new SceneObjectGroup(xmlData);
LLVector3 receivedVelocity = obj.RootPart.Velocity;
//System.Console.WriteLine(obj.RootPart.Velocity.ToString());
m_innerScene.AddEntityFromStorage(obj); m_innerScene.AddEntityFromStorage(obj);
SceneObjectPart rootPart = obj.GetChildPart(obj.UUID); SceneObjectPart rootPart = obj.GetChildPart(obj.UUID);
@ -164,7 +193,10 @@ namespace OpenSim.Region.Environment.Scenes
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics, rootPart.LocalID); rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics, rootPart.LocalID);
rootPart.DoPhysicsPropertyUpdate(UsePhysics, true); rootPart.DoPhysicsPropertyUpdate(UsePhysics, true);
rootPart.Velocity = receivedVelocity;
} }
obj.ScheduleGroupForFullUpdate();
} }
public void SavePrimsToXml2(string fileName) public void SavePrimsToXml2(string fileName)

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY

View File

@ -13,7 +13,7 @@
* names of its contributors may be used to endorse or promote products * names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission. * derived from this software without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
@ -44,19 +44,19 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
public string SitName public string SitName
{ {
get { return ""; } get { return String.Empty; }
set { } set { }
} }
public string TouchName public string TouchName
{ {
get { return ""; } get { return String.Empty; }
set { } set { }
} }
public string Description public string Description
{ {
get { return ""; } get { return String.Empty; }
set { } set { }
} }

View File

@ -33,7 +33,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
{ {
public interface ScriptEngineInterface public interface ScriptEngineInterface
{ {
void InitializeEngine(Scene Sceneworld, LogBase logger); void InitializeEngine(Scene Sceneworld);
void Shutdown(); void Shutdown();
// void StartScript(string ScriptID, IScriptHost ObjectID); // void StartScript(string ScriptID, IScriptHost ObjectID);
} }

View File

@ -35,12 +35,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
{ {
public class ScriptEngineLoader public class ScriptEngineLoader
{ {
private LogBase m_log; private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public ScriptEngineLoader(LogBase logger)
{
m_log = logger;
}
public ScriptEngineInterface LoadScriptEngine(string EngineName) public ScriptEngineInterface LoadScriptEngine(string EngineName)
{ {
@ -54,7 +49,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
} }
catch (Exception e) catch (Exception e)
{ {
m_log.Error("ScriptEngine", m_log.Error("[ScriptEngine]: " +
"Error loading assembly \"" + EngineName + "\": " + e.Message + ", " + "Error loading assembly \"" + EngineName + "\": " + e.Message + ", " +
e.StackTrace.ToString()); e.StackTrace.ToString());
} }
@ -88,7 +83,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
//} //}
//catch (Exception e) //catch (Exception e)
//{ //{
// m_log.Error("ScriptEngine", "Error loading assembly \"" + FileName + "\": " + e.ToString()); // m_log.Error("[ScriptEngine]: Error loading assembly \String.Empty + FileName + "\": " + e.ToString());
//} //}
@ -105,7 +100,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
//} //}
//catch (Exception e) //catch (Exception e)
//{ //{
// m_log.Error("ScriptEngine", "Error initializing type \"" + NameSpace + "\" from \"" + FileName + "\": " + e.ToString()); // m_log.Error("[ScriptEngine]: Error initializing type \String.Empty + NameSpace + "\" from \String.Empty + FileName + "\": " + e.ToString());
//} //}
ScriptEngineInterface ret; ScriptEngineInterface ret;
@ -115,7 +110,7 @@ namespace OpenSim.Region.Environment.Scenes.Scripting
//} //}
//catch (Exception e) //catch (Exception e)
//{ //{
// m_log.Error("ScriptEngine", "Error initializing type \"" + NameSpace + "\" from \"" + FileName + "\": " + e.ToString()); // m_log.Error("[ScriptEngine]: Error initializing type \String.Empty + NameSpace + "\" from \String.Empty + FileName + "\": " + e.ToString());
//} //}
return ret; return ret;

View File

@ -39,26 +39,55 @@ namespace OpenSim.Region.Environment.Scenes
public event SendStatResult OnSendStatsResult; public event SendStatResult OnSendStatsResult;
private SendStatResult handler001 = null;
private enum Stats : uint private enum Stats : uint
{ {
TimeDilation = 0, TimeDilation = 0,
SimFPS = 1, SimFPS = 1,
PhysicsFPS = 2, PhysicsFPS = 2,
AgentUpdates = 3, AgentUpdates = 3,
FrameMS = 4,
NetMS = 5,
OtherMS = 6,
PhysicsMS = 7,
AgentMS = 8,
ImageMS = 9,
ScriptMS = 10,
TotalPrim = 11, TotalPrim = 11,
ActivePrim = 12, ActivePrim = 12,
Agents = 13, Agents = 13,
ChildAgents = 14, ChildAgents = 14,
ActiveScripts = 15,
ScriptLinesPerSecond = 16,
InPacketsPerSecond = 17, InPacketsPerSecond = 17,
OutPacketsPerSecond = 18, OutPacketsPerSecond = 18,
UnAckedBytes = 24 PendingDownloads = 19,
PendingUploads = 20,
UnAckedBytes = 24,
// Havok4 related... May or may not be in upcoming LLclients
// (kelly added them sometime late in January 2008)
NumRCCSLODReduced = 25,
NumRCCSFixed = 26
} }
private int statsUpdatesEveryMS = 1000; // Sending a stats update every 3 seconds
private int statsUpdatesEveryMS = 3000;
private float statsUpdateFactor = 0;
private float m_timeDilation = 0; private float m_timeDilation = 0;
private int m_fps = 0; private int m_fps = 0;
private float m_pfps = 0; private float m_pfps = 0;
private float m_agentUpdates = 0; private int m_agentUpdates = 0;
private int m_frameMS = 0;
private int m_netMS = 0;
private int m_agentMS = 0;
private int m_physicsMS = 0;
private int m_imageMS = 0;
private int m_otherMS = 0;
private int m_scriptMS = 0;
private int m_rootAgents = 0; private int m_rootAgents = 0;
private int m_childAgents = 0; private int m_childAgents = 0;
private int m_numPrim = 0; private int m_numPrim = 0;
@ -66,6 +95,17 @@ namespace OpenSim.Region.Environment.Scenes
private int m_outPacketsPerSecond = 0; private int m_outPacketsPerSecond = 0;
private int m_activePrim = 0; private int m_activePrim = 0;
private int m_unAckedBytes = 0; private int m_unAckedBytes = 0;
private int m_pendingDownloads = 0;
private int m_pendingUploads = 0;
private int m_activeScripts = 0;
private int m_scriptLinesPerSecond = 0;
SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[21];
SimStatsPacket.RegionBlock rb = new SimStatsPacket.RegionBlock();
SimStatsPacket statpack = (SimStatsPacket)PacketPool.Instance.GetPacket(PacketType.SimStats);
private RegionInfo ReportingRegion; private RegionInfo ReportingRegion;
private Timer m_report = new Timer(); private Timer m_report = new Timer();
@ -73,21 +113,34 @@ namespace OpenSim.Region.Environment.Scenes
public SimStatsReporter(RegionInfo regionData) public SimStatsReporter(RegionInfo regionData)
{ {
statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000);
ReportingRegion = regionData; ReportingRegion = regionData;
for (int i = 0; i<21;i++)
{
sb[i] = new SimStatsPacket.StatBlock();
}
m_report.AutoReset = true; m_report.AutoReset = true;
m_report.Interval = statsUpdatesEveryMS; m_report.Interval = statsUpdatesEveryMS;
m_report.Elapsed += new ElapsedEventHandler(statsHeartBeat); m_report.Elapsed += new ElapsedEventHandler(statsHeartBeat);
m_report.Enabled = true; m_report.Enabled = true;
} }
public void SetUpdateMS(int ms)
{
statsUpdatesEveryMS = ms;
statsUpdateFactor = (float)(statsUpdatesEveryMS / 1000);
m_report.Interval = statsUpdatesEveryMS;
}
private void statsHeartBeat(object sender, EventArgs e) private void statsHeartBeat(object sender, EventArgs e)
{ {
m_report.Enabled = false; m_report.Enabled = false;
SimStatsPacket statpack = (SimStatsPacket) PacketPool.Instance.GetPacket(PacketType.SimStats);
// TODO: don't create new blocks if recycling an old packet
SimStatsPacket.StatBlock[] sb = new SimStatsPacket.StatBlock[11]; // Packet is already initialized and ready for data insert
statpack.Region = new SimStatsPacket.RegionBlock();
statpack.Region = rb;
statpack.Region.RegionX = ReportingRegion.RegionLocX; statpack.Region.RegionX = ReportingRegion.RegionLocX;
statpack.Region.RegionY = ReportingRegion.RegionLocY; statpack.Region.RegionY = ReportingRegion.RegionLocY;
try try
@ -102,72 +155,102 @@ namespace OpenSim.Region.Environment.Scenes
#region various statistic googly moogly #region various statistic googly moogly
float simfps = (int) (m_fps*5); // Our FPS is actually 10fps, so multiplying by 5 to get the amount that people expect there
// 0-50 is pretty close to 0-45
float simfps = (int) ((m_fps * 5));
if (simfps > 45) //if (simfps > 45)
simfps = simfps - (simfps - 45); //simfps = simfps - (simfps - 45);
if (simfps < 0) //if (simfps < 0)
simfps = 0; //simfps = 0;
float physfps = (m_pfps/statsUpdatesEveryMS); //
float physfps = ((m_pfps / 1000));
if (physfps > 50) //if (physfps > 600)
physfps = physfps - (physfps - 50); //physfps = physfps - (physfps - 600);
if (physfps < 0) if (physfps < 0)
physfps = 0; physfps = 0;
#endregion #endregion
sb[0] = new SimStatsPacket.StatBlock(); //Our time dilation is 0.91 when we're running a full speed,
// therefore to make sure we get an appropriate range,
// we have to factor in our error. (0.10f * statsUpdateFactor)
// multiplies the fix for the error times the amount of times it'll occur a second
// / 10 divides the value by the number of times the sim heartbeat runs (10fps)
// Then we divide the whole amount by the amount of seconds pass in between stats updates.
sb[0].StatID = (uint) Stats.TimeDilation; sb[0].StatID = (uint) Stats.TimeDilation;
sb[0].StatValue = (m_timeDilation); sb[0].StatValue = m_timeDilation ; //((((m_timeDilation + (0.10f * statsUpdateFactor)) /10) / statsUpdateFactor));
sb[1] = new SimStatsPacket.StatBlock();
sb[1].StatID = (uint) Stats.SimFPS; sb[1].StatID = (uint) Stats.SimFPS;
sb[1].StatValue = simfps; sb[1].StatValue = simfps/statsUpdateFactor;
sb[2] = new SimStatsPacket.StatBlock();
sb[2].StatID = (uint) Stats.PhysicsFPS; sb[2].StatID = (uint) Stats.PhysicsFPS;
sb[2].StatValue = physfps; sb[2].StatValue = physfps / statsUpdateFactor;
sb[3] = new SimStatsPacket.StatBlock();
sb[3].StatID = (uint) Stats.AgentUpdates; sb[3].StatID = (uint) Stats.AgentUpdates;
sb[3].StatValue = (m_agentUpdates/statsUpdatesEveryMS); sb[3].StatValue = (m_agentUpdates / statsUpdateFactor);
sb[4] = new SimStatsPacket.StatBlock();
sb[4].StatID = (uint) Stats.Agents; sb[4].StatID = (uint) Stats.Agents;
sb[4].StatValue = m_rootAgents; sb[4].StatValue = m_rootAgents;
sb[5] = new SimStatsPacket.StatBlock();
sb[5].StatID = (uint) Stats.ChildAgents; sb[5].StatID = (uint) Stats.ChildAgents;
sb[5].StatValue = m_childAgents; sb[5].StatValue = m_childAgents;
sb[6] = new SimStatsPacket.StatBlock();
sb[6].StatID = (uint) Stats.TotalPrim; sb[6].StatID = (uint) Stats.TotalPrim;
sb[6].StatValue = m_numPrim; sb[6].StatValue = m_numPrim;
sb[7] = new SimStatsPacket.StatBlock();
sb[7].StatID = (uint) Stats.ActivePrim; sb[7].StatID = (uint) Stats.ActivePrim;
sb[7].StatValue = m_activePrim; sb[7].StatValue = m_activePrim;
sb[8] = new SimStatsPacket.StatBlock(); sb[8].StatID = (uint)Stats.FrameMS;
sb[8].StatID = (uint) Stats.InPacketsPerSecond; sb[8].StatValue = m_frameMS / statsUpdateFactor;
sb[8].StatValue = (int) (m_inPacketsPerSecond/statsUpdatesEveryMS);
sb[9] = new SimStatsPacket.StatBlock(); sb[9].StatID = (uint)Stats.NetMS;
sb[9].StatID = (uint) Stats.OutPacketsPerSecond; sb[9].StatValue = m_netMS / statsUpdateFactor;
sb[9].StatValue = (int) (m_outPacketsPerSecond/statsUpdatesEveryMS);
sb[10] = new SimStatsPacket.StatBlock(); sb[10].StatID = (uint)Stats.PhysicsMS;
sb[10].StatID = (uint) Stats.UnAckedBytes; sb[10].StatValue = m_physicsMS / statsUpdateFactor;
sb[10].StatValue = (int) (m_unAckedBytes/statsUpdatesEveryMS);
sb[11].StatID = (uint)Stats.ImageMS ;
sb[11].StatValue = m_imageMS / statsUpdateFactor;
sb[12].StatID = (uint)Stats.OtherMS;
sb[12].StatValue = m_otherMS / statsUpdateFactor;
sb[13].StatID = (uint)Stats.InPacketsPerSecond;
sb[13].StatValue = (m_inPacketsPerSecond);
sb[14].StatID = (uint)Stats.OutPacketsPerSecond;
sb[14].StatValue = (m_outPacketsPerSecond / statsUpdateFactor);
sb[15].StatID = (uint)Stats.UnAckedBytes;
sb[15].StatValue = m_unAckedBytes;
sb[16].StatID = (uint)Stats.AgentMS;
sb[16].StatValue = m_agentMS / statsUpdateFactor;
sb[17].StatID = (uint)Stats.PendingDownloads;
sb[17].StatValue = m_pendingDownloads;
sb[18].StatID = (uint)Stats.PendingUploads;
sb[18].StatValue = m_pendingUploads;
sb[19].StatID = (uint)Stats.ActiveScripts;
sb[19].StatValue = m_activeScripts;
sb[20].StatID = (uint)Stats.ScriptLinesPerSecond;
sb[20].StatValue = m_scriptLinesPerSecond / statsUpdateFactor;
statpack.Stat = sb; statpack.Stat = sb;
if (OnSendStatsResult != null) handler001 = OnSendStatsResult;
if (handler001 != null)
{ {
OnSendStatsResult(statpack); handler001(statpack);
} }
resetvalues(); resetvalues();
m_report.Enabled = true; m_report.Enabled = true;
@ -175,22 +258,38 @@ namespace OpenSim.Region.Environment.Scenes
private void resetvalues() private void resetvalues()
{ {
m_timeDilation = 0;
m_fps = 0; m_fps = 0;
m_pfps = 0; m_pfps = 0;
m_agentUpdates = 0; m_agentUpdates = 0;
m_inPacketsPerSecond = 0; m_inPacketsPerSecond = 0;
m_outPacketsPerSecond = 0; m_outPacketsPerSecond = 0;
m_unAckedBytes = 0; m_unAckedBytes = 0;
m_scriptLinesPerSecond = 0;
m_frameMS = 0;
m_agentMS = 0;
m_netMS = 0;
m_physicsMS = 0;
m_imageMS = 0;
m_otherMS = 0;
m_scriptMS = 0;
} }
public void SetTimeDilation(float td) # region methods called from Scene
{ // The majority of these functions are additive
m_timeDilation = td; // so that you can easily change the amount of
if (m_timeDilation > 1.0f) // seconds in between sim stats updates
m_timeDilation = (m_timeDilation - (m_timeDilation - 0.91f));
if (m_timeDilation < 0) public void AddTimeDilation(float td)
m_timeDilation = 0.0f; {
//float tdsetting = td;
//if (tdsetting > 1.0f)
//tdsetting = (tdsetting - (tdsetting - 0.91f));
//if (tdsetting < 0)
//tdsetting = 0.0f;
m_timeDilation = td;
} }
public void SetRootAgents(int rootAgents) public void SetRootAgents(int rootAgents)
@ -223,7 +322,7 @@ namespace OpenSim.Region.Environment.Scenes
m_pfps += frames; m_pfps += frames;
} }
public void AddAgentUpdates(float numUpdates) public void AddAgentUpdates(int numUpdates)
{ {
m_agentUpdates += numUpdates; m_agentUpdates += numUpdates;
} }
@ -242,5 +341,52 @@ namespace OpenSim.Region.Environment.Scenes
{ {
m_unAckedBytes += numBytes; m_unAckedBytes += numBytes;
} }
public void addFrameMS(int ms)
{
m_frameMS += ms;
}
public void addNetMS(int ms)
{
m_netMS += ms;
}
public void addAgentMS(int ms)
{
m_agentMS += ms;
}
public void addPhysicsMS(int ms)
{
m_physicsMS += ms;
}
public void addImageMS(int ms)
{
m_imageMS += ms;
}
public void addOtherMS(int ms)
{
m_otherMS += ms;
}
// private static readonly log4net.ILog m_log
// = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public void addPendingDownload(int count)
{
m_pendingDownloads += count;
//m_log.InfoFormat("[stats]: Adding {0} to pending downloads to make {1}", count, m_pendingDownloads);
}
public void addScriptLines(int count)
{
m_scriptLinesPerSecond += count;
}
public void SetActiveScripts(int count)
{
m_activeScripts = count;
}
#endregion
} }
} }