First set of merge fixes

avinationmerge
Tom 2011-09-07 09:42:18 -07:00
parent 9cc2d0b60a
commit 03f6734f43
11 changed files with 333 additions and 581 deletions

View File

@ -3747,7 +3747,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (!m_scene.TryGetScenePresence(part.OwnerID, out sp)) if (!m_scene.TryGetScenePresence(part.OwnerID, out sp))
continue; continue;
List<SceneObjectGroup> atts = sp.Attachments; List<SceneObjectGroup> atts = sp.GetAttachments();
bool found = false; bool found = false;
foreach (SceneObjectGroup att in atts) foreach (SceneObjectGroup att in atts)
{ {

View File

@ -204,29 +204,15 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
} }
} }
} }
}
private void UndeliveredMessage(GridInstantMessage im) private void UndeliveredMessage(GridInstantMessage im)
{ {
if (im.dialog != (byte)InstantMessageDialog.MessageFromObject && if ((im.offline != 0)
im.dialog != (byte)InstantMessageDialog.MessageFromAgent && && (!im.fromGroup || (im.fromGroup && m_ForwardOfflineGroupMessages)))
im.dialog != (byte)InstantMessageDialog.GroupNotice &&
im.dialog != (byte)InstantMessageDialog.GroupInvitation &&
im.dialog != (byte)InstantMessageDialog.InventoryOffered)
{ {
bool success = SynchronousRestObjectRequester.MakeRequest<GridInstantMessage, bool>( bool success = SynchronousRestObjectRequester.MakeRequest<GridInstantMessage, bool>(
"POST", m_RestURL+"/SaveMessage/", im); "POST", m_RestURL + "/SaveMessage/", im);
return;
}
// It's not delivered. Make sure the scope id is saved
// We don't need the imSessionID here anymore, overwrite it
Scene scene = FindScene(new UUID(im.fromAgentID));
if (scene == null)
scene = m_SceneList[0];
bool success = SynchronousRestObjectPoster.BeginPostObject<GridInstantMessage, bool>(
"POST", m_RestURL+"/SaveMessage/?scope=" +
scene.RegionInfo.ScopeID.ToString(), im);
if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent) if (im.dialog == (byte)InstantMessageDialog.MessageFromAgent)
{ {
@ -238,11 +224,12 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage
null, new UUID(im.toAgentID), null, new UUID(im.toAgentID),
"System", new UUID(im.fromAgentID), "System", new UUID(im.fromAgentID),
(byte)InstantMessageDialog.MessageFromAgent, (byte)InstantMessageDialog.MessageFromAgent,
"User is not logged in. "+ "User is not logged in. " +
(success ? "Message saved." : "Message not saved"), (success ? "Message saved." : "Message not saved"),
false, new Vector3())); false, new Vector3()));
} }
} }
} }
}
} }

View File

