From 8428b25939d39711e732eeb3928e8a8e64aad8a9 Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Mon, 26 Oct 2009 00:10:23 +0100
Subject: Add llRotLookat pt1.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 39 ++++++++++++++++++++++
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 12 +++++++
2 files changed, 51 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 69b3ded..fff807a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1727,6 +1727,45 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void rotLookAt(Quaternion target, float strength, float damping)
+ {
+ SceneObjectPart rootpart = m_rootPart;
+ if (rootpart != null)
+ {
+ if (IsAttachment)
+ {
+ /*
+ ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
+ if (avatar != null)
+ {
+ Rotate the Av?
+ } */
+ }
+ else
+ {
+ if (rootpart.PhysActor != null)
+ {
+ rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
+ rootpart.PhysActor.APIDStrength = strength;
+ rootpart.PhysActor.APIDDamping = damping;
+ rootpart.PhysActor.APIDActive = true;
+ }
+ }
+ }
+ }
+ public void stopLookAt()
+ {
+ SceneObjectPart rootpart = m_rootPart;
+ if (rootpart != null)
+ {
+ if (rootpart.PhysActor != null)
+ {
+ rootpart.PhysActor.APIDActive = false;
+ }
+ }
+
+ }
+
///
/// Uses a PID to attempt to clamp the object on the Z axis at the given height over tau seconds.
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 32171a0..5f46f6f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2187,6 +2187,11 @@ if (m_shape != null) {
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
}
+
+ public void RotLookAt(Quaternion target, float strength, float damping)
+ {
+ m_parentGroup.rotLookAt(target, strength, damping);
+ }
///
/// Schedules this prim for a full update
@@ -2662,6 +2667,13 @@ if (m_shape != null) {
SetText(text);
}
+ public void StopLookAt()
+ {
+ m_parentGroup.stopLookAt();
+
+ m_parentGroup.ScheduleGroupForTerseUpdate();
+ }
+
public void StopMoveToTarget()
{
m_parentGroup.stopMoveToTarget();
--
cgit v1.1
From 28aa8010b2b47b73c6b867ff8f6284f98f12f37a Mon Sep 17 00:00:00 2001
From: unknown
Date: Sun, 15 Nov 2009 21:38:38 +0100
Subject: - Lower TIME_MS_TOLERANCE to 200ms - Allow m_updateFlag to be reset
to 0 in the event of a terse update being rejected - Re-add a synchronous
SendTo for certain types of packets
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 18 ++++++------------
1 file changed, 6 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 73d0984..c0fd437 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1064,14 +1064,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- ///
- /// Clear all pending updates of parts to clients
- ///
- private void ClearUpdateSchedule()
- {
- m_updateFlag = 0;
- }
-
private void SendObjectPropertiesToClient(UUID AgentID)
{
ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences();
@@ -2387,8 +2379,8 @@ namespace OpenSim.Region.Framework.Scenes
{
const float ROTATION_TOLERANCE = 0.01f;
const float VELOCITY_TOLERANCE = 0.001f;
- const float POSITION_TOLERANCE = 0.05f;
- const int TIME_MS_TOLERANCE = 3000;
+ const float POSITION_TOLERANCE = 0.05f; // I don't like this, but I suppose it's necessary
+ const int TIME_MS_TOLERANCE = 200; //llSetPos has a 200ms delay. This should NOT be 3 seconds.
if (m_updateFlag == 1)
{
@@ -2401,7 +2393,7 @@ namespace OpenSim.Region.Framework.Scenes
Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
{
AddTerseUpdateToAllAvatars();
- ClearUpdateSchedule();
+
// This causes the Scene to 'poll' physical objects every couple of frames
// bad, so it's been replaced by an event driven method.
@@ -2419,13 +2411,15 @@ namespace OpenSim.Region.Framework.Scenes
m_lastAngularVelocity = AngularVelocity;
m_lastTerseSent = Environment.TickCount;
}
+ //Moved this outside of the if clause so updates don't get blocked.. *sigh*
+ m_updateFlag = 0; //Why were we calling a function to do this? Inefficient! *screams*
}
else
{
if (m_updateFlag == 2) // is a new prim, just created/reloaded or has major changes
{
AddFullUpdateToAllAvatars();
- ClearUpdateSchedule();
+ m_updateFlag = 0; //Same here
}
}
}
--
cgit v1.1
From 0149265ee83581cf2fb150dcd5d8734c02926261 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Sat, 21 Nov 2009 15:36:38 +0100
Subject: Improved avatar responsiveness.
---
.../Scenes/Animation/ScenePresenceAnimator.cs | 4 +-
OpenSim/Region/Framework/Scenes/Scene.cs | 10 +--
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 80 ++++++++++++++++++----
3 files changed, 72 insertions(+), 22 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index cbe4118..2230fba 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -156,8 +156,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation
Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
// Check control flags
- bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
- bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
+ bool heldForward = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS);
+ bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
//bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index a430b1e..5058457 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1164,16 +1164,16 @@ namespace OpenSim.Region.Framework.Scenes
// Check if any objects have reached their targets
CheckAtTargets();
- // Update SceneObjectGroups that have scheduled themselves for updates
- // Objects queue their updates onto all scene presences
- if (m_frame % m_update_objects == 0)
- m_sceneGraph.UpdateObjectGroups();
-
// Run through all ScenePresences looking for updates
// Presence updates and queued object updates for each presence are sent to clients
if (m_frame % m_update_presences == 0)
m_sceneGraph.UpdatePresences();
+ // Update SceneObjectGroups that have scheduled themselves for updates
+ // Objects queue their updates onto all scene presences
+ if (m_frame % m_update_objects == 0)
+ m_sceneGraph.UpdateObjectGroups();
+
int TempPhysicsMS2 = Environment.TickCount;
if ((m_frame % m_update_physics == 0) && m_physics_enabled)
m_sceneGraph.UpdatePreparePhysics();
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 424c25b..99f3141 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Scenes
// {
// m_log.Debug("[ScenePresence] Destructor called");
// }
-
+
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
@@ -144,7 +144,6 @@ namespace OpenSim.Region.Framework.Scenes
private int m_perfMonMS;
private bool m_setAlwaysRun;
-
private bool m_forceFly;
private bool m_flyDisabled;
@@ -166,7 +165,8 @@ namespace OpenSim.Region.Framework.Scenes
protected RegionInfo m_regionInfo;
protected ulong crossingFromRegion;
- private readonly Vector3[] Dir_Vectors = new Vector3[6];
+ private readonly Vector3[] Dir_Vectors = new Vector3[9];
+ private bool m_isNudging = false;
// Position of agent's camera in world (region cordinates)
protected Vector3 m_CameraCenter;
@@ -230,6 +230,8 @@ namespace OpenSim.Region.Framework.Scenes
DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
+ DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS,
+ DIR_CONTROL_FLAG_BACK_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG,
DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
}
@@ -714,21 +716,41 @@ namespace OpenSim.Region.Framework.Scenes
Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
Dir_Vectors[4] = Vector3.UnitZ; //UP
Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
- Dir_Vectors[5] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
+ Dir_Vectors[6] = new Vector3(0.5f, 0f, 0f); //FORWARD_NUDGE
+ Dir_Vectors[7] = new Vector3(-0.5f, 0f, 0f); //BACK_NUDGE
+ Dir_Vectors[8] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
}
private Vector3[] GetWalkDirectionVectors()
{
- Vector3[] vector = new Vector3[6];
+ Vector3[] vector = new Vector3[9];
vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
vector[2] = Vector3.UnitY; //LEFT
vector[3] = -Vector3.UnitY; //RIGHT
vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
- vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
+ vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
+ vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
+ vector[8] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
return vector;
}
+
+ private bool[] GetDirectionIsNudge()
+ {
+ bool[] isNudge = new bool[9];
+ isNudge[0] = false; //FORWARD
+ isNudge[1] = false; //BACK
+ isNudge[2] = false; //LEFT
+ isNudge[3] = false; //RIGHT
+ isNudge[4] = false; //UP
+ isNudge[5] = false; //DOWN
+ isNudge[6] = true; //FORWARD_NUDGE
+ isNudge[7] = true; //BACK_NUDGE
+ isNudge[8] = true; //DOWN_Nudge
+ return isNudge;
+ }
+
#endregion
@@ -1147,7 +1169,6 @@ namespace OpenSim.Region.Framework.Scenes
// // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
// return;
//}
-
m_perfMonMS = Environment.TickCount;
++m_movementUpdateCount;
@@ -1229,7 +1250,6 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
}
}
-
lock (scriptedcontrols)
{
if (scriptedcontrols.Count > 0)
@@ -1261,7 +1281,6 @@ namespace OpenSim.Region.Framework.Scenes
{
return;
}
-
if (m_allowMovement)
{
int i = 0;
@@ -1289,6 +1308,11 @@ namespace OpenSim.Region.Framework.Scenes
update_rotation = true;
}
+ //guilty until proven innocent..
+ bool Nudging = true;
+ //Basically, if there is at least one non-nudge control then we don't need
+ //to worry about stopping the avatar
+
if (m_parentID == 0)
{
bool bAllowUpdateMoveToPosition = false;
@@ -1303,6 +1327,12 @@ namespace OpenSim.Region.Framework.Scenes
else
dirVectors = Dir_Vectors;
+ bool[] isNudge = GetDirectionIsNudge();
+
+
+
+
+
foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
{
if (((uint)flags & (uint)DCF) != 0)
@@ -1312,6 +1342,10 @@ namespace OpenSim.Region.Framework.Scenes
try
{
agent_control_v3 += dirVectors[i];
+ if (isNudge[i] == false)
+ {
+ Nudging = false;
+ }
}
catch (IndexOutOfRangeException)
{
@@ -1373,6 +1407,9 @@ namespace OpenSim.Region.Framework.Scenes
// Ignore z component of vector
Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
LocalVectorToTarget2D.Normalize();
+
+ //We're not nudging
+ Nudging = false;
agent_control_v3 += LocalVectorToTarget2D;
// update avatar movement flags. the avatar coordinate system is as follows:
@@ -1450,7 +1487,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat(
// "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3);
- AddNewMovement(agent_control_v3, q);
+ AddNewMovement(agent_control_v3, q, Nudging);
if (update_movementflag)
Animator.UpdateMovementAnimations();
@@ -1886,7 +1923,7 @@ namespace OpenSim.Region.Framework.Scenes
///
/// The vector in which to move. This is relative to the rotation argument
/// The direction in which this avatar should now face.
- public void AddNewMovement(Vector3 vec, Quaternion rotation)
+ public void AddNewMovement(Vector3 vec, Quaternion rotation, bool Nudging)
{
if (m_isChildAgent)
{
@@ -1960,7 +1997,7 @@ namespace OpenSim.Region.Framework.Scenes
// TODO: Add the force instead of only setting it to support multiple forces per frame?
m_forceToApply = direc;
-
+ m_isNudging = Nudging;
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
}
@@ -1975,7 +2012,7 @@ namespace OpenSim.Region.Framework.Scenes
const float POSITION_TOLERANCE = 0.05f;
//const int TIME_MS_TOLERANCE = 3000;
- SendPrimUpdates();
+
if (m_newCoarseLocations)
{
@@ -2011,6 +2048,9 @@ namespace OpenSim.Region.Framework.Scenes
CheckForBorderCrossing();
CheckForSignificantMovement(); // sends update to the modules.
}
+
+ //Sending prim updates AFTER the avatar terse updates are sent
+ SendPrimUpdates();
}
#endregion
@@ -2864,14 +2904,24 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_forceToApply.HasValue)
{
- Vector3 force = m_forceToApply.Value;
+ Vector3 force = m_forceToApply.Value;
m_updateflag = true;
-// movementvector = force;
Velocity = force;
m_forceToApply = null;
}
+ else
+ {
+ if (m_isNudging)
+ {
+ Vector3 force = Vector3.Zero;
+
+ m_updateflag = true;
+ Velocity = force;
+ m_isNudging = false;
+ }
+ }
}
public override void SetText(string text, Vector3 color, double alpha)
--
cgit v1.1
From f1522e62042d11604ad70a39b26dc94953e9db7d Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Sun, 22 Nov 2009 08:31:35 +0100
Subject: Add non-scripted sit, fix scripted sit.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 99 +++++++++++++++++-------
1 file changed, 69 insertions(+), 30 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 1dedcf1..aa538dc 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -89,7 +89,8 @@ namespace OpenSim.Region.Framework.Scenes
/// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
/// issue #1716
///
- private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
+// private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
+ private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f);
public UUID currentParcelUUID = UUID.Zero;
@@ -113,7 +114,8 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 lastKnownAllowedPosition;
public bool sentMessageAboutRestrictedParcelFlyingDown;
public Vector4 CollisionPlane = Vector4.UnitW;
-
+
+ private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
private Vector3 m_lastPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
@@ -1531,7 +1533,7 @@ namespace OpenSim.Region.Framework.Scenes
Velocity = Vector3.Zero;
SendFullUpdateToAllClients();
- //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
+ HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); //KF ??
}
//ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false);
m_requestedSitTargetUUID = UUID.Zero;
@@ -1644,7 +1646,7 @@ namespace OpenSim.Region.Framework.Scenes
bool SitTargetisSet =
(!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 1f &&
avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f));
-
+ // this test is probably failing
if (SitTargetisSet && SitTargetUnOccupied)
{
//switch the target to this prim
@@ -1671,26 +1673,37 @@ namespace OpenSim.Region.Framework.Scenes
{
// 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
-
+
+ // part is the prim to sit on
+ // offset is the vector distance from that prim center to the click-spot
+ // UUID is the UUID of the Avatar doing the clicking
+
+ m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
+
// Is a sit target available?
Vector3 avSitOffSet = part.SitTargetPosition;
Quaternion avSitOrientation = part.SitTargetOrientation;
UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
- bool SitTargetisSet =
- (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 0f &&
- avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f));
+// bool SitTargetisSet =
+// (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 0f &&
+// avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f));
+ bool SitTargetisSet = ((Vector3.Zero != avSitOffSet) || (Quaternion.Identity != avSitOrientation));
+
+//Console.WriteLine("SendSitResponse offset=" + offset + " UnOccup=" + SitTargetUnOccupied +
+// " TargSet=" + SitTargetisSet);
+
if (SitTargetisSet && SitTargetUnOccupied)
{
part.SetAvatarOnSitTarget(UUID);
offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z);
sitOrientation = avSitOrientation;
- autopilot = false;
+ autopilot = false; // Jump direct to scripted llSitPos()
}
- pos = part.AbsolutePosition + offset;
+ pos = part.AbsolutePosition + offset; // Region position where clicked
//if (Math.Abs(part.AbsolutePosition.Z - AbsolutePosition.Z) > 1)
//{
// offset = pos;
@@ -1703,17 +1716,17 @@ namespace OpenSim.Region.Framework.Scenes
m_sitAvatarHeight = m_physicsActor.Size.Z;
if (autopilot)
- {
+ { // its not a scripted sit
if (Util.GetDistanceTo(AbsolutePosition, pos) < 4.5)
{
- autopilot = false;
+ autopilot = false; // close enough
RemoveFromPhysicalScene();
- AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
- }
+ AbsolutePosition = pos + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to Prim
+ } // else the autopilot will get us close
}
else
- {
+ { // its a scripted sit
RemoveFromPhysicalScene();
}
}
@@ -1816,26 +1829,41 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part.GetAvatarOnSitTarget() == UUID)
{
+ // Scripted sit
Vector3 sitTargetPos = part.SitTargetPosition;
Quaternion sitTargetOrient = part.SitTargetOrientation;
-
- //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0);
- //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w);
-
- //Quaternion result = (sitTargetOrient * vq) * nq;
-
m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
m_pos += SIT_TARGET_ADJUSTMENT;
m_bodyRot = sitTargetOrient;
- //Rotation = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
-
- //SendTerseUpdateToAllClients();
}
else
{
- m_pos -= part.AbsolutePosition;
+ // Non-scripted sit by Kitto Flora 21Nov09
+ // Calculate angle of line from prim to Av
+ float y_diff = (m_avInitialPos.Y - part.AbsolutePosition.Y);
+ float x_diff = ( m_avInitialPos.X - part.AbsolutePosition.X);
+ if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
+ if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
+ float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
+ Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
+ // Av sits at world euler <0,0, z>, translated by part rotation
+ m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
+ m_pos = new Vector3(0f, 0f, 0.05f) +
+ (new Vector3(0.0f, 0f, 0.625f) * partIRot) +
+ (new Vector3(0.25f, 0f, 0.0f) * m_bodyRot); // sit at center of prim
m_parentPosition = part.AbsolutePosition;
+ //Set up raytrace to find top surface of prim
+ Vector3 size = part.Scale;
+ float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
+ Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
+ Vector3 down = new Vector3(0f, 0f, -1f);
+ m_scene.PhysicsScene.RaycastWorld(
+ start, // Vector3 position,
+ down, // Vector3 direction,
+ mag, // float length,
+ SitAltitudeCallback); // retMethod
}
}
else
@@ -1850,11 +1878,22 @@ namespace OpenSim.Region.Framework.Scenes
Animator.TrySetMovementAnimation(sitAnimation);
SendFullUpdateToAllClients();
- // This may seem stupid, but Our Full updates don't send avatar rotation :P
- // So we're also sending a terse update (which has avatar rotation)
- // [Update] We do now.
- //SendTerseUpdateToAllClients();
}
+
+ public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
+ {
+// Console.WriteLine("[RAYCASTRESULT]: Hit={0}, Point={1}, ID={2}, Dist={3}", hitYN, collisionPoint, localid, distance);
+ if(hitYN)
+ {
+ // m_pos = Av offset from prim center to make look like on center
+ // m_parentPosition = Actual center pos of prim
+ // collisionPoint = spot on prim where we want to sit
+ SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
+ Vector3 offset = (collisionPoint - m_parentPosition) * Quaternion.Inverse(part.RotationOffset);
+ m_pos += offset;
+// Console.WriteLine("m_pos={0}, offset={1} newsit={2}", m_pos, offset, newsit);
+ }
+ }
///
/// Event handler for the 'Always run' setting on the client
@@ -3578,4 +3617,4 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
-}
\ No newline at end of file
+}
--
cgit v1.1
From 73c2162ff60850d96761aa07a1950dbbb2ec3e80 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Mon, 23 Nov 2009 19:51:40 +0100
Subject: Fixed nullrefs
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 66fb918..83208e9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -840,8 +840,12 @@ namespace OpenSim.Region.Framework.Scenes
public void RemoveTaskInventory(IClientAPI remoteClient, UUID itemID, uint localID)
{
SceneObjectPart part = GetSceneObjectPart(localID);
- SceneObjectGroup group = part.ParentGroup;
- if (group != null)
+ SceneObjectGroup group = null;
+ if (part != null)
+ {
+ group = part.ParentGroup;
+ }
+ if (part != null && group != null)
{
TaskInventoryItem item = group.GetInventoryItem(localID, itemID);
if (item == null)
--
cgit v1.1
From d1147136946daf14724183b3191119be44ff8b16 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Tue, 24 Nov 2009 18:02:12 +0100
Subject: Drop all locking of part.TaskInventory in favour of a
ReaderWriterLockSlim lock handler. This gives us: - Faster prim inventory
actions. Multiple threads can read at once. - Fixes the known prim inventory
thread locks - In the event of a thread lock occurring, it will usually self
heal after sixty seconds with an error message in the console
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 38 +-
.../Framework/Scenes/SceneObjectPartInventory.cs | 390 +++++++++++----------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 16 +-
3 files changed, 235 insertions(+), 209 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index cdec135..bbece2f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -389,12 +389,16 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Access should be via Inventory directly - this property temporarily remains for xml serialization purposes
+ /// Get the inventory list
///
public TaskInventoryDictionary TaskInventory
{
- get { return m_inventory.Items; }
- set { m_inventory.Items = value; }
+ get {
+ return m_inventory.Items;
+ }
+ set {
+ m_inventory.Items = value;
+ }
}
public uint ObjectFlags
@@ -2101,17 +2105,18 @@ namespace OpenSim.Region.Framework.Scenes
//Trys to fetch sound id from prim's inventory.
//Prim's inventory doesn't support non script items yet
- lock (TaskInventory)
+ TaskInventory.LockItemsForRead(true);
+
+ foreach (KeyValuePair item in TaskInventory)
{
- foreach (KeyValuePair item in TaskInventory)
+ if (item.Value.Name == sound)
{
- if (item.Value.Name == sound)
- {
- soundID = item.Value.ItemID;
- break;
- }
+ soundID = item.Value.ItemID;
+ break;
}
}
+
+ TaskInventory.LockItemsForRead(false);
}
List avatarts = m_parentGroup.Scene.GetAvatars();
@@ -2457,17 +2462,16 @@ namespace OpenSim.Region.Framework.Scenes
if (!UUID.TryParse(sound, out soundID))
{
// search sound file from inventory
- lock (TaskInventory)
+ TaskInventory.LockItemsForRead(true);
+ foreach (KeyValuePair item in TaskInventory)
{
- foreach (KeyValuePair item in TaskInventory)
+ if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound)
{
- if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound)
- {
- soundID = item.Value.ItemID;
- break;
- }
+ soundID = item.Value.ItemID;
+ break;
}
}
+ TaskInventory.LockItemsForRead(false);
}
if (soundID == UUID.Zero)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index f4ca877..4dc709e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -80,7 +80,9 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal TaskInventoryDictionary Items
{
- get { return m_items; }
+ get {
+ return m_items;
+ }
set
{
m_items = value;
@@ -116,22 +118,25 @@ namespace OpenSim.Region.Framework.Scenes
/// Link number for the part
public void ResetInventoryIDs()
{
- lock (Items)
+ m_items.LockItemsForWrite(true);
+
+ if (0 == Items.Count)
{
- if (0 == Items.Count)
- return;
+ m_items.LockItemsForWrite(false);
+ return;
+ }
- HasInventoryChanged = true;
- m_part.ParentGroup.HasGroupChanged = true;
- IList items = new List(Items.Values);
- Items.Clear();
+ HasInventoryChanged = true;
+ m_part.ParentGroup.HasGroupChanged = true;
+ IList items = new List(Items.Values);
+ Items.Clear();
- foreach (TaskInventoryItem item in items)
- {
- item.ResetIDs(m_part.UUID);
- Items.Add(item.ItemID, item);
- }
+ foreach (TaskInventoryItem item in items)
+ {
+ item.ResetIDs(m_part.UUID);
+ Items.Add(item.ItemID, item);
}
+ m_items.LockItemsForWrite(false);
}
///
@@ -140,25 +145,25 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ChangeInventoryOwner(UUID ownerId)
{
- lock (Items)
+ m_items.LockItemsForWrite(true);
+ if (0 == Items.Count)
{
- if (0 == Items.Count)
- {
- return;
- }
+ m_items.LockItemsForWrite(false);
+ return;
+ }
- HasInventoryChanged = true;
- m_part.ParentGroup.HasGroupChanged = true;
- IList items = new List(Items.Values);
- foreach (TaskInventoryItem item in items)
+ HasInventoryChanged = true;
+ m_part.ParentGroup.HasGroupChanged = true;
+ IList items = new List(Items.Values);
+ foreach (TaskInventoryItem item in items)
+ {
+ if (ownerId != item.OwnerID)
{
- if (ownerId != item.OwnerID)
- {
- item.LastOwnerID = item.OwnerID;
- item.OwnerID = ownerId;
- }
+ item.LastOwnerID = item.OwnerID;
+ item.OwnerID = ownerId;
}
}
+ m_items.LockItemsForWrite(false);
}
///
@@ -167,24 +172,24 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ChangeInventoryGroup(UUID groupID)
{
- lock (Items)
+ m_items.LockItemsForWrite(true);
+ if (0 == Items.Count)
{
- if (0 == Items.Count)
- {
- return;
- }
+ m_items.LockItemsForWrite(false);
+ return;
+ }
- HasInventoryChanged = true;
- m_part.ParentGroup.HasGroupChanged = true;
- IList items = new List(Items.Values);
- foreach (TaskInventoryItem item in items)
+ HasInventoryChanged = true;
+ m_part.ParentGroup.HasGroupChanged = true;
+ IList items = new List(Items.Values);
+ foreach (TaskInventoryItem item in items)
+ {
+ if (groupID != item.GroupID)
{
- if (groupID != item.GroupID)
- {
- item.GroupID = groupID;
- }
+ item.GroupID = groupID;
}
}
+ m_items.LockItemsForWrite(false);
}
///
@@ -192,14 +197,14 @@ namespace OpenSim.Region.Framework.Scenes
///
public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{
- lock (m_items)
+ Items.LockItemsForRead(true);
+ IList items = new List(Items.Values);
+ Items.LockItemsForRead(false);
+ foreach (TaskInventoryItem item in items)
{
- foreach (TaskInventoryItem item in Items.Values)
+ if ((int)InventoryType.LSL == item.InvType)
{
- if ((int)InventoryType.LSL == item.InvType)
- {
- CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
- }
+ CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
}
}
}
@@ -209,17 +214,20 @@ namespace OpenSim.Region.Framework.Scenes
///
public void RemoveScriptInstances()
{
- lock (Items)
+ Items.LockItemsForRead(true);
+ IList items = new List(Items.Values);
+ Items.LockItemsForRead(false);
+
+ foreach (TaskInventoryItem item in items)
{
- foreach (TaskInventoryItem item in Items.Values)
+ if ((int)InventoryType.LSL == item.InvType)
{
- if ((int)InventoryType.LSL == item.InvType)
- {
- RemoveScriptInstance(item.ItemID);
- m_part.RemoveScriptEvents(item.ItemID);
- }
+ RemoveScriptInstance(item.ItemID);
+ m_part.RemoveScriptEvents(item.ItemID);
}
}
+
+
}
///
@@ -244,8 +252,10 @@ namespace OpenSim.Region.Framework.Scenes
if (stateSource == 1 && // Prim crossing
m_part.ParentGroup.Scene.m_trustBinaries)
{
+ m_items.LockItemsForWrite(true);
m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero;
+ m_items.LockItemsForWrite(false);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1);
@@ -266,8 +276,10 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_part.ParentGroup.m_savedScriptState != null)
RestoreSavedScriptState(item.OldItemID, item.ItemID);
+ m_items.LockItemsForWrite(true);
m_items[item.ItemID].PermsMask = 0;
m_items[item.ItemID].PermsGranter = UUID.Zero;
+ m_items.LockItemsForWrite(false);
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
@@ -302,20 +314,22 @@ namespace OpenSim.Region.Framework.Scenes
///
public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{
- lock (m_items)
+ m_items.LockItemsForRead(true);
+ if (m_items.ContainsKey(itemId))
{
- if (m_items.ContainsKey(itemId))
- {
- CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource);
- }
- else
- {
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: " +
- "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
- itemId, m_part.Name, m_part.UUID);
- }
+ TaskInventoryItem item = m_items[itemId];
+ m_items.LockItemsForRead(false);
+ CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
}
+ else
+ {
+ m_items.LockItemsForRead(false);
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
+ itemId, m_part.Name, m_part.UUID);
+ }
+
}
///
@@ -346,11 +360,16 @@ namespace OpenSim.Region.Framework.Scenes
///
private bool InventoryContainsName(string name)
{
- foreach (TaskInventoryItem item in Items.Values)
+ m_items.LockItemsForRead(true);
+ foreach (TaskInventoryItem item in m_items.Values)
{
if (item.Name == name)
+ {
+ m_items.LockItemsForRead(false);
return true;
+ }
}
+ m_items.LockItemsForRead(false);
return false;
}
@@ -392,7 +411,9 @@ namespace OpenSim.Region.Framework.Scenes
///
public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop)
{
+ m_items.LockItemsForRead(true);
List il = new List(m_items.Values);
+ m_items.LockItemsForRead(false);
foreach (TaskInventoryItem i in il)
{
if (i.Name == item.Name)
@@ -429,15 +450,14 @@ namespace OpenSim.Region.Framework.Scenes
item.ParentPartID = m_part.UUID;
item.Name = name;
- lock (m_items)
- {
- m_items.Add(item.ItemID, item);
-
+ m_items.LockItemsForWrite(true);
+ m_items.Add(item.ItemID, item);
+ m_items.LockItemsForWrite(false);
if (allowedDrop)
m_part.TriggerScriptChangedEvent(Changed.ALLOWED_DROP);
else
m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
- }
+
m_inventorySerial++;
//m_inventorySerial += 2;
@@ -454,14 +474,13 @@ namespace OpenSim.Region.Framework.Scenes
///
public void RestoreInventoryItems(ICollection items)
{
- lock (m_items)
+ m_items.LockItemsForWrite(true);
+ foreach (TaskInventoryItem item in items)
{
- foreach (TaskInventoryItem item in items)
- {
- m_items.Add(item.ItemID, item);
- m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
- }
+ m_items.Add(item.ItemID, item);
+ m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
}
+ m_items.LockItemsForWrite(false);
m_inventorySerial++;
}
@@ -474,8 +493,9 @@ namespace OpenSim.Region.Framework.Scenes
public TaskInventoryItem GetInventoryItem(UUID itemId)
{
TaskInventoryItem item;
+ m_items.LockItemsForRead(true);
m_items.TryGetValue(itemId, out item);
-
+ m_items.LockItemsForRead(false);
return item;
}
@@ -487,45 +507,45 @@ namespace OpenSim.Region.Framework.Scenes
/// false if the item did not exist, true if the update occurred successfully
public bool UpdateInventoryItem(TaskInventoryItem item)
{
- lock (m_items)
+ m_items.LockItemsForWrite(true);
+
+ if (m_items.ContainsKey(item.ItemID))
{
- if (m_items.ContainsKey(item.ItemID))
+ item.ParentID = m_part.UUID;
+ item.ParentPartID = m_part.UUID;
+ item.Flags = m_items[item.ItemID].Flags;
+ if (item.AssetID == UUID.Zero)
{
- item.ParentID = m_part.UUID;
- item.ParentPartID = m_part.UUID;
- item.Flags = m_items[item.ItemID].Flags;
- if (item.AssetID == UUID.Zero)
- {
- item.AssetID = m_items[item.ItemID].AssetID;
- }
- else if ((InventoryType)item.Type == InventoryType.Notecard)
- {
- ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
+ item.AssetID = m_items[item.ItemID].AssetID;
+ }
+ else if ((InventoryType)item.Type == InventoryType.Notecard)
+ {
+ ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
- if (presence != null)
- {
- presence.ControllingClient.SendAgentAlertMessage(
- "Notecard saved", false);
- }
+ if (presence != null)
+ {
+ presence.ControllingClient.SendAgentAlertMessage(
+ "Notecard saved", false);
}
+ }
- m_items[item.ItemID] = item;
- m_inventorySerial++;
- m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
-
- HasInventoryChanged = true;
- m_part.ParentGroup.HasGroupChanged = true;
+ m_items[item.ItemID] = item;
+ m_inventorySerial++;
+ m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
- return true;
- }
- else
- {
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: " +
- "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
- item.ItemID, m_part.Name, m_part.UUID);
- }
+ HasInventoryChanged = true;
+ m_part.ParentGroup.HasGroupChanged = true;
+ m_items.LockItemsForWrite(false);
+ return true;
+ }
+ else
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ item.ItemID, m_part.Name, m_part.UUID);
}
+ m_items.LockItemsForWrite(false);
return false;
}
@@ -538,51 +558,54 @@ namespace OpenSim.Region.Framework.Scenes
/// in this prim's inventory.
public int RemoveInventoryItem(UUID itemID)
{
- lock (m_items)
+ m_items.LockItemsForRead(true);
+
+ if (m_items.ContainsKey(itemID))
{
- if (m_items.ContainsKey(itemID))
+ int type = m_items[itemID].InvType;
+ m_items.LockItemsForRead(false);
+ if (type == 10) // Script
{
- int type = m_items[itemID].InvType;
- if (type == 10) // Script
- {
- m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
- }
- m_items.Remove(itemID);
- m_inventorySerial++;
- m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
-
- HasInventoryChanged = true;
- m_part.ParentGroup.HasGroupChanged = true;
+ m_part.ParentGroup.Scene.EventManager.TriggerRemoveScript(m_part.LocalId, itemID);
+ }
+ m_items.LockItemsForWrite(true);
+ m_items.Remove(itemID);
+ m_items.LockItemsForWrite(false);
+ m_inventorySerial++;
+ m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
- int scriptcount = 0;
- lock (m_items)
- {
- foreach (TaskInventoryItem item in m_items.Values)
- {
- if (item.Type == 10)
- {
- scriptcount++;
- }
- }
- }
+ HasInventoryChanged = true;
+ m_part.ParentGroup.HasGroupChanged = true;
- if (scriptcount <= 0)
+ int scriptcount = 0;
+ m_items.LockItemsForRead(true);
+ foreach (TaskInventoryItem item in m_items.Values)
+ {
+ if (item.Type == 10)
{
- m_part.RemFlag(PrimFlags.Scripted);
+ scriptcount++;
}
-
- m_part.ScheduleFullUpdate();
-
- return type;
}
- else
+ m_items.LockItemsForRead(false);
+
+
+ if (scriptcount <= 0)
{
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: " +
- "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
- itemID, m_part.Name, m_part.UUID);
+ m_part.RemFlag(PrimFlags.Scripted);
}
+
+ m_part.ScheduleFullUpdate();
+
+ return type;
+ }
+ else
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ itemID, m_part.Name, m_part.UUID);
}
+ m_items.LockItemsForWrite(false);
return -1;
}
@@ -635,52 +658,53 @@ namespace OpenSim.Region.Framework.Scenes
// isn't available (such as drag from prim inventory to agent inventory)
InventoryStringBuilder invString = new InventoryStringBuilder(m_part.UUID, UUID.Zero);
- lock (m_items)
+ m_items.LockItemsForRead(true);
+
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
- {
- UUID ownerID = item.OwnerID;
- uint everyoneMask = 0;
- uint baseMask = item.BasePermissions;
- uint ownerMask = item.CurrentPermissions;
+ UUID ownerID = item.OwnerID;
+ uint everyoneMask = 0;
+ uint baseMask = item.BasePermissions;
+ uint ownerMask = item.CurrentPermissions;
- invString.AddItemStart();
- invString.AddNameValueLine("item_id", item.ItemID.ToString());
- invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
+ invString.AddItemStart();
+ invString.AddNameValueLine("item_id", item.ItemID.ToString());
+ invString.AddNameValueLine("parent_id", m_part.UUID.ToString());
- invString.AddPermissionsStart();
+ invString.AddPermissionsStart();
- invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
- invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
- invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0));
- invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
- invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
+ invString.AddNameValueLine("base_mask", Utils.UIntToHexString(baseMask));
+ invString.AddNameValueLine("owner_mask", Utils.UIntToHexString(ownerMask));
+ invString.AddNameValueLine("group_mask", Utils.UIntToHexString(0));
+ invString.AddNameValueLine("everyone_mask", Utils.UIntToHexString(everyoneMask));
+ invString.AddNameValueLine("next_owner_mask", Utils.UIntToHexString(item.NextPermissions));
- invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
- invString.AddNameValueLine("owner_id", ownerID.ToString());
+ invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
+ invString.AddNameValueLine("owner_id", ownerID.ToString());
- invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
+ invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
- invString.AddNameValueLine("group_id", item.GroupID.ToString());
- invString.AddSectionEnd();
+ invString.AddNameValueLine("group_id", item.GroupID.ToString());
+ invString.AddSectionEnd();
- invString.AddNameValueLine("asset_id", item.AssetID.ToString());
- invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
- invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
- invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
+ invString.AddNameValueLine("asset_id", item.AssetID.ToString());
+ invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
+ invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
+ invString.AddNameValueLine("flags", Utils.UIntToHexString(item.Flags));
- invString.AddSaleStart();
- invString.AddNameValueLine("sale_type", "not");
- invString.AddNameValueLine("sale_price", "0");
- invString.AddSectionEnd();
+ invString.AddSaleStart();
+ invString.AddNameValueLine("sale_type", "not");
+ invString.AddNameValueLine("sale_price", "0");
+ invString.AddSectionEnd();
- invString.AddNameValueLine("name", item.Name + "|");
- invString.AddNameValueLine("desc", item.Description + "|");
+ invString.AddNameValueLine("name", item.Name + "|");
+ invString.AddNameValueLine("desc", item.Description + "|");
- invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
- invString.AddSectionEnd();
- }
+ invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
+ invString.AddSectionEnd();
}
+ int count = m_items.Count;
+ m_items.LockItemsForRead(false);
fileData = Utils.StringToBytes(invString.BuildString);
@@ -689,6 +713,7 @@ namespace OpenSim.Region.Framework.Scenes
if (fileData.Length > 2)
{
+ m_log.Debug("Sending task inventory list of " + count.ToString() + " items to client " + client.AgentId.ToString());
xferManager.AddNewFile(m_inventoryFileName, fileData);
}
}
@@ -701,10 +726,9 @@ namespace OpenSim.Region.Framework.Scenes
{
if (HasInventoryChanged)
{
- lock (Items)
- {
- datastore.StorePrimInventory(m_part.UUID, Items.Values);
- }
+ Items.LockItemsForRead(true);
+ datastore.StorePrimInventory(m_part.UUID, Items.Values);
+ Items.LockItemsForRead(false);
HasInventoryChanged = false;
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4e5fee1..4c8c94f 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1615,21 +1615,19 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
if (part != null)
{
+ part.TaskInventory.LockItemsForRead(true);
TaskInventoryDictionary taskIDict = part.TaskInventory;
if (taskIDict != null)
{
- lock (taskIDict)
+ foreach (UUID taskID in taskIDict.Keys)
{
- foreach (UUID taskID in taskIDict.Keys)
- {
- UnRegisterControlEventsToScript(LocalId, taskID);
- taskIDict[taskID].PermsMask &= ~(
- 2048 | //PERMISSION_CONTROL_CAMERA
- 4); // PERMISSION_TAKE_CONTROLS
- }
+ UnRegisterControlEventsToScript(LocalId, taskID);
+ taskIDict[taskID].PermsMask &= ~(
+ 2048 | //PERMISSION_CONTROL_CAMERA
+ 4); // PERMISSION_TAKE_CONTROLS
}
-
}
+ part.TaskInventory.LockItemsForRead(false);
// Reset sit target.
if (part.GetAvatarOnSitTarget() == UUID)
part.SetAvatarOnSitTarget(UUID.Zero);
--
cgit v1.1
From 8383bde76880fc94a6644422d45baa28252b0231 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Tue, 24 Nov 2009 18:18:19 +0100
Subject: Removed some extra debug chatter
---
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 1 -
1 file changed, 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 4dc709e..abb04cd 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -713,7 +713,6 @@ namespace OpenSim.Region.Framework.Scenes
if (fileData.Length > 2)
{
- m_log.Debug("Sending task inventory list of " + count.ToString() + " items to client " + client.AgentId.ToString());
xferManager.AddNewFile(m_inventoryFileName, fileData);
}
}
--
cgit v1.1
From 32c464ad1f43cbee9492108c1bec7f874a20cd47 Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Wed, 25 Nov 2009 08:03:09 +0100
Subject: Fixed animation sequencing: SitHere, Falling, Stand/Walk etc. Login
Init Av Animation at Stand.
---
.../Scenes/Animation/ScenePresenceAnimator.cs | 15 ++++++----
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 34 +++++++++++++++-------
2 files changed, 33 insertions(+), 16 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 30a95ce..2d41342 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -53,8 +53,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation
{
get { return m_movementAnimation; }
}
- protected string m_movementAnimation = "DEFAULT";
-
+ // protected string m_movementAnimation = "DEFAULT"; //KF: 'DEFAULT' does not exist!
+ protected string m_movementAnimation = "CROUCH"; //KF: CROUCH ensures reliable Av Anim. init.
private int m_animTickFall;
private int m_animTickJump;
@@ -123,17 +123,22 @@ namespace OpenSim.Region.Framework.Scenes.Animation
///
public void TrySetMovementAnimation(string anim)
{
- //m_log.DebugFormat("Updating movement animation to {0}", anim);
+//Console.WriteLine("Updating movement animation to {0}", anim);
if (!m_scenePresence.IsChildAgent)
{
if (m_animations.TrySetDefaultAnimation(
anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, UUID.Zero))
{
+//Console.WriteLine("TSMA {0} success.", anim);
// 16384 is CHANGED_ANIMATION
m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { 16384 });
SendAnimPack();
}
+ else
+ {
+//Console.WriteLine("TSMA {0} fail.", anim);
+ }
}
}
@@ -313,7 +318,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
public void UpdateMovementAnimations()
{
m_movementAnimation = GetMovementAnimation();
-
+//Console.WriteLine("UMA got {0}", m_movementAnimation);
if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump)
{
// This was the previous behavior before PREJUMP
@@ -445,4 +450,4 @@ namespace OpenSim.Region.Framework.Scenes.Animation
SendAnimPack(animIDs, sequenceNums, objectIDs);
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4e5fee1..a65b84b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -90,6 +90,7 @@ namespace OpenSim.Region.Framework.Scenes
/// issue #1716
///
// private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
+ // Value revised by KF 091121 by comparison with SL.
private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f);
public UUID currentParcelUUID = UUID.Zero;
@@ -205,6 +206,9 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_followCamAuto;
private int m_movementUpdateCount;
+ private int m_lastColCount = -1; //KF: Look for Collision chnages
+ private int m_updateCount = 0; //KF: Update Anims for a while
+ private static readonly int UPDATE_COUNT = 10; // how many frames to update for
private const int NumMovementsBetweenRayCast = 5;
@@ -662,9 +666,7 @@ namespace OpenSim.Region.Framework.Scenes
AdjustKnownSeeds();
- // TODO: I think, this won't send anything, as we are still a child here...
- Animator.TrySetMovementAnimation("STAND");
-
+ Animator.TrySetMovementAnimation("STAND");
// we created a new ScenePresence (a new child agent) in a fresh region.
// Request info about all the (root) agents in this region
// Note: This won't send data *to* other clients in that region (children don't send)
@@ -1018,7 +1020,9 @@ namespace OpenSim.Region.Framework.Scenes
{
AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
}
-
+
+ m_updateCount = UPDATE_COUNT; //KF: Trigger Anim updates to catch falling anim.
+
ControllingClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
AbsolutePosition, Velocity, Vector3.Zero, m_bodyRot, new Vector4(0,0,1,AbsolutePosition.Z - 0.5f), m_uuid, null, GetUpdatePriority(ControllingClient)));
}
@@ -1266,9 +1270,7 @@ namespace OpenSim.Region.Framework.Scenes
if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
{
- // TODO: This doesn't prevent the user from walking yet.
- // Setting parent ID would fix this, if we knew what value
- // to use. Or we could add a m_isSitting variable.
+ m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
}
@@ -1926,7 +1928,6 @@ namespace OpenSim.Region.Framework.Scenes
public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
{
-// Console.WriteLine("[RAYCASTRESULT]: Hit={0}, Point={1}, ID={2}, Dist={3}", hitYN, collisionPoint, localid, distance);
if(hitYN)
{
// m_pos = Av offset from prim center to make look like on center
@@ -2964,6 +2965,7 @@ namespace OpenSim.Region.Framework.Scenes
m_updateflag = true;
Velocity = force;
m_isNudging = false;
+ m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
}
}
}
@@ -3015,19 +3017,29 @@ namespace OpenSim.Region.Framework.Scenes
// Event called by the physics plugin to tell the avatar about a collision.
private void PhysicsCollisionUpdate(EventArgs e)
{
+ if (m_updateCount > 0) //KF: Update Anims for a short period. Many Anim
+ { // changes are very asynchronous.
+ Animator.UpdateMovementAnimations();
+ m_updateCount--;
+ }
+
if (e == null)
return;
- //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
// The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents(
// as of this comment the interval is set in AddToPhysicalScene
- Animator.UpdateMovementAnimations();
-
+
CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
Dictionary coldata = collisionData.m_objCollisionList;
CollisionPlane = Vector4.UnitW;
+ if (m_lastColCount != coldata.Count)
+ {
+ m_updateCount = 10;
+ m_lastColCount = coldata.Count;
+ }
+
if (coldata.Count != 0)
{
switch (Animator.CurrentMovementAnimation)
--
cgit v1.1
From b9d22aa8213b62eb0c368b345ccfc105367c1aba Mon Sep 17 00:00:00 2001
From: CasperW
Date: Thu, 26 Nov 2009 01:59:08 +0100
Subject: Add nudge right and left to avatar movement (faster reaction times
when stepping left or right.)
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4c8c94f..9b04422 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -169,7 +169,7 @@ namespace OpenSim.Region.Framework.Scenes
protected RegionInfo m_regionInfo;
protected ulong crossingFromRegion;
- private readonly Vector3[] Dir_Vectors = new Vector3[9];
+ private readonly Vector3[] Dir_Vectors = new Vector3[11];
private bool m_isNudging = false;
// Position of agent's camera in world (region cordinates)
@@ -236,6 +236,8 @@ namespace OpenSim.Region.Framework.Scenes
DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS,
DIR_CONTROL_FLAG_BACK_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG,
+ DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS,
+ DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG,
DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
}
@@ -722,12 +724,14 @@ namespace OpenSim.Region.Framework.Scenes
Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
Dir_Vectors[6] = new Vector3(0.5f, 0f, 0f); //FORWARD_NUDGE
Dir_Vectors[7] = new Vector3(-0.5f, 0f, 0f); //BACK_NUDGE
- Dir_Vectors[8] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
+ Dir_Vectors[8] = new Vector3(0f, 0.5f, 0f); //LEFT_NUDGE
+ Dir_Vectors[9] = new Vector3(0f, -0.5f, 0f); //RIGHT_NUDGE
+ Dir_Vectors[10] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
}
private Vector3[] GetWalkDirectionVectors()
{
- Vector3[] vector = new Vector3[9];
+ Vector3[] vector = new Vector3[11];
vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
vector[2] = Vector3.UnitY; //LEFT
@@ -736,13 +740,15 @@ namespace OpenSim.Region.Framework.Scenes
vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
- vector[8] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
+ vector[8] = Vector3.UnitY; //LEFT_NUDGE
+ vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
+ vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
return vector;
}
private bool[] GetDirectionIsNudge()
{
- bool[] isNudge = new bool[9];
+ bool[] isNudge = new bool[11];
isNudge[0] = false; //FORWARD
isNudge[1] = false; //BACK
isNudge[2] = false; //LEFT
@@ -751,7 +757,9 @@ namespace OpenSim.Region.Framework.Scenes
isNudge[5] = false; //DOWN
isNudge[6] = true; //FORWARD_NUDGE
isNudge[7] = true; //BACK_NUDGE
- isNudge[8] = true; //DOWN_Nudge
+ isNudge[8] = true; //LEFT_NUDGE
+ isNudge[9] = true; //RIGHT_NUDGE
+ isNudge[10] = true; //DOWN_Nudge
return isNudge;
}
--
cgit v1.1
From 63b6b9cdce6382e2285b1a9d76e68a0ac10602ef Mon Sep 17 00:00:00 2001
From: CasperW
Date: Thu, 26 Nov 2009 02:35:27 +0100
Subject: Added animation support for my last commit
---
OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs | 4 ++--
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 30a95ce..2c4a4b0 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -158,8 +158,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation
// Check control flags
bool heldForward = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS);
bool heldBack = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
- bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
- bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
+ bool heldLeft = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
+ bool heldRight = ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG || (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG);
//bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
//bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9b04422..a1bb244 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -742,7 +742,7 @@ namespace OpenSim.Region.Framework.Scenes
vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
vector[8] = Vector3.UnitY; //LEFT_NUDGE
vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
- vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
+ vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE
return vector;
}
--
cgit v1.1
From ac2fcbe224d4877dccc4d73e9c58771e40a4ae1c Mon Sep 17 00:00:00 2001
From: CasperW
Date: Thu, 26 Nov 2009 15:17:44 +0100
Subject: Improvements to rAdmin admin_shutdown and admin_restart. Both methods
can now accept a parameter of noticetype = dialog in order to display a blue
persistant dropdown instead of a short notice. Added an optional and
configurable delay to the restart method, defaulting at 30 seconds as before.
Both methods can also accept a noticetype = none dialog in order to act
silently.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 4ffa1a2..be1d4bf 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -873,6 +873,15 @@ namespace OpenSim.Region.Framework.Scenes
/// float indicating duration before restart.
public virtual void Restart(float seconds)
{
+ Restart(seconds, true);
+ }
+
+ ///
+ /// Given float seconds, this will restart the region. showDialog will optionally alert the users.
+ ///
+ /// float indicating duration before restart.
+ public virtual void Restart(float seconds, bool showDialog)
+ {
// notifications are done in 15 second increments
// so .. if the number of seconds is less then 15 seconds, it's not really a restart request
// It's a 'Cancel restart' request.
@@ -893,8 +902,11 @@ namespace OpenSim.Region.Framework.Scenes
m_restartTimer.Elapsed += new ElapsedEventHandler(RestartTimer_Elapsed);
m_log.Info("[REGION]: Restarting Region in " + (seconds / 60) + " minutes");
m_restartTimer.Start();
- m_dialogModule.SendNotificationToUsersInRegion(
- UUID.Random(), String.Empty, RegionInfo.RegionName + ": Restarting in 2 Minutes");
+ if (showDialog)
+ {
+ m_dialogModule.SendNotificationToUsersInRegion(
+ UUID.Random(), String.Empty, RegionInfo.RegionName + ": Restarting in " + (seconds / 60).ToString() + " Minutes");
+ }
}
}
--
cgit v1.1
From 22c325aa5ae06b897e5eb10404c0aa3727f8237b Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 26 Nov 2009 12:08:20 +0000
Subject: Remove GetAssemblyName and friends from the SE interface. It's now
handled internally
---
.../Framework/Scenes/SceneObjectGroup.Inventory.cs | 93 ++--------------------
.../Framework/Scenes/SceneObjectPartInventory.cs | 30 -------
2 files changed, 5 insertions(+), 118 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 3cec77f..9a6f2b8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -309,26 +309,15 @@ namespace OpenSim.Region.Framework.Scenes
public string GetStateSnapshot()
{
- //m_log.Debug(" >>> GetStateSnapshot <<<");
-
- List assemblies = new List();
Dictionary states = new Dictionary();
foreach (SceneObjectPart part in m_parts.Values)
{
- foreach (string a in part.Inventory.GetScriptAssemblies())
- {
- if (a != "" && !assemblies.Contains(a))
- assemblies.Add(a);
- }
-
foreach (KeyValuePair s in part.Inventory.GetScriptStates())
- {
states[s.Key] = s.Value;
- }
}
- if (states.Count < 1 || assemblies.Count < 1)
+ if (states.Count < 1)
return "";
XmlDocument xmldoc = new XmlDocument();
@@ -342,94 +331,21 @@ namespace OpenSim.Region.Framework.Scenes
xmldoc.AppendChild(rootElement);
- XmlElement wrapper = xmldoc.CreateElement("", "Assemblies",
- "");
- rootElement.AppendChild(wrapper);
-
- foreach (string assembly in assemblies)
- {
- string fn = Path.GetFileName(assembly);
- if (fn == String.Empty)
- continue;
-
- String filedata = String.Empty;
-
- if (File.Exists(assembly+".text"))
- {
- FileInfo tfi = new FileInfo(assembly+".text");
-
- if (tfi == null)
- continue;
-
- Byte[] tdata = new Byte[tfi.Length];
-
- try
- {
- FileStream tfs = File.Open(assembly+".text", FileMode.Open, FileAccess.Read);
- tfs.Read(tdata, 0, tdata.Length);
- tfs.Close();
- }
- catch (Exception e)
- {
- m_log.DebugFormat("[SOG]: Unable to open script textfile {0}, reason: {1}", assembly+".text", e.Message);
- }
-
- filedata = new System.Text.ASCIIEncoding().GetString(tdata);
- }
- else
- {
- FileInfo fi = new FileInfo(assembly);
-
- if (fi == null)
- continue;
-
- Byte[] data = new Byte[fi.Length];
-
- try
- {
- FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read);
- fs.Read(data, 0, data.Length);
- fs.Close();
- }
- catch (Exception e)
- {
- m_log.DebugFormat("[SOG]: Unable to open script assembly {0}, reason: {1}", assembly, e.Message);
- }
-
- filedata = System.Convert.ToBase64String(data);
- }
- XmlElement assemblyData = xmldoc.CreateElement("", "Assembly", "");
- XmlAttribute assemblyName = xmldoc.CreateAttribute("", "Filename", "");
- assemblyName.Value = fn;
- assemblyData.Attributes.Append(assemblyName);
-
- assemblyData.InnerText = filedata;
-
- wrapper.AppendChild(assemblyData);
- }
-
- wrapper = xmldoc.CreateElement("", "ScriptStates",
+ XmlElement wrapper = xmldoc.CreateElement("", "ScriptStates",
"");
rootElement.AppendChild(wrapper);
foreach (KeyValuePair state in states)
{
- XmlElement stateData = xmldoc.CreateElement("", "State", "");
-
- XmlAttribute stateID = xmldoc.CreateAttribute("", "UUID", "");
- stateID.Value = state.Key.ToString();
- stateData.Attributes.Append(stateID);
-
XmlDocument sdoc = new XmlDocument();
sdoc.LoadXml(state.Value);
- XmlNodeList rootL = sdoc.GetElementsByTagName("ScriptState");
+ XmlNodeList rootL = sdoc.GetElementsByTagName("State");
XmlNode rootNode = rootL[0];
XmlNode newNode = xmldoc.ImportNode(rootNode, true);
- stateData.AppendChild(newNode);
- wrapper.AppendChild(stateData);
+ wrapper.AppendChild(newNode);
}
return xmldoc.InnerXml;
@@ -437,6 +353,7 @@ namespace OpenSim.Region.Framework.Scenes
public void SetState(string objXMLData, UUID RegionID)
{
+m_log.Debug("SetState called with " + objXMLData);
if (objXMLData == String.Empty)
return;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index abb04cd..2ef8258 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -880,36 +880,6 @@ namespace OpenSim.Region.Framework.Scenes
return ret;
}
- public string[] GetScriptAssemblies()
- {
- IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
-
- List ret = new List();
- if (engines == null) // No engine at all
- return new string[0];
-
- foreach (TaskInventoryItem item in m_items.Values)
- {
- if (item.InvType == (int)InventoryType.LSL)
- {
- foreach (IScriptModule e in engines)
- {
- if (e != null)
- {
- string n = e.GetAssemblyName(item.ItemID);
- if (n != String.Empty)
- {
- if (!ret.Contains(n))
- ret.Add(n);
- break;
- }
- }
- }
- }
- }
- return ret.ToArray();
- }
-
public Dictionary GetScriptStates()
{
IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
--
cgit v1.1
From a27d33cb634c78425eaa34cb5efd113e131baa51 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 26 Nov 2009 12:16:42 +0000
Subject: Remove the old remoting-type interregion code for prim/script
crossing
---
OpenSim/Region/Framework/Scenes/Scene.cs | 99 ----------------------
.../Framework/Scenes/SceneCommunicationService.cs | 72 ----------------
2 files changed, 171 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index be1d4bf..f932659 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2393,103 +2393,6 @@ namespace OpenSim.Region.Framework.Scenes
return successYN;
}
- ///
- /// Handle a scene object that is crossing into this region from another.
- /// NOTE: Unused as of 2009-02-09. Soon to be deleted.
- ///
- ///
- ///
- ///
- ///
- ///
- public bool IncomingInterRegionPrimGroup(UUID primID, string objXMLData, int XMLMethod)
- {
- if (XMLMethod == 0)
- {
- m_log.DebugFormat("[INTERREGION]: A new prim {0} arrived from a neighbor", primID);
- SceneObjectGroup sceneObject = m_serialiser.DeserializeGroupFromXml2(objXMLData);
- if (sceneObject.IsAttachment)
- sceneObject.RootPart.ObjectFlags |= (uint)PrimFlags.Phantom;
-
- return AddSceneObject(sceneObject);
- }
- else if ((XMLMethod == 100) && m_allowScriptCrossings)
- {
- m_log.Warn("[INTERREGION]: Prim state data arrived from a neighbor");
-
- XmlDocument doc = new XmlDocument();
- doc.LoadXml(objXMLData);
-
- XmlNodeList rootL = doc.GetElementsByTagName("ScriptData");
- if (rootL.Count == 1)
- {
- XmlNode rootNode = rootL[0];
- if (rootNode != null)
- {
- XmlNodeList partL = rootNode.ChildNodes;
-
- foreach (XmlNode part in partL)
- {
- XmlNodeList nodeL = part.ChildNodes;
-
- switch (part.Name)
- {
- case "Assemblies":
- foreach (XmlNode asm in nodeL)
- {
- string fn = asm.Attributes.GetNamedItem("Filename").Value;
-
- Byte[] filedata = Convert.FromBase64String(asm.InnerText);
- string path = Path.Combine("ScriptEngines", RegionInfo.RegionID.ToString());
- path = Path.Combine(path, fn);
-
- if (!File.Exists(path))
- {
- FileStream fs = File.Create(path);
- fs.Write(filedata, 0, filedata.Length);
- fs.Close();
- }
- }
- break;
- case "ScriptStates":
- foreach (XmlNode st in nodeL)
- {
- string id = st.Attributes.GetNamedItem("UUID").Value;
- UUID uuid = new UUID(id);
- XmlNode state = st.ChildNodes[0];
-
- XmlDocument sdoc = new XmlDocument();
- XmlNode sxmlnode = sdoc.CreateNode(
- XmlNodeType.XmlDeclaration,
- "", "");
- sdoc.AppendChild(sxmlnode);
-
- XmlNode newnode = sdoc.ImportNode(state, true);
- sdoc.AppendChild(newnode);
-
- string spath = Path.Combine("ScriptEngines", RegionInfo.RegionID.ToString());
- spath = Path.Combine(spath, uuid.ToString());
- FileStream sfs = File.Create(spath + ".state");
- ASCIIEncoding enc = new ASCIIEncoding();
- Byte[] buf = enc.GetBytes(sdoc.InnerXml);
- sfs.Write(buf, 0, buf.Length);
- sfs.Close();
- }
- break;
- }
- }
- }
- }
-
- SceneObjectPart RootPrim = GetSceneObjectPart(primID);
- RootPrim.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1);
-
- return true;
- }
-
- return true;
- }
-
public bool IncomingCreateObject(ISceneObject sog)
{
//m_log.Debug(" >>> IncomingCreateObject <<< " + ((SceneObjectGroup)sog).AbsolutePosition + " deleted? " + ((SceneObjectGroup)sog).IsDeleted);
@@ -3362,7 +3265,6 @@ namespace OpenSim.Region.Framework.Scenes
m_sceneGridService.OnCloseAgentConnection += IncomingCloseAgent;
//m_eventManager.OnRegionUp += OtherRegionUp;
//m_sceneGridService.OnChildAgentUpdate += IncomingChildAgentDataUpdate;
- m_sceneGridService.OnExpectPrim += IncomingInterRegionPrimGroup;
//m_sceneGridService.OnRemoveKnownRegionFromAvatar += HandleRemoveKnownRegionsFromAvatar;
m_sceneGridService.OnLogOffUser += HandleLogOffUserFromGrid;
m_sceneGridService.KiPrimitive += SendKillObject;
@@ -3386,7 +3288,6 @@ namespace OpenSim.Region.Framework.Scenes
m_sceneGridService.KiPrimitive -= SendKillObject;
m_sceneGridService.OnLogOffUser -= HandleLogOffUserFromGrid;
//m_sceneGridService.OnRemoveKnownRegionFromAvatar -= HandleRemoveKnownRegionsFromAvatar;
- m_sceneGridService.OnExpectPrim -= IncomingInterRegionPrimGroup;
//m_sceneGridService.OnChildAgentUpdate -= IncomingChildAgentDataUpdate;
//m_eventManager.OnRegionUp -= OtherRegionUp;
m_sceneGridService.OnExpectUser -= HandleNewUserConnection;
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 76c6cab..3892769 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -85,7 +85,6 @@ namespace OpenSim.Region.Framework.Scenes
///
/// A Prim will arrive shortly
///
- public event ExpectPrimDelegate OnExpectPrim;
public event CloseAgentConnection OnCloseAgentConnection;
///
@@ -116,7 +115,6 @@ namespace OpenSim.Region.Framework.Scenes
private AgentCrossing handlerAvatarCrossingIntoRegion = null; // OnAvatarCrossingIntoRegion;
private ExpectUserDelegate handlerExpectUser = null; // OnExpectUser;
- private ExpectPrimDelegate handlerExpectPrim = null; // OnExpectPrim;
private CloseAgentConnection handlerCloseAgentConnection = null; // OnCloseAgentConnection;
private PrimCrossing handlerPrimCrossingIntoRegion = null; // OnPrimCrossingIntoRegion;
//private RegionUp handlerRegionUp = null; // OnRegionUp;
@@ -147,30 +145,6 @@ namespace OpenSim.Region.Framework.Scenes
/// Thrown if region registration fails.
public void RegisterRegion(IInterregionCommsOut comms_out, RegionInfo regionInfos)
{
- //m_interregionCommsOut = comms_out;
-
- //m_regionInfo = regionInfos;
- //m_commsProvider.GridService.gdebugRegionName = regionInfos.RegionName;
- //regionCommsHost = m_commsProvider.GridService.RegisterRegion(m_regionInfo);
-
- //if (regionCommsHost != null)
- //{
- // //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: registered with gridservice and got" + regionCommsHost.ToString());
-
- // regionCommsHost.debugRegionName = regionInfos.RegionName;
- // regionCommsHost.OnExpectPrim += IncomingPrimCrossing;
- // regionCommsHost.OnExpectUser += NewUserConnection;
- // regionCommsHost.OnAvatarCrossingIntoRegion += AgentCrossing;
- // regionCommsHost.OnCloseAgentConnection += CloseConnection;
- // regionCommsHost.OnRegionUp += newRegionUp;
- // regionCommsHost.OnChildAgentUpdate += ChildAgentUpdate;
- // regionCommsHost.OnLogOffUser += GridLogOffUser;
- // regionCommsHost.OnGetLandData += FetchLandData;
- //}
- //else
- //{
- // //m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: registered with gridservice and got null");
- //}
}
///
@@ -179,31 +153,6 @@ namespace OpenSim.Region.Framework.Scenes
///
public void Close()
{
-
- //if (regionCommsHost != null)
- //{
- // regionCommsHost.OnLogOffUser -= GridLogOffUser;
- // regionCommsHost.OnChildAgentUpdate -= ChildAgentUpdate;
- // regionCommsHost.OnRegionUp -= newRegionUp;
- // regionCommsHost.OnExpectUser -= NewUserConnection;
- // regionCommsHost.OnExpectPrim -= IncomingPrimCrossing;
- // regionCommsHost.OnAvatarCrossingIntoRegion -= AgentCrossing;
- // regionCommsHost.OnCloseAgentConnection -= CloseConnection;
- // regionCommsHost.OnGetLandData -= FetchLandData;
-
- // try
- // {
- // m_commsProvider.GridService.DeregisterRegion(m_regionInfo);
- // }
- // catch (Exception e)
- // {
- // m_log.ErrorFormat(
- // "[GRID]: Deregistration of region {0} from the grid failed - {1}. Continuing",
- // m_regionInfo.RegionName, e);
- // }
-
- // regionCommsHost = null;
- //}
}
#region CommsManager Event handlers
@@ -263,27 +212,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- ///
- /// We have a new prim from a neighbor
- ///
- /// unique ID for the primative
- /// XML2 encoded data of the primative
- /// An Int that represents the version of the XMLMethod
- /// True if the prim was accepted, false if it was not
- protected bool IncomingPrimCrossing(UUID primID, String objXMLData, int XMLMethod)
- {
- handlerExpectPrim = OnExpectPrim;
- if (handlerExpectPrim != null)
- {
- return handlerExpectPrim(primID, objXMLData, XMLMethod);
- }
- else
- {
- return false;
- }
-
- }
-
protected void PrimCrossing(UUID primID, Vector3 position, bool isPhysical)
{
handlerPrimCrossingIntoRegion = OnPrimCrossingIntoRegion;
--
cgit v1.1
From 5dedacca3c9692948f29f5198dd444efe7c8526d Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Thu, 26 Nov 2009 20:37:08 +0100
Subject: First attempt at mult-sit on large single prims.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 91 +++++++++++++++---------
1 file changed, 58 insertions(+), 33 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a65b84b..e677cfd 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -117,6 +117,7 @@ namespace OpenSim.Region.Framework.Scenes
public Vector4 CollisionPlane = Vector4.UnitW;
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
+ private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
private Vector3 m_lastPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
@@ -1644,9 +1645,9 @@ namespace OpenSim.Region.Framework.Scenes
{
AddToPhysicalScene(false);
}
-
m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
m_parentPosition = Vector3.Zero;
+//Console.WriteLine("Stand Pos {0}", m_pos);
m_parentID = 0;
SendFullUpdateToAllClients();
@@ -1740,21 +1741,37 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("SendSitResponse offset=" + offset + " UnOccup=" + SitTargetUnOccupied +
// " TargSet=" + SitTargetisSet);
-
- if (SitTargetisSet && SitTargetUnOccupied)
- {
- part.SetAvatarOnSitTarget(UUID);
- offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z);
- sitOrientation = avSitOrientation;
- autopilot = false; // Jump direct to scripted llSitPos()
- }
+ // Sit analysis rewritten by KF 091125
+ if (SitTargetisSet) // scipted sit
+ {
+ if (SitTargetUnOccupied)
+ {
+ part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
+ offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
+ sitOrientation = avSitOrientation; // Change rotatione to the scripted one
+ autopilot = false; // Jump direct to scripted llSitPos()
+ }
+ else return;
+ }
+ else // Not Scripted
+ {
+ if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) ) // large prim
+ {
+ Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ m_avUnscriptedSitPos = offset * partIRot; // sit where clicked
+ pos = part.AbsolutePosition + (offset * partIRot);
+ }
+ else // small prim
+ {
+ if (SitTargetUnOccupied)
+ {
+ m_avUnscriptedSitPos = Vector3.Zero; // Sit on unoccupied small prim center
+ pos = part.AbsolutePosition;
+ }
+ else return; // occupied small
+ } // end large/small
+ } // end Scripted/not
- pos = part.AbsolutePosition + offset; // Region position where clicked
- //if (Math.Abs(part.AbsolutePosition.Z - AbsolutePosition.Z) > 1)
- //{
- // offset = pos;
- //autopilot = false;
- //}
if (m_physicsActor != null)
{
// If we're not using the client autopilot, we're immediately warping the avatar to the location
@@ -1887,8 +1904,9 @@ namespace OpenSim.Region.Framework.Scenes
{
// Non-scripted sit by Kitto Flora 21Nov09
// Calculate angle of line from prim to Av
- float y_diff = (m_avInitialPos.Y - part.AbsolutePosition.Y);
- float x_diff = ( m_avInitialPos.X - part.AbsolutePosition.X);
+ Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
+ float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
+ float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
@@ -1896,23 +1914,30 @@ namespace OpenSim.Region.Framework.Scenes
// NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
// Av sits at world euler <0,0, z>, translated by part rotation
m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
- m_pos = new Vector3(0f, 0f, 0.05f) +
- (new Vector3(0.0f, 0f, 0.625f) * partIRot) +
- (new Vector3(0.25f, 0f, 0.0f) * m_bodyRot); // sit at center of prim
m_parentPosition = part.AbsolutePosition;
- //Set up raytrace to find top surface of prim
- Vector3 size = part.Scale;
- float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
- Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
- Vector3 down = new Vector3(0f, 0f, -1f);
- m_scene.PhysicsScene.RaycastWorld(
- start, // Vector3 position,
- down, // Vector3 direction,
- mag, // float length,
- SitAltitudeCallback); // retMethod
- }
- }
- else
+ if(m_avUnscriptedSitPos != Vector3.Zero)
+ { // sit where clicked on big prim
+ m_pos = m_avUnscriptedSitPos + (new Vector3(0.0f, 0f, 0.625f) * partIRot);
+ }
+ else
+ { // sit at center of small prim
+ m_pos = new Vector3(0f, 0f, 0.05f) +
+ (new Vector3(0.0f, 0f, 0.625f) * partIRot) +
+ (new Vector3(0.25f, 0f, 0.0f) * m_bodyRot);
+ //Set up raytrace to find top surface of prim
+ Vector3 size = part.Scale;
+ float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
+ Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
+ Vector3 down = new Vector3(0f, 0f, -1f);
+ m_scene.PhysicsScene.RaycastWorld(
+ start, // Vector3 position,
+ down, // Vector3 direction,
+ mag, // float length,
+ SitAltitudeCallback); // retMethod
+ } // end small/big
+ } // end scripted/not
+ }
+ else // no Av
{
return;
}
--
cgit v1.1
From aa695e92f7d3b56e6e3371be021d9e6acf91077c Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 27 Nov 2009 08:58:26 +0000
Subject: Reset update flag when a SOG is deleted. This fixes llDie();
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 1 +
1 file changed, 1 insertion(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index f36ff1d..26a843e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1199,6 +1199,7 @@ namespace OpenSim.Region.Framework.Scenes
if (!silent)
{
+ part.UpdateFlag = 0;
if (part == m_rootPart)
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
}
--
cgit v1.1
From 9888f95068373f1bfdb289e85560a7d873d22696 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Fri, 27 Nov 2009 18:29:03 +0100
Subject: Convert multiple lock()s which directly hinder script performance in
linksets to ReaderWriterLockSlim.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 400 ++++++++++++++-------
1 file changed, 277 insertions(+), 123 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 26a843e..fb34ddc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -98,6 +98,66 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_hasGroupChanged = false;
private long timeFirstChanged;
private long timeLastChanged;
+ private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
+
+ public void lockPartsForRead(bool locked)
+ {
+ if (locked)
+ {
+ if (m_partsLock.RecursiveReadCount > 0)
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
+ m_partsLock.ExitReadLock();
+ }
+ if (m_partsLock.RecursiveWriteCount > 0)
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested. This should not happen and means something needs to be fixed.");
+ m_partsLock.ExitWriteLock();
+ }
+
+ while (!m_partsLock.TryEnterReadLock(60000))
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] Thread lock detected while trying to aquire READ lock of m_parts in SceneObjectGroup. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
+ if (m_partsLock.IsWriteLockHeld)
+ {
+ m_partsLock = new System.Threading.ReaderWriterLockSlim();
+ }
+ }
+ }
+ else
+ {
+ m_partsLock.ExitReadLock();
+ }
+ }
+ public void lockPartsForWrite(bool locked)
+ {
+ if (locked)
+ {
+ if (m_partsLock.RecursiveReadCount > 0)
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] Recursive write lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
+ m_partsLock.ExitReadLock();
+ }
+ if (m_partsLock.RecursiveWriteCount > 0)
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] Recursive write lock requested. This should not happen and means something needs to be fixed.");
+ m_partsLock.ExitWriteLock();
+ }
+
+ while (!m_partsLock.TryEnterWriteLock(60000))
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] Thread lock detected while trying to aquire WRITE lock of m_scripts in XEngine. I'm going to try to solve the thread lock automatically to preserve region stability, but this needs to be fixed.");
+ if (m_partsLock.IsWriteLockHeld)
+ {
+ m_partsLock = new System.Threading.ReaderWriterLockSlim();
+ }
+ }
+ }
+ else
+ {
+ m_partsLock.ExitWriteLock();
+ }
+ }
public bool HasGroupChanged
{
@@ -243,13 +303,16 @@ namespace OpenSim.Region.Framework.Scenes
set
{
m_regionHandle = value;
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.RegionHandle = m_regionHandle;
+
}
}
+ lockPartsForRead(false);
}
}
@@ -275,13 +338,16 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.CrossPrimGroupIntoNewRegion(val, this, true);
}
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.GroupPosition = val;
+
}
}
+ lockPartsForRead(false);
//if (m_rootPart.PhysActor != null)
//{
@@ -432,13 +498,16 @@ namespace OpenSim.Region.Framework.Scenes
public void SetFromItemID(UUID AssetId)
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.FromItemID = AssetId;
+
}
}
+ lockPartsForRead(false);
}
public UUID GetFromItemID()
@@ -505,10 +574,11 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 maxScale = Vector3.Zero;
Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f);
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
Vector3 partscale = part.Scale;
Vector3 partoffset = part.OffsetPosition;
@@ -519,8 +589,11 @@ namespace OpenSim.Region.Framework.Scenes
maxScale.X = (partscale.X + partoffset.X > maxScale.X) ? partscale.X + partoffset.X : maxScale.X;
maxScale.Y = (partscale.Y + partoffset.Y > maxScale.Y) ? partscale.Y + partoffset.Y : maxScale.Y;
maxScale.Z = (partscale.Z + partoffset.Z > maxScale.Z) ? partscale.Z + partoffset.Z : maxScale.Z;
+
}
}
+ lockPartsForRead(false);
+
finalScale.X = (minScale.X > maxScale.X) ? minScale.X : maxScale.X;
finalScale.Y = (minScale.Y > maxScale.Y) ? minScale.Y : maxScale.Y;
finalScale.Z = (minScale.Z > maxScale.Z) ? minScale.Z : maxScale.Z;
@@ -536,10 +609,11 @@ namespace OpenSim.Region.Framework.Scenes
EntityIntersection result = new EntityIntersection();
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
// Temporary commented to stop compiler warning
//Vector3 partPosition =
// new Vector3(part.AbsolutePosition.X, part.AbsolutePosition.Y, part.AbsolutePosition.Z);
@@ -567,8 +641,10 @@ namespace OpenSim.Region.Framework.Scenes
result.distance = inter.distance;
}
}
+
}
}
+ lockPartsForRead(false);
return result;
}
@@ -581,10 +657,11 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 GetAxisAlignedBoundingBox(out float offsetHeight)
{
float maxX = -256f, maxY = -256f, maxZ = -256f, minX = 256f, minY = 256f, minZ = 256f;
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
Vector3 worldPos = part.GetWorldPosition();
Vector3 offset = worldPos - AbsolutePosition;
Quaternion worldRot;
@@ -643,6 +720,8 @@ namespace OpenSim.Region.Framework.Scenes
backBottomRight.Y = orig.Y + (part.Scale.Y / 2);
backBottomRight.Z = orig.Z - (part.Scale.Z / 2);
+
+
//m_log.InfoFormat("pre corner 1 is {0} {1} {2}", frontTopLeft.X, frontTopLeft.Y, frontTopLeft.Z);
//m_log.InfoFormat("pre corner 2 is {0} {1} {2}", frontTopRight.X, frontTopRight.Y, frontTopRight.Z);
//m_log.InfoFormat("pre corner 3 is {0} {1} {2}", frontBottomRight.X, frontBottomRight.Y, frontBottomRight.Z);
@@ -814,6 +893,7 @@ namespace OpenSim.Region.Framework.Scenes
minZ = backBottomLeft.Z;
}
}
+ lockPartsForRead(false);
Vector3 boundingBox = new Vector3(maxX - minX, maxY - minY, maxZ - minZ);
@@ -842,17 +922,20 @@ namespace OpenSim.Region.Framework.Scenes
Dictionary states = new Dictionary();
// Capture script state while holding the lock
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
Dictionary pstates = part.Inventory.GetScriptStates();
foreach (UUID itemid in pstates.Keys)
{
states.Add(itemid, pstates[itemid]);
}
+
}
}
+ lockPartsForRead(false);
if (states.Count > 0)
{
@@ -1014,13 +1097,16 @@ namespace OpenSim.Region.Framework.Scenes
public override void UpdateMovement()
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.UpdateMovement();
+
}
}
+ lockPartsForRead(false);
}
public ushort GetTimeDilation()
@@ -1064,7 +1150,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void AddPart(SceneObjectPart part)
{
- lock (m_parts)
+ lockPartsForWrite(true);
{
part.SetParent(this);
m_parts.Add(part.UUID, part);
@@ -1074,6 +1160,7 @@ namespace OpenSim.Region.Framework.Scenes
if (part.LinkNum == 2 && RootPart != null)
RootPart.LinkNum = 1;
}
+ lockPartsForWrite(false);
}
///
@@ -1081,28 +1168,33 @@ namespace OpenSim.Region.Framework.Scenes
///
private void UpdateParentIDs()
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
if (part.UUID != m_rootPart.UUID)
{
part.ParentID = m_rootPart.LocalId;
}
+
}
}
+ lockPartsForRead(false);
}
public void RegenerateFullIDs()
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.UUID = UUID.Random();
-
+
}
}
+ lockPartsForRead(false);
}
// helper provided for parts.
@@ -1183,29 +1275,33 @@ namespace OpenSim.Region.Framework.Scenes
DetachFromBackup();
- lock (m_parts)
+ lockPartsForRead(true);
+ List values = new List(m_parts.Values);
+ lockPartsForRead(false);
+
+ foreach (SceneObjectPart part in values)
{
- foreach (SceneObjectPart part in m_parts.Values)
- {
// part.Inventory.RemoveScriptInstances();
-
- ScenePresence[] avatars = Scene.GetScenePresences();
- for (int i = 0; i < avatars.Length; i++)
+
+ ScenePresence[] avatars = Scene.GetScenePresences();
+ for (int i = 0; i < avatars.Length; i++)
+ {
+ if (avatars[i].ParentID == LocalId)
{
- if (avatars[i].ParentID == LocalId)
- {
- avatars[i].StandUp();
- }
+ avatars[i].StandUp();
+ }
- if (!silent)
- {
- part.UpdateFlag = 0;
- if (part == m_rootPart)
- avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
- }
+ if (!silent)
+ {
+ part.UpdateFlag = 0;
+ if (part == m_rootPart)
+ avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
}
}
+
}
+
+
}
public void AddScriptLPS(int count)
@@ -1230,17 +1326,20 @@ namespace OpenSim.Region.Framework.Scenes
scriptEvents aggregateScriptEvents=0;
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
if (part == null)
continue;
if (part != RootPart)
part.ObjectFlags = objectflagupdate;
aggregateScriptEvents |= part.AggregateScriptEvents;
+
}
}
+ lockPartsForRead(false);
m_scriptListens_atTarget = ((aggregateScriptEvents & scriptEvents.at_target) != 0);
m_scriptListens_notAtTarget = ((aggregateScriptEvents & scriptEvents.not_at_target) != 0);
@@ -1273,42 +1372,52 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ApplyPhysics(bool m_physicalPrim)
{
- lock (m_parts)
+ lockPartsForRead(true);
+
+ if (m_parts.Count > 1)
{
- if (m_parts.Count > 1)
+ List values = new List(m_parts.Values);
+ lockPartsForRead(false);
+ m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_physicalPrim);
+ foreach (SceneObjectPart part in values)
{
- m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_physicalPrim);
- foreach (SceneObjectPart part in m_parts.Values)
+
+ if (part.LocalId != m_rootPart.LocalId)
{
- if (part.LocalId != m_rootPart.LocalId)
- {
- part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), part.VolumeDetectActive, m_physicalPrim);
- }
+ part.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), part.VolumeDetectActive, m_physicalPrim);
}
- // Hack to get the physics scene geometries in the right spot
- ResetChildPrimPhysicsPositions();
- }
- else
- {
- m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_physicalPrim);
}
+ // Hack to get the physics scene geometries in the right spot
+ ResetChildPrimPhysicsPositions();
+ }
+ else
+ {
+ lockPartsForRead(false);
+ m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_physicalPrim);
}
}
public void SetOwnerId(UUID userId)
{
- ForEachPart(delegate(SceneObjectPart part) { part.OwnerID = userId; });
+ ForEachPart(delegate(SceneObjectPart part)
+ {
+
+ part.OwnerID = userId;
+
+ });
}
public void ForEachPart(Action whatToDo)
{
- lock (m_parts)
+ lockPartsForRead(true);
+ List values = new List(m_parts.Values);
+ lockPartsForRead(false);
+ foreach (SceneObjectPart part in values)
{
- foreach (SceneObjectPart part in m_parts.Values)
- {
- whatToDo(part);
- }
+
+ whatToDo(part);
+
}
}
@@ -1407,14 +1516,17 @@ namespace OpenSim.Region.Framework.Scenes
{
SendPartFullUpdate(remoteClient, RootPart, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, RootPart.UUID));
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
if (part != RootPart)
SendPartFullUpdate(remoteClient, part, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, part.UUID));
+
}
}
+ lockPartsForRead(false);
}
///
@@ -1509,10 +1621,11 @@ namespace OpenSim.Region.Framework.Scenes
List partList;
- lock (m_parts)
- {
- partList = new List(m_parts.Values);
- }
+ lockPartsForRead(true);
+
+ partList = new List(m_parts.Values);
+
+ lockPartsForRead(false);
partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
{
@@ -1835,10 +1948,11 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed);
newPart.SetParent(this);
- lock (m_parts)
+ lockPartsForWrite(true);
{
m_parts.Add(newPart.UUID, newPart);
}
+ lockPartsForWrite(false);
SetPartAsNonRoot(newPart);
@@ -1901,7 +2015,7 @@ namespace OpenSim.Region.Framework.Scenes
//if ((RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
// return;
- lock (m_parts)
+ lockPartsForRead(true);
{
bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0);
@@ -1919,34 +2033,43 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.SendScheduledUpdates();
+
}
}
+ lockPartsForRead(false);
}
public void ScheduleFullUpdateToAvatar(ScenePresence presence)
{
RootPart.AddFullUpdateToAvatar(presence);
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
if (part != RootPart)
part.AddFullUpdateToAvatar(presence);
+
}
}
+ lockPartsForRead(false);
}
public void ScheduleTerseUpdateToAvatar(ScenePresence presence)
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.AddTerseUpdateToAvatar(presence);
+
}
}
+ lockPartsForRead(false);
}
///
@@ -1957,14 +2080,17 @@ namespace OpenSim.Region.Framework.Scenes
checkAtTargets();
RootPart.ScheduleFullUpdate();
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
if (part != RootPart)
part.ScheduleFullUpdate();
+
}
}
+ lockPartsForRead(false);
}
///
@@ -1972,13 +2098,16 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleGroupForTerseUpdate()
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
part.ScheduleTerseUpdate();
+
}
}
+ lockPartsForRead(false);
}
///
@@ -1991,14 +2120,17 @@ namespace OpenSim.Region.Framework.Scenes
RootPart.SendFullUpdateToAllClients();
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
+
if (part != RootPart)
part.SendFullUpdateToAllClients();
+
}
}
+ lockPartsForRead(false);
}
///
@@ -2029,14 +2161,15 @@ namespace OpenSim.Region.Framework.Scenes
{
if (IsDeleted)
return;
-
- lock (m_parts)
+
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
part.SendTerseUpdateToAllClients();
}
}
+ lockPartsForRead(false);
}
#endregion
@@ -2050,16 +2183,18 @@ namespace OpenSim.Region.Framework.Scenes
/// null if no child part with that linknum or child part
public SceneObjectPart GetLinkNumPart(int linknum)
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
if (part.LinkNum == linknum)
{
+ lockPartsForRead(false);
return part;
}
}
}
+ lockPartsForRead(false);
return null;
}
@@ -2087,17 +2222,19 @@ namespace OpenSim.Region.Framework.Scenes
public SceneObjectPart GetChildPart(uint localID)
{
//m_log.DebugFormat("Entered looking for {0}", localID);
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
//m_log.DebugFormat("Found {0}", part.LocalId);
if (part.LocalId == localID)
{
+ lockPartsForRead(false);
return part;
}
}
}
+ lockPartsForRead(false);
return null;
}
@@ -2127,17 +2264,19 @@ namespace OpenSim.Region.Framework.Scenes
public bool HasChildPrim(uint localID)
{
//m_log.DebugFormat("Entered HasChildPrim looking for {0}", localID);
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
//m_log.DebugFormat("Found {0}", part.LocalId);
if (part.LocalId == localID)
{
+ lockPartsForRead(false);
return true;
}
}
}
+ lockPartsForRead(false);
return false;
}
@@ -2187,53 +2326,57 @@ namespace OpenSim.Region.Framework.Scenes
if (m_rootPart.LinkNum == 0)
m_rootPart.LinkNum = 1;
- lock (m_parts)
- {
- m_parts.Add(linkPart.UUID, linkPart);
+ lockPartsForWrite(true);
+
+ m_parts.Add(linkPart.UUID, linkPart);
+
+ lockPartsForWrite(false);
- // Insert in terms of link numbers, the new links
- // before the current ones (with the exception of
- // the root prim. Shuffle the old ones up
- foreach (KeyValuePair kvp in m_parts)
+ // Insert in terms of link numbers, the new links
+ // before the current ones (with the exception of
+ // the root prim. Shuffle the old ones up
+ lockPartsForRead(true);
+ foreach (KeyValuePair kvp in m_parts)
+ {
+ if (kvp.Value.LinkNum != 1)
{
- if (kvp.Value.LinkNum != 1)
- {
- // Don't update root prim link number
- kvp.Value.LinkNum += objectGroup.PrimCount;
- }
+ // Don't update root prim link number
+ kvp.Value.LinkNum += objectGroup.PrimCount;
}
+ }
+ lockPartsForRead(false);
- linkPart.LinkNum = 2;
+ linkPart.LinkNum = 2;
- linkPart.SetParent(this);
- linkPart.AddFlag(PrimFlags.CreateSelected);
+ linkPart.SetParent(this);
+ linkPart.AddFlag(PrimFlags.CreateSelected);
- //if (linkPart.PhysActor != null)
- //{
- // m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor);
-
- //linkPart.PhysActor = null;
- //}
+ //if (linkPart.PhysActor != null)
+ //{
+ // m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor);
+
+ //linkPart.PhysActor = null;
+ //}
- //TODO: rest of parts
- int linkNum = 3;
- foreach (SceneObjectPart part in objectGroup.Children.Values)
+ //TODO: rest of parts
+ int linkNum = 3;
+ foreach (SceneObjectPart part in objectGroup.Children.Values)
+ {
+ if (part.UUID != objectGroup.m_rootPart.UUID)
{
- if (part.UUID != objectGroup.m_rootPart.UUID)
- {
- LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++);
- }
- part.ClearUndoState();
+ LinkNonRootPart(part, oldGroupPosition, oldRootRotation, linkNum++);
}
+ part.ClearUndoState();
}
m_scene.UnlinkSceneObject(objectGroup.UUID, true);
objectGroup.m_isDeleted = true;
+
+ objectGroup.lockPartsForWrite(true);
- lock (objectGroup.m_parts)
- {
- objectGroup.m_parts.Clear();
- }
+ objectGroup.m_parts.Clear();
+
+ objectGroup.lockPartsForWrite(false);
// Can't do this yet since backup still makes use of the root part without any synchronization
// objectGroup.m_rootPart = null;
@@ -2292,11 +2435,12 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion worldRot = linkPart.GetWorldRotation();
// Remove the part from this object
- lock (m_parts)
+ lockPartsForWrite(true);
{
m_parts.Remove(linkPart.UUID);
}
-
+ lockPartsForWrite(false);
+ lockPartsForRead(true);
if (m_parts.Count == 1 && RootPart != null) //Single prim is left
RootPart.LinkNum = 0;
else
@@ -2307,6 +2451,7 @@ namespace OpenSim.Region.Framework.Scenes
p.LinkNum--;
}
}
+ lockPartsForRead(false);
linkPart.ParentID = 0;
linkPart.LinkNum = 0;
@@ -2624,22 +2769,23 @@ namespace OpenSim.Region.Framework.Scenes
if (selectionPart != null)
{
- lock (m_parts)
+ lockPartsForRead(true);
+ List parts = new List(m_parts.Values);
+ lockPartsForRead(false);
+ foreach (SceneObjectPart part in parts)
{
- foreach (SceneObjectPart part in m_parts.Values)
+ if (part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0)
{
- if (part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0)
- {
- UsePhysics = false; // Reset physics
- break;
- }
+ UsePhysics = false; // Reset physics
+ break;
}
+ }
- foreach (SceneObjectPart part in m_parts.Values)
- {
- part.UpdatePrimFlags(UsePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
- }
+ foreach (SceneObjectPart part in parts)
+ {
+ part.UpdatePrimFlags(UsePhysics, IsTemporary, IsPhantom, IsVolumeDetect);
}
+
}
}
@@ -2863,7 +3009,7 @@ namespace OpenSim.Region.Framework.Scenes
prevScale.Z *= z;
part.Resize(prevScale);
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart obPart in m_parts.Values)
{
@@ -2882,6 +3028,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ lockPartsForRead(false);
if (part.PhysActor != null)
{
@@ -2962,7 +3109,7 @@ namespace OpenSim.Region.Framework.Scenes
axDiff *= Quaternion.Inverse(partRotation);
diff = axDiff;
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart obPart in m_parts.Values)
{
@@ -2972,6 +3119,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ lockPartsForRead(false);
AbsolutePosition = newPos;
@@ -3089,7 +3237,7 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
}
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart prim in m_parts.Values)
{
@@ -3107,6 +3255,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ lockPartsForRead(false);
m_rootPart.ScheduleTerseUpdate();
}
@@ -3205,7 +3354,7 @@ namespace OpenSim.Region.Framework.Scenes
if (atTargets.Count > 0)
{
uint[] localids = new uint[0];
- lock (m_parts)
+ lockPartsForRead(true);
{
localids = new uint[m_parts.Count];
int cntr = 0;
@@ -3215,6 +3364,7 @@ namespace OpenSim.Region.Framework.Scenes
cntr++;
}
}
+ lockPartsForRead(false);
for (int ctr = 0; ctr < localids.Length; ctr++)
{
@@ -3233,7 +3383,7 @@ namespace OpenSim.Region.Framework.Scenes
{
//trigger not_at_target
uint[] localids = new uint[0];
- lock (m_parts)
+ lockPartsForRead(true);
{
localids = new uint[m_parts.Count];
int cntr = 0;
@@ -3243,7 +3393,8 @@ namespace OpenSim.Region.Framework.Scenes
cntr++;
}
}
-
+ lockPartsForRead(false);
+
for (int ctr = 0; ctr < localids.Length; ctr++)
{
m_scene.EventManager.TriggerNotAtTargetEvent(localids[ctr]);
@@ -3256,19 +3407,20 @@ namespace OpenSim.Region.Framework.Scenes
public float GetMass()
{
float retmass = 0f;
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
retmass += part.GetMass();
}
}
+ lockPartsForRead(false);
return retmass;
}
public void CheckSculptAndLoad()
{
- lock (m_parts)
+ lockPartsForRead(true);
{
if (!IsDeleted)
{
@@ -3293,6 +3445,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ lockPartsForRead(false);
}
protected void AssetReceived(string id, Object sender, AssetBase asset)
@@ -3313,7 +3466,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void SetGroup(UUID GroupID, IClientAPI client)
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
{
@@ -3323,7 +3476,7 @@ namespace OpenSim.Region.Framework.Scenes
HasGroupChanged = true;
}
-
+ lockPartsForRead(false);
ScheduleGroupForFullUpdate();
}
@@ -3342,11 +3495,12 @@ namespace OpenSim.Region.Framework.Scenes
public void SetAttachmentPoint(byte point)
{
- lock (m_parts)
+ lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
part.SetAttachmentPoint(point);
}
+ lockPartsForRead(false);
}
#region ISceneObject
--
cgit v1.1
From 2e6dce434f1fd20664a60e464e589798287dcfe3 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Mon, 30 Nov 2009 21:52:55 +0100
Subject: Enforce physical prim max size on single prims. Also convert a lock()
to ReaderWriterLockSlim that i missed in the last commit
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 119 ++++++++++-----------
1 file changed, 58 insertions(+), 61 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index fb34ddc..42481ff 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2871,11 +2871,9 @@ namespace OpenSim.Region.Framework.Scenes
scale.Y = m_scene.m_maxNonphys;
if (scale.Z > m_scene.m_maxNonphys)
scale.Z = m_scene.m_maxNonphys;
-
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
- part.Resize(scale);
if (part.PhysActor != null)
{
if (part.PhysActor.IsPhysical)
@@ -2890,7 +2888,7 @@ namespace OpenSim.Region.Framework.Scenes
part.PhysActor.Size = scale;
m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
}
- //if (part.UUID != m_rootPart.UUID)
+ part.Resize(scale);
HasGroupChanged = true;
ScheduleGroupForFullUpdate();
@@ -2931,77 +2929,76 @@ namespace OpenSim.Region.Framework.Scenes
float y = (scale.Y / part.Scale.Y);
float z = (scale.Z / part.Scale.Z);
- lock (m_parts)
+ lockPartsForRead(true);
+ if (x > 1.0f || y > 1.0f || z > 1.0f)
{
- if (x > 1.0f || y > 1.0f || z > 1.0f)
+ foreach (SceneObjectPart obPart in m_parts.Values)
{
- foreach (SceneObjectPart obPart in m_parts.Values)
+ if (obPart.UUID != m_rootPart.UUID)
{
- if (obPart.UUID != m_rootPart.UUID)
- {
- Vector3 oldSize = new Vector3(obPart.Scale);
+ Vector3 oldSize = new Vector3(obPart.Scale);
- float f = 1.0f;
- float a = 1.0f;
+ float f = 1.0f;
+ float a = 1.0f;
- if (part.PhysActor != null && part.PhysActor.IsPhysical)
+ if (part.PhysActor != null && part.PhysActor.IsPhysical)
+ {
+ if (oldSize.X*x > m_scene.m_maxPhys)
{
- if (oldSize.X*x > m_scene.m_maxPhys)
- {
- f = m_scene.m_maxPhys / oldSize.X;
- a = f / x;
- x *= a;
- y *= a;
- z *= a;
- }
- if (oldSize.Y*y > m_scene.m_maxPhys)
- {
- f = m_scene.m_maxPhys / oldSize.Y;
- a = f / y;
- x *= a;
- y *= a;
- z *= a;
- }
- if (oldSize.Z*z > m_scene.m_maxPhys)
- {
- f = m_scene.m_maxPhys / oldSize.Z;
- a = f / z;
- x *= a;
- y *= a;
- z *= a;
- }
+ f = m_scene.m_maxPhys / oldSize.X;
+ a = f / x;
+ x *= a;
+ y *= a;
+ z *= a;
}
- else
+ if (oldSize.Y*y > m_scene.m_maxPhys)
+ {
+ f = m_scene.m_maxPhys / oldSize.Y;
+ a = f / y;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if (oldSize.Z*z > m_scene.m_maxPhys)
+ {
+ f = m_scene.m_maxPhys / oldSize.Z;
+ a = f / z;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ }
+ else
+ {
+ if (oldSize.X*x > m_scene.m_maxNonphys)
{
- if (oldSize.X*x > m_scene.m_maxNonphys)
- {
- f = m_scene.m_maxNonphys / oldSize.X;
- a = f / x;
- x *= a;
- y *= a;
- z *= a;
- }
- if (oldSize.Y*y > m_scene.m_maxNonphys)
- {
- f = m_scene.m_maxNonphys / oldSize.Y;
- a = f / y;
- x *= a;
- y *= a;
- z *= a;
- }
- if (oldSize.Z*z > m_scene.m_maxNonphys)
- {
- f = m_scene.m_maxNonphys / oldSize.Z;
- a = f / z;
- x *= a;
- y *= a;
- z *= a;
- }
+ f = m_scene.m_maxNonphys / oldSize.X;
+ a = f / x;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if (oldSize.Y*y > m_scene.m_maxNonphys)
+ {
+ f = m_scene.m_maxNonphys / oldSize.Y;
+ a = f / y;
+ x *= a;
+ y *= a;
+ z *= a;
+ }
+ if (oldSize.Z*z > m_scene.m_maxNonphys)
+ {
+ f = m_scene.m_maxNonphys / oldSize.Z;
+ a = f / z;
+ x *= a;
+ y *= a;
+ z *= a;
}
}
}
}
}
+ lockPartsForRead(false);
Vector3 prevScale = part.Scale;
prevScale.X *= x;
--
cgit v1.1
From cc8246206d5044aff0b306a4bcaf4b321fb826c9 Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Sat, 5 Dec 2009 09:03:02 +0100
Subject: Secnond revision of Sit and Stand for unscripted prims; Comment out
spammy debug messages in Interregion....
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 8 +
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 253 ++++++++++++---------
2 files changed, 148 insertions(+), 113 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 19e3023..9f2c3db 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -212,6 +212,7 @@ namespace OpenSim.Region.Framework.Scenes
private Quaternion m_sitTargetOrientation = Quaternion.Identity;
private Vector3 m_sitTargetPosition;
private string m_sitAnimation = "SIT";
+ private bool m_occupied; // KF if any av is sitting on this prim
private string m_text = String.Empty;
private string m_touchName = String.Empty;
private readonly UndoStack m_undo = new UndoStack(5);
@@ -993,6 +994,13 @@ namespace OpenSim.Region.Framework.Scenes
get { return _flags; }
set { _flags = value; }
}
+
+ [XmlIgnore]
+ public bool IsOccupied // KF If an av is sittingon this prim
+ {
+ get { return m_occupied; }
+ set { m_occupied = value; }
+ }
[XmlIgnore]
public UUID SitTargetAvatar
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index cebd108..817b9df 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -197,6 +197,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_autopilotMoving;
private Vector3 m_autoPilotTarget;
private bool m_sitAtAutoTarget;
+ private Vector3 m_initialSitTarget; //KF: First estimate of where to sit
private string m_nextSitAnimation = String.Empty;
@@ -1524,7 +1525,6 @@ namespace OpenSim.Region.Framework.Scenes
m_sitAtAutoTarget = false;
PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
//proxy.PCode = (byte)PCode.ParticleSystem;
-
proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy);
proxyObjectGroup.AttachToScene(m_scene);
@@ -1566,7 +1566,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_moveToPositionInProgress = true;
m_moveToPositionTarget = new Vector3(locx, locy, locz);
- }
+ }
catch (Exception ex)
{
//Why did I get this error?
@@ -1646,16 +1646,22 @@ namespace OpenSim.Region.Framework.Scenes
m_parentPosition = part.GetWorldPosition();
ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
}
+ // part.GetWorldRotation() is the rotation of the object being sat on
+ // Rotation is the sittiing Av's rotation
+
+ Quaternion wr = Quaternion.Inverse(Quaternion.Inverse(Rotation) * Quaternion.Inverse(part.GetWorldRotation())); // world or. of the av
+ Vector3 so = new Vector3(1.0f, 0f, 0f) * wr; // 1M infront of av
+ Vector3 wso = so + part.GetWorldPosition() + ( m_pos * part.GetWorldRotation()); // + av sit offset!
if (m_physicsActor == null)
{
AddToPhysicalScene(false);
}
- m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
+ AbsolutePosition = wso; //KF: Fix stand up.
m_parentPosition = Vector3.Zero;
-//Console.WriteLine("Stand Pos {0}", m_pos);
-
- m_parentID = 0;
+
+ m_parentID = 0;
+ part.IsOccupied = false;
SendFullUpdateToAllClients();
m_requestedSitTargetID = 0;
if ((m_physicsActor != null) && (m_avHeight > 0))
@@ -1694,13 +1700,9 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 avSitOffSet = part.SitTargetPosition;
Quaternion avSitOrientation = part.SitTargetOrientation;
UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
-
- bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
- bool SitTargetisSet =
- (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 1f &&
- avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f));
- // this test is probably failing
- if (SitTargetisSet && SitTargetUnOccupied)
+ bool SitTargetOccupied = (avOnTargetAlready != UUID.Zero);
+ bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
+ if (SitTargetisSet && !SitTargetOccupied)
{
//switch the target to this prim
return part;
@@ -1714,7 +1716,7 @@ namespace OpenSim.Region.Framework.Scenes
private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset)
{
bool autopilot = true;
- Vector3 pos = new Vector3();
+ Vector3 autopilotTarget = new Vector3();
Quaternion sitOrientation = Quaternion.Identity;
Vector3 cameraEyeOffset = Vector3.Zero;
Vector3 cameraAtOffset = Vector3.Zero;
@@ -1722,98 +1724,104 @@ namespace OpenSim.Region.Framework.Scenes
//SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
SceneObjectPart part = FindNextAvailableSitTarget(targetID);
- if (part != null)
- {
- // 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
+ if (part == null) return;
+
+ // 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
- // part is the prim to sit on
- // offset is the vector distance from that prim center to the click-spot
- // UUID is the UUID of the Avatar doing the clicking
-
- m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
+ // part is the prim to sit on
+ // offset is the world-ref vector distance from that prim center to the click-spot
+ // UUID is the UUID of the Avatar doing the clicking
- // Is a sit target available?
- Vector3 avSitOffSet = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
- UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
-
- bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
-// bool SitTargetisSet =
-// (!(avSitOffSet.X == 0f && avSitOffSet.Y == 0f && avSitOffSet.Z == 0f && avSitOrientation.W == 0f &&
-// avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f));
-
- bool SitTargetisSet = ((Vector3.Zero != avSitOffSet) || (Quaternion.Identity != avSitOrientation));
-
-//Console.WriteLine("SendSitResponse offset=" + offset + " UnOccup=" + SitTargetUnOccupied +
-// " TargSet=" + SitTargetisSet);
- // Sit analysis rewritten by KF 091125
- if (SitTargetisSet) // scipted sit
- {
- if (SitTargetUnOccupied)
- {
- part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
- offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
- sitOrientation = avSitOrientation; // Change rotatione to the scripted one
- autopilot = false; // Jump direct to scripted llSitPos()
- }
- else return;
+ m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
+
+ // Is a sit target available?
+ Vector3 avSitOffSet = part.SitTargetPosition;
+ Quaternion avSitOrientation = part.SitTargetOrientation;
+
+ bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
+ Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+
+//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
+ // Sit analysis rewritten by KF 091125
+ if (SitTargetisSet) // scipted sit
+ {
+ if (!part.IsOccupied)
+ {
+//Console.WriteLine("Scripted, unoccupied");
+ part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
+ offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
+ sitOrientation = avSitOrientation; // Change rotatione to the scripted one
+ autopilot = false; // Jump direct to scripted llSitPos()
}
- else // Not Scripted
- {
- if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) ) // large prim
- {
- Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
- m_avUnscriptedSitPos = offset * partIRot; // sit where clicked
- pos = part.AbsolutePosition + (offset * partIRot);
- }
- else // small prim
- {
- if (SitTargetUnOccupied)
- {
- m_avUnscriptedSitPos = Vector3.Zero; // Sit on unoccupied small prim center
- pos = part.AbsolutePosition;
- }
- else return; // occupied small
- } // end large/small
- } // end Scripted/not
-
- if (m_physicsActor != null)
- {
- // 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.
- m_sitAvatarHeight = m_physicsActor.Size.Z;
-
- if (autopilot)
- { // its not a scripted sit
- if (Util.GetDistanceTo(AbsolutePosition, pos) < 4.5)
- {
- autopilot = false; // close enough
+ else
+ {
+//Console.WriteLine("Scripted, occupied");
+ return;
+ }
+ }
+ else // Not Scripted
+ {
+ if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) )
+ {
+ // large prim & offset, ignore if other Avs sitting
+// offset.Z -= 0.05f;
+ m_avUnscriptedSitPos = offset * partIRot; // (non-zero) sit where clicked
+ autopilotTarget = part.AbsolutePosition + offset; // World location of clicked point
+
+//Console.WriteLine(" offset ={0}", offset);
+//Console.WriteLine(" UnscriptedSitPos={0}", m_avUnscriptedSitPos);
+//Console.WriteLine(" autopilotTarget={0}", autopilotTarget);
+
+ }
+ else // small offset
+ {
+//Console.WriteLine("Small offset");
+ if (!part.IsOccupied)
+ {
+ m_avUnscriptedSitPos = Vector3.Zero; // Zero = Sit on prim center
+ autopilotTarget = part.AbsolutePosition;
+ }
+ else return; // occupied small
+ } // end large/small
+ } // end Scripted/not
+ cameraAtOffset = part.GetCameraAtOffset();
+ cameraEyeOffset = part.GetCameraEyeOffset();
+ forceMouselook = part.GetForceMouselook();
- RemoveFromPhysicalScene();
- AbsolutePosition = pos + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to Prim
- } // else the autopilot will get us close
- }
- else
- { // its a scripted sit
+ if (m_physicsActor != null)
+ {
+ // 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.
+ m_sitAvatarHeight = m_physicsActor.Size.Z;
+ if (autopilot)
+ { // its not a scripted sit
+// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
+ if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
+ {
+ autopilot = false; // close enough
RemoveFromPhysicalScene();
- }
+ AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target
+ } // else the autopilot will get us close
+ }
+ else
+ { // its a scripted sit
+ RemoveFromPhysicalScene();
}
-
- cameraAtOffset = part.GetCameraAtOffset();
- cameraEyeOffset = part.GetCameraEyeOffset();
- forceMouselook = part.GetForceMouselook();
}
+ else return; // physactor is null!
- ControllingClient.SendSitResponse(targetID, offset, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
- m_requestedSitTargetUUID = targetID;
+ Vector3 offsetr = offset * partIRot;
+ ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+ m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls
// HandleAgentSit itself after it gets to the location
// It doesn't get to the location until we've moved them there though
// which happens in HandleAgentSit :P
m_autopilotMoving = autopilot;
- m_autoPilotTarget = pos;
+ m_autoPilotTarget = autopilotTarget;
m_sitAtAutoTarget = autopilot;
+ m_initialSitTarget = autopilotTarget;
if (!autopilot)
HandleAgentSit(remoteClient, UUID);
}
@@ -1898,6 +1906,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part.GetAvatarOnSitTarget() == UUID)
{
+//Console.WriteLine("Scripted Sit");
// Scripted sit
Vector3 sitTargetPos = part.SitTargetPosition;
Quaternion sitTargetOrient = part.SitTargetOrientation;
@@ -1905,42 +1914,44 @@ namespace OpenSim.Region.Framework.Scenes
m_pos += SIT_TARGET_ADJUSTMENT;
m_bodyRot = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
+ part.IsOccupied = true;
}
else
{
+//Console.WriteLine("NON Scripted Sit");
+ // if m_avUnscriptedSitPos is zero then Av sits above center
+ // Else Av sits at m_avUnscriptedSitPos
+
// Non-scripted sit by Kitto Flora 21Nov09
// Calculate angle of line from prim to Av
+ Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
- Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
// NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
// Av sits at world euler <0,0, z>, translated by part rotation
m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
+
m_parentPosition = part.AbsolutePosition;
- if(m_avUnscriptedSitPos != Vector3.Zero)
- { // sit where clicked on big prim
- m_pos = m_avUnscriptedSitPos + (new Vector3(0.0f, 0f, 0.625f) * partIRot);
- }
- else
- { // sit at center of small prim
- m_pos = new Vector3(0f, 0f, 0.05f) +
- (new Vector3(0.0f, 0f, 0.625f) * partIRot) +
- (new Vector3(0.25f, 0f, 0.0f) * m_bodyRot);
- //Set up raytrace to find top surface of prim
- Vector3 size = part.Scale;
- float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
- Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
- Vector3 down = new Vector3(0f, 0f, -1f);
- m_scene.PhysicsScene.RaycastWorld(
+ part.IsOccupied = true;
+ m_pos = new Vector3(0f, 0f, 0.05f) + // corrections to get Sit Animation
+ (new Vector3(0.0f, 0f, 0.61f) * partIRot) + // located on center
+ (new Vector3(0.34f, 0f, 0.0f) * m_bodyRot) +
+ m_avUnscriptedSitPos; // adds click offset, if any
+ //Set up raytrace to find top surface of prim
+ Vector3 size = part.Scale;
+ float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
+ Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
+ Vector3 down = new Vector3(0f, 0f, -1f);
+//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag);
+ m_scene.PhysicsScene.RaycastWorld(
start, // Vector3 position,
down, // Vector3 direction,
mag, // float length,
SitAltitudeCallback); // retMethod
- } // end small/big
} // end scripted/not
}
else // no Av
@@ -1957,19 +1968,24 @@ namespace OpenSim.Region.Framework.Scenes
SendFullUpdateToAllClients();
}
- public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
+ public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance) // KF: Nov 2009
{
+ // KF: 091202 There appears to be a bug in Prim Edit Size - the process sometimes make a prim that RayTrace no longer
+ // sees. Take/re-rez, or sim restart corrects the condition. Result of bug is incorrect sit height.
if(hitYN)
{
// m_pos = Av offset from prim center to make look like on center
// m_parentPosition = Actual center pos of prim
// collisionPoint = spot on prim where we want to sit
+ // collisionPoint.Z = global sit surface height
SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
- Vector3 offset = (collisionPoint - m_parentPosition) * Quaternion.Inverse(part.RotationOffset);
+ Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ float offZ = collisionPoint.Z - m_initialSitTarget.Z;
+ Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
+//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
m_pos += offset;
-// Console.WriteLine("m_pos={0}, offset={1} newsit={2}", m_pos, offset, newsit);
}
- }
+ } // End SitAltitudeCallback KF.
///
/// Event handler for the 'Always run' setting on the client
@@ -3716,5 +3732,16 @@ namespace OpenSim.Region.Framework.Scenes
m_reprioritization_called = false;
}
}
+
+ private Vector3 Quat2Euler(Quaternion rot){
+ float x = Utils.RAD_TO_DEG * (float)Math.Atan2((double)((2.0f * rot.X * rot.W) - (2.0f * rot.Y * rot.Z)) ,
+ (double)(1 - (2.0f * rot.X * rot.X) - (2.0f * rot.Z * rot.Z)));
+ float y = Utils.RAD_TO_DEG * (float)Math.Asin ((double)((2.0f * rot.X * rot.Y) + (2.0f * rot.Z * rot.W)));
+ float z = Utils.RAD_TO_DEG * (float)Math.Atan2(((double)(2.0f * rot.Y * rot.W) - (2.0f * rot.X * rot.Z)) ,
+ (double)(1 - (2.0f * rot.Y * rot.Y) - (2.0f * rot.Z * rot.Z)));
+ return(new Vector3(x,y,z));
+ }
+
+
}
}
--
cgit v1.1
From ceccfe02d0e25c234560b6ef25306b8db4cd9875 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 00:02:24 +0000
Subject: Eliminate multiple updates on link/unlink
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 ++
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 8 ++++----
2 files changed, 6 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 2fdb48d..d87e814 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1593,6 +1593,8 @@ namespace OpenSim.Region.Framework.Scenes
// occur on link to invoke this elsewhere (such as object selection)
parentGroup.RootPart.AddFlag(PrimFlags.CreateSelected);
parentGroup.TriggerScriptChangedEvent(Changed.LINK);
+ parentGroup.HasGroupChanged = true;
+ parentGroup.ScheduleGroupForFullUpdate();
if (client != null)
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index ecda80c..fa2e3ce 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2389,8 +2389,8 @@ namespace OpenSim.Region.Framework.Scenes
// unmoved prims!
ResetChildPrimPhysicsPositions();
- HasGroupChanged = true;
- ScheduleGroupForFullUpdate();
+ //HasGroupChanged = true;
+ //ScheduleGroupForFullUpdate();
}
///
@@ -2483,8 +2483,8 @@ namespace OpenSim.Region.Framework.Scenes
linkPart.Rezzed = RootPart.Rezzed;
- HasGroupChanged = true;
- ScheduleGroupForFullUpdate();
+ //HasGroupChanged = true;
+ //ScheduleGroupForFullUpdate();
}
///
--
cgit v1.1
From fbefa8273be70d90404b37230c168fd031288e31 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 00:25:04 +0000
Subject: Lock updates out while linking and unlinking
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 255 ++++++++++++++------------
1 file changed, 134 insertions(+), 121 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index d87e814..5efe188 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Threading;
using System.Collections.Generic;
using System.Reflection;
using OpenMetaverse;
@@ -96,6 +97,8 @@ namespace OpenSim.Region.Framework.Scenes
protected internal Dictionary SceneObjectGroupsByFullID = new Dictionary();
private readonly Object m_dictionary_lock = new Object();
+ private Object m_updateLock = new Object();
+
#endregion
protected internal SceneGraph(Scene parent, RegionInfo regInfo)
@@ -369,6 +372,9 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal void UpdateObjectGroups()
{
+ if (!Monitor.TryEnter(m_updateLock))
+ return;
+
List updates;
// Some updates add more updates to the updateList.
@@ -395,6 +401,7 @@ namespace OpenSim.Region.Framework.Scenes
"[INNER SCENE]: Failed to update {0}, {1} - {2}", sog.Name, sog.UUID, e);
}
}
+ Monitor.Exit(m_updateLock);
}
protected internal void AddPhysicalPrim(int number)
@@ -1555,56 +1562,59 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds)
{
- SceneObjectGroup parentGroup = GetGroupByPrim(parentPrimId);
-
- List childGroups = new List();
- if (parentGroup != null)
+ lock (m_updateLock)
{
- // We do this in reverse to get the link order of the prims correct
- for (int i = childPrimIds.Count - 1; i >= 0; i--)
+ SceneObjectGroup parentGroup = GetGroupByPrim(parentPrimId);
+
+ List childGroups = new List();
+ if (parentGroup != null)
{
- SceneObjectGroup child = GetGroupByPrim(childPrimIds[i]);
- if (child != null)
+ // We do this in reverse to get the link order of the prims correct
+ for (int i = childPrimIds.Count - 1; i >= 0; i--)
{
- // Make sure no child prim is set for sale
- // So that, on delink, no prims are unwittingly
- // left for sale and sold off
- child.RootPart.ObjectSaleType = 0;
- child.RootPart.SalePrice = 10;
- childGroups.Add(child);
+ SceneObjectGroup child = GetGroupByPrim(childPrimIds[i]);
+ if (child != null)
+ {
+ // Make sure no child prim is set for sale
+ // So that, on delink, no prims are unwittingly
+ // left for sale and sold off
+ child.RootPart.ObjectSaleType = 0;
+ child.RootPart.SalePrice = 10;
+ childGroups.Add(child);
+ }
}
}
- }
- else
- {
- return; // parent is null so not in this region
- }
+ else
+ {
+ return; // parent is null so not in this region
+ }
- foreach (SceneObjectGroup child in childGroups)
- {
- parentGroup.LinkToGroup(child);
+ foreach (SceneObjectGroup child in childGroups)
+ {
+ parentGroup.LinkToGroup(child);
- // this is here so physics gets updated!
- // Don't remove! Bad juju! Stay away! or fix physics!
- child.AbsolutePosition = child.AbsolutePosition;
- }
+ // this is here so physics gets updated!
+ // Don't remove! Bad juju! Stay away! or fix physics!
+ child.AbsolutePosition = child.AbsolutePosition;
+ }
- // We need to explicitly resend the newly link prim's object properties since no other actions
- // occur on link to invoke this elsewhere (such as object selection)
- parentGroup.RootPart.AddFlag(PrimFlags.CreateSelected);
- parentGroup.TriggerScriptChangedEvent(Changed.LINK);
- parentGroup.HasGroupChanged = true;
- parentGroup.ScheduleGroupForFullUpdate();
-
- if (client != null)
- {
- parentGroup.GetProperties(client);
- }
- else
- {
- foreach (ScenePresence p in GetScenePresences())
+ // We need to explicitly resend the newly link prim's object properties since no other actions
+ // occur on link to invoke this elsewhere (such as object selection)
+ parentGroup.RootPart.AddFlag(PrimFlags.CreateSelected);
+ parentGroup.TriggerScriptChangedEvent(Changed.LINK);
+ parentGroup.HasGroupChanged = true;
+ parentGroup.ScheduleGroupForFullUpdate();
+
+ if (client != null)
{
- parentGroup.GetProperties(p.ControllingClient);
+ parentGroup.GetProperties(client);
+ }
+ else
+ {
+ foreach (ScenePresence p in GetScenePresences())
+ {
+ parentGroup.GetProperties(p.ControllingClient);
+ }
}
}
}
@@ -1620,109 +1630,112 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void DelinkObjects(List primIds, bool sendEvents)
{
- List childParts = new List();
- List rootParts = new List();
- List affectedGroups = new List();
- // Look them all up in one go, since that is comparatively expensive
- //
- foreach (uint primID in primIds)
+ lock (m_updateLock)
{
- SceneObjectPart part = m_parentScene.GetSceneObjectPart(primID);
- if (part != null)
+ List childParts = new List();
+ List rootParts = new List();
+ List affectedGroups = new List();
+ // Look them all up in one go, since that is comparatively expensive
+ //
+ foreach (uint primID in primIds)
{
- if (part.LinkNum < 2) // Root or single
- rootParts.Add(part);
+ SceneObjectPart part = m_parentScene.GetSceneObjectPart(primID);
+ if (part != null)
+ {
+ if (part.LinkNum < 2) // Root or single
+ rootParts.Add(part);
+ else
+ childParts.Add(part);
+
+ SceneObjectGroup group = part.ParentGroup;
+ if (!affectedGroups.Contains(group))
+ affectedGroups.Add(group);
+ }
else
- childParts.Add(part);
-
- SceneObjectGroup group = part.ParentGroup;
- if (!affectedGroups.Contains(group))
- affectedGroups.Add(group);
+ {
+ m_log.ErrorFormat("Viewer requested unlink of nonexistent part {0}", primID);
+ }
}
- else
+
+ foreach (SceneObjectPart child in childParts)
{
- m_log.ErrorFormat("Viewer requested unlink of nonexistent part {0}", primID);
+ // Unlink all child parts from their groups
+ //
+ child.ParentGroup.DelinkFromGroup(child, sendEvents);
}
- }
- foreach (SceneObjectPart child in childParts)
- {
- // Unlink all child parts from their groups
- //
- child.ParentGroup.DelinkFromGroup(child, sendEvents);
- }
-
- foreach (SceneObjectPart root in rootParts)
- {
- // In most cases, this will run only one time, and the prim
- // will be a solo prim
- // However, editing linked parts and unlinking may be different
- //
- SceneObjectGroup group = root.ParentGroup;
- List newSet = new List(group.Children.Values);
- int numChildren = group.Children.Count;
-
- // If there are prims left in a link set, but the root is
- // slated for unlink, we need to do this
- //
- if (numChildren != 1)
+ foreach (SceneObjectPart root in rootParts)
{
- // Unlink the remaining set
+ // In most cases, this will run only one time, and the prim
+ // will be a solo prim
+ // However, editing linked parts and unlinking may be different
//
- bool sendEventsToRemainder = true;
- if (numChildren > 1)
- sendEventsToRemainder = false;
-
- foreach (SceneObjectPart p in newSet)
- {
- if (p != group.RootPart)
- group.DelinkFromGroup(p, sendEventsToRemainder);
- }
+ SceneObjectGroup group = root.ParentGroup;
+ List newSet = new List(group.Children.Values);
+ int numChildren = group.Children.Count;
- // If there is more than one prim remaining, we
- // need to re-link
+ // If there are prims left in a link set, but the root is
+ // slated for unlink, we need to do this
//
- if (numChildren > 2)
+ if (numChildren != 1)
{
- // Remove old root
+ // Unlink the remaining set
//
- if (newSet.Contains(root))
- newSet.Remove(root);
+ bool sendEventsToRemainder = true;
+ if (numChildren > 1)
+ sendEventsToRemainder = false;
- // Preserve link ordering
- //
- newSet.Sort(delegate (SceneObjectPart a, SceneObjectPart b)
+ foreach (SceneObjectPart p in newSet)
{
- return a.LinkNum.CompareTo(b.LinkNum);
- });
+ if (p != group.RootPart)
+ group.DelinkFromGroup(p, sendEventsToRemainder);
+ }
- // Determine new root
+ // If there is more than one prim remaining, we
+ // need to re-link
//
- SceneObjectPart newRoot = newSet[0];
- newSet.RemoveAt(0);
+ if (numChildren > 2)
+ {
+ // Remove old root
+ //
+ if (newSet.Contains(root))
+ newSet.Remove(root);
+
+ // Preserve link ordering
+ //
+ newSet.Sort(delegate (SceneObjectPart a, SceneObjectPart b)
+ {
+ return a.LinkNum.CompareTo(b.LinkNum);
+ });
- List linkIDs = new List();
+ // Determine new root
+ //
+ SceneObjectPart newRoot = newSet[0];
+ newSet.RemoveAt(0);
- foreach (SceneObjectPart newChild in newSet)
- {
- newChild.UpdateFlag = 0;
- linkIDs.Add(newChild.LocalId);
- }
+ List linkIDs = new List();
+
+ foreach (SceneObjectPart newChild in newSet)
+ {
+ newChild.UpdateFlag = 0;
+ linkIDs.Add(newChild.LocalId);
+ }
- LinkObjects(null, newRoot.LocalId, linkIDs);
- if (!affectedGroups.Contains(newRoot.ParentGroup))
- affectedGroups.Add(newRoot.ParentGroup);
+ LinkObjects(null, newRoot.LocalId, linkIDs);
+ if (!affectedGroups.Contains(newRoot.ParentGroup))
+ affectedGroups.Add(newRoot.ParentGroup);
+ }
}
}
- }
- // Finally, trigger events in the roots
- //
- foreach (SceneObjectGroup g in affectedGroups)
- {
- g.TriggerScriptChangedEvent(Changed.LINK);
- g.HasGroupChanged = true; // Persist
- g.ScheduleGroupForFullUpdate();
+ // Finally, trigger events in the roots
+ //
+ foreach (SceneObjectGroup g in affectedGroups)
+ {
+ g.TriggerScriptChangedEvent(Changed.LINK);
+ g.HasGroupChanged = true; // Persist
+ g.ScheduleGroupForFullUpdate();
+ }
}
}
--
cgit v1.1
From f2891e77383f70d807f4ef1ceefbf9a0f2bf6a84 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 00:50:28 +0000
Subject: Remove extra forced updates. They're not needed for each prim.
Really.
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index fa2e3ce..93888f1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2292,14 +2292,14 @@ namespace OpenSim.Region.Framework.Scenes
public void LinkToGroup(SceneObjectGroup objectGroup)
{
// Make sure we have sent any pending unlinks or stuff.
- if (objectGroup.RootPart.UpdateFlag > 0)
- {
- m_log.WarnFormat(
- "[SCENE OBJECT GROUP]: Forcing send of linkset {0}, {1} to {2}, {3} as its still waiting.",
- objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID);
+ //if (objectGroup.RootPart.UpdateFlag > 0)
+ //{
+ // m_log.WarnFormat(
+ // "[SCENE OBJECT GROUP]: Forcing send of linkset {0}, {1} to {2}, {3} as its still waiting.",
+ // objectGroup.RootPart.Name, objectGroup.RootPart.UUID, RootPart.Name, RootPart.UUID);
- objectGroup.RootPart.SendScheduledUpdates();
- }
+ // objectGroup.RootPart.SendScheduledUpdates();
+ //}
// m_log.DebugFormat(
// "[SCENE OBJECT GROUP]: Linking group with root part {0}, {1} to group with root part {2}, {3}",
--
cgit v1.1
From da414fd509a6adfa0499b71172e1c789b3cf7ca4 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 01:20:39 +0000
Subject: Change locking to not mix explicit Monitor.* calls with lock()
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 5efe188..4bdc52c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1562,7 +1562,8 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds)
{
- lock (m_updateLock)
+ Monitor.Enter(m_updateLock);
+ try
{
SceneObjectGroup parentGroup = GetGroupByPrim(parentPrimId);
@@ -1617,6 +1618,10 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ finally
+ {
+ Monitor.Exit(m_updateLock);
+ }
}
///
@@ -1630,7 +1635,8 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void DelinkObjects(List primIds, bool sendEvents)
{
- lock (m_updateLock)
+ Monitor.Enter(m_updateLock);
+ try
{
List childParts = new List();
List rootParts = new List();
@@ -1737,6 +1743,10 @@ namespace OpenSim.Region.Framework.Scenes
g.ScheduleGroupForFullUpdate();
}
}
+ finally
+ {
+ Monitor.Exit(m_updateLock);
+ }
}
protected internal void MakeObjectSearchable(IClientAPI remoteClient, bool IncludeInSearch, uint localID)
--
cgit v1.1
From 2fe75a62bec2f06155bf5f05b6f558d028f6b12c Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 02:00:32 +0000
Subject: Skip single prims in unlink selections
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 4bdc52c..18e7b79 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1648,14 +1648,17 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = m_parentScene.GetSceneObjectPart(primID);
if (part != null)
{
- if (part.LinkNum < 2) // Root or single
- rootParts.Add(part);
- else
- childParts.Add(part);
-
- SceneObjectGroup group = part.ParentGroup;
- if (!affectedGroups.Contains(group))
- affectedGroups.Add(group);
+ if (part.ParentGroup.Children.Count != 1) // Skip single
+ {
+ if (part.LinkNum < 2) // Root
+ rootParts.Add(part);
+ else
+ childParts.Add(part);
+
+ SceneObjectGroup group = part.ParentGroup;
+ if (!affectedGroups.Contains(group))
+ affectedGroups.Add(group);
+ }
}
else
{
--
cgit v1.1
From 79511ecce240a864dc02575acd3399fb244a8d82 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 02:15:52 +0000
Subject: Experimental: Remove explicit property sends
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 18e7b79..f74fd5d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1606,17 +1606,17 @@ namespace OpenSim.Region.Framework.Scenes
parentGroup.HasGroupChanged = true;
parentGroup.ScheduleGroupForFullUpdate();
- if (client != null)
- {
- parentGroup.GetProperties(client);
- }
- else
- {
- foreach (ScenePresence p in GetScenePresences())
- {
- parentGroup.GetProperties(p.ControllingClient);
- }
- }
+// if (client != null)
+// {
+// parentGroup.GetProperties(client);
+// }
+// else
+// {
+// foreach (ScenePresence p in GetScenePresences())
+// {
+// parentGroup.GetProperties(p.ControllingClient);
+// }
+// }
}
finally
{
--
cgit v1.1
From f9ae9afaacc82ee0284b1f7dc88ad880aabe23af Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 03:10:34 +0000
Subject: Fix build break from conflicted merge
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 3d4490a..f6bcb59 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1972,7 +1972,7 @@ namespace OpenSim.Region.Framework.Scenes
SendFullUpdateToAllClients();
}
- public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
+ public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal)
{
if(hitYN)
{
--
cgit v1.1
From 1e222d52e6219db4ad32338b952a94eebb0f7799 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 6 Dec 2009 03:56:15 +0000
Subject: Change EntityManager to use RWlocks
---
OpenSim/Region/Framework/Scenes/EntityManager.cs | 79 ++++++++++++++++++++----
1 file changed, 67 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/EntityManager.cs b/OpenSim/Region/Framework/Scenes/EntityManager.cs
index 099fcce..c246e32 100644
--- a/OpenSim/Region/Framework/Scenes/EntityManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EntityManager.cs
@@ -40,7 +40,7 @@ namespace OpenSim.Region.Framework.Scenes
private readonly Dictionary m_eb_uuid = new Dictionary();
private readonly Dictionary m_eb_localID = new Dictionary();
//private readonly Dictionary m_pres_uuid = new Dictionary();
- private readonly Object m_lock = new Object();
+ private System.Threading.ReaderWriterLockSlim m_lock = new System.Threading.ReaderWriterLockSlim();
[Obsolete("Use Add() instead.")]
public void Add(UUID id, EntityBase eb)
@@ -50,7 +50,8 @@ namespace OpenSim.Region.Framework.Scenes
public void Add(EntityBase entity)
{
- lock (m_lock)
+ m_lock.EnterWriteLock();
+ try
{
try
{
@@ -62,11 +63,16 @@ namespace OpenSim.Region.Framework.Scenes
m_log.ErrorFormat("Add Entity failed: {0}", e.Message);
}
}
+ finally
+ {
+ m_lock.ExitWriteLock();
+ }
}
public void InsertOrReplace(EntityBase entity)
{
- lock (m_lock)
+ m_lock.EnterWriteLock();
+ try
{
try
{
@@ -78,15 +84,24 @@ namespace OpenSim.Region.Framework.Scenes
m_log.ErrorFormat("Insert or Replace Entity failed: {0}", e.Message);
}
}
+ finally
+ {
+ m_lock.ExitWriteLock();
+ }
}
public void Clear()
{
- lock (m_lock)
+ m_lock.EnterWriteLock();
+ try
{
m_eb_uuid.Clear();
m_eb_localID.Clear();
}
+ finally
+ {
+ m_lock.ExitWriteLock();
+ }
}
public int Count
@@ -123,7 +138,8 @@ namespace OpenSim.Region.Framework.Scenes
public bool Remove(uint localID)
{
- lock (m_lock)
+ m_lock.EnterWriteLock();
+ try
{
try
{
@@ -141,11 +157,16 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
}
+ finally
+ {
+ m_lock.ExitWriteLock();
+ }
}
public bool Remove(UUID id)
{
- lock (m_lock)
+ m_lock.EnterWriteLock();
+ try
{
try
{
@@ -163,13 +184,18 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
}
+ finally
+ {
+ m_lock.ExitWriteLock();
+ }
}
public List GetAllByType()
{
List tmp = new List();
- lock (m_lock)
+ m_lock.EnterReadLock();
+ try
{
try
{
@@ -187,23 +213,33 @@ namespace OpenSim.Region.Framework.Scenes
tmp = null;
}
}
+ finally
+ {
+ m_lock.ExitReadLock();
+ }
return tmp;
}
public List GetEntities()
{
- lock (m_lock)
+ m_lock.EnterReadLock();
+ try
{
return new List(m_eb_uuid.Values);
}
+ finally
+ {
+ m_lock.ExitReadLock();
+ }
}
public EntityBase this[UUID id]
{
get
{
- lock (m_lock)
+ m_lock.EnterReadLock();
+ try
{
EntityBase entity;
if (m_eb_uuid.TryGetValue(id, out entity))
@@ -211,6 +247,10 @@ namespace OpenSim.Region.Framework.Scenes
else
return null;
}
+ finally
+ {
+ m_lock.ExitReadLock();
+ }
}
set
{
@@ -222,7 +262,8 @@ namespace OpenSim.Region.Framework.Scenes
{
get
{
- lock (m_lock)
+ m_lock.EnterReadLock();
+ try
{
EntityBase entity;
if (m_eb_localID.TryGetValue(localID, out entity))
@@ -230,6 +271,10 @@ namespace OpenSim.Region.Framework.Scenes
else
return null;
}
+ finally
+ {
+ m_lock.ExitReadLock();
+ }
}
set
{
@@ -239,18 +284,28 @@ namespace OpenSim.Region.Framework.Scenes
public bool TryGetValue(UUID key, out EntityBase obj)
{
- lock (m_lock)
+ m_lock.EnterReadLock();
+ try
{
return m_eb_uuid.TryGetValue(key, out obj);
}
+ finally
+ {
+ m_lock.ExitReadLock();
+ }
}
public bool TryGetValue(uint key, out EntityBase obj)
{
- lock (m_lock)
+ m_lock.EnterReadLock();
+ try
{
return m_eb_localID.TryGetValue(key, out obj);
}
+ finally
+ {
+ m_lock.ExitReadLock();
+ }
}
///
--
cgit v1.1
From 172e2f4e7609c278d02ad83ca207fd79624db587 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Sun, 6 Dec 2009 17:23:07 +0100
Subject: Fix to existing ReaderWriterLockSlim implementations
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 10 ++++++++--
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 3 ++-
2 files changed, 10 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 93888f1..eacd219 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -126,7 +126,10 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- m_partsLock.ExitReadLock();
+ if (m_partsLock.RecursiveReadCount > 0)
+ {
+ m_partsLock.ExitReadLock();
+ }
}
}
public void lockPartsForWrite(bool locked)
@@ -155,7 +158,10 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- m_partsLock.ExitWriteLock();
+ if (m_partsLock.RecursiveWriteCount > 0)
+ {
+ m_partsLock.ExitWriteLock();
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 4780ff2..b57d912 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -320,17 +320,18 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_items.ContainsKey(itemId))
{
+ m_items.LockItemsForRead(false);
CreateScriptInstance(m_items[itemId], startParam, postOnRez, engine, stateSource);
}
else
{
+ m_items.LockItemsForRead(false);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
itemId, m_part.Name, m_part.UUID,
m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
}
- m_items.LockItemsForRead(false);
}
else
{
--
cgit v1.1
From 0d1d437bd3bf608448d71ea7de8e4f7cfb0371f0 Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Sun, 6 Dec 2009 21:11:59 +0100
Subject: Fix linked physical daughter prim position update.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 17 ++++++++++++++---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 --
2 files changed, 14 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 9f2c3db..a6382ee 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -513,9 +513,16 @@ namespace OpenSim.Region.Framework.Scenes
{
// If this is a linkset, we don't want the physics engine mucking up our group position here.
PhysicsActor actor = PhysActor;
- if (actor != null && _parentID == 0)
+ if (actor != null)
{
- m_groupPosition = actor.Position;
+ if (_parentID == 0)
+ {
+ m_groupPosition = actor.Position;
+ }
+ else
+ {
+ m_groupPosition = ParentGroup.AbsolutePosition; // KF+Casper Update Child prims too!
+ }
}
if (IsAttachment)
@@ -1743,9 +1750,13 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion parentRot = ParentGroup.RootPart.RotationOffset;
Vector3 axPos = OffsetPosition;
-
axPos *= parentRot;
Vector3 translationOffsetPosition = axPos;
+
+ int tx = (int)GroupPosition.X;
+ int ty = (int)GroupPosition.Y;
+ int tz = (int)GroupPosition.Z;
+
return GroupPosition + translationOffsetPosition;
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 817b9df..5d0218f 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1642,7 +1642,6 @@ namespace OpenSim.Region.Framework.Scenes
// Reset sit target.
if (part.GetAvatarOnSitTarget() == UUID)
part.SetAvatarOnSitTarget(UUID.Zero);
-
m_parentPosition = part.GetWorldPosition();
ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
}
@@ -1659,7 +1658,6 @@ namespace OpenSim.Region.Framework.Scenes
}
AbsolutePosition = wso; //KF: Fix stand up.
m_parentPosition = Vector3.Zero;
-
m_parentID = 0;
part.IsOccupied = false;
SendFullUpdateToAllClients();
--
cgit v1.1
From 29a740ec8c78bfc3c1ab5b41b302ae2205c6e9aa Mon Sep 17 00:00:00 2001
From: unknown
Date: Mon, 7 Dec 2009 18:03:53 +0100
Subject: Initial windlight codebase commit
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++
OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs | 7 ++++++-
2 files changed, 8 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f5a1e74..f70af27 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -539,6 +539,8 @@ namespace OpenSim.Region.Framework.Scenes
// Load region settings
m_regInfo.RegionSettings = m_storageManager.DataStore.LoadRegionSettings(m_regInfo.RegionID);
+ m_regInfo.WindlightSettings = m_storageManager.DataStore.LoadRegionWindlightSettings(m_regInfo.RegionID);
+
if (m_storageManager.EstateDataStore != null)
{
m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID);
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
index 8a27b7b..e8cda60 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
@@ -101,7 +101,12 @@ namespace OpenSim.Region.Framework.Scenes.Tests
{
throw new NotImplementedException();
}
-
+ public RegionMeta7WindlightData LoadRegionWindlightSettings(UUID regionUUID)
+ {
+ //This connector doesn't support the windlight module yet
+ //Return default LL windlight settings
+ return new RegionMeta7WindlightData();
+ }
public RegionSettings LoadRegionSettings(UUID regionUUID)
{
return null;
--
cgit v1.1
From ee9d46c8255840473ed62c3b37270b35af1a9027 Mon Sep 17 00:00:00 2001
From: KittoFlora
Date: Tue, 8 Dec 2009 05:49:05 +0100
Subject: Correct AbsolutePosition calculation
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index a6382ee..a23c11e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -849,7 +849,8 @@ namespace OpenSim.Region.Framework.Scenes
if (IsAttachment)
return GroupPosition;
- return m_offsetPosition + m_groupPosition; }
+// return m_offsetPosition + m_groupPosition; }
+ return m_groupPosition + (m_offsetPosition * ParentGroup.RootPart.RotationOffset) ; } //KF: Rotation was ignored!
}
public SceneObjectGroup ParentGroup
--
cgit v1.1
From e3f229225c5a1506090bfcffcce6d423a566f1fe Mon Sep 17 00:00:00 2001
From: unknown
Date: Wed, 9 Dec 2009 01:34:26 +0100
Subject: Enable scripting interface for windlight
---
OpenSim/Region/Framework/Scenes/EventManager.cs | 12 ++++++++++++
OpenSim/Region/Framework/Scenes/Scene.cs | 7 +++++++
OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs | 4 ++++
3 files changed, 23 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 753344d..a86e263 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -193,7 +193,9 @@ namespace OpenSim.Region.Framework.Scenes
public event OnMakeChildAgentDelegate OnMakeChildAgent;
public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
+ public delegate void OnSaveNewWindlightProfileDelegate();
public event OnMakeRootAgentDelegate OnMakeRootAgent;
+ public event OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile;
public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel);
@@ -411,6 +413,7 @@ namespace OpenSim.Region.Framework.Scenes
private IncomingInstantMessage handlerUnhandledInstantMessage = null; //OnUnhandledInstantMessage;
private ClientClosed handlerClientClosed = null; //OnClientClosed;
private OnMakeChildAgentDelegate handlerMakeChildAgent = null; //OnMakeChildAgent;
+ private OnSaveNewWindlightProfileDelegate handlerSaveNewWindlightProfile = null; //OnSaveNewWindlightProfile;
private OnMakeRootAgentDelegate handlerMakeRootAgent = null; //OnMakeRootAgent;
private OnTerrainTickDelegate handlerTerrainTick = null; // OnTerainTick;
private RegisterCapsEvent handlerRegisterCaps = null; // OnRegisterCaps;
@@ -772,6 +775,15 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void TriggerOnSaveNewWindlightProfile()
+ {
+ handlerSaveNewWindlightProfile = OnSaveNewWindlightProfile;
+ if (handlerSaveNewWindlightProfile != null)
+ {
+ handlerSaveNewWindlightProfile();
+ }
+ }
+
public void TriggerOnMakeRootAgent(ScenePresence presence)
{
handlerMakeRootAgent = OnMakeRootAgent;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 8d91d65..475d775 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1505,6 +1505,13 @@ namespace OpenSim.Region.Framework.Scenes
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
}
+ public void StoreWindlightProfile(RegionMeta7WindlightData wl)
+ {
+ m_regInfo.WindlightSettings = wl;
+ m_storageManager.DataStore.StoreRegionWindlightSettings(wl);
+ m_eventManager.TriggerOnSaveNewWindlightProfile();
+ }
+
///
/// Loads the World heightmap
///
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
index e8cda60..5abbb82 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
@@ -107,6 +107,10 @@ namespace OpenSim.Region.Framework.Scenes.Tests
//Return default LL windlight settings
return new RegionMeta7WindlightData();
}
+ public void StoreRegionWindlightSettings(RegionMeta7WindlightData wl)
+ {
+ //This connector doesn't support the windlight module yet
+ }
public RegionSettings LoadRegionSettings(UUID regionUUID)
{
return null;
--
cgit v1.1
From 2a6dbd068ef48c7605f44153dcfea6b215749bed Mon Sep 17 00:00:00 2001
From: CasperW
Date: Wed, 9 Dec 2009 03:58:56 +0100
Subject: Last bits and bobs to clean up the Meta7WindlightModule
---
OpenSim/Region/Framework/Scenes/Scene.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 475d775..1b275b0 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1504,7 +1504,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
}
-
+
public void StoreWindlightProfile(RegionMeta7WindlightData wl)
{
m_regInfo.WindlightSettings = wl;
@@ -1512,6 +1512,12 @@ namespace OpenSim.Region.Framework.Scenes
m_eventManager.TriggerOnSaveNewWindlightProfile();
}
+ public void LoadWindlightProfile()
+ {
+ m_regInfo.WindlightSettings = m_storageManager.DataStore.LoadRegionWindlightSettings(RegionInfo.RegionID);
+ m_eventManager.TriggerOnSaveNewWindlightProfile();
+ }
+
///
/// Loads the World heightmap
///
--
cgit v1.1
From b056c243e46daa3370f8d330b70a37b5f856e9ec Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Sat, 12 Dec 2009 10:12:59 -0500
Subject: Commit partial work because of repo change
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 83 ++++++++++++++++++++----
1 file changed, 72 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c553ca0..d0c20ff 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1660,16 +1660,27 @@ namespace OpenSim.Region.Framework.Scenes
}
// part.GetWorldRotation() is the rotation of the object being sat on
// Rotation is the sittiing Av's rotation
-
- Quaternion wr = Quaternion.Inverse(Quaternion.Inverse(Rotation) * Quaternion.Inverse(part.GetWorldRotation())); // world or. of the av
- Vector3 so = new Vector3(1.0f, 0f, 0f) * wr; // 1M infront of av
- Vector3 wso = so + part.GetWorldPosition() + ( m_pos * part.GetWorldRotation()); // + av sit offset!
+
+ Quaternion partRot;
+ if (part.LinkNum == 1)
+ { // Root prim of linkset
+ partRot = part.ParentGroup.RootPart.RotationOffset;
+ }
+ else
+ { // single or child prim
+ partRot = part.GetWorldRotation();
+ }
+ Quaternion partIRot = Quaternion.Inverse(partRot);
+
+ Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
+ Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
+ Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ( m_pos * partRot); // + av sit offset!
if (m_physicsActor == null)
{
AddToPhysicalScene(false);
}
- AbsolutePosition = wso; //KF: Fix stand up.
+ AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
m_parentPosition = Vector3.Zero;
m_parentID = 0;
part.IsOccupied = false;
@@ -1752,8 +1763,17 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion avSitOrientation = part.SitTargetOrientation;
bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
- Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
-
+ // Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ Quaternion partRot;
+ if (part.LinkNum == 1)
+ { // Root prim of linkset
+ partRot = part.ParentGroup.RootPart.RotationOffset;
+ }
+ else
+ { // single or child prim
+ partRot = part.GetWorldRotation();
+ }
+ Quaternion partIRot = Quaternion.Inverse(partRot);
//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
// Sit analysis rewritten by KF 091125
if (SitTargetisSet) // scipted sit
@@ -1800,6 +1820,8 @@ namespace OpenSim.Region.Framework.Scenes
cameraAtOffset = part.GetCameraAtOffset();
cameraEyeOffset = part.GetCameraEyeOffset();
forceMouselook = part.GetForceMouselook();
+ if(cameraAtOffset == Vector3.Zero) cameraAtOffset = new Vector3(0f, 0f, 0.1f); //
+ if(cameraEyeOffset == Vector3.Zero) cameraEyeOffset = new Vector3(0f, 0f, 0.1f); //
if (m_physicsActor != null)
{
@@ -1823,7 +1845,29 @@ namespace OpenSim.Region.Framework.Scenes
}
else return; // physactor is null!
- Vector3 offsetr = offset * partIRot;
+ Vector3 offsetr; // = offset * partIRot;
+ // KF: In a linkset, offsetr needs to be relative to the group root! 091208
+ // offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
+ if (part.LinkNum < 2)
+ { // Single, or Root prim of linkset, target is ClickOffset * RootRot
+ offsetr = offset * partIRot;
+ }
+ else
+ { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
+ offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
+ (offset * partRot);
+ }
+
+Console.WriteLine(" ");
+Console.WriteLine("link number ={0}", part.LinkNum);
+Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
+Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
+Console.WriteLine("Click offst ={0}", offset);
+Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
+Console.WriteLine("offsetr ={0}", offsetr);
+Console.WriteLine("Camera At ={0}", cameraAtOffset);
+Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
+
ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls
@@ -2142,13 +2186,20 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
-//Console.WriteLine("NON Scripted Sit");
// if m_avUnscriptedSitPos is zero then Av sits above center
// Else Av sits at m_avUnscriptedSitPos
// Non-scripted sit by Kitto Flora 21Nov09
// Calculate angle of line from prim to Av
- Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ Quaternion partIRot;
+ if (part.LinkNum == 1)
+ { // Root prim of linkset
+ partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
+ }
+ else
+ { // single or child prim
+ partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ }
Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
@@ -2203,11 +2254,21 @@ namespace OpenSim.Region.Framework.Scenes
// collisionPoint = spot on prim where we want to sit
// collisionPoint.Z = global sit surface height
SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
- Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ Quaternion partIRot;
+ if (part.LinkNum == 1)
+ { // Root prim of linkset
+ partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
+ }
+ else
+ { // single or child prim
+ partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ }
float offZ = collisionPoint.Z - m_initialSitTarget.Z;
Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
m_pos += offset;
+ ControllingClient.SendClearFollowCamProperties(part.UUID);
+
}
} // End SitAltitudeCallback KF.
--
cgit v1.1
From b8b4517211d332f76c022075f81cfefd41877d14 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Tue, 15 Dec 2009 01:49:23 -0500
Subject: Removed excessive call to UpdateMovementAnimations which prevented
GroundSit; Corrected cause of 'sit on roof'.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 48 ++++++++++++------------
1 file changed, 23 insertions(+), 25 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d0c20ff..c67463a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -670,8 +670,7 @@ namespace OpenSim.Region.Framework.Scenes
AdjustKnownSeeds();
-
- Animator.TrySetMovementAnimation("STAND");
+ Animator.TrySetMovementAnimation("STAND");
// we created a new ScenePresence (a new child agent) in a fresh region.
// Request info about all the (root) agents in this region
// Note: This won't send data *to* other clients in that region (children don't send)
@@ -1691,7 +1690,6 @@ namespace OpenSim.Region.Framework.Scenes
SetHeight(m_avHeight);
}
}
-
Animator.TrySetMovementAnimation("STAND");
}
@@ -1858,15 +1856,15 @@ namespace OpenSim.Region.Framework.Scenes
(offset * partRot);
}
-Console.WriteLine(" ");
-Console.WriteLine("link number ={0}", part.LinkNum);
-Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
-Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
-Console.WriteLine("Click offst ={0}", offset);
-Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
-Console.WriteLine("offsetr ={0}", offsetr);
-Console.WriteLine("Camera At ={0}", cameraAtOffset);
-Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
+//Console.WriteLine(" ");
+//Console.WriteLine("link number ={0}", part.LinkNum);
+//Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
+//Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
+//Console.WriteLine("Click offst ={0}", offset);
+//Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
+//Console.WriteLine("offsetr ={0}", offsetr);
+//Console.WriteLine("Camera At ={0}", cameraAtOffset);
+//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
@@ -2218,7 +2216,7 @@ Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
m_avUnscriptedSitPos; // adds click offset, if any
//Set up raytrace to find top surface of prim
Vector3 size = part.Scale;
- float mag = 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
+ float mag = 2.0f; // 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
Vector3 down = new Vector3(0f, 0f, -1f);
//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag);
@@ -2267,7 +2265,7 @@ Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
m_pos += offset;
- ControllingClient.SendClearFollowCamProperties(part.UUID);
+// ControllingClient.SendClearFollowCamProperties(part.UUID);
}
} // End SitAltitudeCallback KF.
@@ -3297,7 +3295,7 @@ Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
m_updateflag = true;
Velocity = force;
m_isNudging = false;
- m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
+ m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
}
}
}
@@ -3349,19 +3347,19 @@ Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
// Event called by the physics plugin to tell the avatar about a collision.
private void PhysicsCollisionUpdate(EventArgs e)
{
- if (m_updateCount > 0) //KF: Update Anims for a short period. Many Anim
- { // changes are very asynchronous.
- Animator.UpdateMovementAnimations();
- m_updateCount--;
- }
-
if (e == null)
return;
-
- // The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents(
+
+ // The Physics Scene will send (spam!) updates every 500 ms grep: m_physicsActor.SubscribeEvents(
// as of this comment the interval is set in AddToPhysicalScene
if (Animator!=null)
- Animator.UpdateMovementAnimations();
+ {
+ if (m_updateCount > 0) //KF: DO NOT call UpdateMovementAnimations outside of the m_updateCount wrapper,
+ { // else its will lock out other animation changes, like ground sit.
+ Animator.UpdateMovementAnimations();
+ m_updateCount--;
+ }
+ }
CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
Dictionary coldata = collisionData.m_objCollisionList;
@@ -3370,7 +3368,7 @@ Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
if (m_lastColCount != coldata.Count)
{
- m_updateCount = 10;
+ m_updateCount = UPDATE_COUNT;
m_lastColCount = coldata.Count;
}
--
cgit v1.1
From 7cd44c1a818615ca0e267f64c74593ad0361350b Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Tue, 15 Dec 2009 20:04:53 -0500
Subject: Fix prim linking bug, Manis #14
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index a23c11e..778e384 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -513,18 +513,24 @@ namespace OpenSim.Region.Framework.Scenes
{
// If this is a linkset, we don't want the physics engine mucking up our group position here.
PhysicsActor actor = PhysActor;
+
+ if (actor != null && _parentID == 0)
+ {
+ m_groupPosition = actor.Position;
+ }
+/*
if (actor != null)
{
if (_parentID == 0)
{
- m_groupPosition = actor.Position;
+ m_groupPosition = actor.Position;
}
else
{
m_groupPosition = ParentGroup.AbsolutePosition; // KF+Casper Update Child prims too!
}
}
-
+*/
if (IsAttachment)
{
ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar);
--
cgit v1.1
From 6483470ec5e9000fb6a85bbdfe5b79be6f336a74 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Thu, 17 Dec 2009 02:54:02 -0500
Subject: Fix GetWorldRotation(), and a host of related Sit fixes.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 73 +++++++++++-----------
2 files changed, 38 insertions(+), 37 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 778e384..4495eda 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1775,7 +1775,7 @@ namespace OpenSim.Region.Framework.Scenes
{
Quaternion newRot;
- if (this.LinkNum == 0)
+ if (this.LinkNum < 2) //KF Single or root prim
{
newRot = RotationOffset;
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c67463a..865f649 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1661,14 +1661,14 @@ namespace OpenSim.Region.Framework.Scenes
// Rotation is the sittiing Av's rotation
Quaternion partRot;
- if (part.LinkNum == 1)
- { // Root prim of linkset
- partRot = part.ParentGroup.RootPart.RotationOffset;
- }
- else
- { // single or child prim
+// if (part.LinkNum == 1)
+// { // Root prim of linkset
+// partRot = part.ParentGroup.RootPart.RotationOffset;
+// }
+// else
+// { // single or child prim
partRot = part.GetWorldRotation();
- }
+// }
Quaternion partIRot = Quaternion.Inverse(partRot);
Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
@@ -1763,14 +1763,14 @@ namespace OpenSim.Region.Framework.Scenes
bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
// Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
Quaternion partRot;
- if (part.LinkNum == 1)
- { // Root prim of linkset
- partRot = part.ParentGroup.RootPart.RotationOffset;
- }
- else
- { // single or child prim
+// if (part.LinkNum == 1)
+// { // Root prim of linkset
+// partRot = part.ParentGroup.RootPart.RotationOffset;
+// }
+// else
+// { // single or child prim
partRot = part.GetWorldRotation();
- }
+// }
Quaternion partIRot = Quaternion.Inverse(partRot);
//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
// Sit analysis rewritten by KF 091125
@@ -1846,15 +1846,15 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 offsetr; // = offset * partIRot;
// KF: In a linkset, offsetr needs to be relative to the group root! 091208
// offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
- if (part.LinkNum < 2)
- { // Single, or Root prim of linkset, target is ClickOffset * RootRot
+ // if (part.LinkNum < 2) 091216 All this was necessary because of the GetWorldRotation error.
+ // { // Single, or Root prim of linkset, target is ClickOffset * RootRot
offsetr = offset * partIRot;
- }
- else
- { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
- offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
- (offset * partRot);
- }
+//
+ // else
+ // { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
+ // offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
+ // (offset * partRot);
+ // }
//Console.WriteLine(" ");
//Console.WriteLine("link number ={0}", part.LinkNum);
@@ -2170,6 +2170,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part != null)
{
+//Console.WriteLine("Link #{0}, Rot {1}", part.LinkNum, part.GetWorldRotation());
if (part.GetAvatarOnSitTarget() == UUID)
{
//Console.WriteLine("Scripted Sit");
@@ -2190,14 +2191,14 @@ namespace OpenSim.Region.Framework.Scenes
// Non-scripted sit by Kitto Flora 21Nov09
// Calculate angle of line from prim to Av
Quaternion partIRot;
- if (part.LinkNum == 1)
- { // Root prim of linkset
- partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
- }
- else
- { // single or child prim
+// if (part.LinkNum == 1)
+// { // Root prim of linkset
+// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
+// }
+// else
+// { // single or child prim
partIRot = Quaternion.Inverse(part.GetWorldRotation());
- }
+// }
Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
@@ -2253,14 +2254,14 @@ namespace OpenSim.Region.Framework.Scenes
// collisionPoint.Z = global sit surface height
SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
Quaternion partIRot;
- if (part.LinkNum == 1)
- { // Root prim of linkset
- partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
- }
- else
- { // single or child prim
+// if (part.LinkNum == 1)
+/// { // Root prim of linkset
+// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
+// }
+// else
+// { // single or child prim
partIRot = Quaternion.Inverse(part.GetWorldRotation());
- }
+// }
float offZ = collisionPoint.Z - m_initialSitTarget.Z;
Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
--
cgit v1.1
From 6dbe25360ec3dc3c998378da8b422751d3e032a9 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Thu, 17 Dec 2009 18:40:34 +0100
Subject: Add cmSetWindlightSceneTargeted. Add restrictions on windlight script
use.
---
OpenSim/Region/Framework/Scenes/EventManager.cs | 12 ++++++++++++
OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++--
2 files changed, 14 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index a86e263..68e73b1 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -194,7 +194,9 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
public delegate void OnSaveNewWindlightProfileDelegate();
+ public delegate void OnSendNewWindlightProfileTargetedDelegate(RegionMeta7WindlightData wl, UUID user);
public event OnMakeRootAgentDelegate OnMakeRootAgent;
+ public event OnSendNewWindlightProfileTargetedDelegate OnSendNewWindlightProfileTargeted;
public event OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile;
public delegate void NewInventoryItemUploadComplete(UUID avatarID, UUID assetID, string name, int userlevel);
@@ -414,6 +416,7 @@ namespace OpenSim.Region.Framework.Scenes
private ClientClosed handlerClientClosed = null; //OnClientClosed;
private OnMakeChildAgentDelegate handlerMakeChildAgent = null; //OnMakeChildAgent;
private OnSaveNewWindlightProfileDelegate handlerSaveNewWindlightProfile = null; //OnSaveNewWindlightProfile;
+ private OnSendNewWindlightProfileTargetedDelegate handlerSendNewWindlightProfileTargeted = null; //OnSendNewWindlightProfileTargeted;
private OnMakeRootAgentDelegate handlerMakeRootAgent = null; //OnMakeRootAgent;
private OnTerrainTickDelegate handlerTerrainTick = null; // OnTerainTick;
private RegisterCapsEvent handlerRegisterCaps = null; // OnRegisterCaps;
@@ -775,6 +778,15 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void TriggerOnSendNewWindlightProfileTargeted(RegionMeta7WindlightData wl, UUID user)
+ {
+ handlerSendNewWindlightProfileTargeted = OnSendNewWindlightProfileTargeted;
+ if (handlerSendNewWindlightProfileTargeted != null)
+ {
+ handlerSendNewWindlightProfileTargeted(wl, user);
+ }
+ }
+
public void TriggerOnSaveNewWindlightProfile()
{
handlerSaveNewWindlightProfile = OnSaveNewWindlightProfile;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 104d22b..20cae5d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1519,8 +1519,8 @@ namespace OpenSim.Region.Framework.Scenes
public void SaveTerrain()
{
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
- }
-
+ }
+
public void StoreWindlightProfile(RegionMeta7WindlightData wl)
{
m_regInfo.WindlightSettings = wl;
--
cgit v1.1
From e38e8ae98759e403175016260edd27772b5c9e4c Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Sat, 19 Dec 2009 19:54:44 -0500
Subject: Fix mantis #10 & #14
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 33 +++++++---------------
1 file changed, 10 insertions(+), 23 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 778e384..0eddbfd 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -513,24 +513,11 @@ namespace OpenSim.Region.Framework.Scenes
{
// If this is a linkset, we don't want the physics engine mucking up our group position here.
PhysicsActor actor = PhysActor;
-
if (actor != null && _parentID == 0)
{
m_groupPosition = actor.Position;
- }
-/*
- if (actor != null)
- {
- if (_parentID == 0)
- {
- m_groupPosition = actor.Position;
- }
- else
- {
- m_groupPosition = ParentGroup.AbsolutePosition; // KF+Casper Update Child prims too!
- }
}
-*/
+
if (IsAttachment)
{
ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar);
@@ -545,7 +532,6 @@ namespace OpenSim.Region.Framework.Scenes
StoreUndoState();
m_groupPosition = value;
-
PhysicsActor actor = PhysActor;
if (actor != null)
{
@@ -1755,16 +1741,17 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 GetWorldPosition()
{
Quaternion parentRot = ParentGroup.RootPart.RotationOffset;
-
Vector3 axPos = OffsetPosition;
axPos *= parentRot;
Vector3 translationOffsetPosition = axPos;
-
- int tx = (int)GroupPosition.X;
- int ty = (int)GroupPosition.Y;
- int tz = (int)GroupPosition.Z;
-
- return GroupPosition + translationOffsetPosition;
+ if(_parentID == 0)
+ {
+ return GroupPosition;
+ }
+ else
+ {
+ return ParentGroup.AbsolutePosition + translationOffsetPosition; //KF: Fix child prim position
+ }
}
///
@@ -1775,7 +1762,7 @@ namespace OpenSim.Region.Framework.Scenes
{
Quaternion newRot;
- if (this.LinkNum == 0)
+ if (this.LinkNum < 2) //KF Single or root prim
{
newRot = RotationOffset;
}
--
cgit v1.1
From e3c14660478bdd3af8c792b4b6b48ffffbbe19f9 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Mon, 21 Dec 2009 13:22:52 +0100
Subject: Fixed a nasty crash in StandUp() that occurred when the part got
killed with an avatar sitting on it.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 54 ++++++++++++++++++------
1 file changed, 41 insertions(+), 13 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 865f649..abdd1a0 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -118,7 +118,8 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
- private Vector3 m_lastPosition;
+ private Vector3 m_lastPosition;
+ private Vector3 m_lastWorldPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
//private int m_lastTerseSent;
@@ -1667,24 +1668,45 @@ namespace OpenSim.Region.Framework.Scenes
// }
// else
// { // single or child prim
- partRot = part.GetWorldRotation();
-// }
+
+// }
+ if (part == null) //CW: Part may be gone. llDie() for example.
+ {
+ partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else
+ {
+ partRot = part.GetWorldRotation();
+ }
+
Quaternion partIRot = Quaternion.Inverse(partRot);
Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
- Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ( m_pos * partRot); // + av sit offset!
- if (m_physicsActor == null)
- {
- AddToPhysicalScene(false);
+
+ if (m_physicsActor == null)
+ {
+ AddToPhysicalScene(false);
+ }
+ //CW: If the part isn't null then we can set the current position
+ if (part != null)
+ {
+ Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
+ AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
+ part.IsOccupied = false;
+ }
+ else
+ {
+ //CW: Since the part doesn't exist, a coarse standup position isn't an issue
+ AbsolutePosition = m_lastWorldPosition;
}
- AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
- m_parentPosition = Vector3.Zero;
+
+ m_parentPosition = Vector3.Zero;
m_parentID = 0;
- part.IsOccupied = false;
SendFullUpdateToAllClients();
m_requestedSitTargetID = 0;
+
if ((m_physicsActor != null) && (m_avHeight > 0))
{
SetHeight(m_avHeight);
@@ -1778,7 +1800,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (!part.IsOccupied)
{
-//Console.WriteLine("Scripted, unoccupied");
+//Console.WriteLine("Scripted, unoccupied");
part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
sitOrientation = avSitOrientation; // Change rotatione to the scripted one
@@ -1831,13 +1853,19 @@ namespace OpenSim.Region.Framework.Scenes
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
{
- autopilot = false; // close enough
+ autopilot = false; // close enough
+ m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
+ Not using the part's position because returning the AV to the last known standing
+ position is likely to be more friendly, isn't it? */
RemoveFromPhysicalScene();
AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target
} // else the autopilot will get us close
}
else
- { // its a scripted sit
+ { // its a scripted sit
+ m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
+ I *am* using the part's position this time because we have no real idea how far away
+ the avatar is from the sit target. */
RemoveFromPhysicalScene();
}
}
--
cgit v1.1
From 69b551c51686bca58c478f517f6ccfa561ad9730 Mon Sep 17 00:00:00 2001
From: root
Date: Tue, 22 Dec 2009 03:22:33 +0100
Subject: Allow 100ms for scripts to run attach(NULL_KEY) on detach
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 12 ++++++++++++
1 file changed, 12 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index f74fd5d..e875525 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -542,6 +542,18 @@ namespace OpenSim.Region.Framework.Scenes
if (group.GetFromItemID() == itemID)
{
m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero);
+ bool hasScripts = false;
+ foreach (SceneObjectPart part in group.Children)
+ {
+ if (part..Inventory.ContainsScripts())
+ {
+ hasScripts = true;
+ break;
+ }
+ }
+
+ if (hasScripts) // Allow the object to execute the attach(NULL_KEY) event
+ System.Threading.Thread.Sleep(100);
group.DetachToInventoryPrep();
m_log.Debug("[DETACH]: Saving attachpoint: " +
((uint)group.GetAttachmentPoint()).ToString());
--
cgit v1.1
From 46fea747265574bb056b8d1ffa189ec3725a7abc Mon Sep 17 00:00:00 2001
From: root
Date: Tue, 22 Dec 2009 03:25:09 +0100
Subject: Jumped the gun...
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index e875525..fadeaf4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -545,7 +545,7 @@ namespace OpenSim.Region.Framework.Scenes
bool hasScripts = false;
foreach (SceneObjectPart part in group.Children)
{
- if (part..Inventory.ContainsScripts())
+ if (part.Inventory.ContainsScripts())
{
hasScripts = true;
break;
--
cgit v1.1
From 49fbe0ddb429b8625682255bf0cafa9ea93d274a Mon Sep 17 00:00:00 2001
From: root
Date: Tue, 22 Dec 2009 03:26:47 +0100
Subject: Should not commit without compiling
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index fadeaf4..b0fb8b3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -543,7 +543,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero);
bool hasScripts = false;
- foreach (SceneObjectPart part in group.Children)
+ foreach (SceneObjectPart part in group.Children.Values)
{
if (part.Inventory.ContainsScripts())
{
--
cgit v1.1
From b53b87166940ca0fca4ae2190649e18102c886ec Mon Sep 17 00:00:00 2001
From: root
Date: Tue, 22 Dec 2009 06:25:32 +0100
Subject: Add a data path for error messages
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 18 ++++++++++++------
.../Framework/Scenes/SceneObjectPartInventory.cs | 22 ++++++++++++++++++++++
2 files changed, 34 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 7ca779a..bce7d32 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
+using System.Collections;
using System.Reflection;
using System.Text;
using System.Timers;
@@ -215,13 +216,13 @@ namespace OpenSim.Region.Framework.Scenes
/// The prim which contains the item to update
/// Indicates whether the script to update is currently running
///
- public void CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId,
+ public ArrayList CapsUpdateTaskInventoryScriptAsset(IClientAPI remoteClient, UUID itemId,
UUID primId, bool isScriptRunning, byte[] data)
{
if (!Permissions.CanEditScript(itemId, primId, remoteClient.AgentId))
{
remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false);
- return;
+ return new ArrayList();
}
// Retrieve group
@@ -234,7 +235,7 @@ namespace OpenSim.Region.Framework.Scenes
"Prim inventory update requested for item ID {0} in prim ID {1} but this prim does not exist",
itemId, primId);
- return;
+ return new ArrayList();
}
// Retrieve item
@@ -247,7 +248,7 @@ namespace OpenSim.Region.Framework.Scenes
+ " but the item does not exist in this inventory",
itemId, part.Name, part.UUID);
- return;
+ return new ArrayList();
}
AssetBase asset = CreateAsset(item.Name, item.Description, (sbyte)AssetType.LSLText, data);
@@ -264,29 +265,33 @@ namespace OpenSim.Region.Framework.Scenes
part.GetProperties(remoteClient);
// Trigger rerunning of script (use TriggerRezScript event, see RezScript)
+ ArrayList errors = new ArrayList();
+
if (isScriptRunning)
{
// Needs to determine which engine was running it and use that
//
part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
+ errors = part.Inventory.GetScriptErrors(item.ItemID);
}
else
{
remoteClient.SendAgentAlertMessage("Script saved", false);
}
+ return errors;
}
///
/// CapsUpdateTaskInventoryScriptAsset(IClientAPI, UUID, UUID, bool, byte[])
///
- public void CapsUpdateTaskInventoryScriptAsset(UUID avatarId, UUID itemId,
+ public ArrayList CapsUpdateTaskInventoryScriptAsset(UUID avatarId, UUID itemId,
UUID primId, bool isScriptRunning, byte[] data)
{
ScenePresence avatar;
if (TryGetAvatar(avatarId, out avatar))
{
- CapsUpdateTaskInventoryScriptAsset(
+ return CapsUpdateTaskInventoryScriptAsset(
avatar.ControllingClient, itemId, primId, isScriptRunning, data);
}
else
@@ -295,6 +300,7 @@ namespace OpenSim.Region.Framework.Scenes
"[PRIM INVENTORY]: " +
"Avatar {0} cannot be found to update its prim item asset",
avatarId);
+ return new ArrayList();
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index cdd23bd..c3c6342 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -29,6 +29,7 @@ using System;
using System.Xml;
using System.IO;
using System.Collections.Generic;
+using System.Collections;
using System.Reflection;
using OpenMetaverse;
using log4net;
@@ -210,6 +211,27 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public ArrayList GetScriptErrors(UUID itemID)
+ {
+ ArrayList ret = new ArrayList();
+
+ IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
+ if (engines == null) // No engine at all
+ return ret;
+
+ foreach (IScriptModule e in engines)
+ {
+ if (e != null)
+ {
+ ArrayList errors = e.GetScriptErrors(itemID);
+ foreach (Object line in errors)
+ ret.Add(line);
+ }
+ }
+
+ return ret;
+ }
+
///
/// Stop all the scripts in this prim.
///
--
cgit v1.1
From e7439efc74a1cc0daedc51eb25ae66cd03db70b5 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Thu, 24 Dec 2009 19:19:44 -0500
Subject: Recover out-of-region objects during db load.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index b0fb8b3..998d598 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -222,6 +222,30 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool AddRestoredSceneObject(
SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted)
{
+ // KF: Check for out-of-region, move inside and make static.
+ Vector3 npos = new Vector3(sceneObject.RootPart.GroupPosition.X,
+ sceneObject.RootPart.GroupPosition.Y,
+ sceneObject.RootPart.GroupPosition.Z);
+ if (npos.X < 0.0 || npos.Y < 0.0 || npos.Z < 0.0 ||
+ npos.X > Constants.RegionSize ||
+ npos.Y > Constants.RegionSize)
+ {
+ if (npos.X < 0.0) npos.X = 1.0f;
+ if (npos.Y < 0.0) npos.Y = 1.0f;
+ if (npos.Z < 0.0) npos.Z = 0.0f;
+ if (npos.X > Constants.RegionSize) npos.X = Constants.RegionSize - 1.0f;
+ if (npos.Y > Constants.RegionSize) npos.Y = Constants.RegionSize - 1.0f;
+
+ foreach (SceneObjectPart part in sceneObject.Children.Values)
+ {
+ part.GroupPosition = npos;
+ }
+ sceneObject.RootPart.Velocity = Vector3.Zero;
+ sceneObject.RootPart.AngularVelocity = Vector3.Zero;
+ sceneObject.RootPart.Acceleration = Vector3.Zero;
+ sceneObject.RootPart.Velocity = Vector3.Zero;
+ }
+
if (!alreadyPersisted)
{
sceneObject.ForceInventoryPersistence();
--
cgit v1.1
From 7371c7662a05d2c1dae1c110905817bb873cf934 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Sat, 26 Dec 2009 18:14:12 +0100
Subject: Fix for landing points. Only one scenario is not fully covered by
this change, and that is people who teleport from neighbouring regions, who
won't get affected by the landing point.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +
.../Framework/Scenes/SceneCommunicationService.cs | 47 +++++++++++++++++-----
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 25 ++++++++++--
3 files changed, 59 insertions(+), 15 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 265129c..37734f4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3460,6 +3460,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
// Honor parcel landing type and position.
+ /*
ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
if (land != null)
{
@@ -3468,6 +3469,7 @@ namespace OpenSim.Region.Framework.Scenes
agent.startpos = land.LandData.UserLocation;
}
}
+ */// This is now handled properly in ScenePresence.MakeRootAgent
}
m_authenticateHandler.AddNewCircuit(agent.circuitcode, agent);
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index e649139..0a02d39 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -706,17 +706,42 @@ namespace OpenSim.Region.Framework.Scenes
{
m_log.DebugFormat(
"[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation {0} within {1}",
- position, m_regionInfo.RegionName);
-
- // Teleport within the same region
- if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
- {
- Vector3 emergencyPos = new Vector3(128, 128, 128);
-
- m_log.WarnFormat(
- "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
- position, avatar.Name, avatar.UUID, emergencyPos);
- position = emergencyPos;
+ position, m_regionInfo.RegionName);
+
+ // Teleport within the same region
+ if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
+ {
+ Vector3 emergencyPos = new Vector3(128, 128, 128);
+
+ m_log.WarnFormat(
+ "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
+ position, avatar.Name, avatar.UUID, emergencyPos);
+ position = emergencyPos;
+ }
+
+ Vector3 currentPos = avatar.AbsolutePosition;
+ ILandObject srcLand = m_scene.LandChannel.GetLandObject(currentPos.X, currentPos.Y);
+ ILandObject destLand = m_scene.LandChannel.GetLandObject(position.X, position.Y);
+ if (srcLand != null && destLand != null && (teleportFlags & (uint)TeleportFlags.ViaLure) == 0 && (teleportFlags & (uint)TeleportFlags.ViaGodlikeLure) == 0)
+ {
+ if (srcLand.LandData.LocalID == destLand.LandData.LocalID)
+ {
+ //TPing within the same parcel. If the landing point is restricted, block the TP.
+ //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
+ if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
+ {
+ avatar.ControllingClient.SendAgentAlertMessage("Can't TP to the destination; landing point set.", false);
+ position = currentPos;
+ }
+ }
+ else
+ {
+ //Tping to a different parcel. Respect the landing point on the destination parcel.
+ if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
+ {
+ position = destLand.LandData.UserLocation;
+ }
+ }
}
// TODO: Get proper AVG Height
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a3ad7ca..c3bc96a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -836,9 +836,24 @@ namespace OpenSim.Region.Framework.Scenes
{
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
pos.Y = crossedBorder.BorderLine.Z - 1;
+ }
+
+ //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
+ //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
+ //they'll bypass the landing point. But I can't think of any decent way of fixing this.
+ if (KnownChildRegionHandles.Count == 0)
+ {
+ ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
+ if (land != null)
+ {
+ //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
+ if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godlevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
+ {
+ pos = land.LandData.UserLocation;
+ }
+ }
}
-
if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
{
Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
@@ -973,9 +988,10 @@ namespace OpenSim.Region.Framework.Scenes
public void Teleport(Vector3 pos)
{
bool isFlying = false;
- if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
+ if (m_physicsActor != null)
+ isFlying = m_physicsActor.Flying;
+
RemoveFromPhysicalScene();
Velocity = Vector3.Zero;
AbsolutePosition = pos;
@@ -986,7 +1002,8 @@ namespace OpenSim.Region.Framework.Scenes
SetHeight(m_appearance.AvatarHeight);
}
- SendTerseUpdateToAllClients();
+ SendTerseUpdateToAllClients();
+
}
public void TeleportWithMomentum(Vector3 pos)
--
cgit v1.1
From a6c93ce875c9e563de791002b309a3285266d597 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Sat, 26 Dec 2009 22:55:18 +0100
Subject: Make sure that we're not bounds checking attachments. 'Cos otherwise
your hair will end up on your bum. Seen that before?
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 998d598..34a92fe 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -226,9 +226,9 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 npos = new Vector3(sceneObject.RootPart.GroupPosition.X,
sceneObject.RootPart.GroupPosition.Y,
sceneObject.RootPart.GroupPosition.Z);
- if (npos.X < 0.0 || npos.Y < 0.0 || npos.Z < 0.0 ||
+ if (!(((sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim) && (sceneObject.RootPart.Shape.State != 0))) && (npos.X < 0.0 || npos.Y < 0.0 || npos.Z < 0.0 ||
npos.X > Constants.RegionSize ||
- npos.Y > Constants.RegionSize)
+ npos.Y > Constants.RegionSize))
{
if (npos.X < 0.0) npos.X = 1.0f;
if (npos.Y < 0.0) npos.Y = 1.0f;
--
cgit v1.1
From 19a5e606b38372e882c13e27d6459ee703e07570 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Sun, 27 Dec 2009 07:08:16 +0100
Subject: Convert some remaining legacy lock()s for m_parts in SceneObjectGroup
to ReaderWriteLockSlim, hopefully fixes a native crash
---
.../Framework/Scenes/SceneObjectGroup.Inventory.cs | 24 ++++++++++++----------
1 file changed, 13 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 5a06bdb..65ce13a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -46,12 +46,12 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ForceInventoryPersistence()
{
- lock (m_parts)
+ lockPartsForRead(true);
+ List values = new List(m_parts.Values);
+ lockPartsForRead(false);
+ foreach (SceneObjectPart part in values)
{
- foreach (SceneObjectPart part in m_parts.Values)
- {
- part.Inventory.ForceInventoryPersistence();
- }
+ part.Inventory.ForceInventoryPersistence();
}
}
@@ -75,14 +75,16 @@ namespace OpenSim.Region.Framework.Scenes
/// Stop the scripts contained in all the prims in this group
///
public void RemoveScriptInstances()
- {
- lock (m_parts)
+ {
+ lockPartsForRead(true);
+ List values = new List(m_parts.Values);
+ lockPartsForRead(false);
+
+ foreach (SceneObjectPart part in values)
{
- foreach (SceneObjectPart part in m_parts.Values)
- {
- part.Inventory.RemoveScriptInstances();
- }
+ part.Inventory.RemoveScriptInstances();
}
+
}
///
--
cgit v1.1
From 9602227eb6d26cf76d8c88ac86558218ca11e918 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 31 Dec 2009 06:19:22 +0100
Subject: Add a small delay in NewAgentConnection to fix an issue with Hippo
(and possibly other cleints) getting their data mixed up.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 3 +++
1 file changed, 3 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2091bf0..2e34d1c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3414,6 +3414,9 @@ namespace OpenSim.Region.Framework.Scenes
CapsModule.AddCapsHandler(agent.AgentID);
+ if ((teleportFlags & ((uint)TeleportFlags.ViaLandmark | (uint)TeleportFlags.ViaLocation | (uint)TeleportFlags.ViaLandmark | (uint)TeleportFlags.Default)) != 0)
+ System.Threading.Thread.Sleep(2000);
+
if (!agent.child)
{
if (TestBorderCross(agent.startpos,Cardinals.E))
--
cgit v1.1
From 1121919b57e1495d0357d59e010a865b91757bfb Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 3 Jan 2010 22:02:36 +0000
Subject: Solve conflict
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 7 -------
1 file changed, 7 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index eda3d60..a14e3ad 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2910,13 +2910,6 @@ namespace OpenSim.Region.Framework.Scenes
SetText(text);
}
- public void StopLookAt()
- {
- m_parentGroup.stopLookAt();
-
- m_parentGroup.ScheduleGroupForTerseUpdate();
- }
-
public void StopMoveToTarget()
{
m_parentGroup.stopMoveToTarget();
--
cgit v1.1
From 884410501e50f0abb09ef1339ac74e22c2dfd39f Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 15 Jan 2010 20:19:06 +0000
Subject: Allow renaming of items that contain no-mod items
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 18ec25f..dd4c14b 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1803,8 +1803,13 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- item.BasePermissions = objectGroup.GetEffectivePermissions();
- item.CurrentPermissions = objectGroup.GetEffectivePermissions();
+ uint ownerPerms = objectGroup.GetEffectivePermissions();
+ if ((objectGroup.RootPart.OwnerMask & (uint)PermissionMask.Modify) != 0)
+ ownerPerms |= (uint)PermissionMask.Modify;
+
+ item.BasePermissions = ownerPerms;
+ item.CurrentPermissions = ownerPerms;
+
item.NextPermissions = objectGroup.RootPart.NextOwnerMask;
item.EveryOnePermissions = objectGroup.RootPart.EveryoneMask;
item.GroupPermissions = objectGroup.RootPart.GroupMask;
--
cgit v1.1
From 496a8a4f7ca5422daa30913595b6b1a03fa8a59a Mon Sep 17 00:00:00 2001
From: CasperW
Date: Wed, 20 Jan 2010 22:14:43 +0100
Subject: Fixed an issue with PayPrice sometimes being shared between multiple
objects
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index a7c14cf..4c97467 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -109,7 +109,7 @@ namespace OpenSim.Region.Framework.Scenes
// TODO: This needs to be persisted in next XML version update!
[XmlIgnore]
- public readonly int[] PayPrice = {-2,-2,-2,-2,-2};
+ public int[] PayPrice = {-2,-2,-2,-2,-2};
[XmlIgnore]
public PhysicsActor PhysActor;
--
cgit v1.1
From 1abb70cc73c997c08a416fecf689b83453f853d0 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Thu, 21 Jan 2010 19:31:02 -0500
Subject: Add glue for llSetVehicleFlags(), llRemoveVehicleFlags(). ChODE: Add
associated methods.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 4c97467..04be9fc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2963,7 +2963,23 @@ namespace OpenSim.Region.Framework.Scenes
PhysActor.VehicleRotationParam(param, rotation);
}
}
-
+
+ public void SetVehicleFlags(int flags)
+ {
+ if (PhysActor != null)
+ {
+ PhysActor.VehicleFlagsSet(flags);
+ }
+ }
+
+ public void RemoveVehicleFlags(int flags)
+ {
+ if (PhysActor != null)
+ {
+ PhysActor.VehicleFlagsRemove(flags);
+ }
+ }
+
public void SetGroup(UUID groupID, IClientAPI client)
{
_groupID = groupID;
--
cgit v1.1
From e9c9a74e0ade505ee8d8d8e7790141f758a65f61 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 26 Jan 2010 15:12:41 +0000
Subject: Some merge fixups
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs | 4 ++--
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index aea005e..8b58b3e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -74,7 +74,7 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Stop the scripts contained in all the prims in this group
///
- public void RemoveScriptInstances()
+ public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
{
lockPartsForRead(true);
List values = new List(m_parts.Values);
@@ -82,7 +82,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in values)
{
- part.Inventory.RemoveScriptInstances();
+ part.Inventory.RemoveScriptInstances(sceneObjectBeingDeleted);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 1de0092..9661775 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -249,7 +249,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if ((int)InventoryType.LSL == item.InvType)
{
- RemoveScriptInstance(item.ItemID);
+ RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
m_part.RemoveScriptEvents(item.ItemID);
}
}
--
cgit v1.1
From 0c5850237ec68158743117933d2ddd6e7df62c28 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 29 Jan 2010 16:50:00 +0000
Subject: Small fix for a spurious exception
---
OpenSim/Region/Framework/Scenes/SceneViewer.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index e4296ef..1cff0eb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -76,7 +76,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (EntityBase e in m_presence.Scene.Entities)
{
- if (e is SceneObjectGroup)
+ if (e != null && e is SceneObjectGroup)
m_pendingObjects.Enqueue((SceneObjectGroup)e);
}
}
--
cgit v1.1
From 6478617c932e87bf091266dba2db4d73fcdd046f Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 2 Feb 2010 03:49:00 +0000
Subject: Revert "improve locking of m_items in SceneObjectPartInventory"
This reverts commit 968b9e160d70568fbdea5b190d1386e9431316e3.
---
.../Framework/Scenes/SceneObjectPartInventory.cs | 218 ++++++++-------------
1 file changed, 85 insertions(+), 133 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 87c1a95..b37e1a2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -44,8 +44,6 @@ namespace OpenSim.Region.Framework.Scenes
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
- static System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
-
private string m_inventoryFileName = String.Empty;
private int m_inventoryFileNameSerial = 0;
@@ -272,12 +270,8 @@ namespace OpenSim.Region.Framework.Scenes
if (stateSource == 1 && // Prim crossing
m_part.ParentGroup.Scene.m_trustBinaries)
{
- lock (m_items)
- {
- m_items[item.ItemID].PermsMask = 0;
- m_items[item.ItemID].PermsGranter = UUID.Zero;
- }
-
+ m_items[item.ItemID].PermsMask = 0;
+ m_items[item.ItemID].PermsGranter = UUID.Zero;
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
m_part.ParentGroup.AddActiveScriptCount(1);
@@ -285,38 +279,33 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
- m_part.ParentGroup.Scene.AssetService.Get(
- item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset)
- {
- if (null == asset)
- {
- m_log.ErrorFormat(
- "[PRIM INVENTORY]: " +
- "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
- item.Name, item.ItemID, m_part.AbsolutePosition,
- m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
- }
- else
- {
- if (m_part.ParentGroup.m_savedScriptState != null)
- RestoreSavedScriptState(item.OldItemID, item.ItemID);
-
- lock (m_items)
- {
- m_items[item.ItemID].PermsMask = 0;
- m_items[item.ItemID].PermsGranter = UUID.Zero;
- }
-
- string script = Utils.BytesToString(asset.Data);
- m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
- m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
- m_part.ParentGroup.AddActiveScriptCount(1);
- m_part.ScheduleFullUpdate();
- }
- }
- );
+ m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString(), this, delegate(string id, object sender, AssetBase asset)
+ {
+ if (null == asset)
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
+ item.Name, item.ItemID, m_part.AbsolutePosition,
+ m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
+ }
+ else
+ {
+ if (m_part.ParentGroup.m_savedScriptState != null)
+ RestoreSavedScriptState(item.OldItemID, item.ItemID);
+ m_items[item.ItemID].PermsMask = 0;
+ m_items[item.ItemID].PermsGranter = UUID.Zero;
+ string script = Utils.BytesToString(asset.Data);
+ m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
+ m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
+ m_part.ParentGroup.AddActiveScriptCount(1);
+ m_part.ScheduleFullUpdate();
+ }
+ });
}
- }
+ }
+
+ static System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
private void RestoreSavedScriptState(UUID oldID, UUID newID)
{
@@ -408,15 +397,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void RemoveScriptInstance(UUID itemId, bool sceneObjectBeingDeleted)
{
- bool scriptPresent = false;
-
- lock (m_items)
- {
- if (m_items.ContainsKey(itemId))
- scriptPresent = true;
- }
-
- if (scriptPresent)
+ if (m_items.ContainsKey(itemId))
{
if (!sceneObjectBeingDeleted)
m_part.RemoveScriptEvents(itemId);
@@ -488,13 +469,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void AddInventoryItemExclusive(TaskInventoryItem item, bool allowedDrop)
{
- List il;
-
- lock (m_items)
- {
- il = new List(m_items.Values);
- }
-
+ List il = new List(m_items.Values);
foreach (TaskInventoryItem i in il)
{
if (i.Name == item.Name)
@@ -576,9 +551,7 @@ namespace OpenSim.Region.Framework.Scenes
public TaskInventoryItem GetInventoryItem(UUID itemId)
{
TaskInventoryItem item;
-
- lock (m_items)
- m_items.TryGetValue(itemId, out item);
+ m_items.TryGetValue(itemId, out item);
return item;
}
@@ -904,61 +877,54 @@ namespace OpenSim.Region.Framework.Scenes
{
uint mask=0x7fffffff;
- lock (m_items)
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
+ if (item.InvType != (int)InventoryType.Object)
{
- if (item.InvType != (int)InventoryType.Object)
- {
- if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0)
- mask &= ~((uint)PermissionMask.Copy >> 13);
- if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0)
- mask &= ~((uint)PermissionMask.Transfer >> 13);
- if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
- mask &= ~((uint)PermissionMask.Modify >> 13);
- }
- else
- {
- if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
- mask &= ~((uint)PermissionMask.Copy >> 13);
- if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
- mask &= ~((uint)PermissionMask.Transfer >> 13);
- if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
- mask &= ~((uint)PermissionMask.Modify >> 13);
- }
-
- if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
- mask &= ~(uint)PermissionMask.Copy;
- if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
- mask &= ~(uint)PermissionMask.Transfer;
- if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
- mask &= ~(uint)PermissionMask.Modify;
+ if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Copy) == 0)
+ mask &= ~((uint)PermissionMask.Copy >> 13);
+ if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Transfer) == 0)
+ mask &= ~((uint)PermissionMask.Transfer >> 13);
+ if ((item.CurrentPermissions & item.NextPermissions & (uint)PermissionMask.Modify) == 0)
+ mask &= ~((uint)PermissionMask.Modify >> 13);
+ }
+ else
+ {
+ if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
+ mask &= ~((uint)PermissionMask.Copy >> 13);
+ if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
+ mask &= ~((uint)PermissionMask.Transfer >> 13);
+ if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
+ mask &= ~((uint)PermissionMask.Modify >> 13);
}
+
+ if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
+ mask &= ~(uint)PermissionMask.Copy;
+ if ((item.CurrentPermissions & (uint)PermissionMask.Transfer) == 0)
+ mask &= ~(uint)PermissionMask.Transfer;
+ if ((item.CurrentPermissions & (uint)PermissionMask.Modify) == 0)
+ mask &= ~(uint)PermissionMask.Modify;
}
-
return mask;
}
public void ApplyNextOwnerPermissions()
{
- lock (m_items)
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
+ if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
{
- if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
- {
- if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
- item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
- if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
- item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
- if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
- item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
- item.CurrentPermissions |= 8;
- }
- item.CurrentPermissions &= item.NextPermissions;
- item.BasePermissions &= item.NextPermissions;
- item.EveryonePermissions &= item.NextPermissions;
+ if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
+ item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
+ if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
+ item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
+ if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
+ item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
+ item.CurrentPermissions |= 8;
}
+ item.CurrentPermissions &= item.NextPermissions;
+ item.BasePermissions &= item.NextPermissions;
+ item.EveryonePermissions &= item.NextPermissions;
}
m_part.TriggerScriptChangedEvent(Changed.OWNER);
@@ -966,29 +932,22 @@ namespace OpenSim.Region.Framework.Scenes
public void ApplyGodPermissions(uint perms)
{
- lock (m_items)
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
- {
- item.CurrentPermissions = perms;
- item.BasePermissions = perms;
- }
+ item.CurrentPermissions = perms;
+ item.BasePermissions = perms;
}
}
public bool ContainsScripts()
{
- lock (m_items)
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
+ if (item.InvType == (int)InventoryType.LSL)
{
- if (item.InvType == (int)InventoryType.LSL)
- {
- return true;
- }
+ return true;
}
}
-
return false;
}
@@ -996,11 +955,8 @@ namespace OpenSim.Region.Framework.Scenes
{
List ret = new List();
- lock (m_items)
- {
- foreach (TaskInventoryItem item in m_items.Values)
- ret.Add(item.ItemID);
- }
+ foreach (TaskInventoryItem item in m_items.Values)
+ ret.Add(item.ItemID);
return ret;
}
@@ -1013,30 +969,26 @@ namespace OpenSim.Region.Framework.Scenes
if (engines == null) // No engine at all
return ret;
- lock (m_items)
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
+ if (item.InvType == (int)InventoryType.LSL)
{
- if (item.InvType == (int)InventoryType.LSL)
+ foreach (IScriptModule e in engines)
{
- foreach (IScriptModule e in engines)
+ if (e != null)
{
- if (e != null)
+ string n = e.GetXMLState(item.ItemID);
+ if (n != String.Empty)
{
- string n = e.GetXMLState(item.ItemID);
- if (n != String.Empty)
- {
- if (!ret.ContainsKey(item.ItemID))
- ret[item.ItemID] = n;
- break;
- }
+ if (!ret.ContainsKey(item.ItemID))
+ ret[item.ItemID] = n;
+ break;
}
}
}
}
}
-
return ret;
}
}
-}
\ No newline at end of file
+}
--
cgit v1.1
From ae9362636e1a95c32f7bcf1225e939b44c37a4a0 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 4 Feb 2010 17:00:16 +0000
Subject: Line endings cleanup
---
.../Framework/Scenes/SceneCommunicationService.cs | 72 +++++++++++-----------
1 file changed, 36 insertions(+), 36 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 6a3c386..545183b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -699,42 +699,42 @@ namespace OpenSim.Region.Framework.Scenes
{
m_log.DebugFormat(
"[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation {0} within {1}",
- position, m_regionInfo.RegionName);
-
- // Teleport within the same region
- if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
- {
- Vector3 emergencyPos = new Vector3(128, 128, 128);
-
- m_log.WarnFormat(
- "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
- position, avatar.Name, avatar.UUID, emergencyPos);
- position = emergencyPos;
- }
-
- Vector3 currentPos = avatar.AbsolutePosition;
- ILandObject srcLand = m_scene.LandChannel.GetLandObject(currentPos.X, currentPos.Y);
- ILandObject destLand = m_scene.LandChannel.GetLandObject(position.X, position.Y);
- if (srcLand != null && destLand != null && (teleportFlags & (uint)TeleportFlags.ViaLure) == 0 && (teleportFlags & (uint)TeleportFlags.ViaGodlikeLure) == 0)
- {
- if (srcLand.LandData.LocalID == destLand.LandData.LocalID)
- {
- //TPing within the same parcel. If the landing point is restricted, block the TP.
- //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
- if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
- {
- avatar.ControllingClient.SendAgentAlertMessage("Can't TP to the destination; landing point set.", false);
- position = currentPos;
- }
- }
- else
- {
- //Tping to a different parcel. Respect the landing point on the destination parcel.
- if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
- {
- position = destLand.LandData.UserLocation;
- }
- }
+ position, m_regionInfo.RegionName);
+
+ // Teleport within the same region
+ if (IsOutsideRegion(avatar.Scene, position) || position.Z < 0)
+ {
+ Vector3 emergencyPos = new Vector3(128, 128, 128);
+
+ m_log.WarnFormat(
+ "[SCENE COMMUNICATION SERVICE]: RequestTeleportToLocation() was given an illegal position of {0} for avatar {1}, {2}. Substituting {3}",
+ position, avatar.Name, avatar.UUID, emergencyPos);
+ position = emergencyPos;
+ }
+
+ Vector3 currentPos = avatar.AbsolutePosition;
+ ILandObject srcLand = m_scene.LandChannel.GetLandObject(currentPos.X, currentPos.Y);
+ ILandObject destLand = m_scene.LandChannel.GetLandObject(position.X, position.Y);
+ if (srcLand != null && destLand != null && (teleportFlags & (uint)TeleportFlags.ViaLure) == 0 && (teleportFlags & (uint)TeleportFlags.ViaGodlikeLure) == 0)
+ {
+ if (srcLand.LandData.LocalID == destLand.LandData.LocalID)
+ {
+ //TPing within the same parcel. If the landing point is restricted, block the TP.
+ //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
+ if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
+ {
+ avatar.ControllingClient.SendAgentAlertMessage("Can't TP to the destination; landing point set.", false);
+ position = currentPos;
+ }
+ }
+ else
+ {
+ //Tping to a different parcel. Respect the landing point on the destination parcel.
+ if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
+ {
+ position = destLand.LandData.UserLocation;
+ }
+ }
}
// TODO: Get proper AVG Height
--
cgit v1.1
From ce3e2655752fb56d9f18bf7cc0686e97c06f16da Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 14 Feb 2010 23:58:54 +0000
Subject: Plug a small hole
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 3 +++
1 file changed, 3 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 7b852a2..b2b061e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -585,6 +585,9 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[AGENT INVENTORY]: Failed to find item " + oldItemID.ToString());
return;
}
+
+ if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
+ return;
}
AssetBase asset = AssetService.Get(item.AssetID.ToString());
--
cgit v1.1
From efd481085135f60d8f6d3e4615591a26ec3f05f6 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Thu, 25 Feb 2010 12:04:51 +0100
Subject: Disable blocking teleports within the same parcel for now; it's not
implemented correctly. Will review soon.
---
OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 9ceab19..5f84252 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -722,8 +722,10 @@ namespace OpenSim.Region.Framework.Scenes
//Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
if (destLand.LandData.LandingType == (byte)1 && destLand.LandData.UserLocation != Vector3.Zero && avatar.GodLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(avatar.UUID) && destLand.LandData.OwnerID != avatar.UUID)
{
- avatar.ControllingClient.SendAgentAlertMessage("Can't TP to the destination; landing point set.", false);
- position = currentPos;
+ //Disabling this behaviour for now pending review. ~CasperW
+
+ //avatar.ControllingClient.SendAgentAlertMessage("Can't TP to the destination; landing point set.", false);
+ //position = currentPos;
}
}
else
--
cgit v1.1
From 7f61de8f57d9f01e532dc37a5ef81153ba40fc24 Mon Sep 17 00:00:00 2001
From: CasperW
Date: Thu, 25 Feb 2010 14:14:53 +0100
Subject: Allow particles and texture anims to be persisted to XML. This
behaviour is expected.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 --
1 file changed, 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 11682d9..0d19589 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -518,14 +518,12 @@ namespace OpenSim.Region.Framework.Scenes
set { m_scriptAccessPin = (int)value; }
}
- [XmlIgnore]
public Byte[] TextureAnimation
{
get { return m_TextureAnimation; }
set { m_TextureAnimation = value; }
}
- [XmlIgnore]
public Byte[] ParticleSystem
{
get { return m_particleSystem; }
--
cgit v1.1
From 83929c69e35d156d99be46a6ee50b0d3fe5c9f25 Mon Sep 17 00:00:00 2001
From: unknown
Date: Sat, 6 Mar 2010 00:56:55 -0600
Subject: - implementing server 1.38 functions
Signed-off-by: Melanie
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 5 +++++
1 file changed, 5 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 5c283bc..a85a4b3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4680,5 +4680,10 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[Physics] " + ex);
}
}
+
+ public Color4 GetTextColor()
+ {
+ return new Color4((byte)Color.R, (byte)Color.G, (byte)Color.B, (byte)(0xFF - Color.A));
+ }
}
}
--
cgit v1.1
From 5caae0293ab0f69cced21923c36db230698c7970 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 3 Mar 2010 22:14:06 +0000
Subject: Fix bug where approximately half the time, attachments would rez only
their root prim until right clicked (or otherwise updated). The root cause of
this problem was that multiple ObjectUpdates were being sent on attachment
which differed enough to confuse the client. Sometimes these would eliminate
each other and sometimes not, depending on whether the scheduler looked at
the queued updates. The solution here is to only schedule the ObjectUpdate
once the attachment code has done all it needs to do.
Backport from head.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 44 ++++++++++++---
OpenSim/Region/Framework/Scenes/Scene.cs | 40 +++++++++++---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 62 ++++++++++++++--------
.../Region/Framework/Scenes/SceneObjectGroup.cs | 35 +++++++++---
4 files changed, 138 insertions(+), 43 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index c6cee75..5b21332 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2339,9 +2339,18 @@ namespace OpenSim.Region.Framework.Scenes
EventManager.TriggerOnAttach(localID, itemID, avatarID);
}
- public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID,
- uint AttachmentPt)
+ ///
+ /// Called when the client receives a request to rez a single attachment on to the avatar from inventory
+ /// (RezSingleAttachmentFromInv packet).
+ ///
+ ///
+ ///
+ ///
+ ///
+ public UUID RezSingleAttachment(IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
{
+ m_log.DebugFormat("[USER INVENTORY]: Rezzing single attachment from item {0} for {1}", itemID, remoteClient.Name);
+
SceneObjectGroup att = m_sceneGraph.RezSingleAttachment(remoteClient, itemID, AttachmentPt);
if (att == null)
@@ -2353,9 +2362,20 @@ namespace OpenSim.Region.Framework.Scenes
return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt);
}
- public UUID RezSingleAttachment(SceneObjectGroup att,
- IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
+ ///
+ /// Update the user inventory to reflect an attachment
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public UUID RezSingleAttachment(SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
{
+ m_log.DebugFormat(
+ "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})",
+ remoteClient.Name, att.Name, itemID);
+
if (!att.IsDeleted)
AttachmentPt = att.RootPart.AttachmentPoint;
@@ -2394,8 +2414,19 @@ namespace OpenSim.Region.Framework.Scenes
return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent);
}
+ ///
+ /// This registers the item as attached in a user's inventory
+ ///
+ ///
+ ///
+ ///
+ ///
public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
{
+// m_log.DebugFormat(
+// "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}",
+// att.Name, remoteClient.Name, AttachmentPt, itemID);
+
if (UUID.Zero == itemID)
{
m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID.");
@@ -2423,10 +2454,7 @@ namespace OpenSim.Region.Framework.Scenes
presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/);
if (m_AvatarFactory != null)
- {
m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
- }
-
}
}
@@ -2509,6 +2537,7 @@ namespace OpenSim.Region.Framework.Scenes
{
sog.SetOwnerId(ownerID);
sog.SetGroup(groupID, remoteClient);
+ sog.ScheduleGroupForFullUpdate();
foreach (SceneObjectPart child in sog.Children.Values)
child.Inventory.ChangeInventoryOwner(ownerID);
@@ -2530,6 +2559,7 @@ namespace OpenSim.Region.Framework.Scenes
sog.SetOwnerId(groupID);
sog.ApplyNextOwnerPermissions();
}
+
}
foreach (uint localID in localIDs)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 41fd1e1..7796b8d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1813,14 +1813,22 @@ namespace OpenSim.Region.Framework.Scenes
//m_log.DebugFormat(
// "[SCENE]: Scene.AddNewPrim() pcode {0} called for {1} in {2}", shape.PCode, ownerID, RegionInfo.RegionName);
+ SceneObjectGroup sceneObject = null;
+
// If an entity creator has been registered for this prim type then use that
if (m_entityCreators.ContainsKey((PCode)shape.PCode))
- return m_entityCreators[(PCode)shape.PCode].CreateEntity(ownerID, groupID, pos, rot, shape);
+ {
+ sceneObject = m_entityCreators[(PCode)shape.PCode].CreateEntity(ownerID, groupID, pos, rot, shape);
+ }
+ else
+ {
+ // Otherwise, use this default creation code;
+ sceneObject = new SceneObjectGroup(ownerID, pos, rot, shape);
+ AddNewSceneObject(sceneObject, true);
+ sceneObject.SetGroup(groupID, null);
+ }
- // Otherwise, use this default creation code;
- SceneObjectGroup sceneObject = new SceneObjectGroup(ownerID, pos, rot, shape);
- AddNewSceneObject(sceneObject, true);
- sceneObject.SetGroup(groupID, null);
+ sceneObject.ScheduleGroupForFullUpdate();
return sceneObject;
}
@@ -1848,7 +1856,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Add a newly created object to the scene
+ /// Add a newly created object to the scene. Updates are also sent to viewers.
///
///
///
@@ -1857,8 +1865,25 @@ namespace OpenSim.Region.Framework.Scenes
///
public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup)
{
- return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup);
+ return AddNewSceneObject(sceneObject, attachToBackup, true);
}
+
+ ///
+ /// Add a newly created object to the scene
+ ///
+ ///
+ ///
+ /// If true, the object is made persistent into the scene.
+ /// If false, the object will not persist over server restarts
+ ///
+ ///
+ /// If true, updates for the new scene object are sent to all viewers in range.
+ /// If false, it is left to the caller to schedule the update
+ ///
+ public bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
+ {
+ return m_sceneGraph.AddNewSceneObject(sceneObject, attachToBackup, sendClientUpdates);
+ }
///
/// Delete every object from the scene
@@ -3322,7 +3347,6 @@ namespace OpenSim.Region.Framework.Scenes
}
else
m_log.Debug("[SCENE]: Unable to register with InterregionCommsIn");
-
}
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 321cc45..d31b45e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -228,7 +228,7 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.HasGroupChanged = true;
}
- return AddSceneObject(sceneObject, attachToBackup);
+ return AddSceneObject(sceneObject, attachToBackup, true);
}
///
@@ -243,12 +243,12 @@ namespace OpenSim.Region.Framework.Scenes
///
/// true if the object was added, false if an object with the same uuid was already in the scene
///
- protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup)
+ protected internal bool AddNewSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
{
// Ensure that we persist this new scene object
sceneObject.HasGroupChanged = true;
- return AddSceneObject(sceneObject, attachToBackup);
+ return AddSceneObject(sceneObject, attachToBackup, sendClientUpdates);
}
///
@@ -260,12 +260,19 @@ namespace OpenSim.Region.Framework.Scenes
/// If true, the object is made persistent into the scene.
/// If false, the object will not persist over server restarts
///
- /// true if the object was added, false if an object with the same uuid was already in the scene
+ ///
+ /// If true, updates for the new scene object are sent to all viewers in range.
+ /// If false, it is left to the caller to schedule the update
+ ///
+ ///
+ /// true if the object was added, false if an object with the same uuid was already in the scene
///
- protected bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup)
+ protected bool AddSceneObject(SceneObjectGroup sceneObject, bool attachToBackup, bool sendClientUpdates)
{
if (sceneObject == null || sceneObject.RootPart == null || sceneObject.RootPart.UUID == UUID.Zero)
return false;
+
+ bool alreadyExisted = false;
if (m_parentScene.m_clampPrimSize)
{
@@ -286,6 +293,9 @@ namespace OpenSim.Region.Framework.Scenes
sceneObject.AttachToScene(m_parentScene);
+ if (sendClientUpdates)
+ sceneObject.ScheduleGroupForFullUpdate();
+
lock (sceneObject)
{
if (!Entities.ContainsKey(sceneObject.UUID))
@@ -309,12 +319,14 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectGroupsByLocalID[part.LocalId] = sceneObject;
}
}
-
- return true;
+ }
+ else
+ {
+ alreadyExisted = true;
}
}
- return false;
+ return alreadyExisted;
}
///
@@ -521,26 +533,34 @@ namespace OpenSim.Region.Framework.Scenes
itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
false, false, remoteClient.AgentId, true);
+// m_log.DebugFormat(
+// "[SCENE GRAPH]: Retrieved single object {0} for attachment to {1} on point {2}",
+// objatt.Name, remoteClient.Name, AttachmentPt);
+
if (objatt != null)
{
bool tainted = false;
if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
tainted = true;
- if (AttachObject(
- remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false))
- {
- objatt.ScheduleGroupForFullUpdate();
- if (tainted)
- objatt.HasGroupChanged = true;
-
- // Fire after attach, so we don't get messy perms dialogs
- // 3 == AttachedRez
- objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
+ AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
+ //objatt.ScheduleGroupForFullUpdate();
- // Do this last so that event listeners have access to all the effects of the attachment
- m_parentScene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
- }
+ if (tainted)
+ objatt.HasGroupChanged = true;
+
+ // Fire after attach, so we don't get messy perms dialogs
+ // 3 == AttachedRez
+ objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
+
+ // Do this last so that event listeners have access to all the effects of the attachment
+ m_parentScene.EventManager.TriggerOnAttach(objatt.LocalId, itemID, remoteClient.AgentId);
+ }
+ else
+ {
+ m_log.WarnFormat(
+ "[SCENE GRAPH]: Could not retrieve item {0} for attaching to avatar {1} at point {2}",
+ itemID, remoteClient.Name, AttachmentPt);
}
return objatt;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index c5a6171..c14b39a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -567,8 +567,10 @@ namespace OpenSim.Region.Framework.Scenes
}
ApplyPhysics(m_scene.m_physicalPrim);
-
- ScheduleGroupForFullUpdate();
+
+ // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled
+ // for the same object with very different properties. The caller must schedule the update.
+ //ScheduleGroupForFullUpdate();
}
public Vector3 GroupScale()
@@ -956,10 +958,11 @@ namespace OpenSim.Region.Framework.Scenes
// don't attach attachments to child agents
if (avatar.IsChildAgent) return;
+// m_log.DebugFormat("[SOG]: Adding attachment {0} to avatar {1}", Name, avatar.Name);
+
DetachFromBackup();
// Remove from database and parcel prim count
- //
m_scene.DeleteFromStorage(UUID);
m_scene.EventManager.TriggerParcelPrimCountTainted();
@@ -985,7 +988,6 @@ namespace OpenSim.Region.Framework.Scenes
SetAttachmentPoint(Convert.ToByte(attachmentpoint));
avatar.AddAttachment(this);
- m_log.Debug("[SOG]: Added attachment " + UUID + " to avatar " + avatar.UUID);
if (!silent)
{
@@ -1002,6 +1004,12 @@ namespace OpenSim.Region.Framework.Scenes
ScheduleGroupForFullUpdate();
}
}
+ else
+ {
+ m_log.WarnFormat(
+ "[SOG]: Tried to add attachment {0} to avatar with UUID {1} in region {2} but the avatar is not present",
+ UUID, agentID, Scene.RegionInfo.RegionName);
+ }
}
public byte GetAttachmentPoint()
@@ -1986,6 +1994,8 @@ namespace OpenSim.Region.Framework.Scenes
public void ScheduleFullUpdateToAvatar(ScenePresence presence)
{
+// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1} just to avatar {2}", Name, UUID, presence.Name);
+
RootPart.AddFullUpdateToAvatar(presence);
lock (m_parts)
@@ -2000,6 +2010,8 @@ namespace OpenSim.Region.Framework.Scenes
public void ScheduleTerseUpdateToAvatar(ScenePresence presence)
{
+// m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1} just to avatar {2}", Name, UUID, presence.Name);
+
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
@@ -2014,6 +2026,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleGroupForFullUpdate()
{
+// m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, UUID);
+
checkAtTargets();
RootPart.ScheduleFullUpdate();
@@ -2032,6 +2046,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleGroupForTerseUpdate()
{
+// m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1}", Name, UUID);
+
lock (m_parts)
{
foreach (SceneObjectPart part in m_parts.Values)
@@ -2045,9 +2061,11 @@ namespace OpenSim.Region.Framework.Scenes
/// Immediately send a full update for this scene object.
///
public void SendGroupFullUpdate()
- {
+ {
if (IsDeleted)
return;
+
+// m_log.DebugFormat("[SOG]: Sending immediate full group update for {0} {1}", Name, UUID);
RootPart.SendFullUpdateToAllClients();
@@ -2064,7 +2082,7 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Immediately send an update for this scene object's root prim only.
/// This is for updates regarding the object as a whole, and none of its parts in particular.
- /// Note: this may not be cused by opensim (it probably should) but it's used by
+ /// Note: this may not be used by opensim (it probably should) but it's used by
/// external modules.
///
public void SendGroupRootTerseUpdate()
@@ -2079,6 +2097,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_scene == null) // Need to check here as it's null during object creation
return;
+
m_scene.SceneGraph.AddToUpdateList(this);
}
@@ -3557,7 +3576,9 @@ namespace OpenSim.Region.Framework.Scenes
HasGroupChanged = true;
}
- ScheduleGroupForFullUpdate();
+ // Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled
+ // for the same object with very different properties. The caller must schedule the update.
+ //ScheduleGroupForFullUpdate();
}
public void TriggerScriptChangedEvent(Changed val)
--
cgit v1.1
From fce9e499e4682edf6db7b4f9c5546524b4a25197 Mon Sep 17 00:00:00 2001
From: unknown
Date: Mon, 8 Mar 2010 01:19:45 -0600
Subject: - parcel blocking, region crossing blocking, teleport blocking
---
OpenSim/Region/Framework/Scenes/Scene.cs | 229 +++++++++++++++++++++++++++++++
1 file changed, 229 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 388bc99..884f13a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
+using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
@@ -3251,6 +3252,7 @@ namespace OpenSim.Region.Framework.Scenes
/// also return a reason.
public bool NewUserConnection(AgentCircuitData agent, uint teleportFlags, out string reason)
{
+ TeleportFlags tp = (TeleportFlags)teleportFlags;
//Teleport flags:
//
// TeleportFlags.ViaGodlikeLure - Border Crossing
@@ -3284,6 +3286,17 @@ namespace OpenSim.Region.Framework.Scenes
CapsModule.NewUserConnection(agent);
+ ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
+
+ //On login or border crossing test land permisions
+ if (tp != TeleportFlags.Default)
+ {
+ if (land != null && !TestLandRestrictions(agent, land, out reason))
+ {
+ return false;
+ }
+ }
+
ScenePresence sp = m_sceneGraph.GetScenePresence(agent.AgentID);
if (sp != null)
{
@@ -3377,6 +3390,40 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
+ private bool TestLandRestrictions(AgentCircuitData agent, ILandObject land, out string reason)
+ {
+
+ bool banned = land.IsBannedFromLand(agent.AgentID);
+ bool restricted = land.IsRestrictedFromLand(agent.AgentID);
+
+ if (banned || restricted)
+ {
+ ILandObject nearestParcel = GetNearestAllowedParcel(agent.AgentID, agent.startpos.X, agent.startpos.Y);
+ if (nearestParcel != null)
+ {
+ //Move agent to nearest allowed
+ Vector3 newPosition = GetParcelCenterAtGround(nearestParcel);
+ agent.startpos.X = newPosition.X;
+ agent.startpos.Y = newPosition.Y;
+ }
+ else
+ {
+ if (banned)
+ {
+ reason = "Cannot regioncross into banned parcel.";
+ }
+ else
+ {
+ reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
+ RegionInfo.RegionName);
+ }
+ return false;
+ }
+ }
+ reason = "";
+ return true;
+ }
+
///
/// Verifies that the user has a presence on the Grid
///
@@ -3508,6 +3555,18 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
+ private ILandObject GetParcelAtPoint(float x, float y)
+ {
+ foreach (var parcel in AllParcels())
+ {
+ if( parcel.ContainsPoint((int)x,(int)y))
+ {
+ return parcel;
+ }
+ }
+ return null;
+ }
+
///
/// Update an AgentCircuitData object with new information
///
@@ -4780,5 +4839,175 @@ namespace OpenSim.Region.Framework.Scenes
{
get { return m_allowScriptCrossings; }
}
+
+ public Vector3? GetNearestAllowedPosition(ScenePresence avatar)
+ {
+ //simulate to make sure we have pretty up to date positions
+ PhysicsScene.Simulate(0);
+
+ ILandObject nearestParcel = GetNearestAllowedParcel(avatar.UUID, avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
+
+ if (nearestParcel != null)
+ {
+ Vector3 dir = Vector3.Normalize(Vector3.Multiply(avatar.Velocity, -1));
+ //Try to get a location that feels like where they came from
+ Vector3? nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
+ if (nearestPoint != null)
+ {
+ Debug.WriteLine("Found a sane previous position based on velocity, sending them to: " + nearestPoint.ToString());
+ return nearestPoint.Value;
+ }
+
+ //Sometimes velocity might be zero (local teleport), so try finding point along path from avatar to center of nearest parcel
+ Vector3 directionToParcelCenter = Vector3.Subtract(GetParcelCenterAtGround(nearestParcel), avatar.AbsolutePosition);
+ dir = Vector3.Normalize(directionToParcelCenter);
+ nearestPoint = GetNearestPointInParcelAlongDirectionFromPoint(avatar.AbsolutePosition, dir, nearestParcel);
+ if (nearestPoint != null)
+ {
+ Debug.WriteLine("They had a zero velocity, sending them to: " + nearestPoint.ToString());
+ return nearestPoint.Value;
+ }
+
+ //Ultimate backup if we have no idea where they are
+ Debug.WriteLine("Have no idea where they are, sending them to: " + avatar.lastKnownAllowedPosition.ToString());
+ return avatar.lastKnownAllowedPosition;
+
+ }
+
+ //Go to the edge, this happens in teleporting to a region with no available parcels
+ Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar);
+ //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString());
+ return nearestRegionEdgePoint;
+ return null;
+ }
+
+ private Vector3 GetParcelCenterAtGround(ILandObject parcel)
+ {
+ Vector2 center = GetParcelCenter(parcel);
+ return GetPositionAtGround(center.X, center.Y);
+ }
+
+ private Vector3? GetNearestPointInParcelAlongDirectionFromPoint(Vector3 pos, Vector3 direction, ILandObject parcel)
+ {
+ Vector3 unitDirection = Vector3.Normalize(direction);
+ //Making distance to search go through some sane limit of distance
+ for (float distance = 0; distance < Constants.RegionSize * 2; distance += .5f)
+ {
+ Vector3 testPos = Vector3.Add(pos, Vector3.Multiply(unitDirection, distance));
+ if (parcel.ContainsPoint((int)testPos.X, (int)testPos.Y))
+ {
+ return testPos;
+ }
+ }
+ return null;
+ }
+
+ public ILandObject GetNearestAllowedParcel(UUID avatarId, float x, float y)
+ {
+ List all = AllParcels();
+ float minParcelDistance = float.MaxValue;
+ ILandObject nearestParcel = null;
+
+ foreach (var parcel in all)
+ {
+ if (!parcel.IsEitherBannedOrRestricted(avatarId))
+ {
+ float parcelDistance = GetParcelDistancefromPoint(parcel, x, y);
+ if (parcelDistance < minParcelDistance)
+ {
+ minParcelDistance = parcelDistance;
+ nearestParcel = parcel;
+ }
+ }
+ }
+
+ return nearestParcel;
+ }
+
+ private List AllParcels()
+ {
+ return LandChannel.AllParcels();
+ }
+
+ private float GetParcelDistancefromPoint(ILandObject parcel, float x, float y)
+ {
+ return Vector2.Distance(new Vector2(x, y), GetParcelCenter(parcel));
+ }
+
+ //calculate the average center point of a parcel
+ private Vector2 GetParcelCenter(ILandObject parcel)
+ {
+ int count = 0;
+ int avgx = 0;
+ int avgy = 0;
+ for (int x = 0; x < Constants.RegionSize; x++)
+ {
+ for (int y = 0; y < Constants.RegionSize; y++)
+ {
+ //Just keep a running average as we check if all the points are inside or not
+ if (parcel.ContainsPoint(x, y))
+ {
+ if (count == 0)
+ {
+ avgx = x;
+ avgy = y;
+ }
+ else
+ {
+ avgx = (avgx * count + x) / (count + 1);
+ avgy = (avgy * count + y) / (count + 1);
+ }
+ count += 1;
+ }
+ }
+ }
+ return new Vector2(avgx, avgy);
+ }
+
+ private Vector3 GetNearestRegionEdgePosition(ScenePresence avatar)
+ {
+ float xdistance = avatar.AbsolutePosition.X < Constants.RegionSize / 2 ? avatar.AbsolutePosition.X : Constants.RegionSize - avatar.AbsolutePosition.X;
+ float ydistance = avatar.AbsolutePosition.Y < Constants.RegionSize / 2 ? avatar.AbsolutePosition.Y : Constants.RegionSize - avatar.AbsolutePosition.Y;
+
+ //find out what vertical edge to go to
+ if (xdistance < ydistance)
+ {
+ if (avatar.AbsolutePosition.X < Constants.RegionSize / 2)
+ {
+ return GetPositionAtAvatarHeightOrGroundHeight(avatar, 0.0f, avatar.AbsolutePosition.Y);
+ }
+ else
+ {
+ return GetPositionAtAvatarHeightOrGroundHeight(avatar, Constants.RegionSize, avatar.AbsolutePosition.Y);
+ }
+ }
+ //find out what horizontal edge to go to
+ else
+ {
+ if (avatar.AbsolutePosition.Y < Constants.RegionSize / 2)
+ {
+ return GetPositionAtAvatarHeightOrGroundHeight(avatar, avatar.AbsolutePosition.X, 0.0f);
+ }
+ else
+ {
+ return GetPositionAtAvatarHeightOrGroundHeight(avatar, avatar.AbsolutePosition.X, Constants.RegionSize);
+ }
+ }
+ }
+
+ private Vector3 GetPositionAtAvatarHeightOrGroundHeight(ScenePresence avatar, float x, float y)
+ {
+ Vector3 ground = GetPositionAtGround(x, y);
+ if( avatar.AbsolutePosition.Z > ground.Z)
+ {
+ ground.Z = avatar.AbsolutePosition.Z;
+ }
+ return ground;
+ }
+
+ private Vector3 GetPositionAtGround(float x, float y)
+ {
+ return new Vector3(x, y, GetGroundHeight(x, y));
+ }
}
}
--
cgit v1.1
From 689514a40a52d71f9cfaaedbb295a57b1d7c728a Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 9 Mar 2010 23:10:14 +0000
Subject: Cache UserLevel in ScenePresence on SP creation. Change
IsAdministrator to use that stored value.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 28 ++++++++++++++++--------
1 file changed, 19 insertions(+), 9 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 93e66e0..f1be4d8 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -150,7 +150,8 @@ namespace OpenSim.Region.Framework.Scenes
private float m_sitAvatarHeight = 2.0f;
- private float m_godlevel;
+ private int m_godLevel;
+ private int m_userLevel;
private bool m_invulnerable = true;
@@ -304,9 +305,14 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_invulnerable; }
}
- public float GodLevel
+ public int UserLevel
{
- get { return m_godlevel; }
+ get { return m_userLevel; }
+ }
+
+ public int GodLevel
+ {
+ get { return m_godLevel; }
}
public ulong RegionHandle
@@ -678,6 +684,10 @@ namespace OpenSim.Region.Framework.Scenes
m_regionInfo = reginfo;
m_localId = m_scene.AllocateLocalId();
+ UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid);
+
+ m_userLevel = account.UserLevel;
+
IGroupsModule gm = m_scene.RequestModuleInterface();
if (gm != null)
m_grouptitle = gm.GetGroupTitle(m_uuid);
@@ -3164,17 +3174,17 @@ namespace OpenSim.Region.Framework.Scenes
if (account != null)
{
if (account.UserLevel > 0)
- m_godlevel = account.UserLevel;
+ m_godLevel = account.UserLevel;
else
- m_godlevel = 200;
+ m_godLevel = 200;
}
}
else
{
- m_godlevel = 0;
+ m_godLevel = 0;
}
- ControllingClient.SendAdminResponse(token, (uint)m_godlevel);
+ ControllingClient.SendAdminResponse(token, (uint)m_godLevel);
}
#region Child Agent Updates
@@ -3265,7 +3275,7 @@ namespace OpenSim.Region.Framework.Scenes
cAgent.ControlFlags = (uint)m_AgentControlFlags;
if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
- cAgent.GodLevel = (byte)m_godlevel;
+ cAgent.GodLevel = (byte)m_godLevel;
else
cAgent.GodLevel = (byte) 0;
@@ -3354,7 +3364,7 @@ namespace OpenSim.Region.Framework.Scenes
m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
- m_godlevel = cAgent.GodLevel;
+ m_godLevel = cAgent.GodLevel;
m_setAlwaysRun = cAgent.AlwaysRun;
uint i = 0;
--
cgit v1.1
From f6f6ef1532517972b973d8a500818dcd50873352 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Thu, 11 Mar 2010 19:12:38 -0500
Subject: Dynamics Integration Part 1
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 0d19589..1353518 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -747,7 +747,16 @@ namespace OpenSim.Region.Framework.Scenes
///
public Vector3 Acceleration
{
- get { return m_acceleration; }
+ get
+ {
+ PhysicsActor actor = PhysActor;
+ if (actor != null)
+ {
+ m_acceleration = actor.Acceleration;
+ }
+ return m_acceleration;
+ }
+
set { m_acceleration = value; }
}
--
cgit v1.1
From 819806261026cccd68dee649f11938ae5bf10029 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Sun, 14 Mar 2010 16:22:13 -0400
Subject: RotLookAt repaired; debug msg cleanup.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 4 +--
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 35 ++--------------------
2 files changed, 4 insertions(+), 35 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index f35a7c5..5443c28 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1955,7 +1955,7 @@ namespace OpenSim.Region.Framework.Scenes
else
{
if (rootpart.PhysActor != null)
- {
+ { // APID must be implemented in your physics system for this to function.
rootpart.PhysActor.APIDTarget = new Quaternion(target.X, target.Y, target.Z, target.W);
rootpart.PhysActor.APIDStrength = strength;
rootpart.PhysActor.APIDDamping = damping;
@@ -1971,7 +1971,7 @@ namespace OpenSim.Region.Framework.Scenes
if (rootpart != null)
{
if (rootpart.PhysActor != null)
- {
+ { // APID must be implemented in your physics system for this to function.
rootpart.PhysActor.APIDActive = false;
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 31ea502..548a64f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2705,38 +2705,7 @@ namespace OpenSim.Region.Framework.Scenes
public void RotLookAt(Quaternion target, float strength, float damping)
{
- rotLookAt(target, strength, damping);
- }
-
- public void rotLookAt(Quaternion target, float strength, float damping)
- {
- if (IsAttachment)
- {
- /*
- ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
- if (avatar != null)
- {
- Rotate the Av?
- } */
- }
- else
- {
- APIDDamp = damping;
- APIDStrength = strength;
- APIDTarget = target;
- }
- }
-
- public void startLookAt(Quaternion rot, float damp, float strength)
- {
- APIDDamp = damp;
- APIDStrength = strength;
- APIDTarget = rot;
- }
-
- public void stopLookAt()
- {
- APIDTarget = Quaternion.Identity;
+ m_parentGroup.rotLookAt(target, strength, damping); // This calls method in SceneObjectGroup.
}
///
@@ -3460,7 +3429,7 @@ namespace OpenSim.Region.Framework.Scenes
public void StopLookAt()
{
- m_parentGroup.stopLookAt();
+ m_parentGroup.stopLookAt(); // This calls method in SceneObjectGroup.
m_parentGroup.ScheduleGroupForTerseUpdate();
}
--
cgit v1.1
From a1cd3b5b88cc2cc3fcd552085dc9ab46f9d9b10f Mon Sep 17 00:00:00 2001
From: Melanie
Date: Mon, 15 Mar 2010 17:54:39 +0000
Subject: Change GodLevel to UserLevel so gods can teleport freely without
having to enter god mode first
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 24179a9..2661dc3 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -879,7 +879,7 @@ namespace OpenSim.Region.Framework.Scenes
if (land != null)
{
//Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
- if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
+ if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_userLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
{
pos = land.LandData.UserLocation;
}
--
cgit v1.1
From 6df969894c1943dceeefd3765951daaf0a2eb94c Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Wed, 17 Mar 2010 13:30:48 -0400
Subject: Fix AbsolutePosition for autopilot/sit.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 24179a9..608e84c 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -463,7 +463,8 @@ namespace OpenSim.Region.Framework.Scenes
get
{
PhysicsActor actor = m_physicsActor;
- if (actor != null)
+// if (actor != null)
+ if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
m_pos = actor.Position;
return m_parentPosition + m_pos;
@@ -484,7 +485,8 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- m_pos = value;
+ if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
+ m_pos = value;
m_parentPosition = Vector3.Zero;
}
}
@@ -1267,6 +1269,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
m_pos = m_LastFinitePos;
+
if (!m_pos.IsFinite())
{
m_pos.X = 127f;
@@ -1904,6 +1907,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_avUnscriptedSitPos = Vector3.Zero; // Zero = Sit on prim center
autopilotTarget = part.AbsolutePosition;
+//Console.WriteLine("UsSmall autopilotTarget={0}", autopilotTarget);
}
else return; // occupied small
} // end large/small
@@ -2280,7 +2284,8 @@ namespace OpenSim.Region.Framework.Scenes
m_pos += SIT_TARGET_ADJUSTMENT;
m_bodyRot = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
- part.IsOccupied = true;
+ part.IsOccupied = true;
+Console.WriteLine("Scripted Sit ofset {0}", m_pos);
}
else
{
@@ -3348,6 +3353,7 @@ namespace OpenSim.Region.Framework.Scenes
m_callbackURI = cAgent.CallbackURI;
m_pos = cAgent.Position;
+
m_velocity = cAgent.Velocity;
m_CameraCenter = cAgent.Center;
//m_avHeight = cAgent.Size.Z;
--
cgit v1.1
From f35eb8819c6a872e7c4727940ffc560f7d5d68bd Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 18 Mar 2010 18:57:29 +0000
Subject: Unify a previous refactor of object return with the older solution.
We really don't need two methods doing the same thing, but differently.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 7 +++---
.../Region/Framework/Scenes/Scene.Permissions.cs | 29 +++++-----------------
2 files changed, 10 insertions(+), 26 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index b2b061e..ffbf745 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1581,9 +1581,10 @@ namespace OpenSim.Region.Framework.Scenes
if (remoteClient != null)
{
permissionToTake =
- Permissions.CanReturnObject(
- grp.UUID,
- remoteClient.AgentId);
+ Permissions.CanReturnObjects(
+ null,
+ remoteClient.AgentId,
+ new List() {grp});
permissionToDelete = permissionToTake;
if (permissionToDelete)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index d1d6b6a..7dab04f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID, Scene scene);
public delegate bool MoveObjectHandler(UUID objectID, UUID moverID, Scene scene);
public delegate bool ObjectEntryHandler(UUID objectID, bool enteringRegion, Vector3 newPoint, Scene scene);
- public delegate bool ReturnObjectHandler(UUID objectID, UUID returnerID, Scene scene);
+ public delegate bool ReturnObjectsHandler(ILandObject land, UUID user, List objects, Scene scene);
public delegate bool InstantMessageHandler(UUID user, UUID target, Scene startScene);
public delegate bool InventoryTransferHandler(UUID user, UUID target, Scene startScene);
public delegate bool ViewScriptHandler(UUID script, UUID objectID, UUID user, Scene scene);
@@ -81,7 +81,6 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID);
public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID);
public delegate bool TeleportHandler(UUID userID, Scene scene);
- public delegate bool UseObjectReturnHandler(ILandObject landData, uint type, IClientAPI client, List retlist, Scene scene);
#endregion
public class ScenePermissions
@@ -107,7 +106,7 @@ namespace OpenSim.Region.Framework.Scenes
public event EditObjectInventoryHandler OnEditObjectInventory;
public event MoveObjectHandler OnMoveObject;
public event ObjectEntryHandler OnObjectEntry;
- public event ReturnObjectHandler OnReturnObject;
+ public event ReturnObjectsHandler OnReturnObjects;
public event InstantMessageHandler OnInstantMessage;
public event InventoryTransferHandler OnInventoryTransfer;
public event ViewScriptHandler OnViewScript;
@@ -140,7 +139,6 @@ namespace OpenSim.Region.Framework.Scenes
public event CopyUserInventoryHandler OnCopyUserInventory;
public event DeleteUserInventoryHandler OnDeleteUserInventory;
public event TeleportHandler OnTeleport;
- public event UseObjectReturnHandler OnUseObjectReturn;
#endregion
#region Object Permission Checks
@@ -377,15 +375,15 @@ namespace OpenSim.Region.Framework.Scenes
#endregion
#region RETURN OBJECT
- public bool CanReturnObject(UUID objectID, UUID returnerID)
+ public bool CanReturnObjects(ILandObject land, UUID user, List objects)
{
- ReturnObjectHandler handler = OnReturnObject;
+ ReturnObjectsHandler handler = OnReturnObjects;
if (handler != null)
{
Delegate[] list = handler.GetInvocationList();
- foreach (ReturnObjectHandler h in list)
+ foreach (ReturnObjectsHandler h in list)
{
- if (h(objectID, returnerID, m_scene) == false)
+ if (h(land, user, objects, m_scene) == false)
return false;
}
}
@@ -949,20 +947,5 @@ namespace OpenSim.Region.Framework.Scenes
}
return true;
}
-
- public bool CanUseObjectReturn(ILandObject landData, uint type , IClientAPI client, List retlist)
- {
- UseObjectReturnHandler handler = OnUseObjectReturn;
- if (handler != null)
- {
- Delegate[] list = handler.GetInvocationList();
- foreach (UseObjectReturnHandler h in list)
- {
- if (h(landData, type, client, retlist, m_scene) == false)
- return false;
- }
- }
- return true;
- }
}
}
--
cgit v1.1
From 69b5ddceda1fd418712fb7ada0443555dc82b231 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 18 Mar 2010 18:57:29 +0000
Subject: Unify a previous refactor of object return with the older solution.
We really don't need two methods doing the same thing, but differently.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 7 +++---
.../Region/Framework/Scenes/Scene.Permissions.cs | 29 +++++-----------------
2 files changed, 10 insertions(+), 26 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 6ebd048..cadb858 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1522,9 +1522,10 @@ namespace OpenSim.Region.Framework.Scenes
if (remoteClient != null)
{
permissionToTake =
- Permissions.CanReturnObject(
- grp.UUID,
- remoteClient.AgentId);
+ Permissions.CanReturnObjects(
+ null,
+ remoteClient.AgentId,
+ new List() {grp});
permissionToDelete = permissionToTake;
if (permissionToDelete)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index d1d6b6a..7dab04f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -48,7 +48,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID, Scene scene);
public delegate bool MoveObjectHandler(UUID objectID, UUID moverID, Scene scene);
public delegate bool ObjectEntryHandler(UUID objectID, bool enteringRegion, Vector3 newPoint, Scene scene);
- public delegate bool ReturnObjectHandler(UUID objectID, UUID returnerID, Scene scene);
+ public delegate bool ReturnObjectsHandler(ILandObject land, UUID user, List objects, Scene scene);
public delegate bool InstantMessageHandler(UUID user, UUID target, Scene startScene);
public delegate bool InventoryTransferHandler(UUID user, UUID target, Scene startScene);
public delegate bool ViewScriptHandler(UUID script, UUID objectID, UUID user, Scene scene);
@@ -81,7 +81,6 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID);
public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID);
public delegate bool TeleportHandler(UUID userID, Scene scene);
- public delegate bool UseObjectReturnHandler(ILandObject landData, uint type, IClientAPI client, List retlist, Scene scene);
#endregion
public class ScenePermissions
@@ -107,7 +106,7 @@ namespace OpenSim.Region.Framework.Scenes
public event EditObjectInventoryHandler OnEditObjectInventory;
public event MoveObjectHandler OnMoveObject;
public event ObjectEntryHandler OnObjectEntry;
- public event ReturnObjectHandler OnReturnObject;
+ public event ReturnObjectsHandler OnReturnObjects;
public event InstantMessageHandler OnInstantMessage;
public event InventoryTransferHandler OnInventoryTransfer;
public event ViewScriptHandler OnViewScript;
@@ -140,7 +139,6 @@ namespace OpenSim.Region.Framework.Scenes
public event CopyUserInventoryHandler OnCopyUserInventory;
public event DeleteUserInventoryHandler OnDeleteUserInventory;
public event TeleportHandler OnTeleport;
- public event UseObjectReturnHandler OnUseObjectReturn;
#endregion
#region Object Permission Checks
@@ -377,15 +375,15 @@ namespace OpenSim.Region.Framework.Scenes
#endregion
#region RETURN OBJECT
- public bool CanReturnObject(UUID objectID, UUID returnerID)
+ public bool CanReturnObjects(ILandObject land, UUID user, List objects)
{
- ReturnObjectHandler handler = OnReturnObject;
+ ReturnObjectsHandler handler = OnReturnObjects;
if (handler != null)
{
Delegate[] list = handler.GetInvocationList();
- foreach (ReturnObjectHandler h in list)
+ foreach (ReturnObjectsHandler h in list)
{
- if (h(objectID, returnerID, m_scene) == false)
+ if (h(land, user, objects, m_scene) == false)
return false;
}
}
@@ -949,20 +947,5 @@ namespace OpenSim.Region.Framework.Scenes
}
return true;
}
-
- public bool CanUseObjectReturn(ILandObject landData, uint type , IClientAPI client, List retlist)
- {
- UseObjectReturnHandler handler = OnUseObjectReturn;
- if (handler != null)
- {
- Delegate[] list = handler.GetInvocationList();
- foreach (UseObjectReturnHandler h in list)
- {
- if (h(landData, type, client, retlist, m_scene) == false)
- return false;
- }
- }
- return true;
- }
}
}
--
cgit v1.1
From 3ea72eeabb12cff4f71523f501450a7df38a17b1 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Fri, 19 Mar 2010 13:26:34 -0400
Subject: Fix sit with autopilot.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 123d6f3..2603fe1 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -455,8 +455,9 @@ namespace OpenSim.Region.Framework.Scenes
get
{
PhysicsActor actor = m_physicsActor;
- if (actor != null)
- m_pos = actor.Position;
+// if (actor != null)
+ if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
+ m_pos = actor.Position;
return m_parentPosition + m_pos;
}
@@ -476,7 +477,8 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- m_pos = value;
+ if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
+ m_pos = value;
m_parentPosition = Vector3.Zero;
}
}
--
cgit v1.1
From 7d917e7c5c599549d2a87451fe3d6ca2bf6e62a4 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 30 Mar 2010 23:29:03 +0100
Subject: Rename Meta7Windlight to LightShare
---
OpenSim/Region/Framework/Scenes/EventManager.cs | 4 ++--
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 11 +++++------
OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs | 6 +++---
4 files changed, 11 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index 37a51d9..ef125cd 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -207,7 +207,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void OnMakeRootAgentDelegate(ScenePresence presence);
public delegate void OnSaveNewWindlightProfileDelegate();
- public delegate void OnSendNewWindlightProfileTargetedDelegate(RegionMeta7WindlightData wl, UUID user);
+ public delegate void OnSendNewWindlightProfileTargetedDelegate(RegionLightShareData wl, UUID user);
public event OnMakeRootAgentDelegate OnMakeRootAgent;
public event OnSendNewWindlightProfileTargetedDelegate OnSendNewWindlightProfileTargeted;
public event OnSaveNewWindlightProfileDelegate OnSaveNewWindlightProfile;
@@ -1220,7 +1220,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public void TriggerOnSendNewWindlightProfileTargeted(RegionMeta7WindlightData wl, UUID user)
+ public void TriggerOnSendNewWindlightProfileTargeted(RegionLightShareData wl, UUID user)
{
OnSendNewWindlightProfileTargetedDelegate handlerSendNewWindlightProfileTargeted = OnSendNewWindlightProfileTargeted;
if (handlerSendNewWindlightProfileTargeted != null)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 2b6f80b..1f604c5 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1729,7 +1729,7 @@ namespace OpenSim.Region.Framework.Scenes
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
}
- public void StoreWindlightProfile(RegionMeta7WindlightData wl)
+ public void StoreWindlightProfile(RegionLightShareData wl)
{
m_regInfo.WindlightSettings = wl;
m_storageManager.DataStore.StoreRegionWindlightSettings(wl);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3895d93..7ed29a5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1370,21 +1370,20 @@ namespace OpenSim.Region.Framework.Scenes
{
// part.Inventory.RemoveScriptInstances();
- List avatars = Scene.GetScenePresences();
- for (int i = 0; i < avatars.Count; i++)
+ Scene.ForEachScenePresence(delegate (ScenePresence sp)
{
- if (avatars[i].ParentID == LocalId)
+ if (sp.ParentID == LocalId)
{
- avatars[i].StandUp();
+ sp.StandUp();
}
if (!silent)
{
part.UpdateFlag = 0;
if (part == m_rootPart)
- avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
+ sp.ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
}
- }
+ });
}
diff --git a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
index 68035ca..8b2d387 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/SceneTests.cs
@@ -101,13 +101,13 @@ namespace OpenSim.Region.Framework.Scenes.Tests
{
throw new NotImplementedException();
}
- public RegionMeta7WindlightData LoadRegionWindlightSettings(UUID regionUUID)
+ public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
{
//This connector doesn't support the windlight module yet
//Return default LL windlight settings
- return new RegionMeta7WindlightData();
+ return new RegionLightShareData();
}
- public void StoreRegionWindlightSettings(RegionMeta7WindlightData wl)
+ public void StoreRegionWindlightSettings(RegionLightShareData wl)
{
//This connector doesn't support the windlight module yet
}
--
cgit v1.1
From 2fbbc13c71052e66269035031e894b736e2ead5d Mon Sep 17 00:00:00 2001
From: Melanie
Date: Mon, 5 Apr 2010 19:42:15 +0100
Subject: Fix some overlooked merge conflicts that got committed
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 10 ----------
1 file changed, 10 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 5951a92..0785f7f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2203,13 +2203,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleGroupForTerseUpdate()
{
-<<<<<<< HEAD:OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
lockPartsForRead(true);
-=======
-// m_log.DebugFormat("[SOG]: Scheduling terse update for {0} {1}", Name, UUID);
-
- lock (m_parts)
->>>>>>> 0.6.9-post-fixes:OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
{
foreach (SceneObjectPart part in m_parts.Values)
{
@@ -3765,15 +3759,11 @@ namespace OpenSim.Region.Framework.Scenes
HasGroupChanged = true;
}
-<<<<<<< HEAD:OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
lockPartsForRead(false);
- ScheduleGroupForFullUpdate();
-=======
// Don't trigger the update here - otherwise some client issues occur when multiple updates are scheduled
// for the same object with very different properties. The caller must schedule the update.
//ScheduleGroupForFullUpdate();
->>>>>>> 0.6.9-post-fixes:OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
}
public void TriggerScriptChangedEvent(Changed val)
--
cgit v1.1
From f34cc6b46949033803c79235b9d82da9bf9634dd Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Mon, 5 Apr 2010 22:08:34 +0200
Subject: Add a much cheaper agent count retrieval method. This is obsoleted
by 0.7 so it can be reverted then.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index ab0d397..e5e6fc9 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1523,7 +1523,7 @@ namespace OpenSim.Region.Framework.Scenes
public void SaveTerrain()
{
m_storageManager.DataStore.StoreTerrain(Heightmap.GetDoubles(), RegionInfo.RegionID);
- }
+ }
public void StoreWindlightProfile(RegionMeta7WindlightData wl)
{
@@ -4339,6 +4339,14 @@ namespace OpenSim.Region.Framework.Scenes
}
///
+ /// Cheaply return the number of avatars in a region (without fetching a list object)
+ ///
+ public int GetRootAgentCount()
+ {
+ return m_sceneGraph.GetRootAgentCount();
+ }
+
+ ///
/// Return a list of all ScenePresences in this region. This returns child agents as well as root agents.
/// This list is a new object, so it can be iterated over without locking.
///
--
cgit v1.1
From 7a3bb266ebc057a1af589fc642bfeca08de72c98 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Mon, 5 Apr 2010 22:11:05 +0200
Subject: This commit adds some randomness to object persistence. It's a Work
In Progress, I am working on improving this to a tiered approach.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 46 ++++++++++++++++++++--
1 file changed, 42 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 5443c28..9a205e0 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -104,8 +104,12 @@ namespace OpenSim.Region.Framework.Scenes
/// since the group's last persistent backup
///
private bool m_hasGroupChanged = false;
- private long timeFirstChanged;
- private long timeLastChanged;
+ private long timeFirstChanged = 0;
+ private long timeLastChanged = 0;
+ long m_maxPersistTime = 0;
+ long m_minPersistTime = 0;
+ Random m_rand;
+
private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
public void lockPartsForRead(bool locked)
@@ -182,6 +186,28 @@ namespace OpenSim.Region.Framework.Scenes
timeLastChanged = DateTime.Now.Ticks;
if (!m_hasGroupChanged)
timeFirstChanged = DateTime.Now.Ticks;
+ if (m_rand == null)
+ {
+ byte[] val = new byte[16];
+ m_rootPart.UUID.ToBytes(val, 0);
+ m_rand = new Random(BitConverter.ToInt32(val, 0));
+ }
+ if (Scene.GetRootAgentCount() == 0)
+ {
+ //If the region is empty, this change has been made by an automated process
+ //and thus we delay the persist time by a random amount between 1.5 and 2.5.
+
+ float factor = 1.5f + (float)(m_rand.NextDouble());
+ m_maxPersistTime = (long)((float)Scene.m_persistAfter * factor);
+ m_minPersistTime = (long)((float)Scene.m_dontPersistBefore * factor);
+ }
+ else
+ {
+ //If the region is not empty, we want to obey the minimum and maximum persist times
+ //but add a random factor so we stagger the object persistance a little
+ m_maxPersistTime = (long)((float)Scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5
+ m_minPersistTime = (long)((float)Scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0
+ }
}
m_hasGroupChanged = value;
}
@@ -197,8 +223,19 @@ namespace OpenSim.Region.Framework.Scenes
return false;
if (m_scene.ShuttingDown)
return true;
+
+ if (m_minPersistTime == 0 || m_maxPersistTime == 0)
+ {
+ m_maxPersistTime = m_scene.m_persistAfter;
+ m_minPersistTime = m_scene.m_dontPersistBefore;
+ }
+
long currentTime = DateTime.Now.Ticks;
- if (currentTime - timeLastChanged > m_scene.m_dontPersistBefore || currentTime - timeFirstChanged > m_scene.m_persistAfter)
+
+ if (timeLastChanged == 0) timeLastChanged = currentTime;
+ if (timeFirstChanged == 0) timeFirstChanged = currentTime;
+
+ if (currentTime - timeLastChanged > m_minPersistTime || currentTime - timeFirstChanged > m_maxPersistTime)
return true;
return false;
}
@@ -529,6 +566,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public SceneObjectGroup()
{
+
}
///
@@ -545,7 +583,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Constructor. This object is added to the scene later via AttachToScene()
///
public SceneObjectGroup(UUID ownerID, Vector3 pos, Quaternion rot, PrimitiveBaseShape shape)
- {
+ {
SetRootPart(new SceneObjectPart(ownerID, shape, pos, rot, Vector3.Zero));
}
--
cgit v1.1
From 2f454843d82ce0253af393817cf6f0ebb9046112 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Mon, 5 Apr 2010 23:17:06 +0200
Subject: Fix up my own shoddy code! Fixes prim rez break. Whups!
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 48 ++++++++++++----------
1 file changed, 26 insertions(+), 22 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 0277ed8..13d1d4e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -106,9 +106,9 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_hasGroupChanged = false;
private long timeFirstChanged = 0;
private long timeLastChanged = 0;
- long m_maxPersistTime = 0;
- long m_minPersistTime = 0;
- Random m_rand;
+ private long m_maxPersistTime = 0;
+ private long m_minPersistTime = 0;
+ private Random m_rand;
private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
@@ -186,27 +186,31 @@ namespace OpenSim.Region.Framework.Scenes
timeLastChanged = DateTime.Now.Ticks;
if (!m_hasGroupChanged)
timeFirstChanged = DateTime.Now.Ticks;
- if (m_rand == null)
+ if (m_rootPart != null && m_rootPart.UUID != null && m_scene != null)
{
- byte[] val = new byte[16];
- m_rootPart.UUID.ToBytes(val, 0);
- m_rand = new Random(BitConverter.ToInt32(val, 0));
- }
- if (Scene.GetRootAgentCount() == 0)
- {
- //If the region is empty, this change has been made by an automated process
- //and thus we delay the persist time by a random amount between 1.5 and 2.5.
+ if (m_rand == null)
+ {
+ byte[] val = new byte[16];
+ m_rootPart.UUID.ToBytes(val, 0);
+ m_rand = new Random(BitConverter.ToInt32(val, 0));
+ }
+
+ if (m_scene.GetRootAgentCount() == 0)
+ {
+ //If the region is empty, this change has been made by an automated process
+ //and thus we delay the persist time by a random amount between 1.5 and 2.5.
- float factor = 1.5f + (float)(m_rand.NextDouble());
- m_maxPersistTime = (long)((float)Scene.m_persistAfter * factor);
- m_minPersistTime = (long)((float)Scene.m_dontPersistBefore * factor);
- }
- else
- {
- //If the region is not empty, we want to obey the minimum and maximum persist times
- //but add a random factor so we stagger the object persistance a little
- m_maxPersistTime = (long)((float)Scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5
- m_minPersistTime = (long)((float)Scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0
+ float factor = 1.5f + (float)(m_rand.NextDouble());
+ m_maxPersistTime = (long)((float)m_scene.m_persistAfter * factor);
+ m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * factor);
+ }
+ else
+ {
+ //If the region is not empty, we want to obey the minimum and maximum persist times
+ //but add a random factor so we stagger the object persistance a little
+ m_maxPersistTime = (long)((float)m_scene.m_persistAfter * (1.0d - (m_rand.NextDouble() / 5.0d))); //Multiply by 1.0-1.5
+ m_minPersistTime = (long)((float)m_scene.m_dontPersistBefore * (1.0d + (m_rand.NextDouble() / 2.0d))); //Multiply by 0.8-1.0
+ }
}
}
m_hasGroupChanged = value;
--
cgit v1.1
From e80e04c5fd3892cf3c988baaa00aa8ccfa330256 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 22:59:13 +0200
Subject: Increase the amount of time we wait for a teleport to complete. This
allows teleportation to a remote region without a local connection to the
asset server without timing out.
---
OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 5f84252..04626d3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1032,7 +1032,7 @@ namespace OpenSim.Region.Framework.Scenes
public bool WaitForCallback(UUID id)
{
- int count = 200;
+ int count = 400;
while (m_agentsInTransit.Contains(id) && count-- > 0)
{
//m_log.Debug(" >>> Waiting... " + count);
--
cgit v1.1
From 7701ea27983be851a3c9d3954346018e07680ae6 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 9 Apr 2010 06:49:14 +0100
Subject: Add Scene.SnmpService, which is of type ISnmpModule and, if nun-null,
can be used to send snmp alerts
---
OpenSim/Region/Framework/Scenes/Scene.cs | 14 ++++++++++++++
1 file changed, 14 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 55f4550..db073e8 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -158,6 +158,20 @@ namespace OpenSim.Region.Framework.Scenes
public IXfer XferManager;
+ protected ISnmpModule m_snmpService = null;
+ public ISnmpModule SnmpService
+ {
+ get
+ {
+ if (m_snmpService == null)
+ {
+ m_snmpService = RequestModuleInterface();
+ }
+
+ return m_snmpService;
+ }
+ }
+
protected IAssetService m_AssetService;
protected IAuthorizationService m_AuthorizationService;
--
cgit v1.1
From 0b2b2daf23dbf7a51f3d568903548cd964334ce2 Mon Sep 17 00:00:00 2001
From: Mike Rieker
Date: Sat, 10 Apr 2010 14:43:26 -0400
Subject: guarantee that a script engine's GetScriptErrors() will not be called
until after its OnRezScript() returns so that script compile error messages
can be retrieved
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 3 +-
.../Framework/Scenes/SceneObjectPartInventory.cs | 76 +++++++++++++++++++---
2 files changed, 69 insertions(+), 10 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index b04871e..6c57d18 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -271,8 +271,7 @@ namespace OpenSim.Region.Framework.Scenes
{
// Needs to determine which engine was running it and use that
//
- part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
- errors = part.Inventory.GetScriptErrors(item.ItemID);
+ errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0);
}
else
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 5d00917..d03b464 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -46,6 +46,8 @@ namespace OpenSim.Region.Framework.Scenes
private string m_inventoryFileName = String.Empty;
private int m_inventoryFileNameSerial = 0;
+
+ private Dictionary m_scriptErrors = new Dictionary();
///
/// The part to which the inventory belongs.
@@ -211,7 +213,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public ArrayList GetScriptErrors(UUID itemID)
+ private ArrayList GetScriptErrors(UUID itemID)
{
ArrayList ret = new ArrayList();
@@ -270,7 +272,10 @@ namespace OpenSim.Region.Framework.Scenes
// item.Name, item.ItemID, Name, UUID);
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
+ {
+ StoreScriptError(item.ItemID, "no permission");
return;
+ }
m_part.AddFlag(PrimFlags.Scripted);
@@ -285,6 +290,7 @@ namespace OpenSim.Region.Framework.Scenes
m_items.LockItemsForWrite(false);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
+ StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
return;
@@ -294,11 +300,13 @@ namespace OpenSim.Region.Framework.Scenes
{
if (null == asset)
{
+ string msg = String.Format("asset ID {0} could not be found", item.AssetID);
+ StoreScriptError(item.ItemID, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
- "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
+ "Couldn't start script {0}, {1} at {2} in {3} since {4}",
item.Name, item.ItemID, m_part.AbsolutePosition,
- m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
+ m_part.ParentGroup.Scene.RegionInfo.RegionName, msg);
}
else
{
@@ -311,11 +319,16 @@ namespace OpenSim.Region.Framework.Scenes
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
+ StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
}
});
}
+ else
+ {
+ StoreScriptError(item.ItemID, "scripts disabled");
+ }
}
private void RestoreSavedScriptState(UUID oldID, UUID newID)
@@ -392,24 +405,71 @@ namespace OpenSim.Region.Framework.Scenes
else
{
m_items.LockItemsForRead(false);
+ string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID,
+ m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
+ StoreScriptError(itemId, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
- "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
- itemId, m_part.Name, m_part.UUID,
- m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
+ "Couldn't start script with ID {0} since it {1}", itemId, msg);
}
}
else
{
m_items.LockItemsForRead(false);
+ string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID);
+ StoreScriptError(itemId, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
- "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
- itemId, m_part.Name, m_part.UUID);
+ "Couldn't start script with ID {0} since it {1}", itemId, msg);
}
}
+ public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
+ {
+ ArrayList errors;
+
+ lock (m_scriptErrors)
+ {
+ m_scriptErrors.Remove(itemId);
+ }
+ CreateScriptInstance(itemId, startParam, postOnRez, engine, stateSource);
+ lock (m_scriptErrors)
+ {
+ while (!m_scriptErrors.TryGetValue(itemId, out errors))
+ {
+ if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000))
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "timedout waiting for script {0} errors", itemId);
+ if (!m_scriptErrors.TryGetValue(itemId, out errors))
+ {
+ errors = new ArrayList(1);
+ errors.Add("timedout waiting for errors");
+ }
+ break;
+ }
+ }
+ m_scriptErrors.Remove(itemId);
+ }
+ return errors;
+ }
+ private void StoreScriptErrors(UUID itemId, ArrayList errors)
+ {
+ lock (m_scriptErrors)
+ {
+ m_scriptErrors[itemId] = errors;
+ System.Threading.Monitor.PulseAll(m_scriptErrors);
+ }
+ }
+ private void StoreScriptError(UUID itemId, string message)
+ {
+ ArrayList errors = new ArrayList(1);
+ errors.Add(message);
+ StoreScriptErrors(itemId, errors);
+ }
+
///
/// Stop a script which is in this prim's inventory.
///
--
cgit v1.1
From 68a4f897b4f39e46c291d180db5062725130392d Mon Sep 17 00:00:00 2001
From: Mike Rieker
Date: Sun, 18 Apr 2010 19:19:16 -0400
Subject: This GetScriptErrors() change allows initial XEngine to run in
background thread. It should block only for the case of being called by
CapsUpdateTaskInventoryScriptAsset().
---
.../Framework/Scenes/SceneObjectPartInventory.cs | 71 ++++++++++++++++++++--
1 file changed, 65 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index d03b464..a2fceb7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -290,7 +290,7 @@ namespace OpenSim.Region.Framework.Scenes
m_items.LockItemsForWrite(false);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
- StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
+ StoreScriptErrors(item.ItemID, null);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
return;
@@ -319,7 +319,7 @@ namespace OpenSim.Region.Framework.Scenes
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
- StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
+ StoreScriptErrors(item.ItemID, null);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
}
@@ -388,12 +388,23 @@ namespace OpenSim.Region.Framework.Scenes
///
/// Start a script which is in this prim's inventory.
+ /// Some processing may occur in the background, but this routine returns asap.
///
///
/// A
///
public void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{
+ lock (m_scriptErrors)
+ {
+ // Indicate to CreateScriptInstanceInternal() we don't want it to wait for completion
+ m_scriptErrors.Remove(itemId);
+ }
+ CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource);
+ }
+
+ private void CreateScriptInstanceInternal(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
+ {
m_items.LockItemsForRead(true);
if (m_items.ContainsKey(itemId))
{
@@ -425,25 +436,38 @@ namespace OpenSim.Region.Framework.Scenes
}
+ ///
+ /// Start a script which is in this prim's inventory and return any compilation error messages.
+ ///
+ ///
+ /// A
+ ///
public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
{
ArrayList errors;
+ // Indicate to CreateScriptInstanceInternal() we want it to
+ // post any compilation/loading error messages
lock (m_scriptErrors)
{
- m_scriptErrors.Remove(itemId);
+ m_scriptErrors[itemId] = null;
}
- CreateScriptInstance(itemId, startParam, postOnRez, engine, stateSource);
+
+ // Perform compilation/loading
+ CreateScriptInstanceInternal(itemId, startParam, postOnRez, engine, stateSource);
+
+ // Wait for and retrieve any errors
lock (m_scriptErrors)
{
- while (!m_scriptErrors.TryGetValue(itemId, out errors))
+ while ((errors = m_scriptErrors[itemId]) == null)
{
if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000))
{
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"timedout waiting for script {0} errors", itemId);
- if (!m_scriptErrors.TryGetValue(itemId, out errors))
+ errors = m_scriptErrors[itemId];
+ if (errors == null)
{
errors = new ArrayList(1);
errors.Add("timedout waiting for errors");
@@ -455,14 +479,49 @@ namespace OpenSim.Region.Framework.Scenes
}
return errors;
}
+
+ // Signal to CreateScriptInstanceEr() that compilation/loading is complete
private void StoreScriptErrors(UUID itemId, ArrayList errors)
{
lock (m_scriptErrors)
{
+ // If compilation/loading initiated via CreateScriptInstance(),
+ // it does not want the errors, so just get out
+ if (!m_scriptErrors.ContainsKey(itemId))
+ {
+ return;
+ }
+
+ // Initiated via CreateScriptInstanceEr(), if we know what the
+ // errors are, save them and wake CreateScriptInstanceEr().
+ if (errors != null)
+ {
+ m_scriptErrors[itemId] = errors;
+ System.Threading.Monitor.PulseAll(m_scriptErrors);
+ return;
+ }
+ }
+
+ // Initiated via CreateScriptInstanceEr() but we don't know what
+ // the errors are yet, so retrieve them from the script engine.
+ // This may involve some waiting internal to GetScriptErrors().
+ errors = GetScriptErrors(itemId);
+
+ // Get a default non-null value to indicate success.
+ if (errors == null)
+ {
+ errors = new ArrayList();
+ }
+
+ // Post to CreateScriptInstanceEr() and wake it up
+ lock (m_scriptErrors)
+ {
m_scriptErrors[itemId] = errors;
System.Threading.Monitor.PulseAll(m_scriptErrors);
}
}
+
+ // Like StoreScriptErrors(), but just posts a single string message
private void StoreScriptError(UUID itemId, string message)
{
ArrayList errors = new ArrayList(1);
--
cgit v1.1
From 1667a29c88905e6734c1402a51a9365209114e1d Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 19 Apr 2010 12:54:33 +0200
Subject: And some more rez modes that weren't covered before
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 ++
1 file changed, 2 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 66ed64b..2f1a189 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1281,6 +1281,7 @@ namespace OpenSim.Region.Framework.Scenes
// "Rezzed script {0} into prim local ID {1} for user {2}",
// item.inventoryName, localID, remoteClient.Name);
part.GetProperties(remoteClient);
+ part.ParentGroup.ResumeScripts();
}
else
{
@@ -1350,6 +1351,7 @@ namespace OpenSim.Region.Framework.Scenes
part.GetProperties(remoteClient);
part.Inventory.CreateScriptInstance(taskItem, 0, false, DefaultScriptEngine, 0);
+ part.ParentGroup.ResumeScripts();
}
}
--
cgit v1.1
From 780630d7c05f7306ffceb52db0eda1401112f426 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Fri, 23 Apr 2010 14:41:20 +0200
Subject: Fix a nullref in attachment handling. Add some debug to find the
attachment state issue
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 1 +
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 1 +
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 6 ++++++
3 files changed, 8 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index e6e414f..44fd2e1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1628,6 +1628,7 @@ namespace OpenSim.Region.Framework.Scenes
remoteClient.AgentId);
AssetService.Store(asset);
+ m_log.DebugFormat("[ScriptState]: Saved attachment as asset {0}", asset.FullID);
item.AssetID = asset.FullID;
item.Description = asset.Description;
item.Name = asset.Name;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 84c3719..1f8c732 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -612,6 +612,7 @@ namespace OpenSim.Region.Framework.Scenes
{
UUID itemid = new UUID(node.Attributes["UUID"].Value);
m_savedScriptState.Add(itemid, node.InnerXml);
+ m_log.DebugFormat("[ScriptState]: Retrieved state for script item ID {0}", itemid.ToString());
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 04df35a..ce4802d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -333,8 +333,10 @@ namespace OpenSim.Region.Framework.Scenes
if (engines == null) // No engine at all
return;
+ m_log.DebugFormat("[ScriptState]: Item ID changed: {0} to {1}", oldID, newID);
if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID))
{
+ m_log.DebugFormat("[ScriptState]: Found script state for {0}, applying to new script item {1}", oldID, newID);
XmlDocument doc = new XmlDocument();
doc.LoadXml(m_part.ParentGroup.m_savedScriptState[oldID]);
@@ -380,6 +382,10 @@ namespace OpenSim.Region.Framework.Scenes
}
m_part.ParentGroup.m_savedScriptState.Remove(oldID);
}
+ else
+ {
+ m_log.DebugFormat("[ScriptState]: No state for old ID {0}", oldID);
+ }
}
///
--
cgit v1.1
From 31e0704c8d7f6100153ddedd64be7f2ab1ad9311 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Fri, 23 Apr 2010 17:48:50 +0200
Subject: Remove debug output, the culprit has been identified
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 1 -
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 1 -
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 6 ------
3 files changed, 8 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 44fd2e1..e6e414f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1628,7 +1628,6 @@ namespace OpenSim.Region.Framework.Scenes
remoteClient.AgentId);
AssetService.Store(asset);
- m_log.DebugFormat("[ScriptState]: Saved attachment as asset {0}", asset.FullID);
item.AssetID = asset.FullID;
item.Description = asset.Description;
item.Name = asset.Name;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 1f8c732..84c3719 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -612,7 +612,6 @@ namespace OpenSim.Region.Framework.Scenes
{
UUID itemid = new UUID(node.Attributes["UUID"].Value);
m_savedScriptState.Add(itemid, node.InnerXml);
- m_log.DebugFormat("[ScriptState]: Retrieved state for script item ID {0}", itemid.ToString());
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index ce4802d..04df35a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -333,10 +333,8 @@ namespace OpenSim.Region.Framework.Scenes
if (engines == null) // No engine at all
return;
- m_log.DebugFormat("[ScriptState]: Item ID changed: {0} to {1}", oldID, newID);
if (m_part.ParentGroup.m_savedScriptState.ContainsKey(oldID))
{
- m_log.DebugFormat("[ScriptState]: Found script state for {0}, applying to new script item {1}", oldID, newID);
XmlDocument doc = new XmlDocument();
doc.LoadXml(m_part.ParentGroup.m_savedScriptState[oldID]);
@@ -382,10 +380,6 @@ namespace OpenSim.Region.Framework.Scenes
}
m_part.ParentGroup.m_savedScriptState.Remove(oldID);
}
- else
- {
- m_log.DebugFormat("[ScriptState]: No state for old ID {0}", oldID);
- }
}
///
--
cgit v1.1
From 71f42f185a48ef96391b39fa0197c1a8b793e969 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 24 Apr 2010 16:45:25 +0200
Subject: Plumb a data path to initialize an attachment from an alternate
source
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index c220bf0..a5c0b0d 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3984,7 +3984,7 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
{
// Rez from inventory
UUID asset
- = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p);
+ = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, null);
m_log.InfoFormat(
"[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
--
cgit v1.1
From 899d521ab41910e09e66849a5c086d7ae32d01a4 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 24 Apr 2010 18:59:34 +0200
Subject: Use the saved script states
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 37 +++++++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a5c0b0d..ceb4395 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -26,6 +26,7 @@
*/
using System;
+using System.Xml;
using System.Collections.Generic;
using System.Reflection;
using System.Timers;
@@ -3963,6 +3964,32 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
return;
}
+ XmlDocument doc = new XmlDocument();
+ string stateData = String.Empty;
+
+ IAttachmentsService attServ = m_scene.RequestModuleInterface();
+ if (attServ != null)
+ {
+ m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
+ stateData = attServ.Get(ControllingClient.AgentId.ToString());
+ doc.LoadXml(stateData);
+ }
+
+ Dictionary itemData = new Dictionary();
+
+ XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
+ if (nodes.Count > 0)
+ {
+ foreach (XmlNode n in nodes)
+ {
+ XmlElement elem = (XmlElement)n;
+ string itemID = elem.GetAttribute("ItemID");
+ string xml = elem.InnerXml;
+
+ itemData[new UUID(itemID)] = xml;
+ }
+ }
+
List attPoints = m_appearance.GetAttachedPoints();
foreach (int p in attPoints)
{
@@ -3982,9 +4009,17 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
try
{
+ string xmlData;
+ XmlDocument d = new XmlDocument();
+ if (itemData.TryGetValue(itemID, out xmlData))
+ {
+ d.LoadXml(xmlData);
+ m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", itemID);
+ }
+
// Rez from inventory
UUID asset
- = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, null);
+ = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, d);
m_log.InfoFormat(
"[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
--
cgit v1.1
From 81ff5eaba09e7569ef5359874ffcfc7f8855f0b4 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 25 Apr 2010 22:03:35 +0200
Subject: Make scripted attachment states work. Finally. Also replace two
monitor locks with RWLocks, hunting the 10^3 bug. Not successful, but needed
to be done anyway
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 7 +++-
.../Framework/Scenes/SceneObjectPartInventory.cs | 41 +++++++++++++++-------
2 files changed, 34 insertions(+), 14 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 84c3719..1c6f2d1 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1041,6 +1041,11 @@ namespace OpenSim.Region.Framework.Scenes
public void SaveScriptedState(XmlTextWriter writer)
{
+ SaveScriptedState(writer, false);
+ }
+
+ public void SaveScriptedState(XmlTextWriter writer, bool oldIDs)
+ {
XmlDocument doc = new XmlDocument();
Dictionary states = new Dictionary();
@@ -1050,7 +1055,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in m_parts.Values)
{
- Dictionary pstates = part.Inventory.GetScriptStates();
+ Dictionary pstates = part.Inventory.GetScriptStates(oldIDs);
foreach (UUID itemid in pstates.Keys)
{
states.Add(itemid, pstates[itemid]);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 04df35a..f875224 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -311,11 +311,12 @@ namespace OpenSim.Region.Framework.Scenes
if (m_part.ParentGroup.m_savedScriptState != null)
RestoreSavedScriptState(item.OldItemID, item.ItemID);
- lock (m_items)
- {
- m_items[item.ItemID].PermsMask = 0;
- m_items[item.ItemID].PermsGranter = UUID.Zero;
- }
+ m_items.LockItemsForWrite(true);
+
+ m_items[item.ItemID].PermsMask = 0;
+ m_items[item.ItemID].PermsGranter = UUID.Zero;
+
+ m_items.LockItemsForWrite(false);
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
@@ -713,15 +714,16 @@ namespace OpenSim.Region.Framework.Scenes
{
IList items = new List();
- lock (m_items)
+ m_items.LockItemsForRead(true);
+
+ foreach (TaskInventoryItem item in m_items.Values)
{
- foreach (TaskInventoryItem item in m_items.Values)
- {
- if (item.Name == name)
- items.Add(item);
- }
+ if (item.Name == name)
+ items.Add(item);
}
+ m_items.LockItemsForRead(false);
+
return items;
}
@@ -1115,6 +1117,11 @@ namespace OpenSim.Region.Framework.Scenes
public Dictionary GetScriptStates()
{
+ return GetScriptStates(false);
+ }
+
+ public Dictionary GetScriptStates(bool oldIDs)
+ {
IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
Dictionary ret = new Dictionary();
@@ -1132,8 +1139,16 @@ namespace OpenSim.Region.Framework.Scenes
string n = e.GetXMLState(item.ItemID);
if (n != String.Empty)
{
- if (!ret.ContainsKey(item.ItemID))
- ret[item.ItemID] = n;
+ if (oldIDs)
+ {
+ if (!ret.ContainsKey(item.OldItemID))
+ ret[item.OldItemID] = n;
+ }
+ else
+ {
+ if (!ret.ContainsKey(item.ItemID))
+ ret[item.ItemID] = n;
+ }
break;
}
}
--
cgit v1.1
From 06661708b4b2ed33116839ced93d43ca0f0909a0 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 27 Apr 2010 02:40:30 +0200
Subject: Add a parameter to prim inventory update to prevent event firing
---
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index f875224..bc3225a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -735,6 +735,11 @@ namespace OpenSim.Region.Framework.Scenes
/// false if the item did not exist, true if the update occurred successfully
public bool UpdateInventoryItem(TaskInventoryItem item)
{
+ return UpdateInventoryItem(item, true);
+ }
+
+ public bool UpdateInventoryItem(TaskInventoryItem item, bool fireScriptEvents)
+ {
m_items.LockItemsForWrite(true);
if (m_items.ContainsKey(item.ItemID))
@@ -765,7 +770,8 @@ namespace OpenSim.Region.Framework.Scenes
m_items[item.ItemID] = item;
m_inventorySerial++;
- m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
+ if (fireScriptEvents)
+ m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
HasInventoryChanged = true;
m_part.ParentGroup.HasGroupChanged = true;
m_items.LockItemsForWrite(false);
--
cgit v1.1
From 04845c1898fee6a8b8563a8103b73cbe38525416 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 30 Apr 2010 11:46:50 +0100
Subject: Fix link security issue
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 50 ++++++++++++++++++++++
OpenSim/Region/Framework/Scenes/Scene.cs | 8 ++--
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 41 ++++--------------
3 files changed, 63 insertions(+), 36 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 5b21332..8716e0a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2568,5 +2568,55 @@ namespace OpenSim.Region.Framework.Scenes
part.GetProperties(remoteClient);
}
}
+
+ public void DelinkObjects(List primIds, IClientAPI client)
+ {
+ List parts = new List();
+
+ foreach (uint localID in primIds)
+ {
+ SceneObjectPart part = GetSceneObjectPart(localID);
+
+ if (part == null)
+ continue;
+
+ if (Permissions.CanDelinkObject(client.AgentId, part.ParentGroup.RootPart.UUID))
+ parts.Add(part);
+ }
+
+ m_sceneGraph.DelinkObjects(parts);
+ }
+
+ public void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds)
+ {
+ List owners = new List();
+
+ List children = new List();
+ SceneObjectPart root = GetSceneObjectPart(parentPrimId);
+
+ if (Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID))
+ return;
+
+ foreach (uint localID in childPrimIds)
+ {
+ SceneObjectPart part = GetSceneObjectPart(localID);
+
+ if (part == null)
+ continue;
+
+ if (!owners.Contains(part.OwnerID))
+ owners.Add(part.OwnerID);
+
+ if (Permissions.CanLinkObject(client.AgentId, part.ParentGroup.RootPart.UUID))
+ children.Add(part);
+ }
+
+ // Must be all one owner
+ //
+ if (owners.Count > 1)
+ return;
+
+ m_sceneGraph.LinkObjects(root, children);
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7796b8d..637ebff 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2721,8 +2721,8 @@ namespace OpenSim.Region.Framework.Scenes
client.OnObjectName += m_sceneGraph.PrimName;
client.OnObjectClickAction += m_sceneGraph.PrimClickAction;
client.OnObjectMaterial += m_sceneGraph.PrimMaterial;
- client.OnLinkObjects += m_sceneGraph.LinkObjects;
- client.OnDelinkObjects += m_sceneGraph.DelinkObjects;
+ client.OnLinkObjects += LinkObjects;
+ client.OnDelinkObjects += DelinkObjects;
client.OnObjectDuplicate += m_sceneGraph.DuplicateObject;
client.OnObjectDuplicateOnRay += doObjectDuplicateOnRay;
client.OnUpdatePrimFlags += m_sceneGraph.UpdatePrimFlags;
@@ -2877,8 +2877,8 @@ namespace OpenSim.Region.Framework.Scenes
client.OnObjectName -= m_sceneGraph.PrimName;
client.OnObjectClickAction -= m_sceneGraph.PrimClickAction;
client.OnObjectMaterial -= m_sceneGraph.PrimMaterial;
- client.OnLinkObjects -= m_sceneGraph.LinkObjects;
- client.OnDelinkObjects -= m_sceneGraph.DelinkObjects;
+ client.OnLinkObjects -= LinkObjects;
+ client.OnDelinkObjects -= DelinkObjects;
client.OnObjectDuplicate -= m_sceneGraph.DuplicateObject;
client.OnObjectDuplicateOnRay -= doObjectDuplicateOnRay;
client.OnUpdatePrimFlags -= m_sceneGraph.UpdatePrimFlags;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index d31b45e..ad24160 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1619,20 +1619,21 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- protected internal void LinkObjects(IClientAPI client, uint parentPrimId, List childPrimIds)
+ protected internal void LinkObjects(SceneObjectPart root, List children)
{
Monitor.Enter(m_updateLock);
try
{
- SceneObjectGroup parentGroup = GetGroupByPrim(parentPrimId);
+ SceneObjectGroup parentGroup = root.ParentGroup;
List childGroups = new List();
if (parentGroup != null)
{
// We do this in reverse to get the link order of the prims correct
- for (int i = childPrimIds.Count - 1; i >= 0; i--)
+ for (int i = children.Count - 1; i >= 0; i--)
{
- SceneObjectGroup child = GetGroupByPrim(childPrimIds[i]);
+ SceneObjectGroup child = children[i].ParentGroup;
+
if (child != null)
{
// Make sure no child prim is set for sale
@@ -1665,17 +1666,6 @@ namespace OpenSim.Region.Framework.Scenes
parentGroup.HasGroupChanged = true;
parentGroup.ScheduleGroupForFullUpdate();
-// if (client != null)
-// {
-// parentGroup.GetProperties(client);
-// }
-// else
-// {
-// foreach (ScenePresence p in GetScenePresences())
-// {
-// parentGroup.GetProperties(p.ControllingClient);
-// }
-// }
}
finally
{
@@ -1687,12 +1677,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Delink a linkset
///
///
- protected internal void DelinkObjects(List primIds)
- {
- DelinkObjects(primIds, true);
- }
-
- protected internal void DelinkObjects(List primIds, bool sendEvents)
+ protected internal void DelinkObjects(List prims)
{
Monitor.Enter(m_updateLock);
try
@@ -1702,9 +1687,8 @@ namespace OpenSim.Region.Framework.Scenes
List affectedGroups = new List();
// Look them all up in one go, since that is comparatively expensive
//
- foreach (uint primID in primIds)
+ foreach (SceneObjectPart part in prims)
{
- SceneObjectPart part = m_parentScene.GetSceneObjectPart(primID);
if (part != null)
{
if (part.ParentGroup.Children.Count != 1) // Skip single
@@ -1719,17 +1703,13 @@ namespace OpenSim.Region.Framework.Scenes
affectedGroups.Add(group);
}
}
- else
- {
- m_log.ErrorFormat("Viewer requested unlink of nonexistent part {0}", primID);
- }
}
foreach (SceneObjectPart child in childParts)
{
// Unlink all child parts from their groups
//
- child.ParentGroup.DelinkFromGroup(child, sendEvents);
+ child.ParentGroup.DelinkFromGroup(child, true);
}
foreach (SceneObjectPart root in rootParts)
@@ -1784,12 +1764,9 @@ namespace OpenSim.Region.Framework.Scenes
List linkIDs = new List();
foreach (SceneObjectPart newChild in newSet)
- {
newChild.UpdateFlag = 0;
- linkIDs.Add(newChild.LocalId);
- }
- LinkObjects(null, newRoot.LocalId, linkIDs);
+ LinkObjects(newRoot, newSet);
if (!affectedGroups.Contains(newRoot.ParentGroup))
affectedGroups.Add(newRoot.ParentGroup);
}
--
cgit v1.1
From 3e30de7430bff6f2eede395140e45207a15c23a5 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Fri, 30 Apr 2010 22:35:07 +0200
Subject: Fix linking issue introduced in my earlier commit
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 90bce39..cfcd544 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1970,8 +1970,17 @@ namespace OpenSim.Region.Framework.Scenes
List children = new List();
SceneObjectPart root = GetSceneObjectPart(parentPrimId);
- if (Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID))
+ if (root == null)
+ {
+ m_log.DebugFormat("[LINK]: Can't find linkset root prim {0{", parentPrimId);
+ return;
+ }
+
+ if (!Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID))
+ {
+ m_log.DebugFormat("[LINK]: Refusing link. No permissions on root prim");
return;
+ }
foreach (uint localID in childPrimIds)
{
@@ -1990,7 +1999,16 @@ namespace OpenSim.Region.Framework.Scenes
// Must be all one owner
//
if (owners.Count > 1)
+ {
+ m_log.DebugFormat("[LINK]: Refusing link. Too many owners");
+ return;
+ }
+
+ if (children.Count == 0)
+ {
+ m_log.DebugFormat("[LINK]: Refusing link. No permissions to link any of the children");
return;
+ }
m_sceneGraph.LinkObjects(root, children);
}
--
cgit v1.1
From 7ae55f624883b711e5a9d4d5f040ba884fc8bd5e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Fri, 30 Apr 2010 22:35:07 +0200
Subject: Fix linking issue introduced in my earlier commit
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index a430bc4..e031ebc 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2603,8 +2603,17 @@ namespace OpenSim.Region.Framework.Scenes
List children = new List();
SceneObjectPart root = GetSceneObjectPart(parentPrimId);
- if (Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID))
+ if (root == null)
+ {
+ m_log.DebugFormat("[LINK]: Can't find linkset root prim {0{", parentPrimId);
+ return;
+ }
+
+ if (!Permissions.CanLinkObject(client.AgentId, root.ParentGroup.RootPart.UUID))
+ {
+ m_log.DebugFormat("[LINK]: Refusing link. No permissions on root prim");
return;
+ }
foreach (uint localID in childPrimIds)
{
@@ -2623,7 +2632,16 @@ namespace OpenSim.Region.Framework.Scenes
// Must be all one owner
//
if (owners.Count > 1)
+ {
+ m_log.DebugFormat("[LINK]: Refusing link. Too many owners");
+ return;
+ }
+
+ if (children.Count == 0)
+ {
+ m_log.DebugFormat("[LINK]: Refusing link. No permissions to link any of the children");
return;
+ }
m_sceneGraph.LinkObjects(root, children);
}
--
cgit v1.1
From 87664017773227d07b39382efa2aa94f22bbe6c6 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 3 May 2010 04:28:30 +0200
Subject: Adapt CM to the new CHANGED_OWNER handling
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 8 ++++++++
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 12 ++++++++++++
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 17 +++++++++++++----
3 files changed, 33 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 1c6f2d1..ff471e0 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3931,5 +3931,13 @@ namespace OpenSim.Region.Framework.Scenes
return priority;
}
+
+ public void ResetOwnerChangeFlag()
+ {
+ ForEachPart(delegate(SceneObjectPart part)
+ {
+ part.ResetOwnerChangeFlag();
+ });
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 4b2641c..48e65a5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4683,5 +4683,17 @@ namespace OpenSim.Region.Framework.Scenes
{
return new Color4((byte)Color.R, (byte)Color.G, (byte)Color.B, (byte)(0xFF - Color.A));
}
+
+ public void ResetOwnerChangeFlag()
+ {
+ List inv = Inventory.GetInventoryList();
+
+ foreach (UUID itemID in inv)
+ {
+ TaskInventoryItem item = Inventory.GetInventoryItem(itemID);
+ item.OwnerChanged = false;
+ Inventory.UpdateInventoryItem(item);
+ }
+ }
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index ceb4395..562232c 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -4011,15 +4011,24 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
{
string xmlData;
XmlDocument d = new XmlDocument();
+ UUID asset;
if (itemData.TryGetValue(itemID, out xmlData))
{
d.LoadXml(xmlData);
m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", itemID);
- }
- // Rez from inventory
- UUID asset
- = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, d);
+ // Rez from inventory
+ asset
+ = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, d);
+
+ }
+ else
+ {
+ // Rez from inventory (with a null doc to let
+ // CHANGED_OWNER happen)
+ asset
+ = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, null);
+ }
m_log.InfoFormat(
"[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
--
cgit v1.1
From 9c8d7d34b39c6351459989f02473b6f5200d14ee Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 3 May 2010 04:55:41 +0200
Subject: Fix a bug in owner change notification
---
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 64282d1..62b44bd 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -1180,7 +1180,9 @@ namespace OpenSim.Region.Framework.Scenes
{
if (engine != null)
{
- engine.PostScriptEvent(item.ItemID, "changed", new Object[] { Changed.OWNER });
+ if (item.OwnerChanged)
+ engine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.OWNER });
+ item.OwnerChanged = false;
engine.ResumeScript(item.ItemID);
}
}
--
cgit v1.1
From 4df87631ede57316fe41ea6c5edcd4996deac625 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 3 May 2010 23:44:23 +0200
Subject: Store given items in correct parent folder. Fixes items given to
offline avatars not getting lost.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index cfcd544..9b838ab 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -414,6 +414,25 @@ namespace OpenSim.Region.Framework.Scenes
itemCopy.BasePermissions = item.BasePermissions;
}
+ if (itemCopy.Folder == UUID.Zero)
+ {
+ InventoryFolderBase folder = InventoryService.GetFolderForType(recipient, (AssetType)itemCopy.AssetType);
+
+ if (folder != null)
+ {
+ itemCopy.Folder = folder.ID;
+ }
+ else
+ {
+ InventoryFolderBase root = InventoryService.GetRootFolder(recipient);
+
+ if (root != null)
+ itemCopy.Folder = root.ID;
+ else
+ return null; // No destination
+ }
+ }
+
itemCopy.GroupID = UUID.Zero;
itemCopy.GroupOwned = false;
itemCopy.Flags = item.Flags;
--
cgit v1.1
From c86259c6710c8ce5c97a7a64bbb96dac35440aec Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 4 May 2010 00:44:05 +0200
Subject: Fix scripted give and interactive give to offline avatars. Both
folder and single items are now supported. Magic Boxes, yeah!
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 9b838ab..c105560 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -94,6 +94,22 @@ namespace OpenSim.Region.Framework.Scenes
public void AddInventoryItem(UUID AgentID, InventoryItemBase item)
{
+ InventoryFolderBase folder;
+
+ if (item.Folder == UUID.Zero)
+ {
+ folder = InventoryService.GetFolderForType(AgentID, (AssetType)item.AssetType);
+ if (folder == null)
+ {
+ folder = InventoryService.GetRootFolder(AgentID);
+
+ if (folder == null)
+ return;
+ }
+
+ item.Folder = folder.ID;
+ }
+
if (InventoryService.AddItem(item))
{
int userlevel = 0;
--
cgit v1.1
From 4f93d30790c8392c6f91cb1818d1c16f89169ab7 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 4 May 2010 18:10:13 +0200
Subject: Allow reloading of estate settings into a running region. Move sun
update helper into Scene, since that is less evil than exposing
m_storageManager to the public.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 46 ++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 3e78a08..f17e464 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -5109,5 +5109,51 @@ namespace OpenSim.Region.Framework.Scenes
{
return new Vector3(x, y, GetGroundHeight(x, y));
}
+
+ public List GetEstateRegions(int estateID)
+ {
+ if (m_storageManager.EstateDataStore == null)
+ return new List();
+
+ return m_storageManager.EstateDataStore.GetRegions(estateID);
+ }
+
+ public void ReloadEstateData()
+ {
+ m_regInfo.EstateSettings = m_storageManager.EstateDataStore.LoadEstateSettings(m_regInfo.RegionID, false);
+
+ TriggerEstateSunUpdate();
+ }
+
+ public void TriggerEstateSunUpdate()
+ {
+ float sun;
+ if (RegionInfo.RegionSettings.UseEstateSun)
+ {
+ sun = (float)RegionInfo.EstateSettings.SunPosition;
+ if (RegionInfo.EstateSettings.UseGlobalTime)
+ {
+ sun = EventManager.GetCurrentTimeAsSunLindenHour() - 6.0f;
+ }
+
+ //
+ EventManager.TriggerEstateToolsSunUpdate(
+ RegionInfo.RegionHandle,
+ RegionInfo.EstateSettings.FixedSun,
+ RegionInfo.RegionSettings.UseEstateSun,
+ sun);
+ }
+ else
+ {
+ // Use the Sun Position from the Region Settings
+ sun = (float)RegionInfo.RegionSettings.SunPosition - 6.0f;
+
+ EventManager.TriggerEstateToolsSunUpdate(
+ RegionInfo.RegionHandle,
+ RegionInfo.RegionSettings.FixedSun,
+ RegionInfo.RegionSettings.UseEstateSun,
+ sun);
+ }
+ }
}
}
--
cgit v1.1
From ce86d39c70882a4beb04a23565121b05a4325a46 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 4 May 2010 18:31:52 +0200
Subject: Add "reload estate" command to sims
---
OpenSim/Region/Framework/Scenes/Scene.cs | 14 ++++++++++++++
1 file changed, 14 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f17e464..0ca5948 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -662,6 +662,10 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ MainConsole.Instance.Commands.AddCommand("region", false, "reload estate",
+ "reload estate",
+ "Reload the estate data", HandleReloadEstate);
+
//Bind Storage Manager functions to some land manager functions for this scene
EventManager.OnLandObjectAdded +=
new EventManager.LandObjectAdded(m_storageManager.DataStore.StoreLandObject);
@@ -5155,5 +5159,15 @@ namespace OpenSim.Region.Framework.Scenes
sun);
}
}
+
+ private void HandleReloadEstate(string module, string[] cmd)
+ {
+ if (MainConsole.Instance.ConsoleScene == null ||
+ (MainConsole.Instance.ConsoleScene is Scene &&
+ (Scene)MainConsole.Instance.ConsoleScene == this))
+ {
+ ReloadEstateData();
+ }
+ }
}
}
--
cgit v1.1
From 733a07e061cdcb6095677758a264ba976bb94b93 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 6 May 2010 00:34:49 +0200
Subject: Plumb the viewer version string through into AgentCircuitData. Now
all that is left os to figure out what black magic turns AgentCircuitData
into AgentData and then copy that into the ScenePresence, where m_Viewer is
already added with this commit and waits for the data.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 562232c..987180b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -227,6 +227,7 @@ namespace OpenSim.Region.Framework.Scenes
private int m_lastColCount = -1; //KF: Look for Collision chnages
private int m_updateCount = 0; //KF: Update Anims for a while
private static readonly int UPDATE_COUNT = 10; // how many frames to update for
+ private string m_Viewer = String.Empty;
private const int NumMovementsBetweenRayCast = 5;
@@ -664,6 +665,11 @@ namespace OpenSim.Region.Framework.Scenes
set { m_flyDisabled = value; }
}
+ public string Viewer
+ {
+ get { return m_Viewer; }
+ }
+
#endregion
#region Constructor(s)
--
cgit v1.1
From 2d9a20529d6818093747eb764d86efa11f3874d5 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 6 May 2010 00:54:21 +0200
Subject: Plumb Viewer version into ScenePresence for initial login. It's still
not carried along
---
OpenSim/Region/Framework/Scenes/Scene.cs | 1 +
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 1 +
2 files changed, 2 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 0ca5948..bebd463 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2680,6 +2680,7 @@ namespace OpenSim.Region.Framework.Scenes
ScenePresence sp = CreateAndAddScenePresence(client);
if (aCircuit != null)
sp.Appearance = aCircuit.Appearance;
+ sp.Viewer = aCircuit.Viewer;
// HERE!!! Do the initial attachments right here
// first agent upon login is a root agent by design.
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 987180b..f649dfe 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -668,6 +668,7 @@ namespace OpenSim.Region.Framework.Scenes
public string Viewer
{
get { return m_Viewer; }
+ set { m_Viewer = value; }
}
#endregion
--
cgit v1.1
From 02dea4ce580a08a9a4119ed063ed36704bb44825 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 6 May 2010 02:02:12 +0200
Subject: Remove the m_Viewer variable and make the property a shortcut to the
proper field in AgentCircuitData instead
---
OpenSim/Region/Framework/Scenes/Scene.cs | 3 ---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 5 +----
2 files changed, 1 insertion(+), 7 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 897fda6..0ca5948 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2679,10 +2679,7 @@ namespace OpenSim.Region.Framework.Scenes
ScenePresence sp = CreateAndAddScenePresence(client);
if (aCircuit != null)
- {
sp.Appearance = aCircuit.Appearance;
- sp.Viewer = aCircuit.Viewer;
- }
// HERE!!! Do the initial attachments right here
// first agent upon login is a root agent by design.
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index f649dfe..cb24784 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -227,8 +227,6 @@ namespace OpenSim.Region.Framework.Scenes
private int m_lastColCount = -1; //KF: Look for Collision chnages
private int m_updateCount = 0; //KF: Update Anims for a while
private static readonly int UPDATE_COUNT = 10; // how many frames to update for
- private string m_Viewer = String.Empty;
-
private const int NumMovementsBetweenRayCast = 5;
private bool CameraConstraintActive;
@@ -667,8 +665,7 @@ namespace OpenSim.Region.Framework.Scenes
public string Viewer
{
- get { return m_Viewer; }
- set { m_Viewer = value; }
+ get { return m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode).Viewer; }
}
#endregion
--
cgit v1.1
From add7abc1de2fce8db4c6d01cc4b5305bafa4bd87 Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Fri, 7 May 2010 14:12:07 -0400
Subject: Fix Mouse+WASD makes Av rise; Fix PREJUMP.
---
.../Scenes/Animation/ScenePresenceAnimator.cs | 13 +++---------
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 23 ++++++++++++++--------
3 files changed, 19 insertions(+), 19 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index be0e985..b43caf2 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -56,7 +56,8 @@ namespace OpenSim.Region.Framework.Scenes.Animation
// protected string m_movementAnimation = "DEFAULT"; //KF: 'DEFAULT' does not exist!
protected string m_movementAnimation = "CROUCH"; //KF: CROUCH ensures reliable Av Anim. init.
private int m_animTickFall;
- private int m_animTickJump;
+// private int m_animTickJump;
+ public int m_animTickJump; // ScenePresence has to see this to control +Z force
///
/// The scene presence that this animator applies to
@@ -123,22 +124,15 @@ namespace OpenSim.Region.Framework.Scenes.Animation
///
public void TrySetMovementAnimation(string anim)
{
-//Console.WriteLine("Updating movement animation to {0}", anim);
-
if (!m_scenePresence.IsChildAgent)
{
if (m_animations.TrySetDefaultAnimation(
anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID))
{
-//Console.WriteLine("TSMA {0} success.", anim);
// 16384 is CHANGED_ANIMATION
m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { 16384 });
SendAnimPack();
}
- else
- {
-//Console.WriteLine("TSMA {0} fail.", anim);
- }
}
}
@@ -267,7 +261,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
m_animTickJump = Environment.TickCount;
return "PREJUMP";
}
- else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
+ else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 800.0f)
{
// Start actual jump
if (m_animTickJump == -1)
@@ -317,7 +311,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
public void UpdateMovementAnimations()
{
m_movementAnimation = GetMovementAnimation();
-//Console.WriteLine("UMA got {0}", m_movementAnimation);
if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump)
{
// This was the previous behavior before PREJUMP
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index db073e8..665fb4c 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -613,7 +613,7 @@ namespace OpenSim.Region.Framework.Scenes
m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
// TODO: Change default to true once the feature is supported
m_usePreJump = startupConfig.GetBoolean("enableprejump", false);
-
+ m_usePreJump = true; // Above line fails!?
m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys);
if (RegionInfo.NonphysPrimMax > 0)
{
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 2603fe1..565438d 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -665,7 +665,7 @@ namespace OpenSim.Region.Framework.Scenes
CreateSceneViewer();
m_animator = new ScenePresenceAnimator(this);
}
-
+
private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this()
{
m_rootRegionHandle = reginfo.RegionHandle;
@@ -1459,7 +1459,6 @@ namespace OpenSim.Region.Framework.Scenes
}
i++;
}
-
//Paupaw:Do Proper PID for Autopilot here
if (bResetMoveToPosition)
{
@@ -2433,10 +2432,11 @@ namespace OpenSim.Region.Framework.Scenes
Rotation = rotation;
Vector3 direc = vec * rotation;
direc.Normalize();
+ PhysicsActor actor = m_physicsActor;
+ if ((vec.Z == 0f) && !actor.Flying) direc.Z = 0f; // Prevent camera WASD up.
direc *= 0.03f * 128f * m_speedModifier;
- PhysicsActor actor = m_physicsActor;
if (actor != null)
{
if (actor.Flying)
@@ -2458,11 +2458,18 @@ namespace OpenSim.Region.Framework.Scenes
{
if (direc.Z > 2.0f)
{
- direc.Z *= 3.0f;
-
- // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
- Animator.TrySetMovementAnimation("PREJUMP");
- Animator.TrySetMovementAnimation("JUMP");
+ if(m_animator.m_animTickJump == -1)
+ {
+ direc.Z *= 3.0f; // jump
+ }
+ else
+ {
+ direc.Z *= 0.1f; // prejump
+ }
+ /* Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs
+ Animator.TrySetMovementAnimation("PREJUMP");
+ Animator.TrySetMovementAnimation("JUMP");
+ */
}
}
}
--
cgit v1.1
From 3cda854ef312a71f3ceab6cb8339a0d2d2fce803 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Mon, 10 May 2010 08:47:41 -0700
Subject: Fix overlooked readLock which was left open
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index ff471e0..35134d6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -123,7 +123,7 @@ namespace OpenSim.Region.Framework.Scenes
}
if (m_partsLock.RecursiveWriteCount > 0)
{
- m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested. This should not happen and means something needs to be fixed.");
+ m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested (write lock exists on this thread). This should not happen and means something needs to be fixed.");
m_partsLock.ExitWriteLock();
}
@@ -1667,6 +1667,7 @@ namespace OpenSim.Region.Framework.Scenes
remoteClient, m_scene.Permissions.GenerateClientFlags(remoteClient.AgentId, part.UUID));
}
}
+ lockPartsForRead(false);
}
#region Copying
--
cgit v1.1
From 14a86de115934e981e5c3e413821861434ccf5e8 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Mon, 10 May 2010 12:45:33 -0700
Subject: Fix another ReaderWriterLockSlim issue
---
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 62b44bd..c4cff12 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -840,12 +840,12 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
+ m_items.LockItemsForRead(false);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
"Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
itemID, m_part.Name, m_part.UUID);
}
- m_items.LockItemsForWrite(false);
return -1;
}
--
cgit v1.1
From 7705012ee7b016f8e163c5e9586fef724b233932 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Wed, 12 May 2010 08:25:40 -0700
Subject: Optimise the heavily used GetScenePresences; eliminate the
array->list conversion on every call and transition from hard locks to
ReaderWriter locks.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 56 +++++++++++++++++++++++----
1 file changed, 48 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index f43de20..c16ba12 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -70,6 +70,9 @@ namespace OpenSim.Region.Framework.Scenes
protected Dictionary m_scenePresences = new Dictionary();
protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0];
+ protected List m_scenePresenceList = new List();
+
+ protected OpenMetaverse.ReaderWriterLockSlim m_scenePresencesLock = new OpenMetaverse.ReaderWriterLockSlim();
// SceneObjects is not currently populated or used.
//public Dictionary SceneObjects;
@@ -132,10 +135,16 @@ namespace OpenSim.Region.Framework.Scenes
protected internal void Close()
{
- lock (m_scenePresences)
+ m_scenePresencesLock.EnterWriteLock();
+ try
{
m_scenePresences.Clear();
m_scenePresenceArray = new ScenePresence[0];
+ m_scenePresenceList = new List();
+ }
+ finally
+ {
+ m_scenePresencesLock.ExitWriteLock();
}
lock (m_dictionary_lock)
@@ -542,7 +551,8 @@ namespace OpenSim.Region.Framework.Scenes
Entities[presence.UUID] = presence;
- lock (m_scenePresences)
+ m_scenePresencesLock.EnterWriteLock();
+ try
{
if (!m_scenePresences.ContainsKey(presence.UUID))
{
@@ -554,11 +564,12 @@ namespace OpenSim.Region.Framework.Scenes
Array.Copy(m_scenePresenceArray, newArray, oldLength);
newArray[oldLength] = presence;
m_scenePresenceArray = newArray;
+ m_scenePresenceList = new List(m_scenePresenceArray);
}
else
{
m_scenePresences[presence.UUID] = presence;
-
+
// Do a linear search through the array of ScenePresence references
// and update the modified entry
for (int i = 0; i < m_scenePresenceArray.Length; i++)
@@ -569,8 +580,13 @@ namespace OpenSim.Region.Framework.Scenes
break;
}
}
+ m_scenePresenceList = new List(m_scenePresenceArray);
}
}
+ finally
+ {
+ m_scenePresencesLock.ExitWriteLock();
+ }
}
///
@@ -585,7 +601,8 @@ namespace OpenSim.Region.Framework.Scenes
agentID);
}
- lock (m_scenePresences)
+ m_scenePresencesLock.EnterWriteLock();
+ try
{
if (m_scenePresences.Remove(agentID))
{
@@ -604,12 +621,17 @@ namespace OpenSim.Region.Framework.Scenes
}
}
m_scenePresenceArray = newArray;
+ m_scenePresenceList = new List(m_scenePresenceArray);
}
else
{
m_log.WarnFormat("[SCENE] Tried to remove non-existent scene presence with agent ID {0} from scene ScenePresences list", agentID);
}
}
+ finally
+ {
+ m_scenePresencesLock.ExitWriteLock();
+ }
}
protected internal void SwapRootChildAgent(bool direction_RC_CR_T_F)
@@ -730,8 +752,15 @@ namespace OpenSim.Region.Framework.Scenes
///
private List GetScenePresences()
{
- lock (m_scenePresences)
- return new List(m_scenePresenceArray);
+ m_scenePresencesLock.EnterReadLock();
+ try
+ {
+ return m_scenePresenceList;
+ }
+ finally
+ {
+ m_scenePresencesLock.ExitReadLock();
+ }
}
///
@@ -742,10 +771,15 @@ namespace OpenSim.Region.Framework.Scenes
protected internal ScenePresence GetScenePresence(UUID agentID)
{
ScenePresence sp;
- lock (m_scenePresences)
+ m_scenePresencesLock.EnterReadLock();
+ try
{
m_scenePresences.TryGetValue(agentID, out sp);
}
+ finally
+ {
+ m_scenePresencesLock.ExitReadLock();
+ }
return sp;
}
@@ -780,10 +814,15 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool TryGetScenePresence(UUID agentID, out ScenePresence avatar)
{
- lock (m_scenePresences)
+ m_scenePresencesLock.EnterReadLock();
+ try
{
m_scenePresences.TryGetValue(agentID, out avatar);
}
+ finally
+ {
+ m_scenePresencesLock.ExitReadLock();
+ }
return (avatar != null);
}
@@ -1061,6 +1100,7 @@ namespace OpenSim.Region.Framework.Scenes
Parallel.ForEach(GetScenePresences(), protectedAction);
*/
// For now, perform actiona serially
+
foreach (ScenePresence sp in GetScenePresences())
{
try
--
cgit v1.1
From fd37a21b59836143f50fdf994c691d65bd641d52 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Wed, 12 May 2010 08:34:47 -0700
Subject: Kill some locks that have crept into SOG
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 35134d6..a4b8944 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3651,7 +3651,8 @@ namespace OpenSim.Region.Framework.Scenes
if (atRotTargets.Count > 0)
{
uint[] localids = new uint[0];
- lock (m_parts)
+ lockPartsForRead(true);
+ try
{
localids = new uint[m_parts.Count];
int cntr = 0;
@@ -3661,6 +3662,10 @@ namespace OpenSim.Region.Framework.Scenes
cntr++;
}
}
+ finally
+ {
+ lockPartsForRead(false);
+ }
for (int ctr = 0; ctr < localids.Length; ctr++)
{
@@ -3679,7 +3684,8 @@ namespace OpenSim.Region.Framework.Scenes
{
//trigger not_at_target
uint[] localids = new uint[0];
- lock (m_parts)
+ lockPartsForRead(true);
+ try
{
localids = new uint[m_parts.Count];
int cntr = 0;
@@ -3689,6 +3695,10 @@ namespace OpenSim.Region.Framework.Scenes
cntr++;
}
}
+ finally
+ {
+ lockPartsForRead(false);
+ }
for (int ctr = 0; ctr < localids.Length; ctr++)
{
--
cgit v1.1
From 8f838c722da978da646fcef59a5af767840832bb Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Mon, 17 May 2010 14:14:19 -0700
Subject: When killing a zombie session, don't send the stop packet since it
often has the effect of killing a newly connected client.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 3d59615..1b08c50 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3489,7 +3489,7 @@ namespace OpenSim.Region.Framework.Scenes
{
// We have a zombie from a crashed session. Kill it.
m_log.DebugFormat("[SCENE]: Zombie scene presence detected for {0} in {1}", agent.AgentID, RegionInfo.RegionName);
- sp.ControllingClient.Close();
+ sp.ControllingClient.Close(false);
}
}
--
cgit v1.1
From 91b1d17e5bd3ff6ed006744bc529b53a67af1a64 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Tue, 18 May 2010 01:09:47 -0700
Subject: Fix for hanging on "Connecting to region".. caused by packets being
processed before the presence has bound to receive events. Fixed this by
adding packets to a queue and then processing them when the presence is
ready.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 102 ++++++++++++-----------
1 file changed, 53 insertions(+), 49 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d76f029..0b644b9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -129,7 +129,7 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
- private Vector3 m_lastPosition;
+ private Vector3 m_lastPosition;
private Vector3 m_lastWorldPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
@@ -715,8 +715,11 @@ namespace OpenSim.Region.Framework.Scenes
// Request info about all the (root) agents in this region
// Note: This won't send data *to* other clients in that region (children don't send)
SendInitialFullUpdateToAllClients();
-
RegisterToEvents();
+ if (m_controllingClient != null)
+ {
+ m_controllingClient.ProcessPendingPackets();
+ }
SetDirectionVectors();
}
@@ -858,7 +861,6 @@ namespace OpenSim.Region.Framework.Scenes
m_grouptitle = gm.GetGroupTitle(m_uuid);
m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
-
m_scene.SetRootAgentScene(m_uuid);
// Moved this from SendInitialData to ensure that m_appearance is initialized
@@ -875,22 +877,22 @@ namespace OpenSim.Region.Framework.Scenes
{
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
pos.Y = crossedBorder.BorderLine.Z - 1;
- }
-
- //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
- //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
- //they'll bypass the landing point. But I can't think of any decent way of fixing this.
- if (KnownChildRegionHandles.Count == 0)
- {
- ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
- if (land != null)
- {
- //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
- if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_userLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
- {
- pos = land.LandData.UserLocation;
- }
- }
+ }
+
+ //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
+ //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
+ //they'll bypass the landing point. But I can't think of any decent way of fixing this.
+ if (KnownChildRegionHandles.Count == 0)
+ {
+ ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
+ if (land != null)
+ {
+ //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
+ if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_userLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
+ {
+ pos = land.LandData.UserLocation;
+ }
+ }
}
if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
@@ -1027,8 +1029,8 @@ namespace OpenSim.Region.Framework.Scenes
bool isFlying = false;
if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
-
+ isFlying = m_physicsActor.Flying;
+
RemoveFromPhysicalScene();
Velocity = Vector3.Zero;
AbsolutePosition = pos;
@@ -1039,7 +1041,7 @@ namespace OpenSim.Region.Framework.Scenes
SetHeight(m_appearance.AvatarHeight);
}
- SendTerseUpdateToAllClients();
+ SendTerseUpdateToAllClients();
}
@@ -1173,7 +1175,6 @@ namespace OpenSim.Region.Framework.Scenes
pos.Z = ground + 1.5f;
AbsolutePosition = pos;
}
-
m_isChildAgent = false;
bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
MakeRootAgent(AbsolutePosition, m_flying);
@@ -1745,14 +1746,14 @@ namespace OpenSim.Region.Framework.Scenes
// else
// { // single or child prim
-// }
- if (part == null) //CW: Part may be gone. llDie() for example.
- {
- partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
- else
- {
- partRot = part.GetWorldRotation();
+// }
+ if (part == null) //CW: Part may be gone. llDie() for example.
+ {
+ partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else
+ {
+ partRot = part.GetWorldRotation();
}
Quaternion partIRot = Quaternion.Inverse(partRot);
@@ -1760,22 +1761,22 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
-
- if (m_physicsActor == null)
- {
- AddToPhysicalScene(false);
+
+ if (m_physicsActor == null)
+ {
+ AddToPhysicalScene(false);
+ }
+ //CW: If the part isn't null then we can set the current position
+ if (part != null)
+ {
+ Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
+ AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
+ part.IsOccupied = false;
}
- //CW: If the part isn't null then we can set the current position
- if (part != null)
- {
- Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
- AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
- part.IsOccupied = false;
- }
- else
- {
- //CW: Since the part doesn't exist, a coarse standup position isn't an issue
- AbsolutePosition = m_lastWorldPosition;
+ else
+ {
+ //CW: Since the part doesn't exist, a coarse standup position isn't an issue
+ AbsolutePosition = m_lastWorldPosition;
}
m_parentPosition = Vector3.Zero;
@@ -1930,7 +1931,7 @@ namespace OpenSim.Region.Framework.Scenes
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
{
- autopilot = false; // close enough
+ autopilot = false; // close enough
m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
Not using the part's position because returning the AV to the last known standing
position is likely to be more friendly, isn't it? */
@@ -1939,7 +1940,7 @@ namespace OpenSim.Region.Framework.Scenes
} // else the autopilot will get us close
}
else
- { // its a scripted sit
+ { // its a scripted sit
m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
I *am* using the part's position this time because we have no real idea how far away
the avatar is from the sit target. */
@@ -3744,7 +3745,10 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
m_scene = scene;
RegisterToEvents();
-
+ if (m_controllingClient != null)
+ {
+ m_controllingClient.ProcessPendingPackets();
+ }
/*
AbsolutePosition = client.StartPos;
--
cgit v1.1
From 1c040d8c1ed5ee1ba1e80aa1d248a9b06d1790a5 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Tue, 18 May 2010 03:24:43 -0700
Subject: Fix to the scenario where we send an agent to a neighbouring sim (via
teleport), then tell our neighbours to close the agents.. thereby
disconnecting the user. Added a new CloseChildAgent method in lieu of
CloseAgent. This has been a long standing problem - with any luck this will
cure it.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 23 +++++++++++++++++-----
.../Framework/Scenes/SceneCommunicationService.cs | 2 +-
2 files changed, 19 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 1b08c50..f331984 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3914,12 +3914,22 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
+ public bool IncomingCloseAgent(UUID agentID)
+ {
+ return IncomingCloseAgent(agentID, false);
+ }
+
+ public bool IncomingCloseChildAgent(UUID agentID)
+ {
+ return IncomingCloseAgent(agentID, true);
+ }
+
///
/// Tell a single agent to disconnect from the region.
///
- ///
///
- public bool IncomingCloseAgent(UUID agentID)
+ ///
+ public bool IncomingCloseAgent(UUID agentID, bool childOnly)
{
//m_log.DebugFormat("[SCENE]: Processing incoming close agent for {0}", agentID);
@@ -3931,7 +3941,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_sceneGraph.removeUserCount(false);
}
- else
+ else if (!childOnly)
{
m_sceneGraph.removeUserCount(true);
}
@@ -3947,9 +3957,12 @@ namespace OpenSim.Region.Framework.Scenes
}
else
presence.ControllingClient.SendShutdownConnectionNotice();
+ presence.ControllingClient.Close();
+ }
+ else if (!childOnly)
+ {
+ presence.ControllingClient.Close();
}
-
- presence.ControllingClient.Close();
return true;
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 9d0e6f4..6309cd9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -281,7 +281,7 @@ namespace OpenSim.Region.Framework.Scenes
uint x = 0, y = 0;
Utils.LongToUInts(regionHandle, out x, out y);
GridRegion destination = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
- m_scene.SimulationService.CloseAgent(destination, agentID);
+ m_scene.SimulationService.CloseChildAgent(destination, agentID);
}
private void SendCloseChildAgentCompleted(IAsyncResult iar)
--
cgit v1.1
From bb0806c61e545b6509843ed0258475e47d4bb273 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Tue, 18 May 2010 03:44:09 -0700
Subject: Don't send kill packets to child agents as we close them
---
OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f331984..377abe3 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3957,11 +3957,11 @@ namespace OpenSim.Region.Framework.Scenes
}
else
presence.ControllingClient.SendShutdownConnectionNotice();
- presence.ControllingClient.Close();
+ presence.ControllingClient.Close(false);
}
else if (!childOnly)
{
- presence.ControllingClient.Close();
+ presence.ControllingClient.Close(true);
}
return true;
}
--
cgit v1.1
From f77f9ecd8f3f94ccc6d69c7625fd1eacfa9250d7 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Wed, 19 May 2010 13:44:59 -0700
Subject: Fix a nullref issue in SitAltitudeCallback
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 103 ++++++++++++-----------
1 file changed, 53 insertions(+), 50 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 565438d..68acabe 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -128,7 +128,7 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
- private Vector3 m_lastPosition;
+ private Vector3 m_lastPosition;
private Vector3 m_lastWorldPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
@@ -857,22 +857,22 @@ namespace OpenSim.Region.Framework.Scenes
{
Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
pos.Y = crossedBorder.BorderLine.Z - 1;
- }
-
- //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
- //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
- //they'll bypass the landing point. But I can't think of any decent way of fixing this.
- if (KnownChildRegionHandles.Count == 0)
- {
- ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
- if (land != null)
- {
- //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
- if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godlevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
- {
- pos = land.LandData.UserLocation;
- }
- }
+ }
+
+ //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
+ //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
+ //they'll bypass the landing point. But I can't think of any decent way of fixing this.
+ if (KnownChildRegionHandles.Count == 0)
+ {
+ ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
+ if (land != null)
+ {
+ //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
+ if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && m_godlevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
+ {
+ pos = land.LandData.UserLocation;
+ }
+ }
}
if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
@@ -1036,8 +1036,8 @@ namespace OpenSim.Region.Framework.Scenes
bool isFlying = false;
if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
-
+ isFlying = m_physicsActor.Flying;
+
RemoveFromPhysicalScene();
Velocity = Vector3.Zero;
AbsolutePosition = pos;
@@ -1048,7 +1048,7 @@ namespace OpenSim.Region.Framework.Scenes
SetHeight(m_appearance.AvatarHeight);
}
- SendTerseUpdateToAllClients();
+ SendTerseUpdateToAllClients();
}
@@ -1736,14 +1736,14 @@ namespace OpenSim.Region.Framework.Scenes
// else
// { // single or child prim
-// }
- if (part == null) //CW: Part may be gone. llDie() for example.
- {
- partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
- else
- {
- partRot = part.GetWorldRotation();
+// }
+ if (part == null) //CW: Part may be gone. llDie() for example.
+ {
+ partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else
+ {
+ partRot = part.GetWorldRotation();
}
Quaternion partIRot = Quaternion.Inverse(partRot);
@@ -1751,22 +1751,22 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
-
- if (m_physicsActor == null)
- {
- AddToPhysicalScene(false);
+
+ if (m_physicsActor == null)
+ {
+ AddToPhysicalScene(false);
}
- //CW: If the part isn't null then we can set the current position
- if (part != null)
- {
- Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
- AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
- part.IsOccupied = false;
- }
- else
- {
- //CW: Since the part doesn't exist, a coarse standup position isn't an issue
- AbsolutePosition = m_lastWorldPosition;
+ //CW: If the part isn't null then we can set the current position
+ if (part != null)
+ {
+ Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
+ AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
+ part.IsOccupied = false;
+ }
+ else
+ {
+ //CW: Since the part doesn't exist, a coarse standup position isn't an issue
+ AbsolutePosition = m_lastWorldPosition;
}
m_parentPosition = Vector3.Zero;
@@ -1920,7 +1920,7 @@ namespace OpenSim.Region.Framework.Scenes
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
{
- autopilot = false; // close enough
+ autopilot = false; // close enough
m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
Not using the part's position because returning the AV to the last known standing
position is likely to be more friendly, isn't it? */
@@ -1929,7 +1929,7 @@ namespace OpenSim.Region.Framework.Scenes
} // else the autopilot will get us close
}
else
- { // its a scripted sit
+ { // its a scripted sit
m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
I *am* using the part's position this time because we have no real idea how far away
the avatar is from the sit target. */
@@ -2357,11 +2357,14 @@ namespace OpenSim.Region.Framework.Scenes
// { // single or child prim
partIRot = Quaternion.Inverse(part.GetWorldRotation());
// }
- float offZ = collisionPoint.Z - m_initialSitTarget.Z;
- Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
-//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
- m_pos += offset;
-// ControllingClient.SendClearFollowCamProperties(part.UUID);
+ if (m_initialSitTarget != null)
+ {
+ float offZ = collisionPoint.Z - m_initialSitTarget.Z;
+ Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
+ //Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
+ m_pos += offset;
+ // ControllingClient.SendClearFollowCamProperties(part.UUID);
+ }
}
} // End SitAltitudeCallback KF.
--
cgit v1.1
From 6933b48a7e94511f1de969b28a61d834888fd2f5 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Wed, 19 May 2010 13:49:34 -0700
Subject: Fix a nullref issue in SitAltitudeCallback
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 0b644b9..b6081de 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2368,12 +2368,15 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
// else
// { // single or child prim
partIRot = Quaternion.Inverse(part.GetWorldRotation());
-// }
- float offZ = collisionPoint.Z - m_initialSitTarget.Z;
- Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
-//Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
- m_pos += offset;
-// ControllingClient.SendClearFollowCamProperties(part.UUID);
+// }
+ if (m_initialSitTarget != null)
+ {
+ float offZ = collisionPoint.Z - m_initialSitTarget.Z;
+ Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
+ //Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
+ m_pos += offset;
+ // ControllingClient.SendClearFollowCamProperties(part.UUID);
+ }
}
} // End SitAltitudeCallback KF.
--
cgit v1.1
From 5532341bf9e477a007e81bdbcc6477923703e2a2 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Wed, 19 May 2010 14:04:44 -0700
Subject: Initialise m_initialSitTarget to ZERO_VACTOR for safety's sake as per
convo with kitto
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b6081de..c89f656 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -213,7 +213,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_autopilotMoving;
private Vector3 m_autoPilotTarget;
private bool m_sitAtAutoTarget;
- private Vector3 m_initialSitTarget; //KF: First estimate of where to sit
+ private Vector3 m_initialSitTarget = Vector3.Zero; //KF: First estimate of where to sit
private string m_nextSitAnimation = String.Empty;
--
cgit v1.1
From 147c2d6f80c6b911839e890cb42cb63020269afc Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 21 May 2010 02:31:14 +0100
Subject: Change the way the object perms are propagated to attempt to salvage
some older content
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 44 +++++++++++-----------
1 file changed, 23 insertions(+), 21 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index e031ebc..ba70ae5 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -437,29 +437,31 @@ namespace OpenSim.Region.Framework.Scenes
itemCopy.InvType = item.InvType;
itemCopy.Folder = recipientFolderId;
- if (Permissions.PropagatePermissions())
+ if (Permissions.PropagatePermissions() && recipient != senderId)
{
+ // First, make sore base is limited to the next perms
+ itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
+ // By default, current equals base
+ itemCopy.CurrentPermissions = itemCopy.BasePermissions;
+
+ // If this is an object, replace current perms
+ // with folded perms
if (item.InvType == (int)InventoryType.Object)
{
- itemCopy.BasePermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
- itemCopy.BasePermissions |= (item.CurrentPermissions & 7) << 13;
- }
- else
- {
- itemCopy.BasePermissions = item.BasePermissions & item.NextPermissions;
+ itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
+ itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13;
}
- itemCopy.CurrentPermissions = itemCopy.BasePermissions;
- if ((item.CurrentPermissions & 8) != 0) // Propagate slam bit
- {
- itemCopy.BasePermissions &= item.NextPermissions;
- itemCopy.CurrentPermissions = itemCopy.BasePermissions;
- itemCopy.CurrentPermissions |= 8;
- }
+ // Ensure there is no escalation
+ itemCopy.CurrentPermissions &= item.NextPermissions;
+
+ // Need slam bit on xfer
+ itemCopy.CurrentPermissions |= 8;
itemCopy.NextPermissions = item.NextPermissions;
- itemCopy.EveryOnePermissions = item.EveryOnePermissions & item.NextPermissions;
- itemCopy.GroupPermissions = item.GroupPermissions & item.NextPermissions;
+
+ itemCopy.EveryOnePermissions = 0;
+ itemCopy.GroupPermissions = 0;
}
else
{
@@ -913,12 +915,12 @@ namespace OpenSim.Region.Framework.Scenes
if ((part.OwnerID != destAgent) && Permissions.PropagatePermissions())
{
+ agentItem.BasePermissions = taskItem.BasePermissions & taskItem.NextPermissions;
if (taskItem.InvType == (int)InventoryType.Object)
- agentItem.BasePermissions = taskItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13);
- else
- agentItem.BasePermissions = taskItem.BasePermissions;
- agentItem.BasePermissions &= taskItem.NextPermissions;
- agentItem.CurrentPermissions = agentItem.BasePermissions | 8;
+ agentItem.CurrentPermissions = agentItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13);
+ agentItem.CurrentPermissions = agentItem.BasePermissions ;
+
+ agentItem.CurrentPermissions |= 8;
agentItem.NextPermissions = taskItem.NextPermissions;
agentItem.EveryOnePermissions = taskItem.EveryonePermissions & taskItem.NextPermissions;
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
--
cgit v1.1
From d28da5e5ce4e36c7a0b052fb5d2f04105d95176b Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 21 May 2010 03:41:32 +0100
Subject: Refactor scene presence list for lockless iteration. Lock contention
will now only be for simultaneous add/removes of scene presences from the
scene.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 131 ++++++++++----------------
1 file changed, 49 insertions(+), 82 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index c16ba12..3c2203c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -68,11 +68,9 @@ namespace OpenSim.Region.Framework.Scenes
#region Fields
- protected Dictionary m_scenePresences = new Dictionary();
- protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0];
- protected List m_scenePresenceList = new List();
-
protected OpenMetaverse.ReaderWriterLockSlim m_scenePresencesLock = new OpenMetaverse.ReaderWriterLockSlim();
+ protected Dictionary m_scenePresenceMap = new Dictionary();
+ protected List m_scenePresenceArray = new List();
// SceneObjects is not currently populated or used.
//public Dictionary SceneObjects;
@@ -138,9 +136,10 @@ namespace OpenSim.Region.Framework.Scenes
m_scenePresencesLock.EnterWriteLock();
try
{
- m_scenePresences.Clear();
- m_scenePresenceArray = new ScenePresence[0];
- m_scenePresenceList = new List();
+ Dictionary newmap = new Dictionary();
+ List newlist = new List();
+ m_scenePresenceMap = newmap;
+ m_scenePresenceArray = newlist;
}
finally
{
@@ -554,34 +553,27 @@ namespace OpenSim.Region.Framework.Scenes
m_scenePresencesLock.EnterWriteLock();
try
{
- if (!m_scenePresences.ContainsKey(presence.UUID))
+ Dictionary newmap = new Dictionary(m_scenePresenceMap);
+ List newlist = new List(m_scenePresenceArray);
+
+ if (!newmap.ContainsKey(presence.UUID))
{
- m_scenePresences.Add(presence.UUID, presence);
-
- // Create a new array of ScenePresence references
- int oldLength = m_scenePresenceArray.Length;
- ScenePresence[] newArray = new ScenePresence[oldLength + 1];
- Array.Copy(m_scenePresenceArray, newArray, oldLength);
- newArray[oldLength] = presence;
- m_scenePresenceArray = newArray;
- m_scenePresenceList = new List(m_scenePresenceArray);
+ newmap.Add(presence.UUID, presence);
+ newlist.Add(presence);
}
else
{
- m_scenePresences[presence.UUID] = presence;
-
- // Do a linear search through the array of ScenePresence references
- // and update the modified entry
- for (int i = 0; i < m_scenePresenceArray.Length; i++)
- {
- if (m_scenePresenceArray[i].UUID == presence.UUID)
- {
- m_scenePresenceArray[i] = presence;
- break;
- }
- }
- m_scenePresenceList = new List(m_scenePresenceArray);
+ // Remember the old presene reference from the dictionary
+ ScenePresence oldref = newmap[presence.UUID];
+ // Replace the presence reference in the dictionary with the new value
+ newmap[presence.UUID] = presence;
+ // Find the index in the list where the old ref was stored and update the reference
+ newlist[newlist.IndexOf(oldref)] = presence;
}
+
+ // Swap out the dictionary and list with new references
+ m_scenePresenceMap = newmap;
+ m_scenePresenceArray = newlist;
}
finally
{
@@ -604,24 +596,19 @@ namespace OpenSim.Region.Framework.Scenes
m_scenePresencesLock.EnterWriteLock();
try
{
- if (m_scenePresences.Remove(agentID))
+ Dictionary newmap = new Dictionary(m_scenePresenceMap);
+ List newlist = new List(m_scenePresenceArray);
+
+ // Remember the old presene reference from the dictionary
+ ScenePresence oldref = newmap[agentID];
+ // Remove the presence reference from the dictionary
+ if (newmap.Remove(agentID))
{
- // Copy all of the elements from the previous array
- // into the new array except the removed element
- int oldLength = m_scenePresenceArray.Length;
- ScenePresence[] newArray = new ScenePresence[oldLength - 1];
- int j = 0;
- for (int i = 0; i < m_scenePresenceArray.Length; i++)
- {
- ScenePresence presence = m_scenePresenceArray[i];
- if (presence.UUID != agentID)
- {
- newArray[j] = presence;
- ++j;
- }
- }
- m_scenePresenceArray = newArray;
- m_scenePresenceList = new List(m_scenePresenceArray);
+ // Find the index in the list where the old ref was stored and remove the reference
+ newlist.RemoveAt(newlist.IndexOf(oldref));
+ // Swap out the dictionary and list with new references
+ m_scenePresenceMap = newmap;
+ m_scenePresenceArray = newlist;
}
else
{
@@ -744,7 +731,7 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Request a copy of m_scenePresences in this World
+ /// Get a reference to the scene presence list. Changes to the list will be done in a copy
/// There is no guarantee that presences will remain in the scene after the list is returned.
/// This list should remain private to SceneGraph. Callers wishing to iterate should instead
/// pass a delegate to ForEachScenePresence.
@@ -752,15 +739,7 @@ namespace OpenSim.Region.Framework.Scenes
///
private List GetScenePresences()
{
- m_scenePresencesLock.EnterReadLock();
- try
- {
- return m_scenePresenceList;
- }
- finally
- {
- m_scenePresencesLock.ExitReadLock();
- }
+ return m_scenePresenceArray;
}
///
@@ -770,17 +749,10 @@ namespace OpenSim.Region.Framework.Scenes
/// null if the presence was not found
protected internal ScenePresence GetScenePresence(UUID agentID)
{
- ScenePresence sp;
- m_scenePresencesLock.EnterReadLock();
- try
- {
- m_scenePresences.TryGetValue(agentID, out sp);
- }
- finally
- {
- m_scenePresencesLock.ExitReadLock();
- }
- return sp;
+ Dictionary presences = m_scenePresenceMap;
+ ScenePresence presence;
+ presences.TryGetValue(agentID, out presence);
+ return presence;
}
///
@@ -791,7 +763,8 @@ namespace OpenSim.Region.Framework.Scenes
/// null if the presence was not found
protected internal ScenePresence GetScenePresence(string firstName, string lastName)
{
- foreach (ScenePresence presence in GetScenePresences())
+ List presences = GetScenePresences();
+ foreach (ScenePresence presence in presences)
{
if (presence.Firstname == firstName && presence.Lastname == lastName)
return presence;
@@ -806,7 +779,8 @@ namespace OpenSim.Region.Framework.Scenes
/// null if the presence was not found
protected internal ScenePresence GetScenePresence(uint localID)
{
- foreach (ScenePresence presence in GetScenePresences())
+ List presences = GetScenePresences();
+ foreach (ScenePresence presence in presences)
if (presence.LocalId == localID)
return presence;
return null;
@@ -814,15 +788,8 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool TryGetScenePresence(UUID agentID, out ScenePresence avatar)
{
- m_scenePresencesLock.EnterReadLock();
- try
- {
- m_scenePresences.TryGetValue(agentID, out avatar);
- }
- finally
- {
- m_scenePresencesLock.ExitReadLock();
- }
+ Dictionary presences = m_scenePresenceMap;
+ presences.TryGetValue(agentID, out avatar);
return (avatar != null);
}
@@ -1099,9 +1066,9 @@ namespace OpenSim.Region.Framework.Scenes
});
Parallel.ForEach(GetScenePresences(), protectedAction);
*/
- // For now, perform actiona serially
-
- foreach (ScenePresence sp in GetScenePresences())
+ // For now, perform actions serially
+ List presences = GetScenePresences();
+ foreach (ScenePresence sp in presences)
{
try
{
--
cgit v1.1
From 72b96e81213c0dd3d586f552bd2cbd9221c5341d Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 23 May 2010 06:12:11 +0100
Subject: Add the SitGround flag back in
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 49a7766..d7660fd 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -140,6 +140,7 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3? m_forceToApply;
private uint m_requestedSitTargetID;
private UUID m_requestedSitTargetUUID;
+ public bool SitGround = false;
private SendCourseLocationsMethod m_sendCourseLocationsMethod;
@@ -1643,7 +1644,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- if (update_movementflag)
+ if (update_movementflag && !SitGround)
Animator.UpdateMovementAnimations();
m_scene.EventManager.TriggerOnClientMovement(this);
@@ -1754,6 +1755,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public void StandUp()
{
+ SitGround = false;
+
if (m_parentID != 0)
{
SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
--
cgit v1.1
From ba49319c077bc5e7b998674aaac62497e757706c Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 27 May 2010 20:08:48 +0200
Subject: Prevent a null ref
---
OpenSim/Region/Framework/Scenes/SceneViewer.cs | 3 +++
1 file changed, 3 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index 4ba4fab..2fc98e5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -84,6 +84,9 @@ namespace OpenSim.Region.Framework.Scenes
while (m_pendingObjects != null && m_pendingObjects.Count > 0)
{
SceneObjectGroup g = m_pendingObjects.Dequeue();
+ // Yes, this can really happen
+ if (g == null)
+ continue;
// This is where we should check for draw distance
// do culling and stuff. Problem with that is that until
--
cgit v1.1
From e3dac1292ef000daadda3e264354d8df0fc77c22 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 29 May 2010 02:10:34 -0700
Subject: Implement suspended updates - When an operation is occurring on lots
of prims in a single group, don't schedule any updates until the operation
has completed. This makes things like llSetAlpha(LINK_SET,0.0,ALL_SIDES); a
*lot* faster, more efficient and less buggy, and also makes unlinking a lot
better. Linking is still treacherous.. this needs to be analysed.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 47 +++++++++++++++++-----
.../Region/Framework/Scenes/SceneObjectGroup.cs | 17 ++++++++
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 8 +++-
3 files changed, 59 insertions(+), 13 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index d4658ec..445c2c8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1499,10 +1499,13 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal void LinkObjects(SceneObjectPart root, List children)
{
+ SceneObjectGroup parentGroup = root.ParentGroup;
+ if (parentGroup == null) return;
Monitor.Enter(m_updateLock);
+
try
{
- SceneObjectGroup parentGroup = root.ParentGroup;
+ parentGroup.areUpdatesSuspended = true;
List childGroups = new List();
if (parentGroup != null)
@@ -1541,12 +1544,12 @@ namespace OpenSim.Region.Framework.Scenes
// occur on link to invoke this elsewhere (such as object selection)
parentGroup.RootPart.AddFlag(PrimFlags.CreateSelected);
parentGroup.TriggerScriptChangedEvent(Changed.LINK);
- parentGroup.HasGroupChanged = true;
- parentGroup.ScheduleGroupForFullUpdate();
-
}
finally
{
+ parentGroup.areUpdatesSuspended = false;
+ parentGroup.HasGroupChanged = true;
+ parentGroup.ScheduleGroupForFullUpdate();
Monitor.Exit(m_updateLock);
}
}
@@ -1583,11 +1586,22 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- foreach (SceneObjectPart child in childParts)
+ if (childParts.Count > 0)
{
- // Unlink all child parts from their groups
- //
- child.ParentGroup.DelinkFromGroup(child, true);
+ try
+ {
+ childParts[0].ParentGroup.areUpdatesSuspended = true;
+ foreach (SceneObjectPart child in childParts)
+ {
+ // Unlink all child parts from their groups
+ //
+ child.ParentGroup.DelinkFromGroup(child, true);
+ }
+ }
+ finally
+ {
+ childParts[0].ParentGroup.areUpdatesSuspended = false;
+ }
}
foreach (SceneObjectPart root in rootParts)
@@ -1611,10 +1625,21 @@ namespace OpenSim.Region.Framework.Scenes
if (numChildren > 1)
sendEventsToRemainder = false;
- foreach (SceneObjectPart p in newSet)
+ if (newSet.Count > 0)
{
- if (p != group.RootPart)
- group.DelinkFromGroup(p, sendEventsToRemainder);
+ try
+ {
+ newSet[0].ParentGroup.areUpdatesSuspended = true;
+ foreach (SceneObjectPart p in newSet)
+ {
+ if (p != group.RootPart)
+ group.DelinkFromGroup(p, sendEventsToRemainder);
+ }
+ }
+ finally
+ {
+ newSet[0].ParentGroup.areUpdatesSuspended = false;
+ }
}
// If there is more than one prim remaining, we
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index cee2be3..9ebb168 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -109,9 +109,26 @@ namespace OpenSim.Region.Framework.Scenes
private long m_maxPersistTime = 0;
private long m_minPersistTime = 0;
private Random m_rand;
+ private bool m_suspendUpdates;
private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
+ public bool areUpdatesSuspended
+ {
+ get
+ {
+ return m_suspendUpdates;
+ }
+ set
+ {
+ m_suspendUpdates = value;
+ if (!value)
+ {
+ QueueForUpdateCheck();
+ }
+ }
+ }
+
public void lockPartsForRead(bool locked)
{
if (locked)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index c84596b..6e73b65 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2724,7 +2724,10 @@ namespace OpenSim.Region.Framework.Scenes
if (m_parentGroup != null)
{
- m_parentGroup.QueueForUpdateCheck();
+ if (!m_parentGroup.areUpdatesSuspended)
+ {
+ m_parentGroup.QueueForUpdateCheck();
+ }
}
int timeNow = Util.UnixTimeSinceEpoch();
@@ -4450,8 +4453,9 @@ namespace OpenSim.Region.Framework.Scenes
{
m_shape.TextureEntry = textureEntry;
TriggerScriptChangedEvent(Changed.TEXTURE);
-
+ m_updateFlag = 1;
ParentGroup.HasGroupChanged = true;
+
//This is madness..
//ParentGroup.ScheduleGroupForFullUpdate();
//This is sparta
--
cgit v1.1
From d4b4cbf5a5fead727b5e2e48f69d2016eb942cff Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 31 May 2010 19:00:02 +0200
Subject: Fix create selection getting overwritten by multiple updates for the
same prim.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 9 ++++++++-
3 files changed, 10 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 445c2c8..5fbc658 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1542,7 +1542,7 @@ namespace OpenSim.Region.Framework.Scenes
// We need to explicitly resend the newly link prim's object properties since no other actions
// occur on link to invoke this elsewhere (such as object selection)
- parentGroup.RootPart.AddFlag(PrimFlags.CreateSelected);
+ parentGroup.RootPart.CreateSelected = true;
parentGroup.TriggerScriptChangedEvent(Changed.LINK);
}
finally
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 9ebb168..509ec01 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2486,7 +2486,7 @@ namespace OpenSim.Region.Framework.Scenes
linkPart.LinkNum = 2;
linkPart.SetParent(this);
- linkPart.AddFlag(PrimFlags.CreateSelected);
+ linkPart.CreateSelected = true;
//if (linkPart.PhysActor != null)
//{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 6e73b65..2f4191d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -388,7 +388,6 @@ namespace OpenSim.Region.Framework.Scenes
// the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
_flags = 0;
- _flags |= PrimFlags.CreateSelected;
TrimPermissions();
//m_undo = new UndoStack(ParentGroup.GetSceneMaxUndo());
@@ -418,6 +417,7 @@ namespace OpenSim.Region.Framework.Scenes
private PrimFlags _flags = 0;
private DateTime m_expires;
private DateTime m_rezzed;
+ private bool m_createSelected = true;
public UUID CreatorID
{
@@ -978,6 +978,13 @@ namespace OpenSim.Region.Framework.Scenes
set { m_updateFlag = value; }
}
+ [XmlIgnore]
+ public bool CreateSelected
+ {
+ get { return m_createSelected; }
+ set { m_createSelected = value; }
+ }
+
#endregion
//---------------
--
cgit v1.1
From 70f779041334e7cf3642c334e9800362afde7895 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 01:07:46 +0200
Subject: Split GetAxisAlignedBoundingBox into two methods to allow calculation
of combined bounding boxes and offsets
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 509ec01..4203ba9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -794,9 +794,15 @@ namespace OpenSim.Region.Framework.Scenes
/// offsetHeight is the offset in the Z axis from the centre of the bounding box to the centre of the root prim
///
///
- public Vector3 GetAxisAlignedBoundingBox(out float offsetHeight)
+ public void GetAxisAlignedBoundingBoxRaw(out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ)
{
- float maxX = -256f, maxY = -256f, maxZ = -256f, minX = 256f, minY = 256f, minZ = 256f;
+ maxX = -256f;
+ maxY = -256f;
+ maxZ = -256f;
+ minX = 256f;
+ minY = 256f;
+ minZ = 256f;
+
lockPartsForRead(true);
{
foreach (SceneObjectPart part in m_parts.Values)
@@ -1034,7 +1040,18 @@ namespace OpenSim.Region.Framework.Scenes
}
}
lockPartsForRead(false);
+ }
+
+ public Vector3 GetAxisAlignedBoundingBox(out float offsetHeight)
+ {
+ float minX;
+ float maxX;
+ float minY;
+ float maxY;
+ float minZ;
+ float maxZ;
+ GetAxisAlignedBoundingBoxRaw(out minX, out maxX, out minY, out maxY, out minZ, out maxZ);
Vector3 boundingBox = new Vector3(maxX - minX, maxY - minY, maxZ - minZ);
offsetHeight = 0;
--
cgit v1.1
From f57f2370f1737e997e8871d5b05a426e9ac19ba7 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 01:25:24 +0200
Subject: Add a method to get the bounding box and root prim offsets within it
for a group of prims.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 44 ++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 933999e..22248af 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -5236,5 +5236,49 @@ namespace OpenSim.Region.Framework.Scenes
ReloadEstateData();
}
}
+
+ public Vector3[] GetCombinedBoundingBox(List objects, out float minX, out float maxX, out float minY, out float maxY, out float minZ, out float maxZ)
+ {
+ minX = 256;
+ maxX = -256;
+ minY = 256;
+ maxY = -256;
+ minZ = 8192;
+ maxZ = -256;
+
+ List offsets = new List();
+
+ foreach (SceneObjectGroup g in objects)
+ {
+ float ominX, ominY, ominZ, omaxX, omaxY, omaxZ;
+
+ g.GetAxisAlignedBoundingBoxRaw(out ominX, out omaxX, out ominY, out omaxY, out ominZ, out omaxZ);
+
+ if (minX > ominX)
+ minX = ominX;
+ if (minY > ominY)
+ minY = ominY;
+ if (minZ > ominZ)
+ minZ = ominZ;
+ if (maxX < omaxX)
+ maxX = omaxX;
+ if (maxY < omaxY)
+ maxY = omaxY;
+ if (maxZ < omaxZ)
+ maxZ = omaxZ;
+ }
+
+ foreach (SceneObjectGroup g in objects)
+ {
+ Vector3 vec = g.AbsolutePosition;
+ vec.X -= minX;
+ vec.Y -= minY;
+ vec.Z -= minZ;
+
+ offsets.Add(vec);
+ }
+
+ return offsets.ToArray();
+ }
}
}
--
cgit v1.1
From bf233ea0dc564dbae3896d8b5ac355fb2f247a00 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 02:27:30 +0200
Subject: Continuing refactor. Refactor DeRezObject to deal with multiple
objects
---
.../Scenes/AsyncSceneObjectGroupDeleter.cs | 18 ++-
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 138 ++++++++++++---------
2 files changed, 88 insertions(+), 68 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
index c08b961..241cac0 100644
--- a/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
+++ b/OpenSim/Region/Framework/Scenes/AsyncSceneObjectGroupDeleter.cs
@@ -40,7 +40,7 @@ namespace OpenSim.Region.Framework.Scenes
{
public DeRezAction action;
public IClientAPI remoteClient;
- public SceneObjectGroup objectGroup;
+ public List objectGroups;
public UUID folderID;
public bool permissionToDelete;
}
@@ -75,7 +75,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Delete the given object from the scene
///
public void DeleteToInventory(DeRezAction action, UUID folderID,
- SceneObjectGroup objectGroup, IClientAPI remoteClient,
+ List objectGroups, IClientAPI remoteClient,
bool permissionToDelete)
{
if (Enabled)
@@ -87,7 +87,7 @@ namespace OpenSim.Region.Framework.Scenes
DeleteToInventoryHolder dtis = new DeleteToInventoryHolder();
dtis.action = action;
dtis.folderID = folderID;
- dtis.objectGroup = objectGroup;
+ dtis.objectGroups = objectGroups;
dtis.remoteClient = remoteClient;
dtis.permissionToDelete = permissionToDelete;
@@ -103,7 +103,10 @@ namespace OpenSim.Region.Framework.Scenes
// This is not ideal since the object will still be available for manipulation when it should be, but it's
// better than losing the object for now.
if (permissionToDelete)
- objectGroup.DeleteGroup(false);
+ {
+ foreach (SceneObjectGroup g in objectGroups)
+ g.DeleteGroup(false);
+ }
}
private void InventoryRunDeleteTimer(object sender, ElapsedEventArgs e)
@@ -140,9 +143,12 @@ namespace OpenSim.Region.Framework.Scenes
{
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface();
if (invAccess != null)
- invAccess.DeleteToInventory(x.action, x.folderID, x.objectGroup, x.remoteClient);
+ invAccess.DeleteToInventory(x.action, x.folderID, x.objectGroups, x.remoteClient);
if (x.permissionToDelete)
- m_scene.DeleteSceneObject(x.objectGroup, false);
+ {
+ foreach (SceneObjectGroup g in x.objectGroups)
+ m_scene.DeleteSceneObject(g, false);
+ }
}
catch (Exception e)
{
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index cbe3456..e1128a6 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1550,79 +1550,98 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void DeRezObject(IClientAPI remoteClient, uint localID,
UUID groupID, DeRezAction action, UUID destinationID)
{
- SceneObjectPart part = GetSceneObjectPart(localID);
- if (part == null)
- return;
+ DeRezObjects(remoteClient, new List() { localID} , groupID, action, destinationID);
+ }
- if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
- return;
+ public virtual void DeRezObjects(IClientAPI remoteClient, List localIDs,
+ UUID groupID, DeRezAction action, UUID destinationID)
+ {
+ // First, see of we can perform the requested action and
+ // build a list of eligible objects
+ List deleteIDs = new List();
+ List deleteGroups = new List();
- // Can't delete child prims
- if (part != part.ParentGroup.RootPart)
- return;
+ // Start with true for both, then remove the flags if objects
+ // that we can't derez are part of the selection
+ bool permissionToTake = true;
+ bool permissionToTakeCopy = true;
+ bool permissionToDelete = true;
- SceneObjectGroup grp = part.ParentGroup;
+ foreach (uint localID in localIDs)
+ {
+ // Invalid id
+ SceneObjectPart part = GetSceneObjectPart(localID);
+ if (part == null)
+ continue;
- //force a database backup/update on this SceneObjectGroup
- //So that we know the database is upto date, for when deleting the object from it
- ForceSceneObjectBackup(grp);
+ // Already deleted by someone else
+ if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
+ continue;
- bool permissionToTake = false;
- bool permissionToDelete = false;
+ // Can't delete child prims
+ if (part != part.ParentGroup.RootPart)
+ continue;
- if (action == DeRezAction.SaveToExistingUserInventoryItem)
- {
- if (grp.OwnerID == remoteClient.AgentId && grp.RootPart.FromUserInventoryItemID != UUID.Zero)
- {
- permissionToTake = true;
+ SceneObjectGroup grp = part.ParentGroup;
+
+ deleteIDs.Add(localID);
+ deleteGroups.Add(grp);
+
+ // Force a database backup/update on this SceneObjectGroup
+ // So that we know the database is upto date,
+ // for when deleting the object from it
+ ForceSceneObjectBackup(grp);
+
+ if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
+ permissionToTakeCopy = false;
+ if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
+ permissionToTake = false;
+
+ if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId))
permissionToDelete = false;
- }
+
}
- else if (action == DeRezAction.TakeCopy)
+
+ // Handle god perms
+ if (Permissions.IsGod(remoteClient.AgentId))
{
- permissionToTake =
- Permissions.CanTakeCopyObject(
- grp.UUID,
- remoteClient.AgentId);
+ permissionToTake = true;
+ permissionToTakeCopy = true;
+ permissionToDelete = true;
}
- else if (action == DeRezAction.GodTakeCopy)
- {
- permissionToTake =
- Permissions.IsGod(
- remoteClient.AgentId);
- }
- else if (action == DeRezAction.Take)
- {
- permissionToTake =
- Permissions.CanTakeObject(
- grp.UUID,
- remoteClient.AgentId);
- //If they can take, they can delete!
- permissionToDelete = permissionToTake;
- }
- else if (action == DeRezAction.Delete)
+ // If we're re-saving, we don't even want to delete
+ if (action == DeRezAction.SaveToExistingUserInventoryItem)
+ permissionToDelete = false;
+
+ // if we want to take a copy,, we also don't want to delete
+ // Note: after this point, the permissionToTakeCopy flag
+ // becomes irrelevant. It already includes the permissionToTake
+ // permission and after excluding no copy items here, we can
+ // just use that.
+ if (action == DeRezAction.TakeCopy)
{
- permissionToTake =
- Permissions.CanDeleteObject(
- grp.UUID,
- remoteClient.AgentId);
- permissionToDelete = permissionToTake;
+ // If we don't have permission, stop right here
+ if (!permissionToTakeCopy)
+ return;
+
+ // Don't delete
+ permissionToDelete = false;
}
- else if (action == DeRezAction.Return)
+
+ if (action == DeRezAction.Return)
{
if (remoteClient != null)
{
- permissionToTake =
- Permissions.CanReturnObjects(
+ if (Permissions.CanReturnObjects(
null,
remoteClient.AgentId,
- new List() {grp});
- permissionToDelete = permissionToTake;
-
- if (permissionToDelete)
+ deleteGroups))
+ foreach (SceneObjectGroup g in deleteGroups)
{
- AddReturn(grp.OwnerID, grp.Name, grp.AbsolutePosition, "parcel owner return");
+ AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
+ DeleteSceneObject(g, false);
+ return;
}
}
else // Auto return passes through here with null agent
@@ -1631,22 +1650,17 @@ namespace OpenSim.Region.Framework.Scenes
permissionToDelete = true;
}
}
- else
- {
- m_log.DebugFormat(
- "[AGENT INVENTORY]: Ignoring unexpected derez action {0} for {1}", action, remoteClient.Name);
- return;
- }
if (permissionToTake)
{
m_asyncSceneObjectDeleter.DeleteToInventory(
- action, destinationID, grp, remoteClient,
+ action, destinationID, deleteGroups, remoteClient,
permissionToDelete);
}
else if (permissionToDelete)
{
- DeleteSceneObject(grp, false);
+ foreach (SceneObjectGroup g in deleteGroups)
+ DeleteSceneObject(g, false);
}
}
--
cgit v1.1
From eca15cfbf25134ddc8bb752abbe3a6ba01bf07a9 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 02:45:14 +0200
Subject: Change the handling of CreateSelected. Only send it on real creation,
not for each prim coming into view.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 2f4191d..e4a36ef 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -388,6 +388,7 @@ namespace OpenSim.Region.Framework.Scenes
// the prim into an agent inventory (Linden client reports that the "Object not found for drop" in its log
_flags = 0;
+ CreateSelected = true;
TrimPermissions();
//m_undo = new UndoStack(ParentGroup.GetSceneMaxUndo());
@@ -417,7 +418,7 @@ namespace OpenSim.Region.Framework.Scenes
private PrimFlags _flags = 0;
private DateTime m_expires;
private DateTime m_rezzed;
- private bool m_createSelected = true;
+ private bool m_createSelected = false;
public UUID CreatorID
{
--
cgit v1.1
From 16d8602d3cad613a830a4903bb0d2beb1fa6b7e2 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 03:04:49 +0200
Subject: Fix prim returns I broke earlier
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 11 +++++++----
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +-
2 files changed, 8 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index e1128a6..e111867 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1637,11 +1637,14 @@ namespace OpenSim.Region.Framework.Scenes
null,
remoteClient.AgentId,
deleteGroups))
- foreach (SceneObjectGroup g in deleteGroups)
{
- AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
- DeleteSceneObject(g, false);
- return;
+ permissionToTake = true;
+ permissionToDelete = true;
+
+ foreach (SceneObjectGroup g in deleteGroups)
+ {
+ AddReturn(g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return");
+ }
}
}
else // Auto return passes through here with null agent
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 4203ba9..7e73f91 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -801,7 +801,7 @@ namespace OpenSim.Region.Framework.Scenes
maxZ = -256f;
minX = 256f;
minY = 256f;
- minZ = 256f;
+ minZ = 8192f;
lockPartsForRead(true);
{
--
cgit v1.1
From c900134f911b7f11c4fa25c67d55c112b1f56033 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 16:03:53 +0200
Subject: Lock the object queue when dequeueing
---
OpenSim/Region/Framework/Scenes/SceneViewer.cs | 159 +++++++++++++------------
1 file changed, 81 insertions(+), 78 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index 2fc98e5..5cbd8d9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -67,105 +67,108 @@ namespace OpenSim.Region.Framework.Scenes
public void SendPrimUpdates()
{
- if (m_pendingObjects == null)
+ lock(m_pendingObjects)
{
- if (!m_presence.IsChildAgent || (m_presence.Scene.m_seeIntoRegionFromNeighbor))
+ if (m_pendingObjects == null)
{
- m_pendingObjects = new Queue();
-
- foreach (EntityBase e in m_presence.Scene.Entities)
+ if (!m_presence.IsChildAgent || (m_presence.Scene.m_seeIntoRegionFromNeighbor))
{
- if (e != null && e is SceneObjectGroup)
- m_pendingObjects.Enqueue((SceneObjectGroup)e);
+ m_pendingObjects = new Queue();
+
+ foreach (EntityBase e in m_presence.Scene.Entities)
+ {
+ if (e != null && e is SceneObjectGroup)
+ m_pendingObjects.Enqueue((SceneObjectGroup)e);
+ }
}
}
- }
-
- while (m_pendingObjects != null && m_pendingObjects.Count > 0)
- {
- SceneObjectGroup g = m_pendingObjects.Dequeue();
- // Yes, this can really happen
- if (g == null)
- continue;
-
- // This is where we should check for draw distance
- // do culling and stuff. Problem with that is that until
- // we recheck in movement, that won't work right.
- // So it's not implemented now.
- //
-
- // Don't even queue if we have sent this one
- //
- if (!m_updateTimes.ContainsKey(g.UUID))
- g.ScheduleFullUpdateToAvatar(m_presence);
- }
- while (m_partsUpdateQueue.Count > 0)
- {
- SceneObjectPart part = m_partsUpdateQueue.Dequeue();
-
- if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
- continue;
-
- if (m_updateTimes.ContainsKey(part.UUID))
+ while (m_pendingObjects != null && m_pendingObjects.Count > 0)
{
- ScenePartUpdate update = m_updateTimes[part.UUID];
+ SceneObjectGroup g = m_pendingObjects.Dequeue();
+ // Yes, this can really happen
+ if (g == null)
+ continue;
- // We deal with the possibility that two updates occur at
- // the same unix time at the update point itself.
+ // This is where we should check for draw distance
+ // do culling and stuff. Problem with that is that until
+ // we recheck in movement, that won't work right.
+ // So it's not implemented now.
+ //
+
+ // Don't even queue if we have sent this one
+ //
+ if (!m_updateTimes.ContainsKey(g.UUID))
+ g.ScheduleFullUpdateToAvatar(m_presence);
+ }
- if ((update.LastFullUpdateTime < part.TimeStampFull) ||
- part.IsAttachment)
+ while (m_partsUpdateQueue.Count > 0)
+ {
+ SceneObjectPart part = m_partsUpdateQueue.Dequeue();
+
+ if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
+ continue;
+
+ if (m_updateTimes.ContainsKey(part.UUID))
{
-// m_log.DebugFormat(
-// "[SCENE PRESENCE]: Fully updating prim {0}, {1} - part timestamp {2}",
-// part.Name, part.UUID, part.TimeStampFull);
+ ScenePartUpdate update = m_updateTimes[part.UUID];
- part.SendFullUpdate(m_presence.ControllingClient,
- m_presence.GenerateClientFlags(part.UUID));
+ // We deal with the possibility that two updates occur at
+ // the same unix time at the update point itself.
- // We'll update to the part's timestamp rather than
- // the current time to avoid the race condition
- // whereby the next tick occurs while we are doing
- // this update. If this happened, then subsequent
- // updates which occurred on the same tick or the
- // next tick of the last update would be ignored.
+ if ((update.LastFullUpdateTime < part.TimeStampFull) ||
+ part.IsAttachment)
+ {
+ // m_log.DebugFormat(
+ // "[SCENE PRESENCE]: Fully updating prim {0}, {1} - part timestamp {2}",
+ // part.Name, part.UUID, part.TimeStampFull);
- update.LastFullUpdateTime = part.TimeStampFull;
+ part.SendFullUpdate(m_presence.ControllingClient,
+ m_presence.GenerateClientFlags(part.UUID));
- }
- else if (update.LastTerseUpdateTime <= part.TimeStampTerse)
- {
-// m_log.DebugFormat(
-// "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}",
-// part.Name, part.UUID, part.TimeStampTerse);
+ // We'll update to the part's timestamp rather than
+ // the current time to avoid the race condition
+ // whereby the next tick occurs while we are doing
+ // this update. If this happened, then subsequent
+ // updates which occurred on the same tick or the
+ // next tick of the last update would be ignored.
- part.SendTerseUpdateToClient(m_presence.ControllingClient);
+ update.LastFullUpdateTime = part.TimeStampFull;
- update.LastTerseUpdateTime = part.TimeStampTerse;
- }
- }
- else
- {
- //never been sent to client before so do full update
- ScenePartUpdate update = new ScenePartUpdate();
- update.FullID = part.UUID;
- update.LastFullUpdateTime = part.TimeStampFull;
- m_updateTimes.Add(part.UUID, update);
+ }
+ else if (update.LastTerseUpdateTime <= part.TimeStampTerse)
+ {
+ // m_log.DebugFormat(
+ // "[SCENE PRESENCE]: Tersely updating prim {0}, {1} - part timestamp {2}",
+ // part.Name, part.UUID, part.TimeStampTerse);
- // Attachment handling
- //
- if (part.ParentGroup.RootPart.Shape.PCode == 9 && part.ParentGroup.RootPart.Shape.State != 0)
+ part.SendTerseUpdateToClient(m_presence.ControllingClient);
+
+ update.LastTerseUpdateTime = part.TimeStampTerse;
+ }
+ }
+ else
{
- if (part != part.ParentGroup.RootPart)
+ //never been sent to client before so do full update
+ ScenePartUpdate update = new ScenePartUpdate();
+ update.FullID = part.UUID;
+ update.LastFullUpdateTime = part.TimeStampFull;
+ m_updateTimes.Add(part.UUID, update);
+
+ // Attachment handling
+ //
+ if (part.ParentGroup.RootPart.Shape.PCode == 9 && part.ParentGroup.RootPart.Shape.State != 0)
+ {
+ if (part != part.ParentGroup.RootPart)
+ continue;
+
+ part.ParentGroup.SendFullUpdateToClient(m_presence.ControllingClient);
continue;
+ }
- part.ParentGroup.SendFullUpdateToClient(m_presence.ControllingClient);
- continue;
+ part.SendFullUpdate(m_presence.ControllingClient,
+ m_presence.GenerateClientFlags(part.UUID));
}
-
- part.SendFullUpdate(m_presence.ControllingClient,
- m_presence.GenerateClientFlags(part.UUID));
}
}
}
--
cgit v1.1
From 6668c789d34bf9b068df5821973fdb75cf129b75 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 1 Jun 2010 19:01:21 +0200
Subject: One should not lock null objects.
---
OpenSim/Region/Framework/Scenes/SceneViewer.cs | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneViewer.cs b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
index 5cbd8d9..f478a4a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneViewer.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneViewer.cs
@@ -67,14 +67,14 @@ namespace OpenSim.Region.Framework.Scenes
public void SendPrimUpdates()
{
- lock(m_pendingObjects)
+ if (m_pendingObjects == null)
{
- if (m_pendingObjects == null)
+ if (!m_presence.IsChildAgent || (m_presence.Scene.m_seeIntoRegionFromNeighbor))
{
- if (!m_presence.IsChildAgent || (m_presence.Scene.m_seeIntoRegionFromNeighbor))
- {
- m_pendingObjects = new Queue();
+ m_pendingObjects = new Queue();
+ lock(m_pendingObjects)
+ {
foreach (EntityBase e in m_presence.Scene.Entities)
{
if (e != null && e is SceneObjectGroup)
@@ -82,7 +82,10 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ }
+ lock(m_pendingObjects)
+ {
while (m_pendingObjects != null && m_pendingObjects.Count > 0)
{
SceneObjectGroup g = m_pendingObjects.Dequeue();
--
cgit v1.1
From fad5158ab4ab01a179eac80c92df301157fb8319 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 7 Jun 2010 00:09:22 +0200
Subject: Add a call to SOG.ResumeScripts() after region crossing / teleport
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++
1 file changed, 2 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 22248af..19329a8 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2495,6 +2495,8 @@ namespace OpenSim.Region.Framework.Scenes
newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 1);
+ newObject.ResumeScripts();
+
// Do this as late as possible so that listeners have full access to the incoming object
EventManager.TriggerOnIncomingSceneObject(newObject);
--
cgit v1.1
From 30d3ea3d4be1bed3001e2bda5890cce183c4f388 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Wed, 9 Jun 2010 17:00:24 +0100
Subject: Give attachments the same priority as other avatars in
BestAvatarResponsiveness policy
---
OpenSim/Region/Framework/Scenes/Prioritizer.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
index 4780cdd..7b7677b 100644
--- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs
+++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
@@ -210,7 +210,10 @@ namespace OpenSim.Region.Framework.Scenes
{
PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor;
if (physActor == null || !physActor.IsPhysical)
- priority+=100;
+ priority += 100;
+
+ if (((SceneObjectPart)entity).ParentGroup.RootPart.IsAttachment)
+ priority = 1.0;
}
return priority;
}
--
cgit v1.1
From 57a60282f5746a3aa73c0cac34059fbdbd319c0c Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sat, 12 Jun 2010 06:57:10 +0100
Subject: Don't filre CHANGED_INVENTORY if a prim comes in from storage
---
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index c4cff12..c3cdca8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -681,7 +681,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (TaskInventoryItem item in items)
{
m_items.Add(item.ItemID, item);
- m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
+// m_part.TriggerScriptChangedEvent(Changed.INVENTORY);
}
m_items.LockItemsForWrite(false);
--
cgit v1.1
From 03a48f87e418e79ca780b29a696e5e878213e7ef Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 12 Jun 2010 08:29:20 +0200
Subject: Preserving the link numbers is a serializer's highest duty. Prevent
region crossings from screwing up complex attachments by preserving link
numbers.
---
.../Framework/Scenes/Serialization/SceneObjectSerializer.cs | 9 +++++++++
1 file changed, 9 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index f7544ac..5bdaa17 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -221,7 +221,16 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
sr = new StringReader(parts[i].OuterXml);
reader = new XmlTextReader(sr);
SceneObjectPart part = SceneObjectPart.FromXml(reader);
+
+ int originalLinkNum = part.LinkNum;
+
sceneObject.AddPart(part);
+
+ // SceneObjectGroup.AddPart() tries to be smart and automatically set the LinkNum.
+ // We override that here
+ if (originalLinkNum != 0)
+ part.LinkNum = originalLinkNum;
+
part.StoreUndoState();
reader.Close();
sr.Close();
--
cgit v1.1
From 3ea11fe2e6593fe0455a7c5bf842deca307f373e Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 12 Jun 2010 04:35:51 -0700
Subject: Get rid of spamming SOG debug message
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 66ad14f..c7d21bb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2230,8 +2230,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public void ScheduleGroupForFullUpdate()
{
- if (IsAttachment)
- m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
+ //if (IsAttachment)
+ // m_log.DebugFormat("[SOG]: Scheduling full update for {0} {1}", Name, LocalId);
checkAtTargets();
RootPart.ScheduleFullUpdate();
--
cgit v1.1
From f59e272643a92b20e7f7eb97f54a30c8b045725d Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 13 Jun 2010 22:21:05 +0200
Subject: Introduce SOP.UpdateSitters() to update sitting avatars' chat
position if needed
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 9 +++++++++
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 8 ++++++++
2 files changed, 17 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index c7d21bb..6f68029 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2174,6 +2174,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_rootPart.UpdateFlag = 1;
lastPhysGroupPos = AbsolutePosition;
+ UpdateSitters();
}
if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
@@ -3832,6 +3833,14 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ private void UpdateSitters()
+ {
+ foreach (SceneObjectPart part in Children.Values)
+ {
+ part.UpdateSitter();
+ }
+ }
+
public override string ToString()
{
return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index e4a36ef..705e0a3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4720,5 +4720,13 @@ namespace OpenSim.Region.Framework.Scenes
Inventory.UpdateInventoryItem(item);
}
}
+
+ public void UpdateSitter()
+ {
+ if (m_sitTargetAvatar != UUID.Zero)
+ return;
+
+ // Update sitting avatar chat position
+ }
}
}
--
cgit v1.1
From 3d319d6c3ff2bded0f4b6c730f227a490dd2fb2e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 13 Jun 2010 22:23:07 +0200
Subject: Actually update the SP. EXPERIMENTAL
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 705e0a3..a83119e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4726,7 +4726,13 @@ namespace OpenSim.Region.Framework.Scenes
if (m_sitTargetAvatar != UUID.Zero)
return;
+ ScenePresence p = m_parentGroup.Scene.GetScenePresence(m_sitTargetAvatar);
+ if (p == null)
+ return;
+
// Update sitting avatar chat position
+
+ p.AbsolutePosition = AbsolutePosition;
}
}
}
--
cgit v1.1
From 520b0e131c43e97d4a08c8ed93a32228ab61a99e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 13 Jun 2010 22:37:11 +0200
Subject: Try to make prims stop moving. Reset velocity, etc, unconditionally.
Although the phys actor may be new, the prim fields could still be set and
the slimupdates system would continue sending that data out.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index a83119e..be2bbc5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1738,7 +1738,7 @@ namespace OpenSim.Region.Framework.Scenes
// which stops client-side interpolation of deactivated joint proxy objects.
}
- if (!UsePhysics && !isNew)
+ if (!UsePhysics)
{
// reset velocity to 0 on physics switch-off. Without that, the client thinks the
// prim still has velocity and continues to interpolate its position along the old
--
cgit v1.1
From 305876180690e5c236d6bda60a6173a16ad5edc8 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 13 Jun 2010 22:43:14 +0200
Subject: D.U.H. un-reverse a reversed condition
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index be2bbc5..c3e87b7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4723,7 +4723,7 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateSitter()
{
- if (m_sitTargetAvatar != UUID.Zero)
+ if (m_sitTargetAvatar == UUID.Zero)
return;
ScenePresence p = m_parentGroup.Scene.GetScenePresence(m_sitTargetAvatar);
--
cgit v1.1
From d520360cb83bb3f7733228ff74cf083b0855b261 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 13 Jun 2010 23:01:15 +0200
Subject: Try it witht he root prim
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index c3e87b7..68681c9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4732,7 +4732,7 @@ namespace OpenSim.Region.Framework.Scenes
// Update sitting avatar chat position
- p.AbsolutePosition = AbsolutePosition;
+ p.AbsolutePosition = GroupPosition;
}
}
}
--
cgit v1.1
From 62763cc0fb80caae199ea03d2cb8d031924c111e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 14 Jun 2010 00:02:17 +0200
Subject: Report current position instead of position at the time we sat down
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 7 +++++++
2 files changed, 8 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 68681c9..91b7d35 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4732,7 +4732,7 @@ namespace OpenSim.Region.Framework.Scenes
// Update sitting avatar chat position
- p.AbsolutePosition = GroupPosition;
+ p.AbsolutePosition = GroupPosition + OffsetPosition + m_sitTargetPosition;
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b6f67f7..7a7816a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -466,6 +466,13 @@ namespace OpenSim.Region.Framework.Scenes
if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
m_pos = actor.Position;
+ // If we're sitting, we need to update our position
+ if (m_parentID == 0)
+ {
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
+ m_parentPosition = part.AbsolutePosition;
+ }
+
return m_parentPosition + m_pos;
}
set
--
cgit v1.1
From 093cc047cd42f4cc3d59f365aa70cc196855e83f Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 14 Jun 2010 00:03:43 +0200
Subject: Revert "Try it witht he root prim"
This reverts commit d520360cb83bb3f7733228ff74cf083b0855b261.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 91b7d35..c3e87b7 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4732,7 +4732,7 @@ namespace OpenSim.Region.Framework.Scenes
// Update sitting avatar chat position
- p.AbsolutePosition = GroupPosition + OffsetPosition + m_sitTargetPosition;
+ p.AbsolutePosition = AbsolutePosition;
}
}
}
--
cgit v1.1
From 5fda89fdb5ca6569239412b7b2d38163b8b3b5ab Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 14 Jun 2010 00:04:02 +0200
Subject: Revert "D.U.H."
This reverts commit 305876180690e5c236d6bda60a6173a16ad5edc8.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index c3e87b7..be2bbc5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4723,7 +4723,7 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateSitter()
{
- if (m_sitTargetAvatar == UUID.Zero)
+ if (m_sitTargetAvatar != UUID.Zero)
return;
ScenePresence p = m_parentGroup.Scene.GetScenePresence(m_sitTargetAvatar);
--
cgit v1.1
From f9b4f5f594caf609d255c585c4224f0455403908 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 14 Jun 2010 00:05:01 +0200
Subject: Revert "Introduce SOP.UpdateSitters() to update sitting avatars' chat
position if"
This reverts commit f59e272643a92b20e7f7eb97f54a30c8b045725d.
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 9 ---------
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 14 --------------
2 files changed, 23 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 6f68029..c7d21bb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2174,7 +2174,6 @@ namespace OpenSim.Region.Framework.Scenes
{
m_rootPart.UpdateFlag = 1;
lastPhysGroupPos = AbsolutePosition;
- UpdateSitters();
}
if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
@@ -3833,14 +3832,6 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- private void UpdateSitters()
- {
- foreach (SceneObjectPart part in Children.Values)
- {
- part.UpdateSitter();
- }
- }
-
public override string ToString()
{
return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index be2bbc5..b80a557 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4720,19 +4720,5 @@ namespace OpenSim.Region.Framework.Scenes
Inventory.UpdateInventoryItem(item);
}
}
-
- public void UpdateSitter()
- {
- if (m_sitTargetAvatar != UUID.Zero)
- return;
-
- ScenePresence p = m_parentGroup.Scene.GetScenePresence(m_sitTargetAvatar);
- if (p == null)
- return;
-
- // Update sitting avatar chat position
-
- p.AbsolutePosition = AbsolutePosition;
- }
}
}
--
cgit v1.1
From 1532dbca0ae54ee6427153d7beec95b8cb52e1e3 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 14 Jun 2010 00:12:39 +0200
Subject: Guard against a potential nullref
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 7a7816a..9c507c2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -470,7 +470,8 @@ namespace OpenSim.Region.Framework.Scenes
if (m_parentID == 0)
{
SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
- m_parentPosition = part.AbsolutePosition;
+ if (part != null)
+ m_parentPosition = part.AbsolutePosition;
}
return m_parentPosition + m_pos;
--
cgit v1.1
From 9b30f446729e16c165551ecf0756dedb85d8b269 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 14 Jun 2010 02:28:31 +0200
Subject: D.U.H. #2. Inverted test. Again. Argh!
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 9c507c2..6d2cd88 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -467,7 +467,7 @@ namespace OpenSim.Region.Framework.Scenes
m_pos = actor.Position;
// If we're sitting, we need to update our position
- if (m_parentID == 0)
+ if (m_parentID != 0)
{
SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
if (part != null)
--
cgit v1.1
From 958c6c6fde45e41433452f44bf8e2e925153a24d Mon Sep 17 00:00:00 2001
From: Kitto Flora
Date: Thu, 17 Jun 2010 13:04:18 -0400
Subject: Add rez on water surface.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 32 +++++++++++++++++++++-----------
1 file changed, 21 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index b58bfb8..a88b87f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1967,14 +1967,24 @@ namespace OpenSim.Region.Framework.Scenes
///
public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
{
+
+ float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
+ Vector3 wpos = Vector3.Zero;
+ // Check for water surface intersection from above
+ if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
+ {
+ float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
+ wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
+ wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
+ wpos.Z = wheight;
+ }
+
Vector3 pos = Vector3.Zero;
if (RayEndIsIntersection == (byte)1)
{
pos = RayEnd;
- return pos;
}
-
- if (RayTargetID != UUID.Zero)
+ else if (RayTargetID != UUID.Zero)
{
SceneObjectPart target = GetSceneObjectPart(RayTargetID);
@@ -1996,7 +2006,7 @@ namespace OpenSim.Region.Framework.Scenes
EntityIntersection ei = target.TestIntersectionOBB(NewRay, Quaternion.Identity, frontFacesOnly, FaceCenter);
// Un-comment out the following line to Get Raytrace results printed to the console.
- // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
+ // m_log.Info("[RAYTRACERESULTS]: Hit:" + ei.HitTF.ToString() + " Point: " + ei.ipoint.ToString() + " Normal: " + ei.normal.ToString());
float ScaleOffset = 0.5f;
// If we hit something
@@ -2019,13 +2029,10 @@ namespace OpenSim.Region.Framework.Scenes
//pos.Z -= 0.25F;
}
-
- return pos;
}
else
{
// We don't have a target here, so we're going to raytrace all the objects in the scene.
-
EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
// Un-comment the following line to print the raytrace results to the console.
@@ -2034,13 +2041,12 @@ namespace OpenSim.Region.Framework.Scenes
if (ei.HitTF)
{
pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
- } else
+ }
+ else
{
// fall back to our stupid functionality
pos = RayEnd;
}
-
- return pos;
}
}
else
@@ -2051,8 +2057,12 @@ namespace OpenSim.Region.Framework.Scenes
//increase height so its above the ground.
//should be getting the normal of the ground at the rez point and using that?
pos.Z += scale.Z / 2f;
- return pos;
+// return pos;
}
+
+ // check against posible water intercept
+ if (wpos.Z > pos.Z) pos = wpos;
+ return pos;
}
--
cgit v1.1
From 6d8da699b275cf9a52214de3b22256533b7bb784 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 19 Jun 2010 07:00:01 -0700
Subject: Add "AvatarHeight/2" to the Home Position when set to avoid having
the avatar fall through the ground when they TP home.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 10 ++++++++++
1 file changed, 10 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 97de147..dc58d84 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3235,6 +3235,16 @@ namespace OpenSim.Region.Framework.Scenes
///
public virtual void SetHomeRezPoint(IClientAPI remoteClient, ulong regionHandle, Vector3 position, Vector3 lookAt, uint flags)
{
+ //Add half the avatar's height so that the user doesn't fall through prims
+ ScenePresence presence;
+ if (TryGetScenePresence(remoteClient.AgentId, out presence))
+ {
+ if (presence.Appearance != null)
+ {
+ position.Z = position.Z + (presence.Appearance.AvatarHeight / 2);
+ }
+ }
+
if (GridUserService != null && GridUserService.SetHome(remoteClient.AgentId.ToString(), RegionInfo.RegionID, position, lookAt))
// FUBAR ALERT: this needs to be "Home position set." so the viewer saves a home-screenshot.
m_dialogModule.SendAlertToUser(remoteClient, "Home position set.");
--
cgit v1.1
From 49d7d8534ccd037f4690c5ac6aecd66a460960df Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 19 Jun 2010 10:06:09 -0700
Subject: Allow moving an avatar as part of a linkset using
llSetLinkPrimitiveParams. This unlocks an awful lot of poseball-free content,
and is a step towards resolving mantis #59.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 56 +++++++++++++++++++++-
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 39 ++++++++++++++-
2 files changed, 91 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index c7d21bb..3e92954 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -110,8 +110,8 @@ namespace OpenSim.Region.Framework.Scenes
private long m_minPersistTime = 0;
private Random m_rand;
private bool m_suspendUpdates;
-
- private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
+ private System.Threading.ReaderWriterLockSlim m_partsLock = new System.Threading.ReaderWriterLockSlim();
+ private List m_linkedAvatars = new List();
public bool areUpdatesSuspended
{
@@ -1116,6 +1116,47 @@ namespace OpenSim.Region.Framework.Scenes
}
///
+ /// Add the avatar to this linkset (avatar is sat).
+ ///
+ ///
+ public void AddAvatar(UUID agentID)
+ {
+ ScenePresence presence;
+ if (m_scene.TryGetScenePresence(agentID, out presence))
+ {
+ if (!m_linkedAvatars.Contains(presence))
+ {
+ m_linkedAvatars.Add(presence);
+ }
+ }
+ }
+
+ ///
+ /// Delete the avatar from this linkset (avatar is unsat).
+ ///
+ ///
+ public void DeleteAvatar(UUID agentID)
+ {
+ ScenePresence presence;
+ if (m_scene.TryGetScenePresence(agentID, out presence))
+ {
+ if (m_linkedAvatars.Contains(presence))
+ {
+ m_linkedAvatars.Remove(presence);
+ }
+ }
+ }
+
+ ///
+ /// Returns the list of linked presences (avatars sat on this group)
+ ///
+ ///
+ public List GetLinkedAvatars()
+ {
+ return m_linkedAvatars;
+ }
+
+ ///
/// Attach this scene object to the given avatar.
///
///
@@ -2974,6 +3015,17 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+
+
+ ///
+ /// Gets the number of parts
+ ///
+ ///
+ public int GetPartCount()
+ {
+ return Children.Count;
+ }
+
///
/// Get the parts of this scene object
///
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d4fc6cd..76267ab 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -219,6 +219,7 @@ namespace OpenSim.Region.Framework.Scenes
//PauPaw:Proper PID Controler for autopilot************
private bool m_moveToPositionInProgress;
private Vector3 m_moveToPositionTarget;
+ private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
private bool m_followCamAuto;
@@ -537,10 +538,39 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public Quaternion OffsetRotation
+ {
+ get { return m_offsetRotation; }
+ set { m_offsetRotation = value; }
+ }
+
public Quaternion Rotation
{
- get { return m_bodyRot; }
- set { m_bodyRot = value; }
+ get {
+ if (m_parentID != 0)
+ {
+ if (m_offsetRotation != null)
+ {
+ return m_offsetRotation;
+ }
+ else
+ {
+ return new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+
+ }
+ else
+ {
+ return m_bodyRot;
+ }
+ }
+ set {
+ m_bodyRot = value;
+ if (m_parentID != 0)
+ {
+ m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ }
}
public Quaternion PreviousRotation
@@ -1795,6 +1825,7 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
part.IsOccupied = false;
+ part.ParentGroup.DeleteAvatar(ControllingClient.AgentId);
}
else
{
@@ -1804,6 +1835,7 @@ namespace OpenSim.Region.Framework.Scenes
m_parentPosition = Vector3.Zero;
m_parentID = 0;
+ m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
SendFullUpdateToAllClients();
m_requestedSitTargetID = 0;
@@ -1904,6 +1936,7 @@ namespace OpenSim.Region.Framework.Scenes
part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
sitOrientation = avSitOrientation; // Change rotatione to the scripted one
+ OffsetRotation = avSitOrientation;
autopilot = false; // Jump direct to scripted llSitPos()
}
else
@@ -2311,6 +2344,7 @@ namespace OpenSim.Region.Framework.Scenes
m_bodyRot = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
part.IsOccupied = true;
+ part.ParentGroup.AddAvatar(agentID);
Console.WriteLine("Scripted Sit ofset {0}", m_pos);
}
else
@@ -2341,6 +2375,7 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
m_parentPosition = part.AbsolutePosition;
part.IsOccupied = true;
+ part.ParentGroup.AddAvatar(agentID);
m_pos = new Vector3(0f, 0f, 0.05f) + // corrections to get Sit Animation
(new Vector3(0.0f, 0f, 0.61f) * partIRot) + // located on center
(new Vector3(0.34f, 0f, 0.0f) * m_bodyRot) +
--
cgit v1.1
From 13a0b65a804349e41b8e692727068ac6580c0d35 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 20 Jun 2010 21:38:06 +0200
Subject: Modify avatar responsiveness policy to send roots before children
---
OpenSim/Region/Framework/Scenes/Prioritizer.cs | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
index 7b7677b..b95b5f2 100644
--- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs
+++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
@@ -208,12 +208,19 @@ namespace OpenSim.Region.Framework.Scenes
if (entity is SceneObjectPart)
{
- PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor;
- if (physActor == null || !physActor.IsPhysical)
- priority += 100;
-
if (((SceneObjectPart)entity).ParentGroup.RootPart.IsAttachment)
+ {
priority = 1.0;
+ }
+ else
+ {
+ PhysicsActor physActor = ((SceneObjectPart)entity).ParentGroup.RootPart.PhysActor;
+ if (physActor == null || !physActor.IsPhysical)
+ priority += 100;
+ }
+
+ if (((SceneObjectPart)entity).ParentGroup.RootPart != (SceneObjectPart)entity)
+ priority +=1;
}
return priority;
}
--
cgit v1.1
From a1416612a9f9e0d5cbe1c1f02d313e9be020226d Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 20 Jun 2010 14:45:04 -0700
Subject: Update all clients sitting on a linkset if a child prim is moved.
This prevents avatars being "lost in the void" until they stand up when a
child prim is moved that they're sitting on.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 6 ++++++
1 file changed, 6 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index b80a557..78faa01 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -711,6 +711,12 @@ namespace OpenSim.Region.Framework.Scenes
// Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
+
+ List avs = ParentGroup.GetLinkedAvatars();
+ foreach (ScenePresence av in avs)
+ {
+ av.SendFullUpdateToAllClients();
+ }
}
}
}
--
cgit v1.1
From fc715a092c9b48ddfbf75eb35e1a052885aecbff Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 20 Jun 2010 15:38:48 -0700
Subject: Fix the sit code to ensure that we use the root prim of a linkset as
a reference in the case of an avatar sitting on a child prim. This fixes
various camera issues and fixes mantis #0000059.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 76267ab..472c389 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1766,7 +1766,7 @@ namespace OpenSim.Region.Framework.Scenes
if (m_parentID != 0)
{
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
if (part != null)
{
part.TaskInventory.LockItemsForRead(true);
@@ -2028,7 +2028,9 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("Camera At ={0}", cameraAtOffset);
//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
- ControllingClient.SendSitResponse(part.UUID, offsetr, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+ //NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
+ ControllingClient.SendSitResponse(part.ParentGroup.UUID, offsetr + part.OffsetPosition, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+
m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls
// HandleAgentSit itself after it gets to the location
@@ -2398,7 +2400,17 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
return;
}
}
- m_parentID = m_requestedSitTargetID;
+
+ //We want our offsets to reference the root prim, not the child we may have sat on
+ if (!part.IsRoot)
+ {
+ m_parentID = part.ParentGroup.RootPart.LocalId;
+ m_pos += part.OffsetPosition;
+ }
+ else
+ {
+ m_parentID = m_requestedSitTargetID;
+ }
Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
--
cgit v1.1
From 9d251b1dc518522979b73fdadc0329067b669149 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 20 Jun 2010 15:57:01 -0700
Subject: Fix the StandUp position to calculate as if we're still using the
child prim id.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 472c389..a376ab1 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1822,7 +1822,7 @@ namespace OpenSim.Region.Framework.Scenes
//CW: If the part isn't null then we can set the current position
if (part != null)
{
- Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + (m_pos * partRot); // + av sit offset!
+ Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ((m_pos - part.OffsetPosition) * partRot); // + av sit offset!
AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
part.IsOccupied = false;
part.ParentGroup.DeleteAvatar(ControllingClient.AgentId);
--
cgit v1.1
From 3428196631bb13f04d04208af9fd28a432805ccf Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 22 Jun 2010 02:33:20 +0200
Subject: Guard prioritizer agains null values as those produced by a bullet
dying before it can be updated
---
OpenSim/Region/Framework/Scenes/Prioritizer.cs | 3 +++
1 file changed, 3 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Prioritizer.cs b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
index b95b5f2..8cd0160 100644
--- a/OpenSim/Region/Framework/Scenes/Prioritizer.cs
+++ b/OpenSim/Region/Framework/Scenes/Prioritizer.cs
@@ -52,6 +52,9 @@ namespace OpenSim.Region.Framework.Scenes
public double GetUpdatePriority(IClientAPI client, ISceneEntity entity)
{
double priority = 0;
+
+ if (entity == null)
+ return 100000;
switch (m_scene.UpdatePrioritizationScheme)
{
--
cgit v1.1
From 962dade15596d0aeff3baba0b0b85c17524766c6 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 22 Jun 2010 04:04:59 +0200
Subject: Cause collisions with the avatar to be sent to attachments. Currently
ignores collision filter. Physics collisions are still dodgy, so we don't get
the events we should be getting.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 140 +++++++++++++++++++++++
1 file changed, 140 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a376ab1..654e9ce 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -228,6 +228,7 @@ namespace OpenSim.Region.Framework.Scenes
private int m_updateCount = 0; //KF: Update Anims for a while
private static readonly int UPDATE_COUNT = 10; // how many frames to update for
private const int NumMovementsBetweenRayCast = 5;
+ private List m_lastColliders = new List();
private bool CameraConstraintActive;
//private int m_moveToPositionStateStatus;
@@ -3595,6 +3596,145 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
}
}
+ List thisHitColliders = new List();
+ List endedColliders = new List();
+ List startedColliders = new List();
+
+ foreach (uint localid in coldata.Keys)
+ {
+ thisHitColliders.Add(localid);
+ if (!m_lastColliders.Contains(localid))
+ {
+ startedColliders.Add(localid);
+ }
+ //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
+ }
+
+ // calculate things that ended colliding
+ foreach (uint localID in m_lastColliders)
+ {
+ if (!thisHitColliders.Contains(localID))
+ {
+ endedColliders.Add(localID);
+ }
+ }
+ //add the items that started colliding this time to the last colliders list.
+ foreach (uint localID in startedColliders)
+ {
+ m_lastColliders.Add(localID);
+ }
+ // remove things that ended colliding from the last colliders list
+ foreach (uint localID in endedColliders)
+ {
+ m_lastColliders.Remove(localID);
+ }
+
+ // do event notification
+ if (startedColliders.Count > 0)
+ {
+ ColliderArgs StartCollidingMessage = new ColliderArgs();
+ List colliding = new List();
+ foreach (uint localId in startedColliders)
+ {
+ if (localId == 0)
+ continue;
+
+ SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
+ string data = "";
+ if (obj != null)
+ {
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = obj.UUID;
+ detobj.nameStr = obj.Name;
+ detobj.ownerUUID = obj.OwnerID;
+ detobj.posVector = obj.AbsolutePosition;
+ detobj.rotQuat = obj.GetWorldRotation();
+ detobj.velVector = obj.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = obj.GroupID;
+ colliding.Add(detobj);
+ }
+ }
+
+ if (colliding.Count > 0)
+ {
+ StartCollidingMessage.Colliders = colliding;
+
+ foreach (SceneObjectGroup att in Attachments)
+ Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
+ }
+ }
+
+ if (endedColliders.Count > 0)
+ {
+ ColliderArgs EndCollidingMessage = new ColliderArgs();
+ List colliding = new List();
+ foreach (uint localId in endedColliders)
+ {
+ if (localId == 0)
+ continue;
+
+ SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
+ string data = "";
+ if (obj != null)
+ {
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = obj.UUID;
+ detobj.nameStr = obj.Name;
+ detobj.ownerUUID = obj.OwnerID;
+ detobj.posVector = obj.AbsolutePosition;
+ detobj.rotQuat = obj.GetWorldRotation();
+ detobj.velVector = obj.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = obj.GroupID;
+ colliding.Add(detobj);
+ }
+ }
+
+ if (colliding.Count > 0)
+ {
+ EndCollidingMessage.Colliders = colliding;
+
+ foreach (SceneObjectGroup att in Attachments)
+ Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage);
+ }
+ }
+
+ if (thisHitColliders.Count > 0)
+ {
+ ColliderArgs CollidingMessage = new ColliderArgs();
+ List colliding = new List();
+ foreach (uint localId in thisHitColliders)
+ {
+ if (localId == 0)
+ continue;
+
+ SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
+ string data = "";
+ if (obj != null)
+ {
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = obj.UUID;
+ detobj.nameStr = obj.Name;
+ detobj.ownerUUID = obj.OwnerID;
+ detobj.posVector = obj.AbsolutePosition;
+ detobj.rotQuat = obj.GetWorldRotation();
+ detobj.velVector = obj.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = obj.GroupID;
+ colliding.Add(detobj);
+ }
+ }
+
+ if (colliding.Count > 0)
+ {
+ CollidingMessage.Colliders = colliding;
+
+ foreach (SceneObjectGroup att in Attachments)
+ Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
+ }
+ }
+
if (m_invulnerable)
return;
--
cgit v1.1
From e94cf3d9b71206384d33b4cc02fb252dfc93aed7 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Thu, 24 Jun 2010 03:35:42 +0100
Subject: And another conflict
---
.../Region/Framework/Scenes/SceneObjectPartInventory.cs | 17 -----------------
1 file changed, 17 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 5be71df..2cde8f3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -310,7 +310,6 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
-<<<<<<< HEAD:OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
if (m_part.ParentGroup.m_savedScriptState != null)
RestoreSavedScriptState(item.OldItemID, item.ItemID);
@@ -327,22 +326,6 @@ namespace OpenSim.Region.Framework.Scenes
StoreScriptErrors(item.ItemID, null);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
-=======
- lock (m_items)
- {
- if (m_part.ParentGroup.m_savedScriptState != null)
- RestoreSavedScriptState(item.OldItemID, item.ItemID);
-
- m_items[item.ItemID].PermsMask = 0;
- m_items[item.ItemID].PermsGranter = UUID.Zero;
-
- string script = Utils.BytesToString(asset.Data);
- m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
- m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
- m_part.ParentGroup.AddActiveScriptCount(1);
- m_part.ScheduleFullUpdate();
- }
->>>>>>> master:OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
}
}
}
--
cgit v1.1
From 96e649189f24b6261d0bcdd6aa7f5a078b8d3f7f Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Fri, 25 Jun 2010 14:25:39 -0700
Subject: Add two events: OnAttachToBackup and OnDetachFromBackup.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 26 ++++++++++++++++++++++
.../Region/Framework/Scenes/SceneObjectGroup.cs | 4 ++++
2 files changed, 30 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 80f9114..904e38a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -43,6 +43,10 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void ObjectDuplicateDelegate(EntityBase original, EntityBase clone);
+ public delegate void AttachToBackupDelegate(SceneObjectGroup sog);
+
+ public delegate void DetachFromBackupDelegate(SceneObjectGroup sog);
+
public delegate void ObjectCreateDelegate(EntityBase obj);
public delegate void ObjectDeleteDelegate(EntityBase obj);
@@ -61,6 +65,8 @@ namespace OpenSim.Region.Framework.Scenes
private PhysicsCrash handlerPhysicsCrash = null;
public event ObjectDuplicateDelegate OnObjectDuplicate;
+ public event AttachToBackupDelegate OnAttachToBackup;
+ public event DetachFromBackupDelegate OnDetachFromBackup;
public event ObjectCreateDelegate OnObjectCreate;
public event ObjectDeleteDelegate OnObjectRemove;
@@ -388,10 +394,14 @@ namespace OpenSim.Region.Framework.Scenes
m_numPrim += sceneObject.Children.Count;
if (attachToBackup)
+ {
sceneObject.AttachToBackup();
+ }
if (OnObjectCreate != null)
+ {
OnObjectCreate(sceneObject);
+ }
lock (m_dictionary_lock)
{
@@ -458,6 +468,22 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void FireAttachToBackup(SceneObjectGroup obj)
+ {
+ if (OnAttachToBackup != null)
+ {
+ OnAttachToBackup(obj);
+ }
+ }
+
+ public void FireDetachFromBackup(SceneObjectGroup obj)
+ {
+ if (OnDetachFromBackup != null)
+ {
+ OnDetachFromBackup(obj);
+ }
+ }
+
///
/// Process all pending updates
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3e92954..e18dfd2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -658,6 +658,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public virtual void AttachToBackup()
{
+ m_scene.SceneGraph.FireAttachToBackup(this);
+
if (InSceneBackup)
{
//m_log.DebugFormat(
@@ -2703,6 +2705,8 @@ namespace OpenSim.Region.Framework.Scenes
///
public virtual void DetachFromBackup()
{
+ m_scene.SceneGraph.FireDetachFromBackup(this);
+
if (m_isBackedUp)
m_scene.EventManager.OnBackup -= ProcessBackup;
--
cgit v1.1
From f64d1cb3967b5352921b296348f618a62fdfa622 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Fri, 25 Jun 2010 14:39:15 -0700
Subject: Add new event: OnChangedBackup
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 11 +++++++++++
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 4 ++++
2 files changed, 15 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index ce7b0eb..81ef54f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -47,6 +47,8 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void DetachFromBackupDelegate(SceneObjectGroup sog);
+ public delegate void ChangedBackupDelegate(SceneObjectGroup sog);
+
public delegate void ObjectCreateDelegate(EntityBase obj);
public delegate void ObjectDeleteDelegate(EntityBase obj);
@@ -67,6 +69,7 @@ namespace OpenSim.Region.Framework.Scenes
public event ObjectDuplicateDelegate OnObjectDuplicate;
public event AttachToBackupDelegate OnAttachToBackup;
public event DetachFromBackupDelegate OnDetachFromBackup;
+ public event ChangedBackupDelegate OnChangeBackup;
public event ObjectCreateDelegate OnObjectCreate;
public event ObjectDeleteDelegate OnObjectRemove;
@@ -484,6 +487,14 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void FireChangeBackup(SceneObjectGroup obj)
+ {
+ if (OnChangeBackup != null)
+ {
+ OnChangeBackup(obj);
+ }
+ }
+
///
/// Process all pending updates
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index e18dfd2..7081ced 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -200,6 +200,10 @@ namespace OpenSim.Region.Framework.Scenes
{
if (value)
{
+ if (m_isBackedUp)
+ {
+ m_scene.SceneGraph.FireChangeBackup(this);
+ }
timeLastChanged = DateTime.Now.Ticks;
if (!m_hasGroupChanged)
timeFirstChanged = DateTime.Now.Ticks;
--
cgit v1.1
From 6274317e63e18785a2c3d96514ca371e0a04cf71 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 26 Jun 2010 06:16:24 +0200
Subject: Fix loading of attachments on login
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 654e9ce..4a4cac9 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -4151,7 +4151,14 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
{
m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
stateData = attServ.Get(ControllingClient.AgentId.ToString());
- doc.LoadXml(stateData);
+ if (stateData != String.Empty)
+ {
+ try
+ {
+ doc.LoadXml(stateData);
+ }
+ catch { }
+ }
}
Dictionary itemData = new Dictionary();
--
cgit v1.1
From 70d3b9aecaf5bf2447b43a1359c631eb60ca66aa Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 11:14:58 -0700
Subject: Add a DeleteAllSceneObjects(bool exceptNoCopy) method to allow
NoCopy objects to be retained when the scene is cleared.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index dc58d84..c596baa 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2183,6 +2183,14 @@ namespace OpenSim.Region.Framework.Scenes
///
public void DeleteAllSceneObjects()
{
+ DeleteAllSceneObjects(false);
+ }
+
+ ///
+ /// Delete every object from the scene. This does not include attachments worn by avatars.
+ ///
+ public void DeleteAllSceneObjects(bool exceptNoCopy)
+ {
lock (Entities)
{
ICollection entities = new List(Entities);
@@ -2192,8 +2200,13 @@ namespace OpenSim.Region.Framework.Scenes
if (e is SceneObjectGroup)
{
SceneObjectGroup sog = (SceneObjectGroup)e;
- if (!sog.IsAttachment)
- DeleteSceneObject((SceneObjectGroup)e, false);
+ if (sog != null && !sog.IsAttachment)
+ {
+ if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
+ {
+ DeleteSceneObject((SceneObjectGroup)e, false);
+ }
+ }
}
}
}
--
cgit v1.1
From acab2a159d150072aa9952100aa6722cbd51c1ea Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 11:24:36 -0700
Subject: Return objects which are NoCopy instead of just leaving them when
cleaning the scene, if exceptNoCopy = true.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 4 ++++
1 file changed, 4 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c596baa..abc7377 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2206,6 +2206,10 @@ namespace OpenSim.Region.Framework.Scenes
{
DeleteSceneObject((SceneObjectGroup)e, false);
}
+ else
+ {
+ DeRezObject(null, sog.RootPart.LocalId, sog.RootPart.GroupID, DeRezAction.Return, UUID.Zero);
+ }
}
}
}
--
cgit v1.1
From bd19cf739a03e255b0bf46021d3fab6ea0148afb Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 12:38:08 -0700
Subject: Fix a bug with DeRezObjects (check for a null remoteClient)
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 5e1798b..83fd349 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1591,15 +1591,17 @@ namespace OpenSim.Region.Framework.Scenes
// So that we know the database is upto date,
// for when deleting the object from it
ForceSceneObjectBackup(grp);
+ if (remoteClient != null)
+ {
+ if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
+ permissionToTakeCopy = false;
+ if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
+ permissionToTake = false;
- if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
- permissionToTakeCopy = false;
- if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
- permissionToTake = false;
-
- if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId))
- permissionToDelete = false;
+ if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId))
+ permissionToDelete = false;
+ }
}
// Handle god perms
--
cgit v1.1
From ed5dac7e82adfe639a2057ed5d531418277869d7 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 13:06:47 -0700
Subject: Fix another nullref issue in DeRezSceneObject
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 83fd349..0380199 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1605,7 +1605,7 @@ namespace OpenSim.Region.Framework.Scenes
}
// Handle god perms
- if (Permissions.IsGod(remoteClient.AgentId))
+ if (remoteClient != null && Permissions.IsGod(remoteClient.AgentId))
{
permissionToTake = true;
permissionToTakeCopy = true;
--
cgit v1.1
From d188ed8ed86661a79b68f5c43ce0a94dc51308f0 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 13:07:17 -0700
Subject: Return everything at once, it's more efficient that way
---
OpenSim/Region/Framework/Scenes/Scene.cs | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index abc7377..bbac919 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2191,6 +2191,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void DeleteAllSceneObjects(bool exceptNoCopy)
{
+ List toReturn = new List();
lock (Entities)
{
ICollection entities = new List(Entities);
@@ -2208,12 +2209,16 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- DeRezObject(null, sog.RootPart.LocalId, sog.RootPart.GroupID, DeRezAction.Return, UUID.Zero);
+ toReturn.Add((SceneObjectGroup)e);
}
}
}
}
}
+ if (toReturn.Count > 0)
+ {
+ returnObjects(toReturn.ToArray(), UUID.Zero);
+ }
}
///
--
cgit v1.1
From 8f0adfbfb264532d55c0f0bab5bc508d36ad365e Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 15:15:19 -0700
Subject: Trigger the RegionLightShareData OnSave event properly when the
profile is saved
---
OpenSim/Region/Framework/Scenes/Scene.cs | 1 +
1 file changed, 1 insertion(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index bbac919..c5fb198 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -1770,6 +1770,7 @@ namespace OpenSim.Region.Framework.Scenes
public void StoreWindlightProfile(RegionLightShareData wl)
{
m_regInfo.WindlightSettings = wl;
+ wl.Save();
m_storageManager.DataStore.StoreRegionWindlightSettings(wl);
m_eventManager.TriggerOnSaveNewWindlightProfile();
}
--
cgit v1.1
From 592ff1288dd1fccc1d2efde90e94ca0ab4a57652 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 26 Jun 2010 18:51:19 -0700
Subject: Add a new global event : OnTerrainUpdate
---
OpenSim/Region/Framework/Scenes/EventManager.cs | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs
index ef125cd..0c9759d 100644
--- a/OpenSim/Region/Framework/Scenes/EventManager.cs
+++ b/OpenSim/Region/Framework/Scenes/EventManager.cs
@@ -55,8 +55,12 @@ namespace OpenSim.Region.Framework.Scenes
public delegate void OnTerrainTickDelegate();
+ public delegate void OnTerrainUpdateDelegate();
+
public event OnTerrainTickDelegate OnTerrainTick;
+ public event OnTerrainUpdateDelegate OnTerrainUpdate;
+
public delegate void OnBackupDelegate(IRegionDataStore datastore, bool forceBackup);
public event OnBackupDelegate OnBackup;
@@ -716,6 +720,26 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ public void TriggerTerrainUpdate()
+ {
+ OnTerrainUpdateDelegate handlerTerrainUpdate = OnTerrainUpdate;
+ if (handlerTerrainUpdate != null)
+ {
+ foreach (OnTerrainUpdateDelegate d in handlerTerrainUpdate.GetInvocationList())
+ {
+ try
+ {
+ d();
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat(
+ "[EVENT MANAGER]: Delegate for TriggerTerrainUpdate failed - continuing. {0} {1}",
+ e.Message, e.StackTrace);
+ }
+ }
+ }
+ }
public void TriggerTerrainTick()
{
--
cgit v1.1
From 19f18c8a1b6377fec44ebd358bb4d810d36bd586 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 27 Jun 2010 21:04:30 +0200
Subject: Make drag copy and copy-on-ray handle friends list perms properly
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 81ef54f..dfcbc4c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1851,6 +1851,28 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectGroup copy = original.Copy(AgentID, GroupID, true);
copy.AbsolutePosition = copy.AbsolutePosition + offset;
+ if (copy.OwnerID != AgentID)
+ {
+ copy.SetOwnerId(AgentID);
+ copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID);
+
+ List partList =
+ new List(copy.Children.Values);
+
+ if (m_parentScene.Permissions.PropagatePermissions())
+ {
+ foreach (SceneObjectPart child in partList)
+ {
+ child.Inventory.ChangeInventoryOwner(AgentID);
+ child.TriggerScriptChangedEvent(Changed.OWNER);
+ child.ApplyNextOwnerPermissions();
+ }
+ }
+
+ copy.RootPart.ObjectSaleType = 0;
+ copy.RootPart.SalePrice = 10;
+ }
+
Entities.Add(copy);
// Since we copy from a source group that is in selected
--
cgit v1.1
From 9c553cd254b5b27f3ddcffddee9684aeb4a6298b Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 27 Jun 2010 20:20:08 +0100
Subject: Fix more perms weirdness. Preserve "Locked" status across gives and
rez/take. Preserve "Anyone can move" flag in most cases.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 17 +++++++++--------
1 file changed, 9 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 55c1575..6532537 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -402,7 +402,7 @@ namespace OpenSim.Region.Framework.Scenes
// First, make sore base is limited to the next perms
itemCopy.BasePermissions = item.BasePermissions & (item.NextPermissions | (uint)PermissionMask.Move);
// By default, current equals base
- itemCopy.CurrentPermissions = itemCopy.BasePermissions;
+ itemCopy.CurrentPermissions = itemCopy.BasePermissions & item.CurrentPermissions;
// If this is an object, replace current perms
// with folded perms
@@ -413,7 +413,7 @@ namespace OpenSim.Region.Framework.Scenes
}
// Ensure there is no escalation
- itemCopy.CurrentPermissions &= item.NextPermissions;
+ itemCopy.CurrentPermissions &= (item.NextPermissions | (uint)PermissionMask.Move);
// Need slam bit on xfer
itemCopy.CurrentPermissions |= 8;
@@ -918,12 +918,13 @@ namespace OpenSim.Region.Framework.Scenes
{
agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
if (taskItem.InvType == (int)InventoryType.Object)
- agentItem.CurrentPermissions = agentItem.BasePermissions & ((taskItem.CurrentPermissions & 7) << 13);
- agentItem.CurrentPermissions = agentItem.BasePermissions ;
+ agentItem.CurrentPermissions = agentItem.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)PermissionMask.Move));
+ else
+ agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
agentItem.CurrentPermissions |= 8;
agentItem.NextPermissions = taskItem.NextPermissions;
- agentItem.EveryOnePermissions = taskItem.EveryonePermissions & taskItem.NextPermissions;
+ agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
}
else
@@ -1105,11 +1106,11 @@ namespace OpenSim.Region.Framework.Scenes
if (Permissions.PropagatePermissions())
{
destTaskItem.CurrentPermissions = srcTaskItem.CurrentPermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.GroupPermissions = srcTaskItem.GroupPermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.EveryonePermissions = srcTaskItem.EveryonePermissions &
- srcTaskItem.NextPermissions;
+ (srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.CurrentPermissions |= 8; // Slam!
--
cgit v1.1
From d570cffa39e9ca6417ebd1c05cbdfea1d3beabd2 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 28 Jun 2010 01:29:30 +0200
Subject: Fix Copy on Ray, Drag Copy and other little things. Removed the wrong
and nonworking ownership assignment in SOG, which messed things up before. No
longer trust the client to send the ID of the person something is copied as,
since it allows to run a script with someone else's permissions. Properly
adjust inventory ownership and perms.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 18 ++----------------
2 files changed, 3 insertions(+), 17 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index dfcbc4c..69a909b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1851,7 +1851,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectGroup copy = original.Copy(AgentID, GroupID, true);
copy.AbsolutePosition = copy.AbsolutePosition + offset;
- if (copy.OwnerID != AgentID)
+ if (original.OwnerID != AgentID)
{
copy.SetOwnerId(AgentID);
copy.SetRootPartOwner(copy.RootPart, AgentID, GroupID);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 7081ced..241295f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1781,7 +1781,9 @@ namespace OpenSim.Region.Framework.Scenes
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
if (!userExposed)
+ {
dupe.RootPart.IsAttachment = previousAttachmentStatus;
+ }
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
@@ -1806,16 +1808,6 @@ namespace OpenSim.Region.Framework.Scenes
dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
}
- // Now we've made a copy that replaces this one, we need to
- // switch the owner to the person who did the copying
- // Second Life copies an object and duplicates the first one in it's place
- // So, we have to make a copy of this one, set it in it's place then set the owner on this one
- if (userExposed)
- {
- SetRootPartOwner(m_rootPart, cAgentID, cGroupID);
- m_rootPart.ScheduleFullUpdate();
- }
-
List partList;
lockPartsForRead(true);
@@ -1837,12 +1829,6 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
newPart.LinkNum = part.LinkNum;
-
- if (userExposed)
- {
- SetPartOwner(newPart, cAgentID, cGroupID);
- newPart.ScheduleFullUpdate();
- }
}
}
--
cgit v1.1
From a817f6b48c27fe5e950846d687edcd4d375a3c6c Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 28 Jun 2010 01:48:24 +0200
Subject: Remove AgentID and GroupOD from the signature of SOG.Copy(). They
were never used, but made for a very mispleading read of the code in the
callers.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 69a909b..a36800b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1848,7 +1848,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_parentScene.Permissions.CanDuplicateObject(original.Children.Count, original.UUID, AgentID, original.AbsolutePosition))
{
- SceneObjectGroup copy = original.Copy(AgentID, GroupID, true);
+ SceneObjectGroup copy = original.Copy(true);
copy.AbsolutePosition = copy.AbsolutePosition + offset;
if (original.OwnerID != AgentID)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 241295f..c48ce3b 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1700,7 +1700,7 @@ namespace OpenSim.Region.Framework.Scenes
"[SCENE]: Storing {0}, {1} in {2}",
Name, UUID, m_scene.RegionInfo.RegionName);
- SceneObjectGroup backup_group = Copy(OwnerID, GroupID, false);
+ SceneObjectGroup backup_group = Copy(false);
backup_group.RootPart.Velocity = RootPart.Velocity;
backup_group.RootPart.Acceleration = RootPart.Acceleration;
backup_group.RootPart.AngularVelocity = RootPart.AngularVelocity;
@@ -1758,7 +1758,7 @@ namespace OpenSim.Region.Framework.Scenes
/// Duplicates this object, including operations such as physics set up and attaching to the backup event.
///
///
- public SceneObjectGroup Copy(UUID cAgentID, UUID cGroupID, bool userExposed)
+ public SceneObjectGroup Copy(bool userExposed)
{
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
dupe.m_isBackedUp = false;
@@ -3897,7 +3897,7 @@ namespace OpenSim.Region.Framework.Scenes
public virtual ISceneObject CloneForNewScene()
{
- SceneObjectGroup sog = Copy(this.OwnerID, this.GroupID, false);
+ SceneObjectGroup sog = Copy(false);
sog.m_isDeleted = false;
return sog;
}
--
cgit v1.1
From 6f4d4543b94f28160d697489e591da6614f0c8fc Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 29 Jun 2010 03:51:16 +0200
Subject: Make newly created prims be named "Object" and make newly created
scripts have a default touch handler. Compatibility patch
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 6532537..a2a8882 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1378,7 +1378,7 @@ namespace OpenSim.Region.Framework.Scenes
return;
AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType,
- Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"),
+ Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"),
remoteClient.AgentId);
AssetService.Store(asset);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 09c945b..5b007e6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -358,7 +358,7 @@ namespace OpenSim.Region.Framework.Scenes
UUID ownerID, PrimitiveBaseShape shape, Vector3 groupPosition,
Quaternion rotationOffset, Vector3 offsetPosition)
{
- m_name = "Primitive";
+ m_name = "Object";
Rezzed = DateTime.UtcNow;
_creationDate = (int)Utils.DateTimeToUnixTime(Rezzed);
@@ -1625,7 +1625,7 @@ namespace OpenSim.Region.Framework.Scenes
PrimitiveBaseShape shape = PrimitiveBaseShape.Create();
part.Shape = shape;
- part.Name = "Primitive";
+ part.Name = "Object";
part._ownerID = UUID.Random();
return part;
--
cgit v1.1
From 3cd717d929d641b8e34d2212165af8d32fc8978e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 29 Jun 2010 04:09:14 +0200
Subject: Comment the "Notecard saved" notification that pops up when a
notecard is saved into a prim. Sl doesn't have it, and for good reason: It
also happens on scripts in our version. Which is wrong. Better no message
than a wrong one.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index a2a8882..e61132e 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1285,7 +1285,7 @@ namespace OpenSim.Region.Framework.Scenes
}
if (part.Inventory.UpdateInventoryItem(itemInfo))
{
- remoteClient.SendAgentAlertMessage("Notecard saved", false);
+ // remoteClient.SendAgentAlertMessage("Notecard saved", false);
part.GetProperties(remoteClient);
}
}
--
cgit v1.1
From 3940a4dbc7ffb4eab319ea9c2f1f787ddeee65e8 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 1 Jul 2010 16:11:10 +0200
Subject: Avoid a spurious error message when taking a friend's no copy item
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 0ac427f..167e166 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1604,8 +1604,15 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
+ if (action == DeRezAction.TakeCopy)
+ {
+ if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId))
+ permissionToTakeCopy = false;
+ }
+ else
+ {
permissionToTakeCopy = false;
+ }
if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId))
permissionToTake = false;
--
cgit v1.1
From c87e6a289c5ab93025bf03f486629fd5aa00aaaa Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Fri, 2 Jul 2010 06:20:36 +0200
Subject: Clean up IMoneyModule and adjust the other modules to the changes
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 167e166..489b8ca 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Scenes
IMoneyModule money=RequestModuleInterface();
if (money != null)
{
- money.ApplyUploadCharge(agentID);
+ money.ApplyUploadCharge(agentID, money.UploadCharge, "Asset upload");
}
AddInventoryItem(agentID, item);
--
cgit v1.1
From fe2b044d38f3bd3aa669334d34567fd991a67b3e Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sat, 3 Jul 2010 06:10:55 -0700
Subject: Fix Undo! Made a lot of changes to Undo state saving; it now
considers that groups of objects can be moved and not just individual prims..
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 39 ++++++++++-----
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 16 ++++++-
OpenSim/Region/Framework/Scenes/UndoState.cs | 55 ++++++++++++++++++----
3 files changed, 87 insertions(+), 23 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index c48ce3b..da664da 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -349,7 +349,21 @@ namespace OpenSim.Region.Framework.Scenes
public virtual Quaternion Rotation
{
get { return m_rotation; }
- set { m_rotation = value; }
+ set {
+ lockPartsForRead(true);
+ try
+ {
+ foreach(SceneObjectPart p in m_parts.Values)
+ {
+ p.StoreUndoState(true);
+ }
+ }
+ finally
+ {
+ lockPartsForRead(false);
+ }
+ m_rotation = value;
+ }
}
public Quaternion GroupRotation
@@ -421,6 +435,7 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_rootPart.GroupPosition; }
set
{
+
Vector3 val = value;
if ((m_scene.TestBorderCross(val - Vector3.UnitX, Cardinals.E) || m_scene.TestBorderCross(val + Vector3.UnitX, Cardinals.W)
@@ -431,7 +446,10 @@ namespace OpenSim.Region.Framework.Scenes
}
lockPartsForRead(true);
-
+ foreach (SceneObjectPart part in m_parts.Values)
+ {
+ part.IgnoreUndoUpdate = true;
+ }
if (RootPart.GetStatusSandbox())
{
if (Util.GetDistanceTo(RootPart.StatusSandboxPos, value) > 10)
@@ -443,12 +461,12 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
}
-
foreach (SceneObjectPart part in m_parts.Values)
{
+ part.IgnoreUndoUpdate = false;
+ part.StoreUndoState(true);
part.GroupPosition = val;
}
-
lockPartsForRead(false);
//if (m_rootPart.PhysActor != null)
@@ -724,7 +742,6 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart part in m_parts.Values)
{
-
Vector3 partscale = part.Scale;
Vector3 partoffset = part.OffsetPosition;
@@ -3132,7 +3149,6 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = GetChildPart(localID);
if (part != null)
{
- part.IgnoreUndoUpdate = true;
if (scale.X > m_scene.m_maxNonphys)
scale.X = m_scene.m_maxNonphys;
if (scale.Y > m_scene.m_maxNonphys)
@@ -3218,8 +3234,7 @@ namespace OpenSim.Region.Framework.Scenes
y *= a;
z *= a;
}
- obPart.IgnoreUndoUpdate = false;
- obPart.StoreUndoState();
+
}
}
}
@@ -3229,13 +3244,17 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 prevScale = part.Scale;
prevScale.X *= x;
prevScale.Y *= y;
- prevScale.Z *= z;
+ prevScale.Z *= z;;
+ part.IgnoreUndoUpdate = true;
part.Resize(prevScale);
+ part.IgnoreUndoUpdate = false;
lockPartsForRead(true);
{
foreach (SceneObjectPart obPart in m_parts.Values)
{
+ obPart.IgnoreUndoUpdate = false;
+ obPart.StoreUndoState(true);
obPart.IgnoreUndoUpdate = true;
if (obPart.UUID != m_rootPart.UUID)
{
@@ -3251,7 +3270,6 @@ namespace OpenSim.Region.Framework.Scenes
obPart.UpdateOffSet(currentpos);
}
obPart.IgnoreUndoUpdate = false;
- obPart.StoreUndoState();
}
}
lockPartsForRead(false);
@@ -3263,7 +3281,6 @@ namespace OpenSim.Region.Framework.Scenes
}
part.IgnoreUndoUpdate = false;
- part.StoreUndoState();
HasGroupChanged = true;
ScheduleGroupForTerseUpdate();
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 5b007e6..72ad281 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3504,9 +3504,12 @@ namespace OpenSim.Region.Framework.Scenes
m_parentGroup.ScheduleGroupForTerseUpdate();
//m_parentGroup.ScheduleGroupForFullUpdate();
}
-
public void StoreUndoState()
{
+ StoreUndoState(false);
+ }
+ public void StoreUndoState(bool group)
+ {
if (!Undoing)
{
if (!IgnoreUndoUpdate)
@@ -3528,7 +3531,7 @@ namespace OpenSim.Region.Framework.Scenes
if (m_parentGroup.GetSceneMaxUndo() > 0)
{
UndoState nUndo = new UndoState(this);
-
+ nUndo.GroupChange = group;
m_undo.Push(nUndo);
}
@@ -4010,6 +4013,15 @@ namespace OpenSim.Region.Framework.Scenes
nUndo = new UndoState(this);
}
UndoState goback = m_undo.Pop();
+ m_log.Debug("Got goback");
+ if (goback == null)
+ {
+ m_log.Debug("it's null");
+ }
+ else
+ {
+ m_log.Debug(goback.GroupPosition.ToString());
+ }
if (goback != null)
{
goback.PlaybackState(this);
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 55e407e..77381ab 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -35,6 +35,10 @@ namespace OpenSim.Region.Framework.Scenes
public Vector3 Position = Vector3.Zero;
public Vector3 Scale = Vector3.Zero;
public Quaternion Rotation = Quaternion.Identity;
+ public bool GroupChange = false;
+ public Vector3 GroupPosition = Vector3.Zero;
+ public Quaternion GroupRotation = Quaternion.Identity;
+ public Vector3 GroupScale = Vector3.Zero;
public UndoState(SceneObjectPart part)
{
@@ -42,12 +46,24 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part.ParentID == 0)
{
- Position = part.ParentGroup.AbsolutePosition;
+ GroupScale = part.Shape.Scale;
+
+ //FUBAR WARNING: Do NOT get the group's absoluteposition here
+ //or you'll experience a loop and/or a stack issue
+ GroupPosition = part.ParentGroup.RootPart.AbsolutePosition;
+ GroupRotation = part.ParentGroup.Rotation;
+ Position = part.ParentGroup.RootPart.AbsolutePosition;
Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
}
else
{
+ GroupScale = part.Shape.Scale;
+
+ //FUBAR WARNING: Do NOT get the group's absoluteposition here
+ //or you'll experience a loop and/or a stack issue
+ GroupPosition = part.ParentGroup.RootPart.AbsolutePosition;
+ GroupRotation = part.ParentGroup.Rotation;
Position = part.OffsetPosition;
Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
@@ -61,14 +77,14 @@ namespace OpenSim.Region.Framework.Scenes
{
if (part.ParentID == 0)
{
- if (Position == part.ParentGroup.AbsolutePosition && Rotation == part.ParentGroup.Rotation)
+ if (Position == part.ParentGroup.RootPart.AbsolutePosition && Rotation == part.ParentGroup.Rotation && GroupPosition == part.ParentGroup.RootPart.AbsolutePosition && part.ParentGroup.Rotation == GroupRotation && part.Shape.Scale == GroupScale)
return true;
else
return false;
}
else
{
- if (Position == part.OffsetPosition && Rotation == part.RotationOffset && Scale == part.Shape.Scale)
+ if (Position == part.OffsetPosition && Rotation == part.RotationOffset && Scale == part.Shape.Scale && GroupPosition == part.ParentGroup.RootPart.AbsolutePosition && part.ParentGroup.Rotation == GroupRotation && part.Shape.Scale == GroupScale)
return true;
else
return false;
@@ -84,10 +100,10 @@ namespace OpenSim.Region.Framework.Scenes
{
part.Undoing = true;
- if (part.ParentID == 0)
+ if (part.ParentID == 0 && GroupChange == false)
{
if (Position != Vector3.Zero)
- part.ParentGroup.AbsolutePosition = Position;
+ part.ParentGroup.AbsolutePosition = Position;
part.RotationOffset = Rotation;
if (Scale != Vector3.Zero)
part.Resize(Scale);
@@ -95,11 +111,30 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
- if (Position != Vector3.Zero)
- part.OffsetPosition = Position;
- part.UpdateRotation(Rotation);
- if (Scale != Vector3.Zero)
- part.Resize(Scale); part.ScheduleTerseUpdate();
+ if (GroupChange)
+ {
+ if (Position != Vector3.Zero)
+ {
+ //Calculate the scale...
+ Vector3 gs = part.Shape.Scale;
+ float scale = GroupScale.Z / gs.Z;
+
+ //Scale first since it can affect our position
+ part.ParentGroup.GroupResize(gs * scale, part.LocalId);
+ part.ParentGroup.AbsolutePosition = GroupPosition;
+ part.ParentGroup.Rotation = GroupRotation;
+
+ }
+ }
+ else
+ {
+ if (Position != Vector3.Zero) //We can use this for all the updates since all are set
+ {
+ part.OffsetPosition = Position;
+ part.UpdateRotation(Rotation);
+ part.Resize(Scale); part.ScheduleTerseUpdate();
+ }
+ }
}
part.Undoing = false;
--
cgit v1.1
From edcfaf60c99b7cde324621c2ffcfbb16e4eb4c5e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 3 Jul 2010 20:27:00 +0200
Subject: Fix IMs the right way. This sets it up so that timestamps are
actually in PST (to match viewer time), does correct storage and retrieval of
IMs, corrects the session ID and makes sure IMs don't get marked "saved" if
they're live. Removes the group IM save option, which our group IM module
never had in the first place, as saving group chatter makes no sense at all.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4a4cac9..e51d9ee 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3730,8 +3730,11 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
{
CollidingMessage.Colliders = colliding;
- foreach (SceneObjectGroup att in Attachments)
- Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup att in m_attachments)
+ Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
+ }
}
}
--
cgit v1.1
From 5b68343361cbd000a2f024b37797ec235abb7207 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 4 Jul 2010 19:28:39 -0700
Subject: The majority of the Undo fix. There is still an issue with Rotation
which i'll address next; however position undo and scale undo should be
working just fine now. Also removed some residual debug logging.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 38 +++++-----
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 61 ++++++++---------
.../Scenes/Serialization/SceneObjectSerializer.cs | 4 +-
OpenSim/Region/Framework/Scenes/UndoState.cs | 80 ++++++++++++++++++++--
4 files changed, 127 insertions(+), 56 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index da664da..34712b8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -355,7 +355,7 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach(SceneObjectPart p in m_parts.Values)
{
- p.StoreUndoState(true);
+ p.StoreUndoState(UndoType.STATE_GROUP_ROTATION);
}
}
finally
@@ -435,7 +435,6 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_rootPart.GroupPosition; }
set
{
-
Vector3 val = value;
if ((m_scene.TestBorderCross(val - Vector3.UnitX, Cardinals.E) || m_scene.TestBorderCross(val + Vector3.UnitX, Cardinals.W)
@@ -464,7 +463,7 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in m_parts.Values)
{
part.IgnoreUndoUpdate = false;
- part.StoreUndoState(true);
+ part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
part.GroupPosition = val;
}
lockPartsForRead(false);
@@ -1488,7 +1487,7 @@ namespace OpenSim.Region.Framework.Scenes
public virtual void OnGrabPart(SceneObjectPart part, Vector3 offsetPos, IClientAPI remoteClient)
{
- part.StoreUndoState();
+ part.StoreUndoState(UndoType.STATE_PRIM_ALL);
part.OnGrab(offsetPos, remoteClient);
}
@@ -3245,6 +3244,9 @@ namespace OpenSim.Region.Framework.Scenes
prevScale.X *= x;
prevScale.Y *= y;
prevScale.Z *= z;;
+
+ part.IgnoreUndoUpdate = false;
+ part.StoreUndoState(UndoType.STATE_GROUP_SCALE);
part.IgnoreUndoUpdate = true;
part.Resize(prevScale);
part.IgnoreUndoUpdate = false;
@@ -3253,11 +3255,12 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart obPart in m_parts.Values)
{
- obPart.IgnoreUndoUpdate = false;
- obPart.StoreUndoState(true);
- obPart.IgnoreUndoUpdate = true;
if (obPart.UUID != m_rootPart.UUID)
{
+ obPart.IgnoreUndoUpdate = false;
+ obPart.StoreUndoState(UndoType.STATE_GROUP_SCALE);
+ obPart.IgnoreUndoUpdate = true;
+
Vector3 currentpos = new Vector3(obPart.OffsetPosition);
currentpos.X *= x;
currentpos.Y *= y;
@@ -3296,14 +3299,11 @@ namespace OpenSim.Region.Framework.Scenes
///
public void UpdateGroupPosition(Vector3 pos)
{
- foreach (SceneObjectPart part in Children.Values)
- {
- part.StoreUndoState();
- }
if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
{
if (IsAttachment)
{
+ m_rootPart.StoreUndoState(UndoType.STATE_GROUP_POSITION);
m_rootPart.AttachedPos = pos;
}
if (RootPart.GetStatusSandbox())
@@ -3336,7 +3336,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = GetChildPart(localID);
foreach (SceneObjectPart parts in Children.Values)
{
- parts.StoreUndoState();
+ parts.StoreUndoState(UndoType.STATE_PRIM_POSITION);
}
if (part != null)
{
@@ -3361,7 +3361,7 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart part in Children.Values)
{
- part.StoreUndoState();
+ part.StoreUndoState(UndoType.STATE_PRIM_POSITION);
}
Vector3 newPos = new Vector3(pos.X, pos.Y, pos.Z);
Vector3 oldPos =
@@ -3409,7 +3409,7 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart parts in Children.Values)
{
- parts.StoreUndoState();
+ parts.StoreUndoState(UndoType.STATE_GROUP_ROTATION);
}
m_rootPart.UpdateRotation(rot);
@@ -3433,7 +3433,7 @@ namespace OpenSim.Region.Framework.Scenes
{
foreach (SceneObjectPart parts in Children.Values)
{
- parts.StoreUndoState();
+ parts.StoreUndoState(UndoType.STATE_GROUP_ROTATION);
}
m_rootPart.UpdateRotation(rot);
@@ -3460,7 +3460,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart part = GetChildPart(localID);
foreach (SceneObjectPart parts in Children.Values)
{
- parts.StoreUndoState();
+ parts.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
}
if (part != null)
{
@@ -3496,7 +3496,7 @@ namespace OpenSim.Region.Framework.Scenes
part.UpdateRotation(rot);
part.OffsetPosition = pos;
part.IgnoreUndoUpdate = false;
- part.StoreUndoState();
+ part.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
}
}
}
@@ -3510,7 +3510,7 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion axRot = rot;
Quaternion oldParentRot = m_rootPart.RotationOffset;
- m_rootPart.StoreUndoState();
+ m_rootPart.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
m_rootPart.UpdateRotation(rot);
if (m_rootPart.PhysActor != null)
{
@@ -3542,7 +3542,7 @@ namespace OpenSim.Region.Framework.Scenes
if (childpart != m_rootPart)
{
childpart.IgnoreUndoUpdate = false;
- childpart.StoreUndoState();
+ childpart.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 72ad281..93a23ca 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -697,7 +697,7 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_offsetPosition; }
set
{
- StoreUndoState();
+ StoreUndoState(UndoType.STATE_PRIM_POSITION);
m_offsetPosition = value;
if (ParentGroup != null && !ParentGroup.IsDeleted)
@@ -759,7 +759,7 @@ namespace OpenSim.Region.Framework.Scenes
set
{
- StoreUndoState();
+ StoreUndoState(UndoType.STATE_PRIM_ROTATION);
m_rotationOffset = value;
PhysicsActor actor = PhysActor;
@@ -958,7 +958,7 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_shape.Scale; }
set
{
- StoreUndoState();
+ StoreUndoState(UndoType.STATE_PRIM_SCALE);
if (m_shape != null)
{
m_shape.Scale = value;
@@ -1522,7 +1522,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_redo.Clear();
}
- StoreUndoState();
+ StoreUndoState(UndoType.STATE_ALL);
}
public byte ConvertScriptUintToByte(uint indata)
@@ -2721,7 +2721,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void Resize(Vector3 scale)
{
- StoreUndoState();
+ StoreUndoState(UndoType.STATE_PRIM_SCALE);
m_shape.Scale = scale;
ParentGroup.HasGroupChanged = true;
@@ -3504,13 +3504,11 @@ namespace OpenSim.Region.Framework.Scenes
m_parentGroup.ScheduleGroupForTerseUpdate();
//m_parentGroup.ScheduleGroupForFullUpdate();
}
- public void StoreUndoState()
+ public void StoreUndoState(UndoType type)
{
- StoreUndoState(false);
- }
- public void StoreUndoState(bool group)
- {
- if (!Undoing)
+
+
+ if (!Undoing && (m_parentGroup == null || m_parentGroup.RootPart == null || !m_parentGroup.RootPart.Undoing))
{
if (!IgnoreUndoUpdate)
{
@@ -3521,17 +3519,25 @@ namespace OpenSim.Region.Framework.Scenes
if (m_undo.Count > 0)
{
UndoState last = m_undo.Peek();
- if (last != null)
- {
- if (last.Compare(this))
- return;
- }
+
}
if (m_parentGroup.GetSceneMaxUndo() > 0)
{
- UndoState nUndo = new UndoState(this);
- nUndo.GroupChange = group;
+ UndoState lastUndo = m_undo.Peek();
+
+ UndoState nUndo = new UndoState(this, type);
+
+ if (lastUndo != null)
+ {
+ TimeSpan ts = DateTime.Now.Subtract(lastUndo.LastUpdated);
+ if (ts.TotalMilliseconds < 500)
+ {
+ //Delete the last entry since it was less than 500 milliseconds ago
+ nUndo.Merge(lastUndo);
+ m_undo.Pop();
+ }
+ }
m_undo.Push(nUndo);
}
@@ -4008,20 +4014,13 @@ namespace OpenSim.Region.Framework.Scenes
if (m_undo.Count > 0)
{
UndoState nUndo = null;
- if (m_parentGroup.GetSceneMaxUndo() > 0)
- {
- nUndo = new UndoState(this);
- }
UndoState goback = m_undo.Pop();
- m_log.Debug("Got goback");
- if (goback == null)
- {
- m_log.Debug("it's null");
- }
- else
+ if (m_parentGroup.GetSceneMaxUndo() > 0)
{
- m_log.Debug(goback.GroupPosition.ToString());
+ nUndo = new UndoState(this, goback.Type);
}
+
+
if (goback != null)
{
goback.PlaybackState(this);
@@ -4036,13 +4035,13 @@ namespace OpenSim.Region.Framework.Scenes
{
lock (m_redo)
{
+ UndoState gofwd = m_redo.Pop();
if (m_parentGroup.GetSceneMaxUndo() > 0)
{
- UndoState nUndo = new UndoState(this);
+ UndoState nUndo = new UndoState(this, gofwd.Type);
m_undo.Push(nUndo);
}
- UndoState gofwd = m_redo.Pop();
if (gofwd != null)
gofwd.PlayfwdState(this);
}
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 5bdaa17..77e477f 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -105,7 +105,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
sceneObject.AddPart(part);
part.LinkNum = linkNum;
part.TrimPermissions();
- part.StoreUndoState();
+ part.StoreUndoState(UndoType.STATE_ALL);
reader.Close();
sr.Close();
}
@@ -231,7 +231,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
if (originalLinkNum != 0)
part.LinkNum = originalLinkNum;
- part.StoreUndoState();
+ part.StoreUndoState(UndoType.STATE_ALL);
reader.Close();
sr.Close();
}
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 77381ab..ad05351 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -27,26 +27,43 @@
using OpenMetaverse;
using OpenSim.Region.Framework.Interfaces;
+using System;
namespace OpenSim.Region.Framework.Scenes
{
+ [Flags]
+ public enum UndoType
+ {
+ STATE_PRIM_POSITION = 1,
+ STATE_PRIM_ROTATION = 2,
+ STATE_PRIM_SCALE = 4,
+ STATE_PRIM_ALL = 7,
+ STATE_GROUP_POSITION = 8,
+ STATE_GROUP_ROTATION = 16,
+ STATE_GROUP_SCALE = 32,
+ STATE_GROUP_ALL = 56,
+ STATE_ALL = 63
+ }
+
public class UndoState
{
public Vector3 Position = Vector3.Zero;
public Vector3 Scale = Vector3.Zero;
public Quaternion Rotation = Quaternion.Identity;
- public bool GroupChange = false;
public Vector3 GroupPosition = Vector3.Zero;
public Quaternion GroupRotation = Quaternion.Identity;
public Vector3 GroupScale = Vector3.Zero;
+ public DateTime LastUpdated = DateTime.Now;
+ public UndoType Type;
- public UndoState(SceneObjectPart part)
+ public UndoState(SceneObjectPart part, UndoType type)
{
+ Type = type;
if (part != null)
{
if (part.ParentID == 0)
{
- GroupScale = part.Shape.Scale;
+ GroupScale = part.ParentGroup.RootPart.Shape.Scale;
//FUBAR WARNING: Do NOT get the group's absoluteposition here
//or you'll experience a loop and/or a stack issue
@@ -55,6 +72,7 @@ namespace OpenSim.Region.Framework.Scenes
Position = part.ParentGroup.RootPart.AbsolutePosition;
Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
+ LastUpdated = DateTime.Now;
}
else
{
@@ -67,10 +85,54 @@ namespace OpenSim.Region.Framework.Scenes
Position = part.OffsetPosition;
Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
+ LastUpdated = DateTime.Now;
}
}
}
-
+ public void Merge(UndoState last)
+ {
+ if ((Type & UndoType.STATE_GROUP_POSITION) == 0 || ((last.Type & UndoType.STATE_GROUP_POSITION) >= (Type & UndoType.STATE_GROUP_POSITION)))
+ {
+ GroupPosition = last.GroupPosition;
+ Position = last.Position;
+ }
+ if ((Type & UndoType.STATE_GROUP_SCALE) == 0 || ((last.Type & UndoType.STATE_GROUP_SCALE) >= (Type & UndoType.STATE_GROUP_SCALE)))
+ {
+ Console.WriteLine("Setting groupscale to " + last.GroupScale.ToString());
+ GroupScale = last.GroupScale;
+ Scale = last.Scale;
+ }
+ if ((Type & UndoType.STATE_GROUP_ROTATION) == 0 || ((last.Type & UndoType.STATE_GROUP_ROTATION) >= (Type & UndoType.STATE_GROUP_ROTATION)))
+ {
+ GroupRotation = last.GroupRotation;
+ Rotation = last.Rotation;
+ }
+ if ((Type & UndoType.STATE_PRIM_POSITION) == 0 || ((last.Type & UndoType.STATE_PRIM_POSITION) >= (Type & UndoType.STATE_PRIM_POSITION)))
+ {
+ Position = last.Position;
+ }
+ if ((Type & UndoType.STATE_PRIM_SCALE) == 0 || ((last.Type & UndoType.STATE_PRIM_SCALE) >= (Type & UndoType.STATE_PRIM_SCALE)))
+ {
+ Scale = last.Scale;
+ }
+ if ((Type & UndoType.STATE_PRIM_ROTATION) == 0 || ((last.Type & UndoType.STATE_PRIM_ROTATION) >= (Type & UndoType.STATE_PRIM_ROTATION)))
+ {
+ Rotation = last.Rotation;
+ }
+ Type = Type | last.Type;
+ }
+ public bool Compare(UndoState undo)
+ {
+ if (undo == null || Position == null) return false;
+ if (undo.Position == Position && undo.Rotation == Rotation && undo.Scale == Scale && undo.GroupPosition == GroupPosition && undo.GroupScale == GroupScale && undo.GroupRotation == GroupRotation)
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
public bool Compare(SceneObjectPart part)
{
if (part != null)
@@ -96,6 +158,14 @@ namespace OpenSim.Region.Framework.Scenes
public void PlaybackState(SceneObjectPart part)
{
+ bool GroupChange = false;
+ if ((Type & UndoType.STATE_GROUP_POSITION) != 0
+ || (Type & UndoType.STATE_GROUP_ROTATION) != 0
+ || (Type & UndoType.STATE_GROUP_SCALE) != 0)
+ {
+ GroupChange = true;
+ }
+
if (part != null)
{
part.Undoing = true;
@@ -113,6 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (GroupChange)
{
+ part.ParentGroup.RootPart.Undoing = true;
if (Position != Vector3.Zero)
{
//Calculate the scale...
@@ -125,6 +196,7 @@ namespace OpenSim.Region.Framework.Scenes
part.ParentGroup.Rotation = GroupRotation;
}
+ part.ParentGroup.RootPart.Undoing = false;
}
else
{
--
cgit v1.1
From c616335019dc9419460407930af4e40e84663efa Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 4 Jul 2010 19:58:52 -0700
Subject: Rotation undo fix and remove a debug chatter i missed. Still not
working: Individual child prim rotational undo and special cases where the
root prim was moved or rotated (all the children then need to restore their
offsets). Coming shortly.
---
OpenSim/Region/Framework/Scenes/UndoState.cs | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index ad05351..f9601e6 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -68,7 +68,7 @@ namespace OpenSim.Region.Framework.Scenes
//FUBAR WARNING: Do NOT get the group's absoluteposition here
//or you'll experience a loop and/or a stack issue
GroupPosition = part.ParentGroup.RootPart.AbsolutePosition;
- GroupRotation = part.ParentGroup.Rotation;
+ GroupRotation = part.ParentGroup.GroupRotation;
Position = part.ParentGroup.RootPart.AbsolutePosition;
Rotation = part.RotationOffset;
Scale = part.Shape.Scale;
@@ -98,7 +98,6 @@ namespace OpenSim.Region.Framework.Scenes
}
if ((Type & UndoType.STATE_GROUP_SCALE) == 0 || ((last.Type & UndoType.STATE_GROUP_SCALE) >= (Type & UndoType.STATE_GROUP_SCALE)))
{
- Console.WriteLine("Setting groupscale to " + last.GroupScale.ToString());
GroupScale = last.GroupScale;
Scale = last.Scale;
}
@@ -184,7 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
if (GroupChange)
{
part.ParentGroup.RootPart.Undoing = true;
- if (Position != Vector3.Zero)
+ if (GroupPosition != Vector3.Zero)
{
//Calculate the scale...
Vector3 gs = part.Shape.Scale;
@@ -193,7 +192,7 @@ namespace OpenSim.Region.Framework.Scenes
//Scale first since it can affect our position
part.ParentGroup.GroupResize(gs * scale, part.LocalId);
part.ParentGroup.AbsolutePosition = GroupPosition;
- part.ParentGroup.Rotation = GroupRotation;
+ part.ParentGroup.UpdateGroupRotationR(GroupRotation);
}
part.ParentGroup.RootPart.Undoing = false;
--
cgit v1.1
From 8849b9af8bd3260152dede0ccf61fd98137ef6c5 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 4 Jul 2010 20:45:11 -0700
Subject: Fix single prim rotation undo. All UNDO functions are now working
correctly except for when the root prim is moved or rotated as a single prim
(coming soon).
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 34712b8..7492601 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3492,11 +3492,11 @@ namespace OpenSim.Region.Framework.Scenes
}
else
{
+ part.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
part.IgnoreUndoUpdate = true;
part.UpdateRotation(rot);
part.OffsetPosition = pos;
part.IgnoreUndoUpdate = false;
- part.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
}
}
}
--
cgit v1.1
From be5dd04150bae69745de3cf5efde3d5be288dd71 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Mon, 5 Jul 2010 03:58:18 -0700
Subject: Bring "Redo" up to date with "Undo" so it works too
---
OpenSim/Region/Framework/Scenes/UndoState.cs | 41 +++++++---------------------
1 file changed, 10 insertions(+), 31 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index f9601e6..2af3316 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -123,7 +123,7 @@ namespace OpenSim.Region.Framework.Scenes
public bool Compare(UndoState undo)
{
if (undo == null || Position == null) return false;
- if (undo.Position == Position && undo.Rotation == Rotation && undo.Scale == Scale && undo.GroupPosition == GroupPosition && undo.GroupScale == GroupScale && undo.GroupRotation == GroupRotation)
+ if (undo.Position == Position && undo.Rotation == Rotation && undo.Scale == Scale && undo.GroupPosition == GroupPosition && undo.GroupScale == GroupScale && undo.GroupRotation == GroupRotation)
{
return true;
}
@@ -155,7 +155,7 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
- public void PlaybackState(SceneObjectPart part)
+ private void RestoreState(SceneObjectPart part)
{
bool GroupChange = false;
if ((Type & UndoType.STATE_GROUP_POSITION) != 0
@@ -172,7 +172,7 @@ namespace OpenSim.Region.Framework.Scenes
if (part.ParentID == 0 && GroupChange == false)
{
if (Position != Vector3.Zero)
- part.ParentGroup.AbsolutePosition = Position;
+ part.ParentGroup.AbsolutePosition = Position;
part.RotationOffset = Rotation;
if (Scale != Vector3.Zero)
part.Resize(Scale);
@@ -193,7 +193,7 @@ namespace OpenSim.Region.Framework.Scenes
part.ParentGroup.GroupResize(gs * scale, part.LocalId);
part.ParentGroup.AbsolutePosition = GroupPosition;
part.ParentGroup.UpdateGroupRotationR(GroupRotation);
-
+
}
part.ParentGroup.RootPart.Undoing = false;
}
@@ -211,35 +211,13 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ public void PlaybackState(SceneObjectPart part)
+ {
+ RestoreState(part);
+ }
public void PlayfwdState(SceneObjectPart part)
{
- if (part != null)
- {
- part.Undoing = true;
-
- if (part.ParentID == 0)
- {
- if (Position != Vector3.Zero)
- part.ParentGroup.AbsolutePosition = Position;
- if (Rotation != Quaternion.Identity)
- part.UpdateRotation(Rotation);
- if (Scale != Vector3.Zero)
- part.Resize(Scale);
- part.ParentGroup.ScheduleGroupForTerseUpdate();
- }
- else
- {
- if (Position != Vector3.Zero)
- part.OffsetPosition = Position;
- if (Rotation != Quaternion.Identity)
- part.UpdateRotation(Rotation);
- if (Scale != Vector3.Zero)
- part.Resize(Scale);
- part.ScheduleTerseUpdate();
- }
- part.Undoing = false;
-
- }
+ RestoreState(part);
}
}
public class LandUndoState
@@ -267,3 +245,4 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+
--
cgit v1.1
From e947d04038f7b42929368d9f7b6d440be139e675 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Mon, 5 Jul 2010 05:44:35 -0700
Subject: Undo fix is now complete. This commit repairs the special case of the
root prim moving or rotating independently of the rest of the group.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 49 +++++++++++++++++-----
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 -
OpenSim/Region/Framework/Scenes/UndoState.cs | 5 ++-
3 files changed, 41 insertions(+), 15 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 7492601..f85d3d9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3386,10 +3386,27 @@ namespace OpenSim.Region.Framework.Scenes
}
lockPartsForRead(false);
- AbsolutePosition = newPos;
+ //We have to set undoing here because otherwise an undo state will be saved
+ if (!m_rootPart.Undoing)
+ {
+ m_rootPart.Undoing = true;
+ AbsolutePosition = newPos;
+ m_rootPart.Undoing = false;
+ }
+ else
+ {
+ AbsolutePosition = newPos;
+ }
HasGroupChanged = true;
- ScheduleGroupForTerseUpdate();
+ if (m_rootPart.Undoing)
+ {
+ ScheduleGroupForFullUpdate();
+ }
+ else
+ {
+ ScheduleGroupForTerseUpdate();
+ }
}
public void OffsetForNewRegion(Vector3 offset)
@@ -3488,7 +3505,16 @@ namespace OpenSim.Region.Framework.Scenes
if (part.UUID == m_rootPart.UUID)
{
UpdateRootRotation(rot);
- AbsolutePosition = pos;
+ if (!m_rootPart.Undoing)
+ {
+ m_rootPart.Undoing = true;
+ AbsolutePosition = pos;
+ m_rootPart.Undoing = false;
+ }
+ else
+ {
+ AbsolutePosition = pos;
+ }
}
else
{
@@ -3511,6 +3537,12 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion oldParentRot = m_rootPart.RotationOffset;
m_rootPart.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
+ bool cancelUndo = false;
+ if (!m_rootPart.Undoing)
+ {
+ m_rootPart.Undoing = true;
+ cancelUndo = true;
+ }
m_rootPart.UpdateRotation(rot);
if (m_rootPart.PhysActor != null)
{
@@ -3534,18 +3566,13 @@ namespace OpenSim.Region.Framework.Scenes
newRot *= Quaternion.Inverse(axRot);
prim.RotationOffset = newRot;
prim.ScheduleTerseUpdate();
+ prim.IgnoreUndoUpdate = false;
}
}
-
- foreach (SceneObjectPart childpart in Children.Values)
+ if (cancelUndo == true)
{
- if (childpart != m_rootPart)
- {
- childpart.IgnoreUndoUpdate = false;
- childpart.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
- }
+ m_rootPart.Undoing = false;
}
-
lockPartsForRead(false);
m_rootPart.ScheduleTerseUpdate();
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 93a23ca..3327b1e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3506,8 +3506,6 @@ namespace OpenSim.Region.Framework.Scenes
}
public void StoreUndoState(UndoType type)
{
-
-
if (!Undoing && (m_parentGroup == null || m_parentGroup.RootPart == null || !m_parentGroup.RootPart.Undoing))
{
if (!IgnoreUndoUpdate)
diff --git a/OpenSim/Region/Framework/Scenes/UndoState.cs b/OpenSim/Region/Framework/Scenes/UndoState.cs
index 2af3316..f71b507 100644
--- a/OpenSim/Region/Framework/Scenes/UndoState.cs
+++ b/OpenSim/Region/Framework/Scenes/UndoState.cs
@@ -172,8 +172,9 @@ namespace OpenSim.Region.Framework.Scenes
if (part.ParentID == 0 && GroupChange == false)
{
if (Position != Vector3.Zero)
- part.ParentGroup.AbsolutePosition = Position;
- part.RotationOffset = Rotation;
+
+ part.ParentGroup.UpdateSinglePosition(Position, part.LocalId);
+ part.ParentGroup.UpdateSingleRotation(Rotation, part.LocalId);
if (Scale != Vector3.Zero)
part.Resize(Scale);
part.ParentGroup.ScheduleGroupForTerseUpdate();
--
cgit v1.1
From 8aa5f30082f667fc23ccfdb839e04ba8b72f872c Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sat, 10 Jul 2010 10:51:49 +0200
Subject: Make taken items go back to the folder they came from
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 +++
1 file changed, 3 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 3327b1e..b552cdc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -180,6 +180,9 @@ namespace OpenSim.Region.Framework.Scenes
public UUID FromItemID;
[XmlIgnore]
+ public UUID FromFolderID;
+
+ [XmlIgnore]
public int STATUS_ROTATE_X;
[XmlIgnore]
--
cgit v1.1
From 7f0f11304f0979355d75538ab7326b687b62e76e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 11 Jul 2010 14:26:57 +0200
Subject: Add scripted controllers into agent intersim messaging
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 4 +++
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 33 ++++++++++++++++++++++
2 files changed, 37 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index b552cdc..e87766e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4145,6 +4145,10 @@ namespace OpenSim.Region.Framework.Scenes
case 16:
_nextOwnerMask = ApplyMask(_nextOwnerMask, set, mask) &
baseMask;
+ // Prevent the client from creating no mod, no copy
+ // objects
+ if ((_nextOwnerMask & (uint)PermissionMask.Copy) == 0)
+ _nextOwnerMask |= (uint)PermissionMask.Transfer;
break;
}
SendFullUpdateToAllClients();
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5ac7755..efe3365 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3365,6 +3365,18 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
cAgent.Attachments = attachs;
}
+ lock (scriptedcontrols)
+ {
+ ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
+ int i = 0;
+
+ foreach (ScriptControllers c in scriptedcontrols.Values)
+ {
+ controls[i++] = new ControllerData(c.itemID, (uint)c.ignoreControls, (uint)c.eventControls);
+ }
+ cAgent.Controllers = controls;
+ }
+
// Animations
try
{
@@ -3446,6 +3458,27 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
}
catch { }
+ try
+ {
+ lock (scriptedcontrols)
+ {
+ if (cAgent.Controllers != null)
+ {
+ scriptedcontrols.Clear();
+
+ foreach (ControllerData c in cAgent.Controllers)
+ {
+ ScriptControllers sc = new ScriptControllers();
+ sc.itemID = c.ItemID;
+ sc.ignoreControls = (ScriptControlled)c.IgnoreControls;
+ sc.eventControls = (ScriptControlled)c.EventControls;
+
+ scriptedcontrols[sc.itemID] = sc;
+ }
+ }
+ }
+ }
+ catch { }
// Animations
try
{
--
cgit v1.1
From 5f4105d48c9776423a730e6480a2587bd64550a5 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Mon, 12 Jul 2010 13:55:56 -0700
Subject: Removed the CHANGED_COLOR event post from the Color accessor in SOP.
This is not the correct usage of this changed event - it's only supposed to
be posted when the /textures/ change colour or alpha transparency, not the
floating text. This fixes several race conditions in scripts ported from SL.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 1 -
1 file changed, 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index e87766e..f8ae321 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -882,7 +882,6 @@ namespace OpenSim.Region.Framework.Scenes
set
{
m_color = value;
- TriggerScriptChangedEvent(Changed.COLOR);
/* ScheduleFullUpdate() need not be called b/c after
* setting the color, the text will be set, so then
--
cgit v1.1
From 89c1c5c35a7665315e66e46276d1b6066f3cf2b8 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 13 Jul 2010 20:40:23 +0200
Subject: Revamp the permissions propagation. This MAY mess up. Please test.
Change the slam bit from 3 to 4. Assume the old slam bit is always set. The
new slam bit is a "changed owner" bit, correcting a bug where an item passed
from the creator to another with less than full perms, then back (sale test)
would arrive back full perm. Lots of in-code docs.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 134 +++++++++++++++------
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
.../Framework/Scenes/SceneObjectGroup.Inventory.cs | 5 +-
.../Framework/Scenes/SceneObjectPartInventory.cs | 1 -
4 files changed, 103 insertions(+), 39 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 38a5456..5796194 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -280,6 +280,10 @@ namespace OpenSim.Region.Framework.Scenes
public void UpdateInventoryItemAsset(IClientAPI remoteClient, UUID transactionID,
UUID itemID, InventoryItemBase itemUpd)
{
+ // This one will let people set next perms on items in agent
+ // inventory. Rut-Roh. Whatever. Make this secure. Yeah.
+ //
+ // Passing something to another avatar or a an object will already
InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId);
item = InventoryService.GetItem(item);
@@ -289,11 +293,9 @@ namespace OpenSim.Region.Framework.Scenes
{
item.Name = itemUpd.Name;
item.Description = itemUpd.Description;
- item.NextPermissions = itemUpd.NextPermissions;
- item.CurrentPermissions |= 8; // Slam!
- item.EveryOnePermissions = itemUpd.EveryOnePermissions;
- item.GroupPermissions = itemUpd.GroupPermissions;
-
+ item.NextPermissions = itemUpd.NextPermissions & item.BasePermissions;
+ item.EveryOnePermissions = itemUpd.EveryOnePermissions & item.BasePermissions;
+ item.GroupPermissions = itemUpd.GroupPermissions & item.BasePermissions;
item.GroupID = itemUpd.GroupID;
item.GroupOwned = itemUpd.GroupOwned;
item.CreationDate = itemUpd.CreationDate;
@@ -399,28 +401,96 @@ namespace OpenSim.Region.Framework.Scenes
if (Permissions.PropagatePermissions() && recipient != senderId)
{
- // First, make sore base is limited to the next perms
- itemCopy.BasePermissions = item.BasePermissions & (item.NextPermissions | (uint)PermissionMask.Move);
- // By default, current equals base
- itemCopy.CurrentPermissions = itemCopy.BasePermissions & item.CurrentPermissions;
-
- // If this is an object, replace current perms
- // with folded perms
+ // Trying to do this right this time. This is evil. If
+ // you believe in Good, go elsewhere. Vampires and other
+ // evil creatores only beyond this point. You have been
+ // warned.
+
+ // We're going to mask a lot of things by the next perms
+ // Tweak the next perms to be nicer to our data
+ //
+ // In this mask, all the bits we do NOT want to mess
+ // with are set. These are:
+ //
+ // Transfer
+ // Copy
+ // Modufy
+ uint permsMask = ~ ((uint)PermissionMask.Copy |
+ (uint)PermissionMask.Transfer |
+ (uint)PermissionMask.Modify);
+
+ // Now, reduce the next perms to the mask bits
+ // relevant to the operation
+ uint nextPerms = permsMask | (item.NextPermissions &
+ ((uint)PermissionMask.Copy |
+ (uint)PermissionMask.Transfer |
+ (uint)PermissionMask.Modify));
+
+ // nextPerms now has all bits set, except for the actual
+ // next permission bits.
+
+ // This checks for no mod, no copy, no trans.
+ // This indicates an error or messed up item. Do it like
+ // SL and assume trans
+ if (nextPerms == permsMask)
+ nextPerms |= (uint)PermissionMask.Transfer;
+
+ // Inventory owner perms are the logical AND of the
+ // folded perms and the root prim perms, however, if
+ // the root prim is mod, the inventory perms will be
+ // mod. This happens on "take" and is of little concern
+ // here, save for preventing escalation
+
+ // This hack ensures that items previously permalocked
+ // get unlocked when they're passed or rezzed
+ uint basePerms = item.BasePermissions |
+ (uint)PermissionMask.Move;
+ uint ownerPerms = item.CurrentPermissions;
+
+ // Mask the base permissions. This is a conservative
+ // approach altering only the three main perms
+ basePerms &= nextPerms;
+
+ // If this is an object, root prim perms may be more
+ // permissive than folded perms. Use folded perms as
+ // a mask
if (item.InvType == (int)InventoryType.Object)
{
- itemCopy.CurrentPermissions &= ~(uint)(PermissionMask.Copy | PermissionMask.Modify | PermissionMask.Transfer);
- itemCopy.CurrentPermissions |= (item.CurrentPermissions & 7) << 13;
+ // Create a safe mask for the current perms
+ uint foldedPerms = (item.CurrentPermissions & 7) << 13;
+ foldedPerms |= permsMask;
+
+ bool isRootMod = (item.CurrentPermissions &
+ (uint)PermissionMask.Modify) != 0 ?
+ true : false;
+
+ // Mask the owner perms to the folded perms
+ ownerPerms &= foldedPerms;
+
+ // If the root was mod, let the mask reflect that
+ if (isRootMod)
+ ownerPerms |= (uint)PermissionMask.Modify;
}
- // Ensure there is no escalation
- itemCopy.CurrentPermissions &= (item.NextPermissions | (uint)PermissionMask.Move);
+ // These will be applied to the root prim at next rez.
+ // The slam bit (bit 3) and folded permission (bits 0-2)
+ // are preserved due to the above mangling
+ ownerPerms &= nextPerms;
- // Need slam bit on xfer
- itemCopy.CurrentPermissions |= 8;
+ // Assign to the actual item. Make sure the slam bit is
+ // set, if it wasn't set before.
+ itemCopy.BasePermissions = basePerms;
+ itemCopy.CurrentPermissions = ownerPerms | 16; // Slam
itemCopy.NextPermissions = item.NextPermissions;
- itemCopy.EveryOnePermissions = 0;
+ // This preserves "everyone can move"
+ itemCopy.EveryOnePermissions = item.EveryOnePermissions &
+ nextPerms;
+
+ // Intentionally killing "share with group" here, as
+ // the recipient will not have the group this is
+ // set to
itemCopy.GroupPermissions = 0;
}
else
@@ -922,7 +992,7 @@ namespace OpenSim.Region.Framework.Scenes
else
agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions;
- agentItem.CurrentPermissions |= 8;
+ agentItem.CurrentPermissions |= 16; // Slam
agentItem.NextPermissions = taskItem.NextPermissions;
agentItem.EveryOnePermissions = taskItem.EveryonePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move);
agentItem.GroupPermissions = taskItem.GroupPermissions & taskItem.NextPermissions;
@@ -1113,7 +1183,7 @@ namespace OpenSim.Region.Framework.Scenes
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
(srcTaskItem.NextPermissions | (uint)PermissionMask.Move);
- destTaskItem.CurrentPermissions |= 8; // Slam!
+ destTaskItem.CurrentPermissions |= 16; // Slam!
}
}
@@ -1497,7 +1567,7 @@ namespace OpenSim.Region.Framework.Scenes
srcTaskItem.NextPermissions;
destTaskItem.BasePermissions = srcTaskItem.BasePermissions &
srcTaskItem.NextPermissions;
- destTaskItem.CurrentPermissions |= 8; // Slam!
+ destTaskItem.CurrentPermissions |= 16; // Slam!
}
}
@@ -1889,17 +1959,14 @@ namespace OpenSim.Region.Framework.Scenes
group.SetGroup(sourcePart.GroupID, null);
- if (rootPart.OwnerID != item.OwnerID)
+ if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
{
if (Permissions.PropagatePermissions())
{
- if ((item.CurrentPermissions & 8) != 0)
+ foreach (SceneObjectPart part in partList)
{
- foreach (SceneObjectPart part in partList)
- {
- part.EveryoneMask = item.EveryonePermissions;
- part.NextOwnerMask = item.NextPermissions;
- }
+ part.EveryoneMask = item.EveryonePermissions;
+ part.NextOwnerMask = item.NextPermissions;
}
group.ApplyNextOwnerPermissions();
}
@@ -1907,17 +1974,14 @@ namespace OpenSim.Region.Framework.Scenes
foreach (SceneObjectPart part in partList)
{
- if (part.OwnerID != item.OwnerID)
+ if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0)
{
part.LastOwnerID = part.OwnerID;
part.OwnerID = item.OwnerID;
part.Inventory.ChangeInventoryOwner(item.OwnerID);
}
- else if ((item.CurrentPermissions & 8) != 0) // Slam!
- {
- part.EveryoneMask = item.EveryonePermissions;
- part.NextOwnerMask = item.NextPermissions;
- }
+ part.EveryoneMask = item.EveryonePermissions;
+ part.NextOwnerMask = item.NextPermissions;
}
rootPart.TrimPermissions();
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c5fb198..d323e19 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -4818,7 +4818,7 @@ namespace OpenSim.Region.Framework.Scenes
part.NextOwnerMask;
item.GroupPermissions = part.GroupMask &
part.NextOwnerMask;
- item.CurrentPermissions |= 8; // Slam!
+ item.CurrentPermissions |= 16; // Slam!
item.CreationDate = Util.UnixTimeSinceEpoch();
if (InventoryService.AddItem(item))
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 1149a20..70b37fb 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -170,13 +170,14 @@ namespace OpenSim.Region.Framework.Scenes
taskItem.GroupPermissions = item.GroupPermissions &
item.NextPermissions;
taskItem.NextPermissions = item.NextPermissions;
- taskItem.CurrentPermissions |= 8;
+ // We're adding this to a prim we don't own. Force
+ // owner change
+ taskItem.CurrentPermissions |= 16; // Slam
}
else
{
taskItem.BasePermissions = item.BasePermissions;
taskItem.CurrentPermissions = item.CurrentPermissions;
- taskItem.CurrentPermissions |= 8;
taskItem.EveryonePermissions = item.EveryOnePermissions;
taskItem.GroupPermissions = item.GroupPermissions;
taskItem.NextPermissions = item.NextPermissions;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 2cde8f3..0066158 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -1082,7 +1082,6 @@ namespace OpenSim.Region.Framework.Scenes
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
- item.CurrentPermissions |= 8;
}
item.OwnerChanged = true;
item.CurrentPermissions &= item.NextPermissions;
--
cgit v1.1
From c5891c14c7547dc0cbbf1bd5bf3a0d2923616f25 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Tue, 13 Jul 2010 15:32:35 -0700
Subject: Bail out in AttachToBackup if the group is an attachment
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 1 +
1 file changed, 1 insertion(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index f85d3d9..7053c02 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -679,6 +679,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public virtual void AttachToBackup()
{
+ if (IsAttachment) return;
m_scene.SceneGraph.FireAttachToBackup(this);
if (InSceneBackup)
--
cgit v1.1
From af13c80d6835d7440994e6ad50ff40a8e3aeb99e Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 14 Jul 2010 03:59:26 +0200
Subject: Remove getting the object capacity from the money module. It is now
set directly from the Region Info (and the region ini file)
---
OpenSim/Region/Framework/Scenes/Scene.cs | 18 +-----------------
1 file changed, 1 insertion(+), 17 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index d323e19..7c25e87 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -492,8 +492,6 @@ namespace OpenSim.Region.Framework.Scenes
set { m_sceneGraph.RestorePresences = value; }
}
- public int objectCapacity = 45000;
-
#endregion
#region BinaryStats
@@ -703,7 +701,7 @@ namespace OpenSim.Region.Framework.Scenes
StatsReporter.OnSendStatsResult += SendSimStatsPackets;
StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
- StatsReporter.SetObjectCapacity(objectCapacity);
+ StatsReporter.SetObjectCapacity(RegionInfo.ObjectCapacity);
// Old
/*
@@ -4206,20 +4204,6 @@ namespace OpenSim.Region.Framework.Scenes
#region Other Methods
- public void SetObjectCapacity(int objects)
- {
- // Region specific config overrides global
- //
- if (RegionInfo.ObjectCapacity != 0)
- objects = RegionInfo.ObjectCapacity;
-
- if (StatsReporter != null)
- {
- StatsReporter.SetObjectCapacity(objects);
- }
- objectCapacity = objects;
- }
-
#endregion
public void HandleObjectPermissionsUpdate(IClientAPI controller, UUID agentID, UUID sessionID, byte field, uint localId, uint mask, byte set)
--
cgit v1.1
From cbb3a8ab94f8df6963f8045a3ca3795bcbcfe0b5 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 14 Jul 2010 16:21:55 +0200
Subject: Fix a permissions issue
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 15 +++++++++++----
.../Framework/Scenes/SceneObjectGroup.Inventory.cs | 18 +++++++++++-------
2 files changed, 22 insertions(+), 11 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 5796194..e972382 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -447,10 +447,6 @@ namespace OpenSim.Region.Framework.Scenes
(uint)PermissionMask.Move;
uint ownerPerms = item.CurrentPermissions;
- // Mask the base permissions. This is a conservative
- // approach altering only the three main perms
- basePerms &= nextPerms;
-
// If this is an object, root prim perms may be more
// permissive than folded perms. Use folded perms as
// a mask
@@ -466,10 +462,17 @@ namespace OpenSim.Region.Framework.Scenes
// Mask the owner perms to the folded perms
ownerPerms &= foldedPerms;
+ basePerms &= foldedPerms;
// If the root was mod, let the mask reflect that
+ // We also need to adjust the base here, because
+ // we should be able to edit in-inventory perms
+ // for the root prim, if it's mod.
if (isRootMod)
+ {
ownerPerms |= (uint)PermissionMask.Modify;
+ basePerms |= (uint)PermissionMask.Modify;
+ }
}
// These will be applied to the root prim at next rez.
@@ -477,6 +480,10 @@ namespace OpenSim.Region.Framework.Scenes
// are preserved due to the above mangling
ownerPerms &= nextPerms;
+ // Mask the base permissions. This is a conservative
+ // approach altering only the three main perms
+ basePerms &= nextPerms;
+
// Assign to the actual item. Make sure the slam bit is
// set, if it wasn't set before.
itemCopy.BasePermissions = basePerms;
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
index 70b37fb..abb4de6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.Inventory.cs
@@ -280,7 +280,7 @@ namespace OpenSim.Region.Framework.Scenes
PermissionMask.Move |
PermissionMask.Transfer) | 7;
- uint ownerMask = 0x7ffffff;
+ uint ownerMask = 0x7fffffff;
foreach (SceneObjectPart part in m_parts.Values)
{
ownerMask &= part.OwnerMask;
@@ -294,12 +294,16 @@ namespace OpenSim.Region.Framework.Scenes
if ((ownerMask & (uint)PermissionMask.Transfer) == 0)
perms &= ~(uint)PermissionMask.Transfer;
- if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Modify) == 0)
- perms &= ~((uint)PermissionMask.Modify >> 13);
- if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Copy) == 0)
- perms &= ~((uint)PermissionMask.Copy >> 13);
- if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Transfer) == 0)
- perms &= ~((uint)PermissionMask.Transfer >> 13);
+ // If root prim permissions are applied here, this would screw
+ // with in-inventory manipulation of the next owner perms
+ // in a major way. So, let's move this to the give itself.
+ // Yes. I know. Evil.
+// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Modify) == 0)
+// perms &= ~((uint)PermissionMask.Modify >> 13);
+// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Copy) == 0)
+// perms &= ~((uint)PermissionMask.Copy >> 13);
+// if ((ownerMask & RootPart.NextOwnerMask & (uint)PermissionMask.Transfer) == 0)
+// perms &= ~((uint)PermissionMask.Transfer >> 13);
return perms;
}
--
cgit v1.1
From 0c445239a68688311d6fa7405ef13ceb3e773930 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 14 Jul 2010 19:21:01 +0200
Subject: Remove useless quaternion parameter from AttachObject sig
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7c25e87..873a11d 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2633,7 +2633,7 @@ namespace OpenSim.Region.Framework.Scenes
if (AttachmentsModule != null)
AttachmentsModule.AttachObject(
- sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false);
+ sp.ControllingClient, grp.LocalId, (uint)0, grp.AbsolutePosition, false);
}
else
--
cgit v1.1
From bebbe407ee166a0aa22f0ec8d14ada780924f9af Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 14 Jul 2010 19:58:23 +0200
Subject: Major attachments cleanup. Remove unused AttachObject ClientView
method Clean up use of AttachObject throughout, reduce number of overloads
and number of parameters
---
OpenSim/Region/Framework/Scenes/Scene.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 873a11d..daad3d2 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2632,8 +2632,7 @@ namespace OpenSim.Region.Framework.Scenes
RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
if (AttachmentsModule != null)
- AttachmentsModule.AttachObject(
- sp.ControllingClient, grp.LocalId, (uint)0, grp.AbsolutePosition, false);
+ AttachmentsModule.AttachObject(sp.ControllingClient, grp, 0, false);
}
else
--
cgit v1.1
From ddfff55cc76144607086fbca03c86df57a271ed0 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 14 Jul 2010 21:06:49 +0200
Subject: Preserve attachment data while a prim is in world. Allows attachment
editing on the ground without losing attachpoint and position
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 8 ++++++++
1 file changed, 8 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index f8ae321..87b2d74 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -182,6 +182,14 @@ namespace OpenSim.Region.Framework.Scenes
[XmlIgnore]
public UUID FromFolderID;
+ // The following two are to hold the attachment data
+ // while an object is inworld
+ [XmlIgnore]
+ public byte AttachPoint = 0;
+
+ [XmlIgnore]
+ public Vector3 AttachOffset = Vector3.Zero;
+
[XmlIgnore]
public int STATUS_ROTATE_X;
--
cgit v1.1
From 8d2b4b7b487f7a35b610d894c03619e638866473 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 15 Jul 2010 20:03:08 +0200
Subject: Fix a few permissions vulnerability. Owners could cause permissions
escalation on items contained in prims using a hacked viewer
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 35 ++++++++++++++++++++--
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 ++
.../Framework/Scenes/SceneObjectPartInventory.cs | 6 ----
3 files changed, 35 insertions(+), 9 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index c77efc7..e1674be 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1359,16 +1359,45 @@ namespace OpenSim.Region.Framework.Scenes
{
agentTransactions.HandleTaskItemUpdateFromTransaction(
remoteClient, part, transactionID, currentItem);
- }
- if (part.Inventory.UpdateInventoryItem(itemInfo))
- {
+
if ((InventoryType)itemInfo.InvType == InventoryType.Notecard)
remoteClient.SendAgentAlertMessage("Notecard saved", false);
else if ((InventoryType)itemInfo.InvType == InventoryType.LSL)
remoteClient.SendAgentAlertMessage("Script saved", false);
else
remoteClient.SendAgentAlertMessage("Item saved", false);
+ }
+ // Check if we're allowed to mess with permissions
+ if (!Permissions.IsGod(remoteClient.AgentId)) // Not a god
+ {
+ if (remoteClient.AgentId != part.OwnerID) // Not owner
+ {
+ // Friends and group members can't change any perms
+ itemInfo.BasePermissions = currentItem.BasePermissions;
+ itemInfo.EveryonePermissions = currentItem.EveryonePermissions;
+ itemInfo.GroupPermissions = currentItem.GroupPermissions;
+ itemInfo.NextPermissions = currentItem.NextPermissions;
+ itemInfo.CurrentPermissions = currentItem.CurrentPermissions;
+ }
+ else
+ {
+ // Owner can't change base, and can change other
+ // only up to base
+ // Base ALWAYS has move
+ currentItem.BasePermissions |= (uint)PermissionMask.Move;
+ itemInfo.BasePermissions = currentItem.BasePermissions;
+ itemInfo.EveryonePermissions &= currentItem.BasePermissions;
+ itemInfo.GroupPermissions &= currentItem.BasePermissions;
+ itemInfo.CurrentPermissions &= currentItem.BasePermissions;
+ itemInfo.NextPermissions &= currentItem.BasePermissions;
+ // Next ALWAYS has move
+ itemInfo.NextPermissions |= (uint)PermissionMask.Move;
+ }
+
+ }
+ if (part.Inventory.UpdateInventoryItem(itemInfo))
+ {
part.GetProperties(remoteClient);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 87b2d74..b19c443 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -4156,6 +4156,9 @@ namespace OpenSim.Region.Framework.Scenes
// objects
if ((_nextOwnerMask & (uint)PermissionMask.Copy) == 0)
_nextOwnerMask |= (uint)PermissionMask.Transfer;
+
+ _nextOwnerMask |= (uint)PermissionMask.Move;
+
break;
}
SendFullUpdateToAllClients();
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 0066158..2a3727a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -762,12 +762,6 @@ namespace OpenSim.Region.Framework.Scenes
else if ((InventoryType)item.Type == InventoryType.Notecard)
{
ScenePresence presence = m_part.ParentGroup.Scene.GetScenePresence(item.OwnerID);
-
- if (presence != null)
- {
- presence.ControllingClient.SendAgentAlertMessage(
- "Notecard saved", false);
- }
}
m_items[item.ItemID] = item;
--
cgit v1.1
From 3f91805afbff1b69ebebcee4ed2593671cf12e12 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 15 Jul 2010 20:28:18 +0200
Subject: prevent hacked viewers from being able to delete arbitrary items from
any prim. Allow friends with perms and shared group members to move or copy
things out of prims
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index e1674be..4575068 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -935,6 +935,9 @@ namespace OpenSim.Region.Framework.Scenes
}
if (part != null && group != null)
{
+ if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
+ return;
+
TaskInventoryItem item = group.GetInventoryItem(localID, itemID);
if (item == null)
return;
@@ -1074,9 +1077,21 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
- // Only owner can copy
- if (remoteClient.AgentId != taskItem.OwnerID)
- return;
+ TaskInventoryItem item = part.Inventory.GetInventoryItem(itemId);
+ if ((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0)
+ {
+ // If the item to be moved is no copy, we need to be able to
+ // edit the prim.
+ if (!Permissions.CanEditObjectInventory(part.UUID, remoteClient.AgentId))
+ return;
+ }
+ else
+ {
+ // If the item is copiable, then we just need to have perms
+ // on it. The delete check is a pure rights check
+ if (!Permissions.CanDeleteObject(part.UUID, remoteClient.AgentId))
+ return;
+ }
MoveTaskInventoryItem(remoteClient, folderId, part, itemId);
}
--
cgit v1.1
From c088397ec72916dfb2914b44f2be8df827fd89d9 Mon Sep 17 00:00:00 2001
From: Tom Grimshaw
Date: Sun, 18 Jul 2010 06:01:26 -0700
Subject: If the client requests that an object be deleted, and the SOG/SOP is
null and/or is marked as deleted, just send the KillObject
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 8 ++++++++
1 file changed, 8 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 4575068..989ec37 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1700,11 +1700,19 @@ namespace OpenSim.Region.Framework.Scenes
// Invalid id
SceneObjectPart part = GetSceneObjectPart(localID);
if (part == null)
+ {
+ //Client still thinks the object exists, kill it
+ SendKillObject(localID);
continue;
+ }
// Already deleted by someone else
if (part.ParentGroup == null || part.ParentGroup.IsDeleted)
+ {
+ //Client still thinks the object exists, kill it
+ SendKillObject(localID);
continue;
+ }
// Can't delete child prims
if (part != part.ParentGroup.RootPart)
--
cgit v1.1
From fd66ee57f3b091e6e4b6c619645595b300c94fbb Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 20 Jul 2010 14:45:46 +0200
Subject: When a god uses mass permission setting, the V bit is cleared from
next perms, rendering the item unmoveable for the next owenr. Make god mods
conform to the rules, too.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 989ec37..59731f7 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1383,6 +1383,9 @@ namespace OpenSim.Region.Framework.Scenes
remoteClient.SendAgentAlertMessage("Item saved", false);
}
+ // Base ALWAYS has move
+ currentItem.BasePermissions |= (uint)PermissionMask.Move;
+
// Check if we're allowed to mess with permissions
if (!Permissions.IsGod(remoteClient.AgentId)) // Not a god
{
@@ -1399,18 +1402,18 @@ namespace OpenSim.Region.Framework.Scenes
{
// Owner can't change base, and can change other
// only up to base
- // Base ALWAYS has move
- currentItem.BasePermissions |= (uint)PermissionMask.Move;
itemInfo.BasePermissions = currentItem.BasePermissions;
itemInfo.EveryonePermissions &= currentItem.BasePermissions;
itemInfo.GroupPermissions &= currentItem.BasePermissions;
itemInfo.CurrentPermissions &= currentItem.BasePermissions;
itemInfo.NextPermissions &= currentItem.BasePermissions;
- // Next ALWAYS has move
- itemInfo.NextPermissions |= (uint)PermissionMask.Move;
}
}
+
+ // Next ALWAYS has move
+ itemInfo.NextPermissions |= (uint)PermissionMask.Move;
+
if (part.Inventory.UpdateInventoryItem(itemInfo))
{
part.GetProperties(remoteClient);
--
cgit v1.1
From 4ccc141764083ae6dfc0b5b8e303a4395e66b684 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 20 Jul 2010 21:49:31 +0100
Subject: Resync with master
---
OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 44b76b7..8b4f0ed 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -749,13 +749,7 @@ namespace OpenSim.Region.Framework.Scenes
item.GroupID = m_part.GroupID;
if (item.AssetID == UUID.Zero)
- item.AssetID = it.AssetID;
-
- lock (m_items)
- {
- m_items[item.ItemID] = item;
- m_inventorySerial++;
- }
+ item.AssetID = m_items[item.ItemID].AssetID;
m_items[item.ItemID] = item;
m_inventorySerial++;
--
cgit v1.1
From c72c84b4559ea164bcb77c2d64a046729662bf04 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 21 Jul 2010 12:16:17 +0200
Subject: Refine autoreturn a bit
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 7053c02..e738dd2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1681,7 +1681,10 @@ namespace OpenSim.Region.Framework.Scenes
try
{
- if (!m_scene.ShuttingDown) // if shutting down then there will be nothing to handle the return so leave till next restart
+ if (!m_scene.ShuttingDown || // if shutting down then there will be nothing to handle the return so leave till next restart
+ m_scene.LoginsDisabled || // We're starting up or doing maintenance, don't mess with things
+ m_scene.LoadingPrims) // Land may not be valid yet
+
{
ILandObject parcel = m_scene.LandChannel.GetLandObject(
m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y);
--
cgit v1.1
From fb89d0ff4eb4636a6a70fd45c85b935e0a6b388a Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 21 Jul 2010 12:31:59 +0200
Subject: Allow megaregions to be used in M7, should we so decide
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 ++
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 47 ++++++++++++++-------------
2 files changed, 27 insertions(+), 22 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index f79bd23..2a498cc 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -137,6 +137,7 @@ namespace OpenSim.Region.Framework.Scenes
protected SceneCommunicationService m_sceneGridService;
public bool LoginsDisabled = true;
public bool LoadingPrims = false;
+ public bool CombineRegions = false;
public new float TimeDilation
{
@@ -768,6 +769,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
+ CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
#region BinaryStats
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index a36800b..12c1c20 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -283,30 +283,33 @@ namespace OpenSim.Region.Framework.Scenes
protected internal bool AddRestoredSceneObject(
SceneObjectGroup sceneObject, bool attachToBackup, bool alreadyPersisted, bool sendClientUpdates)
{
- // KF: Check for out-of-region, move inside and make static.
- Vector3 npos = new Vector3(sceneObject.RootPart.GroupPosition.X,
- sceneObject.RootPart.GroupPosition.Y,
- sceneObject.RootPart.GroupPosition.Z);
- if (!(((sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim) && (sceneObject.RootPart.Shape.State != 0))) && (npos.X < 0.0 || npos.Y < 0.0 || npos.Z < 0.0 ||
- npos.X > Constants.RegionSize ||
- npos.Y > Constants.RegionSize))
- {
- if (npos.X < 0.0) npos.X = 1.0f;
- if (npos.Y < 0.0) npos.Y = 1.0f;
- if (npos.Z < 0.0) npos.Z = 0.0f;
- if (npos.X > Constants.RegionSize) npos.X = Constants.RegionSize - 1.0f;
- if (npos.Y > Constants.RegionSize) npos.Y = Constants.RegionSize - 1.0f;
-
- foreach (SceneObjectPart part in sceneObject.Children.Values)
+ if (!m_parentScene.CombineRegions)
+ {
+ // KF: Check for out-of-region, move inside and make static.
+ Vector3 npos = new Vector3(sceneObject.RootPart.GroupPosition.X,
+ sceneObject.RootPart.GroupPosition.Y,
+ sceneObject.RootPart.GroupPosition.Z);
+ if (!(((sceneObject.RootPart.Shape.PCode == (byte)PCode.Prim) && (sceneObject.RootPart.Shape.State != 0))) && (npos.X < 0.0 || npos.Y < 0.0 || npos.Z < 0.0 ||
+ npos.X > Constants.RegionSize ||
+ npos.Y > Constants.RegionSize))
{
- part.GroupPosition = npos;
+ if (npos.X < 0.0) npos.X = 1.0f;
+ if (npos.Y < 0.0) npos.Y = 1.0f;
+ if (npos.Z < 0.0) npos.Z = 0.0f;
+ if (npos.X > Constants.RegionSize) npos.X = Constants.RegionSize - 1.0f;
+ if (npos.Y > Constants.RegionSize) npos.Y = Constants.RegionSize - 1.0f;
+
+ foreach (SceneObjectPart part in sceneObject.Children.Values)
+ {
+ part.GroupPosition = npos;
+ }
+ sceneObject.RootPart.Velocity = Vector3.Zero;
+ sceneObject.RootPart.AngularVelocity = Vector3.Zero;
+ sceneObject.RootPart.Acceleration = Vector3.Zero;
+ sceneObject.RootPart.Velocity = Vector3.Zero;
}
- sceneObject.RootPart.Velocity = Vector3.Zero;
- sceneObject.RootPart.AngularVelocity = Vector3.Zero;
- sceneObject.RootPart.Acceleration = Vector3.Zero;
- sceneObject.RootPart.Velocity = Vector3.Zero;
- }
-
+ }
+
if (!alreadyPersisted)
{
sceneObject.ForceInventoryPersistence();
--
cgit v1.1
From 516ec4acd01d70276329d251155775cedf7b8941 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 25 Jul 2010 08:11:39 +0200
Subject: Eat a lockign exception that kills scripts. May bear more
investigation in the long run.
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 24d260e..dbf493c 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -136,12 +136,21 @@ namespace OpenSim.Region.Framework.Scenes
if (m_partsLock.RecursiveReadCount > 0)
{
m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
- m_partsLock.ExitReadLock();
+ try
+ {
+ m_partsLock.ExitReadLock();
+ }
+ catch { } // Ignore errors, to allow resync
}
if (m_partsLock.RecursiveWriteCount > 0)
{
m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested (write lock exists on this thread). This should not happen and means something needs to be fixed.");
- m_partsLock.ExitWriteLock();
+ try
+ {
+ m_partsLock.ExitWriteLock();
+ }
+ catch { }
+
}
while (!m_partsLock.TryEnterReadLock(60000))
--
cgit v1.1
From 7871dd606eb8c827101ee4ee3c64d00139e1a0b4 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 29 Jul 2010 16:33:20 +0200
Subject: Allow gods and estate managers/owners to be unaffected by parcel bans
---
OpenSim/Region/Framework/Scenes/Scene.Permissions.cs | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index 7dab04f..a523351 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -64,6 +64,7 @@ namespace OpenSim.Region.Framework.Scenes
public delegate bool RunConsoleCommandHandler(UUID user, Scene requestFromScene);
public delegate bool IssueEstateCommandHandler(UUID user, Scene requestFromScene, bool ownerCommand);
public delegate bool IsGodHandler(UUID user, Scene requestFromScene);
+ public delegate bool IsAdministratorHandler(UUID user);
public delegate bool EditParcelHandler(UUID user, ILandObject parcel, Scene scene);
public delegate bool SellParcelHandler(UUID user, ILandObject parcel, Scene scene);
public delegate bool AbandonParcelHandler(UUID user, ILandObject parcel, Scene scene);
@@ -122,6 +123,7 @@ namespace OpenSim.Region.Framework.Scenes
public event RunConsoleCommandHandler OnRunConsoleCommand;
public event IssueEstateCommandHandler OnIssueEstateCommand;
public event IsGodHandler OnIsGod;
+ public event IsAdministratorHandler OnIsAdministrator;
public event EditParcelHandler OnEditParcel;
public event SellParcelHandler OnSellParcel;
public event AbandonParcelHandler OnAbandonParcel;
@@ -652,6 +654,21 @@ namespace OpenSim.Region.Framework.Scenes
}
return true;
}
+
+ public bool IsAdministrator(UUID user)
+ {
+ IsAdministratorHandler handler = OnIsAdministrator;
+ if (handler != null)
+ {
+ Delegate[] list = handler.GetInvocationList();
+ foreach (IsAdministratorHandler h in list)
+ {
+ if (h(user) == false)
+ return false;
+ }
+ }
+ return true;
+ }
#endregion
#region EDIT PARCEL
--
cgit v1.1
From e3184753a6956078a2e34c449d5e30843b5d7f94 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 3 Aug 2010 05:25:23 +0200
Subject: Log the UUID of a prim that fails meshing and set the prim to phantom
during region startup
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 23 ++++++++++++++--------
1 file changed, 15 insertions(+), 8 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index b19c443..032fbe8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -1497,14 +1497,21 @@ namespace OpenSim.Region.Framework.Scenes
// or flexible
if (!isPhantom && !IsAttachment && !(Shape.PathCurve == (byte) Extrusion.Flexible))
{
- PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape(
- Name,
- Shape,
- AbsolutePosition,
- Scale,
- RotationOffset,
- RigidBody);
-
+ try
+ {
+ PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape(
+ Name,
+ Shape,
+ AbsolutePosition,
+ Scale,
+ RotationOffset,
+ RigidBody);
+ }
+ catch
+ {
+ m_log.ErrorFormat("[SCENE]: caught exception meshing object {0}. Object set to phantom.", m_uuid);
+ PhysActor = null;
+ }
// Basic Physics returns null.. joy joy joy.
if (PhysActor != null)
{
--
cgit v1.1
From ae99c1393d4555d4cd26249b149078e4cd3d439f Mon Sep 17 00:00:00 2001
From: Tom
Date: Tue, 3 Aug 2010 15:31:04 -0700
Subject: Fix scripted sit offset in child prims
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index efe3365..1fc4a81 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1935,8 +1935,14 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("Scripted, unoccupied");
part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
- sitOrientation = avSitOrientation; // Change rotatione to the scripted one
- OffsetRotation = avSitOrientation;
+
+ Quaternion nrot = avSitOrientation;
+ if (!part.IsRoot)
+ {
+ nrot = nrot * part.RotationOffset;
+ }
+ sitOrientation = nrot; // Change rotatione to the scripted one
+ OffsetRotation = nrot;
autopilot = false; // Jump direct to scripted llSitPos()
}
else
@@ -2010,7 +2016,7 @@ namespace OpenSim.Region.Framework.Scenes
// offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
// if (part.LinkNum < 2) 091216 All this was necessary because of the GetWorldRotation error.
// { // Single, or Root prim of linkset, target is ClickOffset * RootRot
- offsetr = offset * partIRot;
+ //offsetr = offset * partIRot;
//
// else
// { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
@@ -2029,7 +2035,7 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
//NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
- ControllingClient.SendSitResponse(part.ParentGroup.UUID, offsetr + part.OffsetPosition, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+ ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls
@@ -2343,6 +2349,10 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion sitTargetOrient = part.SitTargetOrientation;
m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
m_pos += SIT_TARGET_ADJUSTMENT;
+ if (!part.IsRoot)
+ {
+ m_pos *= part.RotationOffset;
+ }
m_bodyRot = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
part.IsOccupied = true;
--
cgit v1.1
From f1c51c8bb4c634cedf9eb57a1bb339d3e8052b10 Mon Sep 17 00:00:00 2001
From: Tom
Date: Tue, 3 Aug 2010 19:51:32 -0700
Subject: Scripted sit target fixes
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 1fc4a81..d857a1c 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1939,7 +1939,7 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion nrot = avSitOrientation;
if (!part.IsRoot)
{
- nrot = nrot * part.RotationOffset;
+ nrot = part.RotationOffset * avSitOrientation;
}
sitOrientation = nrot; // Change rotatione to the scripted one
OffsetRotation = nrot;
--
cgit v1.1
From 8bdbcda2b70ede033c38a604af573554dd2776ad Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Thu, 5 Aug 2010 18:50:17 +0200
Subject: We already have a record of killed prims. It just wasn't used by the
new JHurlicane code anymore. Use it to prevent sending updates after kills.
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 9 +++++++++
1 file changed, 9 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 032fbe8..67cb7cc 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3043,6 +3043,15 @@ namespace OpenSim.Region.Framework.Scenes
UUID ownerID = _ownerID;
UUID objectID = UUID;
UUID parentID = GetRootPartUUID();
+
+ if (ParentGroup.IsAttachment && ParentGroup.RootPart.Shape.State > 30)
+ {
+ // Use the avatar as the parent for HUDs, since the prims
+ // are not sent to other avatars
+ objectID = _ownerID;
+ parentID = _ownerID;
+ }
+
UUID soundID = UUID.Zero;
Vector3 position = AbsolutePosition; // region local
ulong regionHandle = m_parentGroup.Scene.RegionInfo.RegionHandle;
--
cgit v1.1
From c5c6627adb79644b93c5871243a9eeeff553829c Mon Sep 17 00:00:00 2001
From: Tom
Date: Fri, 6 Aug 2010 02:39:42 -0700
Subject: Implement CHANGED_REGION_(RE)START and also fix various CHANGED_*
constants which had the wrong values (checked using LSL in SL). This
addresses mantis #217 and mantis #53.
---
.../Framework/Scenes/Animation/ScenePresenceAnimator.cs | 2 +-
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 7 ++++---
.../Region/Framework/Scenes/SceneObjectPartInventory.cs | 16 ++++++++++++++++
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
4 files changed, 22 insertions(+), 5 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
index 702a1e2..b847d87 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -130,7 +130,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, m_scenePresence.UUID))
{
// 16384 is CHANGED_ANIMATION
- m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { 16384 });
+ m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { (int)Changed.ANIMATION});
SendAnimPack();
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 032fbe8..a0fabff 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -56,9 +56,10 @@ namespace OpenSim.Region.Framework.Scenes
LINK = 32,
ALLOWED_DROP = 64,
OWNER = 128,
- REGION_RESTART = 256,
- REGION = 512,
- TELEPORT = 1024
+ REGION = 256,
+ TELEPORT = 512,
+ REGION_RESTART = 1024,
+ ANIMATION = 16384
}
// I don't really know where to put this except here.
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 8b4f0ed..4f80a7e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -321,6 +321,22 @@ namespace OpenSim.Region.Framework.Scenes
StoreScriptErrors(item.ItemID, null);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
+
+ //This should play nice with XEngine since XEngine loads scripts /after/ the region starts
+ if (stateSource == 0 && m_part.ParentGroup.Scene.LoginsDisabled == true)
+ {
+ IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
+ if (engines != null)
+ {
+ foreach (IScriptModule xengine in engines)
+ {
+ if (xengine != null)
+ {
+ xengine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.REGION_RESTART });
+ }
+ }
+ }
+ }
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index d857a1c..5fcd1c2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3939,7 +3939,7 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
if (m == null) // No script engine loaded
continue;
- m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { 16384 });
+ m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION });
}
}
}
--
cgit v1.1
From a636af13e77aae588f425b7bc9504854a7ed1261 Mon Sep 17 00:00:00 2001
From: Tom
Date: Fri, 6 Aug 2010 06:37:40 -0700
Subject: Make sure the avatar position gets moved along with a prim it is
sitting on. This fixes mantis #208 and (maybe) issues with chat and sound
coming from the wrong place when sat on a vehicle.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 13 +++++++++++--
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 22 ++++++++--------------
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 13 +++++++++++++
3 files changed, 32 insertions(+), 16 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index dbf493c..5a3dc20 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -469,13 +469,22 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
}
- foreach (SceneObjectPart part in m_parts.Values)
+ List parts = new List(m_parts.Values);
+ lockPartsForRead(false);
+ foreach (SceneObjectPart part in parts)
{
part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
part.GroupPosition = val;
}
- lockPartsForRead(false);
+
+ foreach (ScenePresence av in m_linkedAvatars)
+ {
+ Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
+ av.AbsolutePosition += offset;
+ av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
+ av.SendFullUpdateToAllClients();
+ }
//if (m_rootPart.PhysActor != null)
//{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index ba84b88..badd357 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -682,25 +682,13 @@ namespace OpenSim.Region.Framework.Scenes
// Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
+
}
catch (Exception e)
{
m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message);
}
}
-
- // TODO if we decide to do sitting in a more SL compatible way (multiple avatars per prim), this has to be fixed, too
- if (m_sitTargetAvatar != UUID.Zero)
- {
- if (m_parentGroup != null) // TODO can there be a SOP without a SOG?
- {
- ScenePresence avatar;
- if (m_parentGroup.Scene.TryGetScenePresence(m_sitTargetAvatar, out avatar))
- {
- avatar.ParentPosition = GetWorldPosition();
- }
- }
- }
}
}
@@ -709,6 +697,7 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_offsetPosition; }
set
{
+ Vector3 oldpos = m_offsetPosition;
StoreUndoState(UndoType.STATE_PRIM_POSITION);
m_offsetPosition = value;
@@ -727,7 +716,12 @@ namespace OpenSim.Region.Framework.Scenes
List avs = ParentGroup.GetLinkedAvatars();
foreach (ScenePresence av in avs)
{
- av.SendFullUpdateToAllClients();
+ if (av.LinkedPrim == m_uuid)
+ {
+ Vector3 offset = (m_offsetPosition - oldpos);
+ av.OffsetPosition += offset;
+ av.SendFullUpdateToAllClients();
+ }
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5fcd1c2..44c3d12 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -595,11 +595,21 @@ namespace OpenSim.Region.Framework.Scenes
private uint m_parentID;
+
+ private UUID m_linkedPrim;
+
public uint ParentID
{
get { return m_parentID; }
set { m_parentID = value; }
}
+
+ public UUID LinkedPrim
+ {
+ get { return m_linkedPrim; }
+ set { m_linkedPrim = value; }
+ }
+
public float Health
{
get { return m_health; }
@@ -1835,6 +1845,7 @@ namespace OpenSim.Region.Framework.Scenes
m_parentPosition = Vector3.Zero;
m_parentID = 0;
+ m_linkedPrim = UUID.Zero;
m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
SendFullUpdateToAllClients();
m_requestedSitTargetID = 0;
@@ -2422,6 +2433,8 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
m_parentID = m_requestedSitTargetID;
}
+ m_linkedPrim = part.UUID;
+
Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
--
cgit v1.1
From c48be64d9ab82676a2c1894193db42f0a849ae4d Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Fri, 6 Aug 2010 16:08:50 +0200
Subject: Remove posting region restart event from SOP, as it's now in XMRe
---
.../Region/Framework/Scenes/SceneObjectPartInventory.cs | 16 ----------------
1 file changed, 16 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 4f80a7e..8b4f0ed 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -321,22 +321,6 @@ namespace OpenSim.Region.Framework.Scenes
StoreScriptErrors(item.ItemID, null);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
-
- //This should play nice with XEngine since XEngine loads scripts /after/ the region starts
- if (stateSource == 0 && m_part.ParentGroup.Scene.LoginsDisabled == true)
- {
- IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
- if (engines != null)
- {
- foreach (IScriptModule xengine in engines)
- {
- if (xengine != null)
- {
- xengine.PostScriptEvent(item.ItemID, "changed", new Object[] { (int)Changed.REGION_RESTART });
- }
- }
- }
- }
}
}
}
--
cgit v1.1
From 330343505ca2d6d109e89b4767f4351ab9bec91d Mon Sep 17 00:00:00 2001
From: Tom
Date: Fri, 6 Aug 2010 11:39:10 -0700
Subject: Implement CreateNewOutfitAttachments. This addresses mantis #199.
---
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 20 ++++++++++++++++++++
OpenSim/Region/Framework/Scenes/Scene.cs | 1 +
2 files changed, 21 insertions(+)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 59731f7..17159b4 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -648,6 +648,8 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
+ if (newName == null) newName = item.Name;
+
AssetBase asset = AssetService.Get(item.AssetID.ToString());
if (asset != null)
@@ -695,6 +697,24 @@ namespace OpenSim.Region.Framework.Scenes
}
///
+ /// Move an item within the agent's inventory, and leave a copy (used in making a new outfit)
+ ///
+ public void MoveInventoryItemsLeaveCopy(IClientAPI remoteClient, List items, UUID destfolder)
+ {
+ List moveitems = new List();
+ foreach (InventoryItemBase b in items)
+ {
+ CopyInventoryItem(remoteClient, 0, remoteClient.AgentId, b.ID, b.Folder, null);
+ InventoryItemBase n = InventoryService.GetItem(b);
+ n.Folder = destfolder;
+ moveitems.Add(n);
+ remoteClient.SendInventoryItemCreateUpdate(n, 0);
+ }
+
+ MoveInventoryItem(remoteClient, moveitems);
+ }
+
+ ///
/// Move an item within the agent's inventory.
///
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 644fbb0..ea52ffb 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2922,6 +2922,7 @@ namespace OpenSim.Region.Framework.Scenes
client.OnFetchInventory += HandleFetchInventory;
client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
client.OnCopyInventoryItem += CopyInventoryItem;
+ client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
client.OnMoveInventoryItem += MoveInventoryItem;
client.OnRemoveInventoryItem += RemoveInventoryItem;
client.OnRemoveInventoryFolder += RemoveInventoryFolder;
--
cgit v1.1
From 4f80d75bf3fa6de226203c6752e7a8e53fda8108 Mon Sep 17 00:00:00 2001
From: Tom
Date: Sat, 7 Aug 2010 06:28:04 -0700
Subject: Add a CHANGED_POSITION event so scripts don't have to run expensive
loops to check for position changes
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 1 +
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 4 +++-
2 files changed, 4 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 8ce79a2..cac3df6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -476,6 +476,7 @@ namespace OpenSim.Region.Framework.Scenes
part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
part.GroupPosition = val;
+ part.TriggerScriptChangedEvent(Changed.POSITION);
}
foreach (ScenePresence av in m_linkedAvatars)
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index efdc19c..d544619 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -60,7 +60,8 @@ namespace OpenSim.Region.Framework.Scenes
TELEPORT = 512,
REGION_RESTART = 1024,
MEDIA = 2048,
- ANIMATION = 16384
+ ANIMATION = 16384,
+ POSITION = 32768
}
// I don't really know where to put this except here.
@@ -730,6 +731,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
+ TriggerScriptChangedEvent(Changed.POSITION);
}
}
--
cgit v1.1
From 00cc42a607c59add54af3c1113162576e6109e41 Mon Sep 17 00:00:00 2001
From: sacha
Date: Sat, 7 Aug 2010 13:40:38 +0000
Subject: and another endless debug cleaning
---
OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 8ce79a2..0dc63ef 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1734,9 +1734,9 @@ namespace OpenSim.Region.Framework.Scenes
// don't backup while it's selected or you're asking for changes mid stream.
if ((isTimeToPersist()) || (forcedBackup))
{
- m_log.DebugFormat(
- "[SCENE]: Storing {0}, {1} in {2}",
- Name, UUID, m_scene.RegionInfo.RegionName);
+ // m_log.DebugFormat(
+ // "[SCENE]: Storing {0}, {1} in {2}",
+ // Name, UUID, m_scene.RegionInfo.RegionName);
SceneObjectGroup backup_group = Copy(false);
backup_group.RootPart.Velocity = RootPart.Velocity;
--
cgit v1.1
From 413b0525db81ebc39a3a79cc2763553058056a5c Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 11:06:07 -0700
Subject: It seems hippo disregards velocities in full updates, so also send a
terse update when an agent sits to avoid drifting off
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8656 +++++++++++-----------
1 file changed, 4328 insertions(+), 4328 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b3fa2f4..882f4a7 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1,4328 +1,4328 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSimulator Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Xml;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Timers;
-using OpenMetaverse;
-using log4net;
-using OpenSim.Framework;
-using OpenSim.Framework.Client;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes.Animation;
-using OpenSim.Region.Framework.Scenes.Types;
-using OpenSim.Region.Physics.Manager;
-using GridRegion = OpenSim.Services.Interfaces.GridRegion;
-using OpenSim.Services.Interfaces;
-
-namespace OpenSim.Region.Framework.Scenes
-{
- enum ScriptControlled : uint
- {
- CONTROL_ZERO = 0,
- CONTROL_FWD = 1,
- CONTROL_BACK = 2,
- CONTROL_LEFT = 4,
- CONTROL_RIGHT = 8,
- CONTROL_UP = 16,
- CONTROL_DOWN = 32,
- CONTROL_ROT_LEFT = 256,
- CONTROL_ROT_RIGHT = 512,
- CONTROL_LBUTTON = 268435456,
- CONTROL_ML_LBUTTON = 1073741824
- }
-
- struct ScriptControllers
- {
- public UUID itemID;
- public ScriptControlled ignoreControls;
- public ScriptControlled eventControls;
- }
-
- public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence, List coarseLocations, List avatarUUIDs);
-
- public class ScenePresence : EntityBase, ISceneEntity
- {
-// ~ScenePresence()
-// {
-// m_log.Debug("[ScenePresence] Destructor called");
-// }
-
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
- private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
-// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
- private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
- private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
-
- ///
- /// Experimentally determined "fudge factor" to make sit-target positions
- /// the same as in SecondLife. Fudge factor was tested for 36 different
- /// test cases including prims of type box, sphere, cylinder, and torus,
- /// with varying parameters for sit target location, prim size, prim
- /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
- /// issue #1716
- ///
-// private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
- // Value revised by KF 091121 by comparison with SL.
- private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f);
-
- public UUID currentParcelUUID = UUID.Zero;
-
- private ISceneViewer m_sceneViewer;
-
- ///
- /// The animator for this avatar
- ///
- public ScenePresenceAnimator Animator
- {
- get { return m_animator; }
- }
- protected ScenePresenceAnimator m_animator;
-
- ///
- /// The scene objects attached to this avatar. Do not change this list directly - use methods such as
- /// AddAttachment() and RemoveAttachment(). Lock this list when performing any read operations upon it.
- ///
- public List Attachments
- {
- get { return m_attachments; }
- }
- protected List m_attachments = new List();
-
- private Dictionary scriptedcontrols = new Dictionary();
- private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
- private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
- private bool MouseDown = false;
- private SceneObjectGroup proxyObjectGroup;
- //private SceneObjectPart proxyObjectPart = null;
- public Vector3 lastKnownAllowedPosition;
- public bool sentMessageAboutRestrictedParcelFlyingDown;
- public Vector4 CollisionPlane = Vector4.UnitW;
-
- private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
- private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
- private Vector3 m_lastPosition;
- private Vector3 m_lastWorldPosition;
- private Quaternion m_lastRotation;
- private Vector3 m_lastVelocity;
- //private int m_lastTerseSent;
-
- private bool m_updateflag;
- private byte m_movementflag;
- private Vector3? m_forceToApply;
- private uint m_requestedSitTargetID;
- private UUID m_requestedSitTargetUUID;
- public bool SitGround = false;
-
- private SendCourseLocationsMethod m_sendCourseLocationsMethod;
-
- private bool m_startAnimationSet;
-
- //private Vector3 m_requestedSitOffset = new Vector3();
-
- private Vector3 m_LastFinitePos;
-
- private float m_sitAvatarHeight = 2.0f;
-
- private int m_godLevel;
- private int m_userLevel;
-
- private bool m_invulnerable = true;
-
- private Vector3 m_lastChildAgentUpdatePosition;
- private Vector3 m_lastChildAgentUpdateCamPosition;
-
- private int m_perfMonMS;
-
- private bool m_setAlwaysRun;
- private bool m_forceFly;
- private bool m_flyDisabled;
-
- private float m_speedModifier = 1.0f;
-
- private Quaternion m_bodyRot= Quaternion.Identity;
-
- private Quaternion m_bodyRotPrevious = Quaternion.Identity;
-
- private const int LAND_VELOCITYMAG_MAX = 12;
-
- public bool IsRestrictedToRegion;
-
- public string JID = String.Empty;
-
- private float m_health = 100f;
-
- // Default AV Height
- private float m_avHeight = 127.0f;
-
- protected RegionInfo m_regionInfo;
- protected ulong crossingFromRegion;
-
- private readonly Vector3[] Dir_Vectors = new Vector3[11];
- private bool m_isNudging = false;
-
- // Position of agent's camera in world (region cordinates)
- protected Vector3 m_CameraCenter;
- protected Vector3 m_lastCameraCenter;
-
- protected Timer m_reprioritization_timer;
- protected bool m_reprioritizing;
- protected bool m_reprioritization_called;
-
- // Use these three vectors to figure out what the agent is looking at
- // Convert it to a Matrix and/or Quaternion
- protected Vector3 m_CameraAtAxis;
- protected Vector3 m_CameraLeftAxis;
- protected Vector3 m_CameraUpAxis;
- private AgentManager.ControlFlags m_AgentControlFlags;
- private Quaternion m_headrotation = Quaternion.Identity;
- private byte m_state;
-
- //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
-// private Vector3 movementvector;
-
- private bool m_autopilotMoving;
- private Vector3 m_autoPilotTarget;
- private bool m_sitAtAutoTarget;
- private Vector3 m_initialSitTarget = Vector3.Zero; //KF: First estimate of where to sit
-
- private string m_nextSitAnimation = String.Empty;
-
- //PauPaw:Proper PID Controler for autopilot************
- private bool m_moveToPositionInProgress;
- private Vector3 m_moveToPositionTarget;
- private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
-
- private bool m_followCamAuto;
-
- private int m_movementUpdateCount;
- private int m_lastColCount = -1; //KF: Look for Collision chnages
- private int m_updateCount = 0; //KF: Update Anims for a while
- private static readonly int UPDATE_COUNT = 10; // how many frames to update for
- private const int NumMovementsBetweenRayCast = 5;
- private List m_lastColliders = new List();
-
- private bool CameraConstraintActive;
- //private int m_moveToPositionStateStatus;
- //*****************************************************
-
- // Agent's Draw distance.
- protected float m_DrawDistance;
-
- protected AvatarAppearance m_appearance;
-
- // neighbouring regions we have enabled a child agent in
- // holds the seed cap for the child agent in that region
- private Dictionary m_knownChildRegions = new Dictionary();
-
- ///
- /// Implemented Control Flags
- ///
- private enum Dir_ControlFlags
- {
- DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
- DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
- DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
- DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
- DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
- DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
- DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS,
- DIR_CONTROL_FLAG_BACK_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG,
- DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS,
- DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG,
- DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
- }
-
- ///
- /// Position at which a significant movement was made
- ///
- private Vector3 posLastSignificantMove;
-
- // For teleports and crossings callbacks
- string m_callbackURI;
- UUID m_originRegionID;
-
- ulong m_rootRegionHandle;
-
- ///
- /// Script engines present in the scene
- ///
- private IScriptModule[] m_scriptEngines;
-
- #region Properties
-
- ///
- /// Physical scene representation of this Avatar.
- ///
- public PhysicsActor PhysicsActor
- {
- set { m_physicsActor = value; }
- get { return m_physicsActor; }
- }
-
- public byte MovementFlag
- {
- set { m_movementflag = value; }
- get { return m_movementflag; }
- }
-
- public bool Updated
- {
- set { m_updateflag = value; }
- get { return m_updateflag; }
- }
-
- public bool Invulnerable
- {
- set { m_invulnerable = value; }
- get { return m_invulnerable; }
- }
-
- public int UserLevel
- {
- get { return m_userLevel; }
- }
-
- public int GodLevel
- {
- get { return m_godLevel; }
- }
-
- public ulong RegionHandle
- {
- get { return m_rootRegionHandle; }
- }
-
- public Vector3 CameraPosition
- {
- get { return m_CameraCenter; }
- }
-
- public Quaternion CameraRotation
- {
- get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); }
- }
-
- public Vector3 CameraAtAxis
- {
- get { return m_CameraAtAxis; }
- }
-
- public Vector3 CameraLeftAxis
- {
- get { return m_CameraLeftAxis; }
- }
-
- public Vector3 CameraUpAxis
- {
- get { return m_CameraUpAxis; }
- }
-
- public Vector3 Lookat
- {
- get
- {
- Vector3 a = new Vector3(m_CameraAtAxis.X, m_CameraAtAxis.Y, 0);
-
- if (a == Vector3.Zero)
- return a;
-
- return Util.GetNormalizedVector(a);
- }
- }
-
- private readonly string m_firstname;
-
- public string Firstname
- {
- get { return m_firstname; }
- }
-
- private readonly string m_lastname;
-
- public string Lastname
- {
- get { return m_lastname; }
- }
-
- private string m_grouptitle;
-
- public string Grouptitle
- {
- get { return m_grouptitle; }
- set { m_grouptitle = value; }
- }
-
- public float DrawDistance
- {
- get { return m_DrawDistance; }
- }
-
- protected bool m_allowMovement = true;
-
- public bool AllowMovement
- {
- get { return m_allowMovement; }
- set { m_allowMovement = value; }
- }
-
- public bool SetAlwaysRun
- {
- get
- {
- if (PhysicsActor != null)
- {
- return PhysicsActor.SetAlwaysRun;
- }
- else
- {
- return m_setAlwaysRun;
- }
- }
- set
- {
- m_setAlwaysRun = value;
- if (PhysicsActor != null)
- {
- PhysicsActor.SetAlwaysRun = value;
- }
- }
- }
-
- public byte State
- {
- get { return m_state; }
- set { m_state = value; }
- }
-
- public uint AgentControlFlags
- {
- get { return (uint)m_AgentControlFlags; }
- set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
- }
-
- ///
- /// This works out to be the ClientView object associated with this avatar, or it's client connection manager
- ///
- private IClientAPI m_controllingClient;
-
- protected PhysicsActor m_physicsActor;
-
- ///
- /// The client controlling this presence
- ///
- public IClientAPI ControllingClient
- {
- get { return m_controllingClient; }
- }
-
- public IClientCore ClientView
- {
- get { return (IClientCore) m_controllingClient; }
- }
-
- protected Vector3 m_parentPosition;
- public Vector3 ParentPosition
- {
- get { return m_parentPosition; }
- set { m_parentPosition = value; }
- }
-
- ///
- /// Position of this avatar relative to the region the avatar is in
- ///
- public override Vector3 AbsolutePosition
- {
- get
- {
- PhysicsActor actor = m_physicsActor;
-// if (actor != null)
- if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
- m_pos = actor.Position;
-
- // If we're sitting, we need to update our position
- if (m_parentID != 0)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
- if (part != null)
- m_parentPosition = part.AbsolutePosition;
- }
-
- return m_parentPosition + m_pos;
- }
- set
- {
- PhysicsActor actor = m_physicsActor;
- if (actor != null)
- {
- try
- {
- lock (m_scene.SyncRoot)
- m_physicsActor.Position = value;
- }
- catch (Exception e)
- {
- m_log.Error("[SCENEPRESENCE]: ABSOLUTE POSITION " + e.Message);
- }
- }
-
- if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
- m_pos = value;
- m_parentPosition = Vector3.Zero;
- }
- }
-
- public Vector3 OffsetPosition
- {
- get { return m_pos; }
- set { m_pos = value; }
- }
-
- ///
- /// Current velocity of the avatar.
- ///
- public override Vector3 Velocity
- {
- get
- {
- PhysicsActor actor = m_physicsActor;
- if (actor != null)
- m_velocity = actor.Velocity;
-
- return m_velocity;
- }
- set
- {
- PhysicsActor actor = m_physicsActor;
- if (actor != null)
- {
- try
- {
- lock (m_scene.SyncRoot)
- actor.Velocity = value;
- }
- catch (Exception e)
- {
- m_log.Error("[SCENEPRESENCE]: VELOCITY " + e.Message);
- }
- }
-
- m_velocity = value;
- }
- }
-
- public Quaternion OffsetRotation
- {
- get { return m_offsetRotation; }
- set { m_offsetRotation = value; }
- }
-
- public Quaternion Rotation
- {
- get {
- if (m_parentID != 0)
- {
- if (m_offsetRotation != null)
- {
- return m_offsetRotation;
- }
- else
- {
- return new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
-
- }
- else
- {
- return m_bodyRot;
- }
- }
- set {
- m_bodyRot = value;
- if (m_parentID != 0)
- {
- m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
- }
- }
-
- public Quaternion PreviousRotation
- {
- get { return m_bodyRotPrevious; }
- set { m_bodyRotPrevious = value; }
- }
-
- ///
- /// If this is true, agent doesn't have a representation in this scene.
- /// this is an agent 'looking into' this scene from a nearby scene(region)
- ///
- /// if False, this agent has a representation in this scene
- ///
- private bool m_isChildAgent = true;
-
- public bool IsChildAgent
- {
- get { return m_isChildAgent; }
- set { m_isChildAgent = value; }
- }
-
- private uint m_parentID;
-
-
- private UUID m_linkedPrim;
-
- public uint ParentID
- {
- get { return m_parentID; }
- set { m_parentID = value; }
- }
-
- public UUID LinkedPrim
- {
- get { return m_linkedPrim; }
- set { m_linkedPrim = value; }
- }
-
- public float Health
- {
- get { return m_health; }
- set { m_health = value; }
- }
-
- ///
- /// These are the region handles known by the avatar.
- ///
- public List KnownChildRegionHandles
- {
- get
- {
- if (m_knownChildRegions.Count == 0)
- return new List();
- else
- return new List(m_knownChildRegions.Keys);
- }
- }
-
- public Dictionary KnownRegions
- {
- get { return m_knownChildRegions; }
- set
- {
- m_knownChildRegions = value;
- }
- }
-
- public ISceneViewer SceneViewer
- {
- get { return m_sceneViewer; }
- }
-
- public void AdjustKnownSeeds()
- {
- Dictionary seeds;
-
- if (Scene.CapsModule != null)
- seeds = Scene.CapsModule.GetChildrenSeeds(UUID);
- else
- seeds = new Dictionary();
-
- List old = new List();
- foreach (ulong handle in seeds.Keys)
- {
- uint x, y;
- Utils.LongToUInts(handle, out x, out y);
- x = x / Constants.RegionSize;
- y = y / Constants.RegionSize;
- if (Util.IsOutsideView(x, Scene.RegionInfo.RegionLocX, y, Scene.RegionInfo.RegionLocY))
- {
- old.Add(handle);
- }
- }
- DropOldNeighbours(old);
-
- if (Scene.CapsModule != null)
- Scene.CapsModule.SetChildrenSeed(UUID, seeds);
-
- KnownRegions = seeds;
- //m_log.Debug(" ++++++++++AFTER+++++++++++++ ");
- //DumpKnownRegions();
- }
-
- public void DumpKnownRegions()
- {
- m_log.Info("================ KnownRegions "+Scene.RegionInfo.RegionName+" ================");
- foreach (KeyValuePair kvp in KnownRegions)
- {
- uint x, y;
- Utils.LongToUInts(kvp.Key, out x, out y);
- x = x / Constants.RegionSize;
- y = y / Constants.RegionSize;
- m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
- }
- }
-
- private bool m_inTransit;
- private bool m_mouseLook;
- private bool m_leftButtonDown;
-
- public bool IsInTransit
- {
- get { return m_inTransit; }
- set { m_inTransit = value; }
- }
-
- public float SpeedModifier
- {
- get { return m_speedModifier; }
- set { m_speedModifier = value; }
- }
-
- public bool ForceFly
- {
- get { return m_forceFly; }
- set { m_forceFly = value; }
- }
-
- public bool FlyDisabled
- {
- get { return m_flyDisabled; }
- set { m_flyDisabled = value; }
- }
-
- public string Viewer
- {
- get { return m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode).Viewer; }
- }
-
- #endregion
-
- #region Constructor(s)
-
- public ScenePresence()
- {
- m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
- CreateSceneViewer();
- m_animator = new ScenePresenceAnimator(this);
- }
-
- private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this()
- {
- m_rootRegionHandle = reginfo.RegionHandle;
- m_controllingClient = client;
- m_firstname = m_controllingClient.FirstName;
- m_lastname = m_controllingClient.LastName;
- m_name = String.Format("{0} {1}", m_firstname, m_lastname);
- m_scene = world;
- m_uuid = client.AgentId;
- m_regionInfo = reginfo;
- m_localId = m_scene.AllocateLocalId();
-
- UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid);
-
- if (account != null)
- m_userLevel = account.UserLevel;
-
- IGroupsModule gm = m_scene.RequestModuleInterface();
- if (gm != null)
- m_grouptitle = gm.GetGroupTitle(m_uuid);
-
- m_scriptEngines = m_scene.RequestModuleInterfaces();
-
- AbsolutePosition = posLastSignificantMove = m_CameraCenter =
- m_lastCameraCenter = m_controllingClient.StartPos;
-
- m_reprioritization_timer = new Timer(world.ReprioritizationInterval);
- m_reprioritization_timer.Elapsed += new ElapsedEventHandler(Reprioritize);
- m_reprioritization_timer.AutoReset = false;
-
- AdjustKnownSeeds();
- Animator.TrySetMovementAnimation("STAND");
- // we created a new ScenePresence (a new child agent) in a fresh region.
- // Request info about all the (root) agents in this region
- // Note: This won't send data *to* other clients in that region (children don't send)
- SendInitialFullUpdateToAllClients();
- RegisterToEvents();
- if (m_controllingClient != null)
- {
- m_controllingClient.ProcessPendingPackets();
- }
- SetDirectionVectors();
- }
-
- public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
- AvatarWearable[] wearables)
- : this(client, world, reginfo)
- {
- m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
- }
-
- public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
- : this(client, world, reginfo)
- {
- m_appearance = appearance;
- }
-
- private void CreateSceneViewer()
- {
- m_sceneViewer = new SceneViewer(this);
- }
-
- public void RegisterToEvents()
- {
- m_controllingClient.OnRequestWearables += SendWearables;
- m_controllingClient.OnSetAppearance += SetAppearance;
- m_controllingClient.OnCompleteMovementToRegion += CompleteMovement;
- //m_controllingClient.OnCompleteMovementToRegion += SendInitialData;
- m_controllingClient.OnAgentUpdate += HandleAgentUpdate;
- m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit;
- m_controllingClient.OnAgentSit += HandleAgentSit;
- m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
- m_controllingClient.OnStartAnim += HandleStartAnim;
- m_controllingClient.OnStopAnim += HandleStopAnim;
- m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls;
- m_controllingClient.OnAutoPilotGo += DoAutoPilot;
- m_controllingClient.AddGenericPacketHandler("autopilot", DoMoveToPosition);
-
- // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
- // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
- }
-
- private void SetDirectionVectors()
- {
- Dir_Vectors[0] = Vector3.UnitX; //FORWARD
- Dir_Vectors[1] = -Vector3.UnitX; //BACK
- Dir_Vectors[2] = Vector3.UnitY; //LEFT
- Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
- Dir_Vectors[4] = Vector3.UnitZ; //UP
- Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
- Dir_Vectors[6] = new Vector3(0.5f, 0f, 0f); //FORWARD_NUDGE
- Dir_Vectors[7] = new Vector3(-0.5f, 0f, 0f); //BACK_NUDGE
- Dir_Vectors[8] = new Vector3(0f, 0.5f, 0f); //LEFT_NUDGE
- Dir_Vectors[9] = new Vector3(0f, -0.5f, 0f); //RIGHT_NUDGE
- Dir_Vectors[10] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
- }
-
- private Vector3[] GetWalkDirectionVectors()
- {
- Vector3[] vector = new Vector3[11];
- vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
- vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
- vector[2] = Vector3.UnitY; //LEFT
- vector[3] = -Vector3.UnitY; //RIGHT
- vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
- vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
- vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
- vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
- vector[8] = Vector3.UnitY; //LEFT_NUDGE
- vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
- vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE
- return vector;
- }
-
- private bool[] GetDirectionIsNudge()
- {
- bool[] isNudge = new bool[11];
- isNudge[0] = false; //FORWARD
- isNudge[1] = false; //BACK
- isNudge[2] = false; //LEFT
- isNudge[3] = false; //RIGHT
- isNudge[4] = false; //UP
- isNudge[5] = false; //DOWN
- isNudge[6] = true; //FORWARD_NUDGE
- isNudge[7] = true; //BACK_NUDGE
- isNudge[8] = true; //LEFT_NUDGE
- isNudge[9] = true; //RIGHT_NUDGE
- isNudge[10] = true; //DOWN_Nudge
- return isNudge;
- }
-
-
- #endregion
-
- public uint GenerateClientFlags(UUID ObjectID)
- {
- return m_scene.Permissions.GenerateClientFlags(m_uuid, ObjectID);
- }
-
- ///
- /// Send updates to the client about prims which have been placed on the update queue. We don't
- /// necessarily send updates for all the parts on the queue, e.g. if an updates with a more recent
- /// timestamp has already been sent.
- ///
- public void SendPrimUpdates()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- m_sceneViewer.SendPrimUpdates();
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- #region Status Methods
-
- ///
- /// This turns a child agent, into a root agent
- /// This is called when an agent teleports into a region, or if an
- /// agent crosses into this region from a neighbor over the border
- ///
- public void MakeRootAgent(Vector3 pos, bool isFlying)
- {
- m_log.DebugFormat(
- "[SCENE]: Upgrading child to root agent for {0} in {1}",
- Name, m_scene.RegionInfo.RegionName);
-
- //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count);
-
- IGroupsModule gm = m_scene.RequestModuleInterface();
- if (gm != null)
- m_grouptitle = gm.GetGroupTitle(m_uuid);
-
- m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
- m_scene.SetRootAgentScene(m_uuid);
-
- // Moved this from SendInitialData to ensure that m_appearance is initialized
- // before the inventory is processed in MakeRootAgent. This fixes a race condition
- // related to the handling of attachments
- //m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
- if (m_scene.TestBorderCross(pos, Cardinals.E))
- {
- Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
- pos.X = crossedBorder.BorderLine.Z - 1;
- }
-
- if (m_scene.TestBorderCross(pos, Cardinals.N))
- {
- Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
- pos.Y = crossedBorder.BorderLine.Z - 1;
- }
-
- //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
- //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
- //they'll bypass the landing point. But I can't think of any decent way of fixing this.
- if (KnownChildRegionHandles.Count == 0)
- {
- ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
- if (land != null)
- {
- //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
- if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && UserLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
- {
- pos = land.LandData.UserLocation;
- }
- }
- }
-
- if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
- {
- Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
-
- if (pos.X < 0)
- {
- emergencyPos.X = (int)Constants.RegionSize + pos.X;
- if (!(pos.Y < 0))
- emergencyPos.Y = pos.Y;
- if (!(pos.Z < 0))
- emergencyPos.Z = pos.Z;
- }
- if (pos.Y < 0)
- {
- emergencyPos.Y = (int)Constants.RegionSize + pos.Y;
- if (!(pos.X < 0))
- emergencyPos.X = pos.X;
- if (!(pos.Z < 0))
- emergencyPos.Z = pos.Z;
- }
- if (pos.Z < 0)
- {
- emergencyPos.Z = 128;
- if (!(pos.Y < 0))
- emergencyPos.Y = pos.Y;
- if (!(pos.X < 0))
- emergencyPos.X = pos.X;
- }
- }
-
- if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
- {
- m_log.WarnFormat(
- "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping",
- pos, Name, UUID);
-
- if (pos.X < 0f) pos.X = 0f;
- if (pos.Y < 0f) pos.Y = 0f;
- if (pos.Z < 0f) pos.Z = 0f;
- }
-
- float localAVHeight = 1.56f;
- if (m_avHeight != 127.0f)
- {
- localAVHeight = m_avHeight;
- }
-
- float posZLimit = 0;
-
- if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize)
- posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
-
- float newPosZ = posZLimit + localAVHeight / 2;
- if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
- {
- pos.Z = newPosZ;
- }
- AbsolutePosition = pos;
-
- AddToPhysicalScene(isFlying);
-
- if (m_forceFly)
- {
- m_physicsActor.Flying = true;
- }
- else if (m_flyDisabled)
- {
- m_physicsActor.Flying = false;
- }
-
- if (m_appearance != null)
- {
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
- }
- else
- {
- m_log.ErrorFormat("[SCENE PRESENCE]: null appearance in MakeRoot in {0}", Scene.RegionInfo.RegionName);
- // emergency; this really shouldn't happen
- m_appearance = new AvatarAppearance(UUID);
- }
-
- // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
- // avatar to return to the standing position in mid-air. On login it looks like this is being sent
- // elsewhere anyway
- // Animator.SendAnimPack();
-
- m_scene.SwapRootAgentCount(false);
-
- //CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
- //if (userInfo != null)
- // userInfo.FetchInventory();
- //else
- // m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid);
-
- // On the next prim update, all objects will be sent
- //
- m_sceneViewer.Reset();
-
- m_isChildAgent = false;
-
- // send the animations of the other presences to me
- m_scene.ForEachScenePresence(delegate(ScenePresence presence)
- {
- if (presence != this)
- presence.Animator.SendAnimPackToClient(ControllingClient);
- });
-
- m_scene.EventManager.TriggerOnMakeRootAgent(this);
- }
-
- ///
- /// This turns a root agent into a child agent
- /// when an agent departs this region for a neighbor, this gets called.
- ///
- /// It doesn't get called for a teleport. Reason being, an agent that
- /// teleports out may not end up anywhere near this region
- ///
- public void MakeChildAgent()
- {
- // It looks like m_animator is set to null somewhere, and MakeChild
- // is called after that. Probably in aborted teleports.
- if (m_animator == null)
- m_animator = new ScenePresenceAnimator(this);
- else
- Animator.ResetAnimations();
-
-// m_log.DebugFormat(
-// "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
-// Name, UUID, m_scene.RegionInfo.RegionName);
-
- // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing,
- // depending on the exact timing. This shouldn't matter anyway since child agent positions are not updated.
- //Velocity = new Vector3(0, 0, 0);
-
- m_isChildAgent = true;
- m_scene.SwapRootAgentCount(true);
- RemoveFromPhysicalScene();
-
- // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
-
- m_scene.EventManager.TriggerOnMakeChildAgent(this);
- }
-
- ///
- /// Removes physics plugin scene representation of this agent if it exists.
- ///
- private void RemoveFromPhysicalScene()
- {
- if (PhysicsActor != null)
- {
- m_physicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients;
- m_physicsActor.OnOutOfBounds -= OutOfBoundsCall;
- m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
- m_physicsActor.UnSubscribeEvents();
- m_physicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
- PhysicsActor = null;
- }
- }
-
- ///
- ///
- ///
- ///
- public void Teleport(Vector3 pos)
- {
- bool isFlying = false;
-
- if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
-
- RemoveFromPhysicalScene();
- Velocity = Vector3.Zero;
- AbsolutePosition = pos;
- AddToPhysicalScene(isFlying);
- if (m_appearance != null)
- {
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
- }
-
- SendTerseUpdateToAllClients();
-
- }
-
- public void TeleportWithMomentum(Vector3 pos)
- {
- bool isFlying = false;
- if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
-
- RemoveFromPhysicalScene();
- AbsolutePosition = pos;
- AddToPhysicalScene(isFlying);
- if (m_appearance != null)
- {
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
- }
-
- SendTerseUpdateToAllClients();
- }
-
- ///
- ///
- ///
- public void StopMovement()
- {
- }
-
- public void StopFlying()
- {
- ControllingClient.StopFlying(this);
- }
-
- public void AddNeighbourRegion(ulong regionHandle, string cap)
- {
- lock (m_knownChildRegions)
- {
- if (!m_knownChildRegions.ContainsKey(regionHandle))
- {
- uint x, y;
- Utils.LongToUInts(regionHandle, out x, out y);
- m_knownChildRegions.Add(regionHandle, cap);
- }
- }
- }
-
- public void RemoveNeighbourRegion(ulong regionHandle)
- {
- lock (m_knownChildRegions)
- {
- if (m_knownChildRegions.ContainsKey(regionHandle))
- {
- m_knownChildRegions.Remove(regionHandle);
- //m_log.Debug(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count);
- }
- }
- }
-
- public void DropOldNeighbours(List oldRegions)
- {
- foreach (ulong handle in oldRegions)
- {
- RemoveNeighbourRegion(handle);
- Scene.CapsModule.DropChildSeed(UUID, handle);
- }
- }
-
- public List GetKnownRegionList()
- {
- return new List(m_knownChildRegions.Keys);
- }
-
- #endregion
-
- #region Event Handlers
-
- ///
- /// Sets avatar height in the phyiscs plugin
- ///
- internal void SetHeight(float height)
- {
- m_avHeight = height;
- if (PhysicsActor != null && !IsChildAgent)
- {
- Vector3 SetSize = new Vector3(0.45f, 0.6f, m_avHeight);
- PhysicsActor.Size = SetSize;
- }
- }
-
- ///
- /// Complete Avatar's movement into the region.
- /// This is called upon a very important packet sent from the client,
- /// so it's client-controlled. Never call this method directly.
- ///
- public void CompleteMovement(IClientAPI client)
- {
- //m_log.Debug("[SCENE PRESENCE]: CompleteMovement");
-
- Vector3 look = Velocity;
- if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
- {
- look = new Vector3(0.99f, 0.042f, 0);
- }
-
- // Prevent teleporting to an underground location
- // (may crash client otherwise)
- //
- Vector3 pos = AbsolutePosition;
- float ground = m_scene.GetGroundHeight(pos.X, pos.Y);
- if (pos.Z < ground + 1.5f)
- {
- pos.Z = ground + 1.5f;
- AbsolutePosition = pos;
- }
- m_isChildAgent = false;
- bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
- MakeRootAgent(AbsolutePosition, m_flying);
-
- if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
- {
- m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
- Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI);
- m_callbackURI = null;
- }
-
- //m_log.DebugFormat("Completed movement");
-
- m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
- SendInitialData();
-
- // Create child agents in neighbouring regions
- if (!m_isChildAgent)
- {
- IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
- if (m_agentTransfer != null)
- m_agentTransfer.EnableChildAgents(this);
- else
- m_log.DebugFormat("[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active");
-
- IFriendsModule friendsModule = m_scene.RequestModuleInterface();
- if (friendsModule != null)
- friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
- }
-
- }
-
- ///
- /// Callback for the Camera view block check. Gets called with the results of the camera view block test
- /// hitYN is true when there's something in the way.
- ///
- ///
- ///
- ///
- ///
- public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
- {
- const float POSITION_TOLERANCE = 0.02f;
- const float VELOCITY_TOLERANCE = 0.02f;
- const float ROTATION_TOLERANCE = 0.02f;
-
- if (m_followCamAuto)
- {
- if (hitYN)
- {
- CameraConstraintActive = true;
- //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance);
-
- Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
- ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
- }
- else
- {
- if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
- !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
- !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
- {
- if (CameraConstraintActive)
- {
- ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f));
- CameraConstraintActive = false;
- }
- }
- }
- }
- }
-
- ///
- /// This is the event handler for client movement. If a client is moving, this event is triggering.
- ///
- public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
- {
- //if (m_isChildAgent)
- //{
- // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
- // return;
- //}
-
- m_perfMonMS = Util.EnvironmentTickCount();
-
- ++m_movementUpdateCount;
- if (m_movementUpdateCount < 1)
- m_movementUpdateCount = 1;
-
- #region Sanity Checking
-
- // This is irritating. Really.
- if (!AbsolutePosition.IsFinite())
- {
- RemoveFromPhysicalScene();
- m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
-
- m_pos = m_LastFinitePos;
-
- if (!m_pos.IsFinite())
- {
- m_pos.X = 127f;
- m_pos.Y = 127f;
- m_pos.Z = 127f;
- m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
- }
-
- AddToPhysicalScene(false);
- }
- else
- {
- m_LastFinitePos = m_pos;
- }
-
- #endregion Sanity Checking
-
- #region Inputs
-
- AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
- Quaternion bodyRotation = agentData.BodyRotation;
-
- // Camera location in world. We'll need to raytrace
- // from this location from time to time.
- m_CameraCenter = agentData.CameraCenter;
- if (Vector3.Distance(m_lastCameraCenter, m_CameraCenter) >= Scene.RootReprioritizationDistance)
- {
- ReprioritizeUpdates();
- m_lastCameraCenter = m_CameraCenter;
- }
-
- // Use these three vectors to figure out what the agent is looking at
- // Convert it to a Matrix and/or Quaternion
- m_CameraAtAxis = agentData.CameraAtAxis;
- m_CameraLeftAxis = agentData.CameraLeftAxis;
- m_CameraUpAxis = agentData.CameraUpAxis;
-
- // The Agent's Draw distance setting
- m_DrawDistance = agentData.Far;
-
- // Check if Client has camera in 'follow cam' or 'build' mode.
- Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
-
- m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
- && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
-
- m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
- m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
-
- #endregion Inputs
-
- if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
- {
- StandUp();
- }
-
- //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
- // Raycast from the avatar's head to the camera to see if there's anything blocking the view
- if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
- {
- if (m_followCamAuto)
- {
- Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
- m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
- }
- }
- lock (scriptedcontrols)
- {
- if (scriptedcontrols.Count > 0)
- {
- SendControlToScripts((uint)flags);
- flags = RemoveIgnoredControls(flags, IgnoredControls);
- }
- }
-
- if (m_autopilotMoving)
- CheckAtSitTarget();
-
- if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
- {
- m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
- Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
-
- // TODO: This doesn't prevent the user from walking yet.
- // Setting parent ID would fix this, if we knew what value
- // to use. Or we could add a m_isSitting variable.
- //Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
- SitGround = true;
- }
-
- // In the future, these values might need to go global.
- // Here's where you get them.
- m_AgentControlFlags = flags;
- m_headrotation = agentData.HeadRotation;
- m_state = agentData.State;
-
- PhysicsActor actor = PhysicsActor;
- if (actor == null)
- {
- return;
- }
-
- bool update_movementflag = false;
-
- if (m_allowMovement && !SitGround)
- {
- if (agentData.UseClientAgentPosition)
- {
- m_moveToPositionInProgress = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f;
- m_moveToPositionTarget = agentData.ClientAgentPosition;
- }
-
- int i = 0;
-
- bool update_rotation = false;
- bool DCFlagKeyPressed = false;
- Vector3 agent_control_v3 = Vector3.Zero;
- Quaternion q = bodyRotation;
-
- bool oldflying = PhysicsActor.Flying;
-
- if (m_forceFly)
- actor.Flying = true;
- else if (m_flyDisabled)
- actor.Flying = false;
- else
- actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
-
- if (actor.Flying != oldflying)
- update_movementflag = true;
-
- if (q != m_bodyRot)
- {
- m_bodyRot = q;
- update_rotation = true;
- }
-
- //guilty until proven innocent..
- bool Nudging = true;
- //Basically, if there is at least one non-nudge control then we don't need
- //to worry about stopping the avatar
-
- if (m_parentID == 0)
- {
- bool bAllowUpdateMoveToPosition = false;
- bool bResetMoveToPosition = false;
-
- Vector3[] dirVectors;
-
- // use camera up angle when in mouselook and not flying or when holding the left mouse button down and not flying
- // this prevents 'jumping' in inappropriate situations.
- if ((m_mouseLook && !m_physicsActor.Flying) || (m_leftButtonDown && !m_physicsActor.Flying))
- dirVectors = GetWalkDirectionVectors();
- else
- dirVectors = Dir_Vectors;
-
- bool[] isNudge = GetDirectionIsNudge();
-
-
-
-
-
- foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
- {
- if (((uint)flags & (uint)DCF) != 0)
- {
- bResetMoveToPosition = true;
- DCFlagKeyPressed = true;
- try
- {
- agent_control_v3 += dirVectors[i];
- if (isNudge[i] == false)
- {
- Nudging = false;
- }
- }
- catch (IndexOutOfRangeException)
- {
- // Why did I get this?
- }
-
- if ((m_movementflag & (uint)DCF) == 0)
- {
- m_movementflag += (byte)(uint)DCF;
- update_movementflag = true;
- }
- }
- else
- {
- if ((m_movementflag & (uint)DCF) != 0)
- {
- m_movementflag -= (byte)(uint)DCF;
- update_movementflag = true;
- }
- else
- {
- bAllowUpdateMoveToPosition = true;
- }
- }
- i++;
- }
- //Paupaw:Do Proper PID for Autopilot here
- if (bResetMoveToPosition)
- {
- m_moveToPositionTarget = Vector3.Zero;
- m_moveToPositionInProgress = false;
- update_movementflag = true;
- bAllowUpdateMoveToPosition = false;
- }
-
- if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
- {
- //Check the error term of the current position in relation to the target position
- if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f)
- {
- // we are close enough to the target
- m_moveToPositionTarget = Vector3.Zero;
- m_moveToPositionInProgress = false;
- update_movementflag = true;
- }
- else
- {
- try
- {
- // move avatar in 2D at one meter/second towards target, in avatar coordinate frame.
- // This movement vector gets added to the velocity through AddNewMovement().
- // Theoretically we might need a more complex PID approach here if other
- // unknown forces are acting on the avatar and we need to adaptively respond
- // to such forces, but the following simple approach seems to works fine.
- Vector3 LocalVectorToTarget3D =
- (m_moveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
- * Matrix4.CreateFromQuaternion(Quaternion.Inverse(bodyRotation)); // change to avatar coords
- // Ignore z component of vector
- Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
- LocalVectorToTarget2D.Normalize();
-
- //We're not nudging
- Nudging = false;
- agent_control_v3 += LocalVectorToTarget2D;
-
- // update avatar movement flags. the avatar coordinate system is as follows:
- //
- // +X (forward)
- //
- // ^
- // |
- // |
- // |
- // |
- // (left) +Y <--------o--------> -Y
- // avatar
- // |
- // |
- // |
- // |
- // v
- // -X
- //
-
- // based on the above avatar coordinate system, classify the movement into
- // one of left/right/back/forward.
- if (LocalVectorToTarget2D.Y > 0)//MoveLeft
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
- //AgentControlFlags
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
- update_movementflag = true;
- }
- else if (LocalVectorToTarget2D.Y < 0) //MoveRight
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
- update_movementflag = true;
- }
- if (LocalVectorToTarget2D.X < 0) //MoveBack
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
- update_movementflag = true;
- }
- else if (LocalVectorToTarget2D.X > 0) //Move Forward
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
- update_movementflag = true;
- }
- }
- catch (Exception e)
- {
- //Avoid system crash, can be slower but...
- m_log.DebugFormat("Crash! {0}", e.ToString());
- }
- }
- }
- }
-
- // Cause the avatar to stop flying if it's colliding
- // with something with the down arrow pressed.
-
- // Only do this if we're flying
- if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
- {
- // Landing detection code
-
- // Are the landing controls requirements filled?
- bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
- ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
-
- // Are the collision requirements fulfilled?
- bool colliding = (m_physicsActor.IsColliding == true);
-
- if (m_physicsActor.Flying && colliding && controlland)
- {
- // nesting this check because LengthSquared() is expensive and we don't
- // want to do it every step when flying.
- if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
- StopFlying();
- }
- }
-
- if (update_movementflag || (update_rotation && DCFlagKeyPressed))
- {
- // m_log.DebugFormat("{0} {1}", update_movementflag, (update_rotation && DCFlagKeyPressed));
- // m_log.DebugFormat(
- // "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3);
-
- AddNewMovement(agent_control_v3, q, Nudging);
-
-
- }
- }
-
- if (update_movementflag && !SitGround)
- Animator.UpdateMovementAnimations();
-
- m_scene.EventManager.TriggerOnClientMovement(this);
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- public void DoAutoPilot(uint not_used, Vector3 Pos, IClientAPI remote_client)
- {
- m_autopilotMoving = true;
- m_autoPilotTarget = Pos;
- m_sitAtAutoTarget = false;
- PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
- //proxy.PCode = (byte)PCode.ParticleSystem;
- proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy);
- proxyObjectGroup.AttachToScene(m_scene);
-
- // Commented out this code since it could never have executed, but might still be informative.
-// if (proxyObjectGroup != null)
-// {
- proxyObjectGroup.SendGroupFullUpdate();
- remote_client.SendSitResponse(proxyObjectGroup.UUID, Vector3.Zero, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
- m_scene.DeleteSceneObject(proxyObjectGroup, false);
-// }
-// else
-// {
-// m_autopilotMoving = false;
-// m_autoPilotTarget = Vector3.Zero;
-// ControllingClient.SendAlertMessage("Autopilot cancelled");
-// }
- }
-
- public void DoMoveToPosition(Object sender, string method, List args)
- {
- try
- {
- float locx = 0f;
- float locy = 0f;
- float locz = 0f;
- uint regionX = 0;
- uint regionY = 0;
- try
- {
- Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
- locx = Convert.ToSingle(args[0]) - (float)regionX;
- locy = Convert.ToSingle(args[1]) - (float)regionY;
- locz = Convert.ToSingle(args[2]);
- }
- catch (InvalidCastException)
- {
- m_log.Error("[CLIENT]: Invalid autopilot request");
- return;
- }
- m_moveToPositionInProgress = true;
- m_moveToPositionTarget = new Vector3(locx, locy, locz);
- }
- catch (Exception ex)
- {
- //Why did I get this error?
- m_log.Error("[SCENEPRESENCE]: DoMoveToPosition" + ex);
- }
- }
-
- private void CheckAtSitTarget()
- {
- //m_log.Debug("[AUTOPILOT]: " + Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget).ToString());
- if (Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget) <= 1.5)
- {
- if (m_sitAtAutoTarget)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetUUID);
- if (part != null)
- {
- AbsolutePosition = part.AbsolutePosition;
- Velocity = Vector3.Zero;
- SendFullUpdateToAllClients();
-
- HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); //KF ??
- }
- //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false);
- m_requestedSitTargetUUID = UUID.Zero;
- }
- /*
- else
- {
- //ControllingClient.SendAlertMessage("Autopilot cancelled");
- //SendTerseUpdateToAllClients();
- //PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
- //proxy.PCode = (byte)PCode.ParticleSystem;
- ////uint nextUUID = m_scene.NextLocalId;
-
- //proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, m_autoPilotTarget, Quaternion.Identity, proxy);
- //if (proxyObjectGroup != null)
- //{
- //proxyObjectGroup.SendGroupFullUpdate();
- //ControllingClient.SendSitResponse(UUID.Zero, m_autoPilotTarget, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
- //m_scene.DeleteSceneObject(proxyObjectGroup);
- //}
- }
- */
- m_autoPilotTarget = Vector3.Zero;
- m_autopilotMoving = false;
- }
- }
- ///
- /// Perform the logic necessary to stand the avatar up. This method also executes
- /// the stand animation.
- ///
- public void StandUp()
- {
- SitGround = false;
-
- if (m_parentID != 0)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
- if (part != null)
- {
- part.TaskInventory.LockItemsForRead(true);
- TaskInventoryDictionary taskIDict = part.TaskInventory;
- if (taskIDict != null)
- {
- foreach (UUID taskID in taskIDict.Keys)
- {
- UnRegisterControlEventsToScript(LocalId, taskID);
- taskIDict[taskID].PermsMask &= ~(
- 2048 | //PERMISSION_CONTROL_CAMERA
- 4); // PERMISSION_TAKE_CONTROLS
- }
- }
- part.TaskInventory.LockItemsForRead(false);
- // Reset sit target.
- if (part.GetAvatarOnSitTarget() == UUID)
- part.SetAvatarOnSitTarget(UUID.Zero);
- m_parentPosition = part.GetWorldPosition();
- ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
- }
- // part.GetWorldRotation() is the rotation of the object being sat on
- // Rotation is the sittiing Av's rotation
-
- Quaternion partRot;
-// if (part.LinkNum == 1)
-// { // Root prim of linkset
-// partRot = part.ParentGroup.RootPart.RotationOffset;
-// }
-// else
-// { // single or child prim
-
-// }
- if (part == null) //CW: Part may be gone. llDie() for example.
- {
- partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
- else
- {
- partRot = part.GetWorldRotation();
- }
-
- Quaternion partIRot = Quaternion.Inverse(partRot);
-
- Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
- Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
-
-
- if (m_physicsActor == null)
- {
- AddToPhysicalScene(false);
- }
- //CW: If the part isn't null then we can set the current position
- if (part != null)
- {
- Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ((m_pos - part.OffsetPosition) * partRot); // + av sit offset!
- AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
- part.IsOccupied = false;
- part.ParentGroup.DeleteAvatar(ControllingClient.AgentId);
- }
- else
- {
- //CW: Since the part doesn't exist, a coarse standup position isn't an issue
- AbsolutePosition = m_lastWorldPosition;
- }
-
- m_parentPosition = Vector3.Zero;
- m_parentID = 0;
- m_linkedPrim = UUID.Zero;
- m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- SendFullUpdateToAllClients();
- m_requestedSitTargetID = 0;
-
- if ((m_physicsActor != null) && (m_avHeight > 0))
- {
- SetHeight(m_avHeight);
- }
- }
- Animator.TrySetMovementAnimation("STAND");
- }
-
- private SceneObjectPart FindNextAvailableSitTarget(UUID targetID)
- {
- SceneObjectPart targetPart = m_scene.GetSceneObjectPart(targetID);
- if (targetPart == null)
- return null;
-
- // If the primitive the player clicked on has a sit target and that sit target is not full, that sit target is used.
- // If the primitive the player clicked on has no sit target, and one or more other linked objects have sit targets that are not full, the sit target of the object with the lowest link number will be used.
-
- // Get our own copy of the part array, and sort into the order we want to test
- SceneObjectPart[] partArray = targetPart.ParentGroup.GetParts();
- Array.Sort(partArray, delegate(SceneObjectPart p1, SceneObjectPart p2)
- {
- // we want the originally selected part first, then the rest in link order -- so make the selected part link num (-1)
- int linkNum1 = p1==targetPart ? -1 : p1.LinkNum;
- int linkNum2 = p2==targetPart ? -1 : p2.LinkNum;
- return linkNum1 - linkNum2;
- }
- );
-
- //look for prims with explicit sit targets that are available
- foreach (SceneObjectPart part in partArray)
- {
- // Is a sit target available?
- Vector3 avSitOffSet = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
- UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
- bool SitTargetOccupied = (avOnTargetAlready != UUID.Zero);
- bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
- if (SitTargetisSet && !SitTargetOccupied)
- {
- //switch the target to this prim
- return part;
- }
- }
-
- // no explicit sit target found - use original target
- return targetPart;
- }
-
- private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset, Quaternion pSitOrientation)
- {
- bool autopilot = true;
- Vector3 autopilotTarget = new Vector3();
- Quaternion sitOrientation = Quaternion.Identity;
- Vector3 pos = new Vector3();
- Vector3 cameraEyeOffset = Vector3.Zero;
- Vector3 cameraAtOffset = Vector3.Zero;
- bool forceMouselook = false;
-
- //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
- if (part == null) return;
-
- // 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
-
- // part is the prim to sit on
- // offset is the world-ref vector distance from that prim center to the click-spot
- // UUID is the UUID of the Avatar doing the clicking
-
- m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
-
- // Is a sit target available?
- Vector3 avSitOffSet = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
-
- bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
- // Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
- Quaternion partRot;
-// if (part.LinkNum == 1)
-// { // Root prim of linkset
-// partRot = part.ParentGroup.RootPart.RotationOffset;
-// }
-// else
-// { // single or child prim
- partRot = part.GetWorldRotation();
-// }
- Quaternion partIRot = Quaternion.Inverse(partRot);
-//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
- // Sit analysis rewritten by KF 091125
- if (SitTargetisSet) // scipted sit
- {
- if (!part.IsOccupied)
- {
-//Console.WriteLine("Scripted, unoccupied");
- part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
- offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
-
- Quaternion nrot = avSitOrientation;
- if (!part.IsRoot)
- {
- nrot = part.RotationOffset * avSitOrientation;
- }
- sitOrientation = nrot; // Change rotatione to the scripted one
- OffsetRotation = nrot;
- autopilot = false; // Jump direct to scripted llSitPos()
- }
- else
- {
-//Console.WriteLine("Scripted, occupied");
- return;
- }
- }
- else // Not Scripted
- {
- if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) )
- {
- // large prim & offset, ignore if other Avs sitting
-// offset.Z -= 0.05f;
- m_avUnscriptedSitPos = offset * partIRot; // (non-zero) sit where clicked
- autopilotTarget = part.AbsolutePosition + offset; // World location of clicked point
-
-//Console.WriteLine(" offset ={0}", offset);
-//Console.WriteLine(" UnscriptedSitPos={0}", m_avUnscriptedSitPos);
-//Console.WriteLine(" autopilotTarget={0}", autopilotTarget);
-
- }
- else // small offset
- {
-//Console.WriteLine("Small offset");
- if (!part.IsOccupied)
- {
- m_avUnscriptedSitPos = Vector3.Zero; // Zero = Sit on prim center
- autopilotTarget = part.AbsolutePosition;
-//Console.WriteLine("UsSmall autopilotTarget={0}", autopilotTarget);
- }
- else return; // occupied small
- } // end large/small
- } // end Scripted/not
- cameraAtOffset = part.GetCameraAtOffset();
- cameraEyeOffset = part.GetCameraEyeOffset();
- forceMouselook = part.GetForceMouselook();
- if(cameraAtOffset == Vector3.Zero) cameraAtOffset = new Vector3(0f, 0f, 0.1f); //
- if(cameraEyeOffset == Vector3.Zero) cameraEyeOffset = new Vector3(0f, 0f, 0.1f); //
-
- if (m_physicsActor != null)
- {
- // 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.
- m_sitAvatarHeight = m_physicsActor.Size.Z;
- if (autopilot)
- { // its not a scripted sit
-// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
- if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
- {
- autopilot = false; // close enough
- m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
- Not using the part's position because returning the AV to the last known standing
- position is likely to be more friendly, isn't it? */
- RemoveFromPhysicalScene();
- AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target
- } // else the autopilot will get us close
- }
- else
- { // its a scripted sit
- m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
- I *am* using the part's position this time because we have no real idea how far away
- the avatar is from the sit target. */
- RemoveFromPhysicalScene();
- }
- }
- else return; // physactor is null!
-
- Vector3 offsetr; // = offset * partIRot;
- // KF: In a linkset, offsetr needs to be relative to the group root! 091208
- // offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
- // if (part.LinkNum < 2) 091216 All this was necessary because of the GetWorldRotation error.
- // { // Single, or Root prim of linkset, target is ClickOffset * RootRot
- //offsetr = offset * partIRot;
-//
- // else
- // { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
- // offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
- // (offset * partRot);
- // }
-
-//Console.WriteLine(" ");
-//Console.WriteLine("link number ={0}", part.LinkNum);
-//Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
-//Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
-//Console.WriteLine("Click offst ={0}", offset);
-//Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
-//Console.WriteLine("offsetr ={0}", offsetr);
-//Console.WriteLine("Camera At ={0}", cameraAtOffset);
-//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
-
- //NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
- ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
-
- m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
- // This calls HandleAgentSit twice, once from here, and the client calls
- // HandleAgentSit itself after it gets to the location
- // It doesn't get to the location until we've moved them there though
- // which happens in HandleAgentSit :P
- m_autopilotMoving = autopilot;
- m_autoPilotTarget = autopilotTarget;
- m_sitAtAutoTarget = autopilot;
- m_initialSitTarget = autopilotTarget;
- if (!autopilot)
- HandleAgentSit(remoteClient, UUID);
- }
-
- public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset)
- {
- if (m_parentID != 0)
- {
- StandUp();
- }
- m_nextSitAnimation = "SIT";
-
- //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
-
- if (part != null)
- {
- if (!String.IsNullOrEmpty(part.SitAnimation))
- {
- m_nextSitAnimation = part.SitAnimation;
- }
- m_requestedSitTargetID = part.LocalId;
- //m_requestedSitOffset = offset;
- m_requestedSitTargetUUID = targetID;
-
- m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
-
- if (m_scene.PhysicsScene.SupportsRayCast())
- {
- //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
- //SitRayCastAvatarPosition(part);
- //return;
- }
- }
- else
- {
-
- m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
- }
-
-
-
- SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
- }
- /*
- public void SitRayCastAvatarPosition(SceneObjectPart part)
- {
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = AbsolutePosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionResponse);
- }
-
- public void SitRayCastAvatarPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Avatar Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- }
- else
- {
- SitRayCastAvatarPositionCameraZ(part);
- }
- }
- else
- {
- SitRayCastAvatarPositionCameraZ(part);
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- public void SitRayCastAvatarPositionCameraZ(SceneObjectPart part)
- {
- // Next, try to raycast from the camera Z position
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = AbsolutePosition; StartRayCastPosition.Z = CameraPosition.Z;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionCameraZResponse);
- }
-
- public void SitRayCastAvatarPositionCameraZResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Avatar Position + CameraZ succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- }
- else
- {
- SitRayCastCameraPosition(part);
- }
- }
- else
- {
- SitRayCastCameraPosition(part);
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- public void SitRayCastCameraPosition(SceneObjectPart part)
- {
- // Next, try to raycast from the camera position
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = CameraPosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastCameraPositionResponse);
- }
-
- public void SitRayCastCameraPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Camera Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- }
- else
- {
- SitRayHorizontal(part);
- }
- }
- else
- {
- SitRayHorizontal(part);
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- public void SitRayHorizontal(SceneObjectPart part)
- {
- // Next, try to raycast from the avatar position to fwd
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = CameraPosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastHorizontalResponse);
- }
-
- public void SitRayCastHorizontalResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Horizontal Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- // Next, try to raycast from the camera position
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = CameraPosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- //m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastResponseAvatarPosition);
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position not accessable.");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position not accessable.");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- private void SitRaycastFindEdge(Vector3 collisionPoint, Vector3 collisionNormal)
- {
- int i = 0;
- //throw new NotImplementedException();
- //m_requestedSitTargetUUID = UUID.Zero;
- //m_requestedSitTargetID = 0;
- //m_requestedSitOffset = Vector3.Zero;
-
- SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
- }
- */
- public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
- {
- if (m_parentID != 0)
- {
- StandUp();
- }
- if (!String.IsNullOrEmpty(sitAnimation))
- {
- m_nextSitAnimation = sitAnimation;
- }
- else
- {
- m_nextSitAnimation = "SIT";
- }
-
- //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
- if (part != null)
- {
- m_requestedSitTargetID = part.LocalId;
- //m_requestedSitOffset = offset;
- m_requestedSitTargetUUID = targetID;
-
- m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
-
- if (m_scene.PhysicsScene.SupportsRayCast())
- {
- //SitRayCastAvatarPosition(part);
- //return;
- }
- }
- else
- {
- m_log.Warn("Sit requested on unknown object: " + targetID);
- }
-
- SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
- }
-
- public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
- {
- if (!String.IsNullOrEmpty(m_nextSitAnimation))
- {
- HandleAgentSit(remoteClient, agentID, m_nextSitAnimation);
- }
- else
- {
- HandleAgentSit(remoteClient, agentID, "SIT");
- }
- }
-
- public void HandleAgentSit(IClientAPI remoteClient, UUID agentID, string sitAnimation)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
-
- if (m_sitAtAutoTarget || !m_autopilotMoving)
- {
- if (part != null)
- {
-//Console.WriteLine("Link #{0}, Rot {1}", part.LinkNum, part.GetWorldRotation());
- if (part.GetAvatarOnSitTarget() == UUID)
- {
-//Console.WriteLine("Scripted Sit");
- // Scripted sit
- Vector3 sitTargetPos = part.SitTargetPosition;
- Quaternion sitTargetOrient = part.SitTargetOrientation;
- m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
- m_pos += SIT_TARGET_ADJUSTMENT;
- if (!part.IsRoot)
- {
- m_pos *= part.RotationOffset;
- }
- m_bodyRot = sitTargetOrient;
- m_parentPosition = part.AbsolutePosition;
- part.IsOccupied = true;
- part.ParentGroup.AddAvatar(agentID);
-Console.WriteLine("Scripted Sit ofset {0}", m_pos);
- }
- else
- {
- // if m_avUnscriptedSitPos is zero then Av sits above center
- // Else Av sits at m_avUnscriptedSitPos
-
- // Non-scripted sit by Kitto Flora 21Nov09
- // Calculate angle of line from prim to Av
- Quaternion partIRot;
-// if (part.LinkNum == 1)
-// { // Root prim of linkset
-// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
-// }
-// else
-// { // single or child prim
- partIRot = Quaternion.Inverse(part.GetWorldRotation());
-// }
- Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
- float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
- float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
- if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
- if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
- float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
- // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
- // Av sits at world euler <0,0, z>, translated by part rotation
- m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
-
- m_parentPosition = part.AbsolutePosition;
- part.IsOccupied = true;
- part.ParentGroup.AddAvatar(agentID);
- m_pos = new Vector3(0f, 0f, 0.05f) + // corrections to get Sit Animation
- (new Vector3(0.0f, 0f, 0.61f) * partIRot) + // located on center
- (new Vector3(0.34f, 0f, 0.0f) * m_bodyRot) +
- m_avUnscriptedSitPos; // adds click offset, if any
- //Set up raytrace to find top surface of prim
- Vector3 size = part.Scale;
- float mag = 2.0f; // 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
- Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
- Vector3 down = new Vector3(0f, 0f, -1f);
-//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag);
- m_scene.PhysicsScene.RaycastWorld(
- start, // Vector3 position,
- down, // Vector3 direction,
- mag, // float length,
- SitAltitudeCallback); // retMethod
- } // end scripted/not
- }
- else // no Av
- {
- return;
- }
- }
-
- //We want our offsets to reference the root prim, not the child we may have sat on
- if (!part.IsRoot)
- {
- m_parentID = part.ParentGroup.RootPart.LocalId;
- m_pos += part.OffsetPosition;
- }
- else
- {
- m_parentID = m_requestedSitTargetID;
- }
-
- m_linkedPrim = part.UUID;
-
- Velocity = Vector3.Zero;
- RemoveFromPhysicalScene();
-
- Animator.TrySetMovementAnimation(sitAnimation);
- SendFullUpdateToAllClients();
- }
-
- public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal)
- {
- // KF: 091202 There appears to be a bug in Prim Edit Size - the process sometimes make a prim that RayTrace no longer
- // sees. Take/re-rez, or sim restart corrects the condition. Result of bug is incorrect sit height.
- if(hitYN)
- {
- // m_pos = Av offset from prim center to make look like on center
- // m_parentPosition = Actual center pos of prim
- // collisionPoint = spot on prim where we want to sit
- // collisionPoint.Z = global sit surface height
- SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
- Quaternion partIRot;
-// if (part.LinkNum == 1)
-/// { // Root prim of linkset
-// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
-// }
-// else
-// { // single or child prim
- partIRot = Quaternion.Inverse(part.GetWorldRotation());
-// }
- if (m_initialSitTarget != null)
- {
- float offZ = collisionPoint.Z - m_initialSitTarget.Z;
- Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
- //Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
- m_pos += offset;
- // ControllingClient.SendClearFollowCamProperties(part.UUID);
- }
-
- }
- } // End SitAltitudeCallback KF.
-
- ///
- /// Event handler for the 'Always run' setting on the client
- /// Tells the physics plugin to increase speed of movement.
- ///
- public void HandleSetAlwaysRun(IClientAPI remoteClient, bool pSetAlwaysRun)
- {
- m_setAlwaysRun = pSetAlwaysRun;
- if (PhysicsActor != null)
- {
- PhysicsActor.SetAlwaysRun = pSetAlwaysRun;
- }
- }
-
- public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
- {
- Animator.AddAnimation(animID, UUID.Zero);
- }
-
- public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
- {
- Animator.RemoveAnimation(animID);
- }
-
- ///
- /// Rotate the avatar to the given rotation and apply a movement in the given relative vector
- ///
- /// The vector in which to move. This is relative to the rotation argument
- /// The direction in which this avatar should now face.
- public void AddNewMovement(Vector3 vec, Quaternion rotation, bool Nudging)
- {
- if (m_isChildAgent)
- {
- // WHAT???
- m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
-
- // we have to reset the user's child agent connections.
- // Likely, here they've lost the eventqueue for other regions so border
- // crossings will fail at this point unless we reset them.
-
- List regions = new List(KnownChildRegionHandles);
- regions.Remove(m_scene.RegionInfo.RegionHandle);
-
- MakeRootAgent(new Vector3(127f, 127f, 127f), true);
-
- // Async command
- if (m_scene.SceneGridService != null)
- {
- m_scene.SceneGridService.SendCloseChildAgentConnections(UUID, regions);
-
- // Give the above command some time to try and close the connections.
- // this is really an emergency.. so sleep, or we'll get all discombobulated.
- System.Threading.Thread.Sleep(500);
- }
-
- if (m_scene.SceneGridService != null)
- {
- IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
- if (m_agentTransfer != null)
- m_agentTransfer.EnableChildAgents(this);
- }
-
- return;
- }
-
- m_perfMonMS = Util.EnvironmentTickCount();
-
- Rotation = rotation;
- Vector3 direc = vec * rotation;
- direc.Normalize();
- PhysicsActor actor = m_physicsActor;
- if ((vec.Z == 0f) && !actor.Flying) direc.Z = 0f; // Prevent camera WASD up.
-
- direc *= 0.03f * 128f * m_speedModifier;
-
- if (actor != null)
- {
- if (actor.Flying)
- {
- direc *= 4.0f;
- //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);
- //if (controlland)
- // m_log.Info("[AGENT]: landCommand");
- //if (colliding)
- // m_log.Info("[AGENT]: colliding");
- //if (m_physicsActor.Flying && colliding && controlland)
- //{
- // StopFlying();
- // m_log.Info("[AGENT]: Stop FLying");
- //}
- }
- else if (!actor.Flying && actor.IsColliding)
- {
- if (direc.Z > 2.0f)
- {
- if(m_animator.m_animTickJump == -1)
- {
- direc.Z *= 3.0f; // jump
- }
- else
- {
- direc.Z *= 0.1f; // prejump
- }
- /* Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs
- Animator.TrySetMovementAnimation("PREJUMP");
- Animator.TrySetMovementAnimation("JUMP");
- */
- }
- }
- }
-
- // TODO: Add the force instead of only setting it to support multiple forces per frame?
- m_forceToApply = direc;
- m_isNudging = Nudging;
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- #endregion
-
- #region Overridden Methods
-
- public override void Update()
- {
- const float ROTATION_TOLERANCE = 0.01f;
- const float VELOCITY_TOLERANCE = 0.001f;
- const float POSITION_TOLERANCE = 0.05f;
- //const int TIME_MS_TOLERANCE = 3000;
-
-
-
- if (m_isChildAgent == false)
- {
-// PhysicsActor actor = m_physicsActor;
-
- // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
- // grab the latest PhysicsActor velocity, whereas m_velocity is often
- // storing a requested force instead of an actual traveling velocity
-
- // Throw away duplicate or insignificant updates
- if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
- !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
- !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
- //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
- {
- SendTerseUpdateToAllClients();
-
- // Update the "last" values
- m_lastPosition = m_pos;
- m_lastRotation = m_bodyRot;
- m_lastVelocity = Velocity;
- //m_lastTerseSent = Environment.TickCount;
- }
-
- // followed suggestion from mic bowman. reversed the two lines below.
- if (m_parentID == 0 && m_physicsActor != null || m_parentID != 0) // Check that we have a physics actor or we're sitting on something
- CheckForBorderCrossing();
- CheckForSignificantMovement(); // sends update to the modules.
- }
-
- //Sending prim updates AFTER the avatar terse updates are sent
- SendPrimUpdates();
- }
-
- #endregion
-
- #region Update Client(s)
-
- ///
- /// Sends a location update to the client connected to this scenePresence
- ///
- ///
- public void SendTerseUpdateToClient(IClientAPI remoteClient)
- {
- // If the client is inactive, it's getting its updates from another
- // server.
- if (remoteClient.IsActive)
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- PhysicsActor actor = m_physicsActor;
- Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
-
- remoteClient.SendPrimUpdate(this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity);
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- m_scene.StatsReporter.AddAgentUpdates(1);
- }
- }
-
- ///
- /// Send a location/velocity/accelleration update to all agents in scene
- ///
- public void SendTerseUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- m_scene.ForEachClient(SendTerseUpdateToClient);
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- public void SendCoarseLocations(List coarseLocations, List avatarUUIDs)
- {
- SendCourseLocationsMethod d = m_sendCourseLocationsMethod;
- if (d != null)
- {
- d.Invoke(m_scene.RegionInfo.originRegionID, this, coarseLocations, avatarUUIDs);
- }
- }
-
- public void SetSendCourseLocationMethod(SendCourseLocationsMethod d)
- {
- if (d != null)
- m_sendCourseLocationsMethod = d;
- }
-
- public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p, List coarseLocations, List avatarUUIDs)
- {
- m_perfMonMS = Util.EnvironmentTickCount();
- m_controllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- ///
- /// Tell other client about this avatar (The client previously didn't know or had outdated details about this avatar)
- ///
- ///
- public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
- {
- // 2 stage check is needed.
- if (remoteAvatar == null)
- return;
- IClientAPI cl=remoteAvatar.ControllingClient;
- if (cl == null)
- return;
- if (m_appearance.Texture == null)
- return;
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this);
- m_scene.StatsReporter.AddAgentUpdates(1);
- }
-
- ///
- /// Tell *ALL* agents about this agent
- ///
- public void SendInitialFullUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
- int avUpdates = 0;
- m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
- {
- ++avUpdates;
- // only send if this is the root (children are only "listening posts" in a foreign region)
- if (!IsChildAgent)
- {
- SendFullUpdateToOtherClient(avatar);
- }
-
- if (avatar.LocalId != LocalId)
- {
- if (!avatar.IsChildAgent)
- {
- avatar.SendFullUpdateToOtherClient(this);
- avatar.SendAppearanceToOtherAgent(this);
- avatar.Animator.SendAnimPackToClient(ControllingClient);
- }
- }
- });
-
- m_scene.StatsReporter.AddAgentUpdates(avUpdates);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
-
- //Animator.SendAnimPack();
- }
-
- public void SendFullUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- // only send update from root agents to other clients; children are only "listening posts"
- int count = 0;
- m_scene.ForEachScenePresence(delegate(ScenePresence sp)
- {
- if (sp.IsChildAgent)
- return;
- SendFullUpdateToOtherClient(sp);
- ++count;
- });
- m_scene.StatsReporter.AddAgentUpdates(count);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
-
- Animator.SendAnimPack();
- }
-
- ///
- /// Do everything required once a client completes its movement into a region
- ///
- public void SendInitialData()
- {
- // Moved this into CompleteMovement to ensure that m_appearance is initialized before
- // the inventory arrives
- // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- m_controllingClient.SendAvatarDataImmediate(this);
-
- SendInitialFullUpdateToAllClients();
- SendAppearanceToAllOtherAgents();
- }
-
- ///
- /// Tell the client for this scene presence what items it should be wearing now
- ///
- public void SendWearables()
- {
- m_log.DebugFormat("[SCENE]: Received request for wearables of {0}", Name);
-
- ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
- }
-
- ///
- ///
- ///
- public void SendAppearanceToAllOtherAgents()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
- {
- if (scenePresence.UUID != UUID)
- {
- SendAppearanceToOtherAgent(scenePresence);
- }
- });
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- ///
- /// Send appearance data to an agent that isn't this one.
- ///
- ///
- public void SendAppearanceToOtherAgent(ScenePresence avatar)
- {
- avatar.ControllingClient.SendAppearance(
- m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
- }
-
- ///
- /// Set appearance data (textureentry and slider settings) received from the client
- ///
- ///
- ///
- public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
- {
- if (m_physicsActor != null)
- {
- if (!IsChildAgent)
- {
- // This may seem like it's redundant, remove the avatar from the physics scene
- // just to add it back again, but it saves us from having to update
- // 3 variables 10 times a second.
- bool flyingTemp = m_physicsActor.Flying;
- RemoveFromPhysicalScene();
- //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
-
- //PhysicsActor = null;
-
- AddToPhysicalScene(flyingTemp);
- }
- }
-
- #region Bake Cache Check
-
- if (textureEntry != null)
- {
- for (int i = 0; i < BAKE_INDICES.Length; i++)
- {
- int j = BAKE_INDICES[i];
- Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
-
- if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
- {
- if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
- {
- m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name);
- this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
- }
- }
- }
-
- }
-
-
- #endregion Bake Cache Check
-
- m_appearance.SetAppearance(textureEntry, visualParams);
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
-
- // This is not needed, because only the transient data changed
- //AvatarData adata = new AvatarData(m_appearance);
- //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
-
- SendAppearanceToAllOtherAgents();
- if (!m_startAnimationSet)
- {
- Animator.UpdateMovementAnimations();
- m_startAnimationSet = true;
- }
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- m_controllingClient.SendAvatarDataImmediate(this);
- }
-
- public void SetWearable(int wearableId, AvatarWearable wearable)
- {
- m_appearance.SetWearable(wearableId, wearable);
- AvatarData adata = new AvatarData(m_appearance);
- m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
- m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
- }
-
- // Because appearance setting is in a module, we actually need
- // to give it access to our appearance directly, otherwise we
- // get a synchronization issue.
- public AvatarAppearance Appearance
- {
- get { return m_appearance; }
- set { m_appearance = value; }
- }
-
- #endregion
-
- #region Significant Movement Method
-
- ///
- /// This checks for a significant movement and sends a courselocationchange update
- ///
- protected void CheckForSignificantMovement()
- {
- // Movement updates for agents in neighboring regions are sent directly to clients.
- // This value only affects how often agent positions are sent to neighbor regions
- // for things such as distance-based update prioritization
- const float SIGNIFICANT_MOVEMENT = 2.0f;
-
- if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT)
- {
- posLastSignificantMove = AbsolutePosition;
- m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient);
- }
-
- // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
- if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
- Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
- {
- m_lastChildAgentUpdatePosition = AbsolutePosition;
- m_lastChildAgentUpdateCamPosition = CameraPosition;
-
- ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
- cadu.ActiveGroupID = UUID.Zero.Guid;
- cadu.AgentID = UUID.Guid;
- cadu.alwaysrun = m_setAlwaysRun;
- cadu.AVHeight = m_avHeight;
- Vector3 tempCameraCenter = m_CameraCenter;
- cadu.cameraPosition = tempCameraCenter;
- cadu.drawdistance = m_DrawDistance;
- cadu.GroupAccess = 0;
- cadu.Position = AbsolutePosition;
- cadu.regionHandle = m_rootRegionHandle;
- float multiplier = 1;
- int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
- if (innacurateNeighbors != 0)
- {
- multiplier = 1f / (float)innacurateNeighbors;
- }
- if (multiplier <= 0f)
- {
- multiplier = 0.25f;
- }
-
- //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
- cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier);
- cadu.Velocity = Velocity;
-
- AgentPosition agentpos = new AgentPosition();
- agentpos.CopyFrom(cadu);
-
- m_scene.SendOutChildAgentUpdates(agentpos, this);
- }
- }
-
- #endregion
-
- #region Border Crossing Methods
-
- ///
- /// Checks to see if the avatar is in range of a border and calls CrossToNewRegion
- ///
- protected void CheckForBorderCrossing()
- {
- if (IsChildAgent)
- return;
-
- Vector3 pos2 = AbsolutePosition;
- Vector3 vel = Velocity;
- int neighbor = 0;
- int[] fix = new int[2];
-
- float timeStep = 0.1f;
- pos2.X = pos2.X + (vel.X*timeStep);
- pos2.Y = pos2.Y + (vel.Y*timeStep);
- pos2.Z = pos2.Z + (vel.Z*timeStep);
-
- if (!IsInTransit)
- {
- // Checks if where it's headed exists a region
-
- bool needsTransit = false;
- if (m_scene.TestBorderCross(pos2, Cardinals.W))
- {
- if (m_scene.TestBorderCross(pos2, Cardinals.S))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.SW, ref fix);
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.N))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.NW, ref fix);
- }
- else
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.W, ref fix);
- }
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.E))
- {
- if (m_scene.TestBorderCross(pos2, Cardinals.S))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.SE, ref fix);
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.N))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.NE, ref fix);
- }
- else
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.E, ref fix);
- }
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.S))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.S, ref fix);
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.N))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.N, ref fix);
- }
-
-
- // Makes sure avatar does not end up outside region
- if (neighbor <= 0)
- {
- if (!needsTransit)
- {
- if (m_requestedSitTargetUUID == UUID.Zero)
- {
- Vector3 pos = AbsolutePosition;
- if (AbsolutePosition.X < 0)
- pos.X += Velocity.X;
- else if (AbsolutePosition.X > Constants.RegionSize)
- pos.X -= Velocity.X;
- if (AbsolutePosition.Y < 0)
- pos.Y += Velocity.Y;
- else if (AbsolutePosition.Y > Constants.RegionSize)
- pos.Y -= Velocity.Y;
- AbsolutePosition = pos;
- }
- }
- }
- else if (neighbor > 0)
- CrossToNewRegion();
- }
- else
- {
- RemoveFromPhysicalScene();
- // This constant has been inferred from experimentation
- // I'm not sure what this value should be, so I tried a few values.
- timeStep = 0.04f;
- pos2 = AbsolutePosition;
- pos2.X = pos2.X + (vel.X * timeStep);
- pos2.Y = pos2.Y + (vel.Y * timeStep);
- pos2.Z = pos2.Z + (vel.Z * timeStep);
- m_pos = pos2;
- }
- }
-
- protected int HaveNeighbor(Cardinals car, ref int[] fix)
- {
- uint neighbourx = m_regionInfo.RegionLocX;
- uint neighboury = m_regionInfo.RegionLocY;
-
- int dir = (int)car;
-
- if (dir > 1 && dir < 5) //Heading East
- neighbourx++;
- else if (dir > 5) // Heading West
- neighbourx--;
-
- if (dir < 3 || dir == 8) // Heading North
- neighboury++;
- else if (dir > 3 && dir < 7) // Heading Sout
- neighboury--;
-
- int x = (int)(neighbourx * Constants.RegionSize);
- int y = (int)(neighboury * Constants.RegionSize);
- GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, x, y);
-
- if (neighbourRegion == null)
- {
- fix[0] = (int)(m_regionInfo.RegionLocX - neighbourx);
- fix[1] = (int)(m_regionInfo.RegionLocY - neighboury);
- return dir * (-1);
- }
- else
- return dir;
- }
-
- ///
- /// Moves the agent outside the region bounds
- /// Tells neighbor region that we're crossing to it
- /// If the neighbor accepts, remove the agent's viewable avatar from this scene
- /// set them to a child agent.
- ///
- protected void CrossToNewRegion()
- {
- InTransit();
- try
- {
- m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying);
- }
- catch
- {
- m_scene.CrossAgentToNewRegion(this, false);
- }
- }
-
- public void InTransit()
- {
- m_inTransit = true;
-
- if ((m_physicsActor != null) && m_physicsActor.Flying)
- m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
- else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
- m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
- }
-
- public void NotInTransit()
- {
- m_inTransit = false;
- }
-
- public void RestoreInCurrentScene()
- {
- AddToPhysicalScene(false); // not exactly false
- }
-
- public void Reset()
- {
- // Put the child agent back at the center
- AbsolutePosition
- = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
- Animator.ResetAnimations();
- }
-
- ///
- /// Computes which child agents to close when the scene presence moves to another region.
- /// Removes those regions from m_knownRegions.
- ///
- /// The new region's x on the map
- /// The new region's y on the map
- ///
- public void CloseChildAgents(uint newRegionX, uint newRegionY)
- {
- List byebyeRegions = new List();
- m_log.DebugFormat(
- "[SCENE PRESENCE]: Closing child agents. Checking {0} regions in {1}",
- m_knownChildRegions.Keys.Count, Scene.RegionInfo.RegionName);
- //DumpKnownRegions();
-
- lock (m_knownChildRegions)
- {
- foreach (ulong handle in m_knownChildRegions.Keys)
- {
- // Don't close the agent on this region yet
- if (handle != Scene.RegionInfo.RegionHandle)
- {
- uint x, y;
- Utils.LongToUInts(handle, out x, out y);
- x = x / Constants.RegionSize;
- y = y / Constants.RegionSize;
-
- //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
- //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
- if (Util.IsOutsideView(x, newRegionX, y, newRegionY))
- {
- byebyeRegions.Add(handle);
- }
- }
- }
- }
-
- if (byebyeRegions.Count > 0)
- {
- m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents");
- m_scene.SceneGridService.SendCloseChildAgentConnections(m_controllingClient.AgentId, byebyeRegions);
- }
-
- foreach (ulong handle in byebyeRegions)
- {
- RemoveNeighbourRegion(handle);
- }
- }
-
- #endregion
-
- ///
- /// This allows the Sim owner the abiility to kick users from their sim currently.
- /// It tells the client that the agent has permission to do so.
- ///
- public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus)
- {
- if (godStatus)
- {
- // For now, assign god level 200 to anyone
- // who is granted god powers, but has no god level set.
- //
- UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID);
- if (account != null)
- {
- if (account.UserLevel > 0)
- m_godLevel = account.UserLevel;
- else
- m_godLevel = 200;
- }
- }
- else
- {
- m_godLevel = 0;
- }
-
- ControllingClient.SendAdminResponse(token, (uint)m_godLevel);
- }
-
- #region Child Agent Updates
-
- public void ChildAgentDataUpdate(AgentData cAgentData)
- {
- //m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName);
- if (!IsChildAgent)
- return;
-
- CopyFrom(cAgentData);
- }
-
- ///
- /// 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
- ///
- public void ChildAgentDataUpdate(AgentPosition cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
- {
- if (!IsChildAgent)
- return;
-
- //m_log.Debug(" >>> ChildAgentPositionUpdate <<< " + rRegionX + "-" + rRegionY);
- int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
- int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
-
- Vector3 offset = new Vector3(shiftx, shifty, 0f);
-
- m_DrawDistance = cAgentData.Far;
- if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
- m_pos = cAgentData.Position + offset;
-
- if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
- {
- posLastSignificantMove = AbsolutePosition;
- ReprioritizeUpdates();
- }
-
- m_CameraCenter = cAgentData.Center + offset;
-
- m_avHeight = cAgentData.Size.Z;
- //SetHeight(cAgentData.AVHeight);
-
- if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0)
- 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_sceneViewer.Reset();
-
- //cAgentData.AVHeight;
- m_rootRegionHandle = cAgentData.RegionHandle;
- //m_velocity = cAgentData.Velocity;
- }
-
- public void CopyTo(AgentData cAgent)
- {
- cAgent.AgentID = UUID;
- cAgent.RegionID = Scene.RegionInfo.RegionID;
-
- cAgent.Position = AbsolutePosition;
- cAgent.Velocity = m_velocity;
- cAgent.Center = m_CameraCenter;
- // Don't copy the size; it is inferred from apearance parameters
- //cAgent.Size = new Vector3(0, 0, m_avHeight);
- cAgent.AtAxis = m_CameraAtAxis;
- cAgent.LeftAxis = m_CameraLeftAxis;
- cAgent.UpAxis = m_CameraUpAxis;
-
- cAgent.Far = m_DrawDistance;
-
- // Throttles
- float multiplier = 1;
- int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
- if (innacurateNeighbors != 0)
- {
- multiplier = 1f / innacurateNeighbors;
- }
- if (multiplier <= 0f)
- {
- multiplier = 0.25f;
- }
- //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
- cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier);
-
- cAgent.HeadRotation = m_headrotation;
- cAgent.BodyRotation = m_bodyRot;
- cAgent.ControlFlags = (uint)m_AgentControlFlags;
-
- if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
- cAgent.GodLevel = (byte)m_godLevel;
- else
- cAgent.GodLevel = (byte) 0;
-
- cAgent.AlwaysRun = m_setAlwaysRun;
-
- try
- {
- // We might not pass the Wearables in all cases...
- // They're only needed so that persistent changes to the appearance
- // are preserved in the new region where the user is moving to.
- // But in Hypergrid we might not let this happen.
- int i = 0;
- UUID[] wears = new UUID[m_appearance.Wearables.Length * 2];
- foreach (AvatarWearable aw in m_appearance.Wearables)
- {
- if (aw != null)
- {
- wears[i++] = aw.ItemID;
- wears[i++] = aw.AssetID;
- }
- else
- {
- wears[i++] = UUID.Zero;
- wears[i++] = UUID.Zero;
- }
- }
- cAgent.Wearables = wears;
-
- cAgent.VisualParams = m_appearance.VisualParams;
-
- if (m_appearance.Texture != null)
- cAgent.AgentTextures = m_appearance.Texture.GetBytes();
- }
- catch (Exception e)
- {
- m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message);
- }
-
- //Attachments
- List attPoints = m_appearance.GetAttachedPoints();
- if (attPoints != null)
- {
- //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
- int i = 0;
- AttachmentData[] attachs = new AttachmentData[attPoints.Count];
- foreach (int point in attPoints)
- {
- attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
- }
- cAgent.Attachments = attachs;
- }
-
- lock (scriptedcontrols)
- {
- ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
- int i = 0;
-
- foreach (ScriptControllers c in scriptedcontrols.Values)
- {
- controls[i++] = new ControllerData(c.itemID, (uint)c.ignoreControls, (uint)c.eventControls);
- }
- cAgent.Controllers = controls;
- }
-
- // Animations
- try
- {
- cAgent.Anims = Animator.Animations.ToArray();
- }
- catch { }
-
- // cAgent.GroupID = ??
- // Groups???
-
- }
-
- public void CopyFrom(AgentData cAgent)
- {
- m_originRegionID = cAgent.RegionID;
-
- m_callbackURI = cAgent.CallbackURI;
-
- m_pos = cAgent.Position;
-
- m_velocity = cAgent.Velocity;
- m_CameraCenter = cAgent.Center;
- //m_avHeight = cAgent.Size.Z;
- m_CameraAtAxis = cAgent.AtAxis;
- m_CameraLeftAxis = cAgent.LeftAxis;
- m_CameraUpAxis = cAgent.UpAxis;
-
- m_DrawDistance = cAgent.Far;
-
- if ((cAgent.Throttles != null) && cAgent.Throttles.Length > 0)
- ControllingClient.SetChildAgentThrottle(cAgent.Throttles);
-
- m_headrotation = cAgent.HeadRotation;
- m_bodyRot = cAgent.BodyRotation;
- m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
-
- if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
- m_godLevel = cAgent.GodLevel;
- m_setAlwaysRun = cAgent.AlwaysRun;
-
- uint i = 0;
- try
- {
- if (cAgent.Wearables == null)
- cAgent.Wearables = new UUID[0];
- AvatarWearable[] wears = new AvatarWearable[cAgent.Wearables.Length / 2];
- for (uint n = 0; n < cAgent.Wearables.Length; n += 2)
- {
- UUID itemId = cAgent.Wearables[n];
- UUID assetId = cAgent.Wearables[n + 1];
- wears[i++] = new AvatarWearable(itemId, assetId);
- }
- m_appearance.Wearables = wears;
- Primitive.TextureEntry te;
- if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
- te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
- else
- te = AvatarAppearance.GetDefaultTexture();
- if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
- cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams();
- m_appearance.SetAppearance(te, (byte[])cAgent.VisualParams.Clone());
- }
- catch (Exception e)
- {
- m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message);
- }
-
- // Attachments
- try
- {
- if (cAgent.Attachments != null)
- {
- m_appearance.ClearAttachments();
- foreach (AttachmentData att in cAgent.Attachments)
- {
- m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
- }
- }
- }
- catch { }
-
- try
- {
- lock (scriptedcontrols)
- {
- if (cAgent.Controllers != null)
- {
- scriptedcontrols.Clear();
-
- foreach (ControllerData c in cAgent.Controllers)
- {
- ScriptControllers sc = new ScriptControllers();
- sc.itemID = c.ItemID;
- sc.ignoreControls = (ScriptControlled)c.IgnoreControls;
- sc.eventControls = (ScriptControlled)c.EventControls;
-
- scriptedcontrols[sc.itemID] = sc;
- }
- }
- }
- }
- catch { }
- // Animations
- try
- {
- Animator.ResetAnimations();
- Animator.Animations.FromArray(cAgent.Anims);
- }
- catch { }
-
- //cAgent.GroupID = ??
- //Groups???
- }
-
- public bool CopyAgent(out IAgentData agent)
- {
- agent = new CompleteAgentData();
- CopyTo((AgentData)agent);
- return true;
- }
-
- #endregion Child Agent Updates
-
- ///
- /// Handles part of the PID controller function for moving an avatar.
- ///
- public override void UpdateMovement()
- {
- if (m_forceToApply.HasValue)
- {
-
- Vector3 force = m_forceToApply.Value;
- m_updateflag = true;
- Velocity = force;
-
- m_forceToApply = null;
- }
- else
- {
- if (m_isNudging)
- {
- Vector3 force = Vector3.Zero;
-
- m_updateflag = true;
- Velocity = force;
- m_isNudging = false;
- m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
- }
- }
- }
-
- public override void SetText(string text, Vector3 color, double alpha)
- {
- throw new Exception("Can't set Text on avatar.");
- }
-
- ///
- /// Adds a physical representation of the avatar to the Physics plugin
- ///
- public void AddToPhysicalScene(bool isFlying)
- {
- PhysicsScene scene = m_scene.PhysicsScene;
-
- Vector3 pVec = AbsolutePosition;
-
- // Old bug where the height was in centimeters instead of meters
- if (m_avHeight == 127.0f)
- {
- m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new Vector3(0f, 0f, 1.56f),
- isFlying);
- }
- else
- {
- m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec,
- new Vector3(0f, 0f, m_avHeight), isFlying);
- }
- scene.AddPhysicsActorTaint(m_physicsActor);
- //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
- m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
- m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
- m_physicsActor.SubscribeEvents(500);
- m_physicsActor.LocalID = LocalId;
- }
-
- private void OutOfBoundsCall(Vector3 pos)
- {
- //bool flying = m_physicsActor.Flying;
- //RemoveFromPhysicalScene();
-
- //AddToPhysicalScene(flying);
- if (ControllingClient != null)
- ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.", true);
- }
-
- // Event called by the physics plugin to tell the avatar about a collision.
- private void PhysicsCollisionUpdate(EventArgs e)
- {
- if (e == null)
- return;
-
- // The Physics Scene will send (spam!) updates every 500 ms grep: m_physicsActor.SubscribeEvents(
- // as of this comment the interval is set in AddToPhysicalScene
- if (Animator!=null)
- {
- if (m_updateCount > 0) //KF: DO NOT call UpdateMovementAnimations outside of the m_updateCount wrapper,
- { // else its will lock out other animation changes, like ground sit.
- Animator.UpdateMovementAnimations();
- m_updateCount--;
- }
- }
-
- CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
- Dictionary coldata = collisionData.m_objCollisionList;
-
- CollisionPlane = Vector4.UnitW;
-
- if (m_lastColCount != coldata.Count)
- {
- m_updateCount = UPDATE_COUNT;
- m_lastColCount = coldata.Count;
- }
-
- if (coldata.Count != 0 && Animator != null)
- {
- switch (Animator.CurrentMovementAnimation)
- {
- case "STAND":
- case "WALK":
- case "RUN":
- case "CROUCH":
- case "CROUCHWALK":
- {
- ContactPoint lowest;
- lowest.SurfaceNormal = Vector3.Zero;
- lowest.Position = Vector3.Zero;
- lowest.Position.Z = Single.NaN;
-
- foreach (ContactPoint contact in coldata.Values)
- {
- if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
- {
- lowest = contact;
- }
- }
-
- CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
- }
- break;
- }
- }
-
- List thisHitColliders = new List();
- List endedColliders = new List();
- List startedColliders = new List();
-
- foreach (uint localid in coldata.Keys)
- {
- thisHitColliders.Add(localid);
- if (!m_lastColliders.Contains(localid))
- {
- startedColliders.Add(localid);
- }
- //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
- }
-
- // calculate things that ended colliding
- foreach (uint localID in m_lastColliders)
- {
- if (!thisHitColliders.Contains(localID))
- {
- endedColliders.Add(localID);
- }
- }
- //add the items that started colliding this time to the last colliders list.
- foreach (uint localID in startedColliders)
- {
- m_lastColliders.Add(localID);
- }
- // remove things that ended colliding from the last colliders list
- foreach (uint localID in endedColliders)
- {
- m_lastColliders.Remove(localID);
- }
-
- // do event notification
- if (startedColliders.Count > 0)
- {
- ColliderArgs StartCollidingMessage = new ColliderArgs();
- List colliding = new List();
- foreach (uint localId in startedColliders)
- {
- if (localId == 0)
- continue;
-
- SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
- string data = "";
- if (obj != null)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = obj.UUID;
- detobj.nameStr = obj.Name;
- detobj.ownerUUID = obj.OwnerID;
- detobj.posVector = obj.AbsolutePosition;
- detobj.rotQuat = obj.GetWorldRotation();
- detobj.velVector = obj.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = obj.GroupID;
- colliding.Add(detobj);
- }
- }
-
- if (colliding.Count > 0)
- {
- StartCollidingMessage.Colliders = colliding;
-
- foreach (SceneObjectGroup att in Attachments)
- Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
- }
- }
-
- if (endedColliders.Count > 0)
- {
- ColliderArgs EndCollidingMessage = new ColliderArgs();
- List colliding = new List();
- foreach (uint localId in endedColliders)
- {
- if (localId == 0)
- continue;
-
- SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
- string data = "";
- if (obj != null)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = obj.UUID;
- detobj.nameStr = obj.Name;
- detobj.ownerUUID = obj.OwnerID;
- detobj.posVector = obj.AbsolutePosition;
- detobj.rotQuat = obj.GetWorldRotation();
- detobj.velVector = obj.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = obj.GroupID;
- colliding.Add(detobj);
- }
- }
-
- if (colliding.Count > 0)
- {
- EndCollidingMessage.Colliders = colliding;
-
- foreach (SceneObjectGroup att in Attachments)
- Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage);
- }
- }
-
- if (thisHitColliders.Count > 0)
- {
- ColliderArgs CollidingMessage = new ColliderArgs();
- List colliding = new List();
- foreach (uint localId in thisHitColliders)
- {
- if (localId == 0)
- continue;
-
- SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
- string data = "";
- if (obj != null)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = obj.UUID;
- detobj.nameStr = obj.Name;
- detobj.ownerUUID = obj.OwnerID;
- detobj.posVector = obj.AbsolutePosition;
- detobj.rotQuat = obj.GetWorldRotation();
- detobj.velVector = obj.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = obj.GroupID;
- colliding.Add(detobj);
- }
- }
-
- if (colliding.Count > 0)
- {
- CollidingMessage.Colliders = colliding;
-
- lock (m_attachments)
- {
- foreach (SceneObjectGroup att in m_attachments)
- Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
- }
- }
- }
-
- if (m_invulnerable)
- return;
-
- float starthealth = Health;
- uint killerObj = 0;
- foreach (uint localid in coldata.Keys)
- {
- SceneObjectPart part = Scene.GetSceneObjectPart(localid);
-
- if (part != null && part.ParentGroup.Damage != -1.0f)
- Health -= part.ParentGroup.Damage;
- else
- {
- if (coldata[localid].PenetrationDepth >= 0.10f)
- Health -= coldata[localid].PenetrationDepth * 5.0f;
- }
-
- if (Health <= 0.0f)
- {
- if (localid != 0)
- killerObj = localid;
- }
- //m_log.Debug("[AVATAR]: Collision with localid: " + localid.ToString() + " at depth: " + coldata[localid].ToString());
- }
- //Health = 100;
- if (!m_invulnerable)
- {
- if (starthealth != Health)
- {
- ControllingClient.SendHealth(Health);
- }
- if (m_health <= 0)
- m_scene.EventManager.TriggerAvatarKill(killerObj, this);
- }
- }
-
- public void setHealthWithUpdate(float health)
- {
- Health = health;
- ControllingClient.SendHealth(Health);
- }
-
- public void Close()
- {
- lock (m_attachments)
- {
- // Delete attachments from scene
- // Don't try to save, as this thread won't live long
- // enough to complete the save. This would cause no copy
- // attachments to poof!
- //
- foreach (SceneObjectGroup grp in m_attachments)
- {
- m_scene.DeleteSceneObject(grp, false);
- }
- m_attachments.Clear();
- }
-
- lock (m_knownChildRegions)
- {
- m_knownChildRegions.Clear();
- }
-
- lock (m_reprioritization_timer)
- {
- m_reprioritization_timer.Enabled = false;
- m_reprioritization_timer.Elapsed -= new ElapsedEventHandler(Reprioritize);
- }
-
- // I don't get it but mono crashes when you try to dispose of this timer,
- // unsetting the elapsed callback should be enough to allow for cleanup however.
- // m_reprioritizationTimer.Dispose();
-
- m_sceneViewer.Close();
-
- RemoveFromPhysicalScene();
- m_animator.Close();
- m_animator = null;
- }
-
- public void AddAttachment(SceneObjectGroup gobj)
- {
- lock (m_attachments)
- {
- m_attachments.Add(gobj);
- }
- }
-
- public bool HasAttachments()
- {
- return m_attachments.Count > 0;
- }
-
- public bool HasScriptedAttachments()
- {
- lock (m_attachments)
- {
- foreach (SceneObjectGroup gobj in m_attachments)
- {
- if (gobj != null)
- {
- if (gobj.RootPart.Inventory.ContainsScripts())
- return true;
- }
- }
- }
- return false;
- }
-
- public void RemoveAttachment(SceneObjectGroup gobj)
- {
- lock (m_attachments)
- {
- if (m_attachments.Contains(gobj))
- {
- m_attachments.Remove(gobj);
- }
- }
- }
-
- public bool ValidateAttachments()
- {
- lock (m_attachments)
- {
- // Validate
- foreach (SceneObjectGroup gobj in m_attachments)
- {
- if (gobj == null)
- return false;
-
- if (gobj.IsDeleted)
- return false;
- }
- }
- return true;
- }
-
- ///
- /// Send a script event to this scene presence's attachments
- ///
- /// The name of the event
- /// The arguments for the event
- public void SendScriptEventToAttachments(string eventName, Object[] args)
- {
- if (m_scriptEngines != null)
- {
- lock (m_attachments)
- {
- foreach (SceneObjectGroup grp in m_attachments)
- {
- // 16384 is CHANGED_ANIMATION
- //
- // Send this to all attachment root prims
- //
- foreach (IScriptModule m in m_scriptEngines)
- {
- if (m == null) // No script engine loaded
- continue;
-
- m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION });
- }
- }
- }
- }
- }
-
-
- public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene)
- {
- m_controllingClient = client;
- m_regionInfo = region;
- m_scene = scene;
-
- RegisterToEvents();
- if (m_controllingClient != null)
- {
- m_controllingClient.ProcessPendingPackets();
- }
- /*
- AbsolutePosition = client.StartPos;
-
- Animations = new AvatarAnimations();
- Animations.LoadAnims();
-
- m_animations = new List();
- m_animations.Add(Animations.AnimsUUID["STAND"]);
- m_animationSeqs.Add(m_controllingClient.NextAnimationSequenceNumber);
-
- SetDirectionVectors();
- */
- }
-
- internal void PushForce(Vector3 impulse)
- {
- if (PhysicsActor != null)
- {
- PhysicsActor.AddForce(impulse,true);
- }
- }
-
- public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID)
- {
- ScriptControllers obj = new ScriptControllers();
- obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
- obj.eventControls = ScriptControlled.CONTROL_ZERO;
-
- obj.itemID = Script_item_UUID;
- if (pass_on == 0 && accept == 0)
- {
- IgnoredControls |= (ScriptControlled)controls;
- obj.ignoreControls = (ScriptControlled)controls;
- }
-
- if (pass_on == 0 && accept == 1)
- {
- IgnoredControls |= (ScriptControlled)controls;
- obj.ignoreControls = (ScriptControlled)controls;
- obj.eventControls = (ScriptControlled)controls;
- }
- if (pass_on == 1 && accept == 1)
- {
- IgnoredControls = ScriptControlled.CONTROL_ZERO;
- obj.eventControls = (ScriptControlled)controls;
- obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
- }
-
- lock (scriptedcontrols)
- {
- if (pass_on == 1 && accept == 0)
- {
- IgnoredControls &= ~(ScriptControlled)controls;
- if (scriptedcontrols.ContainsKey(Script_item_UUID))
- scriptedcontrols.Remove(Script_item_UUID);
- }
- else
- {
- scriptedcontrols[Script_item_UUID] = obj;
- }
- }
- ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
- }
-
- public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID)
- {
- IgnoredControls = ScriptControlled.CONTROL_ZERO;
- lock (scriptedcontrols)
- {
- scriptedcontrols.Clear();
- }
- ControllingClient.SendTakeControls(int.MaxValue, false, false);
- }
-
- public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
- {
- ScriptControllers takecontrols;
-
- lock (scriptedcontrols)
- {
- if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
- {
- ScriptControlled sctc = takecontrols.eventControls;
-
- ControllingClient.SendTakeControls((int)sctc, false, false);
- ControllingClient.SendTakeControls((int)sctc, true, false);
-
- scriptedcontrols.Remove(Script_item_UUID);
- IgnoredControls = ScriptControlled.CONTROL_ZERO;
- foreach (ScriptControllers scData in scriptedcontrols.Values)
- {
- IgnoredControls |= scData.ignoreControls;
- }
- }
- }
- }
-
- internal void SendControlToScripts(uint flags)
- {
- ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;
-
- if (MouseDown)
- {
- allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
- {
- allflags = ScriptControlled.CONTROL_ZERO;
- MouseDown = true;
- }
- }
-
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
- {
- allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
- MouseDown = true;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
- {
- allflags |= ScriptControlled.CONTROL_LBUTTON;
- MouseDown = true;
- }
-
- // find all activated controls, whether the scripts are interested in them or not
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
- {
- allflags |= ScriptControlled.CONTROL_FWD;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
- {
- allflags |= ScriptControlled.CONTROL_BACK;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
- {
- allflags |= ScriptControlled.CONTROL_UP;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
- {
- allflags |= ScriptControlled.CONTROL_DOWN;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
- {
- allflags |= ScriptControlled.CONTROL_LEFT;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
- {
- allflags |= ScriptControlled.CONTROL_RIGHT;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
- {
- allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
- }
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
- {
- allflags |= ScriptControlled.CONTROL_ROT_LEFT;
- }
- // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
- if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
- {
- lock (scriptedcontrols)
- {
- foreach (KeyValuePair kvp in scriptedcontrols)
- {
- UUID scriptUUID = kvp.Key;
- ScriptControllers scriptControlData = kvp.Value;
-
- ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
- ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
- ScriptControlled localChange = localHeld ^ localLast; // the changed bits
- if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
- {
- // only send if still pressed or just changed
- m_scene.EventManager.TriggerControlEvent(scriptUUID, UUID, (uint)localHeld, (uint)localChange);
- }
- }
- }
- }
-
- LastCommands = allflags;
- }
-
- internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
- {
- if (ignored == ScriptControlled.CONTROL_ZERO)
- return flags;
-
- if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
- if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
- if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
- if ((ignored & ScriptControlled.CONTROL_UP) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
- if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
- if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
- if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
- if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
- if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
- if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
- flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
-
- //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
- //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
- //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
- //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
- //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
- //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
- //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
-
- return flags;
- }
-
- ///
- /// RezAttachments. This should only be called upon login on the first region.
- /// Attachment rezzings on crossings and TPs are done in a different way.
- ///
- public void RezAttachments()
- {
- if (null == m_appearance)
- {
- m_log.WarnFormat("[ATTACHMENT]: Appearance has not been initialized for agent {0}", UUID);
- return;
- }
-
- XmlDocument doc = new XmlDocument();
- string stateData = String.Empty;
-
- IAttachmentsService attServ = m_scene.RequestModuleInterface();
- if (attServ != null)
- {
- m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
- stateData = attServ.Get(ControllingClient.AgentId.ToString());
- if (stateData != String.Empty)
- {
- try
- {
- doc.LoadXml(stateData);
- }
- catch { }
- }
- }
-
- Dictionary itemData = new Dictionary();
-
- XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
- if (nodes.Count > 0)
- {
- foreach (XmlNode n in nodes)
- {
- XmlElement elem = (XmlElement)n;
- string itemID = elem.GetAttribute("ItemID");
- string xml = elem.InnerXml;
-
- itemData[new UUID(itemID)] = xml;
- }
- }
-
- List attPoints = m_appearance.GetAttachedPoints();
- foreach (int p in attPoints)
- {
- if (m_isDeleted)
- return;
-
- UUID itemID = m_appearance.GetAttachedItem(p);
- UUID assetID = m_appearance.GetAttachedAsset(p);
-
- // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
- // But they're not used anyway, the item is being looked up for now, so let's proceed.
- //if (UUID.Zero == assetID)
- //{
- // m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
- // continue;
- //}
-
- try
- {
- string xmlData;
- XmlDocument d = new XmlDocument();
- UUID asset;
- if (itemData.TryGetValue(itemID, out xmlData))
- {
- d.LoadXml(xmlData);
- m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", itemID);
-
- // Rez from inventory
- asset
- = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, d);
-
- }
- else
- {
- // Rez from inventory (with a null doc to let
- // CHANGED_OWNER happen)
- asset
- = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, null);
- }
-
- m_log.InfoFormat(
- "[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
- p, itemID, assetID, asset);
- }
- catch (Exception e)
- {
- m_log.ErrorFormat("[ATTACHMENT]: Unable to rez attachment: {0}", e.ToString());
- }
- }
- }
-
- private void ReprioritizeUpdates()
- {
- if (Scene.IsReprioritizationEnabled && Scene.UpdatePrioritizationScheme != UpdatePrioritizationSchemes.Time)
- {
- lock (m_reprioritization_timer)
- {
- if (!m_reprioritizing)
- m_reprioritization_timer.Enabled = m_reprioritizing = true;
- else
- m_reprioritization_called = true;
- }
- }
- }
-
- private void Reprioritize(object sender, ElapsedEventArgs e)
- {
- m_controllingClient.ReprioritizeUpdates();
-
- lock (m_reprioritization_timer)
- {
- m_reprioritization_timer.Enabled = m_reprioritizing = m_reprioritization_called;
- m_reprioritization_called = false;
- }
- }
-
- private Vector3 Quat2Euler(Quaternion rot){
- float x = Utils.RAD_TO_DEG * (float)Math.Atan2((double)((2.0f * rot.X * rot.W) - (2.0f * rot.Y * rot.Z)) ,
- (double)(1 - (2.0f * rot.X * rot.X) - (2.0f * rot.Z * rot.Z)));
- float y = Utils.RAD_TO_DEG * (float)Math.Asin ((double)((2.0f * rot.X * rot.Y) + (2.0f * rot.Z * rot.W)));
- float z = Utils.RAD_TO_DEG * (float)Math.Atan2(((double)(2.0f * rot.Y * rot.W) - (2.0f * rot.X * rot.Z)) ,
- (double)(1 - (2.0f * rot.Y * rot.Y) - (2.0f * rot.Z * rot.Z)));
- return(new Vector3(x,y,z));
- }
-
-
- }
-}
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Xml;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Timers;
+using OpenMetaverse;
+using log4net;
+using OpenSim.Framework;
+using OpenSim.Framework.Client;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes.Animation;
+using OpenSim.Region.Framework.Scenes.Types;
+using OpenSim.Region.Physics.Manager;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Services.Interfaces;
+
+namespace OpenSim.Region.Framework.Scenes
+{
+ enum ScriptControlled : uint
+ {
+ CONTROL_ZERO = 0,
+ CONTROL_FWD = 1,
+ CONTROL_BACK = 2,
+ CONTROL_LEFT = 4,
+ CONTROL_RIGHT = 8,
+ CONTROL_UP = 16,
+ CONTROL_DOWN = 32,
+ CONTROL_ROT_LEFT = 256,
+ CONTROL_ROT_RIGHT = 512,
+ CONTROL_LBUTTON = 268435456,
+ CONTROL_ML_LBUTTON = 1073741824
+ }
+
+ struct ScriptControllers
+ {
+ public UUID itemID;
+ public ScriptControlled ignoreControls;
+ public ScriptControlled eventControls;
+ }
+
+ public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence, List coarseLocations, List avatarUUIDs);
+
+ public class ScenePresence : EntityBase, ISceneEntity
+ {
+// ~ScenePresence()
+// {
+// m_log.Debug("[ScenePresence] Destructor called");
+// }
+
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
+// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
+ private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
+ private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
+
+ ///
+ /// Experimentally determined "fudge factor" to make sit-target positions
+ /// the same as in SecondLife. Fudge factor was tested for 36 different
+ /// test cases including prims of type box, sphere, cylinder, and torus,
+ /// with varying parameters for sit target location, prim size, prim
+ /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
+ /// issue #1716
+ ///
+// private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
+ // Value revised by KF 091121 by comparison with SL.
+ private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f);
+
+ public UUID currentParcelUUID = UUID.Zero;
+
+ private ISceneViewer m_sceneViewer;
+
+ ///
+ /// The animator for this avatar
+ ///
+ public ScenePresenceAnimator Animator
+ {
+ get { return m_animator; }
+ }
+ protected ScenePresenceAnimator m_animator;
+
+ ///
+ /// The scene objects attached to this avatar. Do not change this list directly - use methods such as
+ /// AddAttachment() and RemoveAttachment(). Lock this list when performing any read operations upon it.
+ ///
+ public List Attachments
+ {
+ get { return m_attachments; }
+ }
+ protected List m_attachments = new List();
+
+ private Dictionary scriptedcontrols = new Dictionary();
+ private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
+ private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
+ private bool MouseDown = false;
+ private SceneObjectGroup proxyObjectGroup;
+ //private SceneObjectPart proxyObjectPart = null;
+ public Vector3 lastKnownAllowedPosition;
+ public bool sentMessageAboutRestrictedParcelFlyingDown;
+ public Vector4 CollisionPlane = Vector4.UnitW;
+
+ private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
+ private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
+ private Vector3 m_lastPosition;
+ private Vector3 m_lastWorldPosition;
+ private Quaternion m_lastRotation;
+ private Vector3 m_lastVelocity;
+ //private int m_lastTerseSent;
+
+ private bool m_updateflag;
+ private byte m_movementflag;
+ private Vector3? m_forceToApply;
+ private uint m_requestedSitTargetID;
+ private UUID m_requestedSitTargetUUID;
+ public bool SitGround = false;
+
+ private SendCourseLocationsMethod m_sendCourseLocationsMethod;
+
+ private bool m_startAnimationSet;
+
+ //private Vector3 m_requestedSitOffset = new Vector3();
+
+ private Vector3 m_LastFinitePos;
+
+ private float m_sitAvatarHeight = 2.0f;
+
+ private int m_godLevel;
+ private int m_userLevel;
+
+ private bool m_invulnerable = true;
+
+ private Vector3 m_lastChildAgentUpdatePosition;
+ private Vector3 m_lastChildAgentUpdateCamPosition;
+
+ private int m_perfMonMS;
+
+ private bool m_setAlwaysRun;
+ private bool m_forceFly;
+ private bool m_flyDisabled;
+
+ private float m_speedModifier = 1.0f;
+
+ private Quaternion m_bodyRot= Quaternion.Identity;
+
+ private Quaternion m_bodyRotPrevious = Quaternion.Identity;
+
+ private const int LAND_VELOCITYMAG_MAX = 12;
+
+ public bool IsRestrictedToRegion;
+
+ public string JID = String.Empty;
+
+ private float m_health = 100f;
+
+ // Default AV Height
+ private float m_avHeight = 127.0f;
+
+ protected RegionInfo m_regionInfo;
+ protected ulong crossingFromRegion;
+
+ private readonly Vector3[] Dir_Vectors = new Vector3[11];
+ private bool m_isNudging = false;
+
+ // Position of agent's camera in world (region cordinates)
+ protected Vector3 m_CameraCenter;
+ protected Vector3 m_lastCameraCenter;
+
+ protected Timer m_reprioritization_timer;
+ protected bool m_reprioritizing;
+ protected bool m_reprioritization_called;
+
+ // Use these three vectors to figure out what the agent is looking at
+ // Convert it to a Matrix and/or Quaternion
+ protected Vector3 m_CameraAtAxis;
+ protected Vector3 m_CameraLeftAxis;
+ protected Vector3 m_CameraUpAxis;
+ private AgentManager.ControlFlags m_AgentControlFlags;
+ private Quaternion m_headrotation = Quaternion.Identity;
+ private byte m_state;
+
+ //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
+// private Vector3 movementvector;
+
+ private bool m_autopilotMoving;
+ private Vector3 m_autoPilotTarget;
+ private bool m_sitAtAutoTarget;
+ private Vector3 m_initialSitTarget = Vector3.Zero; //KF: First estimate of where to sit
+
+ private string m_nextSitAnimation = String.Empty;
+
+ //PauPaw:Proper PID Controler for autopilot************
+ private bool m_moveToPositionInProgress;
+ private Vector3 m_moveToPositionTarget;
+ private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+
+ private bool m_followCamAuto;
+
+ private int m_movementUpdateCount;
+ private int m_lastColCount = -1; //KF: Look for Collision chnages
+ private int m_updateCount = 0; //KF: Update Anims for a while
+ private static readonly int UPDATE_COUNT = 10; // how many frames to update for
+ private const int NumMovementsBetweenRayCast = 5;
+ private List m_lastColliders = new List();
+
+ private bool CameraConstraintActive;
+ //private int m_moveToPositionStateStatus;
+ //*****************************************************
+
+ // Agent's Draw distance.
+ protected float m_DrawDistance;
+
+ protected AvatarAppearance m_appearance;
+
+ // neighbouring regions we have enabled a child agent in
+ // holds the seed cap for the child agent in that region
+ private Dictionary m_knownChildRegions = new Dictionary();
+
+ ///
+ /// Implemented Control Flags
+ ///
+ private enum Dir_ControlFlags
+ {
+ DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
+ DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
+ DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
+ DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
+ DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
+ DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
+ DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS,
+ DIR_CONTROL_FLAG_BACK_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG,
+ DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS,
+ DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG,
+ DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
+ }
+
+ ///
+ /// Position at which a significant movement was made
+ ///
+ private Vector3 posLastSignificantMove;
+
+ // For teleports and crossings callbacks
+ string m_callbackURI;
+ UUID m_originRegionID;
+
+ ulong m_rootRegionHandle;
+
+ ///
+ /// Script engines present in the scene
+ ///
+ private IScriptModule[] m_scriptEngines;
+
+ #region Properties
+
+ ///
+ /// Physical scene representation of this Avatar.
+ ///
+ public PhysicsActor PhysicsActor
+ {
+ set { m_physicsActor = value; }
+ get { return m_physicsActor; }
+ }
+
+ public byte MovementFlag
+ {
+ set { m_movementflag = value; }
+ get { return m_movementflag; }
+ }
+
+ public bool Updated
+ {
+ set { m_updateflag = value; }
+ get { return m_updateflag; }
+ }
+
+ public bool Invulnerable
+ {
+ set { m_invulnerable = value; }
+ get { return m_invulnerable; }
+ }
+
+ public int UserLevel
+ {
+ get { return m_userLevel; }
+ }
+
+ public int GodLevel
+ {
+ get { return m_godLevel; }
+ }
+
+ public ulong RegionHandle
+ {
+ get { return m_rootRegionHandle; }
+ }
+
+ public Vector3 CameraPosition
+ {
+ get { return m_CameraCenter; }
+ }
+
+ public Quaternion CameraRotation
+ {
+ get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); }
+ }
+
+ public Vector3 CameraAtAxis
+ {
+ get { return m_CameraAtAxis; }
+ }
+
+ public Vector3 CameraLeftAxis
+ {
+ get { return m_CameraLeftAxis; }
+ }
+
+ public Vector3 CameraUpAxis
+ {
+ get { return m_CameraUpAxis; }
+ }
+
+ public Vector3 Lookat
+ {
+ get
+ {
+ Vector3 a = new Vector3(m_CameraAtAxis.X, m_CameraAtAxis.Y, 0);
+
+ if (a == Vector3.Zero)
+ return a;
+
+ return Util.GetNormalizedVector(a);
+ }
+ }
+
+ private readonly string m_firstname;
+
+ public string Firstname
+ {
+ get { return m_firstname; }
+ }
+
+ private readonly string m_lastname;
+
+ public string Lastname
+ {
+ get { return m_lastname; }
+ }
+
+ private string m_grouptitle;
+
+ public string Grouptitle
+ {
+ get { return m_grouptitle; }
+ set { m_grouptitle = value; }
+ }
+
+ public float DrawDistance
+ {
+ get { return m_DrawDistance; }
+ }
+
+ protected bool m_allowMovement = true;
+
+ public bool AllowMovement
+ {
+ get { return m_allowMovement; }
+ set { m_allowMovement = value; }
+ }
+
+ public bool SetAlwaysRun
+ {
+ get
+ {
+ if (PhysicsActor != null)
+ {
+ return PhysicsActor.SetAlwaysRun;
+ }
+ else
+ {
+ return m_setAlwaysRun;
+ }
+ }
+ set
+ {
+ m_setAlwaysRun = value;
+ if (PhysicsActor != null)
+ {
+ PhysicsActor.SetAlwaysRun = value;
+ }
+ }
+ }
+
+ public byte State
+ {
+ get { return m_state; }
+ set { m_state = value; }
+ }
+
+ public uint AgentControlFlags
+ {
+ get { return (uint)m_AgentControlFlags; }
+ set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
+ }
+
+ ///
+ /// This works out to be the ClientView object associated with this avatar, or it's client connection manager
+ ///
+ private IClientAPI m_controllingClient;
+
+ protected PhysicsActor m_physicsActor;
+
+ ///
+ /// The client controlling this presence
+ ///
+ public IClientAPI ControllingClient
+ {
+ get { return m_controllingClient; }
+ }
+
+ public IClientCore ClientView
+ {
+ get { return (IClientCore) m_controllingClient; }
+ }
+
+ protected Vector3 m_parentPosition;
+ public Vector3 ParentPosition
+ {
+ get { return m_parentPosition; }
+ set { m_parentPosition = value; }
+ }
+
+ ///
+ /// Position of this avatar relative to the region the avatar is in
+ ///
+ public override Vector3 AbsolutePosition
+ {
+ get
+ {
+ PhysicsActor actor = m_physicsActor;
+// if (actor != null)
+ if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
+ m_pos = actor.Position;
+
+ // If we're sitting, we need to update our position
+ if (m_parentID != 0)
+ {
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
+ if (part != null)
+ m_parentPosition = part.AbsolutePosition;
+ }
+
+ return m_parentPosition + m_pos;
+ }
+ set
+ {
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
+ {
+ try
+ {
+ lock (m_scene.SyncRoot)
+ m_physicsActor.Position = value;
+ }
+ catch (Exception e)
+ {
+ m_log.Error("[SCENEPRESENCE]: ABSOLUTE POSITION " + e.Message);
+ }
+ }
+
+ if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
+ m_pos = value;
+ m_parentPosition = Vector3.Zero;
+ }
+ }
+
+ public Vector3 OffsetPosition
+ {
+ get { return m_pos; }
+ set { m_pos = value; }
+ }
+
+ ///
+ /// Current velocity of the avatar.
+ ///
+ public override Vector3 Velocity
+ {
+ get
+ {
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
+ m_velocity = actor.Velocity;
+
+ return m_velocity;
+ }
+ set
+ {
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
+ {
+ try
+ {
+ lock (m_scene.SyncRoot)
+ actor.Velocity = value;
+ }
+ catch (Exception e)
+ {
+ m_log.Error("[SCENEPRESENCE]: VELOCITY " + e.Message);
+ }
+ }
+
+ m_velocity = value;
+ }
+ }
+
+ public Quaternion OffsetRotation
+ {
+ get { return m_offsetRotation; }
+ set { m_offsetRotation = value; }
+ }
+
+ public Quaternion Rotation
+ {
+ get {
+ if (m_parentID != 0)
+ {
+ if (m_offsetRotation != null)
+ {
+ return m_offsetRotation;
+ }
+ else
+ {
+ return new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+
+ }
+ else
+ {
+ return m_bodyRot;
+ }
+ }
+ set {
+ m_bodyRot = value;
+ if (m_parentID != 0)
+ {
+ m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ }
+ }
+
+ public Quaternion PreviousRotation
+ {
+ get { return m_bodyRotPrevious; }
+ set { m_bodyRotPrevious = value; }
+ }
+
+ ///
+ /// If this is true, agent doesn't have a representation in this scene.
+ /// this is an agent 'looking into' this scene from a nearby scene(region)
+ ///
+ /// if False, this agent has a representation in this scene
+ ///
+ private bool m_isChildAgent = true;
+
+ public bool IsChildAgent
+ {
+ get { return m_isChildAgent; }
+ set { m_isChildAgent = value; }
+ }
+
+ private uint m_parentID;
+
+
+ private UUID m_linkedPrim;
+
+ public uint ParentID
+ {
+ get { return m_parentID; }
+ set { m_parentID = value; }
+ }
+
+ public UUID LinkedPrim
+ {
+ get { return m_linkedPrim; }
+ set { m_linkedPrim = value; }
+ }
+
+ public float Health
+ {
+ get { return m_health; }
+ set { m_health = value; }
+ }
+
+ ///
+ /// These are the region handles known by the avatar.
+ ///
+ public List KnownChildRegionHandles
+ {
+ get
+ {
+ if (m_knownChildRegions.Count == 0)
+ return new List();
+ else
+ return new List(m_knownChildRegions.Keys);
+ }
+ }
+
+ public Dictionary KnownRegions
+ {
+ get { return m_knownChildRegions; }
+ set
+ {
+ m_knownChildRegions = value;
+ }
+ }
+
+ public ISceneViewer SceneViewer
+ {
+ get { return m_sceneViewer; }
+ }
+
+ public void AdjustKnownSeeds()
+ {
+ Dictionary seeds;
+
+ if (Scene.CapsModule != null)
+ seeds = Scene.CapsModule.GetChildrenSeeds(UUID);
+ else
+ seeds = new Dictionary();
+
+ List old = new List();
+ foreach (ulong handle in seeds.Keys)
+ {
+ uint x, y;
+ Utils.LongToUInts(handle, out x, out y);
+ x = x / Constants.RegionSize;
+ y = y / Constants.RegionSize;
+ if (Util.IsOutsideView(x, Scene.RegionInfo.RegionLocX, y, Scene.RegionInfo.RegionLocY))
+ {
+ old.Add(handle);
+ }
+ }
+ DropOldNeighbours(old);
+
+ if (Scene.CapsModule != null)
+ Scene.CapsModule.SetChildrenSeed(UUID, seeds);
+
+ KnownRegions = seeds;
+ //m_log.Debug(" ++++++++++AFTER+++++++++++++ ");
+ //DumpKnownRegions();
+ }
+
+ public void DumpKnownRegions()
+ {
+ m_log.Info("================ KnownRegions "+Scene.RegionInfo.RegionName+" ================");
+ foreach (KeyValuePair kvp in KnownRegions)
+ {
+ uint x, y;
+ Utils.LongToUInts(kvp.Key, out x, out y);
+ x = x / Constants.RegionSize;
+ y = y / Constants.RegionSize;
+ m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
+ }
+ }
+
+ private bool m_inTransit;
+ private bool m_mouseLook;
+ private bool m_leftButtonDown;
+
+ public bool IsInTransit
+ {
+ get { return m_inTransit; }
+ set { m_inTransit = value; }
+ }
+
+ public float SpeedModifier
+ {
+ get { return m_speedModifier; }
+ set { m_speedModifier = value; }
+ }
+
+ public bool ForceFly
+ {
+ get { return m_forceFly; }
+ set { m_forceFly = value; }
+ }
+
+ public bool FlyDisabled
+ {
+ get { return m_flyDisabled; }
+ set { m_flyDisabled = value; }
+ }
+
+ public string Viewer
+ {
+ get { return m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode).Viewer; }
+ }
+
+ #endregion
+
+ #region Constructor(s)
+
+ public ScenePresence()
+ {
+ m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
+ CreateSceneViewer();
+ m_animator = new ScenePresenceAnimator(this);
+ }
+
+ private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this()
+ {
+ m_rootRegionHandle = reginfo.RegionHandle;
+ m_controllingClient = client;
+ m_firstname = m_controllingClient.FirstName;
+ m_lastname = m_controllingClient.LastName;
+ m_name = String.Format("{0} {1}", m_firstname, m_lastname);
+ m_scene = world;
+ m_uuid = client.AgentId;
+ m_regionInfo = reginfo;
+ m_localId = m_scene.AllocateLocalId();
+
+ UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid);
+
+ if (account != null)
+ m_userLevel = account.UserLevel;
+
+ IGroupsModule gm = m_scene.RequestModuleInterface();
+ if (gm != null)
+ m_grouptitle = gm.GetGroupTitle(m_uuid);
+
+ m_scriptEngines = m_scene.RequestModuleInterfaces();
+
+ AbsolutePosition = posLastSignificantMove = m_CameraCenter =
+ m_lastCameraCenter = m_controllingClient.StartPos;
+
+ m_reprioritization_timer = new Timer(world.ReprioritizationInterval);
+ m_reprioritization_timer.Elapsed += new ElapsedEventHandler(Reprioritize);
+ m_reprioritization_timer.AutoReset = false;
+
+ AdjustKnownSeeds();
+ Animator.TrySetMovementAnimation("STAND");
+ // we created a new ScenePresence (a new child agent) in a fresh region.
+ // Request info about all the (root) agents in this region
+ // Note: This won't send data *to* other clients in that region (children don't send)
+ SendInitialFullUpdateToAllClients();
+ RegisterToEvents();
+ if (m_controllingClient != null)
+ {
+ m_controllingClient.ProcessPendingPackets();
+ }
+ SetDirectionVectors();
+ }
+
+ public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
+ AvatarWearable[] wearables)
+ : this(client, world, reginfo)
+ {
+ m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
+ }
+
+ public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
+ : this(client, world, reginfo)
+ {
+ m_appearance = appearance;
+ }
+
+ private void CreateSceneViewer()
+ {
+ m_sceneViewer = new SceneViewer(this);
+ }
+
+ public void RegisterToEvents()
+ {
+ m_controllingClient.OnRequestWearables += SendWearables;
+ m_controllingClient.OnSetAppearance += SetAppearance;
+ m_controllingClient.OnCompleteMovementToRegion += CompleteMovement;
+ //m_controllingClient.OnCompleteMovementToRegion += SendInitialData;
+ m_controllingClient.OnAgentUpdate += HandleAgentUpdate;
+ m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit;
+ m_controllingClient.OnAgentSit += HandleAgentSit;
+ m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
+ m_controllingClient.OnStartAnim += HandleStartAnim;
+ m_controllingClient.OnStopAnim += HandleStopAnim;
+ m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls;
+ m_controllingClient.OnAutoPilotGo += DoAutoPilot;
+ m_controllingClient.AddGenericPacketHandler("autopilot", DoMoveToPosition);
+
+ // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
+ // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
+ }
+
+ private void SetDirectionVectors()
+ {
+ Dir_Vectors[0] = Vector3.UnitX; //FORWARD
+ Dir_Vectors[1] = -Vector3.UnitX; //BACK
+ Dir_Vectors[2] = Vector3.UnitY; //LEFT
+ Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
+ Dir_Vectors[4] = Vector3.UnitZ; //UP
+ Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
+ Dir_Vectors[6] = new Vector3(0.5f, 0f, 0f); //FORWARD_NUDGE
+ Dir_Vectors[7] = new Vector3(-0.5f, 0f, 0f); //BACK_NUDGE
+ Dir_Vectors[8] = new Vector3(0f, 0.5f, 0f); //LEFT_NUDGE
+ Dir_Vectors[9] = new Vector3(0f, -0.5f, 0f); //RIGHT_NUDGE
+ Dir_Vectors[10] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
+ }
+
+ private Vector3[] GetWalkDirectionVectors()
+ {
+ Vector3[] vector = new Vector3[11];
+ vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
+ vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
+ vector[2] = Vector3.UnitY; //LEFT
+ vector[3] = -Vector3.UnitY; //RIGHT
+ vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
+ vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
+ vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
+ vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
+ vector[8] = Vector3.UnitY; //LEFT_NUDGE
+ vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
+ vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE
+ return vector;
+ }
+
+ private bool[] GetDirectionIsNudge()
+ {
+ bool[] isNudge = new bool[11];
+ isNudge[0] = false; //FORWARD
+ isNudge[1] = false; //BACK
+ isNudge[2] = false; //LEFT
+ isNudge[3] = false; //RIGHT
+ isNudge[4] = false; //UP
+ isNudge[5] = false; //DOWN
+ isNudge[6] = true; //FORWARD_NUDGE
+ isNudge[7] = true; //BACK_NUDGE
+ isNudge[8] = true; //LEFT_NUDGE
+ isNudge[9] = true; //RIGHT_NUDGE
+ isNudge[10] = true; //DOWN_Nudge
+ return isNudge;
+ }
+
+
+ #endregion
+
+ public uint GenerateClientFlags(UUID ObjectID)
+ {
+ return m_scene.Permissions.GenerateClientFlags(m_uuid, ObjectID);
+ }
+
+ ///
+ /// Send updates to the client about prims which have been placed on the update queue. We don't
+ /// necessarily send updates for all the parts on the queue, e.g. if an updates with a more recent
+ /// timestamp has already been sent.
+ ///
+ public void SendPrimUpdates()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ m_sceneViewer.SendPrimUpdates();
+
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ #region Status Methods
+
+ ///
+ /// This turns a child agent, into a root agent
+ /// This is called when an agent teleports into a region, or if an
+ /// agent crosses into this region from a neighbor over the border
+ ///
+ public void MakeRootAgent(Vector3 pos, bool isFlying)
+ {
+ m_log.DebugFormat(
+ "[SCENE]: Upgrading child to root agent for {0} in {1}",
+ Name, m_scene.RegionInfo.RegionName);
+
+ //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count);
+
+ IGroupsModule gm = m_scene.RequestModuleInterface();
+ if (gm != null)
+ m_grouptitle = gm.GetGroupTitle(m_uuid);
+
+ m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
+ m_scene.SetRootAgentScene(m_uuid);
+
+ // Moved this from SendInitialData to ensure that m_appearance is initialized
+ // before the inventory is processed in MakeRootAgent. This fixes a race condition
+ // related to the handling of attachments
+ //m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
+ if (m_scene.TestBorderCross(pos, Cardinals.E))
+ {
+ Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
+ pos.X = crossedBorder.BorderLine.Z - 1;
+ }
+
+ if (m_scene.TestBorderCross(pos, Cardinals.N))
+ {
+ Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
+ pos.Y = crossedBorder.BorderLine.Z - 1;
+ }
+
+ //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
+ //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
+ //they'll bypass the landing point. But I can't think of any decent way of fixing this.
+ if (KnownChildRegionHandles.Count == 0)
+ {
+ ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
+ if (land != null)
+ {
+ //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
+ if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && UserLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
+ {
+ pos = land.LandData.UserLocation;
+ }
+ }
+ }
+
+ if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
+ {
+ Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
+
+ if (pos.X < 0)
+ {
+ emergencyPos.X = (int)Constants.RegionSize + pos.X;
+ if (!(pos.Y < 0))
+ emergencyPos.Y = pos.Y;
+ if (!(pos.Z < 0))
+ emergencyPos.Z = pos.Z;
+ }
+ if (pos.Y < 0)
+ {
+ emergencyPos.Y = (int)Constants.RegionSize + pos.Y;
+ if (!(pos.X < 0))
+ emergencyPos.X = pos.X;
+ if (!(pos.Z < 0))
+ emergencyPos.Z = pos.Z;
+ }
+ if (pos.Z < 0)
+ {
+ emergencyPos.Z = 128;
+ if (!(pos.Y < 0))
+ emergencyPos.Y = pos.Y;
+ if (!(pos.X < 0))
+ emergencyPos.X = pos.X;
+ }
+ }
+
+ if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
+ {
+ m_log.WarnFormat(
+ "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping",
+ pos, Name, UUID);
+
+ if (pos.X < 0f) pos.X = 0f;
+ if (pos.Y < 0f) pos.Y = 0f;
+ if (pos.Z < 0f) pos.Z = 0f;
+ }
+
+ float localAVHeight = 1.56f;
+ if (m_avHeight != 127.0f)
+ {
+ localAVHeight = m_avHeight;
+ }
+
+ float posZLimit = 0;
+
+ if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize)
+ posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
+
+ float newPosZ = posZLimit + localAVHeight / 2;
+ if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
+ {
+ pos.Z = newPosZ;
+ }
+ AbsolutePosition = pos;
+
+ AddToPhysicalScene(isFlying);
+
+ if (m_forceFly)
+ {
+ m_physicsActor.Flying = true;
+ }
+ else if (m_flyDisabled)
+ {
+ m_physicsActor.Flying = false;
+ }
+
+ if (m_appearance != null)
+ {
+ if (m_appearance.AvatarHeight > 0)
+ SetHeight(m_appearance.AvatarHeight);
+ }
+ else
+ {
+ m_log.ErrorFormat("[SCENE PRESENCE]: null appearance in MakeRoot in {0}", Scene.RegionInfo.RegionName);
+ // emergency; this really shouldn't happen
+ m_appearance = new AvatarAppearance(UUID);
+ }
+
+ // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
+ // avatar to return to the standing position in mid-air. On login it looks like this is being sent
+ // elsewhere anyway
+ // Animator.SendAnimPack();
+
+ m_scene.SwapRootAgentCount(false);
+
+ //CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
+ //if (userInfo != null)
+ // userInfo.FetchInventory();
+ //else
+ // m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid);
+
+ // On the next prim update, all objects will be sent
+ //
+ m_sceneViewer.Reset();
+
+ m_isChildAgent = false;
+
+ // send the animations of the other presences to me
+ m_scene.ForEachScenePresence(delegate(ScenePresence presence)
+ {
+ if (presence != this)
+ presence.Animator.SendAnimPackToClient(ControllingClient);
+ });
+
+ m_scene.EventManager.TriggerOnMakeRootAgent(this);
+ }
+
+ ///
+ /// This turns a root agent into a child agent
+ /// when an agent departs this region for a neighbor, this gets called.
+ ///
+ /// It doesn't get called for a teleport. Reason being, an agent that
+ /// teleports out may not end up anywhere near this region
+ ///
+ public void MakeChildAgent()
+ {
+ // It looks like m_animator is set to null somewhere, and MakeChild
+ // is called after that. Probably in aborted teleports.
+ if (m_animator == null)
+ m_animator = new ScenePresenceAnimator(this);
+ else
+ Animator.ResetAnimations();
+
+// m_log.DebugFormat(
+// "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
+// Name, UUID, m_scene.RegionInfo.RegionName);
+
+ // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing,
+ // depending on the exact timing. This shouldn't matter anyway since child agent positions are not updated.
+ //Velocity = new Vector3(0, 0, 0);
+
+ m_isChildAgent = true;
+ m_scene.SwapRootAgentCount(true);
+ RemoveFromPhysicalScene();
+
+ // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
+
+ m_scene.EventManager.TriggerOnMakeChildAgent(this);
+ }
+
+ ///
+ /// Removes physics plugin scene representation of this agent if it exists.
+ ///
+ private void RemoveFromPhysicalScene()
+ {
+ if (PhysicsActor != null)
+ {
+ m_physicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients;
+ m_physicsActor.OnOutOfBounds -= OutOfBoundsCall;
+ m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
+ m_physicsActor.UnSubscribeEvents();
+ m_physicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
+ PhysicsActor = null;
+ }
+ }
+
+ ///
+ ///
+ ///
+ ///
+ public void Teleport(Vector3 pos)
+ {
+ bool isFlying = false;
+
+ if (m_physicsActor != null)
+ isFlying = m_physicsActor.Flying;
+
+ RemoveFromPhysicalScene();
+ Velocity = Vector3.Zero;
+ AbsolutePosition = pos;
+ AddToPhysicalScene(isFlying);
+ if (m_appearance != null)
+ {
+ if (m_appearance.AvatarHeight > 0)
+ SetHeight(m_appearance.AvatarHeight);
+ }
+
+ SendTerseUpdateToAllClients();
+
+ }
+
+ public void TeleportWithMomentum(Vector3 pos)
+ {
+ bool isFlying = false;
+ if (m_physicsActor != null)
+ isFlying = m_physicsActor.Flying;
+
+ RemoveFromPhysicalScene();
+ AbsolutePosition = pos;
+ AddToPhysicalScene(isFlying);
+ if (m_appearance != null)
+ {
+ if (m_appearance.AvatarHeight > 0)
+ SetHeight(m_appearance.AvatarHeight);
+ }
+
+ SendTerseUpdateToAllClients();
+ }
+
+ ///
+ ///
+ ///
+ public void StopMovement()
+ {
+ }
+
+ public void StopFlying()
+ {
+ ControllingClient.StopFlying(this);
+ }
+
+ public void AddNeighbourRegion(ulong regionHandle, string cap)
+ {
+ lock (m_knownChildRegions)
+ {
+ if (!m_knownChildRegions.ContainsKey(regionHandle))
+ {
+ uint x, y;
+ Utils.LongToUInts(regionHandle, out x, out y);
+ m_knownChildRegions.Add(regionHandle, cap);
+ }
+ }
+ }
+
+ public void RemoveNeighbourRegion(ulong regionHandle)
+ {
+ lock (m_knownChildRegions)
+ {
+ if (m_knownChildRegions.ContainsKey(regionHandle))
+ {
+ m_knownChildRegions.Remove(regionHandle);
+ //m_log.Debug(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count);
+ }
+ }
+ }
+
+ public void DropOldNeighbours(List oldRegions)
+ {
+ foreach (ulong handle in oldRegions)
+ {
+ RemoveNeighbourRegion(handle);
+ Scene.CapsModule.DropChildSeed(UUID, handle);
+ }
+ }
+
+ public List GetKnownRegionList()
+ {
+ return new List(m_knownChildRegions.Keys);
+ }
+
+ #endregion
+
+ #region Event Handlers
+
+ ///
+ /// Sets avatar height in the phyiscs plugin
+ ///
+ internal void SetHeight(float height)
+ {
+ m_avHeight = height;
+ if (PhysicsActor != null && !IsChildAgent)
+ {
+ Vector3 SetSize = new Vector3(0.45f, 0.6f, m_avHeight);
+ PhysicsActor.Size = SetSize;
+ }
+ }
+
+ ///
+ /// Complete Avatar's movement into the region.
+ /// This is called upon a very important packet sent from the client,
+ /// so it's client-controlled. Never call this method directly.
+ ///
+ public void CompleteMovement(IClientAPI client)
+ {
+ //m_log.Debug("[SCENE PRESENCE]: CompleteMovement");
+
+ Vector3 look = Velocity;
+ if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
+ {
+ look = new Vector3(0.99f, 0.042f, 0);
+ }
+
+ // Prevent teleporting to an underground location
+ // (may crash client otherwise)
+ //
+ Vector3 pos = AbsolutePosition;
+ float ground = m_scene.GetGroundHeight(pos.X, pos.Y);
+ if (pos.Z < ground + 1.5f)
+ {
+ pos.Z = ground + 1.5f;
+ AbsolutePosition = pos;
+ }
+ m_isChildAgent = false;
+ bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
+ MakeRootAgent(AbsolutePosition, m_flying);
+
+ if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
+ {
+ m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
+ Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI);
+ m_callbackURI = null;
+ }
+
+ //m_log.DebugFormat("Completed movement");
+
+ m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
+ SendInitialData();
+
+ // Create child agents in neighbouring regions
+ if (!m_isChildAgent)
+ {
+ IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
+ if (m_agentTransfer != null)
+ m_agentTransfer.EnableChildAgents(this);
+ else
+ m_log.DebugFormat("[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active");
+
+ IFriendsModule friendsModule = m_scene.RequestModuleInterface();
+ if (friendsModule != null)
+ friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
+ }
+
+ }
+
+ ///
+ /// Callback for the Camera view block check. Gets called with the results of the camera view block test
+ /// hitYN is true when there's something in the way.
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
+ {
+ const float POSITION_TOLERANCE = 0.02f;
+ const float VELOCITY_TOLERANCE = 0.02f;
+ const float ROTATION_TOLERANCE = 0.02f;
+
+ if (m_followCamAuto)
+ {
+ if (hitYN)
+ {
+ CameraConstraintActive = true;
+ //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance);
+
+ Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
+ ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
+ }
+ else
+ {
+ if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
+ !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
+ !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
+ {
+ if (CameraConstraintActive)
+ {
+ ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f));
+ CameraConstraintActive = false;
+ }
+ }
+ }
+ }
+ }
+
+ ///
+ /// This is the event handler for client movement. If a client is moving, this event is triggering.
+ ///
+ public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
+ {
+ //if (m_isChildAgent)
+ //{
+ // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
+ // return;
+ //}
+
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ ++m_movementUpdateCount;
+ if (m_movementUpdateCount < 1)
+ m_movementUpdateCount = 1;
+
+ #region Sanity Checking
+
+ // This is irritating. Really.
+ if (!AbsolutePosition.IsFinite())
+ {
+ RemoveFromPhysicalScene();
+ m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
+
+ m_pos = m_LastFinitePos;
+
+ if (!m_pos.IsFinite())
+ {
+ m_pos.X = 127f;
+ m_pos.Y = 127f;
+ m_pos.Z = 127f;
+ m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
+ }
+
+ AddToPhysicalScene(false);
+ }
+ else
+ {
+ m_LastFinitePos = m_pos;
+ }
+
+ #endregion Sanity Checking
+
+ #region Inputs
+
+ AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
+ Quaternion bodyRotation = agentData.BodyRotation;
+
+ // Camera location in world. We'll need to raytrace
+ // from this location from time to time.
+ m_CameraCenter = agentData.CameraCenter;
+ if (Vector3.Distance(m_lastCameraCenter, m_CameraCenter) >= Scene.RootReprioritizationDistance)
+ {
+ ReprioritizeUpdates();
+ m_lastCameraCenter = m_CameraCenter;
+ }
+
+ // Use these three vectors to figure out what the agent is looking at
+ // Convert it to a Matrix and/or Quaternion
+ m_CameraAtAxis = agentData.CameraAtAxis;
+ m_CameraLeftAxis = agentData.CameraLeftAxis;
+ m_CameraUpAxis = agentData.CameraUpAxis;
+
+ // The Agent's Draw distance setting
+ m_DrawDistance = agentData.Far;
+
+ // Check if Client has camera in 'follow cam' or 'build' mode.
+ Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
+
+ m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
+ && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
+
+ m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
+ m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
+
+ #endregion Inputs
+
+ if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
+ {
+ StandUp();
+ }
+
+ //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
+ // Raycast from the avatar's head to the camera to see if there's anything blocking the view
+ if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
+ {
+ if (m_followCamAuto)
+ {
+ Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
+ m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
+ }
+ }
+ lock (scriptedcontrols)
+ {
+ if (scriptedcontrols.Count > 0)
+ {
+ SendControlToScripts((uint)flags);
+ flags = RemoveIgnoredControls(flags, IgnoredControls);
+ }
+ }
+
+ if (m_autopilotMoving)
+ CheckAtSitTarget();
+
+ if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
+ {
+ m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
+ Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
+
+ // TODO: This doesn't prevent the user from walking yet.
+ // Setting parent ID would fix this, if we knew what value
+ // to use. Or we could add a m_isSitting variable.
+ //Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
+ SitGround = true;
+ }
+
+ // In the future, these values might need to go global.
+ // Here's where you get them.
+ m_AgentControlFlags = flags;
+ m_headrotation = agentData.HeadRotation;
+ m_state = agentData.State;
+
+ PhysicsActor actor = PhysicsActor;
+ if (actor == null)
+ {
+ return;
+ }
+
+ bool update_movementflag = false;
+
+ if (m_allowMovement && !SitGround)
+ {
+ if (agentData.UseClientAgentPosition)
+ {
+ m_moveToPositionInProgress = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f;
+ m_moveToPositionTarget = agentData.ClientAgentPosition;
+ }
+
+ int i = 0;
+
+ bool update_rotation = false;
+ bool DCFlagKeyPressed = false;
+ Vector3 agent_control_v3 = Vector3.Zero;
+ Quaternion q = bodyRotation;
+
+ bool oldflying = PhysicsActor.Flying;
+
+ if (m_forceFly)
+ actor.Flying = true;
+ else if (m_flyDisabled)
+ actor.Flying = false;
+ else
+ actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
+
+ if (actor.Flying != oldflying)
+ update_movementflag = true;
+
+ if (q != m_bodyRot)
+ {
+ m_bodyRot = q;
+ update_rotation = true;
+ }
+
+ //guilty until proven innocent..
+ bool Nudging = true;
+ //Basically, if there is at least one non-nudge control then we don't need
+ //to worry about stopping the avatar
+
+ if (m_parentID == 0)
+ {
+ bool bAllowUpdateMoveToPosition = false;
+ bool bResetMoveToPosition = false;
+
+ Vector3[] dirVectors;
+
+ // use camera up angle when in mouselook and not flying or when holding the left mouse button down and not flying
+ // this prevents 'jumping' in inappropriate situations.
+ if ((m_mouseLook && !m_physicsActor.Flying) || (m_leftButtonDown && !m_physicsActor.Flying))
+ dirVectors = GetWalkDirectionVectors();
+ else
+ dirVectors = Dir_Vectors;
+
+ bool[] isNudge = GetDirectionIsNudge();
+
+
+
+
+
+ foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
+ {
+ if (((uint)flags & (uint)DCF) != 0)
+ {
+ bResetMoveToPosition = true;
+ DCFlagKeyPressed = true;
+ try
+ {
+ agent_control_v3 += dirVectors[i];
+ if (isNudge[i] == false)
+ {
+ Nudging = false;
+ }
+ }
+ catch (IndexOutOfRangeException)
+ {
+ // Why did I get this?
+ }
+
+ if ((m_movementflag & (uint)DCF) == 0)
+ {
+ m_movementflag += (byte)(uint)DCF;
+ update_movementflag = true;
+ }
+ }
+ else
+ {
+ if ((m_movementflag & (uint)DCF) != 0)
+ {
+ m_movementflag -= (byte)(uint)DCF;
+ update_movementflag = true;
+ }
+ else
+ {
+ bAllowUpdateMoveToPosition = true;
+ }
+ }
+ i++;
+ }
+ //Paupaw:Do Proper PID for Autopilot here
+ if (bResetMoveToPosition)
+ {
+ m_moveToPositionTarget = Vector3.Zero;
+ m_moveToPositionInProgress = false;
+ update_movementflag = true;
+ bAllowUpdateMoveToPosition = false;
+ }
+
+ if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
+ {
+ //Check the error term of the current position in relation to the target position
+ if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f)
+ {
+ // we are close enough to the target
+ m_moveToPositionTarget = Vector3.Zero;
+ m_moveToPositionInProgress = false;
+ update_movementflag = true;
+ }
+ else
+ {
+ try
+ {
+ // move avatar in 2D at one meter/second towards target, in avatar coordinate frame.
+ // This movement vector gets added to the velocity through AddNewMovement().
+ // Theoretically we might need a more complex PID approach here if other
+ // unknown forces are acting on the avatar and we need to adaptively respond
+ // to such forces, but the following simple approach seems to works fine.
+ Vector3 LocalVectorToTarget3D =
+ (m_moveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
+ * Matrix4.CreateFromQuaternion(Quaternion.Inverse(bodyRotation)); // change to avatar coords
+ // Ignore z component of vector
+ Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
+ LocalVectorToTarget2D.Normalize();
+
+ //We're not nudging
+ Nudging = false;
+ agent_control_v3 += LocalVectorToTarget2D;
+
+ // update avatar movement flags. the avatar coordinate system is as follows:
+ //
+ // +X (forward)
+ //
+ // ^
+ // |
+ // |
+ // |
+ // |
+ // (left) +Y <--------o--------> -Y
+ // avatar
+ // |
+ // |
+ // |
+ // |
+ // v
+ // -X
+ //
+
+ // based on the above avatar coordinate system, classify the movement into
+ // one of left/right/back/forward.
+ if (LocalVectorToTarget2D.Y > 0)//MoveLeft
+ {
+ m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
+ //AgentControlFlags
+ AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
+ update_movementflag = true;
+ }
+ else if (LocalVectorToTarget2D.Y < 0) //MoveRight
+ {
+ m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
+ AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
+ update_movementflag = true;
+ }
+ if (LocalVectorToTarget2D.X < 0) //MoveBack
+ {
+ m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
+ AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
+ update_movementflag = true;
+ }
+ else if (LocalVectorToTarget2D.X > 0) //Move Forward
+ {
+ m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
+ AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
+ update_movementflag = true;
+ }
+ }
+ catch (Exception e)
+ {
+ //Avoid system crash, can be slower but...
+ m_log.DebugFormat("Crash! {0}", e.ToString());
+ }
+ }
+ }
+ }
+
+ // Cause the avatar to stop flying if it's colliding
+ // with something with the down arrow pressed.
+
+ // Only do this if we're flying
+ if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
+ {
+ // Landing detection code
+
+ // Are the landing controls requirements filled?
+ bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
+ ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
+
+ // Are the collision requirements fulfilled?
+ bool colliding = (m_physicsActor.IsColliding == true);
+
+ if (m_physicsActor.Flying && colliding && controlland)
+ {
+ // nesting this check because LengthSquared() is expensive and we don't
+ // want to do it every step when flying.
+ if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
+ StopFlying();
+ }
+ }
+
+ if (update_movementflag || (update_rotation && DCFlagKeyPressed))
+ {
+ // m_log.DebugFormat("{0} {1}", update_movementflag, (update_rotation && DCFlagKeyPressed));
+ // m_log.DebugFormat(
+ // "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3);
+
+ AddNewMovement(agent_control_v3, q, Nudging);
+
+
+ }
+ }
+
+ if (update_movementflag && !SitGround)
+ Animator.UpdateMovementAnimations();
+
+ m_scene.EventManager.TriggerOnClientMovement(this);
+
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ public void DoAutoPilot(uint not_used, Vector3 Pos, IClientAPI remote_client)
+ {
+ m_autopilotMoving = true;
+ m_autoPilotTarget = Pos;
+ m_sitAtAutoTarget = false;
+ PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
+ //proxy.PCode = (byte)PCode.ParticleSystem;
+ proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy);
+ proxyObjectGroup.AttachToScene(m_scene);
+
+ // Commented out this code since it could never have executed, but might still be informative.
+// if (proxyObjectGroup != null)
+// {
+ proxyObjectGroup.SendGroupFullUpdate();
+ remote_client.SendSitResponse(proxyObjectGroup.UUID, Vector3.Zero, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
+ m_scene.DeleteSceneObject(proxyObjectGroup, false);
+// }
+// else
+// {
+// m_autopilotMoving = false;
+// m_autoPilotTarget = Vector3.Zero;
+// ControllingClient.SendAlertMessage("Autopilot cancelled");
+// }
+ }
+
+ public void DoMoveToPosition(Object sender, string method, List args)
+ {
+ try
+ {
+ float locx = 0f;
+ float locy = 0f;
+ float locz = 0f;
+ uint regionX = 0;
+ uint regionY = 0;
+ try
+ {
+ Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
+ locx = Convert.ToSingle(args[0]) - (float)regionX;
+ locy = Convert.ToSingle(args[1]) - (float)regionY;
+ locz = Convert.ToSingle(args[2]);
+ }
+ catch (InvalidCastException)
+ {
+ m_log.Error("[CLIENT]: Invalid autopilot request");
+ return;
+ }
+ m_moveToPositionInProgress = true;
+ m_moveToPositionTarget = new Vector3(locx, locy, locz);
+ }
+ catch (Exception ex)
+ {
+ //Why did I get this error?
+ m_log.Error("[SCENEPRESENCE]: DoMoveToPosition" + ex);
+ }
+ }
+
+ private void CheckAtSitTarget()
+ {
+ //m_log.Debug("[AUTOPILOT]: " + Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget).ToString());
+ if (Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget) <= 1.5)
+ {
+ if (m_sitAtAutoTarget)
+ {
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetUUID);
+ if (part != null)
+ {
+ AbsolutePosition = part.AbsolutePosition;
+ Velocity = Vector3.Zero;
+ SendFullUpdateToAllClients();
+
+ HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); //KF ??
+ }
+ //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false);
+ m_requestedSitTargetUUID = UUID.Zero;
+ }
+ /*
+ else
+ {
+ //ControllingClient.SendAlertMessage("Autopilot cancelled");
+ //SendTerseUpdateToAllClients();
+ //PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
+ //proxy.PCode = (byte)PCode.ParticleSystem;
+ ////uint nextUUID = m_scene.NextLocalId;
+
+ //proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, m_autoPilotTarget, Quaternion.Identity, proxy);
+ //if (proxyObjectGroup != null)
+ //{
+ //proxyObjectGroup.SendGroupFullUpdate();
+ //ControllingClient.SendSitResponse(UUID.Zero, m_autoPilotTarget, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
+ //m_scene.DeleteSceneObject(proxyObjectGroup);
+ //}
+ }
+ */
+ m_autoPilotTarget = Vector3.Zero;
+ m_autopilotMoving = false;
+ }
+ }
+ ///
+ /// Perform the logic necessary to stand the avatar up. This method also executes
+ /// the stand animation.
+ ///
+ public void StandUp()
+ {
+ SitGround = false;
+
+ if (m_parentID != 0)
+ {
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
+ if (part != null)
+ {
+ part.TaskInventory.LockItemsForRead(true);
+ TaskInventoryDictionary taskIDict = part.TaskInventory;
+ if (taskIDict != null)
+ {
+ foreach (UUID taskID in taskIDict.Keys)
+ {
+ UnRegisterControlEventsToScript(LocalId, taskID);
+ taskIDict[taskID].PermsMask &= ~(
+ 2048 | //PERMISSION_CONTROL_CAMERA
+ 4); // PERMISSION_TAKE_CONTROLS
+ }
+ }
+ part.TaskInventory.LockItemsForRead(false);
+ // Reset sit target.
+ if (part.GetAvatarOnSitTarget() == UUID)
+ part.SetAvatarOnSitTarget(UUID.Zero);
+ m_parentPosition = part.GetWorldPosition();
+ ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
+ }
+ // part.GetWorldRotation() is the rotation of the object being sat on
+ // Rotation is the sittiing Av's rotation
+
+ Quaternion partRot;
+// if (part.LinkNum == 1)
+// { // Root prim of linkset
+// partRot = part.ParentGroup.RootPart.RotationOffset;
+// }
+// else
+// { // single or child prim
+
+// }
+ if (part == null) //CW: Part may be gone. llDie() for example.
+ {
+ partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ }
+ else
+ {
+ partRot = part.GetWorldRotation();
+ }
+
+ Quaternion partIRot = Quaternion.Inverse(partRot);
+
+ Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
+ Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
+
+
+ if (m_physicsActor == null)
+ {
+ AddToPhysicalScene(false);
+ }
+ //CW: If the part isn't null then we can set the current position
+ if (part != null)
+ {
+ Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ((m_pos - part.OffsetPosition) * partRot); // + av sit offset!
+ AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
+ part.IsOccupied = false;
+ part.ParentGroup.DeleteAvatar(ControllingClient.AgentId);
+ }
+ else
+ {
+ //CW: Since the part doesn't exist, a coarse standup position isn't an issue
+ AbsolutePosition = m_lastWorldPosition;
+ }
+
+ m_parentPosition = Vector3.Zero;
+ m_parentID = 0;
+ m_linkedPrim = UUID.Zero;
+ m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
+ SendFullUpdateToAllClients();
+ m_requestedSitTargetID = 0;
+
+ if ((m_physicsActor != null) && (m_avHeight > 0))
+ {
+ SetHeight(m_avHeight);
+ }
+ }
+ Animator.TrySetMovementAnimation("STAND");
+ }
+
+ private SceneObjectPart FindNextAvailableSitTarget(UUID targetID)
+ {
+ SceneObjectPart targetPart = m_scene.GetSceneObjectPart(targetID);
+ if (targetPart == null)
+ return null;
+
+ // If the primitive the player clicked on has a sit target and that sit target is not full, that sit target is used.
+ // If the primitive the player clicked on has no sit target, and one or more other linked objects have sit targets that are not full, the sit target of the object with the lowest link number will be used.
+
+ // Get our own copy of the part array, and sort into the order we want to test
+ SceneObjectPart[] partArray = targetPart.ParentGroup.GetParts();
+ Array.Sort(partArray, delegate(SceneObjectPart p1, SceneObjectPart p2)
+ {
+ // we want the originally selected part first, then the rest in link order -- so make the selected part link num (-1)
+ int linkNum1 = p1==targetPart ? -1 : p1.LinkNum;
+ int linkNum2 = p2==targetPart ? -1 : p2.LinkNum;
+ return linkNum1 - linkNum2;
+ }
+ );
+
+ //look for prims with explicit sit targets that are available
+ foreach (SceneObjectPart part in partArray)
+ {
+ // Is a sit target available?
+ Vector3 avSitOffSet = part.SitTargetPosition;
+ Quaternion avSitOrientation = part.SitTargetOrientation;
+ UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
+ bool SitTargetOccupied = (avOnTargetAlready != UUID.Zero);
+ bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
+ if (SitTargetisSet && !SitTargetOccupied)
+ {
+ //switch the target to this prim
+ return part;
+ }
+ }
+
+ // no explicit sit target found - use original target
+ return targetPart;
+ }
+
+ private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset, Quaternion pSitOrientation)
+ {
+ bool autopilot = true;
+ Vector3 autopilotTarget = new Vector3();
+ Quaternion sitOrientation = Quaternion.Identity;
+ Vector3 pos = new Vector3();
+ Vector3 cameraEyeOffset = Vector3.Zero;
+ Vector3 cameraAtOffset = Vector3.Zero;
+ bool forceMouselook = false;
+
+ //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
+ SceneObjectPart part = FindNextAvailableSitTarget(targetID);
+ if (part == null) return;
+
+ // 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
+
+ // part is the prim to sit on
+ // offset is the world-ref vector distance from that prim center to the click-spot
+ // UUID is the UUID of the Avatar doing the clicking
+
+ m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
+
+ // Is a sit target available?
+ Vector3 avSitOffSet = part.SitTargetPosition;
+ Quaternion avSitOrientation = part.SitTargetOrientation;
+
+ bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
+ // Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
+ Quaternion partRot;
+// if (part.LinkNum == 1)
+// { // Root prim of linkset
+// partRot = part.ParentGroup.RootPart.RotationOffset;
+// }
+// else
+// { // single or child prim
+ partRot = part.GetWorldRotation();
+// }
+ Quaternion partIRot = Quaternion.Inverse(partRot);
+//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
+ // Sit analysis rewritten by KF 091125
+ if (SitTargetisSet) // scipted sit
+ {
+ if (!part.IsOccupied)
+ {
+//Console.WriteLine("Scripted, unoccupied");
+ part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
+ offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
+
+ Quaternion nrot = avSitOrientation;
+ if (!part.IsRoot)
+ {
+ nrot = part.RotationOffset * avSitOrientation;
+ }
+ sitOrientation = nrot; // Change rotatione to the scripted one
+ OffsetRotation = nrot;
+ autopilot = false; // Jump direct to scripted llSitPos()
+ }
+ else
+ {
+//Console.WriteLine("Scripted, occupied");
+ return;
+ }
+ }
+ else // Not Scripted
+ {
+ if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) )
+ {
+ // large prim & offset, ignore if other Avs sitting
+// offset.Z -= 0.05f;
+ m_avUnscriptedSitPos = offset * partIRot; // (non-zero) sit where clicked
+ autopilotTarget = part.AbsolutePosition + offset; // World location of clicked point
+
+//Console.WriteLine(" offset ={0}", offset);
+//Console.WriteLine(" UnscriptedSitPos={0}", m_avUnscriptedSitPos);
+//Console.WriteLine(" autopilotTarget={0}", autopilotTarget);
+
+ }
+ else // small offset
+ {
+//Console.WriteLine("Small offset");
+ if (!part.IsOccupied)
+ {
+ m_avUnscriptedSitPos = Vector3.Zero; // Zero = Sit on prim center
+ autopilotTarget = part.AbsolutePosition;
+//Console.WriteLine("UsSmall autopilotTarget={0}", autopilotTarget);
+ }
+ else return; // occupied small
+ } // end large/small
+ } // end Scripted/not
+ cameraAtOffset = part.GetCameraAtOffset();
+ cameraEyeOffset = part.GetCameraEyeOffset();
+ forceMouselook = part.GetForceMouselook();
+ if(cameraAtOffset == Vector3.Zero) cameraAtOffset = new Vector3(0f, 0f, 0.1f); //
+ if(cameraEyeOffset == Vector3.Zero) cameraEyeOffset = new Vector3(0f, 0f, 0.1f); //
+
+ if (m_physicsActor != null)
+ {
+ // 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.
+ m_sitAvatarHeight = m_physicsActor.Size.Z;
+ if (autopilot)
+ { // its not a scripted sit
+// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
+ if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
+ {
+ autopilot = false; // close enough
+ m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
+ Not using the part's position because returning the AV to the last known standing
+ position is likely to be more friendly, isn't it? */
+ RemoveFromPhysicalScene();
+ AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target
+ } // else the autopilot will get us close
+ }
+ else
+ { // its a scripted sit
+ m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
+ I *am* using the part's position this time because we have no real idea how far away
+ the avatar is from the sit target. */
+ RemoveFromPhysicalScene();
+ }
+ }
+ else return; // physactor is null!
+
+ Vector3 offsetr; // = offset * partIRot;
+ // KF: In a linkset, offsetr needs to be relative to the group root! 091208
+ // offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
+ // if (part.LinkNum < 2) 091216 All this was necessary because of the GetWorldRotation error.
+ // { // Single, or Root prim of linkset, target is ClickOffset * RootRot
+ //offsetr = offset * partIRot;
+//
+ // else
+ // { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
+ // offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
+ // (offset * partRot);
+ // }
+
+//Console.WriteLine(" ");
+//Console.WriteLine("link number ={0}", part.LinkNum);
+//Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
+//Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
+//Console.WriteLine("Click offst ={0}", offset);
+//Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
+//Console.WriteLine("offsetr ={0}", offsetr);
+//Console.WriteLine("Camera At ={0}", cameraAtOffset);
+//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
+
+ //NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
+ ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+
+ m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
+ // This calls HandleAgentSit twice, once from here, and the client calls
+ // HandleAgentSit itself after it gets to the location
+ // It doesn't get to the location until we've moved them there though
+ // which happens in HandleAgentSit :P
+ m_autopilotMoving = autopilot;
+ m_autoPilotTarget = autopilotTarget;
+ m_sitAtAutoTarget = autopilot;
+ m_initialSitTarget = autopilotTarget;
+ if (!autopilot)
+ HandleAgentSit(remoteClient, UUID);
+ }
+
+ public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset)
+ {
+ if (m_parentID != 0)
+ {
+ StandUp();
+ }
+ m_nextSitAnimation = "SIT";
+
+ //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
+ SceneObjectPart part = FindNextAvailableSitTarget(targetID);
+
+ if (part != null)
+ {
+ if (!String.IsNullOrEmpty(part.SitAnimation))
+ {
+ m_nextSitAnimation = part.SitAnimation;
+ }
+ m_requestedSitTargetID = part.LocalId;
+ //m_requestedSitOffset = offset;
+ m_requestedSitTargetUUID = targetID;
+
+ m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
+
+ if (m_scene.PhysicsScene.SupportsRayCast())
+ {
+ //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
+ //SitRayCastAvatarPosition(part);
+ //return;
+ }
+ }
+ else
+ {
+
+ m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
+ }
+
+
+
+ SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
+ }
+ /*
+ public void SitRayCastAvatarPosition(SceneObjectPart part)
+ {
+ Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
+ Vector3 StartRayCastPosition = AbsolutePosition;
+ Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
+ float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
+ m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionResponse);
+ }
+
+ public void SitRayCastAvatarPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
+ {
+ SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
+ if (part != null)
+ {
+ if (hitYN)
+ {
+ if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
+ {
+ SitRaycastFindEdge(collisionPoint, normal);
+ m_log.DebugFormat("[SIT]: Raycast Avatar Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
+ }
+ else
+ {
+ SitRayCastAvatarPositionCameraZ(part);
+ }
+ }
+ else
+ {
+ SitRayCastAvatarPositionCameraZ(part);
+ }
+ }
+ else
+ {
+ ControllingClient.SendAlertMessage("Sit position no longer exists");
+ m_requestedSitTargetUUID = UUID.Zero;
+ m_requestedSitTargetID = 0;
+ m_requestedSitOffset = Vector3.Zero;
+ }
+
+ }
+
+ public void SitRayCastAvatarPositionCameraZ(SceneObjectPart part)
+ {
+ // Next, try to raycast from the camera Z position
+ Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
+ Vector3 StartRayCastPosition = AbsolutePosition; StartRayCastPosition.Z = CameraPosition.Z;
+ Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
+ float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
+ m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionCameraZResponse);
+ }
+
+ public void SitRayCastAvatarPositionCameraZResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
+ {
+ SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
+ if (part != null)
+ {
+ if (hitYN)
+ {
+ if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
+ {
+ SitRaycastFindEdge(collisionPoint, normal);
+ m_log.DebugFormat("[SIT]: Raycast Avatar Position + CameraZ succeeded at point: {0}, normal:{1}", collisionPoint, normal);
+ }
+ else
+ {
+ SitRayCastCameraPosition(part);
+ }
+ }
+ else
+ {
+ SitRayCastCameraPosition(part);
+ }
+ }
+ else
+ {
+ ControllingClient.SendAlertMessage("Sit position no longer exists");
+ m_requestedSitTargetUUID = UUID.Zero;
+ m_requestedSitTargetID = 0;
+ m_requestedSitOffset = Vector3.Zero;
+ }
+
+ }
+
+ public void SitRayCastCameraPosition(SceneObjectPart part)
+ {
+ // Next, try to raycast from the camera position
+ Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
+ Vector3 StartRayCastPosition = CameraPosition;
+ Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
+ float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
+ m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastCameraPositionResponse);
+ }
+
+ public void SitRayCastCameraPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
+ {
+ SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
+ if (part != null)
+ {
+ if (hitYN)
+ {
+ if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
+ {
+ SitRaycastFindEdge(collisionPoint, normal);
+ m_log.DebugFormat("[SIT]: Raycast Camera Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
+ }
+ else
+ {
+ SitRayHorizontal(part);
+ }
+ }
+ else
+ {
+ SitRayHorizontal(part);
+ }
+ }
+ else
+ {
+ ControllingClient.SendAlertMessage("Sit position no longer exists");
+ m_requestedSitTargetUUID = UUID.Zero;
+ m_requestedSitTargetID = 0;
+ m_requestedSitOffset = Vector3.Zero;
+ }
+
+ }
+
+ public void SitRayHorizontal(SceneObjectPart part)
+ {
+ // Next, try to raycast from the avatar position to fwd
+ Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
+ Vector3 StartRayCastPosition = CameraPosition;
+ Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
+ float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
+ m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastHorizontalResponse);
+ }
+
+ public void SitRayCastHorizontalResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
+ {
+ SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
+ if (part != null)
+ {
+ if (hitYN)
+ {
+ if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
+ {
+ SitRaycastFindEdge(collisionPoint, normal);
+ m_log.DebugFormat("[SIT]: Raycast Horizontal Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
+ // Next, try to raycast from the camera position
+ Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
+ Vector3 StartRayCastPosition = CameraPosition;
+ Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
+ float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
+ //m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastResponseAvatarPosition);
+ }
+ else
+ {
+ ControllingClient.SendAlertMessage("Sit position not accessable.");
+ m_requestedSitTargetUUID = UUID.Zero;
+ m_requestedSitTargetID = 0;
+ m_requestedSitOffset = Vector3.Zero;
+ }
+ }
+ else
+ {
+ ControllingClient.SendAlertMessage("Sit position not accessable.");
+ m_requestedSitTargetUUID = UUID.Zero;
+ m_requestedSitTargetID = 0;
+ m_requestedSitOffset = Vector3.Zero;
+ }
+ }
+ else
+ {
+ ControllingClient.SendAlertMessage("Sit position no longer exists");
+ m_requestedSitTargetUUID = UUID.Zero;
+ m_requestedSitTargetID = 0;
+ m_requestedSitOffset = Vector3.Zero;
+ }
+
+ }
+
+ private void SitRaycastFindEdge(Vector3 collisionPoint, Vector3 collisionNormal)
+ {
+ int i = 0;
+ //throw new NotImplementedException();
+ //m_requestedSitTargetUUID = UUID.Zero;
+ //m_requestedSitTargetID = 0;
+ //m_requestedSitOffset = Vector3.Zero;
+
+ SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
+ }
+ */
+ public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
+ {
+ if (m_parentID != 0)
+ {
+ StandUp();
+ }
+ if (!String.IsNullOrEmpty(sitAnimation))
+ {
+ m_nextSitAnimation = sitAnimation;
+ }
+ else
+ {
+ m_nextSitAnimation = "SIT";
+ }
+
+ //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
+ SceneObjectPart part = FindNextAvailableSitTarget(targetID);
+ if (part != null)
+ {
+ m_requestedSitTargetID = part.LocalId;
+ //m_requestedSitOffset = offset;
+ m_requestedSitTargetUUID = targetID;
+
+ m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
+
+ if (m_scene.PhysicsScene.SupportsRayCast())
+ {
+ //SitRayCastAvatarPosition(part);
+ //return;
+ }
+ }
+ else
+ {
+ m_log.Warn("Sit requested on unknown object: " + targetID);
+ }
+
+ SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
+ }
+
+ public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
+ {
+ if (!String.IsNullOrEmpty(m_nextSitAnimation))
+ {
+ HandleAgentSit(remoteClient, agentID, m_nextSitAnimation);
+ }
+ else
+ {
+ HandleAgentSit(remoteClient, agentID, "SIT");
+ }
+ }
+
+ public void HandleAgentSit(IClientAPI remoteClient, UUID agentID, string sitAnimation)
+ {
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
+
+ if (m_sitAtAutoTarget || !m_autopilotMoving)
+ {
+ if (part != null)
+ {
+//Console.WriteLine("Link #{0}, Rot {1}", part.LinkNum, part.GetWorldRotation());
+ if (part.GetAvatarOnSitTarget() == UUID)
+ {
+//Console.WriteLine("Scripted Sit");
+ // Scripted sit
+ Vector3 sitTargetPos = part.SitTargetPosition;
+ Quaternion sitTargetOrient = part.SitTargetOrientation;
+ m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
+ m_pos += SIT_TARGET_ADJUSTMENT;
+ if (!part.IsRoot)
+ {
+ m_pos *= part.RotationOffset;
+ }
+ m_bodyRot = sitTargetOrient;
+ m_parentPosition = part.AbsolutePosition;
+ part.IsOccupied = true;
+ part.ParentGroup.AddAvatar(agentID);
+Console.WriteLine("Scripted Sit ofset {0}", m_pos);
+ }
+ else
+ {
+ // if m_avUnscriptedSitPos is zero then Av sits above center
+ // Else Av sits at m_avUnscriptedSitPos
+
+ // Non-scripted sit by Kitto Flora 21Nov09
+ // Calculate angle of line from prim to Av
+ Quaternion partIRot;
+// if (part.LinkNum == 1)
+// { // Root prim of linkset
+// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
+// }
+// else
+// { // single or child prim
+ partIRot = Quaternion.Inverse(part.GetWorldRotation());
+// }
+ Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
+ float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
+ float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
+ if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
+ if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
+ float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
+ // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
+ // Av sits at world euler <0,0, z>, translated by part rotation
+ m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
+
+ m_parentPosition = part.AbsolutePosition;
+ part.IsOccupied = true;
+ part.ParentGroup.AddAvatar(agentID);
+ m_pos = new Vector3(0f, 0f, 0.05f) + // corrections to get Sit Animation
+ (new Vector3(0.0f, 0f, 0.61f) * partIRot) + // located on center
+ (new Vector3(0.34f, 0f, 0.0f) * m_bodyRot) +
+ m_avUnscriptedSitPos; // adds click offset, if any
+ //Set up raytrace to find top surface of prim
+ Vector3 size = part.Scale;
+ float mag = 2.0f; // 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
+ Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
+ Vector3 down = new Vector3(0f, 0f, -1f);
+//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag);
+ m_scene.PhysicsScene.RaycastWorld(
+ start, // Vector3 position,
+ down, // Vector3 direction,
+ mag, // float length,
+ SitAltitudeCallback); // retMethod
+ } // end scripted/not
+ }
+ else // no Av
+ {
+ return;
+ }
+ }
+
+ //We want our offsets to reference the root prim, not the child we may have sat on
+ if (!part.IsRoot)
+ {
+ m_parentID = part.ParentGroup.RootPart.LocalId;
+ m_pos += part.OffsetPosition;
+ }
+ else
+ {
+ m_parentID = m_requestedSitTargetID;
+ }
+
+ m_linkedPrim = part.UUID;
+
+ Velocity = Vector3.Zero;
+ RemoveFromPhysicalScene();
+ Animator.TrySetMovementAnimation(sitAnimation);
+ SendFullUpdateToAllClients();
+ SendTerseUpdateToAllClients();
+ }
+
+ public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal)
+ {
+ // KF: 091202 There appears to be a bug in Prim Edit Size - the process sometimes make a prim that RayTrace no longer
+ // sees. Take/re-rez, or sim restart corrects the condition. Result of bug is incorrect sit height.
+ if(hitYN)
+ {
+ // m_pos = Av offset from prim center to make look like on center
+ // m_parentPosition = Actual center pos of prim
+ // collisionPoint = spot on prim where we want to sit
+ // collisionPoint.Z = global sit surface height
+ SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
+ Quaternion partIRot;
+// if (part.LinkNum == 1)
+/// { // Root prim of linkset
+// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
+// }
+// else
+// { // single or child prim
+ partIRot = Quaternion.Inverse(part.GetWorldRotation());
+// }
+ if (m_initialSitTarget != null)
+ {
+ float offZ = collisionPoint.Z - m_initialSitTarget.Z;
+ Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
+ //Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
+ m_pos += offset;
+ // ControllingClient.SendClearFollowCamProperties(part.UUID);
+ }
+
+ }
+ } // End SitAltitudeCallback KF.
+
+ ///
+ /// Event handler for the 'Always run' setting on the client
+ /// Tells the physics plugin to increase speed of movement.
+ ///
+ public void HandleSetAlwaysRun(IClientAPI remoteClient, bool pSetAlwaysRun)
+ {
+ m_setAlwaysRun = pSetAlwaysRun;
+ if (PhysicsActor != null)
+ {
+ PhysicsActor.SetAlwaysRun = pSetAlwaysRun;
+ }
+ }
+
+ public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
+ {
+ Animator.AddAnimation(animID, UUID.Zero);
+ }
+
+ public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
+ {
+ Animator.RemoveAnimation(animID);
+ }
+
+ ///
+ /// Rotate the avatar to the given rotation and apply a movement in the given relative vector
+ ///
+ /// The vector in which to move. This is relative to the rotation argument
+ /// The direction in which this avatar should now face.
+ public void AddNewMovement(Vector3 vec, Quaternion rotation, bool Nudging)
+ {
+ if (m_isChildAgent)
+ {
+ // WHAT???
+ m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
+
+ // we have to reset the user's child agent connections.
+ // Likely, here they've lost the eventqueue for other regions so border
+ // crossings will fail at this point unless we reset them.
+
+ List regions = new List(KnownChildRegionHandles);
+ regions.Remove(m_scene.RegionInfo.RegionHandle);
+
+ MakeRootAgent(new Vector3(127f, 127f, 127f), true);
+
+ // Async command
+ if (m_scene.SceneGridService != null)
+ {
+ m_scene.SceneGridService.SendCloseChildAgentConnections(UUID, regions);
+
+ // Give the above command some time to try and close the connections.
+ // this is really an emergency.. so sleep, or we'll get all discombobulated.
+ System.Threading.Thread.Sleep(500);
+ }
+
+ if (m_scene.SceneGridService != null)
+ {
+ IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
+ if (m_agentTransfer != null)
+ m_agentTransfer.EnableChildAgents(this);
+ }
+
+ return;
+ }
+
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ Rotation = rotation;
+ Vector3 direc = vec * rotation;
+ direc.Normalize();
+ PhysicsActor actor = m_physicsActor;
+ if ((vec.Z == 0f) && !actor.Flying) direc.Z = 0f; // Prevent camera WASD up.
+
+ direc *= 0.03f * 128f * m_speedModifier;
+
+ if (actor != null)
+ {
+ if (actor.Flying)
+ {
+ direc *= 4.0f;
+ //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);
+ //if (controlland)
+ // m_log.Info("[AGENT]: landCommand");
+ //if (colliding)
+ // m_log.Info("[AGENT]: colliding");
+ //if (m_physicsActor.Flying && colliding && controlland)
+ //{
+ // StopFlying();
+ // m_log.Info("[AGENT]: Stop FLying");
+ //}
+ }
+ else if (!actor.Flying && actor.IsColliding)
+ {
+ if (direc.Z > 2.0f)
+ {
+ if(m_animator.m_animTickJump == -1)
+ {
+ direc.Z *= 3.0f; // jump
+ }
+ else
+ {
+ direc.Z *= 0.1f; // prejump
+ }
+ /* Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs
+ Animator.TrySetMovementAnimation("PREJUMP");
+ Animator.TrySetMovementAnimation("JUMP");
+ */
+ }
+ }
+ }
+
+ // TODO: Add the force instead of only setting it to support multiple forces per frame?
+ m_forceToApply = direc;
+ m_isNudging = Nudging;
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ #endregion
+
+ #region Overridden Methods
+
+ public override void Update()
+ {
+ const float ROTATION_TOLERANCE = 0.01f;
+ const float VELOCITY_TOLERANCE = 0.001f;
+ const float POSITION_TOLERANCE = 0.05f;
+ //const int TIME_MS_TOLERANCE = 3000;
+
+
+
+ if (m_isChildAgent == false)
+ {
+// PhysicsActor actor = m_physicsActor;
+
+ // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
+ // grab the latest PhysicsActor velocity, whereas m_velocity is often
+ // storing a requested force instead of an actual traveling velocity
+
+ // Throw away duplicate or insignificant updates
+ if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
+ !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
+ !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
+ //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
+ {
+ SendTerseUpdateToAllClients();
+
+ // Update the "last" values
+ m_lastPosition = m_pos;
+ m_lastRotation = m_bodyRot;
+ m_lastVelocity = Velocity;
+ //m_lastTerseSent = Environment.TickCount;
+ }
+
+ // followed suggestion from mic bowman. reversed the two lines below.
+ if (m_parentID == 0 && m_physicsActor != null || m_parentID != 0) // Check that we have a physics actor or we're sitting on something
+ CheckForBorderCrossing();
+ CheckForSignificantMovement(); // sends update to the modules.
+ }
+
+ //Sending prim updates AFTER the avatar terse updates are sent
+ SendPrimUpdates();
+ }
+
+ #endregion
+
+ #region Update Client(s)
+
+ ///
+ /// Sends a location update to the client connected to this scenePresence
+ ///
+ ///
+ public void SendTerseUpdateToClient(IClientAPI remoteClient)
+ {
+ // If the client is inactive, it's getting its updates from another
+ // server.
+ if (remoteClient.IsActive)
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ PhysicsActor actor = m_physicsActor;
+ Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
+
+ Vector3 pos = m_pos;
+ pos.Z += m_appearance.HipOffset;
+
+ //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
+
+ remoteClient.SendPrimUpdate(this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity);
+
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ m_scene.StatsReporter.AddAgentUpdates(1);
+ }
+ }
+
+ ///
+ /// Send a location/velocity/accelleration update to all agents in scene
+ ///
+ public void SendTerseUpdateToAllClients()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ m_scene.ForEachClient(SendTerseUpdateToClient);
+
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ public void SendCoarseLocations(List coarseLocations, List avatarUUIDs)
+ {
+ SendCourseLocationsMethod d = m_sendCourseLocationsMethod;
+ if (d != null)
+ {
+ d.Invoke(m_scene.RegionInfo.originRegionID, this, coarseLocations, avatarUUIDs);
+ }
+ }
+
+ public void SetSendCourseLocationMethod(SendCourseLocationsMethod d)
+ {
+ if (d != null)
+ m_sendCourseLocationsMethod = d;
+ }
+
+ public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p, List coarseLocations, List avatarUUIDs)
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+ m_controllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations);
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ ///
+ /// Tell other client about this avatar (The client previously didn't know or had outdated details about this avatar)
+ ///
+ ///
+ public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
+ {
+ // 2 stage check is needed.
+ if (remoteAvatar == null)
+ return;
+ IClientAPI cl=remoteAvatar.ControllingClient;
+ if (cl == null)
+ return;
+ if (m_appearance.Texture == null)
+ return;
+
+ Vector3 pos = m_pos;
+ pos.Z += m_appearance.HipOffset;
+
+ remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this);
+ m_scene.StatsReporter.AddAgentUpdates(1);
+ }
+
+ ///
+ /// Tell *ALL* agents about this agent
+ ///
+ public void SendInitialFullUpdateToAllClients()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+ int avUpdates = 0;
+ m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
+ {
+ ++avUpdates;
+ // only send if this is the root (children are only "listening posts" in a foreign region)
+ if (!IsChildAgent)
+ {
+ SendFullUpdateToOtherClient(avatar);
+ }
+
+ if (avatar.LocalId != LocalId)
+ {
+ if (!avatar.IsChildAgent)
+ {
+ avatar.SendFullUpdateToOtherClient(this);
+ avatar.SendAppearanceToOtherAgent(this);
+ avatar.Animator.SendAnimPackToClient(ControllingClient);
+ }
+ }
+ });
+
+ m_scene.StatsReporter.AddAgentUpdates(avUpdates);
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+
+ //Animator.SendAnimPack();
+ }
+
+ public void SendFullUpdateToAllClients()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ // only send update from root agents to other clients; children are only "listening posts"
+ int count = 0;
+ m_scene.ForEachScenePresence(delegate(ScenePresence sp)
+ {
+ if (sp.IsChildAgent)
+ return;
+ SendFullUpdateToOtherClient(sp);
+ ++count;
+ });
+ m_scene.StatsReporter.AddAgentUpdates(count);
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+
+ Animator.SendAnimPack();
+ }
+
+ ///
+ /// Do everything required once a client completes its movement into a region
+ ///
+ public void SendInitialData()
+ {
+ // Moved this into CompleteMovement to ensure that m_appearance is initialized before
+ // the inventory arrives
+ // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
+
+ Vector3 pos = m_pos;
+ pos.Z += m_appearance.HipOffset;
+
+ m_controllingClient.SendAvatarDataImmediate(this);
+
+ SendInitialFullUpdateToAllClients();
+ SendAppearanceToAllOtherAgents();
+ }
+
+ ///
+ /// Tell the client for this scene presence what items it should be wearing now
+ ///
+ public void SendWearables()
+ {
+ m_log.DebugFormat("[SCENE]: Received request for wearables of {0}", Name);
+
+ ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
+ }
+
+ ///
+ ///
+ ///
+ public void SendAppearanceToAllOtherAgents()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
+ {
+ if (scenePresence.UUID != UUID)
+ {
+ SendAppearanceToOtherAgent(scenePresence);
+ }
+ });
+
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ ///
+ /// Send appearance data to an agent that isn't this one.
+ ///
+ ///
+ public void SendAppearanceToOtherAgent(ScenePresence avatar)
+ {
+ avatar.ControllingClient.SendAppearance(
+ m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
+ }
+
+ ///
+ /// Set appearance data (textureentry and slider settings) received from the client
+ ///
+ ///
+ ///
+ public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
+ {
+ if (m_physicsActor != null)
+ {
+ if (!IsChildAgent)
+ {
+ // This may seem like it's redundant, remove the avatar from the physics scene
+ // just to add it back again, but it saves us from having to update
+ // 3 variables 10 times a second.
+ bool flyingTemp = m_physicsActor.Flying;
+ RemoveFromPhysicalScene();
+ //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
+
+ //PhysicsActor = null;
+
+ AddToPhysicalScene(flyingTemp);
+ }
+ }
+
+ #region Bake Cache Check
+
+ if (textureEntry != null)
+ {
+ for (int i = 0; i < BAKE_INDICES.Length; i++)
+ {
+ int j = BAKE_INDICES[i];
+ Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
+
+ if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
+ {
+ if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
+ {
+ m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name);
+ this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
+ }
+ }
+ }
+
+ }
+
+
+ #endregion Bake Cache Check
+
+ m_appearance.SetAppearance(textureEntry, visualParams);
+ if (m_appearance.AvatarHeight > 0)
+ SetHeight(m_appearance.AvatarHeight);
+
+ // This is not needed, because only the transient data changed
+ //AvatarData adata = new AvatarData(m_appearance);
+ //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
+
+ SendAppearanceToAllOtherAgents();
+ if (!m_startAnimationSet)
+ {
+ Animator.UpdateMovementAnimations();
+ m_startAnimationSet = true;
+ }
+
+ Vector3 pos = m_pos;
+ pos.Z += m_appearance.HipOffset;
+
+ m_controllingClient.SendAvatarDataImmediate(this);
+ }
+
+ public void SetWearable(int wearableId, AvatarWearable wearable)
+ {
+ m_appearance.SetWearable(wearableId, wearable);
+ AvatarData adata = new AvatarData(m_appearance);
+ m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
+ m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
+ }
+
+ // Because appearance setting is in a module, we actually need
+ // to give it access to our appearance directly, otherwise we
+ // get a synchronization issue.
+ public AvatarAppearance Appearance
+ {
+ get { return m_appearance; }
+ set { m_appearance = value; }
+ }
+
+ #endregion
+
+ #region Significant Movement Method
+
+ ///
+ /// This checks for a significant movement and sends a courselocationchange update
+ ///
+ protected void CheckForSignificantMovement()
+ {
+ // Movement updates for agents in neighboring regions are sent directly to clients.
+ // This value only affects how often agent positions are sent to neighbor regions
+ // for things such as distance-based update prioritization
+ const float SIGNIFICANT_MOVEMENT = 2.0f;
+
+ if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT)
+ {
+ posLastSignificantMove = AbsolutePosition;
+ m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient);
+ }
+
+ // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
+ if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
+ Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
+ {
+ m_lastChildAgentUpdatePosition = AbsolutePosition;
+ m_lastChildAgentUpdateCamPosition = CameraPosition;
+
+ ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
+ cadu.ActiveGroupID = UUID.Zero.Guid;
+ cadu.AgentID = UUID.Guid;
+ cadu.alwaysrun = m_setAlwaysRun;
+ cadu.AVHeight = m_avHeight;
+ Vector3 tempCameraCenter = m_CameraCenter;
+ cadu.cameraPosition = tempCameraCenter;
+ cadu.drawdistance = m_DrawDistance;
+ cadu.GroupAccess = 0;
+ cadu.Position = AbsolutePosition;
+ cadu.regionHandle = m_rootRegionHandle;
+ float multiplier = 1;
+ int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
+ if (innacurateNeighbors != 0)
+ {
+ multiplier = 1f / (float)innacurateNeighbors;
+ }
+ if (multiplier <= 0f)
+ {
+ multiplier = 0.25f;
+ }
+
+ //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
+ cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier);
+ cadu.Velocity = Velocity;
+
+ AgentPosition agentpos = new AgentPosition();
+ agentpos.CopyFrom(cadu);
+
+ m_scene.SendOutChildAgentUpdates(agentpos, this);
+ }
+ }
+
+ #endregion
+
+ #region Border Crossing Methods
+
+ ///
+ /// Checks to see if the avatar is in range of a border and calls CrossToNewRegion
+ ///
+ protected void CheckForBorderCrossing()
+ {
+ if (IsChildAgent)
+ return;
+
+ Vector3 pos2 = AbsolutePosition;
+ Vector3 vel = Velocity;
+ int neighbor = 0;
+ int[] fix = new int[2];
+
+ float timeStep = 0.1f;
+ pos2.X = pos2.X + (vel.X*timeStep);
+ pos2.Y = pos2.Y + (vel.Y*timeStep);
+ pos2.Z = pos2.Z + (vel.Z*timeStep);
+
+ if (!IsInTransit)
+ {
+ // Checks if where it's headed exists a region
+
+ bool needsTransit = false;
+ if (m_scene.TestBorderCross(pos2, Cardinals.W))
+ {
+ if (m_scene.TestBorderCross(pos2, Cardinals.S))
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.SW, ref fix);
+ }
+ else if (m_scene.TestBorderCross(pos2, Cardinals.N))
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.NW, ref fix);
+ }
+ else
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.W, ref fix);
+ }
+ }
+ else if (m_scene.TestBorderCross(pos2, Cardinals.E))
+ {
+ if (m_scene.TestBorderCross(pos2, Cardinals.S))
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.SE, ref fix);
+ }
+ else if (m_scene.TestBorderCross(pos2, Cardinals.N))
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.NE, ref fix);
+ }
+ else
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.E, ref fix);
+ }
+ }
+ else if (m_scene.TestBorderCross(pos2, Cardinals.S))
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.S, ref fix);
+ }
+ else if (m_scene.TestBorderCross(pos2, Cardinals.N))
+ {
+ needsTransit = true;
+ neighbor = HaveNeighbor(Cardinals.N, ref fix);
+ }
+
+
+ // Makes sure avatar does not end up outside region
+ if (neighbor <= 0)
+ {
+ if (!needsTransit)
+ {
+ if (m_requestedSitTargetUUID == UUID.Zero)
+ {
+ Vector3 pos = AbsolutePosition;
+ if (AbsolutePosition.X < 0)
+ pos.X += Velocity.X;
+ else if (AbsolutePosition.X > Constants.RegionSize)
+ pos.X -= Velocity.X;
+ if (AbsolutePosition.Y < 0)
+ pos.Y += Velocity.Y;
+ else if (AbsolutePosition.Y > Constants.RegionSize)
+ pos.Y -= Velocity.Y;
+ AbsolutePosition = pos;
+ }
+ }
+ }
+ else if (neighbor > 0)
+ CrossToNewRegion();
+ }
+ else
+ {
+ RemoveFromPhysicalScene();
+ // This constant has been inferred from experimentation
+ // I'm not sure what this value should be, so I tried a few values.
+ timeStep = 0.04f;
+ pos2 = AbsolutePosition;
+ pos2.X = pos2.X + (vel.X * timeStep);
+ pos2.Y = pos2.Y + (vel.Y * timeStep);
+ pos2.Z = pos2.Z + (vel.Z * timeStep);
+ m_pos = pos2;
+ }
+ }
+
+ protected int HaveNeighbor(Cardinals car, ref int[] fix)
+ {
+ uint neighbourx = m_regionInfo.RegionLocX;
+ uint neighboury = m_regionInfo.RegionLocY;
+
+ int dir = (int)car;
+
+ if (dir > 1 && dir < 5) //Heading East
+ neighbourx++;
+ else if (dir > 5) // Heading West
+ neighbourx--;
+
+ if (dir < 3 || dir == 8) // Heading North
+ neighboury++;
+ else if (dir > 3 && dir < 7) // Heading Sout
+ neighboury--;
+
+ int x = (int)(neighbourx * Constants.RegionSize);
+ int y = (int)(neighboury * Constants.RegionSize);
+ GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, x, y);
+
+ if (neighbourRegion == null)
+ {
+ fix[0] = (int)(m_regionInfo.RegionLocX - neighbourx);
+ fix[1] = (int)(m_regionInfo.RegionLocY - neighboury);
+ return dir * (-1);
+ }
+ else
+ return dir;
+ }
+
+ ///
+ /// Moves the agent outside the region bounds
+ /// Tells neighbor region that we're crossing to it
+ /// If the neighbor accepts, remove the agent's viewable avatar from this scene
+ /// set them to a child agent.
+ ///
+ protected void CrossToNewRegion()
+ {
+ InTransit();
+ try
+ {
+ m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying);
+ }
+ catch
+ {
+ m_scene.CrossAgentToNewRegion(this, false);
+ }
+ }
+
+ public void InTransit()
+ {
+ m_inTransit = true;
+
+ if ((m_physicsActor != null) && m_physicsActor.Flying)
+ m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+ else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
+ m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+ }
+
+ public void NotInTransit()
+ {
+ m_inTransit = false;
+ }
+
+ public void RestoreInCurrentScene()
+ {
+ AddToPhysicalScene(false); // not exactly false
+ }
+
+ public void Reset()
+ {
+ // Put the child agent back at the center
+ AbsolutePosition
+ = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
+ Animator.ResetAnimations();
+ }
+
+ ///
+ /// Computes which child agents to close when the scene presence moves to another region.
+ /// Removes those regions from m_knownRegions.
+ ///
+ /// The new region's x on the map
+ /// The new region's y on the map
+ ///
+ public void CloseChildAgents(uint newRegionX, uint newRegionY)
+ {
+ List byebyeRegions = new List();
+ m_log.DebugFormat(
+ "[SCENE PRESENCE]: Closing child agents. Checking {0} regions in {1}",
+ m_knownChildRegions.Keys.Count, Scene.RegionInfo.RegionName);
+ //DumpKnownRegions();
+
+ lock (m_knownChildRegions)
+ {
+ foreach (ulong handle in m_knownChildRegions.Keys)
+ {
+ // Don't close the agent on this region yet
+ if (handle != Scene.RegionInfo.RegionHandle)
+ {
+ uint x, y;
+ Utils.LongToUInts(handle, out x, out y);
+ x = x / Constants.RegionSize;
+ y = y / Constants.RegionSize;
+
+ //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
+ //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
+ if (Util.IsOutsideView(x, newRegionX, y, newRegionY))
+ {
+ byebyeRegions.Add(handle);
+ }
+ }
+ }
+ }
+
+ if (byebyeRegions.Count > 0)
+ {
+ m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents");
+ m_scene.SceneGridService.SendCloseChildAgentConnections(m_controllingClient.AgentId, byebyeRegions);
+ }
+
+ foreach (ulong handle in byebyeRegions)
+ {
+ RemoveNeighbourRegion(handle);
+ }
+ }
+
+ #endregion
+
+ ///
+ /// This allows the Sim owner the abiility to kick users from their sim currently.
+ /// It tells the client that the agent has permission to do so.
+ ///
+ public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus)
+ {
+ if (godStatus)
+ {
+ // For now, assign god level 200 to anyone
+ // who is granted god powers, but has no god level set.
+ //
+ UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID);
+ if (account != null)
+ {
+ if (account.UserLevel > 0)
+ m_godLevel = account.UserLevel;
+ else
+ m_godLevel = 200;
+ }
+ }
+ else
+ {
+ m_godLevel = 0;
+ }
+
+ ControllingClient.SendAdminResponse(token, (uint)m_godLevel);
+ }
+
+ #region Child Agent Updates
+
+ public void ChildAgentDataUpdate(AgentData cAgentData)
+ {
+ //m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName);
+ if (!IsChildAgent)
+ return;
+
+ CopyFrom(cAgentData);
+ }
+
+ ///
+ /// 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
+ ///
+ public void ChildAgentDataUpdate(AgentPosition cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
+ {
+ if (!IsChildAgent)
+ return;
+
+ //m_log.Debug(" >>> ChildAgentPositionUpdate <<< " + rRegionX + "-" + rRegionY);
+ int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
+ int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
+
+ Vector3 offset = new Vector3(shiftx, shifty, 0f);
+
+ m_DrawDistance = cAgentData.Far;
+ if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
+ m_pos = cAgentData.Position + offset;
+
+ if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
+ {
+ posLastSignificantMove = AbsolutePosition;
+ ReprioritizeUpdates();
+ }
+
+ m_CameraCenter = cAgentData.Center + offset;
+
+ m_avHeight = cAgentData.Size.Z;
+ //SetHeight(cAgentData.AVHeight);
+
+ if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0)
+ 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_sceneViewer.Reset();
+
+ //cAgentData.AVHeight;
+ m_rootRegionHandle = cAgentData.RegionHandle;
+ //m_velocity = cAgentData.Velocity;
+ }
+
+ public void CopyTo(AgentData cAgent)
+ {
+ cAgent.AgentID = UUID;
+ cAgent.RegionID = Scene.RegionInfo.RegionID;
+
+ cAgent.Position = AbsolutePosition;
+ cAgent.Velocity = m_velocity;
+ cAgent.Center = m_CameraCenter;
+ // Don't copy the size; it is inferred from apearance parameters
+ //cAgent.Size = new Vector3(0, 0, m_avHeight);
+ cAgent.AtAxis = m_CameraAtAxis;
+ cAgent.LeftAxis = m_CameraLeftAxis;
+ cAgent.UpAxis = m_CameraUpAxis;
+
+ cAgent.Far = m_DrawDistance;
+
+ // Throttles
+ float multiplier = 1;
+ int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
+ if (innacurateNeighbors != 0)
+ {
+ multiplier = 1f / innacurateNeighbors;
+ }
+ if (multiplier <= 0f)
+ {
+ multiplier = 0.25f;
+ }
+ //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
+ cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier);
+
+ cAgent.HeadRotation = m_headrotation;
+ cAgent.BodyRotation = m_bodyRot;
+ cAgent.ControlFlags = (uint)m_AgentControlFlags;
+
+ if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
+ cAgent.GodLevel = (byte)m_godLevel;
+ else
+ cAgent.GodLevel = (byte) 0;
+
+ cAgent.AlwaysRun = m_setAlwaysRun;
+
+ try
+ {
+ // We might not pass the Wearables in all cases...
+ // They're only needed so that persistent changes to the appearance
+ // are preserved in the new region where the user is moving to.
+ // But in Hypergrid we might not let this happen.
+ int i = 0;
+ UUID[] wears = new UUID[m_appearance.Wearables.Length * 2];
+ foreach (AvatarWearable aw in m_appearance.Wearables)
+ {
+ if (aw != null)
+ {
+ wears[i++] = aw.ItemID;
+ wears[i++] = aw.AssetID;
+ }
+ else
+ {
+ wears[i++] = UUID.Zero;
+ wears[i++] = UUID.Zero;
+ }
+ }
+ cAgent.Wearables = wears;
+
+ cAgent.VisualParams = m_appearance.VisualParams;
+
+ if (m_appearance.Texture != null)
+ cAgent.AgentTextures = m_appearance.Texture.GetBytes();
+ }
+ catch (Exception e)
+ {
+ m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message);
+ }
+
+ //Attachments
+ List attPoints = m_appearance.GetAttachedPoints();
+ if (attPoints != null)
+ {
+ //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
+ int i = 0;
+ AttachmentData[] attachs = new AttachmentData[attPoints.Count];
+ foreach (int point in attPoints)
+ {
+ attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
+ }
+ cAgent.Attachments = attachs;
+ }
+
+ lock (scriptedcontrols)
+ {
+ ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
+ int i = 0;
+
+ foreach (ScriptControllers c in scriptedcontrols.Values)
+ {
+ controls[i++] = new ControllerData(c.itemID, (uint)c.ignoreControls, (uint)c.eventControls);
+ }
+ cAgent.Controllers = controls;
+ }
+
+ // Animations
+ try
+ {
+ cAgent.Anims = Animator.Animations.ToArray();
+ }
+ catch { }
+
+ // cAgent.GroupID = ??
+ // Groups???
+
+ }
+
+ public void CopyFrom(AgentData cAgent)
+ {
+ m_originRegionID = cAgent.RegionID;
+
+ m_callbackURI = cAgent.CallbackURI;
+
+ m_pos = cAgent.Position;
+
+ m_velocity = cAgent.Velocity;
+ m_CameraCenter = cAgent.Center;
+ //m_avHeight = cAgent.Size.Z;
+ m_CameraAtAxis = cAgent.AtAxis;
+ m_CameraLeftAxis = cAgent.LeftAxis;
+ m_CameraUpAxis = cAgent.UpAxis;
+
+ m_DrawDistance = cAgent.Far;
+
+ if ((cAgent.Throttles != null) && cAgent.Throttles.Length > 0)
+ ControllingClient.SetChildAgentThrottle(cAgent.Throttles);
+
+ m_headrotation = cAgent.HeadRotation;
+ m_bodyRot = cAgent.BodyRotation;
+ m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
+
+ if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
+ m_godLevel = cAgent.GodLevel;
+ m_setAlwaysRun = cAgent.AlwaysRun;
+
+ uint i = 0;
+ try
+ {
+ if (cAgent.Wearables == null)
+ cAgent.Wearables = new UUID[0];
+ AvatarWearable[] wears = new AvatarWearable[cAgent.Wearables.Length / 2];
+ for (uint n = 0; n < cAgent.Wearables.Length; n += 2)
+ {
+ UUID itemId = cAgent.Wearables[n];
+ UUID assetId = cAgent.Wearables[n + 1];
+ wears[i++] = new AvatarWearable(itemId, assetId);
+ }
+ m_appearance.Wearables = wears;
+ Primitive.TextureEntry te;
+ if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
+ te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
+ else
+ te = AvatarAppearance.GetDefaultTexture();
+ if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
+ cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams();
+ m_appearance.SetAppearance(te, (byte[])cAgent.VisualParams.Clone());
+ }
+ catch (Exception e)
+ {
+ m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message);
+ }
+
+ // Attachments
+ try
+ {
+ if (cAgent.Attachments != null)
+ {
+ m_appearance.ClearAttachments();
+ foreach (AttachmentData att in cAgent.Attachments)
+ {
+ m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
+ }
+ }
+ }
+ catch { }
+
+ try
+ {
+ lock (scriptedcontrols)
+ {
+ if (cAgent.Controllers != null)
+ {
+ scriptedcontrols.Clear();
+
+ foreach (ControllerData c in cAgent.Controllers)
+ {
+ ScriptControllers sc = new ScriptControllers();
+ sc.itemID = c.ItemID;
+ sc.ignoreControls = (ScriptControlled)c.IgnoreControls;
+ sc.eventControls = (ScriptControlled)c.EventControls;
+
+ scriptedcontrols[sc.itemID] = sc;
+ }
+ }
+ }
+ }
+ catch { }
+ // Animations
+ try
+ {
+ Animator.ResetAnimations();
+ Animator.Animations.FromArray(cAgent.Anims);
+ }
+ catch { }
+
+ //cAgent.GroupID = ??
+ //Groups???
+ }
+
+ public bool CopyAgent(out IAgentData agent)
+ {
+ agent = new CompleteAgentData();
+ CopyTo((AgentData)agent);
+ return true;
+ }
+
+ #endregion Child Agent Updates
+
+ ///
+ /// Handles part of the PID controller function for moving an avatar.
+ ///
+ public override void UpdateMovement()
+ {
+ if (m_forceToApply.HasValue)
+ {
+
+ Vector3 force = m_forceToApply.Value;
+ m_updateflag = true;
+ Velocity = force;
+
+ m_forceToApply = null;
+ }
+ else
+ {
+ if (m_isNudging)
+ {
+ Vector3 force = Vector3.Zero;
+
+ m_updateflag = true;
+ Velocity = force;
+ m_isNudging = false;
+ m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
+ }
+ }
+ }
+
+ public override void SetText(string text, Vector3 color, double alpha)
+ {
+ throw new Exception("Can't set Text on avatar.");
+ }
+
+ ///
+ /// Adds a physical representation of the avatar to the Physics plugin
+ ///
+ public void AddToPhysicalScene(bool isFlying)
+ {
+ PhysicsScene scene = m_scene.PhysicsScene;
+
+ Vector3 pVec = AbsolutePosition;
+
+ // Old bug where the height was in centimeters instead of meters
+ if (m_avHeight == 127.0f)
+ {
+ m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new Vector3(0f, 0f, 1.56f),
+ isFlying);
+ }
+ else
+ {
+ m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec,
+ new Vector3(0f, 0f, m_avHeight), isFlying);
+ }
+ scene.AddPhysicsActorTaint(m_physicsActor);
+ //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
+ m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
+ m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
+ m_physicsActor.SubscribeEvents(500);
+ m_physicsActor.LocalID = LocalId;
+ }
+
+ private void OutOfBoundsCall(Vector3 pos)
+ {
+ //bool flying = m_physicsActor.Flying;
+ //RemoveFromPhysicalScene();
+
+ //AddToPhysicalScene(flying);
+ if (ControllingClient != null)
+ ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.", true);
+ }
+
+ // Event called by the physics plugin to tell the avatar about a collision.
+ private void PhysicsCollisionUpdate(EventArgs e)
+ {
+ if (e == null)
+ return;
+
+ // The Physics Scene will send (spam!) updates every 500 ms grep: m_physicsActor.SubscribeEvents(
+ // as of this comment the interval is set in AddToPhysicalScene
+ if (Animator!=null)
+ {
+ if (m_updateCount > 0) //KF: DO NOT call UpdateMovementAnimations outside of the m_updateCount wrapper,
+ { // else its will lock out other animation changes, like ground sit.
+ Animator.UpdateMovementAnimations();
+ m_updateCount--;
+ }
+ }
+
+ CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
+ Dictionary coldata = collisionData.m_objCollisionList;
+
+ CollisionPlane = Vector4.UnitW;
+
+ if (m_lastColCount != coldata.Count)
+ {
+ m_updateCount = UPDATE_COUNT;
+ m_lastColCount = coldata.Count;
+ }
+
+ if (coldata.Count != 0 && Animator != null)
+ {
+ switch (Animator.CurrentMovementAnimation)
+ {
+ case "STAND":
+ case "WALK":
+ case "RUN":
+ case "CROUCH":
+ case "CROUCHWALK":
+ {
+ ContactPoint lowest;
+ lowest.SurfaceNormal = Vector3.Zero;
+ lowest.Position = Vector3.Zero;
+ lowest.Position.Z = Single.NaN;
+
+ foreach (ContactPoint contact in coldata.Values)
+ {
+ if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
+ {
+ lowest = contact;
+ }
+ }
+
+ CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
+ }
+ break;
+ }
+ }
+
+ List thisHitColliders = new List();
+ List endedColliders = new List();
+ List startedColliders = new List();
+
+ foreach (uint localid in coldata.Keys)
+ {
+ thisHitColliders.Add(localid);
+ if (!m_lastColliders.Contains(localid))
+ {
+ startedColliders.Add(localid);
+ }
+ //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
+ }
+
+ // calculate things that ended colliding
+ foreach (uint localID in m_lastColliders)
+ {
+ if (!thisHitColliders.Contains(localID))
+ {
+ endedColliders.Add(localID);
+ }
+ }
+ //add the items that started colliding this time to the last colliders list.
+ foreach (uint localID in startedColliders)
+ {
+ m_lastColliders.Add(localID);
+ }
+ // remove things that ended colliding from the last colliders list
+ foreach (uint localID in endedColliders)
+ {
+ m_lastColliders.Remove(localID);
+ }
+
+ // do event notification
+ if (startedColliders.Count > 0)
+ {
+ ColliderArgs StartCollidingMessage = new ColliderArgs();
+ List colliding = new List();
+ foreach (uint localId in startedColliders)
+ {
+ if (localId == 0)
+ continue;
+
+ SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
+ string data = "";
+ if (obj != null)
+ {
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = obj.UUID;
+ detobj.nameStr = obj.Name;
+ detobj.ownerUUID = obj.OwnerID;
+ detobj.posVector = obj.AbsolutePosition;
+ detobj.rotQuat = obj.GetWorldRotation();
+ detobj.velVector = obj.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = obj.GroupID;
+ colliding.Add(detobj);
+ }
+ }
+
+ if (colliding.Count > 0)
+ {
+ StartCollidingMessage.Colliders = colliding;
+
+ foreach (SceneObjectGroup att in Attachments)
+ Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
+ }
+ }
+
+ if (endedColliders.Count > 0)
+ {
+ ColliderArgs EndCollidingMessage = new ColliderArgs();
+ List colliding = new List();
+ foreach (uint localId in endedColliders)
+ {
+ if (localId == 0)
+ continue;
+
+ SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
+ string data = "";
+ if (obj != null)
+ {
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = obj.UUID;
+ detobj.nameStr = obj.Name;
+ detobj.ownerUUID = obj.OwnerID;
+ detobj.posVector = obj.AbsolutePosition;
+ detobj.rotQuat = obj.GetWorldRotation();
+ detobj.velVector = obj.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = obj.GroupID;
+ colliding.Add(detobj);
+ }
+ }
+
+ if (colliding.Count > 0)
+ {
+ EndCollidingMessage.Colliders = colliding;
+
+ foreach (SceneObjectGroup att in Attachments)
+ Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage);
+ }
+ }
+
+ if (thisHitColliders.Count > 0)
+ {
+ ColliderArgs CollidingMessage = new ColliderArgs();
+ List colliding = new List();
+ foreach (uint localId in thisHitColliders)
+ {
+ if (localId == 0)
+ continue;
+
+ SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
+ string data = "";
+ if (obj != null)
+ {
+ DetectedObject detobj = new DetectedObject();
+ detobj.keyUUID = obj.UUID;
+ detobj.nameStr = obj.Name;
+ detobj.ownerUUID = obj.OwnerID;
+ detobj.posVector = obj.AbsolutePosition;
+ detobj.rotQuat = obj.GetWorldRotation();
+ detobj.velVector = obj.Velocity;
+ detobj.colliderType = 0;
+ detobj.groupUUID = obj.GroupID;
+ colliding.Add(detobj);
+ }
+ }
+
+ if (colliding.Count > 0)
+ {
+ CollidingMessage.Colliders = colliding;
+
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup att in m_attachments)
+ Scene.EventManager.TriggerScriptColliding(att.LocalId, CollidingMessage);
+ }
+ }
+ }
+
+ if (m_invulnerable)
+ return;
+
+ float starthealth = Health;
+ uint killerObj = 0;
+ foreach (uint localid in coldata.Keys)
+ {
+ SceneObjectPart part = Scene.GetSceneObjectPart(localid);
+
+ if (part != null && part.ParentGroup.Damage != -1.0f)
+ Health -= part.ParentGroup.Damage;
+ else
+ {
+ if (coldata[localid].PenetrationDepth >= 0.10f)
+ Health -= coldata[localid].PenetrationDepth * 5.0f;
+ }
+
+ if (Health <= 0.0f)
+ {
+ if (localid != 0)
+ killerObj = localid;
+ }
+ //m_log.Debug("[AVATAR]: Collision with localid: " + localid.ToString() + " at depth: " + coldata[localid].ToString());
+ }
+ //Health = 100;
+ if (!m_invulnerable)
+ {
+ if (starthealth != Health)
+ {
+ ControllingClient.SendHealth(Health);
+ }
+ if (m_health <= 0)
+ m_scene.EventManager.TriggerAvatarKill(killerObj, this);
+ }
+ }
+
+ public void setHealthWithUpdate(float health)
+ {
+ Health = health;
+ ControllingClient.SendHealth(Health);
+ }
+
+ public void Close()
+ {
+ lock (m_attachments)
+ {
+ // Delete attachments from scene
+ // Don't try to save, as this thread won't live long
+ // enough to complete the save. This would cause no copy
+ // attachments to poof!
+ //
+ foreach (SceneObjectGroup grp in m_attachments)
+ {
+ m_scene.DeleteSceneObject(grp, false);
+ }
+ m_attachments.Clear();
+ }
+
+ lock (m_knownChildRegions)
+ {
+ m_knownChildRegions.Clear();
+ }
+
+ lock (m_reprioritization_timer)
+ {
+ m_reprioritization_timer.Enabled = false;
+ m_reprioritization_timer.Elapsed -= new ElapsedEventHandler(Reprioritize);
+ }
+
+ // I don't get it but mono crashes when you try to dispose of this timer,
+ // unsetting the elapsed callback should be enough to allow for cleanup however.
+ // m_reprioritizationTimer.Dispose();
+
+ m_sceneViewer.Close();
+
+ RemoveFromPhysicalScene();
+ m_animator.Close();
+ m_animator = null;
+ }
+
+ public void AddAttachment(SceneObjectGroup gobj)
+ {
+ lock (m_attachments)
+ {
+ m_attachments.Add(gobj);
+ }
+ }
+
+ public bool HasAttachments()
+ {
+ return m_attachments.Count > 0;
+ }
+
+ public bool HasScriptedAttachments()
+ {
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup gobj in m_attachments)
+ {
+ if (gobj != null)
+ {
+ if (gobj.RootPart.Inventory.ContainsScripts())
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ public void RemoveAttachment(SceneObjectGroup gobj)
+ {
+ lock (m_attachments)
+ {
+ if (m_attachments.Contains(gobj))
+ {
+ m_attachments.Remove(gobj);
+ }
+ }
+ }
+
+ public bool ValidateAttachments()
+ {
+ lock (m_attachments)
+ {
+ // Validate
+ foreach (SceneObjectGroup gobj in m_attachments)
+ {
+ if (gobj == null)
+ return false;
+
+ if (gobj.IsDeleted)
+ return false;
+ }
+ }
+ return true;
+ }
+
+ ///
+ /// Send a script event to this scene presence's attachments
+ ///
+ /// The name of the event
+ /// The arguments for the event
+ public void SendScriptEventToAttachments(string eventName, Object[] args)
+ {
+ if (m_scriptEngines != null)
+ {
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup grp in m_attachments)
+ {
+ // 16384 is CHANGED_ANIMATION
+ //
+ // Send this to all attachment root prims
+ //
+ foreach (IScriptModule m in m_scriptEngines)
+ {
+ if (m == null) // No script engine loaded
+ continue;
+
+ m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { (int)Changed.ANIMATION });
+ }
+ }
+ }
+ }
+ }
+
+
+ public void initializeScenePresence(IClientAPI client, RegionInfo region, Scene scene)
+ {
+ m_controllingClient = client;
+ m_regionInfo = region;
+ m_scene = scene;
+
+ RegisterToEvents();
+ if (m_controllingClient != null)
+ {
+ m_controllingClient.ProcessPendingPackets();
+ }
+ /*
+ AbsolutePosition = client.StartPos;
+
+ Animations = new AvatarAnimations();
+ Animations.LoadAnims();
+
+ m_animations = new List();
+ m_animations.Add(Animations.AnimsUUID["STAND"]);
+ m_animationSeqs.Add(m_controllingClient.NextAnimationSequenceNumber);
+
+ SetDirectionVectors();
+ */
+ }
+
+ internal void PushForce(Vector3 impulse)
+ {
+ if (PhysicsActor != null)
+ {
+ PhysicsActor.AddForce(impulse,true);
+ }
+ }
+
+ public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID)
+ {
+ ScriptControllers obj = new ScriptControllers();
+ obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
+ obj.eventControls = ScriptControlled.CONTROL_ZERO;
+
+ obj.itemID = Script_item_UUID;
+ if (pass_on == 0 && accept == 0)
+ {
+ IgnoredControls |= (ScriptControlled)controls;
+ obj.ignoreControls = (ScriptControlled)controls;
+ }
+
+ if (pass_on == 0 && accept == 1)
+ {
+ IgnoredControls |= (ScriptControlled)controls;
+ obj.ignoreControls = (ScriptControlled)controls;
+ obj.eventControls = (ScriptControlled)controls;
+ }
+ if (pass_on == 1 && accept == 1)
+ {
+ IgnoredControls = ScriptControlled.CONTROL_ZERO;
+ obj.eventControls = (ScriptControlled)controls;
+ obj.ignoreControls = ScriptControlled.CONTROL_ZERO;
+ }
+
+ lock (scriptedcontrols)
+ {
+ if (pass_on == 1 && accept == 0)
+ {
+ IgnoredControls &= ~(ScriptControlled)controls;
+ if (scriptedcontrols.ContainsKey(Script_item_UUID))
+ scriptedcontrols.Remove(Script_item_UUID);
+ }
+ else
+ {
+ scriptedcontrols[Script_item_UUID] = obj;
+ }
+ }
+ ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
+ }
+
+ public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID)
+ {
+ IgnoredControls = ScriptControlled.CONTROL_ZERO;
+ lock (scriptedcontrols)
+ {
+ scriptedcontrols.Clear();
+ }
+ ControllingClient.SendTakeControls(int.MaxValue, false, false);
+ }
+
+ public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
+ {
+ ScriptControllers takecontrols;
+
+ lock (scriptedcontrols)
+ {
+ if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
+ {
+ ScriptControlled sctc = takecontrols.eventControls;
+
+ ControllingClient.SendTakeControls((int)sctc, false, false);
+ ControllingClient.SendTakeControls((int)sctc, true, false);
+
+ scriptedcontrols.Remove(Script_item_UUID);
+ IgnoredControls = ScriptControlled.CONTROL_ZERO;
+ foreach (ScriptControllers scData in scriptedcontrols.Values)
+ {
+ IgnoredControls |= scData.ignoreControls;
+ }
+ }
+ }
+ }
+
+ internal void SendControlToScripts(uint flags)
+ {
+ ScriptControlled allflags = ScriptControlled.CONTROL_ZERO;
+
+ if (MouseDown)
+ {
+ allflags = LastCommands & (ScriptControlled.CONTROL_ML_LBUTTON | ScriptControlled.CONTROL_LBUTTON);
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP) != 0 || (flags & unchecked((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_UP)) != 0)
+ {
+ allflags = ScriptControlled.CONTROL_ZERO;
+ MouseDown = true;
+ }
+ }
+
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_ML_LBUTTON;
+ MouseDown = true;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_LBUTTON;
+ MouseDown = true;
+ }
+
+ // find all activated controls, whether the scripts are interested in them or not
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_FWD;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_BACK;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_UP;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_DOWN;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_LEFT;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) != 0 || (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_RIGHT;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_ROT_RIGHT;
+ }
+ if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)
+ {
+ allflags |= ScriptControlled.CONTROL_ROT_LEFT;
+ }
+ // optimization; we have to check per script, but if nothing is pressed and nothing changed, we can skip that
+ if (allflags != ScriptControlled.CONTROL_ZERO || allflags != LastCommands)
+ {
+ lock (scriptedcontrols)
+ {
+ foreach (KeyValuePair kvp in scriptedcontrols)
+ {
+ UUID scriptUUID = kvp.Key;
+ ScriptControllers scriptControlData = kvp.Value;
+
+ ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
+ ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
+ ScriptControlled localChange = localHeld ^ localLast; // the changed bits
+ if (localHeld != ScriptControlled.CONTROL_ZERO || localChange != ScriptControlled.CONTROL_ZERO)
+ {
+ // only send if still pressed or just changed
+ m_scene.EventManager.TriggerControlEvent(scriptUUID, UUID, (uint)localHeld, (uint)localChange);
+ }
+ }
+ }
+ }
+
+ LastCommands = allflags;
+ }
+
+ internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
+ {
+ if (ignored == ScriptControlled.CONTROL_ZERO)
+ return flags;
+
+ if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
+ if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
+ if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
+ if ((ignored & ScriptControlled.CONTROL_UP) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
+ if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
+ if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
+ if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
+ if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
+ if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
+ if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
+
+ //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
+ //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
+ //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
+ //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
+ //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
+ //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
+ //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
+
+ return flags;
+ }
+
+ ///
+ /// RezAttachments. This should only be called upon login on the first region.
+ /// Attachment rezzings on crossings and TPs are done in a different way.
+ ///
+ public void RezAttachments()
+ {
+ if (null == m_appearance)
+ {
+ m_log.WarnFormat("[ATTACHMENT]: Appearance has not been initialized for agent {0}", UUID);
+ return;
+ }
+
+ XmlDocument doc = new XmlDocument();
+ string stateData = String.Empty;
+
+ IAttachmentsService attServ = m_scene.RequestModuleInterface();
+ if (attServ != null)
+ {
+ m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
+ stateData = attServ.Get(ControllingClient.AgentId.ToString());
+ if (stateData != String.Empty)
+ {
+ try
+ {
+ doc.LoadXml(stateData);
+ }
+ catch { }
+ }
+ }
+
+ Dictionary itemData = new Dictionary();
+
+ XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
+ if (nodes.Count > 0)
+ {
+ foreach (XmlNode n in nodes)
+ {
+ XmlElement elem = (XmlElement)n;
+ string itemID = elem.GetAttribute("ItemID");
+ string xml = elem.InnerXml;
+
+ itemData[new UUID(itemID)] = xml;
+ }
+ }
+
+ List attPoints = m_appearance.GetAttachedPoints();
+ foreach (int p in attPoints)
+ {
+ if (m_isDeleted)
+ return;
+
+ UUID itemID = m_appearance.GetAttachedItem(p);
+ UUID assetID = m_appearance.GetAttachedAsset(p);
+
+ // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
+ // But they're not used anyway, the item is being looked up for now, so let's proceed.
+ //if (UUID.Zero == assetID)
+ //{
+ // m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
+ // continue;
+ //}
+
+ try
+ {
+ string xmlData;
+ XmlDocument d = new XmlDocument();
+ UUID asset;
+ if (itemData.TryGetValue(itemID, out xmlData))
+ {
+ d.LoadXml(xmlData);
+ m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", itemID);
+
+ // Rez from inventory
+ asset
+ = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, d);
+
+ }
+ else
+ {
+ // Rez from inventory (with a null doc to let
+ // CHANGED_OWNER happen)
+ asset
+ = m_scene.AttachmentsModule.RezSingleAttachmentFromInventory(ControllingClient, itemID, (uint)p, true, null);
+ }
+
+ m_log.InfoFormat(
+ "[ATTACHMENT]: Rezzed attachment in point {0} from item {1} and asset {2} ({3})",
+ p, itemID, assetID, asset);
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat("[ATTACHMENT]: Unable to rez attachment: {0}", e.ToString());
+ }
+ }
+ }
+
+ private void ReprioritizeUpdates()
+ {
+ if (Scene.IsReprioritizationEnabled && Scene.UpdatePrioritizationScheme != UpdatePrioritizationSchemes.Time)
+ {
+ lock (m_reprioritization_timer)
+ {
+ if (!m_reprioritizing)
+ m_reprioritization_timer.Enabled = m_reprioritizing = true;
+ else
+ m_reprioritization_called = true;
+ }
+ }
+ }
+
+ private void Reprioritize(object sender, ElapsedEventArgs e)
+ {
+ m_controllingClient.ReprioritizeUpdates();
+
+ lock (m_reprioritization_timer)
+ {
+ m_reprioritization_timer.Enabled = m_reprioritizing = m_reprioritization_called;
+ m_reprioritization_called = false;
+ }
+ }
+
+ private Vector3 Quat2Euler(Quaternion rot){
+ float x = Utils.RAD_TO_DEG * (float)Math.Atan2((double)((2.0f * rot.X * rot.W) - (2.0f * rot.Y * rot.Z)) ,
+ (double)(1 - (2.0f * rot.X * rot.X) - (2.0f * rot.Z * rot.Z)));
+ float y = Utils.RAD_TO_DEG * (float)Math.Asin ((double)((2.0f * rot.X * rot.Y) + (2.0f * rot.Z * rot.W)));
+ float z = Utils.RAD_TO_DEG * (float)Math.Atan2(((double)(2.0f * rot.Y * rot.W) - (2.0f * rot.X * rot.Z)) ,
+ (double)(1 - (2.0f * rot.Y * rot.Y) - (2.0f * rot.Z * rot.Z)));
+ return(new Vector3(x,y,z));
+ }
+
+
+ }
+}
--
cgit v1.1
From cabbd187e7945329c2f0700180f400b11096d33c Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 11:13:05 -0700
Subject: Fix the distance from which autopilot is negated when sitting on an
unscripted prim - and also add some more Velocity code to ensure it gets set
to zero in all cases
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 882f4a7..56e7e93 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2007,13 +2007,14 @@ namespace OpenSim.Region.Framework.Scenes
if (autopilot)
{ // its not a scripted sit
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
- if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 2.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 2.0f) )
+ if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 10.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 10.0f) )
{
autopilot = false; // close enough
m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
Not using the part's position because returning the AV to the last known standing
position is likely to be more friendly, isn't it? */
RemoveFromPhysicalScene();
+ Velocity = Vector3.Zero;
AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target
} // else the autopilot will get us close
}
@@ -2023,6 +2024,7 @@ namespace OpenSim.Region.Framework.Scenes
I *am* using the part's position this time because we have no real idea how far away
the avatar is from the sit target. */
RemoveFromPhysicalScene();
+ Velocity = Vector3.Zero;
}
}
else return; // physactor is null!
--
cgit v1.1
From 478d83539244157992b1849648e5e4cf758543e0 Mon Sep 17 00:00:00 2001
From: sacha
Date: Sat, 7 Aug 2010 21:04:16 +0000
Subject: removing more stains ...
---
OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index a9ecde8..59e4037 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -168,7 +168,7 @@ namespace OpenSim.Region.Framework.Scenes
if (neighbour != null)
{
- m_log.DebugFormat("[INTERGRID]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize);
+ // m_log.DebugFormat("[INTERGRID]: Successfully informed neighbour {0}-{1} that I'm here", x / Constants.RegionSize, y / Constants.RegionSize);
m_scene.EventManager.TriggerOnRegionUp(neighbour);
}
else
@@ -183,7 +183,7 @@ namespace OpenSim.Region.Framework.Scenes
//m_log.Info("[INTER]: " + debugRegionName + ": SceneCommunicationService: Sending InterRegion Notification that region is up " + region.RegionName);
List neighbours = m_scene.GridService.GetNeighbours(m_scene.RegionInfo.ScopeID, m_scene.RegionInfo.RegionID);
- m_log.DebugFormat("[INTERGRID]: Informing {0} neighbours that this region is up", neighbours.Count);
+ //m_log.DebugFormat("[INTERGRID]: Informing {0} neighbours that this region is up", neighbours.Count);
foreach (GridRegion n in neighbours)
{
InformNeighbourThatRegionUpDelegate d = InformNeighboursThatRegionIsUpAsync;
@@ -267,7 +267,7 @@ namespace OpenSim.Region.Framework.Scenes
protected void SendCloseChildAgentAsync(UUID agentID, ulong regionHandle)
{
- m_log.Debug("[INTERGRID]: Sending close agent to " + regionHandle);
+ //m_log.Debug("[INTERGRID]: Sending close agent to " + regionHandle);
// let's do our best, but there's not much we can do if the neighbour doesn't accept.
//m_commsProvider.InterRegion.TellRegionToCloseChildConnection(regionHandle, agentID);
--
cgit v1.1
From 19ab4c950880beb3ac88a172b775c3973782ec3d Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 16:52:03 -0700
Subject: Fix a rather nasty issue where the Backup() process causes objects
and avatars sitting on them to be pushed to the corner of the sim.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 199 +++++++++++----------
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 25 +--
2 files changed, 120 insertions(+), 104 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index a828127..0d15cb4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -317,8 +317,8 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_scriptListens_notAtTarget = false;
private bool m_scriptListens_atRotTarget = false;
- private bool m_scriptListens_notAtRotTarget = false;
-
+ private bool m_scriptListens_notAtRotTarget = false;
+ public bool m_dupeInProgress = false;
internal Dictionary m_savedScriptState = null;
#region Properties
@@ -475,16 +475,21 @@ namespace OpenSim.Region.Framework.Scenes
{
part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
- part.GroupPosition = val;
- part.TriggerScriptChangedEvent(Changed.POSITION);
- }
-
- foreach (ScenePresence av in m_linkedAvatars)
- {
- Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
- av.AbsolutePosition += offset;
- av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
- av.SendFullUpdateToAllClients();
+ part.GroupPosition = val;
+ if (!m_dupeInProgress)
+ {
+ part.TriggerScriptChangedEvent(Changed.POSITION);
+ }
+ }
+ if (!m_dupeInProgress)
+ {
+ foreach (ScenePresence av in m_linkedAvatars)
+ {
+ Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
+ av.AbsolutePosition += offset;
+ av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
+ av.SendFullUpdateToAllClients();
+ }
}
//if (m_rootPart.PhysActor != null)
@@ -1800,88 +1805,96 @@ namespace OpenSim.Region.Framework.Scenes
/// True if the duplicate will immediately be in the scene, false otherwise
///
public SceneObjectGroup Copy(bool userExposed)
- {
- SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
- dupe.m_isBackedUp = false;
- dupe.m_parts = new Dictionary();
-
- // Warning, The following code related to previousAttachmentStatus is needed so that clones of
- // attachments do not bordercross while they're being duplicated. This is hacktastic!
- // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
- // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
- // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
- // then restore it's attachment state
-
- // This is only necessary when userExposed is false!
-
- bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
-
- if (!userExposed)
- dupe.RootPart.IsAttachment = true;
-
- dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
-
- if (!userExposed)
- {
- dupe.RootPart.IsAttachment = previousAttachmentStatus;
- }
-
- dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
- dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
-
- if (userExposed)
- dupe.m_rootPart.TrimPermissions();
-
- /// may need to create a new Physics actor.
- if (dupe.RootPart.PhysActor != null && userExposed)
- {
- PrimitiveBaseShape pbs = dupe.RootPart.Shape;
-
- dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
- dupe.RootPart.Name,
- pbs,
- dupe.RootPart.AbsolutePosition,
- dupe.RootPart.Scale,
- dupe.RootPart.RotationOffset,
- dupe.RootPart.PhysActor.IsPhysical);
-
- dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
- dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
+ {
+ SceneObjectGroup dupe;
+ try
+ {
+ m_dupeInProgress = true;
+ dupe = (SceneObjectGroup)MemberwiseClone();
+ dupe.m_isBackedUp = false;
+ dupe.m_parts = new Dictionary();
+
+ // Warning, The following code related to previousAttachmentStatus is needed so that clones of
+ // attachments do not bordercross while they're being duplicated. This is hacktastic!
+ // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
+ // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
+ // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
+ // then restore it's attachment state
+
+ // This is only necessary when userExposed is false!
+
+ bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
+
+ if (!userExposed)
+ dupe.RootPart.IsAttachment = true;
+
+ dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
+
+ if (!userExposed)
+ {
+ dupe.RootPart.IsAttachment = previousAttachmentStatus;
+ }
+
+ dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
+ dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
+
+ if (userExposed)
+ dupe.m_rootPart.TrimPermissions();
+
+ /// may need to create a new Physics actor.
+ if (dupe.RootPart.PhysActor != null && userExposed)
+ {
+ PrimitiveBaseShape pbs = dupe.RootPart.Shape;
+
+ dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
+ dupe.RootPart.Name,
+ pbs,
+ dupe.RootPart.AbsolutePosition,
+ dupe.RootPart.Scale,
+ dupe.RootPart.RotationOffset,
+ dupe.RootPart.PhysActor.IsPhysical);
+
+ dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
+ dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
+ }
+
+ List partList;
+
+ lockPartsForRead(true);
+
+ partList = new List(m_parts.Values);
+
+ lockPartsForRead(false);
+
+ partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
+ {
+ return p1.LinkNum.CompareTo(p2.LinkNum);
+ }
+ );
+
+ foreach (SceneObjectPart part in partList)
+ {
+ if (part.UUID != m_rootPart.UUID)
+ {
+ SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
+
+ newPart.LinkNum = part.LinkNum;
+ }
+ }
+
+ if (userExposed)
+ {
+ dupe.UpdateParentIDs();
+ dupe.HasGroupChanged = true;
+ dupe.AttachToBackup();
+
+ ScheduleGroupForFullUpdate();
+ }
+ }
+ finally
+ {
+ m_dupeInProgress = false;
}
-
- List partList;
-
- lockPartsForRead(true);
-
- partList = new List(m_parts.Values);
-
- lockPartsForRead(false);
-
- partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
- {
- return p1.LinkNum.CompareTo(p2.LinkNum);
- }
- );
-
- foreach (SceneObjectPart part in partList)
- {
- if (part.UUID != m_rootPart.UUID)
- {
- SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
-
- newPart.LinkNum = part.LinkNum;
- }
- }
-
- if (userExposed)
- {
- dupe.UpdateParentIDs();
- dupe.HasGroupChanged = true;
- dupe.AttachToBackup();
-
- ScheduleGroupForFullUpdate();
- }
-
return dupe;
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index b0ce450..77581af 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -718,17 +718,20 @@ namespace OpenSim.Region.Framework.Scenes
// Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
- }
-
- List avs = ParentGroup.GetLinkedAvatars();
- foreach (ScenePresence av in avs)
- {
- if (av.LinkedPrim == m_uuid)
- {
- Vector3 offset = (m_offsetPosition - oldpos);
- av.OffsetPosition += offset;
- av.SendFullUpdateToAllClients();
- }
+ }
+
+ if (!m_parentGroup.m_dupeInProgress)
+ {
+ List avs = ParentGroup.GetLinkedAvatars();
+ foreach (ScenePresence av in avs)
+ {
+ if (av.LinkedPrim == m_uuid)
+ {
+ Vector3 offset = (m_offsetPosition - oldpos);
+ av.OffsetPosition += offset;
+ av.SendFullUpdateToAllClients();
+ }
+ }
}
}
TriggerScriptChangedEvent(Changed.POSITION);
--
cgit v1.1
From acb1590cf063769802f35c99dd5fb6398172296f Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 17:32:36 -0700
Subject: Fix the unscripted sit rotation being incorrect (relative to the
prim). Note that unscripted sit offset is still really poor but this is not
something i'm prepared to spend time on fixing.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 56e7e93..5191236 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2053,9 +2053,13 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
//NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
- ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+ Quaternion roffset = Quaternion.Identity;
+ if (SitTargetisSet)
+ {
+ roffset = part.RotationOffset;
+ }
+ ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * roffset) + part.OffsetPosition), sitOrientation / part.RotationOffset, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
- m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls
// HandleAgentSit itself after it gets to the location
// It doesn't get to the location until we've moved them there though
@@ -2441,7 +2445,7 @@ Console.WriteLine("Scripted Sit ofset {0}", m_pos);
}
m_linkedPrim = part.UUID;
-
+ m_offsetRotation = m_offsetRotation / part.RotationOffset;
Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
Animator.TrySetMovementAnimation(sitAnimation);
--
cgit v1.1
From b771965f287af0cb5d46e4f652e9912dfaa40682 Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 17:33:27 -0700
Subject: Get rid of some debug chatter that someone who can't spell left
behind. ;)
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5191236..6f92a41 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2378,8 +2378,7 @@ namespace OpenSim.Region.Framework.Scenes
m_bodyRot = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
part.IsOccupied = true;
- part.ParentGroup.AddAvatar(agentID);
-Console.WriteLine("Scripted Sit ofset {0}", m_pos);
+ part.ParentGroup.AddAvatar(agentID);
}
else
{
--
cgit v1.1
From aa54e8d95eb920869da5c885fc536cfb1ffca90b Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 17:35:16 -0700
Subject: Increase sit distance to 256 meters, but leave the initial autopilot
process in the picture so sit position can still be raycast by the existing
code.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 6f92a41..cca296e 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2007,7 +2007,7 @@ namespace OpenSim.Region.Framework.Scenes
if (autopilot)
{ // its not a scripted sit
// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
- if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 10.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 10.0f) )
+ if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 256.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 256.0f) )
{
autopilot = false; // close enough
m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
--
cgit v1.1
From f9b5f23383675abe0ae1c2ed83dd5ccce738d940 Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 22:19:26 -0700
Subject: Reverted: * Fix the unscripted sit rotation being incorrect .. will
commit a proper fix now.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 10 +++-------
1 file changed, 3 insertions(+), 7 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index cca296e..87cf135 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2053,13 +2053,9 @@ namespace OpenSim.Region.Framework.Scenes
//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
//NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
- Quaternion roffset = Quaternion.Identity;
- if (SitTargetisSet)
- {
- roffset = part.RotationOffset;
- }
- ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * roffset) + part.OffsetPosition), sitOrientation / part.RotationOffset, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+ ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
+ m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
// This calls HandleAgentSit twice, once from here, and the client calls
// HandleAgentSit itself after it gets to the location
// It doesn't get to the location until we've moved them there though
@@ -2444,7 +2440,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_linkedPrim = part.UUID;
- m_offsetRotation = m_offsetRotation / part.RotationOffset;
+
Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
Animator.TrySetMovementAnimation(sitAnimation);
--
cgit v1.1
From a1f2be5e69ef04a8520229e161bdd0527badb844 Mon Sep 17 00:00:00 2001
From: meta7
Date: Sat, 7 Aug 2010 22:25:37 -0700
Subject: The real fix for unscripted sit positions. This one doesn't fuck
everything else up. Promise.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 87cf135..fc8e0d7 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2440,7 +2440,10 @@ namespace OpenSim.Region.Framework.Scenes
}
m_linkedPrim = part.UUID;
-
+ if (part.GetAvatarOnSitTarget() != UUID)
+ {
+ m_offsetRotation = m_offsetRotation / part.RotationOffset;
+ }
Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
Animator.TrySetMovementAnimation(sitAnimation);
--
cgit v1.1
From ca2a4bbded8c33125c5b96bb3b715e3f3925ddad Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Sun, 8 Aug 2010 19:35:20 +0200
Subject: Add debug messages to attachment receiving and cowardly refuse to
create them if the owner can't be determined.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 6c17be8..8a8dabc 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2592,6 +2592,12 @@ namespace OpenSim.Region.Framework.Scenes
/// True if the SceneObjectGroup was added, False if it was not
public bool AddSceneObject(SceneObjectGroup sceneObject)
{
+ if (sceneObject.OwnerID == UUID.Zero)
+ {
+ m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
+ return false;
+ }
+
// If the user is banned, we won't let any of their objects
// enter. Period.
//
@@ -2641,15 +2647,27 @@ namespace OpenSim.Region.Framework.Scenes
if (AttachmentsModule != null)
AttachmentsModule.AttachObject(sp.ControllingClient, grp, 0, false);
+ m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was found, attaching", sceneObject.UUID);
}
else
{
+ m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
}
+ if (sceneObject.OwnerID == UUID.Zero)
+ {
+ m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
+ return false;
+ }
}
else
{
+ if (sceneObject.OwnerID == UUID.Zero)
+ {
+ m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
+ return false;
+ }
AddRestoredSceneObject(sceneObject, true, false);
if (!Permissions.CanObjectEntry(sceneObject.UUID,
@@ -5333,4 +5351,4 @@ namespace OpenSim.Region.Framework.Scenes
return offsets.ToArray();
}
}
-}
\ No newline at end of file
+}
--
cgit v1.1
From 603b3a1606396e355416eae838f6bdaa5051bf1f Mon Sep 17 00:00:00 2001
From: meta7
Date: Sun, 8 Aug 2010 17:31:29 -0700
Subject: Fix minimap issues. This addresses mantis #228.
---
OpenSim/Region/Framework/Scenes/SceneGraph.cs | 23 ++---------------------
1 file changed, 2 insertions(+), 21 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 5acc227..94ec534 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -228,27 +228,8 @@ namespace OpenSim.Region.Framework.Scenes
if (sp.IsChildAgent)
return;
- if (sp.ParentID != 0)
- {
- // sitting avatar
- SceneObjectPart sop = m_parentScene.GetSceneObjectPart(sp.ParentID);
- if (sop != null)
- {
- coarseLocations.Add(sop.AbsolutePosition + sp.AbsolutePosition);
- avatarUUIDs.Add(sp.UUID);
- }
- else
- {
- // we can't find the parent.. ! arg!
- coarseLocations.Add(sp.AbsolutePosition);
- avatarUUIDs.Add(sp.UUID);
- }
- }
- else
- {
- coarseLocations.Add(sp.AbsolutePosition);
- avatarUUIDs.Add(sp.UUID);
- }
+ coarseLocations.Add(sp.AbsolutePosition);
+ avatarUUIDs.Add(sp.UUID);
}
}
--
cgit v1.1
From 680e801bf229d54dc57dbca24e841f7f2e8f43d4 Mon Sep 17 00:00:00 2001
From: meta7
Date: Sun, 8 Aug 2010 17:32:20 -0700
Subject: Print a console message when we deny access because of no valid
parcel found.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 8a8dabc..779f898 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3513,7 +3513,8 @@ namespace OpenSim.Region.Framework.Scenes
if (tp == TeleportFlags.ViaLogin)
{
if (land != null && !TestLandRestrictions(agent, land, out reason))
- {
+ {
+ m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
return false;
}
}
--
cgit v1.1
From f20dc512e87983b9ba6b86f806489380d3cfef5a Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 9 Aug 2010 02:46:09 +0200
Subject: Whitespace conflict
---
OpenSim/Region/Framework/Scenes/Scene.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 779f898..06bbe32 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3513,7 +3513,7 @@ namespace OpenSim.Region.Framework.Scenes
if (tp == TeleportFlags.ViaLogin)
{
if (land != null && !TestLandRestrictions(agent, land, out reason))
- {
+ {
m_log.DebugFormat("[CONNECTION BEGIN]: Denying access to {0} due to no land access", agent.AgentID.ToString());
return false;
}
--
cgit v1.1
From 0f9eebdfb1e948bc1ffb148322e668b5a2f560a6 Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Tue, 10 Aug 2010 03:52:00 +0200
Subject: Change prejump from hardcoded true to default true so it can be
disabled. It completely destroys roleplay jumping
---
OpenSim/Region/Framework/Scenes/Scene.cs | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 06bbe32..05036f1 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -726,8 +726,7 @@ namespace OpenSim.Region.Framework.Scenes
//Animation states
m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false);
// TODO: Change default to true once the feature is supported
- m_usePreJump = startupConfig.GetBoolean("enableprejump", false);
- m_usePreJump = true; // Above line fails!?
+ m_usePreJump = startupConfig.GetBoolean("enableprejump", true);
m_maxNonphys = startupConfig.GetFloat("NonPhysicalPrimMax", m_maxNonphys);
if (RegionInfo.NonphysPrimMax > 0)
{
--
cgit v1.1
From 1ead2ed5eea379c500d2657e7bed8908b376e336 Mon Sep 17 00:00:00 2001
From: meta7
Date: Tue, 10 Aug 2010 09:07:17 -0700
Subject: Add a stack trace to the error output on the recursive read lock
warning on my RWlocks. Whilst recursive locks are safe, coupled with other
issues we're experiencing with the TaskInventoryDictionary it implies that
somewhere the lock is not being freed possibly due to a merge error
somewhere, and thus it needs to be looked into.
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 218 +++++++++++----------
1 file changed, 114 insertions(+), 104 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3c3f4b7..4f6bc52 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -29,6 +29,7 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
+using System.Diagnostics;
using System.Threading;
using System.Xml;
using System.Xml.Serialization;
@@ -138,6 +139,15 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[SceneObjectGroup.m_parts] Recursive read lock requested. This should not happen and means something needs to be fixed. For now though, it's safe to continue.");
try
{
+ StackTrace stackTrace = new StackTrace(); // get call stack
+ StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)
+
+ // write call stack method names
+ foreach (StackFrame stackFrame in stackFrames)
+ {
+ m_log.Error("[SceneObjectGroup.m_parts] "+(stackFrame.GetMethod().Name); // write method name
+ }
+
m_partsLock.ExitReadLock();
}
catch { } // Ignore errors, to allow resync
@@ -317,7 +327,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_scriptListens_notAtTarget = false;
private bool m_scriptListens_atRotTarget = false;
- private bool m_scriptListens_notAtRotTarget = false;
+ private bool m_scriptListens_notAtRotTarget = false;
public bool m_dupeInProgress = false;
internal Dictionary m_savedScriptState = null;
@@ -475,21 +485,21 @@ namespace OpenSim.Region.Framework.Scenes
{
part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
- part.GroupPosition = val;
- if (!m_dupeInProgress)
- {
- part.TriggerScriptChangedEvent(Changed.POSITION);
+ part.GroupPosition = val;
+ if (!m_dupeInProgress)
+ {
+ part.TriggerScriptChangedEvent(Changed.POSITION);
+ }
+ }
+ if (!m_dupeInProgress)
+ {
+ foreach (ScenePresence av in m_linkedAvatars)
+ {
+ Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
+ av.AbsolutePosition += offset;
+ av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
+ av.SendFullUpdateToAllClients();
}
- }
- if (!m_dupeInProgress)
- {
- foreach (ScenePresence av in m_linkedAvatars)
- {
- Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
- av.AbsolutePosition += offset;
- av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
- av.SendFullUpdateToAllClients();
- }
}
//if (m_rootPart.PhysActor != null)
@@ -1805,95 +1815,95 @@ namespace OpenSim.Region.Framework.Scenes
/// True if the duplicate will immediately be in the scene, false otherwise
///
public SceneObjectGroup Copy(bool userExposed)
- {
- SceneObjectGroup dupe;
- try
- {
- m_dupeInProgress = true;
- dupe = (SceneObjectGroup)MemberwiseClone();
- dupe.m_isBackedUp = false;
- dupe.m_parts = new Dictionary();
-
- // Warning, The following code related to previousAttachmentStatus is needed so that clones of
- // attachments do not bordercross while they're being duplicated. This is hacktastic!
- // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
- // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
- // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
- // then restore it's attachment state
-
- // This is only necessary when userExposed is false!
-
- bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
-
- if (!userExposed)
- dupe.RootPart.IsAttachment = true;
-
- dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
-
- if (!userExposed)
- {
- dupe.RootPart.IsAttachment = previousAttachmentStatus;
- }
-
- dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
- dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
-
- if (userExposed)
- dupe.m_rootPart.TrimPermissions();
-
- /// may need to create a new Physics actor.
- if (dupe.RootPart.PhysActor != null && userExposed)
- {
- PrimitiveBaseShape pbs = dupe.RootPart.Shape;
-
- dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
- dupe.RootPart.Name,
- pbs,
- dupe.RootPart.AbsolutePosition,
- dupe.RootPart.Scale,
- dupe.RootPart.RotationOffset,
- dupe.RootPart.PhysActor.IsPhysical);
-
- dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
- dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
- }
-
- List partList;
-
- lockPartsForRead(true);
-
- partList = new List(m_parts.Values);
-
- lockPartsForRead(false);
-
- partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
- {
- return p1.LinkNum.CompareTo(p2.LinkNum);
- }
- );
-
- foreach (SceneObjectPart part in partList)
- {
- if (part.UUID != m_rootPart.UUID)
- {
- SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
-
- newPart.LinkNum = part.LinkNum;
- }
- }
-
- if (userExposed)
- {
- dupe.UpdateParentIDs();
- dupe.HasGroupChanged = true;
- dupe.AttachToBackup();
-
- ScheduleGroupForFullUpdate();
- }
- }
- finally
- {
- m_dupeInProgress = false;
+ {
+ SceneObjectGroup dupe;
+ try
+ {
+ m_dupeInProgress = true;
+ dupe = (SceneObjectGroup)MemberwiseClone();
+ dupe.m_isBackedUp = false;
+ dupe.m_parts = new Dictionary();
+
+ // Warning, The following code related to previousAttachmentStatus is needed so that clones of
+ // attachments do not bordercross while they're being duplicated. This is hacktastic!
+ // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
+ // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
+ // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
+ // then restore it's attachment state
+
+ // This is only necessary when userExposed is false!
+
+ bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
+
+ if (!userExposed)
+ dupe.RootPart.IsAttachment = true;
+
+ dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
+
+ if (!userExposed)
+ {
+ dupe.RootPart.IsAttachment = previousAttachmentStatus;
+ }
+
+ dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
+ dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
+
+ if (userExposed)
+ dupe.m_rootPart.TrimPermissions();
+
+ /// may need to create a new Physics actor.
+ if (dupe.RootPart.PhysActor != null && userExposed)
+ {
+ PrimitiveBaseShape pbs = dupe.RootPart.Shape;
+
+ dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
+ dupe.RootPart.Name,
+ pbs,
+ dupe.RootPart.AbsolutePosition,
+ dupe.RootPart.Scale,
+ dupe.RootPart.RotationOffset,
+ dupe.RootPart.PhysActor.IsPhysical);
+
+ dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
+ dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
+ }
+
+ List partList;
+
+ lockPartsForRead(true);
+
+ partList = new List(m_parts.Values);
+
+ lockPartsForRead(false);
+
+ partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
+ {
+ return p1.LinkNum.CompareTo(p2.LinkNum);
+ }
+ );
+
+ foreach (SceneObjectPart part in partList)
+ {
+ if (part.UUID != m_rootPart.UUID)
+ {
+ SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
+
+ newPart.LinkNum = part.LinkNum;
+ }
+ }
+
+ if (userExposed)
+ {
+ dupe.UpdateParentIDs();
+ dupe.HasGroupChanged = true;
+ dupe.AttachToBackup();
+
+ ScheduleGroupForFullUpdate();
+ }
+ }
+ finally
+ {
+ m_dupeInProgress = false;
}
return dupe;
}
--
cgit v1.1
From d98d5ee6be233cf644be5ee1011c4a7f4b86ae46 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 10 Aug 2010 19:42:18 +0100
Subject: Remove windows line endinge
---
.../Region/Framework/Scenes/SceneObjectGroup.cs | 208 ++++++++++-----------
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 28 +--
2 files changed, 118 insertions(+), 118 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 3c3f4b7..a862fa2 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -317,7 +317,7 @@ namespace OpenSim.Region.Framework.Scenes
private bool m_scriptListens_notAtTarget = false;
private bool m_scriptListens_atRotTarget = false;
- private bool m_scriptListens_notAtRotTarget = false;
+ private bool m_scriptListens_notAtRotTarget = false;
public bool m_dupeInProgress = false;
internal Dictionary m_savedScriptState = null;
@@ -475,21 +475,21 @@ namespace OpenSim.Region.Framework.Scenes
{
part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
- part.GroupPosition = val;
- if (!m_dupeInProgress)
- {
- part.TriggerScriptChangedEvent(Changed.POSITION);
+ part.GroupPosition = val;
+ if (!m_dupeInProgress)
+ {
+ part.TriggerScriptChangedEvent(Changed.POSITION);
+ }
+ }
+ if (!m_dupeInProgress)
+ {
+ foreach (ScenePresence av in m_linkedAvatars)
+ {
+ Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
+ av.AbsolutePosition += offset;
+ av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
+ av.SendFullUpdateToAllClients();
}
- }
- if (!m_dupeInProgress)
- {
- foreach (ScenePresence av in m_linkedAvatars)
- {
- Vector3 offset = m_parts[av.LinkedPrim].GetWorldPosition() - av.ParentPosition;
- av.AbsolutePosition += offset;
- av.ParentPosition = m_parts[av.LinkedPrim].GetWorldPosition(); //ParentPosition gets cleared by AbsolutePosition
- av.SendFullUpdateToAllClients();
- }
}
//if (m_rootPart.PhysActor != null)
@@ -1805,95 +1805,95 @@ namespace OpenSim.Region.Framework.Scenes
/// True if the duplicate will immediately be in the scene, false otherwise
///
public SceneObjectGroup Copy(bool userExposed)
- {
- SceneObjectGroup dupe;
- try
- {
- m_dupeInProgress = true;
- dupe = (SceneObjectGroup)MemberwiseClone();
- dupe.m_isBackedUp = false;
- dupe.m_parts = new Dictionary();
-
- // Warning, The following code related to previousAttachmentStatus is needed so that clones of
- // attachments do not bordercross while they're being duplicated. This is hacktastic!
- // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
- // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
- // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
- // then restore it's attachment state
-
- // This is only necessary when userExposed is false!
-
- bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
-
- if (!userExposed)
- dupe.RootPart.IsAttachment = true;
-
- dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
-
- if (!userExposed)
- {
- dupe.RootPart.IsAttachment = previousAttachmentStatus;
- }
-
- dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
- dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
-
- if (userExposed)
- dupe.m_rootPart.TrimPermissions();
-
- /// may need to create a new Physics actor.
- if (dupe.RootPart.PhysActor != null && userExposed)
- {
- PrimitiveBaseShape pbs = dupe.RootPart.Shape;
-
- dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
- dupe.RootPart.Name,
- pbs,
- dupe.RootPart.AbsolutePosition,
- dupe.RootPart.Scale,
- dupe.RootPart.RotationOffset,
- dupe.RootPart.PhysActor.IsPhysical);
-
- dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
- dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
- }
-
- List partList;
-
- lockPartsForRead(true);
-
- partList = new List(m_parts.Values);
-
- lockPartsForRead(false);
-
- partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
- {
- return p1.LinkNum.CompareTo(p2.LinkNum);
- }
- );
-
- foreach (SceneObjectPart part in partList)
- {
- if (part.UUID != m_rootPart.UUID)
- {
- SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
-
- newPart.LinkNum = part.LinkNum;
- }
- }
-
- if (userExposed)
- {
- dupe.UpdateParentIDs();
- dupe.HasGroupChanged = true;
- dupe.AttachToBackup();
-
- ScheduleGroupForFullUpdate();
- }
- }
- finally
- {
- m_dupeInProgress = false;
+ {
+ SceneObjectGroup dupe;
+ try
+ {
+ m_dupeInProgress = true;
+ dupe = (SceneObjectGroup)MemberwiseClone();
+ dupe.m_isBackedUp = false;
+ dupe.m_parts = new Dictionary();
+
+ // Warning, The following code related to previousAttachmentStatus is needed so that clones of
+ // attachments do not bordercross while they're being duplicated. This is hacktastic!
+ // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region!
+ // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state
+ // (which should be false anyway) set it as an Attachment and then set it's Absolute Position,
+ // then restore it's attachment state
+
+ // This is only necessary when userExposed is false!
+
+ bool previousAttachmentStatus = dupe.RootPart.IsAttachment;
+
+ if (!userExposed)
+ dupe.RootPart.IsAttachment = true;
+
+ dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
+
+ if (!userExposed)
+ {
+ dupe.RootPart.IsAttachment = previousAttachmentStatus;
+ }
+
+ dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
+ dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
+
+ if (userExposed)
+ dupe.m_rootPart.TrimPermissions();
+
+ /// may need to create a new Physics actor.
+ if (dupe.RootPart.PhysActor != null && userExposed)
+ {
+ PrimitiveBaseShape pbs = dupe.RootPart.Shape;
+
+ dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape(
+ dupe.RootPart.Name,
+ pbs,
+ dupe.RootPart.AbsolutePosition,
+ dupe.RootPart.Scale,
+ dupe.RootPart.RotationOffset,
+ dupe.RootPart.PhysActor.IsPhysical);
+
+ dupe.RootPart.PhysActor.LocalID = dupe.RootPart.LocalId;
+ dupe.RootPart.DoPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
+ }
+
+ List partList;
+
+ lockPartsForRead(true);
+
+ partList = new List(m_parts.Values);
+
+ lockPartsForRead(false);
+
+ partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2)
+ {
+ return p1.LinkNum.CompareTo(p2.LinkNum);
+ }
+ );
+
+ foreach (SceneObjectPart part in partList)
+ {
+ if (part.UUID != m_rootPart.UUID)
+ {
+ SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
+
+ newPart.LinkNum = part.LinkNum;
+ }
+ }
+
+ if (userExposed)
+ {
+ dupe.UpdateParentIDs();
+ dupe.HasGroupChanged = true;
+ dupe.AttachToBackup();
+
+ ScheduleGroupForFullUpdate();
+ }
+ }
+ finally
+ {
+ m_dupeInProgress = false;
}
return dupe;
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 77581af..277384e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -718,20 +718,20 @@ namespace OpenSim.Region.Framework.Scenes
// Tell the physics engines that this prim changed.
m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
- }
-
- if (!m_parentGroup.m_dupeInProgress)
- {
- List avs = ParentGroup.GetLinkedAvatars();
- foreach (ScenePresence av in avs)
- {
- if (av.LinkedPrim == m_uuid)
- {
- Vector3 offset = (m_offsetPosition - oldpos);
- av.OffsetPosition += offset;
- av.SendFullUpdateToAllClients();
- }
- }
+ }
+
+ if (!m_parentGroup.m_dupeInProgress)
+ {
+ List avs = ParentGroup.GetLinkedAvatars();
+ foreach (ScenePresence av in avs)
+ {
+ if (av.LinkedPrim == m_uuid)
+ {
+ Vector3 offset = (m_offsetPosition - oldpos);
+ av.OffsetPosition += offset;
+ av.SendFullUpdateToAllClients();
+ }
+ }
}
}
TriggerScriptChangedEvent(Changed.POSITION);
--
cgit v1.1
From 383ee0d647df245dcb933e71f2b4bcdfbc026a15 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 10 Aug 2010 19:48:45 +0100
Subject: Remove 4000+ DOS line endings. Grrr!
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8664 +++++++++++-----------
1 file changed, 4332 insertions(+), 4332 deletions(-)
(limited to 'OpenSim/Region/Framework/Scenes')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fc8e0d7..9d95324 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1,4332 +1,4332 @@
-/*
- * Copyright (c) Contributors, http://opensimulator.org/
- * See CONTRIBUTORS.TXT for a full list of copyright holders.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * * Neither the name of the OpenSimulator Project nor the
- * names of its contributors may be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-using System.Xml;
-using System.Collections.Generic;
-using System.Reflection;
-using System.Timers;
-using OpenMetaverse;
-using log4net;
-using OpenSim.Framework;
-using OpenSim.Framework.Client;
-using OpenSim.Region.Framework.Interfaces;
-using OpenSim.Region.Framework.Scenes.Animation;
-using OpenSim.Region.Framework.Scenes.Types;
-using OpenSim.Region.Physics.Manager;
-using GridRegion = OpenSim.Services.Interfaces.GridRegion;
-using OpenSim.Services.Interfaces;
-
-namespace OpenSim.Region.Framework.Scenes
-{
- enum ScriptControlled : uint
- {
- CONTROL_ZERO = 0,
- CONTROL_FWD = 1,
- CONTROL_BACK = 2,
- CONTROL_LEFT = 4,
- CONTROL_RIGHT = 8,
- CONTROL_UP = 16,
- CONTROL_DOWN = 32,
- CONTROL_ROT_LEFT = 256,
- CONTROL_ROT_RIGHT = 512,
- CONTROL_LBUTTON = 268435456,
- CONTROL_ML_LBUTTON = 1073741824
- }
-
- struct ScriptControllers
- {
- public UUID itemID;
- public ScriptControlled ignoreControls;
- public ScriptControlled eventControls;
- }
-
- public delegate void SendCourseLocationsMethod(UUID scene, ScenePresence presence, List coarseLocations, List avatarUUIDs);
-
- public class ScenePresence : EntityBase, ISceneEntity
- {
-// ~ScenePresence()
-// {
-// m_log.Debug("[ScenePresence] Destructor called");
-// }
-
- private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
-
- private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
-// private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
- private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
- private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
-
- ///
- /// Experimentally determined "fudge factor" to make sit-target positions
- /// the same as in SecondLife. Fudge factor was tested for 36 different
- /// test cases including prims of type box, sphere, cylinder, and torus,
- /// with varying parameters for sit target location, prim size, prim
- /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
- /// issue #1716
- ///
-// private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
- // Value revised by KF 091121 by comparison with SL.
- private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.0f, 0.0f, 0.418f);
-
- public UUID currentParcelUUID = UUID.Zero;
-
- private ISceneViewer m_sceneViewer;
-
- ///
- /// The animator for this avatar
- ///
- public ScenePresenceAnimator Animator
- {
- get { return m_animator; }
- }
- protected ScenePresenceAnimator m_animator;
-
- ///
- /// The scene objects attached to this avatar. Do not change this list directly - use methods such as
- /// AddAttachment() and RemoveAttachment(). Lock this list when performing any read operations upon it.
- ///
- public List Attachments
- {
- get { return m_attachments; }
- }
- protected List m_attachments = new List();
-
- private Dictionary scriptedcontrols = new Dictionary();
- private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
- private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
- private bool MouseDown = false;
- private SceneObjectGroup proxyObjectGroup;
- //private SceneObjectPart proxyObjectPart = null;
- public Vector3 lastKnownAllowedPosition;
- public bool sentMessageAboutRestrictedParcelFlyingDown;
- public Vector4 CollisionPlane = Vector4.UnitW;
-
- private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
- private Vector3 m_avUnscriptedSitPos; // for non-scripted prims
- private Vector3 m_lastPosition;
- private Vector3 m_lastWorldPosition;
- private Quaternion m_lastRotation;
- private Vector3 m_lastVelocity;
- //private int m_lastTerseSent;
-
- private bool m_updateflag;
- private byte m_movementflag;
- private Vector3? m_forceToApply;
- private uint m_requestedSitTargetID;
- private UUID m_requestedSitTargetUUID;
- public bool SitGround = false;
-
- private SendCourseLocationsMethod m_sendCourseLocationsMethod;
-
- private bool m_startAnimationSet;
-
- //private Vector3 m_requestedSitOffset = new Vector3();
-
- private Vector3 m_LastFinitePos;
-
- private float m_sitAvatarHeight = 2.0f;
-
- private int m_godLevel;
- private int m_userLevel;
-
- private bool m_invulnerable = true;
-
- private Vector3 m_lastChildAgentUpdatePosition;
- private Vector3 m_lastChildAgentUpdateCamPosition;
-
- private int m_perfMonMS;
-
- private bool m_setAlwaysRun;
- private bool m_forceFly;
- private bool m_flyDisabled;
-
- private float m_speedModifier = 1.0f;
-
- private Quaternion m_bodyRot= Quaternion.Identity;
-
- private Quaternion m_bodyRotPrevious = Quaternion.Identity;
-
- private const int LAND_VELOCITYMAG_MAX = 12;
-
- public bool IsRestrictedToRegion;
-
- public string JID = String.Empty;
-
- private float m_health = 100f;
-
- // Default AV Height
- private float m_avHeight = 127.0f;
-
- protected RegionInfo m_regionInfo;
- protected ulong crossingFromRegion;
-
- private readonly Vector3[] Dir_Vectors = new Vector3[11];
- private bool m_isNudging = false;
-
- // Position of agent's camera in world (region cordinates)
- protected Vector3 m_CameraCenter;
- protected Vector3 m_lastCameraCenter;
-
- protected Timer m_reprioritization_timer;
- protected bool m_reprioritizing;
- protected bool m_reprioritization_called;
-
- // Use these three vectors to figure out what the agent is looking at
- // Convert it to a Matrix and/or Quaternion
- protected Vector3 m_CameraAtAxis;
- protected Vector3 m_CameraLeftAxis;
- protected Vector3 m_CameraUpAxis;
- private AgentManager.ControlFlags m_AgentControlFlags;
- private Quaternion m_headrotation = Quaternion.Identity;
- private byte m_state;
-
- //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
-// private Vector3 movementvector;
-
- private bool m_autopilotMoving;
- private Vector3 m_autoPilotTarget;
- private bool m_sitAtAutoTarget;
- private Vector3 m_initialSitTarget = Vector3.Zero; //KF: First estimate of where to sit
-
- private string m_nextSitAnimation = String.Empty;
-
- //PauPaw:Proper PID Controler for autopilot************
- private bool m_moveToPositionInProgress;
- private Vector3 m_moveToPositionTarget;
- private Quaternion m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
-
- private bool m_followCamAuto;
-
- private int m_movementUpdateCount;
- private int m_lastColCount = -1; //KF: Look for Collision chnages
- private int m_updateCount = 0; //KF: Update Anims for a while
- private static readonly int UPDATE_COUNT = 10; // how many frames to update for
- private const int NumMovementsBetweenRayCast = 5;
- private List m_lastColliders = new List();
-
- private bool CameraConstraintActive;
- //private int m_moveToPositionStateStatus;
- //*****************************************************
-
- // Agent's Draw distance.
- protected float m_DrawDistance;
-
- protected AvatarAppearance m_appearance;
-
- // neighbouring regions we have enabled a child agent in
- // holds the seed cap for the child agent in that region
- private Dictionary m_knownChildRegions = new Dictionary();
-
- ///
- /// Implemented Control Flags
- ///
- private enum Dir_ControlFlags
- {
- DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
- DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
- DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
- DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
- DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
- DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
- DIR_CONTROL_FLAG_FORWARD_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS,
- DIR_CONTROL_FLAG_BACK_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG,
- DIR_CONTROL_FLAG_LEFT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS,
- DIR_CONTROL_FLAG_RIGHT_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG,
- DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
- }
-
- ///
- /// Position at which a significant movement was made
- ///
- private Vector3 posLastSignificantMove;
-
- // For teleports and crossings callbacks
- string m_callbackURI;
- UUID m_originRegionID;
-
- ulong m_rootRegionHandle;
-
- ///
- /// Script engines present in the scene
- ///
- private IScriptModule[] m_scriptEngines;
-
- #region Properties
-
- ///
- /// Physical scene representation of this Avatar.
- ///
- public PhysicsActor PhysicsActor
- {
- set { m_physicsActor = value; }
- get { return m_physicsActor; }
- }
-
- public byte MovementFlag
- {
- set { m_movementflag = value; }
- get { return m_movementflag; }
- }
-
- public bool Updated
- {
- set { m_updateflag = value; }
- get { return m_updateflag; }
- }
-
- public bool Invulnerable
- {
- set { m_invulnerable = value; }
- get { return m_invulnerable; }
- }
-
- public int UserLevel
- {
- get { return m_userLevel; }
- }
-
- public int GodLevel
- {
- get { return m_godLevel; }
- }
-
- public ulong RegionHandle
- {
- get { return m_rootRegionHandle; }
- }
-
- public Vector3 CameraPosition
- {
- get { return m_CameraCenter; }
- }
-
- public Quaternion CameraRotation
- {
- get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); }
- }
-
- public Vector3 CameraAtAxis
- {
- get { return m_CameraAtAxis; }
- }
-
- public Vector3 CameraLeftAxis
- {
- get { return m_CameraLeftAxis; }
- }
-
- public Vector3 CameraUpAxis
- {
- get { return m_CameraUpAxis; }
- }
-
- public Vector3 Lookat
- {
- get
- {
- Vector3 a = new Vector3(m_CameraAtAxis.X, m_CameraAtAxis.Y, 0);
-
- if (a == Vector3.Zero)
- return a;
-
- return Util.GetNormalizedVector(a);
- }
- }
-
- private readonly string m_firstname;
-
- public string Firstname
- {
- get { return m_firstname; }
- }
-
- private readonly string m_lastname;
-
- public string Lastname
- {
- get { return m_lastname; }
- }
-
- private string m_grouptitle;
-
- public string Grouptitle
- {
- get { return m_grouptitle; }
- set { m_grouptitle = value; }
- }
-
- public float DrawDistance
- {
- get { return m_DrawDistance; }
- }
-
- protected bool m_allowMovement = true;
-
- public bool AllowMovement
- {
- get { return m_allowMovement; }
- set { m_allowMovement = value; }
- }
-
- public bool SetAlwaysRun
- {
- get
- {
- if (PhysicsActor != null)
- {
- return PhysicsActor.SetAlwaysRun;
- }
- else
- {
- return m_setAlwaysRun;
- }
- }
- set
- {
- m_setAlwaysRun = value;
- if (PhysicsActor != null)
- {
- PhysicsActor.SetAlwaysRun = value;
- }
- }
- }
-
- public byte State
- {
- get { return m_state; }
- set { m_state = value; }
- }
-
- public uint AgentControlFlags
- {
- get { return (uint)m_AgentControlFlags; }
- set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
- }
-
- ///
- /// This works out to be the ClientView object associated with this avatar, or it's client connection manager
- ///
- private IClientAPI m_controllingClient;
-
- protected PhysicsActor m_physicsActor;
-
- ///
- /// The client controlling this presence
- ///
- public IClientAPI ControllingClient
- {
- get { return m_controllingClient; }
- }
-
- public IClientCore ClientView
- {
- get { return (IClientCore) m_controllingClient; }
- }
-
- protected Vector3 m_parentPosition;
- public Vector3 ParentPosition
- {
- get { return m_parentPosition; }
- set { m_parentPosition = value; }
- }
-
- ///
- /// Position of this avatar relative to the region the avatar is in
- ///
- public override Vector3 AbsolutePosition
- {
- get
- {
- PhysicsActor actor = m_physicsActor;
-// if (actor != null)
- if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
- m_pos = actor.Position;
-
- // If we're sitting, we need to update our position
- if (m_parentID != 0)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
- if (part != null)
- m_parentPosition = part.AbsolutePosition;
- }
-
- return m_parentPosition + m_pos;
- }
- set
- {
- PhysicsActor actor = m_physicsActor;
- if (actor != null)
- {
- try
- {
- lock (m_scene.SyncRoot)
- m_physicsActor.Position = value;
- }
- catch (Exception e)
- {
- m_log.Error("[SCENEPRESENCE]: ABSOLUTE POSITION " + e.Message);
- }
- }
-
- if (m_parentID == 0) // KF Do NOT update m_pos here if Av is sitting!
- m_pos = value;
- m_parentPosition = Vector3.Zero;
- }
- }
-
- public Vector3 OffsetPosition
- {
- get { return m_pos; }
- set { m_pos = value; }
- }
-
- ///
- /// Current velocity of the avatar.
- ///
- public override Vector3 Velocity
- {
- get
- {
- PhysicsActor actor = m_physicsActor;
- if (actor != null)
- m_velocity = actor.Velocity;
-
- return m_velocity;
- }
- set
- {
- PhysicsActor actor = m_physicsActor;
- if (actor != null)
- {
- try
- {
- lock (m_scene.SyncRoot)
- actor.Velocity = value;
- }
- catch (Exception e)
- {
- m_log.Error("[SCENEPRESENCE]: VELOCITY " + e.Message);
- }
- }
-
- m_velocity = value;
- }
- }
-
- public Quaternion OffsetRotation
- {
- get { return m_offsetRotation; }
- set { m_offsetRotation = value; }
- }
-
- public Quaternion Rotation
- {
- get {
- if (m_parentID != 0)
- {
- if (m_offsetRotation != null)
- {
- return m_offsetRotation;
- }
- else
- {
- return new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
-
- }
- else
- {
- return m_bodyRot;
- }
- }
- set {
- m_bodyRot = value;
- if (m_parentID != 0)
- {
- m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
- }
- }
-
- public Quaternion PreviousRotation
- {
- get { return m_bodyRotPrevious; }
- set { m_bodyRotPrevious = value; }
- }
-
- ///
- /// If this is true, agent doesn't have a representation in this scene.
- /// this is an agent 'looking into' this scene from a nearby scene(region)
- ///
- /// if False, this agent has a representation in this scene
- ///
- private bool m_isChildAgent = true;
-
- public bool IsChildAgent
- {
- get { return m_isChildAgent; }
- set { m_isChildAgent = value; }
- }
-
- private uint m_parentID;
-
-
- private UUID m_linkedPrim;
-
- public uint ParentID
- {
- get { return m_parentID; }
- set { m_parentID = value; }
- }
-
- public UUID LinkedPrim
- {
- get { return m_linkedPrim; }
- set { m_linkedPrim = value; }
- }
-
- public float Health
- {
- get { return m_health; }
- set { m_health = value; }
- }
-
- ///
- /// These are the region handles known by the avatar.
- ///
- public List KnownChildRegionHandles
- {
- get
- {
- if (m_knownChildRegions.Count == 0)
- return new List();
- else
- return new List(m_knownChildRegions.Keys);
- }
- }
-
- public Dictionary KnownRegions
- {
- get { return m_knownChildRegions; }
- set
- {
- m_knownChildRegions = value;
- }
- }
-
- public ISceneViewer SceneViewer
- {
- get { return m_sceneViewer; }
- }
-
- public void AdjustKnownSeeds()
- {
- Dictionary seeds;
-
- if (Scene.CapsModule != null)
- seeds = Scene.CapsModule.GetChildrenSeeds(UUID);
- else
- seeds = new Dictionary();
-
- List old = new List();
- foreach (ulong handle in seeds.Keys)
- {
- uint x, y;
- Utils.LongToUInts(handle, out x, out y);
- x = x / Constants.RegionSize;
- y = y / Constants.RegionSize;
- if (Util.IsOutsideView(x, Scene.RegionInfo.RegionLocX, y, Scene.RegionInfo.RegionLocY))
- {
- old.Add(handle);
- }
- }
- DropOldNeighbours(old);
-
- if (Scene.CapsModule != null)
- Scene.CapsModule.SetChildrenSeed(UUID, seeds);
-
- KnownRegions = seeds;
- //m_log.Debug(" ++++++++++AFTER+++++++++++++ ");
- //DumpKnownRegions();
- }
-
- public void DumpKnownRegions()
- {
- m_log.Info("================ KnownRegions "+Scene.RegionInfo.RegionName+" ================");
- foreach (KeyValuePair kvp in KnownRegions)
- {
- uint x, y;
- Utils.LongToUInts(kvp.Key, out x, out y);
- x = x / Constants.RegionSize;
- y = y / Constants.RegionSize;
- m_log.Info(" >> "+x+", "+y+": "+kvp.Value);
- }
- }
-
- private bool m_inTransit;
- private bool m_mouseLook;
- private bool m_leftButtonDown;
-
- public bool IsInTransit
- {
- get { return m_inTransit; }
- set { m_inTransit = value; }
- }
-
- public float SpeedModifier
- {
- get { return m_speedModifier; }
- set { m_speedModifier = value; }
- }
-
- public bool ForceFly
- {
- get { return m_forceFly; }
- set { m_forceFly = value; }
- }
-
- public bool FlyDisabled
- {
- get { return m_flyDisabled; }
- set { m_flyDisabled = value; }
- }
-
- public string Viewer
- {
- get { return m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode).Viewer; }
- }
-
- #endregion
-
- #region Constructor(s)
-
- public ScenePresence()
- {
- m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
- CreateSceneViewer();
- m_animator = new ScenePresenceAnimator(this);
- }
-
- private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo) : this()
- {
- m_rootRegionHandle = reginfo.RegionHandle;
- m_controllingClient = client;
- m_firstname = m_controllingClient.FirstName;
- m_lastname = m_controllingClient.LastName;
- m_name = String.Format("{0} {1}", m_firstname, m_lastname);
- m_scene = world;
- m_uuid = client.AgentId;
- m_regionInfo = reginfo;
- m_localId = m_scene.AllocateLocalId();
-
- UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_uuid);
-
- if (account != null)
- m_userLevel = account.UserLevel;
-
- IGroupsModule gm = m_scene.RequestModuleInterface();
- if (gm != null)
- m_grouptitle = gm.GetGroupTitle(m_uuid);
-
- m_scriptEngines = m_scene.RequestModuleInterfaces();
-
- AbsolutePosition = posLastSignificantMove = m_CameraCenter =
- m_lastCameraCenter = m_controllingClient.StartPos;
-
- m_reprioritization_timer = new Timer(world.ReprioritizationInterval);
- m_reprioritization_timer.Elapsed += new ElapsedEventHandler(Reprioritize);
- m_reprioritization_timer.AutoReset = false;
-
- AdjustKnownSeeds();
- Animator.TrySetMovementAnimation("STAND");
- // we created a new ScenePresence (a new child agent) in a fresh region.
- // Request info about all the (root) agents in this region
- // Note: This won't send data *to* other clients in that region (children don't send)
- SendInitialFullUpdateToAllClients();
- RegisterToEvents();
- if (m_controllingClient != null)
- {
- m_controllingClient.ProcessPendingPackets();
- }
- SetDirectionVectors();
- }
-
- public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
- AvatarWearable[] wearables)
- : this(client, world, reginfo)
- {
- m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
- }
-
- public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
- : this(client, world, reginfo)
- {
- m_appearance = appearance;
- }
-
- private void CreateSceneViewer()
- {
- m_sceneViewer = new SceneViewer(this);
- }
-
- public void RegisterToEvents()
- {
- m_controllingClient.OnRequestWearables += SendWearables;
- m_controllingClient.OnSetAppearance += SetAppearance;
- m_controllingClient.OnCompleteMovementToRegion += CompleteMovement;
- //m_controllingClient.OnCompleteMovementToRegion += SendInitialData;
- m_controllingClient.OnAgentUpdate += HandleAgentUpdate;
- m_controllingClient.OnAgentRequestSit += HandleAgentRequestSit;
- m_controllingClient.OnAgentSit += HandleAgentSit;
- m_controllingClient.OnSetAlwaysRun += HandleSetAlwaysRun;
- m_controllingClient.OnStartAnim += HandleStartAnim;
- m_controllingClient.OnStopAnim += HandleStopAnim;
- m_controllingClient.OnForceReleaseControls += HandleForceReleaseControls;
- m_controllingClient.OnAutoPilotGo += DoAutoPilot;
- m_controllingClient.AddGenericPacketHandler("autopilot", DoMoveToPosition);
-
- // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange);
- // ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement);
- }
-
- private void SetDirectionVectors()
- {
- Dir_Vectors[0] = Vector3.UnitX; //FORWARD
- Dir_Vectors[1] = -Vector3.UnitX; //BACK
- Dir_Vectors[2] = Vector3.UnitY; //LEFT
- Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
- Dir_Vectors[4] = Vector3.UnitZ; //UP
- Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
- Dir_Vectors[6] = new Vector3(0.5f, 0f, 0f); //FORWARD_NUDGE
- Dir_Vectors[7] = new Vector3(-0.5f, 0f, 0f); //BACK_NUDGE
- Dir_Vectors[8] = new Vector3(0f, 0.5f, 0f); //LEFT_NUDGE
- Dir_Vectors[9] = new Vector3(0f, -0.5f, 0f); //RIGHT_NUDGE
- Dir_Vectors[10] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
- }
-
- private Vector3[] GetWalkDirectionVectors()
- {
- Vector3[] vector = new Vector3[11];
- vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
- vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
- vector[2] = Vector3.UnitY; //LEFT
- vector[3] = -Vector3.UnitY; //RIGHT
- vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
- vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
- vector[6] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD_NUDGE
- vector[7] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK_NUDGE
- vector[8] = Vector3.UnitY; //LEFT_NUDGE
- vector[9] = -Vector3.UnitY; //RIGHT_NUDGE
- vector[10] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_NUDGE
- return vector;
- }
-
- private bool[] GetDirectionIsNudge()
- {
- bool[] isNudge = new bool[11];
- isNudge[0] = false; //FORWARD
- isNudge[1] = false; //BACK
- isNudge[2] = false; //LEFT
- isNudge[3] = false; //RIGHT
- isNudge[4] = false; //UP
- isNudge[5] = false; //DOWN
- isNudge[6] = true; //FORWARD_NUDGE
- isNudge[7] = true; //BACK_NUDGE
- isNudge[8] = true; //LEFT_NUDGE
- isNudge[9] = true; //RIGHT_NUDGE
- isNudge[10] = true; //DOWN_Nudge
- return isNudge;
- }
-
-
- #endregion
-
- public uint GenerateClientFlags(UUID ObjectID)
- {
- return m_scene.Permissions.GenerateClientFlags(m_uuid, ObjectID);
- }
-
- ///
- /// Send updates to the client about prims which have been placed on the update queue. We don't
- /// necessarily send updates for all the parts on the queue, e.g. if an updates with a more recent
- /// timestamp has already been sent.
- ///
- public void SendPrimUpdates()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- m_sceneViewer.SendPrimUpdates();
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- #region Status Methods
-
- ///
- /// This turns a child agent, into a root agent
- /// This is called when an agent teleports into a region, or if an
- /// agent crosses into this region from a neighbor over the border
- ///
- public void MakeRootAgent(Vector3 pos, bool isFlying)
- {
- m_log.DebugFormat(
- "[SCENE]: Upgrading child to root agent for {0} in {1}",
- Name, m_scene.RegionInfo.RegionName);
-
- //m_log.DebugFormat("[SCENE]: known regions in {0}: {1}", Scene.RegionInfo.RegionName, KnownChildRegionHandles.Count);
-
- IGroupsModule gm = m_scene.RequestModuleInterface();
- if (gm != null)
- m_grouptitle = gm.GetGroupTitle(m_uuid);
-
- m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
- m_scene.SetRootAgentScene(m_uuid);
-
- // Moved this from SendInitialData to ensure that m_appearance is initialized
- // before the inventory is processed in MakeRootAgent. This fixes a race condition
- // related to the handling of attachments
- //m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
- if (m_scene.TestBorderCross(pos, Cardinals.E))
- {
- Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.E);
- pos.X = crossedBorder.BorderLine.Z - 1;
- }
-
- if (m_scene.TestBorderCross(pos, Cardinals.N))
- {
- Border crossedBorder = m_scene.GetCrossedBorder(pos, Cardinals.N);
- pos.Y = crossedBorder.BorderLine.Z - 1;
- }
-
- //If they're TP'ing in or logging in, we haven't had time to add any known child regions yet.
- //This has the unfortunate consequence that if somebody is TP'ing who is already a child agent,
- //they'll bypass the landing point. But I can't think of any decent way of fixing this.
- if (KnownChildRegionHandles.Count == 0)
- {
- ILandObject land = m_scene.LandChannel.GetLandObject(pos.X, pos.Y);
- if (land != null)
- {
- //Don't restrict gods, estate managers, or land owners to the TP point. This behaviour mimics agni.
- if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero && UserLevel < 200 && !m_scene.RegionInfo.EstateSettings.IsEstateManager(m_uuid) && land.LandData.OwnerID != m_uuid)
- {
- pos = land.LandData.UserLocation;
- }
- }
- }
-
- if (pos.X < 0 || pos.Y < 0 || pos.Z < 0)
- {
- Vector3 emergencyPos = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128);
-
- if (pos.X < 0)
- {
- emergencyPos.X = (int)Constants.RegionSize + pos.X;
- if (!(pos.Y < 0))
- emergencyPos.Y = pos.Y;
- if (!(pos.Z < 0))
- emergencyPos.Z = pos.Z;
- }
- if (pos.Y < 0)
- {
- emergencyPos.Y = (int)Constants.RegionSize + pos.Y;
- if (!(pos.X < 0))
- emergencyPos.X = pos.X;
- if (!(pos.Z < 0))
- emergencyPos.Z = pos.Z;
- }
- if (pos.Z < 0)
- {
- emergencyPos.Z = 128;
- if (!(pos.Y < 0))
- emergencyPos.Y = pos.Y;
- if (!(pos.X < 0))
- emergencyPos.X = pos.X;
- }
- }
-
- if (pos.X < 0f || pos.Y < 0f || pos.Z < 0f)
- {
- m_log.WarnFormat(
- "[SCENE PRESENCE]: MakeRootAgent() was given an illegal position of {0} for avatar {1}, {2}. Clamping",
- pos, Name, UUID);
-
- if (pos.X < 0f) pos.X = 0f;
- if (pos.Y < 0f) pos.Y = 0f;
- if (pos.Z < 0f) pos.Z = 0f;
- }
-
- float localAVHeight = 1.56f;
- if (m_avHeight != 127.0f)
- {
- localAVHeight = m_avHeight;
- }
-
- float posZLimit = 0;
-
- if (pos.X < Constants.RegionSize && pos.Y < Constants.RegionSize)
- posZLimit = (float)m_scene.Heightmap[(int)pos.X, (int)pos.Y];
-
- float newPosZ = posZLimit + localAVHeight / 2;
- if (posZLimit >= (pos.Z - (localAVHeight / 2)) && !(Single.IsInfinity(newPosZ) || Single.IsNaN(newPosZ)))
- {
- pos.Z = newPosZ;
- }
- AbsolutePosition = pos;
-
- AddToPhysicalScene(isFlying);
-
- if (m_forceFly)
- {
- m_physicsActor.Flying = true;
- }
- else if (m_flyDisabled)
- {
- m_physicsActor.Flying = false;
- }
-
- if (m_appearance != null)
- {
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
- }
- else
- {
- m_log.ErrorFormat("[SCENE PRESENCE]: null appearance in MakeRoot in {0}", Scene.RegionInfo.RegionName);
- // emergency; this really shouldn't happen
- m_appearance = new AvatarAppearance(UUID);
- }
-
- // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying
- // avatar to return to the standing position in mid-air. On login it looks like this is being sent
- // elsewhere anyway
- // Animator.SendAnimPack();
-
- m_scene.SwapRootAgentCount(false);
-
- //CachedUserInfo userInfo = m_scene.CommsManager.UserProfileCacheService.GetUserDetails(m_uuid);
- //if (userInfo != null)
- // userInfo.FetchInventory();
- //else
- // m_log.ErrorFormat("[SCENE]: Could not find user info for {0} when making it a root agent", m_uuid);
-
- // On the next prim update, all objects will be sent
- //
- m_sceneViewer.Reset();
-
- m_isChildAgent = false;
-
- // send the animations of the other presences to me
- m_scene.ForEachScenePresence(delegate(ScenePresence presence)
- {
- if (presence != this)
- presence.Animator.SendAnimPackToClient(ControllingClient);
- });
-
- m_scene.EventManager.TriggerOnMakeRootAgent(this);
- }
-
- ///
- /// This turns a root agent into a child agent
- /// when an agent departs this region for a neighbor, this gets called.
- ///
- /// It doesn't get called for a teleport. Reason being, an agent that
- /// teleports out may not end up anywhere near this region
- ///
- public void MakeChildAgent()
- {
- // It looks like m_animator is set to null somewhere, and MakeChild
- // is called after that. Probably in aborted teleports.
- if (m_animator == null)
- m_animator = new ScenePresenceAnimator(this);
- else
- Animator.ResetAnimations();
-
-// m_log.DebugFormat(
-// "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
-// Name, UUID, m_scene.RegionInfo.RegionName);
-
- // Don't zero out the velocity since this can cause problems when an avatar is making a region crossing,
- // depending on the exact timing. This shouldn't matter anyway since child agent positions are not updated.
- //Velocity = new Vector3(0, 0, 0);
-
- m_isChildAgent = true;
- m_scene.SwapRootAgentCount(true);
- RemoveFromPhysicalScene();
-
- // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
-
- m_scene.EventManager.TriggerOnMakeChildAgent(this);
- }
-
- ///
- /// Removes physics plugin scene representation of this agent if it exists.
- ///
- private void RemoveFromPhysicalScene()
- {
- if (PhysicsActor != null)
- {
- m_physicsActor.OnRequestTerseUpdate -= SendTerseUpdateToAllClients;
- m_physicsActor.OnOutOfBounds -= OutOfBoundsCall;
- m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
- m_physicsActor.UnSubscribeEvents();
- m_physicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
- PhysicsActor = null;
- }
- }
-
- ///
- ///
- ///
- ///
- public void Teleport(Vector3 pos)
- {
- bool isFlying = false;
-
- if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
-
- RemoveFromPhysicalScene();
- Velocity = Vector3.Zero;
- AbsolutePosition = pos;
- AddToPhysicalScene(isFlying);
- if (m_appearance != null)
- {
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
- }
-
- SendTerseUpdateToAllClients();
-
- }
-
- public void TeleportWithMomentum(Vector3 pos)
- {
- bool isFlying = false;
- if (m_physicsActor != null)
- isFlying = m_physicsActor.Flying;
-
- RemoveFromPhysicalScene();
- AbsolutePosition = pos;
- AddToPhysicalScene(isFlying);
- if (m_appearance != null)
- {
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
- }
-
- SendTerseUpdateToAllClients();
- }
-
- ///
- ///
- ///
- public void StopMovement()
- {
- }
-
- public void StopFlying()
- {
- ControllingClient.StopFlying(this);
- }
-
- public void AddNeighbourRegion(ulong regionHandle, string cap)
- {
- lock (m_knownChildRegions)
- {
- if (!m_knownChildRegions.ContainsKey(regionHandle))
- {
- uint x, y;
- Utils.LongToUInts(regionHandle, out x, out y);
- m_knownChildRegions.Add(regionHandle, cap);
- }
- }
- }
-
- public void RemoveNeighbourRegion(ulong regionHandle)
- {
- lock (m_knownChildRegions)
- {
- if (m_knownChildRegions.ContainsKey(regionHandle))
- {
- m_knownChildRegions.Remove(regionHandle);
- //m_log.Debug(" !!! removing known region {0} in {1}. Count = {2}", regionHandle, Scene.RegionInfo.RegionName, m_knownChildRegions.Count);
- }
- }
- }
-
- public void DropOldNeighbours(List oldRegions)
- {
- foreach (ulong handle in oldRegions)
- {
- RemoveNeighbourRegion(handle);
- Scene.CapsModule.DropChildSeed(UUID, handle);
- }
- }
-
- public List GetKnownRegionList()
- {
- return new List(m_knownChildRegions.Keys);
- }
-
- #endregion
-
- #region Event Handlers
-
- ///
- /// Sets avatar height in the phyiscs plugin
- ///
- internal void SetHeight(float height)
- {
- m_avHeight = height;
- if (PhysicsActor != null && !IsChildAgent)
- {
- Vector3 SetSize = new Vector3(0.45f, 0.6f, m_avHeight);
- PhysicsActor.Size = SetSize;
- }
- }
-
- ///
- /// Complete Avatar's movement into the region.
- /// This is called upon a very important packet sent from the client,
- /// so it's client-controlled. Never call this method directly.
- ///
- public void CompleteMovement(IClientAPI client)
- {
- //m_log.Debug("[SCENE PRESENCE]: CompleteMovement");
-
- Vector3 look = Velocity;
- if ((look.X == 0) && (look.Y == 0) && (look.Z == 0))
- {
- look = new Vector3(0.99f, 0.042f, 0);
- }
-
- // Prevent teleporting to an underground location
- // (may crash client otherwise)
- //
- Vector3 pos = AbsolutePosition;
- float ground = m_scene.GetGroundHeight(pos.X, pos.Y);
- if (pos.Z < ground + 1.5f)
- {
- pos.Z = ground + 1.5f;
- AbsolutePosition = pos;
- }
- m_isChildAgent = false;
- bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
- MakeRootAgent(AbsolutePosition, m_flying);
-
- if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
- {
- m_log.DebugFormat("[SCENE PRESENCE]: Releasing agent in URI {0}", m_callbackURI);
- Scene.SimulationService.ReleaseAgent(m_originRegionID, UUID, m_callbackURI);
- m_callbackURI = null;
- }
-
- //m_log.DebugFormat("Completed movement");
-
- m_controllingClient.MoveAgentIntoRegion(m_regionInfo, AbsolutePosition, look);
- SendInitialData();
-
- // Create child agents in neighbouring regions
- if (!m_isChildAgent)
- {
- IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
- if (m_agentTransfer != null)
- m_agentTransfer.EnableChildAgents(this);
- else
- m_log.DebugFormat("[SCENE PRESENCE]: Unable to create child agents in neighbours, because AgentTransferModule is not active");
-
- IFriendsModule friendsModule = m_scene.RequestModuleInterface();
- if (friendsModule != null)
- friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
- }
-
- }
-
- ///
- /// Callback for the Camera view block check. Gets called with the results of the camera view block test
- /// hitYN is true when there's something in the way.
- ///
- ///
- ///
- ///
- ///
- public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
- {
- const float POSITION_TOLERANCE = 0.02f;
- const float VELOCITY_TOLERANCE = 0.02f;
- const float ROTATION_TOLERANCE = 0.02f;
-
- if (m_followCamAuto)
- {
- if (hitYN)
- {
- CameraConstraintActive = true;
- //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance);
-
- Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
- ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
- }
- else
- {
- if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
- !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
- !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
- {
- if (CameraConstraintActive)
- {
- ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f));
- CameraConstraintActive = false;
- }
- }
- }
- }
- }
-
- ///
- /// This is the event handler for client movement. If a client is moving, this event is triggering.
- ///
- public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
- {
- //if (m_isChildAgent)
- //{
- // // m_log.Debug("DEBUG: HandleAgentUpdate: child agent");
- // return;
- //}
-
- m_perfMonMS = Util.EnvironmentTickCount();
-
- ++m_movementUpdateCount;
- if (m_movementUpdateCount < 1)
- m_movementUpdateCount = 1;
-
- #region Sanity Checking
-
- // This is irritating. Really.
- if (!AbsolutePosition.IsFinite())
- {
- RemoveFromPhysicalScene();
- m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
-
- m_pos = m_LastFinitePos;
-
- if (!m_pos.IsFinite())
- {
- m_pos.X = 127f;
- m_pos.Y = 127f;
- m_pos.Z = 127f;
- m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
- }
-
- AddToPhysicalScene(false);
- }
- else
- {
- m_LastFinitePos = m_pos;
- }
-
- #endregion Sanity Checking
-
- #region Inputs
-
- AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
- Quaternion bodyRotation = agentData.BodyRotation;
-
- // Camera location in world. We'll need to raytrace
- // from this location from time to time.
- m_CameraCenter = agentData.CameraCenter;
- if (Vector3.Distance(m_lastCameraCenter, m_CameraCenter) >= Scene.RootReprioritizationDistance)
- {
- ReprioritizeUpdates();
- m_lastCameraCenter = m_CameraCenter;
- }
-
- // Use these three vectors to figure out what the agent is looking at
- // Convert it to a Matrix and/or Quaternion
- m_CameraAtAxis = agentData.CameraAtAxis;
- m_CameraLeftAxis = agentData.CameraLeftAxis;
- m_CameraUpAxis = agentData.CameraUpAxis;
-
- // The Agent's Draw distance setting
- m_DrawDistance = agentData.Far;
-
- // Check if Client has camera in 'follow cam' or 'build' mode.
- Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
-
- m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
- && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
-
- m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
- m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
-
- #endregion Inputs
-
- if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
- {
- StandUp();
- }
-
- //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
- // Raycast from the avatar's head to the camera to see if there's anything blocking the view
- if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
- {
- if (m_followCamAuto)
- {
- Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
- m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
- }
- }
- lock (scriptedcontrols)
- {
- if (scriptedcontrols.Count > 0)
- {
- SendControlToScripts((uint)flags);
- flags = RemoveIgnoredControls(flags, IgnoredControls);
- }
- }
-
- if (m_autopilotMoving)
- CheckAtSitTarget();
-
- if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
- {
- m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
- Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
-
- // TODO: This doesn't prevent the user from walking yet.
- // Setting parent ID would fix this, if we knew what value
- // to use. Or we could add a m_isSitting variable.
- //Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
- SitGround = true;
- }
-
- // In the future, these values might need to go global.
- // Here's where you get them.
- m_AgentControlFlags = flags;
- m_headrotation = agentData.HeadRotation;
- m_state = agentData.State;
-
- PhysicsActor actor = PhysicsActor;
- if (actor == null)
- {
- return;
- }
-
- bool update_movementflag = false;
-
- if (m_allowMovement && !SitGround)
- {
- if (agentData.UseClientAgentPosition)
- {
- m_moveToPositionInProgress = (agentData.ClientAgentPosition - AbsolutePosition).Length() > 0.2f;
- m_moveToPositionTarget = agentData.ClientAgentPosition;
- }
-
- int i = 0;
-
- bool update_rotation = false;
- bool DCFlagKeyPressed = false;
- Vector3 agent_control_v3 = Vector3.Zero;
- Quaternion q = bodyRotation;
-
- bool oldflying = PhysicsActor.Flying;
-
- if (m_forceFly)
- actor.Flying = true;
- else if (m_flyDisabled)
- actor.Flying = false;
- else
- actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
-
- if (actor.Flying != oldflying)
- update_movementflag = true;
-
- if (q != m_bodyRot)
- {
- m_bodyRot = q;
- update_rotation = true;
- }
-
- //guilty until proven innocent..
- bool Nudging = true;
- //Basically, if there is at least one non-nudge control then we don't need
- //to worry about stopping the avatar
-
- if (m_parentID == 0)
- {
- bool bAllowUpdateMoveToPosition = false;
- bool bResetMoveToPosition = false;
-
- Vector3[] dirVectors;
-
- // use camera up angle when in mouselook and not flying or when holding the left mouse button down and not flying
- // this prevents 'jumping' in inappropriate situations.
- if ((m_mouseLook && !m_physicsActor.Flying) || (m_leftButtonDown && !m_physicsActor.Flying))
- dirVectors = GetWalkDirectionVectors();
- else
- dirVectors = Dir_Vectors;
-
- bool[] isNudge = GetDirectionIsNudge();
-
-
-
-
-
- foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
- {
- if (((uint)flags & (uint)DCF) != 0)
- {
- bResetMoveToPosition = true;
- DCFlagKeyPressed = true;
- try
- {
- agent_control_v3 += dirVectors[i];
- if (isNudge[i] == false)
- {
- Nudging = false;
- }
- }
- catch (IndexOutOfRangeException)
- {
- // Why did I get this?
- }
-
- if ((m_movementflag & (uint)DCF) == 0)
- {
- m_movementflag += (byte)(uint)DCF;
- update_movementflag = true;
- }
- }
- else
- {
- if ((m_movementflag & (uint)DCF) != 0)
- {
- m_movementflag -= (byte)(uint)DCF;
- update_movementflag = true;
- }
- else
- {
- bAllowUpdateMoveToPosition = true;
- }
- }
- i++;
- }
- //Paupaw:Do Proper PID for Autopilot here
- if (bResetMoveToPosition)
- {
- m_moveToPositionTarget = Vector3.Zero;
- m_moveToPositionInProgress = false;
- update_movementflag = true;
- bAllowUpdateMoveToPosition = false;
- }
-
- if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
- {
- //Check the error term of the current position in relation to the target position
- if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f)
- {
- // we are close enough to the target
- m_moveToPositionTarget = Vector3.Zero;
- m_moveToPositionInProgress = false;
- update_movementflag = true;
- }
- else
- {
- try
- {
- // move avatar in 2D at one meter/second towards target, in avatar coordinate frame.
- // This movement vector gets added to the velocity through AddNewMovement().
- // Theoretically we might need a more complex PID approach here if other
- // unknown forces are acting on the avatar and we need to adaptively respond
- // to such forces, but the following simple approach seems to works fine.
- Vector3 LocalVectorToTarget3D =
- (m_moveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
- * Matrix4.CreateFromQuaternion(Quaternion.Inverse(bodyRotation)); // change to avatar coords
- // Ignore z component of vector
- Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
- LocalVectorToTarget2D.Normalize();
-
- //We're not nudging
- Nudging = false;
- agent_control_v3 += LocalVectorToTarget2D;
-
- // update avatar movement flags. the avatar coordinate system is as follows:
- //
- // +X (forward)
- //
- // ^
- // |
- // |
- // |
- // |
- // (left) +Y <--------o--------> -Y
- // avatar
- // |
- // |
- // |
- // |
- // v
- // -X
- //
-
- // based on the above avatar coordinate system, classify the movement into
- // one of left/right/back/forward.
- if (LocalVectorToTarget2D.Y > 0)//MoveLeft
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
- //AgentControlFlags
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
- update_movementflag = true;
- }
- else if (LocalVectorToTarget2D.Y < 0) //MoveRight
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
- update_movementflag = true;
- }
- if (LocalVectorToTarget2D.X < 0) //MoveBack
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
- update_movementflag = true;
- }
- else if (LocalVectorToTarget2D.X > 0) //Move Forward
- {
- m_movementflag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
- AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
- update_movementflag = true;
- }
- }
- catch (Exception e)
- {
- //Avoid system crash, can be slower but...
- m_log.DebugFormat("Crash! {0}", e.ToString());
- }
- }
- }
- }
-
- // Cause the avatar to stop flying if it's colliding
- // with something with the down arrow pressed.
-
- // Only do this if we're flying
- if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
- {
- // Landing detection code
-
- // Are the landing controls requirements filled?
- bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
- ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
-
- // Are the collision requirements fulfilled?
- bool colliding = (m_physicsActor.IsColliding == true);
-
- if (m_physicsActor.Flying && colliding && controlland)
- {
- // nesting this check because LengthSquared() is expensive and we don't
- // want to do it every step when flying.
- if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX))
- StopFlying();
- }
- }
-
- if (update_movementflag || (update_rotation && DCFlagKeyPressed))
- {
- // m_log.DebugFormat("{0} {1}", update_movementflag, (update_rotation && DCFlagKeyPressed));
- // m_log.DebugFormat(
- // "In {0} adding velocity to {1} of {2}", m_scene.RegionInfo.RegionName, Name, agent_control_v3);
-
- AddNewMovement(agent_control_v3, q, Nudging);
-
-
- }
- }
-
- if (update_movementflag && !SitGround)
- Animator.UpdateMovementAnimations();
-
- m_scene.EventManager.TriggerOnClientMovement(this);
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- public void DoAutoPilot(uint not_used, Vector3 Pos, IClientAPI remote_client)
- {
- m_autopilotMoving = true;
- m_autoPilotTarget = Pos;
- m_sitAtAutoTarget = false;
- PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
- //proxy.PCode = (byte)PCode.ParticleSystem;
- proxyObjectGroup = new SceneObjectGroup(UUID, Pos, Rotation, proxy);
- proxyObjectGroup.AttachToScene(m_scene);
-
- // Commented out this code since it could never have executed, but might still be informative.
-// if (proxyObjectGroup != null)
-// {
- proxyObjectGroup.SendGroupFullUpdate();
- remote_client.SendSitResponse(proxyObjectGroup.UUID, Vector3.Zero, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
- m_scene.DeleteSceneObject(proxyObjectGroup, false);
-// }
-// else
-// {
-// m_autopilotMoving = false;
-// m_autoPilotTarget = Vector3.Zero;
-// ControllingClient.SendAlertMessage("Autopilot cancelled");
-// }
- }
-
- public void DoMoveToPosition(Object sender, string method, List args)
- {
- try
- {
- float locx = 0f;
- float locy = 0f;
- float locz = 0f;
- uint regionX = 0;
- uint regionY = 0;
- try
- {
- Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
- locx = Convert.ToSingle(args[0]) - (float)regionX;
- locy = Convert.ToSingle(args[1]) - (float)regionY;
- locz = Convert.ToSingle(args[2]);
- }
- catch (InvalidCastException)
- {
- m_log.Error("[CLIENT]: Invalid autopilot request");
- return;
- }
- m_moveToPositionInProgress = true;
- m_moveToPositionTarget = new Vector3(locx, locy, locz);
- }
- catch (Exception ex)
- {
- //Why did I get this error?
- m_log.Error("[SCENEPRESENCE]: DoMoveToPosition" + ex);
- }
- }
-
- private void CheckAtSitTarget()
- {
- //m_log.Debug("[AUTOPILOT]: " + Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget).ToString());
- if (Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget) <= 1.5)
- {
- if (m_sitAtAutoTarget)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetUUID);
- if (part != null)
- {
- AbsolutePosition = part.AbsolutePosition;
- Velocity = Vector3.Zero;
- SendFullUpdateToAllClients();
-
- HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); //KF ??
- }
- //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false);
- m_requestedSitTargetUUID = UUID.Zero;
- }
- /*
- else
- {
- //ControllingClient.SendAlertMessage("Autopilot cancelled");
- //SendTerseUpdateToAllClients();
- //PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
- //proxy.PCode = (byte)PCode.ParticleSystem;
- ////uint nextUUID = m_scene.NextLocalId;
-
- //proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, m_autoPilotTarget, Quaternion.Identity, proxy);
- //if (proxyObjectGroup != null)
- //{
- //proxyObjectGroup.SendGroupFullUpdate();
- //ControllingClient.SendSitResponse(UUID.Zero, m_autoPilotTarget, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
- //m_scene.DeleteSceneObject(proxyObjectGroup);
- //}
- }
- */
- m_autoPilotTarget = Vector3.Zero;
- m_autopilotMoving = false;
- }
- }
- ///
- /// Perform the logic necessary to stand the avatar up. This method also executes
- /// the stand animation.
- ///
- public void StandUp()
- {
- SitGround = false;
-
- if (m_parentID != 0)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
- if (part != null)
- {
- part.TaskInventory.LockItemsForRead(true);
- TaskInventoryDictionary taskIDict = part.TaskInventory;
- if (taskIDict != null)
- {
- foreach (UUID taskID in taskIDict.Keys)
- {
- UnRegisterControlEventsToScript(LocalId, taskID);
- taskIDict[taskID].PermsMask &= ~(
- 2048 | //PERMISSION_CONTROL_CAMERA
- 4); // PERMISSION_TAKE_CONTROLS
- }
- }
- part.TaskInventory.LockItemsForRead(false);
- // Reset sit target.
- if (part.GetAvatarOnSitTarget() == UUID)
- part.SetAvatarOnSitTarget(UUID.Zero);
- m_parentPosition = part.GetWorldPosition();
- ControllingClient.SendClearFollowCamProperties(part.ParentUUID);
- }
- // part.GetWorldRotation() is the rotation of the object being sat on
- // Rotation is the sittiing Av's rotation
-
- Quaternion partRot;
-// if (part.LinkNum == 1)
-// { // Root prim of linkset
-// partRot = part.ParentGroup.RootPart.RotationOffset;
-// }
-// else
-// { // single or child prim
-
-// }
- if (part == null) //CW: Part may be gone. llDie() for example.
- {
- partRot = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- }
- else
- {
- partRot = part.GetWorldRotation();
- }
-
- Quaternion partIRot = Quaternion.Inverse(partRot);
-
- Quaternion avatarRot = Quaternion.Inverse(Quaternion.Inverse(Rotation) * partIRot); // world or. of the av
- Vector3 avStandUp = new Vector3(1.0f, 0f, 0f) * avatarRot; // 1M infront of av
-
-
- if (m_physicsActor == null)
- {
- AddToPhysicalScene(false);
- }
- //CW: If the part isn't null then we can set the current position
- if (part != null)
- {
- Vector3 avWorldStandUp = avStandUp + part.GetWorldPosition() + ((m_pos - part.OffsetPosition) * partRot); // + av sit offset!
- AbsolutePosition = avWorldStandUp; //KF: Fix stand up.
- part.IsOccupied = false;
- part.ParentGroup.DeleteAvatar(ControllingClient.AgentId);
- }
- else
- {
- //CW: Since the part doesn't exist, a coarse standup position isn't an issue
- AbsolutePosition = m_lastWorldPosition;
- }
-
- m_parentPosition = Vector3.Zero;
- m_parentID = 0;
- m_linkedPrim = UUID.Zero;
- m_offsetRotation = new Quaternion(0.0f, 0.0f, 0.0f, 1.0f);
- SendFullUpdateToAllClients();
- m_requestedSitTargetID = 0;
-
- if ((m_physicsActor != null) && (m_avHeight > 0))
- {
- SetHeight(m_avHeight);
- }
- }
- Animator.TrySetMovementAnimation("STAND");
- }
-
- private SceneObjectPart FindNextAvailableSitTarget(UUID targetID)
- {
- SceneObjectPart targetPart = m_scene.GetSceneObjectPart(targetID);
- if (targetPart == null)
- return null;
-
- // If the primitive the player clicked on has a sit target and that sit target is not full, that sit target is used.
- // If the primitive the player clicked on has no sit target, and one or more other linked objects have sit targets that are not full, the sit target of the object with the lowest link number will be used.
-
- // Get our own copy of the part array, and sort into the order we want to test
- SceneObjectPart[] partArray = targetPart.ParentGroup.GetParts();
- Array.Sort(partArray, delegate(SceneObjectPart p1, SceneObjectPart p2)
- {
- // we want the originally selected part first, then the rest in link order -- so make the selected part link num (-1)
- int linkNum1 = p1==targetPart ? -1 : p1.LinkNum;
- int linkNum2 = p2==targetPart ? -1 : p2.LinkNum;
- return linkNum1 - linkNum2;
- }
- );
-
- //look for prims with explicit sit targets that are available
- foreach (SceneObjectPart part in partArray)
- {
- // Is a sit target available?
- Vector3 avSitOffSet = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
- UUID avOnTargetAlready = part.GetAvatarOnSitTarget();
- bool SitTargetOccupied = (avOnTargetAlready != UUID.Zero);
- bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
- if (SitTargetisSet && !SitTargetOccupied)
- {
- //switch the target to this prim
- return part;
- }
- }
-
- // no explicit sit target found - use original target
- return targetPart;
- }
-
- private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset, Quaternion pSitOrientation)
- {
- bool autopilot = true;
- Vector3 autopilotTarget = new Vector3();
- Quaternion sitOrientation = Quaternion.Identity;
- Vector3 pos = new Vector3();
- Vector3 cameraEyeOffset = Vector3.Zero;
- Vector3 cameraAtOffset = Vector3.Zero;
- bool forceMouselook = false;
-
- //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
- if (part == null) return;
-
- // 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
-
- // part is the prim to sit on
- // offset is the world-ref vector distance from that prim center to the click-spot
- // UUID is the UUID of the Avatar doing the clicking
-
- m_avInitialPos = AbsolutePosition; // saved to calculate unscripted sit rotation
-
- // Is a sit target available?
- Vector3 avSitOffSet = part.SitTargetPosition;
- Quaternion avSitOrientation = part.SitTargetOrientation;
-
- bool SitTargetisSet = (Vector3.Zero != avSitOffSet); //NB Latest SL Spec shows Sit Rotation setting is ignored.
- // Quaternion partIRot = Quaternion.Inverse(part.GetWorldRotation());
- Quaternion partRot;
-// if (part.LinkNum == 1)
-// { // Root prim of linkset
-// partRot = part.ParentGroup.RootPart.RotationOffset;
-// }
-// else
-// { // single or child prim
- partRot = part.GetWorldRotation();
-// }
- Quaternion partIRot = Quaternion.Inverse(partRot);
-//Console.WriteLine("SendSitResponse offset=" + offset + " Occup=" + part.IsOccupied + " TargSet=" + SitTargetisSet);
- // Sit analysis rewritten by KF 091125
- if (SitTargetisSet) // scipted sit
- {
- if (!part.IsOccupied)
- {
-//Console.WriteLine("Scripted, unoccupied");
- part.SetAvatarOnSitTarget(UUID); // set that Av will be on it
- offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); // change ofset to the scripted one
-
- Quaternion nrot = avSitOrientation;
- if (!part.IsRoot)
- {
- nrot = part.RotationOffset * avSitOrientation;
- }
- sitOrientation = nrot; // Change rotatione to the scripted one
- OffsetRotation = nrot;
- autopilot = false; // Jump direct to scripted llSitPos()
- }
- else
- {
-//Console.WriteLine("Scripted, occupied");
- return;
- }
- }
- else // Not Scripted
- {
- if ( (Math.Abs(offset.X) > 0.5f) || (Math.Abs(offset.Y) > 0.5f) )
- {
- // large prim & offset, ignore if other Avs sitting
-// offset.Z -= 0.05f;
- m_avUnscriptedSitPos = offset * partIRot; // (non-zero) sit where clicked
- autopilotTarget = part.AbsolutePosition + offset; // World location of clicked point
-
-//Console.WriteLine(" offset ={0}", offset);
-//Console.WriteLine(" UnscriptedSitPos={0}", m_avUnscriptedSitPos);
-//Console.WriteLine(" autopilotTarget={0}", autopilotTarget);
-
- }
- else // small offset
- {
-//Console.WriteLine("Small offset");
- if (!part.IsOccupied)
- {
- m_avUnscriptedSitPos = Vector3.Zero; // Zero = Sit on prim center
- autopilotTarget = part.AbsolutePosition;
-//Console.WriteLine("UsSmall autopilotTarget={0}", autopilotTarget);
- }
- else return; // occupied small
- } // end large/small
- } // end Scripted/not
- cameraAtOffset = part.GetCameraAtOffset();
- cameraEyeOffset = part.GetCameraEyeOffset();
- forceMouselook = part.GetForceMouselook();
- if(cameraAtOffset == Vector3.Zero) cameraAtOffset = new Vector3(0f, 0f, 0.1f); //
- if(cameraEyeOffset == Vector3.Zero) cameraEyeOffset = new Vector3(0f, 0f, 0.1f); //
-
- if (m_physicsActor != null)
- {
- // 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.
- m_sitAvatarHeight = m_physicsActor.Size.Z;
- if (autopilot)
- { // its not a scripted sit
-// if (Util.GetDistanceTo(AbsolutePosition, autopilotTarget) < 4.5)
- if( (Math.Abs(AbsolutePosition.X - autopilotTarget.X) < 256.0f) && (Math.Abs(AbsolutePosition.Y - autopilotTarget.Y) < 256.0f) )
- {
- autopilot = false; // close enough
- m_lastWorldPosition = m_pos; /* CW - This give us a position to return the avatar to if the part is killed before standup.
- Not using the part's position because returning the AV to the last known standing
- position is likely to be more friendly, isn't it? */
- RemoveFromPhysicalScene();
- Velocity = Vector3.Zero;
- AbsolutePosition = autopilotTarget + new Vector3(0.0f, 0.0f, (m_sitAvatarHeight / 2.0f)); // Warp av to over sit target
- } // else the autopilot will get us close
- }
- else
- { // its a scripted sit
- m_lastWorldPosition = part.AbsolutePosition; /* CW - This give us a position to return the avatar to if the part is killed before standup.
- I *am* using the part's position this time because we have no real idea how far away
- the avatar is from the sit target. */
- RemoveFromPhysicalScene();
- Velocity = Vector3.Zero;
- }
- }
- else return; // physactor is null!
-
- Vector3 offsetr; // = offset * partIRot;
- // KF: In a linkset, offsetr needs to be relative to the group root! 091208
- // offsetr = (part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) + (offset * partIRot);
- // if (part.LinkNum < 2) 091216 All this was necessary because of the GetWorldRotation error.
- // { // Single, or Root prim of linkset, target is ClickOffset * RootRot
- //offsetr = offset * partIRot;
-//
- // else
- // { // Child prim, offset is (ChildOffset * RootRot) + (ClickOffset * ChildRot)
- // offsetr = //(part.OffsetPosition * Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset)) +
- // (offset * partRot);
- // }
-
-//Console.WriteLine(" ");
-//Console.WriteLine("link number ={0}", part.LinkNum);
-//Console.WriteLine("Prim offset ={0}", part.OffsetPosition );
-//Console.WriteLine("Root Rotate ={0}", part.ParentGroup.RootPart.RotationOffset);
-//Console.WriteLine("Click offst ={0}", offset);
-//Console.WriteLine("Prim Rotate ={0}", part.GetWorldRotation());
-//Console.WriteLine("offsetr ={0}", offsetr);
-//Console.WriteLine("Camera At ={0}", cameraAtOffset);
-//Console.WriteLine("Camera Eye ={0}", cameraEyeOffset);
-
- //NOTE: SendSitResponse should be relative to the GROUP *NOT* THE PRIM if we're sitting on a child
- ControllingClient.SendSitResponse(part.ParentGroup.UUID, ((offset * part.RotationOffset) + part.OffsetPosition), sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook);
-
- m_requestedSitTargetUUID = part.UUID; //KF: Correct autopilot target
- // This calls HandleAgentSit twice, once from here, and the client calls
- // HandleAgentSit itself after it gets to the location
- // It doesn't get to the location until we've moved them there though
- // which happens in HandleAgentSit :P
- m_autopilotMoving = autopilot;
- m_autoPilotTarget = autopilotTarget;
- m_sitAtAutoTarget = autopilot;
- m_initialSitTarget = autopilotTarget;
- if (!autopilot)
- HandleAgentSit(remoteClient, UUID);
- }
-
- public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset)
- {
- if (m_parentID != 0)
- {
- StandUp();
- }
- m_nextSitAnimation = "SIT";
-
- //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
-
- if (part != null)
- {
- if (!String.IsNullOrEmpty(part.SitAnimation))
- {
- m_nextSitAnimation = part.SitAnimation;
- }
- m_requestedSitTargetID = part.LocalId;
- //m_requestedSitOffset = offset;
- m_requestedSitTargetUUID = targetID;
-
- m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
-
- if (m_scene.PhysicsScene.SupportsRayCast())
- {
- //m_scene.PhysicsScene.RaycastWorld(Vector3.Zero,Vector3.Zero, 0.01f,new RaycastCallback());
- //SitRayCastAvatarPosition(part);
- //return;
- }
- }
- else
- {
-
- m_log.Warn("Sit requested on unknown object: " + targetID.ToString());
- }
-
-
-
- SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
- }
- /*
- public void SitRayCastAvatarPosition(SceneObjectPart part)
- {
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = AbsolutePosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionResponse);
- }
-
- public void SitRayCastAvatarPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Avatar Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- }
- else
- {
- SitRayCastAvatarPositionCameraZ(part);
- }
- }
- else
- {
- SitRayCastAvatarPositionCameraZ(part);
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- public void SitRayCastAvatarPositionCameraZ(SceneObjectPart part)
- {
- // Next, try to raycast from the camera Z position
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = AbsolutePosition; StartRayCastPosition.Z = CameraPosition.Z;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastAvatarPositionCameraZResponse);
- }
-
- public void SitRayCastAvatarPositionCameraZResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Avatar Position + CameraZ succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- }
- else
- {
- SitRayCastCameraPosition(part);
- }
- }
- else
- {
- SitRayCastCameraPosition(part);
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- public void SitRayCastCameraPosition(SceneObjectPart part)
- {
- // Next, try to raycast from the camera position
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = CameraPosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastCameraPositionResponse);
- }
-
- public void SitRayCastCameraPositionResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Camera Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- }
- else
- {
- SitRayHorizontal(part);
- }
- }
- else
- {
- SitRayHorizontal(part);
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- public void SitRayHorizontal(SceneObjectPart part)
- {
- // Next, try to raycast from the avatar position to fwd
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = CameraPosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastHorizontalResponse);
- }
-
- public void SitRayCastHorizontalResponse(bool hitYN, Vector3 collisionPoint, uint localid, float pdistance, Vector3 normal)
- {
- SceneObjectPart part = FindNextAvailableSitTarget(m_requestedSitTargetUUID);
- if (part != null)
- {
- if (hitYN)
- {
- if (collisionPoint.ApproxEquals(m_requestedSitOffset + part.AbsolutePosition, 0.2f))
- {
- SitRaycastFindEdge(collisionPoint, normal);
- m_log.DebugFormat("[SIT]: Raycast Horizontal Position succeeded at point: {0}, normal:{1}", collisionPoint, normal);
- // Next, try to raycast from the camera position
- Vector3 EndRayCastPosition = part.AbsolutePosition + m_requestedSitOffset;
- Vector3 StartRayCastPosition = CameraPosition;
- Vector3 direction = Vector3.Normalize(EndRayCastPosition - StartRayCastPosition);
- float distance = Vector3.Distance(EndRayCastPosition, StartRayCastPosition);
- //m_scene.PhysicsScene.RaycastWorld(StartRayCastPosition, direction, distance, SitRayCastResponseAvatarPosition);
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position not accessable.");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position not accessable.");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
- }
- else
- {
- ControllingClient.SendAlertMessage("Sit position no longer exists");
- m_requestedSitTargetUUID = UUID.Zero;
- m_requestedSitTargetID = 0;
- m_requestedSitOffset = Vector3.Zero;
- }
-
- }
-
- private void SitRaycastFindEdge(Vector3 collisionPoint, Vector3 collisionNormal)
- {
- int i = 0;
- //throw new NotImplementedException();
- //m_requestedSitTargetUUID = UUID.Zero;
- //m_requestedSitTargetID = 0;
- //m_requestedSitOffset = Vector3.Zero;
-
- SendSitResponse(ControllingClient, m_requestedSitTargetUUID, collisionPoint - m_requestedSitOffset, Quaternion.Identity);
- }
- */
- public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
- {
- if (m_parentID != 0)
- {
- StandUp();
- }
- if (!String.IsNullOrEmpty(sitAnimation))
- {
- m_nextSitAnimation = sitAnimation;
- }
- else
- {
- m_nextSitAnimation = "SIT";
- }
-
- //SceneObjectPart part = m_scene.GetSceneObjectPart(targetID);
- SceneObjectPart part = FindNextAvailableSitTarget(targetID);
- if (part != null)
- {
- m_requestedSitTargetID = part.LocalId;
- //m_requestedSitOffset = offset;
- m_requestedSitTargetUUID = targetID;
-
- m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
-
- if (m_scene.PhysicsScene.SupportsRayCast())
- {
- //SitRayCastAvatarPosition(part);
- //return;
- }
- }
- else
- {
- m_log.Warn("Sit requested on unknown object: " + targetID);
- }
-
- SendSitResponse(remoteClient, targetID, offset, Quaternion.Identity);
- }
-
- public void HandleAgentSit(IClientAPI remoteClient, UUID agentID)
- {
- if (!String.IsNullOrEmpty(m_nextSitAnimation))
- {
- HandleAgentSit(remoteClient, agentID, m_nextSitAnimation);
- }
- else
- {
- HandleAgentSit(remoteClient, agentID, "SIT");
- }
- }
-
- public void HandleAgentSit(IClientAPI remoteClient, UUID agentID, string sitAnimation)
- {
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
-
- if (m_sitAtAutoTarget || !m_autopilotMoving)
- {
- if (part != null)
- {
-//Console.WriteLine("Link #{0}, Rot {1}", part.LinkNum, part.GetWorldRotation());
- if (part.GetAvatarOnSitTarget() == UUID)
- {
-//Console.WriteLine("Scripted Sit");
- // Scripted sit
- Vector3 sitTargetPos = part.SitTargetPosition;
- Quaternion sitTargetOrient = part.SitTargetOrientation;
- m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
- m_pos += SIT_TARGET_ADJUSTMENT;
- if (!part.IsRoot)
- {
- m_pos *= part.RotationOffset;
- }
- m_bodyRot = sitTargetOrient;
- m_parentPosition = part.AbsolutePosition;
- part.IsOccupied = true;
- part.ParentGroup.AddAvatar(agentID);
- }
- else
- {
- // if m_avUnscriptedSitPos is zero then Av sits above center
- // Else Av sits at m_avUnscriptedSitPos
-
- // Non-scripted sit by Kitto Flora 21Nov09
- // Calculate angle of line from prim to Av
- Quaternion partIRot;
-// if (part.LinkNum == 1)
-// { // Root prim of linkset
-// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
-// }
-// else
-// { // single or child prim
- partIRot = Quaternion.Inverse(part.GetWorldRotation());
-// }
- Vector3 sitTargetPos= part.AbsolutePosition + m_avUnscriptedSitPos;
- float y_diff = (m_avInitialPos.Y - sitTargetPos.Y);
- float x_diff = ( m_avInitialPos.X - sitTargetPos.X);
- if(Math.Abs(x_diff) < 0.001f) x_diff = 0.001f; // avoid div by 0
- if(Math.Abs(y_diff) < 0.001f) y_diff = 0.001f; // avoid pol flip at 0
- float sit_angle = (float)Math.Atan2( (double)y_diff, (double)x_diff);
- // NOTE: when sitting m_ pos and m_bodyRot are *relative* to the prim location/rotation, not 'World'.
- // Av sits at world euler <0,0, z>, translated by part rotation
- m_bodyRot = partIRot * Quaternion.CreateFromEulers(0f, 0f, sit_angle); // sit at 0,0,inv-click
-
- m_parentPosition = part.AbsolutePosition;
- part.IsOccupied = true;
- part.ParentGroup.AddAvatar(agentID);
- m_pos = new Vector3(0f, 0f, 0.05f) + // corrections to get Sit Animation
- (new Vector3(0.0f, 0f, 0.61f) * partIRot) + // located on center
- (new Vector3(0.34f, 0f, 0.0f) * m_bodyRot) +
- m_avUnscriptedSitPos; // adds click offset, if any
- //Set up raytrace to find top surface of prim
- Vector3 size = part.Scale;
- float mag = 2.0f; // 0.1f + (float)Math.Sqrt((size.X * size.X) + (size.Y * size.Y) + (size.Z * size.Z));
- Vector3 start = part.AbsolutePosition + new Vector3(0f, 0f, mag);
- Vector3 down = new Vector3(0f, 0f, -1f);
-//Console.WriteLine("st={0} do={1} ma={2}", start, down, mag);
- m_scene.PhysicsScene.RaycastWorld(
- start, // Vector3 position,
- down, // Vector3 direction,
- mag, // float length,
- SitAltitudeCallback); // retMethod
- } // end scripted/not
- }
- else // no Av
- {
- return;
- }
- }
-
- //We want our offsets to reference the root prim, not the child we may have sat on
- if (!part.IsRoot)
- {
- m_parentID = part.ParentGroup.RootPart.LocalId;
- m_pos += part.OffsetPosition;
- }
- else
- {
- m_parentID = m_requestedSitTargetID;
- }
-
- m_linkedPrim = part.UUID;
- if (part.GetAvatarOnSitTarget() != UUID)
- {
- m_offsetRotation = m_offsetRotation / part.RotationOffset;
- }
- Velocity = Vector3.Zero;
- RemoveFromPhysicalScene();
- Animator.TrySetMovementAnimation(sitAnimation);
- SendFullUpdateToAllClients();
- SendTerseUpdateToAllClients();
- }
-
- public void SitAltitudeCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 normal)
- {
- // KF: 091202 There appears to be a bug in Prim Edit Size - the process sometimes make a prim that RayTrace no longer
- // sees. Take/re-rez, or sim restart corrects the condition. Result of bug is incorrect sit height.
- if(hitYN)
- {
- // m_pos = Av offset from prim center to make look like on center
- // m_parentPosition = Actual center pos of prim
- // collisionPoint = spot on prim where we want to sit
- // collisionPoint.Z = global sit surface height
- SceneObjectPart part = m_scene.GetSceneObjectPart(localid);
- Quaternion partIRot;
-// if (part.LinkNum == 1)
-/// { // Root prim of linkset
-// partIRot = Quaternion.Inverse(part.ParentGroup.RootPart.RotationOffset);
-// }
-// else
-// { // single or child prim
- partIRot = Quaternion.Inverse(part.GetWorldRotation());
-// }
- if (m_initialSitTarget != null)
- {
- float offZ = collisionPoint.Z - m_initialSitTarget.Z;
- Vector3 offset = new Vector3(0.0f, 0.0f, offZ) * partIRot; // Altitude correction
- //Console.WriteLine("sitPoint={0}, offset={1}", sitPoint, offset);
- m_pos += offset;
- // ControllingClient.SendClearFollowCamProperties(part.UUID);
- }
-
- }
- } // End SitAltitudeCallback KF.
-
- ///
- /// Event handler for the 'Always run' setting on the client
- /// Tells the physics plugin to increase speed of movement.
- ///
- public void HandleSetAlwaysRun(IClientAPI remoteClient, bool pSetAlwaysRun)
- {
- m_setAlwaysRun = pSetAlwaysRun;
- if (PhysicsActor != null)
- {
- PhysicsActor.SetAlwaysRun = pSetAlwaysRun;
- }
- }
-
- public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
- {
- Animator.AddAnimation(animID, UUID.Zero);
- }
-
- public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
- {
- Animator.RemoveAnimation(animID);
- }
-
- ///
- /// Rotate the avatar to the given rotation and apply a movement in the given relative vector
- ///
- /// The vector in which to move. This is relative to the rotation argument
- /// The direction in which this avatar should now face.
- public void AddNewMovement(Vector3 vec, Quaternion rotation, bool Nudging)
- {
- if (m_isChildAgent)
- {
- // WHAT???
- m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
-
- // we have to reset the user's child agent connections.
- // Likely, here they've lost the eventqueue for other regions so border
- // crossings will fail at this point unless we reset them.
-
- List regions = new List(KnownChildRegionHandles);
- regions.Remove(m_scene.RegionInfo.RegionHandle);
-
- MakeRootAgent(new Vector3(127f, 127f, 127f), true);
-
- // Async command
- if (m_scene.SceneGridService != null)
- {
- m_scene.SceneGridService.SendCloseChildAgentConnections(UUID, regions);
-
- // Give the above command some time to try and close the connections.
- // this is really an emergency.. so sleep, or we'll get all discombobulated.
- System.Threading.Thread.Sleep(500);
- }
-
- if (m_scene.SceneGridService != null)
- {
- IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
- if (m_agentTransfer != null)
- m_agentTransfer.EnableChildAgents(this);
- }
-
- return;
- }
-
- m_perfMonMS = Util.EnvironmentTickCount();
-
- Rotation = rotation;
- Vector3 direc = vec * rotation;
- direc.Normalize();
- PhysicsActor actor = m_physicsActor;
- if ((vec.Z == 0f) && !actor.Flying) direc.Z = 0f; // Prevent camera WASD up.
-
- direc *= 0.03f * 128f * m_speedModifier;
-
- if (actor != null)
- {
- if (actor.Flying)
- {
- direc *= 4.0f;
- //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);
- //if (controlland)
- // m_log.Info("[AGENT]: landCommand");
- //if (colliding)
- // m_log.Info("[AGENT]: colliding");
- //if (m_physicsActor.Flying && colliding && controlland)
- //{
- // StopFlying();
- // m_log.Info("[AGENT]: Stop FLying");
- //}
- }
- else if (!actor.Flying && actor.IsColliding)
- {
- if (direc.Z > 2.0f)
- {
- if(m_animator.m_animTickJump == -1)
- {
- direc.Z *= 3.0f; // jump
- }
- else
- {
- direc.Z *= 0.1f; // prejump
- }
- /* Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs
- Animator.TrySetMovementAnimation("PREJUMP");
- Animator.TrySetMovementAnimation("JUMP");
- */
- }
- }
- }
-
- // TODO: Add the force instead of only setting it to support multiple forces per frame?
- m_forceToApply = direc;
- m_isNudging = Nudging;
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- #endregion
-
- #region Overridden Methods
-
- public override void Update()
- {
- const float ROTATION_TOLERANCE = 0.01f;
- const float VELOCITY_TOLERANCE = 0.001f;
- const float POSITION_TOLERANCE = 0.05f;
- //const int TIME_MS_TOLERANCE = 3000;
-
-
-
- if (m_isChildAgent == false)
- {
-// PhysicsActor actor = m_physicsActor;
-
- // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
- // grab the latest PhysicsActor velocity, whereas m_velocity is often
- // storing a requested force instead of an actual traveling velocity
-
- // Throw away duplicate or insignificant updates
- if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
- !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
- !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
- //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
- {
- SendTerseUpdateToAllClients();
-
- // Update the "last" values
- m_lastPosition = m_pos;
- m_lastRotation = m_bodyRot;
- m_lastVelocity = Velocity;
- //m_lastTerseSent = Environment.TickCount;
- }
-
- // followed suggestion from mic bowman. reversed the two lines below.
- if (m_parentID == 0 && m_physicsActor != null || m_parentID != 0) // Check that we have a physics actor or we're sitting on something
- CheckForBorderCrossing();
- CheckForSignificantMovement(); // sends update to the modules.
- }
-
- //Sending prim updates AFTER the avatar terse updates are sent
- SendPrimUpdates();
- }
-
- #endregion
-
- #region Update Client(s)
-
- ///
- /// Sends a location update to the client connected to this scenePresence
- ///
- ///
- public void SendTerseUpdateToClient(IClientAPI remoteClient)
- {
- // If the client is inactive, it's getting its updates from another
- // server.
- if (remoteClient.IsActive)
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- PhysicsActor actor = m_physicsActor;
- Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
-
- remoteClient.SendPrimUpdate(this, PrimUpdateFlags.Position | PrimUpdateFlags.Rotation | PrimUpdateFlags.Velocity | PrimUpdateFlags.Acceleration | PrimUpdateFlags.AngularVelocity);
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- m_scene.StatsReporter.AddAgentUpdates(1);
- }
- }
-
- ///
- /// Send a location/velocity/accelleration update to all agents in scene
- ///
- public void SendTerseUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- m_scene.ForEachClient(SendTerseUpdateToClient);
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- public void SendCoarseLocations(List coarseLocations, List avatarUUIDs)
- {
- SendCourseLocationsMethod d = m_sendCourseLocationsMethod;
- if (d != null)
- {
- d.Invoke(m_scene.RegionInfo.originRegionID, this, coarseLocations, avatarUUIDs);
- }
- }
-
- public void SetSendCourseLocationMethod(SendCourseLocationsMethod d)
- {
- if (d != null)
- m_sendCourseLocationsMethod = d;
- }
-
- public void SendCoarseLocationsDefault(UUID sceneId, ScenePresence p, List coarseLocations, List avatarUUIDs)
- {
- m_perfMonMS = Util.EnvironmentTickCount();
- m_controllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- ///
- /// Tell other client about this avatar (The client previously didn't know or had outdated details about this avatar)
- ///
- ///
- public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
- {
- // 2 stage check is needed.
- if (remoteAvatar == null)
- return;
- IClientAPI cl=remoteAvatar.ControllingClient;
- if (cl == null)
- return;
- if (m_appearance.Texture == null)
- return;
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this);
- m_scene.StatsReporter.AddAgentUpdates(1);
- }
-
- ///
- /// Tell *ALL* agents about this agent
- ///
- public void SendInitialFullUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
- int avUpdates = 0;
- m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
- {
- ++avUpdates;
- // only send if this is the root (children are only "listening posts" in a foreign region)
- if (!IsChildAgent)
- {
- SendFullUpdateToOtherClient(avatar);
- }
-
- if (avatar.LocalId != LocalId)
- {
- if (!avatar.IsChildAgent)
- {
- avatar.SendFullUpdateToOtherClient(this);
- avatar.SendAppearanceToOtherAgent(this);
- avatar.Animator.SendAnimPackToClient(ControllingClient);
- }
- }
- });
-
- m_scene.StatsReporter.AddAgentUpdates(avUpdates);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
-
- //Animator.SendAnimPack();
- }
-
- public void SendFullUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- // only send update from root agents to other clients; children are only "listening posts"
- int count = 0;
- m_scene.ForEachScenePresence(delegate(ScenePresence sp)
- {
- if (sp.IsChildAgent)
- return;
- SendFullUpdateToOtherClient(sp);
- ++count;
- });
- m_scene.StatsReporter.AddAgentUpdates(count);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
-
- Animator.SendAnimPack();
- }
-
- ///
- /// Do everything required once a client completes its movement into a region
- ///
- public void SendInitialData()
- {
- // Moved this into CompleteMovement to ensure that m_appearance is initialized before
- // the inventory arrives
- // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- m_controllingClient.SendAvatarDataImmediate(this);
-
- SendInitialFullUpdateToAllClients();
- SendAppearanceToAllOtherAgents();
- }
-
- ///
- /// Tell the client for this scene presence what items it should be wearing now
- ///
- public void SendWearables()
- {
- m_log.DebugFormat("[SCENE]: Received request for wearables of {0}", Name);
-
- ControllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
- }
-
- ///
- ///
- ///
- public void SendAppearanceToAllOtherAgents()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
- {
- if (scenePresence.UUID != UUID)
- {
- SendAppearanceToOtherAgent(scenePresence);
- }
- });
-
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
- }
-
- ///
- /// Send appearance data to an agent that isn't this one.
- ///
- ///
- public void SendAppearanceToOtherAgent(ScenePresence avatar)
- {
- avatar.ControllingClient.SendAppearance(
- m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
- }
-
- ///
- /// Set appearance data (textureentry and slider settings) received from the client
- ///
- ///
- ///
- public void SetAppearance(Primitive.TextureEntry textureEntry, byte[] visualParams)
- {
- if (m_physicsActor != null)
- {
- if (!IsChildAgent)
- {
- // This may seem like it's redundant, remove the avatar from the physics scene
- // just to add it back again, but it saves us from having to update
- // 3 variables 10 times a second.
- bool flyingTemp = m_physicsActor.Flying;
- RemoveFromPhysicalScene();
- //m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
-
- //PhysicsActor = null;
-
- AddToPhysicalScene(flyingTemp);
- }
- }
-
- #region Bake Cache Check
-
- if (textureEntry != null)
- {
- for (int i = 0; i < BAKE_INDICES.Length; i++)
- {
- int j = BAKE_INDICES[i];
- Primitive.TextureEntryFace face = textureEntry.FaceTextures[j];
-
- if (face != null && face.TextureID != AppearanceManager.DEFAULT_AVATAR_TEXTURE)
- {
- if (m_scene.AssetService.Get(face.TextureID.ToString()) == null)
- {
- m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name);
- this.ControllingClient.SendRebakeAvatarTextures(face.TextureID);
- }
- }
- }
-
- }
-
-
- #endregion Bake Cache Check
-
- m_appearance.SetAppearance(textureEntry, visualParams);
- if (m_appearance.AvatarHeight > 0)
- SetHeight(m_appearance.AvatarHeight);
-
- // This is not needed, because only the transient data changed
- //AvatarData adata = new AvatarData(m_appearance);
- //m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
-
- SendAppearanceToAllOtherAgents();
- if (!m_startAnimationSet)
- {
- Animator.UpdateMovementAnimations();
- m_startAnimationSet = true;
- }
-
- Vector3 pos = m_pos;
- pos.Z += m_appearance.HipOffset;
-
- m_controllingClient.SendAvatarDataImmediate(this);
- }
-
- public void SetWearable(int wearableId, AvatarWearable wearable)
- {
- m_appearance.SetWearable(wearableId, wearable);
- AvatarData adata = new AvatarData(m_appearance);
- m_scene.AvatarService.SetAvatar(m_controllingClient.AgentId, adata);
- m_controllingClient.SendWearables(m_appearance.Wearables, m_appearance.Serial++);
- }
-
- // Because appearance setting is in a module, we actually need
- // to give it access to our appearance directly, otherwise we
- // get a synchronization issue.
- public AvatarAppearance Appearance
- {
- get { return m_appearance; }
- set { m_appearance = value; }
- }
-
- #endregion
-
- #region Significant Movement Method
-
- ///
- /// This checks for a significant movement and sends a courselocationchange update
- ///
- protected void CheckForSignificantMovement()
- {
- // Movement updates for agents in neighboring regions are sent directly to clients.
- // This value only affects how often agent positions are sent to neighbor regions
- // for things such as distance-based update prioritization
- const float SIGNIFICANT_MOVEMENT = 2.0f;
-
- if (Util.GetDistanceTo(AbsolutePosition, posLastSignificantMove) > SIGNIFICANT_MOVEMENT)
- {
- posLastSignificantMove = AbsolutePosition;
- m_scene.EventManager.TriggerSignificantClientMovement(m_controllingClient);
- }
-
- // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
- if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
- Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
- {
- m_lastChildAgentUpdatePosition = AbsolutePosition;
- m_lastChildAgentUpdateCamPosition = CameraPosition;
-
- ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
- cadu.ActiveGroupID = UUID.Zero.Guid;
- cadu.AgentID = UUID.Guid;
- cadu.alwaysrun = m_setAlwaysRun;
- cadu.AVHeight = m_avHeight;
- Vector3 tempCameraCenter = m_CameraCenter;
- cadu.cameraPosition = tempCameraCenter;
- cadu.drawdistance = m_DrawDistance;
- cadu.GroupAccess = 0;
- cadu.Position = AbsolutePosition;
- cadu.regionHandle = m_rootRegionHandle;
- float multiplier = 1;
- int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
- if (innacurateNeighbors != 0)
- {
- multiplier = 1f / (float)innacurateNeighbors;
- }
- if (multiplier <= 0f)
- {
- multiplier = 0.25f;
- }
-
- //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
- cadu.throttles = ControllingClient.GetThrottlesPacked(multiplier);
- cadu.Velocity = Velocity;
-
- AgentPosition agentpos = new AgentPosition();
- agentpos.CopyFrom(cadu);
-
- m_scene.SendOutChildAgentUpdates(agentpos, this);
- }
- }
-
- #endregion
-
- #region Border Crossing Methods
-
- ///
- /// Checks to see if the avatar is in range of a border and calls CrossToNewRegion
- ///
- protected void CheckForBorderCrossing()
- {
- if (IsChildAgent)
- return;
-
- Vector3 pos2 = AbsolutePosition;
- Vector3 vel = Velocity;
- int neighbor = 0;
- int[] fix = new int[2];
-
- float timeStep = 0.1f;
- pos2.X = pos2.X + (vel.X*timeStep);
- pos2.Y = pos2.Y + (vel.Y*timeStep);
- pos2.Z = pos2.Z + (vel.Z*timeStep);
-
- if (!IsInTransit)
- {
- // Checks if where it's headed exists a region
-
- bool needsTransit = false;
- if (m_scene.TestBorderCross(pos2, Cardinals.W))
- {
- if (m_scene.TestBorderCross(pos2, Cardinals.S))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.SW, ref fix);
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.N))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.NW, ref fix);
- }
- else
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.W, ref fix);
- }
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.E))
- {
- if (m_scene.TestBorderCross(pos2, Cardinals.S))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.SE, ref fix);
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.N))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.NE, ref fix);
- }
- else
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.E, ref fix);
- }
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.S))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.S, ref fix);
- }
- else if (m_scene.TestBorderCross(pos2, Cardinals.N))
- {
- needsTransit = true;
- neighbor = HaveNeighbor(Cardinals.N, ref fix);
- }
-
-
- // Makes sure avatar does not end up outside region
- if (neighbor <= 0)
- {
- if (!needsTransit)
- {
- if (m_requestedSitTargetUUID == UUID.Zero)
- {
- Vector3 pos = AbsolutePosition;
- if (AbsolutePosition.X < 0)
- pos.X += Velocity.X;
- else if (AbsolutePosition.X > Constants.RegionSize)
- pos.X -= Velocity.X;
- if (AbsolutePosition.Y < 0)
- pos.Y += Velocity.Y;
- else if (AbsolutePosition.Y > Constants.RegionSize)
- pos.Y -= Velocity.Y;
- AbsolutePosition = pos;
- }
- }
- }
- else if (neighbor > 0)
- CrossToNewRegion();
- }
- else
- {
- RemoveFromPhysicalScene();
- // This constant has been inferred from experimentation
- // I'm not sure what this value should be, so I tried a few values.
- timeStep = 0.04f;
- pos2 = AbsolutePosition;
- pos2.X = pos2.X + (vel.X * timeStep);
- pos2.Y = pos2.Y + (vel.Y * timeStep);
- pos2.Z = pos2.Z + (vel.Z * timeStep);
- m_pos = pos2;
- }
- }
-
- protected int HaveNeighbor(Cardinals car, ref int[] fix)
- {
- uint neighbourx = m_regionInfo.RegionLocX;
- uint neighboury = m_regionInfo.RegionLocY;
-
- int dir = (int)car;
-
- if (dir > 1 && dir < 5) //Heading East
- neighbourx++;
- else if (dir > 5) // Heading West
- neighbourx--;
-
- if (dir < 3 || dir == 8) // Heading North
- neighboury++;
- else if (dir > 3 && dir < 7) // Heading Sout
- neighboury--;
-
- int x = (int)(neighbourx * Constants.RegionSize);
- int y = (int)(neighboury * Constants.RegionSize);
- GridRegion neighbourRegion = m_scene.GridService.GetRegionByPosition(m_scene.RegionInfo.ScopeID, x, y);
-
- if (neighbourRegion == null)
- {
- fix[0] = (int)(m_regionInfo.RegionLocX - neighbourx);
- fix[1] = (int)(m_regionInfo.RegionLocY - neighboury);
- return dir * (-1);
- }
- else
- return dir;
- }
-
- ///
- /// Moves the agent outside the region bounds
- /// Tells neighbor region that we're crossing to it
- /// If the neighbor accepts, remove the agent's viewable avatar from this scene
- /// set them to a child agent.
- ///
- protected void CrossToNewRegion()
- {
- InTransit();
- try
- {
- m_scene.CrossAgentToNewRegion(this, m_physicsActor.Flying);
- }
- catch
- {
- m_scene.CrossAgentToNewRegion(this, false);
- }
- }
-
- public void InTransit()
- {
- m_inTransit = true;
-
- if ((m_physicsActor != null) && m_physicsActor.Flying)
- m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
- else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
- m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
- }
-
- public void NotInTransit()
- {
- m_inTransit = false;
- }
-
- public void RestoreInCurrentScene()
- {
- AddToPhysicalScene(false); // not exactly false
- }
-
- public void Reset()
- {
- // Put the child agent back at the center
- AbsolutePosition
- = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
- Animator.ResetAnimations();
- }
-
- ///
- /// Computes which child agents to close when the scene presence moves to another region.
- /// Removes those regions from m_knownRegions.
- ///
- /// The new region's x on the map
- /// The new region's y on the map
- ///
- public void CloseChildAgents(uint newRegionX, uint newRegionY)
- {
- List byebyeRegions = new List();
- m_log.DebugFormat(
- "[SCENE PRESENCE]: Closing child agents. Checking {0} regions in {1}",
- m_knownChildRegions.Keys.Count, Scene.RegionInfo.RegionName);
- //DumpKnownRegions();
-
- lock (m_knownChildRegions)
- {
- foreach (ulong handle in m_knownChildRegions.Keys)
- {
- // Don't close the agent on this region yet
- if (handle != Scene.RegionInfo.RegionHandle)
- {
- uint x, y;
- Utils.LongToUInts(handle, out x, out y);
- x = x / Constants.RegionSize;
- y = y / Constants.RegionSize;
-
- //m_log.Debug("---> x: " + x + "; newx:" + newRegionX + "; Abs:" + (int)Math.Abs((int)(x - newRegionX)));
- //m_log.Debug("---> y: " + y + "; newy:" + newRegionY + "; Abs:" + (int)Math.Abs((int)(y - newRegionY)));
- if (Util.IsOutsideView(x, newRegionX, y, newRegionY))
- {
- byebyeRegions.Add(handle);
- }
- }
- }
- }
-
- if (byebyeRegions.Count > 0)
- {
- m_log.Debug("[SCENE PRESENCE]: Closing " + byebyeRegions.Count + " child agents");
- m_scene.SceneGridService.SendCloseChildAgentConnections(m_controllingClient.AgentId, byebyeRegions);
- }
-
- foreach (ulong handle in byebyeRegions)
- {
- RemoveNeighbourRegion(handle);
- }
- }
-
- #endregion
-
- ///
- /// This allows the Sim owner the abiility to kick users from their sim currently.
- /// It tells the client that the agent has permission to do so.
- ///
- public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus)
- {
- if (godStatus)
- {
- // For now, assign god level 200 to anyone
- // who is granted god powers, but has no god level set.
- //
- UserAccount account = m_scene.UserAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, agentID);
- if (account != null)
- {
- if (account.UserLevel > 0)
- m_godLevel = account.UserLevel;
- else
- m_godLevel = 200;
- }
- }
- else
- {
- m_godLevel = 0;
- }
-
- ControllingClient.SendAdminResponse(token, (uint)m_godLevel);
- }
-
- #region Child Agent Updates
-
- public void ChildAgentDataUpdate(AgentData cAgentData)
- {
- //m_log.Debug(" >>> ChildAgentDataUpdate <<< " + Scene.RegionInfo.RegionName);
- if (!IsChildAgent)
- return;
-
- CopyFrom(cAgentData);
- }
-
- ///
- /// 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
- ///
- public void ChildAgentDataUpdate(AgentPosition cAgentData, uint tRegionX, uint tRegionY, uint rRegionX, uint rRegionY)
- {
- if (!IsChildAgent)
- return;
-
- //m_log.Debug(" >>> ChildAgentPositionUpdate <<< " + rRegionX + "-" + rRegionY);
- int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
- int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
-
- Vector3 offset = new Vector3(shiftx, shifty, 0f);
-
- m_DrawDistance = cAgentData.Far;
- if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
- m_pos = cAgentData.Position + offset;
-
- if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
- {
- posLastSignificantMove = AbsolutePosition;
- ReprioritizeUpdates();
- }
-
- m_CameraCenter = cAgentData.Center + offset;
-
- m_avHeight = cAgentData.Size.Z;
- //SetHeight(cAgentData.AVHeight);
-
- if ((cAgentData.Throttles != null) && cAgentData.Throttles.Length > 0)
- 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_sceneViewer.Reset();
-
- //cAgentData.AVHeight;
- m_rootRegionHandle = cAgentData.RegionHandle;
- //m_velocity = cAgentData.Velocity;
- }
-
- public void CopyTo(AgentData cAgent)
- {
- cAgent.AgentID = UUID;
- cAgent.RegionID = Scene.RegionInfo.RegionID;
-
- cAgent.Position = AbsolutePosition;
- cAgent.Velocity = m_velocity;
- cAgent.Center = m_CameraCenter;
- // Don't copy the size; it is inferred from apearance parameters
- //cAgent.Size = new Vector3(0, 0, m_avHeight);
- cAgent.AtAxis = m_CameraAtAxis;
- cAgent.LeftAxis = m_CameraLeftAxis;
- cAgent.UpAxis = m_CameraUpAxis;
-
- cAgent.Far = m_DrawDistance;
-
- // Throttles
- float multiplier = 1;
- int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
- if (innacurateNeighbors != 0)
- {
- multiplier = 1f / innacurateNeighbors;
- }
- if (multiplier <= 0f)
- {
- multiplier = 0.25f;
- }
- //m_log.Info("[NeighborThrottle]: " + m_scene.GetInaccurateNeighborCount().ToString() + " - m: " + multiplier.ToString());
- cAgent.Throttles = ControllingClient.GetThrottlesPacked(multiplier);
-
- cAgent.HeadRotation = m_headrotation;
- cAgent.BodyRotation = m_bodyRot;
- cAgent.ControlFlags = (uint)m_AgentControlFlags;
-
- if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
- cAgent.GodLevel = (byte)m_godLevel;
- else
- cAgent.GodLevel = (byte) 0;
-
- cAgent.AlwaysRun = m_setAlwaysRun;
-
- try
- {
- // We might not pass the Wearables in all cases...
- // They're only needed so that persistent changes to the appearance
- // are preserved in the new region where the user is moving to.
- // But in Hypergrid we might not let this happen.
- int i = 0;
- UUID[] wears = new UUID[m_appearance.Wearables.Length * 2];
- foreach (AvatarWearable aw in m_appearance.Wearables)
- {
- if (aw != null)
- {
- wears[i++] = aw.ItemID;
- wears[i++] = aw.AssetID;
- }
- else
- {
- wears[i++] = UUID.Zero;
- wears[i++] = UUID.Zero;
- }
- }
- cAgent.Wearables = wears;
-
- cAgent.VisualParams = m_appearance.VisualParams;
-
- if (m_appearance.Texture != null)
- cAgent.AgentTextures = m_appearance.Texture.GetBytes();
- }
- catch (Exception e)
- {
- m_log.Warn("[SCENE PRESENCE]: exception in CopyTo " + e.Message);
- }
-
- //Attachments
- List attPoints = m_appearance.GetAttachedPoints();
- if (attPoints != null)
- {
- //m_log.DebugFormat("[SCENE PRESENCE]: attachments {0}", attPoints.Count);
- int i = 0;
- AttachmentData[] attachs = new AttachmentData[attPoints.Count];
- foreach (int point in attPoints)
- {
- attachs[i++] = new AttachmentData(point, m_appearance.GetAttachedItem(point), m_appearance.GetAttachedAsset(point));
- }
- cAgent.Attachments = attachs;
- }
-
- lock (scriptedcontrols)
- {
- ControllerData[] controls = new ControllerData[scriptedcontrols.Count];
- int i = 0;
-
- foreach (ScriptControllers c in scriptedcontrols.Values)
- {
- controls[i++] = new ControllerData(c.itemID, (uint)c.ignoreControls, (uint)c.eventControls);
- }
- cAgent.Controllers = controls;
- }
-
- // Animations
- try
- {
- cAgent.Anims = Animator.Animations.ToArray();
- }
- catch { }
-
- // cAgent.GroupID = ??
- // Groups???
-
- }
-
- public void CopyFrom(AgentData cAgent)
- {
- m_originRegionID = cAgent.RegionID;
-
- m_callbackURI = cAgent.CallbackURI;
-
- m_pos = cAgent.Position;
-
- m_velocity = cAgent.Velocity;
- m_CameraCenter = cAgent.Center;
- //m_avHeight = cAgent.Size.Z;
- m_CameraAtAxis = cAgent.AtAxis;
- m_CameraLeftAxis = cAgent.LeftAxis;
- m_CameraUpAxis = cAgent.UpAxis;
-
- m_DrawDistance = cAgent.Far;
-
- if ((cAgent.Throttles != null) && cAgent.Throttles.Length > 0)
- ControllingClient.SetChildAgentThrottle(cAgent.Throttles);
-
- m_headrotation = cAgent.HeadRotation;
- m_bodyRot = cAgent.BodyRotation;
- m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
-
- if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
- m_godLevel = cAgent.GodLevel;
- m_setAlwaysRun = cAgent.AlwaysRun;
-
- uint i = 0;
- try
- {
- if (cAgent.Wearables == null)
- cAgent.Wearables = new UUID[0];
- AvatarWearable[] wears = new AvatarWearable[cAgent.Wearables.Length / 2];
- for (uint n = 0; n < cAgent.Wearables.Length; n += 2)
- {
- UUID itemId = cAgent.Wearables[n];
- UUID assetId = cAgent.Wearables[n + 1];
- wears[i++] = new AvatarWearable(itemId, assetId);
- }
- m_appearance.Wearables = wears;
- Primitive.TextureEntry te;
- if (cAgent.AgentTextures != null && cAgent.AgentTextures.Length > 1)
- te = new Primitive.TextureEntry(cAgent.AgentTextures, 0, cAgent.AgentTextures.Length);
- else
- te = AvatarAppearance.GetDefaultTexture();
- if ((cAgent.VisualParams == null) || (cAgent.VisualParams.Length < AvatarAppearance.VISUALPARAM_COUNT))
- cAgent.VisualParams = AvatarAppearance.GetDefaultVisualParams();
- m_appearance.SetAppearance(te, (byte[])cAgent.VisualParams.Clone());
- }
- catch (Exception e)
- {
- m_log.Warn("[SCENE PRESENCE]: exception in CopyFrom " + e.Message);
- }
-
- // Attachments
- try
- {
- if (cAgent.Attachments != null)
- {
- m_appearance.ClearAttachments();
- foreach (AttachmentData att in cAgent.Attachments)
- {
- m_appearance.SetAttachment(att.AttachPoint, att.ItemID, att.AssetID);
- }
- }
- }
- catch { }
-
- try
- {
- lock (scriptedcontrols)
- {
- if (cAgent.Controllers != null)
- {
- scriptedcontrols.Clear();
-
- foreach (ControllerData c in cAgent.Controllers)
- {
- ScriptControllers sc = new ScriptControllers();
- sc.itemID = c.ItemID;
- sc.ignoreControls = (ScriptControlled)c.IgnoreControls;
- sc.eventControls = (ScriptControlled)c.EventControls;
-
- scriptedcontrols[sc.itemID] = sc;
- }
- }
- }
- }
- catch { }
- // Animations
- try
- {
- Animator.ResetAnimations();
- Animator.Animations.FromArray(cAgent.Anims);
- }
- catch { }
-
- //cAgent.GroupID = ??
- //Groups???
- }
-
- public bool CopyAgent(out IAgentData agent)
- {
- agent = new CompleteAgentData();
- CopyTo((AgentData)agent);
- return true;
- }
-
- #endregion Child Agent Updates
-
- ///
- /// Handles part of the PID controller function for moving an avatar.
- ///
- public override void UpdateMovement()
- {
- if (m_forceToApply.HasValue)
- {
-
- Vector3 force = m_forceToApply.Value;
- m_updateflag = true;
- Velocity = force;
-
- m_forceToApply = null;
- }
- else
- {
- if (m_isNudging)
- {
- Vector3 force = Vector3.Zero;
-
- m_updateflag = true;
- Velocity = force;
- m_isNudging = false;
- m_updateCount = UPDATE_COUNT; //KF: Update anims to pickup "STAND"
- }
- }
- }
-
- public override void SetText(string text, Vector3 color, double alpha)
- {
- throw new Exception("Can't set Text on avatar.");
- }
-
- ///
- /// Adds a physical representation of the avatar to the Physics plugin
- ///
- public void AddToPhysicalScene(bool isFlying)
- {
- PhysicsScene scene = m_scene.PhysicsScene;
-
- Vector3 pVec = AbsolutePosition;
-
- // Old bug where the height was in centimeters instead of meters
- if (m_avHeight == 127.0f)
- {
- m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new Vector3(0f, 0f, 1.56f),
- isFlying);
- }
- else
- {
- m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec,
- new Vector3(0f, 0f, m_avHeight), isFlying);
- }
- scene.AddPhysicsActorTaint(m_physicsActor);
- //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients;
- m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
- m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
- m_physicsActor.SubscribeEvents(500);
- m_physicsActor.LocalID = LocalId;
- }
-
- private void OutOfBoundsCall(Vector3 pos)
- {
- //bool flying = m_physicsActor.Flying;
- //RemoveFromPhysicalScene();
-
- //AddToPhysicalScene(flying);
- if (ControllingClient != null)
- ControllingClient.SendAgentAlertMessage("Physics is having a problem with your avatar. You may not be able to move until you relog.", true);
- }
-
- // Event called by the physics plugin to tell the avatar about a collision.
- private void PhysicsCollisionUpdate(EventArgs e)
- {
- if (e == null)
- return;
-
- // The Physics Scene will send (spam!) updates every 500 ms grep: m_physicsActor.SubscribeEvents(
- // as of this comment the interval is set in AddToPhysicalScene
- if (Animator!=null)
- {
- if (m_updateCount > 0) //KF: DO NOT call UpdateMovementAnimations outside of the m_updateCount wrapper,
- { // else its will lock out other animation changes, like ground sit.
- Animator.UpdateMovementAnimations();
- m_updateCount--;
- }
- }
-
- CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
- Dictionary coldata = collisionData.m_objCollisionList;
-
- CollisionPlane = Vector4.UnitW;
-
- if (m_lastColCount != coldata.Count)
- {
- m_updateCount = UPDATE_COUNT;
- m_lastColCount = coldata.Count;
- }
-
- if (coldata.Count != 0 && Animator != null)
- {
- switch (Animator.CurrentMovementAnimation)
- {
- case "STAND":
- case "WALK":
- case "RUN":
- case "CROUCH":
- case "CROUCHWALK":
- {
- ContactPoint lowest;
- lowest.SurfaceNormal = Vector3.Zero;
- lowest.Position = Vector3.Zero;
- lowest.Position.Z = Single.NaN;
-
- foreach (ContactPoint contact in coldata.Values)
- {
- if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
- {
- lowest = contact;
- }
- }
-
- CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
- }
- break;
- }
- }
-
- List thisHitColliders = new List();
- List endedColliders = new List();
- List startedColliders = new List();
-
- foreach (uint localid in coldata.Keys)
- {
- thisHitColliders.Add(localid);
- if (!m_lastColliders.Contains(localid))
- {
- startedColliders.Add(localid);
- }
- //m_log.Debug("[SCENE PRESENCE]: Collided with:" + localid.ToString() + " at depth of: " + collissionswith[localid].ToString());
- }
-
- // calculate things that ended colliding
- foreach (uint localID in m_lastColliders)
- {
- if (!thisHitColliders.Contains(localID))
- {
- endedColliders.Add(localID);
- }
- }
- //add the items that started colliding this time to the last colliders list.
- foreach (uint localID in startedColliders)
- {
- m_lastColliders.Add(localID);
- }
- // remove things that ended colliding from the last colliders list
- foreach (uint localID in endedColliders)
- {
- m_lastColliders.Remove(localID);
- }
-
- // do event notification
- if (startedColliders.Count > 0)
- {
- ColliderArgs StartCollidingMessage = new ColliderArgs();
- List colliding = new List();
- foreach (uint localId in startedColliders)
- {
- if (localId == 0)
- continue;
-
- SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
- string data = "";
- if (obj != null)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = obj.UUID;
- detobj.nameStr = obj.Name;
- detobj.ownerUUID = obj.OwnerID;
- detobj.posVector = obj.AbsolutePosition;
- detobj.rotQuat = obj.GetWorldRotation();
- detobj.velVector = obj.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = obj.GroupID;
- colliding.Add(detobj);
- }
- }
-
- if (colliding.Count > 0)
- {
- StartCollidingMessage.Colliders = colliding;
-
- foreach (SceneObjectGroup att in Attachments)
- Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
- }
- }
-
- if (endedColliders.Count > 0)
- {
- ColliderArgs EndCollidingMessage = new ColliderArgs();
- List colliding = new List();
- foreach (uint localId in endedColliders)
- {
- if (localId == 0)
- continue;
-
- SceneObjectPart obj = Scene.GetSceneObjectPart(localId);
- string data = "";
- if (obj != null)
- {
- DetectedObject detobj = new DetectedObject();
- detobj.keyUUID = obj.UUID;
- detobj.nameStr = obj.Name;
- detobj.ownerUUID = obj.OwnerID;
- detobj.posVector = obj.AbsolutePosition;
- detobj.rotQuat = obj.GetWorldRotation();
- detobj.velVector = obj.Velocity;
- detobj.colliderType = 0;
- detobj.groupUUID = obj.GroupID;
- colliding.Add(detobj);
- }
- }
-
- if (colliding.Count > 0)
- {
- EndCollidingMessage.Colliders = colliding;
-
- foreach (SceneObjectGroup att in Attachments)
- Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage);
- }
- }
-
- if (thisHitColliders.Count > 0)
- {
- ColliderArgs CollidingMessage = new ColliderArgs();
- List