diff --git a/OpenSim/Region/Application/OpenSimMain.cs b/OpenSim/Region/Application/OpenSimMain.cs
index c1df86c3d6..ce2b856322 100644
--- a/OpenSim/Region/Application/OpenSimMain.cs
+++ b/OpenSim/Region/Application/OpenSimMain.cs
@@ -366,9 +366,10 @@ namespace OpenSim
protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager,
AgentCircuitManager circuitManager)
{
+ PermissionManager permissionManager = new PermissionManager();
SceneCommunicationService sceneGridService = new SceneCommunicationService(m_commsManager);
return
- new Scene(regionInfo, circuitManager, m_commsManager, sceneGridService, m_assetCache, storageManager, m_httpServer,
+ new Scene(regionInfo, circuitManager, permissionManager, m_commsManager, sceneGridService, m_assetCache, storageManager, m_httpServer,
m_moduleLoader, m_dumpAssetsToFile, m_physicalPrim);
}
diff --git a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
index 01a55fb44b..87d62315a5 100644
--- a/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
+++ b/OpenSim/Region/Environment/Modules/TextureDownloadModule.cs
@@ -36,7 +36,7 @@ using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.Environment.Modules
{
- //this is first attempt to start breaking the mess thats called the assetcache up.
+ //this is a first attempt, to start breaking the mess thats called the assetcache up.
// basically this should be the texture sending (to clients) code moved out of assetcache
//and some small clean up
// but on first tests it didn't seem to work very well so is currently not in use.
diff --git a/OpenSim/Region/Environment/PermissionManager.cs b/OpenSim/Region/Environment/PermissionManager.cs
index 560ecf3f11..412c6e71a1 100644
--- a/OpenSim/Region/Environment/PermissionManager.cs
+++ b/OpenSim/Region/Environment/PermissionManager.cs
@@ -48,12 +48,20 @@ namespace OpenSim.Region.Environment
set { m_bypassPermissions = value; }
}
+ public PermissionManager()
+ {
+ }
public PermissionManager(Scene scene)
{
m_scene = scene;
}
+ public void Initialise(Scene scene)
+ {
+ m_scene = scene;
+ }
+
protected virtual void SendPermissionError(LLUUID user, string reason)
{
m_scene.EventManager.TriggerPermissionError(user, reason);
@@ -188,6 +196,12 @@ namespace OpenSim.Region.Environment
return GenericObjectPermission(user, obj);
}
+ public virtual bool CanCopyObject(LLUUID user, LLUUID obj)
+ {
+ return true;
+ // return GenericObjectPermission(user, obj);
+ }
+
#endregion
#region Communication Permissions
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 1625e80da5..1f3bc95d7f 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -119,7 +119,7 @@ namespace OpenSim.Region.Environment.Scenes
{
if (((SceneObjectGroup)obj).LocalId == localID)
{
- m_parentScene.RemoveEntity((SceneObjectGroup)obj);
+ m_parentScene.RemoveEntity((SceneObjectGroup)obj);
return;
}
}
@@ -553,7 +553,7 @@ namespace OpenSim.Region.Environment.Scenes
parenPrim.LinkToGroup(sceneObj);
}
}
-
+
///
/// Delink a linkset
///
@@ -568,7 +568,7 @@ namespace OpenSim.Region.Environment.Scenes
// XXX I'm anticipating that building this dictionary once is more efficient than
// repeated scanning of the Entity.Values for a large number of primIds. However, it might
// be more efficient yet to keep this dictionary permanently on hand.
- Dictionary sceneObjects = new Dictionary();
+ Dictionary sceneObjects = new Dictionary();
foreach (EntityBase ent in Entities.Values)
{
if (ent is SceneObjectGroup)
@@ -576,17 +576,17 @@ namespace OpenSim.Region.Environment.Scenes
SceneObjectGroup obj = (SceneObjectGroup)ent;
sceneObjects.Add(obj.LocalId, obj);
}
- }
-
+ }
+
// Find the root prim among the prim ids we've been given
for (int i = 0; i < primIds.Count; i++)
- {
+ {
if (sceneObjects.ContainsKey(primIds[i]))
{
parenPrim = sceneObjects[primIds[i]];
primIds.RemoveAt(i);
break;
- }
+ }
}
if (parenPrim != null)
@@ -594,7 +594,7 @@ namespace OpenSim.Region.Environment.Scenes
foreach (uint childPrimId in primIds)
{
parenPrim.DelinkFromGroup(childPrimId);
- }
+ }
}
else
{
@@ -627,19 +627,21 @@ namespace OpenSim.Region.Environment.Scenes
if (originPrim != null)
{
- SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
- copy.AbsolutePosition = copy.AbsolutePosition + offset;
- Entities.Add(copy.UUID, copy);
-
- copy.ScheduleGroupForFullUpdate();
+ if (PermissionsMngr.CanCopyObject(AgentID, originPrim.UUID))
+ {
+ SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
+ copy.AbsolutePosition = copy.AbsolutePosition + offset;
+ Entities.Add(copy.UUID, copy);
+ copy.ScheduleGroupForFullUpdate();
+ }
}
else
{
MainLog.Instance.Warn("client", "Attempted to duplicate nonexistant prim");
}
- }
+ }
#endregion
}
diff --git a/OpenSim/Region/Environment/Scenes/Scene.cs b/OpenSim/Region/Environment/Scenes/Scene.cs
index 2c765a306e..1400e609e5 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.cs
@@ -195,7 +195,7 @@ namespace OpenSim.Region.Environment.Scenes
#region Constructors
- public Scene(RegionInfo regInfo, AgentCircuitManager authen, CommunicationsManager commsMan, SceneCommunicationService sceneGridService,
+ public Scene(RegionInfo regInfo, AgentCircuitManager authen, PermissionManager permissionManager, CommunicationsManager commsMan, SceneCommunicationService sceneGridService,
AssetCache assetCach, StorageManager storeManager, BaseHttpServer httpServer,
ModuleLoader moduleLoader, bool dumpAssetsToFile, bool physicalPrim)
{
@@ -217,15 +217,14 @@ namespace OpenSim.Region.Environment.Scenes
m_LandManager = new LandManager(this, m_regInfo);
m_estateManager = new EstateManager(this, m_regInfo);
m_eventManager = new EventManager();
- m_permissionManager = new PermissionManager(this);
+
+ m_permissionManager = permissionManager;
+ m_permissionManager.Initialise(this);
m_innerScene = new InnerScene(this, m_regInfo, m_permissionManager);
m_sceneXmlLoader = new SceneXmlLoader(this, m_innerScene, m_regInfo);
- m_eventManager.OnParcelPrimCountAdd +=
- m_LandManager.addPrimToLandPrimCounts;
-
- m_eventManager.OnPermissionError += SendPermissionAlert;
+ RegisterDefaultSceneEvents();
MainLog.Instance.Verbose("Creating new entitities instance");
Entities = new Dictionary();
@@ -244,6 +243,13 @@ namespace OpenSim.Region.Environment.Scenes
#endregion
#region Startup / Close Methods
+
+ protected virtual void RegisterDefaultSceneEvents()
+ {
+ m_eventManager.OnParcelPrimCountAdd += m_LandManager.addPrimToLandPrimCounts;
+ m_eventManager.OnPermissionError += SendPermissionAlert;
+ }
+
public override void Close()
{
ForEachScenePresence(delegate(ScenePresence avatar)
@@ -504,6 +510,7 @@ namespace OpenSim.Region.Environment.Scenes
}
CreateTerrainTexture();
+ CommsManager.GridService.RegisterRegion(RegionInfo); //hack to update the terrain texture in grid mode so it shows on world map
}
catch (Exception e)
{
diff --git a/OpenSim/Region/Environment/Scenes/ScenePresence.cs b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
index 67b375acdf..b6daad6e1f 100644
--- a/OpenSim/Region/Environment/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Environment/Scenes/ScenePresence.cs
@@ -147,6 +147,13 @@ namespace OpenSim.Region.Environment.Scenes
get { return m_lastname; }
}
+ protected bool m_allowMovement = true;
+ public bool AllowMovement
+ {
+ get { return m_allowMovement; }
+ set { m_allowMovement = value; }
+ }
+
private readonly IClientAPI m_controllingClient;
protected PhysicsActor m_physicsActor;
@@ -528,58 +535,61 @@ namespace OpenSim.Region.Environment.Scenes
// Console.WriteLine("DEBUG: HandleAgentUpdate: null PhysicsActor!");
return;
}
-
- int i = 0;
- bool update_movementflag = false;
- bool update_rotation = false;
- bool DCFlagKeyPressed = false;
- Vector3 agent_control_v3 = new Vector3(0, 0, 0);
- Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
- bool oldflying = PhysicsActor.Flying;
-
- PhysicsActor.Flying = ((flags & (uint) MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0);
- if (PhysicsActor.Flying != oldflying)
+ if (m_allowMovement)
{
- update_movementflag = true;
- }
+ int i = 0;
+ bool update_movementflag = false;
+ bool update_rotation = false;
+ bool DCFlagKeyPressed = false;
+ Vector3 agent_control_v3 = new Vector3(0, 0, 0);
+ Quaternion q = new Quaternion(bodyRotation.W, bodyRotation.X, bodyRotation.Y, bodyRotation.Z);
+ bool oldflying = PhysicsActor.Flying;
- if (q != m_bodyRot)
- {
- m_bodyRot = q;
- update_rotation = true;
- }
- if (m_parentID == 0)
- {
- foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof (Dir_ControlFlags)))
+ PhysicsActor.Flying = ((flags & (uint)MainAvatar.ControlFlags.AGENT_CONTROL_FLY) != 0);
+ if (PhysicsActor.Flying != oldflying)
{
- if ((flags & (uint) DCF) != 0)
- {
- DCFlagKeyPressed = true;
- agent_control_v3 += Dir_Vectors[i];
- 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;
- }
- }
- i++;
+ update_movementflag = true;
}
- }
- if ((update_movementflag) || (update_rotation && DCFlagKeyPressed))
- {
- AddNewMovement(agent_control_v3, q);
- UpdateMovementAnimations(update_movementflag);
+ if (q != m_bodyRot)
+ {
+ m_bodyRot = q;
+ update_rotation = true;
+ }
+
+ if (m_parentID == 0)
+ {
+ foreach (Dir_ControlFlags DCF in Enum.GetValues(typeof(Dir_ControlFlags)))
+ {
+ if ((flags & (uint)DCF) != 0)
+ {
+ DCFlagKeyPressed = true;
+ agent_control_v3 += Dir_Vectors[i];
+ 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;
+ }
+ }
+ i++;
+ }
+ }
+
+ if ((update_movementflag) || (update_rotation && DCFlagKeyPressed))
+ {
+ AddNewMovement(agent_control_v3, q);
+ UpdateMovementAnimations(update_movementflag);
+ }
}
}
diff --git a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
index ae2f5adfee..8cfbf27f4e 100644
--- a/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
+++ b/OpenSim/Region/Examples/SimpleApp/MyWorld.cs
@@ -42,10 +42,10 @@ namespace SimpleApp
{
private List m_avatars;
- public MyWorld(RegionInfo regionInfo, AgentCircuitManager authen, CommunicationsManager commsMan, SceneCommunicationService sceneGridService,
+ public MyWorld(RegionInfo regionInfo, AgentCircuitManager authen, PermissionManager permissionManager, CommunicationsManager commsMan, SceneCommunicationService sceneGridService,
AssetCache assetCach, StorageManager storeMan, BaseHttpServer httpServer,
ModuleLoader moduleLoader, bool physicalPrim)
- : base(regionInfo, authen, commsMan, sceneGridService, assetCach, storeMan, httpServer, moduleLoader, false, true)
+ : base(regionInfo, authen, permissionManager, commsMan, sceneGridService, assetCach, storeMan, httpServer, moduleLoader, false, true)
{
m_avatars = new List();
}
diff --git a/OpenSim/Region/Examples/SimpleApp/Program.cs b/OpenSim/Region/Examples/SimpleApp/Program.cs
index bd88e61d76..10b625816c 100644
--- a/OpenSim/Region/Examples/SimpleApp/Program.cs
+++ b/OpenSim/Region/Examples/SimpleApp/Program.cs
@@ -169,9 +169,10 @@ namespace SimpleApp
protected override Scene CreateScene(RegionInfo regionInfo, StorageManager storageManager,
AgentCircuitManager circuitManager)
{
+ PermissionManager permissionManager = new PermissionManager();
SceneCommunicationService sceneGridService = new SceneCommunicationService(m_commsManager);
return
- new MyWorld(regionInfo, circuitManager, m_commsManager, sceneGridService, m_assetCache, storageManager, m_httpServer,
+ new MyWorld(regionInfo, circuitManager, permissionManager, m_commsManager, sceneGridService, m_assetCache, storageManager, m_httpServer,
new ModuleLoader(m_log, m_config), true);
}