@ -788,7 +788,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment)) if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment))
return null; return null;
SceneObjectPart rootPart = group.RootPart;
for (int i = 0; i < objlist.Count; i++) for (int i = 0; i < objlist.Count; i++)
{ {
group = objlist[i]; group = objlist[i];
@ -835,8 +835,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
group.AbsolutePosition = pos + veclist[i]; group.AbsolutePosition = pos + veclist[i];
} }
SceneObjectPart rootPart = group.RootPart;
group.SetGroup(remoteClient.ActiveGroupId, remoteClient); group.SetGroup(remoteClient.ActiveGroupId, remoteClient);
if (!attachment) if (!attachment)
@ -869,6 +867,50 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
rootPart.ObjectSaleType = 0; rootPart.ObjectSaleType = 0;
rootPart.SalePrice = 10; rootPart.SalePrice = 10;
if (m_Scene.Permissions.PropagatePermissions())
{
foreach (SceneObjectPart part in group.Parts)
{
if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
{
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
part.EveryoneMask = item.EveryOnePermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
part.NextOwnerMask = item.NextPermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
part.GroupMask = item.GroupPermissions;
}
}
foreach (SceneObjectPart part in group.Parts)
{
part.LastOwnerID = part.OwnerID;
part.OwnerID = item.Owner;
part.Inventory.ChangeInventoryOwner(item.Owner);
}
group.ApplyNextOwnerPermissions();
}
}
foreach (SceneObjectPart part in group.Parts)
{
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
part.EveryoneMask = item.EveryOnePermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
part.NextOwnerMask = item.NextPermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
part.GroupMask = item.GroupPermissions;
}
if ((rootPart.OwnerID != item.Owner) ||
(item.CurrentPermissions & 16) != 0 || // Magic number
(item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0)
{
//Need to kill the for sale here
rootPart.ObjectSaleType = 0;
rootPart.SalePrice = 10;
}
return group; return group;
} }
@ -1014,48 +1056,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
m_Scene.InventoryService.DeleteItems(item.Owner, uuids); m_Scene.InventoryService.DeleteItems(item.Owner, uuids);
} }
} }
}
if ((rootPart.OwnerID != item.Owner) ||
(item.CurrentPermissions & 16) != 0 || // Magic number
(item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0)
{
//Need to kill the for sale here
rootPart.ObjectSaleType = 0;
rootPart.SalePrice = 10;
if (m_Scene.Permissions.PropagatePermissions())
{
foreach (SceneObjectPart part in group.Parts)
{
if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0)
{
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
part.EveryoneMask = item.EveryOnePermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
part.NextOwnerMask = item.NextPermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
part.GroupMask = item.GroupPermissions;
}
}
foreach (SceneObjectPart part in group.Parts)
{
part.LastOwnerID = part.OwnerID;
part.OwnerID = item.Owner;
part.Inventory.ChangeInventoryOwner(item.Owner);
}
group.ApplyNextOwnerPermissions();
}
}
foreach (SceneObjectPart part in group.Parts)
{
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0)
part.EveryoneMask = item.EveryOnePermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0)
part.NextOwnerMask = item.NextPermissions;
if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0)
part.GroupMask = item.GroupPermissions;
} }
} }

View File

@ -987,6 +987,7 @@ namespace OpenSim.Region.Framework.Scenes
group.RemoveInventoryItem(localID, itemID); group.RemoveInventoryItem(localID, itemID);
part.GetProperties(remoteClient); part.GetProperties(remoteClient);
} }
}
private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId) private InventoryItemBase CreateAgentInventoryItemFromTask(UUID destAgent, SceneObjectPart part, UUID itemId)
{ {

View File

@ -5347,41 +5347,6 @@ namespace OpenSim.Region.Framework.Scenes
// } // }
// } // }
lock (m_cleaningAttachments)
{
ForEachSOG(delegate (SceneObjectGroup grp)
{
if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
{
UUID agentID = grp.OwnerID;
if (agentID == UUID.Zero)
{
objectsToDelete.Add(grp);
return;
}
ScenePresence sp = GetScenePresence(agentID);
if (sp == null)
{
objectsToDelete.Add(grp);
return;
}
}
});
}
if (objectsToDelete.Count > 0)
{
m_log.DebugFormat("[SCENE]: Starting delete of {0} dropped attachments", objectsToDelete.Count);
foreach (SceneObjectGroup grp in objectsToDelete)
{
m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
DeleteSceneObject(grp, true);
}
m_log.Debug("[SCENE]: Finished dropped attachment deletion");
}
}
public void ThreadAlive(int threadCode) public void ThreadAlive(int threadCode)
{ {
switch(threadCode) switch(threadCode)

View File

@ -1437,9 +1437,9 @@ namespace OpenSim.Region.Framework.Scenes
// Set the new attachment point data in the object // Set the new attachment point data in the object
byte attachmentPoint = group.GetAttachmentPoint(); byte attachmentPoint = group.GetAttachmentPoint();
group.UpdateGroupPosition(pos); group.UpdateGroupPosition(pos);
group.RootPart.IsAttachment = false; group.IsAttachment = false;
group.AbsolutePosition = group.RootPart.AttachedPos; group.AbsolutePosition = group.RootPart.AttachedPos;
group.SetAttachmentPoint(attachmentPoint); group.AttachmentPoint = attachmentPoint;
group.HasGroupChanged = true; group.HasGroupChanged = true;
} }
else else
@ -1730,7 +1730,6 @@ namespace OpenSim.Region.Framework.Scenes
childGroups.Add(child); childGroups.Add(child);
} }
} }
}
foreach (SceneObjectGroup child in childGroups) foreach (SceneObjectGroup child in childGroups)
{ {

View File

@ -350,10 +350,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
get { return m_rotation; } get { return m_rotation; }
set { set {
foreach(SceneObjectPart p in m_parts.GetArray())
{
p.StoreUndoState(UndoType.STATE_GROUP_ROTATION);
}
m_rotation = value; m_rotation = value;
} }
} }
@ -487,8 +483,6 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
foreach (SceneObjectPart part in parts) foreach (SceneObjectPart part in parts)
{ {
part.IgnoreUndoUpdate = false;
part.StoreUndoState(UndoType.STATE_GROUP_POSITION);
part.GroupPosition = val; part.GroupPosition = val;
if (!m_dupeInProgress) if (!m_dupeInProgress)
{ {
@ -1193,45 +1187,31 @@ namespace OpenSim.Region.Framework.Scenes
/// <param name="agentID"></param> /// <param name="agentID"></param>
/// <param name="attachmentpoint"></param> /// <param name="attachmentpoint"></param>
/// <param name="AttachOffset"></param> /// <param name="AttachOffset"></param>
public void AttachToAgent(UUID agentID, uint attachmentpoint, Vector3 AttachOffset, bool silent) private void AttachToAgent(
ScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent)
{ {
ScenePresence avatar = m_scene.GetScenePresence(agentID);
if (avatar != null) if (avatar != null)
{ {
// don't attach attachments to child agents // don't attach attachments to child agents
if (avatar.IsChildAgent) return; 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 // Remove from database and parcel prim count
m_scene.DeleteFromStorage(UUID); m_scene.DeleteFromStorage(so.UUID);
m_scene.EventManager.TriggerParcelPrimCountTainted(); m_scene.EventManager.TriggerParcelPrimCountTainted();
m_rootPart.AttachedAvatar = agentID; so.AttachedAvatar = avatar.UUID;
//Anakin Lohner bug #3839 if (so.RootPart.PhysActor != null)
lock (m_parts)
{ {
foreach (SceneObjectPart p in m_parts.GetArray()) m_scene.PhysicsScene.RemovePrim(so.RootPart.PhysActor);
{ so.RootPart.PhysActor = null;
p.AttachedAvatar = agentID;
}
} }
if (m_rootPart.PhysActor != null) so.AbsolutePosition = attachOffset;
{ so.RootPart.AttachedPos = attachOffset;
m_scene.PhysicsScene.RemovePrim(m_rootPart.PhysActor); so.IsAttachment = true;
m_rootPart.PhysActor = null; so.RootPart.SetParentLocalId(avatar.LocalId);
} so.AttachmentPoint = attachmentpoint;
AbsolutePosition = AttachOffset;
m_rootPart.AttachedPos = AttachOffset;
m_rootPart.IsAttachment = true;
m_rootPart.SetParentLocalId(avatar.LocalId);
SetAttachmentPoint(Convert.ToByte(attachmentpoint));
avatar.AddAttachment(this); avatar.AddAttachment(this);
@ -1254,7 +1234,7 @@ namespace OpenSim.Region.Framework.Scenes
{ {
m_log.WarnFormat( m_log.WarnFormat(
"[SOG]: Tried to add attachment {0} to avatar with UUID {1} in region {2} but the avatar is not present", "[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); UUID, avatar.ControllingClient.AgentId, Scene.RegionInfo.RegionName);
} }
} }
@ -1263,11 +1243,6 @@ namespace OpenSim.Region.Framework.Scenes
return m_rootPart.Shape.State; return m_rootPart.Shape.State;
} }
public void ClearPartAttachmentData()
{
SetAttachmentPoint((Byte)0);
}
public void DetachToGround() public void DetachToGround()
{ {
ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar); ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar);
@ -1855,7 +1830,7 @@ namespace OpenSim.Region.Framework.Scenes
dupe.UpdateParentIDs(); dupe.UpdateParentIDs();
dupe.HasGroupChanged = true; dupe.HasGroupChanged = true;
dupe.AttachToBackup(); dupe.AttachToBackup();
}
ScheduleGroupForFullUpdate(); ScheduleGroupForFullUpdate();
// Need to duplicate the physics actor as well // Need to duplicate the physics actor as well
if (part.PhysActor != null && userExposed) if (part.PhysActor != null && userExposed)
@ -3175,7 +3150,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
if (IsAttachment) if (IsAttachment)
{ {
m_rootPart.StoreUndoState(UndoType.STATE_GROUP_POSITION);
m_rootPart.AttachedPos = pos; m_rootPart.AttachedPos = pos;
} }
if (RootPart.GetStatusSandbox()) if (RootPart.GetStatusSandbox())
@ -3207,9 +3181,9 @@ namespace OpenSim.Region.Framework.Scenes
{ {
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
// SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
// for (int i = 0; i < parts.Length; i++) for (int i = 0; i < parts.Length; i++)
// parts[i].StoreUndoState(); parts[i].StoreUndoState();
if (part != null) if (part != null)
{ {
@ -3368,8 +3342,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
SceneObjectPart part = GetChildPart(localID); SceneObjectPart part = GetChildPart(localID);
SceneObjectPart[] parts = m_parts.GetArray(); SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
parts[i].StoreUndoState(UndoType.STATE_PRIM_ROTATION);
if (part != null) if (part != null)
{ {
@ -3440,14 +3412,7 @@ namespace OpenSim.Region.Framework.Scenes
Quaternion axRot = rot; Quaternion axRot = rot;
Quaternion oldParentRot = m_rootPart.RotationOffset; Quaternion oldParentRot = m_rootPart.RotationOffset;
m_rootPart.StoreUndoState();
m_rootPart.StoreUndoState(UndoType.STATE_PRIM_ROTATION);
bool cancelUndo = false;
if (!m_rootPart.Undoing)
{
m_rootPart.Undoing = true;
cancelUndo = true;
}
//Don't use UpdateRotation because it schedules an update prematurely //Don't use UpdateRotation because it schedules an update prematurely
m_rootPart.RotationOffset = rot; m_rootPart.RotationOffset = rot;

View File

@ -852,7 +852,7 @@ namespace OpenSim.Region.Framework.Scenes
set set
{ {
StoreUndoState(UndoType.STATE_PRIM_ROTATION); StoreUndoState();
m_rotationOffset = value; m_rotationOffset = value;
PhysicsActor actor = PhysActor; PhysicsActor actor = PhysActor;
@ -3590,7 +3590,8 @@ namespace OpenSim.Region.Framework.Scenes
m_parentGroup.ScheduleGroupForTerseUpdate(); m_parentGroup.ScheduleGroupForTerseUpdate();
//m_parentGroup.ScheduleGroupForFullUpdate(); //m_parentGroup.ScheduleGroupForFullUpdate();
} }
public void StoreUndoState(UndoType type)
public void StoreUndoState()
{ {
StoreUndoState(false); StoreUndoState(false);
} }
@ -3630,18 +3631,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
UndoState nUndo = new UndoState(this, forGroup); UndoState nUndo = new UndoState(this, forGroup);
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); m_undo.Push(nUndo);
if (m_redo.Count > 0) if (m_redo.Count > 0)
@ -3654,16 +3643,16 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
} }
// else // else
// { // {
// m_log.DebugFormat("[SCENE OBJECT PART]: Ignoring undo store for {0} {1}", Name, LocalId); // m_log.DebugFormat("[SCENE OBJECT PART]: Ignoring undo store for {0} {1}", Name, LocalId);
// } // }
} }
// else // else
// { // {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE OBJECT PART]: Ignoring undo store for {0} {1} since already undoing", Name, LocalId); // "[SCENE OBJECT PART]: Ignoring undo store for {0} {1} since already undoing", Name, LocalId);
// } // }
} }
/// <summary> /// <summary>

View File

@ -1361,12 +1361,15 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
/// <summary>
/// This is the event handler for client movement. If a client is moving, this event is triggering.
/// </summary>
/// <summary> /// <summary>
/// This is the event handler for client movement. If a client is moving, this event is triggering. /// This is the event handler for client movement. If a client is moving, this event is triggering.
/// </summary> /// </summary>
public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
{ {
// m_log.DebugFormat("[SCENE PRESENCE]: Received agent update from {0}", remoteClient.Name); // m_log.DebugFormat("[SCENE PRESENCE]: Received agent update from {0}", remoteClient.Name);
//if (m_isChildAgent) //if (m_isChildAgent)
//{ //{
@ -1389,7 +1392,6 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902"); m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
m_pos = m_LastFinitePos; m_pos = m_LastFinitePos;
if (!m_pos.IsFinite()) if (!m_pos.IsFinite())
{ {
m_pos.X = 127f; m_pos.X = 127f;
@ -1459,6 +1461,7 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback); m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
} }
} }
lock (scriptedcontrols) lock (scriptedcontrols)
{ {
if (scriptedcontrols.Count > 0) if (scriptedcontrols.Count > 0)
@ -1473,9 +1476,6 @@ namespace OpenSim.Region.Framework.Scenes
if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 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. // TODO: This doesn't prevent the user from walking yet.
// Setting parent ID would fix this, if we knew what value // Setting parent ID would fix this, if we knew what value
// to use. Or we could add a m_isSitting variable. // to use. Or we could add a m_isSitting variable.
@ -1530,20 +1530,6 @@ namespace OpenSim.Region.Framework.Scenes
if (actor.Flying != oldflying) if (actor.Flying != oldflying)
update_movementflag = true; update_movementflag = true;
if (m_animator.m_jumping) // add for jumping
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) if (m_parentID == 0)
{ {
bool bAllowUpdateMoveToPosition = false; bool bAllowUpdateMoveToPosition = false;
@ -1557,12 +1543,10 @@ namespace OpenSim.Region.Framework.Scenes
else else
dirVectors = Dir_Vectors; dirVectors = Dir_Vectors;
bool[] isNudge = GetDirectionIsNudge(); // The fact that m_movementflag is a byte needs to be fixed
// it really should be a uint
// A DIR_CONTROL_FLAG occurs when the user is trying to move in a particular direction.
uint nudgehack = 250;
foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS) foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
{ {
if (((uint)flags & (uint)DCF) != 0) if (((uint)flags & (uint)DCF) != 0)
@ -1572,30 +1556,43 @@ namespace OpenSim.Region.Framework.Scenes
try try
{ {
agent_control_v3 += dirVectors[i]; agent_control_v3 += dirVectors[i];
if (isNudge[i] == false) //m_log.DebugFormat("[Motion]: {0}, {1}",i, dirVectors[i]);
{
Nudging = false;
}
} }
catch (IndexOutOfRangeException) catch (IndexOutOfRangeException)
{ {
// Why did I get this? // Why did I get this?
} }
if ((m_movementflag & (uint)DCF) == 0) if ((m_movementflag & (byte)(uint)DCF) == 0)
{ {
if (DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACK_NUDGE)
{
m_movementflag |= (byte)nudgehack;
}
// m_log.DebugFormat("[SCENE PRESENCE]: Updating m_movementflag for {0} with {1}", Name, DCF); // m_log.DebugFormat("[SCENE PRESENCE]: Updating m_movementflag for {0} with {1}", Name, DCF);
m_movementflag += (byte)(uint)DCF; m_movementflag += (byte)(uint)DCF;
update_movementflag = true; update_movementflag = true;
} }
} }
else else
{ {
if ((m_movementflag & (uint)DCF) != 0) if ((m_movementflag & (byte)(uint)DCF) != 0 ||
((DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACK_NUDGE)
&& ((m_movementflag & (byte)nudgehack) == nudgehack))
) // This or is for Nudge forward
{ {
m_movementflag -= (byte)(uint)DCF; // m_log.DebugFormat("[SCENE PRESENCE]: Updating m_movementflag for {0} with lack of {1}", Name, DCF);
m_movementflag -= ((byte)(uint)DCF);
update_movementflag = true; update_movementflag = true;
/*
if ((DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD_NUDGE || DCF == Dir_ControlFlags.DIR_CONTROL_FLAG_BACKWARD_NUDGE)
&& ((m_movementflag & (byte)nudgehack) == nudgehack))
{
m_log.Debug("Removed Hack flag");
}
*/
} }
else else
{ {
@ -1605,129 +1602,20 @@ namespace OpenSim.Region.Framework.Scenes
i++; i++;
} }
if (MovingToTarget) if (MovingToTarget)
{ {
m_moveToPositionTarget = Vector3.Zero; // If the user has pressed a key then we want to cancel any move to target.
m_moveToPositionInProgress = false; if (DCFlagKeyPressed)
update_movementflag = true;
bAllowUpdateMoveToPosition = false;
}
if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
{
/*
bool twoD = false;
bool there = false;
if (Animator != null)
{
switch (Animator.CurrentMovementAnimation)
{
case "STAND":
case "WALK":
case "RUN":
case "CROUCH":
case "CROUCHWALK":
{
twoD = true;
}
break;
}
}
if (twoD)
{
*/
Vector3 abspos = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, 0.0f);
Vector3 tgt = new Vector3(m_moveToPositionTarget.X, m_moveToPositionTarget.Y, 0.0f);
/* if (Util.GetDistanceTo(abspos, tgt) <= 0.5f) there = true;
}
else
{
if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f) there = true;
}
*/
//Check the error term of the current position in relation to the target position
// if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 0.5f)
// if (there)
if (Util.GetDistanceTo(abspos, tgt) <= 0.5f)
{ {
ResetMoveToTarget(); ResetMoveToTarget();
update_movementflag = true; update_movementflag = true;
} }
else if (bAllowUpdateMoveToPosition) else if (bAllowUpdateMoveToPosition)
{ {
try if (HandleMoveToTargetUpdate(ref agent_control_v3))
{
// 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
(tgt - abspos)
* 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; 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());
}
}
} }
} }
@ -1759,31 +1647,26 @@ namespace OpenSim.Region.Framework.Scenes
// which occurs later in the main scene loop // which occurs later in the main scene loop
if (update_movementflag || (update_rotation && DCFlagKeyPressed)) if (update_movementflag || (update_rotation && DCFlagKeyPressed))
{ {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, ur = {4}", // "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, ur = {4}",
// m_scene.RegionInfo.RegionName, agent_control_v3, Name, update_movementflag, update_rotation); // m_scene.RegionInfo.RegionName, agent_control_v3, Name, update_movementflag, update_rotation);
AddNewMovement(agent_control_v3, q, Nudging);
AddNewMovement(agent_control_v3);
} }
// else // else
// { // {
// if (!update_movementflag) // if (!update_movementflag)
// { // {
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE PRESENCE]: In {0} ignoring requested update of {1} for {2} as update_movementflag = false", // "[SCENE PRESENCE]: In {0} ignoring requested update of {1} for {2} as update_movementflag = false",
// m_scene.RegionInfo.RegionName, agent_control_v3, Name); // m_scene.RegionInfo.RegionName, agent_control_v3, Name);
// } // }
// } // }
if (update_movementflag && m_parentID == 0) if (update_movementflag && m_parentID == 0)
Animator.UpdateMovementAnimations(); Animator.UpdateMovementAnimations();
} }
if (update_movementflag && !SitGround)
Animator.UpdateMovementAnimations();
m_scene.EventManager.TriggerOnClientMovement(this); m_scene.EventManager.TriggerOnClientMovement(this);
m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
@ -1799,24 +1682,20 @@ namespace OpenSim.Region.Framework.Scenes
/// <returns>True if movement has been updated in some way. False otherwise.</returns> /// <returns>True if movement has been updated in some way. False otherwise.</returns>
public bool HandleMoveToTargetUpdate(ref Vector3 agent_control_v3) public bool HandleMoveToTargetUpdate(ref Vector3 agent_control_v3)
{ {
// m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name); // m_log.DebugFormat("[SCENE PRESENCE]: Called HandleMoveToTargetUpdate() for {0}", Name);
bool updated = false; bool updated = false;
public void StopMoveToPosition() // m_log.DebugFormat(
{ // "[SCENE PRESENCE]: bAllowUpdateMoveToPosition {0}, m_moveToPositionInProgress {1}, m_autopilotMoving {2}",
m_moveToPositionTarget = Vector3.Zero; // allowUpdate, m_moveToPositionInProgress, m_autopilotMoving);
m_moveToPositionInProgress = false;
}
public void DoMoveToPosition(Object sender, string method, List<String> args) if (!m_autopilotMoving)
{
//Console.WriteLine("SP:DoMoveToPosition");
try
{ {
double distanceToTarget = Util.GetDistanceTo(AbsolutePosition, MoveToPositionTarget); double distanceToTarget = Util.GetDistanceTo(AbsolutePosition, MoveToPositionTarget);
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}", // "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}",
// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget); // Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget);
// Check the error term of the current position in relation to the target position // Check the error term of the current position in relation to the target position
if (distanceToTarget <= 1) if (distanceToTarget <= 1)
@ -1839,7 +1718,7 @@ namespace OpenSim.Region.Framework.Scenes
(MoveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords (MoveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
* Matrix4.CreateFromQuaternion(Quaternion.Inverse(Rotation)); // change to avatar coords * Matrix4.CreateFromQuaternion(Quaternion.Inverse(Rotation)); // change to avatar coords
// Ignore z component of vector // Ignore z component of vector
// Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f); // Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
LocalVectorToTarget3D.Normalize(); LocalVectorToTarget3D.Normalize();
// update avatar movement flags. the avatar coordinate system is as follows: // update avatar movement flags. the avatar coordinate system is as follows:
@ -1905,9 +1784,9 @@ namespace OpenSim.Region.Framework.Scenes
updated = true; updated = true;
} }
// m_log.DebugFormat( // m_log.DebugFormat(
// "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}", // "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}",
// LocalVectorToTarget3D, agent_control_v3, Name); // LocalVectorToTarget3D, agent_control_v3, Name);
agent_control_v3 += LocalVectorToTarget3D; agent_control_v3 += LocalVectorToTarget3D;
} }
@ -2746,41 +2625,21 @@ namespace OpenSim.Region.Framework.Scenes
/// Rotate the avatar to the given rotation and apply a movement in the given relative vector /// Rotate the avatar to the given rotation and apply a movement in the given relative vector
/// </summary> /// </summary>
/// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param>
/// <param name="rotation">The direction in which this avatar should now face. public void AddNewMovement(Vector3 vec)
public void AddNewMovement(Vector3 vec, Quaternion rotation, bool Nudging)
{ {
if (m_isChildAgent)
{
// WHAT???
m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent");
return;
}
m_perfMonMS = Util.EnvironmentTickCount(); m_perfMonMS = Util.EnvironmentTickCount();
Vector3 direc = vec * Rotation; Vector3 direc = vec * Rotation;
direc.Normalize(); direc.Normalize();
PhysicsActor actor = m_physicsActor;
if (actor.Flying != m_flyingOld) // add for fly velocity control
{
m_flyingOld = actor.Flying; // add for fly velocity control
if (!actor.Flying) m_wasFlying = true; // add for fly velocity control
}
if (m_physicsActor.IsColliding == true) m_wasFlying = false; // add for fly velocity control
if ((vec.Z == 0f) && !actor.Flying) direc.Z = 0f; // Prevent camera WASD up.
direc *= 0.03f * 128f * m_speedModifier; direc *= 0.03f * 128f * m_speedModifier;
PhysicsActor actor = m_physicsActor;
if (actor != null) if (actor != null)
{ {
if (actor.Flying) if (actor.Flying)
{ {
// rm speed mod direc *= 4.0f; direc *= 4.0f;
direc *= 5.2f; // for speed mod
//bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
//bool colliding = (m_physicsActor.IsColliding==true); //bool colliding = (m_physicsActor.IsColliding==true);
//if (controlland) //if (controlland)
@ -2793,34 +2652,22 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.Info("[AGENT]: Stop FLying"); // m_log.Info("[AGENT]: Stop FLying");
//} //}
} }
if (Animator.m_falling && m_wasFlying) // if falling from flying, disable motion add
{
direc *= 0.0f;
}
/* This jumping section removed to SPA
else if (!actor.Flying && actor.IsColliding) else if (!actor.Flying && actor.IsColliding)
{ {
if (direc.Z > 2.0f) if (direc.Z > 2.0f)
{ {
if(m_animator.m_animTickJump == -1) direc.Z *= 3.0f;
{
direc.Z *= 3.0f; // jump // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
}
else
{
direc.Z *= 0.1f; // prejump
}
/ * Animations are controlled via GetMovementAnimation() in ScenePresenceAnimator.cs
Animator.TrySetMovementAnimation("PREJUMP"); Animator.TrySetMovementAnimation("PREJUMP");
Animator.TrySetMovementAnimation("JUMP"); Animator.TrySetMovementAnimation("JUMP");
* /
} }
} */ }
} }
// TODO: Add the force instead of only setting it to support multiple forces per frame? // TODO: Add the force instead of only setting it to support multiple forces per frame?
m_forceToApply = direc; m_forceToApply = direc;
m_isNudging = Nudging;
m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS)); m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
} }
@ -3961,7 +3808,7 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
{ {
StartCollidingMessage.Colliders = colliding; StartCollidingMessage.Colliders = colliding;
foreach (SceneObjectGroup att in Attachments) foreach (SceneObjectGroup att in GetAttachments())
Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage); Scene.EventManager.TriggerScriptCollidingStart(att.LocalId, StartCollidingMessage);
} }
} }
@ -3996,7 +3843,7 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
{ {
EndCollidingMessage.Colliders = colliding; EndCollidingMessage.Colliders = colliding;
foreach (SceneObjectGroup att in Attachments) foreach (SceneObjectGroup att in GetAttachments())
Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage); Scene.EventManager.TriggerScriptCollidingEnd(att.LocalId, EndCollidingMessage);
} }
} }
@ -4517,7 +4364,7 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
List<AvatarAttachment> attachments = m_appearance.GetAttachments(); List<AvatarAttachment> attachments = m_appearance.GetAttachments();
foreach (AvatarAttachment attach in attachments) foreach (AvatarAttachment attach in attachments)
{ {
if (m_isDeleted) if (IsDeleted)
return; return;
int p = attach.AttachPoint; int p = attach.AttachPoint;
@ -4603,7 +4450,7 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
public void SaveChangedAttachments() public void SaveChangedAttachments()
{ {
// Need to copy this list because DetachToInventoryPrep mods it // Need to copy this list because DetachToInventoryPrep mods it
List<SceneObjectGroup> attachments = new List<SceneObjectGroup>(Attachments.ToArray()); List<SceneObjectGroup> attachments = new List<SceneObjectGroup>(GetAttachments().ToArray());
IAttachmentsModule attachmentsModule = m_scene.AttachmentsModule; IAttachmentsModule attachmentsModule = m_scene.AttachmentsModule;
if (attachmentsModule != null) if (attachmentsModule != null)
@ -4612,12 +4459,12 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
{ {
if (grp.HasGroupChanged) // Resizer scripts? if (grp.HasGroupChanged) // Resizer scripts?
{ {
grp.RootPart.IsAttachment = false; grp.IsAttachment = false;
grp.AbsolutePosition = grp.RootPart.AttachedPos; grp.AbsolutePosition = grp.RootPart.AttachedPos;
// grp.DetachToInventoryPrep(); // grp.DetachToInventoryPrep();
attachmentsModule.UpdateKnownItem(ControllingClient, attachmentsModule.UpdateKnownItem(ControllingClient,
grp, grp.GetFromItemID(), grp.OwnerID); grp, grp.GetFromItemID(), grp.OwnerID);
grp.RootPart.IsAttachment = true; grp.IsAttachment = true;
} }
} }
} }

View File

@ -2166,8 +2166,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
UUID x = module.CreateNPC(firstname, UUID x = module.CreateNPC(firstname,
lastname, lastname,
new Vector3((float) position.x, (float) position.y, (float) position.z), new Vector3((float) position.x, (float) position.y, (float) position.z),
World, World,appearance);
appearance);
return new LSL_Key(x.ToString()); return new LSL_Key(x.ToString());
} }