Merge fixes, and fix the build
parent
03f6734f43
commit
cda4cd6b55
|
@ -312,17 +312,13 @@ namespace Flotsam.RegionModules.AssetCache
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
|
||||||
LogException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
{
|
||||||
m_log.ErrorFormat(
|
m_log.ErrorFormat(
|
||||||
"[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}",
|
"[FLOTSAM ASSET CACHE]: Failed to update cache for asset {0}. Exception {1} {2}",
|
||||||
asset.ID, e.Message, e.StackTrace);
|
asset.ID, e.Message, e.StackTrace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Cache(AssetBase asset)
|
public void Cache(AssetBase asset)
|
||||||
{
|
{
|
||||||
|
|
|
@ -131,7 +131,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
// If we're an NPC then skip all the item checks and manipulations since we don't have an
|
// If we're an NPC then skip all the item checks and manipulations since we don't have an
|
||||||
// inventory right now.
|
// inventory right now.
|
||||||
if (sp.PresenceType == PresenceType.Npc)
|
if (sp.PresenceType == PresenceType.Npc)
|
||||||
RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p);
|
RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null);
|
||||||
else
|
else
|
||||||
RezSingleAttachmentFromInventory(sp.ControllingClient, attach.ItemID, p);
|
RezSingleAttachmentFromInventory(sp.ControllingClient, attach.ItemID, p);
|
||||||
}
|
}
|
||||||
|
@ -343,17 +343,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true, null);
|
return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public UUID RezSingleAttachmentFromInventory(
|
public ISceneEntity RezSingleAttachmentFromInventory(
|
||||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc)
|
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc)
|
||||||
ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
|
ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
|
||||||
if (sp == null) { m_log.ErrorFormat( "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezSingleAttachmentFromInventory()", remoteClient.Name, remoteClient.AgentId); return null; }
|
if (sp == null) { m_log.ErrorFormat( "[ATTACHMENTS MODULE]: Could not find presence for client {0} {1} in RezSingleAttachmentFromInventory()", remoteClient.Name, remoteClient.AgentId); return null; }
|
||||||
// TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
|
// TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
|
||||||
// be removed when that functionality is implemented in opensim
|
// be removed when that functionality is implemented in opensim
|
||||||
AttachmentPt &= 0x7f;
|
AttachmentPt &= 0x7f;
|
||||||
|
|
||||||
SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(remoteClient, itemID, AttachmentPt, doc);
|
SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, doc);
|
||||||
|
|
||||||
if (updateInventoryStatus)
|
if (updateInventoryStatus)
|
||||||
{
|
{
|
||||||
|
@ -367,7 +366,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
}
|
}
|
||||||
|
|
||||||
protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
|
protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
|
||||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, XmlDocument doc)
|
IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc)
|
||||||
{
|
{
|
||||||
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
|
||||||
if (invAccess != null)
|
if (invAccess != null)
|
||||||
|
@ -462,9 +461,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
if (!att.IsDeleted)
|
if (!att.IsDeleted)
|
||||||
attachmentPoint = att.AttachmentPoint;
|
attachmentPoint = att.AttachmentPoint;
|
||||||
|
|
||||||
ScenePresence presence;
|
|
||||||
if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence))
|
|
||||||
{
|
|
||||||
InventoryItemBase item = new InventoryItemBase(itemID, sp.UUID);
|
InventoryItemBase item = new InventoryItemBase(itemID, sp.UUID);
|
||||||
if (m_scene.InventoryService != null)
|
if (m_scene.InventoryService != null)
|
||||||
item = m_scene.InventoryService.GetItem(item);
|
item = m_scene.InventoryService.GetItem(item);
|
||||||
|
|
|
@ -96,6 +96,8 @@ namespace OpenSim.Region.CoreModules.World.Land
|
||||||
|
|
||||||
// caches ExtendedLandData
|
// caches ExtendedLandData
|
||||||
private Cache parcelInfoCache;
|
private Cache parcelInfoCache;
|
||||||
|
private Dictionary<UUID, Vector3> forcedPosition =
|
||||||
|
new Dictionary<UUID, Vector3>();
|
||||||
|
|
||||||
#region INonSharedRegionModule Members
|
#region INonSharedRegionModule Members
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus);
|
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus);
|
||||||
|
|
||||||
// Same as above, but also load script states from a separate doc
|
// Same as above, but also load script states from a separate doc
|
||||||
UUID RezSingleAttachmentFromInventory(
|
ISceneEntity RezSingleAttachmentFromInventory(
|
||||||
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc);
|
IClientAPI remoteClient, UUID itemID, uint AttachmentPt, bool updateInventoryStatus, XmlDocument doc);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -2695,9 +2695,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
EventManager.TriggerOnClientLogin(client);
|
EventManager.TriggerOnClientLogin(client);
|
||||||
|
|
||||||
// Send initial parcel data
|
// Send initial parcel data
|
||||||
Vector3 pos = presence.AbsolutePosition;
|
Vector3 pos = createdSp.AbsolutePosition;
|
||||||
ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
|
ILandObject land = LandChannel.GetLandObject(pos.X, pos.Y);
|
||||||
land.SendLandUpdateToClient(presence.ControllingClient);
|
land.SendLandUpdateToClient(client);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3500,7 +3500,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// check if banned regions are to be blacked out.
|
// check if banned regions are to be blacked out.
|
||||||
if (vialogin || (!m_seeIntoBannedRegion))
|
if (vialogin || (!m_seeIntoBannedRegion))
|
||||||
{
|
{
|
||||||
if (!AuthorizeUser(agent.AgentID, out reason))
|
if (!AuthorizeUser(agent, out reason))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3696,20 +3696,20 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <param name="reason">outputs the reason to this string</param>
|
/// <param name="reason">outputs the reason to this string</param>
|
||||||
/// <returns>True if the region accepts this agent. False if it does not. False will
|
/// <returns>True if the region accepts this agent. False if it does not. False will
|
||||||
/// also return a reason.</returns>
|
/// also return a reason.</returns>
|
||||||
protected virtual bool AuthorizeUser(UUID agentID, out string reason)
|
protected virtual bool AuthorizeUser(AgentCircuitData agent, out string reason)
|
||||||
{
|
{
|
||||||
reason = String.Empty;
|
reason = String.Empty;
|
||||||
|
|
||||||
if (!m_strictAccessControl) return true;
|
if (!m_strictAccessControl) return true;
|
||||||
if (Permissions.IsGod(agentID)) return true;
|
if (Permissions.IsGod(agent.AgentID)) return true;
|
||||||
|
|
||||||
if (AuthorizationService != null)
|
if (AuthorizationService != null)
|
||||||
{
|
{
|
||||||
if (!AuthorizationService.IsAuthorizedForRegion(
|
if (!AuthorizationService.IsAuthorizedForRegion(
|
||||||
agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason))
|
agent.AgentID.ToString(), agent.firstname, agent.lastname, RegionInfo.RegionID.ToString(), out reason))
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the user does not have access to the region",
|
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the region",
|
||||||
agentID, RegionInfo.RegionName);
|
agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -3717,26 +3717,10 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (m_regInfo.EstateSettings != null)
|
if (m_regInfo.EstateSettings != null)
|
||||||
{
|
{
|
||||||
int flags = GetUserFlags(agentID);
|
if (m_regInfo.EstateSettings.IsBanned(agent.AgentID,0))
|
||||||
if (m_regInfo.EstateSettings.IsBanned(agentID, flags))
|
|
||||||
{
|
{
|
||||||
//Add some more info to help users
|
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
|
||||||
if (!m_regInfo.EstateSettings.IsBanned(agentID, 32))
|
agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
|
||||||
{
|
|
||||||
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the region requires age verification",
|
|
||||||
agentID, RegionInfo.RegionName);
|
|
||||||
reason = String.Format("Denied access to region {0}: Region requires age verification", RegionInfo.RegionName);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (!m_regInfo.EstateSettings.IsBanned(agentID, 4))
|
|
||||||
{
|
|
||||||
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} {1} because the region requires payment info on file",
|
|
||||||
agentID, RegionInfo.RegionName);
|
|
||||||
reason = String.Format("Denied access to region {0}: Region requires payment info on file", RegionInfo.RegionName);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {3} because the user is on the banlist",
|
|
||||||
agentID, RegionInfo.RegionName);
|
|
||||||
reason = String.Format("Denied access to region {0}: You have been banned from that region.",
|
reason = String.Format("Denied access to region {0}: You have been banned from that region.",
|
||||||
RegionInfo.RegionName);
|
RegionInfo.RegionName);
|
||||||
return false;
|
return false;
|
||||||
|
@ -3753,7 +3737,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (groupsModule != null)
|
if (groupsModule != null)
|
||||||
{
|
{
|
||||||
GroupMembershipData[] GroupMembership =
|
GroupMembershipData[] GroupMembership =
|
||||||
groupsModule.GetMembershipData(agentID);
|
groupsModule.GetMembershipData(agent.AgentID);
|
||||||
|
|
||||||
if (GroupMembership != null)
|
if (GroupMembership != null)
|
||||||
{
|
{
|
||||||
|
@ -3782,16 +3766,44 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!");
|
m_log.ErrorFormat("[CONNECTION BEGIN]: EstateGroups is null!");
|
||||||
|
|
||||||
if (!m_regInfo.EstateSettings.PublicAccess &&
|
if (!m_regInfo.EstateSettings.PublicAccess &&
|
||||||
!m_regInfo.EstateSettings.HasAccess(agentID) &&
|
!m_regInfo.EstateSettings.HasAccess(agent.AgentID) &&
|
||||||
!groupAccess)
|
!groupAccess)
|
||||||
{
|
{
|
||||||
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} at {1} because the user does not have access to the estate",
|
m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the estate",
|
||||||
agentID, RegionInfo.RegionName);
|
agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
|
||||||
reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
|
reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
|
||||||
RegionInfo.RegionName);
|
RegionInfo.RegionName);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: estate/region settings are not properly hooked up
|
||||||
|
// to ILandObject.isRestrictedFromLand()
|
||||||
|
// if (null != LandChannel)
|
||||||
|
// {
|
||||||
|
// // region seems to have local Id of 1
|
||||||
|
// ILandObject land = LandChannel.GetLandObject(1);
|
||||||
|
// if (null != land)
|
||||||
|
// {
|
||||||
|
// if (land.isBannedFromLand(agent.AgentID))
|
||||||
|
// {
|
||||||
|
// m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user has been banned from land",
|
||||||
|
// agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
|
||||||
|
// reason = String.Format("Denied access to private region {0}: You are banned from that region.",
|
||||||
|
// RegionInfo.RegionName);
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if (land.isRestrictedFromLand(agent.AgentID))
|
||||||
|
// {
|
||||||
|
// m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user does not have access to the region",
|
||||||
|
// agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
|
||||||
|
// reason = String.Format("Denied access to private region {0}: You are not on the access list for that region.",
|
||||||
|
// RegionInfo.RegionName);
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5387,11 +5399,18 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!AuthorizeUser(agentID, out reason))
|
try
|
||||||
|
{
|
||||||
|
if (!AuthorizeUser(GetScenePresence(agentID).ControllingClient.RequestClientInfo(), out reason))
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
|
// m_log.DebugFormat("[SCENE]: Denying access for {0}", agentID);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (position == Vector3.Zero) // Teleport
|
if (position == Vector3.Zero) // Teleport
|
||||||
{
|
{
|
||||||
|
|
|
@ -1245,7 +1245,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public void DetachToGround()
|
public void DetachToGround()
|
||||||
{
|
{
|
||||||
ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar);
|
ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
|
||||||
if (avatar == null)
|
if (avatar == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1259,14 +1259,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
RootPart.FromItemID = UUID.Zero;
|
RootPart.FromItemID = UUID.Zero;
|
||||||
|
|
||||||
AbsolutePosition = detachedpos;
|
AbsolutePosition = detachedpos;
|
||||||
m_rootPart.AttachedAvatar = UUID.Zero;
|
AttachedAvatar = UUID.Zero;
|
||||||
|
|
||||||
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].AttachedAvatar = UUID.Zero;
|
// parts[i].AttachedAvatar = UUID.Zero;
|
||||||
|
|
||||||
m_rootPart.SetParentLocalId(0);
|
m_rootPart.SetParentLocalId(0);
|
||||||
SetAttachmentPoint((byte)0);
|
AttachmentPoint = (byte)0;
|
||||||
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_scene.m_physicalPrim);
|
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_scene.m_physicalPrim);
|
||||||
HasGroupChanged = true;
|
HasGroupChanged = true;
|
||||||
RootPart.Rezzed = DateTime.Now;
|
RootPart.Rezzed = DateTime.Now;
|
||||||
|
@ -1279,7 +1279,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public void DetachToInventoryPrep()
|
public void DetachToInventoryPrep()
|
||||||
{
|
{
|
||||||
ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar);
|
ScenePresence avatar = m_scene.GetScenePresence(AttachedAvatar);
|
||||||
//Vector3 detachedpos = new Vector3(127f, 127f, 127f);
|
//Vector3 detachedpos = new Vector3(127f, 127f, 127f);
|
||||||
if (avatar != null)
|
if (avatar != null)
|
||||||
{
|
{
|
||||||
|
@ -1287,15 +1287,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
avatar.RemoveAttachment(this);
|
avatar.RemoveAttachment(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_rootPart.AttachedAvatar = UUID.Zero;
|
AttachedAvatar = UUID.Zero;
|
||||||
|
|
||||||
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].AttachedAvatar = UUID.Zero;
|
parts[i].AttachedAvatar = UUID.Zero;*/
|
||||||
|
|
||||||
m_rootPart.SetParentLocalId(0);
|
m_rootPart.SetParentLocalId(0);
|
||||||
//m_rootPart.SetAttachmentPoint((byte)0);
|
//m_rootPart.SetAttachmentPoint((byte)0);
|
||||||
m_rootPart.IsAttachment = false;
|
IsAttachment = false;
|
||||||
AbsolutePosition = m_rootPart.AttachedPos;
|
AbsolutePosition = m_rootPart.AttachedPos;
|
||||||
//m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
|
//m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
|
||||||
//AttachToBackup();
|
//AttachToBackup();
|
||||||
|
@ -1471,7 +1471,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public void DeleteGroupFromScene(bool silent)
|
public void DeleteGroupFromScene(bool silent)
|
||||||
{
|
{
|
||||||
// We need to keep track of this state in case this group is still queued for backup.
|
// We need to keep track of this state in case this group is still queued for backup.
|
||||||
m_isDeleted = true;
|
IsDeleted = true;
|
||||||
|
|
||||||
DetachFromBackup();
|
DetachFromBackup();
|
||||||
|
|
||||||
|
@ -1746,11 +1746,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public SceneObjectGroup Copy(bool userExposed)
|
public SceneObjectGroup Copy(bool userExposed)
|
||||||
{
|
{
|
||||||
SceneObjectGroup dupe;
|
SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone();
|
||||||
try
|
|
||||||
{
|
|
||||||
m_dupeInProgress = true;
|
|
||||||
dupe = (SceneObjectGroup)MemberwiseClone();
|
|
||||||
dupe.m_isBackedUp = false;
|
dupe.m_isBackedUp = false;
|
||||||
dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
|
dupe.m_parts = new MapAndArray<OpenMetaverse.UUID, SceneObjectPart>();
|
||||||
|
|
||||||
|
@ -1768,20 +1764,13 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (!userExposed)
|
if (!userExposed)
|
||||||
dupe.IsAttachment = true;
|
dupe.IsAttachment = true;
|
||||||
|
|
||||||
if (!userExposed)
|
|
||||||
dupe.RootPart.IsAttachment = true;
|
|
||||||
|
|
||||||
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
|
dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z);
|
||||||
|
|
||||||
if (!userExposed)
|
if (!userExposed)
|
||||||
{
|
{
|
||||||
dupe.IsAttachment = previousAttachmentStatus;
|
dupe.IsAttachment = previousAttachmentStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!userExposed)
|
|
||||||
{
|
|
||||||
dupe.RootPart.IsAttachment = previousAttachmentStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
|
dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed);
|
||||||
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
|
dupe.m_rootPart.LinkNum = m_rootPart.LinkNum;
|
||||||
|
|
||||||
|
@ -1798,40 +1787,17 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
foreach (SceneObjectPart part in partList)
|
foreach (SceneObjectPart part in partList)
|
||||||
{
|
{
|
||||||
|
SceneObjectPart newPart;
|
||||||
if (part.UUID != m_rootPart.UUID)
|
if (part.UUID != m_rootPart.UUID)
|
||||||
{
|
{
|
||||||
SceneObjectPart newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
|
newPart = dupe.CopyPart(part, OwnerID, GroupID, userExposed);
|
||||||
|
|
||||||
newPart.LinkNum = part.LinkNum;
|
newPart.LinkNum = part.LinkNum;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// Need to duplicate the physics actor as well
|
|
||||||
if (part.PhysActor != null && userExposed)
|
|
||||||
{
|
{
|
||||||
PrimitiveBaseShape pbs = part.Shape;
|
newPart = dupe.m_rootPart;
|
||||||
|
}
|
||||||
|
|
||||||
part.PhysActor
|
|
||||||
= m_scene.PhysicsScene.AddPrimShape(
|
|
||||||
string.Format("{0}/{1}", part.Name, part.UUID),
|
|
||||||
pbs,
|
|
||||||
part.AbsolutePosition,
|
|
||||||
part.Scale,
|
|
||||||
part.RotationOffset,
|
|
||||||
part.PhysActor.IsPhysical,
|
|
||||||
m_localId);
|
|
||||||
part.PhysActor.SetMaterial((int)part.Material);
|
|
||||||
|
|
||||||
part.PhysActor.LocalID = part.LocalId;
|
|
||||||
part.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (userExposed)
|
|
||||||
{
|
|
||||||
dupe.UpdateParentIDs();
|
|
||||||
dupe.HasGroupChanged = true;
|
|
||||||
dupe.AttachToBackup();
|
|
||||||
}
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -1850,10 +1816,16 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
|
newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
|
||||||
|
if (userExposed)
|
||||||
{
|
{
|
||||||
m_dupeInProgress = false;
|
dupe.UpdateParentIDs();
|
||||||
|
dupe.HasGroupChanged = true;
|
||||||
|
dupe.AttachToBackup();
|
||||||
|
|
||||||
|
ScheduleGroupForFullUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
return dupe;
|
return dupe;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1983,22 +1955,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public void stopMoveToTarget()
|
public void stopMoveToTarget()
|
||||||
{
|
{
|
||||||
SceneObjectPart rootpart = m_rootPart;
|
if (RootPart.PhysActor != null)
|
||||||
if (rootpart != null)
|
RootPart.PhysActor.PIDActive = false;
|
||||||
{
|
|
||||||
if (IsAttachment)
|
|
||||||
{
|
|
||||||
ScenePresence avatar = m_scene.GetScenePresence(rootpart.AttachedAvatar);
|
|
||||||
if (avatar != null) avatar.StopMoveToPosition();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (rootpart.PhysActor != null)
|
|
||||||
{
|
|
||||||
rootpart.PhysActor.PIDActive = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void rotLookAt(Quaternion target, float strength, float damping)
|
public void rotLookAt(Quaternion target, float strength, float damping)
|
||||||
|
@ -3087,8 +3045,6 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
prevScale.X *= x;
|
prevScale.X *= x;
|
||||||
prevScale.Y *= y;
|
prevScale.Y *= y;
|
||||||
prevScale.Z *= z;
|
prevScale.Z *= z;
|
||||||
part.IgnoreUndoUpdate = false;
|
|
||||||
|
|
||||||
// RootPart.IgnoreUndoUpdate = true;
|
// RootPart.IgnoreUndoUpdate = true;
|
||||||
RootPart.Resize(prevScale);
|
RootPart.Resize(prevScale);
|
||||||
// RootPart.IgnoreUndoUpdate = false;
|
// RootPart.IgnoreUndoUpdate = false;
|
||||||
|
|
|
@ -3243,6 +3243,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
STATUS_ROTATE_Z = rotate;
|
STATUS_ROTATE_Z = rotate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetBuoyancy(float fvalue)
|
||||||
|
{
|
||||||
|
if (PhysActor != null)
|
||||||
|
{
|
||||||
|
PhysActor.Buoyancy = fvalue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SetDieAtEdge(bool p)
|
public void SetDieAtEdge(bool p)
|
||||||
{
|
{
|
||||||
if (m_parentGroup.IsDeleted)
|
if (m_parentGroup.IsDeleted)
|
||||||
|
|
|
@ -131,6 +131,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
// private SceneObjectGroup proxyObjectGroup;
|
// private SceneObjectGroup proxyObjectGroup;
|
||||||
//private SceneObjectPart proxyObjectPart = null;
|
//private SceneObjectPart proxyObjectPart = null;
|
||||||
public Vector3 lastKnownAllowedPosition;
|
public Vector3 lastKnownAllowedPosition;
|
||||||
|
public bool sentMessageAboutRestrictedParcelFlyingDown;
|
||||||
public Vector4 CollisionPlane = Vector4.UnitW;
|
public Vector4 CollisionPlane = Vector4.UnitW;
|
||||||
|
|
||||||
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
|
private Vector3 m_avInitialPos; // used to calculate unscripted sit rotation
|
||||||
|
@ -4316,103 +4317,6 @@ if (m_animator.m_jumping) force.Z = m_animator.m_jumpVelocity; // add for ju
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// RezAttachments. This should only be called upon login on the first region.
|
|
||||||
/// Attachment rezzings on crossings and TPs are done in a different way.
|
|
||||||
/// </summary>
|
|
||||||
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<IAttachmentsService>();
|
|
||||||
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<UUID, string> itemData = new Dictionary<UUID, string>();
|
|
||||||
|
|
||||||
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<AvatarAttachment> attachments = m_appearance.GetAttachments();
|
|
||||||
foreach (AvatarAttachment attach in attachments)
|
|
||||||
{
|
|
||||||
if (IsDeleted)
|
|
||||||
return;
|
|
||||||
|
|
||||||
int p = attach.AttachPoint;
|
|
||||||
UUID itemID = attach.ItemID;
|
|
||||||
|
|
||||||
//UUID assetID = attach.AssetID;
|
|
||||||
// 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}",
|
|
||||||
p, itemID, asset);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
m_log.ErrorFormat("[ATTACHMENT]: Unable to rez attachment: {0}{1}", e.Message, e.StackTrace);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ReprioritizeUpdates()
|
private void ReprioritizeUpdates()
|
||||||
{
|
{
|
||||||
if (Scene.IsReprioritizationEnabled && Scene.UpdatePrioritizationScheme != UpdatePrioritizationSchemes.Time)
|
if (Scene.IsReprioritizationEnabled && Scene.UpdatePrioritizationScheme != UpdatePrioritizationSchemes.Time)
|
||||||
|
|
|
@ -50,16 +50,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public class UndoState
|
public class UndoState
|
||||||
{
|
{
|
||||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
public Vector3 Position = Vector3.Zero;
|
public Vector3 Position = Vector3.Zero;
|
||||||
public Vector3 Scale = Vector3.Zero;
|
public Vector3 Scale = Vector3.Zero;
|
||||||
public Quaternion Rotation = Quaternion.Identity;
|
public Quaternion Rotation = Quaternion.Identity;
|
||||||
public Vector3 GroupPosition = Vector3.Zero;
|
|
||||||
public Quaternion GroupRotation = Quaternion.Identity;
|
|
||||||
public Vector3 GroupScale = Vector3.Zero;
|
|
||||||
public DateTime LastUpdated = DateTime.Now;
|
|
||||||
public UndoType Type;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Is this undo state for an entire group?
|
/// Is this undo state for an entire group?
|
||||||
|
@ -77,88 +72,40 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
ForGroup = forGroup;
|
ForGroup = forGroup;
|
||||||
|
|
||||||
// if (ForGroup)
|
// if (ForGroup)
|
||||||
GroupScale = part.ParentGroup.RootPart.Shape.Scale;
|
Position = part.ParentGroup.AbsolutePosition;
|
||||||
|
// else
|
||||||
|
// Position = part.OffsetPosition;
|
||||||
|
|
||||||
//FUBAR WARNING: Do NOT get the group's absoluteposition here
|
// m_log.DebugFormat(
|
||||||
//or you'll experience a loop and/or a stack issue
|
// "[UNDO STATE]: Storing undo position {0} for root part", Position);
|
||||||
GroupPosition = part.ParentGroup.RootPart.AbsolutePosition;
|
|
||||||
GroupRotation = part.ParentGroup.GroupRotation;
|
|
||||||
Position = part.ParentGroup.RootPart.AbsolutePosition;
|
|
||||||
// else
|
|
||||||
// Position = part.OffsetPosition;
|
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
|
||||||
// "[UNDO STATE]: Storing undo position {0} for root part", Position);
|
|
||||||
|
|
||||||
Rotation = part.RotationOffset;
|
Rotation = part.RotationOffset;
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Storing undo rotation {0} for root part", Rotation);
|
// "[UNDO STATE]: Storing undo rotation {0} for root part", Rotation);
|
||||||
|
|
||||||
Scale = part.Shape.Scale;
|
Scale = part.Shape.Scale;
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Storing undo scale {0} for root part", Scale);
|
// "[UNDO STATE]: Storing undo scale {0} for root part", Scale);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Position = part.OffsetPosition;
|
Position = part.OffsetPosition;
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Storing undo position {0} for child part", Position);
|
// "[UNDO STATE]: Storing undo position {0} for child part", Position);
|
||||||
|
|
||||||
Rotation = part.RotationOffset;
|
Rotation = part.RotationOffset;
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Storing undo rotation {0} for child part", Rotation);
|
// "[UNDO STATE]: Storing undo rotation {0} for child part", Rotation);
|
||||||
|
|
||||||
Scale = part.Shape.Scale;
|
Scale = part.Shape.Scale;
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Storing undo scale {0} for child part", Scale);
|
// "[UNDO STATE]: Storing undo scale {0} for child part", Scale);
|
||||||
}
|
|
||||||
}
|
|
||||||
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)))
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Compare the relevant state in the given part to this state.
|
/// Compare the relevant state in the given part to this state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -183,15 +130,15 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RestoreState(SceneObjectPart part)
|
public void PlaybackState(SceneObjectPart part)
|
||||||
{
|
{
|
||||||
part.Undoing = true;
|
part.Undoing = true;
|
||||||
|
|
||||||
if (part.ParentID == 0)
|
if (part.ParentID == 0)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Undoing position to {0} for root part {1} {2}",
|
// "[UNDO STATE]: Undoing position to {0} for root part {1} {2}",
|
||||||
// Position, part.Name, part.LocalId);
|
// Position, part.Name, part.LocalId);
|
||||||
|
|
||||||
if (Position != Vector3.Zero)
|
if (Position != Vector3.Zero)
|
||||||
{
|
{
|
||||||
|
@ -201,9 +148,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
part.ParentGroup.UpdateRootPosition(Position);
|
part.ParentGroup.UpdateRootPosition(Position);
|
||||||
}
|
}
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Undoing rotation {0} to {1} for root part {2} {3}",
|
// "[UNDO STATE]: Undoing rotation {0} to {1} for root part {2} {3}",
|
||||||
// part.RotationOffset, Rotation, part.Name, part.LocalId);
|
// part.RotationOffset, Rotation, part.Name, part.LocalId);
|
||||||
|
|
||||||
if (ForGroup)
|
if (ForGroup)
|
||||||
part.UpdateRotation(Rotation);
|
part.UpdateRotation(Rotation);
|
||||||
|
@ -212,9 +159,9 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
if (Scale != Vector3.Zero)
|
if (Scale != Vector3.Zero)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Undoing scale {0} to {1} for root part {2} {3}",
|
// "[UNDO STATE]: Undoing scale {0} to {1} for root part {2} {3}",
|
||||||
// part.Shape.Scale, Scale, part.Name, part.LocalId);
|
// part.Shape.Scale, Scale, part.Name, part.LocalId);
|
||||||
|
|
||||||
if (ForGroup)
|
if (ForGroup)
|
||||||
part.ParentGroup.GroupResize(Scale);
|
part.ParentGroup.GroupResize(Scale);
|
||||||
|
@ -228,24 +175,24 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
{
|
{
|
||||||
if (Position != Vector3.Zero)
|
if (Position != Vector3.Zero)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Undoing position {0} to {1} for child part {2} {3}",
|
// "[UNDO STATE]: Undoing position {0} to {1} for child part {2} {3}",
|
||||||
// part.OffsetPosition, Position, part.Name, part.LocalId);
|
// part.OffsetPosition, Position, part.Name, part.LocalId);
|
||||||
|
|
||||||
part.OffsetPosition = Position;
|
part.OffsetPosition = Position;
|
||||||
}
|
}
|
||||||
|
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Undoing rotation {0} to {1} for child part {2} {3}",
|
// "[UNDO STATE]: Undoing rotation {0} to {1} for child part {2} {3}",
|
||||||
// part.RotationOffset, Rotation, part.Name, part.LocalId);
|
// part.RotationOffset, Rotation, part.Name, part.LocalId);
|
||||||
|
|
||||||
part.UpdateRotation(Rotation);
|
part.UpdateRotation(Rotation);
|
||||||
|
|
||||||
if (Scale != Vector3.Zero)
|
if (Scale != Vector3.Zero)
|
||||||
{
|
{
|
||||||
// m_log.DebugFormat(
|
// m_log.DebugFormat(
|
||||||
// "[UNDO STATE]: Undoing scale {0} to {1} for child part {2} {3}",
|
// "[UNDO STATE]: Undoing scale {0} to {1} for child part {2} {3}",
|
||||||
// part.Shape.Scale, Scale, part.Name, part.LocalId);
|
// part.Shape.Scale, Scale, part.Name, part.LocalId);
|
||||||
|
|
||||||
part.Resize(Scale);
|
part.Resize(Scale);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1219,7 +1219,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
public virtual void llDie()
|
public virtual void llDie()
|
||||||
{
|
{
|
||||||
m_host.AddScriptLPS(1);
|
m_host.AddScriptLPS(1);
|
||||||
if (!m_host.IsAttachment) throw new SelfDeleteException();
|
if (!m_host.ParentGroup.IsAttachment) throw new SelfDeleteException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public LSL_Float llGround(LSL_Vector offset)
|
public LSL_Float llGround(LSL_Vector offset)
|
||||||
|
@ -3250,8 +3250,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
SceneObjectGroup grp = m_host.ParentGroup;
|
SceneObjectGroup grp = m_host.ParentGroup;
|
||||||
|
|
||||||
ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
|
ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
|
||||||
|
if (presence.Scene.AttachmentsModule != null)
|
||||||
grp.AttachToAgent(m_host.OwnerID, (uint)attachment, Vector3.Zero, false);
|
{
|
||||||
|
presence.Scene.AttachmentsModule.AttachObject(presence.ControllingClient, grp, (uint)attachment, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8034,7 +8036,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
// the UUID with the avatar UUID and report it's bounding box
|
// the UUID with the avatar UUID and report it's bounding box
|
||||||
SceneObjectPart part = World.GetSceneObjectPart(objID);
|
SceneObjectPart part = World.GetSceneObjectPart(objID);
|
||||||
if (part != null && part.ParentGroup.IsAttachment)
|
if (part != null && part.ParentGroup.IsAttachment)
|
||||||
objID = part.ParentGroup.RootPart.AttachedAvatar;
|
objID = part.ParentGroup.AttachedAvatar;
|
||||||
|
|
||||||
// Find out if this is an avatar ID. If so, return it's box
|
// Find out if this is an avatar ID. If so, return it's box
|
||||||
ScenePresence presence = World.GetScenePresence(objID);
|
ScenePresence presence = World.GetScenePresence(objID);
|
||||||
|
@ -10064,7 +10066,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0);
|
DetectParams detectedParams = m_ScriptEngine.GetDetectParams(m_itemID, 0);
|
||||||
if (detectedParams == null)
|
if (detectedParams == null)
|
||||||
{
|
{
|
||||||
if (m_host.IsAttachment == true)
|
if (m_host.ParentGroup.IsAttachment == true)
|
||||||
{
|
{
|
||||||
detectedParams = new DetectParams();
|
detectedParams = new DetectParams();
|
||||||
detectedParams.Key = m_host.OwnerID;
|
detectedParams.Key = m_host.OwnerID;
|
||||||
|
|
Loading…
Reference in New Issue