change CanObjectEntry() to use a SOG
parent
df40cdc83e
commit
dac32c4e5a
|
@ -2620,7 +2620,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
||||||
{
|
{
|
||||||
// FIXME: It would be better to never add the scene object at all rather than add it and then delete
|
// FIXME: It would be better to never add the scene object at all rather than add it and then delete
|
||||||
// it
|
// it
|
||||||
if (!Scene.Permissions.CanObjectEntry(so.UUID, true, so.AbsolutePosition))
|
if (!Scene.Permissions.CanObjectEntry(so, true, so.AbsolutePosition))
|
||||||
{
|
{
|
||||||
// Deny non attachments based on parcel settings
|
// Deny non attachments based on parcel settings
|
||||||
//
|
//
|
||||||
|
|
|
@ -1437,42 +1437,40 @@ namespace OpenSim.Region.CoreModules.World.Permissions
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CanObjectEntry(UUID objectID, bool enteringRegion, Vector3 newPoint, Scene scene)
|
private bool CanObjectEntry(SceneObjectGroup sog, bool enteringRegion, Vector3 newPoint, Scene scene)
|
||||||
{
|
{
|
||||||
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
DebugPermissionInformation(MethodInfo.GetCurrentMethod().Name);
|
||||||
if (m_bypassPermissions) return m_bypassPermissionsValue;
|
|
||||||
|
|
||||||
// allow outide region this mb needed for crossings ???
|
if(sog == null || sog.IsDeleted)
|
||||||
if (newPoint.X < -1f || newPoint.Y < -1f)
|
return false;
|
||||||
return true;
|
|
||||||
if (newPoint.X > scene.RegionInfo.RegionSizeX + 1.0f || newPoint.Y > scene.RegionInfo.RegionSizeY + 1.0f)
|
float newX = newPoint.X;
|
||||||
|
float newY = newPoint.Y;
|
||||||
|
|
||||||
|
// allow outside region this mb needed for crossings
|
||||||
|
if (newX < -1f || newX > (scene.RegionInfo.RegionSizeX + 1.0f) ||
|
||||||
|
newY < -1f || newY > (scene.RegionInfo.RegionSizeY + 1.0f) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
ILandObject parcel = m_scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y);
|
if (m_bypassPermissions)
|
||||||
|
return m_bypassPermissionsValue;
|
||||||
|
|
||||||
|
ILandObject parcel = scene.LandChannel.GetLandObject(newX, newY);
|
||||||
if (parcel == null)
|
if (parcel == null)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((parcel.LandData.Flags & ((int)ParcelFlags.AllowAPrimitiveEntry)) != 0)
|
if ((parcel.LandData.Flags & ((int)ParcelFlags.AllowAPrimitiveEntry)) != 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
EntityBase ent = null;
|
|
||||||
if (!m_scene.Entities.TryGetValue(objectID, out ent))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if(ent == null || !(ent is SceneObjectGroup))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
SceneObjectGroup task = (SceneObjectGroup)ent;
|
|
||||||
|
|
||||||
if (!enteringRegion)
|
if (!enteringRegion)
|
||||||
{
|
{
|
||||||
ILandObject fromparcel = m_scene.LandChannel.GetLandObject(task.AbsolutePosition.X, task.AbsolutePosition.Y);
|
Vector3 oldPoint = sog.AbsolutePosition;
|
||||||
|
ILandObject fromparcel = m_scene.LandChannel.GetLandObject(oldPoint.X, oldPoint.Y);
|
||||||
if (fromparcel == parcel) // it already entered parcel ????
|
if (fromparcel != null && fromparcel.Equals(parcel)) // it already entered parcel ????
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GenericParcelPermission(task.OwnerID, parcel, 0))
|
if (GenericParcelPermission(sog.OwnerID, parcel, 0))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
//Otherwise, false!
|
//Otherwise, false!
|
||||||
|
|
|
@ -52,7 +52,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
public delegate bool EditObjectHandler(SceneObjectGroup sog, ScenePresence sp);
|
public delegate bool EditObjectHandler(SceneObjectGroup sog, ScenePresence sp);
|
||||||
public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID, Scene scene);
|
public delegate bool EditObjectInventoryHandler(UUID objectID, UUID editorID, Scene scene);
|
||||||
public delegate bool MoveObjectHandler(SceneObjectGroup sog, ScenePresence sp);
|
public delegate bool MoveObjectHandler(SceneObjectGroup sog, ScenePresence sp);
|
||||||
public delegate bool ObjectEntryHandler(UUID objectID, bool enteringRegion, Vector3 newPoint, Scene scene);
|
public delegate bool ObjectEntryHandler(SceneObjectGroup sog, bool enteringRegion, Vector3 newPoint, Scene scene);
|
||||||
public delegate bool ReturnObjectsHandler(ILandObject land, UUID user, List<SceneObjectGroup> objects, Scene scene);
|
public delegate bool ReturnObjectsHandler(ILandObject land, UUID user, List<SceneObjectGroup> objects, Scene scene);
|
||||||
public delegate bool InstantMessageHandler(UUID user, UUID target, Scene startScene);
|
public delegate bool InstantMessageHandler(UUID user, UUID target, Scene startScene);
|
||||||
public delegate bool InventoryTransferHandler(UUID user, UUID target, Scene startScene);
|
public delegate bool InventoryTransferHandler(UUID user, UUID target, Scene startScene);
|
||||||
|
@ -504,7 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region OBJECT ENTRY
|
#region OBJECT ENTRY
|
||||||
public bool CanObjectEntry(UUID objectID, bool enteringRegion, Vector3 newPoint)
|
public bool CanObjectEntry(SceneObjectGroup sog, bool enteringRegion, Vector3 newPoint)
|
||||||
{
|
{
|
||||||
ObjectEntryHandler handler = OnObjectEntry;
|
ObjectEntryHandler handler = OnObjectEntry;
|
||||||
if (handler != null)
|
if (handler != null)
|
||||||
|
@ -512,7 +512,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
Delegate[] list = handler.GetInvocationList();
|
Delegate[] list = handler.GetInvocationList();
|
||||||
foreach (ObjectEntryHandler h in list)
|
foreach (ObjectEntryHandler h in list)
|
||||||
{
|
{
|
||||||
if (h(objectID, enteringRegion, newPoint, m_scene) == false)
|
if (h(sog, enteringRegion, newPoint, m_scene) == false)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1579,7 +1579,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_parentScene.Permissions.CanMoveObject(group, remoteClient)
|
if (m_parentScene.Permissions.CanMoveObject(group, remoteClient)
|
||||||
&& m_parentScene.Permissions.CanObjectEntry(group.UUID, false, pos))
|
&& m_parentScene.Permissions.CanObjectEntry(group, false, pos))
|
||||||
{
|
{
|
||||||
group.UpdateGroupPosition(pos);
|
group.UpdateGroupPosition(pos);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4656,7 +4656,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
if ((change & ObjectChangeType.Position) != 0)
|
if ((change & ObjectChangeType.Position) != 0)
|
||||||
{
|
{
|
||||||
if (IsAttachment || m_scene.Permissions.CanObjectEntry(group.UUID, false, data.position))
|
if (IsAttachment || m_scene.Permissions.CanObjectEntry(group, false, data.position))
|
||||||
UpdateGroupPosition(data.position);
|
UpdateGroupPosition(data.position);
|
||||||
updateType = updatetype.groupterse;
|
updateType = updatetype.groupterse;
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,50 +135,41 @@ namespace OpenSim.Region.OptionalModules
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CanObjectEnter(UUID objectID, bool enteringRegion, Vector3 newPoint, Scene scene)
|
private bool CanObjectEnter(SceneObjectGroup sog, bool enteringRegion, Vector3 newPoint, Scene scene)
|
||||||
{
|
{
|
||||||
if (newPoint.X < -1f || newPoint.X > (scene.RegionInfo.RegionSizeX + 1) ||
|
float newX = newPoint.X;
|
||||||
newPoint.Y < -1f || newPoint.Y > (scene.RegionInfo.RegionSizeY) )
|
float newY = newPoint.Y;
|
||||||
|
if (newX < -1f || newX > (scene.RegionInfo.RegionSizeX + 1.0f) ||
|
||||||
|
newY < -1f || newY > (scene.RegionInfo.RegionSizeY + 1.0f) )
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
SceneObjectPart obj = scene.GetSceneObjectPart(objectID);
|
if (sog == null)
|
||||||
|
|
||||||
if (obj == null)
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Prim counts are determined by the location of the root prim. if we're
|
ILandObject newParcel = scene.LandChannel.GetLandObject(newX, newY);
|
||||||
// moving a child prim, just let it pass
|
|
||||||
if (!obj.IsRoot)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ILandObject newParcel = scene.LandChannel.GetLandObject(newPoint.X, newPoint.Y);
|
|
||||||
|
|
||||||
if (newParcel == null)
|
if (newParcel == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
Vector3 oldPoint = obj.GroupPosition;
|
if(!enteringRegion)
|
||||||
ILandObject oldParcel = scene.LandChannel.GetLandObject(oldPoint.X, oldPoint.Y);
|
|
||||||
|
|
||||||
// The prim hasn't crossed a region boundry so we don't need to worry
|
|
||||||
// about prim counts here
|
|
||||||
if(oldParcel != null && oldParcel.Equals(newParcel))
|
|
||||||
{
|
{
|
||||||
return true;
|
Vector3 oldPoint = sog.AbsolutePosition;
|
||||||
|
ILandObject oldParcel = scene.LandChannel.GetLandObject(oldPoint.X, oldPoint.Y);
|
||||||
|
if(oldParcel != null && oldParcel.Equals(newParcel))
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int objectCount = obj.ParentGroup.PrimCount;
|
int objectCount = sog.PrimCount;
|
||||||
int usedPrims = newParcel.PrimCounts.Total;
|
int usedPrims = newParcel.PrimCounts.Total;
|
||||||
int simulatorCapacity = newParcel.GetSimulatorMaxPrimCount();
|
int simulatorCapacity = newParcel.GetSimulatorMaxPrimCount();
|
||||||
|
|
||||||
// TODO: Add Special Case here for temporary prims
|
// TODO: Add Special Case here for temporary prims
|
||||||
|
|
||||||
string response = DoCommonChecks(objectCount, obj.OwnerID, newParcel, scene);
|
string response = DoCommonChecks(objectCount, sog.OwnerID, newParcel, scene);
|
||||||
|
|
||||||
if (response != null)
|
if (response != null)
|
||||||
{
|
{
|
||||||
m_dialogModule.SendAlertToUser(obj.OwnerID, response);
|
m_dialogModule.SendAlertToUser(sog.OwnerID, response);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -2722,7 +2722,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||||
if (part.ParentGroup.RootPart == part)
|
if (part.ParentGroup.RootPart == part)
|
||||||
{
|
{
|
||||||
SceneObjectGroup parent = part.ParentGroup;
|
SceneObjectGroup parent = part.ParentGroup;
|
||||||
if (!parent.IsAttachment && !World.Permissions.CanObjectEntry(parent.UUID, false, (Vector3)toPos))
|
if (!parent.IsAttachment && !World.Permissions.CanObjectEntry(parent, false, (Vector3)toPos))
|
||||||
return;
|
return;
|
||||||
parent.UpdateGroupPosition((Vector3)toPos);
|
parent.UpdateGroupPosition((Vector3)toPos);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue