diff --git a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
index f4e1db4cdb..3c7727f738 100644
--- a/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
+++ b/OpenSim/ApplicationPlugins/RemoteController/RemoteAdminPlugin.cs
@@ -360,7 +360,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
&& ((string) requestData["shutdown"] == "delayed")
&& requestData.ContainsKey("milliseconds"))
{
- timeout = (Int32) requestData["milliseconds"];
+ timeout = Int32.Parse(requestData["milliseconds"].ToString());
message
= "Region is going down in " + ((int) (timeout/1000)).ToString()
diff --git a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
index bb9b62315e..8739ce5e52 100644
--- a/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
+++ b/OpenSim/Client/Linden/LLStandaloneLoginModule.cs
@@ -231,6 +231,10 @@ namespace OpenSim.Client.Linden
{
return scene.RegionInfo;
}
+ else if (m_scenes.Count > 0)
+ {
+ return m_scenes[0].RegionInfo;
+ }
return null;
}
diff --git a/OpenSim/Client/MXP/MXPModule.cs b/OpenSim/Client/MXP/MXPModule.cs
index a6b039656c..0b442cca15 100644
--- a/OpenSim/Client/MXP/MXPModule.cs
+++ b/OpenSim/Client/MXP/MXPModule.cs
@@ -110,8 +110,11 @@ namespace OpenSim.Client.MXP
public void Close()
{
m_shutdown = true;
- lock (m_ticker)
- m_ticker.Stop();
+ if (m_ticker != null)
+ {
+ lock (m_ticker)
+ m_ticker.Stop();
+ }
}
public string Name
diff --git a/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs b/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs
index 0e21880abd..93e48cd8ce 100644
--- a/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs
+++ b/OpenSim/Data/MSSQL/AutoClosingSqlCommand.cs
@@ -197,11 +197,20 @@ namespace OpenSim.Data.MSSQL
public void Dispose()
{
SqlConnection conn = realCommand.Connection;
- try { realCommand.Dispose(); }
+ try
+ {
+ realCommand.Dispose();
+ }
finally
{
- try { conn.Dispose(); }
- finally { }
+ try
+ {
+ conn.Close();
+ }
+ finally
+ {
+ conn.Dispose();
+ }
}
}
diff --git a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
index d49c2b304e..1482184402 100644
--- a/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLInventoryData.cs
@@ -348,6 +348,8 @@ namespace OpenSim.Data.MSSQL
//Delete the actual row
DeleteOneFolder(folderID, connection);
DeleteItemsInFolder(folderID, connection);
+
+ connection.Close();
}
}
diff --git a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
index cff6b00042..6371307fa2 100644
--- a/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
+++ b/OpenSim/Data/MSSQL/MSSQLLegacyRegionData.cs
@@ -1049,7 +1049,7 @@ VALUES
if (!(primRow["ParticleSystem"] is DBNull))
prim.ParticleSystem = (Byte[])primRow["ParticleSystem"];
- prim.RotationalVelocity = new Vector3(
+ prim.AngularVelocity = new Vector3(
Convert.ToSingle(primRow["OmegaX"]),
Convert.ToSingle(primRow["OmegaY"]),
Convert.ToSingle(primRow["OmegaZ"]));
@@ -1429,9 +1429,9 @@ VALUES
parameters.Add(_Database.CreateParameter("TextureAnimation", prim.TextureAnimation));
parameters.Add(_Database.CreateParameter("ParticleSystem", prim.ParticleSystem));
- parameters.Add(_Database.CreateParameter("OmegaX", prim.RotationalVelocity.X));
- parameters.Add(_Database.CreateParameter("OmegaY", prim.RotationalVelocity.Y));
- parameters.Add(_Database.CreateParameter("OmegaZ", prim.RotationalVelocity.Z));
+ parameters.Add(_Database.CreateParameter("OmegaX", prim.AngularVelocity.X));
+ parameters.Add(_Database.CreateParameter("OmegaY", prim.AngularVelocity.Y));
+ parameters.Add(_Database.CreateParameter("OmegaZ", prim.AngularVelocity.Z));
parameters.Add(_Database.CreateParameter("CameraEyeOffsetX", prim.GetCameraEyeOffset().X));
parameters.Add(_Database.CreateParameter("CameraEyeOffsetY", prim.GetCameraEyeOffset().Y));
diff --git a/OpenSim/Data/MSSQL/MSSQLManager.cs b/OpenSim/Data/MSSQL/MSSQLManager.cs
index 992ce023d6..3d7a76882f 100644
--- a/OpenSim/Data/MSSQL/MSSQLManager.cs
+++ b/OpenSim/Data/MSSQL/MSSQLManager.cs
@@ -340,6 +340,8 @@ namespace OpenSim.Data.MSSQL
MSSQLMigration migration = new MSSQLMigration(connection, assem, migrationStore);
migration.Update();
+
+ connection.Close();
}
}
@@ -383,7 +385,9 @@ namespace OpenSim.Data.MSSQL
m_log.Error(e.ToString());
}
}
+ tables.Close();
}
+
}
///
diff --git a/OpenSim/Data/MSSQL/MSSQLMigration.cs b/OpenSim/Data/MSSQL/MSSQLMigration.cs
index 549bcb33bb..aea31c9eaa 100644
--- a/OpenSim/Data/MSSQL/MSSQLMigration.cs
+++ b/OpenSim/Data/MSSQL/MSSQLMigration.cs
@@ -56,6 +56,7 @@ namespace OpenSim.Data.MSSQL
{
version = Convert.ToInt32(reader["version"]);
}
+ reader.Close();
}
}
catch
diff --git a/OpenSim/Data/Migration.cs b/OpenSim/Data/Migration.cs
index 7a99d4a827..e51dc22d94 100644
--- a/OpenSim/Data/Migration.cs
+++ b/OpenSim/Data/Migration.cs
@@ -131,26 +131,25 @@ namespace OpenSim.Data
m_log.InfoFormat("[MIGRATIONS] Upgrading {0} to latest revision.", _type);
m_log.Info("[MIGRATIONS] NOTE: this may take a while, don't interupt this process!");
- using (DbCommand cmd = _conn.CreateCommand())
+ DbCommand cmd = _conn.CreateCommand();
+ foreach (KeyValuePair kvp in migrations)
{
- foreach (KeyValuePair kvp in migrations)
- {
- int newversion = kvp.Key;
- cmd.CommandText = kvp.Value;
- // we need to up the command timeout to infinite as we might be doing long migrations.
- cmd.CommandTimeout = 0;
- cmd.ExecuteNonQuery();
+ int newversion = kvp.Key;
+ cmd.CommandText = kvp.Value;
+ // we need to up the command timeout to infinite as we might be doing long migrations.
+ cmd.CommandTimeout = 0;
+ cmd.ExecuteNonQuery();
- if (version == 0)
- {
- InsertVersion(_type, newversion);
- }
- else
- {
- UpdateVersion(_type, newversion);
- }
- version = newversion;
+ if (version == 0)
+ {
+ InsertVersion(_type, newversion);
}
+ else
+ {
+ UpdateVersion(_type, newversion);
+ }
+ version = newversion;
+ cmd.Dispose();
}
}
@@ -190,45 +189,43 @@ namespace OpenSim.Data
protected virtual int FindVersion(DbConnection conn, string type)
{
int version = 0;
-
- using (DbCommand cmd = conn.CreateCommand())
+ DbCommand cmd = conn.CreateCommand();
+ try
{
- try
+ cmd.CommandText = "select version from migrations where name='" + type +"' order by version desc";
+ using (IDataReader reader = cmd.ExecuteReader())
{
- cmd.CommandText = "select version from migrations where name='" + type + "' order by version desc";
- using (IDataReader reader = cmd.ExecuteReader())
+ if (reader.Read())
{
- if (reader.Read())
- version = Convert.ToInt32(reader["version"]);
+ version = Convert.ToInt32(reader["version"]);
}
- }
- catch
- {
- // Something went wrong, so we're version 0
+ reader.Close();
}
}
-
+ catch
+ {
+ // Something went wrong, so we're version 0
+ }
+ cmd.Dispose();
return version;
}
private void InsertVersion(string type, int version)
{
- using (DbCommand cmd = _conn.CreateCommand())
- {
- cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")";
- m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version);
- cmd.ExecuteNonQuery();
- }
+ DbCommand cmd = _conn.CreateCommand();
+ cmd.CommandText = "insert into migrations(name, version) values('" + type + "', " + version + ")";
+ m_log.InfoFormat("[MIGRATIONS]: Creating {0} at version {1}", type, version);
+ cmd.ExecuteNonQuery();
+ cmd.Dispose();
}
private void UpdateVersion(string type, int version)
{
- using (DbCommand cmd = _conn.CreateCommand())
- {
- cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'";
- m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version);
- cmd.ExecuteNonQuery();
- }
+ DbCommand cmd = _conn.CreateCommand();
+ cmd.CommandText = "update migrations set version=" + version + " where name='" + type + "'";
+ m_log.InfoFormat("[MIGRATIONS]: Updating {0} to version {1}", type, version);
+ cmd.ExecuteNonQuery();
+ cmd.Dispose();
}
// private SortedList GetAllMigrations()
diff --git a/OpenSim/Data/MySQL/MySQLAssetData.cs b/OpenSim/Data/MySQL/MySQLAssetData.cs
index 4d49733350..1fe6d2953d 100644
--- a/OpenSim/Data/MySQL/MySQLAssetData.cs
+++ b/OpenSim/Data/MySQL/MySQLAssetData.cs
@@ -139,42 +139,45 @@ namespace OpenSim.Data.MySQL
{
_dbConnection.CheckConnection();
- using (MySqlCommand cmd = new MySqlCommand(
- "SELECT name, description, assetType, local, temporary, data FROM assets WHERE id=?id",
- _dbConnection.Connection))
+ MySqlCommand cmd =
+ new MySqlCommand(
+ "SELECT name, description, assetType, local, temporary, data FROM assets WHERE id=?id",
+ _dbConnection.Connection);
+ cmd.Parameters.AddWithValue("?id", assetID.ToString());
+
+ try
{
- cmd.Parameters.AddWithValue("?id", assetID.ToString());
-
- try
+ using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
- using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
+ if (dbReader.Read())
{
- if (dbReader.Read())
- {
- asset = new AssetBase();
- asset.Data = (byte[])dbReader["data"];
- asset.Description = (string)dbReader["description"];
- asset.FullID = assetID;
+ asset = new AssetBase();
+ asset.Data = (byte[]) dbReader["data"];
+ asset.Description = (string) dbReader["description"];
+ asset.FullID = assetID;
- string local = dbReader["local"].ToString();
- if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase))
- asset.Local = true;
- else
- asset.Local = false;
+ string local = dbReader["local"].ToString();
+ if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase))
+ asset.Local = true;
+ else
+ asset.Local = false;
- asset.Name = (string)dbReader["name"];
- asset.Type = (sbyte)dbReader["assetType"];
- asset.Temporary = Convert.ToBoolean(dbReader["temporary"]);
- }
+ asset.Name = (string) dbReader["name"];
+ asset.Type = (sbyte) dbReader["assetType"];
+ asset.Temporary = Convert.ToBoolean(dbReader["temporary"]);
}
+ dbReader.Close();
+ cmd.Dispose();
}
- catch (Exception e)
- {
- m_log.ErrorFormat(
- "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString()
- + Environment.NewLine + "Reconnecting", assetID);
- _dbConnection.Reconnect();
- }
+ if (asset != null)
+ UpdateAccessTime(asset);
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat(
+ "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString()
+ + Environment.NewLine + "Reconnecting", assetID);
+ _dbConnection.Reconnect();
}
}
return asset;
@@ -291,27 +294,32 @@ namespace OpenSim.Data.MySQL
{
_dbConnection.CheckConnection();
- using (MySqlCommand cmd = new MySqlCommand(
- "SELECT id FROM assets WHERE id=?id",
- _dbConnection.Connection))
- {
- cmd.Parameters.AddWithValue("?id", uuid.ToString());
+ MySqlCommand cmd =
+ new MySqlCommand(
+ "SELECT id FROM assets WHERE id=?id",
+ _dbConnection.Connection);
- try
+ cmd.Parameters.AddWithValue("?id", uuid.ToString());
+
+ try
+ {
+ using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
- using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
+ if (dbReader.Read())
{
- if (dbReader.Read())
- assetExists = true;
+ assetExists = true;
}
+
+ dbReader.Close();
+ cmd.Dispose();
}
- catch (Exception e)
- {
- m_log.ErrorFormat(
- "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString()
- + Environment.NewLine + "Attempting reconnection", uuid);
- _dbConnection.Reconnect();
- }
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat(
+ "[ASSETS DB]: MySql failure fetching asset {0}" + Environment.NewLine + e.ToString()
+ + Environment.NewLine + "Attempting reconnection", uuid);
+ _dbConnection.Reconnect();
}
}
diff --git a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
index 0780936d9c..e508b5285b 100644
--- a/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
+++ b/OpenSim/Data/MySQL/MySQLAuthenticationData.cs
@@ -55,7 +55,9 @@ namespace OpenSim.Data.MySQL
AuthenticationData ret = new AuthenticationData();
ret.Data = new Dictionary();
- MySqlCommand cmd = new MySqlCommand("select * from `" + m_Realm + "` where UUID = ?principalID");
+ MySqlCommand cmd = new MySqlCommand(
+ "select * from `"+m_Realm+"` where UUID = ?principalID"
+ );
cmd.Parameters.AddWithValue("?principalID", principalID.ToString());
@@ -82,14 +84,16 @@ namespace OpenSim.Data.MySQL
ret.Data[s] = result[s].ToString();
}
- CloseDBConnection(result, cmd);
+ result.Close();
+ CloseReaderCommand(cmd);
+
return ret;
}
- else
- {
- CloseDBConnection(result, cmd);
- return null;
- }
+
+ result.Close();
+ CloseReaderCommand(cmd);
+
+ return null;
}
public bool Store(AuthenticationData data)
diff --git a/OpenSim/Data/MySQL/MySQLEstateData.cs b/OpenSim/Data/MySQL/MySQLEstateData.cs
index 7166b29e8f..e8694fcd50 100644
--- a/OpenSim/Data/MySQL/MySQLEstateData.cs
+++ b/OpenSim/Data/MySQL/MySQLEstateData.cs
@@ -95,17 +95,21 @@ namespace OpenSim.Data.MySQL
protected void GetWaitTimeout()
{
- using (MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, m_connection))
+ MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect,
+ m_connection);
+
+ using (MySqlDataReader dbReader =
+ cmd.ExecuteReader(CommandBehavior.SingleRow))
{
- using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
+ if (dbReader.Read())
{
- if (dbReader.Read())
- {
- m_waitTimeout
- = Convert.ToInt32(dbReader["@@wait_timeout"]) *
- TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
- }
+ m_waitTimeout
+ = Convert.ToInt32(dbReader["@@wait_timeout"]) *
+ TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
}
+
+ dbReader.Close();
+ cmd.Dispose();
}
m_lastConnectionUse = DateTime.Now.Ticks;
@@ -143,122 +147,53 @@ namespace OpenSim.Data.MySQL
CheckConnection();
- bool migration = true;
+ MySqlCommand cmd = m_connection.CreateCommand();
- using (MySqlCommand cmd = m_connection.CreateCommand())
+ cmd.CommandText = sql;
+ cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
+
+ IDataReader r = cmd.ExecuteReader();
+
+ if (r.Read())
{
- cmd.CommandText = sql;
- cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
-
- using (IDataReader r = cmd.ExecuteReader())
+ foreach (string name in FieldList)
{
- if (r.Read())
+ if (m_FieldMap[name].GetValue(es) is bool)
{
- migration = false;
+ int v = Convert.ToInt32(r[name]);
+ if (v != 0)
+ m_FieldMap[name].SetValue(es, true);
+ else
+ m_FieldMap[name].SetValue(es, false);
+ }
+ else if (m_FieldMap[name].GetValue(es) is UUID)
+ {
+ UUID uuid = UUID.Zero;
- foreach (string name in FieldList)
- {
- if (m_FieldMap[name].GetValue(es) is bool)
- {
- int v = Convert.ToInt32(r[name]);
- if (v != 0)
- m_FieldMap[name].SetValue(es, true);
- else
- m_FieldMap[name].SetValue(es, false);
- }
- else if (m_FieldMap[name].GetValue(es) is UUID)
- {
- UUID uuid = UUID.Zero;
-
- UUID.TryParse(r[name].ToString(), out uuid);
- m_FieldMap[name].SetValue(es, uuid);
- }
- else
- {
- m_FieldMap[name].SetValue(es, r[name]);
- }
- }
+ UUID.TryParse(r[name].ToString(), out uuid);
+ m_FieldMap[name].SetValue(es, uuid);
+ }
+ else
+ {
+ m_FieldMap[name].SetValue(es, r[name]);
}
}
+ r.Close();
}
-
- if (migration)
+ else
{
// Migration case
+ //
+ r.Close();
+
List names = new List(FieldList);
names.Remove("EstateID");
sql = "insert into estate_settings (" + String.Join(",", names.ToArray()) + ") values ( ?" + String.Join(", ?", names.ToArray()) + ")";
- using (MySqlCommand cmd = m_connection.CreateCommand())
- {
- cmd.CommandText = sql;
- cmd.Parameters.Clear();
-
- foreach (string name in FieldList)
- {
- if (m_FieldMap[name].GetValue(es) is bool)
- {
- if ((bool)m_FieldMap[name].GetValue(es))
- cmd.Parameters.AddWithValue("?" + name, "1");
- else
- cmd.Parameters.AddWithValue("?" + name, "0");
- }
- else
- {
- cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
- }
- }
-
- cmd.ExecuteNonQuery();
-
- cmd.CommandText = "select LAST_INSERT_ID() as id";
- cmd.Parameters.Clear();
-
- using (IDataReader r = cmd.ExecuteReader())
- {
- r.Read();
- es.EstateID = Convert.ToUInt32(r["id"]);
- }
-
- cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)";
- cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
- cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
-
- // This will throw on dupe key
- try { cmd.ExecuteNonQuery(); }
- catch (Exception) { }
-
- // Munge and transfer the ban list
- cmd.Parameters.Clear();
- cmd.CommandText = "insert into estateban select " + es.EstateID.ToString() + ", bannedUUID, bannedIp, bannedIpHostMask, '' from regionban where regionban.regionUUID = ?UUID";
- cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
-
- try { cmd.ExecuteNonQuery(); }
- catch (Exception) { }
-
- es.Save();
- }
- }
-
- LoadBanList(es);
-
- es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
- es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
- es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
- return es;
- }
-
- public void StoreEstateSettings(EstateSettings es)
- {
- string sql = "replace into estate_settings (" + String.Join(",", FieldList) + ") values ( ?" + String.Join(", ?", FieldList) + ")";
-
- CheckConnection();
-
- using (MySqlCommand cmd = m_connection.CreateCommand())
- {
cmd.CommandText = sql;
+ cmd.Parameters.Clear();
foreach (string name in FieldList)
{
@@ -276,8 +211,83 @@ namespace OpenSim.Data.MySQL
}
cmd.ExecuteNonQuery();
+
+ cmd.CommandText = "select LAST_INSERT_ID() as id";
+ cmd.Parameters.Clear();
+
+ r = cmd.ExecuteReader();
+
+ r.Read();
+
+ es.EstateID = Convert.ToUInt32(r["id"]);
+
+ r.Close();
+
+ cmd.CommandText = "insert into estate_map values (?RegionID, ?EstateID)";
+ cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
+ cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
+
+ // This will throw on dupe key
+ try
+ {
+ cmd.ExecuteNonQuery();
+ }
+ catch (Exception)
+ {
+ }
+
+ // Munge and transfer the ban list
+ //
+ cmd.Parameters.Clear();
+ cmd.CommandText = "insert into estateban select " + es.EstateID.ToString() + ", bannedUUID, bannedIp, bannedIpHostMask, '' from regionban where regionban.regionUUID = ?UUID";
+ cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
+
+ try
+ {
+ cmd.ExecuteNonQuery();
+ }
+ catch (Exception)
+ {
+ }
+
+ es.Save();
}
+ LoadBanList(es);
+
+ es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
+ es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
+ es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
+ return es;
+ }
+
+ public void StoreEstateSettings(EstateSettings es)
+ {
+ string sql = "replace into estate_settings (" + String.Join(",", FieldList) + ") values ( ?" + String.Join(", ?", FieldList) + ")";
+
+ CheckConnection();
+
+ MySqlCommand cmd = m_connection.CreateCommand();
+
+ cmd.CommandText = sql;
+
+ foreach (string name in FieldList)
+ {
+ if (m_FieldMap[name].GetValue(es) is bool)
+ {
+ if ((bool)m_FieldMap[name].GetValue(es))
+ cmd.Parameters.AddWithValue("?" + name, "1");
+ else
+ cmd.Parameters.AddWithValue("?" + name, "0");
+ }
+ else
+ {
+ cmd.Parameters.AddWithValue("?" + name, m_FieldMap[name].GetValue(es).ToString());
+ }
+ }
+
+ cmd.ExecuteNonQuery();
+
SaveBanList(es);
SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
@@ -290,52 +300,50 @@ namespace OpenSim.Data.MySQL
CheckConnection();
- using (MySqlCommand cmd = m_connection.CreateCommand())
+ MySqlCommand cmd = m_connection.CreateCommand();
+
+ cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID";
+ cmd.Parameters.AddWithValue("?EstateID", es.EstateID);
+
+ IDataReader r = cmd.ExecuteReader();
+
+ while (r.Read())
{
- cmd.CommandText = "select bannedUUID from estateban where EstateID = ?EstateID";
- cmd.Parameters.AddWithValue("?EstateID", es.EstateID);
+ EstateBan eb = new EstateBan();
- using (IDataReader r = cmd.ExecuteReader())
- {
- while (r.Read())
- {
- EstateBan eb = new EstateBan();
+ UUID uuid = new UUID();
+ UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
- UUID uuid = new UUID();
- UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
-
- eb.BannedUserID = uuid;
- eb.BannedHostAddress = "0.0.0.0";
- eb.BannedHostIPMask = "0.0.0.0";
- es.AddBan(eb);
- }
- }
+ eb.BannedUserID = uuid;
+ eb.BannedHostAddress = "0.0.0.0";
+ eb.BannedHostIPMask = "0.0.0.0";
+ es.AddBan(eb);
}
+ r.Close();
}
private void SaveBanList(EstateSettings es)
{
CheckConnection();
- using (MySqlCommand cmd = m_connection.CreateCommand())
+ MySqlCommand cmd = m_connection.CreateCommand();
+
+ cmd.CommandText = "delete from estateban where EstateID = ?EstateID";
+ cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
+
+ cmd.ExecuteNonQuery();
+
+ cmd.Parameters.Clear();
+
+ cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )";
+
+ foreach (EstateBan b in es.EstateBans)
{
- cmd.CommandText = "delete from estateban where EstateID = ?EstateID";
cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
+ cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString());
cmd.ExecuteNonQuery();
-
cmd.Parameters.Clear();
-
- cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( ?EstateID, ?bannedUUID, '', '', '' )";
-
- foreach (EstateBan b in es.EstateBans)
- {
- cmd.Parameters.AddWithValue("?EstateID", es.EstateID.ToString());
- cmd.Parameters.AddWithValue("?bannedUUID", b.BannedUserID.ToString());
-
- cmd.ExecuteNonQuery();
- cmd.Parameters.Clear();
- }
}
}
@@ -343,25 +351,24 @@ namespace OpenSim.Data.MySQL
{
CheckConnection();
- using (MySqlCommand cmd = m_connection.CreateCommand())
+ MySqlCommand cmd = m_connection.CreateCommand();
+
+ cmd.CommandText = "delete from " + table + " where EstateID = ?EstateID";
+ cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
+
+ cmd.ExecuteNonQuery();
+
+ cmd.Parameters.Clear();
+
+ cmd.CommandText = "insert into " + table + " (EstateID, uuid) values ( ?EstateID, ?uuid )";
+
+ foreach (UUID uuid in data)
{
- cmd.CommandText = "delete from " + table + " where EstateID = ?EstateID";
cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
+ cmd.Parameters.AddWithValue("?uuid", uuid.ToString());
cmd.ExecuteNonQuery();
-
cmd.Parameters.Clear();
-
- cmd.CommandText = "insert into " + table + " (EstateID, uuid) values ( ?EstateID, ?uuid )";
-
- foreach (UUID uuid in data)
- {
- cmd.Parameters.AddWithValue("?EstateID", EstateID.ToString());
- cmd.Parameters.AddWithValue("?uuid", uuid.ToString());
-
- cmd.ExecuteNonQuery();
- cmd.Parameters.Clear();
- }
}
}
@@ -371,24 +378,23 @@ namespace OpenSim.Data.MySQL
CheckConnection();
- using (MySqlCommand cmd = m_connection.CreateCommand())
+ MySqlCommand cmd = m_connection.CreateCommand();
+
+ cmd.CommandText = "select uuid from " + table + " where EstateID = ?EstateID";
+ cmd.Parameters.AddWithValue("?EstateID", EstateID);
+
+ IDataReader r = cmd.ExecuteReader();
+
+ while (r.Read())
{
- cmd.CommandText = "select uuid from " + table + " where EstateID = ?EstateID";
- cmd.Parameters.AddWithValue("?EstateID", EstateID);
+ // EstateBan eb = new EstateBan();
- using (IDataReader r = cmd.ExecuteReader())
- {
- while (r.Read())
- {
- // EstateBan eb = new EstateBan();
+ UUID uuid = new UUID();
+ UUID.TryParse(r["uuid"].ToString(), out uuid);
- UUID uuid = new UUID();
- UUID.TryParse(r["uuid"].ToString(), out uuid);
-
- uuids.Add(uuid);
- }
- }
+ uuids.Add(uuid);
}
+ r.Close();
return uuids.ToArray();
}
diff --git a/OpenSim/Data/MySQL/MySQLFramework.cs b/OpenSim/Data/MySQL/MySQLFramework.cs
index ccd1ab0ed9..fca0ca5e8a 100644
--- a/OpenSim/Data/MySQL/MySQLFramework.cs
+++ b/OpenSim/Data/MySQL/MySQLFramework.cs
@@ -40,10 +40,6 @@ namespace OpenSim.Data.MySQL
///
public class MySqlFramework
{
- private static readonly log4net.ILog m_log =
- log4net.LogManager.GetLogger(
- System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
-
protected MySqlConnection m_Connection;
protected MySqlFramework(string connectionString)
@@ -73,11 +69,11 @@ namespace OpenSim.Data.MySQL
}
catch (MySqlException e)
{
- m_log.Error(e.Message, e);
if (errorSeen)
throw;
// This is "Server has gone away" and "Server lost"
+ //
if (e.Number == 2006 || e.Number == 2013)
{
errorSeen = true;
@@ -96,7 +92,6 @@ namespace OpenSim.Data.MySQL
}
catch (Exception e)
{
- m_log.Error(e.Message, e);
return 0;
}
}
@@ -113,11 +108,11 @@ namespace OpenSim.Data.MySQL
return cmd.ExecuteReader();
}
- protected void CloseDBConnection(IDataReader reader, MySqlCommand cmd)
+ protected void CloseReaderCommand(MySqlCommand cmd)
{
- reader.Close();
cmd.Connection.Close();
cmd.Connection.Dispose();
+ cmd.Dispose();
}
}
}
diff --git a/OpenSim/Data/MySQL/MySQLGridData.cs b/OpenSim/Data/MySQL/MySQLGridData.cs
index 38cb3b75b3..1ec26090b1 100644
--- a/OpenSim/Data/MySQL/MySQLGridData.cs
+++ b/OpenSim/Data/MySQL/MySQLGridData.cs
@@ -197,27 +197,29 @@ namespace OpenSim.Data.MySQL
param["?xmax"] = xmax.ToString();
param["?ymax"] = ymax.ToString();
- using (IDbCommand result = dbm.Manager.Query(
+ IDbCommand result =
+ dbm.Manager.Query(
"SELECT * FROM regions WHERE locX >= ?xmin AND locX <= ?xmax AND locY >= ?ymin AND locY <= ?ymax",
- param))
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ RegionProfileData row;
+
+ List rows = new List();
+
+ while ((row = dbm.Manager.readSimRow(reader)) != null)
{
- using (IDataReader reader = result.ExecuteReader())
- {
- RegionProfileData row;
-
- List rows = new List();
-
- while ((row = dbm.Manager.readSimRow(reader)) != null)
- rows.Add(row);
-
- return rows.ToArray();
- }
+ rows.Add(row);
}
+ reader.Close();
+ result.Dispose();
+
+ return rows.ToArray();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -241,27 +243,29 @@ namespace OpenSim.Data.MySQL
Dictionary param = new Dictionary();
param["?name"] = namePrefix + "%";
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT * FROM regions WHERE regionName LIKE ?name",
- param))
+ IDbCommand result =
+ dbm.Manager.Query(
+ "SELECT * FROM regions WHERE regionName LIKE ?name",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ RegionProfileData row;
+
+ List rows = new List();
+
+ while (rows.Count < maxNum && (row = dbm.Manager.readSimRow(reader)) != null)
{
- using (IDataReader reader = result.ExecuteReader())
- {
- RegionProfileData row;
-
- List rows = new List();
-
- while (rows.Count < maxNum && (row = dbm.Manager.readSimRow(reader)) != null)
- rows.Add(row);
-
- return rows;
- }
+ rows.Add(row);
}
+ reader.Close();
+ result.Dispose();
+
+ return rows;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -282,21 +286,21 @@ namespace OpenSim.Data.MySQL
try
{
Dictionary param = new Dictionary();
- param["?handle"] = handle.ToString();
+ param["?handle"] = handle.ToString();
- using (IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- RegionProfileData row = dbm.Manager.readSimRow(reader);
- return row;
- }
+ IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE regionHandle = ?handle", param);
+ IDataReader reader = result.ExecuteReader();
+
+ RegionProfileData row = dbm.Manager.readSimRow(reader);
+ reader.Close();
+ result.Dispose();
+
+ return row;
}
- }
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -317,24 +321,23 @@ namespace OpenSim.Data.MySQL
try
{
Dictionary param = new Dictionary();
- param["?uuid"] = uuid.ToString();
+ param["?uuid"] = uuid.ToString();
- using (IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE uuid = ?uuid", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- RegionProfileData row = dbm.Manager.readSimRow(reader);
- return row;
- }
+ IDbCommand result = dbm.Manager.Query("SELECT * FROM regions WHERE uuid = ?uuid", param);
+ IDataReader reader = result.ExecuteReader();
+
+ RegionProfileData row = dbm.Manager.readSimRow(reader);
+ reader.Close();
+ result.Dispose();
+
+ return row;
}
- }
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
- }
- finally
+ } finally
{
dbm.Release();
}
@@ -356,21 +359,22 @@ namespace OpenSim.Data.MySQL
// Add % because this is a like query.
param["?regionName"] = regionName + "%";
// Order by statement will return shorter matches first. Only returns one record or no record.
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT * FROM regions WHERE regionName like ?regionName order by LENGTH(regionName) asc LIMIT 1",
- param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- RegionProfileData row = dbm.Manager.readSimRow(reader);
- return row;
- }
- }
+ IDbCommand result =
+ dbm.Manager.Query(
+ "SELECT * FROM regions WHERE regionName like ?regionName order by LENGTH(regionName) asc LIMIT 1",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ RegionProfileData row = dbm.Manager.readSimRow(reader);
+ reader.Close();
+ result.Dispose();
+
+ return row;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -378,7 +382,6 @@ namespace OpenSim.Data.MySQL
dbm.Release();
}
}
-
m_log.Error("[GRID DB]: Searched for a Region Name shorter then 3 characters");
return null;
}
@@ -391,12 +394,12 @@ namespace OpenSim.Data.MySQL
override public DataResponse StoreProfile(RegionProfileData profile)
{
MySQLSuperManager dbm = GetLockedConnection();
- try
- {
+ try {
if (dbm.Manager.insertRegion(profile))
+ {
return DataResponse.RESPONSE_OK;
- else
- return DataResponse.RESPONSE_ERROR;
+ }
+ return DataResponse.RESPONSE_ERROR;
}
finally
{
@@ -414,14 +417,14 @@ namespace OpenSim.Data.MySQL
{
MySQLSuperManager dbm = GetLockedConnection();
- try
- {
+
+ try {
if (dbm.Manager.deleteRegion(uuid))
+ {
return DataResponse.RESPONSE_OK;
- else
- return DataResponse.RESPONSE_ERROR;
- }
- finally
+ }
+ return DataResponse.RESPONSE_ERROR;
+ } finally
{
dbm.Release();
}
@@ -479,26 +482,26 @@ namespace OpenSim.Data.MySQL
try
{
Dictionary param = new Dictionary();
- param["?x"] = x.ToString();
- param["?y"] = y.ToString();
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y",
- param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- ReservationData row = dbm.Manager.readReservationRow(reader);
- return row;
- }
- }
+ param["?x"] = x.ToString();
+ param["?y"] = y.ToString();
+ IDbCommand result =
+ dbm.Manager.Query(
+ "SELECT * FROM reservations WHERE resXMin <= ?x AND resXMax >= ?x AND resYMin <= ?y AND resYMax >= ?y",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ ReservationData row = dbm.Manager.readReservationRow(reader);
+ reader.Close();
+ result.Dispose();
+
+ return row;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
- }
- finally
+ } finally
{
dbm.Release();
}
diff --git a/OpenSim/Data/MySQL/MySQLInventoryData.cs b/OpenSim/Data/MySQL/MySQLInventoryData.cs
index 598971d680..0eecf06642 100644
--- a/OpenSim/Data/MySQL/MySQLInventoryData.cs
+++ b/OpenSim/Data/MySQL/MySQLInventoryData.cs
@@ -135,30 +135,30 @@ namespace OpenSim.Data.MySQL
database.CheckConnection();
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid",
- database.Connection))
+ MySqlCommand result =
+ new MySqlCommand("SELECT * FROM inventoryitems WHERE parentFolderID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", folderID.ToString());
+ MySqlDataReader reader = result.ExecuteReader();
+
+ while (reader.Read())
{
- result.Parameters.AddWithValue("?uuid", folderID.ToString());
-
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- while (reader.Read())
- {
- // A null item (because something went wrong) breaks everything in the folder
- InventoryItemBase item = readInventoryItem(reader);
- if (item != null)
- items.Add(item);
- }
-
- return items;
- }
+ // A null item (because something went wrong) breaks everything in the folder
+ InventoryItemBase item = readInventoryItem(reader);
+ if (item != null)
+ items.Add(item);
}
+
+ reader.Close();
+ result.Dispose();
+
+ return items;
}
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
}
@@ -176,28 +176,29 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand result = new MySqlCommand(
- "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid",
- database.Connection))
- {
- result.Parameters.AddWithValue("?uuid", user.ToString());
- result.Parameters.AddWithValue("?zero", UUID.Zero.ToString());
+ MySqlCommand result =
+ new MySqlCommand(
+ "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", user.ToString());
+ result.Parameters.AddWithValue("?zero", UUID.Zero.ToString());
+ MySqlDataReader reader = result.ExecuteReader();
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- List items = new List();
- while (reader.Read())
- items.Add(readInventoryFolder(reader));
+ List items = new List();
+ while (reader.Read())
+ items.Add(readInventoryFolder(reader));
- return items;
- }
- }
+
+ reader.Close();
+ result.Dispose();
+
+ return items;
}
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
}
@@ -216,38 +217,41 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand result = new MySqlCommand(
- "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid",
- database.Connection))
+ MySqlCommand result =
+ new MySqlCommand(
+ "SELECT * FROM inventoryfolders WHERE parentFolderID = ?zero AND agentID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", user.ToString());
+ result.Parameters.AddWithValue("?zero", UUID.Zero.ToString());
+
+ MySqlDataReader reader = result.ExecuteReader();
+
+ List items = new List();
+ while (reader.Read())
+ items.Add(readInventoryFolder(reader));
+
+ InventoryFolderBase rootFolder = null;
+
+ // There should only ever be one root folder for a user. However, if there's more
+ // than one we'll simply use the first one rather than failing. It would be even
+ // nicer to print some message to this effect, but this feels like it's too low a
+ // to put such a message out, and it's too minor right now to spare the time to
+ // suitably refactor.
+ if (items.Count > 0)
{
- result.Parameters.AddWithValue("?uuid", user.ToString());
- result.Parameters.AddWithValue("?zero", UUID.Zero.ToString());
-
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- List items = new List();
- while (reader.Read())
- items.Add(readInventoryFolder(reader));
-
- InventoryFolderBase rootFolder = null;
-
- // There should only ever be one root folder for a user. However, if there's more
- // than one we'll simply use the first one rather than failing. It would be even
- // nicer to print some message to this effect, but this feels like it's too low a
- // to put such a message out, and it's too minor right now to spare the time to
- // suitably refactor.
- if (items.Count > 0)
- rootFolder = items[0];
-
- return rootFolder;
- }
+ rootFolder = items[0];
}
+
+ reader.Close();
+ result.Dispose();
+
+ return rootFolder;
}
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
}
@@ -267,26 +271,27 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid",
- database.Connection))
- {
- result.Parameters.AddWithValue("?uuid", parentID.ToString());
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- List items = new List();
+ MySqlCommand result =
+ new MySqlCommand("SELECT * FROM inventoryfolders WHERE parentFolderID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", parentID.ToString());
+ MySqlDataReader reader = result.ExecuteReader();
- while (reader.Read())
- items.Add(readInventoryFolder(reader));
+ List items = new List();
- return items;
- }
- }
+ while (reader.Read())
+ items.Add(readInventoryFolder(reader));
+
+ reader.Close();
+ result.Dispose();
+
+ return items;
}
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
}
@@ -365,25 +370,25 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection))
- {
- result.Parameters.AddWithValue("?uuid", itemID.ToString());
+ MySqlCommand result =
+ new MySqlCommand("SELECT * FROM inventoryitems WHERE inventoryID = ?uuid", database.Connection);
+ result.Parameters.AddWithValue("?uuid", itemID.ToString());
+ MySqlDataReader reader = result.ExecuteReader();
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- InventoryItemBase item = null;
- if (reader.Read())
- item = readInventoryItem(reader);
+ InventoryItemBase item = null;
+ if (reader.Read())
+ item = readInventoryItem(reader);
- return item;
- }
- }
+ reader.Close();
+ result.Dispose();
+
+ return item;
}
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
return null;
}
@@ -408,7 +413,7 @@ namespace OpenSim.Data.MySQL
}
catch (Exception e)
{
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
return null;
@@ -428,25 +433,24 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection))
- {
- result.Parameters.AddWithValue("?uuid", folderID.ToString());
+ MySqlCommand result =
+ new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection);
+ result.Parameters.AddWithValue("?uuid", folderID.ToString());
+ MySqlDataReader reader = result.ExecuteReader();
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- InventoryFolderBase folder = null;
- if (reader.Read())
- folder = readInventoryFolder(reader);
+ InventoryFolderBase folder = null;
+ if (reader.Read())
+ folder = readInventoryFolder(reader);
+ reader.Close();
+ result.Dispose();
- return folder;
- }
- }
+ return folder;
}
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
}
@@ -694,73 +698,69 @@ namespace OpenSim.Data.MySQL
try
{
List folders = new List();
- Dictionary> hashtable = new Dictionary>(); ;
+ Dictionary> hashtable
+ = new Dictionary>(); ;
List parentFolder = new List();
- bool buildResultsFromHashTable = false;
-
lock (database)
{
+ MySqlCommand result;
+ MySqlDataReader reader;
+ bool buildResultsFromHashTable = false;
+
database.CheckConnection();
/* Fetch the parent folder from the database to determine the agent ID, and if
* we're querying the root of the inventory folder tree */
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid", database.Connection))
- {
- result.Parameters.AddWithValue("?uuid", parentID.ToString());
-
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- // Should be at most 1 result
- while (reader.Read())
- parentFolder.Add(readInventoryFolder(reader));
- }
- }
+ result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE folderID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", parentID.ToString());
+ reader = result.ExecuteReader();
+ while (reader.Read()) // Should be at most 1 result
+ parentFolder.Add(readInventoryFolder(reader));
+ reader.Close();
+ result.Dispose();
if (parentFolder.Count >= 1) // No result means parent folder does not exist
{
if (parentFolder[0].ParentID == UUID.Zero) // We are querying the root folder
{
/* Get all of the agent's folders from the database, put them in a list and return it */
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection))
+ result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString());
+ reader = result.ExecuteReader();
+ while (reader.Read())
{
- result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString());
-
- using (MySqlDataReader reader = result.ExecuteReader())
- {
- while (reader.Read())
- {
- InventoryFolderBase curFolder = readInventoryFolder(reader);
- if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list
- folders.Add(curFolder);
- }
- }
+ InventoryFolderBase curFolder = readInventoryFolder(reader);
+ if (curFolder.ID != parentID) // Do not need to add the root node of the tree to the list
+ folders.Add(curFolder);
}
+ reader.Close();
+ result.Dispose();
} // if we are querying the root folder
else // else we are querying a subtree of the inventory folder tree
{
/* Get all of the agent's folders from the database, put them all in a hash table
* indexed by their parent ID */
- using (MySqlCommand result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid", database.Connection))
+ result = new MySqlCommand("SELECT * FROM inventoryfolders WHERE agentID = ?uuid",
+ database.Connection);
+ result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString());
+ reader = result.ExecuteReader();
+ while (reader.Read())
{
- result.Parameters.AddWithValue("?uuid", parentFolder[0].Owner.ToString());
-
- using (MySqlDataReader reader = result.ExecuteReader())
+ InventoryFolderBase curFolder = readInventoryFolder(reader);
+ if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling
+ hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list
+ else // else current folder has no known (yet) siblings
{
- while (reader.Read())
- {
- InventoryFolderBase curFolder = readInventoryFolder(reader);
- if (hashtable.ContainsKey(curFolder.ParentID)) // Current folder already has a sibling
- hashtable[curFolder.ParentID].Add(curFolder); // append to sibling list
- else // else current folder has no known (yet) siblings
- {
- List siblingList = new List();
- siblingList.Add(curFolder);
- // Current folder has no known (yet) siblings
- hashtable.Add(curFolder.ParentID, siblingList);
- }
- } // while more items to read from the database
+ List siblingList = new List();
+ siblingList.Add(curFolder);
+ // Current folder has no known (yet) siblings
+ hashtable.Add(curFolder.ParentID, siblingList);
}
- }
+ } // while more items to read from the database
+ reader.Close();
+ result.Dispose();
// Set flag so we know we need to build the results from the hash table after
// we unlock the database
@@ -781,13 +781,12 @@ namespace OpenSim.Data.MySQL
folders.AddRange(hashtable[folders[i].ID]);
}
} // lock (database)
-
return folders;
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
}
@@ -802,18 +801,19 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection))
- {
- cmd.Parameters.AddWithValue("?uuid", folderID.ToString());
+ MySqlCommand cmd =
+ new MySqlCommand("DELETE FROM inventoryfolders WHERE folderID=?uuid", database.Connection);
+ cmd.Parameters.AddWithValue("?uuid", folderID.ToString());
- lock (database)
- cmd.ExecuteNonQuery();
+ lock (database)
+ {
+ cmd.ExecuteNonQuery();
}
}
catch (MySqlException e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
}
@@ -827,12 +827,13 @@ namespace OpenSim.Data.MySQL
{
database.CheckConnection();
- using (MySqlCommand cmd = new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection))
- {
- cmd.Parameters.AddWithValue("?uuid", folderID.ToString());
+ MySqlCommand cmd =
+ new MySqlCommand("DELETE FROM inventoryitems WHERE parentFolderID=?uuid", database.Connection);
+ cmd.Parameters.AddWithValue("?uuid", folderID.ToString());
- lock (database)
- cmd.ExecuteNonQuery();
+ lock (database)
+ {
+ cmd.ExecuteNonQuery();
}
}
catch (MySqlException e)
@@ -864,38 +865,40 @@ namespace OpenSim.Data.MySQL
public List fetchActiveGestures(UUID avatarID)
{
+ MySqlDataReader result = null;
+ MySqlCommand sqlCmd = null;
lock (database)
{
try
{
database.CheckConnection();
-
- using (MySqlCommand sqlCmd = new MySqlCommand(
+ sqlCmd = new MySqlCommand(
"SELECT * FROM inventoryitems WHERE avatarId = ?uuid AND assetType = ?type and flags = 1",
- database.Connection))
- {
- sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString());
- sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture);
+ database.Connection);
+ sqlCmd.Parameters.AddWithValue("?uuid", avatarID.ToString());
+ sqlCmd.Parameters.AddWithValue("?type", (int)AssetType.Gesture);
+ result = sqlCmd.ExecuteReader();
- using (MySqlDataReader result = sqlCmd.ExecuteReader())
- {
- List list = new List();
- while (result.Read())
- {
- InventoryItemBase item = readInventoryItem(result);
- if (item != null)
- list.Add(item);
- }
- return list;
- }
+ List list = new List();
+ while (result.Read())
+ {
+ InventoryItemBase item = readInventoryItem(result);
+ if (item != null)
+ list.Add(item);
}
+ return list;
}
catch (Exception e)
{
database.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
+ finally
+ {
+ if (result != null) result.Close();
+ if (sqlCmd != null) sqlCmd.Dispose();
+ }
}
}
}
diff --git a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
index a807948bde..c49153f8f2 100644
--- a/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLLegacyRegionData.cs
@@ -908,7 +908,7 @@ namespace OpenSim.Data.MySQL
if (!(row["ParticleSystem"] is DBNull))
prim.ParticleSystem = (byte[])row["ParticleSystem"];
- prim.RotationalVelocity = new Vector3(
+ prim.AngularVelocity = new Vector3(
(float)(double)row["OmegaX"],
(float)(double)row["OmegaY"],
(float)(double)row["OmegaZ"]
@@ -1240,9 +1240,9 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("TextureAnimation", prim.TextureAnimation);
cmd.Parameters.AddWithValue("ParticleSystem", prim.ParticleSystem);
- cmd.Parameters.AddWithValue("OmegaX", (double)prim.RotationalVelocity.X);
- cmd.Parameters.AddWithValue("OmegaY", (double)prim.RotationalVelocity.Y);
- cmd.Parameters.AddWithValue("OmegaZ", (double)prim.RotationalVelocity.Z);
+ cmd.Parameters.AddWithValue("OmegaX", (double)prim.AngularVelocity.X);
+ cmd.Parameters.AddWithValue("OmegaY", (double)prim.AngularVelocity.Y);
+ cmd.Parameters.AddWithValue("OmegaZ", (double)prim.AngularVelocity.Z);
cmd.Parameters.AddWithValue("CameraEyeOffsetX", (double)prim.GetCameraEyeOffset().X);
cmd.Parameters.AddWithValue("CameraEyeOffsetY", (double)prim.GetCameraEyeOffset().Y);
diff --git a/OpenSim/Data/MySQL/MySQLManager.cs b/OpenSim/Data/MySQL/MySQLManager.cs
index a724a504a9..a6cce57819 100644
--- a/OpenSim/Data/MySQL/MySQLManager.cs
+++ b/OpenSim/Data/MySQL/MySQLManager.cs
@@ -134,16 +134,18 @@ namespace OpenSim.Data.MySQL
///
protected void GetWaitTimeout()
{
- using (MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon))
+ MySqlCommand cmd = new MySqlCommand(m_waitTimeoutSelect, dbcon);
+
+ using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
- using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
+ if (dbReader.Read())
{
- if (dbReader.Read())
- {
- m_waitTimeout
- = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
- }
+ m_waitTimeout
+ = Convert.ToInt32(dbReader["@@wait_timeout"]) * TimeSpan.TicksPerSecond + m_waitTimeoutLeeway;
}
+
+ dbReader.Close();
+ cmd.Dispose();
}
m_lastConnectionUse = DateTime.Now.Ticks;
@@ -301,31 +303,31 @@ namespace OpenSim.Data.MySQL
{
CheckConnection();
- using (MySqlCommand tablesCmd = new MySqlCommand(
- "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname",
- dbcon))
- {
- tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database);
+ MySqlCommand tablesCmd =
+ new MySqlCommand(
+ "SELECT TABLE_NAME, TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=?dbname",
+ dbcon);
+ tablesCmd.Parameters.AddWithValue("?dbname", dbcon.Database);
- using (MySqlDataReader tables = tablesCmd.ExecuteReader())
+ using (MySqlDataReader tables = tablesCmd.ExecuteReader())
+ {
+ while (tables.Read())
{
- while (tables.Read())
+ try
{
- try
+ string tableName = (string) tables["TABLE_NAME"];
+ string comment = (string) tables["TABLE_COMMENT"];
+ if (tableList.ContainsKey(tableName))
{
- string tableName = (string)tables["TABLE_NAME"];
- string comment = (string)tables["TABLE_COMMENT"];
- if (tableList.ContainsKey(tableName))
- {
- tableList[tableName] = comment;
- }
- }
- catch (Exception e)
- {
- m_log.Error(e.Message, e);
+ tableList[tableName] = comment;
}
}
+ catch (Exception e)
+ {
+ m_log.Error(e.ToString());
+ }
}
+ tables.Close();
}
}
}
@@ -344,19 +346,19 @@ namespace OpenSim.Data.MySQL
{
CheckConnection(); // Not sure if this one is necessary
- MySqlCommand dbcommand = (MySqlCommand)dbcon.CreateCommand();
+ MySqlCommand dbcommand = (MySqlCommand) dbcon.CreateCommand();
dbcommand.CommandText = sql;
foreach (KeyValuePair param in parameters)
{
dbcommand.Parameters.AddWithValue(param.Key, param.Value);
}
- return (IDbCommand)dbcommand;
+ return (IDbCommand) dbcommand;
}
catch (Exception e)
{
// Return null if it fails.
- m_log.Error("Failed during Query generation: " + e.Message, e);
+ m_log.Error("Failed during Query generation: " + e.ToString());
return null;
}
}
@@ -692,6 +694,8 @@ namespace OpenSim.Data.MySQL
ret.Add(attachpoint, item);
}
+ r.Close();
+
return ret;
}
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index f5140761ea..b0075e8528 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -56,13 +56,12 @@ namespace OpenSim.Data.MySQL
if (scopeID != UUID.Zero)
command += " and ScopeID = ?scopeID";
- using (MySqlCommand cmd = new MySqlCommand(command))
- {
- cmd.Parameters.AddWithValue("?regionName", regionName);
- cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
+ MySqlCommand cmd = new MySqlCommand(command);
- return RunCommand(cmd);
- }
+ cmd.Parameters.AddWithValue("?regionName", regionName);
+ cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
+
+ return RunCommand(cmd);
}
public RegionData Get(int posX, int posY, UUID scopeID)
@@ -71,18 +70,17 @@ namespace OpenSim.Data.MySQL
if (scopeID != UUID.Zero)
command += " and ScopeID = ?scopeID";
- using (MySqlCommand cmd = new MySqlCommand(command))
- {
- cmd.Parameters.AddWithValue("?posX", posX.ToString());
- cmd.Parameters.AddWithValue("?posY", posY.ToString());
- cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
+ MySqlCommand cmd = new MySqlCommand(command);
- List ret = RunCommand(cmd);
- if (ret.Count == 0)
- return null;
+ cmd.Parameters.AddWithValue("?posX", posX.ToString());
+ cmd.Parameters.AddWithValue("?posY", posY.ToString());
+ cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
- return ret[0];
- }
+ List ret = RunCommand(cmd);
+ if (ret.Count == 0)
+ return null;
+
+ return ret[0];
}
public RegionData Get(UUID regionID, UUID scopeID)
@@ -91,17 +89,16 @@ namespace OpenSim.Data.MySQL
if (scopeID != UUID.Zero)
command += " and ScopeID = ?scopeID";
- using (MySqlCommand cmd = new MySqlCommand(command))
- {
- cmd.Parameters.AddWithValue("?regionID", regionID.ToString());
- cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
+ MySqlCommand cmd = new MySqlCommand(command);
- List ret = RunCommand(cmd);
- if (ret.Count == 0)
- return null;
+ cmd.Parameters.AddWithValue("?regionID", regionID.ToString());
+ cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
- return ret[0];
- }
+ List ret = RunCommand(cmd);
+ if (ret.Count == 0)
+ return null;
+
+ return ret[0];
}
public List Get(int startX, int startY, int endX, int endY, UUID scopeID)
@@ -110,44 +107,43 @@ namespace OpenSim.Data.MySQL
if (scopeID != UUID.Zero)
command += " and ScopeID = ?scopeID";
- using (MySqlCommand cmd = new MySqlCommand(command))
- {
- cmd.Parameters.AddWithValue("?startX", startX.ToString());
- cmd.Parameters.AddWithValue("?startY", startY.ToString());
- cmd.Parameters.AddWithValue("?endX", endX.ToString());
- cmd.Parameters.AddWithValue("?endY", endY.ToString());
- cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
+ MySqlCommand cmd = new MySqlCommand(command);
- return RunCommand(cmd);
- }
+ cmd.Parameters.AddWithValue("?startX", startX.ToString());
+ cmd.Parameters.AddWithValue("?startY", startY.ToString());
+ cmd.Parameters.AddWithValue("?endX", endX.ToString());
+ cmd.Parameters.AddWithValue("?endY", endY.ToString());
+ cmd.Parameters.AddWithValue("?scopeID", scopeID.ToString());
+
+ return RunCommand(cmd);
}
public List RunCommand(MySqlCommand cmd)
{
List retList = new List();
- using (IDataReader result = ExecuteReader(cmd))
+ IDataReader result = ExecuteReader(cmd);
+
+ while (result.Read())
{
- while (result.Read())
+ RegionData ret = new RegionData();
+ ret.Data = new Dictionary();
+
+ UUID regionID;
+ UUID.TryParse(result["uuid"].ToString(), out regionID);
+ ret.RegionID = regionID;
+ UUID scope;
+ UUID.TryParse(result["ScopeID"].ToString(), out scope);
+ ret.ScopeID = scope;
+ ret.RegionName = result["regionName"].ToString();
+ ret.posX = Convert.ToInt32(result["locX"]);
+ ret.posY = Convert.ToInt32(result["locY"]);
+ ret.sizeX = Convert.ToInt32(result["sizeX"]);
+ ret.sizeY = Convert.ToInt32(result["sizeY"]);
+
+ if (m_ColumnNames == null)
{
- RegionData ret = new RegionData();
- ret.Data = new Dictionary();
-
- UUID regionID;
- UUID.TryParse(result["uuid"].ToString(), out regionID);
- ret.RegionID = regionID;
- UUID scope;
- UUID.TryParse(result["ScopeID"].ToString(), out scope);
- ret.ScopeID = scope;
- ret.RegionName = result["regionName"].ToString();
- ret.posX = Convert.ToInt32(result["locX"]);
- ret.posY = Convert.ToInt32(result["locY"]);
- ret.sizeX = Convert.ToInt32(result["sizeX"]);
- ret.sizeY = Convert.ToInt32(result["sizeY"]);
-
- if (m_ColumnNames == null)
- {
- m_ColumnNames = new List();
+ m_ColumnNames = new List();
DataTable schemaTable = result.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
@@ -157,28 +153,28 @@ namespace OpenSim.Data.MySQL
}
}
- foreach (string s in m_ColumnNames)
- {
- if (s == "uuid")
- continue;
- if (s == "ScopeID")
- continue;
- if (s == "regionName")
- continue;
- if (s == "locX")
- continue;
- if (s == "locY")
- continue;
+ foreach (string s in m_ColumnNames)
+ {
+ if (s == "uuid")
+ continue;
+ if (s == "ScopeID")
+ continue;
+ if (s == "regionName")
+ continue;
+ if (s == "locX")
+ continue;
+ if (s == "locY")
+ continue;
- ret.Data[s] = result[s].ToString();
- }
-
- retList.Add(ret);
+ ret.Data[s] = result[s].ToString();
}
- CloseDBConnection(result, cmd);
+ retList.Add(ret);
}
+ result.Close();
+ CloseReaderCommand(cmd);
+
return retList;
}
@@ -205,72 +201,76 @@ namespace OpenSim.Data.MySQL
string[] fields = new List(data.Data.Keys).ToArray();
- using (MySqlCommand cmd = new MySqlCommand())
+ MySqlCommand cmd = new MySqlCommand();
+
+ string update = "update `"+m_Realm+"` set locX=?posX, locY=?posY, sizeX=?sizeX, sizeY=?sizeY";
+ foreach (string field in fields)
{
- string update = "update `" + m_Realm + "` set locX=?posX, locY=?posY, sizeX=?sizeX, sizeY=?sizeY";
- foreach (string field in fields)
- {
- update += ", ";
- update += "`" + field + "` = ?" + field;
+ update += ", ";
+ update += "`" + field + "` = ?"+field;
- cmd.Parameters.AddWithValue("?" + field, data.Data[field]);
- }
+ cmd.Parameters.AddWithValue("?"+field, data.Data[field]);
+ }
- update += " where uuid = ?regionID";
+ update += " where uuid = ?regionID";
- if (data.ScopeID != UUID.Zero)
- update += " and ScopeID = ?scopeID";
+ if (data.ScopeID != UUID.Zero)
+ update += " and ScopeID = ?scopeID";
- cmd.CommandText = update;
- cmd.Parameters.AddWithValue("?regionID", data.RegionID.ToString());
- cmd.Parameters.AddWithValue("?regionName", data.RegionName);
- cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString());
- cmd.Parameters.AddWithValue("?posX", data.posX.ToString());
- cmd.Parameters.AddWithValue("?posY", data.posY.ToString());
- cmd.Parameters.AddWithValue("?sizeX", data.sizeX.ToString());
- cmd.Parameters.AddWithValue("?sizeY", data.sizeY.ToString());
+ cmd.CommandText = update;
+ cmd.Parameters.AddWithValue("?regionID", data.RegionID.ToString());
+ cmd.Parameters.AddWithValue("?regionName", data.RegionName);
+ cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString());
+ cmd.Parameters.AddWithValue("?posX", data.posX.ToString());
+ cmd.Parameters.AddWithValue("?posY", data.posY.ToString());
+ cmd.Parameters.AddWithValue("?sizeX", data.sizeX.ToString());
+ cmd.Parameters.AddWithValue("?sizeY", data.sizeY.ToString());
+
+ if (ExecuteNonQuery(cmd) < 1)
+ {
+ string insert = "insert into `" + m_Realm + "` (`uuid`, `ScopeID`, `locX`, `locY`, `sizeX`, `sizeY`, `regionName`, `" +
+ String.Join("`, `", fields) +
+ "`) values ( ?regionID, ?scopeID, ?posX, ?posY, ?sizeX, ?sizeY, ?regionName, ?" + String.Join(", ?", fields) + ")";
+
+ cmd.CommandText = insert;
if (ExecuteNonQuery(cmd) < 1)
{
- string insert = "insert into `" + m_Realm + "` (`uuid`, `ScopeID`, `locX`, `locY`, `sizeX`, `sizeY`, `regionName`, `" +
- String.Join("`, `", fields) +
- "`) values ( ?regionID, ?scopeID, ?posX, ?posY, ?sizeX, ?sizeY, ?regionName, ?" + String.Join(", ?", fields) + ")";
-
- cmd.CommandText = insert;
-
- if (ExecuteNonQuery(cmd) < 1)
- {
- return false;
- }
+ cmd.Dispose();
+ return false;
}
}
+ cmd.Dispose();
+
return true;
}
public bool SetDataItem(UUID regionID, string item, string value)
{
- using (MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + "` set `" + item + "` = ?" + item + " where uuid = ?UUID"))
- {
- cmd.Parameters.AddWithValue("?" + item, value);
- cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
+ MySqlCommand cmd = new MySqlCommand("update `" + m_Realm +
+ "` set `" + item + "` = ?" + item + " where uuid = ?UUID");
- if (ExecuteNonQuery(cmd) > 0)
- return true;
- }
+
+ cmd.Parameters.AddWithValue("?"+item, value);
+ cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
+
+ if (ExecuteNonQuery(cmd) > 0)
+ return true;
return false;
}
public bool Delete(UUID regionID)
{
- using (MySqlCommand cmd = new MySqlCommand("delete from `" + m_Realm + "` where uuid = ?UUID"))
- {
- cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
+ MySqlCommand cmd = new MySqlCommand("delete from `" + m_Realm +
+ "` where uuid = ?UUID");
- if (ExecuteNonQuery(cmd) > 0)
- return true;
- }
+
+ cmd.Parameters.AddWithValue("?UUID", regionID.ToString());
+
+ if (ExecuteNonQuery(cmd) > 0)
+ return true;
return false;
}
diff --git a/OpenSim/Data/MySQL/MySQLUserAccountData.cs b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
index 0bbc3f5645..d48144d2e8 100644
--- a/OpenSim/Data/MySQL/MySQLUserAccountData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserAccountData.cs
@@ -97,14 +97,16 @@ namespace OpenSim.Data.MySQL
ret.Data[s] = result[s].ToString();
}
- CloseDBConnection(result, cmd);
+ result.Close();
+ CloseReaderCommand(cmd);
+
return ret;
}
- else
- {
- CloseDBConnection(result, cmd);
- return null;
- }
+
+ result.Close();
+ CloseReaderCommand(cmd);
+
+ return null;
}
public bool Store(UserAccountData data)
@@ -116,60 +118,61 @@ namespace OpenSim.Data.MySQL
string[] fields = new List(data.Data.Keys).ToArray();
- using (MySqlCommand cmd = new MySqlCommand())
+ MySqlCommand cmd = new MySqlCommand();
+
+ string update = "update `"+m_Realm+"` set ";
+ bool first = true;
+ foreach (string field in fields)
{
- string update = "update `" + m_Realm + "` set ";
- bool first = true;
- foreach (string field in fields)
- {
- if (!first)
- update += ", ";
- update += "`" + field + "` = ?" + field;
+ if (!first)
+ update += ", ";
+ update += "`" + field + "` = ?"+field;
- first = false;
+ first = false;
- cmd.Parameters.AddWithValue("?" + field, data.Data[field]);
- }
+ cmd.Parameters.AddWithValue("?"+field, data.Data[field]);
+ }
- update += " where UUID = ?principalID";
+ update += " where UUID = ?principalID";
- if (data.ScopeID != UUID.Zero)
- update += " and ScopeID = ?scopeID";
+ if (data.ScopeID != UUID.Zero)
+ update += " and ScopeID = ?scopeID";
- cmd.CommandText = update;
- cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString());
- cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString());
+ cmd.CommandText = update;
+ cmd.Parameters.AddWithValue("?principalID", data.PrincipalID.ToString());
+ cmd.Parameters.AddWithValue("?scopeID", data.ScopeID.ToString());
+
+ if (ExecuteNonQuery(cmd) < 1)
+ {
+ string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" +
+ String.Join("`, `", fields) +
+ "`) values (?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")";
+
+ cmd.CommandText = insert;
if (ExecuteNonQuery(cmd) < 1)
{
- string insert = "insert into `" + m_Realm + "` (`UUID`, `ScopeID`, `" +
- String.Join("`, `", fields) +
- "`) values (?principalID, ?scopeID, ?" + String.Join(", ?", fields) + ")";
-
- cmd.CommandText = insert;
-
- if (ExecuteNonQuery(cmd) < 1)
- {
- cmd.Dispose();
- return false;
- }
+ cmd.Dispose();
+ return false;
}
}
+ cmd.Dispose();
+
return true;
}
public bool SetDataItem(UUID principalID, string item, string value)
{
- using (MySqlCommand cmd = new MySqlCommand("update `" + m_Realm + "` set `" +
- item + "` = ?" + item + " where UUID = ?UUID"))
- {
- cmd.Parameters.AddWithValue("?" + item, value);
- cmd.Parameters.AddWithValue("?UUID", principalID.ToString());
+ MySqlCommand cmd = new MySqlCommand("update `" + m_Realm +
+ "` set `" + item + "` = ?" + item + " where UUID = ?UUID");
- if (ExecuteNonQuery(cmd) > 0)
- return true;
- }
+
+ cmd.Parameters.AddWithValue("?"+item, value);
+ cmd.Parameters.AddWithValue("?UUID", principalID.ToString());
+
+ if (ExecuteNonQuery(cmd) > 0)
+ return true;
return false;
}
diff --git a/OpenSim/Data/MySQL/MySQLUserData.cs b/OpenSim/Data/MySQL/MySQLUserData.cs
index bd46dfc00b..04f872f249 100644
--- a/OpenSim/Data/MySQL/MySQLUserData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserData.cs
@@ -181,20 +181,21 @@ namespace OpenSim.Data.MySQL
param["?first"] = user;
param["?second"] = last;
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT * FROM " + m_usersTableName + " WHERE username = ?first AND lastname = ?second", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- UserProfileData row = dbm.Manager.readUserRow(reader);
- return row;
- }
- }
+ IDbCommand result =
+ dbm.Manager.Query(
+ "SELECT * FROM " + m_usersTableName + " WHERE username = ?first AND lastname = ?second", param);
+ IDataReader reader = result.ExecuteReader();
+
+ UserProfileData row = dbm.Manager.readUserRow(reader);
+
+ reader.Dispose();
+ result.Dispose();
+ return row;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -219,30 +220,28 @@ namespace OpenSim.Data.MySQL
try
{
- using (IDbCommand adder = dbm.Manager.Query(
- "INSERT INTO `" + m_userFriendsTableName + "` " +
- "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " +
- "VALUES " +
- "(?ownerID,?friendID,?friendPerms,?datetimestamp)",
- param))
- {
- adder.ExecuteNonQuery();
- }
+ IDbCommand adder =
+ dbm.Manager.Query(
+ "INSERT INTO `" + m_userFriendsTableName + "` " +
+ "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " +
+ "VALUES " +
+ "(?ownerID,?friendID,?friendPerms,?datetimestamp)",
+ param);
+ adder.ExecuteNonQuery();
- using (IDbCommand adder = dbm.Manager.Query(
- "INSERT INTO `" + m_userFriendsTableName + "` " +
- "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " +
- "VALUES " +
- "(?friendID,?ownerID,?friendPerms,?datetimestamp)",
- param))
- {
- adder.ExecuteNonQuery();
- }
+ adder =
+ dbm.Manager.Query(
+ "INSERT INTO `" + m_userFriendsTableName + "` " +
+ "(`ownerID`,`friendID`,`friendPerms`,`datetimestamp`) " +
+ "VALUES " +
+ "(?friendID,?ownerID,?friendPerms,?datetimestamp)",
+ param);
+ adder.ExecuteNonQuery();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return;
}
finally
@@ -261,24 +260,22 @@ namespace OpenSim.Data.MySQL
try
{
- using (IDbCommand updater = dbm.Manager.Query(
+ IDbCommand updater =
+ dbm.Manager.Query(
"delete from " + m_userFriendsTableName + " where ownerID = ?ownerID and friendID = ?friendID",
- param))
- {
- updater.ExecuteNonQuery();
- }
+ param);
+ updater.ExecuteNonQuery();
- using (IDbCommand updater = dbm.Manager.Query(
+ updater =
+ dbm.Manager.Query(
"delete from " + m_userFriendsTableName + " where ownerID = ?friendID and friendID = ?ownerID",
- param))
- {
- updater.ExecuteNonQuery();
- }
+ param);
+ updater.ExecuteNonQuery();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return;
}
finally
@@ -298,19 +295,18 @@ namespace OpenSim.Data.MySQL
try
{
- using (IDbCommand updater = dbm.Manager.Query(
+ IDbCommand updater =
+ dbm.Manager.Query(
"update " + m_userFriendsTableName +
" SET friendPerms = ?friendPerms " +
"where ownerID = ?ownerID and friendID = ?friendID",
- param))
- {
- updater.ExecuteNonQuery();
- }
+ param);
+ updater.ExecuteNonQuery();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return;
}
finally
@@ -331,33 +327,34 @@ namespace OpenSim.Data.MySQL
try
{
//Left Join userfriends to itself
- using (IDbCommand result = dbm.Manager.Query(
- "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " +
- m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" +
- " where a.ownerID = ?ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID",
- param))
+ IDbCommand result =
+ dbm.Manager.Query(
+ "select a.ownerID,a.friendID,a.friendPerms,b.friendPerms as ownerperms from " +
+ m_userFriendsTableName + " as a, " + m_userFriendsTableName + " as b" +
+ " where a.ownerID = ?ownerID and b.ownerID = a.friendID and b.friendID = a.ownerID",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ while (reader.Read())
{
- using (IDataReader reader = result.ExecuteReader())
- {
- while (reader.Read())
- {
- FriendListItem fli = new FriendListItem();
- fli.FriendListOwner = new UUID((string)reader["ownerID"]);
- fli.Friend = new UUID((string)reader["friendID"]);
- fli.FriendPerms = (uint)Convert.ToInt32(reader["friendPerms"]);
+ FriendListItem fli = new FriendListItem();
+ fli.FriendListOwner = new UUID((string) reader["ownerID"]);
+ fli.Friend = new UUID((string) reader["friendID"]);
+ fli.FriendPerms = (uint) Convert.ToInt32(reader["friendPerms"]);
- // This is not a real column in the database table, it's a joined column from the opposite record
- fli.FriendListOwnerPerms = (uint)Convert.ToInt32(reader["ownerperms"]);
+ // This is not a real column in the database table, it's a joined column from the opposite record
+ fli.FriendListOwnerPerms = (uint) Convert.ToInt32(reader["ownerperms"]);
- Lfli.Add(fli);
- }
- }
+ Lfli.Add(fli);
}
+
+ reader.Dispose();
+ result.Dispose();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return Lfli;
}
finally
@@ -379,29 +376,29 @@ namespace OpenSim.Data.MySQL
{
Dictionary param = new Dictionary();
param["?uuid"] = uuid.ToString();
+ IDbCommand result =
+ dbm.Manager.Query("select agentOnline,currentHandle from " + m_agentsTableName +
+ " where UUID = ?uuid", param);
- using (IDbCommand result = dbm.Manager.Query("select agentOnline,currentHandle from " + m_agentsTableName +
- " where UUID = ?uuid", param))
+ IDataReader reader = result.ExecuteReader();
+ while (reader.Read())
{
- using (IDataReader reader = result.ExecuteReader())
- {
- while (reader.Read())
- {
- FriendRegionInfo fri = new FriendRegionInfo();
- fri.isOnline = (sbyte)reader["agentOnline"] != 0;
- fri.regionHandle = (ulong)reader["currentHandle"];
+ FriendRegionInfo fri = new FriendRegionInfo();
+ fri.isOnline = (sbyte)reader["agentOnline"] != 0;
+ fri.regionHandle = (ulong)reader["currentHandle"];
- infos[uuid] = fri;
- }
- }
+ infos[uuid] = fri;
}
+
+ reader.Dispose();
+ result.Dispose();
}
}
catch (Exception e)
{
m_log.Warn("[MYSQL]: Got exception on trying to find friends regions:", e);
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
finally
{
@@ -430,28 +427,28 @@ namespace OpenSim.Data.MySQL
try
{
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT UUID,username,lastname FROM " + m_usersTableName +
- " WHERE username like ?first AND lastname like ?second LIMIT 100",
- param))
+ IDbCommand result =
+ dbm.Manager.Query(
+ "SELECT UUID,username,lastname FROM " + m_usersTableName +
+ " WHERE username like ?first AND lastname like ?second LIMIT 100",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ while (reader.Read())
{
- using (IDataReader reader = result.ExecuteReader())
- {
- while (reader.Read())
- {
- AvatarPickerAvatar user = new AvatarPickerAvatar();
- user.AvatarID = new UUID((string)reader["UUID"]);
- user.firstName = (string)reader["username"];
- user.lastName = (string)reader["lastname"];
- returnlist.Add(user);
- }
- }
+ AvatarPickerAvatar user = new AvatarPickerAvatar();
+ user.AvatarID = new UUID((string) reader["UUID"]);
+ user.firstName = (string) reader["username"];
+ user.lastName = (string) reader["lastname"];
+ returnlist.Add(user);
}
+ reader.Dispose();
+ result.Dispose();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return returnlist;
}
finally
@@ -468,28 +465,28 @@ namespace OpenSim.Data.MySQL
Dictionary param = new Dictionary();
param["?first"] = objAlphaNumericPattern.Replace(querysplit[0], String.Empty) + "%";
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT UUID,username,lastname FROM " + m_usersTableName +
- " WHERE username like ?first OR lastname like ?first LIMIT 100",
- param))
+ IDbCommand result =
+ dbm.Manager.Query(
+ "SELECT UUID,username,lastname FROM " + m_usersTableName +
+ " WHERE username like ?first OR lastname like ?first LIMIT 100",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ while (reader.Read())
{
- using (IDataReader reader = result.ExecuteReader())
- {
- while (reader.Read())
- {
- AvatarPickerAvatar user = new AvatarPickerAvatar();
- user.AvatarID = new UUID((string)reader["UUID"]);
- user.firstName = (string)reader["username"];
- user.lastName = (string)reader["lastname"];
- returnlist.Add(user);
- }
- }
+ AvatarPickerAvatar user = new AvatarPickerAvatar();
+ user.AvatarID = new UUID((string) reader["UUID"]);
+ user.firstName = (string) reader["username"];
+ user.lastName = (string) reader["lastname"];
+ returnlist.Add(user);
}
+ reader.Dispose();
+ result.Dispose();
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return returnlist;
}
finally
@@ -513,19 +510,20 @@ namespace OpenSim.Data.MySQL
Dictionary param = new Dictionary();
param["?uuid"] = uuid.ToString();
- using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = ?uuid", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- UserProfileData row = dbm.Manager.readUserRow(reader);
- return row;
- }
- }
+ IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_usersTableName + " WHERE UUID = ?uuid", param);
+ IDataReader reader = result.ExecuteReader();
+
+ UserProfileData row = dbm.Manager.readUserRow(reader);
+
+ reader.Dispose();
+ result.Dispose();
+
+ return row;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -571,15 +569,15 @@ namespace OpenSim.Data.MySQL
try
{
- dbm.Manager.ExecuteParameterizedSql(
- "update " + m_usersTableName + " SET webLoginKey = ?webLoginKey " +
- "where UUID = ?UUID",
- param);
+ dbm.Manager.ExecuteParameterizedSql(
+ "update " + m_usersTableName + " SET webLoginKey = ?webLoginKey " +
+ "where UUID = ?UUID",
+ param);
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return;
}
finally
@@ -602,19 +600,21 @@ namespace OpenSim.Data.MySQL
Dictionary param = new Dictionary();
param["?uuid"] = uuid.ToString();
- using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = ?uuid", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- UserAgentData row = dbm.Manager.readAgentRow(reader);
- return row;
- }
- }
+ IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_agentsTableName + " WHERE UUID = ?uuid",
+ param);
+ IDataReader reader = result.ExecuteReader();
+
+ UserAgentData row = dbm.Manager.readAgentRow(reader);
+
+ reader.Dispose();
+ result.Dispose();
+
+ return row;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -638,20 +638,19 @@ namespace OpenSim.Data.MySQL
try
{
- dbm.Manager.insertUserRow(
- user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
- user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y,
- user.HomeLocation.Z,
- user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created,
- user.LastLogin, user.UserInventoryURI, user.UserAssetURI,
- user.CanDoMask, user.WantDoMask,
- user.AboutText, user.FirstLifeAboutText, user.Image,
- user.FirstLifeImage, user.WebLoginKey, user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
+ dbm.Manager.insertUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
+ user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y,
+ user.HomeLocation.Z,
+ user.HomeLookAt.X, user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created,
+ user.LastLogin, user.UserInventoryURI, user.UserAssetURI,
+ user.CanDoMask, user.WantDoMask,
+ user.AboutText, user.FirstLifeAboutText, user.Image,
+ user.FirstLifeImage, user.WebLoginKey, user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
finally
{
@@ -677,7 +676,7 @@ namespace OpenSim.Data.MySQL
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
finally
{
@@ -694,15 +693,14 @@ namespace OpenSim.Data.MySQL
MySQLSuperManager dbm = GetLockedConnection("UpdateUserProfile");
try
{
- dbm.Manager.updateUserRow(
- user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
- user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y,
- user.HomeLocation.Z, user.HomeLookAt.X,
- user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, user.LastLogin,
- user.UserInventoryURI,
- user.UserAssetURI, user.CanDoMask, user.WantDoMask, user.AboutText,
- user.FirstLifeAboutText, user.Image, user.FirstLifeImage, user.WebLoginKey,
- user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
+ dbm.Manager.updateUserRow(user.ID, user.FirstName, user.SurName, user.Email, user.PasswordHash, user.PasswordSalt,
+ user.HomeRegion, user.HomeRegionID, user.HomeLocation.X, user.HomeLocation.Y,
+ user.HomeLocation.Z, user.HomeLookAt.X,
+ user.HomeLookAt.Y, user.HomeLookAt.Z, user.Created, user.LastLogin,
+ user.UserInventoryURI,
+ user.UserAssetURI, user.CanDoMask, user.WantDoMask, user.AboutText,
+ user.FirstLifeAboutText, user.Image, user.FirstLifeImage, user.WebLoginKey,
+ user.UserFlags, user.GodLevel, user.CustomType, user.Partner);
}
finally
{
@@ -750,29 +748,29 @@ namespace OpenSim.Data.MySQL
Dictionary param = new Dictionary();
param["?owner"] = user.ToString();
- using (IDbCommand result = dbm.Manager.Query("SELECT * FROM " + m_appearanceTableName + " WHERE owner = ?owner", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- AvatarAppearance appearance = dbm.Manager.readAppearanceRow(reader);
+ IDbCommand result = dbm.Manager.Query(
+ "SELECT * FROM " + m_appearanceTableName + " WHERE owner = ?owner", param);
+ IDataReader reader = result.ExecuteReader();
- if (appearance == null)
- {
- m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString());
- return null;
- }
- else
- {
- appearance.SetAttachments(GetUserAttachments(user));
- return appearance;
- }
- }
+ AvatarAppearance appearance = dbm.Manager.readAppearanceRow(reader);
+
+ reader.Dispose();
+ result.Dispose();
+
+ if (null == appearance)
+ {
+ m_log.WarnFormat("[USER DB] No appearance found for user {0}", user.ToString());
+ return null;
}
+
+ appearance.SetAttachments(GetUserAttachments(user));
+
+ return appearance;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -800,7 +798,7 @@ namespace OpenSim.Data.MySQL
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
}
finally
{
@@ -835,20 +833,20 @@ namespace OpenSim.Data.MySQL
try
{
- using (IDbCommand result = dbm.Manager.Query(
- "SELECT attachpoint, item, asset from " + m_attachmentsTableName + " WHERE UUID = ?uuid", param))
- {
- using (IDataReader reader = result.ExecuteReader())
- {
- Hashtable ret = dbm.Manager.readAttachments(reader);
- return ret;
- }
- }
+ IDbCommand result = dbm.Manager.Query(
+ "SELECT attachpoint, item, asset from " + m_attachmentsTableName + " WHERE UUID = ?uuid", param);
+ IDataReader reader = result.ExecuteReader();
+
+ Hashtable ret = dbm.Manager.readAttachments(reader);
+
+ reader.Dispose();
+ result.Dispose();
+ return ret;
}
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return null;
}
finally
@@ -907,7 +905,7 @@ namespace OpenSim.Data.MySQL
catch (Exception e)
{
dbm.Manager.Reconnect();
- m_log.Error(e.Message, e);
+ m_log.Error(e.ToString());
return;
}
finally
diff --git a/OpenSim/Data/SQLite/SQLiteRegionData.cs b/OpenSim/Data/SQLite/SQLiteRegionData.cs
index 08af7c3eb0..b68de1a87b 100644
--- a/OpenSim/Data/SQLite/SQLiteRegionData.cs
+++ b/OpenSim/Data/SQLite/SQLiteRegionData.cs
@@ -1213,7 +1213,7 @@ namespace OpenSim.Data.SQLite
if (!row.IsNull("ParticleSystem"))
prim.ParticleSystem = Convert.FromBase64String(row["ParticleSystem"].ToString());
- prim.RotationalVelocity = new Vector3(
+ prim.AngularVelocity = new Vector3(
Convert.ToSingle(row["OmegaX"]),
Convert.ToSingle(row["OmegaY"]),
Convert.ToSingle(row["OmegaZ"])
@@ -1530,9 +1530,9 @@ namespace OpenSim.Data.SQLite
row["TextureAnimation"] = Convert.ToBase64String(prim.TextureAnimation);
row["ParticleSystem"] = Convert.ToBase64String(prim.ParticleSystem);
- row["OmegaX"] = prim.RotationalVelocity.X;
- row["OmegaY"] = prim.RotationalVelocity.Y;
- row["OmegaZ"] = prim.RotationalVelocity.Z;
+ row["OmegaX"] = prim.AngularVelocity.X;
+ row["OmegaY"] = prim.AngularVelocity.Y;
+ row["OmegaZ"] = prim.AngularVelocity.Z;
row["CameraEyeOffsetX"] = prim.GetCameraEyeOffset().X;
row["CameraEyeOffsetY"] = prim.GetCameraEyeOffset().Y;
diff --git a/OpenSim/Framework/ACL.cs b/OpenSim/Framework/ACL.cs
index 3b1c0f0f63..f76e8b7288 100644
--- a/OpenSim/Framework/ACL.cs
+++ b/OpenSim/Framework/ACL.cs
@@ -248,35 +248,5 @@ namespace OpenSim.Framework
#endregion
- #region Tests
-
- ///
- /// ACL Test class
- ///
- internal class ACLTester
- {
- public ACLTester()
- {
- ACL acl = new ACL();
-
- Role Guests = new Role("Guests");
- acl.AddRole(Guests);
-
- Role[] parents = new Role[0];
- parents[0] = Guests;
-
- Role JoeGuest = new Role("JoeGuest", parents);
- acl.AddRole(JoeGuest);
-
- Resource CanBuild = new Resource("CanBuild");
- acl.AddResource(CanBuild);
-
-
- acl.GrantPermission("Guests", "CanBuild");
-
- acl.HasPermission("JoeGuest", "CanBuild");
- }
- }
-
- #endregion
+
}
\ No newline at end of file
diff --git a/OpenSim/Framework/Communications/Services/LoginService.cs b/OpenSim/Framework/Communications/Services/LoginService.cs
index 922cd4942f..b6522992b7 100644
--- a/OpenSim/Framework/Communications/Services/LoginService.cs
+++ b/OpenSim/Framework/Communications/Services/LoginService.cs
@@ -1031,30 +1031,26 @@ namespace OpenSim.Framework.Communications.Services
return true;
}
- // StartLocation not available, send him to a nearby region instead
- // regionInfo = m_gridService.RequestClosestRegion("");
- //m_log.InfoFormat("[LOGIN]: StartLocation not available sending to region {0}", regionInfo.regionName);
+ // Get the default region handle
+ ulong defaultHandle = Utils.UIntsToLong(m_defaultHomeX * Constants.RegionSize, m_defaultHomeY * Constants.RegionSize);
- // Send him to default region instead
- ulong defaultHandle = (((ulong)m_defaultHomeX * Constants.RegionSize) << 32) |
- ((ulong)m_defaultHomeY * Constants.RegionSize);
-
- if ((regionInfo != null) && (defaultHandle == regionInfo.RegionHandle))
- {
- m_log.ErrorFormat("[LOGIN]: Not trying the default region since this is the same as the selected region");
- return false;
- }
-
- m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
- regionInfo = GetRegionInfo(defaultHandle);
+ // If we haven't already tried the default region, reset regionInfo
+ if (regionInfo != null && defaultHandle != regionInfo.RegionHandle)
+ regionInfo = null;
if (regionInfo == null)
{
- m_log.ErrorFormat("[LOGIN]: No default region available. Aborting.");
- return false;
+ m_log.Error("[LOGIN]: Sending user to default region " + defaultHandle + " instead");
+ regionInfo = GetRegionInfo(defaultHandle);
}
- theUser.CurrentAgent.Position = new Vector3(128, 128, 0);
+ if (regionInfo == null)
+ {
+ m_log.ErrorFormat("[LOGIN]: Sending user to any region");
+ regionInfo = RequestClosestRegion(String.Empty);
+ }
+
+ theUser.CurrentAgent.Position = new Vector3(128f, 128f, 0f);
response.StartLocation = "safe";
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 0000000000..d11f307a89
--- /dev/null
+++ b/OpenSim/Framework/Tests/ACLTest.cs
@@ -0,0 +1,98 @@
+using System;
+using NUnit.Framework;
+using System.Collections.Generic;
+
+
+namespace OpenSim.Framework.Tests
+{
+ [TestFixture]
+ public class ACLTest
+ {
+ #region Tests
+
+ ///
+ /// ACL Test class
+ ///
+ [Test]
+ public void ACLTest01()
+ {
+ ACL acl = new ACL();
+
+ Role Guests = new Role("Guests");
+ acl.AddRole(Guests);
+
+ Role[] parents = new Role[1];
+ parents[0] = Guests;
+
+ Role JoeGuest = new Role("JoeGuest", parents);
+ acl.AddRole(JoeGuest);
+
+ Resource CanBuild = new Resource("CanBuild");
+ acl.AddResource(CanBuild);
+
+
+ acl.GrantPermission("Guests", "CanBuild");
+
+ Permission perm = acl.HasPermission("JoeGuest", "CanBuild");
+ Assert.That(perm == Permission.Allow, "JoeGuest should have permission to build");
+ perm = Permission.None;
+ try
+ {
+ perm = acl.HasPermission("unknownGuest", "CanBuild");
+
+ }
+ catch (KeyNotFoundException)
+ {
+
+
+ }
+ catch (Exception)
+ {
+ Assert.That(false,"Exception thrown should have been KeyNotFoundException");
+ }
+ Assert.That(perm == Permission.None,"Permission None should be set because exception should have been thrown");
+
+ }
+
+ [Test]
+ public void KnownButPermissionDenyAndPermissionNoneUserTest()
+ {
+ ACL acl = new ACL();
+
+ Role Guests = new Role("Guests");
+ acl.AddRole(Guests);
+ Role Administrators = new Role("Administrators");
+ acl.AddRole(Administrators);
+ Role[] Guestparents = new Role[1];
+ Role[] Adminparents = new Role[1];
+
+ Guestparents[0] = Guests;
+ Adminparents[0] = Administrators;
+
+ Role JoeGuest = new Role("JoeGuest", Guestparents);
+ acl.AddRole(JoeGuest);
+
+ Resource CanBuild = new Resource("CanBuild");
+ acl.AddResource(CanBuild);
+
+ Resource CanScript = new Resource("CanScript");
+ acl.AddResource(CanScript);
+
+ Resource CanRestart = new Resource("CanRestart");
+ acl.AddResource(CanRestart);
+
+ acl.GrantPermission("Guests", "CanBuild");
+ acl.DenyPermission("Guests", "CanRestart");
+
+ acl.GrantPermission("Administrators", "CanScript");
+
+ acl.GrantPermission("Administrators", "CanRestart");
+ Permission setPermission = acl.HasPermission("JoeGuest", "CanRestart");
+ Assert.That(setPermission == Permission.Deny, "Guests Should not be able to restart");
+ Assert.That(acl.HasPermission("JoeGuest", "CanScript") == Permission.None,
+ "No Explicit Permissions set so should be Permission.None");
+ }
+
+ #endregion
+ }
+}
diff --git a/OpenSim/Framework/Tests/CacheTests.cs b/OpenSim/Framework/Tests/CacheTests.cs
new file mode 100644
index 0000000000..8e97232f10
--- /dev/null
+++ b/OpenSim/Framework/Tests/CacheTests.cs
@@ -0,0 +1,75 @@
+using System;
+using NUnit.Framework;
+using OpenMetaverse;
+
+namespace OpenSim.Framework.Tests
+{
+ [TestFixture]
+ public class CacheTests
+ {
+ private Cache cache;
+ private UUID cacheItemUUID;
+ [SetUp]
+ public void Build()
+ {
+ cache = new Cache();
+ cacheItemUUID = UUID.Random();
+ MemoryCacheItem cachedItem = new MemoryCacheItem(cacheItemUUID.ToString(),DateTime.Now + TimeSpan.FromDays(1));
+ byte[] foo = new byte[1];
+ foo[0] = 255;
+ cachedItem.Store(foo);
+ cache.Store(cacheItemUUID.ToString(), cachedItem);
+ }
+ [Test]
+ public void TestRetreive()
+ {
+ CacheItemBase citem = (CacheItemBase)cache.Get(cacheItemUUID.ToString());
+ byte[] data = (byte[]) citem.Retrieve();
+ Assert.That(data.Length == 1, "Cached Item should have one byte element");
+ Assert.That(data[0] == 255, "Cached Item element should be 255");
+ }
+
+ [Test]
+ public void TestNotInCache()
+ {
+ UUID randomNotIn = UUID.Random();
+ while (randomNotIn == cacheItemUUID)
+ {
+ randomNotIn = UUID.Random();
+ }
+ object citem = cache.Get(randomNotIn.ToString());
+ Assert.That(citem == null, "Item should not be in Cache" );
+ }
+
+ //NOTE: Test Case disabled until Cache is fixed
+ [Test]
+ public void TestTTLExpiredEntry()
+ {
+ UUID ImmediateExpiryUUID = UUID.Random();
+ MemoryCacheItem cachedItem = new MemoryCacheItem(ImmediateExpiryUUID.ToString(), TimeSpan.FromDays(-1));
+ byte[] foo = new byte[1];
+ foo[0] = 1;
+ cachedItem.Store(foo);
+ cache.Store(cacheItemUUID.ToString(), cachedItem);
+
+ object citem = cache.Get(cacheItemUUID.ToString());
+ //Assert.That(citem == null, "Item should not be in Cache because the expiry time was before now");
+ }
+
+ //NOTE: Test Case disabled until Cache is fixed
+ [Test]
+ public void ExpireItemManually()
+ {
+ UUID ImmediateExpiryUUID = UUID.Random();
+ MemoryCacheItem cachedItem = new MemoryCacheItem(ImmediateExpiryUUID.ToString(), TimeSpan.FromDays(1));
+ byte[] foo = new byte[1];
+ foo[0] = 1;
+ cachedItem.Store(foo);
+ cache.Store(cacheItemUUID.ToString(), cachedItem);
+ cache.Invalidate(ImmediateExpiryUUID.ToString());
+ object citem = cache.Get(cacheItemUUID.ToString());
+ //Assert.That(citem == null, "Item should not be in Cache because we manually invalidated it");
+ }
+
+ }
+}
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs
index b44818266a..60c34df8bd 100644
--- a/OpenSim/Region/Application/OpenSim.cs
+++ b/OpenSim/Region/Application/OpenSim.cs
@@ -343,6 +343,10 @@ namespace OpenSim
"Add-InventoryHost ",
String.Empty, RunCommand);
+ m_console.Commands.AddCommand("region", false, "kill uuid",
+ "kill uuid ",
+ "Kill an object by UUID", KillUUID);
+
if (ConfigurationSettings.Standalone)
{
m_console.Commands.AddCommand("region", false, "create user",
@@ -1332,6 +1336,58 @@ namespace OpenSim
return result;
}
+ ///
+ /// Kill an object given its UUID.
+ ///
+ ///
+ protected void KillUUID(string module, string[] cmdparams)
+ {
+ if (cmdparams.Length > 2)
+ {
+ UUID id = UUID.Zero;
+ SceneObjectGroup grp = null;
+ Scene sc = null;
+
+ if (!UUID.TryParse(cmdparams[2], out id))
+ {
+ MainConsole.Instance.Output("[KillUUID]: Error bad UUID format!");
+ return;
+ }
+
+ m_sceneManager.ForEachScene(
+ delegate(Scene scene)
+ {
+ SceneObjectPart part = scene.GetSceneObjectPart(id);
+ if (part == null)
+ return;
+
+ grp = part.ParentGroup;
+ sc = scene;
+ });
+
+ if (grp == null)
+ {
+ MainConsole.Instance.Output(String.Format("[KillUUID]: Given UUID {0} not found!", id));
+ }
+ else
+ {
+ MainConsole.Instance.Output(String.Format("[KillUUID]: Found UUID {0} in scene {1}", id, sc.RegionInfo.RegionName));
+ try
+ {
+ sc.DeleteSceneObject(grp, false);
+ }
+ catch (Exception e)
+ {
+ m_log.ErrorFormat("[KillUUID]: Error while removing objects from scene: " + e);
+ }
+ }
+ }
+ else
+ {
+ MainConsole.Instance.Output("[KillUUID]: Usage: kill uuid ");
+ }
+ }
+
#endregion
}
}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index f6a7a0ce54..db0c3b8692 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -37,6 +37,7 @@ using System.Xml;
using log4net;
using OpenMetaverse;
using OpenMetaverse.Packets;
+using OpenMetaverse.StructuredData;
using OpenSim.Framework;
using OpenSim.Framework.Client;
using OpenSim.Framework.Communications.Cache;
@@ -314,14 +315,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private readonly LLUDPClient m_udpClient;
private readonly UUID m_sessionId;
private readonly UUID m_secureSessionId;
- private readonly UUID m_agentId;
+ protected readonly UUID m_agentId;
private readonly uint m_circuitCode;
private readonly byte[] m_channelVersion = Utils.EmptyBytes;
private readonly Dictionary m_defaultAnimations = new Dictionary();
private readonly IGroupsModule m_GroupsModule;
private int m_cachedTextureSerial;
- private PriorityQueue m_avatarTerseUpdates;
+ protected PriorityQueue m_avatarTerseUpdates;
private PriorityQueue m_primTerseUpdates;
private PriorityQueue m_primFullUpdates;
private int m_moneyBalance;
@@ -1856,7 +1857,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
economyData.Info.TeleportMinPrice = TeleportMinPrice;
economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
economyData.Header.Reliable = true;
- OutPacket(economyData, ThrottleOutPacketType.Unknown);
+ OutPacket(economyData, ThrottleOutPacketType.Task);
}
public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List Data)
@@ -2786,30 +2787,37 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
{
- AvatarGroupsReplyPacket p = (AvatarGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarGroupsReply);
-
- p.AgentData = new AvatarGroupsReplyPacket.AgentDataBlock();
- p.AgentData.AgentID = AgentId;
- p.AgentData.AvatarID = avatarID;
-
- p.GroupData = new AvatarGroupsReplyPacket.GroupDataBlock[data.Length];
- int i = 0;
- foreach (GroupMembershipData m in data)
- {
- p.GroupData[i] = new AvatarGroupsReplyPacket.GroupDataBlock();
- p.GroupData[i].GroupPowers = m.GroupPowers;
- p.GroupData[i].AcceptNotices = m.AcceptNotices;
- p.GroupData[i].GroupTitle = Utils.StringToBytes(m.GroupTitle);
- p.GroupData[i].GroupID = m.GroupID;
- p.GroupData[i].GroupName = Utils.StringToBytes(m.GroupName);
- p.GroupData[i].GroupInsigniaID = m.GroupPicture;
- i++;
- }
-
- p.NewGroupData = new AvatarGroupsReplyPacket.NewGroupDataBlock();
- p.NewGroupData.ListInProfile = true;
-
- OutPacket(p, ThrottleOutPacketType.Task);
+ OSDMap llsd = new OSDMap(3);
+ OSDArray AgentData = new OSDArray(1);
+ OSDMap AgentDataMap = new OSDMap(1);
+ AgentDataMap.Add("AgentID", OSD.FromUUID(this.AgentId));
+ AgentDataMap.Add("AvatarID", OSD.FromUUID(avatarID));
+ AgentData.Add(AgentDataMap);
+ llsd.Add("AgentData", AgentData);
+ OSDArray GroupData = new OSDArray(data.Length);
+ OSDArray NewGroupData = new OSDArray(data.Length);
+ foreach (GroupMembershipData m in data)
+ {
+ OSDMap GroupDataMap = new OSDMap(6);
+ OSDMap NewGroupDataMap = new OSDMap(1);
+ GroupDataMap.Add("GroupPowers", OSD.FromBinary(m.GroupPowers));
+ GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(m.AcceptNotices));
+ GroupDataMap.Add("GroupTitle", OSD.FromString(m.GroupTitle));
+ GroupDataMap.Add("GroupID", OSD.FromUUID(m.GroupID));
+ GroupDataMap.Add("GroupName", OSD.FromString(m.GroupName));
+ GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(m.GroupPicture));
+ NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(m.ListInProfile));
+ GroupData.Add(GroupDataMap);
+ NewGroupData.Add(NewGroupDataMap);
+ }
+ llsd.Add("GroupData", GroupData);
+ llsd.Add("NewGroupData", NewGroupData);
+
+ IEventQueue eq = this.Scene.RequestModuleInterface();
+ if (eq != null)
+ {
+ eq.Enqueue(BuildEvent("AvatarGroupsReply", llsd), this.AgentId);
+ }
}
public void SendJoinGroupReply(UUID groupID, bool success)
@@ -3168,107 +3176,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#endregion
- #region Prim/Avatar Updates
-
- /*void SendObjectUpdate(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
- {
- bool canUseCompressed, canUseImproved;
- UpdateFlagsToPacketType(creatorFlags, updateFlags, out canUseCompressed, out canUseImproved);
-
- if (!canUseImproved && !canUseCompressed)
- SendFullObjectUpdate(obj, creatorFlags, updateFlags);
- else if (!canUseImproved)
- SendObjectUpdateCompressed(obj, creatorFlags, updateFlags);
- else
- SendImprovedTerseObjectUpdate(obj, creatorFlags, updateFlags);
- }
-
- void SendFullObjectUpdate(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
- {
- IClientAPI owner;
- if (m_scene.ClientManager.TryGetValue(obj.OwnerID, out owner) && owner is LLClientView)
- {
- LLClientView llOwner = (LLClientView)owner;
-
- // Send an update out to the owner
- ObjectUpdatePacket updateToOwner = new ObjectUpdatePacket();
- updateToOwner.RegionData.RegionHandle = obj.RegionHandle;
- //updateToOwner.RegionData.TimeDilation = (ushort)(timeDilation * (float)UInt16.MaxValue);
- updateToOwner.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
- updateToOwner.ObjectData[0] = BuildUpdateBlock(obj, obj.Flags | creatorFlags | PrimFlags.ObjectYouOwner, 0);
-
- m_udpServer.SendPacket(llOwner.UDPClient, updateToOwner, ThrottleOutPacketType.State, true);
- }
-
- // Send an update out to everyone else
- ObjectUpdatePacket updateToOthers = new ObjectUpdatePacket();
- updateToOthers.RegionData.RegionHandle = obj.RegionHandle;
- //updateToOthers.RegionData.TimeDilation = (ushort)(timeDilation * (float)UInt16.MaxValue);
- updateToOthers.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
- updateToOthers.ObjectData[0] = BuildUpdateBlock(obj, obj.Flags, 0);
-
- m_scene.ClientManager.ForEach(
- delegate(IClientAPI client)
- {
- if (client.AgentId != obj.OwnerID && client is LLClientView)
- {
- LLClientView llClient = (LLClientView)client;
- m_udpServer.SendPacket(llClient.UDPClient, updateToOthers, ThrottleOutPacketType.State, true);
- }
- }
- );
- }
-
- void SendObjectUpdateCompressed(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
- {
- }
-
- void SendImprovedTerseObjectUpdate(SceneObjectPart obj, PrimFlags creatorFlags, PrimUpdateFlags updateFlags)
- {
- }
-
- void UpdateFlagsToPacketType(PrimFlags creatorFlags, PrimUpdateFlags updateFlags, out bool canUseCompressed, out bool canUseImproved)
- {
- canUseCompressed = true;
- canUseImproved = true;
-
- if ((updateFlags & PrimUpdateFlags.FullUpdate) == PrimUpdateFlags.FullUpdate || creatorFlags != PrimFlags.None)
- {
- canUseCompressed = false;
- canUseImproved = false;
- }
- else
- {
- if ((updateFlags & PrimUpdateFlags.Velocity) != 0 ||
- (updateFlags & PrimUpdateFlags.Acceleration) != 0 ||
- (updateFlags & PrimUpdateFlags.CollisionPlane) != 0 ||
- (updateFlags & PrimUpdateFlags.Joint) != 0)
- {
- canUseCompressed = false;
- }
-
- if ((updateFlags & PrimUpdateFlags.PrimFlags) != 0 ||
- (updateFlags & PrimUpdateFlags.ParentID) != 0 ||
- (updateFlags & PrimUpdateFlags.Scale) != 0 ||
- (updateFlags & PrimUpdateFlags.PrimData) != 0 ||
- (updateFlags & PrimUpdateFlags.Text) != 0 ||
- (updateFlags & PrimUpdateFlags.NameValue) != 0 ||
- (updateFlags & PrimUpdateFlags.ExtraData) != 0 ||
- (updateFlags & PrimUpdateFlags.TextureAnim) != 0 ||
- (updateFlags & PrimUpdateFlags.Sound) != 0 ||
- (updateFlags & PrimUpdateFlags.Particles) != 0 ||
- (updateFlags & PrimUpdateFlags.Material) != 0 ||
- (updateFlags & PrimUpdateFlags.ClickAction) != 0 ||
- (updateFlags & PrimUpdateFlags.MediaURL) != 0 ||
- (updateFlags & PrimUpdateFlags.Joint) != 0)
- {
- canUseImproved = false;
- }
- }
- }*/
-
- #endregion Prim/Avatar Updates
-
#region Avatar Packet/Data Sending Methods
///
@@ -3314,7 +3221,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
ProcessAvatarTerseUpdates();
}
- private void ProcessAvatarTerseUpdates()
+ protected void ProcessAvatarTerseUpdates()
{
ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
terse.Header.Reliable = false;
@@ -3335,6 +3242,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
terse.ObjectData[i] = m_avatarTerseUpdates.Dequeue();
}
+ // HACK: Using the task category until the tiered reprioritization code is in
OutPacket(terse, ThrottleOutPacketType.Task);
}
@@ -4430,11 +4338,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
protected virtual void RegisterLocalPacketHandlers()
{
- AddLocalPacketHandler(PacketType.LogoutRequest, Logout);
+ AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout);
AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate);
AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect);
- AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached);
- AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate);
+ AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached);
+ AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate);
AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest);
AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest);
AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
@@ -4703,7 +4611,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
///
///
- protected virtual bool Logout(IClientAPI client, Packet packet)
+ protected virtual bool HandleLogout(IClientAPI client, Packet packet)
{
if (packet.Type == PacketType.LogoutRequest)
{
@@ -4741,7 +4649,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
///
///
- protected bool AgentTextureCached(IClientAPI simclient, Packet packet)
+ protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
{
//m_log.Debug("texture cached: " + packet.ToString());
AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
@@ -4771,7 +4679,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return true;
}
- protected bool MultipleObjUpdate(IClientAPI simClient, Packet packet)
+ protected bool HandleMultipleObjUpdate(IClientAPI simClient, Packet packet)
{
MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
if (multipleupdate.AgentData.SessionID != SessionId) return false;
@@ -5050,7 +4958,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
/// Packet to send
/// Throttling category for the packet
- private void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
+ protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
{
m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true);
}
@@ -9944,7 +9852,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
commandMessagePacket.CommandBlock.Command = (uint)command;
commandMessagePacket.CommandBlock.Time = time;
- OutPacket(commandMessagePacket, ThrottleOutPacketType.Unknown);
+ OutPacket(commandMessagePacket, ThrottleOutPacketType.Task);
}
public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID,
@@ -9962,7 +9870,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
- OutPacket(updatePacket, ThrottleOutPacketType.Unknown);
+ OutPacket(updatePacket, ThrottleOutPacketType.Task);
}
#endregion
@@ -10236,7 +10144,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
#region PriorityQueue
- private class PriorityQueue
+ public class PriorityQueue
{
internal delegate bool UpdatePriorityHandler(ref TPriority priority, uint local_id);
@@ -10264,7 +10172,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
this.m_comparison = comparison;
}
- internal object SyncRoot { get { return this.m_syncRoot; } }
+ public object SyncRoot { get { return this.m_syncRoot; } }
internal int Count
{
get
@@ -10276,7 +10184,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
- internal bool Enqueue(TPriority priority, TValue value, uint local_id)
+ public bool Enqueue(TPriority priority, TValue value, uint local_id)
{
LookupItem item;
@@ -10396,5 +10304,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
#endregion
+ public static OSD BuildEvent(string eventName, OSD eventBody)
+ {
+ OSDMap osdEvent = new OSDMap(2);
+ osdEvent.Add("message", new OSDString(eventName));
+ osdEvent.Add("body", eventBody);
+
+ return osdEvent;
+ }
}
}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index 84a495959a..9856a1cce4 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -135,8 +135,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
private readonly TokenBucket m_throttle;
/// Throttle buckets for each packet category
private readonly TokenBucket[] m_throttleCategories;
- /// Throttle rate defaults and limits
- private readonly ThrottleRates m_defaultThrottleRates;
/// Outgoing queues for throttled packets
private readonly OpenSim.Framework.LocklessQueue[] m_packetOutboxes = new OpenSim.Framework.LocklessQueue[THROTTLE_CATEGORY_COUNT];
/// A container that can hold one packet for each outbox, used to store
@@ -145,6 +143,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// A reference to the LLUDPServer that is managing this client
private readonly LLUDPServer m_udpServer;
+ private int m_defaultRTO = 3000;
+ private int m_maxRTO = 60000;
+
///
/// Default constructor
///
@@ -155,13 +156,17 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Circuit code for this connection
/// AgentID for the connected agent
/// Remote endpoint for this connection
- public LLUDPClient(LLUDPServer server, ThrottleRates rates, TokenBucket parentThrottle, uint circuitCode, UUID agentID, IPEndPoint remoteEndPoint)
+ public LLUDPClient(LLUDPServer server, ThrottleRates rates, TokenBucket parentThrottle, uint circuitCode, UUID agentID, IPEndPoint remoteEndPoint, int defaultRTO, int maxRTO)
{
AgentID = agentID;
RemoteEndPoint = remoteEndPoint;
CircuitCode = circuitCode;
m_udpServer = server;
- m_defaultThrottleRates = rates;
+ if (defaultRTO != 0)
+ m_defaultRTO = defaultRTO;
+ if (maxRTO != 0)
+ m_maxRTO = maxRTO;
+
// Create a token bucket throttle for this client that has the scene token bucket as a parent
m_throttle = new TokenBucket(parentThrottle, rates.TotalLimit, rates.Total);
// Create an array of token buckets for this clients different throttle categories
@@ -178,7 +183,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
// Default the retransmission timeout to three seconds
- RTO = 3000;
+ RTO = m_defaultRTO;
// Initialize this to a sane value to prevent early disconnects
TickLastPacketReceived = Environment.TickCount & Int32.MaxValue;
@@ -500,7 +505,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR));
// Clamp the retransmission timeout to manageable values
- rto = Utils.Clamp(RTO, 3000, 60000);
+ rto = Utils.Clamp(RTO, m_defaultRTO, m_maxRTO);
RTO = rto;
@@ -520,7 +525,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
RTTVAR = 0.0f;
// Double the retransmission timeout
- RTO = Math.Min(RTO * 2, 60000);
+ RTO = Math.Min(RTO * 2, m_maxRTO);
}
///
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 74d3262680..93946ae50b 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -118,13 +118,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
///
//private UDPClientCollection m_clients = new UDPClientCollection();
/// Bandwidth throttle for this UDP server
- private TokenBucket m_throttle;
+ protected TokenBucket m_throttle;
/// Bandwidth throttle rates for this UDP server
- private ThrottleRates m_throttleRates;
+ protected ThrottleRates m_throttleRates;
/// Manages authentication for agent circuits
private AgentCircuitManager m_circuitManager;
/// Reference to the scene this UDP server is attached to
- private Scene m_scene;
+ protected Scene m_scene;
/// The X/Y coordinates of the scene this UDP server is attached to
private Location m_location;
/// The size of the receive buffer for the UDP socket. This value
@@ -153,6 +153,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Flag to signal when clients should send pings
private bool m_sendPing;
+ private int m_defaultRTO = 0;
+ private int m_maxRTO = 0;
+
public Socket Server { get { return null; } }
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
AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10);
PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100);
TextureSendLimit = config.GetInt("TextureSendLimit", 20);
+
+ m_defaultRTO = config.GetInt("DefaultRTO", 0);
+ m_maxRTO = config.GetInt("MaxRTO", 0);
}
else
{
@@ -247,8 +253,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public void BroadcastPacket(Packet packet, ThrottleOutPacketType category, bool sendToPausedAgents, bool allowSplitting)
{
- // CoarseLocationUpdate packets cannot be split in an automated way
- if (packet.Type == PacketType.CoarseLocationUpdate && allowSplitting)
+ // CoarseLocationUpdate and AvatarGroupsReply packets cannot be split in an automated way
+ if ((packet.Type == PacketType.CoarseLocationUpdate || packet.Type == PacketType.AvatarGroupsReply) && allowSplitting)
allowSplitting = false;
if (allowSplitting && packet.HasVariableBlocks)
@@ -256,8 +262,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
byte[][] datas = packet.ToBytesMultiple();
int packetCount = datas.Length;
- //if (packetCount > 1)
- // m_log.Debug("[LLUDPSERVER]: Split " + packet.Type + " packet into " + packetCount + " packets");
+ if (packetCount < 1)
+ m_log.Error("[LLUDPSERVER]: Failed to split " + packet.Type + " with estimated length " + packet.Length);
for (int i = 0; i < packetCount; i++)
{
@@ -295,8 +301,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
byte[][] datas = packet.ToBytesMultiple();
int packetCount = datas.Length;
- //if (packetCount > 1)
- // m_log.Debug("[LLUDPSERVER]: Split " + packet.Type + " packet into " + packetCount + " packets");
+ if (packetCount < 1)
+ m_log.Error("[LLUDPSERVER]: Failed to split " + packet.Type + " with estimated length " + packet.Length);
for (int i = 0; i < packetCount; i++)
{
@@ -409,6 +415,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
SendPacket(udpClient, pc, ThrottleOutPacketType.Unknown, false);
}
+ public void CompletePing(LLUDPClient udpClient, byte pingID)
+ {
+ CompletePingCheckPacket completePing = new CompletePingCheckPacket();
+ completePing.PingID.PingID = pingID;
+ SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false);
+ }
+
public void ResendUnacked(LLUDPClient udpClient)
{
if (!udpClient.IsConnected)
@@ -429,7 +442,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (expiredPackets != null)
{
- m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
+ //m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO);
// Exponential backoff of the retransmission timeout
udpClient.BackoffRTO();
@@ -585,7 +598,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IClientAPI client;
if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView))
{
- m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
+ //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
return;
}
@@ -669,10 +682,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
// We don't need to do anything else with ping checks
StartPingCheckPacket startPing = (StartPingCheckPacket)packet;
-
- CompletePingCheckPacket completePing = new CompletePingCheckPacket();
- completePing.PingID.PingID = startPing.PingID.PingID;
- SendPacket(udpClient, completePing, ThrottleOutPacketType.Unknown, false);
+ CompletePing(udpClient, startPing.PingID.PingID);
return;
}
else if (packet.Type == PacketType.CompletePingCheck)
@@ -759,10 +769,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
- private void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
+ protected virtual void AddClient(uint circuitCode, UUID agentID, UUID sessionID, IPEndPoint remoteEndPoint, AuthenticateResponse sessionInfo)
{
// Create the LLUDPClient
- LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint);
+ LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint, m_defaultRTO, m_maxRTO);
IClientAPI existingClient;
if (!m_scene.TryGetClient(agentID, out existingClient))
@@ -976,7 +986,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
- private void LogoutHandler(IClientAPI client)
+ protected void LogoutHandler(IClientAPI client)
{
client.SendLogoutPacket();
if (client.IsActive)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
index 008d827e20..aaf6e26d58 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/ThrottleRates.cs
@@ -87,15 +87,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IConfig throttleConfig = config.Configs["ClientStack.LindenUDP"];
Resend = throttleConfig.GetInt("resend_default", 12500);
- Land = throttleConfig.GetInt("land_default", 500);
- Wind = throttleConfig.GetInt("wind_default", 500);
- Cloud = throttleConfig.GetInt("cloud_default", 500);
- Task = throttleConfig.GetInt("task_default", 500);
- Texture = throttleConfig.GetInt("texture_default", 500);
- Asset = throttleConfig.GetInt("asset_default", 500);
- State = throttleConfig.GetInt("state_default", 500);
-
- Total = throttleConfig.GetInt("client_throttle_max_bps", 0);
+ Land = throttleConfig.GetInt("land_default", 1000);
+ Wind = throttleConfig.GetInt("wind_default", 1000);
+ Cloud = throttleConfig.GetInt("cloud_default", 1000);
+ Task = throttleConfig.GetInt("task_default", 1000);
+ Texture = throttleConfig.GetInt("texture_default", 1000);
+ Asset = throttleConfig.GetInt("asset_default", 1000);
+ State = throttleConfig.GetInt("state_default", 1000);
ResendLimit = throttleConfig.GetInt("resend_limit", 18750);
LandLimit = throttleConfig.GetInt("land_limit", 29750);
@@ -104,9 +102,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
TaskLimit = throttleConfig.GetInt("task_limit", 18750);
TextureLimit = throttleConfig.GetInt("texture_limit", 55750);
AssetLimit = throttleConfig.GetInt("asset_limit", 27500);
- State = throttleConfig.GetInt("state_limit", 37000);
+ StateLimit = throttleConfig.GetInt("state_limit", 37000);
- TotalLimit = throttleConfig.GetInt("client_throttle_max_bps", 0);
+ Total = throttleConfig.GetInt("client_throttle_max_bps", 0);
+ TotalLimit = Total;
}
catch (Exception) { }
}
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 0000000000..b546ccb9fb
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Alerts/DeadlockAlert.cs
@@ -0,0 +1,37 @@
+using OpenSim.Region.CoreModules.Framework.Monitoring.Monitors;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Alerts
+{
+ class DeadlockAlert : IAlert
+ {
+ private LastFrameTimeMonitor m_monitor;
+
+ public DeadlockAlert(LastFrameTimeMonitor m_monitor)
+ {
+ this.m_monitor = m_monitor;
+ }
+
+ #region Implementation of IAlert
+
+ public string GetName()
+ {
+ return "Potential Deadlock Alert";
+ }
+
+ public void Test()
+ {
+ if (m_monitor.GetValue() > 60 * 1000)
+ {
+ if(OnTriggerAlert != null)
+ {
+ OnTriggerAlert(typeof (DeadlockAlert),
+ (int) (m_monitor.GetValue()/1000) + " second(s) since last frame processed.", true);
+ }
+ }
+ }
+
+ public event Alert OnTriggerAlert;
+
+ #endregion
+ }
+}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs
new file mode 100644
index 0000000000..b533df9a5c
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/IAlert.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring
+{
+ internal delegate void Alert(Type reporter, string reason, bool fatal);
+
+ interface IAlert
+ {
+ string GetName();
+ void Test();
+ event Alert OnTriggerAlert;
+ }
+}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs
new file mode 100644
index 0000000000..a51dccdeba
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/IMonitor.cs
@@ -0,0 +1,9 @@
+namespace OpenSim.Region.CoreModules.Framework.Monitoring
+{
+ interface IMonitor
+ {
+ double GetValue();
+ string GetName();
+ string GetFriendlyValue(); // Convert to readable numbers
+ }
+}
diff --git a/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs
new file mode 100644
index 0000000000..769af8df6d
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/MonitorModule.cs
@@ -0,0 +1,93 @@
+using System.Collections.Generic;
+using System.Reflection;
+using log4net;
+using Nini.Config;
+using OpenSim.Region.CoreModules.Framework.Monitoring.Alerts;
+using OpenSim.Region.CoreModules.Framework.Monitoring.Monitors;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring
+{
+ public class MonitorModule : IRegionModule
+ {
+ private Scene m_scene;
+ private readonly List m_monitors = new List();
+ private readonly List m_alerts = new List();
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ public void DebugMonitors(string module, string[] args)
+ {
+ foreach (IMonitor monitor in m_monitors)
+ {
+ m_log.Info("[MonitorModule] " + m_scene.RegionInfo.RegionName + " reports " + monitor.GetName() + " = " + monitor.GetFriendlyValue());
+ }
+ }
+
+ public void TestAlerts()
+ {
+ foreach (IAlert alert in m_alerts)
+ {
+ alert.Test();
+ }
+ }
+
+ #region Implementation of IRegionModule
+
+ public void Initialise(Scene scene, IConfigSource source)
+ {
+ m_scene = scene;
+
+
+ m_scene.AddCommand(this, "monitor report",
+ "monitor report",
+ "Returns a variety of statistics about the current region and/or simulator",
+ DebugMonitors);
+ }
+
+ public void PostInitialise()
+ {
+ m_monitors.Add(new AgentCountMonitor(m_scene));
+ m_monitors.Add(new ChildAgentCountMonitor(m_scene));
+ m_monitors.Add(new GCMemoryMonitor());
+ m_monitors.Add(new ObjectCountMonitor(m_scene));
+ m_monitors.Add(new PhysicsFrameMonitor(m_scene));
+ m_monitors.Add(new PhysicsUpdateFrameMonitor(m_scene));
+ m_monitors.Add(new PWSMemoryMonitor());
+ m_monitors.Add(new ThreadCountMonitor());
+ m_monitors.Add(new TotalFrameMonitor(m_scene));
+ m_monitors.Add(new EventFrameMonitor(m_scene));
+ m_monitors.Add(new LandFrameMonitor(m_scene));
+ m_monitors.Add(new LastFrameTimeMonitor(m_scene));
+
+ m_alerts.Add(new DeadlockAlert(m_monitors.Find(x => x is LastFrameTimeMonitor) as LastFrameTimeMonitor));
+
+ foreach (IAlert alert in m_alerts)
+ {
+ alert.OnTriggerAlert += OnTriggerAlert;
+ }
+ }
+
+ void OnTriggerAlert(System.Type reporter, string reason, bool fatal)
+ {
+ m_log.Error("[Monitor] " + reporter.Name + " for " + m_scene.RegionInfo.RegionName + " reports " + reason + " (Fatal: " + fatal + ")");
+ }
+
+ public void Close()
+ {
+
+ }
+
+ public string Name
+ {
+ get { return "Region Health Monitoring Module"; }
+ }
+
+ public bool IsSharedModule
+ {
+ get { return false; }
+ }
+
+ #endregion
+ }
+}
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 0000000000..edc6e6b9e2
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/AgentCountMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class AgentCountMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public AgentCountMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.SceneGraph.GetRootAgentCount();
+ }
+
+ public string GetName()
+ {
+ return "Root Agent Count";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + " agent(s)";
+ }
+
+ #endregion
+ }
+}
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 0000000000..afe6b79953
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ChildAgentCountMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class ChildAgentCountMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public ChildAgentCountMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.SceneGraph.GetChildAgentCount();
+ }
+
+ public string GetName()
+ {
+ return "Child Agent Count";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + " child agent(s)";
+ }
+
+ #endregion
+ }
+}
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 0000000000..dec5a9e445
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/EventFrameMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class EventFrameMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public EventFrameMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.MonitorEventTime;
+ }
+
+ public string GetName()
+ {
+ return "Total Event Frame Time";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + "ms";
+ }
+
+ #endregion
+ }
+}
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 0000000000..cd67fea9ac
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/GCMemoryMonitor.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class GCMemoryMonitor : IMonitor
+ {
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return GC.GetTotalMemory(false);
+ }
+
+ public string GetName()
+ {
+ return "GC Reported Memory";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)(GetValue() / (1024*1024)) + "MB (Global)";
+ }
+
+ #endregion
+ }
+}
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 0000000000..d883fc7ee5
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LandFrameMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class LandFrameMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public LandFrameMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.MonitorLandTime;
+ }
+
+ public string GetName()
+ {
+ return "Land Frame Time";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + "ms";
+ }
+
+ #endregion
+ }
+}
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 0000000000..36363f89f8
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/LastFrameTimeMonitor.cs
@@ -0,0 +1,34 @@
+using System;
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class LastFrameTimeMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public LastFrameTimeMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return Environment.TickCount - m_scene.MonitorLastFrameTick;
+ }
+
+ public string GetName()
+ {
+ return "Last Completed Frame At";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + "ms ago";
+ }
+
+ #endregion
+ }
+}
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 0000000000..dd9b19df51
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ObjectCountMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class ObjectCountMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public ObjectCountMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.SceneGraph.GetTotalObjectsCount();
+ }
+
+ public string GetName()
+ {
+ return "Total Objects Count";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + " Object(s)";
+ }
+
+ #endregion
+ }
+}
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 0000000000..88f2938c52
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PWSMemoryMonitor.cs
@@ -0,0 +1,26 @@
+using System;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class PWSMemoryMonitor : IMonitor
+ {
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return System.Diagnostics.Process.GetCurrentProcess().PrivateMemorySize64;
+ }
+
+ public string GetName()
+ {
+ return "Private Working Set Memory";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)(GetValue() / (1024 * 1024)) + "MB (Global)";
+ }
+
+ #endregion
+ }
+}
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 0000000000..4d62e4f831
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsFrameMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class PhysicsFrameMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public PhysicsFrameMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.MonitorPhysicsSyncTime + m_scene.MonitorPhysicsUpdateTime;
+ }
+
+ public string GetName()
+ {
+ return "Total Physics Frame Time";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + "ms";
+ }
+
+ #endregion
+ }
+}
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 0000000000..91ac282ebd
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/PhysicsUpdateFrameMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class PhysicsUpdateFrameMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public PhysicsUpdateFrameMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.MonitorPhysicsUpdateTime;
+ }
+
+ public string GetName()
+ {
+ return "Physics Update Frame Time";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + "ms";
+ }
+
+ #endregion
+ }
+}
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 0000000000..9300a932f5
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/ThreadCountMonitor.cs
@@ -0,0 +1,25 @@
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class ThreadCountMonitor : IMonitor
+ {
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return System.Diagnostics.Process.GetCurrentProcess().Threads.Count;
+ }
+
+ public string GetName()
+ {
+ return "Total Threads";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + " Thread(s) (Global)";
+ }
+
+ #endregion
+ }
+}
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 0000000000..dea1f94ca6
--- /dev/null
+++ b/OpenSim/Region/CoreModules/Framework/Monitoring/Monitors/TotalFrameMonitor.cs
@@ -0,0 +1,33 @@
+using OpenSim.Region.Framework.Scenes;
+
+namespace OpenSim.Region.CoreModules.Framework.Monitoring.Monitors
+{
+ class TotalFrameMonitor : IMonitor
+ {
+ private readonly Scene m_scene;
+
+ public TotalFrameMonitor(Scene scene)
+ {
+ m_scene = scene;
+ }
+
+ #region Implementation of IMonitor
+
+ public double GetValue()
+ {
+ return m_scene.MonitorFrameTime;
+ }
+
+ public string GetName()
+ {
+ return "Total Frame Time";
+ }
+
+ public string GetFriendlyValue()
+ {
+ return (int)GetValue() + "ms";
+ }
+
+ #endregion
+ }
+}
diff --git a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
index 4199c98a9d..46ee3c005a 100644
--- a/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
+++ b/OpenSim/Region/CoreModules/Hypergrid/HGStandaloneLoginModule.cs
@@ -193,6 +193,10 @@ namespace OpenSim.Region.CoreModules.Hypergrid
{
return scene.RegionInfo;
}
+ else if (m_scenes.Count > 0)
+ {
+ return m_scenes[0].RegionInfo;
+ }
return null;
}
@@ -248,7 +252,7 @@ namespace OpenSim.Region.CoreModules.Hypergrid
{
foreach (Scene nextScene in m_scenes)
{
- if (nextScene.RegionInfo.RegionName == regionName)
+ if (nextScene.RegionInfo.RegionName.Equals(regionName, StringComparison.InvariantCultureIgnoreCase))
{
scene = nextScene;
return true;
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Grid/HGGridConnector.cs
index 046bee5b63..40ac647d08 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
{
List rinfos = new List();
- // Commenting until regionname exists
- //foreach (SimpleRegionInfo r in m_HyperlinkRegions.Values)
- // if ((r.RegionName != null) && r.RegionName.StartsWith(name))
- // rinfos.Add(r);
+ if (name == string.Empty)
+ return rinfos;
+
+ foreach (GridRegion r in m_HyperlinkRegions.Values)
+ if ((r.RegionName != null) && r.RegionName.ToLower().StartsWith(name.ToLower()))
+ rinfos.Add(r);
rinfos.AddRange(m_GridServiceConnector.GetRegionsByName(scopeID, name, maxNumber));
return rinfos;
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs
index 54acbc4359..c261943a3c 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
successfulAssetRestores++;
else
failedAssetRestores++;
+
+ if ((successfulAssetRestores + failedAssetRestores) % 250 == 0)
+ m_log.Debug("[ARCHIVER]: Loaded " + successfulAssetRestores + " assets and failed to load " + failedAssetRestores + " assets...");
}
else if (!m_merge && filePath.StartsWith(ArchiveConstants.TERRAINS_PATH))
{
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs
index d01cef7bcf..d1d6b6a377 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;
namespace OpenSim.Region.Framework.Scenes
{
#region Delegates
- public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectIDID);
+ public delegate uint GenerateClientFlagsHandler(UUID userID, UUID objectID);
public delegate void SetBypassPermissionsHandler(bool value);
public delegate bool BypassPermissionsHandler();
public delegate bool PropagatePermissionsHandler();
@@ -147,28 +147,28 @@ namespace OpenSim.Region.Framework.Scenes
public uint GenerateClientFlags(UUID userID, UUID objectID)
{
- SceneObjectPart part=m_scene.GetSceneObjectPart(objectID);
+ // libomv will moan about PrimFlags.ObjectYouOfficer being
+ // obsolete...
+#pragma warning disable 0612
+ const PrimFlags DEFAULT_FLAGS =
+ PrimFlags.ObjectModify |
+ PrimFlags.ObjectCopy |
+ PrimFlags.ObjectMove |
+ PrimFlags.ObjectTransfer |
+ PrimFlags.ObjectYouOwner |
+ PrimFlags.ObjectAnyOwner |
+ PrimFlags.ObjectOwnerModify |
+ PrimFlags.ObjectYouOfficer;
+#pragma warning restore 0612
+
+ SceneObjectPart part = m_scene.GetSceneObjectPart(objectID);
if (part == null)
return 0;
- // libomv will moan about PrimFlags.ObjectYouOfficer being
- // obsolete...
- #pragma warning disable 0612
- uint perms=part.GetEffectiveObjectFlags() |
- (uint)PrimFlags.ObjectModify |
- (uint)PrimFlags.ObjectCopy |
- (uint)PrimFlags.ObjectMove |
- (uint)PrimFlags.ObjectTransfer |
- (uint)PrimFlags.ObjectYouOwner |
- (uint)PrimFlags.ObjectAnyOwner |
- (uint)PrimFlags.ObjectOwnerModify |
- (uint)PrimFlags.ObjectYouOfficer;
- #pragma warning restore 0612
-
- GenerateClientFlagsHandler handlerGenerateClientFlags =
- OnGenerateClientFlags;
+ uint perms = part.GetEffectiveObjectFlags() | (uint)DEFAULT_FLAGS;
+ GenerateClientFlagsHandler handlerGenerateClientFlags = OnGenerateClientFlags;
if (handlerGenerateClientFlags != null)
{
Delegate[] list = handlerGenerateClientFlags.GetInvocationList();
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 7c3875d5f0..a6ee40a0ab 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -135,6 +135,11 @@ namespace OpenSim.Region.Framework.Scenes
protected SceneCommunicationService m_sceneGridService;
public bool loginsdisabled = true;
+ public new float TimeDilation
+ {
+ get { return m_sceneGraph.PhysicsScene.TimeDilation; }
+ }
+
public SceneCommunicationService SceneGridService
{
get { return m_sceneGridService; }
@@ -252,7 +257,7 @@ namespace OpenSim.Region.Framework.Scenes
// Central Update Loop
protected int m_fps = 10;
- protected int m_frame;
+ protected uint m_frame;
protected float m_timespan = 0.089f;
protected DateTime m_lastupdate = DateTime.UtcNow;
@@ -269,6 +274,23 @@ namespace OpenSim.Region.Framework.Scenes
private int physicsMS2;
private int physicsMS;
private int otherMS;
+ private int tempOnRezMS;
+ private int eventMS;
+ private int backupMS;
+ private int terrainMS;
+ private int landMS;
+ private int lastCompletedFrame;
+
+ public int MonitorFrameTime { get { return frameMS; } }
+ public int MonitorPhysicsUpdateTime { get { return physicsMS; } }
+ public int MonitorPhysicsSyncTime { get { return physicsMS2; } }
+ public int MonitorOtherTime { get { return otherMS; } }
+ public int MonitorTempOnRezTime { get { return tempOnRezMS; } }
+ public int MonitorEventTime { get { return eventMS; } } // This may need to be divided into each event?
+ public int MonitorBackupTime { get { return backupMS; } }
+ public int MonitorTerrainTime { get { return terrainMS; } }
+ public int MonitorLandTime { get { return landMS; } }
+ public int MonitorLastFrameTick { get { return lastCompletedFrame; } }
private bool m_physics_enabled = true;
private bool m_scripts_enabled = true;
@@ -1013,36 +1035,25 @@ namespace OpenSim.Region.Framework.Scenes
///
public override void Update()
{
- int maintc = 0;
+ float physicsFPS;
+ int maintc;
+
while (!shuttingdown)
{
-//#if DEBUG
-// int w = 0, io = 0;
-// ThreadPool.GetAvailableThreads(out w, out io);
-// if ((w < 10) || (io < 10))
-// m_log.DebugFormat("[WARNING]: ThreadPool reaching exhaustion. workers = {0}; io = {1}", w, io);
-//#endif
- maintc = Environment.TickCount;
-
TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate;
- float physicsFPS = 0;
+ physicsFPS = 0f;
- frameMS = Environment.TickCount;
+ maintc = maintc = otherMS = Environment.TickCount;
+ int tmpFrameMS = maintc;
+
+ // Increment the frame counter
+ ++m_frame;
try
{
- // Increment the frame counter
- m_frame++;
-
- // Loop it
- if (m_frame == Int32.MaxValue)
- m_frame = 0;
-
- otherMS = Environment.TickCount;
-
// Check if any objects have reached their targets
CheckAtTargets();
-
+
// Update SceneObjectGroups that have scheduled themselves for updates
// Objects queue their updates onto all scene presences
if (m_frame % m_update_objects == 0)
@@ -1053,62 +1064,92 @@ namespace OpenSim.Region.Framework.Scenes
if (m_frame % m_update_presences == 0)
m_sceneGraph.UpdatePresences();
- physicsMS2 = Environment.TickCount;
+ int TempPhysicsMS2 = Environment.TickCount;
if ((m_frame % m_update_physics == 0) && m_physics_enabled)
m_sceneGraph.UpdatePreparePhysics();
- physicsMS2 = Environment.TickCount - physicsMS2;
+ TempPhysicsMS2 = Environment.TickCount - TempPhysicsMS2;
+ physicsMS2 = TempPhysicsMS2;
if (m_frame % m_update_entitymovement == 0)
m_sceneGraph.UpdateScenePresenceMovement();
- physicsMS = Environment.TickCount;
- if ((m_frame % m_update_physics == 0) && m_physics_enabled)
- physicsFPS = m_sceneGraph.UpdatePhysics(
- Math.Max(SinceLastFrame.TotalSeconds, m_timespan)
- );
- if (m_frame % m_update_physics == 0 && SynchronizeScene != null)
- SynchronizeScene(this);
-
- physicsMS = Environment.TickCount - physicsMS;
- physicsMS += physicsMS2;
+ int TempPhysicsMS = Environment.TickCount;
+ if (m_frame % m_update_physics == 0)
+ {
+ if (m_physics_enabled)
+ physicsFPS = m_sceneGraph.UpdatePhysics(Math.Max(SinceLastFrame.TotalSeconds, m_timespan));
+ if (SynchronizeScene != null)
+ SynchronizeScene(this);
+ }
+ TempPhysicsMS = Environment.TickCount - TempPhysicsMS;
+ physicsMS = TempPhysicsMS;
// Delete temp-on-rez stuff
if (m_frame % m_update_backup == 0)
+ {
+ int tozMS = Environment.TickCount;
CleanTempObjects();
+ tozMS -= Environment.TickCount;
+ tempOnRezMS = tozMS;
+ }
if (RegionStatus != RegionStatus.SlaveScene)
{
if (m_frame % m_update_events == 0)
+ {
+ int evMS = Environment.TickCount;
UpdateEvents();
+ evMS -= Environment.TickCount;
+ eventMS = evMS;
+ }
if (m_frame % m_update_backup == 0)
+ {
+ int backMS = Environment.TickCount;
UpdateStorageBackup();
+ backMS -= Environment.TickCount;
+ backupMS = backMS;
+ }
if (m_frame % m_update_terrain == 0)
+ {
+ int terMS = Environment.TickCount;
UpdateTerrain();
+ terMS -= Environment.TickCount;
+ terrainMS = terMS;
+ }
if (m_frame % m_update_land == 0)
+ {
+ int ldMS = Environment.TickCount;
UpdateLand();
+ ldMS -= Environment.TickCount;
+ landMS = ldMS;
+ }
+
+ int tickCount = Environment.TickCount;
+ otherMS = tickCount - otherMS;
+ tmpFrameMS -= tickCount;
+ frameMS = tmpFrameMS;
+ lastCompletedFrame = tickCount;
- otherMS = Environment.TickCount - otherMS;
// if (m_frame%m_update_avatars == 0)
// UpdateInWorldTime();
StatsReporter.AddPhysicsFPS(physicsFPS);
- StatsReporter.AddTimeDilation(m_timedilation);
+ StatsReporter.AddTimeDilation(TimeDilation);
StatsReporter.AddFPS(1);
- StatsReporter.AddInPackets(0);
StatsReporter.SetRootAgents(m_sceneGraph.GetRootAgentCount());
StatsReporter.SetChildAgents(m_sceneGraph.GetChildAgentCount());
StatsReporter.SetObjects(m_sceneGraph.GetTotalObjectsCount());
StatsReporter.SetActiveObjects(m_sceneGraph.GetActiveObjectsCount());
- frameMS = Environment.TickCount - frameMS;
StatsReporter.addFrameMS(frameMS);
- StatsReporter.addPhysicsMS(physicsMS);
+ StatsReporter.addPhysicsMS(physicsMS + physicsMS2);
StatsReporter.addOtherMS(otherMS);
StatsReporter.SetActiveScripts(m_sceneGraph.GetActiveScriptsCount());
StatsReporter.addScriptLines(m_sceneGraph.GetScriptLPS());
}
- if (loginsdisabled && (m_frame > 20))
+
+ if (loginsdisabled && m_frame > 20)
{
// In 99.9% of cases it is a bad idea to manually force garbage collection. However,
// 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
}
finally
{
- //updateLock.ReleaseMutex();
- // Get actual time dilation
- float tmpval = (m_timespan / (float)SinceLastFrame.TotalSeconds);
-
- // If actual time dilation is greater then one, we're catching up, so subtract
- // the amount that's greater then 1 from the time dilation
- if (tmpval > 1.0)
- {
- tmpval = tmpval - (tmpval - 1.0f);
- }
- m_timedilation = tmpval;
-
m_lastupdate = DateTime.UtcNow;
}
maintc = Environment.TickCount - maintc;
@@ -1183,9 +1212,9 @@ namespace OpenSim.Region.Framework.Scenes
{
lock (m_groupsWithTargets)
{
- foreach (KeyValuePair kvp in m_groupsWithTargets)
+ foreach (SceneObjectGroup entry in m_groupsWithTargets.Values)
{
- kvp.Value.checkAtTargets();
+ entry.checkAtTargets();
}
}
}
@@ -4606,7 +4635,7 @@ namespace OpenSim.Region.Framework.Scenes
SceneObjectPart trackedBody = GetSceneObjectPart(joint.TrackedBodyName); // FIXME: causes a sequential lookup
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.
jointProxyObject.Velocity = trackedBody.Velocity;
- jointProxyObject.RotationalVelocity = trackedBody.RotationalVelocity;
+ jointProxyObject.AngularVelocity = trackedBody.AngularVelocity;
switch (joint.Type)
{
case PhysicsJointType.Ball:
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs
index 82731d1c58..1547f9a9b6 100644
--- a/OpenSim/Region/Framework/Scenes/SceneBase.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs
@@ -106,9 +106,8 @@ namespace OpenSim.Region.Framework.Scenes
public float TimeDilation
{
- get { return m_timedilation; }
+ get { return 1.0f; }
}
- protected float m_timedilation = 1.0f;
protected ulong m_regionHandle;
protected string m_regionName;
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index db055f968e..2fdb48dd89 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -369,26 +369,30 @@ namespace OpenSim.Region.Framework.Scenes
///
protected internal void UpdateObjectGroups()
{
- Dictionary updates;
+ List updates;
+
// Some updates add more updates to the updateList.
// Get the current list of updates and clear the list before iterating
lock (m_updateList)
{
- updates = new Dictionary(m_updateList);
+ updates = new List(m_updateList.Values);
m_updateList.Clear();
}
+
// Go through all updates
- foreach (KeyValuePair kvp in updates)
+ for (int i = 0; i < updates.Count; i++)
{
+ SceneObjectGroup sog = updates[i];
+
// Don't abort the whole update if one entity happens to give us an exception.
try
{
- kvp.Value.Update();
+ sog.Update();
}
catch (Exception e)
{
m_log.ErrorFormat(
- "[INNER SCENE]: Failed to update {0}, {1} - {2}", kvp.Value.Name, kvp.Value.UUID, e);
+ "[INNER SCENE]: Failed to update {0}, {1} - {2}", sog.Name, sog.UUID, e);
}
}
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 38a0cff7bf..0b752c967a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1015,9 +1015,9 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public float GetTimeDilation()
+ public ushort GetTimeDilation()
{
- return m_scene.TimeDilation;
+ return Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
}
///
@@ -1857,28 +1857,15 @@ namespace OpenSim.Region.Framework.Scenes
{
bool UsePhysics = ((RootPart.Flags & PrimFlags.Physics) != 0);
- //if (IsAttachment)
- //{
- //foreach (SceneObjectPart part in m_parts.Values)
- //{
- //part.SendScheduledUpdates();
- //}
- //return;
- //}
-
- if (UsePhysics && Util.DistanceLessThan(lastPhysGroupPos, AbsolutePosition, 0.02))
+ if (UsePhysics && !AbsolutePosition.ApproxEquals(lastPhysGroupPos, 0.02f))
{
m_rootPart.UpdateFlag = 1;
lastPhysGroupPos = AbsolutePosition;
}
- if (UsePhysics && ((Math.Abs(lastPhysGroupRot.W - GroupRotation.W) > 0.1)
- || (Math.Abs(lastPhysGroupRot.X - GroupRotation.X) > 0.1)
- || (Math.Abs(lastPhysGroupRot.Y - GroupRotation.Y) > 0.1)
- || (Math.Abs(lastPhysGroupRot.Z - GroupRotation.Z) > 0.1)))
+ if (UsePhysics && !GroupRotation.ApproxEquals(lastPhysGroupRot, 0.1f))
{
m_rootPart.UpdateFlag = 1;
-
lastPhysGroupRot = GroupRotation;
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 9b11582d7b..2bc7f66ef9 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -253,6 +253,7 @@ namespace OpenSim.Region.Framework.Scenes
protected Vector3 m_lastVelocity;
protected Vector3 m_lastAcceleration;
protected Vector3 m_lastAngularVelocity;
+ protected int m_lastTerseSent;
// TODO: Those have to be changed into persistent properties at some later point,
// or sit-camera on vehicles will break on sim-crossing.
@@ -506,20 +507,17 @@ namespace OpenSim.Region.Framework.Scenes
get
{
// If this is a linkset, we don't want the physics engine mucking up our group position here.
- if (PhysActor != null && _parentID == 0)
+ PhysicsActor actor = PhysActor;
+ if (actor != null && _parentID == 0)
{
- m_groupPosition.X = PhysActor.Position.X;
- m_groupPosition.Y = PhysActor.Position.Y;
- m_groupPosition.Z = PhysActor.Position.Z;
+ m_groupPosition = actor.Position;
}
if (IsAttachment)
{
ScenePresence sp = m_parentGroup.Scene.GetScenePresence(AttachedAvatar);
if (sp != null)
- {
return sp.AbsolutePosition;
- }
}
return m_groupPosition;
@@ -530,26 +528,25 @@ namespace OpenSim.Region.Framework.Scenes
m_groupPosition = value;
- if (PhysActor != null)
+ PhysicsActor actor = PhysActor;
+ if (actor != null)
{
try
{
// Root prim actually goes at Position
if (_parentID == 0)
{
- PhysActor.Position = value;
+ actor.Position = value;
}
else
{
// To move the child prim in respect to the group position and rotation we have to calculate
- Vector3 resultingposition = GetWorldPosition();
- PhysActor.Position = resultingposition;
- Quaternion resultingrot = GetWorldRotation();
- PhysActor.Orientation = resultingrot;
+ actor.Position = GetWorldPosition();
+ actor.Orientation = GetWorldRotation();
}
// Tell the physics engines that this prim changed.
- m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
+ m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
catch (Exception e)
{
@@ -582,15 +579,14 @@ namespace OpenSim.Region.Framework.Scenes
if (ParentGroup != null && !ParentGroup.IsDeleted)
{
- if (_parentID != 0 && PhysActor != null)
+ PhysicsActor actor = PhysActor;
+ if (_parentID != 0 && actor != null)
{
- Vector3 resultingposition = GetWorldPosition();
- PhysActor.Position = resultingposition;
- Quaternion resultingrot = GetWorldRotation();
- PhysActor.Orientation = resultingrot;
+ actor.Position = GetWorldPosition();
+ actor.Orientation = GetWorldRotation();
// Tell the physics engines that this prim changed.
- m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
+ m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
}
}
@@ -601,12 +597,13 @@ namespace OpenSim.Region.Framework.Scenes
get
{
// We don't want the physics engine mucking up the rotations in a linkset
- if ((_parentID == 0) && (Shape.PCode != 9 || Shape.State == 0) && (PhysActor != null))
+ PhysicsActor actor = PhysActor;
+ if (_parentID == 0 && (Shape.PCode != 9 || Shape.State == 0) && actor != null)
{
- if (PhysActor.Orientation.X != 0 || PhysActor.Orientation.Y != 0
- || PhysActor.Orientation.Z != 0 || PhysActor.Orientation.W != 0)
+ if (actor.Orientation.X != 0f || actor.Orientation.Y != 0f
+ || actor.Orientation.Z != 0f || actor.Orientation.W != 0f)
{
- m_rotationOffset = PhysActor.Orientation;
+ m_rotationOffset = actor.Orientation;
}
}
@@ -618,24 +615,25 @@ namespace OpenSim.Region.Framework.Scenes
StoreUndoState();
m_rotationOffset = value;
- if (PhysActor != null)
+ PhysicsActor actor = PhysActor;
+ if (actor != null)
{
try
{
// Root prim gets value directly
if (_parentID == 0)
{
- PhysActor.Orientation = value;
- //m_log.Info("[PART]: RO1:" + PhysActor.Orientation.ToString());
+ actor.Orientation = value;
+ //m_log.Info("[PART]: RO1:" + actor.Orientation.ToString());
}
else
{
// Child prim we have to calculate it's world rotationwel
Quaternion resultingrotation = GetWorldRotation();
- PhysActor.Orientation = resultingrotation;
- //m_log.Info("[PART]: RO2:" + PhysActor.Orientation.ToString());
+ actor.Orientation = resultingrotation;
+ //m_log.Info("[PART]: RO2:" + actor.Orientation.ToString());
}
- m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
+ m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
//}
}
catch (Exception ex)
@@ -652,16 +650,12 @@ namespace OpenSim.Region.Framework.Scenes
{
get
{
- //if (PhysActor.Velocity.X != 0 || PhysActor.Velocity.Y != 0
- //|| PhysActor.Velocity.Z != 0)
- //{
- if (PhysActor != null)
+ PhysicsActor actor = PhysActor;
+ if (actor != null)
{
- if (PhysActor.IsPhysical)
+ if (actor.IsPhysical)
{
- m_velocity.X = PhysActor.Velocity.X;
- m_velocity.Y = PhysActor.Velocity.Y;
- m_velocity.Z = PhysActor.Velocity.Z;
+ m_velocity = actor.Velocity;
}
}
@@ -671,31 +665,28 @@ namespace OpenSim.Region.Framework.Scenes
set
{
m_velocity = value;
- if (PhysActor != null)
+
+ PhysicsActor actor = PhysActor;
+ if (actor != null)
{
- if (PhysActor.IsPhysical)
+ if (actor.IsPhysical)
{
- PhysActor.Velocity = value;
- m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
+ actor.Velocity = value;
+ m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
}
}
}
}
- public Vector3 RotationalVelocity
- {
- get { return AngularVelocity; }
- set { AngularVelocity = value; }
- }
-
///
public Vector3 AngularVelocity
{
get
{
- if ((PhysActor != null) && PhysActor.IsPhysical)
+ PhysicsActor actor = PhysActor;
+ if ((actor != null) && actor.IsPhysical)
{
- m_angularVelocity.FromBytes(PhysActor.RotationalVelocity.GetBytes(), 0);
+ m_angularVelocity = actor.RotationalVelocity;
}
return m_angularVelocity;
}
@@ -715,9 +706,10 @@ namespace OpenSim.Region.Framework.Scenes
set
{
m_description = value;
- if (PhysActor != null)
+ PhysicsActor actor = PhysActor;
+ if (actor != null)
{
- PhysActor.SOPDescription = value;
+ actor.SOPDescription = value;
}
}
}
@@ -808,21 +800,23 @@ namespace OpenSim.Region.Framework.Scenes
set
{
StoreUndoState();
-if (m_shape != null) {
- m_shape.Scale = value;
-
- if (PhysActor != null && m_parentGroup != null)
+ if (m_shape != null)
{
- if (m_parentGroup.Scene != null)
+ m_shape.Scale = value;
+
+ PhysicsActor actor = PhysActor;
+ if (actor != null && m_parentGroup != null)
{
- if (m_parentGroup.Scene.PhysicsScene != null)
+ if (m_parentGroup.Scene != null)
{
- PhysActor.Size = m_shape.Scale;
- m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
+ if (m_parentGroup.Scene.PhysicsScene != null)
+ {
+ actor.Size = m_shape.Scale;
+ m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
+ }
}
}
}
-}
TriggerScriptChangedEvent(Changed.SCALE);
}
}
@@ -1056,8 +1050,6 @@ if (m_shape != null) {
#endregion Public Properties with only Get
-
-
#region Private Methods
private uint ApplyMask(uint val, bool set, uint mask)
@@ -1551,9 +1543,9 @@ if (m_shape != null) {
m_parentGroup.Scene.PhysicsScene.RequestJointDeletion(Name); // FIXME: what if the name changed?
// make sure client isn't interpolating the joint proxy object
- Velocity = new Vector3(0, 0, 0);
- RotationalVelocity = new Vector3(0, 0, 0);
- Acceleration = new Vector3(0, 0, 0);
+ Velocity = Vector3.Zero;
+ AngularVelocity = Vector3.Zero;
+ Acceleration = Vector3.Zero;
}
}
}
@@ -1816,7 +1808,7 @@ if (m_shape != null) {
}
CollisionEventUpdate a = (CollisionEventUpdate)e;
- Dictionary collissionswith = a.m_objCollisionList;
+ Dictionary collissionswith = a.m_objCollisionList;
List thisHitColliders = new List();
List endedColliders = new List();
List startedColliders = new List();
@@ -2382,8 +2374,8 @@ if (m_shape != null) {
//isattachment = ParentGroup.RootPart.IsAttachment;
byte[] color = new byte[] {m_color.R, m_color.G, m_color.B, m_color.A};
- remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, m_shape,
- lPos, Velocity, Acceleration, RotationOffset, RotationalVelocity, clientFlags, m_uuid, _ownerID,
+ remoteClient.SendPrimitiveToClient(new SendPrimitiveData(m_regionHandle, m_parentGroup.GetTimeDilation(), LocalId, m_shape,
+ lPos, Velocity, Acceleration, RotationOffset, AngularVelocity, clientFlags, m_uuid, _ownerID,
m_text, color, _parentID, m_particleSystem, m_clickAction, (byte)m_material, m_TextureAnimation, IsAttachment,
AttachmentPoint,FromItemID, Sound, SoundGain, SoundFlags, SoundRadius, ParentGroup.GetUpdatePriority(remoteClient)));
}
@@ -2393,17 +2385,20 @@ if (m_shape != null) {
///
public void SendScheduledUpdates()
{
- const float VELOCITY_TOLERANCE = 0.01f;
- const float POSITION_TOLERANCE = 0.1f;
+ const float ROTATION_TOLERANCE = 0.01f;
+ const float VELOCITY_TOLERANCE = 0.001f;
+ const float POSITION_TOLERANCE = 0.05f;
+ const int TIME_MS_TOLERANCE = 3000;
if (m_updateFlag == 1)
{
// Throw away duplicate or insignificant updates
- if (RotationOffset != m_lastRotation ||
- Acceleration != m_lastAcceleration ||
- (Velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE ||
- (RotationalVelocity - m_lastAngularVelocity).Length() > VELOCITY_TOLERANCE ||
- (OffsetPosition - m_lastPosition).Length() > POSITION_TOLERANCE)
+ if (!RotationOffset.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
+ !Acceleration.Equals(m_lastAcceleration) ||
+ !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
+ !AngularVelocity.ApproxEquals(m_lastAngularVelocity, VELOCITY_TOLERANCE) ||
+ !OffsetPosition.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
+ Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
{
AddTerseUpdateToAllAvatars();
ClearUpdateSchedule();
@@ -2421,7 +2416,8 @@ if (m_shape != null) {
m_lastRotation = RotationOffset;
m_lastVelocity = Velocity;
m_lastAcceleration = Acceleration;
- m_lastAngularVelocity = RotationalVelocity;
+ m_lastAngularVelocity = AngularVelocity;
+ m_lastTerseSent = Environment.TickCount;
}
}
else
@@ -3780,10 +3776,9 @@ if (m_shape != null) {
// Causes this thread to dig into the Client Thread Data.
// Remember your locking here!
remoteClient.SendPrimTerseUpdate(new SendPrimitiveTerseData(m_regionHandle,
- (ushort)(m_parentGroup.GetTimeDilation() *
- (float)ushort.MaxValue), LocalId, lPos,
+ m_parentGroup.GetTimeDilation(), LocalId, lPos,
RotationOffset, Velocity, Acceleration,
- RotationalVelocity, state, FromItemID,
+ AngularVelocity, state, FromItemID,
OwnerID, (int)AttachmentPoint, null, ParentGroup.GetUpdatePriority(remoteClient)));
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 87fac0c5e7..6c0d9f2a9b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -76,8 +76,18 @@ namespace OpenSim.Region.Framework.Scenes
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static readonly byte[] BAKE_INDICES = new byte[] { 8, 9, 10, 11, 19, 20 };
-
- public static byte[] DefaultTexture;
+ private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
+ private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
+ private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
+ ///
+ /// Experimentally determined "fudge factor" to make sit-target positions
+ /// the same as in SecondLife. Fudge factor was tested for 36 different
+ /// test cases including prims of type box, sphere, cylinder, and torus,
+ /// with varying parameters for sit target location, prim size, prim
+ /// rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
+ /// issue #1716
+ ///
+ private static readonly Vector3 SIT_TARGET_ADJUSTMENT = new Vector3(0.1f, 0.0f, 0.3f);
public UUID currentParcelUUID = UUID.Zero;
@@ -92,16 +102,18 @@ namespace OpenSim.Region.Framework.Scenes
//private SceneObjectPart proxyObjectPart = null;
public Vector3 lastKnownAllowedPosition;
public bool sentMessageAboutRestrictedParcelFlyingDown;
+ public Vector4 CollisionPlane = Vector4.UnitW;
private Vector3 m_lastPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
+ //private int m_lastTerseSent;
private bool m_updateflag;
private byte m_movementflag;
- private readonly List m_forcesList = new List();
+ private Vector3? m_forceToApply;
private uint m_requestedSitTargetID;
- private UUID m_requestedSitTargetUUID = UUID.Zero;
+ private UUID m_requestedSitTargetUUID;
private SendCourseLocationsMethod m_sendCourseLocationsMethod;
private bool m_startAnimationSet;
@@ -112,30 +124,24 @@ namespace OpenSim.Region.Framework.Scenes
private float m_sitAvatarHeight = 2.0f;
- // experimentally determined "fudge factor" to make sit-target positions
- // the same as in SecondLife. Fudge factor was tested for 36 different
- // test cases including prims of type box, sphere, cylinder, and torus,
- // with varying parameters for sit target location, prim size, prim
- // rotation, prim cut, prim twist, prim taper, and prim shear. See mantis
- // issue #1716
- private static readonly Vector3 m_sitTargetCorrectionOffset = new Vector3(0.1f, 0.0f, 0.3f);
private float m_godlevel;
private bool m_invulnerable = true;
- private Vector3 m_LastChildAgentUpdatePosition;
+ private Vector3 m_lastChildAgentUpdatePosition;
+ private Vector3 m_lastChildAgentUpdateCamPosition;
private int m_perfMonMS;
private bool m_setAlwaysRun;
private string m_movementAnimation = "DEFAULT";
- private long m_animPersistUntil = 0;
- private bool m_allowFalling = false;
- private bool m_useFlySlow = false;
- private bool m_usePreJump = false;
- private bool m_forceFly = false;
- private bool m_flyDisabled = false;
+ private int m_animTickFall;
+ private int m_animTickJump;
+ private bool m_useFlySlow;
+ private bool m_usePreJump;
+ private bool m_forceFly;
+ private bool m_flyDisabled;
private float m_speedModifier = 1.0f;
@@ -143,7 +149,7 @@ namespace OpenSim.Region.Framework.Scenes
public bool IsRestrictedToRegion;
- public string JID = string.Empty;
+ public string JID = String.Empty;
// Agent moves with a PID controller causing a force to be exerted.
private bool m_newCoarseLocations = true;
@@ -158,43 +164,43 @@ namespace OpenSim.Region.Framework.Scenes
private readonly Vector3[] Dir_Vectors = new Vector3[6];
// Position of agent's camera in world (region cordinates)
- protected Vector3 m_CameraCenter = Vector3.Zero;
- protected Vector3 m_lastCameraCenter = Vector3.Zero;
+ protected Vector3 m_CameraCenter;
+ protected Vector3 m_lastCameraCenter;
protected Timer m_reprioritization_timer;
- protected bool m_reprioritizing = false;
- protected bool m_reprioritization_called = false;
+ protected bool m_reprioritizing;
+ protected bool m_reprioritization_called;
// Use these three vectors to figure out what the agent is looking at
// Convert it to a Matrix and/or Quaternion
- protected Vector3 m_CameraAtAxis = Vector3.Zero;
- protected Vector3 m_CameraLeftAxis = Vector3.Zero;
- protected Vector3 m_CameraUpAxis = Vector3.Zero;
- private uint m_AgentControlFlags;
+ protected Vector3 m_CameraAtAxis;
+ protected Vector3 m_CameraLeftAxis;
+ protected Vector3 m_CameraUpAxis;
+ private AgentManager.ControlFlags m_AgentControlFlags;
private Quaternion m_headrotation = Quaternion.Identity;
private byte m_state;
//Reuse the Vector3 instead of creating a new one on the UpdateMovement method
- private Vector3 movementvector = Vector3.Zero;
+ private Vector3 movementvector;
private bool m_autopilotMoving;
- private Vector3 m_autoPilotTarget = Vector3.Zero;
+ private Vector3 m_autoPilotTarget;
private bool m_sitAtAutoTarget;
private string m_nextSitAnimation = String.Empty;
//PauPaw:Proper PID Controler for autopilot************
private bool m_moveToPositionInProgress;
- private Vector3 m_moveToPositionTarget = Vector3.Zero;
+ private Vector3 m_moveToPositionTarget;
- private bool m_followCamAuto = false;
+ private bool m_followCamAuto;
- private int m_movementUpdateCount = 0;
+ private int m_movementUpdateCount;
private const int NumMovementsBetweenRayCast = 5;
- private bool CameraConstraintActive = false;
- //private int m_moveToPositionStateStatus = 0;
+ private bool CameraConstraintActive;
+ //private int m_moveToPositionStateStatus;
//*****************************************************
// Agent's Draw distance.
@@ -268,11 +274,9 @@ namespace OpenSim.Region.Framework.Scenes
get { return m_godlevel; }
}
- private readonly ulong m_regionHandle;
-
public ulong RegionHandle
{
- get { return m_regionHandle; }
+ get { return m_rootRegionHandle; }
}
public Vector3 CameraPosition
@@ -379,8 +383,8 @@ namespace OpenSim.Region.Framework.Scenes
public uint AgentControlFlags
{
- get { return m_AgentControlFlags; }
- set { m_AgentControlFlags = value; }
+ get { return (uint)m_AgentControlFlags; }
+ set { m_AgentControlFlags = (AgentManager.ControlFlags)value; }
}
///
@@ -411,31 +415,27 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Absolute position of this avatar in 'region cordinates'
+ /// Position of this avatar relative to the region the avatar is in
///
public override Vector3 AbsolutePosition
{
get
{
- if (m_physicsActor != null)
- {
- m_pos.X = m_physicsActor.Position.X;
- m_pos.Y = m_physicsActor.Position.Y;
- m_pos.Z = m_physicsActor.Position.Z;
- }
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
+ m_pos = actor.Position;
return m_parentPosition + m_pos;
}
set
{
- if (m_physicsActor != null)
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
{
try
{
lock (m_scene.SyncRoot)
- {
m_physicsActor.Position = value;
- }
}
catch (Exception e)
{
@@ -444,7 +444,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_pos = value;
- m_parentPosition = new Vector3(0, 0, 0);
+ m_parentPosition = Vector3.Zero;
}
}
@@ -455,27 +455,21 @@ namespace OpenSim.Region.Framework.Scenes
{
get
{
- if (m_physicsActor != null)
- {
- m_velocity.X = m_physicsActor.Velocity.X;
- m_velocity.Y = m_physicsActor.Velocity.Y;
- m_velocity.Z = m_physicsActor.Velocity.Z;
- }
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
+ m_velocity = actor.Velocity;
return m_velocity;
}
set
{
- //m_log.DebugFormat("In {0} setting velocity of {1} to {2}", m_scene.RegionInfo.RegionName, Name, value);
-
- if (m_physicsActor != null)
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
{
try
{
lock (m_scene.SyncRoot)
- {
- m_physicsActor.Velocity = value;
- }
+ actor.Velocity = value;
}
catch (Exception e)
{
@@ -627,7 +621,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
CreateSceneViewer();
- m_regionHandle = reginfo.RegionHandle;
+ m_rootRegionHandle = reginfo.RegionHandle;
m_controllingClient = client;
m_firstname = m_controllingClient.FirstName;
m_lastname = m_controllingClient.LastName;
@@ -710,25 +704,25 @@ namespace OpenSim.Region.Framework.Scenes
private void SetDirectionVectors()
{
- Dir_Vectors[0] = new Vector3(1, 0, 0); //FORWARD
- Dir_Vectors[1] = new Vector3(-1, 0, 0); //BACK
- Dir_Vectors[2] = new Vector3(0, 1, 0); //LEFT
- Dir_Vectors[3] = new Vector3(0, -1, 0); //RIGHT
- Dir_Vectors[4] = new Vector3(0, 0, 1); //UP
- Dir_Vectors[5] = new Vector3(0, 0, -1); //DOWN
- Dir_Vectors[5] = new Vector3(0, 0, -0.5f); //DOWN_Nudge
+ Dir_Vectors[0] = Vector3.UnitX; //FORWARD
+ Dir_Vectors[1] = -Vector3.UnitX; //BACK
+ Dir_Vectors[2] = Vector3.UnitY; //LEFT
+ Dir_Vectors[3] = -Vector3.UnitY; //RIGHT
+ Dir_Vectors[4] = Vector3.UnitZ; //UP
+ Dir_Vectors[5] = -Vector3.UnitZ; //DOWN
+ Dir_Vectors[5] = new Vector3(0f, 0f, -0.5f); //DOWN_Nudge
}
private Vector3[] GetWalkDirectionVectors()
{
Vector3[] vector = new Vector3[6];
- vector[0] = new Vector3(m_CameraUpAxis.Z, 0, -m_CameraAtAxis.Z); //FORWARD
- vector[1] = new Vector3(-m_CameraUpAxis.Z, 0, m_CameraAtAxis.Z); //BACK
- vector[2] = new Vector3(0, 1, 0); //LEFT
- vector[3] = new Vector3(0, -1, 0); //RIGHT
- vector[4] = new Vector3(m_CameraAtAxis.Z, 0, m_CameraUpAxis.Z); //UP
- vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN
- vector[5] = new Vector3(-m_CameraAtAxis.Z, 0, -m_CameraUpAxis.Z); //DOWN_Nudge
+ vector[0] = new Vector3(m_CameraUpAxis.Z, 0f, -m_CameraAtAxis.Z); //FORWARD
+ vector[1] = new Vector3(-m_CameraUpAxis.Z, 0f, m_CameraAtAxis.Z); //BACK
+ vector[2] = Vector3.UnitY; //LEFT
+ vector[3] = -Vector3.UnitY; //RIGHT
+ vector[4] = new Vector3(m_CameraAtAxis.Z, 0f, m_CameraUpAxis.Z); //UP
+ vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN
+ vector[5] = new Vector3(-m_CameraAtAxis.Z, 0f, -m_CameraUpAxis.Z); //DOWN_Nudge
return vector;
}
@@ -781,6 +775,8 @@ namespace OpenSim.Region.Framework.Scenes
if (gm != null)
m_grouptitle = gm.GetGroupTitle(m_uuid);
+ m_rootRegionHandle = m_scene.RegionInfo.RegionHandle;
+
m_scene.SetRootAgentScene(m_uuid);
// Moved this from SendInitialData to ensure that m_appearance is initialized
@@ -811,7 +807,6 @@ namespace OpenSim.Region.Framework.Scenes
pos = emergencyPos;
}
-
float localAVHeight = 1.56f;
if (m_avHeight != 127.0f)
{
@@ -906,6 +901,8 @@ namespace OpenSim.Region.Framework.Scenes
m_isChildAgent = true;
m_scene.SwapRootAgentCount(true);
RemoveFromPhysicalScene();
+
+ // FIXME: Set m_rootRegionHandle to the region handle of the scene this agent is moving into
m_scene.EventManager.TriggerOnMakeChildAgent(this);
}
@@ -937,7 +934,7 @@ namespace OpenSim.Region.Framework.Scenes
isFlying = m_physicsActor.Flying;
RemoveFromPhysicalScene();
- Velocity = new Vector3(0, 0, 0);
+ Velocity = Vector3.Zero;
AbsolutePosition = pos;
AddToPhysicalScene(isFlying);
if (m_appearance != null)
@@ -985,12 +982,13 @@ namespace OpenSim.Region.Framework.Scenes
if (m_avHeight != 127.0f)
{
- AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (m_avHeight / 6f));
+ AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (m_avHeight / 6f));
}
else
{
- AbsolutePosition = AbsolutePosition + new Vector3(0, 0, (1.56f / 6f));
+ AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
}
+
TrySetMovementAnimation("LAND");
SendFullUpdateToAllClients();
}
@@ -1076,7 +1074,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_isChildAgent = false;
- bool m_flying = ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
+ bool m_flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
MakeRootAgent(AbsolutePosition, m_flying);
if ((m_callbackURI != null) && !m_callbackURI.Equals(""))
@@ -1103,9 +1101,12 @@ namespace OpenSim.Region.Framework.Scenes
///
public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance)
{
+ const float POSITION_TOLERANCE = 0.02f;
+ const float VELOCITY_TOLERANCE = 0.02f;
+ const float ROTATION_TOLERANCE = 0.02f;
+
if (m_followCamAuto)
{
-
if (hitYN)
{
CameraConstraintActive = true;
@@ -1114,11 +1115,11 @@ namespace OpenSim.Region.Framework.Scenes
Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
}
- else
+ else
{
- if ((m_pos - m_lastPosition).Length() > 0.02f ||
- (m_velocity - m_lastVelocity).Length() > 0.02f ||
- m_bodyRot != m_lastRotation)
+ if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
+ !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
+ !m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
{
if (CameraConstraintActive)
{
@@ -1127,13 +1128,11 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
- }
+ }
}
- Array m_dirControlFlags = Enum.GetValues(typeof(Dir_ControlFlags));
-
///
- /// This is the event handler for client movement. If a client is moving, this event is triggering.
+ /// This is the event handler for client movement. If a client is moving, this event is triggering.
///
public void HandleAgentUpdate(IClientAPI remoteClient, AgentUpdateArgs agentData)
{
@@ -1149,15 +1148,13 @@ namespace OpenSim.Region.Framework.Scenes
if (m_movementUpdateCount < 1)
m_movementUpdateCount = 1;
- // Must check for standing up even when PhysicsActor is null,
- // since sitting currently removes avatar from physical scene
- //m_log.Debug("agentPos:" + AbsolutePosition.ToString());
+ #region Sanity Checking
// This is irritating. Really.
if (!AbsolutePosition.IsFinite())
{
RemoveFromPhysicalScene();
- m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999902");
+ m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999902");
m_pos = m_LastFinitePos;
if (!m_pos.IsFinite())
@@ -1165,7 +1162,7 @@ namespace OpenSim.Region.Framework.Scenes
m_pos.X = 127f;
m_pos.Y = 127f;
m_pos.Z = 127f;
- m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error# 9999903");
+ m_log.Error("[AVATAR]: NonFinite Avatar position detected... Reset Position. Mantis this please. Error #9999903");
}
AddToPhysicalScene(false);
@@ -1175,18 +1172,11 @@ namespace OpenSim.Region.Framework.Scenes
m_LastFinitePos = m_pos;
}
- //m_physicsActor.AddForce(new PhysicsVector(999999999, 99999999, 999999999999999), true);
+ #endregion Sanity Checking
- //ILandObject land = LandChannel.GetLandObject(agent.startpos.X, agent.startpos.Y);
- //if (land != null)
- //{
- //if (land.landData.landingType == (byte)1 && land.landData.userLocation != Vector3.Zero)
- //{
- // agent.startpos = land.landData.userLocation;
- //}
- //}
+ #region Inputs
- uint flags = agentData.ControlFlags;
+ AgentManager.ControlFlags flags = (AgentManager.ControlFlags)agentData.ControlFlags;
Quaternion bodyRotation = agentData.BodyRotation;
// Camera location in world. We'll need to raytrace
@@ -1207,87 +1197,85 @@ namespace OpenSim.Region.Framework.Scenes
// The Agent's Draw distance setting
m_DrawDistance = agentData.Far;
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
- {
- StandUp();
- }
-
// Check if Client has camera in 'follow cam' or 'build' mode.
Vector3 camdif = (Vector3.One * m_bodyRot - Vector3.One * CameraRotation);
m_followCamAuto = ((m_CameraUpAxis.Z > 0.959f && m_CameraUpAxis.Z < 0.98f)
&& (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
+ m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
+ m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
+
+ #endregion Inputs
+
+ if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STAND_UP) != 0)
+ {
+ StandUp();
+ }
+
//m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
// Raycast from the avatar's head to the camera to see if there's anything blocking the view
if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
{
if (m_followCamAuto)
{
- Vector3 headadjustment = new Vector3(0, 0, 0.3f);
- m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - (m_pos + headadjustment)), Vector3.Distance(m_CameraCenter, (m_pos + headadjustment)) + 0.3f, RayCastCameraCallback);
+ Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
+ m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(m_CameraCenter - posAdjusted), Vector3.Distance(m_CameraCenter, posAdjusted) + 0.3f, RayCastCameraCallback);
}
}
- m_mouseLook = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
- m_leftButtonDown = (flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
-
lock (scriptedcontrols)
{
if (scriptedcontrols.Count > 0)
{
- SendControlToScripts(flags);
+ SendControlToScripts((uint)flags);
flags = RemoveIgnoredControls(flags, IgnoredControls);
}
}
- if (PhysicsActor == null)
- {
- return;
- }
-
if (m_autopilotMoving)
CheckAtSitTarget();
- if ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
+ if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
{
// TODO: This doesn't prevent the user from walking yet.
// Setting parent ID would fix this, if we knew what value
// to use. Or we could add a m_isSitting variable.
-
TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
}
+
// In the future, these values might need to go global.
// Here's where you get them.
-
m_AgentControlFlags = flags;
m_headrotation = agentData.HeadRotation;
m_state = agentData.State;
+ PhysicsActor actor = PhysicsActor;
+ if (actor == null)
+ {
+ return;
+ }
+
if (m_allowMovement)
{
int i = 0;
bool update_movementflag = false;
bool update_rotation = false;
bool DCFlagKeyPressed = false;
- Vector3 agent_control_v3 = new Vector3(0, 0, 0);
+ Vector3 agent_control_v3 = Vector3.Zero;
Quaternion q = bodyRotation;
- if (PhysicsActor != null)
- {
- bool oldflying = PhysicsActor.Flying;
- if (m_forceFly)
- PhysicsActor.Flying = true;
- else if (m_flyDisabled)
- PhysicsActor.Flying = false;
- else
- PhysicsActor.Flying = ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
+ bool oldflying = PhysicsActor.Flying;
- if (PhysicsActor.Flying != oldflying)
- {
- update_movementflag = true;
- }
- }
+ if (m_forceFly)
+ actor.Flying = true;
+ else if (m_flyDisabled)
+ actor.Flying = false;
+ else
+ actor.Flying = ((flags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0);
+
+ if (actor.Flying != oldflying)
+ update_movementflag = true;
if (q != m_bodyRot)
{
@@ -1309,10 +1297,9 @@ namespace OpenSim.Region.Framework.Scenes
else
dirVectors = Dir_Vectors;
-
- foreach (Dir_ControlFlags DCF in m_dirControlFlags)
+ foreach (Dir_ControlFlags DCF in DIR_CONTROL_FLAGS)
{
- if ((flags & (uint)DCF) != 0)
+ if (((uint)flags & (uint)DCF) != 0)
{
bResetMoveToPosition = true;
DCFlagKeyPressed = true;
@@ -1358,7 +1345,7 @@ namespace OpenSim.Region.Framework.Scenes
if (bAllowUpdateMoveToPosition && (m_moveToPositionInProgress && !m_autopilotMoving))
{
//Check the error term of the current position in relation to the target position
- if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5)
+ if (Util.GetDistanceTo(AbsolutePosition, m_moveToPositionTarget) <= 1.5f)
{
// we are close enough to the target
m_moveToPositionTarget = Vector3.Zero;
@@ -1439,8 +1426,8 @@ namespace OpenSim.Region.Framework.Scenes
if (m_physicsActor != null && m_physicsActor.Flying && !m_forceFly)
{
// Are the landing controls requirements filled?
- bool controlland = (((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
- ((flags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
+ bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) ||
+ ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
// Are the collision requirements fulfilled?
bool colliding = (m_physicsActor.IsColliding == true);
@@ -1537,7 +1524,7 @@ namespace OpenSim.Region.Framework.Scenes
if (part != null)
{
AbsolutePosition = part.AbsolutePosition;
- Velocity = new Vector3(0, 0, 0);
+ Velocity = Vector3.Zero;
SendFullUpdateToAllClients();
//HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
@@ -1607,7 +1594,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_pos += m_parentPosition + new Vector3(0.0f, 0.0f, 2.0f*m_sitAvatarHeight);
- m_parentPosition = new Vector3();
+ m_parentPosition = Vector3.Zero;
m_parentID = 0;
SendFullUpdateToAllClients();
@@ -1834,7 +1821,7 @@ namespace OpenSim.Region.Framework.Scenes
//Quaternion result = (sitTargetOrient * vq) * nq;
m_pos = new Vector3(sitTargetPos.X, sitTargetPos.Y, sitTargetPos.Z);
- m_pos += m_sitTargetCorrectionOffset;
+ m_pos += SIT_TARGET_ADJUSTMENT;
m_bodyRot = sitTargetOrient;
//Rotation = sitTargetOrient;
m_parentPosition = part.AbsolutePosition;
@@ -1854,7 +1841,7 @@ namespace OpenSim.Region.Framework.Scenes
}
m_parentID = m_requestedSitTargetID;
- Velocity = new Vector3(0, 0, 0);
+ Velocity = Vector3.Zero;
RemoveFromPhysicalScene();
TrySetMovementAnimation(sitAnimation);
@@ -2011,7 +1998,7 @@ namespace OpenSim.Region.Framework.Scenes
protected void TrySetMovementAnimation(string anim)
{
//m_log.DebugFormat("Updating movement animation to {0}", anim);
-
+
if (!m_isChildAgent)
{
if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
@@ -2046,200 +2033,169 @@ namespace OpenSim.Region.Framework.Scenes
///
public string GetMovementAnimation()
{
- if ((m_animPersistUntil > 0) && (m_animPersistUntil > DateTime.Now.Ticks))
- {
- //We don't want our existing state to end yet.
- return m_movementAnimation;
+ const float FALL_DELAY = 0.33f;
+ const float PREJUMP_DELAY = 0.25f;
- }
- else if (m_movementflag != 0)
+ #region Inputs
+
+ AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
+ PhysicsActor actor = m_physicsActor;
+
+ // Create forward and left vectors from the current avatar rotation
+ Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
+ Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
+ Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
+
+ // Check control flags
+ bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
+ bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
+ bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
+ bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
+ //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
+ //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
+ bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
+ bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
+ //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+ //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
+
+ // Direction in which the avatar is trying to move
+ Vector3 move = Vector3.Zero;
+ if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
+ if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
+ if (heldLeft) { move.X += left.X; move.Y += left.Y; }
+ if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
+ if (heldUp) { move.Z += 1; }
+ if (heldDown) { move.Z -= 1; }
+
+ // Is the avatar trying to move?
+ bool moving = (move != Vector3.Zero);
+ bool jumping = m_animTickJump != 0;
+
+ #endregion Inputs
+
+ #region Flying
+
+ if (actor != null && actor.Flying)
{
- //We're moving
- m_allowFalling = true;
- if (PhysicsActor != null && PhysicsActor.IsColliding)
+ m_animTickFall = 0;
+ m_animTickJump = 0;
+
+ if (move.X != 0f || move.Y != 0f)
{
- //And colliding. Can you guess what it is yet?
- if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)
- {
- //Down key is being pressed.
- if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) + (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0)
- {
- return "CROUCHWALK";
- }
- else
- {
- return "CROUCH";
- }
- }
- else if (m_setAlwaysRun)
- {
- return "RUN";
- }
+ return (m_useFlySlow ? "FLYSLOW" : "FLY");
+ }
+ else if (move.Z > 0f)
+ {
+ return "HOVER_UP";
+ }
+ else if (move.Z < 0f)
+ {
+ if (actor != null && actor.IsColliding)
+ return "LAND";
else
- {
- //If we're prejumping then inhibit this, it's a problem
- //caused by a false positive on IsColliding
- if (m_movementAnimation == "PREJUMP")
- {
- return "PREJUMP";
- }
- else
- {
- return "WALK";
- }
- }
-
+ return "HOVER_DOWN";
}
else
{
- //We're not colliding. Colliding isn't cool these days.
- if (PhysicsActor != null && PhysicsActor.Flying)
- {
- //Are we moving forwards or backwards?
- if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0)
- {
- //Then we really are flying
- if (m_setAlwaysRun)
- {
- return "FLY";
- }
- else
- {
- if (m_useFlySlow == false)
- {
- return "FLY";
- }
- else
- {
- return "FLYSLOW";
- }
- }
- }
- else
- {
- if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
- {
- return "HOVER_UP";
- }
- else
- {
- return "HOVER_DOWN";
- }
- }
+ return "HOVER";
+ }
+ }
- }
- else if (m_movementAnimation == "JUMP")
+ #endregion Flying
+
+ #region Falling/Floating/Landing
+
+ if (actor == null || !actor.IsColliding)
+ {
+ float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
+ float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
+
+ if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
+ {
+ // Just started falling
+ m_animTickFall = Environment.TickCount;
+ }
+ else if (!jumping && fallElapsed > FALL_DELAY)
+ {
+ // Falling long enough to trigger the animation
+ return "FALLDOWN";
+ }
+
+ return m_movementAnimation;
+ }
+
+ #endregion Falling/Floating/Landing
+
+ #region Ground Movement
+
+ if (m_movementAnimation == "FALLDOWN")
+ {
+ m_animTickFall = Environment.TickCount;
+
+ // TODO: SOFT_LAND support
+ return "LAND";
+ }
+ else if (m_movementAnimation == "LAND")
+ {
+ float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
+
+ if (landElapsed <= FALL_DELAY)
+ return "LAND";
+ }
+
+ m_animTickFall = 0;
+
+ if (move.Z > 0f)
+ {
+ // Jumping
+ if (!jumping)
+ {
+ // Begin prejump
+ m_animTickJump = Environment.TickCount;
+ return "PREJUMP";
+ }
+ else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
+ {
+ // Start actual jump
+ if (m_animTickJump == -1)
{
- //If we were already jumping, continue to jump until we collide
+ // Already jumping! End the current jump
+ m_animTickJump = 0;
return "JUMP";
+ }
- }
- else if (m_movementAnimation == "PREJUMP" && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
- {
- //If we were in a prejump, and the UP key is no longer being held down
- //then we're not going to fly, so we're jumping
- return "JUMP";
-
- }
- else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
- {
- //They're pressing up, so we're either going to fly or jump
- return "PREJUMP";
- }
- else
- {
- //If we're moving and not flying and not jumping and not colliding..
-
- if (m_movementAnimation == "WALK" || m_movementAnimation == "RUN")
- {
- //Let's not enter a FALLDOWN state here, since we're probably
- //not colliding because we're going down hill.
- return m_movementAnimation;
- }
- //Record the time we enter this state so we know whether to "land" or not
- m_animPersistUntil = DateTime.Now.Ticks;
- return "FALLDOWN";
-
- }
+ m_animTickJump = -1;
+ return "JUMP";
}
}
else
{
- //We're not moving.
- if (PhysicsActor != null && PhysicsActor.IsColliding)
+ // Not jumping
+ m_animTickJump = 0;
+
+ if (move.X != 0f || move.Y != 0f)
{
- //But we are colliding.
- if (m_movementAnimation == "FALLDOWN")
- {
- //We're re-using the m_animPersistUntil value here to see how long we've been falling
- if ((DateTime.Now.Ticks - m_animPersistUntil) > TimeSpan.TicksPerSecond)
- {
- //Make sure we don't change state for a bit
- m_animPersistUntil = DateTime.Now.Ticks + TimeSpan.TicksPerSecond;
- return "LAND";
- }
- else
- {
- //We haven't been falling very long, we were probably just walking down hill
- return "STAND";
- }
- }
- else if (m_movementAnimation == "JUMP" || m_movementAnimation == "HOVER_DOWN")
- {
- //Make sure we don't change state for a bit
- m_animPersistUntil = DateTime.Now.Ticks + (1 * TimeSpan.TicksPerSecond);
- return "SOFT_LAND";
-
- }
- else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
- {
- return "PREJUMP";
- }
- else if (PhysicsActor != null && PhysicsActor.Flying)
- {
- m_allowFalling = true;
- if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0)
- {
- return "HOVER_UP";
- }
- else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)
- {
- return "HOVER_DOWN";
- }
- else
- {
- return "HOVER";
- }
- }
+ // Walking / crouchwalking / running
+ if (move.Z < 0f)
+ return "CROUCHWALK";
+ else if (m_setAlwaysRun)
+ return "RUN";
else
- {
- return "STAND";
- }
-
+ return "WALK";
}
else
{
- //We're not colliding.
- if (PhysicsActor != null && PhysicsActor.Flying)
- {
-
- return "HOVER";
-
- }
- else if ((m_movementAnimation == "JUMP" || m_movementAnimation == "PREJUMP") && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0)
- {
-
- return "JUMP";
-
- }
+ // Not walking
+ if (move.Z < 0f)
+ return "CROUCH";
else
- {
- //Record the time we enter this state so we know whether to "land" or not
- m_animPersistUntil = DateTime.Now.Ticks;
- return "FALLDOWN"; // this falling animation is invoked too frequently when capsule tilt correction is used - why?
- }
+ return "STAND";
}
}
+
+ #endregion Ground Movement
+
+ return m_movementAnimation;
}
///
@@ -2247,24 +2203,16 @@ namespace OpenSim.Region.Framework.Scenes
///
protected void UpdateMovementAnimations()
{
- string movementAnimation = GetMovementAnimation();
-
- if (movementAnimation == "FALLDOWN" && m_allowFalling == false)
+ m_movementAnimation = GetMovementAnimation();
+
+ if (m_movementAnimation == "PREJUMP" && !m_usePreJump)
{
- movementAnimation = m_movementAnimation;
- }
- else
- {
- m_movementAnimation = movementAnimation;
- }
- if (movementAnimation == "PREJUMP" && m_usePreJump == false)
- {
- //This was the previous behavior before PREJUMP
+ // This was the previous behavior before PREJUMP
TrySetMovementAnimation("JUMP");
}
else
{
- TrySetMovementAnimation(movementAnimation);
+ TrySetMovementAnimation(m_movementAnimation);
}
}
@@ -2277,7 +2225,7 @@ namespace OpenSim.Region.Framework.Scenes
{
if (m_isChildAgent)
{
- m_log.Debug("DEBUG: AddNewMovement: child agent, Making root agent!");
+ m_log.Debug("[SCENEPRESENCE]: AddNewMovement() called on child agent, making root agent!");
// we have to reset the user's child agent connections.
// Likely, here they've lost the eventqueue for other regions so border
@@ -2286,7 +2234,7 @@ namespace OpenSim.Region.Framework.Scenes
List regions = new List(KnownChildRegionHandles);
regions.Remove(m_scene.RegionInfo.RegionHandle);
- MakeRootAgent(new Vector3(127, 127, 127), true);
+ MakeRootAgent(new Vector3(127f, 127f, 127f), true);
// Async command
if (m_scene.SceneGridService != null)
@@ -2298,47 +2246,45 @@ namespace OpenSim.Region.Framework.Scenes
System.Threading.Thread.Sleep(500);
}
-
if (m_scene.SceneGridService != null)
{
m_scene.SceneGridService.EnableNeighbourChildAgents(this, new List());
}
-
-
return;
}
m_perfMonMS = Environment.TickCount;
m_rotation = rotation;
- NewForce newVelocity = new NewForce();
Vector3 direc = vec * rotation;
direc.Normalize();
direc *= 0.03f * 128f * m_speedModifier;
- if (m_physicsActor.Flying)
+
+ PhysicsActor actor = m_physicsActor;
+ if (actor != null)
{
- direc *= 4;
- //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
- //bool colliding = (m_physicsActor.IsColliding==true);
- //if (controlland)
- // m_log.Info("[AGENT]: landCommand");
- //if (colliding)
- // m_log.Info("[AGENT]: colliding");
- //if (m_physicsActor.Flying && colliding && controlland)
- //{
- // StopFlying();
- // m_log.Info("[AGENT]: Stop FLying");
- //}
- }
- else
- {
- if (!m_physicsActor.Flying && m_physicsActor.IsColliding)
+ if (actor.Flying)
+ {
+ direc *= 4.0f;
+ //bool controlland = (((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0));
+ //bool colliding = (m_physicsActor.IsColliding==true);
+ //if (controlland)
+ // m_log.Info("[AGENT]: landCommand");
+ //if (colliding)
+ // m_log.Info("[AGENT]: colliding");
+ //if (m_physicsActor.Flying && colliding && controlland)
+ //{
+ // StopFlying();
+ // m_log.Info("[AGENT]: Stop FLying");
+ //}
+ }
+ else if (!actor.Flying && actor.IsColliding)
{
if (direc.Z > 2.0f)
{
- direc.Z *= 3;
+ direc.Z *= 3.0f;
// TODO: PreJump and jump happen too quickly. Many times prejump gets ignored.
TrySetMovementAnimation("PREJUMP");
@@ -2347,10 +2293,8 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- newVelocity.X = direc.X;
- newVelocity.Y = direc.Y;
- newVelocity.Z = direc.Z;
- m_forcesList.Add(newVelocity);
+ // TODO: Add the force instead of only setting it to support multiple forces per frame?
+ m_forceToApply = direc;
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
}
@@ -2361,8 +2305,10 @@ namespace OpenSim.Region.Framework.Scenes
public override void Update()
{
- const float VELOCITY_TOLERANCE = 0.01f;
- const float POSITION_TOLERANCE = 10.0f;
+ const float ROTATION_TOLERANCE = 0.01f;
+ const float VELOCITY_TOLERANCE = 0.001f;
+ const float POSITION_TOLERANCE = 0.05f;
+ //const int TIME_MS_TOLERANCE = 3000;
SendPrimUpdates();
@@ -2374,17 +2320,25 @@ namespace OpenSim.Region.Framework.Scenes
if (m_isChildAgent == false)
{
+ PhysicsActor actor = m_physicsActor;
+
+ // NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
+ // grab the latest PhysicsActor velocity, whereas m_velocity is often
+ // storing a requested force instead of an actual traveling velocity
+
// Throw away duplicate or insignificant updates
- if (m_bodyRot != m_lastRotation ||
- (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE ||
- (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE)
+ if (!m_bodyRot.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
+ !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
+ !m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
+ //Environment.TickCount - m_lastTerseSent > TIME_MS_TOLERANCE)
{
SendTerseUpdateToAllClients();
// Update the "last" values
m_lastPosition = m_pos;
m_lastRotation = m_bodyRot;
- m_lastVelocity = m_velocity;
+ m_lastVelocity = Velocity;
+ //m_lastTerseSent = Environment.TickCount;
}
// followed suggestion from mic bowman. reversed the two lines below.
@@ -2410,11 +2364,16 @@ namespace OpenSim.Region.Framework.Scenes
{
m_perfMonMS = Environment.TickCount;
- Vector3 pos = m_pos;
- pos.Z -= m_appearance.HipOffset;
+ PhysicsActor actor = m_physicsActor;
+ Vector3 velocity = (actor != null) ? actor.Velocity : Vector3.Zero;
- remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
- pos, m_velocity, Vector3.Zero, m_bodyRot, Vector4.UnitW, m_uuid, null, GetUpdatePriority(remoteClient)));
+ Vector3 pos = m_pos;
+ pos.Z += m_appearance.HipOffset;
+
+ //m_log.DebugFormat("[SCENEPRESENCE]: TerseUpdate: Pos={0} Rot={1} Vel={2}", m_pos, m_bodyRot, m_velocity);
+
+ remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_rootRegionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId,
+ pos, velocity, Vector3.Zero, m_bodyRot, CollisionPlane, m_uuid, null, GetUpdatePriority(remoteClient)));
m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
m_scene.StatsReporter.AddAgentUpdates(1);
@@ -2510,7 +2469,7 @@ namespace OpenSim.Region.Framework.Scenes
return;
Vector3 pos = m_pos;
- pos.Z -= m_appearance.HipOffset;
+ pos.Z += m_appearance.HipOffset;
remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid,
LocalId, pos, m_appearance.Texture.GetBytes(),
@@ -2581,7 +2540,7 @@ namespace OpenSim.Region.Framework.Scenes
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
Vector3 pos = m_pos;
- pos.Z -= m_appearance.HipOffset;
+ pos.Z += m_appearance.HipOffset;
m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2690,7 +2649,7 @@ namespace OpenSim.Region.Framework.Scenes
}
Vector3 pos = m_pos;
- pos.Z -= m_appearance.HipOffset;
+ pos.Z += m_appearance.HipOffset;
m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId,
pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot));
@@ -2778,7 +2737,8 @@ namespace OpenSim.Region.Framework.Scenes
}
// Minimum Draw distance is 64 meters, the Radius of the draw distance sphere is 32m
- if (Util.GetDistanceTo(AbsolutePosition, m_LastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance)
+ if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance ||
+ Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance)
{
ChildAgentDataUpdate cadu = new ChildAgentDataUpdate();
cadu.ActiveGroupID = UUID.Zero.Guid;
@@ -2792,7 +2752,7 @@ namespace OpenSim.Region.Framework.Scenes
cadu.godlevel = m_godlevel;
cadu.GroupAccess = 0;
cadu.Position = new sLLVector3(AbsolutePosition);
- cadu.regionHandle = m_scene.RegionInfo.RegionHandle;
+ cadu.regionHandle = m_rootRegionHandle;
float multiplier = 1;
int innacurateNeighbors = m_scene.GetInaccurateNeighborCount();
if (innacurateNeighbors != 0)
@@ -2812,11 +2772,9 @@ namespace OpenSim.Region.Framework.Scenes
agentpos.CopyFrom(cadu);
m_scene.SendOutChildAgentUpdates(agentpos, this);
-
- m_LastChildAgentUpdatePosition.X = AbsolutePosition.X;
- m_LastChildAgentUpdatePosition.Y = AbsolutePosition.Y;
- m_LastChildAgentUpdatePosition.Z = AbsolutePosition.Z;
+ m_lastChildAgentUpdatePosition = AbsolutePosition;
+ m_lastChildAgentUpdateCamPosition = CameraPosition;
}
}
@@ -2941,9 +2899,9 @@ namespace OpenSim.Region.Framework.Scenes
m_inTransit = true;
if ((m_physicsActor != null) && m_physicsActor.Flying)
- m_AgentControlFlags |= (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
- else if ((m_AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
- m_AgentControlFlags &= ~(uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+ m_AgentControlFlags |= AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+ else if ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0)
+ m_AgentControlFlags &= ~AgentManager.ControlFlags.AGENT_CONTROL_FLY;
}
public void NotInTransit()
@@ -2959,7 +2917,7 @@ namespace OpenSim.Region.Framework.Scenes
public void Reset()
{
// Put the child agent back at the center
- AbsolutePosition = new Vector3(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 70);
+ AbsolutePosition = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
ResetAnimations();
}
@@ -3069,9 +3027,11 @@ namespace OpenSim.Region.Framework.Scenes
int shiftx = ((int)rRegionX - (int)tRegionX) * (int)Constants.RegionSize;
int shifty = ((int)rRegionY - (int)tRegionY) * (int)Constants.RegionSize;
+ Vector3 offset = new Vector3(shiftx, shifty, 0f);
+
m_DrawDistance = cAgentData.Far;
- if (cAgentData.Position != new Vector3(-1, -1, -1)) // UGH!!
- m_pos = new Vector3(cAgentData.Position.X + shiftx, cAgentData.Position.Y + shifty, cAgentData.Position.Z);
+ if (cAgentData.Position != new Vector3(-1f, -1f, -1f)) // UGH!!
+ m_pos = cAgentData.Position + offset;
if (Vector3.Distance(AbsolutePosition, posLastSignificantMove) >= Scene.ChildReprioritizationDistance)
{
@@ -3079,8 +3039,7 @@ namespace OpenSim.Region.Framework.Scenes
ReprioritizeUpdates();
}
- // 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
- m_CameraCenter = cAgentData.Center;
+ m_CameraCenter = cAgentData.Center + offset;
m_avHeight = cAgentData.Size.Z;
//SetHeight(cAgentData.AVHeight);
@@ -3093,16 +3052,16 @@ namespace OpenSim.Region.Framework.Scenes
m_sceneViewer.Reset();
//cAgentData.AVHeight;
- //cAgentData.regionHandle;
+ m_rootRegionHandle = cAgentData.RegionHandle;
//m_velocity = cAgentData.Velocity;
}
public void CopyTo(AgentData cAgent)
{
cAgent.AgentID = UUID;
- cAgent.RegionHandle = m_scene.RegionInfo.RegionHandle;
+ cAgent.RegionHandle = m_rootRegionHandle;
- cAgent.Position = m_pos;
+ cAgent.Position = AbsolutePosition;
cAgent.Velocity = m_velocity;
cAgent.Center = m_CameraCenter;
// Don't copy the size; it is inferred from apearance parameters
@@ -3129,7 +3088,7 @@ namespace OpenSim.Region.Framework.Scenes
cAgent.HeadRotation = m_headrotation;
cAgent.BodyRotation = m_bodyRot;
- cAgent.ControlFlags = m_AgentControlFlags;
+ cAgent.ControlFlags = (uint)m_AgentControlFlags;
if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
cAgent.GodLevel = (byte)m_godlevel;
@@ -3199,7 +3158,8 @@ namespace OpenSim.Region.Framework.Scenes
public void CopyFrom(AgentData cAgent)
{
- m_rootRegionHandle= cAgent.RegionHandle;
+ m_rootRegionHandle = cAgent.RegionHandle;
+
m_callbackURI = cAgent.CallbackURI;
m_pos = cAgent.Position;
@@ -3217,7 +3177,7 @@ namespace OpenSim.Region.Framework.Scenes
m_headrotation = cAgent.HeadRotation;
m_bodyRot = cAgent.BodyRotation;
- m_AgentControlFlags = cAgent.ControlFlags;
+ m_AgentControlFlags = (AgentManager.ControlFlags)cAgent.ControlFlags;
if (m_scene.Permissions.IsGod(new UUID(cAgent.AgentID)))
m_godlevel = cAgent.GodLevel;
@@ -3291,47 +3251,18 @@ namespace OpenSim.Region.Framework.Scenes
///
public override void UpdateMovement()
{
- lock (m_forcesList)
+ if (m_forceToApply.HasValue)
{
- if (m_forcesList.Count > 0)
- {
- //we are only interested in the last velocity added to the list [Although they are called forces, they are actually velocities]
- NewForce force = m_forcesList[m_forcesList.Count - 1];
+ Vector3 force = m_forceToApply.Value;
- m_updateflag = true;
- try
- {
- movementvector.X = force.X;
- movementvector.Y = force.Y;
- movementvector.Z = force.Z;
- Velocity = movementvector;
- }
- catch (NullReferenceException)
- {
- // Under extreme load, this returns a NullReference Exception that we can ignore.
- // Ignoring this causes no movement to be sent to the physics engine...
- // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter!
- }
+ m_updateflag = true;
+ movementvector = force;
+ Velocity = force;
- m_forcesList.Clear();
- }
+ m_forceToApply = null;
}
}
- static ScenePresence()
- {
- Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
- DefaultTexture = textu.GetBytes();
-
- }
-
- public class NewForce
- {
- public float X;
- public float Y;
- public float Z;
- }
-
public override void SetText(string text, Vector3 color, double alpha)
{
throw new Exception("Can't set Text on avatar.");
@@ -3342,7 +3273,6 @@ namespace OpenSim.Region.Framework.Scenes
///
public void AddToPhysicalScene(bool isFlying)
{
-
PhysicsScene scene = m_scene.PhysicsScene;
Vector3 pVec = AbsolutePosition;
@@ -3388,15 +3318,48 @@ namespace OpenSim.Region.Framework.Scenes
// as of this comment the interval is set in AddToPhysicalScene
UpdateMovementAnimations();
+ CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
+ Dictionary coldata = collisionData.m_objCollisionList;
+
+ CollisionPlane = Vector4.UnitW;
+
+ if (coldata.Count != 0)
+ {
+ switch (m_movementAnimation)
+ {
+ case "STAND":
+ case "WALK":
+ case "RUN":
+ case "CROUCH":
+ case "CROUCHWALK":
+ {
+ ContactPoint lowest;
+ lowest.SurfaceNormal = Vector3.Zero;
+ lowest.Position = Vector3.Zero;
+ lowest.Position.Z = Single.NaN;
+
+ foreach (ContactPoint contact in coldata.Values)
+ {
+ if (Single.IsNaN(lowest.Position.Z) || contact.Position.Z < lowest.Position.Z)
+ {
+ lowest = contact;
+ }
+ }
+
+ CollisionPlane = new Vector4(-lowest.SurfaceNormal, -Vector3.Dot(lowest.Position, lowest.SurfaceNormal));
+ }
+ break;
+ }
+ }
+
if (m_invulnerable)
return;
- CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
- Dictionary coldata = collisionData.m_objCollisionList;
+
float starthealth = Health;
uint killerObj = 0;
foreach (uint localid in coldata.Keys)
{
- if (coldata[localid] <= 0.10f || m_invulnerable)
+ if (coldata[localid].PenetrationDepth <= 0.10f || m_invulnerable)
continue;
//if (localid == 0)
//continue;
@@ -3406,9 +3369,9 @@ namespace OpenSim.Region.Framework.Scenes
if (part != null && part.ParentGroup.Damage != -1.0f)
Health -= part.ParentGroup.Damage;
else
- Health -= coldata[localid] * 5;
+ Health -= coldata[localid].PenetrationDepth * 5.0f;
- if (Health <= 0)
+ if (Health <= 0.0f)
{
if (localid != 0)
killerObj = localid;
@@ -3471,11 +3434,6 @@ namespace OpenSim.Region.Framework.Scenes
public ScenePresence()
{
- if (DefaultTexture == null)
- {
- Primitive.TextureEntry textu = AvatarAppearance.GetDefaultTexture();
- DefaultTexture = textu.GetBytes();
- }
m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
CreateSceneViewer();
}
@@ -3632,19 +3590,10 @@ namespace OpenSim.Region.Framework.Scenes
IgnoredControls &= ~(ScriptControlled)controls;
if (scriptedcontrols.ContainsKey(Script_item_UUID))
scriptedcontrols.Remove(Script_item_UUID);
-
}
else
{
-
- if (scriptedcontrols.ContainsKey(Script_item_UUID))
- {
- scriptedcontrols[Script_item_UUID] = obj;
- }
- else
- {
- scriptedcontrols.Add(Script_item_UUID, obj);
- }
+ scriptedcontrols[Script_item_UUID] = obj;
}
}
ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true);
@@ -3662,12 +3611,14 @@ namespace OpenSim.Region.Framework.Scenes
public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID)
{
+ ScriptControllers takecontrols;
+
lock (scriptedcontrols)
{
- if (scriptedcontrols.ContainsKey(Script_item_UUID))
+ if (scriptedcontrols.TryGetValue(Script_item_UUID, out takecontrols))
{
- ScriptControllers takecontrolls = scriptedcontrols[Script_item_UUID];
- ScriptControlled sctc = takecontrolls.eventControls;
+ ScriptControlled sctc = takecontrols.eventControls;
+
ControllingClient.SendTakeControls((int)sctc, false, false);
ControllingClient.SendTakeControls((int)sctc, true, false);
@@ -3678,7 +3629,6 @@ namespace OpenSim.Region.Framework.Scenes
IgnoredControls |= scData.ignoreControls;
}
}
-
}
}
@@ -3745,9 +3695,11 @@ namespace OpenSim.Region.Framework.Scenes
{
lock (scriptedcontrols)
{
- foreach (UUID scriptUUID in scriptedcontrols.Keys)
+ foreach (KeyValuePair kvp in scriptedcontrols)
{
- ScriptControllers scriptControlData = scriptedcontrols[scriptUUID];
+ UUID scriptUUID = kvp.Key;
+ ScriptControllers scriptControlData = kvp.Value;
+
ScriptControlled localHeld = allflags & scriptControlData.eventControls; // the flags interesting for us
ScriptControlled localLast = LastCommands & scriptControlData.eventControls; // the activated controls in the last cycle
ScriptControlled localChange = localHeld ^ localLast; // the changed bits
@@ -3763,37 +3715,40 @@ namespace OpenSim.Region.Framework.Scenes
LastCommands = allflags;
}
- internal static uint RemoveIgnoredControls(uint flags, ScriptControlled Ignored)
+ internal static AgentManager.ControlFlags RemoveIgnoredControls(AgentManager.ControlFlags flags, ScriptControlled ignored)
{
- if (Ignored == ScriptControlled.CONTROL_ZERO)
+ if (ignored == ScriptControlled.CONTROL_ZERO)
return flags;
- if ((Ignored & ScriptControlled.CONTROL_BACK) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
- if ((Ignored & ScriptControlled.CONTROL_FWD) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
- if ((Ignored & ScriptControlled.CONTROL_DOWN) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
- if ((Ignored & ScriptControlled.CONTROL_UP) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
- if ((Ignored & ScriptControlled.CONTROL_LEFT) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | (uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
- if ((Ignored & ScriptControlled.CONTROL_RIGHT) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
- if ((Ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
- if ((Ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
- if ((Ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
- if ((Ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
- flags &= ~((uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | (uint)AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
- //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
- //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
- //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
- //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
- //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
- //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
- //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
+
+ if ((ignored & ScriptControlled.CONTROL_BACK) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG);
+ if ((ignored & ScriptControlled.CONTROL_FWD) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_POS);
+ if ((ignored & ScriptControlled.CONTROL_DOWN) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG);
+ if ((ignored & ScriptControlled.CONTROL_UP) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_UP_POS);
+ if ((ignored & ScriptControlled.CONTROL_LEFT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS);
+ if ((ignored & ScriptControlled.CONTROL_RIGHT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG);
+ if ((ignored & ScriptControlled.CONTROL_ROT_LEFT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG);
+ if ((ignored & ScriptControlled.CONTROL_ROT_RIGHT) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS);
+ if ((ignored & ScriptControlled.CONTROL_ML_LBUTTON) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_ML_LBUTTON_DOWN);
+ if ((ignored & ScriptControlled.CONTROL_LBUTTON) != 0)
+ flags &= ~(AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_UP | AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN);
+
+ //DIR_CONTROL_FLAG_FORWARD = AgentManager.ControlFlags.AGENT_CONTROL_AT_POS,
+ //DIR_CONTROL_FLAG_BACK = AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG,
+ //DIR_CONTROL_FLAG_LEFT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS,
+ //DIR_CONTROL_FLAG_RIGHT = AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG,
+ //DIR_CONTROL_FLAG_UP = AgentManager.ControlFlags.AGENT_CONTROL_UP_POS,
+ //DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
+ //DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
+
return flags;
}
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceTests.cs
index 19c0fea4c8..f495022177 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
Assert.That(presence.IsChildAgent, Is.True, "Did not change to child agent after MakeChildAgent");
// Accepts 0 but rejects Constants.RegionSize
- Vector3 pos = new Vector3(0,Constants.RegionSize-1,0);
+ Vector3 pos = new Vector3(0,unchecked(Constants.RegionSize-1),0);
presence.MakeRootAgent(pos,true);
Assert.That(presence.IsChildAgent, Is.False, "Did not go back to root agent");
Assert.That(presence.AbsolutePosition, Is.EqualTo(pos), "Position is not the same one entered");
@@ -246,7 +246,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
scene2.AddNewClient(testclient);
ScenePresence presence = scene.GetScenePresence(agent1);
- presence.MakeRootAgent(new Vector3(0,Constants.RegionSize-1,0), true);
+ presence.MakeRootAgent(new Vector3(0,unchecked(Constants.RegionSize-1),0), true);
ScenePresence presence2 = scene2.GetScenePresence(agent1);
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs
index fbe43d6450..2c5093f58d 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/PointMetaEntity.cs
@@ -81,12 +81,11 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
y.Scale = new Vector3(0.01f,0.01f,0.01f);
y.LastOwnerID = UUID.Zero;
y.GroupPosition = groupPos;
- y.OffsetPosition = new Vector3(0, 0, 0);
- y.RotationOffset = new Quaternion(0,0,0,0);
- y.Velocity = new Vector3(0, 0, 0);
- y.RotationalVelocity = new Vector3(0, 0, 0);
- y.AngularVelocity = new Vector3(0, 0, 0);
- y.Acceleration = new Vector3(0, 0, 0);
+ y.OffsetPosition = Vector3.Zero;
+ y.RotationOffset = Quaternion.Identity;
+ y.Velocity = Vector3.Zero;
+ y.AngularVelocity = Vector3.Zero;
+ y.Acceleration = Vector3.Zero;
y.Flags = 0;
y.TrimPermissions();
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs
index e185351615..a6afa5ac74 100644
--- a/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs
+++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/SceneObjectGroupDiff.cs
@@ -172,8 +172,6 @@ namespace OpenSim.Region.OptionalModules.ContentManagement
result |= Diff.ANGULARVELOCITY;
if (!AreVectorsEquivalent(first.OffsetPosition, second.OffsetPosition))
result |= Diff.OFFSETPOSITION;
- if (!AreVectorsEquivalent(first.RotationalVelocity, second.RotationalVelocity))
- result |= Diff.ROTATIONALVELOCITY;
if (!AreVectorsEquivalent(first.Scale, second.Scale))
result |= Diff.SCALE;
if (!AreVectorsEquivalent(first.Velocity, second.Velocity))
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
index 6bfdff2807..f58129d241 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs
@@ -52,6 +52,20 @@ namespace OpenSim.Region.Physics.Manager
, Absolute
}
+ public struct ContactPoint
+ {
+ public Vector3 Position;
+ public Vector3 SurfaceNormal;
+ public float PenetrationDepth;
+
+ public ContactPoint(Vector3 position, Vector3 surfaceNormal, float penetrationDepth)
+ {
+ Position = position;
+ SurfaceNormal = surfaceNormal;
+ PenetrationDepth = penetrationDepth;
+ }
+ }
+
public class CollisionEventUpdate : EventArgs
{
// 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
public int m_colliderType;
public int m_GenericStartEnd;
//public uint m_LocalID;
- public Dictionary m_objCollisionList = new Dictionary();
+ public Dictionary m_objCollisionList = new Dictionary();
- public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, Dictionary objCollisionList)
+ public CollisionEventUpdate(uint localID, int colliderType, int GenericStartEnd, Dictionary objCollisionList)
{
m_colliderType = colliderType;
m_GenericStartEnd = GenericStartEnd;
@@ -72,8 +86,7 @@ namespace OpenSim.Region.Physics.Manager
{
m_colliderType = (int) ActorTypes.Unknown;
m_GenericStartEnd = 1;
- // m_objCollisionList = null;
- m_objCollisionList = new Dictionary();
+ m_objCollisionList = new Dictionary();
}
public int collidertype
@@ -88,16 +101,16 @@ namespace OpenSim.Region.Physics.Manager
set { m_GenericStartEnd = value; }
}
- public void addCollider(uint localID, float depth)
+ public void addCollider(uint localID, ContactPoint contact)
{
if (!m_objCollisionList.ContainsKey(localID))
{
- m_objCollisionList.Add(localID, depth);
+ m_objCollisionList.Add(localID, contact);
}
else
{
- if (m_objCollisionList[localID] < depth)
- m_objCollisionList[localID] = depth;
+ if (m_objCollisionList[localID].PenetrationDepth < contact.PenetrationDepth)
+ m_objCollisionList[localID] = contact;
}
}
}
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
index bb0d18e647..6d515e9eca 100644
--- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs
+++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs
@@ -75,6 +75,11 @@ namespace OpenSim.Region.Physics.Manager
public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position,
Vector3 size, Quaternion rotation, bool isPhysical);
+ public virtual float TimeDilation
+ {
+ get { return 1.0f; }
+ }
+
public virtual bool SupportsNINJAJoints
{
get { return false; }
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index fbe1949994..fded95e4bb 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -284,9 +284,13 @@ namespace OpenSim.Region.Physics.Meshing
try
{
- idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData);
+ OpenMetaverse.Imaging.ManagedImage unusedData;
+ OpenMetaverse.Imaging.OpenJPEG.DecodeToImage(primShape.SculptData, out unusedData, out idata);
+ unusedData = null;
- if (cacheSculptMaps)
+ //idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData);
+
+ if (cacheSculptMaps && idata != null)
{
try { idata.Save(decodedSculptFileName, ImageFormat.MemoryBmp); }
catch (Exception e) { m_log.Error("[SCULPT]: unable to cache sculpt map " + decodedSculptFileName + " " + e.Message); }
@@ -299,12 +303,12 @@ namespace OpenSim.Region.Physics.Meshing
}
catch (IndexOutOfRangeException)
{
- m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed");
+ m_log.Error("[PHYSICS]: OpenJpeg was unable to decode this. Physics Proxy generation failed");
return null;
}
- catch (Exception)
+ catch (Exception ex)
{
- m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed!");
+ m_log.Error("[PHYSICS]: Unable to generate a Sculpty physics proxy. Sculpty texture decode failed: " + ex.Message);
return null;
}
}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
index c86bc62b92..1bc4a25351 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs
@@ -1209,11 +1209,11 @@ namespace OpenSim.Region.Physics.OdePlugin
m_requestedUpdateFrequency = 0;
m_eventsubscription = 0;
}
- public void AddCollisionEvent(uint CollidedWith, float depth)
+ public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
{
if (m_eventsubscription > 0)
{
- CollisionEventsThisFrame.addCollider(CollidedWith, depth);
+ CollisionEventsThisFrame.addCollider(CollidedWith, contact);
}
}
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 5ff9d32bc1..f4b502a467 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -2958,11 +2958,11 @@ Console.WriteLine(" JointCreateFixed");
m_eventsubscription = 0;
}
- public void AddCollisionEvent(uint CollidedWith, float depth)
+ public void AddCollisionEvent(uint CollidedWith, ContactPoint contact)
{
if (CollisionEventsThisFrame == null)
CollisionEventsThisFrame = new CollisionEventUpdate();
- CollisionEventsThisFrame.addCollider(CollidedWith,depth);
+ CollisionEventsThisFrame.addCollider(CollidedWith, contact);
}
public void SendCollisions()
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
index 2f42646c20..a8e006bfa5 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs
@@ -159,6 +159,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private float ODE_STEPSIZE = 0.020f;
private float metersInSpace = 29.9f;
+ private float m_timeDilation = 1.0f;
public float gravityx = 0f;
public float gravityy = 0f;
@@ -177,8 +178,8 @@ namespace OpenSim.Region.Physics.OdePlugin
//private int m_returncollisions = 10;
private readonly IntPtr contactgroup;
- internal IntPtr LandGeom;
+ internal IntPtr LandGeom;
internal IntPtr WaterGeom;
private float nmTerrainContactFriction = 255.0f;
@@ -250,7 +251,7 @@ namespace OpenSim.Region.Physics.OdePlugin
private bool m_NINJA_physics_joints_enabled = false;
//private Dictionary jointpart_name_map = new Dictionary();
private readonly Dictionary> joints_connecting_actor = new Dictionary>();
- private d.ContactGeom[] contacts = new d.ContactGeom[80];
+ private d.ContactGeom[] contacts;
private readonly List requestedJointsToBeCreated = new List(); // lock only briefly. accessed by external code (to request new joints) and by OdeScene.Simulate() to move those joints into pending/active
private readonly List pendingJoints = new List(); // can lock for longer. accessed only by OdeScene.
private readonly List activeJoints = new List(); // can lock for longer. accessed only by OdeScene.
@@ -396,6 +397,8 @@ namespace OpenSim.Region.Physics.OdePlugin
avStandupTensor = 550000f;
}
+ int contactsPerCollision = 80;
+
if (m_config != null)
{
IConfig physicsconfig = m_config.Configs["ODEPhysicsSettings"];
@@ -438,6 +441,8 @@ namespace OpenSim.Region.Physics.OdePlugin
avCapRadius = physicsconfig.GetFloat("av_capsule_radius", 0.37f);
avCapsuleTilted = physicsconfig.GetBoolean("av_capsule_tilted", true);
+ contactsPerCollision = physicsconfig.GetInt("contacts_per_collision", 80);
+
geomContactPointsStartthrottle = physicsconfig.GetInt("geom_contactpoints_start_throttling", 3);
geomUpdatesPerThrottledUpdate = physicsconfig.GetInt("geom_updates_before_throttled_update", 15);
geomCrossingFailuresBeforeOutofbounds = physicsconfig.GetInt("geom_crossing_failures_before_outofbounds", 5);
@@ -475,10 +480,11 @@ namespace OpenSim.Region.Physics.OdePlugin
m_NINJA_physics_joints_enabled = physicsconfig.GetBoolean("use_NINJA_physics_joints", false);
minimumGroundFlightOffset = physicsconfig.GetFloat("minimum_ground_flight_offset", 3f);
-
}
}
+ contacts = new d.ContactGeom[contactsPerCollision];
+
staticPrimspace = new IntPtr[(int)(300 / metersInSpace), (int)(300 / metersInSpace)];
// Centeral contact friction and bounce
@@ -771,7 +777,9 @@ namespace OpenSim.Region.Physics.OdePlugin
lock (contacts)
{
- count = d.Collide(g1, g2, contacts.GetLength(0), contacts, d.ContactGeom.SizeOf);
+ count = d.Collide(g1, g2, contacts.Length, contacts, d.ContactGeom.SizeOf);
+ if (count > contacts.Length)
+ m_log.Error("[PHYSICS]: Got " + count + " contacts when we asked for a maximum of " + contacts.Length);
}
}
catch (SEHException)
@@ -799,7 +807,7 @@ namespace OpenSim.Region.Physics.OdePlugin
p2 = PANull;
}
- float max_collision_depth = 0f;
+ ContactPoint maxDepthContact = new ContactPoint();
if (p1.CollisionScore + count >= float.MaxValue)
p1.CollisionScore = 0;
p1.CollisionScore += count;
@@ -810,9 +818,17 @@ namespace OpenSim.Region.Physics.OdePlugin
for (int i = 0; i < count; i++)
{
+ d.ContactGeom curContact = contacts[i];
+ if (curContact.depth > maxDepthContact.PenetrationDepth)
+ {
+ maxDepthContact = new ContactPoint(
+ new Vector3(curContact.pos.X, curContact.pos.Y, curContact.pos.Z),
+ new Vector3(curContact.normal.X, curContact.normal.Y, curContact.normal.Z),
+ curContact.depth
+ );
+ }
- max_collision_depth = (contacts[i].depth > max_collision_depth) ? contacts[i].depth : max_collision_depth;
//m_log.Warn("[CCOUNT]: " + count);
IntPtr joint;
// If we're colliding with terrain, use 'TerrainContact' instead of contact.
@@ -829,7 +845,7 @@ namespace OpenSim.Region.Physics.OdePlugin
p2.CollidingObj = true;
break;
case (int)ActorTypes.Prim:
- if (p2.Velocity.X > 0 || p2.Velocity.Y > 0 || p2.Velocity.Z > 0)
+ if (p2.Velocity.LengthSquared() > 0.0f)
p2.CollidingObj = true;
break;
case (int)ActorTypes.Unknown:
@@ -845,14 +861,14 @@ namespace OpenSim.Region.Physics.OdePlugin
#region InterPenetration Handling - Unintended physics explosions
# region disabled code1
- if (contacts[i].depth >= 0.08f)
+ if (curContact.depth >= 0.08f)
{
//This is disabled at the moment only because it needs more tweaking
//It will eventually be uncommented
/*
- if (contacts[i].depth >= 1.00f)
+ if (contact.depth >= 1.00f)
{
- //m_log.Debug("[PHYSICS]: " + contacts[i].depth.ToString());
+ //m_log.Debug("[PHYSICS]: " + contact.depth.ToString());
}
//If you interpenetrate a prim with an agent
@@ -862,37 +878,37 @@ namespace OpenSim.Region.Physics.OdePlugin
p2.PhysicsActorType == (int) ActorTypes.Prim))
{
- //contacts[i].depth = contacts[i].depth * 4.15f;
+ //contact.depth = contact.depth * 4.15f;
/*
if (p2.PhysicsActorType == (int) ActorTypes.Agent)
{
p2.CollidingObj = true;
- contacts[i].depth = 0.003f;
+ contact.depth = 0.003f;
p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 2.5f);
OdeCharacter character = (OdeCharacter) p2;
character.SetPidStatus(true);
- 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));
+ 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));
}
else
{
- //contacts[i].depth = 0.0000000f;
+ //contact.depth = 0.0000000f;
}
if (p1.PhysicsActorType == (int) ActorTypes.Agent)
{
p1.CollidingObj = true;
- contacts[i].depth = 0.003f;
+ contact.depth = 0.003f;
p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 2.5f);
- 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));
+ 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));
OdeCharacter character = (OdeCharacter)p1;
character.SetPidStatus(true);
}
else
{
- //contacts[i].depth = 0.0000000f;
+ //contact.depth = 0.0000000f;
}
@@ -917,7 +933,7 @@ namespace OpenSim.Region.Physics.OdePlugin
//AddPhysicsActorTaint(p2);
//}
- //if (contacts[i].depth >= 0.25f)
+ //if (contact.depth >= 0.25f)
//{
// Don't collide, one or both prim will expld.
@@ -935,21 +951,21 @@ namespace OpenSim.Region.Physics.OdePlugin
//AddPhysicsActorTaint(p2);
//}
- //contacts[i].depth = contacts[i].depth / 8f;
- //contacts[i].normal = new d.Vector3(0, 0, 1);
+ //contact.depth = contact.depth / 8f;
+ //contact.normal = new d.Vector3(0, 0, 1);
//}
//if (op1.m_disabled || op2.m_disabled)
//{
//Manually disabled objects stay disabled
- //contacts[i].depth = 0f;
+ //contact.depth = 0f;
//}
#endregion
}
*/
#endregion
- if (contacts[i].depth >= 1.00f)
+ if (curContact.depth >= 1.00f)
{
- //m_log.Info("[P]: " + contacts[i].depth.ToString());
+ //m_log.Info("[P]: " + contact.depth.ToString());
if ((p2.PhysicsActorType == (int) ActorTypes.Agent &&
p1.PhysicsActorType == (int) ActorTypes.Unknown) ||
(p1.PhysicsActorType == (int) ActorTypes.Agent &&
@@ -962,12 +978,12 @@ namespace OpenSim.Region.Physics.OdePlugin
OdeCharacter character = (OdeCharacter) p2;
//p2.CollidingObj = true;
- contacts[i].depth = 0.00000003f;
+ curContact.depth = 0.00000003f;
p2.Velocity = p2.Velocity + new Vector3(0f, 0f, 0.5f);
- 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));
+ curContact.pos =
+ new d.Vector3(curContact.pos.X + (p1.Size.X/2),
+ curContact.pos.Y + (p1.Size.Y/2),
+ curContact.pos.Z + (p1.Size.Z/2));
character.SetPidStatus(true);
}
}
@@ -980,12 +996,12 @@ namespace OpenSim.Region.Physics.OdePlugin
OdeCharacter character = (OdeCharacter) p1;
//p2.CollidingObj = true;
- contacts[i].depth = 0.00000003f;
+ curContact.depth = 0.00000003f;
p1.Velocity = p1.Velocity + new Vector3(0f, 0f, 0.5f);
- 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));
+ curContact.pos =
+ new d.Vector3(curContact.pos.X + (p1.Size.X/2),
+ curContact.pos.Y + (p1.Size.Y/2),
+ curContact.pos.Z + (p1.Size.Z/2));
character.SetPidStatus(true);
}
}
@@ -1007,16 +1023,15 @@ namespace OpenSim.Region.Physics.OdePlugin
if (!skipThisContact && (p2 is OdePrim) && (((OdePrim)p2).m_isVolumeDetect))
skipThisContact = true; // No collision on volume detect prims
- if (!skipThisContact && contacts[i].depth < 0f)
+ if (!skipThisContact && curContact.depth < 0f)
skipThisContact = true;
- if (!skipThisContact && checkDupe(contacts[i], p2.PhysicsActorType))
+ if (!skipThisContact && checkDupe(curContact, p2.PhysicsActorType))
skipThisContact = true;
- int maxContactsbeforedeath = 4000;
+ const int maxContactsbeforedeath = 4000;
joint = IntPtr.Zero;
-
if (!skipThisContact)
{
// If we're colliding against terrain
@@ -1027,8 +1042,8 @@ namespace OpenSim.Region.Physics.OdePlugin
(Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
{
// Use the movement terrain contact
- AvatarMovementTerrainContact.geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ AvatarMovementTerrainContact.geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementTerrainContact);
@@ -1040,8 +1055,8 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2.PhysicsActorType == (int)ActorTypes.Agent)
{
// Use the non moving terrain contact
- TerrainContact.geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ TerrainContact.geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
joint = d.JointCreateContact(world, contactgroup, ref TerrainContact);
@@ -1066,8 +1081,8 @@ namespace OpenSim.Region.Physics.OdePlugin
material = ((OdePrim)p2).m_material;
//m_log.DebugFormat("Material: {0}", material);
- m_materialContacts[material, movintYN].geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ m_materialContacts[material, movintYN].geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
@@ -1092,8 +1107,8 @@ namespace OpenSim.Region.Physics.OdePlugin
if (p2 is OdePrim)
material = ((OdePrim)p2).m_material;
//m_log.DebugFormat("Material: {0}", material);
- m_materialContacts[material, movintYN].geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ m_materialContacts[material, movintYN].geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
@@ -1121,20 +1136,20 @@ namespace OpenSim.Region.Physics.OdePlugin
*/
//WaterContact.surface.soft_cfm = 0.0000f;
//WaterContact.surface.soft_erp = 0.00000f;
- if (contacts[i].depth > 0.1f)
+ if (curContact.depth > 0.1f)
{
- contacts[i].depth *= 52;
- //contacts[i].normal = new d.Vector3(0, 0, 1);
- //contacts[i].pos = new d.Vector3(0, 0, contacts[i].pos.Z - 5f);
+ curContact.depth *= 52;
+ //contact.normal = new d.Vector3(0, 0, 1);
+ //contact.pos = new d.Vector3(0, 0, contact.pos.Z - 5f);
}
- WaterContact.geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ WaterContact.geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
joint = d.JointCreateContact(world, contactgroup, ref WaterContact);
m_global_contactcount++;
}
- //m_log.Info("[PHYSICS]: Prim Water Contact" + contacts[i].depth);
+ //m_log.Info("[PHYSICS]: Prim Water Contact" + contact.depth);
}
else
{
@@ -1145,8 +1160,8 @@ namespace OpenSim.Region.Physics.OdePlugin
if ((Math.Abs(p2.Velocity.X) > 0.01f || Math.Abs(p2.Velocity.Y) > 0.01f))
{
// Use the Movement prim contact
- AvatarMovementprimContact.geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ AvatarMovementprimContact.geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
joint = d.JointCreateContact(world, contactgroup, ref AvatarMovementprimContact);
@@ -1156,8 +1171,8 @@ namespace OpenSim.Region.Physics.OdePlugin
else
{
// Use the non movement contact
- contact.geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ contact.geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
@@ -1175,8 +1190,8 @@ namespace OpenSim.Region.Physics.OdePlugin
material = ((OdePrim)p2).m_material;
//m_log.DebugFormat("Material: {0}", material);
- m_materialContacts[material, 0].geom = contacts[i];
- _perloopContact.Add(contacts[i]);
+ m_materialContacts[material, 0].geom = curContact;
+ _perloopContact.Add(curContact);
if (m_global_contactcount < maxContactsbeforedeath)
{
@@ -1194,7 +1209,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
}
- collision_accounting_events(p1, p2, max_collision_depth);
+ collision_accounting_events(p1, p2, maxDepthContact);
if (count > geomContactPointsStartthrottle)
{
// If there are more then 3 contact points, it's likely
@@ -1278,7 +1293,7 @@ namespace OpenSim.Region.Physics.OdePlugin
return result;
}
- private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, float collisiondepth)
+ private void collision_accounting_events(PhysicsActor p1, PhysicsActor p2, ContactPoint contact)
{
// obj1LocalID = 0;
//returncollisions = false;
@@ -1299,7 +1314,7 @@ namespace OpenSim.Region.Physics.OdePlugin
case ActorTypes.Agent:
cc1 = (OdeCharacter)p1;
obj2LocalID = cc1.m_localID;
- cc1.AddCollisionEvent(cc2.m_localID, collisiondepth);
+ cc1.AddCollisionEvent(cc2.m_localID, contact);
//ctype = (int)CollisionCategories.Character;
//if (cc1.CollidingObj)
@@ -1314,7 +1329,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
cp1 = (OdePrim) p1;
obj2LocalID = cp1.m_localID;
- cp1.AddCollisionEvent(cc2.m_localID, collisiondepth);
+ cp1.AddCollisionEvent(cc2.m_localID, contact);
}
//ctype = (int)CollisionCategories.Geom;
@@ -1334,7 +1349,7 @@ namespace OpenSim.Region.Physics.OdePlugin
break;
}
- cc2.AddCollisionEvent(obj2LocalID, collisiondepth);
+ cc2.AddCollisionEvent(obj2LocalID, contact);
break;
case ActorTypes.Prim:
@@ -1350,7 +1365,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
cc1 = (OdeCharacter) p1;
obj2LocalID = cc1.m_localID;
- cc1.AddCollisionEvent(cp2.m_localID, collisiondepth);
+ cc1.AddCollisionEvent(cp2.m_localID, contact);
//ctype = (int)CollisionCategories.Character;
//if (cc1.CollidingObj)
@@ -1366,7 +1381,7 @@ namespace OpenSim.Region.Physics.OdePlugin
{
cp1 = (OdePrim) p1;
obj2LocalID = cp1.m_localID;
- cp1.AddCollisionEvent(cp2.m_localID, collisiondepth);
+ cp1.AddCollisionEvent(cp2.m_localID, contact);
//ctype = (int)CollisionCategories.Geom;
//if (cp1.CollidingObj)
@@ -1387,7 +1402,7 @@ namespace OpenSim.Region.Physics.OdePlugin
break;
}
- cp2.AddCollisionEvent(obj2LocalID, collisiondepth);
+ cp2.AddCollisionEvent(obj2LocalID, contact);
}
break;
}
@@ -1750,6 +1765,11 @@ namespace OpenSim.Region.Physics.OdePlugin
return result;
}
+ public override float TimeDilation
+ {
+ get { return m_timeDilation; }
+ }
+
public override bool SupportsNINJAJoints
{
get { return m_NINJA_physics_joints_enabled; }
@@ -2657,8 +2677,10 @@ namespace OpenSim.Region.Physics.OdePlugin
// Figure out the Frames Per Second we're going at.
//(step_time == 0.004f, there's 250 of those per second. Times the step time/step size
-
- fps = (step_time/ODE_STEPSIZE) * 1000;
+
+ fps = (step_time / ODE_STEPSIZE) * 1000;
+ // HACK: Using a time dilation of 1.0 to debug rubberbanding issues
+ //m_timeDilation = Math.Min((step_time / ODE_STEPSIZE) / (0.09375f / ODE_STEPSIZE), 1.0f);
step_time = 0.09375f;
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs b/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs
index f8af902dc1..e4ca635cfd 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/ICompiler.cs
@@ -34,9 +34,7 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
{
public interface ICompiler
{
- object PerformScriptCompile(string source, string asset, UUID ownerID);
+ void PerformScriptCompile(string source, string asset, UUID ownerID, out string assembly, out Dictionary, KeyValuePair> linemap);
string[] GetWarnings();
- Dictionary, KeyValuePair>
- LineMap();
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 3849558a07..0ea62d77c1 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
public LSL_Vector llGetOmega()
{
m_host.AddScriptLPS(1);
- return new LSL_Vector(m_host.RotationalVelocity.X, m_host.RotationalVelocity.Y, m_host.RotationalVelocity.Z);
+ return new LSL_Vector(m_host.AngularVelocity.X, m_host.AngularVelocity.Y, m_host.AngularVelocity.Z);
}
public LSL_Float llGetTimeOfDay()
@@ -3159,7 +3159,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llTargetOmega(LSL_Vector axis, double spinrate, double gain)
{
m_host.AddScriptLPS(1);
- m_host.RotationalVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate));
m_host.AngularVelocity = new Vector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate));
m_host.ScheduleTerseUpdate();
m_host.SendTerseUpdateToAllClients();
@@ -3817,7 +3816,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
case 1: // DATA_ONLINE (0|1)
// TODO: implement fetching of this information
- if (userProfile.CurrentAgent.AgentOnline)
+ if (userProfile.CurrentAgent!=null && userProfile.CurrentAgent.AgentOnline)
reply = "1";
else
reply = "0";
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
index 917ca447c5..121159c0d8 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
return;
//ILease lease = (ILease)RemotingServices.GetLifetimeService(data as MarshalByRefObject);
- RemotingServices.GetLifetimeService(data as MarshalByRefObject);
+ //RemotingServices.GetLifetimeService(data as MarshalByRefObject);
// lease.Register(m_sponser);
MethodInfo mi = inits[api];
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index fe2642958c..3080c711b0 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
private string FilePrefix;
private string ScriptEnginesPath = "ScriptEngines";
// mapping between LSL and C# line/column numbers
- private Dictionary, KeyValuePair> m_positionMap;
private ICodeConverter LSL_Converter;
private List m_warnings = new List();
@@ -91,6 +90,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
private static UInt64 scriptCompileCounter = 0; // And a counter
public IScriptEngine m_scriptEngine;
+ private Dictionary, KeyValuePair>> m_lineMaps =
+ new Dictionary, KeyValuePair>>();
+
public Compiler(IScriptEngine scriptEngine)
{
m_scriptEngine = scriptEngine;
@@ -172,8 +174,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
else
{
#if DEBUG
-// m_log.Debug("[Compiler]: " +
-// "Config OK. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is recognized as a valid language.");
+ // m_log.Debug("[Compiler]: " +
+ // "Config OK. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is recognized as a valid language.");
#endif
// LANGUAGE IS IN ALLOW-LIST
DefaultCompileLanguage = LanguageMapping[defaultCompileLanguage];
@@ -212,12 +214,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
catch (Exception ex)
{
m_log.Error("[Compiler]: Exception trying to create ScriptEngine directory \"" + Path.Combine(ScriptEnginesPath,
- m_scriptEngine.World.RegionInfo.RegionID.ToString())+ "\": " + ex.ToString());
+ m_scriptEngine.World.RegionInfo.RegionID.ToString()) + "\": " + ex.ToString());
}
}
foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath,
- m_scriptEngine.World.RegionInfo.RegionID.ToString()),FilePrefix + "_compiled*"))
+ m_scriptEngine.World.RegionInfo.RegionID.ToString()), FilePrefix + "_compiled*"))
{
try
{
@@ -271,16 +273,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
///
/// LSL script
/// Filename to .dll assembly
- public object PerformScriptCompile(string Script, string asset, UUID ownerUUID)
+ public void PerformScriptCompile(string Script, string asset, UUID ownerUUID,
+ out string assembly, out Dictionary, KeyValuePair> linemap)
{
- m_positionMap = null;
+ linemap = null;
m_warnings.Clear();
-
- string OutFile = Path.Combine(ScriptEnginesPath, Path.Combine(
+
+ assembly = Path.Combine(ScriptEnginesPath, Path.Combine(
m_scriptEngine.World.RegionInfo.RegionID.ToString(),
FilePrefix + "_compiled_" + asset + ".dll"));
-// string OutFile = Path.Combine(ScriptEnginesPath,
-// FilePrefix + "_compiled_" + asset + ".dll");
if (!Directory.Exists(ScriptEnginesPath))
{
@@ -305,60 +306,63 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
}
}
+ // Don't recompile if we already have it
+ // Performing 3 file exists tests for every script can still be slow
+ if (File.Exists(assembly) && File.Exists(assembly + ".text") && File.Exists(assembly + ".map"))
+ {
+ // If we have already read this linemap file, then it will be in our dictionary.
+ // Don't build another copy of the dictionary (saves memory) and certainly
+ // don't keep reading the same file from disk multiple times.
+ if (!m_lineMaps.ContainsKey(assembly))
+ m_lineMaps[assembly] = ReadMapFile(assembly + ".map");
+ linemap = m_lineMaps[assembly];
+ return;
+ }
+
if (Script == String.Empty)
{
- if (File.Exists(OutFile))
- return OutFile;
-
throw new Exception("Cannot find script assembly and no script text present");
}
- // Don't recompile if we already have it
- //
- if (File.Exists(OutFile) && File.Exists(OutFile+".text") && File.Exists(OutFile+".map"))
- {
- ReadMapFile(OutFile+".map");
- return OutFile;
- }
-
- enumCompileType l = DefaultCompileLanguage;
+ enumCompileType language = DefaultCompileLanguage;
if (Script.StartsWith("//c#", true, CultureInfo.InvariantCulture))
- l = enumCompileType.cs;
+ language = enumCompileType.cs;
if (Script.StartsWith("//vb", true, CultureInfo.InvariantCulture))
{
- l = enumCompileType.vb;
+ language = enumCompileType.vb;
// We need to remove //vb, it won't compile with that
Script = Script.Substring(4, Script.Length - 4);
}
if (Script.StartsWith("//lsl", true, CultureInfo.InvariantCulture))
- l = enumCompileType.lsl;
+ language = enumCompileType.lsl;
if (Script.StartsWith("//js", true, CultureInfo.InvariantCulture))
- l = enumCompileType.js;
+ language = enumCompileType.js;
if (Script.StartsWith("//yp", true, CultureInfo.InvariantCulture))
- l = enumCompileType.yp;
+ language = enumCompileType.yp;
- if (!AllowedCompilers.ContainsKey(l.ToString()))
+ if (!AllowedCompilers.ContainsKey(language.ToString()))
{
// Not allowed to compile to this language!
string errtext = String.Empty;
- errtext += "The compiler for language \"" + l.ToString() + "\" is not in list of allowed compilers. Script will not be executed!";
+ errtext += "The compiler for language \"" + language.ToString() + "\" is not in list of allowed compilers. Script will not be executed!";
throw new Exception(errtext);
}
- if (m_scriptEngine.World.Permissions.CanCompileScript(ownerUUID, (int)l) == false) {
+ if (m_scriptEngine.World.Permissions.CanCompileScript(ownerUUID, (int)language) == false)
+ {
// Not allowed to compile to this language!
string errtext = String.Empty;
errtext += ownerUUID + " is not in list of allowed users for this scripting language. Script will not be executed!";
throw new Exception(errtext);
}
-
+
string compileScript = Script;
- if (l == enumCompileType.lsl)
+ if (language == enumCompileType.lsl)
{
// Its LSL, convert it to C#
LSL_Converter = (ICodeConverter)new CSCodeGenerator();
@@ -370,16 +374,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
AddWarning(warning);
}
- m_positionMap = ((CSCodeGenerator) LSL_Converter).PositionMap;
+ linemap = ((CSCodeGenerator)LSL_Converter).PositionMap;
+ // Write the linemap to a file and save it in our dictionary for next time.
+ m_lineMaps[assembly] = linemap;
+ WriteMapFile(assembly + ".map", linemap);
}
- if (l == enumCompileType.yp)
+ if (language == enumCompileType.yp)
{
// Its YP, convert it to C#
compileScript = YP_Converter.Convert(Script);
}
- switch (l)
+ switch (language)
{
case enumCompileType.cs:
case enumCompileType.lsl:
@@ -396,7 +403,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
break;
}
- return CompileFromDotNetText(compileScript, l, asset);
+ assembly = CompileFromDotNetText(compileScript, language, asset, assembly);
+ return;
}
public string[] GetWarnings()
@@ -468,22 +476,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
///
/// CS script
/// Filename to .dll assembly
- internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset)
+ internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset, string assembly)
{
string ext = "." + lang.ToString();
// Output assembly name
scriptCompileCounter++;
- string OutFile = Path.Combine(ScriptEnginesPath, Path.Combine(
- m_scriptEngine.World.RegionInfo.RegionID.ToString(),
- FilePrefix + "_compiled_" + asset + ".dll"));
try
{
- File.Delete(OutFile);
+ File.Delete(assembly);
}
catch (Exception e) // NOTLEGIT - Should be just FileIOException
{
- throw new Exception("Unable to delete old existing "+
+ throw new Exception("Unable to delete old existing " +
"script-file before writing new. Compile aborted: " +
e.ToString());
}
@@ -492,7 +497,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
if (WriteScriptSourceToDebugFile)
{
string srcFileName = FilePrefix + "_source_" +
- Path.GetFileNameWithoutExtension(OutFile) + ext;
+ Path.GetFileNameWithoutExtension(assembly) + ext;
try
{
File.WriteAllText(Path.Combine(Path.Combine(
@@ -502,7 +507,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
}
catch (Exception ex) //NOTLEGIT - Should be just FileIOException
{
- m_log.Error("[Compiler]: Exception while "+
+ m_log.Error("[Compiler]: Exception while " +
"trying to write script source to file \"" +
srcFileName + "\": " + ex.ToString());
}
@@ -528,7 +533,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
}
parameters.GenerateExecutable = false;
- parameters.OutputAssembly = OutFile;
+ parameters.OutputAssembly = assembly;
parameters.IncludeDebugInformation = CompileWithDebugInformation;
//parameters.WarningLevel = 1; // Should be 4?
parameters.TreatWarningsAsErrors = false;
@@ -543,7 +548,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
case enumCompileType.cs:
case enumCompileType.lsl:
bool complete = false;
- bool retried = false;
+ bool retried = false;
do
{
lock (CScodeProvider)
@@ -584,7 +589,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
parameters, Script);
break;
default:
- throw new Exception("Compiler is not able to recongnize "+
+ throw new Exception("Compiler is not able to recongnize " +
"language type \"" + lang.ToString() + "\"");
}
@@ -609,7 +614,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
if (severity == "Error")
{
- lslPos = FindErrorPosition(CompErr.Line, CompErr.Column);
+ lslPos = FindErrorPosition(CompErr.Line, CompErr.Column, m_lineMaps[assembly]);
string text = CompErr.ErrorText;
// Use LSL type names
@@ -635,14 +640,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
// the compile may not be immediately apparent. Wait a
// reasonable amount of time before giving up on it.
- if (!File.Exists(OutFile))
+ if (!File.Exists(assembly))
{
- for (int i=0; i<20 && !File.Exists(OutFile); i++)
+ for (int i = 0; i < 20 && !File.Exists(assembly); i++)
{
System.Threading.Thread.Sleep(250);
}
// One final chance...
- if (!File.Exists(OutFile))
+ if (!File.Exists(assembly))
{
errtext = String.Empty;
errtext += "No compile error. But not able to locate compiled file.";
@@ -650,15 +655,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
}
}
-// m_log.DebugFormat("[Compiler] Compiled new assembly "+
-// "for {0}", asset);
+ // m_log.DebugFormat("[Compiler] Compiled new assembly "+
+ // "for {0}", asset);
// Because windows likes to perform exclusive locks, we simply
// write out a textual representation of the file here
//
// Read the binary file into a buffer
//
- FileInfo fi = new FileInfo(OutFile);
+ FileInfo fi = new FileInfo(assembly);
if (fi == null)
{
@@ -671,7 +676,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
try
{
- FileStream fs = File.Open(OutFile, FileMode.Open, FileAccess.Read);
+ FileStream fs = File.Open(assembly, FileMode.Open, FileAccess.Read);
fs.Read(data, 0, data.Length);
fs.Close();
}
@@ -690,40 +695,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
Byte[] buf = enc.GetBytes(filetext);
- FileStream sfs = File.Create(OutFile+".text");
+ FileStream sfs = File.Create(assembly + ".text");
sfs.Write(buf, 0, buf.Length);
sfs.Close();
- string posmap = String.Empty;
- if (m_positionMap != null)
- {
- foreach (KeyValuePair, KeyValuePair> kvp in m_positionMap)
- {
- KeyValuePair k = kvp.Key;
- KeyValuePair v = kvp.Value;
- posmap += String.Format("{0},{1},{2},{3}\n",
- k.Key, k.Value, v.Key, v.Value);
- }
- }
-
- buf = enc.GetBytes(posmap);
-
- FileStream mfs = File.Create(OutFile+".map");
- mfs.Write(buf, 0, buf.Length);
- mfs.Close();
-
- return OutFile;
+ return assembly;
}
- public KeyValuePair FindErrorPosition(int line, int col)
+ private class kvpSorter : IComparer>
{
- return FindErrorPosition(line, col, m_positionMap);
- }
-
- private class kvpSorter : IComparer>
- {
- public int Compare(KeyValuePair a,
- KeyValuePair b)
+ public int Compare(KeyValuePair a,
+ KeyValuePair b)
{
return a.Key.CompareTo(b.Key);
}
@@ -742,8 +724,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
out ret))
return ret;
- List> sorted =
- new List>(positionMap.Keys);
+ List> sorted =
+ new List>(positionMap.Keys);
sorted.Sort(new kvpSorter());
@@ -791,32 +773,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
return message;
}
- public Dictionary, KeyValuePair> LineMap()
+
+ private static void WriteMapFile(string filename, Dictionary, KeyValuePair> linemap)
{
- if (m_positionMap == null)
- return null;
-
- Dictionary, KeyValuePair> ret =
- new Dictionary, KeyValuePair>();
-
- foreach (KeyValuePair kvp in m_positionMap.Keys)
- ret.Add(kvp, m_positionMap[kvp]);
-
- return ret;
+ string mapstring = String.Empty;
+ foreach (KeyValuePair, KeyValuePair> kvp in linemap)
+ {
+ KeyValuePair k = kvp.Key;
+ KeyValuePair v = kvp.Value;
+ mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value);
+ }
+
+ System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
+ Byte[] mapbytes = enc.GetBytes(mapstring);
+ FileStream mfs = File.Create(filename);
+ mfs.Write(mapbytes, 0, mapbytes.Length);
+ mfs.Close();
}
- private void ReadMapFile(string filename)
+
+ private static Dictionary, KeyValuePair> ReadMapFile(string filename)
{
+ Dictionary, KeyValuePair> linemap;
try
{
StreamReader r = File.OpenText(filename);
+ linemap = new Dictionary, KeyValuePair>();
- m_positionMap = new Dictionary, KeyValuePair>();
-
string line;
while ((line = r.ReadLine()) != null)
{
- String[] parts = line.Split(new Char[] {','});
+ String[] parts = line.Split(new Char[] { ',' });
int kk = System.Convert.ToInt32(parts[0]);
int kv = System.Convert.ToInt32(parts[1]);
int vk = System.Convert.ToInt32(parts[2]);
@@ -825,12 +812,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
KeyValuePair k = new KeyValuePair(kk, kv);
KeyValuePair v = new KeyValuePair(vk, vv);
- m_positionMap[k] = v;
+ linemap[k] = v;
}
}
catch
{
+ linemap = new Dictionary, KeyValuePair>();
}
+ return linemap;
}
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 2b858ecd9e..549c038fc4 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
private string m_PrimName;
private string m_ScriptName;
private string m_Assembly;
- private int m_StartParam = 0;
+ private int m_StartParam;
private string m_CurrentEvent = String.Empty;
- private bool m_InSelfDelete = false;
+ private bool m_InSelfDelete;
private int m_MaxScriptQueue;
private bool m_SaveState = true;
- private bool m_ShuttingDown = false;
- private int m_ControlEventsInQueue = 0;
- private int m_LastControlLevel = 0;
- private bool m_CollisionInQueue = false;
+ private bool m_ShuttingDown;
+ private int m_ControlEventsInQueue;
+ private int m_LastControlLevel;
+ private bool m_CollisionInQueue;
private TaskInventoryItem m_thisScriptTask;
// The following is for setting a minimum delay between events
- private double m_minEventDelay = 0;
- private long m_eventDelayTicks = 0;
- private long m_nextEventTimeTicks = 0;
+ private double m_minEventDelay;
+ private long m_eventDelayTicks;
+ private long m_nextEventTimeTicks;
private bool m_startOnInit = true;
- private UUID m_AttachedAvatar = UUID.Zero;
+ private UUID m_AttachedAvatar;
private StateSource m_stateSource;
private bool m_postOnRez;
- private bool m_startedFromSavedState = false;
- private string m_CurrentState = String.Empty;
- private UUID m_RegionID = UUID.Zero;
+ private bool m_startedFromSavedState;
+ private UUID m_CurrentStateHash;
+ private UUID m_RegionID;
private Dictionary, KeyValuePair>
m_LineMap;
@@ -252,16 +252,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
{
m_Apis[api] = am.CreateApi(api);
m_Apis[api].Initialize(engine, part, m_LocalID, itemID);
- }
+ }
+
+ try
+ {
+ if (dom != System.AppDomain.CurrentDomain)
+ m_Script = (IScript)dom.CreateInstanceAndUnwrap(
+ Path.GetFileNameWithoutExtension(assembly),
+ "SecondLife.Script");
+ else
+ m_Script = (IScript)Assembly.Load(
+ Path.GetFileNameWithoutExtension(assembly)).CreateInstance(
+ "SecondLife.Script");
- try
- {
- m_Script = (IScript)dom.CreateInstanceAndUnwrap(
- Path.GetFileNameWithoutExtension(assembly),
- "SecondLife.Script");
//ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
- RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
+ //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
// lease.Register(this);
}
catch (Exception)
@@ -893,7 +899,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
string xml = ScriptSerializer.Serialize(this);
- if (m_CurrentState != xml)
+ // Compare hash of the state we just just created with the state last written to disk
+ // If the state is different, update the disk file.
+ UUID hash = UUID.Parse(Utils.MD5String(xml));
+
+ if(hash != m_CurrentStateHash)
{
try
{
@@ -911,7 +921,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
//{
// throw new Exception("Completed persistence save, but no file was created");
//}
- m_CurrentState = xml;
+ m_CurrentStateHash = hash;
}
}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 7b19ce3463..b0fce75112 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;
using OpenSim.Region.ScriptEngine.Shared.Instance;
using OpenSim.Region.ScriptEngine.Interfaces;
+using ScriptCompileQueue = OpenSim.Framework.LocklessQueue