aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs2
-rw-r--r--OpenSim/Client/Linden/LLStandaloneLoginModule.cs4
-rw-r--r--OpenSim/Client/MXP/MXPModule.cs7
-rw-r--r--OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs15
-rw-r--r--OpenSim/Data/MSSQL/MSSQLInventoryData.cs2
-rw-r--r--OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs8
-rw-r--r--OpenSim/Data/MSSQL/MSSQLManager.cs4
-rw-r--r--OpenSim/Data/MSSQL/MSSQLMigration.cs1
-rw-r--r--OpenSim/Data/Migration.cs79
-rw-r--r--OpenSim/Data/MySQL/MySQLAssetData.cs102
-rw-r--r--OpenSim/Data/MySQL/MySQLAuthenticationData.cs18
-rw-r--r--OpenSim/Data/MySQL/MySQLEstateData.cs310
-rw-r--r--OpenSim/Data/MySQL/MySQLFramework.cs11
-rw-r--r--OpenSim/Data/MySQL/MySQLGridData.cs171
-rw-r--r--OpenSim/Data/MySQL/MySQLInventoryData.cs335
-rw-r--r--OpenSim/Data/MySQL/MySQLLegacyRegionData.cs8
-rw-r--r--OpenSim/Data/MySQL/MySQLManager.cs60
-rw-r--r--OpenSim/Data/MySQL/MySQLRegionData.cs228
-rw-r--r--OpenSim/Data/MySQL/MySQLUserAccountData.cs87
-rw-r--r--OpenSim/Data/MySQL/MySQLUserData.cs370
-rw-r--r--OpenSim/Data/SQLite/SQLiteRegionData.cs8
-rw-r--r--OpenSim/Framework/ACL.cs32
-rw-r--r--OpenSim/Framework/Communications/Services/LoginService.cs26
-rw-r--r--OpenSim/Framework/Tests/ACLTest.cs98
-rw-r--r--OpenSim/Framework/Tests/CacheTests.cs75
-rw-r--r--OpenSim/Region/Application/OpenSim.cs56
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs198
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs19
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs46
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs21
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Alerts/DeadlockAlert.cs37
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs13
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs9
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs93
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/AgentCountMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ChildAgentCountMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/EventFrameMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/GCMemoryMonitor.cs26
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LandFrameMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LastFrameTimeMonitor.cs34
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ObjectCountMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PWSMemoryMonitor.cs26
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsFrameMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsUpdateFrameMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ThreadCountMonitor.cs25
-rw-r--r--OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/TotalFrameMonitor.cs33
-rw-r--r--OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs6
-rw-r--r--OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs10
-rw-r--r--OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.Permissions.cs36
-rw-r--r--OpenSim/Region/Framework/Scenes/Scene.cs139
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneBase.cs3
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs14
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs21
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs153
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs925
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs4
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs11
-rw-r--r--OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs2
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsActor.cs29
-rw-r--r--OpenSim/Region/Physics/Manager/PhysicsScene.cs5
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs14
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODECharacter.cs4
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs4
-rw-r--r--OpenSim/Region/Physics/OdePlugin/OdePlugin.cs158
-rw-r--r--OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs191
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs54
-rw-r--r--OpenSim/Region/ScriptEngine/XEngine/XEngine.cs118
-rw-r--r--OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs8
-rw-r--r--OpenSim/TestSuite/PhysicsBot.cs19
-rw-r--r--OpenSim/Tools/pCampBot/PhysicsBot.cs19
74 files changed, 2802 insertions, 2087 deletions
diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index f4e1db4..3c7727f 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -360,7 +360,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
360 && ((string) requestData["shutdown"] == "delayed") 360 && ((string) requestData["shutdown"] == "delayed")
361 && requestData.ContainsKey("milliseconds")) 361 && requestData.ContainsKey("milliseconds"))
362 { 362 {
363 timeout = (Int32) requestData["milliseconds"]; 363 timeout = Int32.Parse(requestData["milliseconds"].ToString());
364 364
365 message 365 message
366 = "Region is going down in " + ((int) (timeout/1000)).ToString() 366 = "Region is going down in " + ((int) (timeout/1000)).ToString()
diff --git a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
index bb9b623..8739ce5 100644
--- a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
+++ b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
@@ -231,6 +231,10 @@ namespace OpenSim.Client.Linden
231 { 231 {
232 return scene.RegionInfo; 232 return scene.RegionInfo;
233 } 233 }
234 else if (m_scenes.Count > 0)
235 {
236 return m_scenes[0].RegionInfo;
237 }
234 return null; 238 return null;
235 } 239 }
236 240
diff --git a/OpenSim/Client/MXP/MXPModule.cs b/OpenSim/Client/MXP/MXPModule.cs
index a6b0396..0b442cc 100644
--- a/OpenSim/Client/MXP/MXPModule.cs
+++ b/OpenSim/Client/MXP/MXPModule.cs
@@ -110,8 +110,11 @@ namespace OpenSim.Client.MXP
110 public void Close() 110 public void Close()
111 { 111 {
112 m_shutdown = true; 112 m_shutdown = true;
113 lock (m_ticker) 113 if (m_ticker != null)
114 m_ticker.Stop(); 114 {
115 lock (m_ticker)
116 m_ticker.Stop();
117 }
115 } 118 }
116 119
117 public string Name 120 public string Name
diff --git a/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs b/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs
index 0e21880..93e48cd 100644
--- a/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs
+++ b/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs
@@ -197,11 +197,20 @@ namespace OpenSim.Data.MSSQL
197 public void Dispose() 197 public void Dispose()
198 { 198 {
199 SqlConnection conn = realCommand.Connection; 199 SqlConnection conn = realCommand.Connection;
200 try { realCommand.Dispose(); } 200 try
201 {
202 realCommand.Dispose();
203 }
201 finally 204 finally
202 { 205 {
203 try { conn.Dispose(); } 206 try
204 finally { } 207 {
208 conn.Close();
209 }
210 finally
211 {
212 conn.Dispose();
213 }
205 } 214 }
206 } 215 }
207 216
diff --git a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
index d49c2b3..1482184 100644
--- a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
@@ -348,6 +348,8 @@ namespace OpenSim.Data.MSSQL
348 //Delete the actual row 348 //Delete the actual row
349 DeleteOneFolder(folderID, connection); 349 DeleteOneFolder(folderID, connection);
350 DeleteItemsInFolder(folderID, connection); 350 DeleteItemsInFolder(folderID, connection);
351
352 connection.Close();
351 } 353 }
352 } 354 }
353 355
diff --git a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
index cff6b00..6371307 100644
--- a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
@@ -1049,7 +1049,7 @@ VALUES
1049 if (!(primRow["ParticleSystem"] is DBNull)) 1049 if (!(primRow["ParticleSystem"] is DBNull))
1050 prim.ParticleSystem = (Byte[])primRow["ParticleSystem"]; 1050 prim.ParticleSystem = (Byte[])primRow["ParticleSystem"];
1051 1051
1052 prim.RotationalVelocity = new Vector3( 1052 prim.AngularVelocity = new Vector3(
1053 Convert.ToSingle(primRow["OmegaX"]), 1053 Convert.ToSingle(primRow["OmegaX"]),
1054 Convert.ToSingle(primRow["OmegaY"]), 1054 Convert.ToSingle(primRow["OmegaY"]),
1055 Convert.ToSingle(primRow["OmegaZ"])); 1055 Convert.ToSingle(primRow["OmegaZ"]));
@@ -1429,9 +1429,9 @@ VALUES
1429 parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation)); 1429 parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation));
1430 parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem)); 1430 parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem));
1431 1431
1432 parameters.Add(_Database.CreateParameter("OmegaX", prim.RotationalVelocity.X)); 1432 parameters.Add(_Database.CreateParameter("OmegaX", prim.AngularVelocity.X));
1433 parameters.Add(_Database.CreateParameter("OmegaY", prim.RotationalVelocity.Y)); 1433 parameters.Add(_Database.CreateParameter("OmegaY", prim.AngularVelocity.Y));
1434 parameters.Add(_Database.CreateParameter("OmegaZ", prim.RotationalVelocity.Z)); 1434 parameters.Add(_Database.CreateParameter("OmegaZ", prim.AngularVelocity.Z));
1435 1435
1436 parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X)); 1436 parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X));
1437 parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y)); 1437 parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y));
diff --git a/OpenSim/Data/MSSQL/MSSQLManager.cs b/OpenSim/Data/MSSQL/MSSQLManager.cs
index 992ce02..3d7a768 100644
--- a/OpenSim/Data/MSSQL/MSSQLManager.cs
+++ b/OpenSim/Data/MSSQL/MSSQLManager.cs
@@ -340,6 +340,8 @@ namespace OpenSim.Data.MSSQL
340 MSSQLMigration migration = new MSSQLMigration(connection, assem, migrationStore); 340 MSSQLMigration migration = new MSSQLMigration(connection, assem, migrationStore);
341 341
342 migration.Update(); 342 migration.Update();
343
344 connection.Close();
343 } 345 }
344 } 346 }
345 347
@@ -383,7 +385,9 @@ namespace OpenSim.Data.MSSQL
383 m_log.Error(e.ToString()); 385 m_log.Error(e.ToString());
384 } 386 }
385 } 387 }
388 tables.Close();
386 } 389 }
390
387 } 391 }
388 392
389 /// <summary> 393 /// <summary>
diff --git a/OpenSim/Data/MSSQL/MSSQLMigration.cs b/OpenSim/Data/MSSQL/MSSQLMigration.cs
index 549bcb3..aea31c9 100644
--- a/OpenSim/Data/MSSQL/MSSQLMigration.cs
+++ b/OpenSim/Data/MSSQL/MSSQLMigration.cs
@@ -56,6 +56,7 @@ namespace OpenSim.Data.MSSQL
56 { 56 {
57 version = Convert.ToInt32(reader["version"]); 57 version = Convert.ToInt32(reader["version"]);
58 } 58 }
59 reader.Close();
59 } 60 }
60 } 61 }
61 catch 62 catch
diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs
index 7a99d4a..e51dc22 100644
--- a/OpenSim/Data/Migration.cs
+++ b/OpenSim/Data/Migration.cs
@@ -131,26 +131,25 @@ namespace OpenSim.Data
131 m_log.InfoFormat("[MIGRATIONS] Upgrading {0} to latest revision.", _type); 131 m_log.InfoFormat("[MIGRATIONS] Upgrading {0} to latest revision.", _type);
132 m_log.Info("[MIGRATIONS] NOTE: this may take a while, don't interupt this process!"); 132 m_log.Info("[MIGRATIONS] NOTE: this may take a while, don't interupt this process!");
133 133
134 using (DbCommand cmd = _conn.CreateCommand()) 134 DbCommand cmd = _conn.CreateCommand();
135 foreach (KeyValuePair<int, string> kvp in migrations)
135 { 136 {
136 foreach (KeyValuePair<int, string> kvp in migrations) 137 int newversion = kvp.Key;
137 { 138 cmd.CommandText = kvp.Value;
138 int newversion = kvp.Key; 139 // we need to up the command timeout to infinite as we might be doing long migrations.
139 cmd.CommandText = kvp.Value; 140 cmd.CommandTimeout = 0;
140 // we need to up the command timeout to infinite as we might be doing long migrations. 141 cmd.ExecuteNonQuery();
141 cmd.CommandTimeout = 0;
142 cmd.ExecuteNonQuery();
143 142
144 if (version == 0) 143 if (version == 0)
145 { 144 {
146 InsertVersion(_type, newversion); 145 InsertVersion(_type, newversion);
147 }
148 else
149 {
150 UpdateVersion(_type, newversion);
151 }
152 version = newversion;
153 } 146 }
147 else
148 {
149 UpdateVersion(_type, newversion);
150 }
151 version = newversion;
152 cmd.Dispose();
154 } 153 }
155 } 154 }
156 155
@@ -190,45 +189,43 @@ namespace OpenSim.Data
190 protected virtual int FindVersion(DbConnection conn, string type) 189 protected virtual int FindVersion(DbConnection conn, string type)
191 { 190 {
192 int version = 0; 191 int version = 0;
193 192 DbCommand cmd = conn.CreateCommand();
194 using (DbCommand cmd = conn.CreateCommand()) 193 try
195 { 194 {
196 try 195 cmd.CommandText = "select version from migrations where name='" + type +"' order by version desc";
196 using (IDataReader reader = cmd.ExecuteReader())
197 { 197 {
198 cmd.CommandText = "select version from migrations where name='" + type + "' order by version desc"; 198 if (reader.Read())
199 using (IDataReader reader = cmd.ExecuteReader())
200 { 199 {
201 if (reader.Read()) 200 version = Convert.ToInt32(reader["version"]);
202 version = Convert.ToInt32(reader["version"]);
203 } 201 }
204 } 202 reader.Close();
205 catch
206 {
207 // Something went wrong, so we're version 0
208 } 203 }
209 } 204 }
210 205 catch
206 {
207 // Something went wrong, so we're version 0
208 }
209 cmd.Dispose();
211 return version; 210 return version;
212 } 211 }
213 212
214 private void InsertVersion(string type, int version) 213 private void InsertVersion(string type, int version)
215 { 214 {
216 using (DbCommand cmd = _conn.CreateCommand()) 215 DbCommand cmd = _conn.CreateCommand();
217 { 216 cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")";
218 cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")"; 217 m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version);
219 m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version); 218 cmd.ExecuteNonQuery();
220 cmd.ExecuteNonQuery(); 219 cmd.Dispose();
221 }
222 } 220 }
223 221
224 private void UpdateVersion(string type, int version) 222 private void UpdateVersion(string type, int version)
225 { 223 {
226 using (DbCommand cmd = _conn.CreateCommand()) 224 DbCommand cmd = _conn.CreateCommand();
227 { 225 cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'";
228 cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'"; 226 m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version);
229 m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version); 227 cmd.ExecuteNonQuery();
230 cmd.ExecuteNonQuery(); 228 cmd.Dispose();
231 }
232 } 229 }
233 230
234 // private SortedList<int, string> GetAllMigrations() 231 // private SortedList<int, string> GetAllMigrations()
diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs
index 4d49733..1fe6d29 100644
--- a/OpenSim/Data/MySQL/MySQLAssetData.cs
+++ b/OpenSim/Data/MySQL/MySQLAssetData.cs
@@ -139,42 +139,45 @@ namespace OpenSim.Data.MySQL
139 { 139 {
140 _dbConnection.CheckConnection(); 140 _dbConnection.CheckConnection();
141 141
142 using (MySqlCommand cmd = new MySqlCommand( 142 MySqlCommand cmd =
143 "SELECT name, description, assetType, local, temporary, data FROM assets WHERE id=?id", 143 new MySqlCommand(
144 _dbConnection.Connection)) 144 "SELECT name, description, assetType, local, temporary, data FROM assets WHERE id=?id",
145 { 145 _dbConnection.Connection);
146 cmd.Parameters.AddWithValue("?id", assetID.ToString()); 146 cmd.Parameters.AddWithValue("?id", assetID.ToString());
147 147
148 try 148 try
149 {
150 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
149 { 151 {
150 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 152 if (dbReader.Read())
151 { 153 {
152 if (dbReader.Read()) 154 asset = new AssetBase();
153 { 155 asset.Data = (byte[]) dbReader["data"];
154 asset = new AssetBase(); 156 asset.Description = (string) dbReader["description"];
155 asset.Data = (byte[])dbReader["data"]; 157 asset.FullID = assetID;
156 asset.Description = (string)dbReader["description"]; 158
157 asset.FullID = assetID; 159 string local = dbReader["local"].ToString();
158 160 if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase))
159 string local = dbReader["local"].ToString(); 161 asset.Local = true;
160 if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase)) 162 else
161 asset.Local = true; 163 asset.Local = false;
162 else 164
163 asset.Local = false; 165 asset.Name = (string) dbReader["name"];
164 166 asset.Type = (sbyte) dbReader["assetType"];
165 asset.Name = (string)dbReader["name"]; 167 asset.Temporary = Convert.ToBoolean(dbReader["temporary"]);
166 asset.Type = (sbyte)dbReader["assetType"];
167 asset.Temporary = Convert.ToBoolean(dbReader["temporary"]);
168 }
169 } 168 }
169 dbReader.Close();
170 cmd.Dispose();
170 } 171 }
171 catch (Exception e) 172 if (asset != null)
172 { 173 UpdateAccessTime(asset);
173 m_log.ErrorFormat( 174 }
174 "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString() 175 catch (Exception e)
175 + Environment.NewLine + "Reconnecting", assetID); 176 {
176 _dbConnection.Reconnect(); 177 m_log.ErrorFormat(
177 } 178 "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString()
179 + Environment.NewLine + "Reconnecting", assetID);
180 _dbConnection.Reconnect();
178 } 181 }
179 } 182 }
180 return asset; 183 return asset;
@@ -291,27 +294,32 @@ namespace OpenSim.Data.MySQL
291 { 294 {
292 _dbConnection.CheckConnection(); 295 _dbConnection.CheckConnection();
293 296
294 using (MySqlCommand cmd = new MySqlCommand( 297 MySqlCommand cmd =
295 "SELECT id FROM assets WHERE id=?id", 298 new MySqlCommand(
296 _dbConnection.Connection)) 299 "SELECT id FROM assets WHERE id=?id",
297 { 300 _dbConnection.Connection);
298 cmd.Parameters.AddWithValue("?id", uuid.ToString()); 301
302 cmd.Parameters.AddWithValue("?id", uuid.ToString());
299 303
300 try 304 try
305 {
306 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
301 { 307 {
302 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 308 if (dbReader.Read())
303 { 309 {
304 if (dbReader.Read()) 310 assetExists = true;
305 assetExists = true;
306 } 311 }
312
313 dbReader.Close();
314 cmd.Dispose();
307 } 315 }
308 catch (Exception e) 316 }
309 { 317 catch (Exception e)
310 m_log.ErrorFormat( 318 {
311 "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString() 319 m_log.ErrorFormat(
312 + Environment.NewLine + "Attempting reconnection", uuid); 320 "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString()
313 _dbConnection.Reconnect(); 321 + Environment.NewLine + "Attempting reconnection", uuid);
314 } 322 _dbConnection.Reconnect();
315 } 323 }
316 } 324 }
317 325
diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
index 0780936..e508b52 100644
--- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
+++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
@@ -55,7 +55,9 @@ namespace OpenSim.Data.MySQL
55 AuthenticationData ret = new AuthenticationData(); 55 AuthenticationData ret = new AuthenticationData();
56 ret.Data = new Dictionary<string, object>(); 56 ret.Data = new Dictionary<string, object>();
57 57
58 MySqlCommand cmd = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID"); 58 MySqlCommand cmd = new MySqlCommand(
59 "select * from `"+m_Realm+"` where UUID = ?principalID"
60 );
59 61
60 cmd.Parameters.AddWithValue("?principalID", principalID.ToString()); 62 cmd.Parameters.AddWithValue("?principalID", principalID.ToString());
61 63
@@ -82,14 +84,16 @@ namespace OpenSim.Data.MySQL
82 ret.Data[s] = result[s].ToString(); 84 ret.Data[s] = result[s].ToString();
83 } 85 }
84 86
85 CloseDBConnection(result, cmd); 87 result.Close();
88 CloseReaderCommand(cmd);
89
86 return ret; 90 return ret;
87 } 91 }
88 else 92
89 { 93 result.Close();
90 CloseDBConnection(result, cmd); 94 CloseReaderCommand(cmd);
91 return null; 95
92 } 96 return null;
93 } 97 }
94 98
95 public bool Store(AuthenticationData data) 99 public bool Store(AuthenticationData data)
diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs
index 7166b29..e8694fc 100644
--- a/OpenSim/Data/MySQL/MySQLEstateData.cs
+++ b/OpenSim/Data/MySQL/MySQLEstateData.cs
@@ -95,17 +95,21 @@ namespace OpenSim.Data.MySQL
95 95
96 protected void GetWaitTimeout() 96 protected void GetWaitTimeout()
97 { 97 {
98 using (MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, m_connection)) 98 MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect,
99 m_connection);
100
101 using (MySqlDataReader dbReader =
102 cmd.ExecuteReader(CommandBehavior.SingleRow))
99 { 103 {
100 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 104 if (dbReader.Read())
101 { 105 {
102 if (dbReader.Read()) 106 m_waitTimeout
103 { 107 = Convert.ToInt32(dbReader["@@wait_timeout"]) *
104 m_waitTimeout 108 TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
105 = Convert.ToInt32(dbReader["@@wait_timeout"]) *
106 TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
107 }
108 } 109 }
110
111 dbReader.Close();
112 cmd.Dispose();
109 } 113 }
110 114
111 m_lastConnectionUse = DateTime.Now.Ticks; 115 m_lastConnectionUse = DateTime.Now.Ticks;
@@ -143,103 +147,110 @@ namespace OpenSim.Data.MySQL
143 147
144 CheckConnection(); 148 CheckConnection();
145 149
146 bool migration = true; 150 MySqlCommand cmd = m_connection.CreateCommand();
147 151
148 using (MySqlCommand cmd = m_connection.CreateCommand()) 152 cmd.CommandText = sql;
149 { 153 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
150 cmd.CommandText = sql; 154
151 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString()); 155 IDataReader r = cmd.ExecuteReader();
152 156
153 using (IDataReader r = cmd.ExecuteReader()) 157 if (r.Read())
158 {
159 foreach (string name in FieldList)
154 { 160 {
155 if (r.Read()) 161 if (m_FieldMap[name].GetValue(es) is bool)
156 { 162 {
157 migration = false; 163 int v = Convert.ToInt32(r[name]);
158 164 if (v != 0)
159 foreach (string name in FieldList) 165 m_FieldMap[name].SetValue(es, true);
160 { 166 else
161 if (m_FieldMap[name].GetValue(es) is bool) 167 m_FieldMap[name].SetValue(es, false);
162 { 168 }
163 int v = Convert.ToInt32(r[name]); 169 else if (m_FieldMap[name].GetValue(es) is UUID)
164 if (v != 0) 170 {
165 m_FieldMap[name].SetValue(es, true); 171 UUID uuid = UUID.Zero;
166 else 172
167 m_FieldMap[name].SetValue(es, false); 173 UUID.TryParse(r[name].ToString(), out uuid);
168 } 174 m_FieldMap[name].SetValue(es, uuid);
169 else if (m_FieldMap[name].GetValue(es) is UUID) 175 }
170 { 176 else
171 UUID uuid = UUID.Zero; 177 {
172 178 m_FieldMap[name].SetValue(es, r[name]);
173 UUID.TryParse(r[name].ToString(), out uuid);
174 m_FieldMap[name].SetValue(es, uuid);
175 }
176 else
177 {
178 m_FieldMap[name].SetValue(es, r[name]);
179 }
180 }
181 } 179 }
182 } 180 }
181 r.Close();
183 } 182 }
184 183 else
185 if (migration)
186 { 184 {
187 // Migration case 185 // Migration case
186 //
187 r.Close();
188
188 List<string> names = new List<string>(FieldList); 189 List<string> names = new List<string>(FieldList);
189 190
190 names.Remove("EstateID"); 191 names.Remove("EstateID");
191 192
192 sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")"; 193 sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")";
193 194
194 using (MySqlCommand cmd = m_connection.CreateCommand()) 195 cmd.CommandText = sql;
195 { 196 cmd.Parameters.Clear();
196 cmd.CommandText = sql;
197 cmd.Parameters.Clear();
198 197
199 foreach (string name in FieldList) 198 foreach (string name in FieldList)
199 {
200 if (m_FieldMap[name].GetValue(es) is bool)
200 { 201 {
201 if (m_FieldMap[name].GetValue(es) is bool) 202 if ((bool)m_FieldMap[name].GetValue(es))
202 { 203 cmd.Parameters.AddWithValue("?" + name, "1");
203 if ((bool)m_FieldMap[name].GetValue(es))
204 cmd.Parameters.AddWithValue("?" + name, "1");
205 else
206 cmd.Parameters.AddWithValue("?" + name, "0");
207 }
208 else 204 else
209 { 205 cmd.Parameters.AddWithValue("?" + name, "0");
210 cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
211 }
212 } 206 }
207 else
208 {
209 cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
210 }
211 }
213 212
214 cmd.ExecuteNonQuery(); 213 cmd.ExecuteNonQuery();
215 214
216 cmd.CommandText = "select LAST_INSERT_ID() as id"; 215 cmd.CommandText = "select LAST_INSERT_ID() as id";
217 cmd.Parameters.Clear(); 216 cmd.Parameters.Clear();
218 217
219 using (IDataReader r = cmd.ExecuteReader()) 218 r = cmd.ExecuteReader();
220 { 219
221 r.Read(); 220 r.Read();
222 es.EstateID = Convert.ToUInt32(r["id"]);
223 }
224 221
225 cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)"; 222 es.EstateID = Convert.ToUInt32(r["id"]);
226 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
227 cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
228 223
229 // This will throw on dupe key 224 r.Close();
230 try { cmd.ExecuteNonQuery(); } 225
231 catch (Exception) { } 226 cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)";
227 cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
228 cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
232 229
233 // Munge and transfer the ban list 230 // This will throw on dupe key
234 cmd.Parameters.Clear(); 231 try
235 cmd.CommandText = "insert into estateban select " + es.EstateID.ToString() + ", bannedUUID, bannedIp, bannedIpHostMask, '' from regionban where regionban.regionUUID = ?UUID"; 232 {
236 cmd.Parameters.AddWithValue("?UUID", regionID.ToString()); 233 cmd.ExecuteNonQuery();
234 }
235 catch (Exception)
236 {
237 }
237 238
238 try { cmd.ExecuteNonQuery(); } 239 // Munge and transfer the ban list
239 catch (Exception) { } 240 //
241 cmd.Parameters.Clear();
242 cmd.CommandText = "insert into estateban select " + es.EstateID.ToString() + ", bannedUUID, bannedIp, bannedIpHostMask, '' from regionban where regionban.regionUUID = ?UUID";
243 cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
240 244
241 es.Save(); 245 try
246 {
247 cmd.ExecuteNonQuery();
248 }
249 catch (Exception)
250 {
242 } 251 }
252
253 es.Save();
243 } 254 }
244 255
245 LoadBanList(es); 256 LoadBanList(es);
@@ -256,28 +267,27 @@ namespace OpenSim.Data.MySQL
256 267
257 CheckConnection(); 268 CheckConnection();
258 269
259 using (MySqlCommand cmd = m_connection.CreateCommand()) 270 MySqlCommand cmd = m_connection.CreateCommand();
260 {
261 cmd.CommandText = sql;
262 271
263 foreach (string name in FieldList) 272 cmd.CommandText = sql;
273
274 foreach (string name in FieldList)
275 {
276 if (m_FieldMap[name].GetValue(es) is bool)
264 { 277 {
265 if (m_FieldMap[name].GetValue(es) is bool) 278 if ((bool)m_FieldMap[name].GetValue(es))
266 { 279 cmd.Parameters.AddWithValue("?" + name, "1");
267 if ((bool)m_FieldMap[name].GetValue(es))
268 cmd.Parameters.AddWithValue("?" + name, "1");
269 else
270 cmd.Parameters.AddWithValue("?" + name, "0");
271 }
272 else 280 else
273 { 281 cmd.Parameters.AddWithValue("?" + name, "0");
274 cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString()); 282 }
275 } 283 else
284 {
285 cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
276 } 286 }
277
278 cmd.ExecuteNonQuery();
279 } 287 }
280 288
289 cmd.ExecuteNonQuery();
290
281 SaveBanList(es); 291 SaveBanList(es);
282 SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers); 292 SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
283 SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess); 293 SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
@@ -290,52 +300,50 @@ namespace OpenSim.Data.MySQL
290 300
291 CheckConnection(); 301 CheckConnection();
292 302
293 using (MySqlCommand cmd = m_connection.CreateCommand()) 303 MySqlCommand cmd = m_connection.CreateCommand();
294 {
295 cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID";
296 cmd.Parameters.AddWithValue("?EstateID", es.EstateID);
297 304
298 using (IDataReader r = cmd.ExecuteReader()) 305 cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID";
299 { 306 cmd.Parameters.AddWithValue("?EstateID", es.EstateID);
300 while (r.Read())
301 {
302 EstateBan eb = new EstateBan();
303 307
304 UUID uuid = new UUID(); 308 IDataReader r = cmd.ExecuteReader();
305 UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
306 309
307 eb.BannedUserID = uuid; 310 while (r.Read())
308 eb.BannedHostAddress = "0.0.0.0"; 311 {
309 eb.BannedHostIPMask = "0.0.0.0"; 312 EstateBan eb = new EstateBan();
310 es.AddBan(eb); 313
311 } 314 UUID uuid = new UUID();
312 } 315 UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
316
317 eb.BannedUserID = uuid;
318 eb.BannedHostAddress = "0.0.0.0";
319 eb.BannedHostIPMask = "0.0.0.0";
320 es.AddBan(eb);
313 } 321 }
322 r.Close();
314 } 323 }
315 324
316 private void SaveBanList(EstateSettings es) 325 private void SaveBanList(EstateSettings es)
317 { 326 {
318 CheckConnection(); 327 CheckConnection();
319 328
320 using (MySqlCommand cmd = m_connection.CreateCommand()) 329 MySqlCommand cmd = m_connection.CreateCommand();
321 {
322 cmd.CommandText = "delete from estateban where EstateID = ?EstateID";
323 cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
324 330
325 cmd.ExecuteNonQuery(); 331 cmd.CommandText = "delete from estateban where EstateID = ?EstateID";
332 cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
326 333
327 cmd.Parameters.Clear(); 334 cmd.ExecuteNonQuery();
328 335
329 cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )"; 336 cmd.Parameters.Clear();
330 337
331 foreach (EstateBan b in es.EstateBans) 338 cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )";
332 {
333 cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
334 cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString());
335 339
336 cmd.ExecuteNonQuery(); 340 foreach (EstateBan b in es.EstateBans)
337 cmd.Parameters.Clear(); 341 {
338 } 342 cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
343 cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString());
344
345 cmd.ExecuteNonQuery();
346 cmd.Parameters.Clear();
339 } 347 }
340 } 348 }
341 349
@@ -343,25 +351,24 @@ namespace OpenSim.Data.MySQL
343 { 351 {
344 CheckConnection(); 352 CheckConnection();
345 353
346 using (MySqlCommand cmd = m_connection.CreateCommand()) 354 MySqlCommand cmd = m_connection.CreateCommand();
347 {
348 cmd.CommandText = "delete from " + table + " where EstateID = ?EstateID";
349 cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
350 355
351 cmd.ExecuteNonQuery(); 356 cmd.CommandText = "delete from " + table + " where EstateID = ?EstateID";
357 cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
352 358
353 cmd.Parameters.Clear(); 359 cmd.ExecuteNonQuery();
354 360
355 cmd.CommandText = "insert into " + table + " (EstateID, uuid) values ( ?EstateID, ?uuid )"; 361 cmd.Parameters.Clear();
356 362
357 foreach (UUID uuid in data) 363 cmd.CommandText = "insert into " + table + " (EstateID, uuid) values ( ?EstateID, ?uuid )";
358 {
359 cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
360 cmd.Parameters.AddWithValue("?uuid", uuid.ToString());
361 364
362 cmd.ExecuteNonQuery(); 365 foreach (UUID uuid in data)
363 cmd.Parameters.Clear(); 366 {
364 } 367 cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
368 cmd.Parameters.AddWithValue("?uuid", uuid.ToString());
369
370 cmd.ExecuteNonQuery();
371 cmd.Parameters.Clear();
365 } 372 }
366 } 373 }
367 374
@@ -371,24 +378,23 @@ namespace OpenSim.Data.MySQL
371 378
372 CheckConnection(); 379 CheckConnection();
373 380
374 using (MySqlCommand cmd = m_connection.CreateCommand()) 381 MySqlCommand cmd = m_connection.CreateCommand();
375 {
376 cmd.CommandText = "select uuid from " + table + " where EstateID = ?EstateID";
377 cmd.Parameters.AddWithValue("?EstateID", EstateID);
378 382
379 using (IDataReader r = cmd.ExecuteReader()) 383 cmd.CommandText = "select uuid from " + table + " where EstateID = ?EstateID";
380 { 384 cmd.Parameters.AddWithValue("?EstateID", EstateID);
381 while (r.Read())
382 {
383 // EstateBan eb = new EstateBan();
384 385
385 UUID uuid = new UUID(); 386 IDataReader r = cmd.ExecuteReader();
386 UUID.TryParse(r["uuid"].ToString(), out uuid);
387 387
388 uuids.Add(uuid); 388 while (r.Read())
389 } 389 {
390 } 390 // EstateBan eb = new EstateBan();
391
392 UUID uuid = new UUID();
393 UUID.TryParse(r["uuid"].ToString(), out uuid);
394
395 uuids.Add(uuid);
391 } 396 }
397 r.Close();
392 398
393 return uuids.ToArray(); 399 return uuids.ToArray();
394 } 400 }
diff --git a/OpenSim/Data/MySQL/MySQLFramework.cs b/OpenSim/Data/MySQL/MySQLFramework.cs
index ccd1ab0..fca0ca5 100644
--- a/OpenSim/Data/MySQL/MySQLFramework.cs
+++ b/OpenSim/Data/MySQL/MySQLFramework.cs
@@ -40,10 +40,6 @@ namespace OpenSim.Data.MySQL
40 /// </summary> 40 /// </summary>
41 public class MySqlFramework 41 public class MySqlFramework
42 { 42 {
43 private static readonly log4net.ILog m_log =
44 log4net.LogManager.GetLogger(
45 System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
46
47 protected MySqlConnection m_Connection; 43 protected MySqlConnection m_Connection;
48 44
49 protected MySqlFramework(string connectionString) 45 protected MySqlFramework(string connectionString)
@@ -73,11 +69,11 @@ namespace OpenSim.Data.MySQL
73 } 69 }
74 catch (MySqlException e) 70 catch (MySqlException e)
75 { 71 {
76 m_log.Error(e.Message, e);
77 if (errorSeen) 72 if (errorSeen)
78 throw; 73 throw;
79 74
80 // This is "Server has gone away" and "Server lost" 75 // This is "Server has gone away" and "Server lost"
76 //
81 if (e.Number == 2006 || e.Number == 2013) 77 if (e.Number == 2006 || e.Number == 2013)
82 { 78 {
83 errorSeen = true; 79 errorSeen = true;
@@ -96,7 +92,6 @@ namespace OpenSim.Data.MySQL
96 } 92 }
97 catch (Exception e) 93 catch (Exception e)
98 { 94 {
99 m_log.Error(e.Message, e);
100 return 0; 95 return 0;
101 } 96 }
102 } 97 }
@@ -113,11 +108,11 @@ namespace OpenSim.Data.MySQL
113 return cmd.ExecuteReader(); 108 return cmd.ExecuteReader();
114 } 109 }
115 110
116 protected void CloseDBConnection(IDataReader reader, MySqlCommand cmd) 111 protected void CloseReaderCommand(MySqlCommand cmd)
117 { 112 {
118 reader.Close();
119 cmd.Connection.Close(); 113 cmd.Connection.Close();
120 cmd.Connection.Dispose(); 114 cmd.Connection.Dispose();
115 cmd.Dispose();
121 } 116 }
122 } 117 }
123} 118}
diff --git a/OpenSim/Data/MySQL/MySQLGridData.cs b/OpenSim/Data/MySQL/MySQLGridData.cs
index 38cb3b7..1ec2609 100644
--- a/OpenSim/Data/MySQL/MySQLGridData.cs
+++ b/OpenSim/Data/MySQL/MySQLGridData.cs
@@ -197,27 +197,29 @@ namespace OpenSim.Data.MySQL
197 param["?xmax"] = xmax.ToString(); 197 param["?xmax"] = xmax.ToString();
198 param["?ymax"] = ymax.ToString(); 198 param["?ymax"] = ymax.ToString();
199 199
200 using (IDbCommand result = dbm.Manager.Query( 200 IDbCommand result =
201 dbm.Manager.Query(
201 "SELECT * FROM regions WHERE locX >= ?xmin AND locX <= ?xmax AND locY >= ?ymin AND locY <= ?ymax", 202 "SELECT * FROM regions WHERE locX >= ?xmin AND locX <= ?xmax AND locY >= ?ymin AND locY <= ?ymax",
202 param)) 203 param);
203 { 204 IDataReader reader = result.ExecuteReader();
204 using (IDataReader reader = result.ExecuteReader())
205 {
206 RegionProfileData row;
207 205
208 List<RegionProfileData> rows = new List<RegionProfileData>(); 206 RegionProfileData row;
209 207
210 while ((row = dbm.Manager.readSimRow(reader)) != null) 208 List<RegionProfileData> rows = new List<RegionProfileData>();
211 rows.Add(row);
212 209
213 return rows.ToArray(); 210 while ((row = dbm.Manager.readSimRow(reader)) != null)
214 } 211 {
212 rows.Add(row);
215 } 213 }
214 reader.Close();
215 result.Dispose();
216
217 return rows.ToArray();
216 } 218 }
217 catch (Exception e) 219 catch (Exception e)
218 { 220 {
219 dbm.Manager.Reconnect(); 221 dbm.Manager.Reconnect();
220 m_log.Error(e.Message, e); 222 m_log.Error(e.ToString());
221 return null; 223 return null;
222 } 224 }
223 finally 225 finally
@@ -241,27 +243,29 @@ namespace OpenSim.Data.MySQL
241 Dictionary<string, object> param = new Dictionary<string, object>(); 243 Dictionary<string, object> param = new Dictionary<string, object>();
242 param["?name"] = namePrefix + "%"; 244 param["?name"] = namePrefix + "%";
243 245
244 using (IDbCommand result = dbm.Manager.Query( 246 IDbCommand result =
245 "SELECT * FROM regions WHERE regionName LIKE ?name", 247 dbm.Manager.Query(
246 param)) 248 "SELECT * FROM regions WHERE regionName LIKE ?name",
247 { 249 param);
248 using (IDataReader reader = result.ExecuteReader()) 250 IDataReader reader = result.ExecuteReader();
249 {
250 RegionProfileData row;
251 251
252 List<RegionProfileData> rows = new List<RegionProfileData>(); 252 RegionProfileData row;
253 253
254 while (rows.Count < maxNum && (row = dbm.Manager.readSimRow(reader)) != null) 254 List<RegionProfileData> rows = new List<RegionProfileData>();
255 rows.Add(row);
256 255
257 return rows; 256 while (rows.Count < maxNum && (row = dbm.Manager.readSimRow(reader)) != null)
258 } 257 {
258 rows.Add(row);
259 } 259 }
260 reader.Close();
261 result.Dispose();
262
263 return rows;
260 } 264 }
261 catch (Exception e) 265 catch (Exception e)
262 { 266 {
263 dbm.Manager.Reconnect(); 267 dbm.Manager.Reconnect();
264 m_log.Error(e.Message, e); 268 m_log.Error(e.ToString());
265 return null; 269 return null;
266 } 270 }
267 finally 271 finally
@@ -282,21 +286,21 @@ namespace OpenSim.Data.MySQL
282 try 286 try
283 { 287 {
284 Dictionary<string, object> param = new Dictionary<string, object>(); 288 Dictionary<string, object> param = new Dictionary<string, object>();
285 param["?handle"] = handle.ToString(); 289 param["?handle"] = handle.ToString();
286 290
287 using (IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param)) 291 IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param);
288 { 292 IDataReader reader = result.ExecuteReader();
289 using (IDataReader reader = result.ExecuteReader()) 293
290 { 294 RegionProfileData row = dbm.Manager.readSimRow(reader);
291 RegionProfileData row = dbm.Manager.readSimRow(reader); 295 reader.Close();
292 return row; 296 result.Dispose();
293 } 297
298 return row;
294 } 299 }
295 }
296 catch (Exception e) 300 catch (Exception e)
297 { 301 {
298 dbm.Manager.Reconnect(); 302 dbm.Manager.Reconnect();
299 m_log.Error(e.Message, e); 303 m_log.Error(e.ToString());
300 return null; 304 return null;
301 } 305 }
302 finally 306 finally
@@ -317,24 +321,23 @@ namespace OpenSim.Data.MySQL
317 try 321 try
318 { 322 {
319 Dictionary<string, object> param = new Dictionary<string, object>(); 323 Dictionary<string, object> param = new Dictionary<string, object>();
320 param["?uuid"] = uuid.ToString(); 324 param["?uuid"] = uuid.ToString();
321 325
322 using (IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE uuid = ?uuid", param)) 326 IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE uuid = ?uuid", param);
323 { 327 IDataReader reader = result.ExecuteReader();
324 using (IDataReader reader = result.ExecuteReader()) 328
325 { 329 RegionProfileData row = dbm.Manager.readSimRow(reader);
326 RegionProfileData row = dbm.Manager.readSimRow(reader); 330 reader.Close();
327 return row; 331 result.Dispose();
328 } 332
333 return row;
329 } 334 }
330 }
331 catch (Exception e) 335 catch (Exception e)
332 { 336 {
333 dbm.Manager.Reconnect(); 337 dbm.Manager.Reconnect();
334 m_log.Error(e.Message, e); 338 m_log.Error(e.ToString());
335 return null; 339 return null;
336 } 340 } finally
337 finally
338 { 341 {
339 dbm.Release(); 342 dbm.Release();
340 } 343 }
@@ -356,21 +359,22 @@ namespace OpenSim.Data.MySQL
356 // Add % because this is a like query. 359 // Add % because this is a like query.
357 param["?regionName"] = regionName + "%"; 360 param["?regionName"] = regionName + "%";
358 // Order by statement will return shorter matches first. Only returns one record or no record. 361 // Order by statement will return shorter matches first. Only returns one record or no record.
359 using (IDbCommand result = dbm.Manager.Query( 362 IDbCommand result =
360 "SELECT * FROM regions WHERE regionName like ?regionName order by LENGTH(regionName) asc LIMIT 1", 363 dbm.Manager.Query(
361 param)) 364 "SELECT * FROM regions WHERE regionName like ?regionName order by LENGTH(regionName) asc LIMIT 1",
362 { 365 param);
363 using (IDataReader reader = result.ExecuteReader()) 366 IDataReader reader = result.ExecuteReader();
364 { 367
365 RegionProfileData row = dbm.Manager.readSimRow(reader); 368 RegionProfileData row = dbm.Manager.readSimRow(reader);
366 return row; 369 reader.Close();
367 } 370 result.Dispose();
368 } 371
372 return row;
369 } 373 }
370 catch (Exception e) 374 catch (Exception e)
371 { 375 {
372 dbm.Manager.Reconnect(); 376 dbm.Manager.Reconnect();
373 m_log.Error(e.Message, e); 377 m_log.Error(e.ToString());
374 return null; 378 return null;
375 } 379 }
376 finally 380 finally
@@ -378,7 +382,6 @@ namespace OpenSim.Data.MySQL
378 dbm.Release(); 382 dbm.Release();
379 } 383 }
380 } 384 }
381
382 m_log.Error("[GRID DB]: Searched for a Region Name shorter then 3 characters"); 385 m_log.Error("[GRID DB]: Searched for a Region Name shorter then 3 characters");
383 return null; 386 return null;
384 } 387 }
@@ -391,12 +394,12 @@ namespace OpenSim.Data.MySQL
391 override public DataResponse StoreProfile(RegionProfileData profile) 394 override public DataResponse StoreProfile(RegionProfileData profile)
392 { 395 {
393 MySQLSuperManager dbm = GetLockedConnection(); 396 MySQLSuperManager dbm = GetLockedConnection();
394 try 397 try {
395 {
396 if (dbm.Manager.insertRegion(profile)) 398 if (dbm.Manager.insertRegion(profile))
399 {
397 return DataResponse.RESPONSE_OK; 400 return DataResponse.RESPONSE_OK;
398 else 401 }
399 return DataResponse.RESPONSE_ERROR; 402 return DataResponse.RESPONSE_ERROR;
400 } 403 }
401 finally 404 finally
402 { 405 {
@@ -414,14 +417,14 @@ namespace OpenSim.Data.MySQL
414 { 417 {
415 MySQLSuperManager dbm = GetLockedConnection(); 418 MySQLSuperManager dbm = GetLockedConnection();
416 419
417 try 420
418 { 421 try {
419 if (dbm.Manager.deleteRegion(uuid)) 422 if (dbm.Manager.deleteRegion(uuid))
423 {
420 return DataResponse.RESPONSE_OK; 424 return DataResponse.RESPONSE_OK;
421 else 425 }
422 return DataResponse.RESPONSE_ERROR; 426 return DataResponse.RESPONSE_ERROR;
423 } 427 } finally
424 finally
425 { 428 {
426 dbm.Release(); 429 dbm.Release();
427 } 430 }
@@ -479,26 +482,26 @@ namespace OpenSim.Data.MySQL
479 try 482 try
480 { 483 {
481 Dictionary<string, object> param = new Dictionary<string, object>(); 484 Dictionary<string, object> param = new Dictionary<string, object>();
482 param["?x"] = x.ToString(); 485 param["?x"] = x.ToString();
483 param["?y"] = y.ToString(); 486 param["?y"] = y.ToString();
484 using (IDbCommand result = dbm.Manager.Query( 487 IDbCommand result =
485 "SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y", 488 dbm.Manager.Query(
486 param)) 489 "SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y",
487 { 490 param);
488 using (IDataReader reader = result.ExecuteReader()) 491 IDataReader reader = result.ExecuteReader();
489 { 492
490 ReservationData row = dbm.Manager.readReservationRow(reader); 493 ReservationData row = dbm.Manager.readReservationRow(reader);
491 return row; 494 reader.Close();
492 } 495 result.Dispose();
493 } 496
497 return row;
494 } 498 }
495 catch (Exception e) 499 catch (Exception e)
496 { 500 {
497 dbm.Manager.Reconnect(); 501 dbm.Manager.Reconnect();
498 m_log.Error(e.Message, e); 502 m_log.Error(e.ToString());
499 return null; 503 return null;
500 } 504 } finally
501 finally
502 { 505 {
503 dbm.Release(); 506 dbm.Release();
504 } 507 }
diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs
index 598971d..0eecf06 100644
--- a/OpenSim/Data/MySQL/MySQLInventoryData.cs
+++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs
@@ -135,30 +135,30 @@ namespace OpenSim.Data.MySQL
135 135
136 database.CheckConnection(); 136 database.CheckConnection();
137 137
138 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid", 138 MySqlCommand result =
139 database.Connection)) 139 new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid",
140 database.Connection);
141 result.Parameters.AddWithValue("?uuid", folderID.ToString());
142 MySqlDataReader reader = result.ExecuteReader();
143
144 while (reader.Read())
140 { 145 {
141 result.Parameters.AddWithValue("?uuid", folderID.ToString()); 146 // A null item (because something went wrong) breaks everything in the folder
147 InventoryItemBase item = readInventoryItem(reader);
148 if (item != null)
149 items.Add(item);
150 }
142 151
143 using (MySqlDataReader reader = result.ExecuteReader()) 152 reader.Close();
144 { 153 result.Dispose();
145 while (reader.Read())
146 {
147 // A null item (because something went wrong) breaks everything in the folder
148 InventoryItemBase item = readInventoryItem(reader);
149 if (item != null)
150 items.Add(item);
151 }
152 154
153 return items; 155 return items;
154 }
155 }
156 } 156 }
157 } 157 }
158 catch (Exception e) 158 catch (Exception e)
159 { 159 {
160 database.Reconnect(); 160 database.Reconnect();
161 m_log.Error(e.Message, e); 161 m_log.Error(e.ToString());
162 return null; 162 return null;
163 } 163 }
164 } 164 }
@@ -176,28 +176,29 @@ namespace OpenSim.Data.MySQL
176 { 176 {
177 database.CheckConnection(); 177 database.CheckConnection();
178 178
179 using (MySqlCommand result = new MySqlCommand( 179 MySqlCommand result =
180 "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", 180 new MySqlCommand(
181 database.Connection)) 181 "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid",
182 { 182 database.Connection);
183 result.Parameters.AddWithValue("?uuid", user.ToString()); 183 result.Parameters.AddWithValue("?uuid", user.ToString());
184 result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); 184 result.Parameters.AddWithValue("?zero", UUID.Zero.ToString());
185 MySqlDataReader reader = result.ExecuteReader();
185 186
186 using (MySqlDataReader reader = result.ExecuteReader()) 187 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
187 { 188 while (reader.Read())
188 List<InventoryFolderBase> items = new List<InventoryFolderBase>(); 189 items.Add(readInventoryFolder(reader));
189 while (reader.Read())
190 items.Add(readInventoryFolder(reader));
191 190
192 return items; 191
193 } 192 reader.Close();
194 } 193 result.Dispose();
194
195 return items;
195 } 196 }
196 } 197 }
197 catch (Exception e) 198 catch (Exception e)
198 { 199 {
199 database.Reconnect(); 200 database.Reconnect();
200 m_log.Error(e.Message, e); 201 m_log.Error(e.ToString());
201 return null; 202 return null;
202 } 203 }
203 } 204 }
@@ -216,38 +217,41 @@ namespace OpenSim.Data.MySQL
216 { 217 {
217 database.CheckConnection(); 218 database.CheckConnection();
218 219
219 using (MySqlCommand result = new MySqlCommand( 220 MySqlCommand result =
220 "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid", 221 new MySqlCommand(
221 database.Connection)) 222 "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid",
222 { 223 database.Connection);
223 result.Parameters.AddWithValue("?uuid", user.ToString()); 224 result.Parameters.AddWithValue("?uuid", user.ToString());
224 result.Parameters.AddWithValue("?zero", UUID.Zero.ToString()); 225 result.Parameters.AddWithValue("?zero", UUID.Zero.ToString());
225 226
226 using (MySqlDataReader reader = result.ExecuteReader()) 227 MySqlDataReader reader = result.ExecuteReader();
227 {
228 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
229 while (reader.Read())
230 items.Add(readInventoryFolder(reader));
231 228
232 InventoryFolderBase rootFolder = null; 229 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
230 while (reader.Read())
231 items.Add(readInventoryFolder(reader));
233 232
234 // There should only ever be one root folder for a user. However, if there's more 233 InventoryFolderBase rootFolder = null;
235 // than one we'll simply use the first one rather than failing. It would be even
236 // nicer to print some message to this effect, but this feels like it's too low a
237 // to put such a message out, and it's too minor right now to spare the time to
238 // suitably refactor.
239 if (items.Count > 0)
240 rootFolder = items[0];
241 234
242 return rootFolder; 235 // There should only ever be one root folder for a user. However, if there's more
243 } 236 // than one we'll simply use the first one rather than failing. It would be even
237 // nicer to print some message to this effect, but this feels like it's too low a
238 // to put such a message out, and it's too minor right now to spare the time to
239 // suitably refactor.
240 if (items.Count > 0)
241 {
242 rootFolder = items[0];
244 } 243 }
244
245 reader.Close();
246 result.Dispose();
247
248 return rootFolder;
245 } 249 }
246 } 250 }
247 catch (Exception e) 251 catch (Exception e)
248 { 252 {
249 database.Reconnect(); 253 database.Reconnect();
250 m_log.Error(e.Message, e); 254 m_log.Error(e.ToString());
251 return null; 255 return null;
252 } 256 }
253 } 257 }
@@ -267,26 +271,27 @@ namespace OpenSim.Data.MySQL
267 { 271 {
268 database.CheckConnection(); 272 database.CheckConnection();
269 273
270 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid", 274 MySqlCommand result =
271 database.Connection)) 275 new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid",
272 { 276 database.Connection);
273 result.Parameters.AddWithValue("?uuid", parentID.ToString()); 277 result.Parameters.AddWithValue("?uuid", parentID.ToString());
274 using (MySqlDataReader reader = result.ExecuteReader()) 278 MySqlDataReader reader = result.ExecuteReader();
275 {
276 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
277 279
278 while (reader.Read()) 280 List<InventoryFolderBase> items = new List<InventoryFolderBase>();
279 items.Add(readInventoryFolder(reader));
280 281
281 return items; 282 while (reader.Read())
282 } 283 items.Add(readInventoryFolder(reader));
283 } 284
285 reader.Close();
286 result.Dispose();
287
288 return items;
284 } 289 }
285 } 290 }
286 catch (Exception e) 291 catch (Exception e)
287 { 292 {
288 database.Reconnect(); 293 database.Reconnect();
289 m_log.Error(e.Message, e); 294 m_log.Error(e.ToString());
290 return null; 295 return null;
291 } 296 }
292 } 297 }
@@ -365,25 +370,25 @@ namespace OpenSim.Data.MySQL
365 { 370 {
366 database.CheckConnection(); 371 database.CheckConnection();
367 372
368 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection)) 373 MySqlCommand result =
369 { 374 new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection);
370 result.Parameters.AddWithValue("?uuid", itemID.ToString()); 375 result.Parameters.AddWithValue("?uuid", itemID.ToString());
376 MySqlDataReader reader = result.ExecuteReader();
371 377
372 using (MySqlDataReader reader = result.ExecuteReader()) 378 InventoryItemBase item = null;
373 { 379 if (reader.Read())
374 InventoryItemBase item = null; 380 item = readInventoryItem(reader);
375 if (reader.Read())
376 item = readInventoryItem(reader);
377 381
378 return item; 382 reader.Close();
379 } 383 result.Dispose();
380 } 384
385 return item;
381 } 386 }
382 } 387 }
383 catch (Exception e) 388 catch (Exception e)
384 { 389 {
385 database.Reconnect(); 390 database.Reconnect();
386 m_log.Error(e.Message, e); 391 m_log.Error(e.ToString());
387 } 392 }
388 return null; 393 return null;
389 } 394 }
@@ -408,7 +413,7 @@ namespace OpenSim.Data.MySQL
408 } 413 }
409 catch (Exception e) 414 catch (Exception e)
410 { 415 {
411 m_log.Error(e.Message, e); 416 m_log.Error(e.ToString());
412 } 417 }
413 418
414 return null; 419 return null;
@@ -428,25 +433,24 @@ namespace OpenSim.Data.MySQL
428 { 433 {
429 database.CheckConnection(); 434 database.CheckConnection();
430 435
431 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection)) 436 MySqlCommand result =
432 { 437 new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection);
433 result.Parameters.AddWithValue("?uuid", folderID.ToString()); 438 result.Parameters.AddWithValue("?uuid", folderID.ToString());
439 MySqlDataReader reader = result.ExecuteReader();
434 440
435 using (MySqlDataReader reader = result.ExecuteReader()) 441 InventoryFolderBase folder = null;
436 { 442 if (reader.Read())
437 InventoryFolderBase folder = null; 443 folder = readInventoryFolder(reader);
438 if (reader.Read()) 444 reader.Close();
439 folder = readInventoryFolder(reader); 445 result.Dispose();
440 446
441 return folder; 447 return folder;
442 }
443 }
444 } 448 }
445 } 449 }
446 catch (Exception e) 450 catch (Exception e)
447 { 451 {
448 database.Reconnect(); 452 database.Reconnect();
449 m_log.Error(e.Message, e); 453 m_log.Error(e.ToString());
450 return null; 454 return null;
451 } 455 }
452 } 456 }
@@ -694,73 +698,69 @@ namespace OpenSim.Data.MySQL
694 try 698 try
695 { 699 {
696 List<InventoryFolderBase> folders = new List<InventoryFolderBase>(); 700 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
697 Dictionary<UUID, List<InventoryFolderBase>> hashtable = new Dictionary<UUID, List<InventoryFolderBase>>(); ; 701 Dictionary<UUID, List<InventoryFolderBase>> hashtable
702 = new Dictionary<UUID, List<InventoryFolderBase>>(); ;
698 List<InventoryFolderBase> parentFolder = new List<InventoryFolderBase>(); 703 List<InventoryFolderBase> parentFolder = new List<InventoryFolderBase>();
699 bool buildResultsFromHashTable = false;
700
701 lock (database) 704 lock (database)
702 { 705 {
706 MySqlCommand result;
707 MySqlDataReader reader;
708 bool buildResultsFromHashTable = false;
709
703 database.CheckConnection(); 710 database.CheckConnection();
704 711
705 /* Fetch the parent folder from the database to determine the agent ID, and if 712 /* Fetch the parent folder from the database to determine the agent ID, and if
706 * we're querying the root of the inventory folder tree */ 713 * we're querying the root of the inventory folder tree */
707 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection)) 714 result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid",
708 { 715 database.Connection);
709 result.Parameters.AddWithValue("?uuid", parentID.ToString()); 716 result.Parameters.AddWithValue("?uuid", parentID.ToString());
710 717 reader = result.ExecuteReader();
711 using (MySqlDataReader reader = result.ExecuteReader()) 718 while (reader.Read()) // Should be at most 1 result
712 { 719 parentFolder.Add(readInventoryFolder(reader));
713 // Should be at most 1 result 720 reader.Close();
714 while (reader.Read()) 721 result.Dispose();
715 parentFolder.Add(readInventoryFolder(reader));
716 }
717 }
718 722
719 if (parentFolder.Count >= 1) // No result means parent folder does not exist 723 if (parentFolder.Count >= 1) // No result means parent folder does not exist
720 { 724 {
721 if (parentFolder[0].ParentID == UUID.Zero) // We are querying the root folder 725 if (parentFolder[0].ParentID == UUID.Zero) // We are querying the root folder
722 { 726 {
723 /* Get all of the agent's folders from the database, put them in a list and return it */ 727 /* Get all of the agent's folders from the database, put them in a list and return it */
724 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection)) 728 result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid",
729 database.Connection);
730 result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString());
731 reader = result.ExecuteReader();
732 while (reader.Read())
725 { 733 {
726 result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); 734 InventoryFolderBase curFolder = readInventoryFolder(reader);
727 735 if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list
728 using (MySqlDataReader reader = result.ExecuteReader()) 736 folders.Add(curFolder);
729 {
730 while (reader.Read())
731 {
732 InventoryFolderBase curFolder = readInventoryFolder(reader);
733 if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list
734 folders.Add(curFolder);
735 }
736 }
737 } 737 }
738 reader.Close();
739 result.Dispose();
738 } // if we are querying the root folder 740 } // if we are querying the root folder
739 else // else we are querying a subtree of the inventory folder tree 741 else // else we are querying a subtree of the inventory folder tree
740 { 742 {
741 /* Get all of the agent's folders from the database, put them all in a hash table 743 /* Get all of the agent's folders from the database, put them all in a hash table
742 * indexed by their parent ID */ 744 * indexed by their parent ID */
743 using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection)) 745 result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid",
746 database.Connection);
747 result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString());
748 reader = result.ExecuteReader();
749 while (reader.Read())
744 { 750 {
745 result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString()); 751 InventoryFolderBase curFolder = readInventoryFolder(reader);
746 752 if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling
747 using (MySqlDataReader reader = result.ExecuteReader()) 753 hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list
754 else // else current folder has no known (yet) siblings
748 { 755 {
749 while (reader.Read()) 756 List<InventoryFolderBase> siblingList = new List<InventoryFolderBase>();
750 { 757 siblingList.Add(curFolder);
751 InventoryFolderBase curFolder = readInventoryFolder(reader); 758 // Current folder has no known (yet) siblings
752 if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling 759 hashtable.Add(curFolder.ParentID, siblingList);
753 hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list
754 else // else current folder has no known (yet) siblings
755 {
756 List<InventoryFolderBase> siblingList = new List<InventoryFolderBase>();
757 siblingList.Add(curFolder);
758 // Current folder has no known (yet) siblings
759 hashtable.Add(curFolder.ParentID, siblingList);
760 }
761 } // while more items to read from the database
762 } 760 }
763 } 761 } // while more items to read from the database
762 reader.Close();
763 result.Dispose();
764 764
765 // Set flag so we know we need to build the results from the hash table after 765 // Set flag so we know we need to build the results from the hash table after
766 // we unlock the database 766 // we unlock the database
@@ -781,13 +781,12 @@ namespace OpenSim.Data.MySQL
781 folders.AddRange(hashtable[folders[i].ID]); 781 folders.AddRange(hashtable[folders[i].ID]);
782 } 782 }
783 } // lock (database) 783 } // lock (database)
784
785 return folders; 784 return folders;
786 } 785 }
787 catch (Exception e) 786 catch (Exception e)
788 { 787 {
789 database.Reconnect(); 788 database.Reconnect();
790 m_log.Error(e.Message, e); 789 m_log.Error(e.ToString());
791 return null; 790 return null;
792 } 791 }
793 } 792 }
@@ -802,18 +801,19 @@ namespace OpenSim.Data.MySQL
802 { 801 {
803 database.CheckConnection(); 802 database.CheckConnection();
804 803
805 using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection)) 804 MySqlCommand cmd =
806 { 805 new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection);
807 cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); 806 cmd.Parameters.AddWithValue("?uuid", folderID.ToString());
808 807
809 lock (database) 808 lock (database)
810 cmd.ExecuteNonQuery(); 809 {
810 cmd.ExecuteNonQuery();
811 } 811 }
812 } 812 }
813 catch (MySqlException e) 813 catch (MySqlException e)
814 { 814 {
815 database.Reconnect(); 815 database.Reconnect();
816 m_log.Error(e.Message, e); 816 m_log.Error(e.ToString());
817 } 817 }
818 } 818 }
819 819
@@ -827,12 +827,13 @@ namespace OpenSim.Data.MySQL
827 { 827 {
828 database.CheckConnection(); 828 database.CheckConnection();
829 829
830 using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection)) 830 MySqlCommand cmd =
831 { 831 new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection);
832 cmd.Parameters.AddWithValue("?uuid", folderID.ToString()); 832 cmd.Parameters.AddWithValue("?uuid", folderID.ToString());
833 833
834 lock (database) 834 lock (database)
835 cmd.ExecuteNonQuery(); 835 {
836 cmd.ExecuteNonQuery();
836 } 837 }
837 } 838 }
838 catch (MySqlException e) 839 catch (MySqlException e)
@@ -864,38 +865,40 @@ namespace OpenSim.Data.MySQL
864 865
865 public List<InventoryItemBase> fetchActiveGestures(UUID avatarID) 866 public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
866 { 867 {
868 MySqlDataReader result = null;
869 MySqlCommand sqlCmd = null;
867 lock (database) 870 lock (database)
868 { 871 {
869 try 872 try
870 { 873 {
871 database.CheckConnection(); 874 database.CheckConnection();
872 875 sqlCmd = new MySqlCommand(
873 using (MySqlCommand sqlCmd = new MySqlCommand(
874 "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1", 876 "SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1",
875 database.Connection)) 877 database.Connection);
876 { 878 sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString());
877 sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString()); 879 sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture);
878 sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture); 880 result = sqlCmd.ExecuteReader();
879 881
880 using (MySqlDataReader result = sqlCmd.ExecuteReader()) 882 List<InventoryItemBase> list = new List<InventoryItemBase>();
881 { 883 while (result.Read())
882 List<InventoryItemBase> list = new List<InventoryItemBase>(); 884 {
883 while (result.Read()) 885 InventoryItemBase item = readInventoryItem(result);
884 { 886 if (item != null)
885 InventoryItemBase item = readInventoryItem(result); 887 list.Add(item);
886 if (item != null)
887 list.Add(item);
888 }
889 return list;
890 }
891 } 888 }
889 return list;
892 } 890 }
893 catch (Exception e) 891 catch (Exception e)
894 { 892 {
895 database.Reconnect(); 893 database.Reconnect();
896 m_log.Error(e.Message, e); 894 m_log.Error(e.ToString());
897 return null; 895 return null;
898 } 896 }
897 finally
898 {
899 if (result != null) result.Close();
900 if (sqlCmd != null) sqlCmd.Dispose();
901 }
899 } 902 }
900 } 903 }
901 } 904 }
diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
index a807948..c49153f 100644
--- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
@@ -908,7 +908,7 @@ namespace OpenSim.Data.MySQL
908 if (!(row["ParticleSystem"] is DBNull)) 908 if (!(row["ParticleSystem"] is DBNull))
909 prim.ParticleSystem = (byte[])row["ParticleSystem"]; 909 prim.ParticleSystem = (byte[])row["ParticleSystem"];
910 910
911 prim.RotationalVelocity = new Vector3( 911 prim.AngularVelocity = new Vector3(
912 (float)(double)row["OmegaX"], 912 (float)(double)row["OmegaX"],
913 (float)(double)row["OmegaY"], 913 (float)(double)row["OmegaY"],
914 (float)(double)row["OmegaZ"] 914 (float)(double)row["OmegaZ"]
@@ -1240,9 +1240,9 @@ namespace OpenSim.Data.MySQL
1240 cmd.Parameters.AddWithValue("TextureAnimation", prim.TextureAnimation); 1240 cmd.Parameters.AddWithValue("TextureAnimation", prim.TextureAnimation);
1241 cmd.Parameters.AddWithValue("ParticleSystem", prim.ParticleSystem); 1241 cmd.Parameters.AddWithValue("ParticleSystem", prim.ParticleSystem);
1242 1242
1243 cmd.Parameters.AddWithValue("OmegaX", (double)prim.RotationalVelocity.X); 1243 cmd.Parameters.AddWithValue("OmegaX", (double)prim.AngularVelocity.X);
1244 cmd.Parameters.AddWithValue("OmegaY", (double)prim.RotationalVelocity.Y); 1244 cmd.Parameters.AddWithValue("OmegaY", (double)prim.AngularVelocity.Y);
1245 cmd.Parameters.AddWithValue("OmegaZ", (double)prim.RotationalVelocity.Z); 1245 cmd.Parameters.AddWithValue("OmegaZ", (double)prim.AngularVelocity.Z);
1246 1246
1247 cmd.Parameters.AddWithValue("CameraEyeOffsetX", (double)prim.GetCameraEyeOffset().X); 1247 cmd.Parameters.AddWithValue("CameraEyeOffsetX", (double)prim.GetCameraEyeOffset().X);
1248 cmd.Parameters.AddWithValue("CameraEyeOffsetY", (double)prim.GetCameraEyeOffset().Y); 1248 cmd.Parameters.AddWithValue("CameraEyeOffsetY", (double)prim.GetCameraEyeOffset().Y);
diff --git a/OpenSim/Data/MySQL/MySQLManager.cs b/OpenSim/Data/MySQL/MySQLManager.cs
index a724a50..a6cce57 100644
--- a/OpenSim/Data/MySQL/MySQLManager.cs
+++ b/OpenSim/Data/MySQL/MySQLManager.cs
@@ -134,16 +134,18 @@ namespace OpenSim.Data.MySQL
134 /// </summary> 134 /// </summary>
135 protected void GetWaitTimeout() 135 protected void GetWaitTimeout()
136 { 136 {
137 using (MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon)) 137 MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon);
138
139 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
138 { 140 {
139 using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow)) 141 if (dbReader.Read())
140 { 142 {
141 if (dbReader.Read()) 143 m_waitTimeout
142 { 144 = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
143 m_waitTimeout
144 = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
145 }
146 } 145 }
146
147 dbReader.Close();
148 cmd.Dispose();
147 } 149 }
148 150
149 m_lastConnectionUse = DateTime.Now.Ticks; 151 m_lastConnectionUse = DateTime.Now.Ticks;
@@ -301,31 +303,31 @@ namespace OpenSim.Data.MySQL
301 { 303 {
302 CheckConnection(); 304 CheckConnection();
303 305
304 using (MySqlCommand tablesCmd = new MySqlCommand( 306 MySqlCommand tablesCmd =
305 "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname", 307 new MySqlCommand(
306 dbcon)) 308 "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname",
307 { 309 dbcon);
308 tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database); 310 tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database);
309 311
310 using (MySqlDataReader tables = tablesCmd.ExecuteReader()) 312 using (MySqlDataReader tables = tablesCmd.ExecuteReader())
313 {
314 while (tables.Read())
311 { 315 {
312 while (tables.Read()) 316 try
313 { 317 {
314 try 318 string tableName = (string) tables["TABLE_NAME"];
315 { 319 string comment = (string) tables["TABLE_COMMENT"];
316 string tableName = (string)tables["TABLE_NAME"]; 320 if (tableList.ContainsKey(tableName))
317 string comment = (string)tables["TABLE_COMMENT"];
318 if (tableList.ContainsKey(tableName))
319 {
320 tableList[tableName] = comment;
321 }
322 }
323 catch (Exception e)
324 { 321 {
325 m_log.Error(e.Message, e); 322 tableList[tableName] = comment;
326 } 323 }
327 } 324 }
325 catch (Exception e)
326 {
327 m_log.Error(e.ToString());
328 }
328 } 329 }
330 tables.Close();
329 } 331 }
330 } 332 }
331 } 333 }
@@ -344,19 +346,19 @@ namespace OpenSim.Data.MySQL
344 { 346 {
345 CheckConnection(); // Not sure if this one is necessary 347 CheckConnection(); // Not sure if this one is necessary
346 348
347 MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand(); 349 MySqlCommand dbcommand = (MySqlCommand) dbcon.CreateCommand();
348 dbcommand.CommandText = sql; 350 dbcommand.CommandText = sql;
349 foreach (KeyValuePair<string, object> param in parameters) 351 foreach (KeyValuePair<string, object> param in parameters)
350 { 352 {
351 dbcommand.Parameters.AddWithValue(param.Key, param.Value); 353 dbcommand.Parameters.AddWithValue(param.Key, param.Value);
352 } 354 }
353 355
354 return (IDbCommand)dbcommand; 356 return (IDbCommand) dbcommand;
355 } 357 }
356 catch (Exception e) 358 catch (Exception e)
357 { 359 {
358 // Return null if it fails. 360 // Return null if it fails.
359 m_log.Error("Failed during Query generation: " + e.Message, e); 361 m_log.Error("Failed during Query generation: " + e.ToString());
360 return null; 362 return null;
361 } 363 }
362 } 364 }
@@ -692,6 +694,8 @@ namespace OpenSim.Data.MySQL
692 ret.Add(attachpoint, item); 694 ret.Add(attachpoint, item);
693 } 695 }
694 696
697 r.Close();
698
695 return ret; 699 return ret;
696 } 700 }
697 701
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index f514076..b0075e8 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -56,13 +56,12 @@ namespace OpenSim.Data.MySQL
56 if (scopeID != UUID.Zero) 56 if (scopeID != UUID.Zero)
57 command += " and ScopeID = ?scopeID"; 57 command += " and ScopeID = ?scopeID";
58 58
59 using (MySqlCommand cmd = new MySqlCommand(command)) 59 MySqlCommand cmd = new MySqlCommand(command);
60 {
61 cmd.Parameters.AddWithValue("?regionName", regionName);
62 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
63 60
64 return RunCommand(cmd); 61 cmd.Parameters.AddWithValue("?regionName", regionName);
65 } 62 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
63
64 return RunCommand(cmd);
66 } 65 }
67 66
68 public RegionData Get(int posX, int posY, UUID scopeID) 67 public RegionData Get(int posX, int posY, UUID scopeID)
@@ -71,18 +70,17 @@ namespace OpenSim.Data.MySQL
71 if (scopeID != UUID.Zero) 70 if (scopeID != UUID.Zero)
72 command += " and ScopeID = ?scopeID"; 71 command += " and ScopeID = ?scopeID";
73 72
74 using (MySqlCommand cmd = new MySqlCommand(command)) 73 MySqlCommand cmd = new MySqlCommand(command);
75 {
76 cmd.Parameters.AddWithValue("?posX", posX.ToString());
77 cmd.Parameters.AddWithValue("?posY", posY.ToString());
78 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
79 74
80 List<RegionData> ret = RunCommand(cmd); 75 cmd.Parameters.AddWithValue("?posX", posX.ToString());
81 if (ret.Count == 0) 76 cmd.Parameters.AddWithValue("?posY", posY.ToString());
82 return null; 77 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
83 78
84 return ret[0]; 79 List<RegionData> ret = RunCommand(cmd);
85 } 80 if (ret.Count == 0)
81 return null;
82
83 return ret[0];
86 } 84 }
87 85
88 public RegionData Get(UUID regionID, UUID scopeID) 86 public RegionData Get(UUID regionID, UUID scopeID)
@@ -91,17 +89,16 @@ namespace OpenSim.Data.MySQL
91 if (scopeID != UUID.Zero) 89 if (scopeID != UUID.Zero)
92 command += " and ScopeID = ?scopeID"; 90 command += " and ScopeID = ?scopeID";
93 91
94 using (MySqlCommand cmd = new MySqlCommand(command)) 92 MySqlCommand cmd = new MySqlCommand(command);
95 {
96 cmd.Parameters.AddWithValue("?regionID", regionID.ToString());
97 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
98 93
99 List<RegionData> ret = RunCommand(cmd); 94 cmd.Parameters.AddWithValue("?regionID", regionID.ToString());
100 if (ret.Count == 0) 95 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
101 return null;
102 96
103 return ret[0]; 97 List<RegionData> ret = RunCommand(cmd);
104 } 98 if (ret.Count == 0)
99 return null;
100
101 return ret[0];
105 } 102 }
106 103
107 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID) 104 public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
@@ -110,44 +107,43 @@ namespace OpenSim.Data.MySQL
110 if (scopeID != UUID.Zero) 107 if (scopeID != UUID.Zero)
111 command += " and ScopeID = ?scopeID"; 108 command += " and ScopeID = ?scopeID";
112 109
113 using (MySqlCommand cmd = new MySqlCommand(command)) 110 MySqlCommand cmd = new MySqlCommand(command);
114 {
115 cmd.Parameters.AddWithValue("?startX", startX.ToString());
116 cmd.Parameters.AddWithValue("?startY", startY.ToString());
117 cmd.Parameters.AddWithValue("?endX", endX.ToString());
118 cmd.Parameters.AddWithValue("?endY", endY.ToString());
119 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
120 111
121 return RunCommand(cmd); 112 cmd.Parameters.AddWithValue("?startX", startX.ToString());
122 } 113 cmd.Parameters.AddWithValue("?startY", startY.ToString());
114 cmd.Parameters.AddWithValue("?endX", endX.ToString());
115 cmd.Parameters.AddWithValue("?endY", endY.ToString());
116 cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
117
118 return RunCommand(cmd);
123 } 119 }
124 120
125 public List<RegionData> RunCommand(MySqlCommand cmd) 121 public List<RegionData> RunCommand(MySqlCommand cmd)
126 { 122 {
127 List<RegionData> retList = new List<RegionData>(); 123 List<RegionData> retList = new List<RegionData>();
128 124
129 using (IDataReader result = ExecuteReader(cmd)) 125 IDataReader result = ExecuteReader(cmd);
126
127 while (result.Read())
130 { 128 {
131 while (result.Read()) 129 RegionData ret = new RegionData();
130 ret.Data = new Dictionary<string, object>();
131
132 UUID regionID;
133 UUID.TryParse(result["uuid"].ToString(), out regionID);
134 ret.RegionID = regionID;
135 UUID scope;
136 UUID.TryParse(result["ScopeID"].ToString(), out scope);
137 ret.ScopeID = scope;
138 ret.RegionName = result["regionName"].ToString();
139 ret.posX = Convert.ToInt32(result["locX"]);
140 ret.posY = Convert.ToInt32(result["locY"]);
141 ret.sizeX = Convert.ToInt32(result["sizeX"]);
142 ret.sizeY = Convert.ToInt32(result["sizeY"]);
143
144 if (m_ColumnNames == null)
132 { 145 {
133 RegionData ret = new RegionData(); 146 m_ColumnNames = new List<string>();
134 ret.Data = new Dictionary<string, object>();
135
136 UUID regionID;
137 UUID.TryParse(result["uuid"].ToString(), out regionID);
138 ret.RegionID = regionID;
139 UUID scope;
140 UUID.TryParse(result["ScopeID"].ToString(), out scope);
141 ret.ScopeID = scope;
142 ret.RegionName = result["regionName"].ToString();
143 ret.posX = Convert.ToInt32(result["locX"]);
144 ret.posY = Convert.ToInt32(result["locY"]);
145 ret.sizeX = Convert.ToInt32(result["sizeX"]);
146 ret.sizeY = Convert.ToInt32(result["sizeY"]);
147
148 if (m_ColumnNames == null)
149 {
150 m_ColumnNames = new List<string>();
151 147
152 DataTable schemaTable = result.GetSchemaTable(); 148 DataTable schemaTable = result.GetSchemaTable();
153 foreach (DataRow row in schemaTable.Rows) 149 foreach (DataRow row in schemaTable.Rows)
@@ -157,28 +153,28 @@ namespace OpenSim.Data.MySQL
157 } 153 }
158 } 154 }
159 155
160 foreach (string s in m_ColumnNames) 156 foreach (string s in m_ColumnNames)
161 { 157 {
162 if (s == "uuid") 158 if (s == "uuid")
163 continue; 159 continue;
164 if (s == "ScopeID") 160 if (s == "ScopeID")
165 continue; 161 continue;
166 if (s == "regionName") 162 if (s == "regionName")
167 continue; 163 continue;
168 if (s == "locX") 164 if (s == "locX")
169 continue; 165 continue;
170 if (s == "locY") 166 if (s == "locY")
171 continue; 167 continue;
172 168
173 ret.Data[s] = result[s].ToString(); 169 ret.Data[s] = result[s].ToString();
174 }
175
176 retList.Add(ret);
177 } 170 }
178 171
179 CloseDBConnection(result, cmd); 172 retList.Add(ret);
180 } 173 }
181 174
175 result.Close();
176 CloseReaderCommand(cmd);
177
182 return retList; 178 return retList;
183 } 179 }
184 180
@@ -205,72 +201,76 @@ namespace OpenSim.Data.MySQL
205 201
206 string[] fields = new List<string>(data.Data.Keys).ToArray(); 202 string[] fields = new List<string>(data.Data.Keys).ToArray();
207 203
208 using (MySqlCommand cmd = new MySqlCommand()) 204 MySqlCommand cmd = new MySqlCommand();
205
206 string update = "update `"+m_Realm+"` set locX=?posX, locY=?posY, sizeX=?sizeX, sizeY=?sizeY";
207 foreach (string field in fields)
209 { 208 {
210 string update = "update `" + m_Realm + "` set locX=?posX, locY=?posY, sizeX=?sizeX, sizeY=?sizeY"; 209 update += ", ";
211 foreach (string field in fields) 210 update += "`" + field + "` = ?"+field;
212 {
213 update += ", ";
214 update += "`" + field + "` = ?" + field;
215 211
216 cmd.Parameters.AddWithValue("?" + field, data.Data[field]); 212 cmd.Parameters.AddWithValue("?"+field, data.Data[field]);
217 } 213 }
218 214
219 update += " where uuid = ?regionID"; 215 update += " where uuid = ?regionID";
220 216
221 if (data.ScopeID != UUID.Zero) 217 if (data.ScopeID != UUID.Zero)
222 update += " and ScopeID = ?scopeID"; 218 update += " and ScopeID = ?scopeID";
223 219
224 cmd.CommandText = update; 220 cmd.CommandText = update;
225 cmd.Parameters.AddWithValue("?regionID", data.RegionID.ToString()); 221 cmd.Parameters.AddWithValue("?regionID", data.RegionID.ToString());
226 cmd.Parameters.AddWithValue("?regionName", data.RegionName); 222 cmd.Parameters.AddWithValue("?regionName", data.RegionName);
227 cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); 223 cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString());
228 cmd.Parameters.AddWithValue("?posX", data.posX.ToString()); 224 cmd.Parameters.AddWithValue("?posX", data.posX.ToString());
229 cmd.Parameters.AddWithValue("?posY", data.posY.ToString()); 225 cmd.Parameters.AddWithValue("?posY", data.posY.ToString());
230 cmd.Parameters.AddWithValue("?sizeX", data.sizeX.ToString()); 226 cmd.Parameters.AddWithValue("?sizeX", data.sizeX.ToString());
231 cmd.Parameters.AddWithValue("?sizeY", data.sizeY.ToString()); 227 cmd.Parameters.AddWithValue("?sizeY", data.sizeY.ToString());
232 228
233 if (ExecuteNonQuery(cmd) < 1) 229 if (ExecuteNonQuery(cmd) < 1)
234 { 230 {
235 string insert = "insert into `" + m_Realm + "` (`uuid`, `ScopeID`, `locX`, `locY`, `sizeX`, `sizeY`, `regionName`, `" + 231 string insert = "insert into `" + m_Realm + "` (`uuid`, `ScopeID`, `locX`, `locY`, `sizeX`, `sizeY`, `regionName`, `" +
236 String.Join("`, `", fields) + 232 String.Join("`, `", fields) +
237 "`) values ( ?regionID, ?scopeID, ?posX, ?posY, ?sizeX, ?sizeY, ?regionName, ?" + String.Join(", ?", fields) + ")"; 233 "`) values ( ?regionID, ?scopeID, ?posX, ?posY, ?sizeX, ?sizeY, ?regionName, ?" + String.Join(", ?", fields) + ")";
238 234
239 cmd.CommandText = insert; 235 cmd.CommandText = insert;
240 236
241 if (ExecuteNonQuery(cmd) < 1) 237 if (ExecuteNonQuery(cmd) < 1)
242 { 238 {
243 return false; 239 cmd.Dispose();
244 } 240 return false;
245 } 241 }
246 } 242 }
247 243
244 cmd.Dispose();
245
248 return true; 246 return true;
249 } 247 }
250 248
251 public bool SetDataItem(UUID regionID, string item, string value) 249 public bool SetDataItem(UUID regionID, string item, string value)
252 { 250 {
253 using (MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + "` set `" + item + "` = ?" + item + " where uuid = ?UUID")) 251 MySqlCommand cmd = new MySqlCommand("update `" + m_Realm +
254 { 252 "` set `" + item + "` = ?" + item + " where uuid = ?UUID");
255 cmd.Parameters.AddWithValue("?" + item, value);
256 cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
257 253
258 if (ExecuteNonQuery(cmd) > 0) 254
259 return true; 255 cmd.Parameters.AddWithValue("?"+item, value);
260 } 256 cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
257
258 if (ExecuteNonQuery(cmd) > 0)
259 return true;
261 260
262 return false; 261 return false;
263 } 262 }
264 263
265 public bool Delete(UUID regionID) 264 public bool Delete(UUID regionID)
266 { 265 {
267 using (MySqlCommand cmd = new MySqlCommand("delete from `" + m_Realm + "` where uuid = ?UUID")) 266 MySqlCommand cmd = new MySqlCommand("delete from `" + m_Realm +
268 { 267 "` where uuid = ?UUID");
269 cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
270 268
271 if (ExecuteNonQuery(cmd) > 0) 269
272 return true; 270 cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
273 } 271
272 if (ExecuteNonQuery(cmd) > 0)
273 return true;
274 274
275 return false; 275 return false;
276 } 276 }
diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
index 0bbc3f5..d48144d 100644
--- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
@@ -97,14 +97,16 @@ namespace OpenSim.Data.MySQL
97 ret.Data[s] = result[s].ToString(); 97 ret.Data[s] = result[s].ToString();
98 } 98 }
99 99
100 CloseDBConnection(result, cmd); 100 result.Close();
101 CloseReaderCommand(cmd);
102
101 return ret; 103 return ret;
102 } 104 }
103 else 105
104 { 106 result.Close();
105 CloseDBConnection(result, cmd); 107 CloseReaderCommand(cmd);
106 return null; 108
107 } 109 return null;
108 } 110 }
109 111
110 public bool Store(UserAccountData data) 112 public bool Store(UserAccountData data)
@@ -116,60 +118,61 @@ namespace OpenSim.Data.MySQL
116 118
117 string[] fields = new List<string>(data.Data.Keys).ToArray(); 119 string[] fields = new List<string>(data.Data.Keys).ToArray();
118 120
119 using (MySqlCommand cmd = new MySqlCommand()) 121 MySqlCommand cmd = new MySqlCommand();
122
123 string update = "update `"+m_Realm+"` set ";
124 bool first = true;
125 foreach (string field in fields)
120 { 126 {
121 string update = "update `" + m_Realm + "` set "; 127 if (!first)
122 bool first = true; 128 update += ", ";
123 foreach (string field in fields) 129 update += "`" + field + "` = ?"+field;
124 {
125 if (!first)
126 update += ", ";
127 update += "`" + field + "` = ?" + field;
128 130
129 first = false; 131 first = false;
130 132
131 cmd.Parameters.AddWithValue("?" + field, data.Data[field]); 133 cmd.Parameters.AddWithValue("?"+field, data.Data[field]);
132 } 134 }
133 135
134 update += " where UUID = ?principalID"; 136 update += " where UUID = ?principalID";
135 137
136 if (data.ScopeID != UUID.Zero) 138 if (data.ScopeID != UUID.Zero)
137 update += " and ScopeID = ?scopeID"; 139 update += " and ScopeID = ?scopeID";
138 140
139 cmd.CommandText = update; 141 cmd.CommandText = update;
140 cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString()); 142 cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString());
141 cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString()); 143 cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString());
142 144
143 if (ExecuteNonQuery(cmd) < 1) 145 if (ExecuteNonQuery(cmd) < 1)
144 { 146 {
145 string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" + 147 string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" +
146 String.Join("`, `", fields) + 148 String.Join("`, `", fields) +
147 "`) values (?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")"; 149 "`) values (?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")";
148 150
149 cmd.CommandText = insert; 151 cmd.CommandText = insert;
150 152
151 if (ExecuteNonQuery(cmd) < 1) 153 if (ExecuteNonQuery(cmd) < 1)
152 { 154 {
153 cmd.Dispose(); 155 cmd.Dispose();
154 return false; 156 return false;
155 }
156 } 157 }
157 } 158 }
158 159
160 cmd.Dispose();
161
159 return true; 162 return true;
160 } 163 }
161 164
162 public bool SetDataItem(UUID principalID, string item, string value) 165 public bool SetDataItem(UUID principalID, string item, string value)
163 { 166 {
164 using (MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + "` set `" + 167 MySqlCommand cmd = new MySqlCommand("update `" + m_Realm +
165 item + "` = ?" + item + " where UUID = ?UUID")) 168 "` set `" + item + "` = ?" + item + " where UUID = ?UUID");
166 {
167 cmd.Parameters.AddWithValue("?" + item, value);
168 cmd.Parameters.AddWithValue("?UUID", principalID.ToString());
169 169
170 if (ExecuteNonQuery(cmd) > 0) 170
171 return true; 171 cmd.Parameters.AddWithValue("?"+item, value);
172 } 172 cmd.Parameters.AddWithValue("?UUID", principalID.ToString());
173
174 if (ExecuteNonQuery(cmd) > 0)
175 return true;
173 176
174 return false; 177 return false;
175 } 178 }
diff --git a/OpenSim/Data/MySQL/MySQLUserData.cs b/OpenSim/Data/MySQL/MySQLUserData.cs
index bd46dfc..04f872f 100644
--- a/OpenSim/Data/MySQL/MySQLUserData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserData.cs
@@ -181,20 +181,21 @@ namespace OpenSim.Data.MySQL
181 param["?first"] = user; 181 param["?first"] = user;
182 param["?second"] = last; 182 param["?second"] = last;
183 183
184 using (IDbCommand result = dbm.Manager.Query( 184 IDbCommand result =
185 "SELECT * FROM " + m_usersTableName + " WHERE username = ?first AND lastname = ?second", param)) 185 dbm.Manager.Query(
186 { 186 "SELECT * FROM " + m_usersTableName + " WHERE username = ?first AND lastname = ?second", param);
187 using (IDataReader reader = result.ExecuteReader()) 187 IDataReader reader = result.ExecuteReader();
188 { 188
189 UserProfileData row = dbm.Manager.readUserRow(reader); 189 UserProfileData row = dbm.Manager.readUserRow(reader);
190 return row; 190
191 } 191 reader.Dispose();
192 } 192 result.Dispose();
193 return row;
193 } 194 }
194 catch (Exception e) 195 catch (Exception e)
195 { 196 {
196 dbm.Manager.Reconnect(); 197 dbm.Manager.Reconnect();
197 m_log.Error(e.Message, e); 198 m_log.Error(e.ToString());
198 return null; 199 return null;
199 } 200 }
200 finally 201 finally
@@ -219,30 +220,28 @@ namespace OpenSim.Data.MySQL
219 220
220 try 221 try
221 { 222 {
222 using (IDbCommand adder = dbm.Manager.Query( 223 IDbCommand adder =
223 "INSERT INTO `" + m_userFriendsTableName + "` " + 224 dbm.Manager.Query(
224 "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " + 225 "INSERT INTO `" + m_userFriendsTableName + "` " +
225 "VALUES " + 226 "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " +
226 "(?ownerID,?friendID,?friendPerms,?datetimestamp)", 227 "VALUES " +
227 param)) 228 "(?ownerID,?friendID,?friendPerms,?datetimestamp)",
228 { 229 param);
229 adder.ExecuteNonQuery(); 230 adder.ExecuteNonQuery();
230 } 231
231 232 adder =
232 using (IDbCommand adder = dbm.Manager.Query( 233 dbm.Manager.Query(
233 "INSERT INTO `" + m_userFriendsTableName + "` " + 234 "INSERT INTO `" + m_userFriendsTableName + "` " +
234 "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " + 235 "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " +
235 "VALUES " + 236 "VALUES " +
236 "(?friendID,?ownerID,?friendPerms,?datetimestamp)", 237 "(?friendID,?ownerID,?friendPerms,?datetimestamp)",
237 param)) 238 param);
238 { 239 adder.ExecuteNonQuery();
239 adder.ExecuteNonQuery();
240 }
241 } 240 }
242 catch (Exception e) 241 catch (Exception e)
243 { 242 {
244 dbm.Manager.Reconnect(); 243 dbm.Manager.Reconnect();
245 m_log.Error(e.Message, e); 244 m_log.Error(e.ToString());
246 return; 245 return;
247 } 246 }
248 finally 247 finally
@@ -261,24 +260,22 @@ namespace OpenSim.Data.MySQL
261 260
262 try 261 try
263 { 262 {
264 using (IDbCommand updater = dbm.Manager.Query( 263 IDbCommand updater =
264 dbm.Manager.Query(
265 "delete from " + m_userFriendsTableName + " where ownerID = ?ownerID and friendID = ?friendID", 265 "delete from " + m_userFriendsTableName + " where ownerID = ?ownerID and friendID = ?friendID",
266 param)) 266 param);
267 { 267 updater.ExecuteNonQuery();
268 updater.ExecuteNonQuery();
269 }
270 268
271 using (IDbCommand updater = dbm.Manager.Query( 269 updater =
270 dbm.Manager.Query(
272 "delete from " + m_userFriendsTableName + " where ownerID = ?friendID and friendID = ?ownerID", 271 "delete from " + m_userFriendsTableName + " where ownerID = ?friendID and friendID = ?ownerID",
273 param)) 272 param);
274 { 273 updater.ExecuteNonQuery();
275 updater.ExecuteNonQuery();
276 }
277 } 274 }
278 catch (Exception e) 275 catch (Exception e)
279 { 276 {
280 dbm.Manager.Reconnect(); 277 dbm.Manager.Reconnect();
281 m_log.Error(e.Message, e); 278 m_log.Error(e.ToString());
282 return; 279 return;
283 } 280 }
284 finally 281 finally
@@ -298,19 +295,18 @@ namespace OpenSim.Data.MySQL
298 295
299 try 296 try
300 { 297 {
301 using (IDbCommand updater = dbm.Manager.Query( 298 IDbCommand updater =
299 dbm.Manager.Query(
302 "update " + m_userFriendsTableName + 300 "update " + m_userFriendsTableName +
303 " SET friendPerms = ?friendPerms " + 301 " SET friendPerms = ?friendPerms " +
304 "where ownerID = ?ownerID and friendID = ?friendID", 302 "where ownerID = ?ownerID and friendID = ?friendID",
305 param)) 303 param);
306 { 304 updater.ExecuteNonQuery();
307 updater.ExecuteNonQuery();
308 }
309 } 305 }
310 catch (Exception e) 306 catch (Exception e)
311 { 307 {
312 dbm.Manager.Reconnect(); 308 dbm.Manager.Reconnect();
313 m_log.Error(e.Message, e); 309 m_log.Error(e.ToString());
314 return; 310 return;
315 } 311 }
316 finally 312 finally
@@ -331,33 +327,34 @@ namespace OpenSim.Data.MySQL
331 try 327 try
332 { 328 {
333 //Left Join userfriends to itself 329 //Left Join userfriends to itself
334 using (IDbCommand result = dbm.Manager.Query( 330 IDbCommand result =
335 "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " + 331 dbm.Manager.Query(
336 m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" + 332 "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " +
337 " where a.ownerID = ?ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID", 333 m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" +
338 param)) 334 " where a.ownerID = ?ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID",
335 param);
336 IDataReader reader = result.ExecuteReader();
337
338 while (reader.Read())
339 { 339 {
340 using (IDataReader reader = result.ExecuteReader()) 340 FriendListItem fli = new FriendListItem();
341 { 341 fli.FriendListOwner = new UUID((string) reader["ownerID"]);
342 while (reader.Read()) 342 fli.Friend = new UUID((string) reader["friendID"]);
343 { 343 fli.FriendPerms = (uint) Convert.ToInt32(reader["friendPerms"]);
344 FriendListItem fli = new FriendListItem(); 344
345 fli.FriendListOwner = new UUID((string)reader["ownerID"]); 345 // This is not a real column in the database table, it's a joined column from the opposite record
346 fli.Friend = new UUID((string)reader["friendID"]); 346 fli.FriendListOwnerPerms = (uint) Convert.ToInt32(reader["ownerperms"]);
347 fli.FriendPerms = (uint)Convert.ToInt32(reader["friendPerms"]); 347
348 348 Lfli.Add(fli);
349 // This is not a real column in the database table, it's a joined column from the opposite record
350 fli.FriendListOwnerPerms = (uint)Convert.ToInt32(reader["ownerperms"]);
351
352 Lfli.Add(fli);
353 }
354 }
355 } 349 }
350
351 reader.Dispose();
352 result.Dispose();
356 } 353 }
357 catch (Exception e) 354 catch (Exception e)
358 { 355 {
359 dbm.Manager.Reconnect(); 356 dbm.Manager.Reconnect();
360 m_log.Error(e.Message, e); 357 m_log.Error(e.ToString());
361 return Lfli; 358 return Lfli;
362 } 359 }
363 finally 360 finally
@@ -379,29 +376,29 @@ namespace OpenSim.Data.MySQL
379 { 376 {
380 Dictionary<string, object> param = new Dictionary<string, object>(); 377 Dictionary<string, object> param = new Dictionary<string, object>();
381 param["?uuid"] = uuid.ToString(); 378 param["?uuid"] = uuid.ToString();
379 IDbCommand result =
380 dbm.Manager.Query("select agentOnline,currentHandle from " + m_agentsTableName +
381 " where UUID = ?uuid", param);
382 382
383 using (IDbCommand result = dbm.Manager.Query("select agentOnline,currentHandle from " + m_agentsTableName + 383 IDataReader reader = result.ExecuteReader();
384 " where UUID = ?uuid", param)) 384 while (reader.Read())
385 { 385 {
386 using (IDataReader reader = result.ExecuteReader()) 386 FriendRegionInfo fri = new FriendRegionInfo();
387 { 387 fri.isOnline = (sbyte)reader["agentOnline"] != 0;
388 while (reader.Read()) 388 fri.regionHandle = (ulong)reader["currentHandle"];
389 { 389
390 FriendRegionInfo fri = new FriendRegionInfo(); 390 infos[uuid] = fri;
391 fri.isOnline = (sbyte)reader["agentOnline"] != 0;
392 fri.regionHandle = (ulong)reader["currentHandle"];
393
394 infos[uuid] = fri;
395 }
396 }
397 } 391 }
392
393 reader.Dispose();
394 result.Dispose();
398 } 395 }
399 } 396 }
400 catch (Exception e) 397 catch (Exception e)
401 { 398 {
402 m_log.Warn("[MYSQL]: Got exception on trying to find friends regions:", e); 399 m_log.Warn("[MYSQL]: Got exception on trying to find friends regions:", e);
403 dbm.Manager.Reconnect(); 400 dbm.Manager.Reconnect();
404 m_log.Error(e.Message, e); 401 m_log.Error(e.ToString());
405 } 402 }
406 finally 403 finally
407 { 404 {
@@ -430,28 +427,28 @@ namespace OpenSim.Data.MySQL
430 427
431 try 428 try
432 { 429 {
433 using (IDbCommand result = dbm.Manager.Query( 430 IDbCommand result =
434 "SELECT UUID,username,lastname FROM " + m_usersTableName + 431 dbm.Manager.Query(
435 " WHERE username like ?first AND lastname like ?second LIMIT 100", 432 "SELECT UUID,username,lastname FROM " + m_usersTableName +
436 param)) 433 " WHERE username like ?first AND lastname like ?second LIMIT 100",
434 param);
435 IDataReader reader = result.ExecuteReader();
436
437 while (reader.Read())
437 { 438 {
438 using (IDataReader reader = result.ExecuteReader()) 439 AvatarPickerAvatar user = new AvatarPickerAvatar();
439 { 440 user.AvatarID = new UUID((string) reader["UUID"]);
440 while (reader.Read()) 441 user.firstName = (string) reader["username"];
441 { 442 user.lastName = (string) reader["lastname"];
442 AvatarPickerAvatar user = new AvatarPickerAvatar(); 443 returnlist.Add(user);
443 user.AvatarID = new UUID((string)reader["UUID"]);
444 user.firstName = (string)reader["username"];
445 user.lastName = (string)reader["lastname"];
446 returnlist.Add(user);
447 }
448 }
449 } 444 }
445 reader.Dispose();
446 result.Dispose();
450 } 447 }
451 catch (Exception e) 448 catch (Exception e)
452 { 449 {
453 dbm.Manager.Reconnect(); 450 dbm.Manager.Reconnect();
454 m_log.Error(e.Message, e); 451 m_log.Error(e.ToString());
455 return returnlist; 452 return returnlist;
456 } 453 }
457 finally 454 finally
@@ -468,28 +465,28 @@ namespace OpenSim.Data.MySQL
468 Dictionary<string, object> param = new Dictionary<string, object>(); 465 Dictionary<string, object> param = new Dictionary<string, object>();
469 param["?first"] = objAlphaNumericPattern.Replace(querysplit[0], String.Empty) + "%"; 466 param["?first"] = objAlphaNumericPattern.Replace(querysplit[0], String.Empty) + "%";
470 467
471 using (IDbCommand result = dbm.Manager.Query( 468 IDbCommand result =
472 "SELECT UUID,username,lastname FROM " + m_usersTableName + 469 dbm.Manager.Query(
473 " WHERE username like ?first OR lastname like ?first LIMIT 100", 470 "SELECT UUID,username,lastname FROM " + m_usersTableName +
474 param)) 471 " WHERE username like ?first OR lastname like ?first LIMIT 100",
472 param);
473 IDataReader reader = result.ExecuteReader();
474
475 while (reader.Read())
475 { 476 {
476 using (IDataReader reader = result.ExecuteReader()) 477 AvatarPickerAvatar user = new AvatarPickerAvatar();
477 { 478 user.AvatarID = new UUID((string) reader["UUID"]);
478 while (reader.Read()) 479 user.firstName = (string) reader["username"];
479 { 480 user.lastName = (string) reader["lastname"];
480 AvatarPickerAvatar user = new AvatarPickerAvatar(); 481 returnlist.Add(user);
481 user.AvatarID = new UUID((string)reader["UUID"]);
482 user.firstName = (string)reader["username"];
483 user.lastName = (string)reader["lastname"];
484 returnlist.Add(user);
485 }
486 }
487 } 482 }
483 reader.Dispose();
484 result.Dispose();
488 } 485 }
489 catch (Exception e) 486 catch (Exception e)
490 { 487 {
491 dbm.Manager.Reconnect(); 488 dbm.Manager.Reconnect();
492 m_log.Error(e.Message, e); 489 m_log.Error(e.ToString());
493 return returnlist; 490 return returnlist;
494 } 491 }
495 finally 492 finally
@@ -513,19 +510,20 @@ namespace OpenSim.Data.MySQL
513 Dictionary<string, object> param = new Dictionary<string, object>(); 510 Dictionary<string, object> param = new Dictionary<string, object>();
514 param["?uuid"] = uuid.ToString(); 511 param["?uuid"] = uuid.ToString();
515 512
516 using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = ?uuid", param)) 513 IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = ?uuid", param);
517 { 514 IDataReader reader = result.ExecuteReader();
518 using (IDataReader reader = result.ExecuteReader()) 515
519 { 516 UserProfileData row = dbm.Manager.readUserRow(reader);
520 UserProfileData row = dbm.Manager.readUserRow(reader); 517
521 return row; 518 reader.Dispose();
522 } 519 result.Dispose();
523 } 520
521 return row;
524 } 522 }
525 catch (Exception e) 523 catch (Exception e)
526 { 524 {
527 dbm.Manager.Reconnect(); 525 dbm.Manager.Reconnect();
528 m_log.Error(e.Message, e); 526 m_log.Error(e.ToString());
529 return null; 527 return null;
530 } 528 }
531 finally 529 finally
@@ -571,15 +569,15 @@ namespace OpenSim.Data.MySQL
571 569
572 try 570 try
573 { 571 {
574 dbm.Manager.ExecuteParameterizedSql( 572 dbm.Manager.ExecuteParameterizedSql(
575 "update " + m_usersTableName + " SET webLoginKey = ?webLoginKey " + 573 "update " + m_usersTableName + " SET webLoginKey = ?webLoginKey " +
576 "where UUID = ?UUID", 574 "where UUID = ?UUID",
577 param); 575 param);
578 } 576 }
579 catch (Exception e) 577 catch (Exception e)
580 { 578 {
581 dbm.Manager.Reconnect(); 579 dbm.Manager.Reconnect();
582 m_log.Error(e.Message, e); 580 m_log.Error(e.ToString());
583 return; 581 return;
584 } 582 }
585 finally 583 finally
@@ -602,19 +600,21 @@ namespace OpenSim.Data.MySQL
602 Dictionary<string, object> param = new Dictionary<string, object>(); 600 Dictionary<string, object> param = new Dictionary<string, object>();
603 param["?uuid"] = uuid.ToString(); 601 param["?uuid"] = uuid.ToString();
604 602
605 using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = ?uuid", param)) 603 IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = ?uuid",
606 { 604 param);
607 using (IDataReader reader = result.ExecuteReader()) 605 IDataReader reader = result.ExecuteReader();
608 { 606
609 UserAgentData row = dbm.Manager.readAgentRow(reader); 607 UserAgentData row = dbm.Manager.readAgentRow(reader);
610 return row; 608
611 } 609 reader.Dispose();
612 } 610 result.Dispose();
611
612 return row;
613 } 613 }
614 catch (Exception e) 614 catch (Exception e)
615 { 615 {
616 dbm.Manager.Reconnect(); 616 dbm.Manager.Reconnect();
617 m_log.Error(e.Message, e); 617 m_log.Error(e.ToString());
618 return null; 618 return null;
619 } 619 }
620 finally 620 finally
@@ -638,20 +638,19 @@ namespace OpenSim.Data.MySQL
638 638
639 try 639 try
640 { 640 {
641 dbm.Manager.insertUserRow( 641 dbm.Manager.insertUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
642 user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt, 642 user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y,
643 user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y, 643 user.HomeLocation.Z,
644 user.HomeLocation.Z, 644 user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created,
645 user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, 645 user.LastLogin, user.UserInventoryURI, user.UserAssetURI,
646 user.LastLogin, user.UserInventoryURI, user.UserAssetURI, 646 user.CanDoMask, user.WantDoMask,
647 user.CanDoMask, user.WantDoMask, 647 user.AboutText, user.FirstLifeAboutText, user.Image,
648 user.AboutText, user.FirstLifeAboutText, user.Image, 648 user.FirstLifeImage, user.WebLoginKey, user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
649 user.FirstLifeImage, user.WebLoginKey, user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
650 } 649 }
651 catch (Exception e) 650 catch (Exception e)
652 { 651 {
653 dbm.Manager.Reconnect(); 652 dbm.Manager.Reconnect();
654 m_log.Error(e.Message, e); 653 m_log.Error(e.ToString());
655 } 654 }
656 finally 655 finally
657 { 656 {
@@ -677,7 +676,7 @@ namespace OpenSim.Data.MySQL
677 catch (Exception e) 676 catch (Exception e)
678 { 677 {
679 dbm.Manager.Reconnect(); 678 dbm.Manager.Reconnect();
680 m_log.Error(e.Message, e); 679 m_log.Error(e.ToString());
681 } 680 }
682 finally 681 finally
683 { 682 {
@@ -694,15 +693,14 @@ namespace OpenSim.Data.MySQL
694 MySQLSuperManager dbm = GetLockedConnection("UpdateUserProfile"); 693 MySQLSuperManager dbm = GetLockedConnection("UpdateUserProfile");
695 try 694 try
696 { 695 {
697 dbm.Manager.updateUserRow( 696 dbm.Manager.updateUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
698 user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt, 697 user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y,
699 user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y, 698 user.HomeLocation.Z, user.HomeLookAt.X,
700 user.HomeLocation.Z, user.HomeLookAt.X, 699 user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, user.LastLogin,
701 user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, user.LastLogin, 700 user.UserInventoryURI,
702 user.UserInventoryURI, 701 user.UserAssetURI, user.CanDoMask, user.WantDoMask, user.AboutText,
703 user.UserAssetURI, user.CanDoMask, user.WantDoMask, user.AboutText, 702 user.FirstLifeAboutText, user.Image, user.FirstLifeImage, user.WebLoginKey,
704 user.FirstLifeAboutText, user.Image, user.FirstLifeImage, user.WebLoginKey, 703 user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
705 user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
706 } 704 }
707 finally 705 finally
708 { 706 {
@@ -750,29 +748,29 @@ namespace OpenSim.Data.MySQL
750 Dictionary<string, object> param = new Dictionary<string, object>(); 748 Dictionary<string, object> param = new Dictionary<string, object>();
751 param["?owner"] = user.ToString(); 749 param["?owner"] = user.ToString();
752 750
753 using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_appearanceTableName + " WHERE owner = ?owner", param)) 751 IDbCommand result = dbm.Manager.Query(
752 "SELECT * FROM " + m_appearanceTableName + " WHERE owner = ?owner", param);
753 IDataReader reader = result.ExecuteReader();
754
755 AvatarAppearance appearance = dbm.Manager.readAppearanceRow(reader);
756
757 reader.Dispose();
758 result.Dispose();
759
760 if (null == appearance)
754 { 761 {
755 using (IDataReader reader = result.ExecuteReader()) 762 m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString());
756 { 763 return null;
757 AvatarAppearance appearance = dbm.Manager.readAppearanceRow(reader);
758
759 if (appearance == null)
760 {
761 m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString());
762 return null;
763 }
764 else
765 {
766 appearance.SetAttachments(GetUserAttachments(user));
767 return appearance;
768 }
769 }
770 } 764 }
765
766 appearance.SetAttachments(GetUserAttachments(user));
767
768 return appearance;
771 } 769 }
772 catch (Exception e) 770 catch (Exception e)
773 { 771 {
774 dbm.Manager.Reconnect(); 772 dbm.Manager.Reconnect();
775 m_log.Error(e.Message, e); 773 m_log.Error(e.ToString());
776 return null; 774 return null;
777 } 775 }
778 finally 776 finally
@@ -800,7 +798,7 @@ namespace OpenSim.Data.MySQL
800 catch (Exception e) 798 catch (Exception e)
801 { 799 {
802 dbm.Manager.Reconnect(); 800 dbm.Manager.Reconnect();
803 m_log.Error(e.Message, e); 801 m_log.Error(e.ToString());
804 } 802 }
805 finally 803 finally
806 { 804 {
@@ -835,20 +833,20 @@ namespace OpenSim.Data.MySQL
835 833
836 try 834 try
837 { 835 {
838 using (IDbCommand result = dbm.Manager.Query( 836 IDbCommand result = dbm.Manager.Query(
839 "SELECT attachpoint, item, asset from " + m_attachmentsTableName + " WHERE UUID = ?uuid", param)) 837 "SELECT attachpoint, item, asset from " + m_attachmentsTableName + " WHERE UUID = ?uuid", param);
840 { 838 IDataReader reader = result.ExecuteReader();
841 using (IDataReader reader = result.ExecuteReader()) 839
842 { 840 Hashtable ret = dbm.Manager.readAttachments(reader);
843 Hashtable ret = dbm.Manager.readAttachments(reader); 841
844 return ret; 842 reader.Dispose();
845 } 843 result.Dispose();
846 } 844 return ret;
847 } 845 }
848 catch (Exception e) 846 catch (Exception e)
849 { 847 {
850 dbm.Manager.Reconnect(); 848 dbm.Manager.Reconnect();
851 m_log.Error(e.Message, e); 849 m_log.Error(e.ToString());
852 return null; 850 return null;
853 } 851 }
854 finally 852 finally
@@ -907,7 +905,7 @@ namespace OpenSim.Data.MySQL
907 catch (Exception e) 905 catch (Exception e)
908 { 906 {
909 dbm.Manager.Reconnect(); 907 dbm.Manager.Reconnect();
910 m_log.Error(e.Message, e); 908 m_log.Error(e.ToString());
911 return; 909 return;
912 } 910 }
913 finally 911 finally
diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs
index 08af7c3..b68de1a 100644
--- a/OpenSim/Data/SQLite/SQLiteRegionData.cs
+++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs
@@ -1213,7 +1213,7 @@ namespace OpenSim.Data.SQLite
1213 if (!row.IsNull("ParticleSystem")) 1213 if (!row.IsNull("ParticleSystem"))
1214 prim.ParticleSystem = Convert.FromBase64String(row["ParticleSystem"].ToString()); 1214 prim.ParticleSystem = Convert.FromBase64String(row["ParticleSystem"].ToString());
1215 1215
1216 prim.RotationalVelocity = new Vector3( 1216 prim.AngularVelocity = new Vector3(
1217 Convert.ToSingle(row["OmegaX"]), 1217 Convert.ToSingle(row["OmegaX"]),
1218 Convert.ToSingle(row["OmegaY"]), 1218 Convert.ToSingle(row["OmegaY"]),
1219 Convert.ToSingle(row["OmegaZ"]) 1219 Convert.ToSingle(row["OmegaZ"])
@@ -1530,9 +1530,9 @@ namespace OpenSim.Data.SQLite
1530 row["TextureAnimation"] = Convert.ToBase64String(prim.TextureAnimation); 1530 row["TextureAnimation"] = Convert.ToBase64String(prim.TextureAnimation);
1531 row["ParticleSystem"] = Convert.ToBase64String(prim.ParticleSystem); 1531 row["ParticleSystem"] = Convert.ToBase64String(prim.ParticleSystem);
1532 1532
1533 row["OmegaX"] = prim.RotationalVelocity.X; 1533 row["OmegaX"] = prim.AngularVelocity.X;
1534 row["OmegaY"] = prim.RotationalVelocity.Y; 1534 row["OmegaY"] = prim.AngularVelocity.Y;
1535 row["OmegaZ"] = prim.RotationalVelocity.Z; 1535 row["OmegaZ"] = prim.AngularVelocity.Z;
1536 1536
1537 row["CameraEyeOffsetX"] = prim.GetCameraEyeOffset().X; 1537 row["CameraEyeOffsetX"] = prim.GetCameraEyeOffset().X;
1538 row["CameraEyeOffsetY"] = prim.GetCameraEyeOffset().Y; 1538 row["CameraEyeOffsetY"] = prim.GetCameraEyeOffset().Y;
diff --git a/OpenSim/Framework/ACL.cs b/OpenSim/Framework/ACL.cs
index 3b1c0f0..f76e8b7 100644
--- a/OpenSim/Framework/ACL.cs
+++ b/OpenSim/Framework/ACL.cs
@@ -248,35 +248,5 @@ namespace OpenSim.Framework
248 248
249 #endregion 249 #endregion
250 250
251 #region Tests 251
252
253 /// <summary>
254 /// ACL Test class
255 /// </summary>
256 internal class ACLTester
257 {
258 public ACLTester()
259 {
260 ACL acl = new ACL();
261
262 Role Guests = new Role("Guests");
263 acl.AddRole(Guests);
264
265 Role[] parents = new Role[0];
266 parents[0] = Guests;
267
268 Role JoeGuest = new Role("JoeGuest", parents);
269 acl.AddRole(JoeGuest);
270
271 Resource CanBuild = new Resource("CanBuild");
272 acl.AddResource(CanBuild);
273
274
275 acl.GrantPermission("Guests", "CanBuild");
276
277 acl.HasPermission("JoeGuest", "CanBuild");
278 }
279 }
280
281 #endregion
282} \ No newline at end of file 252} \ No newline at end of file
diff --git a/OpenSim/Framework/Communications/Services/LoginService.cs b/OpenSim/Framework/Communications/Services/LoginService.cs
index 922cd49..b652299 100644
--- a/OpenSim/Framework/Communications/Services/LoginService.cs
+++ b/OpenSim/Framework/Communications/Services/LoginService.cs
@@ -1031,30 +1031,26 @@ namespace OpenSim.Framework.Communications.Services
1031 return true; 1031 return true;
1032 } 1032 }
1033 1033
1034 // StartLocation not available, send him to a nearby region instead 1034 // Get the default region handle
1035 // regionInfo = m_gridService.RequestClosestRegion(""); 1035 ulong defaultHandle = Utils.UIntsToLong(m_defaultHomeX * Constants.RegionSize, m_defaultHomeY * Constants.RegionSize);
1036 //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName);
1037 1036
1038 // Send him to default region instead 1037 // If we haven't already tried the default region, reset regionInfo
1039 ulong defaultHandle = (((ulong)m_defaultHomeX * Constants.RegionSize) << 32) | 1038 if (regionInfo != null && defaultHandle != regionInfo.RegionHandle)
1040 ((ulong)m_defaultHomeY * Constants.RegionSize); 1039 regionInfo = null;
1041 1040
1042 if ((regionInfo != null) && (defaultHandle == regionInfo.RegionHandle)) 1041 if (regionInfo == null)
1043 { 1042 {
1044 m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region"); 1043 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
1045 return false; 1044 regionInfo = GetRegionInfo(defaultHandle);
1046 } 1045 }
1047 1046
1048 m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
1049 regionInfo = GetRegionInfo(defaultHandle);
1050
1051 if (regionInfo == null) 1047 if (regionInfo == null)
1052 { 1048 {
1053 m_log.ErrorFormat("[LOGIN]: No default region available. Aborting."); 1049 m_log.ErrorFormat("[LOGIN]: Sending user to any region");
1054 return false; 1050 regionInfo = RequestClosestRegion(String.Empty);
1055 } 1051 }
1056 1052
1057 theUser.CurrentAgent.Position = new Vector3(128, 128, 0); 1053 theUser.CurrentAgent.Position = new Vector3(128f, 128f, 0f);
1058 response.StartLocation = "safe"; 1054 response.StartLocation = "safe";
1059 1055
1060 return PrepareLoginToRegion(regionInfo, theUser, response, client); 1056 return PrepareLoginToRegion(regionInfo, theUser, response, client);
diff --git a/OpenSim/Framework/Tests/ACLTest.cs b/OpenSim/Framework/Tests/ACLTest.cs
new file mode 100644
index 0000000..d11f307
--- /dev/null
+++ b/OpenSim/Framework/Tests/ACLTest.cs
@@ -0,0 +1,98 @@
1using System;
2using NUnit.Framework;
3using System.Collections.Generic;
4
5
6namespace OpenSim.Framework.Tests
7{
8 [TestFixture]
9 public class ACLTest
10 {
11 #region Tests
12
13 /// <summary>
14 /// ACL Test class
15 /// </summary>
16 [Test]
17 public void ACLTest01()
18 {
19 ACL acl = new ACL();
20
21 Role Guests = new Role("Guests");
22 acl.AddRole(Guests);
23
24 Role[] parents = new Role[1];
25 parents[0] = Guests;
26
27 Role JoeGuest = new Role("JoeGuest", parents);
28 acl.AddRole(JoeGuest);
29
30 Resource CanBuild = new Resource("CanBuild");
31 acl.AddResource(CanBuild);
32
33
34 acl.GrantPermission("Guests", "CanBuild");
35
36 Permission perm = acl.HasPermission("JoeGuest", "CanBuild");
37 Assert.That(perm == Permission.Allow, "JoeGuest should have permission to build");
38 perm = Permission.None;
39 try
40 {
41 perm = acl.HasPermission("unknownGuest", "CanBuild");
42
43 }
44 catch (KeyNotFoundException)
45 {
46
47
48 }
49 catch (Exception)
50 {
51 Assert.That(false,"Exception thrown should have been KeyNotFoundException");
52 }
53 Assert.That(perm == Permission.None,"Permission None should be set because exception should have been thrown");
54
55 }
56
57 [Test]
58 public void KnownButPermissionDenyAndPermissionNoneUserTest()
59 {
60 ACL acl = new ACL();
61
62 Role Guests = new Role("Guests");
63 acl.AddRole(Guests);
64 Role Administrators = new Role("Administrators");
65 acl.AddRole(Administrators);
66 Role[] Guestparents = new Role[1];
67 Role[] Adminparents = new Role[1];
68
69 Guestparents[0] = Guests;
70 Adminparents[0] = Administrators;
71
72 Role JoeGuest = new Role("JoeGuest", Guestparents);
73 acl.AddRole(JoeGuest);
74
75 Resource CanBuild = new Resource("CanBuild");
76 acl.AddResource(CanBuild);
77
78 Resource CanScript = new Resource("CanScript");
79 acl.AddResource(CanScript);
80
81 Resource CanRestart = new Resource("CanRestart");
82 acl.AddResource(CanRestart);
83
84 acl.GrantPermission("Guests", "CanBuild");
85 acl.DenyPermission("Guests", "CanRestart");
86
87 acl.GrantPermission("Administrators", "CanScript");
88
89 acl.GrantPermission("Administrators", "CanRestart");
90 Permission setPermission = acl.HasPermission("JoeGuest", "CanRestart");
91 Assert.That(setPermission == Permission.Deny, "Guests Should not be able to restart");
92 Assert.That(acl.HasPermission("JoeGuest", "CanScript") == Permission.None,
93 "No Explicit Permissions set so should be Permission.None");
94 }
95
96 #endregion
97 }
98}
diff --git a/OpenSim/Framework/Tests/CacheTests.cs b/OpenSim/Framework/Tests/CacheTests.cs
new file mode 100644
index 0000000..8e97232
--- /dev/null
+++ b/OpenSim/Framework/Tests/CacheTests.cs
@@ -0,0 +1,75 @@
1using System;
2using NUnit.Framework;
3using OpenMetaverse;
4
5namespace OpenSim.Framework.Tests
6{
7 [TestFixture]
8 public class CacheTests
9 {
10 private Cache cache;
11 private UUID cacheItemUUID;
12 [SetUp]
13 public void Build()
14 {
15 cache = new Cache();
16 cacheItemUUID = UUID.Random();
17 MemoryCacheItem cachedItem = new MemoryCacheItem(cacheItemUUID.ToString(),DateTime.Now + TimeSpan.FromDays(1));
18 byte[] foo = new byte[1];
19 foo[0] = 255;
20 cachedItem.Store(foo);
21 cache.Store(cacheItemUUID.ToString(), cachedItem);
22 }
23 [Test]
24 public void TestRetreive()
25 {
26 CacheItemBase citem = (CacheItemBase)cache.Get(cacheItemUUID.ToString());
27 byte[] data = (byte[]) citem.Retrieve();
28 Assert.That(data.Length == 1, "Cached Item should have one byte element");
29 Assert.That(data[0] == 255, "Cached Item element should be 255");
30 }
31
32 [Test]
33 public void TestNotInCache()
34 {
35 UUID randomNotIn = UUID.Random();
36 while (randomNotIn == cacheItemUUID)
37 {
38 randomNotIn = UUID.Random();
39 }
40 object citem = cache.Get(randomNotIn.ToString());
41 Assert.That(citem == null, "Item should not be in Cache" );
42 }
43
44 //NOTE: Test Case disabled until Cache is fixed
45 [Test]
46 public void TestTTLExpiredEntry()
47 {
48 UUID ImmediateExpiryUUID = UUID.Random();
49 MemoryCacheItem cachedItem = new MemoryCacheItem(ImmediateExpiryUUID.ToString(), TimeSpan.FromDays(-1));
50 byte[] foo = new byte[1];
51 foo[0] = 1;
52 cachedItem.Store(foo);
53 cache.Store(cacheItemUUID.ToString(), cachedItem);
54
55 object citem = cache.Get(cacheItemUUID.ToString());
56 //Assert.That(citem == null, "Item should not be in Cache because the expiry time was before now");
57 }
58
59 //NOTE: Test Case disabled until Cache is fixed
60 [Test]
61 public void ExpireItemManually()
62 {
63 UUID ImmediateExpiryUUID = UUID.Random();
64 MemoryCacheItem cachedItem = new MemoryCacheItem(ImmediateExpiryUUID.ToString(), TimeSpan.FromDays(1));
65 byte[] foo = new byte[1];
66 foo[0] = 1;
67 cachedItem.Store(foo);
68 cache.Store(cacheItemUUID.ToString(), cachedItem);
69 cache.Invalidate(ImmediateExpiryUUID.ToString());
70 object citem = cache.Get(cacheItemUUID.ToString());
71 //Assert.That(citem == null, "Item should not be in Cache because we manually invalidated it");
72 }
73
74 }
75}
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index b448182..60c34df 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -343,6 +343,10 @@ namespace OpenSim
343 "Add-InventoryHost <host>", 343 "Add-InventoryHost <host>",
344 String.Empty, RunCommand); 344 String.Empty, RunCommand);
345 345
346 m_console.Commands.AddCommand("region", false, "kill uuid",
347 "kill uuid <UUID>",
348 "Kill an object by UUID", KillUUID);
349
346 if (ConfigurationSettings.Standalone) 350 if (ConfigurationSettings.Standalone)
347 { 351 {
348 m_console.Commands.AddCommand("region", false, "create user", 352 m_console.Commands.AddCommand("region", false, "create user",
@@ -1332,6 +1336,58 @@ namespace OpenSim
1332 return result; 1336 return result;
1333 } 1337 }
1334 1338
1339 /// <summary>
1340 /// Kill an object given its UUID.
1341 /// </summary>
1342 /// <param name="cmdparams"></param>
1343 protected void KillUUID(string module, string[] cmdparams)
1344 {
1345 if (cmdparams.Length > 2)
1346 {
1347 UUID id = UUID.Zero;
1348 SceneObjectGroup grp = null;
1349 Scene sc = null;
1350
1351 if (!UUID.TryParse(cmdparams[2], out id))
1352 {
1353 MainConsole.Instance.Output("[KillUUID]: Error bad UUID format!");
1354 return;
1355 }
1356
1357 m_sceneManager.ForEachScene(
1358 delegate(Scene scene)
1359 {
1360 SceneObjectPart part = scene.GetSceneObjectPart(id);
1361 if (part == null)
1362 return;
1363
1364 grp = part.ParentGroup;
1365 sc = scene;
1366 });
1367
1368 if (grp == null)
1369 {
1370 MainConsole.Instance.Output(String.Format("[KillUUID]: Given UUID {0} not found!", id));
1371 }
1372 else
1373 {
1374 MainConsole.Instance.Output(String.Format("[KillUUID]: Found UUID {0} in scene {1}", id, sc.RegionInfo.RegionName));
1375 try
1376 {
1377 sc.DeleteSceneObject(grp, false);
1378 }
1379 catch (Exception e)
1380 {
1381 m_log.ErrorFormat("[KillUUID]: Error while removing objects from scene: " + e);
1382 }
1383 }
1384 }
1385 else
1386 {
1387 MainConsole.Instance.Output("[KillUUID]: Usage: kill uuid <UUID>");
1388 }
1389 }
1390
1335 #endregion 1391 #endregion
1336 } 1392 }
1337} 1393}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index f6a7a0c..db0c3b8 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -37,6 +37,7 @@ using System.Xml;
37using log4net; 37using log4net;
38using OpenMetaverse; 38using OpenMetaverse;
39using OpenMetaverse.Packets; 39using OpenMetaverse.Packets;
40using OpenMetaverse.StructuredData;
40using OpenSim.Framework; 41using OpenSim.Framework;
41using OpenSim.Framework.Client; 42using OpenSim.Framework.Client;
42using OpenSim.Framework.Communications.Cache; 43using OpenSim.Framework.Communications.Cache;
@@ -314,14 +315,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
314 private readonly LLUDPClient m_udpClient; 315 private readonly LLUDPClient m_udpClient;
315 private readonly UUID m_sessionId; 316 private readonly UUID m_sessionId;
316 private readonly UUID m_secureSessionId; 317 private readonly UUID m_secureSessionId;
317 private readonly UUID m_agentId; 318 protected readonly UUID m_agentId;
318 private readonly uint m_circuitCode; 319 private readonly uint m_circuitCode;
319 private readonly byte[] m_channelVersion = Utils.EmptyBytes; 320 private readonly byte[] m_channelVersion = Utils.EmptyBytes;
320 private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>(); 321 private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>();
321 private readonly IGroupsModule m_GroupsModule; 322 private readonly IGroupsModule m_GroupsModule;
322 323
323 private int m_cachedTextureSerial; 324 private int m_cachedTextureSerial;
324 private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates; 325 protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates;
325 private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates; 326 private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates;
326 private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates; 327 private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates;
327 private int m_moneyBalance; 328 private int m_moneyBalance;
@@ -1856,7 +1857,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1856 economyData.Info.TeleportMinPrice = TeleportMinPrice; 1857 economyData.Info.TeleportMinPrice = TeleportMinPrice;
1857 economyData.Info.TeleportPriceExponent = TeleportPriceExponent; 1858 economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
1858 economyData.Header.Reliable = true; 1859 economyData.Header.Reliable = true;
1859 OutPacket(economyData, ThrottleOutPacketType.Unknown); 1860 OutPacket(economyData, ThrottleOutPacketType.Task);
1860 } 1861 }
1861 1862
1862 public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data) 1863 public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
@@ -2786,30 +2787,37 @@ namespace OpenSim.Region.ClientStack.LindenUDP
2786 2787
2787 public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data) 2788 public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
2788 { 2789 {
2789 AvatarGroupsReplyPacket p = (AvatarGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarGroupsReply); 2790 OSDMap llsd = new OSDMap(3);
2790 2791 OSDArray AgentData = new OSDArray(1);
2791 p.AgentData = new AvatarGroupsReplyPacket.AgentDataBlock(); 2792 OSDMap AgentDataMap = new OSDMap(1);
2792 p.AgentData.AgentID = AgentId; 2793 AgentDataMap.Add("AgentID", OSD.FromUUID(this.AgentId));
2793 p.AgentData.AvatarID = avatarID; 2794 AgentDataMap.Add("AvatarID", OSD.FromUUID(avatarID));
2794 2795 AgentData.Add(AgentDataMap);
2795 p.GroupData = new AvatarGroupsReplyPacket.GroupDataBlock[data.Length]; 2796 llsd.Add("AgentData", AgentData);
2796 int i = 0; 2797 OSDArray GroupData = new OSDArray(data.Length);
2797 foreach (GroupMembershipData m in data) 2798 OSDArray NewGroupData = new OSDArray(data.Length);
2798 { 2799 foreach (GroupMembershipData m in data)
2799 p.GroupData[i] = new AvatarGroupsReplyPacket.GroupDataBlock(); 2800 {
2800 p.GroupData[i].GroupPowers = m.GroupPowers; 2801 OSDMap GroupDataMap = new OSDMap(6);
2801 p.GroupData[i].AcceptNotices = m.AcceptNotices; 2802 OSDMap NewGroupDataMap = new OSDMap(1);
2802 p.GroupData[i].GroupTitle = Utils.StringToBytes(m.GroupTitle); 2803 GroupDataMap.Add("GroupPowers", OSD.FromBinary(m.GroupPowers));
2803 p.GroupData[i].GroupID = m.GroupID; 2804 GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(m.AcceptNotices));
2804 p.GroupData[i].GroupName = Utils.StringToBytes(m.GroupName); 2805 GroupDataMap.Add("GroupTitle", OSD.FromString(m.GroupTitle));
2805 p.GroupData[i].GroupInsigniaID = m.GroupPicture; 2806 GroupDataMap.Add("GroupID", OSD.FromUUID(m.GroupID));
2806 i++; 2807 GroupDataMap.Add("GroupName", OSD.FromString(m.GroupName));
2807 } 2808 GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(m.GroupPicture));
2808 2809 NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(m.ListInProfile));
2809 p.NewGroupData = new AvatarGroupsReplyPacket.NewGroupDataBlock(); 2810 GroupData.Add(GroupDataMap);
2810 p.NewGroupData.ListInProfile = true; 2811 NewGroupData.Add(NewGroupDataMap);
2811 2812 }
2812 OutPacket(p, ThrottleOutPacketType.Task); 2813 llsd.Add("GroupData", GroupData);
2814 llsd.Add("NewGroupData", NewGroupData);
2815
2816 IEventQueue eq = this.Scene.RequestModuleInterface<IEventQueue>();
2817 if (eq != null)
2818 {
2819 eq.Enqueue(BuildEvent("AvatarGroupsReply", llsd), this.AgentId);
2820 }
2813 } 2821 }
2814 2822
2815 public void SendJoinGroupReply(UUID groupID, bool success) 2823 public void SendJoinGroupReply(UUID groupID, bool success)
@@ -3168,107 +3176,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3168 3176
3169 #endregion 3177 #endregion
3170 3178
3171 #region Prim/Avatar Updates
3172
3173 /*void SendObjectUpdate(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
3174 {
3175 bool canUseCompressed, canUseImproved;
3176 UpdateFlagsToPacketType(creatorFlags, updateFlags, out canUseCompressed, out canUseImproved);
3177
3178 if (!canUseImproved && !canUseCompressed)
3179 SendFullObjectUpdate(obj, creatorFlags, updateFlags);
3180 else if (!canUseImproved)
3181 SendObjectUpdateCompressed(obj, creatorFlags, updateFlags);
3182 else
3183 SendImprovedTerseObjectUpdate(obj, creatorFlags, updateFlags);
3184 }
3185
3186 void SendFullObjectUpdate(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
3187 {
3188 IClientAPI owner;
3189 if (m_scene.ClientManager.TryGetValue(obj.OwnerID, out owner) && owner is LLClientView)
3190 {
3191 LLClientView llOwner = (LLClientView)owner;
3192
3193 // Send an update out to the owner
3194 ObjectUpdatePacket updateToOwner = new ObjectUpdatePacket();
3195 updateToOwner.RegionData.RegionHandle = obj.RegionHandle;
3196 //updateToOwner.RegionData.TimeDilation = (ushort)(timeDilation * (float)UInt16.MaxValue);
3197 updateToOwner.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
3198 updateToOwner.ObjectData[0] = BuildUpdateBlock(obj, obj.Flags | creatorFlags | PrimFlags.ObjectYouOwner, 0);
3199
3200 m_udpServer.SendPacket(llOwner.UDPClient, updateToOwner, ThrottleOutPacketType.State, true);
3201 }
3202
3203 // Send an update out to everyone else
3204 ObjectUpdatePacket updateToOthers = new ObjectUpdatePacket();
3205 updateToOthers.RegionData.RegionHandle = obj.RegionHandle;
3206 //updateToOthers.RegionData.TimeDilation = (ushort)(timeDilation * (float)UInt16.MaxValue);
3207 updateToOthers.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
3208 updateToOthers.ObjectData[0] = BuildUpdateBlock(obj, obj.Flags, 0);
3209
3210 m_scene.ClientManager.ForEach(
3211 delegate(IClientAPI client)
3212 {
3213 if (client.AgentId != obj.OwnerID && client is LLClientView)
3214 {
3215 LLClientView llClient = (LLClientView)client;
3216 m_udpServer.SendPacket(llClient.UDPClient, updateToOthers, ThrottleOutPacketType.State, true);
3217 }
3218 }
3219 );
3220 }
3221
3222 void SendObjectUpdateCompressed(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
3223 {
3224 }
3225
3226 void SendImprovedTerseObjectUpdate(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
3227 {
3228 }
3229
3230 void UpdateFlagsToPacketType(PrimFlags creatorFlags, PrimUpdateFlags updateFlags, out bool canUseCompressed, out bool canUseImproved)
3231 {
3232 canUseCompressed = true;
3233 canUseImproved = true;
3234
3235 if ((updateFlags & PrimUpdateFlags.FullUpdate) == PrimUpdateFlags.FullUpdate || creatorFlags != PrimFlags.None)
3236 {
3237 canUseCompressed = false;
3238 canUseImproved = false;
3239 }
3240 else
3241 {
3242 if ((updateFlags & PrimUpdateFlags.Velocity) != 0 ||
3243 (updateFlags & PrimUpdateFlags.Acceleration) != 0 ||
3244 (updateFlags & PrimUpdateFlags.CollisionPlane) != 0 ||
3245 (updateFlags & PrimUpdateFlags.Joint) != 0)
3246 {
3247 canUseCompressed = false;
3248 }
3249
3250 if ((updateFlags & PrimUpdateFlags.PrimFlags) != 0 ||
3251 (updateFlags & PrimUpdateFlags.ParentID) != 0 ||
3252 (updateFlags & PrimUpdateFlags.Scale) != 0 ||
3253 (updateFlags & PrimUpdateFlags.PrimData) != 0 ||
3254 (updateFlags & PrimUpdateFlags.Text) != 0 ||
3255 (updateFlags & PrimUpdateFlags.NameValue) != 0 ||
3256 (updateFlags & PrimUpdateFlags.ExtraData) != 0 ||
3257 (updateFlags & PrimUpdateFlags.TextureAnim) != 0 ||
3258 (updateFlags & PrimUpdateFlags.Sound) != 0 ||
3259 (updateFlags & PrimUpdateFlags.Particles) != 0 ||
3260 (updateFlags & PrimUpdateFlags.Material) != 0 ||
3261 (updateFlags & PrimUpdateFlags.ClickAction) != 0 ||
3262 (updateFlags & PrimUpdateFlags.MediaURL) != 0 ||
3263 (updateFlags & PrimUpdateFlags.Joint) != 0)
3264 {
3265 canUseImproved = false;
3266 }
3267 }
3268 }*/
3269
3270 #endregion Prim/Avatar Updates
3271
3272 #region Avatar Packet/Data Sending Methods 3179 #region Avatar Packet/Data Sending Methods
3273 3180
3274 /// <summary> 3181 /// <summary>
@@ -3314,7 +3221,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3314 ProcessAvatarTerseUpdates(); 3221 ProcessAvatarTerseUpdates();
3315 } 3222 }
3316 3223
3317 private void ProcessAvatarTerseUpdates() 3224 protected void ProcessAvatarTerseUpdates()
3318 { 3225 {
3319 ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate); 3226 ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
3320 terse.Header.Reliable = false; 3227 terse.Header.Reliable = false;
@@ -3335,6 +3242,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3335 terse.ObjectData[i] = m_avatarTerseUpdates.Dequeue(); 3242 terse.ObjectData[i] = m_avatarTerseUpdates.Dequeue();
3336 } 3243 }
3337 3244
3245 // HACK: Using the task category until the tiered reprioritization code is in
3338 OutPacket(terse, ThrottleOutPacketType.Task); 3246 OutPacket(terse, ThrottleOutPacketType.Task);
3339 } 3247 }
3340 3248
@@ -4430,11 +4338,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4430 /// </summary> 4338 /// </summary>
4431 protected virtual void RegisterLocalPacketHandlers() 4339 protected virtual void RegisterLocalPacketHandlers()
4432 { 4340 {
4433 AddLocalPacketHandler(PacketType.LogoutRequest, Logout); 4341 AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout);
4434 AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate); 4342 AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate);
4435 AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect); 4343 AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect);
4436 AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached); 4344 AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached);
4437 AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate); 4345 AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate);
4438 AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest); 4346 AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest);
4439 AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest); 4347 AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest);
4440 AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest); 4348 AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
@@ -4703,7 +4611,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4703 /// <param name="client"></param> 4611 /// <param name="client"></param>
4704 /// <param name="packet"></param> 4612 /// <param name="packet"></param>
4705 /// <returns></returns> 4613 /// <returns></returns>
4706 protected virtual bool Logout(IClientAPI client, Packet packet) 4614 protected virtual bool HandleLogout(IClientAPI client, Packet packet)
4707 { 4615 {
4708 if (packet.Type == PacketType.LogoutRequest) 4616 if (packet.Type == PacketType.LogoutRequest)
4709 { 4617 {
@@ -4741,7 +4649,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4741 /// <param name="simclient"></param> 4649 /// <param name="simclient"></param>
4742 /// <param name="packet"></param> 4650 /// <param name="packet"></param>
4743 /// <returns></returns> 4651 /// <returns></returns>
4744 protected bool AgentTextureCached(IClientAPI simclient, Packet packet) 4652 protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
4745 { 4653 {
4746 //m_log.Debug("texture cached: " + packet.ToString()); 4654 //m_log.Debug("texture cached: " + packet.ToString());
4747 AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet; 4655 AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
@@ -4771,7 +4679,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4771 return true; 4679 return true;
4772 } 4680 }
4773 4681
4774 protected bool MultipleObjUpdate(IClientAPI simClient, Packet packet) 4682 protected bool HandleMultipleObjUpdate(IClientAPI simClient, Packet packet)
4775 { 4683 {
4776 MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet; 4684 MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
4777 if (multipleupdate.AgentData.SessionID != SessionId) return false; 4685 if (multipleupdate.AgentData.SessionID != SessionId) return false;
@@ -5050,7 +4958,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
5050 /// </summary> 4958 /// </summary>
5051 /// <param name="packet">Packet to send</param> 4959 /// <param name="packet">Packet to send</param>
5052 /// <param name="throttlePacketType">Throttling category for the packet</param> 4960 /// <param name="throttlePacketType">Throttling category for the packet</param>
5053 private void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType) 4961 protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
5054 { 4962 {
5055 m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true); 4963 m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true);
5056 } 4964 }
@@ -9944,7 +9852,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9944 commandMessagePacket.CommandBlock.Command = (uint)command; 9852 commandMessagePacket.CommandBlock.Command = (uint)command;
9945 commandMessagePacket.CommandBlock.Time = time; 9853 commandMessagePacket.CommandBlock.Time = time;
9946 9854
9947 OutPacket(commandMessagePacket, ThrottleOutPacketType.Unknown); 9855 OutPacket(commandMessagePacket, ThrottleOutPacketType.Task);
9948 } 9856 }
9949 9857
9950 public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID, 9858 public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID,
@@ -9962,7 +9870,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
9962 updatePacket.DataBlockExtended.MediaHeight = mediaHeight; 9870 updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
9963 updatePacket.DataBlockExtended.MediaLoop = mediaLoop; 9871 updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
9964 9872
9965 OutPacket(updatePacket, ThrottleOutPacketType.Unknown); 9873 OutPacket(updatePacket, ThrottleOutPacketType.Task);
9966 } 9874 }
9967 9875
9968 #endregion 9876 #endregion
@@ -10236,7 +10144,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10236 } 10144 }
10237 10145
10238 #region PriorityQueue 10146 #region PriorityQueue
10239 private class PriorityQueue<TPriority, TValue> 10147 public class PriorityQueue<TPriority, TValue>
10240 { 10148 {
10241 internal delegate bool UpdatePriorityHandler(ref TPriority priority, uint local_id); 10149 internal delegate bool UpdatePriorityHandler(ref TPriority priority, uint local_id);
10242 10150
@@ -10264,7 +10172,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10264 this.m_comparison = comparison; 10172 this.m_comparison = comparison;
10265 } 10173 }
10266 10174
10267 internal object SyncRoot { get { return this.m_syncRoot; } } 10175 public object SyncRoot { get { return this.m_syncRoot; } }
10268 internal int Count 10176 internal int Count
10269 { 10177 {
10270 get 10178 get
@@ -10276,7 +10184,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10276 } 10184 }
10277 } 10185 }
10278 10186
10279 internal bool Enqueue(TPriority priority, TValue value, uint local_id) 10187 public bool Enqueue(TPriority priority, TValue value, uint local_id)
10280 { 10188 {
10281 LookupItem item; 10189 LookupItem item;
10282 10190
@@ -10396,5 +10304,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
10396 } 10304 }
10397 #endregion 10305 #endregion
10398 10306
10307 public static OSD BuildEvent(string eventName, OSD eventBody)
10308 {
10309 OSDMap osdEvent = new OSDMap(2);
10310 osdEvent.Add("message", new OSDString(eventName));
10311 osdEvent.Add("body", eventBody);
10312
10313 return osdEvent;
10314 }
10399 } 10315 }
10400} 10316}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 84a4959..9856a1c 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -135,8 +135,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
135 private readonly TokenBucket m_throttle; 135 private readonly TokenBucket m_throttle;
136 /// <summary>Throttle buckets for each packet category</summary> 136 /// <summary>Throttle buckets for each packet category</summary>
137 private readonly TokenBucket[] m_throttleCategories; 137 private readonly TokenBucket[] m_throttleCategories;
138 /// <summary>Throttle rate defaults and limits</summary>
139 private readonly ThrottleRates m_defaultThrottleRates;
140 /// <summary>Outgoing queues for throttled packets</summary> 138 /// <summary>Outgoing queues for throttled packets</summary>
141 private readonly OpenSim.Framework.LocklessQueue<OutgoingPacket>[] m_packetOutboxes = new OpenSim.Framework.LocklessQueue<OutgoingPacket>[THROTTLE_CATEGORY_COUNT]; 139 private readonly OpenSim.Framework.LocklessQueue<OutgoingPacket>[] m_packetOutboxes = new OpenSim.Framework.LocklessQueue<OutgoingPacket>[THROTTLE_CATEGORY_COUNT];
142 /// <summary>A container that can hold one packet for each outbox, used to store 140 /// <summary>A container that can hold one packet for each outbox, used to store
@@ -145,6 +143,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
145 /// <summary>A reference to the LLUDPServer that is managing this client</summary> 143 /// <summary>A reference to the LLUDPServer that is managing this client</summary>
146 private readonly LLUDPServer m_udpServer; 144 private readonly LLUDPServer m_udpServer;
147 145
146 private int m_defaultRTO = 3000;
147 private int m_maxRTO = 60000;
148
148 /// <summary> 149 /// <summary>
149 /// Default constructor 150 /// Default constructor
150 /// </summary> 151 /// </summary>
@@ -155,13 +156,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
155 /// <param name="circuitCode">Circuit code for this connection</param> 156 /// <param name="circuitCode">Circuit code for this connection</param>
156 /// <param name="agentID">AgentID for the connected agent</param> 157 /// <param name="agentID">AgentID for the connected agent</param>
157 /// <param name="remoteEndPoint">Remote endpoint for this connection</param> 158 /// <param name="remoteEndPoint">Remote endpoint for this connection</param>
158 public LLUDPClient(LLUDPServer server, ThrottleRates rates, TokenBucket parentThrottle, uint circuitCode, UUID agentID, IPEndPoint remoteEndPoint) 159 public LLUDPClient(LLUDPServer server, ThrottleRates rates, TokenBucket parentThrottle, uint circuitCode, UUID agentID, IPEndPoint remoteEndPoint, int defaultRTO, int maxRTO)
159 { 160 {
160 AgentID = agentID; 161 AgentID = agentID;
161 RemoteEndPoint = remoteEndPoint; 162 RemoteEndPoint = remoteEndPoint;
162 CircuitCode = circuitCode; 163 CircuitCode = circuitCode;
163 m_udpServer = server; 164 m_udpServer = server;
164 m_defaultThrottleRates = rates; 165 if (defaultRTO != 0)
166 m_defaultRTO = defaultRTO;
167 if (maxRTO != 0)
168 m_maxRTO = maxRTO;
169
165 // Create a token bucket throttle for this client that has the scene token bucket as a parent 170 // Create a token bucket throttle for this client that has the scene token bucket as a parent
166 m_throttle = new TokenBucket(parentThrottle, rates.TotalLimit, rates.Total); 171 m_throttle = new TokenBucket(parentThrottle, rates.TotalLimit, rates.Total);
167 // Create an array of token buckets for this clients different throttle categories 172 // Create an array of token buckets for this clients different throttle categories
@@ -178,7 +183,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
178 } 183 }
179 184
180 // Default the retransmission timeout to three seconds 185 // Default the retransmission timeout to three seconds
181 RTO = 3000; 186 RTO = m_defaultRTO;
182 187
183 // Initialize this to a sane value to prevent early disconnects 188 // Initialize this to a sane value to prevent early disconnects
184 TickLastPacketReceived = Environment.TickCount & Int32.MaxValue; 189 TickLastPacketReceived = Environment.TickCount & Int32.MaxValue;
@@ -500,7 +505,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
500 int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); 505 int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR));
501 506
502 // Clamp the retransmission timeout to manageable values 507 // Clamp the retransmission timeout to manageable values
503 rto = Utils.Clamp(RTO, 3000, 60000); 508 rto = Utils.Clamp(RTO, m_defaultRTO, m_maxRTO);
504 509
505 RTO = rto; 510 RTO = rto;
506 511
@@ -520,7 +525,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
520 RTTVAR = 0.0f; 525 RTTVAR = 0.0f;
521 526
522 // Double the retransmission timeout 527 // Double the retransmission timeout
523 RTO = Math.Min(RTO * 2, 60000); 528 RTO = Math.Min(RTO * 2, m_maxRTO);
524 } 529 }
525 530
526 /// <summary> 531 /// <summary>
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 74d3262..93946ae 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -118,13 +118,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
118 /// <summary></summary> 118 /// <summary></summary>
119 //private UDPClientCollection m_clients = new UDPClientCollection(); 119 //private UDPClientCollection m_clients = new UDPClientCollection();
120 /// <summary>Bandwidth throttle for this UDP server</summary> 120 /// <summary>Bandwidth throttle for this UDP server</summary>
121 private TokenBucket m_throttle; 121 protected TokenBucket m_throttle;
122 /// <summary>Bandwidth throttle rates for this UDP server</summary> 122 /// <summary>Bandwidth throttle rates for this UDP server</summary>
123 private ThrottleRates m_throttleRates; 123 protected ThrottleRates m_throttleRates;
124 /// <summary>Manages authentication for agent circuits</summary> 124 /// <summary>Manages authentication for agent circuits</summary>
125 private AgentCircuitManager m_circuitManager; 125 private AgentCircuitManager m_circuitManager;
126 /// <summary>Reference to the scene this UDP server is attached to</summary> 126 /// <summary>Reference to the scene this UDP server is attached to</summary>
127 private Scene m_scene; 127 protected Scene m_scene;
128 /// <summary>The X/Y coordinates of the scene this UDP server is attached to</summary> 128 /// <summary>The X/Y coordinates of the scene this UDP server is attached to</summary>
129 private Location m_location; 129 private Location m_location;
130 /// <summary>The size of the receive buffer for the UDP socket. This value 130 /// <summary>The size of the receive buffer for the UDP socket. This value
@@ -153,6 +153,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
153 /// <summary>Flag to signal when clients should send pings</summary> 153 /// <summary>Flag to signal when clients should send pings</summary>
154 private bool m_sendPing; 154 private bool m_sendPing;
155 155
156 private int m_defaultRTO = 0;
157 private int m_maxRTO = 0;
158
156 public Socket Server { get { return null; } } 159 public Socket Server { get { return null; } }
157 160
158 public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager) 161 public LLUDPServer(IPAddress listenIP, ref uint port, int proxyPortOffsetParm, bool allow_alternate_port, IConfigSource configSource, AgentCircuitManager circuitManager)
@@ -189,6 +192,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
189 AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10); 192 AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10);
190 PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100); 193 PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100);
191 TextureSendLimit = config.GetInt("TextureSendLimit", 20); 194 TextureSendLimit = config.GetInt("TextureSendLimit", 20);
195
196 m_defaultRTO = config.GetInt("DefaultRTO", 0);
197 m_maxRTO = config.GetInt("MaxRTO", 0);
192 } 198 }
193 else 199 else
194 { 200 {
@@ -247,8 +253,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
247 253
248 public void BroadcastPacket(Packet packet, ThrottleOutPacketType category, bool sendToPausedAgents, bool allowSplitting) 254 public void BroadcastPacket(Packet packet, ThrottleOutPacketType category, bool sendToPausedAgents, bool allowSplitting)
249 { 255 {
250 // CoarseLocationUpdate packets cannot be split in an automated way 256 // CoarseLocationUpdate and AvatarGroupsReply packets cannot be split in an automated way
251 if (packet.Type == PacketType.CoarseLocationUpdate && allowSplitting) 257 if ((packet.Type == PacketType.CoarseLocationUpdate || packet.Type == PacketType.AvatarGroupsReply) && allowSplitting)
252 allowSplitting = false; 258 allowSplitting = false;
253 259
254 if (allowSplitting && packet.HasVariableBlocks) 260 if (allowSplitting && packet.HasVariableBlocks)
@@ -256,8 +262,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
256 byte[][] datas = packet.ToBytesMultiple(); 262 byte[][] datas = packet.ToBytesMultiple();
257 int packetCount = datas.Length; 263 int packetCount = datas.Length;
258 264
259 //if (packetCount > 1) 265 if (packetCount < 1)
260 // m_log.Debug("[LLUDPSERVER]: Split " + packet.Type + " packet into " + packetCount + " packets"); 266 m_log.Error("[LLUDPSERVER]: Failed to split " + packet.Type + " with estimated length " + packet.Length);
261 267
262 for (int i = 0; i < packetCount; i++) 268 for (int i = 0; i < packetCount; i++)
263 { 269 {
@@ -295,8 +301,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
295 byte[][] datas = packet.ToBytesMultiple(); 301 byte[][] datas = packet.ToBytesMultiple();
296 int packetCount = datas.Length; 302 int packetCount = datas.Length;
297 303
298 //if (packetCount > 1) 304 if (packetCount < 1)
299 // m_log.Debug("[LLUDPSERVER]: Split " + packet.Type + " packet into " + packetCount + " packets"); 305 m_log.Error("[LLUDPSERVER]: Failed to split " + packet.Type + " with estimated length " + packet.Length);
300 306
301 for (int i = 0; i < packetCount; i++) 307 for (int i = 0; i < packetCount; i++)
302 { 308 {
@@ -409,6 +415,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
409 SendPacket(udpClient, pc, ThrottleOutPacketType.Unknown, false); 415 SendPacket(udpClient, pc, ThrottleOutPacketType.Unknown, false);
410 } 416 }
411 417
418 public void CompletePing(LLUDPClient udpClient, byte pingID)
419 {
420 CompletePingCheckPacket completePing = new CompletePingCheckPacket();
421 completePing.PingID.PingID = pingID;
422 SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false);
423 }
424
412 public void ResendUnacked(LLUDPClient udpClient) 425 public void ResendUnacked(LLUDPClient udpClient)
413 { 426 {
414 if (!udpClient.IsConnected) 427 if (!udpClient.IsConnected)
@@ -429,7 +442,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
429 442
430 if (expiredPackets != null) 443 if (expiredPackets != null)
431 { 444 {
432 m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); 445 //m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
433 446
434 // Exponential backoff of the retransmission timeout 447 // Exponential backoff of the retransmission timeout
435 udpClient.BackoffRTO(); 448 udpClient.BackoffRTO();
@@ -585,7 +598,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
585 IClientAPI client; 598 IClientAPI client;
586 if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView)) 599 if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView))
587 { 600 {
588 m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); 601 //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
589 return; 602 return;
590 } 603 }
591 604
@@ -669,10 +682,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
669 { 682 {
670 // We don't need to do anything else with ping checks 683 // We don't need to do anything else with ping checks
671 StartPingCheckPacket startPing = (StartPingCheckPacket)packet; 684 StartPingCheckPacket startPing = (StartPingCheckPacket)packet;
672 685 CompletePing(udpClient, startPing.PingID.PingID);
673 CompletePingCheckPacket completePing = new CompletePingCheckPacket();
674 completePing.PingID.PingID = startPing.PingID.PingID;
675 SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false);
676 return; 686 return;
677 } 687 }
678 else if (packet.Type == PacketType.CompletePingCheck) 688 else if (packet.Type == PacketType.CompletePingCheck)
@@ -759,10 +769,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
759 } 769 }
760 } 770 }
761 771
762 private void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo) 772 protected virtual void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
763 { 773 {
764 // Create the LLUDPClient 774 // Create the LLUDPClient
765 LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint); 775 LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
766 IClientAPI existingClient; 776 IClientAPI existingClient;
767 777
768 if (!m_scene.TryGetClient(agentID, out existingClient)) 778 if (!m_scene.TryGetClient(agentID, out existingClient))
@@ -976,7 +986,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
976 } 986 }
977 } 987 }
978 988
979 private void LogoutHandler(IClientAPI client) 989 protected void LogoutHandler(IClientAPI client)
980 { 990 {
981 client.SendLogoutPacket(); 991 client.SendLogoutPacket();
982 if (client.IsActive) 992 if (client.IsActive)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
index 008d827..aaf6e26 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
@@ -87,15 +87,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
87 IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"]; 87 IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"];
88 88
89 Resend = throttleConfig.GetInt("resend_default", 12500); 89 Resend = throttleConfig.GetInt("resend_default", 12500);
90 Land = throttleConfig.GetInt("land_default", 500); 90 Land = throttleConfig.GetInt("land_default", 1000);
91 Wind = throttleConfig.GetInt("wind_default", 500); 91 Wind = throttleConfig.GetInt("wind_default", 1000);
92 Cloud = throttleConfig.GetInt("cloud_default", 500); 92 Cloud = throttleConfig.GetInt("cloud_default", 1000);
93 Task = throttleConfig.GetInt("task_default", 500); 93 Task = throttleConfig.GetInt("task_default", 1000);
94 Texture = throttleConfig.GetInt("texture_default", 500); 94 Texture = throttleConfig.GetInt("texture_default", 1000);
95 Asset = throttleConfig.GetInt("asset_default", 500); 95 Asset = throttleConfig.GetInt("asset_default", 1000);
96 State = throttleConfig.GetInt("state_default", 500); 96 State = throttleConfig.GetInt("state_default", 1000);
97
98 Total = throttleConfig.GetInt("client_throttle_max_bps", 0);
99 97
100 ResendLimit = throttleConfig.GetInt("resend_limit", 18750); 98 ResendLimit = throttleConfig.GetInt("resend_limit", 18750);
101 LandLimit = throttleConfig.GetInt("land_limit", 29750); 99 LandLimit = throttleConfig.GetInt("land_limit", 29750);
@@ -104,9 +102,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
104 TaskLimit = throttleConfig.GetInt("task_limit", 18750); 102 TaskLimit = throttleConfig.GetInt("task_limit", 18750);
105 TextureLimit = throttleConfig.GetInt("texture_limit", 55750); 103 TextureLimit = throttleConfig.GetInt("texture_limit", 55750);
106 AssetLimit = throttleConfig.GetInt("asset_limit", 27500); 104 AssetLimit = throttleConfig.GetInt("asset_limit", 27500);
107 State = throttleConfig.GetInt("state_limit", 37000); 105 StateLimit = throttleConfig.GetInt("state_limit", 37000);
108 106
109 TotalLimit = throttleConfig.GetInt("client_throttle_max_bps", 0); 107 Total = throttleConfig.GetInt("client_throttle_max_bps", 0);
108 TotalLimit = Total;
110 } 109 }
111 catch (Exception) { } 110 catch (Exception) { }
112 } 111 }
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Alerts/DeadlockAlert.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Alerts/DeadlockAlert.cs
new file mode 100644
index 0000000..b546ccb
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Alerts/DeadlockAlert.cs
@@ -0,0 +1,37 @@
1using OpenSim.Region.CoreModules.Framework.Monitoring.Monitors;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Alerts
4{
5 class DeadlockAlert : IAlert
6 {
7 private LastFrameTimeMonitor m_monitor;
8
9 public DeadlockAlert(LastFrameTimeMonitor m_monitor)
10 {
11 this.m_monitor = m_monitor;
12 }
13
14 #region Implementation of IAlert
15
16 public string GetName()
17 {
18 return "Potential Deadlock Alert";
19 }
20
21 public void Test()
22 {
23 if (m_monitor.GetValue() > 60 * 1000)
24 {
25 if(OnTriggerAlert != null)
26 {
27 OnTriggerAlert(typeof (DeadlockAlert),
28 (int) (m_monitor.GetValue()/1000) + " second(s) since last frame processed.", true);
29 }
30 }
31 }
32
33 public event Alert OnTriggerAlert;
34
35 #endregion
36 }
37}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs
new file mode 100644
index 0000000..b533df9
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs
@@ -0,0 +1,13 @@
1using System;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring
4{
5 internal delegate void Alert(Type reporter, string reason, bool fatal);
6
7 interface IAlert
8 {
9 string GetName();
10 void Test();
11 event Alert OnTriggerAlert;
12 }
13}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs
new file mode 100644
index 0000000..a51dccd
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs
@@ -0,0 +1,9 @@
1namespace OpenSim.Region.CoreModules.Framework.Monitoring
2{
3 interface IMonitor
4 {
5 double GetValue();
6 string GetName();
7 string GetFriendlyValue(); // Convert to readable numbers
8 }
9}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs
new file mode 100644
index 0000000..769af8d
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs
@@ -0,0 +1,93 @@
1using System.Collections.Generic;
2using System.Reflection;
3using log4net;
4using Nini.Config;
5using OpenSim.Region.CoreModules.Framework.Monitoring.Alerts;
6using OpenSim.Region.CoreModules.Framework.Monitoring.Monitors;
7using OpenSim.Region.Framework.Interfaces;
8using OpenSim.Region.Framework.Scenes;
9
10namespace OpenSim.Region.CoreModules.Framework.Monitoring
11{
12 public class MonitorModule : IRegionModule
13 {
14 private Scene m_scene;
15 private readonly List<IMonitor> m_monitors = new List<IMonitor>();
16 private readonly List<IAlert> m_alerts = new List<IAlert>();
17 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
18
19 public void DebugMonitors(string module, string[] args)
20 {
21 foreach (IMonitor monitor in m_monitors)
22 {
23 m_log.Info("[MonitorModule] " + m_scene.RegionInfo.RegionName + " reports " + monitor.GetName() + " = " + monitor.GetFriendlyValue());
24 }
25 }
26
27 public void TestAlerts()
28 {
29 foreach (IAlert alert in m_alerts)
30 {
31 alert.Test();
32 }
33 }
34
35 #region Implementation of IRegionModule
36
37 public void Initialise(Scene scene, IConfigSource source)
38 {
39 m_scene = scene;
40
41
42 m_scene.AddCommand(this, "monitor report",
43 "monitor report",
44 "Returns a variety of statistics about the current region and/or simulator",
45 DebugMonitors);
46 }
47
48 public void PostInitialise()
49 {
50 m_monitors.Add(new AgentCountMonitor(m_scene));
51 m_monitors.Add(new ChildAgentCountMonitor(m_scene));
52 m_monitors.Add(new GCMemoryMonitor());
53 m_monitors.Add(new ObjectCountMonitor(m_scene));
54 m_monitors.Add(new PhysicsFrameMonitor(m_scene));
55 m_monitors.Add(new PhysicsUpdateFrameMonitor(m_scene));
56 m_monitors.Add(new PWSMemoryMonitor());
57 m_monitors.Add(new ThreadCountMonitor());
58 m_monitors.Add(new TotalFrameMonitor(m_scene));
59 m_monitors.Add(new EventFrameMonitor(m_scene));
60 m_monitors.Add(new LandFrameMonitor(m_scene));
61 m_monitors.Add(new LastFrameTimeMonitor(m_scene));
62
63 m_alerts.Add(new DeadlockAlert(m_monitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor));
64
65 foreach (IAlert alert in m_alerts)
66 {
67 alert.OnTriggerAlert += OnTriggerAlert;
68 }
69 }
70
71 void OnTriggerAlert(System.Type reporter, string reason, bool fatal)
72 {
73 m_log.Error("[Monitor] " + reporter.Name + " for " + m_scene.RegionInfo.RegionName + " reports " + reason + " (Fatal: " + fatal + ")");
74 }
75
76 public void Close()
77 {
78
79 }
80
81 public string Name
82 {
83 get { return "Region Health Monitoring Module"; }
84 }
85
86 public bool IsSharedModule
87 {
88 get { return false; }
89 }
90
91 #endregion
92 }
93}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/AgentCountMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/AgentCountMonitor.cs
new file mode 100644
index 0000000..edc6e6b
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/AgentCountMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class AgentCountMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public AgentCountMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.SceneGraph.GetRootAgentCount();
19 }
20
21 public string GetName()
22 {
23 return "Root Agent Count";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + " agent(s)";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ChildAgentCountMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ChildAgentCountMonitor.cs
new file mode 100644
index 0000000..afe6b79
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ChildAgentCountMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class ChildAgentCountMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public ChildAgentCountMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.SceneGraph.GetChildAgentCount();
19 }
20
21 public string GetName()
22 {
23 return "Child Agent Count";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + " child agent(s)";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/EventFrameMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/EventFrameMonitor.cs
new file mode 100644
index 0000000..dec5a9e
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/EventFrameMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class EventFrameMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public EventFrameMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.MonitorEventTime;
19 }
20
21 public string GetName()
22 {
23 return "Total Event Frame Time";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + "ms";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/GCMemoryMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/GCMemoryMonitor.cs
new file mode 100644
index 0000000..cd67fea
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/GCMemoryMonitor.cs
@@ -0,0 +1,26 @@
1using System;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class GCMemoryMonitor : IMonitor
6 {
7 #region Implementation of IMonitor
8
9 public double GetValue()
10 {
11 return GC.GetTotalMemory(false);
12 }
13
14 public string GetName()
15 {
16 return "GC Reported Memory";
17 }
18
19 public string GetFriendlyValue()
20 {
21 return (int)(GetValue() / (1024*1024)) + "MB (Global)";
22 }
23
24 #endregion
25 }
26}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LandFrameMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LandFrameMonitor.cs
new file mode 100644
index 0000000..d883fc7
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LandFrameMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class LandFrameMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public LandFrameMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.MonitorLandTime;
19 }
20
21 public string GetName()
22 {
23 return "Land Frame Time";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + "ms";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LastFrameTimeMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LastFrameTimeMonitor.cs
new file mode 100644
index 0000000..36363f8
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LastFrameTimeMonitor.cs
@@ -0,0 +1,34 @@
1using System;
2using OpenSim.Region.Framework.Scenes;
3
4namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
5{
6 class LastFrameTimeMonitor : IMonitor
7 {
8 private readonly Scene m_scene;
9
10 public LastFrameTimeMonitor(Scene scene)
11 {
12 m_scene = scene;
13 }
14
15 #region Implementation of IMonitor
16
17 public double GetValue()
18 {
19 return Environment.TickCount - m_scene.MonitorLastFrameTick;
20 }
21
22 public string GetName()
23 {
24 return "Last Completed Frame At";
25 }
26
27 public string GetFriendlyValue()
28 {
29 return (int)GetValue() + "ms ago";
30 }
31
32 #endregion
33 }
34}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ObjectCountMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ObjectCountMonitor.cs
new file mode 100644
index 0000000..dd9b19d
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ObjectCountMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class ObjectCountMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public ObjectCountMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.SceneGraph.GetTotalObjectsCount();
19 }
20
21 public string GetName()
22 {
23 return "Total Objects Count";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + " Object(s)";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PWSMemoryMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PWSMemoryMonitor.cs
new file mode 100644
index 0000000..88f2938
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PWSMemoryMonitor.cs
@@ -0,0 +1,26 @@
1using System;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class PWSMemoryMonitor : IMonitor
6 {
7 #region Implementation of IMonitor
8
9 public double GetValue()
10 {
11 return System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64;
12 }
13
14 public string GetName()
15 {
16 return "Private Working Set Memory";
17 }
18
19 public string GetFriendlyValue()
20 {
21 return (int)(GetValue() / (1024 * 1024)) + "MB (Global)";
22 }
23
24 #endregion
25 }
26}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsFrameMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsFrameMonitor.cs
new file mode 100644
index 0000000..4d62e4f
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsFrameMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class PhysicsFrameMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public PhysicsFrameMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.MonitorPhysicsSyncTime + m_scene.MonitorPhysicsUpdateTime;
19 }
20
21 public string GetName()
22 {
23 return "Total Physics Frame Time";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + "ms";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsUpdateFrameMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsUpdateFrameMonitor.cs
new file mode 100644
index 0000000..91ac282
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsUpdateFrameMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class PhysicsUpdateFrameMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public PhysicsUpdateFrameMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.MonitorPhysicsUpdateTime;
19 }
20
21 public string GetName()
22 {
23 return "Physics Update Frame Time";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + "ms";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ThreadCountMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ThreadCountMonitor.cs
new file mode 100644
index 0000000..9300a93
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ThreadCountMonitor.cs
@@ -0,0 +1,25 @@
1
2namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
3{
4 class ThreadCountMonitor : IMonitor
5 {
6 #region Implementation of IMonitor
7
8 public double GetValue()
9 {
10 return System.Diagnostics.Process.GetCurrentProcess().Threads.Count;
11 }
12
13 public string GetName()
14 {
15 return "Total Threads";
16 }
17
18 public string GetFriendlyValue()
19 {
20 return (int)GetValue() + " Thread(s) (Global)";
21 }
22
23 #endregion
24 }
25}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/TotalFrameMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/TotalFrameMonitor.cs
new file mode 100644
index 0000000..dea1f94
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/TotalFrameMonitor.cs
@@ -0,0 +1,33 @@
1using OpenSim.Region.Framework.Scenes;
2
3namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
4{
5 class TotalFrameMonitor : IMonitor
6 {
7 private readonly Scene m_scene;
8
9 public TotalFrameMonitor(Scene scene)
10 {
11 m_scene = scene;
12 }
13
14 #region Implementation of IMonitor
15
16 public double GetValue()
17 {
18 return m_scene.MonitorFrameTime;
19 }
20
21 public string GetName()
22 {
23 return "Total Frame Time";
24 }
25
26 public string GetFriendlyValue()
27 {
28 return (int)GetValue() + "ms";
29 }
30
31 #endregion
32 }
33}
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
index 4199c98..46ee3c0 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
@@ -193,6 +193,10 @@ namespace OpenSim.Region.CoreModules.Hypergrid
193 { 193 {
194 return scene.RegionInfo; 194 return scene.RegionInfo;
195 } 195 }
196 else if (m_scenes.Count > 0)
197 {
198 return m_scenes[0].RegionInfo;
199 }
196 return null; 200 return null;
197 } 201 }
198 202
@@ -248,7 +252,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
248 { 252 {
249 foreach (Scene nextScene in m_scenes) 253 foreach (Scene nextScene in m_scenes)
250 { 254 {
251 if (nextScene.RegionInfo.RegionName == regionName) 255 if (nextScene.RegionInfo.RegionName.Equals(regionName, StringComparison.InvariantCultureIgnoreCase))
252 { 256 {
253 scene = nextScene; 257 scene = nextScene;
254 return true; 258 return true;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
index 046bee5..40ac647 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
@@ -322,10 +322,12 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Grid
322 { 322 {
323 List<GridRegion> rinfos = new List<GridRegion>(); 323 List<GridRegion> rinfos = new List<GridRegion>();
324 324
325 // Commenting until regionname exists 325 if (name == string.Empty)
326 //foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values) 326 return rinfos;
327 // if ((r.RegionName != null) && r.RegionName.StartsWith(name)) 327
328 // rinfos.Add(r); 328 foreach (GridRegion r in m_HyperlinkRegions.Values)
329 if ((r.RegionName != null) && r.RegionName.ToLower().StartsWith(name.ToLower()))
330 rinfos.Add(r);
329 331
330 rinfos.AddRange(m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber)); 332 rinfos.AddRange(m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber));
331 return rinfos; 333 return rinfos;
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index 54acbc4..c261943 100644
--- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
+++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
@@ -129,6 +129,9 @@ namespace OpenSim.Region.CoreModules.World.Archiver
129 successfulAssetRestores++; 129 successfulAssetRestores++;
130 else 130 else
131 failedAssetRestores++; 131 failedAssetRestores++;
132
133 if ((successfulAssetRestores + failedAssetRestores) % 250 == 0)
134 m_log.Debug("[ARCHIVER]: Loaded " + successfulAssetRestores + " assets and failed to load " + failedAssetRestores + " assets...");
132 } 135 }
133 else if (!m_merge && filePath.StartsWith(ArchiveConstants.TERRAINS_PATH)) 136 else if (!m_merge && filePath.StartsWith(ArchiveConstants.TERRAINS_PATH))
134 { 137 {
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index d01cef7..d1d6b6a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
@@ -35,7 +35,7 @@ using OpenSim.Region.Framework.Interfaces;
35namespace OpenSim.Region.Framework.Scenes 35namespace OpenSim.Region.Framework.Scenes
36{ 36{
37 #region Delegates 37 #region Delegates
38 public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectIDID); 38 public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectID);
39 public delegate void SetBypassPermissionsHandler(bool value); 39 public delegate void SetBypassPermissionsHandler(bool value);
40 public delegate bool BypassPermissionsHandler(); 40 public delegate bool BypassPermissionsHandler();
41 public delegate bool PropagatePermissionsHandler(); 41 public delegate bool PropagatePermissionsHandler();
@@ -147,28 +147,28 @@ namespace OpenSim.Region.Framework.Scenes
147 147
148 public uint GenerateClientFlags(UUID userID, UUID objectID) 148 public uint GenerateClientFlags(UUID userID, UUID objectID)
149 { 149 {
150 SceneObjectPart part=m_scene.GetSceneObjectPart(objectID); 150 // libomv will moan about PrimFlags.ObjectYouOfficer being
151 // obsolete...
152#pragma warning disable 0612
153 const PrimFlags DEFAULT_FLAGS =
154 PrimFlags.ObjectModify |
155 PrimFlags.ObjectCopy |
156 PrimFlags.ObjectMove |
157 PrimFlags.ObjectTransfer |
158 PrimFlags.ObjectYouOwner |
159 PrimFlags.ObjectAnyOwner |
160 PrimFlags.ObjectOwnerModify |
161 PrimFlags.ObjectYouOfficer;
162#pragma warning restore 0612
163
164 SceneObjectPart part = m_scene.GetSceneObjectPart(objectID);
151 165
152 if (part == null) 166 if (part == null)
153 return 0; 167 return 0;
154 168
155 // libomv will moan about PrimFlags.ObjectYouOfficer being 169 uint perms = part.GetEffectiveObjectFlags() | (uint)DEFAULT_FLAGS;
156 // obsolete...
157 #pragma warning disable 0612
158 uint perms=part.GetEffectiveObjectFlags() |
159 (uint)PrimFlags.ObjectModify |
160 (uint)PrimFlags.ObjectCopy |
161 (uint)PrimFlags.ObjectMove |
162 (uint)PrimFlags.ObjectTransfer |
163 (uint)PrimFlags.ObjectYouOwner |
164 (uint)PrimFlags.ObjectAnyOwner |
165 (uint)PrimFlags.ObjectOwnerModify |
166 (uint)PrimFlags.ObjectYouOfficer;
167 #pragma warning restore 0612
168
169 GenerateClientFlagsHandler handlerGenerateClientFlags =
170 OnGenerateClientFlags;
171 170
171 GenerateClientFlagsHandler handlerGenerateClientFlags = OnGenerateClientFlags;
172 if (handlerGenerateClientFlags != null) 172 if (handlerGenerateClientFlags != null)
173 { 173 {
174 Delegate[] list = handlerGenerateClientFlags.GetInvocationList(); 174 Delegate[] list = handlerGenerateClientFlags.GetInvocationList();
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7c3875d..a6ee40a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -135,6 +135,11 @@ namespace OpenSim.Region.Framework.Scenes
135 protected SceneCommunicationService m_sceneGridService; 135 protected SceneCommunicationService m_sceneGridService;
136 public bool loginsdisabled = true; 136 public bool loginsdisabled = true;
137 137
138 public new float TimeDilation
139 {
140 get { return m_sceneGraph.PhysicsScene.TimeDilation; }
141 }
142
138 public SceneCommunicationService SceneGridService 143 public SceneCommunicationService SceneGridService
139 { 144 {
140 get { return m_sceneGridService; } 145 get { return m_sceneGridService; }
@@ -252,7 +257,7 @@ namespace OpenSim.Region.Framework.Scenes
252 // Central Update Loop 257 // Central Update Loop
253 258
254 protected int m_fps = 10; 259 protected int m_fps = 10;
255 protected int m_frame; 260 protected uint m_frame;
256 protected float m_timespan = 0.089f; 261 protected float m_timespan = 0.089f;
257 protected DateTime m_lastupdate = DateTime.UtcNow; 262 protected DateTime m_lastupdate = DateTime.UtcNow;
258 263
@@ -269,6 +274,23 @@ namespace OpenSim.Region.Framework.Scenes
269 private int physicsMS2; 274 private int physicsMS2;
270 private int physicsMS; 275 private int physicsMS;
271 private int otherMS; 276 private int otherMS;
277 private int tempOnRezMS;
278 private int eventMS;
279 private int backupMS;
280 private int terrainMS;
281 private int landMS;
282 private int lastCompletedFrame;
283
284 public int MonitorFrameTime { get { return frameMS; } }
285 public int MonitorPhysicsUpdateTime { get { return physicsMS; } }
286 public int MonitorPhysicsSyncTime { get { return physicsMS2; } }
287 public int MonitorOtherTime { get { return otherMS; } }
288 public int MonitorTempOnRezTime { get { return tempOnRezMS; } }
289 public int MonitorEventTime { get { return eventMS; } } // This may need to be divided into each event?
290 public int MonitorBackupTime { get { return backupMS; } }
291 public int MonitorTerrainTime { get { return terrainMS; } }
292 public int MonitorLandTime { get { return landMS; } }
293 public int MonitorLastFrameTick { get { return lastCompletedFrame; } }
272 294
273 private bool m_physics_enabled = true; 295 private bool m_physics_enabled = true;
274 private bool m_scripts_enabled = true; 296 private bool m_scripts_enabled = true;
@@ -1013,36 +1035,25 @@ namespace OpenSim.Region.Framework.Scenes
1013 /// </summary> 1035 /// </summary>
1014 public override void Update() 1036 public override void Update()
1015 { 1037 {
1016 int maintc = 0; 1038 float physicsFPS;
1039 int maintc;
1040
1017 while (!shuttingdown) 1041 while (!shuttingdown)
1018 { 1042 {
1019//#if DEBUG
1020// int w = 0, io = 0;
1021// ThreadPool.GetAvailableThreads(out w, out io);
1022// if ((w < 10) || (io < 10))
1023// m_log.DebugFormat("[WARNING]: ThreadPool reaching exhaustion. workers = {0}; io = {1}", w, io);
1024//#endif
1025 maintc = Environment.TickCount;
1026
1027 TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; 1043 TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate;
1028 float physicsFPS = 0; 1044 physicsFPS = 0f;
1045
1046 maintc = maintc = otherMS = Environment.TickCount;
1047 int tmpFrameMS = maintc;
1029 1048
1030 frameMS = Environment.TickCount; 1049 // Increment the frame counter
1050 ++m_frame;
1031 1051
1032 try 1052 try
1033 { 1053 {
1034 // Increment the frame counter
1035 m_frame++;
1036
1037 // Loop it
1038 if (m_frame == Int32.MaxValue)
1039 m_frame = 0;
1040
1041 otherMS = Environment.TickCount;
1042
1043 // Check if any objects have reached their targets 1054 // Check if any objects have reached their targets
1044 CheckAtTargets(); 1055 CheckAtTargets();
1045 1056
1046 // Update SceneObjectGroups that have scheduled themselves for updates 1057 // Update SceneObjectGroups that have scheduled themselves for updates
1047 // Objects queue their updates onto all scene presences 1058 // Objects queue their updates onto all scene presences
1048 if (m_frame % m_update_objects == 0) 1059 if (m_frame % m_update_objects == 0)
@@ -1053,62 +1064,92 @@ namespace OpenSim.Region.Framework.Scenes
1053 if (m_frame % m_update_presences == 0) 1064 if (m_frame % m_update_presences == 0)
1054 m_sceneGraph.UpdatePresences(); 1065 m_sceneGraph.UpdatePresences();
1055 1066
1056 physicsMS2 = Environment.TickCount; 1067 int TempPhysicsMS2 = Environment.TickCount;
1057 if ((m_frame % m_update_physics == 0) && m_physics_enabled) 1068 if ((m_frame % m_update_physics == 0) && m_physics_enabled)
1058 m_sceneGraph.UpdatePreparePhysics(); 1069 m_sceneGraph.UpdatePreparePhysics();
1059 physicsMS2 = Environment.TickCount - physicsMS2; 1070 TempPhysicsMS2 = Environment.TickCount - TempPhysicsMS2;
1071 physicsMS2 = TempPhysicsMS2;
1060 1072
1061 if (m_frame % m_update_entitymovement == 0) 1073 if (m_frame % m_update_entitymovement == 0)
1062 m_sceneGraph.UpdateScenePresenceMovement(); 1074 m_sceneGraph.UpdateScenePresenceMovement();
1063 1075
1064 physicsMS = Environment.TickCount; 1076 int TempPhysicsMS = Environment.TickCount;
1065 if ((m_frame % m_update_physics == 0) && m_physics_enabled) 1077 if (m_frame % m_update_physics == 0)
1066 physicsFPS = m_sceneGraph.UpdatePhysics( 1078 {
1067 Math.Max(SinceLastFrame.TotalSeconds, m_timespan) 1079 if (m_physics_enabled)
1068 ); 1080 physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_timespan));
1069 if (m_frame % m_update_physics == 0 && SynchronizeScene != null) 1081 if (SynchronizeScene != null)
1070 SynchronizeScene(this); 1082 SynchronizeScene(this);
1071 1083 }
1072 physicsMS = Environment.TickCount - physicsMS; 1084 TempPhysicsMS = Environment.TickCount - TempPhysicsMS;
1073 physicsMS += physicsMS2; 1085 physicsMS = TempPhysicsMS;
1074 1086
1075 // Delete temp-on-rez stuff 1087 // Delete temp-on-rez stuff
1076 if (m_frame % m_update_backup == 0) 1088 if (m_frame % m_update_backup == 0)
1089 {
1090 int tozMS = Environment.TickCount;
1077 CleanTempObjects(); 1091 CleanTempObjects();
1092 tozMS -= Environment.TickCount;
1093 tempOnRezMS = tozMS;
1094 }
1078 1095
1079 if (RegionStatus != RegionStatus.SlaveScene) 1096 if (RegionStatus != RegionStatus.SlaveScene)
1080 { 1097 {
1081 if (m_frame % m_update_events == 0) 1098 if (m_frame % m_update_events == 0)
1099 {
1100 int evMS = Environment.TickCount;
1082 UpdateEvents(); 1101 UpdateEvents();
1102 evMS -= Environment.TickCount;
1103 eventMS = evMS;
1104 }
1083 1105
1084 if (m_frame % m_update_backup == 0) 1106 if (m_frame % m_update_backup == 0)
1107 {
1108 int backMS = Environment.TickCount;
1085 UpdateStorageBackup(); 1109 UpdateStorageBackup();
1110 backMS -= Environment.TickCount;
1111 backupMS = backMS;
1112 }
1086 1113
1087 if (m_frame % m_update_terrain == 0) 1114 if (m_frame % m_update_terrain == 0)
1115 {
1116 int terMS = Environment.TickCount;
1088 UpdateTerrain(); 1117 UpdateTerrain();
1118 terMS -= Environment.TickCount;
1119 terrainMS = terMS;
1120 }
1089 1121
1090 if (m_frame % m_update_land == 0) 1122 if (m_frame % m_update_land == 0)
1123 {
1124 int ldMS = Environment.TickCount;
1091 UpdateLand(); 1125 UpdateLand();
1126 ldMS -= Environment.TickCount;
1127 landMS = ldMS;
1128 }
1129
1130 int tickCount = Environment.TickCount;
1131 otherMS = tickCount - otherMS;
1132 tmpFrameMS -= tickCount;
1133 frameMS = tmpFrameMS;
1134 lastCompletedFrame = tickCount;
1092 1135
1093 otherMS = Environment.TickCount - otherMS;
1094 // if (m_frame%m_update_avatars == 0) 1136 // if (m_frame%m_update_avatars == 0)
1095 // UpdateInWorldTime(); 1137 // UpdateInWorldTime();
1096 StatsReporter.AddPhysicsFPS(physicsFPS); 1138 StatsReporter.AddPhysicsFPS(physicsFPS);
1097 StatsReporter.AddTimeDilation(m_timedilation); 1139 StatsReporter.AddTimeDilation(TimeDilation);
1098 StatsReporter.AddFPS(1); 1140 StatsReporter.AddFPS(1);
1099 StatsReporter.AddInPackets(0);
1100 StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount()); 1141 StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount());
1101 StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount()); 1142 StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount());
1102 StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount()); 1143 StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount());
1103 StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount()); 1144 StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount());
1104 frameMS = Environment.TickCount - frameMS;
1105 StatsReporter.addFrameMS(frameMS); 1145 StatsReporter.addFrameMS(frameMS);
1106 StatsReporter.addPhysicsMS(physicsMS); 1146 StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
1107 StatsReporter.addOtherMS(otherMS); 1147 StatsReporter.addOtherMS(otherMS);
1108 StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount()); 1148 StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount());
1109 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS()); 1149 StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
1110 } 1150 }
1111 if (loginsdisabled && (m_frame > 20)) 1151
1152 if (loginsdisabled && m_frame > 20)
1112 { 1153 {
1113 // In 99.9% of cases it is a bad idea to manually force garbage collection. However, 1154 // In 99.9% of cases it is a bad idea to manually force garbage collection. However,
1114 // this is a rare case where we know we have just went through a long cycle of heap 1155 // this is a rare case where we know we have just went through a long cycle of heap
@@ -1141,18 +1182,6 @@ namespace OpenSim.Region.Framework.Scenes
1141 } 1182 }
1142 finally 1183 finally
1143 { 1184 {
1144 //updateLock.ReleaseMutex();
1145 // Get actual time dilation
1146 float tmpval = (m_timespan / (float)SinceLastFrame.TotalSeconds);
1147
1148 // If actual time dilation is greater then one, we're catching up, so subtract
1149 // the amount that's greater then 1 from the time dilation
1150 if (tmpval > 1.0)
1151 {
1152 tmpval = tmpval - (tmpval - 1.0f);
1153 }
1154 m_timedilation = tmpval;
1155
1156 m_lastupdate = DateTime.UtcNow; 1185 m_lastupdate = DateTime.UtcNow;
1157 } 1186 }
1158 maintc = Environment.TickCount - maintc; 1187 maintc = Environment.TickCount - maintc;
@@ -1183,9 +1212,9 @@ namespace OpenSim.Region.Framework.Scenes
1183 { 1212 {
1184 lock (m_groupsWithTargets) 1213 lock (m_groupsWithTargets)
1185 { 1214 {
1186 foreach (KeyValuePair<UUID, SceneObjectGroup> kvp in m_groupsWithTargets) 1215 foreach (SceneObjectGroup entry in m_groupsWithTargets.Values)
1187 { 1216 {
1188 kvp.Value.checkAtTargets(); 1217 entry.checkAtTargets();
1189 } 1218 }
1190 } 1219 }
1191 } 1220 }
@@ -4606,7 +4635,7 @@ namespace OpenSim.Region.Framework.Scenes
4606 SceneObjectPart trackedBody = GetSceneObjectPart(joint.TrackedBodyName); // FIXME: causes a sequential lookup 4635 SceneObjectPart trackedBody = GetSceneObjectPart(joint.TrackedBodyName); // FIXME: causes a sequential lookup
4607 if (trackedBody == null) return; // the actor may have been deleted but the joint still lingers around a few frames waiting for deletion. during this time, trackedBody is NULL to prevent further motion of the joint proxy. 4636 if (trackedBody == null) return; // the actor may have been deleted but the joint still lingers around a few frames waiting for deletion. during this time, trackedBody is NULL to prevent further motion of the joint proxy.
4608 jointProxyObject.Velocity = trackedBody.Velocity; 4637 jointProxyObject.Velocity = trackedBody.Velocity;
4609 jointProxyObject.RotationalVelocity = trackedBody.RotationalVelocity; 4638 jointProxyObject.AngularVelocity = trackedBody.AngularVelocity;
4610 switch (joint.Type) 4639 switch (joint.Type)
4611 { 4640 {
4612 case PhysicsJointType.Ball: 4641 case PhysicsJointType.Ball:
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 82731d1..1547f9a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -106,9 +106,8 @@ namespace OpenSim.Region.Framework.Scenes
106 106
107 public float TimeDilation 107 public float TimeDilation
108 { 108 {
109 get { return m_timedilation; } 109 get { return 1.0f; }
110 } 110 }
111 protected float m_timedilation = 1.0f;
112 111
113 protected ulong m_regionHandle; 112 protected ulong m_regionHandle;
114 protected string m_regionName; 113 protected string m_regionName;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index db055f9..2fdb48d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -369,26 +369,30 @@ namespace OpenSim.Region.Framework.Scenes
369 /// </summary> 369 /// </summary>
370 protected internal void UpdateObjectGroups() 370 protected internal void UpdateObjectGroups()
371 { 371 {
372 Dictionary<UUID, SceneObjectGroup> updates; 372 List<SceneObjectGroup> updates;
373
373 // Some updates add more updates to the updateList. 374 // Some updates add more updates to the updateList.
374 // Get the current list of updates and clear the list before iterating 375 // Get the current list of updates and clear the list before iterating
375 lock (m_updateList) 376 lock (m_updateList)
376 { 377 {
377 updates = new Dictionary<UUID, SceneObjectGroup>(m_updateList); 378 updates = new List<SceneObjectGroup>(m_updateList.Values);
378 m_updateList.Clear(); 379 m_updateList.Clear();
379 } 380 }
381
380 // Go through all updates 382 // Go through all updates
381 foreach (KeyValuePair<UUID, SceneObjectGroup> kvp in updates) 383 for (int i = 0; i < updates.Count; i++)
382 { 384 {
385 SceneObjectGroup sog = updates[i];
386
383 // Don't abort the whole update if one entity happens to give us an exception. 387 // Don't abort the whole update if one entity happens to give us an exception.
384 try 388 try
385 { 389 {
386 kvp.Value.Update(); 390 sog.Update();
387 } 391 }
388 catch (Exception e) 392 catch (Exception e)
389 { 393 {
390 m_log.ErrorFormat( 394 m_log.ErrorFormat(
391 "[INNER SCENE]: Failed to update {0}, {1} - {2}", kvp.Value.Name, kvp.Value.UUID, e); 395 "[INNER SCENE]: Failed to update {0}, {1} - {2}", sog.Name, sog.UUID, e);
392 } 396 }
393 } 397 }
394 } 398 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 38a0cff..0b752c9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1015,9 +1015,9 @@ namespace OpenSim.Region.Framework.Scenes
1015 } 1015 }
1016 } 1016 }
1017 1017
1018 public float GetTimeDilation() 1018 public ushort GetTimeDilation()
1019 { 1019 {
1020 return m_scene.TimeDilation; 1020 return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
1021 } 1021 }
1022 1022
1023 /// <summary> 1023 /// <summary>
@@ -1857,28 +1857,15 @@ namespace OpenSim.Region.Framework.Scenes
1857 { 1857 {
1858 bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0); 1858 bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0);
1859 1859
1860 //if (IsAttachment) 1860 if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f))
1861 //{
1862 //foreach (SceneObjectPart part in m_parts.Values)
1863 //{
1864 //part.SendScheduledUpdates();
1865 //}
1866 //return;
1867 //}
1868
1869 if (UsePhysics && Util.DistanceLessThan(lastPhysGroupPos, AbsolutePosition, 0.02))
1870 { 1861 {
1871 m_rootPart.UpdateFlag = 1; 1862 m_rootPart.UpdateFlag = 1;
1872 lastPhysGroupPos = AbsolutePosition; 1863 lastPhysGroupPos = AbsolutePosition;
1873 } 1864 }
1874 1865
1875 if (UsePhysics && ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1) 1866 if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
1876 || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1)
1877 || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1)
1878 || (Math.Abs(lastPhysGroupRot.Z - GroupRotation.Z) > 0.1)))
1879 { 1867 {
1880 m_rootPart.UpdateFlag = 1; 1868 m_rootPart.UpdateFlag = 1;
1881
1882 lastPhysGroupRot = GroupRotation; 1869 lastPhysGroupRot = GroupRotation;
1883 } 1870 }
1884 1871
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 9b11582..2bc7f66 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -253,6 +253,7 @@ namespace OpenSim.Region.Framework.Scenes
253 protected Vector3 m_lastVelocity; 253 protected Vector3 m_lastVelocity;
254 protected Vector3 m_lastAcceleration; 254 protected Vector3 m_lastAcceleration;
255 protected Vector3 m_lastAngularVelocity; 255 protected Vector3 m_lastAngularVelocity;
256 protected int m_lastTerseSent;
256 257
257 // TODO: Those have to be changed into persistent properties at some later point, 258 // TODO: Those have to be changed into persistent properties at some later point,
258 // or sit-camera on vehicles will break on sim-crossing. 259 // or sit-camera on vehicles will break on sim-crossing.
@@ -506,20 +507,17 @@ namespace OpenSim.Region.Framework.Scenes
506 get 507 get
507 { 508 {
508 // If this is a linkset, we don't want the physics engine mucking up our group position here. 509 // If this is a linkset, we don't want the physics engine mucking up our group position here.
509 if (PhysActor != null && _parentID == 0) 510 PhysicsActor actor = PhysActor;
511 if (actor != null && _parentID == 0)
510 { 512 {
511 m_groupPosition.X = PhysActor.Position.X; 513 m_groupPosition = actor.Position;
512 m_groupPosition.Y = PhysActor.Position.Y;
513 m_groupPosition.Z = PhysActor.Position.Z;
514 } 514 }
515 515
516 if (IsAttachment) 516 if (IsAttachment)
517 { 517 {
518 ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar); 518 ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar);
519 if (sp != null) 519 if (sp != null)
520 {
521 return sp.AbsolutePosition; 520 return sp.AbsolutePosition;
522 }
523 } 521 }
524 522
525 return m_groupPosition; 523 return m_groupPosition;
@@ -530,26 +528,25 @@ namespace OpenSim.Region.Framework.Scenes
530 528
531 m_groupPosition = value; 529 m_groupPosition = value;
532 530
533 if (PhysActor != null) 531 PhysicsActor actor = PhysActor;
532 if (actor != null)
534 { 533 {
535 try 534 try
536 { 535 {
537 // Root prim actually goes at Position 536 // Root prim actually goes at Position
538 if (_parentID == 0) 537 if (_parentID == 0)
539 { 538 {
540 PhysActor.Position = value; 539 actor.Position = value;
541 } 540 }
542 else 541 else
543 { 542 {
544 // To move the child prim in respect to the group position and rotation we have to calculate 543 // To move the child prim in respect to the group position and rotation we have to calculate
545 Vector3 resultingposition = GetWorldPosition(); 544 actor.Position = GetWorldPosition();
546 PhysActor.Position = resultingposition; 545 actor.Orientation = GetWorldRotation();
547 Quaternion resultingrot = GetWorldRotation();
548 PhysActor.Orientation = resultingrot;
549 } 546 }
550 547
551 // Tell the physics engines that this prim changed. 548 // Tell the physics engines that this prim changed.
552 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 549 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
553 } 550 }
554 catch (Exception e) 551 catch (Exception e)
555 { 552 {
@@ -582,15 +579,14 @@ namespace OpenSim.Region.Framework.Scenes
582 579
583 if (ParentGroup != null && !ParentGroup.IsDeleted) 580 if (ParentGroup != null && !ParentGroup.IsDeleted)
584 { 581 {
585 if (_parentID != 0 && PhysActor != null) 582 PhysicsActor actor = PhysActor;
583 if (_parentID != 0 && actor != null)
586 { 584 {
587 Vector3 resultingposition = GetWorldPosition(); 585 actor.Position = GetWorldPosition();
588 PhysActor.Position = resultingposition; 586 actor.Orientation = GetWorldRotation();
589 Quaternion resultingrot = GetWorldRotation();
590 PhysActor.Orientation = resultingrot;
591 587
592 // Tell the physics engines that this prim changed. 588 // Tell the physics engines that this prim changed.
593 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 589 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
594 } 590 }
595 } 591 }
596 } 592 }
@@ -601,12 +597,13 @@ namespace OpenSim.Region.Framework.Scenes
601 get 597 get
602 { 598 {
603 // We don't want the physics engine mucking up the rotations in a linkset 599 // We don't want the physics engine mucking up the rotations in a linkset
604 if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (PhysActor != null)) 600 PhysicsActor actor = PhysActor;
601 if (_parentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null)
605 { 602 {
606 if (PhysActor.Orientation.X != 0 || PhysActor.Orientation.Y != 0 603 if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f
607 || PhysActor.Orientation.Z != 0 || PhysActor.Orientation.W != 0) 604 || actor.Orientation.Z != 0f || actor.Orientation.W != 0f)
608 { 605 {
609 m_rotationOffset = PhysActor.Orientation; 606 m_rotationOffset = actor.Orientation;
610 } 607 }
611 } 608 }
612 609
@@ -618,24 +615,25 @@ namespace OpenSim.Region.Framework.Scenes
618 StoreUndoState(); 615 StoreUndoState();
619 m_rotationOffset = value; 616 m_rotationOffset = value;
620 617
621 if (PhysActor != null) 618 PhysicsActor actor = PhysActor;
619 if (actor != null)
622 { 620 {
623 try 621 try
624 { 622 {
625 // Root prim gets value directly 623 // Root prim gets value directly
626 if (_parentID == 0) 624 if (_parentID == 0)
627 { 625 {
628 PhysActor.Orientation = value; 626 actor.Orientation = value;
629 //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString()); 627 //m_log.Info("[PART]: RO1:" + actor.Orientation.ToString());
630 } 628 }
631 else 629 else
632 { 630 {
633 // Child prim we have to calculate it's world rotationwel 631 // Child prim we have to calculate it's world rotationwel
634 Quaternion resultingrotation = GetWorldRotation(); 632 Quaternion resultingrotation = GetWorldRotation();
635 PhysActor.Orientation = resultingrotation; 633 actor.Orientation = resultingrotation;
636 //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString()); 634 //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString());
637 } 635 }
638 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 636 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
639 //} 637 //}
640 } 638 }
641 catch (Exception ex) 639 catch (Exception ex)
@@ -652,16 +650,12 @@ namespace OpenSim.Region.Framework.Scenes
652 { 650 {
653 get 651 get
654 { 652 {
655 //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0 653 PhysicsActor actor = PhysActor;
656 //|| PhysActor.Velocity.Z != 0) 654 if (actor != null)
657 //{
658 if (PhysActor != null)
659 { 655 {
660 if (PhysActor.IsPhysical) 656 if (actor.IsPhysical)
661 { 657 {
662 m_velocity.X = PhysActor.Velocity.X; 658 m_velocity = actor.Velocity;
663 m_velocity.Y = PhysActor.Velocity.Y;
664 m_velocity.Z = PhysActor.Velocity.Z;
665 } 659 }
666 } 660 }
667 661
@@ -671,31 +665,28 @@ namespace OpenSim.Region.Framework.Scenes
671 set 665 set
672 { 666 {
673 m_velocity = value; 667 m_velocity = value;
674 if (PhysActor != null) 668
669 PhysicsActor actor = PhysActor;
670 if (actor != null)
675 { 671 {
676 if (PhysActor.IsPhysical) 672 if (actor.IsPhysical)
677 { 673 {
678 PhysActor.Velocity = value; 674 actor.Velocity = value;
679 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 675 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
680 } 676 }
681 } 677 }
682 } 678 }
683 } 679 }
684 680
685 public Vector3 RotationalVelocity
686 {
687 get { return AngularVelocity; }
688 set { AngularVelocity = value; }
689 }
690
691 /// <summary></summary> 681 /// <summary></summary>
692 public Vector3 AngularVelocity 682 public Vector3 AngularVelocity
693 { 683 {
694 get 684 get
695 { 685 {
696 if ((PhysActor != null) && PhysActor.IsPhysical) 686 PhysicsActor actor = PhysActor;
687 if ((actor != null) && actor.IsPhysical)
697 { 688 {
698 m_angularVelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0); 689 m_angularVelocity = actor.RotationalVelocity;
699 } 690 }
700 return m_angularVelocity; 691 return m_angularVelocity;
701 } 692 }
@@ -715,9 +706,10 @@ namespace OpenSim.Region.Framework.Scenes
715 set 706 set
716 { 707 {
717 m_description = value; 708 m_description = value;
718 if (PhysActor != null) 709 PhysicsActor actor = PhysActor;
710 if (actor != null)
719 { 711 {
720 PhysActor.SOPDescription = value; 712 actor.SOPDescription = value;
721 } 713 }
722 } 714 }
723 } 715 }
@@ -808,21 +800,23 @@ namespace OpenSim.Region.Framework.Scenes
808 set 800 set
809 { 801 {
810 StoreUndoState(); 802 StoreUndoState();
811if (m_shape != null) { 803 if (m_shape != null)
812 m_shape.Scale = value;
813
814 if (PhysActor != null && m_parentGroup != null)
815 { 804 {
816 if (m_parentGroup.Scene != null) 805 m_shape.Scale = value;
806
807 PhysicsActor actor = PhysActor;
808 if (actor != null && m_parentGroup != null)
817 { 809 {
818 if (m_parentGroup.Scene.PhysicsScene != null) 810 if (m_parentGroup.Scene != null)
819 { 811 {
820 PhysActor.Size = m_shape.Scale; 812 if (m_parentGroup.Scene.PhysicsScene != null)
821 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); 813 {
814 actor.Size = m_shape.Scale;
815 m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
816 }
822 } 817 }
823 } 818 }
824 } 819 }
825}
826 TriggerScriptChangedEvent(Changed.SCALE); 820 TriggerScriptChangedEvent(Changed.SCALE);
827 } 821 }
828 } 822 }
@@ -1056,8 +1050,6 @@ if (m_shape != null) {
1056 1050
1057 #endregion Public Properties with only Get 1051 #endregion Public Properties with only Get
1058 1052
1059
1060
1061 #region Private Methods 1053 #region Private Methods
1062 1054
1063 private uint ApplyMask(uint val, bool set, uint mask) 1055 private uint ApplyMask(uint val, bool set, uint mask)
@@ -1551,9 +1543,9 @@ if (m_shape != null) {
1551 m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed? 1543 m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed?
1552 1544
1553 // make sure client isn't interpolating the joint proxy object 1545 // make sure client isn't interpolating the joint proxy object
1554 Velocity = new Vector3(0, 0, 0); 1546 Velocity = Vector3.Zero;
1555 RotationalVelocity = new Vector3(0, 0, 0); 1547 AngularVelocity = Vector3.Zero;
1556 Acceleration = new Vector3(0, 0, 0); 1548 Acceleration = Vector3.Zero;
1557 } 1549 }
1558 } 1550 }
1559 } 1551 }
@@ -1816,7 +1808,7 @@ if (m_shape != null) {
1816 } 1808 }
1817 1809
1818 CollisionEventUpdate a = (CollisionEventUpdate)e; 1810 CollisionEventUpdate a = (CollisionEventUpdate)e;
1819 Dictionary<uint, float> collissionswith = a.m_objCollisionList; 1811 Dictionary<uint, ContactPoint> collissionswith = a.m_objCollisionList;
1820 List<uint> thisHitColliders = new List<uint>(); 1812 List<uint> thisHitColliders = new List<uint>();
1821 List<uint> endedColliders = new List<uint>(); 1813 List<uint> endedColliders = new List<uint>();
1822 List<uint> startedColliders = new List<uint>(); 1814 List<uint> startedColliders = new List<uint>();
@@ -2382,8 +2374,8 @@ if (m_shape != null) {
2382 //isattachment = ParentGroup.RootPart.IsAttachment; 2374 //isattachment = ParentGroup.RootPart.IsAttachment;
2383 2375
2384 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A}; 2376 byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
2385 remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape, 2377 remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, m_parentGroup.GetTimeDilation(), LocalId, m_shape,
2386 lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID, 2378 lPos, Velocity, Acceleration, RotationOffset, AngularVelocity, clientFlags, m_uuid, _ownerID,
2387 m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment, 2379 m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
2388 AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient))); 2380 AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient)));
2389 } 2381 }
@@ -2393,17 +2385,20 @@ if (m_shape != null) {
2393 /// </summary> 2385 /// </summary>
2394 public void SendScheduledUpdates() 2386 public void SendScheduledUpdates()
2395 { 2387 {
2396 const float VELOCITY_TOLERANCE = 0.01f; 2388 const float ROTATION_TOLERANCE = 0.01f;
2397 const float POSITION_TOLERANCE = 0.1f; 2389 const float VELOCITY_TOLERANCE = 0.001f;
2390 const float POSITION_TOLERANCE = 0.05f;
2391 const int TIME_MS_TOLERANCE = 3000;
2398 2392
2399 if (m_updateFlag == 1) 2393 if (m_updateFlag == 1)
2400 { 2394 {
2401 // Throw away duplicate or insignificant updates 2395 // Throw away duplicate or insignificant updates
2402 if (RotationOffset != m_lastRotation || 2396 if (!RotationOffset.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
2403 Acceleration != m_lastAcceleration || 2397 !Acceleration.Equals(m_lastAcceleration) ||
2404 (Velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || 2398 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
2405 (RotationalVelocity - m_lastAngularVelocity).Length() > VELOCITY_TOLERANCE || 2399 !AngularVelocity.ApproxEquals(m_lastAngularVelocity, VELOCITY_TOLERANCE) ||
2406 (OffsetPosition - m_lastPosition).Length() > POSITION_TOLERANCE) 2400 !OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
2401 Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
2407 { 2402 {
2408 AddTerseUpdateToAllAvatars(); 2403 AddTerseUpdateToAllAvatars();
2409 ClearUpdateSchedule(); 2404 ClearUpdateSchedule();
@@ -2421,7 +2416,8 @@ if (m_shape != null) {
2421 m_lastRotation = RotationOffset; 2416 m_lastRotation = RotationOffset;
2422 m_lastVelocity = Velocity; 2417 m_lastVelocity = Velocity;
2423 m_lastAcceleration = Acceleration; 2418 m_lastAcceleration = Acceleration;
2424 m_lastAngularVelocity = RotationalVelocity; 2419 m_lastAngularVelocity = AngularVelocity;
2420 m_lastTerseSent = Environment.TickCount;
2425 } 2421 }
2426 } 2422 }
2427 else 2423 else
@@ -3780,10 +3776,9 @@ if (m_shape != null) {
3780 // Causes this thread to dig into the Client Thread Data. 3776 // Causes this thread to dig into the Client Thread Data.
3781 // Remember your locking here! 3777 // Remember your locking here!
3782 remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle, 3778 remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle,
3783 (ushort)(m_parentGroup.GetTimeDilation() * 3779 m_parentGroup.GetTimeDilation(), LocalId, lPos,
3784 (float)ushort.MaxValue), LocalId, lPos,
3785 RotationOffset, Velocity, Acceleration, 3780 RotationOffset, Velocity, Acceleration,
3786 RotationalVelocity, state, FromItemID, 3781 AngularVelocity, state, FromItemID,
3787 OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient))); 3782 OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient)));
3788 } 3783 }
3789 3784
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 87fac0c..6c0d9f2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -76,8 +76,18 @@ namespace OpenSim.Region.Framework.Scenes
76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 76 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
77 77
78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 }; 78 private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
79 79 private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
80 public static byte[] DefaultTexture; 80 private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
81 private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
82 /// <summary>
83 /// Experimentally determined "fudge factor" to make sit-target positions
84 /// the same as in SecondLife. Fudge factor was tested for 36 different
85 /// test cases including prims of type box, sphere, cylinder, and torus,
86 /// with varying parameters for sit target location, prim size, prim
87 /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
88 /// issue #1716
89 /// </summary>
90 private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
81 91
82 public UUID currentParcelUUID = UUID.Zero; 92 public UUID currentParcelUUID = UUID.Zero;
83 93
@@ -92,16 +102,18 @@ namespace OpenSim.Region.Framework.Scenes
92 //private SceneObjectPart proxyObjectPart = null; 102 //private SceneObjectPart proxyObjectPart = null;
93 public Vector3 lastKnownAllowedPosition; 103 public Vector3 lastKnownAllowedPosition;
94 public bool sentMessageAboutRestrictedParcelFlyingDown; 104 public bool sentMessageAboutRestrictedParcelFlyingDown;
105 public Vector4 CollisionPlane = Vector4.UnitW;
95 106
96 private Vector3 m_lastPosition; 107 private Vector3 m_lastPosition;
97 private Quaternion m_lastRotation; 108 private Quaternion m_lastRotation;
98 private Vector3 m_lastVelocity; 109 private Vector3 m_lastVelocity;
110 //private int m_lastTerseSent;
99 111
100 private bool m_updateflag; 112 private bool m_updateflag;
101 private byte m_movementflag; 113 private byte m_movementflag;
102 private readonly List<NewForce> m_forcesList = new List<NewForce>(); 114 private Vector3? m_forceToApply;
103 private uint m_requestedSitTargetID; 115 private uint m_requestedSitTargetID;
104 private UUID m_requestedSitTargetUUID = UUID.Zero; 116 private UUID m_requestedSitTargetUUID;
105 private SendCourseLocationsMethod m_sendCourseLocationsMethod; 117 private SendCourseLocationsMethod m_sendCourseLocationsMethod;
106 118
107 private bool m_startAnimationSet; 119 private bool m_startAnimationSet;
@@ -112,30 +124,24 @@ namespace OpenSim.Region.Framework.Scenes
112 124
113 private float m_sitAvatarHeight = 2.0f; 125 private float m_sitAvatarHeight = 2.0f;
114 126
115 // experimentally determined "fudge factor" to make sit-target positions
116 // the same as in SecondLife. Fudge factor was tested for 36 different
117 // test cases including prims of type box, sphere, cylinder, and torus,
118 // with varying parameters for sit target location, prim size, prim
119 // rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
120 // issue #1716
121 private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
122 private float m_godlevel; 127 private float m_godlevel;
123 128
124 private bool m_invulnerable = true; 129 private bool m_invulnerable = true;
125 130
126 private Vector3 m_LastChildAgentUpdatePosition; 131 private Vector3 m_lastChildAgentUpdatePosition;
132 private Vector3 m_lastChildAgentUpdateCamPosition;
127 133
128 private int m_perfMonMS; 134 private int m_perfMonMS;
129 135
130 private bool m_setAlwaysRun; 136 private bool m_setAlwaysRun;
131 137
132 private string m_movementAnimation = "DEFAULT"; 138 private string m_movementAnimation = "DEFAULT";
133 private long m_animPersistUntil = 0; 139 private int m_animTickFall;
134 private bool m_allowFalling = false; 140 private int m_animTickJump;
135 private bool m_useFlySlow = false; 141 private bool m_useFlySlow;
136 private bool m_usePreJump = false; 142 private bool m_usePreJump;
137 private bool m_forceFly = false; 143 private bool m_forceFly;
138 private bool m_flyDisabled = false; 144 private bool m_flyDisabled;
139 145
140 private float m_speedModifier = 1.0f; 146 private float m_speedModifier = 1.0f;
141 147
@@ -143,7 +149,7 @@ namespace OpenSim.Region.Framework.Scenes
143 149
144 public bool IsRestrictedToRegion; 150 public bool IsRestrictedToRegion;
145 151
146 public string JID = string.Empty; 152 public string JID = String.Empty;
147 153
148 // Agent moves with a PID controller causing a force to be exerted. 154 // Agent moves with a PID controller causing a force to be exerted.
149 private bool m_newCoarseLocations = true; 155 private bool m_newCoarseLocations = true;
@@ -158,43 +164,43 @@ namespace OpenSim.Region.Framework.Scenes
158 private readonly Vector3[] Dir_Vectors = new Vector3[6]; 164 private readonly Vector3[] Dir_Vectors = new Vector3[6];
159 165
160 // Position of agent's camera in world (region cordinates) 166 // Position of agent's camera in world (region cordinates)
161 protected Vector3 m_CameraCenter = Vector3.Zero; 167 protected Vector3 m_CameraCenter;
162 protected Vector3 m_lastCameraCenter = Vector3.Zero; 168 protected Vector3 m_lastCameraCenter;
163 169
164 protected Timer m_reprioritization_timer; 170 protected Timer m_reprioritization_timer;
165 protected bool m_reprioritizing = false; 171 protected bool m_reprioritizing;
166 protected bool m_reprioritization_called = false; 172 protected bool m_reprioritization_called;
167 173
168 // Use these three vectors to figure out what the agent is looking at 174 // Use these three vectors to figure out what the agent is looking at
169 // Convert it to a Matrix and/or Quaternion 175 // Convert it to a Matrix and/or Quaternion
170 protected Vector3 m_CameraAtAxis = Vector3.Zero; 176 protected Vector3 m_CameraAtAxis;
171 protected Vector3 m_CameraLeftAxis = Vector3.Zero; 177 protected Vector3 m_CameraLeftAxis;
172 protected Vector3 m_CameraUpAxis = Vector3.Zero; 178 protected Vector3 m_CameraUpAxis;
173 private uint m_AgentControlFlags; 179 private AgentManager.ControlFlags m_AgentControlFlags;
174 private Quaternion m_headrotation = Quaternion.Identity; 180 private Quaternion m_headrotation = Quaternion.Identity;
175 private byte m_state; 181 private byte m_state;
176 182
177 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method 183 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
178 private Vector3 movementvector = Vector3.Zero; 184 private Vector3 movementvector;
179 185
180 private bool m_autopilotMoving; 186 private bool m_autopilotMoving;
181 private Vector3 m_autoPilotTarget = Vector3.Zero; 187 private Vector3 m_autoPilotTarget;
182 private bool m_sitAtAutoTarget; 188 private bool m_sitAtAutoTarget;
183 189
184 private string m_nextSitAnimation = String.Empty; 190 private string m_nextSitAnimation = String.Empty;
185 191
186 //PauPaw:Proper PID Controler for autopilot************ 192 //PauPaw:Proper PID Controler for autopilot************
187 private bool m_moveToPositionInProgress; 193 private bool m_moveToPositionInProgress;
188 private Vector3 m_moveToPositionTarget = Vector3.Zero; 194 private Vector3 m_moveToPositionTarget;
189 195
190 private bool m_followCamAuto = false; 196 private bool m_followCamAuto;
191 197
192 private int m_movementUpdateCount = 0; 198 private int m_movementUpdateCount;
193 199
194 private const int NumMovementsBetweenRayCast = 5; 200 private const int NumMovementsBetweenRayCast = 5;
195 201
196 private bool CameraConstraintActive = false; 202 private bool CameraConstraintActive;
197 //private int m_moveToPositionStateStatus = 0; 203 //private int m_moveToPositionStateStatus;
198 //***************************************************** 204 //*****************************************************
199 205
200 // Agent's Draw distance. 206 // Agent's Draw distance.
@@ -268,11 +274,9 @@ namespace OpenSim.Region.Framework.Scenes
268 get { return m_godlevel; } 274 get { return m_godlevel; }
269 } 275 }
270 276
271 private readonly ulong m_regionHandle;
272
273 public ulong RegionHandle 277 public ulong RegionHandle
274 { 278 {
275 get { return m_regionHandle; } 279 get { return m_rootRegionHandle; }
276 } 280 }
277 281
278 public Vector3 CameraPosition 282 public Vector3 CameraPosition
@@ -379,8 +383,8 @@ namespace OpenSim.Region.Framework.Scenes
379 383
380 public uint AgentControlFlags 384 public uint AgentControlFlags
381 { 385 {
382 get { return m_AgentControlFlags; } 386 get { return (uint)m_AgentControlFlags; }
383 set { m_AgentControlFlags = value; } 387 set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
384 } 388 }
385 389
386 /// <summary> 390 /// <summary>
@@ -411,31 +415,27 @@ namespace OpenSim.Region.Framework.Scenes
411 } 415 }
412 416
413 /// <summary> 417 /// <summary>
414 /// Absolute position of this avatar in 'region cordinates' 418 /// Position of this avatar relative to the region the avatar is in
415 /// </summary> 419 /// </summary>
416 public override Vector3 AbsolutePosition 420 public override Vector3 AbsolutePosition
417 { 421 {
418 get 422 get
419 { 423 {
420 if (m_physicsActor != null) 424 PhysicsActor actor = m_physicsActor;
421 { 425 if (actor != null)
422 m_pos.X = m_physicsActor.Position.X; 426 m_pos = actor.Position;
423 m_pos.Y = m_physicsActor.Position.Y;
424 m_pos.Z = m_physicsActor.Position.Z;
425 }
426 427
427 return m_parentPosition + m_pos; 428 return m_parentPosition + m_pos;
428 } 429 }
429 set 430 set
430 { 431 {
431 if (m_physicsActor != null) 432 PhysicsActor actor = m_physicsActor;
433 if (actor != null)
432 { 434 {
433 try 435 try
434 { 436 {
435 lock (m_scene.SyncRoot) 437 lock (m_scene.SyncRoot)
436 {
437 m_physicsActor.Position = value; 438 m_physicsActor.Position = value;
438 }
439 } 439 }
440 catch (Exception e) 440 catch (Exception e)
441 { 441 {
@@ -444,7 +444,7 @@ namespace OpenSim.Region.Framework.Scenes
444 } 444 }
445 445
446 m_pos = value; 446 m_pos = value;
447 m_parentPosition = new Vector3(0, 0, 0); 447 m_parentPosition = Vector3.Zero;
448 } 448 }
449 } 449 }
450 450
@@ -455,27 +455,21 @@ namespace OpenSim.Region.Framework.Scenes
455 { 455 {
456 get 456 get
457 { 457 {
458 if (m_physicsActor != null) 458 PhysicsActor actor = m_physicsActor;
459 { 459 if (actor != null)
460 m_velocity.X = m_physicsActor.Velocity.X; 460 m_velocity = actor.Velocity;
461 m_velocity.Y = m_physicsActor.Velocity.Y;
462 m_velocity.Z = m_physicsActor.Velocity.Z;
463 }
464 461
465 return m_velocity; 462 return m_velocity;
466 } 463 }
467 set 464 set
468 { 465 {
469 //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value); 466 PhysicsActor actor = m_physicsActor;
470 467 if (actor != null)
471 if (m_physicsActor != null)
472 { 468 {
473 try 469 try
474 { 470 {
475 lock (m_scene.SyncRoot) 471 lock (m_scene.SyncRoot)
476 { 472 actor.Velocity = value;
477 m_physicsActor.Velocity = value;
478 }
479 } 473 }
480 catch (Exception e) 474 catch (Exception e)
481 { 475 {
@@ -627,7 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
627 { 621 {
628 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 622 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
629 CreateSceneViewer(); 623 CreateSceneViewer();
630 m_regionHandle = reginfo.RegionHandle; 624 m_rootRegionHandle = reginfo.RegionHandle;
631 m_controllingClient = client; 625 m_controllingClient = client;
632 m_firstname = m_controllingClient.FirstName; 626 m_firstname = m_controllingClient.FirstName;
633 m_lastname = m_controllingClient.LastName; 627 m_lastname = m_controllingClient.LastName;
@@ -710,25 +704,25 @@ namespace OpenSim.Region.Framework.Scenes
710 704
711 private void SetDirectionVectors() 705 private void SetDirectionVectors()
712 { 706 {
713 Dir_Vectors[0] = new Vector3(1, 0, 0); //FORWARD 707 Dir_Vectors[0] = Vector3.UnitX; //FORWARD
714 Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK 708 Dir_Vectors[1] = -Vector3.UnitX; //BACK
715 Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT 709 Dir_Vectors[2] = Vector3.UnitY; //LEFT
716 Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT 710 Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
717 Dir_Vectors[4] = new Vector3(0, 0, 1); //UP 711 Dir_Vectors[4] = Vector3.UnitZ; //UP
718 Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN 712 Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
719 Dir_Vectors[5] = new Vector3(0, 0, -0.5f); //DOWN_Nudge 713 Dir_Vectors[5] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
720 } 714 }
721 715
722 private Vector3[] GetWalkDirectionVectors() 716 private Vector3[] GetWalkDirectionVectors()
723 { 717 {
724 Vector3[] vector = new Vector3[6]; 718 Vector3[] vector = new Vector3[6];
725 vector[0] = new Vector3(m_CameraUpAxis.Z, 0, -m_CameraAtAxis.Z); //FORWARD 719 vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
726 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0, m_CameraAtAxis.Z); //BACK 720 vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
727 vector[2] = new Vector3(0, 1, 0); //LEFT 721 vector[2] = Vector3.UnitY; //LEFT
728 vector[3] = new Vector3(0, -1, 0); //RIGHT 722 vector[3] = -Vector3.UnitY; //RIGHT
729 vector[4] = new Vector3(m_CameraAtAxis.Z, 0, m_CameraUpAxis.Z); //UP 723 vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
730 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN 724 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
731 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN_Nudge 725 vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
732 return vector; 726 return vector;
733 } 727 }
734 728
@@ -781,6 +775,8 @@ namespace OpenSim.Region.Framework.Scenes
781 if (gm != null) 775 if (gm != null)
782 m_grouptitle = gm.GetGroupTitle(m_uuid); 776 m_grouptitle = gm.GetGroupTitle(m_uuid);
783 777
778 m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
779
784 m_scene.SetRootAgentScene(m_uuid); 780 m_scene.SetRootAgentScene(m_uuid);
785 781
786 // Moved this from SendInitialData to ensure that m_appearance is initialized 782 // Moved this from SendInitialData to ensure that m_appearance is initialized
@@ -811,7 +807,6 @@ namespace OpenSim.Region.Framework.Scenes
811 pos = emergencyPos; 807 pos = emergencyPos;
812 } 808 }
813 809
814
815 float localAVHeight = 1.56f; 810 float localAVHeight = 1.56f;
816 if (m_avHeight != 127.0f) 811 if (m_avHeight != 127.0f)
817 { 812 {
@@ -906,6 +901,8 @@ namespace OpenSim.Region.Framework.Scenes
906 m_isChildAgent = true; 901 m_isChildAgent = true;
907 m_scene.SwapRootAgentCount(true); 902 m_scene.SwapRootAgentCount(true);
908 RemoveFromPhysicalScene(); 903 RemoveFromPhysicalScene();
904
905 // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
909 906
910 m_scene.EventManager.TriggerOnMakeChildAgent(this); 907 m_scene.EventManager.TriggerOnMakeChildAgent(this);
911 } 908 }
@@ -937,7 +934,7 @@ namespace OpenSim.Region.Framework.Scenes
937 isFlying = m_physicsActor.Flying; 934 isFlying = m_physicsActor.Flying;
938 935
939 RemoveFromPhysicalScene(); 936 RemoveFromPhysicalScene();
940 Velocity = new Vector3(0, 0, 0); 937 Velocity = Vector3.Zero;
941 AbsolutePosition = pos; 938 AbsolutePosition = pos;
942 AddToPhysicalScene(isFlying); 939 AddToPhysicalScene(isFlying);
943 if (m_appearance != null) 940 if (m_appearance != null)
@@ -985,12 +982,13 @@ namespace OpenSim.Region.Framework.Scenes
985 982
986 if (m_avHeight != 127.0f) 983 if (m_avHeight != 127.0f)
987 { 984 {
988 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (m_avHeight / 6f)); 985 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (m_avHeight / 6f));
989 } 986 }
990 else 987 else
991 { 988 {
992 AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (1.56f / 6f)); 989 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
993 } 990 }
991
994 TrySetMovementAnimation("LAND"); 992 TrySetMovementAnimation("LAND");
995 SendFullUpdateToAllClients(); 993 SendFullUpdateToAllClients();
996 } 994 }
@@ -1076,7 +1074,7 @@ namespace OpenSim.Region.Framework.Scenes
1076 } 1074 }
1077 1075
1078 m_isChildAgent = false; 1076 m_isChildAgent = false;
1079 bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); 1077 bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1080 MakeRootAgent(AbsolutePosition, m_flying); 1078 MakeRootAgent(AbsolutePosition, m_flying);
1081 1079
1082 if ((m_callbackURI != null) && !m_callbackURI.Equals("")) 1080 if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
@@ -1103,9 +1101,12 @@ namespace OpenSim.Region.Framework.Scenes
1103 /// <param name="distance"></param> 1101 /// <param name="distance"></param>
1104 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance) 1102 public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
1105 { 1103 {
1104 const float POSITION_TOLERANCE = 0.02f;
1105 const float VELOCITY_TOLERANCE = 0.02f;
1106 const float ROTATION_TOLERANCE = 0.02f;
1107
1106 if (m_followCamAuto) 1108 if (m_followCamAuto)
1107 { 1109 {
1108
1109 if (hitYN) 1110 if (hitYN)
1110 { 1111 {
1111 CameraConstraintActive = true; 1112 CameraConstraintActive = true;
@@ -1114,11 +1115,11 @@ namespace OpenSim.Region.Framework.Scenes
1114 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); 1115 Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
1115 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); 1116 ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
1116 } 1117 }
1117 else 1118 else
1118 { 1119 {
1119 if ((m_pos - m_lastPosition).Length() > 0.02f || 1120 if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
1120 (m_velocity - m_lastVelocity).Length() > 0.02f || 1121 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
1121 m_bodyRot != m_lastRotation) 1122 !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
1122 { 1123 {
1123 if (CameraConstraintActive) 1124 if (CameraConstraintActive)
1124 { 1125 {
@@ -1127,13 +1128,11 @@ namespace OpenSim.Region.Framework.Scenes
1127 } 1128 }
1128 } 1129 }
1129 } 1130 }
1130 } 1131 }
1131 } 1132 }
1132 1133
1133 Array m_dirControlFlags = Enum.GetValues(typeof(Dir_ControlFlags));
1134
1135 /// <summary> 1134 /// <summary>
1136 /// This is the event handler for client movement. If a client is moving, this event is triggering. 1135 /// This is the event handler for client movement. If a client is moving, this event is triggering.
1137 /// </summary> 1136 /// </summary>
1138 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData) 1137 public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
1139 { 1138 {
@@ -1149,15 +1148,13 @@ namespace OpenSim.Region.Framework.Scenes
1149 if (m_movementUpdateCount < 1) 1148 if (m_movementUpdateCount < 1)
1150 m_movementUpdateCount = 1; 1149 m_movementUpdateCount = 1;
1151 1150
1152 // Must check for standing up even when PhysicsActor is null, 1151 #region Sanity Checking
1153 // since sitting currently removes avatar from physical scene
1154 //m_log.Debug("agentPos:" + AbsolutePosition.ToString());
1155 1152
1156 // This is irritating. Really. 1153 // This is irritating. Really.
1157 if (!AbsolutePosition.IsFinite()) 1154 if (!AbsolutePosition.IsFinite())
1158 { 1155 {
1159 RemoveFromPhysicalScene(); 1156 RemoveFromPhysicalScene();
1160 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999902"); 1157 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
1161 1158
1162 m_pos = m_LastFinitePos; 1159 m_pos = m_LastFinitePos;
1163 if (!m_pos.IsFinite()) 1160 if (!m_pos.IsFinite())
@@ -1165,7 +1162,7 @@ namespace OpenSim.Region.Framework.Scenes
1165 m_pos.X = 127f; 1162 m_pos.X = 127f;
1166 m_pos.Y = 127f; 1163 m_pos.Y = 127f;
1167 m_pos.Z = 127f; 1164 m_pos.Z = 127f;
1168 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999903"); 1165 m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
1169 } 1166 }
1170 1167
1171 AddToPhysicalScene(false); 1168 AddToPhysicalScene(false);
@@ -1175,18 +1172,11 @@ namespace OpenSim.Region.Framework.Scenes
1175 m_LastFinitePos = m_pos; 1172 m_LastFinitePos = m_pos;
1176 } 1173 }
1177 1174
1178 //m_physicsActor.AddForce(new PhysicsVector(999999999, 99999999, 999999999999999), true); 1175 #endregion Sanity Checking
1179 1176
1180 //ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y); 1177 #region Inputs
1181 //if (land != null)
1182 //{
1183 //if (land.landData.landingType == (byte)1 && land.landData.userLocation != Vector3.Zero)
1184 //{
1185 // agent.startpos = land.landData.userLocation;
1186 //}
1187 //}
1188 1178
1189 uint flags = agentData.ControlFlags; 1179 AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
1190 Quaternion bodyRotation = agentData.BodyRotation; 1180 Quaternion bodyRotation = agentData.BodyRotation;
1191 1181
1192 // Camera location in world. We'll need to raytrace 1182 // Camera location in world. We'll need to raytrace
@@ -1207,87 +1197,85 @@ namespace OpenSim.Region.Framework.Scenes
1207 // The Agent's Draw distance setting 1197 // The Agent's Draw distance setting
1208 m_DrawDistance = agentData.Far; 1198 m_DrawDistance = agentData.Far;
1209 1199
1210 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
1211 {
1212 StandUp();
1213 }
1214
1215 // Check if Client has camera in 'follow cam' or 'build' mode. 1200 // Check if Client has camera in 'follow cam' or 'build' mode.
1216 Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation); 1201 Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
1217 1202
1218 m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f) 1203 m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
1219 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false; 1204 && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
1220 1205
1206 m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1207 m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1208
1209 #endregion Inputs
1210
1211 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
1212 {
1213 StandUp();
1214 }
1215
1221 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto); 1216 //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
1222 // Raycast from the avatar's head to the camera to see if there's anything blocking the view 1217 // Raycast from the avatar's head to the camera to see if there's anything blocking the view
1223 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast()) 1218 if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
1224 { 1219 {
1225 if (m_followCamAuto) 1220 if (m_followCamAuto)
1226 { 1221 {
1227 Vector3 headadjustment = new Vector3(0, 0, 0.3f); 1222 Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
1228 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - (m_pos + headadjustment)), Vector3.Distance(m_CameraCenter, (m_pos + headadjustment)) + 0.3f, RayCastCameraCallback); 1223 m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
1229 } 1224 }
1230 } 1225 }
1231 1226
1232 m_mouseLook = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
1233 m_leftButtonDown = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
1234
1235 lock (scriptedcontrols) 1227 lock (scriptedcontrols)
1236 { 1228 {
1237 if (scriptedcontrols.Count > 0) 1229 if (scriptedcontrols.Count > 0)
1238 { 1230 {
1239 SendControlToScripts(flags); 1231 SendControlToScripts((uint)flags);
1240 flags = RemoveIgnoredControls(flags, IgnoredControls); 1232 flags = RemoveIgnoredControls(flags, IgnoredControls);
1241 } 1233 }
1242 } 1234 }
1243 1235
1244 if (PhysicsActor == null)
1245 {
1246 return;
1247 }
1248
1249 if (m_autopilotMoving) 1236 if (m_autopilotMoving)
1250 CheckAtSitTarget(); 1237 CheckAtSitTarget();
1251 1238
1252 if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 1239 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
1253 { 1240 {
1254 // TODO: This doesn't prevent the user from walking yet. 1241 // TODO: This doesn't prevent the user from walking yet.
1255 // Setting parent ID would fix this, if we knew what value 1242 // Setting parent ID would fix this, if we knew what value
1256 // to use. Or we could add a m_isSitting variable. 1243 // to use. Or we could add a m_isSitting variable.
1257
1258 TrySetMovementAnimation("SIT_GROUND_CONSTRAINED"); 1244 TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
1259 } 1245 }
1246
1260 // In the future, these values might need to go global. 1247 // In the future, these values might need to go global.
1261 // Here's where you get them. 1248 // Here's where you get them.
1262
1263 m_AgentControlFlags = flags; 1249 m_AgentControlFlags = flags;
1264 m_headrotation = agentData.HeadRotation; 1250 m_headrotation = agentData.HeadRotation;
1265 m_state = agentData.State; 1251 m_state = agentData.State;
1266 1252
1253 PhysicsActor actor = PhysicsActor;
1254 if (actor == null)
1255 {
1256 return;
1257 }
1258
1267 if (m_allowMovement) 1259 if (m_allowMovement)
1268 { 1260 {
1269 int i = 0; 1261 int i = 0;
1270 bool update_movementflag = false; 1262 bool update_movementflag = false;
1271 bool update_rotation = false; 1263 bool update_rotation = false;
1272 bool DCFlagKeyPressed = false; 1264 bool DCFlagKeyPressed = false;
1273 Vector3 agent_control_v3 = new Vector3(0, 0, 0); 1265 Vector3 agent_control_v3 = Vector3.Zero;
1274 Quaternion q = bodyRotation; 1266 Quaternion q = bodyRotation;
1275 if (PhysicsActor != null)
1276 {
1277 bool oldflying = PhysicsActor.Flying;
1278 1267
1279 if (m_forceFly) 1268 bool oldflying = PhysicsActor.Flying;
1280 PhysicsActor.Flying = true;
1281 else if (m_flyDisabled)
1282 PhysicsActor.Flying = false;
1283 else
1284 PhysicsActor.Flying = ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1285 1269
1286 if (PhysicsActor.Flying != oldflying) 1270 if (m_forceFly)
1287 { 1271 actor.Flying = true;
1288 update_movementflag = true; 1272 else if (m_flyDisabled)
1289 } 1273 actor.Flying = false;
1290 } 1274 else
1275 actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
1276
1277 if (actor.Flying != oldflying)
1278 update_movementflag = true;
1291 1279
1292 if (q != m_bodyRot) 1280 if (q != m_bodyRot)
1293 { 1281 {
@@ -1309,10 +1297,9 @@ namespace OpenSim.Region.Framework.Scenes
1309 else 1297 else
1310 dirVectors = Dir_Vectors; 1298 dirVectors = Dir_Vectors;
1311 1299
1312 1300 foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
1313 foreach (Dir_ControlFlags DCF in m_dirControlFlags)
1314 { 1301 {
1315 if ((flags & (uint)DCF) != 0) 1302 if (((uint)flags & (uint)DCF) != 0)
1316 { 1303 {
1317 bResetMoveToPosition = true; 1304 bResetMoveToPosition = true;
1318 DCFlagKeyPressed = true; 1305 DCFlagKeyPressed = true;
@@ -1358,7 +1345,7 @@ namespace OpenSim.Region.Framework.Scenes
1358 if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving)) 1345 if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
1359 { 1346 {
1360 //Check the error term of the current position in relation to the target position 1347 //Check the error term of the current position in relation to the target position
1361 if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5) 1348 if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5f)
1362 { 1349 {
1363 // we are close enough to the target 1350 // we are close enough to the target
1364 m_moveToPositionTarget = Vector3.Zero; 1351 m_moveToPositionTarget = Vector3.Zero;
@@ -1439,8 +1426,8 @@ namespace OpenSim.Region.Framework.Scenes
1439 if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly) 1426 if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
1440 { 1427 {
1441 // Are the landing controls requirements filled? 1428 // Are the landing controls requirements filled?
1442 bool controlland = (((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || 1429 bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
1443 ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); 1430 ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
1444 1431
1445 // Are the collision requirements fulfilled? 1432 // Are the collision requirements fulfilled?
1446 bool colliding = (m_physicsActor.IsColliding == true); 1433 bool colliding = (m_physicsActor.IsColliding == true);
@@ -1537,7 +1524,7 @@ namespace OpenSim.Region.Framework.Scenes
1537 if (part != null) 1524 if (part != null)
1538 { 1525 {
1539 AbsolutePosition = part.AbsolutePosition; 1526 AbsolutePosition = part.AbsolutePosition;
1540 Velocity = new Vector3(0, 0, 0); 1527 Velocity = Vector3.Zero;
1541 SendFullUpdateToAllClients(); 1528 SendFullUpdateToAllClients();
1542 1529
1543 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID); 1530 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
@@ -1607,7 +1594,7 @@ namespace OpenSim.Region.Framework.Scenes
1607 } 1594 }
1608 1595
1609 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight); 1596 m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
1610 m_parentPosition = new Vector3(); 1597 m_parentPosition = Vector3.Zero;
1611 1598
1612 m_parentID = 0; 1599 m_parentID = 0;
1613 SendFullUpdateToAllClients(); 1600 SendFullUpdateToAllClients();
@@ -1834,7 +1821,7 @@ namespace OpenSim.Region.Framework.Scenes
1834 //Quaternion result = (sitTargetOrient * vq) * nq; 1821 //Quaternion result = (sitTargetOrient * vq) * nq;
1835 1822
1836 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z); 1823 m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
1837 m_pos += m_sitTargetCorrectionOffset; 1824 m_pos += SIT_TARGET_ADJUSTMENT;
1838 m_bodyRot = sitTargetOrient; 1825 m_bodyRot = sitTargetOrient;
1839 //Rotation = sitTargetOrient; 1826 //Rotation = sitTargetOrient;
1840 m_parentPosition = part.AbsolutePosition; 1827 m_parentPosition = part.AbsolutePosition;
@@ -1854,7 +1841,7 @@ namespace OpenSim.Region.Framework.Scenes
1854 } 1841 }
1855 m_parentID = m_requestedSitTargetID; 1842 m_parentID = m_requestedSitTargetID;
1856 1843
1857 Velocity = new Vector3(0, 0, 0); 1844 Velocity = Vector3.Zero;
1858 RemoveFromPhysicalScene(); 1845 RemoveFromPhysicalScene();
1859 1846
1860 TrySetMovementAnimation(sitAnimation); 1847 TrySetMovementAnimation(sitAnimation);
@@ -2011,7 +1998,7 @@ namespace OpenSim.Region.Framework.Scenes
2011 protected void TrySetMovementAnimation(string anim) 1998 protected void TrySetMovementAnimation(string anim)
2012 { 1999 {
2013 //m_log.DebugFormat("Updating movement animation to {0}", anim); 2000 //m_log.DebugFormat("Updating movement animation to {0}", anim);
2014 2001
2015 if (!m_isChildAgent) 2002 if (!m_isChildAgent)
2016 { 2003 {
2017 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero)) 2004 if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
@@ -2046,200 +2033,169 @@ namespace OpenSim.Region.Framework.Scenes
2046 /// </summary> 2033 /// </summary>
2047 public string GetMovementAnimation() 2034 public string GetMovementAnimation()
2048 { 2035 {
2049 if ((m_animPersistUntil > 0) && (m_animPersistUntil > DateTime.Now.Ticks)) 2036 const float FALL_DELAY = 0.33f;
2050 { 2037 const float PREJUMP_DELAY = 0.25f;
2051 //We don't want our existing state to end yet.
2052 return m_movementAnimation;
2053 2038
2054 } 2039 #region Inputs
2055 else if (m_movementflag != 0) 2040
2041 AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
2042 PhysicsActor actor = m_physicsActor;
2043
2044 // Create forward and left vectors from the current avatar rotation
2045 Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
2046 Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
2047 Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
2048
2049 // Check control flags
2050 bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
2051 bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
2052 bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
2053 bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
2054 //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
2055 //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
2056 bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
2057 bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
2058 //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2059 //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
2060
2061 // Direction in which the avatar is trying to move
2062 Vector3 move = Vector3.Zero;
2063 if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
2064 if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
2065 if (heldLeft) { move.X += left.X; move.Y += left.Y; }
2066 if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
2067 if (heldUp) { move.Z += 1; }
2068 if (heldDown) { move.Z -= 1; }
2069
2070 // Is the avatar trying to move?
2071 bool moving = (move != Vector3.Zero);
2072 bool jumping = m_animTickJump != 0;
2073
2074 #endregion Inputs
2075
2076 #region Flying
2077
2078 if (actor != null && actor.Flying)
2056 { 2079 {
2057 //We're moving 2080 m_animTickFall = 0;
2058 m_allowFalling = true; 2081 m_animTickJump = 0;
2059 if (PhysicsActor != null && PhysicsActor.IsColliding) 2082
2083 if (move.X != 0f || move.Y != 0f)
2060 { 2084 {
2061 //And colliding. Can you guess what it is yet? 2085 return (m_useFlySlow ? "FLYSLOW" : "FLY");
2062 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) 2086 }
2063 { 2087 else if (move.Z > 0f)
2064 //Down key is being pressed. 2088 {
2065 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) + (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0) 2089 return "HOVER_UP";
2066 { 2090 }
2067 return "CROUCHWALK"; 2091 else if (move.Z < 0f)
2068 } 2092 {
2069 else 2093 if (actor != null && actor.IsColliding)
2070 { 2094 return "LAND";
2071 return "CROUCH";
2072 }
2073 }
2074 else if (m_setAlwaysRun)
2075 {
2076 return "RUN";
2077 }
2078 else 2095 else
2079 { 2096 return "HOVER_DOWN";
2080 //If we're prejumping then inhibit this, it's a problem
2081 //caused by a false positive on IsColliding
2082 if (m_movementAnimation == "PREJUMP")
2083 {
2084 return "PREJUMP";
2085 }
2086 else
2087 {
2088 return "WALK";
2089 }
2090 }
2091
2092 } 2097 }
2093 else 2098 else
2094 { 2099 {
2095 //We're not colliding. Colliding isn't cool these days. 2100 return "HOVER";
2096 if (PhysicsActor != null && PhysicsActor.Flying) 2101 }
2097 { 2102 }
2098 //Are we moving forwards or backwards?
2099 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
2100 {
2101 //Then we really are flying
2102 if (m_setAlwaysRun)
2103 {
2104 return "FLY";
2105 }
2106 else
2107 {
2108 if (m_useFlySlow == false)
2109 {
2110 return "FLY";
2111 }
2112 else
2113 {
2114 return "FLYSLOW";
2115 }
2116 }
2117 }
2118 else
2119 {
2120 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
2121 {
2122 return "HOVER_UP";
2123 }
2124 else
2125 {
2126 return "HOVER_DOWN";
2127 }
2128 }
2129 2103
2130 } 2104 #endregion Flying
2131 else if (m_movementAnimation == "JUMP")
2132 {
2133 //If we were already jumping, continue to jump until we collide
2134 return "JUMP";
2135 2105
2136 } 2106 #region Falling/Floating/Landing
2137 else if (m_movementAnimation == "PREJUMP" && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
2138 {
2139 //If we were in a prejump, and the UP key is no longer being held down
2140 //then we're not going to fly, so we're jumping
2141 return "JUMP";
2142 2107
2143 } 2108 if (actor == null || !actor.IsColliding)
2144 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2109 {
2145 { 2110 float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2146 //They're pressing up, so we're either going to fly or jump 2111 float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
2147 return "PREJUMP"; 2112
2148 } 2113 if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
2149 else 2114 {
2150 { 2115 // Just started falling
2151 //If we're moving and not flying and not jumping and not colliding.. 2116 m_animTickFall = Environment.TickCount;
2152
2153 if (m_movementAnimation == "WALK" || m_movementAnimation == "RUN")
2154 {
2155 //Let's not enter a FALLDOWN state here, since we're probably
2156 //not colliding because we're going down hill.
2157 return m_movementAnimation;
2158 }
2159 //Record the time we enter this state so we know whether to "land" or not
2160 m_animPersistUntil = DateTime.Now.Ticks;
2161 return "FALLDOWN";
2162
2163 }
2164 } 2117 }
2118 else if (!jumping && fallElapsed > FALL_DELAY)
2119 {
2120 // Falling long enough to trigger the animation
2121 return "FALLDOWN";
2122 }
2123
2124 return m_movementAnimation;
2165 } 2125 }
2166 else 2126
2127 #endregion Falling/Floating/Landing
2128
2129 #region Ground Movement
2130
2131 if (m_movementAnimation == "FALLDOWN")
2167 { 2132 {
2168 //We're not moving. 2133 m_animTickFall = Environment.TickCount;
2169 if (PhysicsActor != null && PhysicsActor.IsColliding)
2170 {
2171 //But we are colliding.
2172 if (m_movementAnimation == "FALLDOWN")
2173 {
2174 //We're re-using the m_animPersistUntil value here to see how long we've been falling
2175 if ((DateTime.Now.Ticks - m_animPersistUntil) > TimeSpan.TicksPerSecond)
2176 {
2177 //Make sure we don't change state for a bit
2178 m_animPersistUntil = DateTime.Now.Ticks + TimeSpan.TicksPerSecond;
2179 return "LAND";
2180 }
2181 else
2182 {
2183 //We haven't been falling very long, we were probably just walking down hill
2184 return "STAND";
2185 }
2186 }
2187 else if (m_movementAnimation == "JUMP" || m_movementAnimation == "HOVER_DOWN")
2188 {
2189 //Make sure we don't change state for a bit
2190 m_animPersistUntil = DateTime.Now.Ticks + (1 * TimeSpan.TicksPerSecond);
2191 return "SOFT_LAND";
2192 2134
2193 } 2135 // TODO: SOFT_LAND support
2194 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) 2136 return "LAND";
2195 { 2137 }
2196 return "PREJUMP"; 2138 else if (m_movementAnimation == "LAND")
2197 } 2139 {
2198 else if (PhysicsActor != null && PhysicsActor.Flying) 2140 float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
2199 {
2200 m_allowFalling = true;
2201 if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
2202 {
2203 return "HOVER_UP";
2204 }
2205 else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)
2206 {
2207 return "HOVER_DOWN";
2208 }
2209 else
2210 {
2211 return "HOVER";
2212 }
2213 }
2214 else
2215 {
2216 return "STAND";
2217 }
2218 2141
2142 if (landElapsed <= FALL_DELAY)
2143 return "LAND";
2144 }
2145
2146 m_animTickFall = 0;
2147
2148 if (move.Z > 0f)
2149 {
2150 // Jumping
2151 if (!jumping)
2152 {
2153 // Begin prejump
2154 m_animTickJump = Environment.TickCount;
2155 return "PREJUMP";
2219 } 2156 }
2220 else 2157 else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
2221 { 2158 {
2222 //We're not colliding. 2159 // Start actual jump
2223 if (PhysicsActor != null && PhysicsActor.Flying) 2160 if (m_animTickJump == -1)
2224 { 2161 {
2225 2162 // Already jumping! End the current jump
2226 return "HOVER"; 2163 m_animTickJump = 0;
2227 2164 return "JUMP";
2228 } 2165 }
2229 else if ((m_movementAnimation == "JUMP" || m_movementAnimation == "PREJUMP") && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
2230 {
2231 2166
2232 return "JUMP"; 2167 m_animTickJump = -1;
2168 return "JUMP";
2169 }
2170 }
2171 else
2172 {
2173 // Not jumping
2174 m_animTickJump = 0;
2233 2175
2234 } 2176 if (move.X != 0f || move.Y != 0f)
2177 {
2178 // Walking / crouchwalking / running
2179 if (move.Z < 0f)
2180 return "CROUCHWALK";
2181 else if (m_setAlwaysRun)
2182 return "RUN";
2235 else 2183 else
2236 { 2184 return "WALK";
2237 //Record the time we enter this state so we know whether to "land" or not 2185 }
2238 m_animPersistUntil = DateTime.Now.Ticks; 2186 else
2239 return "FALLDOWN"; // this falling animation is invoked too frequently when capsule tilt correction is used - why? 2187 {
2240 } 2188 // Not walking
2189 if (move.Z < 0f)
2190 return "CROUCH";
2191 else
2192 return "STAND";
2241 } 2193 }
2242 } 2194 }
2195
2196 #endregion Ground Movement
2197
2198 return m_movementAnimation;
2243 } 2199 }
2244 2200
2245 /// <summary> 2201 /// <summary>
@@ -2247,24 +2203,16 @@ namespace OpenSim.Region.Framework.Scenes
2247 /// </summary> 2203 /// </summary>
2248 protected void UpdateMovementAnimations() 2204 protected void UpdateMovementAnimations()
2249 { 2205 {
2250 string movementAnimation = GetMovementAnimation(); 2206 m_movementAnimation = GetMovementAnimation();
2251 2207
2252 if (movementAnimation == "FALLDOWN" && m_allowFalling == false) 2208 if (m_movementAnimation == "PREJUMP" && !m_usePreJump)
2253 {
2254 movementAnimation = m_movementAnimation;
2255 }
2256 else
2257 {
2258 m_movementAnimation = movementAnimation;
2259 }
2260 if (movementAnimation == "PREJUMP" && m_usePreJump == false)
2261 { 2209 {
2262 //This was the previous behavior before PREJUMP 2210 // This was the previous behavior before PREJUMP
2263 TrySetMovementAnimation("JUMP"); 2211 TrySetMovementAnimation("JUMP");
2264 } 2212 }
2265 else 2213 else
2266 { 2214 {
2267 TrySetMovementAnimation(movementAnimation); 2215 TrySetMovementAnimation(m_movementAnimation);
2268 } 2216 }
2269 } 2217 }
2270 2218
@@ -2277,7 +2225,7 @@ namespace OpenSim.Region.Framework.Scenes
2277 { 2225 {
2278 if (m_isChildAgent) 2226 if (m_isChildAgent)
2279 { 2227 {
2280 m_log.Debug("DEBUG: AddNewMovement: child agent, Making root agent!"); 2228 m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
2281 2229
2282 // we have to reset the user's child agent connections. 2230 // we have to reset the user's child agent connections.
2283 // Likely, here they've lost the eventqueue for other regions so border 2231 // Likely, here they've lost the eventqueue for other regions so border
@@ -2286,7 +2234,7 @@ namespace OpenSim.Region.Framework.Scenes
2286 List<ulong> regions = new List<ulong>(KnownChildRegionHandles); 2234 List<ulong> regions = new List<ulong>(KnownChildRegionHandles);
2287 regions.Remove(m_scene.RegionInfo.RegionHandle); 2235 regions.Remove(m_scene.RegionInfo.RegionHandle);
2288 2236
2289 MakeRootAgent(new Vector3(127, 127, 127), true); 2237 MakeRootAgent(new Vector3(127f, 127f, 127f), true);
2290 2238
2291 // Async command 2239 // Async command
2292 if (m_scene.SceneGridService != null) 2240 if (m_scene.SceneGridService != null)
@@ -2298,47 +2246,45 @@ namespace OpenSim.Region.Framework.Scenes
2298 System.Threading.Thread.Sleep(500); 2246 System.Threading.Thread.Sleep(500);
2299 } 2247 }
2300 2248
2301
2302 if (m_scene.SceneGridService != null) 2249 if (m_scene.SceneGridService != null)
2303 { 2250 {
2304 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>()); 2251 m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List<RegionInfo>());
2305 } 2252 }
2306 2253
2307
2308
2309 return; 2254 return;
2310 } 2255 }
2311 2256
2312 m_perfMonMS = Environment.TickCount; 2257 m_perfMonMS = Environment.TickCount;
2313 2258
2314 m_rotation = rotation; 2259 m_rotation = rotation;
2315 NewForce newVelocity = new NewForce();
2316 Vector3 direc = vec * rotation; 2260 Vector3 direc = vec * rotation;
2317 direc.Normalize(); 2261 direc.Normalize();
2318 2262
2319 direc *= 0.03f * 128f * m_speedModifier; 2263 direc *= 0.03f * 128f * m_speedModifier;
2320 if (m_physicsActor.Flying) 2264
2321 { 2265 PhysicsActor actor = m_physicsActor;
2322 direc *= 4; 2266 if (actor != null)
2323 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2324 //bool colliding = (m_physicsActor.IsColliding==true);
2325 //if (controlland)
2326 // m_log.Info("[AGENT]: landCommand");
2327 //if (colliding)
2328 // m_log.Info("[AGENT]: colliding");
2329 //if (m_physicsActor.Flying && colliding && controlland)
2330 //{
2331 // StopFlying();
2332 // m_log.Info("[AGENT]: Stop FLying");
2333 //}
2334 }
2335 else
2336 { 2267 {
2337 if (!m_physicsActor.Flying && m_physicsActor.IsColliding) 2268 if (actor.Flying)
2269 {
2270 direc *= 4.0f;
2271 //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
2272 //bool colliding = (m_physicsActor.IsColliding==true);
2273 //if (controlland)
2274 // m_log.Info("[AGENT]: landCommand");
2275 //if (colliding)
2276 // m_log.Info("[AGENT]: colliding");
2277 //if (m_physicsActor.Flying && colliding && controlland)
2278 //{
2279 // StopFlying();
2280 // m_log.Info("[AGENT]: Stop FLying");
2281 //}
2282 }
2283 else if (!actor.Flying && actor.IsColliding)
2338 { 2284 {
2339 if (direc.Z > 2.0f) 2285 if (direc.Z > 2.0f)
2340 { 2286 {
2341 direc.Z *= 3; 2287 direc.Z *= 3.0f;
2342 2288
2343 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored. 2289 // TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
2344 TrySetMovementAnimation("PREJUMP"); 2290 TrySetMovementAnimation("PREJUMP");
@@ -2347,10 +2293,8 @@ namespace OpenSim.Region.Framework.Scenes
2347 } 2293 }
2348 } 2294 }
2349 2295
2350 newVelocity.X = direc.X; 2296 // TODO: Add the force instead of only setting it to support multiple forces per frame?
2351 newVelocity.Y = direc.Y; 2297 m_forceToApply = direc;
2352 newVelocity.Z = direc.Z;
2353 m_forcesList.Add(newVelocity);
2354 2298
2355 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2299 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2356 } 2300 }
@@ -2361,8 +2305,10 @@ namespace OpenSim.Region.Framework.Scenes
2361 2305
2362 public override void Update() 2306 public override void Update()
2363 { 2307 {
2364 const float VELOCITY_TOLERANCE = 0.01f; 2308 const float ROTATION_TOLERANCE = 0.01f;
2365 const float POSITION_TOLERANCE = 10.0f; 2309 const float VELOCITY_TOLERANCE = 0.001f;
2310 const float POSITION_TOLERANCE = 0.05f;
2311 //const int TIME_MS_TOLERANCE = 3000;
2366 2312
2367 SendPrimUpdates(); 2313 SendPrimUpdates();
2368 2314
@@ -2374,17 +2320,25 @@ namespace OpenSim.Region.Framework.Scenes
2374 2320
2375 if (m_isChildAgent == false) 2321 if (m_isChildAgent == false)
2376 { 2322 {
2323 PhysicsActor actor = m_physicsActor;
2324
2325 // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
2326 // grab the latest PhysicsActor velocity, whereas m_velocity is often
2327 // storing a requested force instead of an actual traveling velocity
2328
2377 // Throw away duplicate or insignificant updates 2329 // Throw away duplicate or insignificant updates
2378 if (m_bodyRot != m_lastRotation || 2330 if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
2379 (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || 2331 !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
2380 (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE) 2332 !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
2333 //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
2381 { 2334 {
2382 SendTerseUpdateToAllClients(); 2335 SendTerseUpdateToAllClients();
2383 2336
2384 // Update the "last" values 2337 // Update the "last" values
2385 m_lastPosition = m_pos; 2338 m_lastPosition = m_pos;
2386 m_lastRotation = m_bodyRot; 2339 m_lastRotation = m_bodyRot;
2387 m_lastVelocity = m_velocity; 2340 m_lastVelocity = Velocity;
2341 //m_lastTerseSent = Environment.TickCount;
2388 } 2342 }
2389 2343
2390 // followed suggestion from mic bowman. reversed the two lines below. 2344 // followed suggestion from mic bowman. reversed the two lines below.
@@ -2410,11 +2364,16 @@ namespace OpenSim.Region.Framework.Scenes
2410 { 2364 {
2411 m_perfMonMS = Environment.TickCount; 2365 m_perfMonMS = Environment.TickCount;
2412 2366
2367 PhysicsActor actor = m_physicsActor;
2368 Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
2369
2413 Vector3 pos = m_pos; 2370 Vector3 pos = m_pos;
2414 pos.Z -= m_appearance.HipOffset; 2371 pos.Z += m_appearance.HipOffset;
2415 2372
2416 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, 2373 //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
2417 pos, m_velocity, Vector3.Zero, m_bodyRot, Vector4.UnitW, m_uuid, null, GetUpdatePriority(remoteClient))); 2374
2375 remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
2376 pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
2418 2377
2419 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); 2378 m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
2420 m_scene.StatsReporter.AddAgentUpdates(1); 2379 m_scene.StatsReporter.AddAgentUpdates(1);
@@ -2510,7 +2469,7 @@ namespace OpenSim.Region.Framework.Scenes
2510 return; 2469 return;
2511 2470
2512 Vector3 pos = m_pos; 2471 Vector3 pos = m_pos;
2513 pos.Z -= m_appearance.HipOffset; 2472 pos.Z += m_appearance.HipOffset;
2514 2473
2515 remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, 2474 remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
2516 LocalId, pos, m_appearance.Texture.GetBytes(), 2475 LocalId, pos, m_appearance.Texture.GetBytes(),
@@ -2581,7 +2540,7 @@ namespace OpenSim.Region.Framework.Scenes
2581 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); 2540 // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
2582 2541
2583 Vector3 pos = m_pos; 2542 Vector3 pos = m_pos;
2584 pos.Z -= m_appearance.HipOffset; 2543 pos.Z += m_appearance.HipOffset;
2585 2544
2586 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2545 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2587 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2546 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2690,7 +2649,7 @@ namespace OpenSim.Region.Framework.Scenes
2690 } 2649 }
2691 2650
2692 Vector3 pos = m_pos; 2651 Vector3 pos = m_pos;
2693 pos.Z -= m_appearance.HipOffset; 2652 pos.Z += m_appearance.HipOffset;
2694 2653
2695 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, 2654 m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
2696 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); 2655 pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2778,7 +2737,8 @@ namespace OpenSim.Region.Framework.Scenes
2778 } 2737 }
2779 2738
2780 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m 2739 // Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
2781 if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance) 2740 if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
2741 Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
2782 { 2742 {
2783 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); 2743 ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
2784 cadu.ActiveGroupID = UUID.Zero.Guid; 2744 cadu.ActiveGroupID = UUID.Zero.Guid;
@@ -2792,7 +2752,7 @@ namespace OpenSim.Region.Framework.Scenes
2792 cadu.godlevel = m_godlevel; 2752 cadu.godlevel = m_godlevel;
2793 cadu.GroupAccess = 0; 2753 cadu.GroupAccess = 0;
2794 cadu.Position = new sLLVector3(AbsolutePosition); 2754 cadu.Position = new sLLVector3(AbsolutePosition);
2795 cadu.regionHandle = m_scene.RegionInfo.RegionHandle; 2755 cadu.regionHandle = m_rootRegionHandle;
2796 float multiplier = 1; 2756 float multiplier = 1;
2797 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount(); 2757 int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
2798 if (innacurateNeighbors != 0) 2758 if (innacurateNeighbors != 0)
@@ -2812,11 +2772,9 @@ namespace OpenSim.Region.Framework.Scenes
2812 agentpos.CopyFrom(cadu); 2772 agentpos.CopyFrom(cadu);
2813 2773
2814 m_scene.SendOutChildAgentUpdates(agentpos, this); 2774 m_scene.SendOutChildAgentUpdates(agentpos, this);
2815
2816 m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
2817 m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
2818 m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
2819 2775
2776 m_lastChildAgentUpdatePosition = AbsolutePosition;
2777 m_lastChildAgentUpdateCamPosition = CameraPosition;
2820 } 2778 }
2821 } 2779 }
2822 2780
@@ -2941,9 +2899,9 @@ namespace OpenSim.Region.Framework.Scenes
2941 m_inTransit = true; 2899 m_inTransit = true;
2942 2900
2943 if ((m_physicsActor != null) && m_physicsActor.Flying) 2901 if ((m_physicsActor != null) && m_physicsActor.Flying)
2944 m_AgentControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; 2902 m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2945 else if ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0) 2903 else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
2946 m_AgentControlFlags &= ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY; 2904 m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
2947 } 2905 }
2948 2906
2949 public void NotInTransit() 2907 public void NotInTransit()
@@ -2959,7 +2917,7 @@ namespace OpenSim.Region.Framework.Scenes
2959 public void Reset() 2917 public void Reset()
2960 { 2918 {
2961 // Put the child agent back at the center 2919 // Put the child agent back at the center
2962 AbsolutePosition = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 70); 2920 AbsolutePosition = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
2963 ResetAnimations(); 2921 ResetAnimations();
2964 } 2922 }
2965 2923
@@ -3069,9 +3027,11 @@ namespace OpenSim.Region.Framework.Scenes
3069 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize; 3027 int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
3070 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize; 3028 int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
3071 3029
3030 Vector3 offset = new Vector3(shiftx, shifty, 0f);
3031
3072 m_DrawDistance = cAgentData.Far; 3032 m_DrawDistance = cAgentData.Far;
3073 if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!! 3033 if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
3074 m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z); 3034 m_pos = cAgentData.Position + offset;
3075 3035
3076 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance) 3036 if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
3077 { 3037 {
@@ -3079,8 +3039,7 @@ namespace OpenSim.Region.Framework.Scenes
3079 ReprioritizeUpdates(); 3039 ReprioritizeUpdates();
3080 } 3040 }
3081 3041
3082 // It's hard to say here.. We can't really tell where the camera position is unless it's in world cordinates from the sending region 3042 m_CameraCenter = cAgentData.Center + offset;
3083 m_CameraCenter = cAgentData.Center;
3084 3043
3085 m_avHeight = cAgentData.Size.Z; 3044 m_avHeight = cAgentData.Size.Z;
3086 //SetHeight(cAgentData.AVHeight); 3045 //SetHeight(cAgentData.AVHeight);
@@ -3093,16 +3052,16 @@ namespace OpenSim.Region.Framework.Scenes
3093 m_sceneViewer.Reset(); 3052 m_sceneViewer.Reset();
3094 3053
3095 //cAgentData.AVHeight; 3054 //cAgentData.AVHeight;
3096 //cAgentData.regionHandle; 3055 m_rootRegionHandle = cAgentData.RegionHandle;
3097 //m_velocity = cAgentData.Velocity; 3056 //m_velocity = cAgentData.Velocity;
3098 } 3057 }
3099 3058
3100 public void CopyTo(AgentData cAgent) 3059 public void CopyTo(AgentData cAgent)
3101 { 3060 {
3102 cAgent.AgentID = UUID; 3061 cAgent.AgentID = UUID;
3103 cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle; 3062 cAgent.RegionHandle = m_rootRegionHandle;
3104 3063
3105 cAgent.Position = m_pos; 3064 cAgent.Position = AbsolutePosition;
3106 cAgent.Velocity = m_velocity; 3065 cAgent.Velocity = m_velocity;
3107 cAgent.Center = m_CameraCenter; 3066 cAgent.Center = m_CameraCenter;
3108 // Don't copy the size; it is inferred from apearance parameters 3067 // Don't copy the size; it is inferred from apearance parameters
@@ -3129,7 +3088,7 @@ namespace OpenSim.Region.Framework.Scenes
3129 3088
3130 cAgent.HeadRotation = m_headrotation; 3089 cAgent.HeadRotation = m_headrotation;
3131 cAgent.BodyRotation = m_bodyRot; 3090 cAgent.BodyRotation = m_bodyRot;
3132 cAgent.ControlFlags = m_AgentControlFlags; 3091 cAgent.ControlFlags = (uint)m_AgentControlFlags;
3133 3092
3134 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) 3093 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
3135 cAgent.GodLevel = (byte)m_godlevel; 3094 cAgent.GodLevel = (byte)m_godlevel;
@@ -3199,7 +3158,8 @@ namespace OpenSim.Region.Framework.Scenes
3199 3158
3200 public void CopyFrom(AgentData cAgent) 3159 public void CopyFrom(AgentData cAgent)
3201 { 3160 {
3202 m_rootRegionHandle= cAgent.RegionHandle; 3161 m_rootRegionHandle = cAgent.RegionHandle;
3162
3203 m_callbackURI = cAgent.CallbackURI; 3163 m_callbackURI = cAgent.CallbackURI;
3204 3164
3205 m_pos = cAgent.Position; 3165 m_pos = cAgent.Position;
@@ -3217,7 +3177,7 @@ namespace OpenSim.Region.Framework.Scenes
3217 3177
3218 m_headrotation = cAgent.HeadRotation; 3178 m_headrotation = cAgent.HeadRotation;
3219 m_bodyRot = cAgent.BodyRotation; 3179 m_bodyRot = cAgent.BodyRotation;
3220 m_AgentControlFlags = cAgent.ControlFlags; 3180 m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
3221 3181
3222 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID))) 3182 if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
3223 m_godlevel = cAgent.GodLevel; 3183 m_godlevel = cAgent.GodLevel;
@@ -3291,47 +3251,18 @@ namespace OpenSim.Region.Framework.Scenes
3291 /// </summary> 3251 /// </summary>
3292 public override void UpdateMovement() 3252 public override void UpdateMovement()
3293 { 3253 {
3294 lock (m_forcesList) 3254 if (m_forceToApply.HasValue)
3295 { 3255 {
3296 if (m_forcesList.Count > 0) 3256 Vector3 force = m_forceToApply.Value;
3297 {
3298 //we are only interested in the last velocity added to the list [Although they are called forces, they are actually velocities]
3299 NewForce force = m_forcesList[m_forcesList.Count - 1];
3300 3257
3301 m_updateflag = true; 3258 m_updateflag = true;
3302 try 3259 movementvector = force;
3303 { 3260 Velocity = force;
3304 movementvector.X = force.X;
3305 movementvector.Y = force.Y;
3306 movementvector.Z = force.Z;
3307 Velocity = movementvector;
3308 }
3309 catch (NullReferenceException)
3310 {
3311 // Under extreme load, this returns a NullReference Exception that we can ignore.
3312 // Ignoring this causes no movement to be sent to the physics engine...
3313 // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
3314 }
3315 3261
3316 m_forcesList.Clear(); 3262 m_forceToApply = null;
3317 }
3318 } 3263 }
3319 } 3264 }
3320 3265
3321 static ScenePresence()
3322 {
3323 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3324 DefaultTexture = textu.GetBytes();
3325
3326 }
3327
3328 public class NewForce
3329 {
3330 public float X;
3331 public float Y;
3332 public float Z;
3333 }
3334
3335 public override void SetText(string text, Vector3 color, double alpha) 3266 public override void SetText(string text, Vector3 color, double alpha)
3336 { 3267 {
3337 throw new Exception("Can't set Text on avatar."); 3268 throw new Exception("Can't set Text on avatar.");
@@ -3342,7 +3273,6 @@ namespace OpenSim.Region.Framework.Scenes
3342 /// </summary> 3273 /// </summary>
3343 public void AddToPhysicalScene(bool isFlying) 3274 public void AddToPhysicalScene(bool isFlying)
3344 { 3275 {
3345
3346 PhysicsScene scene = m_scene.PhysicsScene; 3276 PhysicsScene scene = m_scene.PhysicsScene;
3347 3277
3348 Vector3 pVec = AbsolutePosition; 3278 Vector3 pVec = AbsolutePosition;
@@ -3388,15 +3318,48 @@ namespace OpenSim.Region.Framework.Scenes
3388 // as of this comment the interval is set in AddToPhysicalScene 3318 // as of this comment the interval is set in AddToPhysicalScene
3389 UpdateMovementAnimations(); 3319 UpdateMovementAnimations();
3390 3320
3321 CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
3322 Dictionary<uint, ContactPoint> coldata = collisionData.m_objCollisionList;
3323
3324 CollisionPlane = Vector4.UnitW;
3325
3326 if (coldata.Count != 0)
3327 {
3328 switch (m_movementAnimation)
3329 {
3330 case "STAND":
3331 case "WALK":
3332 case "RUN":
3333 case "CROUCH":
3334 case "CROUCHWALK":
3335 {
3336 ContactPoint lowest;
3337 lowest.SurfaceNormal = Vector3.Zero;
3338 lowest.Position = Vector3.Zero;
3339 lowest.Position.Z = Single.NaN;
3340
3341 foreach (ContactPoint contact in coldata.Values)
3342 {
3343 if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
3344 {
3345 lowest = contact;
3346 }
3347 }
3348
3349 CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
3350 }
3351 break;
3352 }
3353 }
3354
3391 if (m_invulnerable) 3355 if (m_invulnerable)
3392 return; 3356 return;
3393 CollisionEventUpdate collisionData = (CollisionEventUpdate)e; 3357
3394 Dictionary<uint, float> coldata = collisionData.m_objCollisionList;
3395 float starthealth = Health; 3358 float starthealth = Health;
3396 uint killerObj = 0; 3359 uint killerObj = 0;
3397 foreach (uint localid in coldata.Keys) 3360 foreach (uint localid in coldata.Keys)
3398 { 3361 {
3399 if (coldata[localid] <= 0.10f || m_invulnerable) 3362 if (coldata[localid].PenetrationDepth <= 0.10f || m_invulnerable)
3400 continue; 3363 continue;
3401 //if (localid == 0) 3364 //if (localid == 0)
3402 //continue; 3365 //continue;
@@ -3406,9 +3369,9 @@ namespace OpenSim.Region.Framework.Scenes
3406 if (part != null && part.ParentGroup.Damage != -1.0f) 3369 if (part != null && part.ParentGroup.Damage != -1.0f)
3407 Health -= part.ParentGroup.Damage; 3370 Health -= part.ParentGroup.Damage;
3408 else 3371 else
3409 Health -= coldata[localid] * 5; 3372 Health -= coldata[localid].PenetrationDepth * 5.0f;
3410 3373
3411 if (Health <= 0) 3374 if (Health <= 0.0f)
3412 { 3375 {
3413 if (localid != 0) 3376 if (localid != 0)
3414 killerObj = localid; 3377 killerObj = localid;
@@ -3471,11 +3434,6 @@ namespace OpenSim.Region.Framework.Scenes
3471 3434
3472 public ScenePresence() 3435 public ScenePresence()
3473 { 3436 {
3474 if (DefaultTexture == null)
3475 {
3476 Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
3477 DefaultTexture = textu.GetBytes();
3478 }
3479 m_sendCourseLocationsMethod = SendCoarseLocationsDefault; 3437 m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
3480 CreateSceneViewer(); 3438 CreateSceneViewer();
3481 } 3439 }
@@ -3632,19 +3590,10 @@ namespace OpenSim.Region.Framework.Scenes
3632 IgnoredControls &= ~(ScriptControlled)controls; 3590 IgnoredControls &= ~(ScriptControlled)controls;
3633 if (scriptedcontrols.ContainsKey(Script_item_UUID)) 3591 if (scriptedcontrols.ContainsKey(Script_item_UUID))
3634 scriptedcontrols.Remove(Script_item_UUID); 3592 scriptedcontrols.Remove(Script_item_UUID);
3635
3636 } 3593 }
3637 else 3594 else
3638 { 3595 {
3639 3596 scriptedcontrols[Script_item_UUID] = obj;
3640 if (scriptedcontrols.ContainsKey(Script_item_UUID))
3641 {
3642 scriptedcontrols[Script_item_UUID] = obj;
3643 }
3644 else
3645 {
3646 scriptedcontrols.Add(Script_item_UUID, obj);
3647 }
3648 } 3597 }
3649 } 3598 }
3650 ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true); 3599 ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
@@ -3662,12 +3611,14 @@ namespace OpenSim.Region.Framework.Scenes
3662 3611
3663 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) 3612 public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
3664 { 3613 {
3614 ScriptControllers takecontrols;
3615
3665 lock (scriptedcontrols) 3616 lock (scriptedcontrols)
3666 { 3617 {
3667 if (scriptedcontrols.ContainsKey(Script_item_UUID)) 3618 if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
3668 { 3619 {
3669 ScriptControllers takecontrolls = scriptedcontrols[Script_item_UUID]; 3620 ScriptControlled sctc = takecontrols.eventControls;
3670 ScriptControlled sctc = takecontrolls.eventControls; 3621
3671 ControllingClient.SendTakeControls((int)sctc, false, false); 3622 ControllingClient.SendTakeControls((int)sctc, false, false);
3672 ControllingClient.SendTakeControls((int)sctc, true, false); 3623 ControllingClient.SendTakeControls((int)sctc, true, false);
3673 3624
@@ -3678,7 +3629,6 @@ namespace OpenSim.Region.Framework.Scenes
3678 IgnoredControls |= scData.ignoreControls; 3629 IgnoredControls |= scData.ignoreControls;
3679 } 3630 }
3680 } 3631 }
3681
3682 } 3632 }
3683 } 3633 }
3684 3634
@@ -3745,9 +3695,11 @@ namespace OpenSim.Region.Framework.Scenes
3745 { 3695 {
3746 lock (scriptedcontrols) 3696 lock (scriptedcontrols)
3747 { 3697 {
3748 foreach (UUID scriptUUID in scriptedcontrols.Keys) 3698 foreach (KeyValuePair<UUID, ScriptControllers> kvp in scriptedcontrols)
3749 { 3699 {
3750 ScriptControllers scriptControlData = scriptedcontrols[scriptUUID]; 3700 UUID scriptUUID = kvp.Key;
3701 ScriptControllers scriptControlData = kvp.Value;
3702
3751 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us 3703 ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
3752 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle 3704 ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
3753 ScriptControlled localChange = localHeld ^ localLast; // the changed bits 3705 ScriptControlled localChange = localHeld ^ localLast; // the changed bits
@@ -3763,37 +3715,40 @@ namespace OpenSim.Region.Framework.Scenes
3763 LastCommands = allflags; 3715 LastCommands = allflags;
3764 } 3716 }
3765 3717
3766 internal static uint RemoveIgnoredControls(uint flags, ScriptControlled Ignored) 3718 internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
3767 { 3719 {
3768 if (Ignored == ScriptControlled.CONTROL_ZERO) 3720 if (ignored == ScriptControlled.CONTROL_ZERO)
3769 return flags; 3721 return flags;
3770 if ((Ignored & ScriptControlled.CONTROL_BACK) != 0) 3722
3771 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG); 3723 if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
3772 if ((Ignored & ScriptControlled.CONTROL_FWD) != 0) 3724 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
3773 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS); 3725 if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
3774 if ((Ignored & ScriptControlled.CONTROL_DOWN) != 0) 3726 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
3775 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG); 3727 if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
3776 if ((Ignored & ScriptControlled.CONTROL_UP) != 0) 3728 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
3777 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS); 3729 if ((ignored & ScriptControlled.CONTROL_UP) != 0)
3778 if ((Ignored & ScriptControlled.CONTROL_LEFT) != 0) 3730 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
3779 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS); 3731 if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
3780 if ((Ignored & ScriptControlled.CONTROL_RIGHT) != 0) 3732 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
3781 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG); 3733 if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
3782 if ((Ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0) 3734 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
3783 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG); 3735 if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
3784 if ((Ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0) 3736 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
3785 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS); 3737 if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
3786 if ((Ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0) 3738 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
3787 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN); 3739 if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
3788 if ((Ignored & ScriptControlled.CONTROL_LBUTTON) != 0) 3740 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
3789 flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN); 3741 if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
3790 //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS, 3742 flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
3791 //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG, 3743
3792 //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS, 3744 //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
3793 //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG, 3745 //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
3794 //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS, 3746 //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
3795 //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG, 3747 //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
3796 //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG 3748 //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
3749 //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
3750 //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
3751
3797 return flags; 3752 return flags;
3798 } 3753 }
3799 3754
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
index 19c0fea..f495022 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
@@ -219,7 +219,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
219 Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent"); 219 Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent");
220 220
221 // Accepts 0 but rejects Constants.RegionSize 221 // Accepts 0 but rejects Constants.RegionSize
222 Vector3 pos = new Vector3(0,Constants.RegionSize-1,0); 222 Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0);
223 presence.MakeRootAgent(pos,true); 223 presence.MakeRootAgent(pos,true);
224 Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent"); 224 Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent");
225 Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered"); 225 Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered");
@@ -246,7 +246,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
246 scene2.AddNewClient(testclient); 246 scene2.AddNewClient(testclient);
247 247
248 ScenePresence presence = scene.GetScenePresence(agent1); 248 ScenePresence presence = scene.GetScenePresence(agent1);
249 presence.MakeRootAgent(new Vector3(0,Constants.RegionSize-1,0), true); 249 presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true);
250 250
251 ScenePresence presence2 = scene2.GetScenePresence(agent1); 251 ScenePresence presence2 = scene2.GetScenePresence(agent1);
252 252
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs
index fbe43d6..2c5093f 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs
@@ -81,12 +81,11 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
81 y.Scale = new Vector3(0.01f,0.01f,0.01f); 81 y.Scale = new Vector3(0.01f,0.01f,0.01f);
82 y.LastOwnerID = UUID.Zero; 82 y.LastOwnerID = UUID.Zero;
83 y.GroupPosition = groupPos; 83 y.GroupPosition = groupPos;
84 y.OffsetPosition = new Vector3(0, 0, 0); 84 y.OffsetPosition = Vector3.Zero;
85 y.RotationOffset = new Quaternion(0,0,0,0); 85 y.RotationOffset = Quaternion.Identity;
86 y.Velocity = new Vector3(0, 0, 0); 86 y.Velocity = Vector3.Zero;
87 y.RotationalVelocity = new Vector3(0, 0, 0); 87 y.AngularVelocity = Vector3.Zero;
88 y.AngularVelocity = new Vector3(0, 0, 0); 88 y.Acceleration = Vector3.Zero;
89 y.Acceleration = new Vector3(0, 0, 0);
90 89
91 y.Flags = 0; 90 y.Flags = 0;
92 y.TrimPermissions(); 91 y.TrimPermissions();
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs
index e185351..a6afa5a 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs
@@ -172,8 +172,6 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
172 result |= Diff.ANGULARVELOCITY; 172 result |= Diff.ANGULARVELOCITY;
173 if (!AreVectorsEquivalent(first.OffsetPosition, second.OffsetPosition)) 173 if (!AreVectorsEquivalent(first.OffsetPosition, second.OffsetPosition))
174 result |= Diff.OFFSETPOSITION; 174 result |= Diff.OFFSETPOSITION;
175 if (!AreVectorsEquivalent(first.RotationalVelocity, second.RotationalVelocity))
176 result |= Diff.ROTATIONALVELOCITY;
177 if (!AreVectorsEquivalent(first.Scale, second.Scale)) 175 if (!AreVectorsEquivalent(first.Scale, second.Scale))
178 result |= Diff.SCALE; 176 result |= Diff.SCALE;
179 if (!AreVectorsEquivalent(first.Velocity, second.Velocity)) 177 if (!AreVectorsEquivalent(first.Velocity, second.Velocity))
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 6bfdff2..f58129d 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -52,6 +52,20 @@ namespace OpenSim.Region.Physics.Manager
52 , Absolute 52 , Absolute
53 } 53 }
54 54
55 public struct ContactPoint
56 {
57 public Vector3 Position;
58 public Vector3 SurfaceNormal;
59 public float PenetrationDepth;
60
61 public ContactPoint(Vector3 position, Vector3 surfaceNormal, float penetrationDepth)
62 {
63 Position = position;
64 SurfaceNormal = surfaceNormal;
65 PenetrationDepth = penetrationDepth;
66 }
67 }
68
55 public class CollisionEventUpdate : EventArgs 69 public class CollisionEventUpdate : EventArgs
56 { 70 {
57 // Raising the event on the object, so don't need to provide location.. further up the tree knows that info. 71 // Raising the event on the object, so don't need to provide location.. further up the tree knows that info.
@@ -59,9 +73,9 @@ namespace OpenSim.Region.Physics.Manager
59 public int m_colliderType; 73 public int m_colliderType;
60 public int m_GenericStartEnd; 74 public int m_GenericStartEnd;
61 //public uint m_LocalID; 75 //public uint m_LocalID;
62 public Dictionary<uint,float> m_objCollisionList = new Dictionary<uint,float>(); 76 public Dictionary<uint, ContactPoint> m_objCollisionList = new Dictionary<uint, ContactPoint>();
63 77
64 public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, Dictionary<uint, float> objCollisionList) 78 public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, Dictionary<uint, ContactPoint> objCollisionList)
65 { 79 {
66 m_colliderType = colliderType; 80 m_colliderType = colliderType;
67 m_GenericStartEnd = GenericStartEnd; 81 m_GenericStartEnd = GenericStartEnd;
@@ -72,8 +86,7 @@ namespace OpenSim.Region.Physics.Manager
72 { 86 {
73 m_colliderType = (int) ActorTypes.Unknown; 87 m_colliderType = (int) ActorTypes.Unknown;
74 m_GenericStartEnd = 1; 88 m_GenericStartEnd = 1;
75 // m_objCollisionList = null; 89 m_objCollisionList = new Dictionary<uint, ContactPoint>();
76 m_objCollisionList = new Dictionary<uint, float>();
77 } 90 }
78 91
79 public int collidertype 92 public int collidertype
@@ -88,16 +101,16 @@ namespace OpenSim.Region.Physics.Manager
88 set { m_GenericStartEnd = value; } 101 set { m_GenericStartEnd = value; }
89 } 102 }
90 103
91 public void addCollider(uint localID, float depth) 104 public void addCollider(uint localID, ContactPoint contact)
92 { 105 {
93 if (!m_objCollisionList.ContainsKey(localID)) 106 if (!m_objCollisionList.ContainsKey(localID))
94 { 107 {
95 m_objCollisionList.Add(localID, depth); 108 m_objCollisionList.Add(localID, contact);
96 } 109 }
97 else 110 else
98 { 111 {
99 if (m_objCollisionList[localID] < depth) 112 if (m_objCollisionList[localID].PenetrationDepth < contact.PenetrationDepth)
100 m_objCollisionList[localID] = depth; 113 m_objCollisionList[localID] = contact;
101 } 114 }
102 } 115 }
103 } 116 }
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
index bb0d18e..6d515e9 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -75,6 +75,11 @@ namespace OpenSim.Region.Physics.Manager
75 public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, 75 public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
76 Vector3 size, Quaternion rotation, bool isPhysical); 76 Vector3 size, Quaternion rotation, bool isPhysical);
77 77
78 public virtual float TimeDilation
79 {
80 get { return 1.0f; }
81 }
82
78 public virtual bool SupportsNINJAJoints 83 public virtual bool SupportsNINJAJoints
79 { 84 {
80 get { return false; } 85 get { return false; }
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index fbe1949..fded95e 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -284,9 +284,13 @@ namespace OpenSim.Region.Physics.Meshing
284 284
285 try 285 try
286 { 286 {
287 idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData); 287 OpenMetaverse.Imaging.ManagedImage unusedData;
288 OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(primShape.SculptData, out unusedData, out idata);
289 unusedData = null;
288 290
289 if (cacheSculptMaps) 291 //idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData);
292
293 if (cacheSculptMaps && idata != null)
290 { 294 {
291 try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); } 295 try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); }
292 catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); } 296 catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); }
@@ -299,12 +303,12 @@ namespace OpenSim.Region.Physics.Meshing
299 } 303 }
300 catch (IndexOutOfRangeException) 304 catch (IndexOutOfRangeException)
301 { 305 {
302 m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed"); 306 m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed");
303 return null; 307 return null;
304 } 308 }
305 catch (Exception) 309 catch (Exception ex)
306 { 310 {
307 m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed!"); 311 m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed: " + ex.Message);
308 return null; 312 return null;
309 } 313 }
310 } 314 }
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index c86bc62..1bc4a25 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -1209,11 +1209,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1209 m_requestedUpdateFrequency = 0; 1209 m_requestedUpdateFrequency = 0;
1210 m_eventsubscription = 0; 1210 m_eventsubscription = 0;
1211 } 1211 }
1212 public void AddCollisionEvent(uint CollidedWith, float depth) 1212 public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
1213 { 1213 {
1214 if (m_eventsubscription > 0) 1214 if (m_eventsubscription > 0)
1215 { 1215 {
1216 CollisionEventsThisFrame.addCollider(CollidedWith, depth); 1216 CollisionEventsThisFrame.addCollider(CollidedWith, contact);
1217 } 1217 }
1218 } 1218 }
1219 1219
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 5ff9d32..f4b502a 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -2958,11 +2958,11 @@ Console.WriteLine(" JointCreateFixed");
2958 m_eventsubscription = 0; 2958 m_eventsubscription = 0;
2959 } 2959 }
2960 2960
2961 public void AddCollisionEvent(uint CollidedWith, float depth) 2961 public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
2962 { 2962 {
2963 if (CollisionEventsThisFrame == null) 2963 if (CollisionEventsThisFrame == null)
2964 CollisionEventsThisFrame = new CollisionEventUpdate(); 2964 CollisionEventsThisFrame = new CollisionEventUpdate();
2965 CollisionEventsThisFrame.addCollider(CollidedWith,depth); 2965 CollisionEventsThisFrame.addCollider(CollidedWith, contact);
2966 } 2966 }
2967 2967
2968 public void SendCollisions() 2968 public void SendCollisions()
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 2f42646..a8e006b 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -159,6 +159,7 @@ namespace OpenSim.Region.Physics.OdePlugin
159 159
160 private float ODE_STEPSIZE = 0.020f; 160 private float ODE_STEPSIZE = 0.020f;
161 private float metersInSpace = 29.9f; 161 private float metersInSpace = 29.9f;
162 private float m_timeDilation = 1.0f;
162 163
163 public float gravityx = 0f; 164 public float gravityx = 0f;
164 public float gravityy = 0f; 165 public float gravityy = 0f;
@@ -177,8 +178,8 @@ namespace OpenSim.Region.Physics.OdePlugin
177 //private int m_returncollisions = 10; 178 //private int m_returncollisions = 10;
178 179
179 private readonly IntPtr contactgroup; 180 private readonly IntPtr contactgroup;
180 internal IntPtr LandGeom;
181 181
182 internal IntPtr LandGeom;
182 internal IntPtr WaterGeom; 183 internal IntPtr WaterGeom;
183 184
184 private float nmTerrainContactFriction = 255.0f; 185 private float nmTerrainContactFriction = 255.0f;
@@ -250,7 +251,7 @@ namespace OpenSim.Region.Physics.OdePlugin
250 private bool m_NINJA_physics_joints_enabled = false; 251 private bool m_NINJA_physics_joints_enabled = false;
251 //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>(); 252 //private Dictionary<String, IntPtr> jointpart_name_map = new Dictionary<String,IntPtr>();
252 private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>(); 253 private readonly Dictionary<String, List<PhysicsJoint>> joints_connecting_actor = new Dictionary<String, List<PhysicsJoint>>();
253 private d.ContactGeom[] contacts = new d.ContactGeom[80]; 254 private d.ContactGeom[] contacts;
254 private readonly List<PhysicsJoint> requestedJointsToBeCreated = new List<PhysicsJoint>(); // lock only briefly. accessed by external code (to request new joints) and by OdeScene.Simulate() to move those joints into pending/active 255 private readonly List<PhysicsJoint> requestedJointsToBeCreated = new List<PhysicsJoint>(); // lock only briefly. accessed by external code (to request new joints) and by OdeScene.Simulate() to move those joints into pending/active
255 private readonly List<PhysicsJoint> pendingJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene. 256 private readonly List<PhysicsJoint> pendingJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene.
256 private readonly List<PhysicsJoint> activeJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene. 257 private readonly List<PhysicsJoint> activeJoints = new List<PhysicsJoint>(); // can lock for longer. accessed only by OdeScene.
@@ -396,6 +397,8 @@ namespace OpenSim.Region.Physics.OdePlugin
396 avStandupTensor = 550000f; 397 avStandupTensor = 550000f;
397 } 398 }
398 399
400 int contactsPerCollision = 80;
401
399 if (m_config != null) 402 if (m_config != null)
400 { 403 {
401 IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"]; 404 IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"];
@@ -438,6 +441,8 @@ namespace OpenSim.Region.Physics.OdePlugin
438 avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f); 441 avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f);
439 avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true); 442 avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true);
440 443
444 contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80);
445
441 geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3); 446 geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
442 geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15); 447 geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
443 geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5); 448 geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
@@ -475,10 +480,11 @@ namespace OpenSim.Region.Physics.OdePlugin
475 480
476 m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false); 481 m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false);
477 minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f); 482 minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f);
478
479 } 483 }
480 } 484 }
481 485
486 contacts = new d.ContactGeom[contactsPerCollision];
487
482 staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)]; 488 staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)];
483 489
484 // Centeral contact friction and bounce 490 // Centeral contact friction and bounce
@@ -771,7 +777,9 @@ namespace OpenSim.Region.Physics.OdePlugin
771 777
772 lock (contacts) 778 lock (contacts)
773 { 779 {
774 count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf); 780 count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf);
781 if (count > contacts.Length)
782 m_log.Error("[PHYSICS]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length);
775 } 783 }
776 } 784 }
777 catch (SEHException) 785 catch (SEHException)
@@ -799,7 +807,7 @@ namespace OpenSim.Region.Physics.OdePlugin
799 p2 = PANull; 807 p2 = PANull;
800 } 808 }
801 809
802 float max_collision_depth = 0f; 810 ContactPoint maxDepthContact = new ContactPoint();
803 if (p1.CollisionScore + count >= float.MaxValue) 811 if (p1.CollisionScore + count >= float.MaxValue)
804 p1.CollisionScore = 0; 812 p1.CollisionScore = 0;
805 p1.CollisionScore += count; 813 p1.CollisionScore += count;
@@ -810,9 +818,17 @@ namespace OpenSim.Region.Physics.OdePlugin
810 818
811 for (int i = 0; i < count; i++) 819 for (int i = 0; i < count; i++)
812 { 820 {
821 d.ContactGeom curContact = contacts[i];
813 822
823 if (curContact.depth > maxDepthContact.PenetrationDepth)
824 {
825 maxDepthContact = new ContactPoint(
826 new Vector3(curContact.pos.X, curContact.pos.Y, curContact.pos.Z),
827 new Vector3(curContact.normal.X, curContact.normal.Y, curContact.normal.Z),
828 curContact.depth
829 );
830 }
814 831
815 max_collision_depth = (contacts[i].depth > max_collision_depth) ? contacts[i].depth : max_collision_depth;
816 //m_log.Warn("[CCOUNT]: " + count); 832 //m_log.Warn("[CCOUNT]: " + count);
817 IntPtr joint; 833 IntPtr joint;
818 // If we're colliding with terrain, use 'TerrainContact' instead of contact. 834 // If we're colliding with terrain, use 'TerrainContact' instead of contact.
@@ -829,7 +845,7 @@ namespace OpenSim.Region.Physics.OdePlugin
829 p2.CollidingObj = true; 845 p2.CollidingObj = true;
830 break; 846 break;
831 case (int)ActorTypes.Prim: 847 case (int)ActorTypes.Prim:
832 if (p2.Velocity.X > 0 || p2.Velocity.Y > 0 || p2.Velocity.Z > 0) 848 if (p2.Velocity.LengthSquared() > 0.0f)
833 p2.CollidingObj = true; 849 p2.CollidingObj = true;
834 break; 850 break;
835 case (int)ActorTypes.Unknown: 851 case (int)ActorTypes.Unknown:
@@ -845,14 +861,14 @@ namespace OpenSim.Region.Physics.OdePlugin
845 #region InterPenetration Handling - Unintended physics explosions 861 #region InterPenetration Handling - Unintended physics explosions
846# region disabled code1 862# region disabled code1
847 863
848 if (contacts[i].depth >= 0.08f) 864 if (curContact.depth >= 0.08f)
849 { 865 {
850 //This is disabled at the moment only because it needs more tweaking 866 //This is disabled at the moment only because it needs more tweaking
851 //It will eventually be uncommented 867 //It will eventually be uncommented
852 /* 868 /*
853 if (contacts[i].depth >= 1.00f) 869 if (contact.depth >= 1.00f)
854 { 870 {
855 //m_log.Debug("[PHYSICS]: " + contacts[i].depth.ToString()); 871 //m_log.Debug("[PHYSICS]: " + contact.depth.ToString());
856 } 872 }
857 873
858 //If you interpenetrate a prim with an agent 874 //If you interpenetrate a prim with an agent
@@ -862,37 +878,37 @@ namespace OpenSim.Region.Physics.OdePlugin
862 p2.PhysicsActorType == (int) ActorTypes.Prim)) 878 p2.PhysicsActorType == (int) ActorTypes.Prim))
863 { 879 {
864 880
865 //contacts[i].depth = contacts[i].depth * 4.15f; 881 //contact.depth = contact.depth * 4.15f;
866 /* 882 /*
867 if (p2.PhysicsActorType == (int) ActorTypes.Agent) 883 if (p2.PhysicsActorType == (int) ActorTypes.Agent)
868 { 884 {
869 p2.CollidingObj = true; 885 p2.CollidingObj = true;
870 contacts[i].depth = 0.003f; 886 contact.depth = 0.003f;
871 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f); 887 p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f);
872 OdeCharacter character = (OdeCharacter) p2; 888 OdeCharacter character = (OdeCharacter) p2;
873 character.SetPidStatus(true); 889 character.SetPidStatus(true);
874 contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p1.Size.X / 2), contacts[i].pos.Y + (p1.Size.Y / 2), contacts[i].pos.Z + (p1.Size.Z / 2)); 890 contact.pos = new d.Vector3(contact.pos.X + (p1.Size.X / 2), contact.pos.Y + (p1.Size.Y / 2), contact.pos.Z + (p1.Size.Z / 2));
875 891
876 } 892 }
877 else 893 else
878 { 894 {
879 895
880 //contacts[i].depth = 0.0000000f; 896 //contact.depth = 0.0000000f;
881 } 897 }
882 if (p1.PhysicsActorType == (int) ActorTypes.Agent) 898 if (p1.PhysicsActorType == (int) ActorTypes.Agent)
883 { 899 {
884 900
885 p1.CollidingObj = true; 901 p1.CollidingObj = true;
886 contacts[i].depth = 0.003f; 902 contact.depth = 0.003f;
887 p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f); 903 p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f);
888 contacts[i].pos = new d.Vector3(contacts[i].pos.X + (p2.Size.X / 2), contacts[i].pos.Y + (p2.Size.Y / 2), contacts[i].pos.Z + (p2.Size.Z / 2)); 904 contact.pos = new d.Vector3(contact.pos.X + (p2.Size.X / 2), contact.pos.Y + (p2.Size.Y / 2), contact.pos.Z + (p2.Size.Z / 2));
889 OdeCharacter character = (OdeCharacter)p1; 905 OdeCharacter character = (OdeCharacter)p1;
890 character.SetPidStatus(true); 906 character.SetPidStatus(true);
891 } 907 }
892 else 908 else
893 { 909 {
894 910
895 //contacts[i].depth = 0.0000000f; 911 //contact.depth = 0.0000000f;
896 } 912 }
897 913
898 914
@@ -917,7 +933,7 @@ namespace OpenSim.Region.Physics.OdePlugin
917 //AddPhysicsActorTaint(p2); 933 //AddPhysicsActorTaint(p2);
918 //} 934 //}
919 935
920 //if (contacts[i].depth >= 0.25f) 936 //if (contact.depth >= 0.25f)
921 //{ 937 //{
922 // Don't collide, one or both prim will expld. 938 // Don't collide, one or both prim will expld.
923 939
@@ -935,21 +951,21 @@ namespace OpenSim.Region.Physics.OdePlugin
935 //AddPhysicsActorTaint(p2); 951 //AddPhysicsActorTaint(p2);
936 //} 952 //}
937 953
938 //contacts[i].depth = contacts[i].depth / 8f; 954 //contact.depth = contact.depth / 8f;
939 //contacts[i].normal = new d.Vector3(0, 0, 1); 955 //contact.normal = new d.Vector3(0, 0, 1);
940 //} 956 //}
941 //if (op1.m_disabled || op2.m_disabled) 957 //if (op1.m_disabled || op2.m_disabled)
942 //{ 958 //{
943 //Manually disabled objects stay disabled 959 //Manually disabled objects stay disabled
944 //contacts[i].depth = 0f; 960 //contact.depth = 0f;
945 //} 961 //}
946 #endregion 962 #endregion
947 } 963 }
948 */ 964 */
949#endregion 965#endregion
950 if (contacts[i].depth >= 1.00f) 966 if (curContact.depth >= 1.00f)
951 { 967 {
952 //m_log.Info("[P]: " + contacts[i].depth.ToString()); 968 //m_log.Info("[P]: " + contact.depth.ToString());
953 if ((p2.PhysicsActorType == (int) ActorTypes.Agent && 969 if ((p2.PhysicsActorType == (int) ActorTypes.Agent &&
954 p1.PhysicsActorType == (int) ActorTypes.Unknown) || 970 p1.PhysicsActorType == (int) ActorTypes.Unknown) ||
955 (p1.PhysicsActorType == (int) ActorTypes.Agent && 971 (p1.PhysicsActorType == (int) ActorTypes.Agent &&
@@ -962,12 +978,12 @@ namespace OpenSim.Region.Physics.OdePlugin
962 OdeCharacter character = (OdeCharacter) p2; 978 OdeCharacter character = (OdeCharacter) p2;
963 979
964 //p2.CollidingObj = true; 980 //p2.CollidingObj = true;
965 contacts[i].depth = 0.00000003f; 981 curContact.depth = 0.00000003f;
966 p2.Velocity = p2.Velocity + new Vector3(0f, 0f, 0.5f); 982 p2.Velocity = p2.Velocity + new Vector3(0f, 0f, 0.5f);
967 contacts[i].pos = 983 curContact.pos =
968 new d.Vector3(contacts[i].pos.X + (p1.Size.X/2), 984 new d.Vector3(curContact.pos.X + (p1.Size.X/2),
969 contacts[i].pos.Y + (p1.Size.Y/2), 985 curContact.pos.Y + (p1.Size.Y/2),
970 contacts[i].pos.Z + (p1.Size.Z/2)); 986 curContact.pos.Z + (p1.Size.Z/2));
971 character.SetPidStatus(true); 987 character.SetPidStatus(true);
972 } 988 }
973 } 989 }
@@ -980,12 +996,12 @@ namespace OpenSim.Region.Physics.OdePlugin
980 OdeCharacter character = (OdeCharacter) p1; 996 OdeCharacter character = (OdeCharacter) p1;
981 997
982 //p2.CollidingObj = true; 998 //p2.CollidingObj = true;
983 contacts[i].depth = 0.00000003f; 999 curContact.depth = 0.00000003f;
984 p1.Velocity = p1.Velocity + new Vector3(0f, 0f, 0.5f); 1000 p1.Velocity = p1.Velocity + new Vector3(0f, 0f, 0.5f);
985 contacts[i].pos = 1001 curContact.pos =
986 new d.Vector3(contacts[i].pos.X + (p1.Size.X/2), 1002 new d.Vector3(curContact.pos.X + (p1.Size.X/2),
987 contacts[i].pos.Y + (p1.Size.Y/2), 1003 curContact.pos.Y + (p1.Size.Y/2),
988 contacts[i].pos.Z + (p1.Size.Z/2)); 1004 curContact.pos.Z + (p1.Size.Z/2));
989 character.SetPidStatus(true); 1005 character.SetPidStatus(true);
990 } 1006 }
991 } 1007 }
@@ -1007,16 +1023,15 @@ namespace OpenSim.Region.Physics.OdePlugin
1007 if (!skipThisContact && (p2 is OdePrim) && (((OdePrim)p2).m_isVolumeDetect)) 1023 if (!skipThisContact && (p2 is OdePrim) && (((OdePrim)p2).m_isVolumeDetect))
1008 skipThisContact = true; // No collision on volume detect prims 1024 skipThisContact = true; // No collision on volume detect prims
1009 1025
1010 if (!skipThisContact && contacts[i].depth < 0f) 1026 if (!skipThisContact && curContact.depth < 0f)
1011 skipThisContact = true; 1027 skipThisContact = true;
1012 1028
1013 if (!skipThisContact && checkDupe(contacts[i], p2.PhysicsActorType)) 1029 if (!skipThisContact && checkDupe(curContact, p2.PhysicsActorType))
1014 skipThisContact = true; 1030 skipThisContact = true;
1015 1031
1016 int maxContactsbeforedeath = 4000; 1032 const int maxContactsbeforedeath = 4000;
1017 joint = IntPtr.Zero; 1033 joint = IntPtr.Zero;
1018 1034
1019
1020 if (!skipThisContact) 1035 if (!skipThisContact)
1021 { 1036 {
1022 // If we're colliding against terrain 1037 // If we're colliding against terrain
@@ -1027,8 +1042,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1027 (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) 1042 (Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
1028 { 1043 {
1029 // Use the movement terrain contact 1044 // Use the movement terrain contact
1030 AvatarMovementTerrainContact.geom = contacts[i]; 1045 AvatarMovementTerrainContact.geom = curContact;
1031 _perloopContact.Add(contacts[i]); 1046 _perloopContact.Add(curContact);
1032 if (m_global_contactcount < maxContactsbeforedeath) 1047 if (m_global_contactcount < maxContactsbeforedeath)
1033 { 1048 {
1034 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact); 1049 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact);
@@ -1040,8 +1055,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1040 if (p2.PhysicsActorType == (int)ActorTypes.Agent) 1055 if (p2.PhysicsActorType == (int)ActorTypes.Agent)
1041 { 1056 {
1042 // Use the non moving terrain contact 1057 // Use the non moving terrain contact
1043 TerrainContact.geom = contacts[i]; 1058 TerrainContact.geom = curContact;
1044 _perloopContact.Add(contacts[i]); 1059 _perloopContact.Add(curContact);
1045 if (m_global_contactcount < maxContactsbeforedeath) 1060 if (m_global_contactcount < maxContactsbeforedeath)
1046 { 1061 {
1047 joint = d.JointCreateContact(world, contactgroup, ref TerrainContact); 1062 joint = d.JointCreateContact(world, contactgroup, ref TerrainContact);
@@ -1066,8 +1081,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1066 material = ((OdePrim)p2).m_material; 1081 material = ((OdePrim)p2).m_material;
1067 1082
1068 //m_log.DebugFormat("Material: {0}", material); 1083 //m_log.DebugFormat("Material: {0}", material);
1069 m_materialContacts[material, movintYN].geom = contacts[i]; 1084 m_materialContacts[material, movintYN].geom = curContact;
1070 _perloopContact.Add(contacts[i]); 1085 _perloopContact.Add(curContact);
1071 1086
1072 if (m_global_contactcount < maxContactsbeforedeath) 1087 if (m_global_contactcount < maxContactsbeforedeath)
1073 { 1088 {
@@ -1092,8 +1107,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1092 if (p2 is OdePrim) 1107 if (p2 is OdePrim)
1093 material = ((OdePrim)p2).m_material; 1108 material = ((OdePrim)p2).m_material;
1094 //m_log.DebugFormat("Material: {0}", material); 1109 //m_log.DebugFormat("Material: {0}", material);
1095 m_materialContacts[material, movintYN].geom = contacts[i]; 1110 m_materialContacts[material, movintYN].geom = curContact;
1096 _perloopContact.Add(contacts[i]); 1111 _perloopContact.Add(curContact);
1097 1112
1098 if (m_global_contactcount < maxContactsbeforedeath) 1113 if (m_global_contactcount < maxContactsbeforedeath)
1099 { 1114 {
@@ -1121,20 +1136,20 @@ namespace OpenSim.Region.Physics.OdePlugin
1121 */ 1136 */
1122 //WaterContact.surface.soft_cfm = 0.0000f; 1137 //WaterContact.surface.soft_cfm = 0.0000f;
1123 //WaterContact.surface.soft_erp = 0.00000f; 1138 //WaterContact.surface.soft_erp = 0.00000f;
1124 if (contacts[i].depth > 0.1f) 1139 if (curContact.depth > 0.1f)
1125 { 1140 {
1126 contacts[i].depth *= 52; 1141 curContact.depth *= 52;
1127 //contacts[i].normal = new d.Vector3(0, 0, 1); 1142 //contact.normal = new d.Vector3(0, 0, 1);
1128 //contacts[i].pos = new d.Vector3(0, 0, contacts[i].pos.Z - 5f); 1143 //contact.pos = new d.Vector3(0, 0, contact.pos.Z - 5f);
1129 } 1144 }
1130 WaterContact.geom = contacts[i]; 1145 WaterContact.geom = curContact;
1131 _perloopContact.Add(contacts[i]); 1146 _perloopContact.Add(curContact);
1132 if (m_global_contactcount < maxContactsbeforedeath) 1147 if (m_global_contactcount < maxContactsbeforedeath)
1133 { 1148 {
1134 joint = d.JointCreateContact(world, contactgroup, ref WaterContact); 1149 joint = d.JointCreateContact(world, contactgroup, ref WaterContact);
1135 m_global_contactcount++; 1150 m_global_contactcount++;
1136 } 1151 }
1137 //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth); 1152 //m_log.Info("[PHYSICS]: Prim Water Contact" + contact.depth);
1138 } 1153 }
1139 else 1154 else
1140 { 1155 {
@@ -1145,8 +1160,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1145 if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f)) 1160 if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
1146 { 1161 {
1147 // Use the Movement prim contact 1162 // Use the Movement prim contact
1148 AvatarMovementprimContact.geom = contacts[i]; 1163 AvatarMovementprimContact.geom = curContact;
1149 _perloopContact.Add(contacts[i]); 1164 _perloopContact.Add(curContact);
1150 if (m_global_contactcount < maxContactsbeforedeath) 1165 if (m_global_contactcount < maxContactsbeforedeath)
1151 { 1166 {
1152 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact); 1167 joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact);
@@ -1156,8 +1171,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1156 else 1171 else
1157 { 1172 {
1158 // Use the non movement contact 1173 // Use the non movement contact
1159 contact.geom = contacts[i]; 1174 contact.geom = curContact;
1160 _perloopContact.Add(contacts[i]); 1175 _perloopContact.Add(curContact);
1161 1176
1162 if (m_global_contactcount < maxContactsbeforedeath) 1177 if (m_global_contactcount < maxContactsbeforedeath)
1163 { 1178 {
@@ -1175,8 +1190,8 @@ namespace OpenSim.Region.Physics.OdePlugin
1175 material = ((OdePrim)p2).m_material; 1190 material = ((OdePrim)p2).m_material;
1176 1191
1177 //m_log.DebugFormat("Material: {0}", material); 1192 //m_log.DebugFormat("Material: {0}", material);
1178 m_materialContacts[material, 0].geom = contacts[i]; 1193 m_materialContacts[material, 0].geom = curContact;
1179 _perloopContact.Add(contacts[i]); 1194 _perloopContact.Add(curContact);
1180 1195
1181 if (m_global_contactcount < maxContactsbeforedeath) 1196 if (m_global_contactcount < maxContactsbeforedeath)
1182 { 1197 {
@@ -1194,7 +1209,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1194 } 1209 }
1195 1210
1196 } 1211 }
1197 collision_accounting_events(p1, p2, max_collision_depth); 1212 collision_accounting_events(p1, p2, maxDepthContact);
1198 if (count > geomContactPointsStartthrottle) 1213 if (count > geomContactPointsStartthrottle)
1199 { 1214 {
1200 // If there are more then 3 contact points, it's likely 1215 // If there are more then 3 contact points, it's likely
@@ -1278,7 +1293,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1278 return result; 1293 return result;
1279 } 1294 }
1280 1295
1281 private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, float collisiondepth) 1296 private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, ContactPoint contact)
1282 { 1297 {
1283 // obj1LocalID = 0; 1298 // obj1LocalID = 0;
1284 //returncollisions = false; 1299 //returncollisions = false;
@@ -1299,7 +1314,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1299 case ActorTypes.Agent: 1314 case ActorTypes.Agent:
1300 cc1 = (OdeCharacter)p1; 1315 cc1 = (OdeCharacter)p1;
1301 obj2LocalID = cc1.m_localID; 1316 obj2LocalID = cc1.m_localID;
1302 cc1.AddCollisionEvent(cc2.m_localID, collisiondepth); 1317 cc1.AddCollisionEvent(cc2.m_localID, contact);
1303 //ctype = (int)CollisionCategories.Character; 1318 //ctype = (int)CollisionCategories.Character;
1304 1319
1305 //if (cc1.CollidingObj) 1320 //if (cc1.CollidingObj)
@@ -1314,7 +1329,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1314 { 1329 {
1315 cp1 = (OdePrim) p1; 1330 cp1 = (OdePrim) p1;
1316 obj2LocalID = cp1.m_localID; 1331 obj2LocalID = cp1.m_localID;
1317 cp1.AddCollisionEvent(cc2.m_localID, collisiondepth); 1332 cp1.AddCollisionEvent(cc2.m_localID, contact);
1318 } 1333 }
1319 //ctype = (int)CollisionCategories.Geom; 1334 //ctype = (int)CollisionCategories.Geom;
1320 1335
@@ -1334,7 +1349,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1334 break; 1349 break;
1335 } 1350 }
1336 1351
1337 cc2.AddCollisionEvent(obj2LocalID, collisiondepth); 1352 cc2.AddCollisionEvent(obj2LocalID, contact);
1338 break; 1353 break;
1339 case ActorTypes.Prim: 1354 case ActorTypes.Prim:
1340 1355
@@ -1350,7 +1365,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1350 { 1365 {
1351 cc1 = (OdeCharacter) p1; 1366 cc1 = (OdeCharacter) p1;
1352 obj2LocalID = cc1.m_localID; 1367 obj2LocalID = cc1.m_localID;
1353 cc1.AddCollisionEvent(cp2.m_localID, collisiondepth); 1368 cc1.AddCollisionEvent(cp2.m_localID, contact);
1354 //ctype = (int)CollisionCategories.Character; 1369 //ctype = (int)CollisionCategories.Character;
1355 1370
1356 //if (cc1.CollidingObj) 1371 //if (cc1.CollidingObj)
@@ -1366,7 +1381,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1366 { 1381 {
1367 cp1 = (OdePrim) p1; 1382 cp1 = (OdePrim) p1;
1368 obj2LocalID = cp1.m_localID; 1383 obj2LocalID = cp1.m_localID;
1369 cp1.AddCollisionEvent(cp2.m_localID, collisiondepth); 1384 cp1.AddCollisionEvent(cp2.m_localID, contact);
1370 //ctype = (int)CollisionCategories.Geom; 1385 //ctype = (int)CollisionCategories.Geom;
1371 1386
1372 //if (cp1.CollidingObj) 1387 //if (cp1.CollidingObj)
@@ -1387,7 +1402,7 @@ namespace OpenSim.Region.Physics.OdePlugin
1387 break; 1402 break;
1388 } 1403 }
1389 1404
1390 cp2.AddCollisionEvent(obj2LocalID, collisiondepth); 1405 cp2.AddCollisionEvent(obj2LocalID, contact);
1391 } 1406 }
1392 break; 1407 break;
1393 } 1408 }
@@ -1750,6 +1765,11 @@ namespace OpenSim.Region.Physics.OdePlugin
1750 return result; 1765 return result;
1751 } 1766 }
1752 1767
1768 public override float TimeDilation
1769 {
1770 get { return m_timeDilation; }
1771 }
1772
1753 public override bool SupportsNINJAJoints 1773 public override bool SupportsNINJAJoints
1754 { 1774 {
1755 get { return m_NINJA_physics_joints_enabled; } 1775 get { return m_NINJA_physics_joints_enabled; }
@@ -2657,8 +2677,10 @@ namespace OpenSim.Region.Physics.OdePlugin
2657 2677
2658 // Figure out the Frames Per Second we're going at. 2678 // Figure out the Frames Per Second we're going at.
2659 //(step_time == 0.004f, there's 250 of those per second. Times the step time/step size 2679 //(step_time == 0.004f, there's 250 of those per second. Times the step time/step size
2660 2680
2661 fps = (step_time/ODE_STEPSIZE) * 1000; 2681 fps = (step_time / ODE_STEPSIZE) * 1000;
2682 // HACK: Using a time dilation of 1.0 to debug rubberbanding issues
2683 //m_timeDilation = Math.Min((step_time / ODE_STEPSIZE) / (0.09375f / ODE_STEPSIZE), 1.0f);
2662 2684
2663 step_time = 0.09375f; 2685 step_time = 0.09375f;
2664 2686
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs b/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs
index f8af902..e4ca635 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs
@@ -34,9 +34,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
34{ 34{
35 public interface ICompiler 35 public interface ICompiler
36 { 36 {
37 object PerformScriptCompile(string source, string asset, UUID ownerID); 37 void PerformScriptCompile(string source, string asset, UUID ownerID, out string assembly, out Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> linemap);
38 string[] GetWarnings(); 38 string[] GetWarnings();
39 Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>
40 LineMap();
41 } 39 }
42} 40}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 3849558..0ea62d7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2163,7 +2163,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2163 public LSL_Vector llGetOmega() 2163 public LSL_Vector llGetOmega()
2164 { 2164 {
2165 m_host.AddScriptLPS(1); 2165 m_host.AddScriptLPS(1);
2166 return new LSL_Vector(m_host.RotationalVelocity.X, m_host.RotationalVelocity.Y, m_host.RotationalVelocity.Z); 2166 return new LSL_Vector(m_host.AngularVelocity.X, m_host.AngularVelocity.Y, m_host.AngularVelocity.Z);
2167 } 2167 }
2168 2168
2169 public LSL_Float llGetTimeOfDay() 2169 public LSL_Float llGetTimeOfDay()
@@ -3159,7 +3159,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3159 public void llTargetOmega(LSL_Vector axis, double spinrate, double gain) 3159 public void llTargetOmega(LSL_Vector axis, double spinrate, double gain)
3160 { 3160 {
3161 m_host.AddScriptLPS(1); 3161 m_host.AddScriptLPS(1);
3162 m_host.RotationalVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate));
3163 m_host.AngularVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); 3162 m_host.AngularVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate));
3164 m_host.ScheduleTerseUpdate(); 3163 m_host.ScheduleTerseUpdate();
3165 m_host.SendTerseUpdateToAllClients(); 3164 m_host.SendTerseUpdateToAllClients();
@@ -3817,7 +3816,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3817 { 3816 {
3818 case 1: // DATA_ONLINE (0|1) 3817 case 1: // DATA_ONLINE (0|1)
3819 // TODO: implement fetching of this information 3818 // TODO: implement fetching of this information
3820 if (userProfile.CurrentAgent.AgentOnline) 3819 if (userProfile.CurrentAgent!=null && userProfile.CurrentAgent.AgentOnline)
3821 reply = "1"; 3820 reply = "1";
3822 else 3821 else
3823 reply = "0"; 3822 reply = "0";
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
index 917ca44..121159c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
@@ -113,7 +113,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
113 return; 113 return;
114 114
115 //ILease lease = (ILease)RemotingServices.GetLifetimeService(data as MarshalByRefObject); 115 //ILease lease = (ILease)RemotingServices.GetLifetimeService(data as MarshalByRefObject);
116 RemotingServices.GetLifetimeService(data as MarshalByRefObject); 116 //RemotingServices.GetLifetimeService(data as MarshalByRefObject);
117// lease.Register(m_sponser); 117// lease.Register(m_sponser);
118 118
119 MethodInfo mi = inits[api]; 119 MethodInfo mi = inits[api];
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index fe26429..3080c71 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
@@ -74,7 +74,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
74 private string FilePrefix; 74 private string FilePrefix;
75 private string ScriptEnginesPath = "ScriptEngines"; 75 private string ScriptEnginesPath = "ScriptEngines";
76 // mapping between LSL and C# line/column numbers 76 // mapping between LSL and C# line/column numbers
77 private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> m_positionMap;
78 private ICodeConverter LSL_Converter; 77 private ICodeConverter LSL_Converter;
79 78
80 private List<string> m_warnings = new List<string>(); 79 private List<string> m_warnings = new List<string>();
@@ -91,6 +90,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
91 private static UInt64 scriptCompileCounter = 0; // And a counter 90 private static UInt64 scriptCompileCounter = 0; // And a counter
92 91
93 public IScriptEngine m_scriptEngine; 92 public IScriptEngine m_scriptEngine;
93 private Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>> m_lineMaps =
94 new Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>>();
95
94 public Compiler(IScriptEngine scriptEngine) 96 public Compiler(IScriptEngine scriptEngine)
95 { 97 {
96 m_scriptEngine = scriptEngine; 98 m_scriptEngine = scriptEngine;
@@ -172,8 +174,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
172 else 174 else
173 { 175 {
174#if DEBUG 176#if DEBUG
175// m_log.Debug("[Compiler]: " + 177 // m_log.Debug("[Compiler]: " +
176// "Config OK. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is recognized as a valid language."); 178 // "Config OK. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is recognized as a valid language.");
177#endif 179#endif
178 // LANGUAGE IS IN ALLOW-LIST 180 // LANGUAGE IS IN ALLOW-LIST
179 DefaultCompileLanguage = LanguageMapping[defaultCompileLanguage]; 181 DefaultCompileLanguage = LanguageMapping[defaultCompileLanguage];
@@ -212,12 +214,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
212 catch (Exception ex) 214 catch (Exception ex)
213 { 215 {
214 m_log.Error("[Compiler]: Exception trying to create ScriptEngine directory \"" + Path.Combine(ScriptEnginesPath, 216 m_log.Error("[Compiler]: Exception trying to create ScriptEngine directory \"" + Path.Combine(ScriptEnginesPath,
215 m_scriptEngine.World.RegionInfo.RegionID.ToString())+ "\": " + ex.ToString()); 217 m_scriptEngine.World.RegionInfo.RegionID.ToString()) + "\": " + ex.ToString());
216 } 218 }
217 } 219 }
218 220
219 foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath, 221 foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath,
220 m_scriptEngine.World.RegionInfo.RegionID.ToString()),FilePrefix + "_compiled*")) 222 m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_compiled*"))
221 { 223 {
222 try 224 try
223 { 225 {
@@ -271,16 +273,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
271 /// </summary> 273 /// </summary>
272 /// <param name="Script">LSL script</param> 274 /// <param name="Script">LSL script</param>
273 /// <returns>Filename to .dll assembly</returns> 275 /// <returns>Filename to .dll assembly</returns>
274 public object PerformScriptCompile(string Script, string asset, UUID ownerUUID) 276 public void PerformScriptCompile(string Script, string asset, UUID ownerUUID,
277 out string assembly, out Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> linemap)
275 { 278 {
276 m_positionMap = null; 279 linemap = null;
277 m_warnings.Clear(); 280 m_warnings.Clear();
278 281
279 string OutFile = Path.Combine(ScriptEnginesPath, Path.Combine( 282 assembly = Path.Combine(ScriptEnginesPath, Path.Combine(
280 m_scriptEngine.World.RegionInfo.RegionID.ToString(), 283 m_scriptEngine.World.RegionInfo.RegionID.ToString(),
281 FilePrefix + "_compiled_" + asset + ".dll")); 284 FilePrefix + "_compiled_" + asset + ".dll"));
282// string OutFile = Path.Combine(ScriptEnginesPath,
283// FilePrefix + "_compiled_" + asset + ".dll");
284 285
285 if (!Directory.Exists(ScriptEnginesPath)) 286 if (!Directory.Exists(ScriptEnginesPath))
286 { 287 {
@@ -305,60 +306,63 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
305 } 306 }
306 } 307 }
307 308
308 if (Script == String.Empty) 309 // Don't recompile if we already have it
310 // Performing 3 file exists tests for every script can still be slow
311 if (File.Exists(assembly) && File.Exists(assembly + ".text") && File.Exists(assembly + ".map"))
309 { 312 {
310 if (File.Exists(OutFile)) 313 // If we have already read this linemap file, then it will be in our dictionary.
311 return OutFile; 314 // Don't build another copy of the dictionary (saves memory) and certainly
312 315 // don't keep reading the same file from disk multiple times.
313 throw new Exception("Cannot find script assembly and no script text present"); 316 if (!m_lineMaps.ContainsKey(assembly))
317 m_lineMaps[assembly] = ReadMapFile(assembly + ".map");
318 linemap = m_lineMaps[assembly];
319 return;
314 } 320 }
315 321
316 // Don't recompile if we already have it 322 if (Script == String.Empty)
317 //
318 if (File.Exists(OutFile) && File.Exists(OutFile+".text") && File.Exists(OutFile+".map"))
319 { 323 {
320 ReadMapFile(OutFile+".map"); 324 throw new Exception("Cannot find script assembly and no script text present");
321 return OutFile;
322 } 325 }
323 326
324 enumCompileType l = DefaultCompileLanguage; 327 enumCompileType language = DefaultCompileLanguage;
325 328
326 if (Script.StartsWith("//c#", true, CultureInfo.InvariantCulture)) 329 if (Script.StartsWith("//c#", true, CultureInfo.InvariantCulture))
327 l = enumCompileType.cs; 330 language = enumCompileType.cs;
328 if (Script.StartsWith("//vb", true, CultureInfo.InvariantCulture)) 331 if (Script.StartsWith("//vb", true, CultureInfo.InvariantCulture))
329 { 332 {
330 l = enumCompileType.vb; 333 language = enumCompileType.vb;
331 // We need to remove //vb, it won't compile with that 334 // We need to remove //vb, it won't compile with that
332 335
333 Script = Script.Substring(4, Script.Length - 4); 336 Script = Script.Substring(4, Script.Length - 4);
334 } 337 }
335 if (Script.StartsWith("//lsl", true, CultureInfo.InvariantCulture)) 338 if (Script.StartsWith("//lsl", true, CultureInfo.InvariantCulture))
336 l = enumCompileType.lsl; 339 language = enumCompileType.lsl;
337 340
338 if (Script.StartsWith("//js", true, CultureInfo.InvariantCulture)) 341 if (Script.StartsWith("//js", true, CultureInfo.InvariantCulture))
339 l = enumCompileType.js; 342 language = enumCompileType.js;
340 343
341 if (Script.StartsWith("//yp", true, CultureInfo.InvariantCulture)) 344 if (Script.StartsWith("//yp", true, CultureInfo.InvariantCulture))
342 l = enumCompileType.yp; 345 language = enumCompileType.yp;
343 346
344 if (!AllowedCompilers.ContainsKey(l.ToString())) 347 if (!AllowedCompilers.ContainsKey(language.ToString()))
345 { 348 {
346 // Not allowed to compile to this language! 349 // Not allowed to compile to this language!
347 string errtext = String.Empty; 350 string errtext = String.Empty;
348 errtext += "The compiler for language \"" + l.ToString() + "\" is not in list of allowed compilers. Script will not be executed!"; 351 errtext += "The compiler for language \"" + language.ToString() + "\" is not in list of allowed compilers. Script will not be executed!";
349 throw new Exception(errtext); 352 throw new Exception(errtext);
350 } 353 }
351 354
352 if (m_scriptEngine.World.Permissions.CanCompileScript(ownerUUID, (int)l) == false) { 355 if (m_scriptEngine.World.Permissions.CanCompileScript(ownerUUID, (int)language) == false)
356 {
353 // Not allowed to compile to this language! 357 // Not allowed to compile to this language!
354 string errtext = String.Empty; 358 string errtext = String.Empty;
355 errtext += ownerUUID + " is not in list of allowed users for this scripting language. Script will not be executed!"; 359 errtext += ownerUUID + " is not in list of allowed users for this scripting language. Script will not be executed!";
356 throw new Exception(errtext); 360 throw new Exception(errtext);
357 } 361 }
358 362
359 string compileScript = Script; 363 string compileScript = Script;
360 364
361 if (l == enumCompileType.lsl) 365 if (language == enumCompileType.lsl)
362 { 366 {
363 // Its LSL, convert it to C# 367 // Its LSL, convert it to C#
364 LSL_Converter = (ICodeConverter)new CSCodeGenerator(); 368 LSL_Converter = (ICodeConverter)new CSCodeGenerator();
@@ -370,16 +374,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
370 AddWarning(warning); 374 AddWarning(warning);
371 } 375 }
372 376
373 m_positionMap = ((CSCodeGenerator) LSL_Converter).PositionMap; 377 linemap = ((CSCodeGenerator)LSL_Converter).PositionMap;
378 // Write the linemap to a file and save it in our dictionary for next time.
379 m_lineMaps[assembly] = linemap;
380 WriteMapFile(assembly + ".map", linemap);
374 } 381 }
375 382
376 if (l == enumCompileType.yp) 383 if (language == enumCompileType.yp)
377 { 384 {
378 // Its YP, convert it to C# 385 // Its YP, convert it to C#
379 compileScript = YP_Converter.Convert(Script); 386 compileScript = YP_Converter.Convert(Script);
380 } 387 }
381 388
382 switch (l) 389 switch (language)
383 { 390 {
384 case enumCompileType.cs: 391 case enumCompileType.cs:
385 case enumCompileType.lsl: 392 case enumCompileType.lsl:
@@ -396,7 +403,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
396 break; 403 break;
397 } 404 }
398 405
399 return CompileFromDotNetText(compileScript, l, asset); 406 assembly = CompileFromDotNetText(compileScript, language, asset, assembly);
407 return;
400 } 408 }
401 409
402 public string[] GetWarnings() 410 public string[] GetWarnings()
@@ -468,22 +476,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
468 /// </summary> 476 /// </summary>
469 /// <param name="Script">CS script</param> 477 /// <param name="Script">CS script</param>
470 /// <returns>Filename to .dll assembly</returns> 478 /// <returns>Filename to .dll assembly</returns>
471 internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset) 479 internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset, string assembly)
472 { 480 {
473 string ext = "." + lang.ToString(); 481 string ext = "." + lang.ToString();
474 482
475 // Output assembly name 483 // Output assembly name
476 scriptCompileCounter++; 484 scriptCompileCounter++;
477 string OutFile = Path.Combine(ScriptEnginesPath, Path.Combine(
478 m_scriptEngine.World.RegionInfo.RegionID.ToString(),
479 FilePrefix + "_compiled_" + asset + ".dll"));
480 try 485 try
481 { 486 {
482 File.Delete(OutFile); 487 File.Delete(assembly);
483 } 488 }
484 catch (Exception e) // NOTLEGIT - Should be just FileIOException 489 catch (Exception e) // NOTLEGIT - Should be just FileIOException
485 { 490 {
486 throw new Exception("Unable to delete old existing "+ 491 throw new Exception("Unable to delete old existing " +
487 "script-file before writing new. Compile aborted: " + 492 "script-file before writing new. Compile aborted: " +
488 e.ToString()); 493 e.ToString());
489 } 494 }
@@ -492,7 +497,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
492 if (WriteScriptSourceToDebugFile) 497 if (WriteScriptSourceToDebugFile)
493 { 498 {
494 string srcFileName = FilePrefix + "_source_" + 499 string srcFileName = FilePrefix + "_source_" +
495 Path.GetFileNameWithoutExtension(OutFile) + ext; 500 Path.GetFileNameWithoutExtension(assembly) + ext;
496 try 501 try
497 { 502 {
498 File.WriteAllText(Path.Combine(Path.Combine( 503 File.WriteAllText(Path.Combine(Path.Combine(
@@ -502,7 +507,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
502 } 507 }
503 catch (Exception ex) //NOTLEGIT - Should be just FileIOException 508 catch (Exception ex) //NOTLEGIT - Should be just FileIOException
504 { 509 {
505 m_log.Error("[Compiler]: Exception while "+ 510 m_log.Error("[Compiler]: Exception while " +
506 "trying to write script source to file \"" + 511 "trying to write script source to file \"" +
507 srcFileName + "\": " + ex.ToString()); 512 srcFileName + "\": " + ex.ToString());
508 } 513 }
@@ -528,7 +533,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
528 } 533 }
529 534
530 parameters.GenerateExecutable = false; 535 parameters.GenerateExecutable = false;
531 parameters.OutputAssembly = OutFile; 536 parameters.OutputAssembly = assembly;
532 parameters.IncludeDebugInformation = CompileWithDebugInformation; 537 parameters.IncludeDebugInformation = CompileWithDebugInformation;
533 //parameters.WarningLevel = 1; // Should be 4? 538 //parameters.WarningLevel = 1; // Should be 4?
534 parameters.TreatWarningsAsErrors = false; 539 parameters.TreatWarningsAsErrors = false;
@@ -543,7 +548,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
543 case enumCompileType.cs: 548 case enumCompileType.cs:
544 case enumCompileType.lsl: 549 case enumCompileType.lsl:
545 bool complete = false; 550 bool complete = false;
546 bool retried = false; 551 bool retried = false;
547 do 552 do
548 { 553 {
549 lock (CScodeProvider) 554 lock (CScodeProvider)
@@ -584,7 +589,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
584 parameters, Script); 589 parameters, Script);
585 break; 590 break;
586 default: 591 default:
587 throw new Exception("Compiler is not able to recongnize "+ 592 throw new Exception("Compiler is not able to recongnize " +
588 "language type \"" + lang.ToString() + "\""); 593 "language type \"" + lang.ToString() + "\"");
589 } 594 }
590 595
@@ -609,7 +614,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
609 614
610 if (severity == "Error") 615 if (severity == "Error")
611 { 616 {
612 lslPos = FindErrorPosition(CompErr.Line, CompErr.Column); 617 lslPos = FindErrorPosition(CompErr.Line, CompErr.Column, m_lineMaps[assembly]);
613 string text = CompErr.ErrorText; 618 string text = CompErr.ErrorText;
614 619
615 // Use LSL type names 620 // Use LSL type names
@@ -635,14 +640,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
635 // the compile may not be immediately apparent. Wait a 640 // the compile may not be immediately apparent. Wait a
636 // reasonable amount of time before giving up on it. 641 // reasonable amount of time before giving up on it.
637 642
638 if (!File.Exists(OutFile)) 643 if (!File.Exists(assembly))
639 { 644 {
640 for (int i=0; i<20 && !File.Exists(OutFile); i++) 645 for (int i = 0; i < 20 && !File.Exists(assembly); i++)
641 { 646 {
642 System.Threading.Thread.Sleep(250); 647 System.Threading.Thread.Sleep(250);
643 } 648 }
644 // One final chance... 649 // One final chance...
645 if (!File.Exists(OutFile)) 650 if (!File.Exists(assembly))
646 { 651 {
647 errtext = String.Empty; 652 errtext = String.Empty;
648 errtext += "No compile error. But not able to locate compiled file."; 653 errtext += "No compile error. But not able to locate compiled file.";
@@ -650,15 +655,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
650 } 655 }
651 } 656 }
652 657
653// m_log.DebugFormat("[Compiler] Compiled new assembly "+ 658 // m_log.DebugFormat("[Compiler] Compiled new assembly "+
654// "for {0}", asset); 659 // "for {0}", asset);
655 660
656 // Because windows likes to perform exclusive locks, we simply 661 // Because windows likes to perform exclusive locks, we simply
657 // write out a textual representation of the file here 662 // write out a textual representation of the file here
658 // 663 //
659 // Read the binary file into a buffer 664 // Read the binary file into a buffer
660 // 665 //
661 FileInfo fi = new FileInfo(OutFile); 666 FileInfo fi = new FileInfo(assembly);
662 667
663 if (fi == null) 668 if (fi == null)
664 { 669 {
@@ -671,7 +676,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
671 676
672 try 677 try
673 { 678 {
674 FileStream fs = File.Open(OutFile, FileMode.Open, FileAccess.Read); 679 FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read);
675 fs.Read(data, 0, data.Length); 680 fs.Read(data, 0, data.Length);
676 fs.Close(); 681 fs.Close();
677 } 682 }
@@ -690,40 +695,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
690 695
691 Byte[] buf = enc.GetBytes(filetext); 696 Byte[] buf = enc.GetBytes(filetext);
692 697
693 FileStream sfs = File.Create(OutFile+".text"); 698 FileStream sfs = File.Create(assembly + ".text");
694 sfs.Write(buf, 0, buf.Length); 699 sfs.Write(buf, 0, buf.Length);
695 sfs.Close(); 700 sfs.Close();
696 701
697 string posmap = String.Empty; 702 return assembly;
698 if (m_positionMap != null)
699 {
700 foreach (KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>> kvp in m_positionMap)
701 {
702 KeyValuePair<int, int> k = kvp.Key;
703 KeyValuePair<int, int> v = kvp.Value;
704 posmap += String.Format("{0},{1},{2},{3}\n",
705 k.Key, k.Value, v.Key, v.Value);
706 }
707 }
708
709 buf = enc.GetBytes(posmap);
710
711 FileStream mfs = File.Create(OutFile+".map");
712 mfs.Write(buf, 0, buf.Length);
713 mfs.Close();
714
715 return OutFile;
716 }
717
718 public KeyValuePair<int, int> FindErrorPosition(int line, int col)
719 {
720 return FindErrorPosition(line, col, m_positionMap);
721 } 703 }
722 704
723 private class kvpSorter : IComparer<KeyValuePair<int,int>> 705 private class kvpSorter : IComparer<KeyValuePair<int, int>>
724 { 706 {
725 public int Compare(KeyValuePair<int,int> a, 707 public int Compare(KeyValuePair<int, int> a,
726 KeyValuePair<int,int> b) 708 KeyValuePair<int, int> b)
727 { 709 {
728 return a.Key.CompareTo(b.Key); 710 return a.Key.CompareTo(b.Key);
729 } 711 }
@@ -742,8 +724,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
742 out ret)) 724 out ret))
743 return ret; 725 return ret;
744 726
745 List<KeyValuePair<int,int>> sorted = 727 List<KeyValuePair<int, int>> sorted =
746 new List<KeyValuePair<int,int>>(positionMap.Keys); 728 new List<KeyValuePair<int, int>>(positionMap.Keys);
747 729
748 sorted.Sort(new kvpSorter()); 730 sorted.Sort(new kvpSorter());
749 731
@@ -791,32 +773,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
791 return message; 773 return message;
792 } 774 }
793 775
794 public Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> LineMap() 776
777 private static void WriteMapFile(string filename, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> linemap)
795 { 778 {
796 if (m_positionMap == null) 779 string mapstring = String.Empty;
797 return null; 780 foreach (KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>> kvp in linemap)
798 781 {
799 Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> ret = 782 KeyValuePair<int, int> k = kvp.Key;
800 new Dictionary<KeyValuePair<int,int>, KeyValuePair<int, int>>(); 783 KeyValuePair<int, int> v = kvp.Value;
801 784 mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value);
802 foreach (KeyValuePair<int, int> kvp in m_positionMap.Keys) 785 }
803 ret.Add(kvp, m_positionMap[kvp]); 786
804 787 System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
805 return ret; 788 Byte[] mapbytes = enc.GetBytes(mapstring);
789 FileStream mfs = File.Create(filename);
790 mfs.Write(mapbytes, 0, mapbytes.Length);
791 mfs.Close();
806 } 792 }
807 793
808 private void ReadMapFile(string filename) 794
795 private static Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> ReadMapFile(string filename)
809 { 796 {
797 Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> linemap;
810 try 798 try
811 { 799 {
812 StreamReader r = File.OpenText(filename); 800 StreamReader r = File.OpenText(filename);
801 linemap = new Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>();
813 802
814 m_positionMap = new Dictionary<KeyValuePair<int,int>, KeyValuePair<int, int>>();
815
816 string line; 803 string line;
817 while ((line = r.ReadLine()) != null) 804 while ((line = r.ReadLine()) != null)
818 { 805 {
819 String[] parts = line.Split(new Char[] {','}); 806 String[] parts = line.Split(new Char[] { ',' });
820 int kk = System.Convert.ToInt32(parts[0]); 807 int kk = System.Convert.ToInt32(parts[0]);
821 int kv = System.Convert.ToInt32(parts[1]); 808 int kv = System.Convert.ToInt32(parts[1]);
822 int vk = System.Convert.ToInt32(parts[2]); 809 int vk = System.Convert.ToInt32(parts[2]);
@@ -825,12 +812,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
825 KeyValuePair<int, int> k = new KeyValuePair<int, int>(kk, kv); 812 KeyValuePair<int, int> k = new KeyValuePair<int, int>(kk, kv);
826 KeyValuePair<int, int> v = new KeyValuePair<int, int>(vk, vv); 813 KeyValuePair<int, int> v = new KeyValuePair<int, int>(vk, vv);
827 814
828 m_positionMap[k] = v; 815 linemap[k] = v;
829 } 816 }
830 } 817 }
831 catch 818 catch
832 { 819 {
820 linemap = new Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>();
833 } 821 }
822 return linemap;
834 } 823 }
835 } 824 }
836} 825}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 2b858ec..549c038 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -74,27 +74,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
74 private string m_PrimName; 74 private string m_PrimName;
75 private string m_ScriptName; 75 private string m_ScriptName;
76 private string m_Assembly; 76 private string m_Assembly;
77 private int m_StartParam = 0; 77 private int m_StartParam;
78 private string m_CurrentEvent = String.Empty; 78 private string m_CurrentEvent = String.Empty;
79 private bool m_InSelfDelete = false; 79 private bool m_InSelfDelete;
80 private int m_MaxScriptQueue; 80 private int m_MaxScriptQueue;
81 private bool m_SaveState = true; 81 private bool m_SaveState = true;
82 private bool m_ShuttingDown = false; 82 private bool m_ShuttingDown;
83 private int m_ControlEventsInQueue = 0; 83 private int m_ControlEventsInQueue;
84 private int m_LastControlLevel = 0; 84 private int m_LastControlLevel;
85 private bool m_CollisionInQueue = false; 85 private bool m_CollisionInQueue;
86 private TaskInventoryItem m_thisScriptTask; 86 private TaskInventoryItem m_thisScriptTask;
87 // The following is for setting a minimum delay between events 87 // The following is for setting a minimum delay between events
88 private double m_minEventDelay = 0; 88 private double m_minEventDelay;
89 private long m_eventDelayTicks = 0; 89 private long m_eventDelayTicks;
90 private long m_nextEventTimeTicks = 0; 90 private long m_nextEventTimeTicks;
91 private bool m_startOnInit = true; 91 private bool m_startOnInit = true;
92 private UUID m_AttachedAvatar = UUID.Zero; 92 private UUID m_AttachedAvatar;
93 private StateSource m_stateSource; 93 private StateSource m_stateSource;
94 private bool m_postOnRez; 94 private bool m_postOnRez;
95 private bool m_startedFromSavedState = false; 95 private bool m_startedFromSavedState;
96 private string m_CurrentState = String.Empty; 96 private UUID m_CurrentStateHash;
97 private UUID m_RegionID = UUID.Zero; 97 private UUID m_RegionID;
98 98
99 private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> 99 private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>
100 m_LineMap; 100 m_LineMap;
@@ -252,16 +252,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
252 { 252 {
253 m_Apis[api] = am.CreateApi(api); 253 m_Apis[api] = am.CreateApi(api);
254 m_Apis[api].Initialize(engine, part, m_LocalID, itemID); 254 m_Apis[api].Initialize(engine, part, m_LocalID, itemID);
255 } 255 }
256
257 try
258 {
259 if (dom != System.AppDomain.CurrentDomain)
260 m_Script = (IScript)dom.CreateInstanceAndUnwrap(
261 Path.GetFileNameWithoutExtension(assembly),
262 "SecondLife.Script");
263 else
264 m_Script = (IScript)Assembly.Load(
265 Path.GetFileNameWithoutExtension(assembly)).CreateInstance(
266 "SecondLife.Script");
256 267
257 try
258 {
259 m_Script = (IScript)dom.CreateInstanceAndUnwrap(
260 Path.GetFileNameWithoutExtension(assembly),
261 "SecondLife.Script");
262 268
263 //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); 269 //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
264 RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); 270 //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
265// lease.Register(this); 271// lease.Register(this);
266 } 272 }
267 catch (Exception) 273 catch (Exception)
@@ -893,7 +899,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
893 899
894 string xml = ScriptSerializer.Serialize(this); 900 string xml = ScriptSerializer.Serialize(this);
895 901
896 if (m_CurrentState != xml) 902 // Compare hash of the state we just just created with the state last written to disk
903 // If the state is different, update the disk file.
904 UUID hash = UUID.Parse(Utils.MD5String(xml));
905
906 if(hash != m_CurrentStateHash)
897 { 907 {
898 try 908 try
899 { 909 {
@@ -911,7 +921,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
911 //{ 921 //{
912 // throw new Exception("Completed persistence save, but no file was created"); 922 // throw new Exception("Completed persistence save, but no file was created");
913 //} 923 //}
914 m_CurrentState = xml; 924 m_CurrentStateHash = hash;
915 } 925 }
916 } 926 }
917 927
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 7b19ce3..b0fce75 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -50,6 +50,9 @@ using OpenSim.Region.ScriptEngine.Shared.CodeTools;
50using OpenSim.Region.ScriptEngine.Shared.Instance; 50using OpenSim.Region.ScriptEngine.Shared.Instance;
51using OpenSim.Region.ScriptEngine.Interfaces; 51using OpenSim.Region.ScriptEngine.Interfaces;
52 52
53using ScriptCompileQueue = OpenSim.Framework.LocklessQueue<object[]>;
54using Parallel = OpenSim.Framework.Parallel;
55
53namespace OpenSim.Region.ScriptEngine.XEngine 56namespace OpenSim.Region.ScriptEngine.XEngine
54{ 57{
55 public class XEngine : INonSharedRegionModule, IScriptModule, IScriptEngine 58 public class XEngine : INonSharedRegionModule, IScriptModule, IScriptEngine
@@ -73,9 +76,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
73 private bool m_InitialStartup = true; 76 private bool m_InitialStartup = true;
74 private int m_ScriptFailCount; // Number of script fails since compile queue was last empty 77 private int m_ScriptFailCount; // Number of script fails since compile queue was last empty
75 private string m_ScriptErrorMessage; 78 private string m_ScriptErrorMessage;
79 private Dictionary<string, string> m_uniqueScripts = new Dictionary<string, string>();
80 private bool m_AppDomainLoading;
76 81
77// disable warning: need to keep a reference to XEngine.EventManager 82 // disable warning: need to keep a reference to XEngine.EventManager
78// alive to avoid it being garbage collected 83 // alive to avoid it being garbage collected
79#pragma warning disable 414 84#pragma warning disable 414
80 private EventManager m_EventManager; 85 private EventManager m_EventManager;
81#pragma warning restore 414 86#pragma warning restore 414
@@ -114,7 +119,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
114 private Dictionary<UUID, List<UUID> > m_DomainScripts = 119 private Dictionary<UUID, List<UUID> > m_DomainScripts =
115 new Dictionary<UUID, List<UUID> >(); 120 new Dictionary<UUID, List<UUID> >();
116 121
117 private Queue m_CompileQueue = new Queue(100); 122 private ScriptCompileQueue m_CompileQueue = new ScriptCompileQueue();
118 IWorkItemResult m_CurrentCompile = null; 123 IWorkItemResult m_CurrentCompile = null;
119 124
120 public string ScriptEngineName 125 public string ScriptEngineName
@@ -201,6 +206,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine
201 m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300); 206 m_MaxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300);
202 m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); 207 m_StackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144);
203 m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000; 208 m_SleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", 10) * 1000;
209 m_AppDomainLoading = m_ScriptConfig.GetBoolean("AppDomainLoading", true);
204 210
205 m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); 211 m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30);
206 m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false); 212 m_KillTimedOutScripts = m_ScriptConfig.GetBoolean("KillTimedOutScripts", false);
@@ -470,6 +476,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
470 if (engine != ScriptEngineName) 476 if (engine != ScriptEngineName)
471 return; 477 return;
472 478
479 // If we've seen this exact script text before, use that reference instead
480 if (m_uniqueScripts.ContainsKey(script))
481 script = m_uniqueScripts[script];
482 else
483 m_uniqueScripts[script] = script;
484
473 Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource}; 485 Object[] parms = new Object[]{localID, itemID, script, startParam, postOnRez, (StateSource)stateSource};
474 486
475 if (stateSource == (int)StateSource.ScriptedRez) 487 if (stateSource == (int)StateSource.ScriptedRez)
@@ -478,16 +490,11 @@ namespace OpenSim.Region.ScriptEngine.XEngine
478 } 490 }
479 else 491 else
480 { 492 {
481 lock (m_CompileQueue) 493 m_CompileQueue.Enqueue(parms);
482 {
483 m_CompileQueue.Enqueue(parms);
484 494
485 if (m_CurrentCompile == null) 495 if (m_CurrentCompile == null)
486 { 496 {
487 m_CurrentCompile = m_ThreadPool.QueueWorkItem( 497 m_CurrentCompile = m_ThreadPool.QueueWorkItem(DoOnRezScriptQueue, null);
488 new WorkItemCallback(this.DoOnRezScriptQueue),
489 new Object[0]);
490 }
491 } 498 }
492 } 499 }
493 } 500 }
@@ -498,50 +505,35 @@ namespace OpenSim.Region.ScriptEngine.XEngine
498 { 505 {
499 m_InitialStartup = false; 506 m_InitialStartup = false;
500 System.Threading.Thread.Sleep(15000); 507 System.Threading.Thread.Sleep(15000);
501 lock (m_CompileQueue) 508
509 if (m_CompileQueue.Count == 0)
502 { 510 {
503 if (m_CompileQueue.Count==0) 511 // No scripts on region, so won't get triggered later
504 // No scripts on region, so won't get triggered later 512 // by the queue becoming empty so we trigger it here
505 // by the queue becoming empty so we trigger it here 513 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(0, String.Empty);
506 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(0, String.Empty);
507 } 514 }
508 } 515 }
509 516
510 Object o; 517 List<object[]> compiles = new List<object[]>();
511 lock (m_CompileQueue) 518 object[] o;
519 while (m_CompileQueue.Dequeue(out o))
512 { 520 {
513 o = m_CompileQueue.Dequeue(); 521 compiles.Add(o);
514 if (o == null)
515 {
516 m_CurrentCompile = null;
517 return null;
518 }
519 } 522 }
520 523
521 DoOnRezScript(o); 524 Parallel.For(0, compiles.Count, delegate(int i) { DoOnRezScript(compiles[i]); });
525
526 m_CurrentCompile = null;
527 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount,
528 m_ScriptErrorMessage);
529 m_ScriptFailCount = 0;
522 530
523 lock (m_CompileQueue)
524 {
525 if (m_CompileQueue.Count > 0)
526 {
527 m_CurrentCompile = m_ThreadPool.QueueWorkItem(
528 new WorkItemCallback(this.DoOnRezScriptQueue),
529 new Object[0]);
530 }
531 else
532 {
533 m_CurrentCompile = null;
534 m_Scene.EventManager.TriggerEmptyScriptCompileQueue(m_ScriptFailCount,
535 m_ScriptErrorMessage);
536 m_ScriptFailCount = 0;
537 }
538 }
539 return null; 531 return null;
540 } 532 }
541 533
542 private bool DoOnRezScript(object parm) 534 private bool DoOnRezScript(object[] parms)
543 { 535 {
544 Object[] p = (Object[])parm; 536 Object[] p = parms;
545 uint localID = (uint)p[0]; 537 uint localID = (uint)p[0];
546 UUID itemID = (UUID)p[1]; 538 UUID itemID = (UUID)p[1];
547 string script =(string)p[2]; 539 string script =(string)p[2];
@@ -590,14 +582,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine
590 { 582 {
591 lock (m_AddingAssemblies) 583 lock (m_AddingAssemblies)
592 { 584 {
593 assembly = (string)m_Compiler.PerformScriptCompile(script, 585 m_Compiler.PerformScriptCompile(script, assetID.ToString(), item.OwnerID, out assembly, out linemap);
594 assetID.ToString(), item.OwnerID);
595 if (!m_AddingAssemblies.ContainsKey(assembly)) { 586 if (!m_AddingAssemblies.ContainsKey(assembly)) {
596 m_AddingAssemblies[assembly] = 1; 587 m_AddingAssemblies[assembly] = 1;
597 } else { 588 } else {
598 m_AddingAssemblies[assembly]++; 589 m_AddingAssemblies[assembly]++;
599 } 590 }
600 linemap = m_Compiler.LineMap();
601 } 591 }
602 592
603 string[] warnings = m_Compiler.GetWarnings(); 593 string[] warnings = m_Compiler.GetWarnings();
@@ -696,19 +686,22 @@ namespace OpenSim.Region.ScriptEngine.XEngine
696 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; 686 Evidence baseEvidence = AppDomain.CurrentDomain.Evidence;
697 Evidence evidence = new Evidence(baseEvidence); 687 Evidence evidence = new Evidence(baseEvidence);
698 688
699 AppDomain sandbox = 689 AppDomain sandbox;
700 AppDomain.CreateDomain( 690 if (m_AppDomainLoading)
701 m_Scene.RegionInfo.RegionID.ToString(), 691 sandbox = AppDomain.CreateDomain(
702 evidence, appSetup); 692 m_Scene.RegionInfo.RegionID.ToString(),
703/* 693 evidence, appSetup);
704 PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel(); 694 else
705 AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition(); 695 sandbox = AppDomain.CurrentDomain;
706 PermissionSet sandboxPermissionSet = sandboxPolicy.GetNamedPermissionSet("Internet"); 696
707 PolicyStatement sandboxPolicyStatement = new PolicyStatement(sandboxPermissionSet); 697 //PolicyLevel sandboxPolicy = PolicyLevel.CreateAppDomainLevel();
708 CodeGroup sandboxCodeGroup = new UnionCodeGroup(sandboxMembershipCondition, sandboxPolicyStatement); 698 //AllMembershipCondition sandboxMembershipCondition = new AllMembershipCondition();
709 sandboxPolicy.RootCodeGroup = sandboxCodeGroup; 699 //PermissionSet sandboxPermissionSet = sandboxPolicy.GetNamedPermissionSet("Internet");
710 sandbox.SetAppDomainPolicy(sandboxPolicy); 700 //PolicyStatement sandboxPolicyStatement = new PolicyStatement(sandboxPermissionSet);
711*/ 701 //CodeGroup sandboxCodeGroup = new UnionCodeGroup(sandboxMembershipCondition, sandboxPolicyStatement);
702 //sandboxPolicy.RootCodeGroup = sandboxCodeGroup;
703 //sandbox.SetAppDomainPolicy(sandboxPolicy);
704
712 m_AppDomains[appDomain] = sandbox; 705 m_AppDomains[appDomain] = sandbox;
713 706
714 m_AppDomains[appDomain].AssemblyResolve += 707 m_AppDomains[appDomain].AssemblyResolve +=
@@ -905,9 +898,10 @@ namespace OpenSim.Region.ScriptEngine.XEngine
905 AppDomain domain = m_AppDomains[id]; 898 AppDomain domain = m_AppDomains[id];
906 m_AppDomains.Remove(id); 899 m_AppDomains.Remove(id);
907 900
908 AppDomain.Unload(domain); 901 if (domain != AppDomain.CurrentDomain)
902 AppDomain.Unload(domain);
909 domain = null; 903 domain = null;
910// m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString()); 904 // m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString());
911 } 905 }
912 } 906 }
913 907
diff --git a/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs b/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs
index 7926efb..c2ad9db 100644
--- a/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Authorization/AuthorizationServiceConnector.cs
@@ -105,10 +105,14 @@ namespace OpenSim.Services.Connectors
105 catch (Exception e) 105 catch (Exception e)
106 { 106 {
107 m_log.WarnFormat("[AUTHORIZATION CONNECTOR]: Unable to send authorize {0} for region {1} error thrown during comms with remote server. Reason: {2}", userID, regionID, e.Message); 107 m_log.WarnFormat("[AUTHORIZATION CONNECTOR]: Unable to send authorize {0} for region {1} error thrown during comms with remote server. Reason: {2}", userID, regionID, e.Message);
108 message=""; 108 message = "";
109 return m_ResponseOnFailure;
110 }
111 if (response == null)
112 {
113 message = "Null response";
109 return m_ResponseOnFailure; 114 return m_ResponseOnFailure;
110 } 115 }
111
112 m_log.DebugFormat("[AUTHORIZATION CONNECTOR] response from remote service was {0}", response.Message); 116 m_log.DebugFormat("[AUTHORIZATION CONNECTOR] response from remote service was {0}", response.Message);
113 message = response.Message; 117 message = response.Message;
114 118
diff --git a/OpenSim/TestSuite/PhysicsBot.cs b/OpenSim/TestSuite/PhysicsBot.cs
index 9c9c1ea..fac4275 100644
--- a/OpenSim/TestSuite/PhysicsBot.cs
+++ b/OpenSim/TestSuite/PhysicsBot.cs
@@ -130,9 +130,9 @@ namespace OpenSim.TestSuite
130 public void startup() 130 public void startup()
131 { 131 {
132 client.Settings.LOGIN_SERVER = loginURI; 132 client.Settings.LOGIN_SERVER = loginURI;
133 client.Network.OnConnected += new NetworkManager.ConnectedCallback(this.Network_OnConnected); 133 client.Network.LoginProgress += this.Network_LoginProgress;
134 client.Network.OnSimConnected += new NetworkManager.SimConnectedCallback(this.Network_OnConnected); 134 client.Network.SimConnected += this.Network_SimConnected;
135 client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(this.Network_OnDisconnected); 135 client.Network.Disconnected += this.Network_OnDisconnected;
136 if (client.Network.Login(firstname, lastname, password, "pCampBot", "Your name")) 136 if (client.Network.Login(firstname, lastname, password, "pCampBot", "Your name"))
137 { 137 {
138 138
@@ -155,19 +155,22 @@ namespace OpenSim.TestSuite
155 } 155 }
156 } 156 }
157 157
158 public void Network_OnConnected(object sender) 158 public void Network_LoginProgress(object sender, LoginProgressEventArgs args)
159 { 159 {
160 if (OnConnected != null) 160 if (args.Status == LoginStatus.Success)
161 { 161 {
162 OnConnected(this, EventType.CONNECTED); 162 if (OnConnected != null)
163 {
164 OnConnected(this, EventType.CONNECTED);
165 }
163 } 166 }
164 } 167 }
165 168
166 public void Simulator_Connected(object sender) 169 public void Network_SimConnected(object sender, SimConnectedEventArgs args)
167 { 170 {
168 } 171 }
169 172
170 public void Network_OnDisconnected(NetworkManager.DisconnectType reason, string message) 173 public void Network_OnDisconnected(object sender, DisconnectedEventArgs args)
171 { 174 {
172 if (OnDisconnected != null) 175 if (OnDisconnected != null)
173 { 176 {
diff --git a/OpenSim/Tools/pCampBot/PhysicsBot.cs b/OpenSim/Tools/pCampBot/PhysicsBot.cs
index 38986a2..5d4af31 100644
--- a/OpenSim/Tools/pCampBot/PhysicsBot.cs
+++ b/OpenSim/Tools/pCampBot/PhysicsBot.cs
@@ -151,9 +151,9 @@ namespace pCampBot
151 client.Throttle.Texture = 100000; 151 client.Throttle.Texture = 100000;
152 client.Throttle.Wind = 100000; 152 client.Throttle.Wind = 100000;
153 client.Throttle.Total = 400000; 153 client.Throttle.Total = 400000;
154 client.Network.OnConnected += new NetworkManager.ConnectedCallback(this.Network_OnConnected); 154 client.Network.LoginProgress += this.Network_LoginProgress;
155 client.Network.OnSimConnected += new NetworkManager.SimConnectedCallback(this.Network_OnConnected); 155 client.Network.SimConnected += this.Network_SimConnected;
156 client.Network.OnDisconnected += new NetworkManager.DisconnectedCallback(this.Network_OnDisconnected); 156 client.Network.Disconnected += this.Network_OnDisconnected;
157 client.Objects.ObjectUpdate += Objects_NewPrim; 157 client.Objects.ObjectUpdate += Objects_NewPrim;
158 //client.Assets.OnAssetReceived += Asset_ReceivedCallback; 158 //client.Assets.OnAssetReceived += Asset_ReceivedCallback;
159 if (client.Network.Login(firstname, lastname, password, "pCampBot", "Your name")) 159 if (client.Network.Login(firstname, lastname, password, "pCampBot", "Your name"))
@@ -349,19 +349,22 @@ namespace pCampBot
349 return clothfolder; 349 return clothfolder;
350 } 350 }
351 351
352 public void Network_OnConnected(object sender) 352 public void Network_LoginProgress(object sender, LoginProgressEventArgs args)
353 { 353 {
354 if (OnConnected != null) 354 if (args.Status == LoginStatus.Success)
355 { 355 {
356 OnConnected(this, EventType.CONNECTED); 356 if (OnConnected != null)
357 {
358 OnConnected(this, EventType.CONNECTED);
359 }
357 } 360 }
358 } 361 }
359 362
360 public void Simulator_Connected(object sender) 363 public void Network_SimConnected(object sender, SimConnectedEventArgs args)
361 { 364 {
362 } 365 }
363 366
364 public void Network_OnDisconnected(NetworkManager.DisconnectType reason, string message) 367 public void Network_OnDisconnected(object sender, DisconnectedEventArgs args)
365 { 368 {
366 if (OnDisconnected != null) 369 if (OnDisconnected != null)
367 { 370 {