aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/Scene.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.cs')
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs888
1 files changed, 809 insertions, 79 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index fe99ae5..deb8d39 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -105,9 +105,15 @@ namespace OpenSim.Region.Framework.Scenes
105 /// <summary> 105 /// <summary>
106 /// If false then physical objects are disabled, though collisions will continue as normal. 106 /// If false then physical objects are disabled, though collisions will continue as normal.
107 /// </summary> 107 /// </summary>
108<<<<<<< HEAD
108 public bool PhysicsEnabled 109 public bool PhysicsEnabled
109 { 110 {
110 get 111 get
112=======
113 public bool PhysicsEnabled
114 {
115 get
116>>>>>>> avn/ubitvar
111 { 117 {
112 return m_physicsEnabled; 118 return m_physicsEnabled;
113 } 119 }
@@ -228,9 +234,16 @@ namespace OpenSim.Region.Framework.Scenes
228 public bool m_allowScriptCrossings = true; 234 public bool m_allowScriptCrossings = true;
229 235
230 /// <summary> 236 /// <summary>
237<<<<<<< HEAD
231 /// Can avatars cross from and to this region? 238 /// Can avatars cross from and to this region?
232 /// </summary> 239 /// </summary>
233 public bool AllowAvatarCrossing { get; set; } 240 public bool AllowAvatarCrossing { get; set; }
241=======
242 /// Max prims an Physical object will hold
243 /// </summary>
244 ///
245 public int m_linksetPhysCapacity = 0;
246>>>>>>> avn/ubitvar
234 247
235 public bool m_useFlySlow; 248 public bool m_useFlySlow;
236 public bool m_useTrashOnDelete = true; 249 public bool m_useTrashOnDelete = true;
@@ -281,14 +294,21 @@ namespace OpenSim.Region.Framework.Scenes
281 } 294 }
282 } 295 }
283 296
297 protected float m_maxDrawDistance = 512.0f;
298// protected float m_maxDrawDistance = 256.0f;
299 public float MaxDrawDistance
300 {
301 get { return m_maxDrawDistance; }
302 }
303
284 private List<string> m_AllowedViewers = new List<string>(); 304 private List<string> m_AllowedViewers = new List<string>();
285 private List<string> m_BannedViewers = new List<string>(); 305 private List<string> m_BannedViewers = new List<string>();
286 306
287 // TODO: need to figure out how allow client agents but deny 307 // TODO: need to figure out how allow client agents but deny
288 // root agents when ACL denies access to root agent 308 // root agents when ACL denies access to root agent
289 public bool m_strictAccessControl = true; 309 public bool m_strictAccessControl = true;
290 310 public bool m_seeIntoBannedRegion = false;
291 public int MaxUndoCount { get; set; } 311 public int MaxUndoCount = 5;
292 312
293 public bool SeeIntoRegion { get; set; } 313 public bool SeeIntoRegion { get; set; }
294 314
@@ -306,11 +326,13 @@ namespace OpenSim.Region.Framework.Scenes
306 326
307 protected int m_splitRegionID; 327 protected int m_splitRegionID;
308 protected Timer m_restartWaitTimer = new Timer(); 328 protected Timer m_restartWaitTimer = new Timer();
329 protected Timer m_timerWatchdog = new Timer();
309 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); 330 protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>();
310 protected List<RegionInfo> m_neighbours = new List<RegionInfo>(); 331 protected List<RegionInfo> m_neighbours = new List<RegionInfo>();
311 protected string m_simulatorVersion = "OpenSimulator Server"; 332 protected string m_simulatorVersion = "OpenSimulator Server";
312 protected AgentCircuitManager m_authenticateHandler; 333 protected AgentCircuitManager m_authenticateHandler;
313 protected SceneCommunicationService m_sceneGridService; 334 protected SceneCommunicationService m_sceneGridService;
335 protected ISnmpModule m_snmpService = null;
314 336
315 protected ISimulationDataService m_SimulationDataService; 337 protected ISimulationDataService m_SimulationDataService;
316 protected IEstateDataService m_EstateDataService; 338 protected IEstateDataService m_EstateDataService;
@@ -406,8 +428,13 @@ namespace OpenSim.Region.Framework.Scenes
406 private int m_update_presences = 1; // Update scene presence movements 428 private int m_update_presences = 1; // Update scene presence movements
407 private int m_update_events = 1; 429 private int m_update_events = 1;
408 private int m_update_backup = 200; 430 private int m_update_backup = 200;
431<<<<<<< HEAD
409 private int m_update_terrain = 50; 432 private int m_update_terrain = 50;
410 // private int m_update_land = 1; 433 // private int m_update_land = 1;
434=======
435 private int m_update_terrain = 1000;
436 private int m_update_land = 10;
437>>>>>>> avn/ubitvar
411 private int m_update_coarse_locations = 50; 438 private int m_update_coarse_locations = 50;
412 private int m_update_temp_cleaning = 180; 439 private int m_update_temp_cleaning = 180;
413 440
@@ -421,7 +448,6 @@ namespace OpenSim.Region.Framework.Scenes
421 private int backupMS; 448 private int backupMS;
422 private int terrainMS; 449 private int terrainMS;
423 private int landMS; 450 private int landMS;
424 private int spareMS;
425 451
426 // A temporary configuration flag to enable using FireAndForget to process 452 // A temporary configuration flag to enable using FireAndForget to process
427 // collisions from the physics engine. There is a problem with collisions 453 // collisions from the physics engine. There is a problem with collisions
@@ -439,6 +465,7 @@ namespace OpenSim.Region.Framework.Scenes
439 /// </summary> 465 /// </summary>
440 private int m_lastFrameTick; 466 private int m_lastFrameTick;
441 467
468 public bool CombineRegions = false;
442 /// <summary> 469 /// <summary>
443 /// Tick at which the last maintenance run occurred. 470 /// Tick at which the last maintenance run occurred.
444 /// </summary> 471 /// </summary>
@@ -470,7 +497,7 @@ namespace OpenSim.Region.Framework.Scenes
470 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing 497 private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing
471 private volatile bool m_backingup; 498 private volatile bool m_backingup;
472 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); 499 private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>();
473 private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); 500 private Dictionary<UUID, int> m_groupsWithTargets = new Dictionary<UUID, int>();
474 501
475 private string m_defaultScriptEngine; 502 private string m_defaultScriptEngine;
476 503
@@ -485,6 +512,11 @@ namespace OpenSim.Region.Framework.Scenes
485 /// </summary> 512 /// </summary>
486 private int m_LastLogin; 513 private int m_LastLogin;
487 514
515 private int m_lastIncoming;
516 private int m_lastOutgoing;
517 private int m_hbRestarts = 0;
518
519
488 /// <summary> 520 /// <summary>
489 /// Thread that runs the scene loop. 521 /// Thread that runs the scene loop.
490 /// </summary> 522 /// </summary>
@@ -527,11 +559,22 @@ namespace OpenSim.Region.Framework.Scenes
527 } 559 }
528 private volatile bool m_active; 560 private volatile bool m_active;
529 561
562<<<<<<< HEAD
530 /// <summary> 563 /// <summary>
531 /// If true then updates are running. This may be true for a short period after a scene is de-activated. 564 /// If true then updates are running. This may be true for a short period after a scene is de-activated.
532 /// </summary> 565 /// </summary>
533 public bool IsRunning { get { return m_isRunning; } } 566 public bool IsRunning { get { return m_isRunning; } }
534 private volatile bool m_isRunning; 567 private volatile bool m_isRunning;
568=======
569// private int m_lastUpdate;
570 private bool m_firstHeartbeat = true;
571
572 private UpdatePrioritizationSchemes m_priorityScheme = UpdatePrioritizationSchemes.Time;
573 private bool m_reprioritizationEnabled = true;
574 private double m_reprioritizationInterval = 5000.0;
575 private double m_rootReprioritizationDistance = 10.0;
576 private double m_childReprioritizationDistance = 20.0;
577>>>>>>> avn/ubitvar
535 578
536 private Timer m_mapGenerationTimer = new Timer(); 579 private Timer m_mapGenerationTimer = new Timer();
537 private bool m_generateMaptiles; 580 private bool m_generateMaptiles;
@@ -564,6 +607,19 @@ namespace OpenSim.Region.Framework.Scenes
564 get { return m_sceneGridService; } 607 get { return m_sceneGridService; }
565 } 608 }
566 609
610 public ISnmpModule SnmpService
611 {
612 get
613 {
614 if (m_snmpService == null)
615 {
616 m_snmpService = RequestModuleInterface<ISnmpModule>();
617 }
618
619 return m_snmpService;
620 }
621 }
622
567 public ISimulationDataService SimulationDataService 623 public ISimulationDataService SimulationDataService
568 { 624 {
569 get 625 get
@@ -868,6 +924,12 @@ namespace OpenSim.Region.Framework.Scenes
868 m_sceneGridService = sceneGridService; 924 m_sceneGridService = sceneGridService;
869 m_SimulationDataService = simDataService; 925 m_SimulationDataService = simDataService;
870 m_EstateDataService = estateDataService; 926 m_EstateDataService = estateDataService;
927<<<<<<< HEAD
928=======
929 m_regionHandle = RegionInfo.RegionHandle;
930 m_lastIncoming = 0;
931 m_lastOutgoing = 0;
932>>>>>>> avn/ubitvar
871 933
872 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this); 934 m_asyncSceneObjectDeleter = new AsyncSceneObjectGroupDeleter(this);
873 m_asyncSceneObjectDeleter.Enabled = true; 935 m_asyncSceneObjectDeleter.Enabled = true;
@@ -926,6 +988,25 @@ namespace OpenSim.Region.Framework.Scenes
926 EventManager.OnLandObjectRemoved += 988 EventManager.OnLandObjectRemoved +=
927 new EventManager.LandObjectRemoved(simDataService.RemoveLandObject); 989 new EventManager.LandObjectRemoved(simDataService.RemoveLandObject);
928 990
991<<<<<<< HEAD
992=======
993 m_sceneGraph = new SceneGraph(this);
994 m_sceneGraph.PhysicsScene = physicsScene;
995
996 // If the scene graph has an Unrecoverable error, restart this sim.
997 // Currently the only thing that causes it to happen is two kinds of specific
998 // Physics based crashes.
999 //
1000 // Out of memory
1001 // Operating system has killed the plugin
1002 m_sceneGraph.UnRecoverableError
1003 += () =>
1004 {
1005 m_log.ErrorFormat("[SCENE]: Restarting region {0} due to unrecoverable physics crash", Name);
1006 RestartNow();
1007 };
1008
1009>>>>>>> avn/ubitvar
929 RegisterDefaultSceneEvents(); 1010 RegisterDefaultSceneEvents();
930 1011
931 // XXX: Don't set the public property since we don't want to activate here. This needs to be handled 1012 // XXX: Don't set the public property since we don't want to activate here. This needs to be handled
@@ -947,6 +1028,7 @@ namespace OpenSim.Region.Framework.Scenes
947 StartDisabled = startupConfig.GetBoolean("StartDisabled", false); 1028 StartDisabled = startupConfig.GetBoolean("StartDisabled", false);
948 1029
949 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance); 1030 m_defaultDrawDistance = startupConfig.GetFloat("DefaultDrawDistance", m_defaultDrawDistance);
1031 m_defaultDrawDistance = startupConfig.GetFloat("MaxDrawDistance", m_maxDrawDistance);
950 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup); 1032 UseBackup = startupConfig.GetBoolean("UseSceneBackup", UseBackup);
951 if (!UseBackup) 1033 if (!UseBackup)
952 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName); 1034 m_log.InfoFormat("[SCENE]: Backup has been disabled for {0}", RegionInfo.RegionName);
@@ -958,9 +1040,8 @@ namespace OpenSim.Region.Framework.Scenes
958 1040
959 MaxUndoCount = startupConfig.GetInt("MaxPrimUndos", 20); 1041 MaxUndoCount = startupConfig.GetInt("MaxPrimUndos", 20);
960 1042
961 PhysicalPrims = startupConfig.GetBoolean("physical_prim", PhysicalPrims); 1043 PhysicalPrims = startupConfig.GetBoolean("physical_prim", true);
962 CollidablePrims = startupConfig.GetBoolean("collidable_prim", CollidablePrims); 1044 CollidablePrims = startupConfig.GetBoolean("collidable_prim", true);
963
964 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys); 1045 m_minNonphys = startupConfig.GetFloat("NonPhysicalPrimMin", m_minNonphys);
965 if (RegionInfo.NonphysPrimMin > 0) 1046 if (RegionInfo.NonphysPrimMin > 0)
966 { 1047 {
@@ -980,11 +1061,24 @@ namespace OpenSim.Region.Framework.Scenes
980 } 1061 }
981 1062
982 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys); 1063 m_maxPhys = startupConfig.GetFloat("PhysicalPrimMax", m_maxPhys);
1064
983 if (RegionInfo.PhysPrimMax > 0) 1065 if (RegionInfo.PhysPrimMax > 0)
984 { 1066 {
985 m_maxPhys = RegionInfo.PhysPrimMax; 1067 m_maxPhys = RegionInfo.PhysPrimMax;
986 } 1068 }
987 1069
1070 m_linksetCapacity = startupConfig.GetInt("LinksetPrims", m_linksetCapacity);
1071 if (RegionInfo.LinksetCapacity > 0)
1072 {
1073 m_linksetCapacity = RegionInfo.LinksetCapacity;
1074 }
1075
1076 m_linksetPhysCapacity = startupConfig.GetInt("LinksetPhysPrims", m_linksetPhysCapacity);
1077
1078
1079 SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
1080 TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false);
1081
988 // Here, if clamping is requested in either global or 1082 // Here, if clamping is requested in either global or
989 // local config, it will be used 1083 // local config, it will be used
990 // 1084 //
@@ -994,13 +1088,7 @@ namespace OpenSim.Region.Framework.Scenes
994 m_clampPrimSize = true; 1088 m_clampPrimSize = true;
995 } 1089 }
996 1090
997 m_linksetCapacity = startupConfig.GetInt("LinksetPrims", m_linksetCapacity); 1091 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete",m_useTrashOnDelete);
998 if (RegionInfo.LinksetCapacity > 0)
999 {
1000 m_linksetCapacity = RegionInfo.LinksetCapacity;
1001 }
1002
1003 m_useTrashOnDelete = startupConfig.GetBoolean("UseTrashOnDelete", m_useTrashOnDelete);
1004 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries); 1092 m_trustBinaries = startupConfig.GetBoolean("TrustBinaries", m_trustBinaries);
1005 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings); 1093 m_allowScriptCrossings = startupConfig.GetBoolean("AllowScriptCrossing", m_allowScriptCrossings);
1006 m_dontPersistBefore = 1094 m_dontPersistBefore =
@@ -1011,11 +1099,11 @@ namespace OpenSim.Region.Framework.Scenes
1011 m_persistAfter *= 10000000; 1099 m_persistAfter *= 10000000;
1012 1100
1013 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine"); 1101 m_defaultScriptEngine = startupConfig.GetString("DefaultScriptEngine", "XEngine");
1014 1102 m_log.InfoFormat("[SCENE]: Default script engine {0}", m_defaultScriptEngine);
1015 SpawnPointRouting = startupConfig.GetString("SpawnPointRouting", "closest");
1016 TelehubAllowLandmarks = startupConfig.GetBoolean("TelehubAllowLandmark", false);
1017 1103
1018 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl); 1104 m_strictAccessControl = startupConfig.GetBoolean("StrictAccessControl", m_strictAccessControl);
1105 m_seeIntoBannedRegion = startupConfig.GetBoolean("SeeIntoBannedRegion", m_seeIntoBannedRegion);
1106 CombineRegions = startupConfig.GetBoolean("CombineContiguousRegions", false);
1019 1107
1020 string[] possibleMapConfigSections = new string[] { "Map", "Startup" }; 1108 string[] possibleMapConfigSections = new string[] { "Map", "Startup" };
1021 1109
@@ -1061,7 +1149,7 @@ namespace OpenSim.Region.Framework.Scenes
1061 1149
1062 if (grant.Length > 0) 1150 if (grant.Length > 0)
1063 { 1151 {
1064 foreach (string viewer in grant.Split('|')) 1152 foreach (string viewer in grant.Split(','))
1065 { 1153 {
1066 m_AllowedViewers.Add(viewer.Trim().ToLower()); 1154 m_AllowedViewers.Add(viewer.Trim().ToLower());
1067 } 1155 }
@@ -1073,7 +1161,7 @@ namespace OpenSim.Region.Framework.Scenes
1073 1161
1074 if (grant.Length > 0) 1162 if (grant.Length > 0)
1075 { 1163 {
1076 foreach (string viewer in grant.Split('|')) 1164 foreach (string viewer in grant.Split(','))
1077 { 1165 {
1078 m_BannedViewers.Add(viewer.Trim().ToLower()); 1166 m_BannedViewers.Add(viewer.Trim().ToLower());
1079 } 1167 }
@@ -1191,6 +1279,10 @@ namespace OpenSim.Region.Framework.Scenes
1191 StatsReporter.OnSendStatsResult += SendSimStatsPackets; 1279 StatsReporter.OnSendStatsResult += SendSimStatsPackets;
1192 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats; 1280 StatsReporter.OnStatsIncorrect += m_sceneGraph.RecalculateStats;
1193 1281
1282<<<<<<< HEAD
1283=======
1284 MainConsole.Instance.Commands.AddCommand("scene", false, "gc collect", "gc collect", "gc collect", "Cause the garbage collector to make a single pass", HandleGcCollect);
1285>>>>>>> avn/ubitvar
1194 } 1286 }
1195 1287
1196 public Scene(RegionInfo regInfo, PhysicsScene physicsScene) 1288 public Scene(RegionInfo regInfo, PhysicsScene physicsScene)
@@ -1214,13 +1306,15 @@ namespace OpenSim.Region.Framework.Scenes
1214 1306
1215 PhysicalPrims = true; 1307 PhysicalPrims = true;
1216 CollidablePrims = true; 1308 CollidablePrims = true;
1217 PhysicsEnabled = true; 1309 // this is done above acording to config
1310 // PhysicsEnabled = true;
1218 1311
1219 AllowAvatarCrossing = true; 1312 AllowAvatarCrossing = true;
1220 1313
1221 PeriodicBackup = true; 1314 PeriodicBackup = true;
1222 UseBackup = true; 1315 UseBackup = true;
1223 1316
1317<<<<<<< HEAD
1224 IsReprioritizationEnabled = true; 1318 IsReprioritizationEnabled = true;
1225 UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time; 1319 UpdatePrioritizationScheme = UpdatePrioritizationSchemes.Time;
1226 ReprioritizationInterval = 5000; 1320 ReprioritizationInterval = 5000;
@@ -1231,9 +1325,12 @@ namespace OpenSim.Region.Framework.Scenes
1231 RootReprioritizationDistance = 10.0; 1325 RootReprioritizationDistance = 10.0;
1232 ChildReprioritizationDistance = 20.0; 1326 ChildReprioritizationDistance = 20.0;
1233 1327
1328=======
1329>>>>>>> avn/ubitvar
1234 m_eventManager = new EventManager(); 1330 m_eventManager = new EventManager();
1235 1331
1236 m_permissions = new ScenePermissions(this); 1332 m_permissions = new ScenePermissions(this);
1333
1237 } 1334 }
1238 1335
1239 #endregion 1336 #endregion
@@ -1279,6 +1376,7 @@ namespace OpenSim.Region.Framework.Scenes
1279 { 1376 {
1280 if (RegionInfo.RegionHandle != otherRegion.RegionHandle) 1377 if (RegionInfo.RegionHandle != otherRegion.RegionHandle)
1281 { 1378 {
1379<<<<<<< HEAD
1282 //// If these are cast to INT because long + negative values + abs returns invalid data 1380 //// If these are cast to INT because long + negative values + abs returns invalid data
1283 //int resultX = Math.Abs((int)xcell - (int)RegionInfo.RegionLocX); 1381 //int resultX = Math.Abs((int)xcell - (int)RegionInfo.RegionLocX);
1284 //int resultY = Math.Abs((int)ycell - (int)RegionInfo.RegionLocY); 1382 //int resultY = Math.Abs((int)ycell - (int)RegionInfo.RegionLocY);
@@ -1293,6 +1391,9 @@ namespace OpenSim.Region.Framework.Scenes
1293 // RegionInfo.RegionName, otherRegion.RegionName, newRegionX, newRegionY); 1391 // RegionInfo.RegionName, otherRegion.RegionName, newRegionX, newRegionY);
1294 1392
1295 if (!Util.IsOutsideView(dist, thisRegionX, newRegionX, thisRegionY, newRegionY)) 1393 if (!Util.IsOutsideView(dist, thisRegionX, newRegionX, thisRegionY, newRegionY))
1394=======
1395 if (isNeighborRegion(otherRegion))
1396>>>>>>> avn/ubitvar
1296 { 1397 {
1297 // Let the grid service module know, so this can be cached 1398 // Let the grid service module know, so this can be cached
1298 m_eventManager.TriggerOnRegionUp(otherRegion); 1399 m_eventManager.TriggerOnRegionUp(otherRegion);
@@ -1327,6 +1428,21 @@ namespace OpenSim.Region.Framework.Scenes
1327 } 1428 }
1328 } 1429 }
1329 1430
1431 public bool isNeighborRegion(GridRegion otherRegion)
1432 {
1433 int tmp = otherRegion.RegionLocX - (int)RegionInfo.WorldLocX; ;
1434
1435 if (tmp < -otherRegion.RegionSizeX && tmp > RegionInfo.RegionSizeX)
1436 return false;
1437
1438 tmp = otherRegion.RegionLocY - (int)RegionInfo.WorldLocY;
1439
1440 if (tmp < -otherRegion.RegionSizeY && tmp > RegionInfo.RegionSizeY)
1441 return false;
1442
1443 return true;
1444 }
1445
1330 public void AddNeighborRegion(RegionInfo region) 1446 public void AddNeighborRegion(RegionInfo region)
1331 { 1447 {
1332 lock (m_neighbours) 1448 lock (m_neighbours)
@@ -1458,8 +1574,11 @@ namespace OpenSim.Region.Framework.Scenes
1458 // Stop all client threads. 1574 // Stop all client threads.
1459 ForEachScenePresence(delegate(ScenePresence avatar) { CloseAgent(avatar.UUID, false); }); 1575 ForEachScenePresence(delegate(ScenePresence avatar) { CloseAgent(avatar.UUID, false); });
1460 1576
1461 m_log.Debug("[SCENE]: Persisting changed objects"); 1577 m_log.Debug("[SCENE]: TriggerSceneShuttingDown");
1462 EventManager.TriggerSceneShuttingDown(this); 1578 EventManager.TriggerSceneShuttingDown(this);
1579
1580 m_log.Debug("[SCENE]: Persisting changed objects");
1581
1463 Backup(false); 1582 Backup(false);
1464 m_sceneGraph.Close(); 1583 m_sceneGraph.Close();
1465 1584
@@ -1473,6 +1592,7 @@ namespace OpenSim.Region.Framework.Scenes
1473 // attempt to reference a null or disposed physics scene. 1592 // attempt to reference a null or disposed physics scene.
1474 if (PhysicsScene != null) 1593 if (PhysicsScene != null)
1475 { 1594 {
1595 m_log.Debug("[SCENE]: Dispose Physics");
1476 PhysicsScene phys = PhysicsScene; 1596 PhysicsScene phys = PhysicsScene;
1477 // remove the physics engine from both Scene and SceneGraph 1597 // remove the physics engine from both Scene and SceneGraph
1478 PhysicsScene = null; 1598 PhysicsScene = null;
@@ -1504,10 +1624,28 @@ namespace OpenSim.Region.Framework.Scenes
1504// m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName); 1624// m_log.DebugFormat("[SCENE]: Starting Heartbeat timer for {0}", RegionInfo.RegionName);
1505 if (m_heartbeatThread != null) 1625 if (m_heartbeatThread != null)
1506 { 1626 {
1627 m_hbRestarts++;
1628 if(m_hbRestarts > 10)
1629 Environment.Exit(1);
1630 m_log.ErrorFormat("[SCENE]: Restarting heartbeat thread because it hasn't reported in in region {0}", RegionInfo.RegionName);
1631
1632//int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
1633//System.Diagnostics.Process proc = new System.Diagnostics.Process();
1634//proc.EnableRaisingEvents=false;
1635//proc.StartInfo.FileName = "/bin/kill";
1636//proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
1637//proc.Start();
1638//proc.WaitForExit();
1639//Thread.Sleep(1000);
1640//Environment.Exit(1);
1507 m_heartbeatThread.Abort(); 1641 m_heartbeatThread.Abort();
1642 Watchdog.AbortThread(m_heartbeatThread.ManagedThreadId);
1508 m_heartbeatThread = null; 1643 m_heartbeatThread = null;
1509 } 1644 }
1510 1645
1646// m_sceneGraph.PreparePhysicsSimulation();
1647
1648
1511 m_heartbeatThread 1649 m_heartbeatThread
1512 = WorkManager.StartThread( 1650 = WorkManager.StartThread(
1513 Heartbeat, string.Format("Heartbeat-({0})", RegionInfo.RegionName.Replace(" ", "_")), ThreadPriority.Normal, false, false); 1651 Heartbeat, string.Format("Heartbeat-({0})", RegionInfo.RegionName.Replace(" ", "_")), ThreadPriority.Normal, false, false);
@@ -1687,6 +1825,7 @@ namespace OpenSim.Region.Framework.Scenes
1687 endFrame = Frame + frames; 1825 endFrame = Frame + frames;
1688 1826
1689 float physicsFPS = 0f; 1827 float physicsFPS = 0f;
1828<<<<<<< HEAD
1690 int previousFrameTick, tmpMS; 1829 int previousFrameTick, tmpMS;
1691 1830
1692 // These variables will be used to save the precise frame time using the 1831 // These variables will be used to save the precise frame time using the
@@ -1703,22 +1842,42 @@ namespace OpenSim.Region.Framework.Scenes
1703 // Begin the stopwatch to keep track of the time that the frame 1842 // Begin the stopwatch to keep track of the time that the frame
1704 // started running to determine how long the frame took to complete 1843 // started running to determine how long the frame took to complete
1705 totalFrameStopwatch.Start(); 1844 totalFrameStopwatch.Start();
1845=======
1846 int tmpMS;
1847 int previousFrameTick;
1848 int maintc;
1849 int sleepMS;
1850 int framestart;
1851>>>>>>> avn/ubitvar
1706 1852
1707 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame)) 1853 while (!m_shuttingDown && ((endFrame == null && Active) || Frame < endFrame))
1708 { 1854 {
1855 framestart = Util.EnvironmentTickCount();
1709 ++Frame; 1856 ++Frame;
1710 1857
1711 // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName); 1858 // m_log.DebugFormat("[SCENE]: Processing frame {0} in {1}", Frame, RegionInfo.RegionName);
1712 1859
1860<<<<<<< HEAD
1713 agentMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0; 1861 agentMS = eventMS = backupMS = terrainMS = landMS = spareMS = 0;
1862=======
1863 agentMS = tempOnRezMS = eventMS = backupMS = terrainMS = landMS = 0;
1864>>>>>>> avn/ubitvar
1714 1865
1715 try 1866 try
1716 { 1867 {
1717 EventManager.TriggerRegionHeartbeatStart(this); 1868 EventManager.TriggerRegionHeartbeatStart(this);
1718 1869
1719 // Apply taints in terrain module to terrain in physics scene 1870 // Apply taints in terrain module to terrain in physics scene
1871
1872 tmpMS = Util.EnvironmentTickCount();
1873 if (Frame % 4 == 0)
1874 {
1875 CheckTerrainUpdates();
1876 }
1877
1720 if (Frame % m_update_terrain == 0) 1878 if (Frame % m_update_terrain == 0)
1721 { 1879 {
1880<<<<<<< HEAD
1722 // At several points inside the code there was a need to 1881 // At several points inside the code there was a need to
1723 // create a more precise measurement of time elapsed. 1882 // create a more precise measurement of time elapsed.
1724 // This led to the addition of variables that have a 1883 // This led to the addition of variables that have a
@@ -1749,6 +1908,12 @@ namespace OpenSim.Region.Framework.Scenes
1749 // feel right modifying the code to that degree at this 1908 // feel right modifying the code to that degree at this
1750 // point in time, the precise values all begin with the 1909 // point in time, the precise values all begin with the
1751 // keyword precise 1910 // keyword precise
1911=======
1912 UpdateTerrain();
1913 }
1914
1915 terrainMS = Util.EnvironmentTickCountSubtract(tmpMS);
1916>>>>>>> avn/ubitvar
1752 1917
1753 tmpMS = Util.EnvironmentTickCount(); 1918 tmpMS = Util.EnvironmentTickCount();
1754 1919
@@ -1816,6 +1981,19 @@ namespace OpenSim.Region.Framework.Scenes
1816 1981
1817 agentMS += Util.EnvironmentTickCountSubtract(tmpMS); 1982 agentMS += Util.EnvironmentTickCountSubtract(tmpMS);
1818 1983
1984<<<<<<< HEAD
1985=======
1986
1987 // Delete temp-on-rez stuff
1988 if (Frame % m_update_temp_cleaning == 0 && !m_cleaningTemps)
1989 {
1990 tmpMS = Util.EnvironmentTickCount();
1991 m_cleaningTemps = true;
1992 Util.FireAndForget(delegate { CleanTempObjects(); m_cleaningTemps = false; });
1993 tempOnRezMS = Util.EnvironmentTickCountSubtract(tmpMS);
1994 }
1995
1996>>>>>>> avn/ubitvar
1819 if (Frame % m_update_events == 0) 1997 if (Frame % m_update_events == 0)
1820 { 1998 {
1821 tmpMS = Util.EnvironmentTickCount(); 1999 tmpMS = Util.EnvironmentTickCount();
@@ -1891,6 +2069,7 @@ namespace OpenSim.Region.Framework.Scenes
1891 preciseSimFrameTime += 2069 preciseSimFrameTime +=
1892 simFrameStopwatch.Elapsed.TotalMilliseconds; 2070 simFrameStopwatch.Elapsed.TotalMilliseconds;
1893 2071
2072<<<<<<< HEAD
1894 if (!UpdateOnTimer) 2073 if (!UpdateOnTimer)
1895 { 2074 {
1896 Watchdog.UpdateThread(); 2075 Watchdog.UpdateThread();
@@ -1918,13 +2097,40 @@ namespace OpenSim.Region.Framework.Scenes
1918 previousFrameTick = m_lastFrameTick; 2097 previousFrameTick = m_lastFrameTick;
1919 frameMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick); 2098 frameMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick);
1920 m_lastFrameTick = Util.EnvironmentTickCount(); 2099 m_lastFrameTick = Util.EnvironmentTickCount();
2100=======
2101 otherMS = tempOnRezMS + eventMS + backupMS + terrainMS + landMS;
1921 2102
1922 // if (Frame%m_update_avatars == 0)
1923 // UpdateInWorldTime();
1924 StatsReporter.AddPhysicsFPS(physicsFPS); 2103 StatsReporter.AddPhysicsFPS(physicsFPS);
1925 StatsReporter.AddTimeDilation(TimeDilation); 2104 StatsReporter.AddTimeDilation(TimeDilation);
1926 StatsReporter.AddFPS(1); 2105 StatsReporter.AddFPS(1);
1927 2106
2107 StatsReporter.addAgentMS(agentMS);
2108 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
2109 StatsReporter.addOtherMS(otherMS);
2110 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
2111
2112 previousFrameTick = m_lastFrameTick;
2113 m_lastFrameTick = Util.EnvironmentTickCount();
2114 tmpMS = Util.EnvironmentTickCountSubtract(m_lastFrameTick, framestart);
2115 tmpMS = (int)(MinFrameTime * 1000) - tmpMS;
2116
2117 m_firstHeartbeat = false;
2118
2119 sleepMS = Util.EnvironmentTickCount();
2120
2121 if (tmpMS > 0)
2122 Thread.Sleep(tmpMS);
2123
2124 sleepMS = Util.EnvironmentTickCountSubtract(sleepMS);
2125 frameMS = Util.EnvironmentTickCountSubtract(framestart);
2126 StatsReporter.addSleepMS(sleepMS);
2127 StatsReporter.addFrameMS(frameMS);
2128>>>>>>> avn/ubitvar
2129
2130 // if (Frame%m_update_avatars == 0)
2131 // UpdateInWorldTime();
2132
2133<<<<<<< HEAD
1928 StatsReporter.addFrameMS(frameMS); 2134 StatsReporter.addFrameMS(frameMS);
1929 StatsReporter.addAgentMS(agentMS); 2135 StatsReporter.addAgentMS(agentMS);
1930 StatsReporter.addPhysicsMS(physicsMS + physicsMS2); 2136 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
@@ -1932,6 +2138,8 @@ namespace OpenSim.Region.Framework.Scenes
1932 StatsReporter.AddSpareMS(spareMS); 2138 StatsReporter.AddSpareMS(spareMS);
1933 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); 2139 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1934 StatsReporter.AddScriptMS((int) GetAndResetScriptExecutionTime()); 2140 StatsReporter.AddScriptMS((int) GetAndResetScriptExecutionTime());
2141=======
2142>>>>>>> avn/ubitvar
1935 2143
1936 // Send the correct time values to the stats reporter for the 2144 // Send the correct time values to the stats reporter for the
1937 // frame times 2145 // frame times
@@ -1982,7 +2190,7 @@ namespace OpenSim.Region.Framework.Scenes
1982 public void AddGroupTarget(SceneObjectGroup grp) 2190 public void AddGroupTarget(SceneObjectGroup grp)
1983 { 2191 {
1984 lock (m_groupsWithTargets) 2192 lock (m_groupsWithTargets)
1985 m_groupsWithTargets[grp.UUID] = grp; 2193 m_groupsWithTargets[grp.UUID] = 0;
1986 } 2194 }
1987 2195
1988 public void RemoveGroupTarget(SceneObjectGroup grp) 2196 public void RemoveGroupTarget(SceneObjectGroup grp)
@@ -1993,18 +2201,24 @@ namespace OpenSim.Region.Framework.Scenes
1993 2201
1994 private void CheckAtTargets() 2202 private void CheckAtTargets()
1995 { 2203 {
1996 List<SceneObjectGroup> objs = null; 2204 List<UUID> objs = null;
1997 2205
1998 lock (m_groupsWithTargets) 2206 lock (m_groupsWithTargets)
1999 { 2207 {
2000 if (m_groupsWithTargets.Count != 0) 2208 if (m_groupsWithTargets.Count != 0)
2001 objs = new List<SceneObjectGroup>(m_groupsWithTargets.Values); 2209 objs = new List<UUID>(m_groupsWithTargets.Keys);
2002 } 2210 }
2003 2211
2004 if (objs != null) 2212 if (objs != null)
2005 { 2213 {
2006 foreach (SceneObjectGroup entry in objs) 2214 foreach (UUID entry in objs)
2007 entry.checkAtTargets(); 2215 {
2216 SceneObjectGroup grp = GetSceneObjectGroup(entry);
2217 if (grp == null)
2218 m_groupsWithTargets.Remove(entry);
2219 else
2220 grp.checkAtTargets();
2221 }
2008 } 2222 }
2009 } 2223 }
2010 2224
@@ -2028,6 +2242,11 @@ namespace OpenSim.Region.Framework.Scenes
2028 EventManager.TriggerTerrainTick(); 2242 EventManager.TriggerTerrainTick();
2029 } 2243 }
2030 2244
2245 private void CheckTerrainUpdates()
2246 {
2247 EventManager.TriggerTerrainCheckUpdates();
2248 }
2249
2031 /// <summary> 2250 /// <summary>
2032 /// Back up queued up changes 2251 /// Back up queued up changes
2033 /// </summary> 2252 /// </summary>
@@ -2079,7 +2298,7 @@ namespace OpenSim.Region.Framework.Scenes
2079 msg.fromAgentName = "Server"; 2298 msg.fromAgentName = "Server";
2080 msg.dialog = (byte)19; // Object msg 2299 msg.dialog = (byte)19; // Object msg
2081 msg.fromGroup = false; 2300 msg.fromGroup = false;
2082 msg.offline = (byte)0; 2301 msg.offline = (byte)1;
2083 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID; 2302 msg.ParentEstateID = RegionInfo.EstateSettings.ParentEstateID;
2084 msg.Position = Vector3.Zero; 2303 msg.Position = Vector3.Zero;
2085 msg.RegionID = RegionInfo.RegionID.Guid; 2304 msg.RegionID = RegionInfo.RegionID.Guid;
@@ -2315,7 +2534,7 @@ namespace OpenSim.Region.Framework.Scenes
2315 return PhysicsScene.SupportsRaycastWorldFiltered(); 2534 return PhysicsScene.SupportsRaycastWorldFiltered();
2316 } 2535 }
2317 2536
2318 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter) 2537 public object RayCastFiltered(Vector3 position, Vector3 direction, float length, int Count, RayFilterFlags filter)
2319 { 2538 {
2320 if (PhysicsScene == null) 2539 if (PhysicsScene == null)
2321 return null; 2540 return null;
@@ -2337,14 +2556,24 @@ namespace OpenSim.Region.Framework.Scenes
2337 /// <returns></returns> 2556 /// <returns></returns>
2338 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter) 2557 public Vector3 GetNewRezLocation(Vector3 RayStart, Vector3 RayEnd, UUID RayTargetID, Quaternion rot, byte bypassRayCast, byte RayEndIsIntersection, bool frontFacesOnly, Vector3 scale, bool FaceCenter)
2339 { 2558 {
2559
2560 float wheight = (float)RegionInfo.RegionSettings.WaterHeight;
2561 Vector3 wpos = Vector3.Zero;
2562 // Check for water surface intersection from above
2563 if ( (RayStart.Z > wheight) && (RayEnd.Z < wheight) )
2564 {
2565 float ratio = (RayStart.Z - wheight) / (RayStart.Z - RayEnd.Z);
2566 wpos.X = RayStart.X - (ratio * (RayStart.X - RayEnd.X));
2567 wpos.Y = RayStart.Y - (ratio * (RayStart.Y - RayEnd.Y));
2568 wpos.Z = wheight;
2569 }
2570
2340 Vector3 pos = Vector3.Zero; 2571 Vector3 pos = Vector3.Zero;
2341 if (RayEndIsIntersection == (byte)1) 2572 if (RayEndIsIntersection == (byte)1)
2342 { 2573 {
2343 pos = RayEnd; 2574 pos = RayEnd;
2344 return pos;
2345 } 2575 }
2346 2576 else if (RayTargetID != UUID.Zero)
2347 if (RayTargetID != UUID.Zero)
2348 { 2577 {
2349 SceneObjectPart target = GetSceneObjectPart(RayTargetID); 2578 SceneObjectPart target = GetSceneObjectPart(RayTargetID);
2350 2579
@@ -2389,13 +2618,10 @@ namespace OpenSim.Region.Framework.Scenes
2389 //pos.Z -= 0.25F; 2618 //pos.Z -= 0.25F;
2390 2619
2391 } 2620 }
2392
2393 return pos;
2394 } 2621 }
2395 else 2622 else
2396 { 2623 {
2397 // We don't have a target here, so we're going to raytrace all the objects in the scene. 2624 // We don't have a target here, so we're going to raytrace all the objects in the scene.
2398
2399 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false); 2625 EntityIntersection ei = m_sceneGraph.GetClosestIntersectingPrim(new Ray(AXOrigin, AXdirection), true, false);
2400 2626
2401 // Un-comment the following line to print the raytrace results to the console. 2627 // Un-comment the following line to print the raytrace results to the console.
@@ -2403,15 +2629,18 @@ namespace OpenSim.Region.Framework.Scenes
2403 2629
2404 if (ei.HitTF) 2630 if (ei.HitTF)
2405 { 2631 {
2632<<<<<<< HEAD
2406 pos = ei.ipoint; 2633 pos = ei.ipoint;
2407 } 2634 }
2635=======
2636 pos = new Vector3(ei.ipoint.X, ei.ipoint.Y, ei.ipoint.Z);
2637 }
2638>>>>>>> avn/ubitvar
2408 else 2639 else
2409 { 2640 {
2410 // fall back to our stupid functionality 2641 // fall back to our stupid functionality
2411 pos = RayEnd; 2642 pos = RayEnd;
2412 } 2643 }
2413
2414 return pos;
2415 } 2644 }
2416 } 2645 }
2417 else 2646 else
@@ -2422,8 +2651,12 @@ namespace OpenSim.Region.Framework.Scenes
2422 //increase height so its above the ground. 2651 //increase height so its above the ground.
2423 //should be getting the normal of the ground at the rez point and using that? 2652 //should be getting the normal of the ground at the rez point and using that?
2424 pos.Z += scale.Z / 2f; 2653 pos.Z += scale.Z / 2f;
2425 return pos; 2654// return pos;
2426 } 2655 }
2656
2657 // check against posible water intercept
2658 if (wpos.Z > pos.Z) pos = wpos;
2659 return pos;
2427 } 2660 }
2428 2661
2429 2662
@@ -2514,12 +2747,12 @@ namespace OpenSim.Region.Framework.Scenes
2514 { 2747 {
2515 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates)) 2748 if (m_sceneGraph.AddRestoredSceneObject(sceneObject, attachToBackup, alreadyPersisted, sendClientUpdates))
2516 { 2749 {
2750 sceneObject.IsDeleted = false;
2517 EventManager.TriggerObjectAddedToScene(sceneObject); 2751 EventManager.TriggerObjectAddedToScene(sceneObject);
2518 return true; 2752 return true;
2519 } 2753 }
2520 2754
2521 return false; 2755 return false;
2522
2523 } 2756 }
2524 2757
2525 /// <summary> 2758 /// <summary>
@@ -2611,6 +2844,15 @@ namespace OpenSim.Region.Framework.Scenes
2611 /// </summary> 2844 /// </summary>
2612 public void DeleteAllSceneObjects() 2845 public void DeleteAllSceneObjects()
2613 { 2846 {
2847 DeleteAllSceneObjects(false);
2848 }
2849
2850 /// <summary>
2851 /// Delete every object from the scene. This does not include attachments worn by avatars.
2852 /// </summary>
2853 public void DeleteAllSceneObjects(bool exceptNoCopy)
2854 {
2855 List<SceneObjectGroup> toReturn = new List<SceneObjectGroup>();
2614 lock (Entities) 2856 lock (Entities)
2615 { 2857 {
2616 EntityBase[] entities = Entities.GetEntities(); 2858 EntityBase[] entities = Entities.GetEntities();
@@ -2619,11 +2861,24 @@ namespace OpenSim.Region.Framework.Scenes
2619 if (e is SceneObjectGroup) 2861 if (e is SceneObjectGroup)
2620 { 2862 {
2621 SceneObjectGroup sog = (SceneObjectGroup)e; 2863 SceneObjectGroup sog = (SceneObjectGroup)e;
2622 if (!sog.IsAttachment) 2864 if (sog != null && !sog.IsAttachment)
2623 DeleteSceneObject((SceneObjectGroup)e, false); 2865 {
2866 if (!exceptNoCopy || ((sog.GetEffectivePermissions() & (uint)PermissionMask.Copy) != 0))
2867 {
2868 DeleteSceneObject((SceneObjectGroup)e, false);
2869 }
2870 else
2871 {
2872 toReturn.Add((SceneObjectGroup)e);
2873 }
2874 }
2624 } 2875 }
2625 } 2876 }
2626 } 2877 }
2878 if (toReturn.Count > 0)
2879 {
2880 returnObjects(toReturn.ToArray(), UUID.Zero);
2881 }
2627 } 2882 }
2628 2883
2629 /// <summary> 2884 /// <summary>
@@ -2654,6 +2909,14 @@ namespace OpenSim.Region.Framework.Scenes
2654 else 2909 else
2655 group.StopScriptInstances(); 2910 group.StopScriptInstances();
2656 2911
2912 List<UUID> avatars = group.GetSittingAvatars();
2913 foreach (UUID av in avatars)
2914 {
2915 ScenePresence p = GetScenePresence(av);
2916 if (p != null && p.ParentUUID == UUID.Zero)
2917 p.StandUp();
2918 }
2919
2657 SceneObjectPart[] partList = group.Parts; 2920 SceneObjectPart[] partList = group.Parts;
2658 2921
2659 foreach (SceneObjectPart part in partList) 2922 foreach (SceneObjectPart part in partList)
@@ -2681,6 +2944,8 @@ namespace OpenSim.Region.Framework.Scenes
2681 } 2944 }
2682 2945
2683 group.DeleteGroupFromScene(silent); 2946 group.DeleteGroupFromScene(silent);
2947 if (!silent)
2948 SendKillObject(new List<uint>() { group.LocalId });
2684 2949
2685 // m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); 2950 // m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID);
2686 } 2951 }
@@ -2717,6 +2982,11 @@ namespace OpenSim.Region.Framework.Scenes
2717 return false; 2982 return false;
2718 } 2983 }
2719 2984
2985
2986 public void updateScenePartGroup(SceneObjectPart part, SceneObjectGroup grp)
2987 {
2988 m_sceneGraph.updateScenePartGroup(part, grp);
2989 }
2720 /// <summary> 2990 /// <summary>
2721 /// Move the given scene object into a new region depending on which region its absolute position has moved 2991 /// Move the given scene object into a new region depending on which region its absolute position has moved
2722 /// into. 2992 /// into.
@@ -2743,10 +3013,55 @@ namespace OpenSim.Region.Framework.Scenes
2743 m_log.Warn("[SCENE]: exception when trying to remove the prim that crossed the border."); 3013 m_log.Warn("[SCENE]: exception when trying to remove the prim that crossed the border.");
2744 } 3014 }
2745 return; 3015 return;
3016<<<<<<< HEAD
3017=======
3018 }
3019
3020 if (grp.RootPart.RETURN_AT_EDGE)
3021 {
3022 // We remove the object here
3023 try
3024 {
3025 List<SceneObjectGroup> objects = new List<SceneObjectGroup>();
3026 objects.Add(grp);
3027 SceneObjectGroup[] objectsArray = objects.ToArray();
3028 returnObjects(objectsArray, UUID.Zero);
3029 }
3030 catch (Exception)
3031 {
3032 m_log.Warn("[SCENE]: exception when trying to return the prim that crossed the border.");
3033 }
3034 return;
3035 }
3036
3037 if (EntityTransferModule != null)
3038 EntityTransferModule.Cross(grp, attemptedPosition, silent);
3039 }
3040
3041 // Simple test to see if a position is in the current region.
3042 // This test is mostly used to see if a region crossing is necessary.
3043 // Assuming the position is relative to the region so anything outside its bounds.
3044 // Return 'true' if position inside region.
3045 public bool PositionIsInCurrentRegion(Vector3 pos)
3046 {
3047 bool ret = false;
3048 int xx = (int)Math.Floor(pos.X);
3049 int yy = (int)Math.Floor(pos.Y);
3050 if (xx < 0 || yy < 0)
3051 return false;
3052
3053 IRegionCombinerModule regionCombinerModule = RequestModuleInterface<IRegionCombinerModule>();
3054 if (regionCombinerModule == null)
3055 {
3056 // Regular region. Just check for region size
3057 if (xx < RegionInfo.RegionSizeX && yy < RegionInfo.RegionSizeY )
3058 ret = true;
3059>>>>>>> avn/ubitvar
2746 } 3060 }
2747 3061
2748 if (grp.RootPart.RETURN_AT_EDGE) 3062 if (grp.RootPart.RETURN_AT_EDGE)
2749 { 3063 {
3064<<<<<<< HEAD
2750 // We remove the object here 3065 // We remove the object here
2751 try 3066 try
2752 { 3067 {
@@ -2795,6 +3110,16 @@ namespace OpenSim.Region.Framework.Scenes
2795 3110
2796 } 3111 }
2797 3112
3113=======
3114 // We're in a mega-region so see if we are still in that larger region
3115 ret = regionCombinerModule.PositionIsInMegaregion(this.RegionInfo.RegionID, xx, yy);
3116 }
3117
3118 return ret;
3119
3120 }
3121
3122>>>>>>> avn/ubitvar
2798 /// <summary> 3123 /// <summary>
2799 /// Called when objects or attachments cross the border, or teleport, between regions. 3124 /// Called when objects or attachments cross the border, or teleport, between regions.
2800 /// </summary> 3125 /// </summary>
@@ -2816,8 +3141,55 @@ namespace OpenSim.Region.Framework.Scenes
2816 return false; 3141 return false;
2817 } 3142 }
2818 3143
3144<<<<<<< HEAD
2819 if (!EntityTransferModule.HandleIncomingSceneObject(newObject, newPosition)) 3145 if (!EntityTransferModule.HandleIncomingSceneObject(newObject, newPosition))
2820 return false; 3146 return false;
3147=======
3148 // If the user is banned, we won't let any of their objects
3149 // enter. Period.
3150 //
3151 if (RegionInfo.EstateSettings.IsBanned(newObject.OwnerID, 36))
3152 {
3153 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", newObject.OwnerID);
3154 return false;
3155 }
3156
3157 if (newPosition != Vector3.Zero)
3158 newObject.RootPart.GroupPosition = newPosition;
3159
3160 if (!AddSceneObject(newObject))
3161 {
3162 m_log.DebugFormat(
3163 "[INTERREGION]: Problem adding scene object {0} in {1} ", newObject.UUID, RegionInfo.RegionName);
3164 return false;
3165 }
3166
3167 if (!newObject.IsAttachment)
3168 {
3169 // FIXME: It would be better to never add the scene object at all rather than add it and then delete
3170 // it
3171 if (!Permissions.CanObjectEntry(newObject.UUID, true, newObject.AbsolutePosition))
3172 {
3173 // Deny non attachments based on parcel settings
3174 //
3175 m_log.Info("[INTERREGION]: Denied prim crossing because of parcel settings");
3176
3177 DeleteSceneObject(newObject, false);
3178
3179 return false;
3180 }
3181
3182 // For attachments, we need to wait until the agent is root
3183 // before we restart the scripts, or else some functions won't work.
3184 newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
3185 newObject.ResumeScripts();
3186
3187 // AddSceneObject already does this and doing it again messes
3188 // up region crossings, so don't.
3189 //if (newObject.RootPart.KeyframeMotion != null)
3190 // newObject.RootPart.KeyframeMotion.UpdateSceneObject(newObject);
3191 }
3192>>>>>>> avn/ubitvar
2821 3193
2822 // Do this as late as possible so that listeners have full access to the incoming object 3194 // Do this as late as possible so that listeners have full access to the incoming object
2823 EventManager.TriggerOnIncomingSceneObject(newObject); 3195 EventManager.TriggerOnIncomingSceneObject(newObject);
@@ -2834,6 +3206,23 @@ namespace OpenSim.Region.Framework.Scenes
2834 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns> 3206 /// <returns>True if the SceneObjectGroup was added, False if it was not</returns>
2835 public bool AddSceneObject(SceneObjectGroup sceneObject) 3207 public bool AddSceneObject(SceneObjectGroup sceneObject)
2836 { 3208 {
3209 if (sceneObject.OwnerID == UUID.Zero)
3210 {
3211 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero", sceneObject.UUID);
3212 return false;
3213 }
3214
3215 // If the user is banned, we won't let any of their objects
3216 // enter. Period.
3217 //
3218 int flags = GetUserFlags(sceneObject.OwnerID);
3219 if (RegionInfo.EstateSettings.IsBanned(sceneObject.OwnerID, flags))
3220 {
3221 m_log.InfoFormat("[INTERREGION]: Denied prim crossing for banned avatar {0}", sceneObject.OwnerID);
3222
3223 return false;
3224 }
3225
2837 // Force allocation of new LocalId 3226 // Force allocation of new LocalId
2838 // 3227 //
2839 SceneObjectPart[] parts = sceneObject.Parts; 3228 SceneObjectPart[] parts = sceneObject.Parts;
@@ -2870,22 +3259,64 @@ namespace OpenSim.Region.Framework.Scenes
2870 // information that this is due to a teleport/border cross rather than an ordinary attachment. 3259 // information that this is due to a teleport/border cross rather than an ordinary attachment.
2871 // We currently do this in Scene.MakeRootAgent() instead. 3260 // We currently do this in Scene.MakeRootAgent() instead.
2872 if (AttachmentsModule != null) 3261 if (AttachmentsModule != null)
2873 AttachmentsModule.AttachObject(sp, grp, 0, false, false, true); 3262 AttachmentsModule.AttachObject(sp, grp, 0, false, false, false, true);
2874 } 3263 }
2875 else 3264 else
2876 { 3265 {
3266 m_log.DebugFormat("[SCENE]: Attachment {0} arrived and scene presence was not found, setting to temp", sceneObject.UUID);
2877 RootPrim.RemFlag(PrimFlags.TemporaryOnRez); 3267 RootPrim.RemFlag(PrimFlags.TemporaryOnRez);
2878 RootPrim.AddFlag(PrimFlags.TemporaryOnRez); 3268 RootPrim.AddFlag(PrimFlags.TemporaryOnRez);
2879 } 3269 }
3270 if (sceneObject.OwnerID == UUID.Zero)
3271 {
3272 m_log.ErrorFormat("[SCENE]: Owner ID for {0} was zero after attachment processing. BUG!", sceneObject.UUID);
3273 return false;
3274 }
2880 } 3275 }
2881 else 3276 else
2882 { 3277 {
3278 if (sceneObject.OwnerID == UUID.Zero)
3279 {
3280 m_log.ErrorFormat("[SCENE]: Owner ID for non-attachment {0} was zero", sceneObject.UUID);
3281 return false;
3282 }
2883 AddRestoredSceneObject(sceneObject, true, false); 3283 AddRestoredSceneObject(sceneObject, true, false);
2884 } 3284 }
2885 3285
2886 return true; 3286 return true;
2887 } 3287 }
2888 3288
3289<<<<<<< HEAD
3290=======
3291 private int GetStateSource(SceneObjectGroup sog)
3292 {
3293 ScenePresence sp = GetScenePresence(sog.OwnerID);
3294
3295 if (sp != null)
3296 return sp.GetStateSource();
3297
3298 return 2; // StateSource.PrimCrossing
3299 }
3300
3301 public int GetUserFlags(UUID user)
3302 {
3303 //Unfortunately the SP approach means that the value is cached until region is restarted
3304 /*
3305 ScenePresence sp;
3306 if (TryGetScenePresence(user, out sp))
3307 {
3308 return sp.UserFlags;
3309 }
3310 else
3311 {
3312 */
3313 UserAccount uac = UserAccountService.GetUserAccount(RegionInfo.ScopeID, user);
3314 if (uac == null)
3315 return 0;
3316 return uac.UserFlags;
3317 //}
3318 }
3319>>>>>>> avn/ubitvar
2889 #endregion 3320 #endregion
2890 3321
2891 #region Add/Remove Avatar Methods 3322 #region Add/Remove Avatar Methods
@@ -2921,9 +3352,15 @@ namespace OpenSim.Region.Framework.Scenes
2921 vialogin 3352 vialogin
2922 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 3353 = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
2923 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; 3354 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
3355<<<<<<< HEAD
2924 3356
2925 // CheckHeartbeat(); 3357 // CheckHeartbeat();
2926 3358
3359=======
3360
3361 CheckHeartbeat();
3362
3363>>>>>>> avn/ubitvar
2927 sp = GetScenePresence(client.AgentId); 3364 sp = GetScenePresence(client.AgentId);
2928 3365
2929 // XXX: Not sure how good it is to add a new client if a scene presence already exists. Possibly this 3366 // XXX: Not sure how good it is to add a new client if a scene presence already exists. Possibly this
@@ -2933,6 +3370,7 @@ namespace OpenSim.Region.Framework.Scenes
2933 if (sp == null) 3370 if (sp == null)
2934 { 3371 {
2935 m_log.DebugFormat( 3372 m_log.DebugFormat(
3373<<<<<<< HEAD
2936 "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}", 3374 "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}",
2937 client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos); 3375 client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos);
2938 3376
@@ -2954,6 +3392,30 @@ namespace OpenSim.Region.Framework.Scenes
2954 m_eventManager.TriggerOnNewPresence(sp); 3392 m_eventManager.TriggerOnNewPresence(sp);
2955 3393
2956 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags; 3394 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
3395=======
3396 "[SCENE]: Adding new child scene presence {0} {1} to scene {2} at pos {3}, tpflags: {4}",
3397 client.Name, client.AgentId, RegionInfo.RegionName, client.StartPos,
3398 ((TPFlags)aCircuit.teleportFlags).ToString());
3399
3400 m_clientManager.Add(client);
3401 SubscribeToClientEvents(client);
3402
3403 sp = m_sceneGraph.CreateAndAddChildScenePresence(client, aCircuit.Appearance, type);
3404
3405 sp.TeleportFlags = (TPFlags)aCircuit.teleportFlags;
3406
3407/* done in completMovement
3408 InventoryFolderBase cof = InventoryService.GetFolderForType(client.AgentId, (AssetType)46);
3409 if (cof == null)
3410 sp.COF = UUID.Zero;
3411 else
3412 sp.COF = cof.ID;
3413
3414 m_log.DebugFormat("[SCENE]: COF for {0} is {1}", client.AgentId, sp.COF);
3415 */
3416 m_eventManager.TriggerOnNewPresence(sp);
3417
3418>>>>>>> avn/ubitvar
2957 } 3419 }
2958 else 3420 else
2959 { 3421 {
@@ -2992,6 +3454,15 @@ namespace OpenSim.Region.Framework.Scenes
2992 return sp; 3454 return sp;
2993 } 3455 }
2994 3456
3457 public string GetAgentHomeURI(UUID agentID)
3458 {
3459 AgentCircuitData circuit = AuthenticateHandler.GetAgentCircuitData(agentID);
3460 if (circuit != null && circuit.ServiceURLs != null && circuit.ServiceURLs.ContainsKey("HomeURI"))
3461 return circuit.ServiceURLs["HomeURI"].ToString();
3462 else
3463 return null;
3464 }
3465
2995 /// <summary> 3466 /// <summary>
2996 /// Returns the Home URI of the agent, or null if unknown. 3467 /// Returns the Home URI of the agent, or null if unknown.
2997 /// </summary> 3468 /// </summary>
@@ -3088,19 +3559,15 @@ namespace OpenSim.Region.Framework.Scenes
3088 // and the scene presence and the client, if they exist 3559 // and the scene presence and the client, if they exist
3089 try 3560 try
3090 { 3561 {
3091 // We need to wait for the client to make UDP contact first.
3092 // It's the UDP contact that creates the scene presence
3093 ScenePresence sp = WaitGetScenePresence(agentID); 3562 ScenePresence sp = WaitGetScenePresence(agentID);
3563
3094 if (sp != null) 3564 if (sp != null)
3095 { 3565 {
3096 PresenceService.LogoutAgent(sp.ControllingClient.SessionId); 3566 PresenceService.LogoutAgent(sp.ControllingClient.SessionId);
3097 3567
3098 CloseAgent(sp.UUID, false); 3568 CloseAgent(sp.UUID, false);
3099 } 3569 }
3100 else 3570
3101 {
3102 m_log.WarnFormat("[SCENE]: Could not find scene presence for {0}", agentID);
3103 }
3104 // BANG! SLASH! 3571 // BANG! SLASH!
3105 m_authenticateHandler.RemoveCircuit(agentID); 3572 m_authenticateHandler.RemoveCircuit(agentID);
3106 3573
@@ -3137,7 +3604,7 @@ namespace OpenSim.Region.Framework.Scenes
3137 3604
3138 public virtual void SubscribeToClientTerrainEvents(IClientAPI client) 3605 public virtual void SubscribeToClientTerrainEvents(IClientAPI client)
3139 { 3606 {
3140 client.OnRegionHandShakeReply += SendLayerData; 3607// client.OnRegionHandShakeReply += SendLayerData;
3141 } 3608 }
3142 3609
3143 public virtual void SubscribeToClientPrimEvents(IClientAPI client) 3610 public virtual void SubscribeToClientPrimEvents(IClientAPI client)
@@ -3145,6 +3612,8 @@ namespace OpenSim.Region.Framework.Scenes
3145 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition; 3612 client.OnUpdatePrimGroupPosition += m_sceneGraph.UpdatePrimGroupPosition;
3146 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition; 3613 client.OnUpdatePrimSinglePosition += m_sceneGraph.UpdatePrimSinglePosition;
3147 3614
3615 client.onClientChangeObject += m_sceneGraph.ClientChangeObject;
3616
3148 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation; 3617 client.OnUpdatePrimGroupRotation += m_sceneGraph.UpdatePrimGroupRotation;
3149 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation; 3618 client.OnUpdatePrimGroupMouseRotation += m_sceneGraph.UpdatePrimGroupRotation;
3150 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation; 3619 client.OnUpdatePrimSingleRotation += m_sceneGraph.UpdatePrimSingleRotation;
@@ -3201,6 +3670,7 @@ namespace OpenSim.Region.Framework.Scenes
3201 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory; 3670 client.OnFetchInventory += m_asyncInventorySender.HandleFetchInventory;
3202 client.OnUpdateInventoryItem += UpdateInventoryItemAsset; 3671 client.OnUpdateInventoryItem += UpdateInventoryItemAsset;
3203 client.OnCopyInventoryItem += CopyInventoryItem; 3672 client.OnCopyInventoryItem += CopyInventoryItem;
3673 client.OnMoveItemsAndLeaveCopy += MoveInventoryItemsLeaveCopy;
3204 client.OnMoveInventoryItem += MoveInventoryItem; 3674 client.OnMoveInventoryItem += MoveInventoryItem;
3205 client.OnRemoveInventoryItem += RemoveInventoryItem; 3675 client.OnRemoveInventoryItem += RemoveInventoryItem;
3206 client.OnRemoveInventoryFolder += RemoveInventoryFolder; 3676 client.OnRemoveInventoryFolder += RemoveInventoryFolder;
@@ -3262,7 +3732,7 @@ namespace OpenSim.Region.Framework.Scenes
3262 3732
3263 public virtual void UnSubscribeToClientTerrainEvents(IClientAPI client) 3733 public virtual void UnSubscribeToClientTerrainEvents(IClientAPI client)
3264 { 3734 {
3265 client.OnRegionHandShakeReply -= SendLayerData; 3735// client.OnRegionHandShakeReply -= SendLayerData;
3266 } 3736 }
3267 3737
3268 public virtual void UnSubscribeToClientPrimEvents(IClientAPI client) 3738 public virtual void UnSubscribeToClientPrimEvents(IClientAPI client)
@@ -3270,6 +3740,8 @@ namespace OpenSim.Region.Framework.Scenes
3270 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition; 3740 client.OnUpdatePrimGroupPosition -= m_sceneGraph.UpdatePrimGroupPosition;
3271 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition; 3741 client.OnUpdatePrimSinglePosition -= m_sceneGraph.UpdatePrimSinglePosition;
3272 3742
3743 client.onClientChangeObject -= m_sceneGraph.ClientChangeObject;
3744
3273 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3745 client.OnUpdatePrimGroupRotation -= m_sceneGraph.UpdatePrimGroupRotation;
3274 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation; 3746 client.OnUpdatePrimGroupMouseRotation -= m_sceneGraph.UpdatePrimGroupRotation;
3275 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation; 3747 client.OnUpdatePrimSingleRotation -= m_sceneGraph.UpdatePrimSingleRotation;
@@ -3518,6 +3990,10 @@ namespace OpenSim.Region.Framework.Scenes
3518 /// <param name='closeChildAgents'> 3990 /// <param name='closeChildAgents'>
3519 /// Close the neighbour child agents associated with this client. 3991 /// Close the neighbour child agents associated with this client.
3520 /// </param> 3992 /// </param>
3993 ///
3994
3995 private object m_removeClientPrivLock = new Object();
3996
3521 public void RemoveClient(UUID agentID, bool closeChildAgents) 3997 public void RemoveClient(UUID agentID, bool closeChildAgents)
3522 { 3998 {
3523 AgentCircuitData acd = m_authenticateHandler.GetAgentCircuitData(agentID); 3999 AgentCircuitData acd = m_authenticateHandler.GetAgentCircuitData(agentID);
@@ -3534,8 +4010,13 @@ namespace OpenSim.Region.Framework.Scenes
3534 } 4010 }
3535 4011
3536 // TODO: Can we now remove this lock? 4012 // TODO: Can we now remove this lock?
4013<<<<<<< HEAD
3537 lock (acd) 4014 lock (acd)
3538 { 4015 {
4016=======
4017 lock (m_removeClientPrivLock)
4018 {
4019>>>>>>> avn/ubitvar
3539 bool isChildAgent = false; 4020 bool isChildAgent = false;
3540 4021
3541 ScenePresence avatar = GetScenePresence(agentID); 4022 ScenePresence avatar = GetScenePresence(agentID);
@@ -3579,8 +4060,13 @@ namespace OpenSim.Region.Framework.Scenes
3579 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop 4060 // TODO: We shouldn't use closeChildAgents here - it's being used by the NPC module to stop
3580 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI 4061 // unnecessary operations. This should go away once NPCs have no accompanying IClientAPI
3581 if (closeChildAgents && CapsModule != null) 4062 if (closeChildAgents && CapsModule != null)
4063<<<<<<< HEAD
3582 CapsModule.RemoveCaps(agentID); 4064 CapsModule.RemoveCaps(agentID);
3583 4065
4066=======
4067 CapsModule.RemoveCaps(agentID, avatar.ControllingClient.CircuitCode);
4068
4069>>>>>>> avn/ubitvar
3584 if (closeChildAgents && !isChildAgent) 4070 if (closeChildAgents && !isChildAgent)
3585 { 4071 {
3586 List<ulong> regions = avatar.KnownRegionHandles; 4072 List<ulong> regions = avatar.KnownRegionHandles;
@@ -3591,13 +4077,21 @@ namespace OpenSim.Region.Framework.Scenes
3591 } 4077 }
3592 4078
3593 m_eventManager.TriggerClientClosed(agentID, this); 4079 m_eventManager.TriggerClientClosed(agentID, this);
4080// m_log.Debug("[Scene]TriggerClientClosed done");
3594 m_eventManager.TriggerOnRemovePresence(agentID); 4081 m_eventManager.TriggerOnRemovePresence(agentID);
4082<<<<<<< HEAD
3595 4083
4084=======
4085// m_log.Debug("[Scene]TriggerOnRemovePresence done");
4086
4087>>>>>>> avn/ubitvar
3596 if (!isChildAgent) 4088 if (!isChildAgent)
3597 { 4089 {
3598 if (AttachmentsModule != null) 4090 if (AttachmentsModule != null)
3599 { 4091 {
4092// m_log.Debug("[Scene]DeRezAttachments");
3600 AttachmentsModule.DeRezAttachments(avatar); 4093 AttachmentsModule.DeRezAttachments(avatar);
4094// m_log.Debug("[Scene]DeRezAttachments done");
3601 } 4095 }
3602 4096
3603 ForEachClient( 4097 ForEachClient(
@@ -3611,7 +4105,11 @@ namespace OpenSim.Region.Framework.Scenes
3611 4105
3612 // It's possible for child agents to have transactions if changes are being made cross-border. 4106 // It's possible for child agents to have transactions if changes are being made cross-border.
3613 if (AgentTransactionsModule != null) 4107 if (AgentTransactionsModule != null)
4108 {
4109// m_log.Debug("[Scene]RemoveAgentAssetTransactions");
3614 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); 4110 AgentTransactionsModule.RemoveAgentAssetTransactions(agentID);
4111 }
4112 m_log.Debug("[Scene] The avatar has left the building");
3615 } 4113 }
3616 catch (Exception e) 4114 catch (Exception e)
3617 { 4115 {
@@ -3730,7 +4228,14 @@ namespace OpenSim.Region.Framework.Scenes
3730 /// or other applications where a full grid/Hypergrid presence may not be required.</param> 4228 /// or other applications where a full grid/Hypergrid presence may not be required.</param>
3731 /// <returns>True if the region accepts this agent. False if it does not. False will 4229 /// <returns>True if the region accepts this agent. False if it does not. False will
3732 /// also return a reason.</returns> 4230 /// also return a reason.</returns>
4231<<<<<<< HEAD
3733 public bool NewUserConnection(AgentCircuitData acd, uint teleportFlags, GridRegion source, out string reason, bool requirePresenceLookup) 4232 public bool NewUserConnection(AgentCircuitData acd, uint teleportFlags, GridRegion source, out string reason, bool requirePresenceLookup)
4233=======
4234 ///
4235 private object m_newUserConnLock = new object();
4236
4237 public bool NewUserConnection(AgentCircuitData acd, uint teleportFlags, out string reason, bool requirePresenceLookup)
4238>>>>>>> avn/ubitvar
3734 { 4239 {
3735 bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 || 4240 bool vialogin = ((teleportFlags & (uint)TPFlags.ViaLogin) != 0 ||
3736 (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0); 4241 (teleportFlags & (uint)TPFlags.ViaHGLogin) != 0);
@@ -3763,6 +4268,8 @@ namespace OpenSim.Region.Framework.Scenes
3763 (source == null) ? "" : string.Format("From region {0} ({1}){2}", source.RegionName, source.RegionID, (source.RawServerURI == null) ? "" : " @ " + source.ServerURI) 4268 (source == null) ? "" : string.Format("From region {0} ({1}){2}", source.RegionName, source.RegionID, (source.RawServerURI == null) ? "" : " @ " + source.ServerURI)
3764 ); 4269 );
3765 4270
4271// m_log.DebugFormat("NewUserConnection stack {0}", Environment.StackTrace);
4272
3766 if (!LoginsEnabled) 4273 if (!LoginsEnabled)
3767 { 4274 {
3768 reason = "Logins Disabled"; 4275 reason = "Logins Disabled";
@@ -3890,7 +4397,7 @@ namespace OpenSim.Region.Framework.Scenes
3890 } 4397 }
3891 4398
3892 // TODO: can we remove this lock? 4399 // TODO: can we remove this lock?
3893 lock (acd) 4400 lock (m_newUserConnLock)
3894 { 4401 {
3895 if (sp != null && !sp.IsChildAgent) 4402 if (sp != null && !sp.IsChildAgent)
3896 { 4403 {
@@ -3917,6 +4424,12 @@ namespace OpenSim.Region.Framework.Scenes
3917 // We need the circuit data here for some of the subsequent checks. (groups, for example) 4424 // We need the circuit data here for some of the subsequent checks. (groups, for example)
3918 // If the checks fail, we remove the circuit. 4425 // If the checks fail, we remove the circuit.
3919 acd.teleportFlags = teleportFlags; 4426 acd.teleportFlags = teleportFlags;
4427
4428 // Remove any preexisting circuit - we don't want duplicates
4429 // This is a stab at preventing avatar "ghosting"
4430 if (vialogin)
4431 m_authenticateHandler.RemoveCircuit(acd.AgentID);
4432
3920 m_authenticateHandler.AddNewCircuit(acd.circuitcode, acd); 4433 m_authenticateHandler.AddNewCircuit(acd.circuitcode, acd);
3921 4434
3922 land = LandChannel.GetLandObject(acd.startpos.X, acd.startpos.Y); 4435 land = LandChannel.GetLandObject(acd.startpos.X, acd.startpos.Y);
@@ -3924,6 +4437,9 @@ namespace OpenSim.Region.Framework.Scenes
3924 // On login test land permisions 4437 // On login test land permisions
3925 if (vialogin) 4438 if (vialogin)
3926 { 4439 {
4440 IUserAccountCacheModule cache = RequestModuleInterface<IUserAccountCacheModule>();
4441 if (cache != null)
4442 cache.Remove(acd.firstname + " " + acd.lastname);
3927 if (land != null && !TestLandRestrictions(acd.AgentID, out reason, ref acd.startpos.X, ref acd.startpos.Y)) 4443 if (land != null && !TestLandRestrictions(acd.AgentID, out reason, ref acd.startpos.X, ref acd.startpos.Y))
3928 { 4444 {
3929 m_authenticateHandler.RemoveCircuit(acd.circuitcode); 4445 m_authenticateHandler.RemoveCircuit(acd.circuitcode);
@@ -3978,7 +4494,7 @@ namespace OpenSim.Region.Framework.Scenes
3978 if (CapsModule != null) 4494 if (CapsModule != null)
3979 { 4495 {
3980 CapsModule.SetAgentCapsSeeds(acd); 4496 CapsModule.SetAgentCapsSeeds(acd);
3981 CapsModule.CreateCaps(acd.AgentID); 4497 CapsModule.CreateCaps(acd.AgentID, acd.circuitcode);
3982 } 4498 }
3983 } 4499 }
3984 else 4500 else
@@ -3991,15 +4507,21 @@ namespace OpenSim.Region.Framework.Scenes
3991 { 4507 {
3992 m_log.DebugFormat( 4508 m_log.DebugFormat(
3993 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}", 4509 "[SCENE]: Adjusting known seeds for existing agent {0} in {1}",
4510<<<<<<< HEAD
3994 acd.AgentID, RegionInfo.RegionName); 4511 acd.AgentID, RegionInfo.RegionName);
3995 4512
3996 sp.AdjustKnownSeeds(); 4513 sp.AdjustKnownSeeds();
4514=======
4515 acd.AgentID, RegionInfo.RegionName);
4516>>>>>>> avn/ubitvar
3997 4517
3998 if (CapsModule != null) 4518 if (CapsModule != null)
3999 { 4519 {
4000 CapsModule.SetAgentCapsSeeds(acd); 4520 CapsModule.SetAgentCapsSeeds(acd);
4001 CapsModule.CreateCaps(acd.AgentID); 4521 CapsModule.CreateCaps(acd.AgentID, acd.circuitcode);
4002 } 4522 }
4523
4524 sp.AdjustKnownSeeds();
4003 } 4525 }
4004 } 4526 }
4005 4527
@@ -4009,6 +4531,11 @@ namespace OpenSim.Region.Framework.Scenes
4009 CacheUserName(null, acd); 4531 CacheUserName(null, acd);
4010 } 4532 }
4011 4533
4534 if (CapsModule != null)
4535 {
4536 CapsModule.ActivateCaps(acd.circuitcode);
4537 }
4538
4012 if (vialogin) 4539 if (vialogin)
4013 { 4540 {
4014// CleanDroppedAttachments(); 4541// CleanDroppedAttachments();
@@ -4078,6 +4605,8 @@ namespace OpenSim.Region.Framework.Scenes
4078 } 4605 }
4079 4606
4080 // Honor parcel landing type and position. 4607 // Honor parcel landing type and position.
4608 /*
4609 ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
4081 if (land != null) 4610 if (land != null)
4082 { 4611 {
4083 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero) 4612 if (land.LandData.LandingType == (byte)1 && land.LandData.UserLocation != Vector3.Zero)
@@ -4092,6 +4621,7 @@ namespace OpenSim.Region.Framework.Scenes
4092 } 4621 }
4093 } 4622 }
4094 } 4623 }
4624 */// This is now handled properly in ScenePresence.MakeRootAgent
4095 } 4625 }
4096 4626
4097 return true; 4627 return true;
@@ -4116,12 +4646,21 @@ namespace OpenSim.Region.Framework.Scenes
4116 { 4646 {
4117 if (posX < 0) 4647 if (posX < 0)
4118 posX = 0; 4648 posX = 0;
4649<<<<<<< HEAD
4119 else if (posX >= (float)RegionInfo.RegionSizeX) 4650 else if (posX >= (float)RegionInfo.RegionSizeX)
4120 posX = (float)RegionInfo.RegionSizeX - 0.001f; 4651 posX = (float)RegionInfo.RegionSizeX - 0.001f;
4121 if (posY < 0) 4652 if (posY < 0)
4122 posY = 0; 4653 posY = 0;
4123 else if (posY >= (float)RegionInfo.RegionSizeY) 4654 else if (posY >= (float)RegionInfo.RegionSizeY)
4124 posY = (float)RegionInfo.RegionSizeY - 0.001f; 4655 posY = (float)RegionInfo.RegionSizeY - 0.001f;
4656=======
4657 else if (posX >= RegionInfo.RegionSizeX)
4658 posX = RegionInfo.RegionSizeX - 0.5f;
4659 if (posY < 0)
4660 posY = 0;
4661 else if (posY >= RegionInfo.RegionSizeY)
4662 posY = RegionInfo.RegionSizeY - 0.5f;
4663>>>>>>> avn/ubitvar
4125 4664
4126 reason = String.Empty; 4665 reason = String.Empty;
4127 if (Permissions.IsGod(agentID)) 4666 if (Permissions.IsGod(agentID))
@@ -4225,7 +4764,8 @@ namespace OpenSim.Region.Framework.Scenes
4225 { 4764 {
4226 if (RegionInfo.EstateSettings != null) 4765 if (RegionInfo.EstateSettings != null)
4227 { 4766 {
4228 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID)) 4767 int flags = GetUserFlags(agent.AgentID);
4768 if (RegionInfo.EstateSettings.IsBanned(agent.AgentID, flags))
4229 { 4769 {
4230 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist", 4770 m_log.WarnFormat("[CONNECTION BEGIN]: Denied access to: {0} ({1} {2}) at {3} because the user is on the banlist",
4231 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName); 4771 agent.AgentID, agent.firstname, agent.lastname, RegionInfo.RegionName);
@@ -4414,6 +4954,22 @@ namespace OpenSim.Region.Framework.Scenes
4414 m_log.DebugFormat( 4954 m_log.DebugFormat(
4415 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName); 4955 "[SCENE]: Incoming child agent update for {0} in {1}", cAgentData.AgentID, RegionInfo.RegionName);
4416 4956
4957 if (!LoginsEnabled)
4958 {
4959// reason = "Logins Disabled";
4960 m_log.DebugFormat(
4961 "[SCENE]: update for {0} in {1} refused: Logins Disabled", cAgentData.AgentID, RegionInfo.RegionName);
4962 return false;
4963 }
4964 // We have to wait until the viewer contacts this region after receiving EAC.
4965 // That calls AddNewClient, which finally creates the ScenePresence
4966 int flags = GetUserFlags(cAgentData.AgentID);
4967 if (RegionInfo.EstateSettings.IsBanned(cAgentData.AgentID, flags))
4968 {
4969 m_log.DebugFormat("[SCENE]: Denying root agent entry to {0}: banned", cAgentData.AgentID);
4970 return false;
4971 }
4972
4417 // TODO: This check should probably be in QueryAccess(). 4973 // TODO: This check should probably be in QueryAccess().
4418 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, RegionInfo.RegionSizeX / 2, RegionInfo.RegionSizeY / 2); 4974 ILandObject nearestParcel = GetNearestAllowedParcel(cAgentData.AgentID, RegionInfo.RegionSizeX / 2, RegionInfo.RegionSizeY / 2);
4419 if (nearestParcel == null) 4975 if (nearestParcel == null)
@@ -4431,8 +4987,14 @@ namespace OpenSim.Region.Framework.Scenes
4431 // a UseCircuitCode packet which in turn calls AddNewAgent which finally creates the ScenePresence. 4987 // a UseCircuitCode packet which in turn calls AddNewAgent which finally creates the ScenePresence.
4432 ScenePresence sp = WaitGetScenePresence(cAgentData.AgentID); 4988 ScenePresence sp = WaitGetScenePresence(cAgentData.AgentID);
4433 4989
4434 if (sp != null) 4990 if (sp != null)
4435 { 4991 {
4992 if (!sp.IsChildAgent)
4993 {
4994 m_log.WarnFormat("[SCENE]: Ignoring a child update on a root agent {0} {1} in {2}",
4995 sp.Name, sp.UUID, Name);
4996 return false;
4997 }
4436 if (cAgentData.SessionID != sp.ControllingClient.SessionId) 4998 if (cAgentData.SessionID != sp.ControllingClient.SessionId)
4437 { 4999 {
4438 m_log.WarnFormat( 5000 m_log.WarnFormat(
@@ -4517,7 +5079,7 @@ namespace OpenSim.Region.Framework.Scenes
4517 /// <param name='agentID'></param> 5079 /// <param name='agentID'></param>
4518 protected virtual ScenePresence WaitGetScenePresence(UUID agentID) 5080 protected virtual ScenePresence WaitGetScenePresence(UUID agentID)
4519 { 5081 {
4520 int ntimes = 20; 5082 int ntimes = 30;
4521 ScenePresence sp = null; 5083 ScenePresence sp = null;
4522 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0)) 5084 while ((sp = GetScenePresence(agentID)) == null && (ntimes-- > 0))
4523 Thread.Sleep(1000); 5085 Thread.Sleep(1000);
@@ -4567,6 +5129,16 @@ namespace OpenSim.Region.Framework.Scenes
4567 return false; 5129 return false;
4568 } 5130 }
4569 5131
5132// public bool IncomingCloseAgent(UUID agentID)
5133// {
5134// return IncomingCloseAgent(agentID, false);
5135// }
5136
5137// public bool IncomingCloseChildAgent(UUID agentID)
5138// {
5139// return IncomingCloseAgent(agentID, true);
5140// }
5141
4570 /// <summary> 5142 /// <summary>
4571 /// Tell a single client to prepare to close. 5143 /// Tell a single client to prepare to close.
4572 /// </summary> 5144 /// </summary>
@@ -4629,6 +5201,20 @@ namespace OpenSim.Region.Framework.Scenes
4629 5201
4630 if (sp == null) 5202 if (sp == null)
4631 { 5203 {
5204 // If there is no scene presence, we may be handling a dead
5205 // client. These can keep an avatar from reentering a region
5206 // and since they don't get cleaned up they will stick
5207 // around until region restart. So, if there is no SP,
5208 // remove the client as well.
5209 IClientAPI client = null;
5210 if (m_clientManager.TryGetValue(agentID, out client))
5211 {
5212 m_clientManager.Remove(agentID);
5213 if (CapsModule != null)
5214 CapsModule.RemoveCaps(agentID, 0);
5215 m_log.DebugFormat( "[SCENE]: Dead client for agent ID {0} was cleaned up in {1}", agentID, Name);
5216 return true;
5217 }
4632 m_log.DebugFormat( 5218 m_log.DebugFormat(
4633 "[SCENE]: Called CloseClient() with agent ID {0} but no such presence is in {1}", 5219 "[SCENE]: Called CloseClient() with agent ID {0} but no such presence is in {1}",
4634 agentID, Name); 5220 agentID, Name);
@@ -4663,7 +5249,15 @@ namespace OpenSim.Region.Framework.Scenes
4663 sp.LifecycleState = ScenePresenceState.Removing; 5249 sp.LifecycleState = ScenePresenceState.Removing;
4664 } 5250 }
4665 5251
5252<<<<<<< HEAD
4666 sp.ControllingClient.Close(force); 5253 sp.ControllingClient.Close(force);
5254=======
5255 if (sp != null)
5256 {
5257 sp.ControllingClient.Close(force, force);
5258 return true;
5259 }
5260>>>>>>> avn/ubitvar
4667 5261
4668 return true; 5262 return true;
4669 } 5263 }
@@ -4825,7 +5419,10 @@ namespace OpenSim.Region.Framework.Scenes
4825 5419
4826 public LandData GetLandData(float x, float y) 5420 public LandData GetLandData(float x, float y)
4827 { 5421 {
4828 return LandChannel.GetLandObject(x, y).LandData; 5422 ILandObject parcel = LandChannel.GetLandObject(x, y);
5423 if (parcel == null)
5424 return null;
5425 return parcel.LandData;
4829 } 5426 }
4830 5427
4831 /// <summary> 5428 /// <summary>
@@ -4841,7 +5438,10 @@ namespace OpenSim.Region.Framework.Scenes
4841 public LandData GetLandData(uint x, uint y) 5438 public LandData GetLandData(uint x, uint y)
4842 { 5439 {
4843 m_log.DebugFormat("[SCENE]: returning land for {0},{1}", x, y); 5440 m_log.DebugFormat("[SCENE]: returning land for {0},{1}", x, y);
4844 return LandChannel.GetLandObject((int)x, (int)y).LandData; 5441 ILandObject parcel = LandChannel.GetLandObject((int)x, (int)y);
5442 if (parcel == null)
5443 return null;
5444 return parcel.LandData;
4845 } 5445 }
4846 5446
4847 #endregion 5447 #endregion
@@ -5229,7 +5829,7 @@ namespace OpenSim.Region.Framework.Scenes
5229 { 5829 {
5230 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0) 5830 if ((grp.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)
5231 { 5831 {
5232 if (grp.RootPart.Expires <= DateTime.Now) 5832 if (grp.GetSittingAvatarsCount() == 0 && grp.RootPart.Expires <= DateTime.Now)
5233 DeleteSceneObject(grp, false); 5833 DeleteSceneObject(grp, false);
5234 } 5834 }
5235 } 5835 }
@@ -5243,35 +5843,85 @@ namespace OpenSim.Region.Framework.Scenes
5243 SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID); 5843 SimulationDataService.RemoveObject(uuid, RegionInfo.RegionID);
5244 } 5844 }
5245 5845
5246 public int GetHealth() 5846 public int GetHealth(out int flags, out string message)
5247 { 5847 {
5248 // Returns: 5848 // Returns:
5249 // 1 = sim is up and accepting http requests. The heartbeat has 5849 // 1 = sim is up and accepting http requests. The heartbeat has
5250 // stopped and the sim is probably locked up, but a remote 5850 // stopped and the sim is probably locked up, but a remote
5251 // admin restart may succeed 5851 // admin restart may succeed
5252 // 5852 //
5253 // 2 = Sim is up and the heartbeat is running. The sim is likely 5853 // 2 = Sim is up and the heartbeat is running. The sim is likely
5254 // usable for people within and logins _may_ work 5854 // usable for people within
5855 //
5856 // 3 = Sim is up and one packet thread is running. Sim is
5857 // unstable and will not accept new logins
5255 // 5858 //
5256 // 3 = We have seen a new user enter within the past 4 minutes 5859 // 4 = Sim is up and both packet threads are running. Sim is
5860 // likely usable
5861 //
5862 // 5 = We have seen a new user enter within the past 4 minutes
5257 // which can be seen as positive confirmation of sim health 5863 // which can be seen as positive confirmation of sim health
5258 // 5864 //
5865<<<<<<< HEAD
5259 int health = 1; // Start at 1, means we're up 5866 int health = 1; // Start at 1, means we're up
5867=======
5868
5869 flags = 0;
5870 message = String.Empty;
5871
5872 CheckHeartbeat();
5873
5874 if (m_firstHeartbeat || (m_lastIncoming == 0 && m_lastOutgoing == 0))
5875 {
5876 // We're still starting
5877 // 0 means "in startup", it can't happen another way, since
5878 // to get here, we must be able to accept http connections
5879 return 0;
5880 }
5881
5882 int health=1; // Start at 1, means we're up
5883>>>>>>> avn/ubitvar
5260 5884
5261 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000) 5885 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) < 1000)
5262 health += 1; 5886 {
5887 health+=1;
5888 flags |= 1;
5889 }
5890
5891 if (Util.EnvironmentTickCountSubtract(m_lastIncoming) < 1000)
5892 {
5893 health+=1;
5894 flags |= 2;
5895 }
5896
5897 if (Util.EnvironmentTickCountSubtract(m_lastOutgoing) < 1000)
5898 {
5899 health+=1;
5900 flags |= 4;
5901 }
5263 else 5902 else
5903 {
5904int pid = System.Diagnostics.Process.GetCurrentProcess().Id;
5905System.Diagnostics.Process proc = new System.Diagnostics.Process();
5906proc.EnableRaisingEvents=false;
5907proc.StartInfo.FileName = "/bin/kill";
5908proc.StartInfo.Arguments = "-QUIT " + pid.ToString();
5909proc.Start();
5910proc.WaitForExit();
5911Thread.Sleep(1000);
5912Environment.Exit(1);
5913 }
5914
5915 if (flags != 7)
5264 return health; 5916 return health;
5265 5917
5266 // A login in the last 4 mins? We can't be doing too badly 5918 // A login in the last 4 mins? We can't be doing too badly
5267 // 5919 //
5268 if ((Util.EnvironmentTickCountSubtract(m_LastLogin)) < 240000) 5920 if (Util.EnvironmentTickCountSubtract(m_LastLogin) < 240000)
5269 health++; 5921 health++;
5270 else 5922 else
5271 return health; 5923 return health;
5272 5924
5273// CheckHeartbeat();
5274
5275 return health; 5925 return health;
5276 } 5926 }
5277 5927
@@ -5359,7 +6009,7 @@ namespace OpenSim.Region.Framework.Scenes
5359 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0); 6009 bool wasUsingPhysics = ((jointProxyObject.Flags & PrimFlags.Physics) != 0);
5360 if (wasUsingPhysics) 6010 if (wasUsingPhysics)
5361 { 6011 {
5362 jointProxyObject.UpdatePrimFlags(false, false, true, false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock 6012 jointProxyObject.UpdatePrimFlags(false, false, true, false,false); // FIXME: possible deadlock here; check to make sure all the scene alterations set into motion here won't deadlock
5363 } 6013 }
5364 } 6014 }
5365 6015
@@ -5462,14 +6112,14 @@ namespace OpenSim.Region.Framework.Scenes
5462 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z; 6112 return (((vsn.X * xdiff) + (vsn.Y * ydiff)) / (-1 * vsn.Z)) + p0.Z;
5463 } 6113 }
5464 6114
5465// private void CheckHeartbeat() 6115 private void CheckHeartbeat()
5466// { 6116 {
5467// if (m_firstHeartbeat) 6117 if (m_firstHeartbeat)
5468// return; 6118 return;
5469// 6119
5470// if (Util.EnvironmentTickCountSubtract(m_lastFrameTick) > 2000) 6120 if ((Util.EnvironmentTickCountSubtract(m_lastFrameTick)) > 5000)
5471// StartTimer(); 6121 Start();
5472// } 6122 }
5473 6123
5474 public override ISceneObject DeserializeObject(string representation) 6124 public override ISceneObject DeserializeObject(string representation)
5475 { 6125 {
@@ -5526,8 +6176,13 @@ namespace OpenSim.Region.Framework.Scenes
5526 //Go to the edge, this happens in teleporting to a region with no available parcels 6176 //Go to the edge, this happens in teleporting to a region with no available parcels
5527 Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar); 6177 Vector3 nearestRegionEdgePoint = GetNearestRegionEdgePosition(avatar);
5528 6178
6179<<<<<<< HEAD
5529 //m_log.Debug("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString()); 6180 //m_log.Debug("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString());
5530 6181
6182=======
6183 //Debug.WriteLine("They are really in a place they don't belong, sending them to: " + nearestRegionEdgePoint.ToString());
6184
6185>>>>>>> avn/ubitvar
5531 return nearestRegionEdgePoint; 6186 return nearestRegionEdgePoint;
5532 } 6187 }
5533 6188
@@ -5783,7 +6438,55 @@ namespace OpenSim.Region.Framework.Scenes
5783 mapModule.GenerateMaptile(); 6438 mapModule.GenerateMaptile();
5784 } 6439 }
5785 6440
5786 private void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e) 6441// public void CleanDroppedAttachments()
6442// {
6443// List<SceneObjectGroup> objectsToDelete =
6444// new List<SceneObjectGroup>();
6445//
6446// lock (m_cleaningAttachments)
6447// {
6448// ForEachSOG(delegate (SceneObjectGroup grp)
6449// {
6450// if (grp.RootPart.Shape.PCode == 0 && grp.RootPart.Shape.State != 0 && (!objectsToDelete.Contains(grp)))
6451// {
6452// UUID agentID = grp.OwnerID;
6453// if (agentID == UUID.Zero)
6454// {
6455// objectsToDelete.Add(grp);
6456// return;
6457// }
6458//
6459// ScenePresence sp = GetScenePresence(agentID);
6460// if (sp == null)
6461// {
6462// objectsToDelete.Add(grp);
6463// return;
6464// }
6465// }
6466// });
6467// }
6468//
6469// foreach (SceneObjectGroup grp in objectsToDelete)
6470// {
6471// m_log.InfoFormat("[SCENE]: Deleting dropped attachment {0} of user {1}", grp.UUID, grp.OwnerID);
6472// DeleteSceneObject(grp, true);
6473// }
6474// }
6475
6476 public void ThreadAlive(int threadCode)
6477 {
6478 switch(threadCode)
6479 {
6480 case 1: // Incoming
6481 m_lastIncoming = Util.EnvironmentTickCount();
6482 break;
6483 case 2: // Incoming
6484 m_lastOutgoing = Util.EnvironmentTickCount();
6485 break;
6486 }
6487 }
6488
6489 public void RegenerateMaptileAndReregister(object sender, ElapsedEventArgs e)
5787 { 6490 {
5788 RegenerateMaptile(); 6491 RegenerateMaptile();
5789 6492
@@ -5810,7 +6513,11 @@ namespace OpenSim.Region.Framework.Scenes
5810 /// <param name='position'></param> 6513 /// <param name='position'></param>
5811 /// <param name='reason'></param> 6514 /// <param name='reason'></param>
5812 /// <returns></returns> 6515 /// <returns></returns>
6516<<<<<<< HEAD
5813 public bool QueryAccess(UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, out string reason) 6517 public bool QueryAccess(UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, List<UUID> features, out string reason)
6518=======
6519 public bool QueryAccess(UUID agentID, string agentHomeURI, bool viaTeleport, Vector3 position, out string reason)
6520>>>>>>> avn/ubitvar
5814 { 6521 {
5815 reason = string.Empty; 6522 reason = string.Empty;
5816 6523
@@ -5820,8 +6527,14 @@ namespace OpenSim.Region.Framework.Scenes
5820 return true; 6527 return true;
5821 } 6528 }
5822 6529
6530<<<<<<< HEAD
5823 if (!AllowAvatarCrossing && !viaTeleport) 6531 if (!AllowAvatarCrossing && !viaTeleport)
5824 return false; 6532 return false;
6533=======
6534
6535// if (!AllowAvatarCrossing && !viaTeleport)
6536// return false;
6537>>>>>>> avn/ubitvar
5825 6538
5826 // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check. 6539 // FIXME: Root agent count is currently known to be inaccurate. This forces a recount before we check.
5827 // However, the long term fix is to make sure root agent count is always accurate. 6540 // However, the long term fix is to make sure root agent count is always accurate.
@@ -5949,7 +6662,19 @@ namespace OpenSim.Region.Framework.Scenes
5949 return true; 6662 return true;
5950 } 6663 }
5951 6664
5952 /// <summary> 6665 public void StartTimerWatchdog()
6666 {
6667 m_timerWatchdog.Interval = 1000;
6668 m_timerWatchdog.Elapsed += TimerWatchdog;
6669 m_timerWatchdog.AutoReset = true;
6670 m_timerWatchdog.Start();
6671 }
6672
6673 public void TimerWatchdog(object sender, ElapsedEventArgs e)
6674 {
6675 CheckHeartbeat();
6676 }
6677
5953 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the 6678 /// This method deals with movement when an avatar is automatically moving (but this is distinct from the
5954 /// autopilot that moves an avatar to a sit target!. 6679 /// autopilot that moves an avatar to a sit target!.
5955 /// </summary> 6680 /// </summary>
@@ -6028,6 +6753,11 @@ namespace OpenSim.Region.Framework.Scenes
6028 return m_SpawnPoint - 1; 6753 return m_SpawnPoint - 1;
6029 } 6754 }
6030 6755
6756 private void HandleGcCollect(string module, string[] args)
6757 {
6758 GC.Collect();
6759 }
6760
6031 /// <summary> 6761 /// <summary>
6032 /// Wrappers to get physics modules retrieve assets. 6762 /// Wrappers to get physics modules retrieve assets.
6033 /// </summary> 6763 /// </summary>